Initial Contribution
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..eda5e06
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,12 @@
+###############################################################################
+# FILE: Makefile
+#
+# Top-level Makefile for ASR
+###############################################################################
+
+# remember root of ASR source tree
+export ASR_ROOT_DIR := $(call my-dir)
+export ASR_MAKE_DIR := $(ASR_ROOT_DIR)/make/asr
+
+# perform sub-makes
+include $(call all-subdir-makefiles)
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_APACHE2
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..89a978d
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,205 @@
+These files are Copyright 2007, 2008 Nuance Communications, but released under
+the Apache2 License.
+
+                               Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/audio/Android.mk b/audio/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/audio/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/audio/AudioIn/Android.mk b/audio/AudioIn/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/audio/AudioIn/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/audio/AudioIn/UNIX/Android.mk b/audio/AudioIn/UNIX/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/audio/AudioIn/UNIX/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/audio/AudioIn/UNIX/include/audioin.h b/audio/AudioIn/UNIX/include/audioin.h
new file mode 100644
index 0000000..3475ceb
--- /dev/null
+++ b/audio/AudioIn/UNIX/include/audioin.h
@@ -0,0 +1,262 @@
+/*---------------------------------------------------------------------------*
+ *  audioin.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __AUDIOIN_H__
+#define __AUDIOIN_H__
+/* -------------------------------------------------------------------------+
+ |                               ScanSoft Inc.                              |
+ + -------------------------------------------------------------------------*/
+
+
+
+/* -------------------------------------------------------------------------+
+ | Project       : ScanSoft AudioIn component
+ | Module        : AUDIOIN
+ | File name     : audioin.h
+ | Description   : Interface definition for AUDIOIN
+ | Reference(s)  : wavein, audioin.chm, audioin.doc, audioin.hlp
+ |                 SltGl00001_audioin_gl1.doc
+ | Status        : Version 1.2
+ + -------------------------------------------------------------------------*/
+/*     Oct/8/2002: Fixes for Windows 2000, and memory leaks. Version 1.1    */
+/*  PVP   Jan/8/2004: Default audio format changed to 16kHz. Version 2.0       */
+/*--------------------------------------------------------------------------*/
+
+/* @doc AUDIOININTERFACE */
+
+ 
+#include "audioinerr.h"
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif
+  
+/* -------------------------------------------------------------------------+
+ |   MACROS                                                                 |
+ + -------------------------------------------------------------------------*/
+  
+/* none */
+  
+/* -------------------------------------------------------------------------+
+ |   TYPE DEFINITIONS                                                       |
+ + -------------------------------------------------------------------------*/
+  
+typedef short audioinSample;
+
+  
+/* Type Definitions for SCANSOFT-TYPES (re-definition)*/
+
+/* @type AUDIOIN_H | Handle to an audio-in component.
+ * @comm Type is declared as a void *. The actual implementation is
+ *       done by the implementation engineer. */
+typedef void *  AUDIOIN_H;
+#define WAVE_MAPPER 0
+/* @enum AUDIOIN_STATUSINFO | Enumerator for the Status Information of the AudioIn component. 
+ * @comm The information contained in this definition concerns not only to the status of 
+ *       the FIFO but also the general status of the audio component. 
+ *
+ * @xref <f lh_audioinGetSamples>(), AudioIn Diagram State */
+typedef enum _AUDIOIN_STATUSINFO {
+  AUDIOIN_NORMAL,       /* @emem Normal state of the audio buffer. No problems detected while retrieving 
+                                 samples.*/
+  AUDIOIN_TIMEOUT,      /* @emem The audio-in component timed out after no audio was received from the 
+                                 audio device. The MMSystem is not providing any more samples, or the
+                                 lh_audioinGetSamples function may be called much faster than the actual
+                                 thread filling the buffer (Probable issue with the audio device). This could
+                                 be fixed by decreasing the number of samples that you want to retrieve or by
+                                 waiting till samples are available. A time out period is set internally on
+                                 the audioin implementation. Default of:
+                                 <nlpar>const DWORD GETSAMPLESTIMEOUT_PERIOD = 10000; (time in milliseconds)*/
+  AUDIOIN_HIGHWATERMARK,/* @emem The buffer has been filled out with 75% or more. A high watermark on 
+                                 the audio buffer has been detected and the buffer could be close to an OVERRUN 
+                                 state.*/ 
+  AUDIOIN_FIFOOVERRUN,  /* @emem The buffer has been overfilled with audio samples. You can still retrieve
+                                 samples from the FIFO with the lhs_audioinGetSamples function, but the audio-in 
+                                 component will not buffer any new audio into the FIFO. AudioinStop must be
+                                 called to reset the audio-in component.*/
+  AUDIOIN_FLUSHED,      /* @emem The buffer has been overfilled with audio samples. You can no longer retrieve
+                                 samples from the FIFO, since you already emptied it with lhs_audioinGetSamples.
+                                 The audio-in component will not buffer any new audio into the FIFO.
+                                 lhs_audioinStop must be called in the audio-in component since
+                                 lhs_audioinGetSamples will not longer work.*/
+  AUDIOIN_HWOVERRUN,    /* @emem The buffer has been overfilled with audio samples inside the device component
+                                 (audio device). lhs_audioinStop should be called to reset the contents of the
+                                 FIFO and the codec. This state is caused by an error in the MMSystem. It is 
+                                 recommended to initialize the audio-in component before retrieving samples
+                                 again.*/  
+} AUDIOIN_STATUSINFO;
+  
+  
+/* @struct AUDIOIN_INFO | Structure for the AudioIn Information 
+ * @comm The AUDIOIN_INFO contains information about several parts of the audio-in component.
+ *       It gives information about the FIFO buffering audio and at the same time about the audio 
+ *       component. 
+ *
+ * @xref <f lh_audioinGetSamples>(), AudioIn Diagram State */
+typedef struct _AUDIOIN_INFO{
+  AUDIOIN_STATUSINFO eStatusInfo;    /* @field The state in which the audio Buffer of the audio-in component
+                                               is. This is detailed in AUDIOIN_STATUSINFO. */
+  unsigned long u32SamplesAvailable; /* @field The number of Samples still available in the audio Buffer after
+                                               lhs_audioinGetSamples is called. This value can help you to
+                                               detect over-runs in the audio buffer.*/
+} AUDIOIN_INFO;
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+typedef enum _AUDIOIN_MSG {
+  AUDIOIN_MSG_OPEN,           // audio device was opened
+  AUDIOIN_MSG_START,          // start audio acquisition
+  AUDIOIN_MSG_DATA,           // audio samples are available
+  AUDIOIN_MSG_STOP,           // stop audio acquisition
+  AUDIOIN_MSG_CLOSE,          // audio device was closed
+  AUDIOIN_MSG_INVALID,        // bogus
+} AUDIOIN_MSG;
+  
+/* callback function for "samples ready" notification */
+typedef void (*pCallbackFunc)(AUDIOIN_H hAudioIn, AUDIOIN_MSG uMsg, void* dwInstance, void* dwParam1, void* dwParam2);
+
+/* data structure passed to callback function; loosely based on Windows' WAVEHDR */
+typedef struct { 
+    void               *pData; 
+    unsigned long       nBufferLength; 
+    unsigned long       nBytesRecorded; 
+    AUDIOIN_STATUSINFO  status;
+} AUDIOIN_WAVEHDR; 
+#endif
+
+/* -------------------------------------------------------------------------+
+|   EXTERNAL DATA (+ meaning)                                              |
++ -------------------------------------------------------------------------*/
+
+/* none */
+
+/* -------------------------------------------------------------------------+
+|   GLOBAL FUNCTION PROTOTYPES                                             |
++ -------------------------------------------------------------------------*/
+#if 0
+ LHS_AUDIOIN_ERROR  lhs_audioinOpenEx (
+  unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
+                                                    devices on the system). You can also use the following flag
+                                                    instead of a device identifier.
+                                                    <nl><nl><bold WAVE_MAPPER> = The function selects a
+                                                    waveform-audio input device capable of recording in the
+                                                    specified format. <bold Header:> Declared in Mmsystem.h from
+                                                    the Windows Multimedia: Platform SDK.*/
+  unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
+  unsigned long u32NbrOfFrames,       /*@parm [in]  (not used) Number of frames buffered internally */
+  unsigned long u32SamplesPerFrame,   /*@parm [in]  Size, in samples, of each individual frame. */
+  AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
+ );
+#endif
+
+LHS_AUDIOIN_ERROR  lhs_audioinOpen(
+  unsigned long u32AudioInID, /* [in] audio-in device ID (ranges from 0 to a number of available devices on the
+                                      system). You can also use the following flag instead of a device identifier.
+                                      <nl><nl><bold WAVE_MAPPER> = The function selects a waveform-audio input
+                                      device capable of recording in the specified format. <bold Header:>
+                                      Declared in Mmsystem.h from the Windows Multimedia: Platform SDK.*/      
+  unsigned long u32Frequency, /* [in] Frequency of the recognition engine in Hz. */
+  AUDIOIN_H * phAudioIn       /* [out] Handle to the audio-in device */
+);
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+LHS_AUDIOIN_ERROR  lhs_audioinOpenCallback(
+  unsigned long u32AudioInID,      /* [in] audio-in device ID (ranges from 0 to a number of available devices on the
+                                      system). You can also use the following flag instead of a device identifier.
+                                      <nl><nl><bold WAVE_MAPPER> = The function selects a waveform-audio input
+                                      device capable of recording in the specified format. <bold Header:>
+                                      Declared in Mmsystem.h from the Windows Multimedia: Platform SDK.*/      
+  unsigned long u32Frequency,      /* [in] Frequency of the recognition engine in Hz. */
+  unsigned long u32NbrOfSamples,   /*[in] <nl><bold Input:> Number of samples requested per callback */
+  
+  pCallbackFunc pCallback,         /* [in] callback function */
+  void         *pCallbackInstance, /* [in] callback instance */
+  AUDIOIN_H * phAudioIn            /* [out] Handle to the audio-in device */
+);
+#endif
+
+LHS_AUDIOIN_ERROR lhs_audioinClose(
+  AUDIOIN_H * phAudioIn /*[in] Pointer to the handle of the audio-in device to be closed.*/
+);
+
+LHS_AUDIOIN_ERROR lhs_audioinStart( 
+  AUDIOIN_H hAudioIn    /*[in] Handle of the audio-in device */
+); 
+
+LHS_AUDIOIN_ERROR lhs_audioinStop(
+  AUDIOIN_H hAudioIn    /*[in] Handle of the audio-in device*/
+);
+  
+LHS_AUDIOIN_ERROR lhs_audioinGetSamples (
+  AUDIOIN_H hAudioIn,              /*[in] Handle of the audio-in device */
+  unsigned long * u32NbrOfSamples, /*[in/out] <nl><bold Input:> The requested number of samples to be filled in 
+                                              the pAudioBuffer. Note that the memory used for pBuffer should be large enough 
+                                              to contain the requested number of samples, also note how the u32NbrOfSamples 
+                                              is different than the Buffer size, since each frame has an specific size depending 
+                                              on the audio format.
+                                              <nl><bold Output:> The actual number of recorded audio samples written in pBuffer.
+                                              If you pass 0 to this parameter then you may still retrieve the AUDIOIN_STATUSINFO
+                                              on the audio component. */
+  void * pAudioBuffer,              /*[out] Buffer that contains the recorded samples. The memory used for this 
+                                            buffer is allocated by the client. So, it is the responsibility of the client to 
+                                            make sure that this memory can contain the requested number of samples. The memory 
+                                            for this buffer needs also to be freed by the client. */
+  AUDIOIN_INFO * pAudioInInfo       /*[out] Information about the audio internal buffer described in 
+                                            AUDIOIN_INFO.*/
+);
+  
+  
+LHS_AUDIOIN_ERROR lhs_audioinGetVersion(
+  unsigned long * pu32Version       /*[out] The version number of the API implementation. */
+);
+  
+  
+LHS_AUDIOIN_ERROR lhs_audioinGetVolume(
+  AUDIOIN_H hAudioIn,             /*[in] Handle of the audio-in device.*/
+  unsigned long * pu32Volume      /*[out] Pointer to a variable that will be filled with the current volume 
+                                          (normally range of  0 - 65535). Depending on the platform the volume 
+                                          value may be set to in sizes of 16, 32 or other size, the range also
+                                          depends on the platform (Implementations of this interface may
+                                          change because of the compatibility of the internal function).*/
+);
+  
+LHS_AUDIOIN_ERROR lhs_audioinSetVolume(
+  AUDIOIN_H hAudioIn,         /*[in] Handle of the audio-in device.*/
+  unsigned long u32Volume     /*[in] The volume to be set (normal range 0-65535). Depending on the 
+                                     platform the volume value may be set to in sizes of 16, 32 or other size, 
+                                     the range also depends on the platform. (Implementations of this interface 
+                                     may change because of the compatibility of the internal function)*/
+);
+  
+
+const TCHAR * lhs_audioinErrorGetString(
+  const LHS_AUDIOIN_ERROR Error    /*[in] The Error code.*/
+);
+  
+  
+/* -------------------------------------------------------------------------+
+ |   END                                                                    |
+ + -------------------------------------------------------------------------*/
+  
+#if defined( __cplusplus )
+}
+#endif
+
+
+#endif /* #ifndef __AUDIOIN_H__ */
diff --git a/audio/AudioIn/UNIX/include/audioinerr.h b/audio/AudioIn/UNIX/include/audioinerr.h
new file mode 100644
index 0000000..9cdefb9
--- /dev/null
+++ b/audio/AudioIn/UNIX/include/audioinerr.h
@@ -0,0 +1,128 @@
+/*---------------------------------------------------------------------------*
+ *  audioinerr.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _AUDIOINERRAPI_H
+#define _AUDIOINERRAPI_H
+
+/* -------------------------------------------------------------------------+
+ |                               ScanSoft Inc.                              |
+ + -------------------------------------------------------------------------*/
+
+
+ 
+/* -------------------------------------------------------------------------+
+ | Project       : ScanSoft AudioIn component
+ | Module        : AUDIOINERROR
+ | File name     : audioinerr.h
+ | Description   : Definition file for the error handling of the AUDIOIN
+ | Reference(s)  : wavein, audioin.chm, audioin.doc, audioin.hlp
+ |                 SltGl00001_audioin_gl1.doc
+ | Status        : Version 1.0
+ + -------------------------------------------------------------------------*/
+
+/* @doc AUDIOININTERFACE */
+
+
+
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif
+  
+/* -------------------------------------------------------------------------+
+ |   MACROS                                                                 |
+ + -------------------------------------------------------------------------*/
+  
+  /* none */
+  
+/* -------------------------------------------------------------------------+
+ |   TYPE DEFINITIONS                                                       |
+ + -------------------------------------------------------------------------*/
+  
+#define TCHAR char
+  
+/* @type LHS_AUDIOIN_ERROR | LONG value for Error Code. (i386 win32 wince specific)
+ * @comm Type is declared as a LONG.
+ * @xref LHS_U32, LHS_U16, LHS_BOOL */
+typedef long  LHS_AUDIOIN_ERROR;
+  
+  /* ERROR CODES */
+  
+  /* general errors */
+#define LHS_AUDIOIN_OK                     0
+#define LHS_E_AUDIOIN_BASE                 1000
+  /* AUDIOIN general errors */
+#define LHS_E_AUDIOIN_NOTIMPLEMENTED       (LHS_E_AUDIOIN_BASE+0)  
+#define LHS_E_AUDIOIN_NULLPOINTER          (LHS_E_AUDIOIN_BASE+1)
+#define LHS_E_AUDIOIN_OUTOFMEMORY          (LHS_E_AUDIOIN_BASE+2)
+#define LHS_E_AUDIOIN_INVALIDARG           (LHS_E_AUDIOIN_BASE+3)
+  /* AUDIOIN specific errors */
+#define LHS_E_AUDIOIN_INVALIDDEVICEID      (LHS_E_AUDIOIN_BASE+4)
+#define LHS_E_AUDIOIN_NOAUDIODRIVER        (LHS_E_AUDIOIN_BASE+5)
+#define LHS_E_AUDIOIN_COULDNOTOPENDEVICE   (LHS_E_AUDIOIN_BASE+6)
+#define LHS_E_AUDIOIN_BADFORMAT            (LHS_E_AUDIOIN_BASE+7)
+#define LHS_E_AUDIOIN_WRONGSTATE           (LHS_E_AUDIOIN_BASE+8)
+#define LHS_E_AUDIOIN_OVERRUN              (LHS_E_AUDIOIN_BASE+9)
+#define LHS_E_AUDIOIN_NOSAMPLES            (LHS_E_AUDIOIN_BASE+10)
+#define LHS_E_AUDIOIN_GETSETVOLUME         (LHS_E_AUDIOIN_BASE+11)
+#define LHS_E_AUDIOIN_AUDIOINOPENTIMEDOUT  (LHS_E_AUDIOIN_BASE+12)
+#define LHS_E_AUDIOIN_AUDIOINBUSY          (LHS_E_AUDIOIN_BASE+13)
+#define LHS_E_AUDIOIN_CREATEEVENTERROR     (LHS_E_AUDIOIN_BASE+14)
+#define LHS_E_AUDIOIN_CANNOTRESETAUDIODEV  (LHS_E_AUDIOIN_BASE+15)
+#define LHS_E_AUDIOIN_CANNOTCLOSEAUDIODEV  (LHS_E_AUDIOIN_BASE+16)
+#define LHS_E_AUDIOIN_CANNOTSTARTAUDIODEV  (LHS_E_AUDIOIN_BASE+17)
+#define LHS_E_AUDIOIN_CANNOTSTOPAUDIODEV   (LHS_E_AUDIOIN_BASE+18)
+  
+// *******************  Error Type Definitions *********************
+typedef struct _AUDIOIN_ERRORINFO
+{
+  long  u32ErrorCode;
+
+  const TCHAR *szExplanation;
+
+  
+}AUDIOIN_ERRORINFO;
+  
+  
+/* -------------------------------------------------------------------------+
+|   EXTERNAL DATA (+ meaning)                                              |
++ -------------------------------------------------------------------------*/
+  
+  /* none */
+  
+/* -------------------------------------------------------------------------+
+ |   GLOBAL FUNCTION PROTOTYPES                                             |
+ + -------------------------------------------------------------------------*/
+  
+#if ( !defined(_MSC_VER) && !defined(WINAPI) )
+#define WINAPI
+#endif
+  
+/* -------------------------------------------------------------------------+
+ |   END                                                                    |
+ + -------------------------------------------------------------------------*/
+  
+  
+#if defined( __cplusplus )
+}
+#endif
+
+#endif /* _AUDIOINERRAPI_H*/
+
diff --git a/audio/AudioIn/UNIX/include/audioinwrapper.h b/audio/AudioIn/UNIX/include/audioinwrapper.h
new file mode 100644
index 0000000..b638c78
--- /dev/null
+++ b/audio/AudioIn/UNIX/include/audioinwrapper.h
@@ -0,0 +1,43 @@
+/*---------------------------------------------------------------------------*
+ *  audioinwrapper.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __AUDIOINWRAPPER_H__
+#define __AUDIOINWRAPPER_H__
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif
+
+/* -------------------------------------------------------------------------+
+ |   C++ FUNCTION WRAPPER                                                   |
+ + -------------------------------------------------------------------------*/
+
+int AudioOpen(void);
+int AudioClose(void);
+int AudioSetInputFormat(int sample_rate, int channel_count);
+int AudioRead(short *buffer, int frame_count);
+int AudioSetVolume(int stream_type, int volume);
+int AudioGetVolume(int stream_type);
+
+#if defined( __cplusplus )
+}
+#endif
+
+#endif
diff --git a/audio/AudioIn/UNIX/include/filter.h b/audio/AudioIn/UNIX/include/filter.h
new file mode 100644
index 0000000..41d5ff5
--- /dev/null
+++ b/audio/AudioIn/UNIX/include/filter.h
@@ -0,0 +1,61 @@
+/*---------------------------------------------------------------------------*
+ *  filter.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __FILTER_H__
+#define __FILTER_H__
+
+// Define new data types
+
+typedef short typeSample;  // for input and output samples
+typedef short typeCoeff;   // FIR filter coefficients
+typedef long  typeAccum;   // FIR filter accumulator
+
+#define FACTOR_UP                       1     // upsampling factor
+#define FACTOR_DOWN                     4     // downsampling factor
+
+#define u16ScaleFilterCoeff_up1_down4  15
+
+typedef struct fir_struct
+{
+   int              state;   // state of FIR delay line (index of next slot to fill)
+   typeSample      *z;       // pointer to delay line
+
+   unsigned int     factor_up;
+   unsigned int     factor_down;
+
+   unsigned int     nTaps;   // length of FIR filter
+   unsigned int     scale;   // fixed-point filter scale factor
+   const typeCoeff *h;       // pointer to FIR filter coefficients
+   typeAccum        round;   // used for roundoff
+} FIR_struct;
+
+extern const typeCoeff ps16FilterCoeff_up1_down4[];
+
+extern unsigned int filter_length;
+
+extern  void FIR_downsample(unsigned int nInput, typeSample *pInput,
+			   typeSample *pOutput, FIR_struct *pFIR);
+
+extern  FIR_struct* FIR_construct(unsigned int nTaps, const typeCoeff *pCoeffs, int scale, int factor_up, int factor_down);
+
+extern  int FIR_deconstruct(FIR_struct *pFIR);
+
+extern  void FIR_reset(FIR_struct *pFIR);
+
+#endif
diff --git a/audio/AudioIn/UNIX/src/Android.mk b/audio/AudioIn/UNIX/src/Android.mk
new file mode 100644
index 0000000..2b80e76
--- /dev/null
+++ b/audio/AudioIn/UNIX/src/Android.mk
@@ -0,0 +1,26 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	audioin.c \
+	audioinwrapper.cpp \
+	filter.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../../../portable/include \
+
+LOCAL_CFLAGS := \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_MODULE:= libSR_AudioIn
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/audio/AudioIn/UNIX/src/audioin.c b/audio/AudioIn/UNIX/src/audioin.c
new file mode 100644
index 0000000..5d20062
--- /dev/null
+++ b/audio/AudioIn/UNIX/src/audioin.c
@@ -0,0 +1,1442 @@
+/*---------------------------------------------------------------------------*
+ *  audioin.c                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/* -------------------------------------------------------------------------+
+   |                               ScanSoft Inc.                              |
+   + -------------------------------------------------------------------------*/
+
+
+
+/* -------------------------------------------------------------------------+
+   | Project       : ScanSoft AudioIn
+   | Module        : audioin
+   | File name     : audioin.c
+   | Description   : This module contains the main implementation for the audioIn
+   |                 component.
+   | Reference(s)  : wavein, audioout, audioin.chm, audioin.doc, audioin.hlp,
+   |                 SltGl00001_audioin_gl1.doc
+   | Status        : Version 1.2
+   + -------------------------------------------------------------------------*/
+/*     Feb/25/2002: First QNX/SH4 "draft" version. Version 1.1              */
+/*     Nov/25/2004: clean up and minor changes like choice of the codec     */
+/*                  frame size which is now automatically selected          */
+/*--------------------------------------------------------------------------*/
+
+#if !defined(ANDROID) || defined(__ARM_ARCH_5__)
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <pthread.h>
+#include <sched.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/select.h>
+#include "plog.h"
+#include "audioin.h"
+
+#if defined(ANDROID)
+#include "audioinwrapper.h"
+#else
+#include <alsa/asoundlib.h>
+#endif
+
+// #define SAVE_RAW_AUDIO              1
+
+#ifdef SAVE_RAW_AUDIO
+#include <sys/time.h>
+#include <stdio.h>
+
+static FILE *audio_data;
+static struct timeval buffer_save_audio;
+#endif
+
+/*#define FILTER_ON*/
+
+#ifdef FILTER_ON
+#include "filter.h"
+#endif
+
+/* -------------------------------------------------------------------------+
+   |   EXTERNAL DATA (+ meaning)                                              |
+   + -------------------------------------------------------------------------*/
+
+/* none */
+
+/* -------------------------------------------------------------------------+
+   |   MACROS                                                                 |
+   + -------------------------------------------------------------------------*/
+
+#define NR_OF_CHANNELS            1 
+
+#if defined(ANDROID)
+/* size in samples */
+/* We really no longer use this for ANDROID but more changes are needed to remove it. SteveR */
+#define SAMPLES_BUFFER_SIZE             (8*1024)
+#define SAMPLES_BUFFER_HIGH_WATERMARK   (6*1024)
+#else
+#define SAMPLES_BUFFER_SIZE            (50*4410)
+#define SAMPLES_BUFFER_HIGH_WATERMARK  (40*4410)
+#endif
+
+/* IMPORTANT NOTE:
+   Here a "frame" is an ALSA term.  A frame is comprised of 1 sample if mono,
+   and 2 samples if stereo.  This should be distinguished from what the
+   ASR engine and lhs_audioin*() API functions refer to as a frame which is
+   a set of consecutive samples.
+   (see http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html) */
+#if defined(ANDROID)
+#define CODEC_FRAGMENT_SIZE_IN_FRAMES                    1024
+#else
+//read the equivalent of 100 ms per buffer. Note: we are recording at 44 kHz
+#define CODEC_FRAGMENT_SIZE_IN_FRAMES                    4410 
+#endif
+
+/* -------------------------------------------------------------------------+
+   |   TYPE DEFINITIONS                                                       |
+   + -------------------------------------------------------------------------*/
+
+/* -------------------------------------------------------------------------+
+   |   GLOBAL CONSTANTS                                                       |
+   + -------------------------------------------------------------------------*/
+
+
+/* -------------------------------------------------------------------------+
+   |   GLOBAL VARIABLES                                                       |
+   + -------------------------------------------------------------------------*/
+
+#if !defined(ANDROID)
+static snd_pcm_t       *ghPCM;                   /* handle to the PCM recording device */
+#endif
+
+static int              gCodecFragmentSizeInFrames = CODEC_FRAGMENT_SIZE_IN_FRAMES;    /* fragment size used by the codec driver */
+static audioinSample    gSamplesBufferCircularFifo[SAMPLES_BUFFER_SIZE]; /* circular buffer that buffers the incoming samples */
+
+static int              gWriteIndexPointer = 0;  /* write pointer in the circular FIFO samples buffer */
+static int              gReadIndexPointer  = 0;  /* read  pointer in the circular FIFO samples buffer */
+static AUDIOIN_INFO     gAudioInInfo;            /* to store the info about the acquisition */
+static pthread_mutex_t  gAudioMutex;             /* to prevent using the read/write pointers at the same time in both threads */
+
+static pthread_cond_t   gThreadRunning;          /* synchronize when the AcquisitionThreadID is running*/
+static int              gThreadRunningSignaled = 0;
+
+static pthread_cond_t   gOpenExCalled;          /* synchronize when the lhs_audioinOpenEx is called*/
+static int              gOpenExCalledSignaled = 0;
+
+static pthread_cond_t   gCloseCalled;          /* synchronize when the lhs_audioinClose is called*/
+static int              gCloseCalledSignaled = 0;
+
+static pthread_t        AcquisitionThreadID;     /* acquisition thread id */
+
+static int              gInitialized = 0; /* did we initialize some of the variables*/
+static int              gTerminateThread = 0;
+static struct timeval   timer;                   /* timer used by select to relinquish cpu times */
+
+static int              gRecordingVolume = -1;   /* recording volume ; number between 0 and 15 */
+static int              bRecord = 0;             /* recording state is off */   
+static int              bClose  = 1;             /* audio pipe is closed */ 
+
+#ifdef FILTER_ON
+static FIR_struct      *pFIR = NULL;             /* pointer to FIR structure */
+#endif
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+static pCallbackFunc    gpCallback         = NULL;
+static void            *gpCallbackInstance = NULL;
+static unsigned long    gnCallbackSamples  = 0;
+#endif
+
+/* -------------------------------------------------------------------------+
+   |   LOCAL FUNCTION PROTOTYPES                                              |
+   + -------------------------------------------------------------------------*/
+
+static void *AcquisitionThread(void *data);                /* Entry function for the acquisition thread */
+static int OpenAndPrepareSound(unsigned long ulFrequency);
+
+/**
+ * returns 0 if success
+ */
+static int Initialize(AUDIOIN_H * phAudioIn)
+{
+  int doneWaiting = 0;
+
+  if( gInitialized == 1 )
+    return 0;
+
+  /* creates the mutex that will be used to lock/unlock access to some variables/code */
+  if (pthread_mutex_init(&gAudioMutex, NULL) != 0)
+  {
+    return 1;
+  }
+
+  if(pthread_cond_init(&gThreadRunning, 0) != 0 )
+  {
+    return 1;
+  }
+
+  if(pthread_cond_init(&gOpenExCalled, 0) != 0 )
+  {
+    return 1;
+  }
+
+  if(pthread_cond_init(&gCloseCalled, 0) != 0 )
+  {
+    return 1;
+  }
+
+  pthread_mutex_lock(&gAudioMutex);
+
+  /* create a thread with very high priority that will do the acquisition */
+  if (pthread_create(&AcquisitionThreadID, NULL, AcquisitionThread, phAudioIn) != 0)
+  {
+    return 1;
+  }
+
+  //wait for the thread to run
+  while (!doneWaiting)
+  {
+    int rc = pthread_cond_wait(&gThreadRunning, &gAudioMutex);
+    switch (rc)
+    {
+      case 0:
+        if (!gThreadRunningSignaled)
+        {
+          // Avoid spurious wakeups
+          continue;
+        }
+        else
+        {
+          gThreadRunningSignaled = 0;
+          doneWaiting = 1;
+          break;
+        }
+        break;
+      default:
+        pthread_mutex_unlock(&gAudioMutex);
+        return 1;
+    }
+  }
+
+  pthread_mutex_unlock(&gAudioMutex);
+
+
+  //thread is now running.
+
+  gInitialized = 1;
+
+  return 0;
+}
+
+#if 0
+/* disable this unused function for now until we decide what to do with this */
+
+/**
+ * returns 0 if success
+ */
+static int UnInitialize()
+{
+  //signal the thread that it has to stop running.
+  pthread_mutex_lock ( &gAudioMutex );
+  gTerminateThread = 1;
+
+  //signal to tell that our thread is now running.
+  if ( pthread_cond_signal ( &gOpenExCalled ) != 0 )
+  {
+    pthread_mutex_unlock ( &gAudioMutex );
+    PLogError ( "Audio In Error pthread_cond_signal\n" );
+    return 1;
+  }
+  gOpenExCalledSignaled = 1;
+  pthread_mutex_unlock ( &gAudioMutex );
+
+  /* wait until thread exits */
+  if (pthread_join(AcquisitionThreadID, NULL) != 0)
+  {
+    return 1;
+  }
+
+  /* destroy the mutex */
+  if (pthread_mutex_destroy(&gAudioMutex) !=0 )
+  {
+    return 1;
+  }
+  if( pthread_cond_destroy(&gThreadRunning) != 0 )
+  {
+    return 1;
+  }
+  if( pthread_cond_destroy(&gOpenExCalled) != 0 )
+  {
+    return 1;
+  }
+  if( pthread_cond_destroy(&gCloseCalled) != 0 )
+  {
+    return 1;
+  }
+  gInitialized = 0;
+  return 0;
+}
+#endif
+
+/* -------------------------------------------------------------------------+
+   |   LOCAL FUNCTION (should be static)                                      |
+   + -------------------------------------------------------------------------*/
+
+static void setRecordOn(void)
+{
+  bRecord = 1;
+}
+
+static void setRecordOff(void)
+{
+  bRecord = 0;
+}
+
+static int getRecord(void)
+{
+  return bRecord;
+}
+
+static void setCloseOn(void)
+{
+  bClose = 1;
+}
+
+static void setCloseOff(void)
+{
+  bClose = 0;
+}
+
+static int getClose(void)
+{
+  return bClose;
+}
+
+
+/**************************************************************
+ * AcquisitionThread                                           *
+ *                                                             *
+ * This function is the entry function of a thread created by  *
+ * lhs_audioinOpen and which is responsible of getting the     *
+ * samples from the codec and store them in a big circular     *
+ * FIFO buffer.                                                *
+ * The priority of this thread has been set to high in order   *
+ * to prevent codec buffer overrun. Since the FIFO is limited  *
+ * in size (5 sec default ; see SAMPLES_BUFFER_SIZE            *
+ * parameter), the application must still be fast enough to    *
+ * prevent FIFO overflow/overrun                               *
+ **************************************************************/
+#if defined(ANDROID)
+
+void *AcquisitionThread ( void *data )
+{
+  int doneWaiting = 0;
+  audioinSample   *CodecBuffer;
+  long            x;
+  long            y;
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+  AUDIOIN_H       *phAudioIn = (AUDIOIN_H *)data;
+  AUDIOIN_WAVEHDR *pwhdr;
+#endif
+
+
+  pthread_mutex_lock ( &gAudioMutex );
+
+  //signal to tell that our thread is now running.
+  if ( pthread_cond_signal ( &gThreadRunning ) != 0 )
+  {
+    pthread_mutex_unlock ( &gAudioMutex );
+    PLogError ( "Audio In Error pthread_cond_signal\n" );
+    exit ( 1 );
+  }
+  gThreadRunningSignaled = 1;
+
+  while( 1 )
+  {
+
+    while (!doneWaiting)
+    {
+      int rc = pthread_cond_wait(&gOpenExCalled, &gAudioMutex);
+      switch (rc)
+      {
+        case 0:
+          if (!gOpenExCalledSignaled)
+          {
+            // Avoid spurious wakeups
+            continue;
+          }
+          else
+          {
+            gOpenExCalledSignaled = 0;
+            doneWaiting = 1;
+            break;
+          }
+          break;
+        default:
+          PLogError ( "Audio In Error pthread_cond_signal\n" );
+          pthread_mutex_unlock(&gAudioMutex);
+          return ( (void *)NULL );
+      }
+    }
+    doneWaiting = 0;
+    pthread_mutex_unlock(&gAudioMutex);
+
+    if( gTerminateThread == 1 )
+      break;
+
+
+
+    /* buffer of 16 bits samples */
+    CodecBuffer = (audioinSample *)malloc ( gCodecFragmentSizeInFrames * sizeof ( audioinSample ) );
+
+    if ( CodecBuffer == NULL )
+    {
+      PLogError ( "Audio In Error malloc\n" );
+      exit ( 1 );
+    }
+    pwhdr = malloc ( sizeof ( AUDIOIN_WAVEHDR ) );
+
+    if ( pwhdr == NULL )
+    {
+      PLogError ( "Audio In Error malloc\n" );
+      exit ( 1 );
+    }
+
+    while ( !getClose ( ) )
+    {
+
+      int iReadFrames  = 0;  /* number of frames acquired by the codec */
+      /* NOTE: here a frame is comprised of 1 sample if mono, 2 samples if stereo, etc */
+      int iReadSamples = 0;  /* number of samples acquired by the codec */
+      int frames_to_read;     /* Actual number to read */
+      int frames_read;        /* Frames read on one read */
+
+      iReadFrames = 0;
+
+      do
+      {
+        frames_to_read = gCodecFragmentSizeInFrames - iReadFrames;
+        /* AudioRead() - output: number of frames (mono: 1 sample, stereo: 2 samples)*/
+        frames_read = AudioRead ( CodecBuffer + iReadFrames, frames_to_read );
+
+        if ( frames_read > 0 )
+          iReadFrames += frames_read;
+      }
+      while ( ( iReadFrames < gCodecFragmentSizeInFrames ) && ( frames_read > 0 ) );
+      iReadSamples = iReadFrames;
+
+      if ( getRecord ( ) )  /* else continue to read from driver but discard samples */
+      {
+        if ( iReadSamples < 0 )
+        {
+          iReadSamples = 0;
+          gAudioInInfo.eStatusInfo = AUDIOIN_HWOVERRUN;
+        }
+        else
+        {
+#ifdef FILTER_ON
+          /* x: index for start of input samples; y: index for output sample */
+          for ( x = 0, y = 0; x < iReadSamples; x += pFIR->factor_down )
+          {
+            FIR_downsample ( pFIR->factor_down, &( CodecBuffer[x] ), &( CodecBuffer[y++] ), pFIR );
+          }
+          /* update the number samples */
+          iReadSamples = y;
+#endif
+          pthread_mutex_lock ( &gAudioMutex );
+
+          if ( gAudioInInfo.u32SamplesAvailable + iReadSamples > SAMPLES_BUFFER_SIZE )
+          {
+            gAudioInInfo.u32SamplesAvailable = SAMPLES_BUFFER_SIZE;
+            gAudioInInfo.eStatusInfo = AUDIOIN_FIFOOVERRUN;
+          }
+          else
+          {
+            if ( gAudioInInfo.u32SamplesAvailable + iReadSamples > SAMPLES_BUFFER_HIGH_WATERMARK )
+            {
+              gAudioInInfo.eStatusInfo = AUDIOIN_HIGHWATERMARK;
+            }
+            else if ( gAudioInInfo.eStatusInfo != AUDIOIN_FIFOOVERRUN )
+            {
+              gAudioInInfo.eStatusInfo = AUDIOIN_NORMAL;
+            }
+            gAudioInInfo.u32SamplesAvailable += iReadSamples;
+          }
+          if ( gWriteIndexPointer + iReadSamples <= SAMPLES_BUFFER_SIZE )
+          {
+            memcpy ( &( gSamplesBufferCircularFifo[gWriteIndexPointer] ), CodecBuffer,
+                iReadSamples * sizeof ( audioinSample ) );
+            gWriteIndexPointer += iReadSamples;
+
+            if ( gWriteIndexPointer >= SAMPLES_BUFFER_SIZE )
+              gWriteIndexPointer = 0;
+          }
+          else
+          {
+            int NbToCopy;
+
+            NbToCopy = SAMPLES_BUFFER_SIZE - gWriteIndexPointer;
+            memcpy ( &( gSamplesBufferCircularFifo [gWriteIndexPointer] ), CodecBuffer,
+                NbToCopy * sizeof ( audioinSample ) );
+            gWriteIndexPointer = 0;
+            memcpy ( gSamplesBufferCircularFifo, &( CodecBuffer [NbToCopy] ),
+                ( iReadSamples-NbToCopy ) * sizeof ( audioinSample ) );
+            gWriteIndexPointer = iReadSamples - NbToCopy;
+          }
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+          /* Callback notification.  Ideally this audio acquisition thread should be very lean.
+             It should simply read from the low level driver, store the filtered samples in
+             the FIFO, then go back to reading from the driver.  The additional data copy
+             for the callback function is ok despite the overhead incurred, but only because
+             there's some buffering done by the low level driver.  This design should be
+             revisited to make it more general purpose.
+             */
+          if ( gpCallback != NULL )
+          {
+            pwhdr->nBufferLength  = iReadSamples * sizeof ( audioinSample );
+            pwhdr->nBytesRecorded = pwhdr->nBufferLength;
+            pwhdr->status = AUDIOIN_NORMAL;
+            pwhdr->pData = CodecBuffer;
+            /* pass samples to callback function who should deallocate the buffer and structure */
+            gpCallback ( *phAudioIn, AUDIOIN_MSG_DATA, gpCallbackInstance, pwhdr, NULL );
+          }
+#endif
+          /* samples are available to read */
+          pthread_mutex_unlock ( &gAudioMutex );
+          timer.tv_sec = 0;
+          timer.tv_usec = 200;
+          select ( 0, NULL, NULL, NULL, &timer );
+        }
+      } /* if (getRecord()) */
+
+    } /* while (!getClose()) */
+    if ( AudioClose ( ) !=0 )
+    {
+      PLogError ( "Audio In Error Closing Hardware\n" );
+    }
+    free ( CodecBuffer );
+
+    pthread_mutex_lock ( &gAudioMutex );
+    //signal to tell that our thread is now running.
+    if ( pthread_cond_signal ( &gCloseCalled ) != 0 )
+    {
+      pthread_mutex_unlock ( &gAudioMutex );
+      PLogError ( "Audio In Error pthread_cond_signal\n" );
+      exit ( 1 );
+    }
+    gCloseCalledSignaled = 1;
+  }
+
+  pthread_exit ( (void *)NULL );
+  return ( (void *)NULL );
+}
+
+#else
+/* non-ANDROID version */
+
+void *AcquisitionThread ( void *data )
+{
+  int doneWaiting = 0;
+  audioinSample   *CodecBuffer;
+#ifdef FILTER_ON
+  long            x;
+  long            y;
+#endif
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+  AUDIOIN_H       *phAudioIn = (AUDIOIN_H *)data;
+#endif
+
+  pthread_mutex_lock ( &gAudioMutex );
+
+  //signal to tell that our thread is now running.
+  if ( pthread_cond_signal ( &gThreadRunning ) != 0 )
+  {
+    pthread_mutex_unlock ( &gAudioMutex );
+    PLogError ( "Audio In Error pthread_cond_signal\n" );
+    exit ( 1 );
+  }
+  gThreadRunningSignaled = 1;
+
+  while( 1 )
+  {
+    while (!doneWaiting)
+    {
+      int rc = pthread_cond_wait(&gOpenExCalled, &gAudioMutex);
+      switch (rc)
+      {
+        case 0:
+          if (!gOpenExCalledSignaled)
+          {
+            // Avoid spurious wakeups
+            continue;
+          }
+          else
+          {
+            gOpenExCalledSignaled = 0;
+            doneWaiting = 1;
+            break;
+          }
+          break;
+        default:
+          PLogError ( "Audio In Error pthread_cond_wait\n" );
+          pthread_mutex_unlock(&gAudioMutex);
+          return ( (void *)NULL );
+      }
+    }
+    doneWaiting = 0;
+    pthread_mutex_unlock(&gAudioMutex);
+
+    if( gTerminateThread == 1 )
+      break;
+
+    /* buffer of 16 bits samples */
+    CodecBuffer = (audioinSample *)malloc ( gCodecFragmentSizeInFrames * sizeof ( audioinSample ) );
+
+    if ( CodecBuffer == NULL )
+    {
+      PLogError ( "Audio In Error pthread_cond_signal\n" );
+      exit ( 1 );
+    }
+
+    while ( !getClose ( ) )
+    {
+      int iReadFrames  = 0;  /* number of frames acquired by the codec */
+      /* NOTE: here a frame is comprised of 1 sample if mono, 2 samples if stereo, etc */
+      int iReadSamples = 0;  /* number of samples acquired by the codec */
+      if ( ( iReadFrames = snd_pcm_readi ( ghPCM, (void *)CodecBuffer, gCodecFragmentSizeInFrames ) ) < 0 )
+      {
+        if ( iReadFrames == -EBADFD )
+        {
+          PLogError ( "Audio In Error PCM Not In The Right State\n" );
+        }
+        else if ( iReadFrames == -EPIPE )
+        {
+          snd_pcm_prepare(ghPCM);
+          PLogError ( "Audio In Error Overrun\n" );
+        }
+        else if ( iReadFrames == -ESTRPIPE )
+        {
+          PLogError ( "Audio In Error Stream Suspended\n" );
+        }
+      }
+      iReadSamples = iReadFrames;
+
+      if ( getRecord ( ) )  /* else continue to read from driver but discard samples */
+      {
+        if ( iReadSamples < 0 )
+        {
+          iReadSamples = 0;
+          gAudioInInfo.eStatusInfo = AUDIOIN_HWOVERRUN;
+        }
+        else
+        {
+#ifdef FILTER_ON
+          /* x: index for start of input samples; y: index for output sample */
+          for ( x = 0, y = 0; x < iReadSamples; x += pFIR->factor_down )
+          {
+            FIR_downsample ( pFIR->factor_down, &( CodecBuffer[x] ), &( CodecBuffer[y++] ), pFIR );
+          }
+          /* update the number samples */
+          iReadSamples = y;
+#endif
+#ifdef SAVE_RAW_AUDIO
+          if ( iReadSamples > 0 )
+            fwrite ( CodecBuffer, 2, iReadSamples, audio_data );
+#endif
+
+          pthread_mutex_lock ( &gAudioMutex );
+
+          if ( gAudioInInfo.u32SamplesAvailable + iReadSamples > SAMPLES_BUFFER_SIZE )
+          {
+            gAudioInInfo.u32SamplesAvailable = SAMPLES_BUFFER_SIZE;
+            gAudioInInfo.eStatusInfo = AUDIOIN_FIFOOVERRUN;
+          }
+          else
+          {
+            if ( gAudioInInfo.u32SamplesAvailable + iReadSamples > SAMPLES_BUFFER_HIGH_WATERMARK )
+            {
+              gAudioInInfo.eStatusInfo = AUDIOIN_HIGHWATERMARK;
+            }
+            else if ( gAudioInInfo.eStatusInfo != AUDIOIN_FIFOOVERRUN )
+            {
+              gAudioInInfo.eStatusInfo = AUDIOIN_NORMAL;
+            }
+            gAudioInInfo.u32SamplesAvailable += iReadSamples;
+          }
+          if ( gWriteIndexPointer + iReadSamples <= SAMPLES_BUFFER_SIZE )
+          {
+            memcpy ( &( gSamplesBufferCircularFifo[gWriteIndexPointer] ), CodecBuffer,
+                iReadSamples * sizeof ( audioinSample ) );
+            gWriteIndexPointer += iReadSamples;
+
+            if ( gWriteIndexPointer >= SAMPLES_BUFFER_SIZE )
+              gWriteIndexPointer = 0;
+          }
+          else
+          {
+            int NbToCopy;
+
+            NbToCopy = SAMPLES_BUFFER_SIZE - gWriteIndexPointer;
+            memcpy ( &( gSamplesBufferCircularFifo [gWriteIndexPointer] ), CodecBuffer,
+                NbToCopy * sizeof ( audioinSample ) );
+            gWriteIndexPointer = 0;
+            memcpy ( gSamplesBufferCircularFifo, &( CodecBuffer [NbToCopy] ),
+                ( iReadSamples-NbToCopy ) * sizeof ( audioinSample ) );
+            gWriteIndexPointer = iReadSamples - NbToCopy;
+          }
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+          /* Callback notification.  Ideally this audio acquisition thread should be very lean.
+             It should simply read from the low level driver, store the filtered samples in  
+             the FIFO, then go back to reading from the driver.  The additional data copy 
+             for the callback function is ok despite the overhead incurred, but only because 
+             there's some buffering done by the low level driver.  This design should be 
+             revisited to make it more general purpose.
+             */
+          while ( ( gpCallback != NULL ) && ( gAudioInInfo.u32SamplesAvailable >= gnCallbackSamples ) )
+          {            
+            AUDIOIN_WAVEHDR *pwhdr;
+
+            pwhdr = malloc ( sizeof ( AUDIOIN_WAVEHDR ) );
+
+            if ( pwhdr != NULL )
+            {            
+              pwhdr->nBufferLength  = gnCallbackSamples * sizeof ( audioinSample );
+              pwhdr->nBytesRecorded = pwhdr->nBufferLength;
+              pwhdr->status = gAudioInInfo.eStatusInfo;
+              pwhdr->pData = malloc ( pwhdr->nBufferLength );
+
+              if ( pwhdr->pData != NULL )
+              {
+                if ( gReadIndexPointer + gnCallbackSamples <= SAMPLES_BUFFER_SIZE )
+                { 
+                  memcpy ( pwhdr->pData, &( gSamplesBufferCircularFifo [gReadIndexPointer] ),
+                      pwhdr->nBufferLength );
+                  gReadIndexPointer += gnCallbackSamples;
+
+                  if ( gReadIndexPointer >= SAMPLES_BUFFER_SIZE )
+                    gReadIndexPointer = 0;
+                }
+                else
+                { 
+                  size_t nSamplesPart1 = SAMPLES_BUFFER_SIZE - gReadIndexPointer;
+                  size_t nSamplesPart2 = gnCallbackSamples - nSamplesPart1;
+
+                  memcpy ( pwhdr->pData, &( gSamplesBufferCircularFifo [gReadIndexPointer] ),
+                      nSamplesPart1*sizeof ( audioinSample ) );
+                  gReadIndexPointer = 0;
+                  memcpy ( pwhdr->pData + nSamplesPart1 * sizeof (audioinSample ),
+                      gSamplesBufferCircularFifo, nSamplesPart2 * sizeof ( audioinSample ) );
+                  gReadIndexPointer = nSamplesPart2;
+                }                                         
+                gAudioInInfo.u32SamplesAvailable -= gnCallbackSamples;
+                /* pass samples to callback function who should deallocate the buffer and structure */
+                gpCallback ( *phAudioIn, AUDIOIN_MSG_DATA, gpCallbackInstance, pwhdr, NULL );
+              }
+              else
+              {
+                // error
+              }
+            }
+            else
+            {
+              // error
+            }
+          }
+#endif
+          /* samples are available to read */
+          pthread_mutex_unlock ( &gAudioMutex );
+          timer.tv_sec = 0;
+          timer.tv_usec = 200;
+          select ( 0, NULL, NULL, NULL, &timer );
+        }
+      } /* if (getRecord()) */
+
+    } /* while (!getClose()) */
+
+    if ( snd_pcm_close ( ghPCM ) !=0 )
+    {
+      PLogError ( "Audio In Error Closing Hardware\n" );
+    }
+
+    free ( CodecBuffer );
+
+    pthread_mutex_lock ( &gAudioMutex );
+    //signal to tell that our thread is now running.
+    if ( pthread_cond_signal ( &gCloseCalled ) != 0 )
+    {
+      pthread_mutex_unlock ( &gAudioMutex );
+      PLogError ( "Audio In Error pthread_cond_signal\n" );
+      exit ( 1 );
+    }
+    gCloseCalledSignaled = 1;
+  }
+  pthread_exit ( (void *)NULL );
+  return ( (void *)NULL );
+}
+#endif
+
+/**************************************************************
+ * OpenAndPrepareSound                                         *
+ *************************************************************/
+
+
+static int OpenAndPrepareSound(unsigned long ulFrequency)
+{
+#if defined(ANDROID)
+
+  /* Only support certain frequencies.  Modify this to check frequency
+     against a structure of valid frequencies */
+#ifdef FILTER_ON
+  if ( ulFrequency == 11025 )
+  {
+    if ( AudioSetInputFormat ( 44100, NR_OF_CHANNELS ) != 0 ) /* sample at 44100 then downsample */
+    {
+      PLogError ( "Audio In Error OpenAndPrepareSound - AudioSetInputFormat failed!\n");
+      return LHS_E_AUDIOIN_COULDNOTOPENDEVICE; 
+    }
+  }
+  else
+  {
+    PLogError ( "Audio In Error OpenAndPrepareSound - invalid frequency!");
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+#else
+  if ( ( ulFrequency == 11025 ) || ( ulFrequency == 8000 ) )
+  {
+    if ( AudioSetInputFormat ( ulFrequency, NR_OF_CHANNELS ) != 0 )
+    {
+      PLogError ( "Audio In Error OpenAndPrepareSound - AudioSetInputFormat failed!");
+      return LHS_E_AUDIOIN_COULDNOTOPENDEVICE; 
+    }
+  }
+  else
+  {
+    PLogError ( "Audio In Error OpenAndPrepareSound - invalid frequency!");
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+#endif
+
+  /* set some variables */
+  gAudioInInfo.u32SamplesAvailable = 0;
+
+  /* Open Audio driver */
+  if (AudioOpen() < 0)
+  {
+    PLogError ( "Audio In Error OpenAndPrepareSound - AudioOpen failed!");
+    return ~LHS_AUDIOIN_OK;
+  }
+
+#else
+
+  snd_pcm_hw_params_t *hwparams;
+  unsigned int         exact_rate;
+  int                  dir;
+  int                  rc;
+
+  /* step 1 : open the sound device */
+  /* ------------------------------ */
+  if ((rc = snd_pcm_open(&ghPCM, "default", SND_PCM_STREAM_CAPTURE, 0)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_open() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+  if ((rc = snd_pcm_hw_params_malloc(&hwparams)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_hw_params_malloc() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+  /* step 2 : configuring the audio channel */
+  /* -------------------------------------- */
+
+  if ((rc = snd_pcm_hw_params_any(ghPCM, hwparams)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_hw_params_any() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+  if ((rc = snd_pcm_hw_params_set_access(ghPCM, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_hw_params_set_access() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+  if ((rc = snd_pcm_hw_params_set_format(ghPCM, hwparams, SND_PCM_FORMAT_S16_LE)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_hw_params_set_format() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+#ifdef FILTER_ON
+  if (ulFrequency == 11025)
+  {
+    exact_rate = 44100;
+  }
+  else
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+#else
+  exact_rate = ulFrequency;
+#endif  
+
+  dir = 0;
+
+#if 0
+  /* This version seems to have problems when the code is compiled into a shared library.
+     The subsequent call to snd_pcm_hw_params() fails. */
+  if ((rc = snd_pcm_hw_params_set_rate_near(ghPCM, hwparams, &exact_rate, &dir)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_hw_params_set_rate_near() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+#else
+  /* This version works better and in fact makes more sense. */
+  if ((rc = snd_pcm_hw_params_set_rate(ghPCM, hwparams, exact_rate, dir)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_hw_params_set_rate() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+#endif
+
+
+  if ((rc = snd_pcm_hw_params_set_channels(ghPCM, hwparams, NR_OF_CHANNELS)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_hw_params_set_channels() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+  if ((rc = snd_pcm_hw_params(ghPCM, hwparams)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_hw_params() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+  /* step 3 : preparing for read */
+  /* --------------------------- */
+
+  /*prepare the channel */
+
+  if ((rc = snd_pcm_prepare(ghPCM)) < 0)
+  {
+    PLogError ( "Audio In Error snd_pcm_prepare() (rc = %d: %s)\n", rc, snd_strerror(rc));
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+  /* set some variables */
+  gAudioInInfo.u32SamplesAvailable = 0;
+
+
+#endif
+
+  /* prepare to read samples */
+  setCloseOff();
+
+  return 0;
+}
+
+
+/* -------------------------------------------------------------------------+
+   |   GLOBAL FUNCTIONS (prototypes in header file)                           |
+   + -------------------------------------------------------------------------*/
+
+/**************************************************************
+ * lhs_audioinOpenEx                                             *
+ *                                                             *
+ * notes :                                                     *
+ *  -the input parameters are in fact not used but present     *
+ *    to ensure compatibility with Win32 implementations       *
+ **************************************************************/
+LHS_AUDIOIN_ERROR  lhs_audioinOpenEx (
+    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
+                                          devices on the system). You can also use the following flag
+                                          instead of a device identifier.
+                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
+                                          waveform-audio input device capable of recording in the
+                                          specified format. <bold Header:> Declared in Mmsystem.h from
+                                          the Windows Multimedia: Platform SDK.*/
+    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
+    unsigned long u32NbrOfFrames,       /*@parm [in]  Number of frames buffered internally. */
+    unsigned long u32SamplesPerFrame,   /*@parm [in]  Size, in samples, of each individual frame. */
+    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
+    )
+{
+  //initialize some of the static variables.
+  if( Initialize(phAudioIn) )
+    return ~LHS_AUDIOIN_OK;
+
+
+  /* prepare sound */
+  if (OpenAndPrepareSound(u32Frequency) != 0)
+  {
+    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
+  }
+
+  //signal the thread that it has to stop running.
+  pthread_mutex_lock ( &gAudioMutex );
+  //signal to tell that our thread is now running.
+  if ( pthread_cond_signal ( &gOpenExCalled ) != 0 )
+  {
+    pthread_mutex_unlock ( &gAudioMutex );
+    PLogError ( "Audio In Error pthread_cond_signal\n" );
+    exit ( 1 );
+  }
+  gOpenExCalledSignaled = 1;
+  pthread_mutex_unlock ( &gAudioMutex );
+
+#ifdef FILTER_ON
+  /* need to make this more generic to support different filters */
+  pFIR = FIR_construct(filter_length, ps16FilterCoeff_up1_down4, u16ScaleFilterCoeff_up1_down4, FACTOR_UP, FACTOR_DOWN);
+  if (pFIR == NULL)
+  {
+    // TO DO: HANDLE THIS (or modify for static allocation)
+  }
+#endif
+
+  /* set the status to normal */
+  gAudioInInfo.eStatusInfo = AUDIOIN_NORMAL;
+
+  /* do not care, but some applications are checking a NULL handle */
+  *phAudioIn = (void *)10;
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+  gpCallback         = NULL;
+  gpCallbackInstance = NULL;
+  gnCallbackSamples  = 0;
+#endif
+
+  return LHS_AUDIOIN_OK;
+}
+
+/**************************************************************
+ * lhs_audioinOpen                                             *
+ *                                                             *
+ * notes :                                                     *
+ *  -the input parameters are in fact not used but present     *
+ *    to ensure compatibility with Win32 implementation        *
+ **************************************************************/
+LHS_AUDIOIN_ERROR  lhs_audioinOpen (
+    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
+                                          devices on the system). You can also use the following flag
+                                          instead of a device identifier.
+                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
+                                          waveform-audio input device capable of recording in the
+                                          specified format. <bold Header:> Declared in Mmsystem.h from
+                                          the Windows Multimedia: Platform SDK.*/
+    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
+    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
+    )
+{
+  return lhs_audioinOpenEx(u32AudioInID, u32Frequency, 0, 0, phAudioIn);
+} /* lhs_audioinOpen */
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+/**************************************************************
+ * lhs_audioinOpenCallback                                     *
+ *                                                             *
+ * notes :                                                     *
+ *  -the input parameters are in fact not used but present     *
+ *    to ensure compatibility with Win32 implementation        *
+ **************************************************************/
+LHS_AUDIOIN_ERROR  lhs_audioinOpenCallback (
+    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
+                                          devices on the system). You can also use the following flag
+                                          instead of a device identifier.
+                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
+                                          waveform-audio input device capable of recording in the
+                                          specified format. <bold Header:> Declared in Mmsystem.h from
+                                          the Windows Multimedia: Platform SDK.*/
+    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
+    unsigned long u32NbrOfSamples,      /*@parm [in] <nl><bold Input:> Number of samples requested per callback */  
+    pCallbackFunc pCallback,            /*@parm [in] callback function */
+    void         *pCallbackInstance,    /*@parm [in] callback instance */
+    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
+    )
+{
+  LHS_AUDIOIN_ERROR lhsErr;
+
+#ifdef FILTER_ON
+  gCodecFragmentSizeInFrames = u32NbrOfSamples * 4;
+#else
+  gCodecFragmentSizeInFrames = u32NbrOfSamples;
+#endif
+
+  if ((pCallback == NULL) || (u32NbrOfSamples == 0))
+  {
+    return LHS_E_AUDIOIN_INVALIDARG;
+  } 
+  lhsErr = lhs_audioinOpenEx(u32AudioInID, u32Frequency, 0, 0, phAudioIn);
+  if (lhsErr != LHS_AUDIOIN_OK)
+  {
+    return lhsErr;
+  }
+
+  /* install callback */
+  gpCallback         = pCallback;
+  gpCallbackInstance = pCallbackInstance;  
+  gnCallbackSamples  = u32NbrOfSamples;
+
+  /* callback notification */
+  gpCallback(*phAudioIn, AUDIOIN_MSG_OPEN, gpCallbackInstance, NULL, NULL);
+
+  return LHS_AUDIOIN_OK;
+
+} /* lhs_audioinOpenCallback */
+#endif
+
+/**************************************************************
+ * lhs_audioinClose                                            *
+ *                                                             *
+ * notes :                                                     *
+ *  -the input parameters are in fact not used but present     *
+ *    to ensure compatibility with Win32 implementations       *
+ **************************************************************/
+
+LHS_AUDIOIN_ERROR lhs_audioinClose(AUDIOIN_H *phAudioIn)
+{
+  int doneWaiting = 0;
+
+  /* Validate the handle */
+  if ((phAudioIn == NULL) || (*phAudioIn == NULL))
+  {
+    return LHS_E_AUDIOIN_NULLPOINTER;
+  }
+
+  /* stop recording audio samples */
+  setRecordOff();
+
+  /* stop reading audio samples */
+  setCloseOn();
+
+  //wait for the thread to stop reading samples.
+  pthread_mutex_lock ( &gAudioMutex );
+
+  while (!doneWaiting)
+  {
+    int rc = pthread_cond_wait(&gCloseCalled, &gAudioMutex);
+    switch (rc)
+    {
+      case 0:
+        if (!gCloseCalledSignaled)
+        {
+          // Avoid spurious wakeups
+          continue;
+        }
+        else
+        {
+          gCloseCalledSignaled = 0;
+          doneWaiting = 1;
+          break;
+        }
+        break;
+      default:
+        PLogError ( "Audio In Error pthread_cond_wait\n" );
+        pthread_mutex_unlock(&gAudioMutex);
+        return ~LHS_AUDIOIN_OK;
+    }
+  }
+  pthread_mutex_unlock(&gAudioMutex);
+
+#ifdef FILTER_ON
+  FIR_deconstruct(pFIR);
+#endif
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+  /* callback notification */
+  if (gpCallback != NULL) gpCallback(*phAudioIn, AUDIOIN_MSG_CLOSE, gpCallbackInstance, NULL, NULL);
+#endif
+
+  return LHS_AUDIOIN_OK;
+}
+
+/**************************************************************
+ * lhs_audioinStart                                            *
+ *                                                             *
+ * notes :                                                     *
+ *  -the input parameters are in fact not used but present     *
+ *    to ensure compatibility with Win32 implementations       *
+ *  -in fact the recording is never stopped or started, when   *
+ *    non in 'start' status, the samples are just ignored      *
+ **************************************************************/
+
+LHS_AUDIOIN_ERROR lhs_audioinStart(AUDIOIN_H hAudioIn)
+{
+#ifdef SAVE_RAW_AUDIO
+  char file_name [256];
+
+  gettimeofday ( &buffer_save_audio, NULL );
+  sprintf ( file_name, "data_%ld_%ld.raw", buffer_save_audio.tv_sec, buffer_save_audio.tv_usec );
+  audio_data = fopen ( file_name, "w" );
+#endif
+  if (hAudioIn == NULL)
+  {
+    return LHS_E_AUDIOIN_NULLPOINTER;
+  }
+
+  pthread_mutex_lock ( &gAudioMutex );
+
+#ifdef FILTER_ON
+  FIR_reset(pFIR);
+#endif
+
+  gWriteIndexPointer = 0;
+  gReadIndexPointer = 0;
+  gAudioInInfo.u32SamplesAvailable = 0;
+
+  /* start recording */
+  setRecordOn();
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+  /* callback notification */
+  if (gpCallback != NULL) gpCallback(hAudioIn, AUDIOIN_MSG_START, gpCallbackInstance, NULL, NULL);
+#endif
+  pthread_mutex_unlock ( &gAudioMutex );
+
+  return LHS_AUDIOIN_OK;
+}
+
+/**************************************************************
+ * lhs_audioinStop                                             *
+ *                                                             *
+ * notes :                                                     *
+ *  -the input parameters are in fact not used but present     *
+ *    to ensure compatibility with Win32 implementations       *
+ *  -in fact the recording is never stopped or started, when   *
+ *    non in 'start' status, the samples are just ignored      *
+ **************************************************************/
+
+LHS_AUDIOIN_ERROR lhs_audioinStop(AUDIOIN_H hAudioIn)
+{
+#ifdef SAVE_RAW_AUDIO
+  fclose ( audio_data );
+#endif
+  if (hAudioIn == NULL)
+  {
+    return LHS_E_AUDIOIN_NULLPOINTER;
+  }
+  pthread_mutex_lock ( &gAudioMutex );
+
+  /* stop recording (discard samples) */
+  setRecordOff();
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+  /* callback notification */
+  if (gpCallback != NULL) gpCallback(hAudioIn, AUDIOIN_MSG_STOP, gpCallbackInstance, NULL, NULL);
+#endif
+  pthread_mutex_unlock ( &gAudioMutex );
+
+  return LHS_AUDIOIN_OK;
+}
+
+/**************************************************************
+ * lhs_audioinGetSamples                                       *
+ *                                                             *
+ * notes :                                                     *
+ **************************************************************/
+
+LHS_AUDIOIN_ERROR lhs_audioinGetSamples(AUDIOIN_H hAudioIn, unsigned long * u32NbrOfSamples, void * pAudioBuffer, AUDIOIN_INFO * pgAudioInInfo)
+{
+  unsigned long cSamples;
+  //unsigned long nToCopy;
+
+  /* Check if the handle is valid */
+  if (hAudioIn == NULL)
+  {
+    return LHS_E_AUDIOIN_NULLPOINTER;
+  }
+
+  cSamples = 0;
+
+  while (1)
+  {
+    /* wait until we have enough samples */
+    if (*u32NbrOfSamples <= gAudioInInfo.u32SamplesAvailable)
+    {
+      /* lock the code to prevent dual access to some variables */
+      pthread_mutex_lock(&gAudioMutex);
+
+      /* TO DO: consider copying in chunks (like in AquisitionThread) 
+         rather than 1 sample at a time. */
+
+      /* copy all samples into the input buffer */
+      while ((cSamples < *u32NbrOfSamples))
+      {
+        ((audioinSample *)pAudioBuffer)[cSamples++] = gSamplesBufferCircularFifo[gReadIndexPointer++];
+
+        /* adapt the parameters */
+        gAudioInInfo.u32SamplesAvailable -= 1;
+
+        /* adapt circular buffer */
+        if (gReadIndexPointer >= SAMPLES_BUFFER_SIZE)
+        {
+          gReadIndexPointer = 0;
+        }
+
+        /* enough samples */
+        if (cSamples == *u32NbrOfSamples)
+        {
+          /* return the audioin info structure */
+          memcpy(pgAudioInInfo, &gAudioInInfo, sizeof(AUDIOIN_INFO));
+          pthread_mutex_unlock(&gAudioMutex);
+          return LHS_AUDIOIN_OK;
+        }
+      }
+    }
+    else
+    {
+      /* relinquish CPU.  select() is more reliable than usleep(). */
+      timer.tv_sec = 0;
+      timer.tv_usec = 10000;
+      select(0, NULL, NULL, NULL, &timer);  
+    }
+  } /* while (1) */
+}
+
+/**************************************************************
+ * lhs_audioinGetVersion                                       *
+ *                                                             *
+ * notes : not implemented                                     *
+ **************************************************************/
+
+LHS_AUDIOIN_ERROR lhs_audioinGetVersion(unsigned long *pu32Version)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+
+/**************************************************************
+ * lhs_audioinGetVolume/lhs_audioinSetVolume                   *
+ *                                                             *
+ * notes : not implemented                                     *
+ **************************************************************/
+
+LHS_AUDIOIN_ERROR lhs_audioinGetVolume(AUDIOIN_H hAudioIn, unsigned long *pu32Volume)
+{
+  *pu32Volume = gRecordingVolume;
+  return LHS_AUDIOIN_OK;
+}
+
+LHS_AUDIOIN_ERROR lhs_audioinSetVolume(AUDIOIN_H hAudioIn, unsigned long u32Volume)
+{
+  gRecordingVolume = u32Volume;
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+/**************************************************************
+ * lhs_audioinErrorGetString                                   *
+ *                                                             *
+ * notes : not implemented                                     *
+ **************************************************************/
+
+const char *lhs_audioinErrorGetString(const LHS_AUDIOIN_ERROR Error)
+{
+  return ("unknown error");
+}
+
+
+#else
+/******************************************************************************/
+/* STUB FUNCTIONS FOR SIMULATOR BUILD (DOES NOT SUPPORT THREADS)              */
+/* This code is enabled if both ANDROID and __ARM_ARCH_5__ are defined.       */
+/******************************************************************************/
+
+#include "audioin.h"
+
+LHS_AUDIOIN_ERROR  lhs_audioinOpenEx (
+    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
+                                          devices on the system). You can also use the following flag
+                                          instead of a device identifier.
+                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
+                                          waveform-audio input device capable of recording in the
+                                          specified format. <bold Header:> Declared in Mmsystem.h from
+                                          the Windows Multimedia: Platform SDK.*/
+    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
+    unsigned long u32NbrOfFrames,       /*@parm [in]  Number of frames buffered internally. */
+    unsigned long u32SamplesPerFrame,   /*@parm [in]  Size, in samples, of each individual frame. */
+    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
+    )
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+LHS_AUDIOIN_ERROR  lhs_audioinOpen (
+    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
+                                          devices on the system). You can also use the following flag
+                                          instead of a device identifier.
+                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
+                                          waveform-audio input device capable of recording in the
+                                          specified format. <bold Header:> Declared in Mmsystem.h from
+                                          the Windows Multimedia: Platform SDK.*/
+    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
+    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
+    )
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+#ifdef AUDIOIN_SUPPORT_CALLBACK
+LHS_AUDIOIN_ERROR lhs_audioinOpenCallback(unsigned long u32AudioInID, unsigned long u32Frequency, unsigned long u32NbrOfSamples, pCallbackFunc pCallback, void* pCallbackInstance, AUDIOIN_H * phAudioIn)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+#endif
+
+LHS_AUDIOIN_ERROR lhs_audioinClose(AUDIOIN_H *phAudioIn)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+LHS_AUDIOIN_ERROR lhs_audioinStart(AUDIOIN_H hAudioIn)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+LHS_AUDIOIN_ERROR lhs_audioinStop(AUDIOIN_H hAudioIn)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+LHS_AUDIOIN_ERROR lhs_audioinGetSamples(AUDIOIN_H hAudioIn, unsigned long * u32NbrOfSamples, void * pAudioBuffer, AUDIOIN_INFO * pgAudioInInfo)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+LHS_AUDIOIN_ERROR lhs_audioinGetVersion(unsigned long *pu32Version)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+LHS_AUDIOIN_ERROR lhs_audioinGetVolume(AUDIOIN_H hAudioIn, unsigned long *pu32Volume)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+LHS_AUDIOIN_ERROR lhs_audioinSetVolume(AUDIOIN_H hAudioIn, unsigned long u32Volume)
+{
+  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
+}
+
+const char *lhs_audioinErrorGetString(const LHS_AUDIOIN_ERROR Error)
+{
+  return "LHS_E_AUDIOIN_NOTIMPLEMENTED";
+}
+
+#endif
diff --git a/audio/AudioIn/UNIX/src/audioinwrapper.cpp b/audio/AudioIn/UNIX/src/audioinwrapper.cpp
new file mode 100644
index 0000000..6d3ff99
--- /dev/null
+++ b/audio/AudioIn/UNIX/src/audioinwrapper.cpp
@@ -0,0 +1,276 @@
+/*---------------------------------------------------------------------------*
+ *  audioinwrapper.cpp                                                       *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#if defined(ANDROID) && defined(__ARM_ARCH_5__)
+
+//#define USE_DEV_EAC_FILE 1
+
+#if defined(USE_DEV_EAC_FILE)
+#include <fcntl.h>
+#define N_CHANNELS 1
+#else
+#include <media/AudioRecord.h>
+#include <media/AudioSystem.h>
+using namespace android;
+#endif
+
+#endif // defined(ANDROID) && defined(__ARM_ARCH_5__)
+
+#include "plog.h"
+
+// #define SAVE_RAW_AUDIO              1
+
+#ifdef SAVE_RAW_AUDIO
+#include <sys/time.h>
+#include <stdio.h>
+
+
+static FILE *audio_data;
+static struct timeval buffer_save_audio;
+#endif
+
+
+// #define MEASURE_SAMPLE_TIMES        1
+ 
+#ifdef MEASURE_SAMPLE_TIMES
+#include <sys/time.h>
+#include <stdio.h>
+#include <string.h>
+ 
+ 
+#define MAX_SAMPLES_TO_MEASURE      500
+
+static long sample_buffers_received = 0;
+static long total_samples_received = 0;
+static long samples_in_buffer [MAX_SAMPLES_TO_MEASURE];
+static long seconds_buffer_received [MAX_SAMPLES_TO_MEASURE];
+static long micro_seconds_buffer_received [MAX_SAMPLES_TO_MEASURE];
+static struct timeval buffer_received_time;
+ 
+static void AudioIn_Log_Samples_Received ( void );
+ 
+static void AudioIn_Log_Samples_Received ( void )
+    {
+    FILE *log_file;
+    char file_name [256];
+    char log_buffer [256];
+    long loop_counter;
+
+    if ( sample_buffers_received > 0 )
+        {
+        gettimeofday ( &buffer_received_time, NULL );
+        sprintf ( file_name, "aud_in_%ld_%ld.txt", buffer_received_time.tv_sec, buffer_received_time.tv_usec );
+        log_file = fopen ( file_name, "w" );
+						 
+        if ( log_file != NULL )
+            {
+            for ( loop_counter = 0; loop_counter < sample_buffers_received; loop_counter++ )
+                {
+                sprintf ( log_buffer, "%ld %ld  %ld  %ld\n", loop_counter + 1, samples_in_buffer [loop_counter],
+                    seconds_buffer_received [loop_counter], micro_seconds_buffer_received [loop_counter] );
+                fwrite ( log_buffer, 1, strlen ( log_buffer ), log_file );
+                }
+            fclose ( log_file );
+            }
+        sample_buffers_received = 0;
+        }
+    }
+#endif
+
+
+extern "C" 
+{
+
+#if defined(ANDROID) && defined(__ARM_ARCH_5__)
+    
+#if defined(USE_DEV_EAC_FILE)
+static int audiofd = -1;
+#else
+static AudioRecord* record;
+static int sampleRate = 8000;
+static int numChannels = 1;
+#endif
+
+// called before AudioOpen
+int AudioSetInputFormat(int sample_rate, int channel_count)
+{
+#if defined(USE_DEV_EAC_FILE)
+  return 0;
+#else
+  sampleRate = sample_rate;
+  numChannels = channel_count;
+  return 0;
+#endif
+}
+
+int AudioOpen(void)
+{
+#if defined(USE_DEV_EAC_FILE)
+  audiofd = open("/dev/eac", O_RDONLY, 0666);
+  if (audiofd >= 0) {
+    //fcntl(audiofd, F_SETFL, O_NONBLOCK);
+  
+    // possibly lame attempt to get Sooner audio input working
+    struct { unsigned long param1, param2, param3; } params = { 11025, 0, 0 };
+    ioctl(audiofd, 317, &params, sizeof(params));
+  }
+
+  return audiofd;
+#else
+    #ifdef SAVE_RAW_AUDIO
+        char file_name [256];
+
+        gettimeofday ( &buffer_save_audio, NULL );
+        sprintf ( file_name, "data_%ld_%ld.raw", buffer_save_audio.tv_sec, buffer_save_audio.tv_usec );
+        audio_data = fopen ( file_name, "w" );
+    #endif
+  record = new android::AudioRecord(
+    android::AudioRecord::DEFAULT_INPUT, sampleRate,
+    android::AudioSystem::PCM_16_BIT, numChannels, 8, 0);
+  
+  if (!record) return -1;
+  
+  return record->start() == NO_ERROR ? 0 : -1;
+#endif
+}
+
+int AudioClose(void)
+{
+#if defined(USE_DEV_EAC_FILE)
+  return close(audiofd);
+#else
+    #ifdef MEASURE_SAMPLE_TIMES
+        AudioIn_Log_Samples_Received ( );
+    #endif
+  record->stop();
+  delete record;
+    #ifdef SAVE_RAW_AUDIO
+        fclose ( audio_data );
+    #endif
+  return 0;
+#endif
+}
+
+int AudioRead(short *buffer, int frame_count)
+{
+  int n;
+#if defined(USE_DEV_EAC_FILE)
+  n = read(audiofd, buffer, frame_count*sizeof(short)*N_CHANNELS);
+  n /= sizeof(short)*N_CHANNELS;
+  return n;
+#else
+  int nreq = frame_count * sizeof(short);
+  n = record->read(buffer, nreq);
+  if (n > 0) {
+    if (n != nreq) {
+      PLogError ( "AudioRead error: not enough data %d vs %d\n", n, nreq );
+    }
+    n /= sizeof(short);
+  }
+    #ifdef MEASURE_SAMPLE_TIMES
+        if ( sample_buffers_received < MAX_SAMPLES_TO_MEASURE )
+            {
+            gettimeofday ( &buffer_received_time, NULL );
+            seconds_buffer_received [sample_buffers_received] = buffer_received_time.tv_sec;
+            micro_seconds_buffer_received [sample_buffers_received] = buffer_received_time.tv_usec;
+            samples_in_buffer [sample_buffers_received] = n;
+            total_samples_received += n;
+            sample_buffers_received++;
+            }
+    #endif
+
+    #ifdef SAVE_RAW_AUDIO
+        if ( n > 0 )
+            fwrite ( buffer, 2, n, audio_data );
+    #endif
+  return n;
+#endif
+}
+
+int AudioSetVolume(int stream_type, int volume)
+{
+#if defined(USE_DEV_EAC_FILE)
+  return 0;
+#else
+  return AudioSystem::setStreamVolume(stream_type, (float)volume/100.0f);
+#endif
+}
+
+int AudioGetVolume(int stream_type)
+{
+#if defined(USE_DEV_EAC_FILE)
+  return 0;
+#else
+  float v = 0;
+  AudioSystem::getStreamVolume(stream_type, &v);
+  return int(v * 100.0f);
+#endif
+}
+
+#else
+
+int AudioOpen(void)
+{
+  return -1;
+}
+
+int AudioClose(void)
+{
+  return -1;
+}
+
+int AudioSetInputFormat(int sample_rate, int channel_count)
+{
+  return -1;
+}
+
+int AudioSetOutputFormat(int sample_rate, int channel_count)
+{
+  return -1;
+}
+
+int AudioRead(short *buffer, int frame_count)
+{
+  return -1;
+}
+
+int AudioWrite(short *buffer, int frame_count)
+{
+  return -1;
+}
+
+int AudioSetStreamType(int stream_type)
+{
+  return -1;
+}
+
+int AudioSetVolume(int stream_type, int volume)
+{
+  return -1;
+}
+
+int AudioGetVolume(int stream_type)
+{
+  return -1;
+}
+
+#endif
+
+} // extern "C"
diff --git a/audio/AudioIn/UNIX/src/filter.c b/audio/AudioIn/UNIX/src/filter.c
new file mode 100644
index 0000000..9e983d0
--- /dev/null
+++ b/audio/AudioIn/UNIX/src/filter.c
@@ -0,0 +1,376 @@
+/*---------------------------------------------------------------------------*
+ *  filter.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#define _ROUNDOFF
+
+/****************************************************************************
+ * FILENAME
+ *     pcm44pcm11.c
+ *
+ * DESCRIPTION
+ *
+ *     Apply FIR filter to 44 kHz raw 16-bit PCM linear audio then
+ *     downsample to 11 kHz.
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "filter.h"
+
+/****************************************************************************
+ *                                 FIR FILTER                               *
+ ****************************************************************************/
+
+/* b = firls(120, [0 5000 6000 44000/2]/44000*2, [1 1 0 0]);   */
+/* bRounded = round(b*2^15);                                   */
+
+const typeCoeff ps16FilterCoeff_up1_down4[] = {
+
+        1,      9,     13,     10,     -1,    -16,    -24,    -18,      2,     25,
+       38,     28,     -2,    -38,    -57,    -42,      3,     55,     81,     60,
+       -3,    -76,   -113,    -84,      4,    104,    153,    114,     -5,   -138,
+     -205,   -152,      5,    183,    271,    202,     -6,   -241,   -360,   -269,
+        6,    321,    482,    364,     -6,   -438,   -667,   -511,      7,    632,
+      986,    778,     -7,  -1030,  -1704,  -1450,      7,   2451,   5204,   7366,
+     8185,   7366,   5204,   2451,      7,  -1450,  -1704,  -1030,     -7,    778,
+      986,    632,      7,   -511,   -667,   -438,     -6,    364,    482,    321,
+        6,   -269,   -360,   -241,     -6,    202,    271,    183,      5,   -152,
+     -205,   -138,     -5,    114,    153,    104,      4,    -84,   -113,    -76,
+       -3,     60,     81,     55,      3,    -42,    -57,    -38,     -2,     28,
+       38,     25,      2,    -18,    -24,    -16,     -1,     10,     13,      9,
+        1,
+};
+unsigned int filter_length = sizeof(ps16FilterCoeff_up1_down4)/sizeof(typeCoeff);
+
+/****************************************************************************
+ * FIR_struct *FIR_construct(unsigned int nTaps, FIR_type *pCoeffs)
+ *
+ * DESCRIPTION
+ *     allocate and initialize FIR structure
+ *
+ * INPUT
+ *     nTaps    - length of FIR filter
+ *     pCoeffs  - pointer to FIR filter coefficients
+ *     scale    - fixed point scale factor
+ *
+ * OUTPUT
+ *     returns pointer to FIR structure; NULL if error
+ ****************************************************************************/
+FIR_struct* FIR_construct(unsigned int nTaps, const typeCoeff *pCoeffs, int scale, int factor_up, int factor_down)
+{
+FIR_struct *pFIR;
+
+    if (nTaps == 0)
+        return NULL;
+
+    pFIR = malloc(sizeof(FIR_struct));
+    if (pFIR == NULL)
+        return NULL;
+
+    // alloocate space for delay line use calloc to avoid uninitialized memory
+    // that causes an audible "pop" at the beginning of audio.  SteveR
+    pFIR->z = calloc(nTaps * sizeof(typeSample), 1);
+    if (pFIR->z == NULL)
+    {
+        free(pFIR);
+        return NULL;
+    }
+
+    pFIR->factor_up   = factor_up;
+    pFIR->factor_down = factor_down;
+
+    pFIR->state       = 0;
+    pFIR->h           = pCoeffs;
+    pFIR->nTaps       = nTaps;
+    pFIR->scale       = scale;
+    pFIR->round       = (1 << (scale-1));
+
+    return pFIR;
+}
+
+/****************************************************************************
+ * int FIR_deconstruct(FIR_struct *pFIR)
+ *
+ * DESCRIPTION
+ *     deallocate FIR structure
+ *
+ * INPUT
+ *     pFIR     - pointer to FIR structure
+ *
+ * OUTPUT
+ *     returns 0 for success; 1 for failure
+ ****************************************************************************/
+
+int FIR_deconstruct(FIR_struct *pFIR)
+{
+    if (pFIR == NULL)
+        return 1;
+
+    if (pFIR->z == NULL)
+        return 1;
+
+    free(pFIR->z);
+    free(pFIR);
+
+    return 0;
+}
+
+/****************************************************************************
+ * void FIR_reset(FIR_struct *pFIR)
+ *
+ * DESCRIPTION
+ *
+ *     reset FIR state
+ *
+ * INPUT
+ *     pFIR     - pointer to FIR structure
+ *
+ * OUTPUT
+ *     pFIR->state initialized
+ ****************************************************************************/
+
+void FIR_reset(FIR_struct *pFIR)
+{
+   pFIR->state = 0;
+
+   memset(pFIR->z, pFIR->nTaps, sizeof(typeSample));
+}
+
+/*****************************************************************************
+ * FIR_type FIR_downsample(unsigned int nInput, typeSample *pInput,
+ *                         typeSample *pOutput, FIR_struct *pFIR)
+ *
+ * DESCRIPTION
+ *
+ *     Apply FIR filter to input data.  If nInput > 1, this will also
+ *     decimate by a factor of nInput.  That is, the filter will only be
+ *     evaluated every nInput samples, not at each of the nInput samples.
+ *
+ *     Breakup filter computation into 2 parts to avoid doing a wraparound
+ *     check inside the loop.
+ *
+ *     Example:
+ *
+ *         pFIR->nTaps   = 8
+ *         pFIR->state   = 2
+ *         nInput        = 1
+ *         *pInput       = s20
+ *
+ *      (a) Store new sample(s) in delay buffer z[]
+ *
+ *          Since pFIR->state == 2, store new sample s20 at location z[2]
+ *
+ *                           *** latest input stored at z[pFIR->state]
+ *                           *
+ *            -------------------------------------------------
+ *          z | s14 | s13 | s20 | s19 | s18 | s17 | s16 | s15 |
+ *            -------------------------------------------------
+ *          h | h0  | h1  | h2  | h3  | h4  | h5  | h6  | h7  |
+ *            -------------------------------------------------
+ *               0     1     2     3     4     5     6     7
+ *
+ *      (b) Update state to point to newest sample, wrap if < 0
+ *
+ *          Since nInput == 1, state for newest sample is still 2
+ *          (otherwise, update state -= nInput-1; wrap by adding nTaps if < 0)
+ *
+ *      (c) Accumulate "end part" first
+ *
+ *           z: start with latest sample at z[pFIR->state], then advance to right
+ *           h: start with 1st filter coefficient, then advance to right
+ *
+ *          acc = h0*s20 + h1*s19 + h2*s18 + h3*s17 + h4*s16 + h5*s15
+ *
+ *      (d) Accumulate "beginning part"
+
+ *           z: start with sample at beginning of delay buffer, then advance
+ *              to sample before latest one at z[pFIR->state]
+ *           h: continue with next filter coefficient from step (a)
+ *
+ *          acc += (h6*s14 + h7*s13)      FIR filter output
+ *          *pOutput = acc
+ *
+ *      (e) Update FIR state
+ *
+ *             state--, wrapping if < 0 to simulate circular buffer
+ *
+ * INPUT
+ *
+ *     nInput   - number of new input samples; evaluate FIR at this point
+ *     pInput   - pointer to input sample buffer
+ *     pOutput  - pointer to output sample buffer
+ *     pFIR     - pointer to FIR structure
+ *
+ * OUTPUT
+ *
+ *****************************************************************************/
+
+void FIR_downsample(unsigned int nInput, typeSample *pInput,
+                    typeSample *pOutput, FIR_struct *pFIR)
+{
+typeAccum        accum;
+typeCoeff const *ph;      // pointer to coefficients
+typeSample      *pz;      // pointer to delay line
+typeSample      *pz_beg;  // pointer to beginning of delay line
+typeSample      *pz_end;  // pointer to last slot in delay line
+unsigned int     nTaps_end;
+unsigned int     nTaps_beg;
+unsigned int     i;
+
+    // initialize
+    accum  = 0;
+    ph     = pFIR->h;                    // point to coefficients
+    pz_beg = pFIR->z;                    // start of delay line
+    pz_end = pFIR->z + pFIR->nTaps - 1;  // end of delay line
+
+    // (a) Store new input samples in delay line (circular addressing would help a lot)
+    pz = pFIR->z + pFIR->state;      // point to next empty slot in delay line
+    for (i = 0; i < nInput; i++)
+    {
+       *pz-- = *pInput++;
+       if (pz < pz_beg)
+          pz = pz_end;    // wrap around (circular buffer)
+    }
+
+    // (b) adjust state to reflect addition of samples
+    pFIR->state -= nInput-1;
+    if (pFIR->state < 0)
+       pFIR->state += pFIR->nTaps;  // wrap
+
+    // (c) Accumulate "end part"
+    pz = pFIR->z + pFIR->state;
+    nTaps_end = pFIR->nTaps - pFIR->state;
+    for (i = 0; i < nTaps_end; i++)
+    {
+        accum += *ph++ * *pz++;
+    }
+
+    // (d) Accumulate "beginning part"
+    pz = pFIR->z;
+    nTaps_beg = pFIR->state;
+    for (i = 0; i < nTaps_beg; i++)
+    {
+        accum += *ph++ * *pz++;
+    }
+
+    // (e) Update FIR state for next batch of incoming samples
+    pFIR->state--;
+    if (pFIR->state < 0)
+       pFIR->state += pFIR->nTaps;  // wrap
+
+#ifdef _ROUNDOFF
+    if (accum >= 0)
+       accum += pFIR->round;
+    else
+       accum -= pFIR->round;
+#endif
+
+    *pOutput = (typeSample) (accum >> pFIR->scale);
+}
+
+#if 0
+/*****************************************************************************
+ * main
+ *****************************************************************************/
+
+int main(int argc, char* argv[])
+{
+FILE         *fpInputSamples;    // input raw PCM file
+FILE         *fpOutputSamples;   // output raw PCM file
+
+typeSample    s_in[FACTOR_DOWN]; // input samples
+typeSample    s_out;             // filtered sample
+FIR_struct   *pFIR;              // pointer to FIR structure
+int           nSampleGet;        // number of samples to read from input speech file
+int           nSampleRead;       // number of samples read from input speech file
+unsigned long nSampleTot;        // total number of samples read so far
+time_t        t0;                // time upon entry
+
+   t0 = time(NULL);     // get time upon entry
+
+    // Check Command-line Parameters
+    if (argc != 3)
+    {
+        fprintf(stderr, "pcm44pcm11 v1.0\n");
+        fprintf(stderr, "  - downsamples 44 kHz to 11 kHz (16-bit PCM, Intel byte order)\n");
+        fprintf(stderr, "Usage: pcm44pcm11 <input PCM file> <output PCM file>\n\n");
+        return 0;
+    }
+
+    // Open input sample file
+    if ((fpInputSamples = fopen(argv[1], "rb")) == NULL)
+    {
+        fprintf(stderr, "Error reading input sample file: %s\n\n", argv[1]);
+        exit(1);                                // abnormal exit
+    }
+
+    // Create output sample file
+    if ((fpOutputSamples = fopen(argv[2], "wb")) == NULL)
+    {
+        fprintf(stderr, "Error creating output file: %s\n\n", argv[2]);
+        fclose(fpInputSamples);
+        exit(1);                                // abnormal exit
+    }
+
+   // **************************************************************************************
+   // Begin filtering...
+   // **************************************************************************************
+
+   pFIR = FIR_construct(filter_length,
+                        ps16FilterCoeff_up1_down4,
+                        u16ScaleFilterCoeff_up1_down4,
+                        FACTOR_UP,
+                        FACTOR_DOWN);
+
+   fprintf(stdout, "Filtering...\n");
+
+   FIR_reset(pFIR);
+
+   nSampleTot = 0;
+   while (!feof(fpInputSamples))
+   {
+      nSampleGet = pFIR->factor_down;   // if downsampling, only filter every factor_down samples
+      nSampleRead = fread(s_in, sizeof(typeSample), nSampleGet, fpInputSamples);
+      if (feof(fpInputSamples) || (nSampleRead != nSampleGet))
+         break;   // done with input file
+      nSampleTot += nSampleRead;
+
+      FIR_downsample(nSampleRead, s_in, &s_out, pFIR);
+
+      if (nSampleTot < pFIR->nTaps)
+         continue;   // wait until delay buffer has been filled to skip transients
+
+      fwrite(&s_out, sizeof(typeSample), 1, fpOutputSamples);
+   }
+
+   fprintf(stdout, "\n\nTime elapsed: %d sec\n", time(NULL)-t0);
+
+   FIR_deconstruct(pFIR);
+
+   fclose(fpInputSamples);
+   fclose(fpOutputSamples);
+
+   return 0;
+}
+
+#endif
diff --git a/audio/test/Android.mk b/audio/test/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/audio/test/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/audio/test/AudioHardwareRecord/Android.mk b/audio/test/AudioHardwareRecord/Android.mk
new file mode 100644
index 0000000..cfd8b1c
--- /dev/null
+++ b/audio/test/AudioHardwareRecord/Android.mk
@@ -0,0 +1,29 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	src/AudioHardwareRecord.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/include \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+
+LOCAL_CFLAGS := \
+
+LOCAL_SHARED_LIBRARIES := \
+	libUAPI_jni \
+	libutils \
+	libhardware \
+
+LOCAL_MODULE:= AudioHardwareRecord
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+
+include $(BUILD_EXECUTABLE)
diff --git a/audio/test/AudioHardwareRecord/src/AudioHardwareRecord.c b/audio/test/AudioHardwareRecord/src/AudioHardwareRecord.c
new file mode 100644
index 0000000..49a85fa
--- /dev/null
+++ b/audio/test/AudioHardwareRecord/src/AudioHardwareRecord.c
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*
+ *  AudioHardwareRecord.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+#include <string.h>
+#include "audioinwrapper.h"
+
+#define SAMPLING_RATE       44100
+
+#define N_FRAMES_PER_BUFFER   512  /* low-level driver counts in terms of frames, not samples */
+#define N_TUPLES_PER_FRAME      1  /* tuple: a set of samples (set of 1 if mono, set of 2 if stereo */
+
+#define N_CHANNELS_PER_TUPLE    1  /* 1: mono; 2: stereo */
+
+#define N_TUPLES_PER_BUFFER   (N_FRAMES_PER_BUFFER * N_TUPLES_PER_FRAME)
+#define N_SAMPLES_PER_BUFFER  (N_TUPLES_PER_BUFFER * N_CHANNELS_PER_TUPLE)
+
+#define N_SECONDS_TO_RECORD    10
+#define N_SAMPLES_TO_RECORD   (SAMPLING_RATE * N_SECONDS_TO_RECORD * N_CHANNELS_PER_TUPLE)
+
+typedef short typeSample;
+
+/* store incoming samples here, then write to file at the end */
+typeSample recordedSamples[N_SAMPLES_TO_RECORD];
+
+
+int main(int argc, char* argv[])
+{
+    int           rc;
+    unsigned int  i;
+
+    memset(recordedSamples, 0, N_SAMPLES_TO_RECORD * sizeof(typeSample));
+
+    rc = AudioSetInputFormat(SAMPLING_RATE, N_CHANNELS_PER_TUPLE);
+    if (rc != 0)
+    {
+        printf("ERROR: AudioSetInputFormat() returns %d\n", rc);
+        exit(1);
+    }
+
+    rc = AudioOpen();
+    if (rc < 0)
+    {
+        printf("ERROR: AudioOpen() returns %d (device handle/ID)\n", rc);
+        exit(1);
+    }
+        
+    i = 0;
+    while (i <= N_SAMPLES_TO_RECORD - N_SAMPLES_PER_BUFFER)
+    {
+        rc = AudioRead(&(recordedSamples[i]), N_FRAMES_PER_BUFFER);
+        if (rc > 0)
+            i += (rc * N_TUPLES_PER_FRAME * N_CHANNELS_PER_TUPLE);
+        else
+            printf("ERROR: AudioRead() returns %d\n", rc);
+    }
+
+    rc = AudioClose();
+    if (rc != 0)
+    {
+        printf("ERROR: AudioClose() returns %d\n", rc);
+        exit(1);
+    }
+
+    /* write to file  */
+    {
+        FILE *fpOutput;
+        char *szFilename = "output_AudioHardwareRecord.pcm";
+
+        fpOutput = fopen(szFilename, "wb");
+        if (fpOutput == NULL)
+        {
+            printf("ERROR: cannot create '%s'\n", szFilename);
+            exit(1);
+        }
+        fwrite(recordedSamples, sizeof(typeSample), i, fpOutput);
+        fclose(fpOutput);
+    }
+
+    return 0;
+}
diff --git a/audio/test/AudioHardwareRecordLoop/Android.mk b/audio/test/AudioHardwareRecordLoop/Android.mk
new file mode 100644
index 0000000..b7fab3a
--- /dev/null
+++ b/audio/test/AudioHardwareRecordLoop/Android.mk
@@ -0,0 +1,29 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	src/AudioHardwareRecordLoop.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/include \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+
+LOCAL_CFLAGS := \
+
+LOCAL_SHARED_LIBRARIES := \
+	libUAPI_jni \
+	libutils \
+	libhardware \
+
+LOCAL_MODULE:= AudioHardwareRecordLoop
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+
+include $(BUILD_EXECUTABLE)
diff --git a/audio/test/AudioHardwareRecordLoop/src/AudioHardwareRecordLoop.c b/audio/test/AudioHardwareRecordLoop/src/AudioHardwareRecordLoop.c
new file mode 100644
index 0000000..9908c0b
--- /dev/null
+++ b/audio/test/AudioHardwareRecordLoop/src/AudioHardwareRecordLoop.c
@@ -0,0 +1,140 @@
+/*---------------------------------------------------------------------------*
+ *  AudioHardwareRecord.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/select.h>
+#include "audioinwrapper.h"
+
+#define SAMPLING_RATE        8000 
+
+#define N_FRAMES_PER_BUFFER   512  /* low-level driver counts in terms of frames, not samples */
+#define N_TUPLES_PER_FRAME      1  /* tuple: a set of samples (set of 1 if mono, set of 2 if stereo */
+
+#define N_CHANNELS_PER_TUPLE    1  /* 1: mono; 2: stereo */
+
+#define N_TUPLES_PER_BUFFER   (N_FRAMES_PER_BUFFER * N_TUPLES_PER_FRAME)
+#define N_SAMPLES_PER_BUFFER  (N_TUPLES_PER_BUFFER * N_CHANNELS_PER_TUPLE)
+
+#define N_RECORDINGS         1000
+#define N_SECONDS_TO_RECORD    5
+#define N_SAMPLES_TO_RECORD   (SAMPLING_RATE * N_SECONDS_TO_RECORD * N_CHANNELS_PER_TUPLE)
+
+typedef short typeSample;
+
+/* store incoming samples here, then write to file at the end */
+typeSample recordedSamples[N_SAMPLES_TO_RECORD];
+
+//#define AUDIO_SET_FORMAT_ONCE_ONLY
+
+int main(int argc, char* argv[])
+{
+    int           rc;
+    unsigned int  iFile;
+    
+    const unsigned short delay_ms = 2000; //1800 //340;
+    
+    printf("For debugging, this is configured to sleep for %u milliseconds before AudioSetInputFormat(%u)\n\n", delay_ms, SAMPLING_RATE);
+
+#if defined(AUDIO_SET_FORMAT_ONCE_ONLY)
+    rc = AudioSetInputFormat(SAMPLING_RATE, N_CHANNELS_PER_TUPLE);
+    if (rc != 0)
+    {
+        printf("ERROR: AudioSetInputFormat() returns %d\n", rc);
+        exit(1);
+    }
+#endif
+
+    for (iFile = 1; iFile <= N_RECORDINGS; iFile++)
+    {
+        unsigned int  i;
+                    
+#if !defined(AUDIO_SET_FORMAT_ONCE_ONLY)
+        {
+          	// see how much of a delay is needed to get rid of error when calling 
+          	// AudioSetInputFormat() immediately after AudioClose()          	
+          	struct timeval  sleep_time_struct;
+          	sleep_time_struct.tv_sec = 0;
+          	sleep_time_struct.tv_usec = delay_ms*1000; // microseconds
+     				select(0, NULL, NULL, NULL, &sleep_time_struct);
+        }
+
+        rc = AudioSetInputFormat(SAMPLING_RATE, N_CHANNELS_PER_TUPLE);
+        if (rc != 0)
+        {
+            printf("ERROR: AudioSetInputFormat() returns %d\n", rc);
+            exit(1);
+        }
+#endif
+    
+        printf("Recording: %3d of %3d\n", iFile, N_RECORDINGS);
+
+        memset(recordedSamples, 0, N_SAMPLES_TO_RECORD * sizeof(typeSample));
+
+        rc = AudioOpen();
+        if (rc < 0)
+        {
+            printf("ERROR: AudioOpen() returns %d (device handle/ID)\n", rc);
+            exit(1);
+        }
+        
+        i = 0;
+        while (i <= N_SAMPLES_TO_RECORD - N_SAMPLES_PER_BUFFER)
+        {
+            rc = AudioRead(&(recordedSamples[i]), N_FRAMES_PER_BUFFER);
+            if (rc > 0)
+                i += (rc * N_TUPLES_PER_FRAME * N_CHANNELS_PER_TUPLE);
+            else
+                printf("ERROR: AudioRead() returns %d\n", rc);
+        }
+        
+        rc = AudioClose();
+        if (rc != 0)
+        {
+            printf("ERROR: AudioClose() returns %d\n", rc);
+            exit(1);
+        }
+                
+        /* write to file  */
+#if 0        
+        {
+            FILE *fpOutput;
+            char szFilename[256];
+            
+            sprintf(szFilename, "output_AudioHardwareRecordLoop_%03d.pcm", iFile);
+        
+            fpOutput = fopen(szFilename, "wb");
+            if (fpOutput == NULL)
+            {
+                printf("ERROR: cannot create '%s'\n", szFilename);
+                exit(1);
+            }
+            fwrite(recordedSamples, sizeof(typeSample), i, fpOutput);
+            fclose(fpOutput);
+            
+            printf("Recording: saved '%s'\n", szFilename);
+        }
+#endif
+    }
+    
+    return 0;
+}
diff --git a/audio/test/AudioInRecord/Android.mk b/audio/test/AudioInRecord/Android.mk
new file mode 100644
index 0000000..d8b6ddd
--- /dev/null
+++ b/audio/test/AudioInRecord/Android.mk
@@ -0,0 +1,29 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	src/AudioInRecord.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/include \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+
+LOCAL_CFLAGS := \
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libhardware \
+	libUAPI_jni \
+
+LOCAL_MODULE:= AudioInRecord
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+
+include $(BUILD_EXECUTABLE)
diff --git a/audio/test/AudioInRecord/src/AudioInRecord.c b/audio/test/AudioInRecord/src/AudioInRecord.c
new file mode 100644
index 0000000..043d09a
--- /dev/null
+++ b/audio/test/AudioInRecord/src/AudioInRecord.c
@@ -0,0 +1,147 @@
+/*---------------------------------------------------------------------------*
+ *  AudioInRecord.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+#include <string.h>
+#ifdef WIN32
+#include <windows.h>
+#include <mmsystem.h>
+#endif
+#include "audioin.h"
+
+#define SAMPLING_RATE       11025
+
+#define N_FRAMES_PER_BUFFER   512  /* low-level driver counts in terms of frames, not samples */
+#define N_TUPLES_PER_FRAME      1  /* tuple: a set of samples (set of 1 if mono, set of 2 if stereo */
+#define N_CHANNELS_PER_TUPLE    1  /* 1: mono; 2: stereo */
+
+#define N_TUPLES_PER_BUFFER   (N_FRAMES_PER_BUFFER * N_TUPLES_PER_FRAME)
+#define N_SAMPLES_PER_BUFFER  (N_TUPLES_PER_BUFFER * N_CHANNELS_PER_TUPLE)
+
+#define N_SECONDS_TO_RECORD    10
+#define N_SAMPLES_TO_RECORD   (N_SECONDS_TO_RECORD * SAMPLING_RATE * N_CHANNELS_PER_TUPLE)
+
+#define OUTPUT_FILENAME       "output_AudioInRecord.pcm"
+
+typedef short typeSample;
+
+/* store incoming samples here, then write to file at the end */
+typeSample recordedSamples[N_SAMPLES_TO_RECORD];
+
+
+int main(int argc, char* argv[])
+{
+    AUDIOIN_H         hAudioIn;
+    AUDIOIN_INFO      AudioInInfo;
+    LHS_AUDIOIN_ERROR lhsErr;
+    unsigned int      nSamples;
+
+    printf("\nAudioTestRecord: capturing %u seconds of audio at %u Hz\n\n", N_SECONDS_TO_RECORD, SAMPLING_RATE);
+
+    memset(recordedSamples, 0, N_SAMPLES_TO_RECORD * sizeof(typeSample));
+
+    printf("Opening the AudioIn device:  ");
+    lhsErr = lhs_audioinOpen(WAVE_MAPPER, SAMPLING_RATE, &hAudioIn);
+    printf("lhs_audioinOpen()  returns %ld\n", lhsErr);
+    if (lhsErr != LHS_AUDIOIN_OK)
+    {
+        printf("ERROR: Unable to open audio device\n\n");
+        return 1;
+    }
+
+    printf("Starting the AudioIn device: ");
+    lhsErr = lhs_audioinStart(hAudioIn);
+    printf("lhs_audioinStart() returns %ld\n", lhsErr);
+    if (lhsErr != LHS_AUDIOIN_OK)
+    {
+        printf("ERROR: Unable to start audio device\n\n");
+        printf("Closing the AudioIn device: ");
+        lhsErr = lhs_audioinClose(&hAudioIn);
+        printf("lhs_audioinClose() returns %ld\n", lhsErr);
+        if (lhsErr != LHS_AUDIOIN_OK)
+        {
+            printf("ERROR: Unable to close audio device\n\n");
+            return 1;
+        }
+        return 1;
+    }
+
+    printf("... Start Speaking ...\n");
+
+    nSamples = 0;
+    while (nSamples <= N_SAMPLES_TO_RECORD - N_SAMPLES_PER_BUFFER)
+    {
+        unsigned long u32NbrOfSamples;
+
+        u32NbrOfSamples = N_SAMPLES_PER_BUFFER / N_CHANNELS_PER_TUPLE;  /* audioin only does mono */
+        lhsErr = lhs_audioinGetSamples(hAudioIn, &u32NbrOfSamples, &(recordedSamples[nSamples]), &AudioInInfo);
+        if (lhsErr == LHS_AUDIOIN_OK)
+            nSamples += u32NbrOfSamples;
+        else
+            printf("ERROR: lhs_audioinGetSamples() returns %ld\n", lhsErr);
+    }
+
+    printf("Stopping the AudioIn device: ");
+    lhsErr = lhs_audioinStop(hAudioIn);
+    printf("lhs_audioinStop()  returns %ld\n", lhsErr);
+    if (lhsErr != LHS_AUDIOIN_OK)
+    {
+        printf("ERROR: Unable to stop audio device\n\n");
+        printf("Closing the AudioIn device: ");
+        lhsErr = lhs_audioinClose(&hAudioIn);
+        printf("lhs_audioinClose() returns %ld\n", lhsErr);
+        if (lhsErr != LHS_AUDIOIN_OK)
+        {
+            printf("ERROR: Unable to close audio device\n\n");
+            return 1;
+        }
+        return 1;
+    }
+
+    printf("Closing the AudioIn device:  ");
+    lhsErr = lhs_audioinClose(&hAudioIn);
+    printf("lhs_audioinClose() returns %ld\n", lhsErr);
+    if (lhsErr != LHS_AUDIOIN_OK)
+    {
+        printf("ERROR: Unable to close audio device\n\n");
+        return 1;
+    }
+
+    /* write to file  */
+    {
+        FILE *fpOutput;
+        char *szFilename = OUTPUT_FILENAME;
+
+        fpOutput = fopen(szFilename, "wb");
+        if (fpOutput == NULL)
+        {
+            printf("ERROR: cannot create output file: '%s'\n", szFilename);
+            return 1;
+        }
+        fwrite(recordedSamples, sizeof(typeSample), nSamples, fpOutput);
+        fclose(fpOutput);
+
+        printf("\nOutput audio saved to '%s'\n\n", szFilename);
+    }
+
+
+    return 0;
+}
diff --git a/config/Android.mk b/config/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/config/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/config/en.us/Android.mk b/config/en.us/Android.mk
new file mode 100644
index 0000000..4e92ba6
--- /dev/null
+++ b/config/en.us/Android.mk
@@ -0,0 +1,83 @@
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+copy_from :=                     \
+    baseline11k.par              \
+    baseline8k.par               \
+    baseline.par                 \
+    dictionary/basic.ok          \
+    dictionary/enroll.ok         \
+    dictionary/cmu6plus.ok.zip   \
+    g2p/en-US-ttp.data           \
+    models/generic.swiarb        \
+    models/generic11.lda         \
+    models/generic11_f.swimdl    \
+    models/generic11_m.swimdl    \
+    models/generic8.lda          \
+    models/generic8_f.swimdl     \
+    models/generic8_m.swimdl     \
+
+copy_to := $(addprefix $(TARGET_OUT)/usr/srec/config/en.us/,$(copy_from))
+
+$(copy_to) : $(TARGET_OUT)/usr/srec/config/en.us/% : $(LOCAL_PATH)/% | $(ACP)
+	$(transform-prebuilt-to-target)
+
+ALL_PREBUILT += $(copy_to)
+
+
+# define paths to some grammar tools
+GRXML=$(HOST_OUT_EXECUTABLES)/grxmlcompile
+MAKE_G2G=$(HOST_OUT_EXECUTABLES)/make_g2g
+DEFAULT_PAR=$(ASR_ROOT_DIR)/config/en.us/baseline11k.par
+G2G_INSTALL_PATH=$(TARGET_OUT)/usr/srec/config/en.us/grammars
+
+srec_grammars : \
+	$(G2G_INSTALL_PATH)/enroll.g2g \
+	$(G2G_INSTALL_PATH)/bothtags5.g2g \
+	$(G2G_INSTALL_PATH)/dynamic-test.g2g \
+	$(G2G_INSTALL_PATH)/digits.g2g \
+	$(G2G_INSTALL_PATH)/boolean.g2g \
+	$(G2G_INSTALL_PATH)/homonym_test1.g2g \
+	$(G2G_INSTALL_PATH)/homonym_test2.g2g \
+	$(G2G_INSTALL_PATH)/homonym_test3.g2g \
+	$(G2G_INSTALL_PATH)/homonym_test4.g2g \
+	$(G2G_INSTALL_PATH)/ipaq_commands.g2g \
+	$(G2G_INSTALL_PATH)/lookup.g2g \
+
+ALL_PREBUILT += $(G2G_INSTALL_PATH)/VoiceDialer.g2g
+
+#---------------------------------------------------------------------------------
+# Explicit rules.
+# Those without explicit rules are subject to the rule at the end of this makefile
+#---------------------------------------------------------------------------------
+
+# This needs an explicit rule to specify the vocabulary (dictionary)
+$(G2G_INSTALL_PATH)/enroll.g2g: $(LOCAL_PATH)/grammars/enroll.grxml $(GRXML) $(MAKE_G2G) dictionary/enroll.ok
+	mkdir -p $(G2G_INSTALL_PATH)
+	$(GRXML) -par $(DEFAULT_PAR) -grxml $< -vocab dictionary/enroll.ok -outdir $(G2G_INSTALL_PATH)
+	$(MAKE_G2G) -base $(G2G_INSTALL_PATH)/enroll,addWords=0 -out $@
+	(cd $(G2G_INSTALL_PATH); rm -f $*.Grev2.det.txt $*.map $*.omap $*.P.txt $*.params $*.PCLG.txt $*.script)
+
+
+#---------------------------------------------------------------------------------
+# Those without explicit rules are subject to the rule below
+#---------------------------------------------------------------------------------
+
+$(G2G_INSTALL_PATH)/%.g2g: $(LOCAL_PATH)/grammars/%.grxml $(GRXML) $(MAKE_G2G)
+	mkdir -p $(G2G_INSTALL_PATH)
+	$(GRXML) -par $(DEFAULT_PAR) -grxml $< -outdir $(G2G_INSTALL_PATH)
+	$(MAKE_G2G) -base $(G2G_INSTALL_PATH)/$*,addWords=0 -out $@
+	(cd $(G2G_INSTALL_PATH); rm -f $*.Grev2.det.txt $*.map $*.omap $*.P.txt $*.params $*.PCLG.txt $*.script)
+
+
+#-----------------------------------------------------------------
+# build cmu2nuance dictionary conversion program, to prevent bitrot
+#-----------------------------------------------------------------
+
+LOCAL_SRC_FILES:= dictionary/cmu2nuance.cpp
+
+LOCAL_MODULE:= cmu2nuance
+
+include $(BUILD_HOST_EXECUTABLE)
+
diff --git a/config/en.us/adb_pull_system_usr_srec_bothtags5.sh b/config/en.us/adb_pull_system_usr_srec_bothtags5.sh
new file mode 100755
index 0000000..09e1671
--- /dev/null
+++ b/config/en.us/adb_pull_system_usr_srec_bothtags5.sh
@@ -0,0 +1,12 @@
+# Run this from Ubuntu to copy files from device
+
+export TESTDIR=/system/usr/srec
+
+adb pull $TESTDIR/config/en.us/out_SHIP_bothtags5.txt out_SHIP_bothtags5.txt
+adb pull $TESTDIR/config/en.us/recog4_SHIP_bothtags5.res recog4_SHIP_bothtags5.res
+
+adb pull $TESTDIR/config/en.us/linux_ship_a1__VCE_Pete_Gonzalez.raw  linux_ship_a1__VCE_Pete_Gonzalez.raw
+adb pull $TESTDIR/config/en.us/linux_ship_a2__VCE_Andrew_Evans.raw   linux_ship_a2__VCE_Andrew_Evans.raw
+adb pull $TESTDIR/config/en.us/linux_ship_a3__VCE_Peter_Wilson.raw   linux_ship_a3__VCE_Peter_Wilson.raw
+adb pull $TESTDIR/config/en.us/linux_ship_a4__VCE_Edgar_Young.raw    linux_ship_a4__VCE_Edgar_Young.raw
+adb pull $TESTDIR/config/en.us/linux_ship_a5__VCE_John_Martinez.raw  linux_ship_a5__VCE_John_Martinez.raw
diff --git a/config/en.us/adb_pull_system_usr_srec_bothtags5_from_saved.sh b/config/en.us/adb_pull_system_usr_srec_bothtags5_from_saved.sh
new file mode 100755
index 0000000..62d4efb
--- /dev/null
+++ b/config/en.us/adb_pull_system_usr_srec_bothtags5_from_saved.sh
@@ -0,0 +1,15 @@
+# Run this from Ubuntu to copy files from device
+
+export TESTDIR=/system/usr/srec
+
+adb pull $TESTDIR/config/en.us/out_SHIP_bothtags5_from_saved.txt out_SHIP_bothtags5_from_saved.txt
+adb pull $TESTDIR/config/en.us/recog4_SHIP_bothtags5_from_saved.res recog4_SHIP_bothtags5_from_saved.res
+
+adb pull $TESTDIR/config/en.us/linux_ship_a1__VCE_Pete_Gonzalez_from_saved.raw  linux_ship_a1__VCE_Pete_Gonzalez_from_saved.raw
+adb pull $TESTDIR/config/en.us/linux_ship_a2__VCE_Andrew_Evans_from_saved.raw   linux_ship_a2__VCE_Andrew_Evans_from_saved.raw
+adb pull $TESTDIR/config/en.us/linux_ship_a3__VCE_Peter_Wilson_from_saved.raw   linux_ship_a3__VCE_Peter_Wilson_from_saved.raw
+adb pull $TESTDIR/config/en.us/linux_ship_a4__VCE_Edgar_Young_from_saved.raw    linux_ship_a4__VCE_Edgar_Young_from_saved.raw
+adb pull $TESTDIR/config/en.us/linux_ship_a5__VCE_John_Martinez_from_saved.raw  linux_ship_a5__VCE_John_Martinez_from_saved.raw
+
+adb pull $TESTDIR/config/en.us/bothtags5_saved.g2g bothtags5_saved.g2g
+
diff --git a/config/en.us/adb_pull_system_usr_srec_change_sample_rate2.sh b/config/en.us/adb_pull_system_usr_srec_change_sample_rate2.sh
new file mode 100755
index 0000000..4790620
--- /dev/null
+++ b/config/en.us/adb_pull_system_usr_srec_change_sample_rate2.sh
@@ -0,0 +1,6 @@
+# Run this from Ubuntu to copy files from device
+
+export TESTDIR=/system/usr/srec
+
+adb pull $TESTDIR/config/en.us/out_SHIP_change_sample_rate2.txt out_SHIP_change_sample_rate2.txt
+adb pull $TESTDIR/config/en.us/recog4_SHIP_change_sample_rate2.res recog4_SHIP_change_sample_rate2.res
diff --git a/config/en.us/adb_pull_system_usr_srec_liveaudio.sh b/config/en.us/adb_pull_system_usr_srec_liveaudio.sh
new file mode 100755
index 0000000..791833b
--- /dev/null
+++ b/config/en.us/adb_pull_system_usr_srec_liveaudio.sh
@@ -0,0 +1,5 @@
+# Run this from Ubuntu to copy files from device
+
+export TESTDIR=/system/usr/srec
+
+adb pull $TESTDIR/config/en.us/recog4_SHIP_liveaudio.res recog4_SHIP_liveaudio.res
diff --git a/config/en.us/adb_pull_system_usr_srec_set_get_param.sh b/config/en.us/adb_pull_system_usr_srec_set_get_param.sh
new file mode 100755
index 0000000..eb6b6a2
--- /dev/null
+++ b/config/en.us/adb_pull_system_usr_srec_set_get_param.sh
@@ -0,0 +1,6 @@
+# Run this from Ubuntu to copy files from device
+
+export TESTDIR=/system/usr/srec
+
+adb pull $TESTDIR/config/en.us/out_SHIP_set_get_param.txt out_SHIP_set_get_param.txt
+adb pull $TESTDIR/config/en.us/recog4_SHIP_set_get_param.res recog4_SHIP_set_get_param.res
diff --git a/config/en.us/audio/m252/m252a10e.nwv b/config/en.us/audio/m252/m252a10e.nwv
new file mode 100644
index 0000000..4d6caf4
--- /dev/null
+++ b/config/en.us/audio/m252/m252a10e.nwv
Binary files differ
diff --git a/config/en.us/audio/m252/m252a11e.nwv b/config/en.us/audio/m252/m252a11e.nwv
new file mode 100644
index 0000000..2e5ca0e
--- /dev/null
+++ b/config/en.us/audio/m252/m252a11e.nwv
Binary files differ
diff --git a/config/en.us/audio/m252/m252a12e.nwv b/config/en.us/audio/m252/m252a12e.nwv
new file mode 100644
index 0000000..d79721a
--- /dev/null
+++ b/config/en.us/audio/m252/m252a12e.nwv
Binary files differ
diff --git a/config/en.us/audio/m252/m252a21e.nwv b/config/en.us/audio/m252/m252a21e.nwv
new file mode 100644
index 0000000..7708410
--- /dev/null
+++ b/config/en.us/audio/m252/m252a21e.nwv
Binary files differ
diff --git a/config/en.us/audio/m252/m252a22e.nwv b/config/en.us/audio/m252/m252a22e.nwv
new file mode 100644
index 0000000..ec612e5
--- /dev/null
+++ b/config/en.us/audio/m252/m252a22e.nwv
Binary files differ
diff --git a/config/en.us/audio/m252/m252a24e.nwv b/config/en.us/audio/m252/m252a24e.nwv
new file mode 100644
index 0000000..24dffcb
--- /dev/null
+++ b/config/en.us/audio/m252/m252a24e.nwv
Binary files differ
diff --git a/config/en.us/audio/m252/m252a3fe.nwv b/config/en.us/audio/m252/m252a3fe.nwv
new file mode 100644
index 0000000..2a83778
--- /dev/null
+++ b/config/en.us/audio/m252/m252a3fe.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_007.nwv b/config/en.us/audio/v139/v139_007.nwv
new file mode 100644
index 0000000..7832856
--- /dev/null
+++ b/config/en.us/audio/v139/v139_007.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_021.nwv b/config/en.us/audio/v139/v139_021.nwv
new file mode 100644
index 0000000..492e055
--- /dev/null
+++ b/config/en.us/audio/v139/v139_021.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_024.nwv b/config/en.us/audio/v139/v139_024.nwv
new file mode 100644
index 0000000..0f6bd90
--- /dev/null
+++ b/config/en.us/audio/v139/v139_024.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_040.nwv b/config/en.us/audio/v139/v139_040.nwv
new file mode 100644
index 0000000..1e81410
--- /dev/null
+++ b/config/en.us/audio/v139/v139_040.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_067.nwv b/config/en.us/audio/v139/v139_067.nwv
new file mode 100644
index 0000000..cdd1331
--- /dev/null
+++ b/config/en.us/audio/v139/v139_067.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_077.nwv b/config/en.us/audio/v139/v139_077.nwv
new file mode 100644
index 0000000..e9206a5
--- /dev/null
+++ b/config/en.us/audio/v139/v139_077.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_103.nwv b/config/en.us/audio/v139/v139_103.nwv
new file mode 100644
index 0000000..49578f2
--- /dev/null
+++ b/config/en.us/audio/v139/v139_103.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_107.nwv b/config/en.us/audio/v139/v139_107.nwv
new file mode 100644
index 0000000..2daf6fd
--- /dev/null
+++ b/config/en.us/audio/v139/v139_107.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_113.nwv b/config/en.us/audio/v139/v139_113.nwv
new file mode 100644
index 0000000..9338400
--- /dev/null
+++ b/config/en.us/audio/v139/v139_113.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_127.nwv b/config/en.us/audio/v139/v139_127.nwv
new file mode 100644
index 0000000..d14712e
--- /dev/null
+++ b/config/en.us/audio/v139/v139_127.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_189.nwv b/config/en.us/audio/v139/v139_189.nwv
new file mode 100644
index 0000000..fc26247
--- /dev/null
+++ b/config/en.us/audio/v139/v139_189.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_202.nwv b/config/en.us/audio/v139/v139_202.nwv
new file mode 100644
index 0000000..2210598
--- /dev/null
+++ b/config/en.us/audio/v139/v139_202.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_206.nwv b/config/en.us/audio/v139/v139_206.nwv
new file mode 100644
index 0000000..932669d
--- /dev/null
+++ b/config/en.us/audio/v139/v139_206.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_248.nwv b/config/en.us/audio/v139/v139_248.nwv
new file mode 100644
index 0000000..33393a2
--- /dev/null
+++ b/config/en.us/audio/v139/v139_248.nwv
Binary files differ
diff --git a/config/en.us/audio/v139/v139_254.nwv b/config/en.us/audio/v139/v139_254.nwv
new file mode 100644
index 0000000..70b9901
--- /dev/null
+++ b/config/en.us/audio/v139/v139_254.nwv
Binary files differ
diff --git a/config/en.us/baseline.par b/config/en.us/baseline.par
new file mode 100644
index 0000000..362efc6
--- /dev/null
+++ b/config/en.us/baseline.par
@@ -0,0 +1,116 @@
+# this is the telematics grammar test, grammar is fixed
+# default models
+cmdline.modelfiles       = models/generic_f.swimdl models/generic_m.swimdl
+cmdline.arbfile	     = models/generic.swiarb
+cmdline.tcp          = CMDLINE.TCPFILE
+cmdline.lda		= models/generic11.lda
+#
+cmdline.modelfiles11       = models/generic11_f.swimdl models/generic11_m.swimdl
+cmdline.modelfiles8       = models/generic8_f.swimdl models/generic8_m.swimdl
+cmdline.lda11		= models/generic11.lda
+cmdline.lda8		= models/generic8.lda
+#
+cmdline.vocabulary	= dictionary/large.ok
+#
+cmdline.datapath     = \\silicon2\D\\visteon_en_us\\train\\wave
+cmdline.results	     = recog4.res;
+cmdline.use_image	= 2;
+cmdline.detail_res	 = YES;
+cmdline.bgsniff      = 25;
+
+# beginning of speech detection stuff
+cmdline.bgsniff_min     = 4;
+cmdline.silence_duration_in_frames = 100;
+cmdline.end_of_utterance_hold_off_in_frames = 30;
+# 1 means yes do start-pointing
+cmdline.gatedmode    = 1;
+
+cmdline.DataCaptureDirectory = logs
+# OSI Log levels (bit set indicates level is ON)
+# 0 no logging
+# BIT 0 -> BASIC logging
+# BIT 1 -> AUDIO waveform logging
+# BIT 2 -> ADD WORD logging
+# e.g. value is 3 = BASIC+AUDIO logging, no ADDWORD
+SREC.Recognizer.osi_log_level = 0
+SREC.Recognizer.utterance_timeout = 400
+
+CREC.ParVersion         	= 1.0 ;
+CREC.useCREClogger = 1;
+
+CREC.Acoustic.dimen     	= 36 ;
+CREC.Acoustic.skip      	= 5 ;
+CREC.Acoustic.stay      	= 5 ;
+CREC.Acoustic.durscale  	= 5 ;
+CREC.Acoustic.minvar    	= 2860 ;
+CREC.Acoustic.maxvar    	= 2860 ;
+CREC.Acoustic.frame_period = 20 ;
+CREC.Acoustic.load_models	= non_generic;
+
+CREC.Frontend.mel_dim             = 12 ;
+CREC.Frontend.samplerate          = 11025 ;
+CREC.Frontend.premel              = 0.9 ;
+CREC.Frontend.lowcut              = 125 ;
+CREC.Frontend.highcut             = 5500 ;
+CREC.Frontend.window_factor       = 2 ;
+CREC.Frontend.offset		  = 0 ;
+CREC.Frontend.ddmel               = YES ;
+CREC.Frontend.peakdecayup         = 0.3 ;
+CREC.Frontend.peakdecaydown       = 0.7 ;
+CREC.Frontend.do_skip_even_frames = YES ;
+CREC.Frontend.melA 	= 14 45 60 70 95 115 115 135 135 155 160 180 ;
+CREC.Frontend.melB	= 42 110 105 110 140 140 150 120 150 130 140 130 ;
+CREC.Frontend.dmelA	= 50 150 290 320 400 500 500 600 600 700 720 750 ;
+CREC.Frontend.dmelB	= 127 127 127 127 127 127 127 127 127 127 127 127 ;
+CREC.Frontend.ddmelA 	= 4 12 22 27 32 35 35 45 45 55 57 62 ;
+CREC.Frontend.ddmelB	= 127 127 127 127 127 127 127 127 127 127 127 127 ;
+CREC.Frontend.speech_detect	  = 14 ;
+CREC.Frontend.ambient_within	  = 7 ;
+CREC.Frontend.speech_above	  = 18 ;
+CREC.Frontend.start_windback      = 50 ;
+CREC.Frontend.utterance_allowance = 40 ;
+
+CREC.Frontend.swicms.forget_factor = 400 ;
+CREC.Frontend.swicms.sbindex       = 100 ;
+
+CREC.Pattern.dimen              = 28 ;
+CREC.Pattern.mix_score_scale    =  0.46 ;
+CREC.Pattern.imelda_scale	= 14 ;
+
+CREC.Recognizer.max_frames = 1000;
+CREC.Recognizer.eou_threshold     = 120 ;
+CREC.Recognizer.terminal_timeout  = 30 ;
+CREC.Recognizer.optional_terminal_timeout = 45 ;
+CREC.Recognizer.non_terminal_timeout     = 90 ;
+
+# no endpointing!!
+CREC.silenceDurationInFrames 	  = 200;
+
+CREC.Recognizer.max_fsm_arcs           = 25000;
+CREC.Recognizer.max_fsm_nodes          = 14500;
+
+CREC.Recognizer.max_hmm_tokens         = 400
+CREC.Recognizer.max_word_tokens        = 2000;
+CREC.Recognizer.max_altword_tokens     = 400;
+CREC.Recognizer.max_fsmnode_tokens     = 400
+CREC.Recognizer.viterbi_prune_thresh   = 400
+CREC.Recognizer.num_wordends_per_frame = 10
+CREC.Recognizer.max_model_states       = 3600
+## C:/users/dahan/esr/baseline/bin/srectestD.exe -parfile ./expr_large.par -grammar recog_nm/namesnnumsSC_dyn,addWords=1000 
+
+SREC.Confidence.sigmoid_param.gdiff.one_nbest    =  0.003    -3.15  0.05
+SREC.Confidence.sigmoid_param.gdiff.many_nbest   =  0.001    -2.21  0.2105
+SREC.Confidence.sigmoid_param.sd.one_nbest       =  0.0       0.0   0.0
+SREC.Confidence.sigmoid_param.sd.many_nbest      = -0.0161    0.9   0.0526
+SREC.Confidence.sigmoid_param.sd13.one_nbest     =  0.0       0.0   0.0 
+SREC.Confidence.sigmoid_param.sd13.many_nbest    = -0.0141    1.5   0.0526
+SREC.Confidence.sigmoid_param.spf.one_nbest      = -0.002     0.4   0.05
+SREC.Confidence.sigmoid_param.spf.many_nbest     =  0.02     -8.63  0.3157
+SREC.Confidence.sigmoid_param.abs.one_nbest      =  0.0001   -4.5   0.05
+SREC.Confidence.sigmoid_param.abs.many_nbest     =  0.000031 -1.67  0.0526
+SREC.Confidence.sigmoid_param.gdiffpf.one_nbest  =  0.33     -5.5   0.85
+SREC.Confidence.sigmoid_param.gdiffpf.many_nbest =  0.24     -3.59  0.3157
+
+# for G2P module
+G2P.Available   = YES
+G2P.Data        = g2p/en-US-ttp.data
diff --git a/config/en.us/baseline11k.par b/config/en.us/baseline11k.par
new file mode 100644
index 0000000..c580885
--- /dev/null
+++ b/config/en.us/baseline11k.par
@@ -0,0 +1,123 @@
+# this is the telematics grammar test, grammar is fixed
+# default models
+cmdline.modelfiles	     = models/generic11_f.swimdl models/generic11_m.swimdl
+cmdline.arbfile	     = models/generic.swiarb
+cmdline.tcp          = CMDLINE.TCPFILE
+cmdline.lda		= models/generic11.lda
+#
+cmdline.modelfiles11       = models/generic11_f.swimdl models/generic11_m.swimdl
+cmdline.modelfiles8       = models/generic8_f.swimdl models/generic8_m.swimdl
+cmdline.lda11		= models/generic11.lda
+cmdline.lda8		= models/generic8.lda
+#
+cmdline.vocabulary	= dictionary/cmu6plus.ok.zip
+#cmdline.vocabulary	= dictionary/large.ok
+#
+cmdline.datapath     = \\silicon2\D\\visteon_en_us\\train\\wave
+cmdline.results	     = recog4.res;
+cmdline.use_image	= 2;
+cmdline.detail_res	 = YES;
+cmdline.bgsniff      = 25;
+
+# beginning of speech detection stuff
+cmdline.bgsniff_min     = 4;
+# 1 means yes do start-pointing
+cmdline.gatedmode    = 1;
+
+# level-based end of speech detection stuff
+cmdline.silence_duration_in_frames = 100;
+cmdline.end_of_utterance_hold_off_in_frames = 30;
+
+# logging
+cmdline.DataCaptureDirectory = logs
+# OSI Log levels (bit set indicates level is ON)
+# 0 no logging
+# BIT 0 -> BASIC logging
+# BIT 1 -> AUDIO waveform logging
+# BIT 2 -> ADD WORD logging
+# e.g. value is 3 = BASIC+AUDIO logging, no ADDWORD
+SREC.Recognizer.osi_log_level = 0
+SREC.Recognizer.utterance_timeout = 400
+
+CREC.ParVersion         	= 1.0 ;
+CREC.useCREClogger = 1;
+
+CREC.Acoustic.dimen     	= 36 ;
+CREC.Acoustic.skip      	= 5 ;
+CREC.Acoustic.stay      	= 5 ;
+CREC.Acoustic.durscale  	= 5 ;
+CREC.Acoustic.minvar    	= 2860 ;
+CREC.Acoustic.maxvar    	= 2860 ;
+CREC.Acoustic.frame_period = 20 ;
+CREC.Acoustic.load_models	= non_generic;
+
+CREC.Frontend.mel_dim             = 12 ;
+CREC.Frontend.samplerate          = 11025 ;
+CREC.Frontend.premel              = 0.9 ;
+CREC.Frontend.lowcut              = 125 ;
+CREC.Frontend.highcut             = 5500 ;
+CREC.Frontend.window_factor       = 2 ;
+CREC.Frontend.offset		  = 0 ;
+CREC.Frontend.ddmel               = YES ;
+CREC.Frontend.peakdecayup         = 0.3 ;
+CREC.Frontend.peakdecaydown       = 0.7 ;
+CREC.Frontend.do_skip_even_frames = YES ;
+CREC.Frontend.melA 	= 14 45 60 70 95 115 115 135 135 155 160 180 ;
+CREC.Frontend.melB	= 42 110 105 110 140 140 150 120 150 130 140 130 ;
+CREC.Frontend.dmelA	= 50 150 290 320 400 500 500 600 600 700 720 750 ;
+CREC.Frontend.dmelB	= 127 127 127 127 127 127 127 127 127 127 127 127 ;
+CREC.Frontend.ddmelA 	= 4 12 22 27 32 35 35 45 45 55 57 62 ;
+CREC.Frontend.ddmelB	= 127 127 127 127 127 127 127 127 127 127 127 127 ;
+# BOS detection
+CREC.Frontend.speech_detect	  = 14 ;
+CREC.Frontend.ambient_within	  = 7 ;
+CREC.Frontend.speech_above	  = 18 ;
+CREC.Frontend.start_windback      = 50 ;
+CREC.Frontend.utterance_allowance = 40 ;
+
+CREC.Frontend.swicms.forget_factor = 400 ;
+CREC.Frontend.swicms.sbindex       = 100 ;
+CREC.Frontend.swicms.inutt.forget_factor2 = 40 ;
+CREC.Frontend.swicms.inutt.disable_after = 200;
+CREC.Frontend.swicms.inutt.enable_after = 10;
+
+CREC.Pattern.dimen              = 28 ;
+CREC.Pattern.mix_score_scale    =  0.46 ;
+CREC.Pattern.imelda_scale	= 14 ;
+
+# grammar based EOS detection params
+CREC.Recognizer.max_frames = 1000;
+CREC.Recognizer.eou_threshold     = 120 ;
+CREC.Recognizer.terminal_timeout  = 30 ;
+CREC.Recognizer.optional_terminal_timeout = 45 ;
+CREC.Recognizer.non_terminal_timeout     = 90 ;
+
+# for the recognition search
+CREC.Recognizer.max_fsm_arcs           = 25000;
+CREC.Recognizer.max_fsm_nodes          = 14500;
+
+CREC.Recognizer.max_hmm_tokens         = 400
+CREC.Recognizer.max_word_tokens        = 2000;
+CREC.Recognizer.max_altword_tokens     = 400;
+CREC.Recognizer.max_fsmnode_tokens     = 400
+CREC.Recognizer.viterbi_prune_thresh   = 400
+CREC.Recognizer.num_wordends_per_frame = 10
+CREC.Recognizer.max_model_states       = 3600
+## C:/users/dahan/esr/baseline/bin/srectestD.exe -parfile ./expr_large.par -grammar recog_nm/namesnnumsSC_dyn,addWords=1000 
+
+SREC.Confidence.sigmoid_param.gdiff.one_nbest    =  0.003    -3.15  0.05
+SREC.Confidence.sigmoid_param.gdiff.many_nbest   =  0.001    -2.21  0.2105
+SREC.Confidence.sigmoid_param.sd.one_nbest       =  0.0       0.0   0.0
+SREC.Confidence.sigmoid_param.sd.many_nbest      = -0.0161    0.9   0.0526
+SREC.Confidence.sigmoid_param.sd13.one_nbest     =  0.0       0.0   0.0 
+SREC.Confidence.sigmoid_param.sd13.many_nbest    = -0.0141    1.5   0.0526
+SREC.Confidence.sigmoid_param.spf.one_nbest      = -0.002     0.4   0.05
+SREC.Confidence.sigmoid_param.spf.many_nbest     =  0.02     -8.63  0.3157
+SREC.Confidence.sigmoid_param.abs.one_nbest      =  0.0001   -4.5   0.05
+SREC.Confidence.sigmoid_param.abs.many_nbest     =  0.000031 -1.67  0.0526
+SREC.Confidence.sigmoid_param.gdiffpf.one_nbest  =  0.33     -5.5   0.85
+SREC.Confidence.sigmoid_param.gdiffpf.many_nbest =  0.24     -3.59  0.3157
+
+# for G2P module
+G2P.Available   = YES
+G2P.Data        = g2p/en-US-ttp.data
diff --git a/config/en.us/baseline8k.par b/config/en.us/baseline8k.par
new file mode 100644
index 0000000..69d6ea8
--- /dev/null
+++ b/config/en.us/baseline8k.par
@@ -0,0 +1,125 @@
+# this is the telematics grammar test, grammar is fixed
+# default models
+cmdline.modelfiles	     = models/generic8_f.swimdl models/generic8_m.swimdl
+cmdline.arbfile	     = models/generic.swiarb
+cmdline.tcp          = CMDLINE.TCPFILE
+cmdline.lda		= models/generic8.lda
+#
+cmdline.modelfiles11       = models/generic11_f.swimdl models/generic11_m.swimdl
+cmdline.modelfiles8       = models/generic8_f.swimdl models/generic8_m.swimdl
+cmdline.lda11		= models/generic11.lda
+cmdline.lda8		= models/generic8.lda
+#
+cmdline.vocabulary	= dictionary/cmu6plus.ok.zip
+#cmdline.vocabulary	= dictionary/large.ok
+#
+cmdline.datapath     = \\silicon2\D\\visteon_en_us\\train\\wave
+cmdline.results	     = recog4.res;
+cmdline.use_image	= 2;
+cmdline.detail_res	 = YES;
+cmdline.bgsniff      = 25;
+
+# beginning of speech detection stuff
+cmdline.bgsniff_min     = 4;
+# 1 means yes do start-pointing
+cmdline.gatedmode    = 1;
+
+# level-based end of speech detection stuff
+cmdline.silence_duration_in_frames = 100;
+cmdline.end_of_utterance_hold_off_in_frames = 30;
+
+# logging
+cmdline.DataCaptureDirectory = logs
+
+# OSI Log levels (bit set indicates level is ON)
+# 0 no logging
+# BIT 0 -> BASIC logging
+# BIT 1 -> AUDIO waveform logging
+# BIT 2 -> ADD WORD logging
+# e.g. value is 3 = BASIC+AUDIO logging, no ADDWORD
+#
+SREC.Recognizer.osi_log_level = 0
+SREC.Recognizer.utterance_timeout = 400
+
+CREC.ParVersion         	= 1.0 ;
+CREC.useCREClogger = 1;
+
+CREC.Acoustic.dimen     	= 36 ;
+CREC.Acoustic.skip      	= 5 ;
+CREC.Acoustic.stay      	= 5 ;
+CREC.Acoustic.durscale  	= 5 ;
+CREC.Acoustic.minvar    	= 2860 ;
+CREC.Acoustic.maxvar    	= 2860 ;
+CREC.Acoustic.frame_period = 20 ;
+CREC.Acoustic.load_models	= non_generic;
+
+CREC.Frontend.mel_dim             = 12 ;
+CREC.Frontend.samplerate          = 8000 ;
+CREC.Frontend.premel              = 0.9 ;
+CREC.Frontend.lowcut              = 125 ;
+CREC.Frontend.highcut             = 4000 ;
+CREC.Frontend.window_factor       = 2 ;
+CREC.Frontend.offset		  = 0 ;
+CREC.Frontend.ddmel               = YES ;
+CREC.Frontend.peakdecayup         = 0.3 ;
+CREC.Frontend.peakdecaydown       = 0.7 ;
+CREC.Frontend.do_skip_even_frames = YES ;
+CREC.Frontend.melA 	= 14 45 60 70 95 115 115 135 135 155 160 180 ;
+CREC.Frontend.melB	= 42 110 105 110 140 140 150 120 150 130 140 130 ;
+CREC.Frontend.dmelA	= 50 150 290 320 400 500 500 600 600 700 720 750 ;
+CREC.Frontend.dmelB	= 127 127 127 127 127 127 127 127 127 127 127 127 ;
+CREC.Frontend.ddmelA 	= 4 12 22 27 32 35 35 45 45 55 57 62 ;
+CREC.Frontend.ddmelB	= 127 127 127 127 127 127 127 127 127 127 127 127 ;
+# BOS detection
+CREC.Frontend.speech_detect	  = 14 ;
+CREC.Frontend.ambient_within	  = 7 ;
+CREC.Frontend.speech_above	  = 18 ;
+CREC.Frontend.start_windback      = 50 ;
+CREC.Frontend.utterance_allowance = 40 ;
+
+CREC.Frontend.swicms.forget_factor = 400 ;
+CREC.Frontend.swicms.sbindex       = 100 ;
+CREC.Frontend.swicms.inutt.forget_factor2 = 40 ;
+CREC.Frontend.swicms.inutt.disable_after = 200;
+CREC.Frontend.swicms.inutt.enable_after = 10;
+
+CREC.Pattern.dimen              = 28 ;
+CREC.Pattern.mix_score_scale    =  0.46 ;
+CREC.Pattern.imelda_scale	= 14 ;
+
+# grammar based EOS detection params
+CREC.Recognizer.max_frames = 1000;
+CREC.Recognizer.eou_threshold     = 120 ;
+CREC.Recognizer.terminal_timeout  = 30 ;
+CREC.Recognizer.optional_terminal_timeout = 45 ;
+CREC.Recognizer.non_terminal_timeout     = 90 ;
+
+# for the recognition search
+CREC.Recognizer.max_fsm_arcs           = 25000;
+CREC.Recognizer.max_fsm_nodes          = 14500;
+
+CREC.Recognizer.max_hmm_tokens         = 400
+CREC.Recognizer.max_word_tokens        = 2000;
+CREC.Recognizer.max_altword_tokens     = 400;
+CREC.Recognizer.max_fsmnode_tokens     = 400
+CREC.Recognizer.viterbi_prune_thresh   = 400
+CREC.Recognizer.num_wordends_per_frame = 10
+CREC.Recognizer.max_model_states       = 3600
+## C:/users/dahan/esr/baseline/bin/srectestD.exe -parfile ./expr_large.par -grammar recog_nm/namesnnumsSC_dyn,addWords=1000 
+
+SREC.Confidence.sigmoid_param.gdiff.one_nbest    =  0.003    -3.15  0.05
+SREC.Confidence.sigmoid_param.gdiff.many_nbest   =  0.001    -2.21  0.2105
+SREC.Confidence.sigmoid_param.sd.one_nbest       =  0.0       0.0   0.0
+SREC.Confidence.sigmoid_param.sd.many_nbest      = -0.0161    0.9   0.0526
+SREC.Confidence.sigmoid_param.sd13.one_nbest     =  0.0       0.0   0.0 
+SREC.Confidence.sigmoid_param.sd13.many_nbest    = -0.0141    1.5   0.0526
+SREC.Confidence.sigmoid_param.spf.one_nbest      = -0.002     0.4   0.05
+SREC.Confidence.sigmoid_param.spf.many_nbest     =  0.02     -8.63  0.3157
+SREC.Confidence.sigmoid_param.abs.one_nbest      =  0.0001   -4.5   0.05
+SREC.Confidence.sigmoid_param.abs.many_nbest     =  0.000031 -1.67  0.0526
+SREC.Confidence.sigmoid_param.gdiffpf.one_nbest  =  0.33     -5.5   0.85
+SREC.Confidence.sigmoid_param.gdiffpf.many_nbest =  0.24     -3.59  0.3157
+
+# for G2P module
+G2P.Available   = YES
+G2P.Data        = g2p/en-US-ttp.data
diff --git a/config/en.us/dictionary/basic.ok b/config/en.us/dictionary/basic.ok
new file mode 100644
index 0000000..fee9947
--- /dev/null
+++ b/config/en.us/dictionary/basic.ok
@@ -0,0 +1,30 @@
+#LANG=EN-US
+-pau- #
+-pau2- #
+0 =Y07
+1 5F|
+2 2K
+3 B0Y
+4 RX0
+5 R>3
+6 1.\1
+7 1x3M
+8 H2
+9 +>|
+dial dIL
+eight H2
+fahrenheit far~hIt
+five R>3
+four RX0
+nine +>|
+oh 4
+###oh 7
+one 5F|
+phone fOn
+read rEd
+read red
+seven 1x3M
+six 1.\1
+three B0Y
+two 2K
+zero =Y07
diff --git a/config/en.us/dictionary/c0.6.ok b/config/en.us/dictionary/c0.6.ok
new file mode 100644
index 0000000..34eede9
--- /dev/null
+++ b/config/en.us/dictionary/c0.6.ok
@@ -0,0 +1,127046 @@
+#LANG=EN-US
+-pau- #
+-pau2- #
+0 =Y07
+00 hundr6d
+1 5F|
+10 2x|
+100 uhundr6d
+100 wunhundr6d
+1000 wunT?z~d
+11 6lev~
+12 twelv
+13 BW2Y|
+14 RX02Y|
+15 R.R2Y|
+16 1.\12Y|
+17 1x3M2Y|
+18 H2Y|
+19 +>|2Y|
+2 2K
+20 25x|2[
+20 25x|[
+3 B0Y
+30 BW2[
+4 RX0
+40 RX02[
+5 R>3
+50 R.R2[
+6 1.\1
+60 1.\12[
+7 1x3M
+70 1x3M2[
+70 1x3M[
+8 H2
+80 H2[
+9 +>|
+90 +>|2[
+90 +>|[
+a @
+a A
+a's Az
+a. A
+a.'s Az
+a.s Az
+a42128 Af{rtUwuntUAt
+aaa trip@lA
+aaberg obPg
+aachen ok~
+aaker okP
+aalseth olscT
+aamodt om@t
+aancor onk{r
+aardema ordem@
+aardvark )rdvork
+aaron ,r~
+aaron's ,r~z
+aarons ,r~z
+aaronson )r~s~
+aaronson ,r~s~
+aaronson's )r~s~z
+aaronson's ,r~s~z
+aarti )rtE
+aase os
+aasen os~
+ab AbE
+ab ab
+ababa @bob@
+ababa ob@b@
+abacha ab@k@
+aback @bak
+abaco ab@kO
+abacus ab@k@s
+abad @bod
+abadaka @bad@k@
+abadi @bad/
+abadie @bad/
+abair @b,r
+abalkin @bolk~
+abalone ab@lOn/
+abalos obol]z
+abandon @band~
+abandoned @band~d
+abandoning @band~6N
+abandonment @band~m~t
+abandonments @band~m~ts
+abandons @band~z
+abanto @bant]
+abarca @b)rk@
+abare ob)r/
+abascal ab@sk@l
+abash @baS
+abashed @baSt
+abate @bAt
+abated @bAt@d
+abatement @bAtm~t
+abatements @bAtm~ts
+abates @bAts
+abating @bAt6N
+abba ab@
+abbado @bod]
+abbas @bos
+abbasi obos/
+abbate obAt
+abbatiello obot/el]
+abbe ab/
+abbe abA
+abbenhaus ab~h?s
+abbett @bet
+abbeville abvil
+abbey ab/
+abbey's ab/z
+abbie ab/
+abbitt ab@t
+abbot ab@t
+abbott ab@t
+abbott's ab@ts
+abboud @b?d
+abboud @bUd
+abbreviate @brEv/At
+abbreviated @brEv/At@d
+abbreviates @brEv/Ats
+abbreviating @brEv/At6N
+abbreviation @brEv/AS~
+abbreviations @brEv/AS~z
+abbruzzese obrUtsAz/
+abbs abz
+abby ab/
+abco abk]
+abcotek abk]tek
+abdalla abdal@
+abdallah abdal@
+abdel abdel
+abdella abdel@
+abdicate abd@kAt
+abdicated abd@kAt@d
+abdicates abd@kAts
+abdicating abd6kAt6N
+abdication abd6kAS~
+abdnor abdnP
+abdo abd]
+abdollah abdol@
+abdomen abdOm~
+abdomen abd}~
+abdominal @bdom~@l
+abdominal abdom~@l
+abduct abdukt
+abducted @bdukt@d
+abducted abdukt@d
+abductee abduktE
+abductees abduktEz
+abducting @bdukt6N
+abducting abdukt6N
+abduction @bdukS~
+abduction abdukS~
+abductions @bdukS~z
+abductions abdukS~z
+abductor @bduktP
+abductor abduktP
+abductors @bduktPz
+abductors abduktPz
+abducts abdukts
+abdul abdUl
+abdulaziz abdUl@zEz
+abdulla obdUl@
+abdullah abdul@
+abe Ab
+abed @bed
+abedi @bed/
+abee @bE
+abel Ab@l
+abela obel@
+abelard ab@lPd
+abele @bEl
+abeles @bElz
+abeles Ab@lEz
+abell Ab@l
+abella @bel@
+abeln abcln
+abelow ab@l]
+abels Ab@lz
+abelson ab@ls~
+abend @bend
+abend abcnd
+abendroth ab~dr{T
+aber AbP
+abercrombie abPkromb/
+aberdeen abPdEn
+aberford AbPfPd
+aberg abPg
+aberle abP@l
+abermin abPmin
+abernathy abPnaT/
+abernethy abPneT/
+aberrant ab,r~t
+aberration abPAS~
+aberrational abPAS~@l
+aberrations abPAS~z
+abert abPt
+abet @bet
+abetted @bet@d
+abetting @bet6N
+abex Abcks
+abeyance @bA~s
+abeyta obAt@
+abhor abh{r
+abhorred @bh{rd
+abhorrence @bh{r~s
+abhorrent abh{r~t
+abhors @bh{rz
+abid Ab@d
+abide @bId
+abided @bId@d
+abides @bIdz
+abiding @bId6N
+abie ab/
+abigail ab@gAl
+abila obEl@
+abilene ab@lEn
+abilities @bil@t/z
+ability @bil@t/
+abington ab6Nt~
+abio ob/]
+abiola ob/Ol@
+abiola's ob/Ol@z
+abiomed AbE}cd
+abitibi ab@tEb/
+abitz abits
+abject abjckt
+abkhazia abkhazy@
+abkhazia abkhozy@
+abkhazian abkhaz/~
+abkhazian abkhazy~
+abkhazian abkhoz/~
+abkhazian abkhozy~
+abkhazians abkhaz/~z
+abkhazians abkhoz/~z
+ablaze @blAz
+able Ab@l
+abled Ab@ld
+abler Ab@lP
+abler AblP
+ables Ab@lz
+ablest Abl@st
+abloom @blUm
+ably Abl/
+abner abnP
+abney abn/
+abnormal abn{rm@l
+abnormalities abn{rmal@t/z
+abnormality abn{rmal@t/
+abnormally abn{rm@l/
+abo ob]
+abo's ob]z
+aboard @b{rd
+abode @bOd
+abolish @boliS
+abolished @boliSt
+abolishes @boliS@z
+abolishing @boliS6N
+abolition ab@liS~
+abolitionism ab@liS~iz}
+abolitionist ab@liS~@st
+abolitionists ab@liS~@s
+abolitionists ab@liS~@ss
+abolitionists ab@liS~@sts
+abominable @bom~@b@l
+abomination @bom~AS~
+abood @bUd
+aboodi @bUd/
+aboriginal abPij~@l
+aborigine abPij~/
+aborigines abPij~/z
+aborn @b{rn
+abort @b{rt
+aborted @b{rt@d
+abortifacient @b{rt@fAS~t
+abortifacients @b{rt@fAS~ts
+aborting @b{rt6N
+abortion @b{rS~
+abortionist @b{rS~@st
+abortionists @b{rS~@s
+abortionists @b{rS~@ss
+abortionists @b{rS~@sts
+abortions @b{rS~z
+abortive @b{rt6v
+abott @bot
+abou @bU
+aboud obUd
+abouhalima obUholEm@
+abouhalima's obUholEm@z
+abound @b?nd
+abounded @b?nd@d
+abounding @b?nd6N
+abounds @b?ndz
+about @b?t
+about's @b?ts
+above @buv
+above's @buvz
+aboveboard @buvb{rd
+abplanalp abpl~alp
+abra obr@
+abracadabra abr@k@dabr@
+abraham Abr@ham
+abrahamian abr@hAm/~
+abrahams Abr@hamz
+abrahamsen abr@hams~
+abrahamson @brah}s~
+abram @bram
+abramczyk obr}C6k
+abramo obrom]
+abramovitz @brom@vits
+abramowicz @brom@viC
+abramowitz @brom@wits
+abrams Abr}z
+abramson Abr}s~
+abrasion @brAZ~
+abrasions @brAZ~z
+abrasive @brAs6v
+abrasives @brAs6vz
+abreast @brest
+abrego obreg]
+abreu @brU
+abridge @brij
+abridged @brijd
+abril @bril
+abroad @br{d
+abrogate abr@gAt
+abrogated abr@gAt@d
+abrogating abr@gAt6N
+abrogation abr@gAS~
+abron @bron
+abrupt @brupt
+abruptly @bruptl/
+abruptness @bruptn@s
+abrutyn AbrUt~
+abruzzese obrUtsAz/
+abruzzo obrUz]
+abs AbEes
+abs abz
+absalom abs@l}
+abscam abskam
+abscess abses
+absence abs~s
+absences abs~s@z
+absent abs~t
+absentee abs~tE
+absenteeism abs~tEiz}
+absentees abs~tEz
+absentia absenS@
+absher abSP
+abshier abS/P
+abshire abSIr
+abso abs]
+absolom abs@l}
+absolut abs@lUt
+absolute abs@lUt
+absolutely abs@lUtl/
+absoluteness abs@lUtn@s
+absolutes abs@lUts
+absolution abs@lUS~
+absolutism abs@lUtiz}
+absolutist abs@lUt@st
+absolve @bzolv
+absolve abzolv
+absolved @bzolvd
+absolved abzolvd
+absolves @bzolvz
+absolves abzolvz
+absolving @bzolv6N
+absolving abzolv6N
+absorb @bz{rb
+absorbed @bz{rbd
+absorbency @bz{rb~s/
+absorbent @bz{rb~t
+absorber @bz{rbP
+absorbers @bz{rbPz
+absorbing @bz{rb6N
+absorbs @bz{rbz
+absorption @bs{rpS~
+absorption @bz{rpS~
+abstain @bstAn
+abstain abstAn
+abstained @bstAnd
+abstained abstAnd
+abstaining @bstAn6N
+abstaining abstAn6N
+abstention @bstenC~
+abstention abstenC~
+abstentions @bstenC~z
+abstentions abstenC~z
+abstinence abst~~s
+abstinent abst~~t
+abston abst~
+abstract abstrakt
+abstract abstrakt
+abstracted abstrakt@d
+abstraction abstrakS~
+abstractions abstrakS~z
+abstracts abstrakts
+abstruse @bstrUs
+absurd @bsVd
+absurdist @bsVdist
+absurdities @bsVd@t/z
+absurdity @bsVd@t/
+absurdly @bsVdl/
+abt AbEtE
+abt abt
+abts AbEtEes
+abts AbEtEz
+abts abts
+abu abU
+abudrahm @budr}
+abuladze abyUladz/
+abundance @bund~s
+abundant @bund~t
+abundantly @bund~tl/
+aburto @bqrtO
+aburto's @bqrtOz
+abuse @byUs
+abuse @byUz
+abused @byUzd
+abuser @byUzP
+abusers @byUzPz
+abuses @byUs@z
+abuses @byUz@z
+abusing @byUz6N
+abusive @byUs6v
+abut @but
+abuts @buts
+abutted @but@d
+abutting @but6N
+abuzz @buz
+abysmal @bizm@l
+abysmally @bizm@l/
+abyss @bis
+abzug abzqg
+abzug abzug
+ac AsE
+aca ak@
+acacia @kAS@
+academe ak@dEm
+academia ak@dEm/@
+academic ak@dem6k
+academically ak@dem6kl/
+academician ak@d}iS~
+academicians @kad}iS~z
+academicians ak@d}iS~z
+academics ak@dem6ks
+academies @kad}/z
+academy @kad}/
+academy's @kad}/z
+acadia @kAd/@
+acampora @kampP@
+acantha okonT@
+acapulco ak@pqlk]
+accardi ok)rd/
+accardo ok)rd]
+accede aksEd
+acceded aksEd@d
+accedes aksEdz
+acceding aksEd6N
+accel @ksel
+accelerant akselP~t
+accelerants akselP~ts
+accelerate akselPAt
+accelerated akselPAt@d
+accelerates akselPAts
+accelerating akselPAt6N
+acceleration akselPAS~
+accelerator akselPAtP
+accelerometer akselPom@tP
+accelerometers akselPom@tPz
+accent @ksent
+accent aksent
+accented akscnt@d
+accenting akscnt6N
+accents akscnts
+accentuate @ksenCUAt
+accentuated aksenC@wAt@d
+accentuates @ksenCUAts
+accentuating aksenC@wAt6N
+accept @ksept
+accept aksept
+acceptability @ksept@bil@t/
+acceptable @ksept@b@l
+acceptable aksept@b@l
+acceptance @ksept~s
+acceptance aksept~s
+acceptances aksept~s@z
+accepted @ksept@d
+accepted aksept@d
+accepting @ksept6N
+accepting aksept6N
+accepts aksepts
+access akses
+accessed aksest
+accessibility akscs@bil@t/
+accessible akses@b@l
+accessing akses6N
+accession @kseS~
+accessories aksesP/z
+accessorize aksesPIz
+accessorized aksesPIzd
+accessory aksesP/
+accetta oCet@
+accident aks@d~t
+accident's aks@d~ts
+accidental aks@den@l
+accidental aks@dent@l
+accidentally aks@den@l/
+accidentally aks@dent@l/
+accidently aks@d~tl/
+accidents aks@d~ts
+accion aC/~
+accival as6vol
+acclaim @klAm
+acclaimed @klAmd
+acclaiming @klAm6N
+acclimate akl}At
+acclimated akl}At@d
+acclimation akl}AS~
+acco ak]
+accola okOl@
+accolade ak@lAd
+accolades ak@lAdz
+accomando ok]mond]
+accommodate @kom@dAt
+accommodated @kom@dAt@d
+accommodates @kom@dAts
+accommodating @kom@dAt6N
+accommodation @kom@dAS~
+accommodations @kom@dAS~z
+accommodative @kom@dAt6v
+accompanied @kump~/d
+accompanies @kump~/z
+accompaniment @kumpn/m~t
+accompaniment @kumpn}~t
+accompaniments @kumpn/m~ts
+accompaniments @kumpn}~ts
+accompanist @kump~@st
+accompany @kump~/
+accompanying @kump~/6N
+accompli @kompl/
+accompli okompl/
+accomplice @kompl@s
+accomplices @kompl@s@z
+accomplish @kompl6S
+accomplished @kompl6St
+accomplishes @kompl6S@z
+accomplishing @kompl6S6N
+accomplishment @kompl6Sm~t
+accomplishments @kompl6Sm~ts
+accor ak{r
+accor's akPz
+accord @k{rd
+accord's @k{rdz
+accordance @k{rd~s
+accorded @k{rd@d
+according @k{rd6N
+accordingly @k{rd6Nl/
+accordion @k{rd/~
+accordions @k{rd/~z
+accords @k{rdz
+accost @k{st
+accosted @kost@d
+accosting @kost6N
+account @k?nt
+account's @k?nts
+accountability @k?n@bil@t/
+accountability @k?nt@bil@t/
+accountable @k?n@b@l
+accountable @k?nt@b@l
+accountancy @k?nt~s/
+accountant @k?nt~t
+accountant's @k?nt~ts
+accountants @k?nt~ts
+accountants' @k?nt~ts
+accounted @k?n@d
+accounted @k?nt@d
+accountemp @k?ntemp
+accountemps @k?ntemps
+accounting @k?n6N
+accounting @k?nt6N
+accounts @k?nts
+accouterment @kUtPm~t
+accouterments @kUtPm~ts
+accredit @kred@t
+accreditation @kred@tAS~
+accreditations @kred@dAS~z
+accredited @kred@t@d
+accrediting @kred@t6N
+accretion @krES~
+accrual @krU@l
+accruals @krU@lz
+accrue @krU
+accrued @krUd
+accrues @krUz
+accruing @krU6N
+accumulate @kyUmy@lAt
+accumulated @kyUmy@lAt@d
+accumulates @kyUmy@lAts
+accumulating @kyUmy@lAt6N
+accumulation @kyUmy@lAS~
+accumulations @kyUmy@lAS~z
+accumulative @kyUmy@lAt6v
+accumulatively @kyUmy@l@t6vl/
+accumulatively @kyUmy@lAt6vl/
+accumulator @kyUmy@lAtP
+accumulators @kyUmy@lAtPz
+accuracies akyP@s/z
+accuracy akyP@s/
+accurate akyP@t
+accurately akyP@tl/
+accuray akyPA
+accuray's akyPAz
+accuride akyPId
+accurso okqrs]
+accusation aky@zAS~
+accusation akyUzAS~
+accusations aky@zAS~z
+accusations akyUzAS~z
+accusative @kyUz@t6v
+accusatory @kyUz@t{r/
+accuse @kyUz
+accused @kyUzd
+accuser @kyUzP
+accusers @kyUzPz
+accuses @kyUz@z
+accusing @kyUz6N
+accusingly @kyUz6Nl/
+accustom @kust}
+accustomed @kust}d
+accutane akyUtAn
+ace As
+aced Ast
+acer AsP
+acerbic @s,rb6k
+acero @s,r]
+acerra @s,r@
+aces As@z
+acetaminophen @sEt}in@f~
+acetate as@tAt
+acetic @sEt6k
+acetic @set6k
+aceto oset]
+acetone as@tOn
+acetylcholine @sEt@lkOl/n
+acetylcholine @set@lkOl/n
+acetylene @set@lEn
+acevedo as@vAd]
+aceves osAvcs
+acey As/
+achatz ak@ts
+ache Ak
+achebe oCAb/
+achee @CE
+achenbach ak~bok
+achenbaum ak~b?m
+aches Aks
+acheson aC@s~
+achey aC/
+achievable @CEv@b@l
+achieve @CEv
+achieved @CEvd
+achievement @CEvm~t
+achievements @CEvm~ts
+achiever @CEvP
+achievers @CEvPz
+achieves @CEvz
+achieving @CEv6N
+achille @kil/
+achilles @kil/z
+achilles' @kil/z
+aching Ak6N
+achmed ohmcd
+achoa @CO@
+achoa's @CO@z
+achor AkP
+achord ak{rd
+achorn akPn
+achtenberg aktcnbPg
+achterberg aktPbPg
+achy Ak/
+acid as@d
+acidic @sid6k
+acidification @sid@f@kAS~
+acidified @sid@fId
+acidifies @sid@fIz
+acidify @sid@fI
+acidity @sid@t/
+acidly as@dl/
+acidosis as@dOs@s
+acids as@dz
+aciduria as@dqr/@
+acierno osirn]
+ack ak
+acker akP
+acker's akPz
+ackerley akPl/
+ackerly akPl/
+ackerman akPm~
+ackermann akPm~
+ackerson akPs~
+ackert akPt
+ackhouse akh?s
+ackland akl~d
+ackles ak@lz
+ackley akl/
+acklin aklin
+ackman akm~
+acknowledge 6knol6j
+acknowledge aknol6j
+acknowledgeable 6knol6j@b@l
+acknowledgeable aknol6j@b@l
+acknowledged 6knol6jd
+acknowledged aknol6jd
+acknowledgement 6knol6jm~t
+acknowledgement aknol6jm~t
+acknowledges 6knol6j@z
+acknowledges aknol6j@z
+acknowledging 6knol6j6N
+acknowledging aknol6j6N
+acknowledgment 6knol6jm~t
+acknowledgment aknol6jm~t
+ackroyd akr<d
+ackroyd's akr<dz
+acmat akmat
+acmat's akmats
+acme akm/
+acme's akm/z
+acne akn/
+acocella ok]Cel@
+acoff ak{f
+acog @k{g
+acolyte ak@lIt
+acolytes ak@lIts
+acord @k{rd
+acorn Ak{rn
+acorns Ak{rnz
+acosta @k{st@
+acoustic @kUst6k
+acoustical @kUst6k@l
+acoustically @kUst6kl/
+acoustics @kUst6ks
+acquaint @kwAnt
+acquaintance @kwAnt~s
+acquaintances @kwAnt~s@z
+acquaintanceship @kwAnt~sS@p
+acquainted @kwAn@d
+acquainted @kwAnt@d
+acquaviva okwovEv@
+acquiesce akw/es
+acquiesced akw/est
+acquiescence akw/es~s
+acquiescing akw/es6N
+acquire @kwIP
+acquired @kwIPd
+acquirer @kwIPP
+acquirers @kwIPPz
+acquires @kwIPz
+acquiring @kwIP6N
+acquiring @kwIr6N
+acquisition akw@ziS~
+acquisition's akw@ziS~z
+acquisitions akw@ziS~z
+acquisitive @kwiz@t6v
+acquit @kwit
+acquitaine akw@tAn
+acquits @kwits
+acquittal @kwit@l
+acquittals @kwit@lz
+acquitted @kwit@d
+acquitting @kwit6N
+acre AkP
+acreage Akr@j
+acree @krE
+acres AkPz
+acrey akr/
+acri okr/
+acrid akr@d
+acrimonious akr}On/@s
+acrimony akr}On/
+acrobat akr@bat
+acrobatic akr@bat6k
+acrobatics akr@bat6ks
+acrobats akr@bats
+acronym akr~}
+acronyms akr~}z
+acropolis @krop@l@s
+across @kr{s
+acrylic @kril6k
+acrylics @kril6ks
+act akt
+act's akts
+actava aktov@
+acted akt@d
+actigall akt6g{l
+actin akt~
+acting akt6N
+actinide akt~Id
+actinidia akt~id/@
+action akS~
+action's akS~z
+actionable akS~@b@l
+actions akS~z
+activase akt6vAz
+activate akt@vAt
+activated akt6vAt@d
+activates akt@vAts
+activating akt@vAt6N
+activation akt@vAS~
+activator akt@vAtP
+active akt6v
+actively akt6vl/
+actives akt6vz
+activision akt6viZ~
+activism akt6viz}
+activist akt6v@st
+activists akt6v@s
+activists akt6v@ss
+activists akt@v@sts
+activists' akt6v@sts
+activities aktiv@t/z
+activity aktiv@t/
+actmedia aktmEd/@
+actodine akt]dIn
+acton akt~
+actor aktP
+actor's aktPz
+actors aktPz
+actors' aktPz
+actress aktr@s
+actress's aktr@s@z
+actresses aktr@s@z
+acts aks
+acts akts
+actual akC@w@l
+actual akS@l
+actuality akC@wal@t/
+actualize akC@w@lIz
+actually akC@w@l/
+actually akCl/
+actually akS@l/
+actually akSl/
+actuarial akC@w,r/@l
+actuaries akC@wer/z
+actuary akC@wer/
+actuate akC@wAt
+actuator akCUAtP
+actuator aktyUAtP
+actuators akCUAtPz
+actuators aktyUAtPz
+actus akt@s
+acuff @kuf
+acuity @kyU@t/
+acumen @kyUm~
+acuna okUn@
+acupuncture akyUpuNkCP
+acura akyP@
+acura's akyP@z
+acuras akyP@z
+acuson akyUs~
+acustar akyUstor
+acusyst akyUsist
+acute @kyUt
+acutely @kyUtl/
+acuteness @kyUtn@s
+acyclovir @sikl]vir
+ad ad
+ad's adz
+ad-hoc adhok
+ad-lib adlib
+ada Ad@
+adabel ad@bcl
+adabelle ad@b@l
+adachi odok/
+adage ad@j
+adagio @doZ/O
+adah ado
+adair @d,r
+adaire od,r
+adak @dak
+adalah odol@
+adalia odol/@
+adam ad}
+adam's ad}z
+adamant ad}~t
+adamantly ad}~tl/
+adamcik od}C6k
+adamczak od}Cak
+adamczyk od}C6k
+adame odom/
+adamec @dom6k
+adamek @domck
+adames @dAmz
+adami odom/
+adamik @dom6k
+adamina odomEn@
+adamkus ad}k@s
+adamo odom]
+adamowicz @dom@v6C
+adams ad}z
+adams' ad}z
+adams's ad}z@z
+adamski @damskE
+adamson ad}s~
+adamstown ad}st?n
+adan Ad~
+adapso @daps]
+adapt @dapt
+adaptability @dapt@bil@t/
+adaptable @dapt@b@l
+adaptaplex @dapt@pleks
+adaptation ad@ptAS~
+adaptations ad@ptAS~z
+adaptations adaptAS~z
+adaptec @daptek
+adapted @dapt@d
+adapter @daptP
+adapters @daptPz
+adapting @dapt6N
+adaptive @dapt6v
+adaptor @daptP
+adapts @dapts
+adar @d)r
+adarand ad@rand
+aday @dA
+adaza @doz@
+adcock @dkok
+adcox @dkoks
+add ad
+addair @d,r
+addams ad}z
+added ad@d
+addendum @ded}
+addendums @ded}z
+addeo od/]
+adder adP
+adderley @dVl/
+addicks ad6ks
+addict @dikt
+addict adikt
+addicted @dikt@d
+addicting @dikt6N
+addiction @dikS~
+addictions @dikS~z
+addictive @dikt6v
+addicts @dikts
+addicts adikts
+addidas @dEd@s
+addidas' @dEd@s
+addidas's @dEd@s@z
+addidases @dEd@s@z
+addie ad/
+adding ad6N
+addington ad6Nt~
+addis odis
+addis-ababa od/s@bob@
+addis-ababa odis@bob@
+addison ad@s~
+addison's ad@s~z
+addition @diS~
+additional @diSn@l
+additional @diS~@l
+additionally @diSn@l/
+additionally @diS~@l/
+additions @diS~z
+additive ad@t6v
+additives ad@t6vz
+addle ad@l
+addled ad@ld
+addleman ad@lm~
+address @dres
+address adres
+addressable @dres@b@l
+addressed @drest
+addressee adrcsE
+addresses @dres@z
+addresses adr@s@z
+addressing @dres6N
+adds adz
+adduci odUC/
+addwest adwest
+addy ad/
+ade Ad
+adee @dE
+adel @del
+adela @del@
+adelaar ad@lor
+adelaide ad@lAd
+adelbert @delbPt
+adele @del
+adele's @delz
+adeline ad@lIn
+adelizzi ad@lEz/
+adell @del
+adell's @delz
+adelle @del
+adelman ad@lm~
+adelmann ad@lm~
+adelpha @delf@
+adelphia @delf/@
+adelphia's @delf/@z
+adelsberger ad@lzbPgP
+adelson ad@ls~
+adelstein ad@lst/n
+adelstein ad@lstIn
+aden Ad~
+adena ad~@
+adenauer Ad~?r
+adenauer ad~?r
+adenine ad~En
+adenoid ad~<d
+adenoids ad~<dz
+adept @dept
+adequacy ad@kw@s/
+adequate ad@kw@t
+adequate ad@kwAt
+adequately ad@kw@tl/
+ader AdP
+aderhold adPh]ld
+aderholt adPh]lt
+aderman adPm~
+ades Adz
+adey Ad/
+adger ajP
+adham adham
+adhere @dhir
+adhered adhird
+adherence @dhir~s
+adherent @dhir~t
+adherents adhir~ts
+adheres @dhirz
+adhering @dhir6N
+adhesive @dhEs6v
+adhesive adhEs6v
+adhesives @dhEs6vz
+adhesives adhEs6vz
+adia od/@
+adid @did
+adidas @dEd@s
+adieu @dU
+adin @din
+adina odEn@
+adine odEn/
+adinolfi od/nOlf/
+adios od/Os
+adipose ad@pOs
+adirondack adPondak
+adjacent @jAs~t
+adjani adjon/
+adjective aj6kt6v
+adjectives aj6kt6vz
+adjoin @j<n
+adjoining @j<n6N
+adjoins @j<nz
+adjourn @jVn
+adjourned @jVnd
+adjourning @jVn6N
+adjournment @jVnm~t
+adjourns @jVnz
+adjudge @juj
+adjudged @jujd
+adjudicate @jUd6kAt
+adjudicated @jUd@kAt@d
+adjudicating @jUd6kAt6N
+adjudication @jUd@kAS~
+adjunct ajuNkt
+adjuncts ajuNkts
+adjust @just
+adjustable @just@b@l
+adjustables @just@b@lz
+adjusted @just@d
+adjuster @justP
+adjusters @justPz
+adjusting @just6N
+adjustment @justm~t
+adjustments @justm~ts
+adjusts @jus
+adjusts @juss
+adjusts @justs
+adjutant aj@t~t
+adkins adkinz
+adkinson adk~s~
+adkison adk@s~
+adkisson adk@s~
+adl-tabataba od@ltob@tob@
+adl-tabatabai od@ltob@tubI
+adlai odlo/
+adler adlP
+adley adl/
+adlon adlon
+adman adm~
+admen adm~
+administer @dmin@stP
+administered @dmin@stPd
+administering admin@stP6N
+administers admin@stPz
+administrate admin@strAt
+administrating @dmin@strAt6N
+administration admin@strAS~
+administration's admin@strAS~z
+administrations admin@strAS~z
+administrative @dmin@strAt6v
+administratively admin@strAt6vl/
+administrator @dmin@strAtP
+administrators admin@strAtPz
+administrators' admin@strAtPz
+admira admIr@
+admira's admIr@z
+admirable admP@b@l
+admirably admP@bl/
+admiral admP@l
+admiral's admP@lz
+admirals admP@lz
+admiralty admP@lt/
+admiration admPAS~
+admirations admPAS~s
+admire admIr
+admired @dmIPd
+admirer admIrP
+admirers @dmIrPz
+admires admIrz
+admiring admIr6N
+admiringly admIr6Nl/
+admissibility @dmis@bil@t/
+admissible @dmis@b@l
+admission @dmiS~
+admission admiS~
+admissions @dmiS~z
+admissions admiS~z
+admit @dmit
+admits @dmits
+admittance @dmit~s
+admitted @dmit@d
+admittedly admit@dl/
+admitting @dmit6N
+admitting admit6N
+admonish admon6S
+admonished @dmon6St
+admonishes admon6S@z
+admonishing admon6S6N
+admonishment admon6Smcnt
+admonition adm~iS~
+admonitions adm~iS~z
+adnan adn~
+adney adn/
+ado @dU
+adobe @dOb/
+adobe's @dOb/z
+adolescence ad@les~s
+adolescence ad]les~s
+adolescent ad@les~t
+adolescent ad]les~t
+adolescents ad@les~ts
+adolescents ad]les~ts
+adolf Adolf
+adolf's Adolfs
+adolfo @dolfO
+adolph Ad{lf
+adolpha odOlf@
+adolphson ad]lfs~
+adon od{n
+adonia odOn/@
+adopt @dopt
+adoptable @dopt@b@l
+adopted @dopt@d
+adoptee @doptE
+adoptees @doptEz
+adopting @dopt6N
+adoption @dopS~
+adoptions @dopS~z
+adoptive @dopt6v
+adopts @dopts
+ador od{r
+adora od{r@
+adorabelle adP@b@l
+adorable @d{r@b@l
+adoration adPAS~
+adore @d{r
+adored @d{rd
+adoree adPE
+adores @d{rz
+adoring @d{r6N
+adorn @d{rn
+adorna od{rn@
+adorned @d{rnd
+adornment @d{rnm~t
+adorno od{rn]
+adorns @d{rnz
+adra Adr@
+adragna odrogn@
+adrda AdPd@
+adrea odr/@
+adrenal @drEn@l
+adrenalin @dren@l~
+adrenaline @dren@l~
+adria odr/@
+adrian Adr/~
+adriana Adr/an@
+adriance odrE~s
+adriano odr/on]
+adriatic Adr/at6k
+adriel @drEl
+adrienne odr/en
+adrift @drift
+adroit @dr<t
+adroitly @dr<tl/
+ads adz
+ads' adz
+adsit adsit
+adss AdEeses
+adss ads
+adtec adtek
+adulate aj@lAt
+adulation aj@lAS~
+aduliadae @dUl/odA
+adult @dult
+adult ad@lt
+adulterate @dultPAt
+adulterated @dultPAt@d
+adulterer @dultPP
+adulterers @dultPPz
+adulterous @dultP@s
+adultery @dultP/
+adulthood @dulthqd
+adults @dults
+adults ad@lts
+adults' @dults
+adults' ad@lts
+adusdur ad@sdP
+advance @dvans
+advanced @dvanst
+advancement @dvansm~t
+advancements @dvansm~ts
+advancer @dvansP
+advancers @dvansPz
+advances @dvans@z
+advancing @dvans6N
+advanta @dvant@
+advanta advant@
+advantage @dvan@j
+advantage @dvant6j
+advantage advan6j
+advantage advant6j
+advantaged @dvan6jd
+advantaged @dvant6jd
+advantaged advan6jd
+advantaged advant6jd
+advantageous adv~tAj@s
+advantages @dvan6j@z
+advantages @dvant6j@z
+advantages advan6j@z
+advantages advant6j@z
+advantest @dvant@st
+advantest advant@st
+advection advekS~
+advent advent
+adventist advent@st
+adventists advent@s
+adventists advent@ss
+adventists advent@sts
+adventure @dvenCP
+adventure advenCP
+adventurer @dvenCPP
+adventurer advenCPP
+adventurers @dvenCPPz
+adventurers advenCPPz
+adventures @dvenCPz
+adventures advenCPz
+adventuresome @dvenCPs}
+adventuresome advenCPs}
+adventurism @dvenCPiz}
+adventurism advenCPiz}
+adventurous @dvenCP@s
+adventurous advenCP@s
+adverb advPb
+adverbial advVb/@l
+adverbs advPbz
+adversarial advPs,r/@l
+adversaries advPser/z
+adversary advPser/
+adverse @dvVs
+adverse advVs
+adverse advVs
+adversely advVsl/
+adversity @dvVs@t/
+adversity advVs@t/
+advertise advPtIz
+advertised advPtIzd
+advertised advPtIzd
+advertisement @dvVt@zm~t
+advertisement advPtIzm~t
+advertisements advPtIzm~ts
+advertiser advPtIzP
+advertiser's advPtIzPz
+advertisers advPtIzPz
+advertisers' advVtIzPz
+advertises advPtIz@z
+advertising advPtIz6N
+advertising's advPtIz6Nz
+advertorial advPt{r/@l
+advertorials advPt{r/@lz
+advest advcst
+advice @dvIs
+advice advIs
+advil advil
+advil's advilz
+advisability advIz@bil@t/
+advisable @dvIz@b@l
+advise @dvIz
+advise advIz
+advised @dvIzd
+advised advIzd
+advisedly @dvIz@dl/
+advisedly advIz@dl/
+advisement @dvIzm~t
+adviser advIzP
+adviser's @dvIzPz
+advisers advIzPz
+advisers' advIzPz
+advises advIz@z
+advising advIz6N
+advisor @dvIzP
+advisor advIzP
+advisories @dvIzP/z
+advisors @dvIzPz
+advisors advIzPz
+advisory @dvIzP/
+advisory advIzP/
+advo adv]
+advocacy adv@k@s/
+advocate adv@k@t
+advocate adv@kAt
+advocate's adv@k@ts
+advocated adv@kAt@d
+advocates adv@k@ts
+advocates adv@kAts
+advocating adv@kAt6N
+advocation adv@kAS~
+adweek adw/k
+adwell @dwel
+ady Ad/
+adz adz
+ae A
+aegean 6jE~
+aegerter egPtP
+aegis Ej@s
+aegon Agon
+aeltus alt@s
+aeneas an/@s
+aequitron Akw@tron
+aer ,r
+aer AE)r
+aerial ,r/@l
+aerien ,r/~
+aeriens ,r/~z
+aeritalia er@taly@
+aero ,r]
+aerobatic er@bat6k
+aerobatics er@bat6ks
+aerobic crOb6k
+aerobically crOb6kl/
+aerobics POb6ks
+aerodrome ,r@drOm
+aerodynamic er]dInam6k
+aerodynamically er]dInam6kl/
+aerodynamics er]dInam6ks
+aerodyne ,r@dIn
+aeroflot ,r]flot
+aerojet ,r]jet
+aerolift ,r]lift
+aerolineas er]lin/@s
+aeromexico er]meks6kO
+aeronautic er]not@k
+aeronautical er]not@k@l
+aeronautical er~ot@k@l
+aeronauticas er]n{t6k@s
+aeronautics er~{t6ks
+aeroquip ,r@kwip
+aerosmith ,r]smiT
+aerosmith's ,r]smiTs
+aerosol ,r@sol
+aerosols ,r@solz
+aerospace ,r]spAs
+aerospace's ,r]spAs@z
+aerospatiale er]spos/ol
+aerostar ,r]stor
+aerostars ,r]storz
+aerostat ,r]stat
+aerostats ,r]stats
+aerotech ,r]tek
+aerts ,rts
+aeschliman eSl/m~
+aesop Esop
+aesop's Esops
+aesthete esT/t
+aesthetic csTet6k
+aesthetically csTet6kl/
+aesthetics csTet6ks
+aetna etn@
+aetna's etn@z
+afanasyev af~As/cv
+afar @f)r
+affable af@b@l
+affair @f,r
+affairs @f,rz
+affect @fekt
+affectation afcktAS~
+affected @fekt@d
+affecting @fekt6N
+affection @fekS~
+affectionate @fekS~@t
+affectionately @fekS~@tl/
+affections @fekS~z
+affective @fekt6v
+affectively @fekt6vl/
+affects @fekts
+affeldt afclt
+afferent afP~t
+affiant af/~t
+affidavit af@dAv@t
+affidavits af@dAv@ts
+affiliate @fil/@t
+affiliate @fil/At
+affiliate's @fil/Ats
+affiliated @fil/At@d
+affiliated's @fil/At@dz
+affiliates @fil/@ts
+affiliates @fil/Ats
+affiliates' @fil/@ts
+affiliating @fil/At6N
+affiliation @fil/AS~
+affiliations @fil/AS~z
+affinities @fin@t/z
+affinity @fin@t/
+affirm @fVm
+affirmation afPmAS~
+affirmations afPmAS~z
+affirmative @fVm@t6v
+affirmatively @fVm@t6vl/
+affirmed @fVmd
+affirming @fVm6N
+affirms @fVmz
+affix @fiks
+affix af6ks
+affixed @fikst
+affixes @fiks@z
+affixes af6ks@z
+affixing @fiks6N
+affleck afl6k
+afflerbach aflPbok
+afflict @flikt
+afflicted @flikt@d
+afflicting @flikt6N
+affliction @flikS~
+afflictions @flikS~z
+afflicts @flikts
+afflik aflik
+affluence aflU~s
+affluent aflU~t
+affolter af]ltP
+afford @f{rd
+affordability @f{rd@bil@t/
+affordable @f{rd@b@l
+afforded @f{rd@d
+affording @f{rd6N
+affords @f{rdz
+affricate afr6k@t
+affricates afr6k@ts
+affrication afr6kAS~
+affront @frunt
+affronted @frunt@d
+affronts @frunts
+affymax af/maks
+afghan afgan
+afghani afgon/
+afghani's afgan/z
+afghanis afgan/z
+afghanistan afgan@stan
+afghanistan's afgan@stanz
+afghans afganz
+afheldt afelt
+aficionado @fESy~odO
+aficionados @fiS~od]z
+afield @fEld
+afire @fIr
+aflame @flAm
+aflatoxin afl@toks~
+afloat @flOt
+aflutter @flutP
+afmed afmcd
+afonso @fons]
+afoot @fqt
+aforementioned @f{rmenS~d
+aforesaid @f{rsed
+aforethought @f{rTot
+afoul @f?l
+afraid @frAd
+afresh @freS
+africa afPk@
+africa afr6k@
+africa's afr6k@z
+african afr6k~
+africanist afr6k~ist
+africanize afr6k~Iz
+africanized afr6k~Izd
+africans afr6k~z
+afrikaans afr@konz
+afrikaner afr@konP
+afrikanerdom afr@konPd}
+afrikaners afr6konPz
+afro afr]
+afsane ofsonA
+afsane's ofsonAz
+afshar afSP
+aft aft
+after aftP
+afterall aftPol
+afterburner aftPbVnP
+afterburners aftPbVnPz
+aftereffect aftP@fekt
+aftereffects aftP@fekts
+afterglow aftPglO
+afterimage aftPim6j
+afterlife aftPlIf
+aftermarket aftPmork@t
+aftermath aftPmaT
+afternoon aftPnUn
+afternoon's aftPnUnz
+afternoons aftPnUnz
+aftershock aftPSok
+aftershocks aftPSoks
+aftertaste aftPtAst
+aftertax aftPtaks
+afterthought aftPTot
+afterward aftPwPd
+afterwards aftPwPdz
+afula @fUl@
+afula's @fUl@z
+ag ag
+aga og@
+agache agaC
+again @gAn
+again @gen
+against @genst
+agamemnon ag}emnon
+agamemnon's ag}emnonz
+agan Ag~
+aganbegyan ag~begy~
+agans ogonz
+agape @gAp
+agar AgP
+agard agPd
+agarwal ogorwol
+agassi ag@s/
+agassiz @gasiz
+agate ag@t
+agates ag@ts
+agatha ag@T@
+agco agkO
+age Aj
+age's Aj@z
+aged Aj@d
+aged Ajd
+agee Aj/
+agee's Aj/z
+ageless Ajl@s
+agence aj~s
+agencies Aj~s/z
+agencies' Aj~s/z
+agency Aj~s/
+agency's Aj~s/z
+agenda @jend@
+agendas @jend@z
+agent Aj~t
+agent's Aj~ts
+agents Aj~ts
+agents' Aj~ts
+ager AjP
+ageratum @j,r@t}
+ageratums @j,r@t}z
+agers AjPz
+agers' AjPz
+agerton AgPt~
+ages Aj@z
+agfa agf@
+aggarwal @g)rw@l
+aggie ag/
+aggies ag/z
+agglomerate @glomPAt
+agglomeration @glomPAS~
+agglutinate @glUt~At
+aggrandize @grandIz
+aggrandizement @grandIzm~t
+aggrandizement agr~dIzm~t
+aggrandizing @grandIz6N
+aggrandizing agr~dIz6N
+aggravate agr@vAt
+aggravated agr@vAt@d
+aggravates agr@vAts
+aggravating agr@vAt6N
+aggravation agr@vAS~
+aggregate agr@g@t
+aggregate agr@gAt
+aggregated agr@gAt@d
+aggregates agr@g@ts
+aggregates agr@gAts
+aggress @gres
+aggression @greS~
+aggressions @greS~z
+aggressive @gres6v
+aggressively @gres6vl/
+aggressiveness @gres6vn@s
+aggressivity @grcsiv@t/
+aggressor @gresP
+aggressors @gresPz
+aggrey agrA
+aggrieve @grEv
+aggrieved @grEvd
+aggy ag/
+aghast @gast
+aghazadeh ag@zode
+agie ag/
+agildo @gild]
+agile aj@l
+agilis @jil@s
+agility @jil@t/
+agin ojEn
+agincourt aj~k{rt
+aging Aj6N
+agins Aginz
+agip Ag@p
+agitate aj@tAt
+agitated aj@tAt@d
+agitating aj@tAt6N
+agitation aj@tAS~
+agitator aj@tAtP
+agitators aj@tAtPz
+agius Aj/@s
+agleam @glEm
+agler aglP
+aglitter @glitP
+aglo agl]
+aglow @glO
+agna agn@
+agne Any
+agnella agnel@
+agnelli agnel/
+agnello agnel]
+agner agnP
+agnes agn@s
+agneta ognet@
+agnew agnU
+agnew agnyU
+agnico agn6kO
+agnor agnP
+agnos agn]s
+agnosio agnOs/]
+agnostic agnost6k
+ago @gO
+agog @gog
+agoglia @gogl/@
+agonies ag~/z
+agonist ag~@st
+agonists ag~@s
+agonists ag~@ss
+agonists ag~@sts
+agonize ag~Iz
+agonized ag~Izd
+agonizes ag~Iz@z
+agonizing ag~Iz6N
+agonizingly ag~Iz6Nl/
+agony ag~/
+agora agP@
+agosta ogOst@
+agostinelli og]st/nel/
+agostini og]stEn/
+agostino og{stEn]
+agosto ogOst]
+agoura @gUr@
+agouron @gUron
+agra agr@
+agrarian @gr,r/~
+agrarianism @gr,r/~iz}
+agrawal @graw@l
+agree @grE
+agreeable @grE@b@l
+agreed @grEd
+agreeing @grE6N
+agreement @grEm~t
+agreement's @grEm~ts
+agreements @grEm~ts
+agrees @grEz
+agresource agr@s{rs
+agresource ogrcs{rs
+agresta ogrest@
+agresti ogrest/
+agrexco ogreksk]
+agri agr/
+agribusiness agr@bizn@s
+agrico @grEk]
+agricola agr6kOl@
+agricole agr6kOl
+agricultural agr@kulCP@l
+agriculturalist agr@kulCP@l@st
+agriculturally agr@kulCP@l/
+agriculture agr@kulCP
+agriculture's agr@kulCPz
+agrifuel agr@fyUl
+agrifuels agr@fyUlz
+agrippa @grip@
+agrivisor agr@vIzP
+agro agr]
+agrochemical agr]kem@k@l
+agrochemicals agr]kem6k@lz
+agrokomerc agr@k]mVk
+agronomist @gron}@st
+agronomists @gron}@s
+agronomists @gron}@ss
+agronomists @gron}@sts
+agrosiand @grOs/~d
+aground @gr?nd
+agrusa ogrUs@
+agua ogw@
+aguacate agw@kAt
+aguado ogwod]
+aguayo ogwA]
+agudelo ogUdAl]
+aguero og,r]
+aguiar ogw/P
+aguila ogwEl@
+aguilar ag@lor
+aguilera ogw/l,r@
+aguillar ag@lor
+aguillard agilPd
+aguillon ogw/l{n
+aguinaga ogU/nog@
+aguirra @gwir@
+aguirra's @gwir@z
+aguirre @gwirA
+aguirre ogwirA
+aguirre's @gwirAz
+aguirre's ogwirAz
+agustin @g{st~
+ah o
+aha oho
+ahab Ahab
+ahah oho
+aharon ahPon
+ahart @h)rt
+ahaulsie @hols/
+ahead @hed
+ahearn @hVn
+aherin oPin
+ahern @hVn
+aherne @hVn
+ahh o
+ahl ol
+ahlberg olbPg
+ahlborn olbPn
+ahlen @lAn
+ahlers olPz
+ahles A@lz
+ahlf olf
+ahlgren olgrcn
+ahlgrim olgrim
+ahlin ol~
+ahlman olm~
+ahlquist olkwist
+ahlstrand olstr~d
+ahlstrom olstr}
+ahmad omod
+ahmadi omod/
+ahmann om~
+ahmanson om~s~
+ahmed om@d
+ahmed omcd
+ahmoudi omUd/
+ahn an
+ahner onP
+aho oh]
+ahola ah@l@
+ahold @hOld
+ahonen @hOn~
+ahr )r
+ahranat @ron@t
+ahren )r~
+ahrendt )rcnt
+ahrens )rcnz
+ahs oz
+ahuja ohUy@
+ahumada oyUmod@
+ai AI
+ai I
+aichele Ik@l
+aicher IkP
+aichi oEC/
+aickin Ak6n
+aid Ad
+aid's Adz
+aida IEd@
+aidan oEdon
+aide Ad
+aide's Adz
+aided Ad@d
+aides Adz
+aides' Adz
+aidid IdEd
+aidid's IdEdz
+aiding Ad6N
+aids Adz
+aiello Iel]
+aigner AknP
+aigner AnP
+aigner cnyA
+aiguebelle Ig@bel
+aiken Ak~
+aikens Ak~z
+aikey Ak/
+aikin Ak~
+aikins Ik~z
+aikman Akm~
+ail Al
+ailee Al/
+aileen IlEn
+aileron AlPon
+ailerons AlPonz
+ailes Alz
+ailes Ilz
+ailey Al/
+ailing Al6N
+ailment Alm~t
+ailments Alm~ts
+ailor AlP
+ails Alz
+ailsa Als@
+aim Am
+aime Am
+aimed Amd
+aimee Am/
+aiming Am6N
+aimless Aml@s
+aimlessly Aml@sl/
+aimone AmOn
+aims Amz
+ain't Ant
+aine An
+ainge AN
+ainge Anj
+ainley Anl/
+ainsberg AnzbPg
+ainsley Ansl/
+ainslie Anzl/
+ainsworth AnswPT
+ainsworth's AnzwPTs
+aipac Ipak
+aipac's Ipaks
+air ,r
+air's ,rz
+air_force ,rf{rs
+airbag ,rbag
+airbags ,rbagz
+airbase ,rbAs
+airbases ,rbAs@z
+airboat ,rb]t
+airboats ,rb]ts
+airborne ,rb{rn
+airborne's ,rb{rnz
+airbus ,rb@s
+airbus's ,rb@s@z
+aircal ,rkol
+aircal's ,rkalz
+airco ,rk]
+aircoa erkO@
+aircraft ,rkraft
+aircraft's ,rkrafs
+aircraft's ,rkrafts
+aircrafts ,rkrafs
+aircrafts ,rkrafts
+aircrew ,rkrU
+aird ,rd
+airdrop ,rdrop
+airdrops ,rdrops
+aired ,rd
+airedale ,rdAl
+aires ,r/z
+airey ,r/
+airfare ,rfer
+airfares ,rferz
+airfield ,rfEld
+airfields ,rfEldz
+airflow ,rfl]
+airfoil ,rf<l
+airfoils ,rf<lz
+airfone ,rfOn
+airforce ,rf{rs
+airframe ,rfrAm
+airfreight ,rfrAt
+airgas ,rgas
+airglow ,rglO
+airhart ,rhort
+airhead ,rhed
+airing ,r6N
+airington ,r6Nt~
+airless ,rl@s
+airlia ,rl/@
+airlie ,rl/
+airlift ,rlift
+airlifted ,rlift@d
+airlifting ,rlift6N
+airlifts ,rlifts
+airline ,rlIn
+airline's ,rlInz
+airliner ,rlInP
+airliner's ,rlInPz
+airliners ,rlInPz
+airlines ,rlInz
+airlines' ,rlInz
+airlink ,rliNk
+airlock ,rl{k
+airmail ,rmAl
+airman ,rm~
+airman's ,rm~z
+airmen ,rmen
+airmotive ermOt6v
+airplane ,rplAn
+airplane's ,rplAnz
+airplanes ,rplAnz
+airport ,rp{rt
+airport's ,rp{rts
+airports ,rp{rts
+airpower ,rp?P
+airs ,rz
+airship ,rSip
+airships ,rSips
+airspace ,rspAs
+airspeed ,rspEd
+airstrike ,rstrIk
+airstrikes ,rstrIks
+airstrip ,rstrip
+airstrips ,rstrips
+airtight ,rtIt
+airtime ,rtIm
+airtouch ,rtuC
+airtran ,rtran
+airwave ,rwAv
+airwaves ,rwAvz
+airway ,rwA
+airway's ,rwAz
+airways ,rwAz
+airways' ,rwAz
+airwing ,rw6N
+airworthiness ,rwVT/n@s
+airworthy ,rwVT/
+airy ,r/
+ais Iz
+aisa IEs@
+aisle Il
+aisles Ilz
+aislinn Aslin
+aitchison AC6s~
+aithne ATn
+aitken Itk~
+aiton oEt]n
+aiwa Iw@
+aix-la-chapelle Iksl@S@pel
+aja I@
+ajaj @joj
+ajaj's @joj@z
+ajami Ajom/
+ajar @j)r
+ajax Ajaks
+ajax's Ajaks@z
+ajinomoto @jin}Ot]
+ajito @hEt]
+ajito @jEt]
+aka AkAA
+aka ok@
+akai @kI
+akaka @kok@
+akali @kol/
+akamine ak}In
+akana okon@
+akard akPd
+akashi @koS/
+akashi's @koS/z
+akbar akbP
+akbar okbor
+akc ak
+ake Ak
+akebono ak/bOn]
+akel @kel
+akella @kel@
+aken Ak~
+akens Ak~z
+aker AkP
+aker akP
+akerley @kVl/
+akerman akPm~
+akers AkPz
+akers's AkPz@z
+akerson akPs~
+akey @kE
+akhtar aktP
+aki ok/
+akiba @kEb@
+akihito ok/hEtO
+akimbo @kimbO
+akin @kin
+akins @kinz
+akio ok/]
+akira @kEr@
+akita @kEt@
+akita's @kEt@z
+akiva @kEv@
+akiyama ok/yom@
+akkadian @kAd/~
+akkerman akPm~
+akre akP
+akridge @krij
+akron akr~
+aksamit aks}@t
+aksler akslP
+akst akst
+akyanama ak@yon}@
+akzo akz]
+al al
+al's alz
+al. al
+al. al@bam@
+ala Al@
+alabama al@bam@
+alabama's al@bam@z
+alabaman al@bam~
+alabamans al@bam~z
+alabaster al@bastP
+alachlor @laklP
+alachua @laCU@
+alacrity @lakr@t/
+aladdin @lad~
+alafi @lof/
+alagem al@jcm
+alagna ologn@
+alagoas al@gOz
+alai @lI
+alaimo @lAm]
+alain @lAn
+alaine @lAn
+alair @l,r
+alam @lam
+alamco @lamk]
+alameda al}Ed@
+alamein al}In
+alamillo al}il]
+alamito al}Et]
+alamitos al}Et]s
+alamo al}]
+alamos al}]z
+alamoudi alomUd/
+alamoudi olomUd/
+alan al~
+alan's al~z
+alana olan@
+aland al~d
+alane @lAn
+alanis olonis
+alaniz al~@z
+alann alan
+alanna olon@
+alar Alor
+alarcon @l)rkon
+alard @l)rd
+alaric alP6k
+alarica olorEk@
+alarice ol)ris
+alarid @l,r@d
+alarie @l,r/
+alarm @l)rm
+alarm's @l)rmz
+alarmed @l)rmd
+alarming @l)rm6N
+alarmingly @l)rm6Nl/
+alarmist @l)rm@st
+alarms @l)rmz
+alas @las
+alaska @lask@
+alaska's @lask@z
+alaskamen @lask}~
+alaskan @lask~
+alaskans @lask~z
+alastair al@ster
+alaster al@stP
+alatorre olot{r/
+alayne @lAn
+alba alb@
+albach albok
+albacore alb@k{r
+alban olb~
+albanese olbonAz/
+albani albon/
+albani's albon/z
+albania albAn/@
+albania's albAn/@z
+albanian albAn/~
+albanians albAn/~z
+albano olbon]
+albans albanz
+albany {lb~/
+albany's {lb~/z
+albarado olborod]
+albarran albar~
+albatross alb@tros
+albatrosses alb@tros@z
+albaugh @lb{
+albea alb/@
+albee @lbE
+albeit {lbE@t
+albemarle alb}orl
+alben {lb~
+alber albP
+alberding albPd6N
+alberg albPg
+albergo olb,rg]
+alberico olbPEk]
+albern albPn
+albers {lbPz
+alberson albPs~
+albert albPt
+alberta albVt@
+alberthal albPT{l
+alberti olb,rt/
+albertina olbPtEn@
+albertine albPtEn
+albertini olbPtEn/
+alberto albVt]
+alberts albPts
+albertsen albPts~
+albertson albPts~
+albertson's albPts~z
+albertus albVt@s
+albertville albPtvil
+alberty @lbVt/
+albie {lb/
+albin albin
+albina olbEn@
+albini olbEn/
+albinia olbEn/@
+albino albInO
+albion alb/~
+albiric olbIr6k
+albo alb]
+albrecht {lbrekt
+albright {lbrIt
+albritton albriton
+albro albr]
+album alb}
+album's alb}z
+albumin albyUm~
+albums alb}z
+albunex albyUncks
+albuquerque alb@kPk/
+albury albcr/
+albus alb@s
+albuterol albyUtP{l
+alcala olkol@
+alcan alkan
+alcan's alkanz
+alcantar alkantP
+alcantara olkont)r@
+alcaraz olk)roz
+alcasa alkos@
+alcatel alk@tel
+alcatel's alk@telz
+alcatraz alk@traz
+alcee als/
+alchemically alkem@kl/
+alchemist alC}@st
+alchemist olk}@st
+alchemy alk}/
+alcide alsId
+alcids als@dz
+alcina olCEn@
+alco alk]
+alco's alk]z
+alcoa alk]@
+alcoa's alkO@z
+alcocer @lkOsP
+alcock @lkok
+alcohol alk@hol
+alcoholic alk@hol6k
+alcoholics alk@hol6ks
+alcoholism alk@h{liz}
+alcon @lkon
+alcorta olk{rt@
+alcott alkot
+alcove alkOv
+alcoves alkOvz
+alda old@
+aldaco oldok]
+aldama oldom@
+aldana oldan@
+aldape oldopA
+alday aldA
+aldebaran aldebP~
+alden old~
+alder {ldP
+aldercy @ldVk/
+alderete aldP/t
+alderfer aldPfP
+alderidge oldP6j
+alderidge oldr6j
+alderman aldPm~
+alderman {ldPm~
+aldermen {ldPmcn
+alderson aldPs~
+alderson {ldPs~
+alderton {ldPt~
+aldi old/
+aldicarb {ld6korb
+aldila aldil@
+aldin oldEn
+aldinger {ld6NP
+aldis oldis
+aldo old]
+aldora old{r@
+aldous old@s
+aldred aldPd
+aldred {ldrcd
+aldredge {ldrcj
+aldrete {ldr/t
+aldric aldr6k
+aldric {ldr6k
+aldrich {ldr6C
+aldridge {ldr6j
+aldrin {ldrin
+aldrin's {ldrinz
+aldus old@s
+aldwin {ldwin
+aldwyn {ldwin
+aldys old/s
+ale Al
+aleatory Al/@t{r/
+alec al6k
+aleda olAd@
+aleen @lEn
+alegre olegr/
+alegrett al@gr@t
+alegria @legr/@
+alehouse Alh?s
+aleichem @lAhcm
+aleichem @lehcm
+alejandre olAyondrA
+alejandro olAyondr]
+alejo olAy]
+alejos olAy]z
+aleksander al@gzandP
+aleksander al@ksandP
+aleksandr al@gzandP
+aleksandr al@ksandP
+aleman Alm~
+alena olAn@
+alendrin @lendr~
+alene @lEn
+alenia @lEn/@
+aleo ol/]
+aleph ol@f
+aleria @lEr/@
+aleron olcr{n
+alert @lVt
+alerted @lVt@d
+alerting @lVt6N
+alertness @lVtn@s
+alerts @lVts
+ales Alz
+aleshire olASirA
+alesi oles/
+alessandra alcsandr@
+alessandrini olcsondrEn/
+alessandro ol@sandr]
+alessandro olAzondr]
+alessi @les/
+alessio @les/]
+aleta olet@
+alethea al@TE@
+aletti @let/
+aleutian @lUS~
+aleutians @lUS~z
+aleve @lEv
+alewife AlwIf
+alewine AlwIn
+alewives AlwIvz
+alex al@ks
+alex's al@ks@z
+alexa @leks@
+alexander al@gzandP
+alexander's al@gzandPz
+alexanders al6gzandPz
+alexandra al6gzandr@
+alexandra alcgzandr@
+alexandre al6ksondP
+alexandria al@gzandr/@
+alexandrine al@gzandr/n
+alexandrines al@gzandr/nz
+alexei @leksA
+alexi @leks/
+alexi's @leks/z
+alexia @leks/@
+alexine @leksIn
+alexis @leksis
+alexopoulos al6gzop@lis
+alexy @lEks/
+aley Al/
+alf alf
+alfa alf@
+alfa's alf@z
+alfalfa alfalf@
+alfano olfon]
+alfareda alf@red@
+alfaro olf)r]
+alfavilli alf@vil/
+alfie alf/
+alfieri olfir/
+alfiero alf/,r]
+alfin alfin
+alfin's alfinz
+alfono alfOn]
+alfons olf]nz
+alfonse alfons
+alfonsin alfonsin
+alfonsin's alfonsinz
+alfonsine olf]nsEn/
+alfonso alfons]
+alford alfPd
+alfred alfr@d
+alfredo alfrAd]
+alfredson alfr@ds~
+alfrey alfr/
+algae alj/
+algal alg@l
+algar olg)r
+algarin algP~
+algebra alj@br@
+algebraic alj@brA6k
+algebraically alj@brA6kl/
+algemene alg}En
+algeo alj/]
+alger aljP
+algeria aljir/@
+algeria's aljEr/@z
+algerian aljir/~
+algerians aljEr/~z
+algernon aljPnon
+algie {lg/
+algiers aljirz
+algol algol
+algom alg}
+algoma algOm@
+algonquian algoNk/~
+algonquin algoNkw~
+algorithm algPiT}
+algorithms algPiT}z
+alguire olgwirA
+algy alj/
+alhadeff al@dcf
+alhambra alhambr@
+alhausie alh?s/
+ali ol/
+ali's ol/z
+ali-reza ol/rez@
+aliano ol/on]
+alianza al/anz@
+alias Al/@s
+aliases Al/@s@z
+aliberti ol/b,rt/
+alibi al@bI
+alibis al@bIz
+alibrandi al@brand/
+alice al@s
+alice's al@s@z
+alicea @lis/@
+alicia @liS@
+alicia's @liS@z
+alida olEd@
+alie al/
+alien Al/~
+alienate Aly~At
+alienated Al/~At@d
+alienates Al/~Ats
+alienating Al/~At6N
+alienation Al/~AS~
+aliens Al/~z
+aliff alif
+alig al6g
+alight @lIt
+align @lIn
+aligned @lInd
+aligning @lIn6N
+alignment @lInm~t
+alignments @lInm~ts
+aligns @lInz
+alija @lIj@
+alija's @lIj@z
+alike @lIk
+alikes @lIks
+alima olEm@
+alimenies al}en/z
+alimentary al}entP/
+alimony al}On/
+alina @lEn@
+aline @lIn
+alines @lInz
+alioto ol/Ot]
+aliquippa al@kwip@
+aliquippa's al@kwip@z
+aliquippas al@kwip@z
+alire olirA
+alisky @lisk/
+alison al@s~
+alissa @lis@
+alistair al@ster
+alister al@stP
+alita olEt@
+alitalia al@tAl/@
+alitalia's al@tAl/@z
+alithia @liT/@
+alito @lEt]
+alive @lIv
+alix al6ks
+alizac al@zak
+alka alk@
+alkahest alk@hest
+alkali alk@lI
+alkalies alk@lIz
+alkaline alk@lIn
+alkalinity alk@lin@t/
+alkaloid alk@l<d
+alkaloidal alk@l<d@l
+alkaloids alk@l<dz
+alkanes alkAnz
+alkema alk}@
+alkene alkEn
+alkenes alkEnz
+alkire @lkIr
+all {l
+all's {lz
+all-out {l?t
+all-purpose {lpVp@s
+alla ol@
+allah ol@
+allain @lAn
+allaire ol,r
+allais @lA
+allais Al/@s
+allan al~
+allante alontA
+allar @l)r
+allard alPd
+allay @lA
+allayed @lAd
+allaying @lA6N
+allays @lAz
+allbaugh @lb{
+allbee {lbE
+allbright {lbrIt
+allbritten albrit~
+allbritton albriton
+allcock {lkok
+allcorn @lk{rn
+allday {ldA
+allderdice aldPdIs
+allderdice oldPdIs
+alldredge @ldrej
+allebach al@bok
+alleco alek]
+allee @lE
+allegation al@gAS~
+allegations al@gAS~z
+allege @lej
+alleged @lejd
+allegedly @lej@dl/
+alleges @lej@z
+alleghany al@gAn/
+allegheny al@gAn/
+allegheny's al@gAn/z
+allegiance @lEj~s
+allegiances @lEj~s@z
+allegiances alEj/ans@z
+alleging @lej6N
+allegis alAj@s
+allegis' alAj@s
+allegis's alAj@s@z
+allegorical al@g{r@k@l
+allegories al@g{r/z
+allegory al@g{r/
+allegra olegr@
+allegretti olcgret/
+allegro @legrO
+allele @lel/
+alleles @lel/z
+allelic @lel6k
+alleman Alm~
+allemand al}~d
+allen al~
+allen's al~z
+allenbaugh @lenb{
+allendale al~dAl
+allende oyendA
+allender olendP
+allender olyendAP
+allendorf al~d{rf
+allene alEn
+allenhurst al~hVst
+allens al~z
+allensbach al~zbok
+allensworth al~zwPT
+allentown al~t?n
+allenwood al~wqd
+aller {lP
+allergan alPj~
+allergen alPj~
+allergens alPj~z
+allergic @lVj6k
+allergies alPj/z
+allergist alPj@st
+allergy alPj/
+allers {lPz
+allert alPt
+allerton alPt~
+alles Alz
+alleva olAv@
+alleviate @lEv/At
+alleviated @lEv/At@d
+alleviates @lEv/Ats
+alleviating @lEv/At6N
+alleviation @lEv/AS~
+alley al/
+alley's al/z
+alleyne alAn
+alleys al/z
+alleyway al/wA
+alleyways al/wAz
+allgaier algIP
+allgeier algIP
+allgemeine {lg}In
+allgeyer alg/P
+allgood {lgqd
+alli al/
+alliance @lI~s
+alliance's @lI~s@z
+alliances @lI~s@z
+alliant @lI~t
+allianz al/~z
+allick al6k
+allie al/
+allied @lId
+allied alId
+allied's alIdz
+alliedsignal alIdsign@l
+alliedsignal's alIdsign@lz
+allies @lIz
+allies alIz
+allies' alIz
+alligator al@gAtP
+alligators al@gAtPz
+alligood al6gqd
+allin @lin
+allinder al~dP
+alling {l6N
+allinger {l6NP
+allingham {l6Nham
+allington {l6Nt~
+allinson al~s~
+allis alis
+allison al@s~
+allison's al@s~z
+allister {l@stP
+alliston al@ston
+alliteration @litPAS~
+alliterative @litP@t6v
+alliterative @litPAt6v
+allman {lm~
+allmendinger almcnd6NP
+allmon {lm~
+allmond @lmond
+allnet {lnet
+allnutt @lnut
+allocate al@kAt
+allocated al@kAt@d
+allocates al@kAts
+allocating al@kAt6N
+allocation al@kAS~
+allocations al@kAS~z
+allocator al@kAtP
+allocators al@kAtPz
+allocca alok@
+allocco alok]
+allomorph al}{rf
+allomorphs al}{rfs
+allophone al@fOn
+allophones al@fOnz
+allophonic al@fon6k
+allor {lP
+allot @lot
+alloted @lot@d
+allotment @lotm~t
+allotments @lotm~ts
+allotrope al@trOp
+allotropes al@trOps
+allots @lots
+allotted @lot@d
+allotting @lot6N
+allow @l?
+allowable @l?@b@l
+allowance @l?~s
+allowances @l?~s@z
+alloway al]wA
+allowed @l?d
+allowing @l?6N
+allows @l?z
+alloy al<
+alloys al<z
+allphin @lfin
+allport {lp{rt
+allred alr@d
+allright olrIt
+alls {lz
+allsbrook {ltsbrqk
+allsbrook {lzbrqk
+allshouse {ltsh?s
+allshouse {lzh?s
+allsop {lsop
+allsopp {lsop
+allspice {lspIs
+allstate {lstAt
+allstate's {lstAts
+allston {lst~
+allsup als@p
+alltel {ltel
+alltime {ltIm
+allton {lt~
+alltop {ltop
+allude @lUd
+alluded @lUd@d
+alludes @lUdz
+alluding @lUd6N
+allum al}
+allums al}z
+allure @lqr
+allured @lqrd
+alluring @lqr6N
+allusion @lUZ~
+allusions @lUZ~z
+allusive @lUs6v
+alluvial alUv/@l
+alluvium @lUv/}
+allwaste {lwAst
+allweiss olwEs
+ally @lI
+ally alI
+ally's @lIz
+allying @lI6N
+allying alI6N
+allyn alin
+allys alIz
+allyson al@s~
+alm om
+alma alm@
+alma {lm@
+almada olmod@
+almadani {lm@don/
+almaden alm@d~
+almaden olm@den
+almaguer olmogw,r
+alman alm~
+almanac {lm~ak
+almand alm~d
+almanza olmonz@
+almanzar olmonz)r
+almaraz olm)roz
+almas alm@z
+almasy alm@s/
+almazan olmozon
+almeda olmAd@
+almeida olmEd@
+almendarez olmAnd)rcz
+almer {lmP
+almgren almgrcn
+almighty {lmIt/
+almira olmir@
+almo olm]
+almodovar olm]d]v)r
+almon olm~
+almond om~d
+almonds olm~dz
+almonte olmOntA
+almos olm]s
+almost {lmOst
+almquist almkwist
+alms olmz
+alms omz
+almy {m/
+almys alm/z
+alodie @lod/
+aloe alO
+aloft @l{ft
+aloha @lOho
+aloi ol<
+aloia olOy@
+alois ol<s
+aloisa ol<s@
+aloisi ol<s/
+aloisia ol<s/@
+aloisio ol<s/]
+aloka @lOk@
+alon @lon
+alone @lOn
+along @l{N
+alonge al~j
+alongi olONg/
+alongs @l{Nz
+alongside @l{NsId
+alonso @lons]
+alonza @lonz@
+alonzo @lonz]
+aloof @lUf
+aloofness @lUfn@s
+alot @lot
+aloud @l?d
+aloys @l<z
+aloyse @l<s
+aloysia ol<s/@
+aloysius al]iS@s
+alpa alp@
+alpaca alpak@
+alpaugh @lp{
+alper alpP
+alperin alpPin
+alpern @lpVn
+alpers alpPz
+alpert alpPt
+alpex alpcks
+alpha alf@
+alpha's alf@z
+alphabet alf@bet
+alphabetic alf@bet6k
+alphabetical alf@bet6k@l
+alphabetically alf@bet6kl/
+alphabetization alf@bet@zAS~
+alphabetize alf@b@tIz
+alphametric alf}etr6k
+alphametrics alf}etr6ks
+alphandery alfadP/
+alphanumeric alf~Um,r6k
+alpharel alfPel
+alpharetta alfPet@
+alphin alfin
+alphonse alfonz
+alphonsine @lfons/n
+alphonso alfons]
+alpin @lpin
+alpine alpIn
+alpirez alp6rcz
+alpo alp]
+alps alps
+alquist alkwist
+already {lred/
+already {red/
+alred {lr@d
+alright {lrIt
+alroy @lr<
+als alz
+alsace alsas
+alsace alsos
+alsatian alsAS~
+alsbrook alzbrqk
+alsbrook's alzbrqks
+alsbrooks alzbrqks
+alsbrooks' alzbrqks
+alsbury alzbcr/
+alsbury {lzbcr/
+alsdorf alzd{rf
+alsdorf {lzd{rf
+alsip als@p
+also {ls]
+alsobrook als@brqk
+alsobrooks als@brqks
+alsop alsop
+alspach alsp@k
+alspaugh @lsp{
+alsthom alsT}
+alston {lst~
+alsup als@p
+alt olt
+alta olt@
+altadena olt@dEn@
+altai altI
+altaic altA6k
+altamirano oltom6ron]
+altamuro {lt}qr]
+altar {ltP
+altarpiece {ltPpEs
+altars {ltPz
+altavista {lt@vist@
+altay {ltI
+altemose alt}]s
+altemus alt}@s
+altenburg {lt~bPg
+altenhofen alt~h@f~
+alter {ltP
+altera {lt,r@
+alteration {ltPAS~
+alterations {ltPAS~z
+altercation oltPkAS~
+altercations oltPkAS~z
+altered {ltPd
+altergott altPg@t
+altering {ltP6N
+alterman {ltPm~
+alternacare {ltVn@ker
+alternate {ltPn@t
+alternate {ltPnAt
+alternated {ltPnAt@d
+alternately {ltPn@tl/
+alternates {ltPnAts
+alternating {ltPnAt6N
+alternation {ltPnAS~
+alternative {ltVn@t6v
+alternatively {ltVn@t6vl/
+alternatives {ltVn@t6vz
+alternator {ltPnAtP
+alters {ltPz
+altfest oltfest
+althaus alth?s
+althaver alTAvP
+althea alTE@
+althoff alth{f
+although {lTO
+althouse {lth?s
+altice oltis
+altier {lt/P
+altieri oltir/
+altima oltim@
+altima's oltim@z
+altimeter altim@tP
+altimorano oltEm{ron]
+altiplano alt@plonO
+altitude alt@tUd
+altitudes alt@tUdz
+altizer altIzP
+altland altl~d
+altman {ltm~
+altman's {ltm~z
+altmann {ltm~
+altmeyer altmIP
+altmeyer oltmIP
+alto alt]
+altobelli olt]bel/
+altogether {lt@geTP
+altom @ltom
+altomare olt]m)r/
+alton {lt~
+altoona altUn@
+altos alt]z
+altos {ltOs
+altra oltr@
+altron {ltron
+altruism altrUiz}
+altruistic {ltrUist6k
+altschiller {lCilP
+altschul alC@l
+altschuler alCyUlP
+altshuler alCyUlP
+altshuler olCUlP
+altucher altukP
+alturas oltqr@s
+altus alt@s
+altvater altv@tP
+altzheimer oltshImP
+altzheimer's oltshImPz
+alu olU
+alum @lum
+alum al}
+alumax alUmaks
+alumbaugh @lumb{
+alumina @lUm~@
+aluminio alUmEn/]
+aluminium @lUm~}
+aluminium alyUm~}
+aluminize @lUm~Iz
+aluminized @lUm~Izd
+aluminosilicate @lUm~]sil@kAt
+aluminum @lUm~}
+aluminum's @lUm~}z
+alumni @lumnI
+alumnus @lumn@s
+alums al}z
+alun Al~
+alura olqr@
+alusuisse alyUswis
+alva alv@
+alvah alvo
+alvan alv~
+alvarado alvPod]
+alvardo olv)rd]
+alvare alv)r
+alvare alvAr
+alvarenga olvoreNg@
+alvares olv)rcs
+alvarez alvPez
+alvaro @lv)r]
+alvear olvir
+alveolar alvE@lP
+alveoli alvE@lI
+alverez olv,rcz
+alvero alv,r]
+alverson olv,rs~
+alves olvcs
+alvey alv/
+alvidrez olvEdrcz
+alvin alvin
+alvina alvIn@
+alvino olvEn]
+alvis olvis
+alvita olvEt@
+alvite alvIt
+alvord alv{rd
+alwaleed alw@lEd
+alwaleed olwolEd
+alward alwVd
+always {lw/z
+always {lwAz
+alwin alwin
+alwine alwIn
+alwood alwqd
+alwyn alwin
+aly Al/
+alyce alis
+alyea alE@
+alyeska al/esk@
+alyeska's alyesk@z
+alys al/z
+alysheba aliSEb@
+alysia @lis/@
+alyssa @lis@
+alza alz@
+alzado olzad]
+alzado olzod]
+alzena olzen@
+alzheimer alzhImP
+alzheimer oltshImP
+alzheimer's alzhImPz
+alzheimer's oltshImPz
+alzona alzOn@
+am Aem
+am am
+am's Aemz
+am's amz
+amabel am@bel
+amabelle am@b@l
+amabile omob@l
+amacher am@kP
+amacker am@kP
+amadea omod/@
+amadeo omod/]
+amadeus am@dA@s
+amado omod]
+amadon omod{n
+amador am@d{r
+amadou am@dU
+amaker amAkP
+amakudari am@kyUd)r/
+amal }ol
+amalea am@lE@
+amalfitano omolf/ton]
+amalgam }alg}
+amalgamate }alg}At
+amalgamated }alg}At@d
+amalgamated's }alg}At@dz
+amalgamation }alg}AS~
+amalgams }alg}z
+amalia }oly@
+amalie am@l/
+aman om~
+amana }an@
+amanda }and@
+amanda's }and@z
+amandime am~dIm
+amann am~
+amano }on]
+amanpour omonpqr
+amanpour's omonpqrz
+amante omont/
+amar })r
+amara om)r@
+amaral omoral
+amarante omoront/
+amaranth amPanT
+amari om)r/
+amarillo amPil]
+amarin amPin
+amaris amP@s
+amaro om)r]
+amaryllis amPil@s
+amaryllises amPil@s@z
+amasa am@s@
+amason am@s~
+amass }as
+amassed }ast
+amassing }as6N
+amateur am@CV
+amateur am@tV
+amateurish am@CP6S
+amateurism am@CPiz}
+amateurs am@CVz
+amateurs am@tVz
+amatil am@til
+amato omot]
+amauligak }?l6gak
+amax Amaks
+amaya omoy@
+amaze }Az
+amazed }Azd
+amazement }Azm~t
+amazes }Az@z
+amazing }Az6N
+amazingly }Az6Nl/
+amazon am@zon
+amazon's am@zonz
+amazonia am@zOn/@
+amazonian am@zOn/~
+amazonians am@zOn/~z
+amazons am@zonz
+ambac ambak
+ambase ambAs
+ambassador ambas@dP
+ambassador's ambas@dPz
+ambassadorial ambas@d{r/@l
+ambassadors ambas@dPz
+ambassadorship ambas@dPSip
+ambassadorships ambas@dPSips
+ambassadress ambas@dr@s
+amber ambP
+amber's ambP
+amberg ambPg
+amberger ambPgP
+ambergris ambPgris
+ambers ambPz
+amberson ambPs~
+ambiance amb/~s
+ambidextrous amb@dekstr@s
+ambience amb/~s
+ambient amb/~t
+ambiguities amb@gyU@t/z
+ambiguity amb6gyU@t/
+ambiguous ambigyU@s
+ambition ambiS~
+ambitions ambiS~z
+ambitious ambiS@s
+ambitiously ambiS@sl/
+ambivalence ambiv@l~s
+ambivalent ambiv@l~t
+amble amb@l
+ambled amb@ld
+ambler amblP
+ambles amb@lz
+amblin amblin
+ambling amb@l6N
+ambling ambl6N
+amborn }b{rn
+ambra ambr@
+ambriano ambr/on]
+ambrit ambrit
+ambriz ambriz
+ambrogio ambrOj/]
+ambrose ambrOz
+ambrosia ambrOZ@
+ambrosial ambrOZ@l
+ambrosian ambrOz~
+ambrosiano ambrOs/on]
+ambrosine ombr]sEn/
+ambrosini ombr]sEn/
+ambrosino ombr]sEn]
+ambrosio ambrOs/]
+ambrosius ambr@s/@s
+ambs amz
+ambuehl ambql
+ambulance amby@l~s
+ambulances amby@l~s@z
+ambulatory amby@l@t{r/
+amburgey ambPg/
+amburn }bVn
+ambush ambqS
+ambushed ambqSt
+ambushes ambqS@z
+ambushing ambqS6N
+amc AemsE
+amc amk
+amca amk@
+amcast amkast
+amcole amkOl
+amcor amk{r
+amcore amk{r
+amdahl amdol
+amdec amdek
+amdek amdck
+amdur amdP
+amdura amdqr@
+ame Am
+ameche }EC/
+amedco }edk]
+amedee am@d/
+ameen }En
+amelia }Ely@
+amelinda omclEnd@
+ameline omclEn/
+amelio }El/]
+ameliorate }ElyPAt
+ameliorated }ElyPAt@d
+amelioration }ElyPAS~
+amelita omclEt@
+amell omAl
+amen Amen
+amen omen
+amenable }En@b@l
+amenable }en@b@l
+amend }end
+amendable }end@b@l
+amended }end@d
+amending }end6N
+amendment }endm~t
+amendment's }endm~ts
+amendments }endm~ts
+amendola omcndOl@
+amends }endz
+amenities }en@t/z
+amenity }en@t/
+ament amcnt
+amenta }ent@
+amer AmP
+amerada amPod@
+amerada amcrod@
+amerco },rk]
+amerford AmPfPd
+ameri },r/
+ameribanc },r@baNk
+america },r@k@
+america's },r@k@z
+american },r@k~
+american's },r@k~z
+americana }er@kan@
+americanism },r@k~iz}
+americanization }er@k~@zAS~
+americanize },r@k~Iz
+americanized },r@k~Izd
+americano }er6kon]
+americans },r@k~z
+americans' },r@k~z
+americar },r6kor
+americare },r6ker
+americares },r6kerz
+americas },r@k@z
+americas' },r@kuz
+americo }V@k]
+americold },r6kOld
+americorp },r6k{r
+americorp },r6k{rp
+americorps },r6k{r
+americus },r6k@s
+amerifirst },r@fPst
+amerigas },r6gas
+amerigo omPEg]
+amerika },r6k@
+amerindian amPind/~
+amerine omPEn/
+ameritech },r@tek
+ameritech's },r@teks
+ameritrust },r@trust
+amerman amPm~
+amero om,r]
+ameron amPon
+ameron's amPonz
+amerongen amP{nj~
+amersham amPSam
+amerson amPs~
+amery amP/
+ames Amz
+ames' Amz
+ames's Amz@z
+ametek am@tek
+ametek's am@teks
+amethyst am@T@st
+amev amcv
+amex ameks
+amex's amcks@z
+amexco }eksk]
+amexco's }eksk]z
+amey Am/
+amezcua }ezkyU@
+amezquita omczkwEt@
+amfac amfak
+amfesco amfesk]
+amgen amjcn
+amgen's amjcnz
+amherst amPst
+amhoist amh<st
+ami om/
+amiability Am/@bil@t/
+amiable Am/@b@l
+amiably Am/@bl/
+amicable am6k@b@l
+amicably am6k@bl/
+amick am6k
+amico omEk]
+amicone am6kOn
+amicus }Ek@s
+amid }id
+amidi omEd/
+amidon am@don
+amidships }idS@ps
+amidst }idst
+amie am/
+amiga }Eg@
+amigo }EgO
+amigos }EgOz
+amilia omEl/@
+amin omEn
+amino }En]
+aminta }int@
+amiot Am/@t
+amiprilose }ipr@lOs
+amir omir
+amir }ir
+amir's omirz
+amir's }irz
+amiram amPam
+amiran am6r~
+amirault amIr?lt
+amirav am6rav
+amiri omir/
+amis amis
+amish Am6S
+amish om6S
+amison amis~
+amiss }is
+amit omEt
+amitai am@tI
+amity am@t/
+amityville am@t/vil
+amman am~
+amman }on
+ammann am~
+ammeen }En
+ammerman amPm~
+ammeter amEtP
+ammeters amEtPz
+ammirati om6rot/
+ammo amO
+ammon am~
+ammonia }Ony@
+ammonite am~It
+ammonites am~Its
+ammonium }On/}
+ammons am~z
+ammunition amy~iS~
+ammunitions amy~iS~z
+amnesia amnEZ@
+amnesiac amnEz/ak
+amnesties amn@st/z
+amnesty amn@st/
+amnio amn/]
+amniocentesis amn/]sentEs@s
+amniotic amn/{t6k
+amo om]
+amoco am@k]
+amoco's am@k]z
+amoeba }Eb@
+amoebas }Eb@z
+amoebic }Eb6k
+amok }uk
+amon om{n
+among }uN
+amongst }uNst
+amoolya }Uly@
+amor amP
+amoral Am{r@l
+amore om{r
+amorette amPet
+amorist amP@st
+amorita om{rEt@
+amorosi om{rOs/
+amoroso om{rOs]
+amorous amP@s
+amorphous }{rf@s
+amortization amPt@zAS~
+amortize amPtIz
+amortized amPtIzd
+amortizing amPtIz6N
+amoruso amPUs]
+amory AmP/
+amos Am@s
+amos's Am@s@z
+amoskeag am@skAg
+amoskeag's am@skAgz
+amoss }{s
+amount }?nt
+amounted }?n@d
+amounted }?nt@d
+amounting }?n6N
+amounting }?nt6N
+amounts }?nts
+amp amp
+ampad ampad
+ampal amp@l
+amparan ampP~
+ampato ompot]
+ampco ampk]
+amperage ampP6j
+ampersand ampPsand
+ampex ampeks
+amphenol amf~{l
+amphetamine amfet}En
+amphetamines amfet}Enz
+amphibian amfib/~
+amphibians amfib/~z
+amphibious amfib/@s
+amphibole amf@bOl
+amphitheater amf@TE@tP
+amphitheaters amf@TE@tPz
+amphitheatre amp@TE@tP
+amphora amfP@
+amphorae amfPE
+ample amp@l
+amplicons ampl6k{nz
+amplification ampl@f@kAS~
+amplifications ampl@f@kAS~z
+amplified ampl@fId
+amplifier ampl@fIP
+amplifiers ampl@fIPz
+amplifies ampl@fIz
+amplify ampl@fI
+amplifying ampl@fI6N
+ampligen ampl6jcn
+amplitude ampl@tUd
+amplocore ampl@k{r
+amply ampl/
+ampol amp{l
+amputate ampy@tAt
+amputated ampy@tAt@d
+amputation ampy@tAS~
+amputations ampyUtAS~z
+amputee ampy@tE
+amputees ampy@tEz
+amr omP
+amraam amrom
+amre amr@
+amrein amrIn
+amrep amrcp
+amrhein amPhIn
+amrine amr/n
+amritsar amr@tsor
+amritsar amritsP
+amro amr]
+ams amz
+amsbaugh amzb{
+amsco amsk]
+amsden amzd~
+amsler amzlP
+amsouth ams?T
+amspacher amsp@kP
+amstar amstor
+amster amstP
+amsterdam amstPdam
+amsterdam's amstPdamz
+amstrad amstrad
+amstutz amst@ts
+amtech amtek
+amtrack amtrak
+amtrak amtrak
+amtrak's amtraks
+amuck }uk
+amulet amy@l@t
+amulets amy@l@ts
+amundsen Am~ds~
+amundsen om~ds~
+amundson am~ds~
+amuse }yUz
+amused }yUzd
+amusement }yUzm~t
+amusements }yUzm~ts
+amusements' }yUzm~ts
+amuses }yUz@z
+amusing }yUz6N
+amusingly }yUz6Nl/
+amvest amvcst
+amvestor amvestP
+amvestors amvestPz
+amway amwA
+amy Am/
+amy's Am/z
+amylin am@lin
+amyloid am@l<d
+amyotrophic am/@trOf6k
+amyotrophic amI@trOf6k
+amyx am6ks
+an an
+an ~
+ana an@
+ana on@
+anabaptist an@bapt@st
+anable An@b@l
+anabolic an@bol6k
+anac anak
+anachronism ~akr~iz}
+anachronisms ~akr~iz}z
+anachronistic ~akr~ist6k
+anacin an@sin
+anacker an@kP
+anacomp an@komp
+anaconda an@kond@
+anacostia an@kost/@
+anacostia's an@kost/@z
+anadarko an@d)rk]
+anadarko's an@d)rk]z
+anaerobe anPOb
+anaerobes anPObz
+anaerobic anPOb6k
+anaesthesia an@sTEZ@
+anafranil ~afr~il
+anagnos onogn]z
+anagram an@gram
+anaheim an@hIm
+anal An@l
+analgesic an@ljEs6k
+analgesics an@ljEz6ks
+analog an@l{g
+analogic an@loj6k
+analogies ~al@j/z
+analogous ~al@g@s
+analogue an@l{g
+analogy ~al@j/
+analyses ~al@sEz
+analysis ~al@s@s
+analyst an@l@st
+analyst's an@l@s
+analyst's an@l@ss
+analyst's an@l@sts
+analysts an@l@s
+analysts an@l@ss
+analysts an@l@sts
+analysts' an@l@s
+analysts' an@l@ss
+analysts' an@l@sts
+analytic an@lit6k
+analytical an@lit6k@l
+analytically an@lit6kl/
+analyticity an@l@tis@t/
+analytics an@lit6ks
+analyzable an@lIz@b@l
+analyze an@lIz
+analyzed an@lIzd
+analyzer an@lIzP
+analyzers an@lIzPz
+analyzes an@lIz@z
+analyzing an@lIz6N
+anamaria an}@rE@
+anand an~d
+anandale an~dAl
+anandeep onondEp
+anania onon/@
+anantha ~anT@
+anaphora ~afP@
+anarchic an)rk6k
+anarchical an)rk@k@l
+anarchist anPk@st
+anarchists anPk@sts
+anarchy anPk/
+anaren anP~
+anas an@s
+anasazi an@saz/
+anasazi an@soz/
+anasquan an@skwon
+anast onost
+anastas an@st@z
+anastasi onostos/
+anastasia an@stAZ@
+anastasio an@stos/]
+anastasio onostos/]
+anastos an@st]z
+anathema ~aT}@
+anatola onotOl@
+anatole an@tOl
+anatoli an@tOl/
+anatolia an@tOl/@
+anatolian an@tOl/~
+anatoly an@tOl/
+anatomical an@tom@k@l
+anatomically an@tom@kl/
+anatomist ~at}@st
+anatomy ~at}/
+anaya onoy@
+anbari anb)r/
+ancel ~sel
+ancell onsAl
+ancestor ansestP
+ancestors ansestPz
+ancestral ansestr@l
+ancestry anscstr/
+ancheta onket@
+ancho anC]
+anchondo onkOnd]
+anchor aNkP
+anchor's aNkPz
+anchorage aNkP@j
+anchorage aNkr6j
+anchored aNkPd
+anchoring aNkP6N
+anchorman aNkPman
+anchorman aNkPm~
+anchormen aNkPmen
+anchors aNkPz
+anchovies anCOv/z
+anchovies anCOv/z
+anchovy anCOv/
+anchovy anCOv/
+ancient AnC~t
+ancient AnS~t
+ancients AnC~ts
+ancients AnS~ts
+ancillary ans@ler/
+ancira onCir@
+ancona onkOn@
+ancrum ~krum
+anctil aNktil
+and and
+and ~d
+andal and@l
+andalusia and@lUZ@
+andalusian and@lUS~
+andante ondontA
+andantino ondontEn]
+andean and/~
+andel and@l
+ander andP
+andera andP@
+anderberg andPbPg
+anderegg andP6g
+anderle andP@l
+anderlini andPlEn/
+anderman andPm~
+anders andPz
+andersen andPs~
+andersen's andPs~z
+anderson andPs~
+anderson's andPs~z
+andersons andPs~z
+andersonville andPs~vil
+andersson andPs~
+andert andPt
+anderton andPt~
+andes and/z
+andesite and@sIt
+andie and/
+anding and6N
+andino ondEn]
+andiron andIPn
+andis andis
+andler andlP
+ando and]
+andolina ond]lEn@
+andonian andOn/~
+andoras and{r@z
+andorra and{r@
+andover and]vP
+andrada ondrod@
+andrade andrAd
+andrae ondrI
+andras ondr@s
+andre ondrA
+andrea andr/@
+andrea ondrA@
+andrea's andr/@z
+andrea's ondrA@z
+andreae ondrAo
+andreana andrEn@
+andreana andrEon@
+andreani andrEn/
+andreani andrEon/
+andreano andrEn]
+andreano andrEon]
+andreas ondrA@s
+andreasen andr/s~
+andreason andrEs~
+andreassen andr@s~
+andree ~drE
+andreen ~drEn
+andrei andrA
+andreini ondrAEn/
+andrej ondrA
+andren andP~
+andreoli ondrAOl/
+andreoni ondrAOn/
+andreotti andr/od/
+andreotti ondr/ot/
+andreozzi ondr/ots/
+andrepont ondrAp]nt
+andres andrAz
+andres ondrAz
+andresen andrEs~
+andreski andresk/
+andress ondrcs
+andretti andret/
+andretti's andret/z
+andreu andrU
+andrew andrU
+andrew's andrUz
+andrews andrUz
+andrews' andrUz
+andrey andr/
+andrezak andr@zak
+andria andr/@
+andriana ondr/an@
+andriano ondr/on]
+andric andr6k
+andrich andr6k
+andrick andr6k
+andries ~drEz
+andriessen andrEs~
+andringa ondrENg@
+andriola ondr/Ol@
+andrist andrist
+androgynous andr{j~@s
+android andr<d
+andromeda androm@d@
+andropov andropov
+andros andros
+andrus andr@s
+andruskevich andr@sev6C
+andry andr/
+andrzej ondrA
+andrzejewski ~jAefsk/
+ands andz
+andujar ondUy)r
+andy and/
+andy's and/z
+anecdotal an@kdOt@l
+anecdotally an@kdOt@l/
+anecdote an@kdOt
+anecdotes an@kdOts
+anello ~el]
+anemia ~Em/@
+anemias ~Em/@z
+anemic ~Em6k
+anemometer an}om@tP
+anemone an}On
+anencephalic anens@fal6k
+anencephalic an~sef@l6k
+anencephaly an~sef@l/
+anestachio an@staC/]
+anesthesia an@sTEZ@
+anesthesiologist an@sTEz/ol@j@st
+anesthesiologists an@sTEz/ol@j@s
+anesthesiologists an@sTEz/ol@j@ss
+anesthesiologists an@sTEz/ol@j@sts
+anesthesiology an@sT/z/ol@j/
+anesthetic an@sTet6k
+anesthetics an@sTet6ks
+anesthetist ~esT@t@st
+anette ~et
+aneurism anyqriz}
+anew ~U
+anew ~yU
+anfal AenefAel
+anfal anfol
+anfinson anf~s~
+ang aN
+ange Anj
+angel Anj@l
+angela anj@l@
+angela's anj@l@z
+angeleno anj@lEn]
+angelenos anj@lEn]z
+angeles anj@l@s
+angeles' anj@lEz
+angeles's anj@l/s@z
+angeletti oNgclet/
+angelfish Anj@lfiS
+angeli oNgel/
+angelic anjel6k
+angelica anj@lEk@
+angelica anjel6k@
+angelically anjel6kl/
+angelicas anjel6k@z
+angelico oNgclEk]
+angelika anjelik@
+angelillo oNgclil]
+angelina anjclEn@
+angeline ANgclIn
+angelini oNgclEn/
+angelino anj@lEn]
+angelino oNgclEn]
+angelino's anj@lEn]z
+angelino's oNgclEn]z
+angelinos aNg@lEn]z
+angelinos anj@lEn]z
+angelita oNgclEt@
+angell Anj@l
+angelle ANgel
+angello anjel]
+angelo anj@lO
+angelo's anj@lOz
+angeloff ANgcl{f
+angelone oNgclOn/
+angeloni oNgclOn/
+angelos anj@lOz
+angelou anj@lU
+angeloz anj@lOz
+angels Anj@lz
+angels' Anj@lz
+angelucci oNgclUC/
+anger aNgP
+angered aNgPd
+angerer aNgPP
+angering aNgP6N
+angerman aNPm~
+angermeier ANgPmIP
+angers aNgPz
+angert ANgPt
+angevine ANg6vIn
+angi anj/
+angie anj/
+angier anj/P
+angina anjIn@
+angio anj/]
+angiogram anj/]gram
+angiomedic anj/]med6k
+angiomedics anj/]med6ks
+angioplasty anj/@plast/
+angiotensin anj/]tens~
+angle aNg@l
+angled aNg@ld
+anglemyer aNg@lm/P
+anglen aNg@l~
+angler aNglP
+anglers aNglPz
+angles aNg@lz
+angleton aNg@lt~
+angley aNgl/
+anglia aNgl/@
+anglican aNgl@k~
+anglicize aNl@sIz
+anglicized aNl@sIzd
+anglim aNglim
+anglin aNglin
+angling aNgl6N
+anglo aNgl]
+anglo-catholicism aNgl]k@T{l@siz}
+anglos aNgl]s
+anglos aNgl]z
+angola aNgOl@
+angola's aNgOl@z
+angolan aNg]l~
+angolans aNg]l~z
+angora aNg{r@
+angoras aNg{r@z
+angotti oNgOt/
+angove oNgOv/
+angrier aNgr/P
+angriest aNgr/@st
+angrily aNgr@l/
+angry aNgr/
+angst oNkst
+angstadt aNStat
+angstadt aNstat
+angstrom aNstr}
+angstroms aNstr}z
+anguiano oNg/on]
+anguilla aNwil@
+anguish aNgw6S
+anguished aNgw6St
+anguishing aNgw6S6N
+angular aNgy@lP
+angulate aNgyUlAt
+angulated aNgyUlAt@d
+angulo oNgUl]
+angus aNg@s
+angy anj/
+anhalt anh@lt
+anheuser anhIzP
+anheuser's anhyUzPz
+anhydride anhIdr@d
+anibal an@b@l
+anikst an6kst
+aniline an@lEn
+animal an}@l
+animal's an}@lz
+animals an}@lz
+animals' an}@lz
+animate an}@t
+animate an}At
+animated an}At@d
+animates an}@ts
+animates an}Ats
+animation an}AS~
+animations an}AS~z
+animator an}AtP
+animators an}AtPz
+animism an}iz}
+animist an}@st
+animists an}@s
+animists an}@ss
+animists an}@sts
+animosities an}os@t/z
+animosity an}os@t/
+animous an}@s
+animus an}@s
+aninat an~at
+anise an@s
+aniseed an@sEd
+anisette an@set
+anita ~Et@
+anitec an@tek
+anitole an@t]l
+anixter an6kstP
+anja onj@
+anjelica anjel@k@
+ankara aNkP@
+ankara's aNkP@z
+ankeney @Nken/
+ankeny @NkEn/
+anker aNkP
+ankerium aNkV/}
+anklam aNkl}
+ankle aNk@l
+anklebone aNk@lbOn
+ankles aNk@lz
+anklet aNkl@t
+anklets aNkl@ts
+ankney aNkn/
+ankrom aNkr}
+ankrum aNkr}
+ann an
+ann's anz
+anna an@
+anna's an@z
+annabel an@bel
+annabella an@bel@
+annabelle an@b@l
+annable an@b@l
+annal an@l
+annals an@lz
+annamese an}Ez
+annan an~
+annandale an~dAl
+annapolis ~ap@lis
+annapolis's ~ap@lis@z
+annas an@z
+anne an
+anne's anz
+anneal ~El
+annealing ~El6N
+annelid an@l@d
+annelids an@l@dz
+annen an~
+annenberg an~bPg
+annese onAz/
+annett ~et
+annette ~et
+annex aneks
+annex ~eks
+annexation ancksAS~
+annexed anckst
+annexed ~ekst
+annexes aneks@z
+annexing ~eks6N
+annick an6k
+annie an/
+annie's anEz
+annihilate ~I@lAt
+annihilated ~I@lAt@d
+annihilation ~I@lAS~
+annis an/z
+anniston an@st~
+anniston an@s~
+anniversaries an@vVsP/z
+anniversary an@vVsP/
+anno an]
+annotate an@tAt
+annotated an@tAt@d
+annotated an@tAt@d
+annotates an@tAts
+annotates an@tAts
+annotating an@tAt6N
+annotating an@tAt6N
+annotation an@tAS~
+annotations an@tAS~z
+announce ~?ns
+announced ~?nst
+announcement ~?nsmcnt
+announcement ~?nsm~t
+announcements ~?nsm~ts
+announcer ~?nsP
+announcers ~?nsPz
+announces ~?ns@z
+announcing ~?ns6N
+announcment ~?nsm~t
+annoy ~<
+annoyance ~<~s
+annoyances ~<~s@z
+annoyed ~<d
+annoying ~<6N
+annoys ~<z
+annual anyU@l
+annualize anyUw@lIz
+annualized anyUw@lIzd
+annually anyU@l/
+annuals anU@lz
+annuities ~U@t/z
+annuity ~U@t/
+annuity ~U@t/
+annuity ~yU@t/
+annul an@l
+annular any@lP
+annulled an@ld
+annulment an@lm~t
+annum an}
+annunciata onUnCot@
+annunziata onUnz/ot@
+annunziato onUnz/ot]
+annunzio ~Unz/]
+annunzio ~unz/]
+anny an/
+anode anOd
+anodes anOdz
+anoint ~<nt
+anointed ~<n@d
+anointed ~<nt@d
+anomalies ~om@l/z
+anomalous ~om@l@s
+anomaly ~om@l/
+anomie an}/
+anona onOn@
+anonymity an~im@t/
+anonymous ~on}@s
+anonymously ~on}@sl/
+anora on{r@
+anorak anPak
+anorexia anPeks/@
+anorexic anPeks6k
+anorexics anPeks6ks
+anorthite an{rTIt
+another ~uTP
+another's ~uTPz
+anreder anredP
+anrig anr6g
+ansa ans@
+ansa's ans@z
+ansaid ansAd
+ansaldo ansold]
+ansang ansaN
+ansari ons)r/
+ansbacher anzbokP
+anschel anS@l
+anschluss anSl@s
+anschluss onSlUs
+anschutz anS@ts
+anscom ~skom
+anscomb ~skom
+anse ans
+ansel ~sel
+ansell ansel
+anselm ansclm
+anselma onselm@
+anselmi onselm/
+anselmo onselm]
+ansett anset
+ansgar ansgor
+ansgar's ansgorz
+anshan anS~
+ansin ansin
+ansley ansl/
+anson ans~
+ansonia ansOn/@
+anspach anspok
+anspaugh ~sp{
+anstead ansted
+anstett ~stet
+anstey anst/
+anstice onstis
+anstine onstEn/
+anstiss anstis
+answer ansP
+answer's ansPz
+answerable ansP@b@l
+answered ansPd
+answering ansP6N
+answers ansPz
+ant ant
+antacid antas@d
+antacids antas@dz
+antagonism antag~iz}
+antagonisms antag~iz}z
+antagonist antag~@st
+antagonistic antag~ist6k
+antagonists antag~@s
+antagonists antag~@ss
+antagonists antag~@sts
+antagonize antag~Iz
+antagonized antag~Izd
+antagonizing antag~Iz6N
+antal ant@l
+antar antP
+antar's antPz
+antarctic an)rt6k
+antarctic ant)rkt6k
+antarctica an)rt6k@
+antarctica ant)rkt6k@
+antarctica's ant)rkt6k@z
+antares ant,r/z
+antaya ontA@
+antczak antCak
+ante ant/
+anteater antEtP
+anteaters antEtPz
+antebellum ant@bel}
+antec antek
+antecedent ant@sEd~t
+antecedent antes@d~t
+antecedents ant@sEd~ts
+antecedents antes@d~ts
+anted ant/d
+anted ant@d
+antell antel
+antelope ant@lOp
+antemeridian ant}crid/~
+antemortem ant}{rt}
+antenna anten@
+antenna's anten@z
+antennae anten/
+antennas anten@z
+antenne anten
+antenucci ant~UC/
+anterior antir/P
+anteriormost antir/PmOst
+antes ant/z
+anthea anT/@
+anthem anT}
+anthems anT}z
+anthes anT@z
+anthiel anT/@l
+anthill anthil
+anthills anthilz
+anthis anTis
+anthologies anTol@j/z
+anthology anTol@j/
+anthon anT~
+anthony anT~/
+anthony's anT~/z
+anthracite anTr@sIt
+anthrax anTraks
+anthrobot anTr]but
+anthropocentric anTr@p@sentr6k
+anthropological anTr@p@loj@k@l
+anthropologist anTr@pol@j@st
+anthropologists anTr@pol@j@s
+anthropologists anTr@pol@j@ss
+anthropologists anTr@pol@j@sts
+anthropology anTr@pol@j/
+anthropomorphic anTr@p}{rf6k
+anti ant/
+anti antI
+anti-catholicism ant/k@T{l@siz}
+anti-catholicism antIk@T{l@siz}
+anti-federalist ant/fedr@l@st
+anti-federalists ant/fedr@l@s
+anti-federalists ant/fedr@l@ss
+anti-federalists ant/fedr@l@sts
+anti-infective ant/infekt6v
+antiabortion ant/@b{rS~
+antiabortion antI@b{rS~
+antiaircraft antI,rkraft
+antibacterial ant/baktir/@l
+antiballistic ant/b@list6k
+antibiotic ant/b/ot6k
+antibiotic antIbIot6k
+antibioticos ant/b/ot6k]s
+antibiotics ant/b/ot6ks
+antibiotics antIbIot6ks
+antibodies an@bod/z
+antibodies ant/bod/z
+antibodies ant@bod/z
+antibody ant/bod/
+antibody ant@bod/
+antic ant6k
+anticancer antEkansP
+anticancer antIkansP
+anticipate antis@pAt
+anticipated antis@pAt@d
+anticipates antis@pAts
+anticipating antis@pAt6N
+anticipation antis@pAS~
+anticipations antis@pAS~z
+anticipatory antis@p@t{r/
+anticlimactic ant/klImakt6k
+anticline ant6klIn
+antico ontEk]
+anticommunist ant/komy~@st
+anticompetitive ant6k}pet@t6v
+anticorruption antEkPupS~
+anticorruption antIkPupS~
+anticrime ant/krIm
+anticrime antIkrIm
+antics ant6ks
+antidepressant ant/d@pres~t
+antidepressants antEd@pres~ts
+antidepressants antId@pres~ts
+antidiscrimination ant/d@skrim~AS~
+antidiscrimination antId@skrim~AS~
+antidote ant@dOt
+antidrug ant@drug
+antidumping ant/dump6N
+antidumping antIdump6N
+antifraud ant/frod
+antifraud antIfrod
+antifreeze ant/frEz
+antifungal antEfuNg@l
+antifungal antIfuNg@l
+antigay antEgA
+antigay antIgA
+antigen ant@j~
+antigens ant6j~z
+antigone atig~/
+antigone's antig~Ez
+antigones antig~Ez
+antigovernment ant/guvPm~t
+antigovernment antIguvPm~t
+antigua antEgw@
+antihistamine ant/hist}~
+antihistamines ant/hist}~z
+antiknock ant/nok
+antill antil
+antilla ontil@
+antilles antil/z
+antilock ant/lok
+antilock antIlok
+antimissile antImis@l
+antioch ant/ok
+antioxidant ant/oks@d~t
+antioxidants ant/oks@d~ts
+antipathies antip@T/z
+antipathy antip@T/
+antipersonell antIpPs~el
+antiphon ant@fon
+antiphons ant@fonz
+antipodal antip@d@l
+antipoverty ant/povPt/
+antipoverty antIpovPt/
+antiquate ant@kwAt
+antiquated ant@kwAt@d
+antique antEk
+antiques antEks
+antiquities antikw@t/z
+antiquity antikw@t/
+antireformer ant/r@f{rmP
+antireformer antIr@f{rmP
+antireformers ant/r@f{rmPz
+antireformers antIr@f{rmPz
+antis antIz
+antisense ant/sens
+antisense antIsens
+antiseptic ant@sept6k
+antismoking ant/smOk6N
+antismoking antIsmOk6N
+antisocial antIsOS@l
+antisubmarine antIsubmPEn
+antitakeover ant/tAkOvP
+antitank ant/taNk
+antitax antEtaks
+antitax antItaks
+antitheft antETeft
+antitheft antITeft
+antithesis antiT@s@s
+antithetical ant@Tet6k@l
+antitoxin ant/toks~
+antitoxins ant/toks~z
+antitrust antItrust
+antiviral ant/vIr@l
+antiwar ant/w{r
+antiwar antIw{r
+antkowiak ~tk?/ak
+antle ant@l
+antler antlP
+antlered antlPd
+antlers antlPz
+antley antl/
+antoine ontwon
+antoinette antw~et
+antol ont{l
+antolik ant@l6k
+antolini ant]lEn/
+anton ant{n
+antonacci ont]noC/
+antone ontOn/
+antonelli ont]nel/
+antonellis ant~el@s
+antonetti ont]net/
+antoni ontOn/
+antonia antOn/@
+antonin ant~in
+antonini ont]nEn/
+antonini's ont]nEn/z
+antonio antOn/]
+antonio's antOn/Oz
+antoniou ont]nEU
+antoniu antOn/U
+antoniu's antOn/Uz
+antonius antOn/@s
+antonopoulos ant~op@l@s
+antonovich anton@v6C
+antonsen ~tons~
+antonson ant~s~
+antonucci ont]nUC/
+antony ant~/
+antoon antUn
+antos ont]z
+antosh ~toS
+antril antril
+antrim antrim
+antrobus antr@b@s
+ants ants
+antsy ants/
+anttila ontEl@
+antuna ontUn@
+antunes ontUncs
+antunez ontUncz
+antwerp antwPp
+antwine antwIn
+anvil anv@l
+anwar anwor
+anwar onwor
+anway ~wA
+anwell ~wel
+anwyl anwil
+anwyll anwil
+anxieties aNzI@t/z
+anxiety aNzI@t/
+anxious aNS@s
+anxious aNkS@s
+anxiously aNkS@sl/
+any en/
+anybody en/b@d/
+anybody's en/b@d/z
+anyhow en/h?
+anymore en/m{r
+anyon en/on
+anyone en/w~
+anyone's en/wunz
+anyplace en/plAs
+anything en/TiN
+anything's en/TiNz
+anytime en/tIm
+anyway en/wA
+anyways en/wAz
+anywhere en/hwer
+anywhere en/wer
+anza anz@
+anzaldua onzoldU@
+anzalone anz@lOn
+anzelmo onzelm]
+anzio anzE]
+anzus anz@s
+aoi ?/
+aoki AOk/
+aol AOel
+aol }V6k@onlIn
+aon A]n
+aorta A{rt@
+aortic A{rt6k
+aoshima ?SEm@
+aoshima A]SEm@
+aoun ?Un
+aoun ?~
+aoun's ?Unz
+aoun's ?~z
+aouzou ?yUzU
+aoyama ?yom@
+aoyama A]yom@
+apace @pAs
+apache @paC/
+apache's @paC/z
+apaches @paC/z
+apalachicola ap@laC@kOl@
+apalachicola's ap@laC@kOl@z
+aparicio apPis/]
+apart @p)rt
+apartheid @p)rtId
+apartheid @p)rtIt
+apartheid's @p)rtIdz
+apartheid's @p)rtIts
+apartment @p)rtm~t
+apartments @p)rtm~ts
+apathetic ap@Tet6k
+apathy ap@T/
+apatite ap@tIt
+apatites ap@tIts
+apc ApEsE
+apc's ApEsEz
+apcar apgor
+apcar apkor
+ape Ap
+apec Apek
+apec's Apeks
+apel opel
+apelike AplIk
+apennine ap~En
+aperture apPCP
+apes Aps
+apex Apeks
+apex's Apeks@z
+apfel apf@l
+apfelbaum apf@lb?m
+apgar apgP
+aphasia @fAZ@
+aphid Af@d
+aphid af@d
+aphids Af@dz
+aphids af@dz
+aphorism afPiz}
+aphorisms afPiz}z
+aphrodisiac afr]dEz/ak
+aphrodite afr@dIt/
+aphrodite's afr@dIt/z
+aphrodites afr@dIt/z
+apicella ap@sel@
+apiece @pEs
+aping Ap6N
+aplenty @plent/
+aplin aplin
+aplomb @plom
+apnea apn/@
+apocalypse @pok@lips
+apocalyptic @pok@lipt6k
+apocryphal @pokr@f@l
+apodaca op]dok@
+apogee ap@jE
+apolitical Ap@lit6k@l
+apolline ap@lIn
+apollinian ap@lin/~
+apollo @pol]
+apollo's @pol]z
+apollonian ap@lOn/~
+apologetic @pol@jet6k
+apologetically @pol@jet6kl/
+apologies @pol@j/z
+apologist @pol@j@st
+apologists @pol@j@s
+apologists @pol@j@ss
+apologists @pol@j@sts
+apologize @pol@jIz
+apologized @pol@jIzd
+apologizes @pol@jIz@z
+apologizing @pol@jIz6N
+apology @pol@j/
+aponte @pont/
+apopa @pOp@
+apopka @p{pk@
+apoplectic ap@plekt6k
+apoplexy ap@pleks/
+apostle @pos@l
+apostles @pos@lz
+apostol ap@st@l
+apostolopoul @post]l]pUl
+apostrophe @postr@f/
+apothecary @poT@ker/
+apotheosis @poT/Os@s
+app ap
+appalachia ap@laC/@
+appalachian ap@lAC~
+appalachian ap@lAS~
+appalachian ap@laC~
+appalachians ap@lAC~z
+appalachians ap@lAS~z
+appalachians ap@laC~z
+appall @p{l
+appalled @p{ld
+appalling @p{l6N
+appallingly @p{l6Nl/
+appalls @p{lz
+apparatchik apPaC6k
+apparatchiks apPaC6ks
+apparatus apPat@s
+apparatuses apPat@s@z
+apparel @p,r@l
+apparent @p,r~t
+apparently @p,r~tl/
+apparition apPiS~
+apparitions apPiS~z
+appeal @pEl
+appealable @pEl@b@l
+appealed @pEld
+appealing @pEl6N
+appealingly @pEl6Nl/
+appeals @pElz
+appear @pir
+appearance @pir~s
+appearances @pir~s@z
+appeared @pird
+appearing @pir6N
+appears @pirz
+appease @pEz
+appeased @pEzd
+appeasement @pEzm~t
+appeasing @pEz6N
+appel ap@l
+appelbaum ap@lb?m
+appelhans ap@lh~z
+appell ap@l
+appellate @pel@t
+appellate @pelAt
+appellation ap@lAS~
+appellations ap@lAS~z
+appelman ap@lm~
+appelt apclt
+append @pend
+appendage @pend6j
+appendages @pend6j@z
+appendectomies ap~dekt}/z
+appendectomy ap~dekt}/
+appended @pend@d
+appendix @pend6ks
+appendixes @pend6ks@z
+appenzeller ap~z@lP
+apperson apPs~
+appert apPt
+appetite ap@tIt
+appetites ap@tIts
+appetito ap@tEtO
+appetizer ap@tIzP
+appetizers ap@tIzPz
+appetizing ap@tIz6N
+appia ap/@
+appian ap/~
+applaud @pl{d
+applauded @pl{d@d
+applauding @pl{d6N
+applauds @pl{dz
+applause @pl{z
+apple ap@l
+apple's ap@lz
+applebaum ap@lb?m
+applebee ap@lbE
+applebee's ap@lbEz
+appleberry ap@lber/
+appleby ap@lb/
+applegarth apl6gorT
+applegate ap@lgAt
+appleman ap@lm~
+applequist apl6kwist
+apples ap@lz
+applesauce ap@ls{s
+appleseed ap@lsEd
+appleshare ap@lSer
+appleton ap@lt~
+applewhite ap@lwIt
+appleyard ap@lyord
+appliance @plI~s
+appliances @plI~s@z
+applicability apl@k@bil@t/
+applicable apl@k@b@l
+applicant apl6k~t
+applicant's apl6k~ts
+applicants apl6k~ts
+applicants' apl@k~ts
+application apl@kAS~
+applications apl@kAS~z
+applicator apl@kAtP
+applicators apl@kAtPz
+applied @plId
+applies @plIz
+applin aplin
+appling ap@l6N
+apply @plI
+applying @plI6N
+appoint @p<nt
+appointed @p<nt@d
+appointee @p<nt/
+appointee @p<ntE
+appointees @p<nt/z
+appointees @p<ntEz
+appointing @p<nt6N
+appointive @p<nt6v
+appointment @p<ntm~t
+appointments @p<ntm~ts
+appoints @p<nts
+apportion @p{rS~
+apportioned @p{rS~d
+apportioning @p{rS~6N
+apportionment @p{rS~m~t
+appraisal @prAz@l
+appraisals @prAz@lz
+appraise @prAz
+appraised @prAzd
+appraiser @prAzP
+appraisers @prAzPz
+appraises @prAz@z
+appraising @prAz6N
+appreciable @prES@b@l
+appreciably @prES@bl/
+appreciate @prES/At
+appreciated @prES/At@d
+appreciates @prES/Ats
+appreciating @prES/At6N
+appreciation @prES/AS~
+appreciative @prES/At6v
+appreciatively @prES/At6vl/
+apprehend apr@hend
+apprehended apr@hend@d
+apprehending apr@hend6N
+apprehension apr@henS~
+apprehensions apr@henS~z
+apprehensive apr/hens6v
+apprehensive apr@hens6v
+apprentice @prent@s
+apprenticed @prent@st
+apprentices @prent@s@z
+apprenticeship @prent@sSip
+apprenticeships @prent@sSips
+apprise @prIz
+apprised @prIzd
+approach @prOC
+approachable @prOC@b@l
+approached @prOCt
+approaches @prOC@z
+approaching @prOC6N
+approbation apr@bAS~
+appropriate @prOpr/@t
+appropriate @prOpr/At
+appropriated @prOpr/At@d
+appropriately @prOpr/@tl/
+appropriateness @prOpr/@tn@s
+appropriates @prOpr/Ats
+appropriating @prOpr/At6N
+appropriation @prOpr/AS~
+appropriations @prOpr/AS~z
+appropriator @prOpr/AtP
+appropriators @prOpr/AtPz
+approvable @prUv@b@l
+approval @prUv@l
+approvals @prUv@lz
+approve @prUv
+approved @prUvd
+approves @prUvz
+approving @prUv6N
+approvingly @prUv6Nl/
+approximate @proks}@t
+approximate @proks}At
+approximated @proks}At@d
+approximately @proks}@tl/
+approximates @proks}@ts
+approximates @proks}Ats
+approximating @proks}At6N
+approximation @proks}AS~
+approximations @proks}AS~z
+apps aps
+apra Apr@
+aprea opr/@
+apricot Apr@kot
+apricots apr@kots
+april Apr@l
+april's Apr@lz
+aprile opr@l
+aprodiva apr{dEv@
+apron Apr~
+aprons Apr~z
+apropos apr@pO
+apsell aps@l
+apsey aps/
+apso aps]
+apstar apstor
+apt apt
+apter aptP
+aptitude apt@tUd
+aptitudes apt@tUdz
+aptiva aptEv@
+aptly aptl/
+apuzzo opUz]
+aqaba @kob@
+aqazadeh ak@zode
+aqua akw@
+aqua okw@
+aquaculture akw@kulCP
+aqualung akw@l@N
+aquamarine okw}PEn
+aquanaut okw~ot
+aquanauts okw~ots
+aquarist @kw,r@st
+aquarists @kw,r@s
+aquarists @kw,r@ss
+aquarists @kw,r@sts
+aquarium @kw,r/}
+aquariums @kw,r/}z
+aquarius @kw,r/@s
+aquatic @kwat6k
+aquatic @kwot6k
+aqueduct akw@dukt
+aqueducts akw@dukts
+aqueous Akw/@s
+aquifer akw@fP
+aquifers akw@fPz
+aquila akw@l@
+aquilar okw/l)r
+aquilina okw/lEn@
+aquilino okw/lEn]
+aquinas @kwIn@s
+aquino @kEn]
+aquino's @kEn]z
+aquirre akwP
+aquitaine akw@tAn
+ar )r
+ara ar@
+arab ar@b
+arabe orobA
+arabella ar@bel@
+arabia PAb/@
+arabia's PAb/@z
+arabian PAb/~
+arabians PAb/~z
+arabic ar@b6k
+arabica Pab6k@
+arabichon @rab6S{n
+arabichon's @rab6S{nz
+arabicon @rab@k{n
+arabie Pab/
+arable ,r@b@l
+arabs ar@bz
+arabs' ar@bz
+arachnid Pakn@d
+arachnids Pakn@dz
+arafat ,r@fat
+arafat's ,r@fats
+arafat's or@fots
+aragon ,r@gon
+aragona orogOn@
+arai oro/
+araiza PAz@
+arakaki orokok/
+arakawa orokow@
+arakelian ar@kely~
+araki orok/
+aral )r@l
+arambula orombUl@
+aramco Pamk]
+aramid ,r}@d
+araminta ar}int@
+aramis ,r}is
+aramony )r}On/
+aramony ,r}On/
+aran ,r~
+arana oran@
+aranda Pand@
+arango oroNg]
+aransas Pans@s
+arant )r~t
+arantza @rontz@
+aranyos PonyOs
+arapaho Pap@hO
+araskog Paskog
+araskog Pasog
+arata orot@
+arau @r?
+araujo or?y]
+aravind )rv~d
+araya PI@
+arb )rb
+arba )rb@
+arbat )rbat
+arbaugh )rb{
+arbed )rb@d
+arbeiter )rbItP
+arbel )rb@l
+arbella orbel@
+arbiter )rb@tP
+arbiters )rb@tPz
+arbitrage )rb@troZ
+arbitrager )rb@troZP
+arbitragers )rb@troZPz
+arbitragers' )rb@troZPz
+arbitrageur )rb@troZP
+arbitrageurs )rb@troZPz
+arbitraging )rb@troj6N
+arbitrarily )rb@trer@l/
+arbitrariness )rb@trer/n@s
+arbitrary )rb@trer/
+arbitrate )rb@trAt
+arbitrated )rb@trAt@d
+arbitrates )rb@trAts
+arbitrating )rb@trAt6N
+arbitration orb@trAS~
+arbitrations orb@trAS~z
+arbitrator )rb@trAtP
+arbitrator's )rb@trAtPz
+arbitrators )rb@trAtPz
+arbitrators' )rb@trAtPz
+arbitron )rb@tron
+arbo )rb]
+arbogast orbOgost
+arboleda orb]led@
+arbor )rbP
+arboreal orb{r/@l
+arboretum orbPEt}
+arborville )rbPv@l
+arbour )rbP
+arbs )rbz
+arbuckle )rb@k@l
+arbuckles )rb@k@lz
+arbuthnot orbuTn@t
+arby )rb/
+arby's )rb/z
+arc )rk
+arcade orkAd
+arcades orkAdz
+arcadia orkAd/@
+arcadian orkAd/~
+arcadians orkAd/~z
+arcana orkan@
+arcand )rk~d
+arcane orkAn
+arcanum )rk~}
+arcanum's )rk~}z
+arcaro ork)r]
+arcata orkot@
+arce )rs
+arcement orsAm~t
+arceneaux )rs~]
+arceo )rs/]
+arch )rC
+archaeological ork/@loj6k@l
+archaeologist ork/ol@j@st
+archaeologists ork/ol@j@s
+archaeologists ork/ol@j@ss
+archaeologists ork/ol@j@sts
+archaeology ork/ol@j/
+archaic orkA6k
+archambault )rS}b]
+archambeau )rS}bO
+archambeault )rS}b]
+archangel orkAnj@l
+archangels orkAnj@lz
+archard orS)rd
+archbishop orCbiS@p
+archbold )rCbOld
+archdiocese orCdI@s/z
+archdiocese orCdI@s@s
+archduke )rCdUk
+arched )rCt
+archenemy orCen}/
+archeological ork/@loj6k@l
+archeology ork/ol@j/
+archer )rCP
+archer's )rCPz
+archerd )rkPd
+archery )rCP/
+arches )rC@z
+archetypal orktIp@l
+archetype )rk@tIp
+archetypes )rk@tIps
+archey )rk/
+archibald )rC@b{ld
+archibeque )rS@b/k
+archie )rC/
+archimedes ork}Ed/z
+arching )rC6N
+archipelago orC@p@lAgO
+archipelago ork@pel@gO
+architect )rk@tekt
+architect's )rk@tekts
+architects )rk@tekts
+architectural ork@tekCP@l
+architecturally ork@tekCP@l/
+architecture )rk@tekCP
+architectures )rk@tekCPz
+architrave )rk@trAv
+architraves )rk@trAvz
+archival orkIv@l
+archive )rkIv
+archives )rkIvz
+archivist )rk@v@st
+archivist )rkIv@st
+archivists )rk@v@s
+archivists )rk@v@ss
+archivists )rk@v@sts
+archivists )rkIv@sts
+archly )rCl/
+archrival )rCrIv@l
+archrivals )rCrIv@lz
+archuleta orkUlet@
+archuletta orkUlet@
+archway )rCwA
+arcidiacono orC/d/okOn]
+arcieri orCir/
+arciniega orC/nEg@
+arco )rk]
+arco's )rk]z
+arcola orkOl@
+arcos )rk]z
+arcosanti ork@sant/
+arcs )rks
+arctic )rkt6k
+arctic )rt6k
+arcturus orktV@s
+arcturus orktqr@s
+arcuri orkqr/
+ard )rd
+arda )rd@
+ardath )rd@T
+ardeen ordEn
+ardelia ordel/@
+ardella ordel@
+ardelle ordel
+arden )rd~
+arden's )rd~z
+ardene )rdEn
+ardent )rd~t
+ardently )rd~tl/
+ardin )rdin
+ardine ordEn/
+ardis )rdis
+ardith )rd@T
+ardito ordEt]
+ardley )rdl/
+ardmore )rdm{r
+ardoin ord<n
+ardolino ord]lEn]
+ardolph )rdOlf
+ardor )rdP
+ardra )rdr@
+ardrey )rdr/
+ardshiel )rdSEl
+ardsley )rdzl/
+arduini ordUEn/
+arduous )rjU@s
+are )r
+are P
+area ,r/@
+area's ,r/@z
+areas ,r/@z
+arebalo orcbol]
+arechiga orckEg@
+arehart arihort
+arel orel
+arellanes ar@lAnz
+arellano orclon]
+aren )r~
+aren't )rnt
+aren't )r~t
+arena PEn@
+arena's PEn@z
+arenaball PEn@b{l
+arenas PEn@z
+arencibia orcnCEb/@
+arend Pend
+arends Pendz
+arendsee PendsE
+arendt ,rcnt
+arenella or~el@
+arenella's or~el@z
+arens )r~z
+arens ,r~z
+arenson ar~s~
+arent )r~t
+arentz ar~ts
+arenz )rAnz
+ares )rz
+areta oret@
+aretha PET@
+aretina orctEn@
+aretsky cretsk/
+aretta oret@
+arevalo orAvol]
+arey ar/
+argabright )rg@brIt
+argall )rg@l
+arganbright organbrIt
+argenbright )rg~brIt
+argent )rj~t
+argenta orjent@
+argentieri orjcntir/
+argentina orj~tEn@
+argentina's orj~tEn@z
+argentinas orj~tEn@z
+argentine )rj~tEn
+argentines )rj~tEnz
+argentinian orj~tin/~
+argentinians orj~tin/~z
+argento orjent]
+argiro orjir]
+argo )rg]
+argo's )rg]z
+argon )rgon
+argonaut )rg~{t
+argonaut's )rg~{ts
+argonauts )rg~{ts
+argonne )rgOn
+argonne )rgon
+argosy )rg@s/
+argosystem )rg]sist}
+argosystems )rg]sist}z
+argot )rg@t
+arguable )rgyU@b@l
+arguably )rgyU@bl/
+argue )rgyU
+argued )rgyUd
+arguelles orgAlcs
+arguello orgel]
+argues )rgyUz
+argueta orgAt@
+arguijo orgwEy]
+arguing )rgyU6N
+argument )rgy}~t
+argument's )rgy}~ts
+argumentation orgy}cntAS~
+argumentative orgy}ent@t6v
+arguments )rgy}~ts
+argus )rg@s
+argyle )rgIl
+argyll orgIl
+argyropoulos orj6rop]l@s
+ari )r/
+aria )r/@
+ariadne er/adn/
+arian ar/~
+ariana or/an@
+ariane er/an
+arianespace er/anspAs
+arianism ar/~iz}
+arianna or/an@
+arianna's or/an@z
+arias )r/@z
+arias's )r/@s@z
+aric ar6k
+arico orEk]
+arid ar@d
+arida @rEd@
+arie ,r/
+ariel ,r/@l
+ariella or/el@
+aries ,r/z
+arington )r6Nt~
+ariola or/Ol@
+aris PEs
+arise PIz
+arisen Piz~
+arises PIz@z
+arising PIz6N
+arison ,r@s~
+arispe orEsp/
+arista Pist@
+aristech ,r@stek
+aristede or@stEd
+aristede's or@stEdz
+aristide or@stEd
+aristide's or@stEdz
+aristocracy er@stokr@s/
+aristocrat Pist@krat
+aristocratic Pist@krat6k
+aristocrats Pist@krats
+aristotelian Pist@tEl/~
+aristotle ,r@stot@l
+aristotle's ,r@stot@lz
+arithmetic PiTm@tik
+arithmetic eriTmet6k
+ariza orEz@
+arizmendi or/zmend/
+arizona er@zOn@
+arizona's er@zOn@z
+arizonan Piz]n~
+arizonans Piz]n~z
+arjo )rj]
+arjo )ry]
+ark )rk
+arkadelphia ork@delf/@
+arkadi )rk@d/
+arkady orkAd/
+arkansan orkanz~
+arkansans orkanz~z
+arkansas )rk~so
+arkansas' )rk~soz
+arkansas's )rk~soz
+arkin )rkin
+arkin's )rkinz
+arkla )rkl@
+arkla's )rkl@z
+arko )rk]
+arkose orkOs
+arkwright )rkrIt
+arlana orlan@
+arlauskas orl{sk@s
+arledge )rl6j
+arleen orlEn
+arlen )rl~
+arlena )rlcn@
+arlene )rlEn
+arlene's )rlEnz
+arleta )rlct@
+arlette orlet
+arley )rl/
+arlie )rl/
+arlin )rlin
+arlinda orlind@
+arline )rlIn
+arlington )rl6Nt~
+arlington's )rl6Nt~z
+arlt )rlt
+arlyne )rlIn
+arm )rm
+arm's )rmz
+armacost )rm@k{st
+armacost's )rm@k{sts
+armada ormod@
+armadillo orm@dil]
+armadillos orm@dil]z
+armageddon orm@ged~
+armagost ormog]st
+armament )rm}~t
+armaments )rm}~ts
+arman )rm~
+armand )rm~d
+armand ormond
+armando ormond]
+armandt )rmant
+armani ormon/
+armantrout )rm~tr?t
+armaro orm)r]
+armas )rm@z
+armato ormot]
+armband )rmband
+armbands )rmbandz
+armbrister )rmbPistP
+armbrister )rmbristP
+armbrust )rmbr@st
+armbruster )rmbr@stP
+armbruster )rmbrUstP
+armchair )rmCer
+armchairs )rmCerz
+armco )rmkO
+armco's )rmk]z
+armed )rmd
+armel ormel
+armellino ormclEn]
+armen )rm~
+armendarez ormAnd)rcz
+armendariz ormAnd)r/z
+armenia ormEn/@
+armenia's ormEn/@z
+armenian ormEn/~
+armenians ormEn/~z
+arment )rm~t
+armenta orment@
+armentor orm~t{r
+armentrout )rm~tr?t
+armer )rmP
+armes )rmz
+armested )rm@sted
+armetta ormet@
+armey )rm/
+armey's )rm/z
+armfield )rmfEld
+armida ormEd@
+armies )rm/z
+armiger )rm@gP
+armijo ormEy]
+armilla ormil@
+armin )rm~
+armina ormEn@
+armine ormEn/
+arming )rm6N
+armington )rm6Nt~
+arminie )rm~/
+armistead )rm@sted
+armistice )rm@st@s
+armitage )rm@t6j
+armold )rmOld
+armon )rm~
+armond )rm~d
+armonk )rm@Nk
+armor )rmP
+armored )rmPd
+armories )rmP/z
+armory )rmP/
+armour )rmP
+armpit )rmpit
+armpits )rmpits
+armrest )rmrest
+armrests )rmres
+armrests )rmress
+armrests )rmrests
+arms )rmz
+armstead )rmsted
+armstrad )rmstrad
+armstrong )rmstroN
+armstrong's )rmstr{Nz
+armtec )rmtek
+armtek )rmtek
+armtek's )rmteks
+armwood )rmwqd
+army )rm/
+army's )rm/z
+arn )rn
+arnalda ornold@
+arnaldo ornold]
+arnall )rn@l
+arnatt ornat
+arnaud ornO
+arnault ornO
+arnaz ornez
+arndt )rnt
+arne )rn
+arnell )rn@l
+arnelle ornel
+arnelle's ornelz
+arner )rnP
+arnesen ornEz~
+arneson )rn@s~
+arnett ornet
+arnette ornet
+arney )rn/
+arnhold )rnhOld
+arnholt )rnhOlt
+arnie )rn/
+arnn )rn
+arno )rn]
+arnold )rn@ld
+arnold's )rn@ldz
+arnoldi ornOld/
+arnolds )rn@ldz
+arnoldy )rn]ld/
+arnolphe ornolf/
+arnone ornOn/
+arnot )rn@t
+arnott )rnot
+arnotts )rnots
+arnow )rn]
+arnox )rnoks
+arns )rnz
+arnst )rnst
+arnstein )rnst/n
+arnstein )rnstIn
+arntson )rnts~
+arntz )rnts
+arntzen )rntz~
+arnulfo ornulf]
+arnwine )rnwIn
+arnzen )rnz~
+aro )r]
+arocha orOk@
+arocho orOk]
+aroma POm@
+aromas POm@z
+aromatic er}at6k
+aron ,r~
+arone POn
+aronhalt ar~h@lt
+aronoff ,r~{f
+aronow POn]
+aronowitz Pon@wits
+arons )r]nz
+aronson ,r~s~
+aronstein ,r~stEn
+aronstein ,r~stIn
+arora or{r@
+aros )r]z
+arose POz
+around P?n
+around P?nd
+arousal P?z@l
+arouse P?z
+aroused P?zd
+arouses P?z@z
+arousing P?z6N
+arp )rp
+arpa )rp@
+arpanet )rp~et
+arpin )rpin
+arpino orpEn]
+arps )rps
+arquette orket
+arquilla orkwil@
+arraign PAn
+arraigned PAnd
+arraignment PAnm~t
+arraignments PAnm~ts
+arrange PAnj
+arranged PAnjd
+arrangement PAnjm~t
+arrangements PAnjm~ts
+arranger PAnjP
+arranges PAnj@z
+arranging PAnj6N
+arrant ar~t
+arrants ar~ts
+arrasmith ,r@smiT
+array PA
+arrayed PAd
+arrays PAz
+arrearage PEr6j
+arrearages Pir6j@z
+arrears Pirz
+arredondo orcdOnd]
+arreguin orAgwEn
+arrendondo orcndOnd]
+arreola or/ol@
+arrest Pest
+arrested Pest@d
+arresting Pest6N
+arrests Pests
+arrhythmia PiTm/@
+arrhythmias PiTm/@z
+arriaga or/og@
+arrick ar6k
+arrieta orEt@
+arrigo orEg]
+arrigoni or/gOn/
+arrington ,r6Nt~
+arriola or/Ol@
+arriortua or/{rtU@
+arris ar@s
+arrival PIv@l
+arrivals PIv@lz
+arrive PIv
+arrived PIvd
+arrives PIvz
+arriving PIv6N
+arrogance ,r@g~s
+arrogant ,r@g~t
+arrogantly ,r@g~tl/
+arrogate ar]gAt
+arrow ar]
+arrow's ar]z
+arrowhead ar]hed
+arrowheads ar]hedz
+arrowood ar]wqd
+arrowroot ar]rUt
+arrows ar]z
+arrowsmith ar]smiT
+arrowsmith's ar]smiTs
+arroyo P<]
+arroyo's P<]z
+arruda orUd@
+arrupe arUp
+arsdale )rzdAl
+arsenal )rs~@l
+arsenals )rs~@lz
+arsenault )rs~]
+arseneau )rs~]
+arseneault )rs~]
+arsenic )rs~6k
+arsenide )rs~Id
+arsenio orsEn/]
+arslanian orslAn/~
+arson )rs~
+arsonist )rs~@st
+arsonists )rs~@s
+arsonists )rs~@ss
+arsonists )rs~@sts
+arsons )rs~z
+art )rt
+art's )rts
+artale ortol/
+artcarve )rtkorv
+artcarved )rtkorvd
+arteaga ortEg@
+artemas )rt}@z
+artemus )rt}@s
+arter )rtP
+arterberry )rtPber/
+arterburn )rtPbVn
+arterial ortir/@l
+arteries )rtP/z
+arteriosclerosis ortir/]sklPOs@s
+artery )rtP/
+artesian ortEZ~
+artful )rtf@l
+artfully )rtf@l/
+arth )rT
+arthritic orTrit6k
+arthritis orTrIt@s
+arthropod )rTr@pod
+arthropods )rTr@podz
+arthur )rTP
+arthur's )rTPz
+arthurian orTqr/~
+arthurs )rTPz
+artichoke )rt@COk
+artichokes )rt6COks
+article )rt@k@l
+article's )rt6k@lz
+articles )rt@k@lz
+articulate ortiky@l@t
+articulate ortiky@lAt
+articulated ortiky@lAt@d
+articulates ortiky@l@ts
+articulating ortiky@lAt6N
+articulation ort6ky@lAS~
+articulatory ortiky@l@t{r/
+artie )rt/
+artifact )rt@fakt
+artifacts )rt@fakts
+artifice )rt@fis
+artificial ort@fiS@l
+artificially ort@fiS@l/
+artillery ortilP/
+artino ortEn]
+artiodactyl ort/]dakt@l
+artiodactyls ort/]dakt@lz
+artis )rtis
+artisan )rt@z~
+artisans )rt@z~z
+artist )rt@st
+artist's )rt@sts
+artistic ortist6k
+artistically ortist6kl/
+artistry )rt@str/
+artists )rt@s
+artists )rt@ss
+artists )rt@sts
+artists' )rt@s
+artists' )rt@ss
+artists' )rt@sts
+artley )rtl/
+artman )rtm~
+artois ortwo
+arton )rton
+artra )rtr@
+artra's )rtr@z
+artrip )rtrip
+arts )rts
+artsy )rts/
+artur )rtqr
+arturo ortqr]
+artus )rt@s
+artwork )rtwVk
+artworks )rtwVks
+arty )rt/
+arty's )rt/z
+artz )rts
+artzt )rtst
+aruba PUb@
+arum ,r}
+arunachalam orUn@Col}
+arundel ,r~d@l
+arup PUp
+arva )rv@
+arvad orvad
+arval )rv@l
+arvanitis orv~Itis
+arvay )rvA
+arve )rv
+arvel orvel
+arvey )rv/
+arvid )rv@d
+arvida orvEd@
+arvida's orvEd@z
+arvidson )rv@ds~
+arvin )rvin
+arvin's )rvinz
+arvind )rvind
+arvizu orvEzU
+arwood )rwqd
+arx )rks
+ary ,r/
+aryan )r/~
+arzama orzom@
+arzamas orzom@z
+arzate )rzAt
+arzola orzOl@
+arzt )rzt
+as az
+as ez
+asa os@
+asaf osof
+asahan as@han
+asahara as@har@
+asahi @soh/
+asamera as},r@
+asarco @s)rk]
+asarco's @s)rk]z
+asaro os)r]
+asat azat
+asato osot]
+asay @sA
+asbell asbcl
+asberry asbcr/
+asbestec asbestck
+asbestos asbest@s
+asbestosis asbestOsis
+asbill @sbil
+asbridge @sbrij
+asbury azber/
+asby asb/
+ascap askap
+ascencio osCenC/]
+ascend @send
+ascendance @send~s
+ascendancy @send~s/
+ascendant @send~t
+ascended @send@d
+ascendency @send~s/
+ascending @send6N
+ascends @sendz
+ascension @senS~
+ascent @sent
+ascertain asPtAn
+ascertained asPtAnd
+ascertaining asPtAn6N
+ascetic @set6k
+asch aS
+asche aS
+aschenbach aS~bok
+aschenbrenner aS~brinP
+ascher aSP
+aschoff askh{f
+ascii ask/
+asclad asklad
+ascorbic @sk{rb6k
+ascot askot
+ascott @skot
+ascribe @skrIb
+ascribed @skrIbd
+ascribes @skrIbz
+asda asd@
+asea @zE@
+asea AesEA
+asean @zE~
+asean AesEAen
+asean azA~
+aselma @selm@
+aseltine oscltEn/
+asencio @sens/]
+aseritis @s,r@tis
+ash aS
+ashame @SAm
+ashamed @SAmd
+ashare aSer
+ashbaugh aSb{
+ashbrook aSbrqk
+ashburn aSbPn
+ashbury aSbcr/
+ashby aSb/
+ashcraft aSkraft
+ashcreek aSkrEk
+ashcroft aSkr{ft
+ashdown aSd?n
+ashe aS
+ashe's aS@z
+ashen aS~
+ashenberg aS~bPg
+ashenfelter aS~feltP
+asher aSP
+ashes aS@z
+asheville aSvil
+ashey aS/
+ashford aSfPd
+ashis @SEz
+ashish @SES
+ashland aSl~d
+ashland's aSl~dz
+ashley aSl/
+ashley's aSl/z
+ashlin aSlin
+ashline aSlIn
+ashlock aSlok
+ashman aSm~
+ashmead aSmEd
+ashmore aSm{r
+ashok aSok
+ashore @S{r
+ashrawi aSrow/
+ashtec aStck
+ashtec's aStcks
+ashton aSt~
+ashton's aSt~z
+ashtray aStrA
+ashtrays aStrAz
+ashur aSP
+ashurst aSPst
+ashville aSvil
+ashwell aSwel
+ashwood aSwqd
+ashworth aSwVT
+ashy aS/
+asia AZ@
+asia's AZ@z
+asiain Az/An
+asiamerica As/},r6k@
+asian AZ~
+asians AZ~z
+asiatic AZ/at6k
+asiaweek AZ@wEk
+asic az6k
+asics az6ks
+aside @sId
+asides @sIdz
+asiel az/@l
+asimov as}ov
+asimov az}ov
+asimov's as}ovz
+asimov's az}ovz
+asimow as}]
+asinine as~In
+ask ask
+aska ask@
+askance @skans
+asked askt
+asked {skt
+asker askP
+asker's askPz
+askers askPz
+askers' askPz
+askers's askPz@z
+askew @skyU
+askey @skE
+askin @skin
+askin's askinz
+asking ask6N
+askington ask6Nt~
+askins @skinz
+asko ask]
+askoldov @skOldov
+askoldov's @skOldovz
+askren askP~
+asks asks
+aslanian @slAn/~
+asleep @slEp
+asleson asl@s~
+aslin @slin
+asman asm~
+asmara azm)r@
+asmaras azm)r@z
+asmus @zmUs
+asmussen @zmus~
+asner asnP
+asp asp
+asparagus @sp,r@g@s
+aspartame aspPtAm
+aspect aspekt
+aspects aspekts
+aspen asp~
+aspen's asp~z
+aspens asp~z
+asper aspP
+aspersion @spVZ~
+aspersions @spVZ~z
+asphalt asf{lt
+aspin aspin
+aspin's aspinz
+aspinall asp~{l
+aspinwall asp~w{l
+aspirant @spIr~t
+aspirant aspP~t
+aspirants @spIr~s
+aspirants @spIr~ts
+aspirants aspP~s
+aspirants aspP~ts
+aspirate asp@rAt
+aspirated asp@rAt@d
+aspirates asp@rAts
+aspiration aspPAS~
+aspirations aspPAS~z
+aspire @spIr
+aspired @spIrd
+aspires @spIPz
+aspirin aspr~
+aspirin's aspr~z
+aspiring @spIr6N
+asplund aspl~d
+aspnes aspncz
+asquith askwiT
+ass as
+assad @sod
+assad's @sodz
+assaf @saf
+assail @sAl
+assailant @sAl~t
+assailant's @sAl~ts
+assailants @sAl~ts
+assailed @sAld
+assailing @sAl6N
+assails @sAlz
+assante osont/
+assassin @sas~
+assassin's @sas~z
+assassinate @sas~At
+assassinated @sas~At@d
+assassinating @sas~At6N
+assassination @sas~AS~
+assassinations @sas~AS~z
+assassins @sas~z
+assault @s{lt
+assaulted @s{lt@d
+assaulting @s{lt6N
+assaultive @s{lt6v
+assaults @s{lts
+assay as/
+assayer asAP
+assed ast
+asselin as@l~
+asselstine as@lstIn
+assemblage @sembl@j
+assemble @semb@l
+assembled @semb@ld
+assembler @semblP
+assemblers @semblPz
+assembles @semb@lz
+assemblies @sembl/z
+assembling @semb@l6N
+assembling @sembl6N
+assembly @sembl/
+assembly's @sembl/z
+assemblyman @sembl/man
+assemblyman @sembl/m~
+assemblymen @sembl/mcn
+assemblywoman @sembl/wqm~
+assent @sent
+assert @sVt
+asserted @sVt@d
+assertedly @sVt@dl/
+asserting @sVt6N
+assertion @sVS~
+assertions @sVS~z
+assertive @sVt6v
+assertively @sVt6vl/
+assertiveness @sVt6vn@s
+asserts @sVts
+asses as@z
+assess @ses
+assessed @sest
+assesses @ses@z
+assessing @ses6N
+assessment @sesm~t
+assessments @sesm~ts
+assessor @sesP
+assessors @sesPz
+asset aset
+assets asets
+assets' ascts
+assicurazioni @sEkPaz/On/
+assiduous @sidw@s
+assiduously @sidw@sl/
+assign @sIn
+assigned @sInd
+assigning @sIn6N
+assignment @sInm~t
+assignment's @sInm~ts
+assignments @sInm~ts
+assigns @sInz
+assimilate @sim@lAt
+assimilated @sim@lAt@d
+assimilating @sim@lAt6N
+assimilation @sim@lAS~
+assisi @sEs/
+assist @sist
+assistance @sist~s
+assistant @sist~t
+assistants @sist~ts
+assisted @sist@d
+assisting @sist6N
+assists @sis
+assists @siss
+assists @sists
+assocation as@kAS~
+associate @sOS/@t
+associate @sOS/At
+associate @sOs/@t
+associate @sOs/At
+associate's @sOS/@ts
+associate's @sOs/@ts
+associated @sOS/At@d
+associated @sOs/At@d
+associates @sOS/@ts
+associates @sOS/Ats
+associates @sOs/@ts
+associates @sOs/Ats
+associates' @sOS/@ts
+associates' @sOs/@ts
+associating @sOs/At6N
+association @sOS/AS~
+association @sOs/AS~
+association's @sOS/AS~z
+associations @sOS/AS~z
+associations @sOs/AS~z
+associes as@s/z
+assort @s{rt
+assorted @s{rt@d
+assortment @s{rtm~t
+assuage @swAj
+assuaged @swAjd
+assubel as@bel
+assume @sUm
+assumed @sUmd
+assumes @sUmz
+assuming @sUm6N
+assumption @sumpS~
+assumptions @sumpS~z
+assurance @Sqr~s
+assurances @Sqr~s@z
+assurances @Sqr~ts@z
+assuras @Sqr@s
+assure @Sqr
+assured @Sqrd
+assuredly @Sqr@dl/
+assures @Sqrz
+assuring @Sqr6N
+assyria @sir/@
+assyrian @sir/~
+assyrians @sir/~z
+ast ast
+asta ost@
+astaire @st,r
+aster astP
+asterisk astPisk
+asteroid astP<d
+asteroid's astP<dz
+asteroids astP<dz
+asters astPz
+asthma azm@
+asthmatic azmat6k
+asthmatics csTmet6ks
+astigmatism @stigm@tiz}
+astin @stin
+astle as@l
+astley astl/
+aston ast~
+astonish @ston6S
+astonished @ston6St
+astonishing @ston6S6N
+astonishingly @ston6S6Nl/
+astonishment @ston6Sm~t
+astor astP
+astor's astPz
+astorga ost{rg@
+astoria ast{r/@
+astorino ost{rEn]
+astound @st?nd
+astounded @st?nd@d
+astounding @st?nd6N
+astoundingly @st?nd6Nl/
+astounds @st?ndz
+astra astr@
+astra's astr@z
+astraddle @strad@l
+astrakhan astr@kon
+astral astr@l
+astray @strA
+astred astPd
+astrid astr@d
+astride @strId
+astringent @strinj~t
+astringents @strinj~ts
+astro astr]
+astrodome astr@dOm
+astrogeology astr@jEol@j/
+astrologer @strol@jP
+astrologers @strol@jPz
+astrological astr@loj6k@l
+astrology @strol@j/
+astronaut astr~ot
+astronaut's astr~ots
+astronautic astr~ot6k
+astronautical astr~ot6k@l
+astronautics astr~ot6ks
+astronauts astr~{ts
+astronauts' astr~{ts
+astronomer @stron}P
+astronomers @stron}Pz
+astronomical astr~om6k@l
+astronomically astr~om6kl/
+astronomy @stron}/
+astrophotography astr]f@togr@f/
+astrophysicist astr]fiz@sist
+astrophysics astr]fiz6ks
+astros astr]s
+astrotech astr]tek
+astroturf astr]tVf
+astute @stUt
+astutely @stUtl/
+astuteness @stUtn@s
+asuncion @sunS~
+asunder @sundP
+aswin @swin
+asylum @sIl}
+asymmetrical As}etr6k@l
+asymmetries Asim@tr/z
+asymmetry Asim@tr/
+asymptomatic Asimpt}at6k
+asymptote as}tOt
+asymptotes as}tOts
+asynchronous AsiNkr~@s
+at at
+at-bat atbat
+at-bats atbats
+ata ot@
+atalanta at@lant@
+atalaya otolA@
+atalia otol/@
+atalie at@l/
+atamian @tAm/~
+atari @t)r/
+atari's @t)r/z
+ataturk at@tVk
+ataturk's at@tVks
+atavism at@viz}
+atavistic at@vist6k
+ataxia Ataks/@
+ataxia's Ataks/@z
+atcheson aC@s~
+atchinson aC~s~
+atchison aC@s~
+atchley aCl/
+atco atk]
+atcor atk{r
+ate At
+atek Atek
+aten At~
+atencio @tens/]
+ater AtP
+ates Ats
+atha aT@
+athalia ATal/@
+athanas ATan@z
+athanassiou oT~@sEU
+athans aT~z
+athas AT@z
+athearn ATPn
+atheism AT/iz}
+atheist AT/@st
+atheistic AT/ist6k
+atheists AT/@s
+atheists AT/@ss
+atheists AT/@sts
+athena @TEn@
+athenaeum aT~E}
+athenaios aT~I]s
+atheneum aT~Um
+athenian @TEn/~
+athenians @TEn/~z
+athens aT~z
+atherosclerosis aTP]sklPOs@s
+atherton aTPt~
+athey aT/
+athie AT/
+athlete aTlEt
+athlete's aTlEts
+athletes aTlEts
+athletes' aTlEts
+athletic aTlet6k
+athletically aTlet@kl/
+athleticism aTlet@sizm
+athletics aTlet6ks
+athlone aTlOn
+athwart @Tw{rt
+atico at6kO
+atienza otEnz@
+atilano ot/lon]
+atkerson atkPs~
+atkin @tkin
+atkins atkinz
+atkins's atkinz@z
+atkinson atk~s~
+atkinson's atk~s~z
+atkison atk@s~
+atkisson atk@s~
+atla atl@
+atlanta @tlan@
+atlanta @tlant@
+atlanta atlan@
+atlanta atlant@
+atlanta's atlan@z
+atlanta's atlant@z
+atlantan atlant~
+atlantan atlan~
+atlantans atlant~z
+atlantans atlan~z
+atlantic @tlan6k
+atlantic @tlant6k
+atlantic's @tlan6ks
+atlantic's @tlant6ks
+atlantica atlant6k@
+atlantico atlant6k]
+atlantis atlan@s
+atlantis atlant@s
+atlantis' atlant@s
+atlantis' atlant@s@z
+atlantis's atlant@s@z
+atlas atl@s
+atlas's atl@s@z
+atlases atlAs@z
+atler atlP
+atley atl/
+atmel atm@l
+atmosphere atm@sfir
+atmospheric atm@sf,r6k
+atmospherics atm@sf,r6ks
+atnip atn@p
+atocha @toC@
+atoll atol
+atom at}
+atomic @tom6k
+atomizer at}IzP
+atoms at}z
+aton @ton
+atonal AtOn@l
+atone @tOn
+atonement @tOnm~t
+atop @top
+ator etP
+atorino atPEn]
+atp AtEpE
+atra Atr@
+atria Atr/@
+atrium Atr/}
+atrocious @trOS@s
+atrocities @tros@t/z
+atrocity @tros@t/
+atrophied atr@f/d
+atrophy atr@f/
+atsushi osUS/
+atsushi ossUS/
+atta at@
+attaboy at@b<
+attaboys at@b<z
+attach @taC
+attache at@SA
+attached @taCt
+attaches @taC@z
+attaching @taC6N
+attachment @taCm~t
+attachments @taCm~ts
+attack @tak
+attacked @takt
+attacker @takP
+attackers @takPz
+attacking @tak6N
+attacks @taks
+attain @tAn
+attainable @tAn@b@l
+attainder @tAndP
+attained @tAnd
+attaining @tAn6N
+attainment @tAnm~t
+attains @tAnz
+attali @tol/
+attalla @tal@
+attanasio otonos/]
+attar atP
+attard atPd
+attardo ot)rd]
+attaway at@wA
+atteberry atbcr/
+attebery @tebP/
+attebury atbcr/
+attempt @tempt
+attempted @tempt@d
+attempting @tempt6N
+attempts @temps
+attempts @tempts
+attenborough atunbP]
+attend @tend
+attendance @tend~s
+attendant @tend~t
+attendants @tend~ts
+attendants' @tend~ts
+attended @tend@d
+attendee @tend/
+attendees @tend/z
+attending @tend6N
+attends @tendz
+attention @tenS~
+attentions @tenS~z
+attentive @tent6v
+attentively @tent6vl/
+attentiveness @tent6vn@s
+attenuate @tenyUAt
+attenuated @tenyUAt@d
+attenuates @tenyUAts
+atterberry atPbcr/
+atterbury atPber/
+attermann atPm~
+attest @test
+attested @test@d
+attesting @test6N
+attests @tes
+attests @tess
+attests @tests
+attic at6k
+attica at6k@
+attics at6ks
+atticus at6k@s
+attie at/
+attila @til@
+attila's @til@z
+attire @tIP
+attired @tIrd
+attitude at@tUd
+attitudes at@tUdz
+attitudinal at@tUd~@l
+attkisson atk@s~
+attleboro at@lbP]
+attlee atl/
+attorney @tVn/
+attorney's @tVn/z
+attorneys @tVn/z
+attorneys' @tVn/z
+attract @trakt
+attracted @trakt@d
+attracting @trakt6N
+attraction @trakS~
+attractions @trakS~z
+attractive @trakt6v
+attractively @trakt6vl/
+attractiveness @trakt6vn@s
+attracts @trakts
+attributable @triby@t@b@l
+attribute @tribyUt
+attribute atr@byUt
+attributed @triby@t@d
+attributes @tribyUts
+attributes atr@byUts
+attributing @triby@t6N
+attribution atr@byUS~
+attridge @trij
+attrition @triS~
+attune @tUn
+attuned @tUnd
+attwood atwqd
+attwoods atwqdz
+atwater atw{tP
+atwell @twel
+atwood atwqd
+atworth atwPT
+atx AtEeks
+atypical Atip6k@l
+atz ats
+au O
+aube {b
+aubel ?b@l
+auber {bP
+auberry {ber/
+aubert {bPt
+aubin {bin
+auble {b@l
+aubrey {br/
+aubry {br/
+aubuchon Ob@Son
+auburn obPn
+auch {C
+auchter ?ktP
+auckland okl~d
+auclair ]kl,r
+aucoin ]k<n
+aucott {kot
+auction okS~
+auction's {kS~z
+auctioned {kS~d
+auctioneer okS~ir
+auctioneering {kS~ir6N
+auctioneers {kS~irz
+auctioning {kS~6N
+auctions okS~z
+aud {d
+audacious odAS@s
+audacity odas@t/
+audas ]doz
+auden {d~
+auderburn {dPbPn
+audet ]det
+audette ]det
+audi ?d/
+audi {d/
+audi's ?d/z
+audi's {d/z
+audia {d/@
+audible od@b@l
+audibly od@bl/
+audience od/~s
+audience's od/~s@z
+audience's ody~s@z
+audiences od/~s@z
+audiences ody~s@z
+audino {dEn]
+audio od/O
+audiophile {dE]fEl
+audiophiles {dE]fElz
+audiotape {d/]tAp
+audiotapes {d/]tAps
+audiotex {d/]teks
+audiotronic {d/]tron6k
+audiotronics {d/]tron6ks
+audiovisual {d/]viZU@l
+audiovox {d/]voks
+audis ?d/z
+audis {dis
+audit {d@t
+audited {d@t@d
+auditing od@t6N
+audition odiS~
+auditioned {diS~d
+auditioning odiS~6N
+auditions {diS~z
+auditor {d@tP
+auditor's {d@tPz
+auditorium {d@t{r/}
+auditoriums {d@t{r/}z
+auditors od@tPz
+auditors' {d@tPz
+auditory {d@t{r/
+audits od@ts
+audran {dr~
+audrey {dr/
+audric {dr6k
+audrie {dP/
+audris ]drEs
+audry {dr/
+audubon {d@bon
+audwin {dwin
+aue ?
+auel ?@l
+auen ?~
+auer ?P
+auerbach ?Pbok
+auerback ?rbak
+aufderheide ?fdPhId
+aufhauser {fh?zP
+aufiero ]fir]
+aug {g@st
+augat {gat
+auge {j
+augello {jel]
+augenstein ?g~st/n
+augenstein ?g~stIn
+auger {gP
+augers {gPz
+aughenbaugh {enb{
+augment {gment
+augmentable ogment@b@l
+augmentation ogmcntAS~
+augmented ogment@d
+augmenting {gment6N
+augsburg {gzbPg
+augsburger ?gzbPgP
+augsburger {gzbPgP
+augspurger ?gspPgP
+augspurger {gspPgP
+augur {gP
+auguring {gP6N
+augurs {gPz
+august og@st
+august {g@st
+august's {g@sts
+augusta @gust@
+augusta's @gust@z
+auguste {g@st
+augustin ?gUstEn
+augustine og@stEn
+augustinian og@stin/~
+augustinians og@stin/~z
+augusto {gust]
+augustson {g@ss~
+augustson {g@sts~
+augustson {g@s~
+augustus @gust@s
+augustus ogust@s
+augustyn ?gust~
+augustyniak ?g@stin/ak
+aujourd'hui OZ{rdwE
+aujourd'hui's OZ{rdwEz
+auker {kP
+aukerman ?kPm~
+aul {l
+aulana ?lon@
+auld {ld
+aulds {ldz
+auletta {let@
+aull {l
+ault {lt
+aultman {ltm~
+auman {m~
+aumann {m~
+aument ?m~t
+aumiller ?m@lP
+aune {n
+aung {N
+aungst ?Ngst
+aunt ant
+aunt {nt
+aunt's ants
+aunt's {nts
+auntie ant/
+auntie {nt/
+aunts ants
+aunts {nts
+aunts' ants
+aunts' {nts
+aupperle ?pPl/
+aura {r@
+aural {r@l
+aurand {r~d
+aurea ?rAo
+aurelio ?rAl/]
+auria {r/@
+aurich ?r6k
+auriemma {rEm@
+aurora P{r@
+auroral P{r@l
+aurum {r}
+aus ?z
+ausbrooks ?sbrqks
+ausburn ?sbPn
+auschwitz ?Swits
+auschwitz {Swits
+ausherman ?SPm~
+ausimont ?s}ont
+auslander ?sl~dP
+ausley {sl/
+ausman ?sm~
+ausmus ?sm@s
+auspey ?sp/
+auspice {spis
+auspices {spis@z
+auspicious ospiS@s
+aussie {s/
+aust {st
+austad ?st@d
+austell ?st@l
+austen {st~
+austen's {st~z
+auster {stP
+austere {stir
+austerely {stirl/
+austerity {st,r@t/
+austill ?st@l
+austin {st~
+austin's {st~z
+austine {st/n
+auston {st~
+austral {str@l
+australasia {str@lAZ@
+australia {strAly@
+australia's {strAly@z
+australian {strAly~
+australians {strAly~z
+australopithecine {strAl]piT@sIn
+australopithecus {strAl]piT@k@s
+australs {str@lz
+austrasia {strAZ@
+austria {str/@
+austria's {str/@z
+austrian {str/~
+austrians {str/~z
+austro {str]
+austroasiatic {strOAZ/at6k
+austron {str~
+auten ?t~
+autenrieth ?t~r/@T
+autery OtP/
+auth {T
+authement ?Tm~t
+authentic @Ten6k
+authentic @Tent6k
+authentic {Ten6k
+authentic {Tent6k
+authentically {Ten6kl/
+authentically {Tent6kl/
+authenticate {Tent@kAt
+authenticated {Tent@kAt@d
+authenticating {Tent@kAt6N
+authentication {Tent@kAS~
+authentications {Tent@kAS~z
+authenticity {T~tis@t/
+auther {TP
+authier ?T/P
+author {TP
+author's {TPz
+authored {TPd
+authoritarian @T{r@t,r/~
+authoritarianism @T{r@t,r/~iz}
+authoritative @T{r@tAt6v
+authoritatively @T{r@tAt6vl/
+authorities @T{r@t/z
+authorities' @T{r@t/z
+authority @T{r@t/
+authority's @T{r@t/z
+authorization {TP@zAS~
+authorizations {TP@zAS~z
+authorize {TPIz
+authorized {TPIzd
+authorizes {TPIz@z
+authorizing {TPIz6N
+authors {TPz
+authors' {TPz
+authorship {TPSip
+autism {tiz}
+autistic {tist6k
+auto {t]
+auto's {t]z
+autobahn {t]bon
+autobiographer {t@bIogr@fP
+autobiographical {t@bI@graf6k@l
+autobiographies {t@bIogr@f/z
+autobiography {t@bIogr@f/
+autobon ot@bon
+autoclave {t]klAv
+autocracy {tokr@s/
+autocrat {t@krat
+autocratic {t@krat6k
+autodesk {t]desk
+autodie {t]dI
+autofact {t]fakt
+autofacts {t]fakts
+autograph {t@graf
+autographed {t@graft
+autographs {t@grafs
+autoimmune {t<myUn
+autolatina {tOl@tEn@
+automaker {t]mAkP
+automaker's {t]mAkPz
+automakers {t]mAkPz
+automakers' {t]mAkPz
+automap {t]map
+automata {tom@t@
+automate {t}At
+automated {t}At@d
+automates {t}Ats
+automatic {t]mat6k
+automatic {t}at6k
+automatically {t]mat6kl/
+automatically {t}at6kl/
+automatics {t}at6ks
+automating {t}At6N
+automation {t}AS~
+automatix {t]mAt6ks
+automaton {tom@ton
+automobile {t}]bEl
+automobile {t}]bEl
+automobiles {t}]bElz
+automobiles {t}]bElz
+automobili {t]m]bEl/
+automotive {t}Ot6v
+automotive's {t}Ot6vz
+automoviles {t]m]vElcz
+auton {t~
+autonomic {t~om6k
+autonomous {ton}@s
+autonomously {ton]m@sl/
+autonomy @ton}/
+autonomy {ton}/
+autopacific {t]p@sif6k
+autopart {t]port
+autoparts {t]ports
+autopilot {t]pIl@t
+autopsied {tops/d
+autopsies {tops/z
+autopsy {tops/
+autorad {t]rad
+autoradiograph ot]rAd/]graf
+autorads {t]radz
+autos {t]z
+autospa {t]sp@
+autotote {t]tOt
+autotrophic {t@trOf6k
+autoworker {t]wPkP
+autoworkers {t]wPkPz
+autrey {tr/
+autry {tr/
+autumn {t}
+autumn's {t}z
+autumnal {tumn@l
+auvil ]vil
+aux O
+auxier {ks/P
+auxiliary ogzil/cr/
+auxiliary ogzilyP/
+auxton {kst~
+auyeung ?yUN
+auzenne {z~
+ava Av@
+avail @vAl
+availabilities @vAl@bil@t/z
+availability @vAl@bil@t/
+available @vAl@b@l
+availed @vAld
+avakian @vAk/~
+avalanche av@lanC
+avalanches av@lanC@z
+avallone av@lOn
+avalon av@lon
+avalon's av@lonz
+avalos ovol]z
+avana @van@
+avana's @van@z
+avanex ov~cks
+avant @vont
+avant-garde @vontg)rd
+avantek @vontck
+avanti @vont/
+avants ov{nts
+avarice avP@s
+avasso @vosO
+avco avk]
+avdel avdel
+ave av~U
+avedisian av@diZ~
+avedon avcdon
+avelar ovAl)r
+aveline ovclEn/
+avella @vel@
+avellino av@lEn]
+avellino's av@lEn]z
+avemco @vemk]
+avemco's @vemk]z
+aven ovA~
+avena ovAn@
+avenall ovAnol
+avendano ovcndon]
+avenel ovAnel
+avenell ovAnAl
+avenge @venj
+avenged @venjd
+avenger @venjP
+avenging @venj6N
+aveni oven/
+avent ov~t
+avenue av~U
+avenue's av~Uz
+avenues av~Uz
+aver AvP
+avera ov,r@
+average avP6j
+average avr6j
+average's avr6j@z
+averaged avr6jd
+averages avr6j@z
+averaging avr6j6N
+averbeck AvPbek
+averell ovcrAl
+averett avPct
+averette avPet
+averil AvP@l
+averil Avr@l
+averill ovcrEl
+averitt avPit
+averof avPof
+avers AvPz
+aversa ov,rs@
+aversano ovPson]
+averse @vVs
+aversion @vVZ~
+aversive @vVs6v
+avert @vVt
+averted @vVt@d
+averting @vVt6N
+averts @vVts
+avery AvP/
+avery's AvP/z
+averyl avP@l
+avey Av/
+avi Av/
+avi ov/
+avia ov/@
+aviacion Av/AS~
+aviall Av/@l
+aviano ov/on]
+aviano's ov/on]z
+aviaries Av/er/z
+aviary Av/er/
+aviation Av/AS~
+aviation's Av/AS~z
+aviator Av/AtP
+aviators Av/AtPz
+aviazione av/az/On/
+avice ovIs
+avid av@d
+avidly av@dl/
+avila @vil@
+aviles ovElcs
+avilez ovElcz
+avilla @vil@
+avina ovEn@
+avinger Av6NP
+avionic Av/on6k
+avionics Av/on6ks
+avions Av/~z
+avis Avis
+avitabile ov/tob@l
+avital @vEt@l
+avitia ovES@
+aviv ovEv
+aviv's ovEvz
+avmark avmork
+avner avnP
+avnet avnet
+avocado av@kod]
+avocados av@kod]z
+avocation av@kAS~
+avocet av@set
+avodon av@don
+avoid @v<d
+avoidable @v<d@b@l
+avoidance @v<d~s
+avoided @v<d@d
+avoiding @v<d6N
+avoids @v<dz
+avolio @vOl/]
+avon Avon
+avon's av~z
+avondale av~dAl
+avow @v?
+avowed @v?d
+avowedly @v?@dl/
+avraham Avr@ham
+avraham ovr@hom
+avram Avr}
+avrett avrct
+avril Avr@l
+avril avril
+avrim ovrEm
+avtex avteks
+avtex's avteks@z
+avtovaz avtOvaz
+avuncular @vuNky@lP
+aw {
+awacs Awaks
+awad @wod
+await @wAt
+awaited @wAt@d
+awaiting @wAt6N
+awaits @wAts
+awake @wAk
+awaken @wAk~
+awakened @wAk~d
+awakening @wAk~6N
+awakens @wAk~z
+awalt ov@lt
+awan Aw~
+award @w{rd
+awarded @w{rd@d
+awarding @w{rd6N
+awards @w{rdz
+aware @w,r
+awareness @w,rn@s
+awash @woS
+away @wA
+aways AwAz
+awb Adub@lyUbE
+awb Adub@yUbE
+awb owb
+awbrey {br/
+awe o
+awe {
+awed {d
+aweida @wAd@
+aweida @wId@
+awesome os}
+awesomely os}l/
+awestruck ostruk
+awful of@l
+awfully of@l/
+awfully ofl/
+awfulness {f@ln@s
+awhile @wIl
+awkward okwPd
+awkwardly okwPdl/
+awkwardness okwPdn@s
+awning on6N
+awoke @wOk
+awry PI
+awtrey {tr/
+ax aks
+axa aks@
+axa's aks@z
+axe aks
+axed akst
+axel aks@l
+axelrad akselr@d
+axelrod aks@lrod
+axelsen aksels~
+axelson aks@ls~
+axes aks/z
+axes aks@z
+axford aksf{rd
+axid aks@d
+axilrod aks@lrod
+axiom aks/}
+axiomatic aks/}at6k
+axioms aks/}z
+axis aks@s
+axle aks@l
+axles aks@lz
+axley aksl/
+axline akslIn
+axlon akslon
+axon akson
+axons aksonz
+axsom aks}
+axt akst
+axtell akstel
+axtman akstm~
+axton akst~
+ay A
+ay I
+ayacucho I@kuC]
+ayako @yok]
+ayala @yol@
+ayars APz
+ayatollah I@tOl@
+ayatollah's I@tOl@
+ayatollahs I@toloz
+aybar AbP
+aycock Ak@k
+aydar Ador
+aydar Idor
+aydelott Ad@lot
+aydelotte Ad@lot
+aydin Adin
+aydt At
+aye I
+ayer AP
+ayer IP
+ayer's ,rz
+ayer's Arz
+ayers APz
+ayers IPz
+ayerst ,r@st
+ayerst APst
+ayes Iz
+aygen Ag~
+aygen Ig~
+aykroyd Akr<d
+aykroyd Ikr<d
+ayler AlP
+ayles Alz
+aylesworth A@lzwPT
+aylesworth AlzwPT
+ayling Al6N
+aylmer AlmP
+aylor AlP
+aylsworth AlswPT
+aylward AlwPd
+aylwin Alwin
+aylwin Ilwin
+aylworth AlwPT
+aymond Am~d
+ayn An
+aynes Anz
+ayo A]
+ayodhya Iody@
+ayon A{n
+ayotte A{t
+ayoub A?b
+ayr Ar
+ayre ,r
+ayres ,rz
+ayscue AskyU
+aytes Ats
+ayuso IUs]
+ayyad Iad
+ayyad Iod
+ayyad's Iadz
+ayyad's Iodz
+ayyash IyaS
+azactam @zaktam
+azalea @zAly@
+azaleas @zAly@z
+azalia ozol/@
+azar oz)r
+azarow azP]
+azbell azbcl
+azbill ozbEl
+azcarraga azkorog@
+azcona azkOn@
+azcuenaga azkwAnog@
+azelia ozel/@
+azerbaijan azPbIjon
+azerbaijan ozPbIjon
+azerbaijan's azPbIjonz
+azerbaijan's ozPbIjonz
+azerbaijani azPbIjon/
+azerbaijani ozPbIjon/
+azerbaijanis azPbIjon/z
+azerbaijanis ozPbIjon/z
+azeri @z,r/
+azevedo ozAvAd]
+azhar @z)r
+azhar's @z)rz
+azides azIdz
+azidothymidine @zid@TIm@dEn
+azidothymidine @zid@TIm@dIn
+azidothymidine AzId@TIm@dEn
+azidothymidine AzId@TIm@dIn
+azinger Az6NP
+aziz @zEz
+azmeer azmir
+azoff az{f
+azores @z{rz
+azpurua azpyqrU@
+aztar aztP
+aztec aztek
+azteca aztek@
+aztecs azteks
+azura @zqr@
+azure aZP
+azzara ots)r@
+azzarello otsorel]
+azzaro ots)r]
+azzato @zot]
+azzopardi ots]p)rd/
+b bE
+b'gosh b@g{S
+b'nai b~A
+b'rith briT
+b's bEz
+b-j bEjA
+b-j's bEjAz
+b. bE
+b.'s bEz
+b.s bEz
+ba'ath b@oT
+ba'ath boT
+baab bob
+baack bok
+baade bod
+baalbek bolbck
+baalbeq bolbck
+baar b)r
+baars b)rz
+baas boz
+baasch boS
+baatz bots
+bab bab
+baba bob@
+babangida b@baNg@d@
+babangida b@boNg@d@
+babb bab
+babbage bab6j
+babbage's bab6j@z
+babbio bab/]
+babbit babit
+babbit's babits
+babbitt babit
+babbitt's bab@ts
+babbitts bab@ts
+babble bab@l
+babbled bab@ld
+babbler bablP
+babblers bablPz
+babbling bab@l6N
+babbling babl6N
+babbs babz
+babcock babk{k
+babe bAb
+babel bab@l
+baber bAbP
+babers bAbPz
+babes bAbz
+babette b@bet
+babiak bob/ak
+babiarz b@bEPz
+babic bob6k
+babich bab6C
+babies bAb/z
+babies' bAb/z
+babik bob6k
+babin babin
+babineau bab~O
+babineaux bab~O
+babington bab6Nt~
+babino bobEn]
+babinski b@binsk/
+babish bab6S
+babita bobEt@
+babka babk@
+babler bAb@lP
+baboon b@bUn
+baboon's b@bUnz
+baboon's babUnz
+baboons b@bUnz
+baboons babUnz
+babs babz
+babson babs~
+babu bobU
+babula bobUl@
+babushka b@bqSk@
+babushkas b@bqSk@z
+baby bAb/
+baby's bAb/z
+babyak bab/ak
+babyhood bAb/hqd
+babyish bAb/6S
+babylon bab@lon
+babylonian bab@lOn/~
+babylonians bab@lOn/~z
+babysat bAb/sat
+babysit bAb/sit
+babysitter bAb/sitP
+babysitters bAb/sitPz
+babysitting bAb/sit6N
+baca bak@
+bacall b@k{l
+bacardi b@k)rd/
+baccalaureate bak@l{r/@t
+baccarat bokPo
+baccari bok)r/
+bacchanalia bak~Aly@
+bacchi bak/
+bacchus bak@s
+bacci boC/
+baccus bak@s
+bach bok
+bacha baC@
+bachand baC~d
+bachar bokP
+bacharach bakPak
+bache bAC
+bache baC
+bache's bAC@z
+bache's baC@z
+bachelder bok@ldP
+bacheller bok@lP
+bachelor baC@lP
+bachelor baClP
+bachelor's baC@lPz
+bachelor's baClPz
+bachelors baClPz
+bacher bokP
+bachera bokP@
+bachert baCPt
+bachler baklP
+bachman bokm~
+bachmann bokm~
+bachmeier bokmIP
+bachner boknP
+bachrach bokr@k
+bachtel bakt@l
+bachtell bakt@l
+bachus baC@s
+bacigalupi boC/golUp/
+bacigalupo boC/golUp]
+bacik boC6k
+bacillus b@sil@s
+bacino boCEn]
+back bak
+backache bakAk
+backaches bakAks
+backbite bakbIt
+backbiting bakbIt6N
+backboard bakb{d
+backbone bakbOn
+backdate bakdAt
+backdated bakdAt@d
+backdoor bakd{r
+backdrop bakdrop
+backdrops bakdrops
+backe bak
+backed bakt
+backer bakP
+backer's bakPz
+backers bakPz
+backes baks
+backfield bakfEld
+backfire bakfIr
+backfired bakfIPd
+backfires bakfIPz
+backfiring bakfIP6N
+backgammon bakgam~
+background bakgr?nd
+backgrounds bakgr?ndz
+backhand bakhand
+backhanded bakhand@d
+backhaus bakh?s
+backhoe bakhO
+backing bak6N
+backlash baklaS
+backless bakl@s
+backlight baklIt
+backlights baklIts
+backlist baklist
+backlog baklog
+backlogged baklogd
+backlogs bakl{gz
+backlund bakl~d
+backman bakm~
+backpack bakpak
+backpacks bakpaks
+backpedal bakped@l
+backpedaled bakped@ld
+backpedaling bakped@l6N
+backpedaling bakpedl6N
+backrest bakrest
+backroom bakrUm
+backs baks
+backsaw bakso
+backseat baksEt
+backset bakset
+backside baksId
+backslap bakslap
+backslapping bakslap6N
+backslash bakslaS
+backslide bakslId
+backsliding bakslId6N
+backspin bakspin
+backstage bakstAj
+backstairs baksterz
+backstitch bakst6C
+backstop bakstop
+backstroke bakstrOk
+backstrom bakstr}
+backtrack baktrak
+backtracked baktrakt
+backtracking baktrak6N
+backup bakup
+backups bakups
+backus bak@s
+backward bakwPd
+backwardation bakwPdAS~
+backwardness bakwPdn@s
+backwards bakwPdz
+backwash bakwoS
+backwater bakw{tP
+backwaters bakw{tPz
+backwoods bakwqdz
+backwoodsman bakwqdzm~
+backyard bakyord
+backyards bakyordz
+bacon bAk~
+bacon's bAk~z
+bacorn bakPn
+bacot bAkat
+bacot bak@t
+bacote b@kOt
+bacteria baktir/@
+bacterial baktir/@l
+bacteriology bakt6rEol@j/
+bacterium baktir/}
+bacus bak@s
+bad bad
+bada bod@
+badal bAd@l
+badalamenti bodoloment/
+badami bodom/
+badavatz bad@vats
+badders badPz
+bade bAd
+badeah b@dE@
+badeau b@dO
+badeaux b@dO
+baden bAd~
+baden's bod~z
+bader bAdP
+bader badP
+badertscher badPCP
+badge baj
+badger bajP
+badger's bajPz
+badgered bajPd
+badgering bajP6N
+badgers bajPz
+badges baj@z
+badgett bajit
+badgley bajl/
+badia bod/@
+badillo b@dil]
+badland badland
+badlands badlandz
+badley badl/
+badly badl/
+badman badm~
+badminton badmint~
+badmintons badmint~z
+badness badn@s
+badolato bod]lot]
+badour b@dqr
+badura bodqr@
+bady bAd/
+bae bI
+baechle bek@l
+baecker bekP
+baedeker bAd@kP
+baedeker's bAd@kPz
+baehr b,r
+baehr bEr
+baek bEk
+baek bek
+baer b,r
+baerwald b,rw{ld
+baeten bet~
+baetjer betjP
+baetz bEts
+baez bIez
+baeza bEz@
+baffa baf@
+baffle baf@l
+baffled baf@ld
+baffles baf@lz
+baffling baf@l6N
+baffling bafl6N
+bafokeng baf]keN
+bag bag
+bagan bAg~
+bagby bagb/
+bagdad bagdad
+bagdasarian bagd@s,r/~
+bagdikian bagdik/~
+bagdon bagd~
+bagdonas bagd~@z
+bagel bAg@l
+bageland bAg@land
+bagels bAg@lz
+bagent bAj~t
+bagful bagfql
+bagg bag
+baggage bag@j
+bagge bag
+bagged bagd
+baggerly bagPl/
+baggett bagit
+baggie bag/
+bagginess bag/n@s
+bagging bag6N
+baggio boj/]
+baggio's boj/]z
+baggott bag@t
+baggs bagz
+baggy bag/
+baghdad bagdad
+baghdad's bagdadz
+baghli bagl/
+baginski b@ginsk/
+bagley bagl/
+baglio bagl/]
+bagman bagm~
+bagnall bagn@l
+bagnato bognot]
+bagnell bagn@l
+bagpipe bagpIp
+bagpiper bagpIpP
+bagpipes bagpIps
+bags bagz
+bagsby bagzb/
+bagshaw bagS{
+bagwell bagwel
+bah bo
+baha'is bohoiz
+baham bo}
+bahama b@hom@
+bahamas b@hom@z
+bahamian b@hAm/~
+bahan bah~
+bahe bAh
+bahena bahcn@
+bahia boh/@
+bahl bol
+bahler bolP
+bahls bolz
+bahm bam
+bahman bom~
+bahn ban
+bahner bonP
+bahnsen bons~
+bahr b)r
+bahr b,r
+bahrain bIrAn
+bahrain borAn
+bahrain's bIrAnz
+bahrain's borAnz
+bahraini bIron/
+bahraini bPAn/
+bahraini borAn/
+bahrainian bIron/~
+bahrainian bPAn/~
+bahrainian borAn/~
+bahrainis bPAn/z
+bahre b)r
+bahrenburg b)r~bPg
+baht bot
+baidoa bIdO@
+baidoa's bIdO@z
+baidoan bIdO~
+baidoan's bIdO~z
+baidoans bIdO~z
+baidoas bIdO@z
+baie bI/
+baier bAP
+baig bAg
+bail bAl
+bailard bAlPd
+bailby bAlb/
+baile bAl
+bailed bAld
+bailer bAlP
+bailes bAlz
+bailey bAl/
+bailey's bAl/z
+baileys bAl/z
+bailie bAl/
+bailiff bAl@f
+bailiffs bAl@fs
+bailin bAlin
+bailing bAl6N
+bailiwick bAl@wik
+baillargeon b@l)rj~
+baillie bAl/
+bailly bAl/
+bailon bAl~
+bailor bAlP
+bailout bAl?t
+bailouts bAl?ts
+bails bAlz
+baily bAl/
+bailyn bAlin
+baim bAm
+bain bAn
+bain's bAnz
+bainbridge bAnbr6j
+bainbridge's bAnbr6j@z
+baine bAn
+bainerd bAnPd
+baines bAnz
+bains bAnz
+bainter bAntP
+bainton bAnt~
+baio bo/]
+bair b,r
+baird b,rd
+baird's b,rdz
+bairnco b,rnk]
+baisch bIS
+baisden bAsd~
+baise bAz
+baisley bAzl/
+bait bAt
+baited bAt@d
+baiting bAt6N
+baits bAts
+baity bAt/
+baiul bIUl
+baiul's bIUlz
+baize bAz
+baja boho
+bajarin bajPin
+bajema boyAm@
+bajorek bajPck
+bak bak
+baka bok@
+bakalar bak@lP
+bake bAk
+bake-off bAk{f
+bake-offs bAk{fs
+baked bAkt
+bakelman bAk@lm~
+bakeman bAkm~
+baker bAkP
+baker's bAkPz
+bakeries bAkP/z
+bakers bAkPz
+bakersfield bAkPzfEld
+bakery bAkP/
+bakes bAks
+bakeware bAkwer
+bakewell bAkwel
+bakey bAk/
+bakey's bAk/z
+baking bAk6N
+bakke bak
+bakken bak~
+bakker bAkP
+bakker bakP
+bakker's bAkPz
+bakker's bakPz
+bakkers bAkPz
+bakkers bakPz
+bakley bakl/
+bakos bok]z
+bakowski b@k{fsk/
+bakrie bakrI
+bakshi bakS/
+bakst bakst
+baku bokU
+bakula b@kUl@
+bal bal
+bala bol@
+balaban bolobon
+balaguer bal@gP
+balakumar bol@kUm)r
+balan bAl~
+balance bal~s
+balanced bal~st
+balancer bal~sP
+balances bal~s@z
+balanchine bal~CEn
+balanchine's bal~CEnz
+balancing bal~s6N
+balart balort
+balas bal@s
+balash bal6S
+balata bal@t@
+balazs b{l6S
+balbach balbok
+balbi balb/
+balbina bolbEn@
+balbo balb]
+balboa bolbO@
+balboni bolbOn/
+balbriggan balbrig~
+balbriggans balbrig~z
+balcer bAlsP
+balcerowicz bals,r@wits
+balcerzak b@lCVz@k
+balch balC
+balchunas balkUn@z
+balcom balk}
+balconies balk~/z
+balcony balk~/
+balcor balk{r
+bald b{ld
+baldassare boldos)r/
+baldassari boldos)r/
+baldassarre b{ld@s)r/
+baldauf bald?f
+baldelli boldel/
+baldemar boldAm)r
+balder b{ldP
+balderas baldP@z
+balderdash b{ldPdaS
+balderrama boldcrom@
+balderson baldPs~
+balderston baldPst~
+baldez boldez
+baldi bold/
+balding b{ld6N
+baldinger b{ld6NP
+baldini boldEn/
+baldini's boldEn/z
+baldino boldEn]
+baldly b{ldl/
+baldner baldnP
+baldness b{ldn@s
+baldo bold]
+baldock bald@k
+baldonado bold]nod]
+baldoni boldOn/
+baldor b{ldP
+baldree b@ldrE
+baldric baldr6k
+baldridge baldr6j
+baldrige b{ldr6j
+baldry b{ldr/
+balducci boldUC/
+baldur boldqr
+baldus bold@s
+baldwin b{ldw~
+baldwin's b{ldw~z
+baldyga bold/g@
+bale bAl
+baleen b@lEn
+baleful bAlf@l
+balentine bolcntEn/
+bales bAlz
+balestra b@lestr@
+balestrieri bolcstrir/
+baley bAl/
+balfanz bolfonz
+balfe bAlf
+balfour balf{r
+bali bol/
+balian bAl/~
+balicki b@lik/
+balik bol6k
+balilan b@lil~
+baliles b@lElcz
+balin balin
+balinese bal~Ez
+baling bAl6N
+balinski b@linsk/
+balint bol/nt
+balis bol/z
+balistreri bol/str,r/
+balk bolk
+balk b{k
+balkan b{lk~
+balkanization b{lk~@zAS~
+balkanize b{lk~Iz
+balkanized b{lk~Izd
+balkans b{lk~z
+balkcom balk}
+balke bAlk
+balked b{kt
+balkin balkin
+balking b{k6N
+balko balk]
+balks b{ks
+balky b{k/
+ball b{l
+ball's b{lz
+balla bal@
+ballad bal@d
+ballade b@lod
+ballads bal@dz
+balladur bal@dP
+balladur's bal@dPz
+ballance bol~s
+ballantine bal~tIn
+ballantrae bal~trA
+ballantyne b@lantIn
+ballard balPd
+ballard's balPdz
+ballas bal@z
+ballast bal@st
+ballasts bal@s
+ballasts bal@ss
+ballasts bal@sts
+ballclub b{lkl@b
+ballcock b{lkok
+ballcocks b{lkoks
+balle bAl
+balled b{ld
+ballengee b@leNg/
+ballenger bal~jP
+ballentine bolcntEn/
+baller b{lP
+ballerina balPEn@
+ballerinas balPEn@z
+balles bAlz
+ballester bal@stP
+ballesteros b@lestP]s
+ballesteros bal@stP]z
+ballet balA
+ballet's balAz
+ballets balAz
+balletto balet]
+ballew balU
+ballgame b{lgAm
+balli bal/
+balliet bal/@t
+balliett balEt
+ballin balin
+balling b{l6N
+ballinger b{linjP
+ballistic b@list6k
+ballistics b@list6ks
+ballman b{lm~
+ballmer balmP
+ballo bal]
+ballon bal~
+balloon b@lUn
+ballooned b@lUnd
+ballooning b@lUn6N
+balloonist b@lUn@st
+balloonists b@lUn@sts
+balloons b@lUnz
+ballor b{lP
+ballot bal@t
+balloting bal@t6N
+ballots bal@ts
+ballou b@lU
+ballow bal]
+ballowe bal?
+ballpark b{lpork
+ballparks b{lporks
+ballplayer b{lplAP
+ballplayers b{lplAPz
+ballpoint b{lp<nt
+ballpoints b{lp<nts
+ballroom b{lrUm
+ballrooms b{lrUmz
+balls b{lz
+ballweg balw6g
+bally bAl/
+bally bal/
+bally's bAl/z
+bally's bal/z
+ballyhoo bal/hU
+ballyhooed bal/hUd
+balm bolm
+balm bom
+balmer bomP
+balmes bolmcs
+balmoral balm{r@l
+balmorals balm{r@lz
+balms bolmz
+balms bomz
+balmy bom/
+balodia b@lOd/@
+balog bal{g
+baloga bolOg@
+balogh bal]
+balon bol{n
+baloney b@lOn/
+balow bal]
+balsa b{ls@
+balsam b{ls}
+balsamo bolsom]
+balsbaugh b{lzb{
+balser bAlsP
+balsiger bals6gP
+balsley balsl/
+balster balstP
+balt's b{lts
+baltazar boltoz)r
+balter b{ltP
+baltes bAlts
+balthasar balT@sP
+balthaser balT@sP
+balthazar balT@zP
+balthazor bolToz{r
+balthrop balTr@p
+baltic b{lt6k
+baltica balt6k@
+baltics b{lt6ks
+baltierra boltir@
+baltimore b{lt}{r
+baltimore's b{lt}{rz
+balto bolt]
+baltodano b{lt]don]
+baltsa b{lts@
+baltz balts
+baltzell baltz@l
+baltzer baltzP
+baluchi b@lUC/
+baluja b@lUj@
+balukas b@lUk@z
+balyeat bal/at
+balz b{lz
+balzano bolzon]
+balzarini bolzorEn/
+balzer bAlzP
+bam bam
+bamba bamb@
+bambach bambok
+bambenek bambenck
+bamber bambP
+bamberg bambPg
+bamberger bambPgP
+bambi bamb/
+bambino bambEn]
+bambinos bambEn]z
+bamboo bambU
+bambrick bambr6k
+bamburg bambPg
+bame bAm
+bamford bamfPd
+bamut bam@t
+ban ban
+banacci b~oC/
+banach ban@k
+banal b~ol
+banalities b~al@t/z
+banality b~al@t/
+banamex ban}eks
+banana b~an@
+bananas b~an@z
+banas ban@z
+banasiak b~os/ak
+banaszak b~oS@k
+banbury banber/
+banc baNk
+banca baNk@
+banca boNk@
+bancaire bank,r
+bancario bank,r/]
+banco baNk]
+bancoklahoma baNkokl@hOm@
+bancomer baNk}P
+bancor bank{r
+bancorp baNk{rp
+bancorp bank{rp
+bancorp's baNk{rps
+bancorp's bank{rps
+bancorporation bank{rpPAS~
+bancroft baNkr{ft
+bancroft's bankr{fts
+bancserve banksPv
+bancshares baNkScrz
+bancshares' baNkS,rz
+banctec baNktek
+banctexas baNkteks@s
+band band
+band's bandz
+banda band@
+bandag bandag
+bandage band6j
+bandaged band6jd
+bandages band6j@z
+bandai bandI
+bandaid bandAd
+bandana bandan@
+bandanas bandan@z
+bandar bandor
+banded band@d
+bandel band@l
+bandemer band/mP
+bander bandP
+banderas bandV@s
+banderas bondPus
+bandicoots band/kUts
+bandicoots band6kUts
+bandied band/d
+banding band6N
+bandit band@t
+banditry band@tr/
+bandits band@ts
+bandleader bandl/dP
+bandleaders bandl/dPz
+bandolier band@lir
+bandoliers band@lirz
+bandow band?
+bandow's band?z
+bands bandz
+bandshell bandSel
+bandstand bandstand
+bandt bant
+banducci bondUC/
+bandwagon bandwag~
+bandwidth bandw@dT
+bandy band/
+bane bAn
+banegas ban6g@z
+banerjee b~Vj/
+banes bAnz
+banesto b~est]
+banesto's b~est]z
+banet banit
+baney bAn/
+banff banf
+banfield banfEld
+banford banfPd
+bang baN
+bangalore baNg@l{r
+bangalore's baNg@l{rz
+bange banj
+banged baNd
+bangee banj/
+bangemann baNg}~
+banger baNP
+bangers baNPz
+bangert bANgPt
+bangerter bANgPtP
+banghart baNhort
+banging baN6N
+bangish baN6S
+bangkok baNkok
+bangkok baNkok
+bangkok's baNkoks
+bangladesh baNl@deS
+bangladesh's baNl@deS@z
+bangladeshi baNl@deS/
+bangladeshi's baNl@deS/z
+bangladeshis baNl@deS/z
+bangle baNg@l
+bango boNg]
+bangor baNgP
+bangor baNg{r
+bangs baNz
+banh ban
+bania bon/@
+banick ban6k
+banik ban6k
+banis banis
+banish ban6S
+banished ban6St
+banishing ban6S6N
+banishment ban6Sm~t
+banister ban@stP
+banja bony@
+banjo banjO
+bank baNk
+bank's baNks
+bankable baNk@b@l
+bankamerica baNk},r6k@
+bankamerica's baNk},r6k@z
+bankatlantic baNk@tlant6k
+bankcard baNkord
+bankcorp baNk{rp
+banke baNk
+bankeast baNkEst
+banked baNkt
+banken baNk~
+banker baNkP
+banker's baNkPz
+bankers baNkPz
+bankers' baNkPz
+bankert baNkPt
+bankes baNks
+bankey bankE
+bankhead baNkhed
+bankholding baNkhOld6N
+banking baNk6N
+banking's baNk6Nz
+banknote baNknOt
+banknotes baNknOts
+banko baNk]
+bankowski b@Nk{fsk/
+bankroll baNkrOl
+bankrolled baNkrOld
+bankrolling baNkrOl6N
+bankrolls baNkrOlz
+bankrupcty baNkr@pts/
+bankrupt baNkr@pt
+bankruptcies baNkr@pts/z
+bankruptcy baNkr@ps/
+bankruptcy's baNkr@ps/z
+bankrupted baNkr@pt@d
+bankrupting baNkrupt6N
+bankrutpcy baNkr@ps/
+bankrutpcy baNkr@pts/
+banks baNks
+banks' baNks
+banks's baNks@z
+bankshare baNkSer
+bankshares baNkSerz
+bankson baNks~
+bankston baNkst~
+bankverein baNkvPIn
+bankvermont baNkvPmont
+bankworcester baNkwUstP
+bankworcester baNkwVCestP
+bann ban
+bannan ban~
+banned band
+banner banP
+banner's banPz
+bannerman banPm~
+banners banPz
+bannick ban6k
+banning ban6N
+bannings ban6Nz
+bannister ban@stP
+bannon ban~
+banos bon]z
+banoun b~Un
+banpais banpA
+banponce banpons
+banque baNk
+banquet baNkw@t
+banquets baNkw@ts
+banquo's baNkw]z
+bans banz
+bansal bonsal
+banshee banS/
+banshee banSE
+banta bant@
+bantam bant}
+bantam's bant}z
+bantams bant}z
+banter bantP
+bantered bantPd
+bantering bantP6N
+bantle bant@l
+banton bant~
+bantu bantU
+bantz bants
+banuelos bonwel]z
+banville bonvil
+banwart banw{rt
+banxquote baNkskwOt
+banya bany@
+banya bony@
+banyaluca bany@lUk@
+banyan bany~
+banyas bany@z
+banyas bony@z
+banyu bonU
+banzhaf banzh@f
+bao b?
+baoguang bA]gwaN
+bapley bapl/
+bapna bopn@
+baptism baptiz}
+baptismal baptizm@l
+baptisms baptiz}z
+baptist baptist
+baptista baptist@
+baptiste b@ptist
+baptistery bapt@str/
+baptists bapt@s
+baptists bapt@ss
+baptists bapt@sts
+baptize baptIz
+baptized baptIzd
+baptized baptIzd
+bar b)r
+bar's b)rz
+bar-mitzvah bormitsv@
+bara b)r@
+barabar b,r@bor
+barach b@rok
+barach bPok
+baraff borof
+barahona bar@hOn@
+barajas boroyoz
+barak b)r@k
+barakat b)r@kot
+baram b,ram
+baran boron
+baranek bar~6k
+baranoski bP~?sk/
+baranowski bP~{fsk/
+baranski bPansk/
+barany bP{n/
+barasch bar6S
+barash bar6S
+barath bar@T
+baratta borot@
+barb b)rb
+barb's b)rbz
+barba b)rb@
+barbados borbAd]s
+barbagallo borb@gal]
+barbakow b)rb@k?
+barbanel b)rb~@l
+barbano borbon]
+barbara b)rbP@
+barbara b)rbr@
+barbara's b)rbP@z
+barbaree b)rbP/
+barbarian borb,r/~
+barbarians borb,r/~z
+barbaric borbar6k
+barbarino borborEn]
+barbarism b)rbPiz}
+barbarity borbar@t/
+barbaro borb)r]
+barbarous b)rbP@s
+barbary b)rbP/
+barbash b)rbaS
+barbato borbot]
+barbe b)rb
+barbeau borbO
+barbecue b)rb6kyU
+barbecue's b)rb6kyUz
+barbecued b)rb6kyUd
+barbecueing b)rb6kyU6N
+barbecues b)rb6kyUz
+barbed b)rbd
+barbee b)rb/
+barbell b)rbel
+barbella borbel@
+barbells b)rbelz
+barbels b)rb@lz
+barbeque b)rb6kyU
+barbequed b)rb6kyUd
+barbequeing b)rb6kyU6N
+barbeques b)rb6kyUz
+barber b)rbP
+barber's b)rbPz
+barbera borb,r@
+barberi borb,r/
+barberio borbEr/]
+barberis b)rbPis
+barbero borb,r]
+barbers b)rbPz
+barbershop b)rbPSop
+barbette borbet
+barbian b)rb/~
+barbie b)rb/
+barbie's b)rb/z
+barbier b)rb/P
+barbieri borbir/
+barbieri's borbir/z
+barbies b)rb/z
+barbin b)rbin
+barbiturate borbiCP@t
+barbiturates borbiCP@ts
+barbo b)rb]
+barbone b)rbOn
+barbosa borbOs@
+barbour b)rbP
+barbour's b)rbPz
+barboza borbOz@
+barbra b)rbr@
+barbre b)rbP
+barbs b)rbz
+barby b)rb/
+barca b)rk@
+barcella borsel@
+barcellos borsel]z
+barcelo borCel]
+barcelona bors@lOn@
+barcenas b)rs~@z
+barch b)rk
+barchefsky boCefsk/
+barcia b)rC@
+barclay b)rklA
+barclay's b)rkl/z
+barclays b)rkl/z
+barclays' b)rkl/z
+barclays's b)rklAz@z
+barclift b)rklift
+barco b)rk]
+barco's b)rk]z
+barcomb b)rk}
+barcroft b)rkr{ft
+barcus b)rk@s
+barczak b)rCak
+bard b)rd
+bard's b)rdz
+bardell bordel
+barden b)rd~
+bardera bord,r@
+bardin b)rdin
+bardo b)rd]
+bardolf b)rdOlf
+bardolph b)rdolf
+bardon bord{n
+bardrick b)rdr6k
+bardsley b)rdsl/
+bardulf b)rd@lf
+bardulph b)rd@lf
+bardwell b)rdwel
+bare b,r
+bared b,rd
+barefield bar@f/ld
+barefoot b,rfqt
+bareis barIz
+barela borel@
+barely b,rl/
+barenboim b,r~b<m
+barenboim's b,r~b<mz
+barens b,r~z
+barentine b,r~t/n
+barentine b,r~tIn
+barentine borcntEn/
+barents b,r~ts
+bares b,rz
+barest b,r@st
+barey b,r/
+barfield b)rfEld
+barfknecht b)rfk~ckt
+barfknecht b)rfnckt
+barfoot b)rfqt
+barfuss b)rfus
+barg b)rg
+barga b)rg@
+bargain b)rg~
+bargained b)rg~d
+bargainer b)rg~P
+bargainers b)rg~Pz
+bargaining b)rg~6N
+bargains b)rg~z
+barganier b)rg~/P
+bargar borg)r
+bargas b)rg@z
+barge b)rj
+barged b)rjd
+barger b)rjP
+bargeron b)rgP~
+barges b)rj@z
+bargman b)rgm~
+bargmann b)rgm~
+bargo b)rgO
+barhorst b)rh{rst
+bari b)r/
+bari's b)r/z
+baribeau bar@b]
+barich bar6k
+baril b,r@l
+barile b)r@l
+barillari ber@l,r/
+barillari's ber@l,r/z
+barillo bPil]
+barinco bPiNkO
+baring b,r6N
+baring's b,r6Nz
+baringer b,r6NP
+barings b,r6Nz
+barings' b,r6Nz
+baris b)r/z
+barish b,r6S
+barite b,rIt
+barites b,rIts
+baritone b,r@tOn
+barium b,r/}
+bark b)rk
+barkai borkI
+barkalow b)rk@lO
+barkan b)rk~
+barkdoll b)rkd@l
+barkdull b)rkd@l
+barke b)rk
+barked b)rkt
+barkeley b)rkl/
+barker b)rkP
+barkers b)rkPz
+barkes b)rks
+barkett b)rkit
+barkey b)rkE
+barkhurst b)rkhPst
+barkin b)rkin
+barking b)rk6N
+barkley b)rkl/
+barklow b)rklO
+barkman b)rkm~
+barko b)rk]
+barkocy b)rk@s/
+barkow b)rk]
+barks b)rks
+barksdale b)rksdAl
+barkshire b)rkSIr
+barkus b)rk@s
+barlage b)rl6j
+barlett b)rlit
+barletta borlet@
+barlettesville b)rl@tsvil
+barley b)rl/
+barloon borlUn
+barlow b)rlO
+barlowe b)rlO
+barman b)rm~
+barmore b)rm{r
+barn b)rn
+barna b)rn@
+barnabas b)rn@b@s
+barnaby b)rn@b/
+barnaby's b)rn@b/z
+barnacle b)rn@k@l
+barnacles b)rn@k@lz
+barnard b)rnPrd
+barnard b)rnord
+barnard bPn)rd
+barnard's b)rnPdz
+barnards b)rnPdz
+barnas b)rn@z
+barndt b)rnt
+barnell b)rn@l
+barner b)rnP
+barnes b)rnz
+barnet b)rnct
+barnett bornet
+barnett's bornets
+barnette bornet
+barnevik bornev6k
+barney b)rn/
+barney's b)rn/z
+barneys b)rn/z
+barnfield b)rnfEld
+barnhard b)rnhord
+barnhardt b)rnhort
+barnhart b)rnhort
+barnhill b)rnhil
+barnhouse b)rnh?s
+barnick b)rn6k
+barnicle b)rn6k@l
+barnish b)rn6S
+barno b)rn]
+barnowski born?sk/
+barns b)rnz
+barnstorm b)rnst{rm
+barnstorming b)rnst{rm6N
+barnum b)rn}
+barnwell b)rnwel
+barny b)rn/
+barnyard b)rnyord
+baro b)r]
+baroid bP<d
+barometer bPom@tP
+barometers bPom@tPz
+barometric bar}etr6k
+baron bar~
+baron's bar~z
+barone bPOn
+barone's bPOnz
+baroness b,r~cs
+baronet b,r~@t
+baronet ber~et
+baronets b,r~@ts
+baronets ber~ets
+baroni borOn/
+barons bar~z
+baroody bPUd/
+baroque bPOk
+baros b)r]z
+barovic b,r@v6k
+barovsky bPovsk/
+barr b)r
+barr's b)rz
+barra b)r@
+barrack bar@k
+barracks bar@ks
+barraclough bar@kl?
+barraco borok]
+barracuda ber@kUd@
+barradino ber@dEn]
+barragan b,r@g~
+barrage bPoZ
+barraged bPoZd
+barrages bPoZ@z
+barranco boronk]
+barras bar@z
+barrasso boros]
+barratt bar@t
+barraza boroz@
+barre b)r
+barre b,r/
+barreca borek@
+barred b)rd
+barreda borAd@
+barreiro bor,r]
+barrel bar@l
+barreled bar@ld
+barreling bar@l6N
+barrell borAl
+barrels bar@lz
+barren bar~
+barrens bar~z
+barrentine bar~tIn
+barrera bor,r@
+barreras bor,roz
+barres b)rz
+barresi bores/
+barret barit
+barreto boret]
+barrett barit
+barretta boret@
+barrette bPet
+barretto boret]
+barricada bor6kod@
+barricade bar@kAd
+barricaded bar@kAd@d
+barricades bar@kAdz
+barrick b,r6k
+barrick bar6k
+barrick's bar6ks
+barricklow bar6kl?
+barrickman bar6km~
+barrie bar/
+barrientes bPEnts
+barrientez borEntcz
+barrientos borEnt]z
+barrier bar/P
+barriere borir/
+barriers bar/Pz
+barriga borEg@
+barriger bar6gP
+barrilleaux bar@lO
+barrineau bar~O
+barring b)r6N
+barringer bar6NP
+barrings b)r6Nz
+barrington bar6Nt~
+barrio b)r/]
+barrios bcrE]z
+barrios borE]z
+barris baris
+barrish bar6S
+barrister bar@stP
+barristers bar@stPz
+barritt bPit
+barro b)r]
+barron bar~
+barron's bar~z
+barrone bPOn
+barroom b)rrUm
+barros b)r]z
+barroso borOs]
+barrow bar]
+barrowman bar]m~
+barrows bar]z
+barrs b)rz
+barrus bar@s
+barry bar/
+barry's bar/z
+barrymore bar/m{r
+bars b)rz
+barsamian borsAm/~
+barsanti borsont/
+barsch b)rS
+barschel b)rS@l
+barsh b)rS
+barshefsky borSefsk/
+barsky b)rsk/
+barsness b)rzn@s
+barson b)rs~
+barsotti borsOt/
+barstad b)rst@d
+barstow b)rstO
+barszcz b)rSC
+bart b)rt
+barta b)rt@
+bartak b)rt@k
+bartee b)rtE
+bartek b)rtek
+bartel b)rt@l
+bartell bortAl
+bartels b)rt@lz
+bartelson b)rt@ls~
+bartelt b)rtclt
+barten b)rt~
+bartender b)rtendP
+bartenders b)rtendPz
+barter b)rtP
+bartered b)rtPd
+bartering b)rtP6N
+barth b)rT
+bartha b)rT@
+barthel b)rT@l
+barthelemy borTel}/
+barthelme b)rT@lm
+barthelme's b)rT@lmz
+barthes b)rTs
+barthold b)rTOld
+bartholomay borT@lomA
+bartholomew borTol}yU
+bartholow b)rT@l]
+barthram b)rTram
+bartko b)rtk]
+bartkowiak bPtk?/ak
+bartkowski bPtk{fsk/
+bartkus b)rtk@s
+bartl b)rt@l
+bartle b)rt@l
+bartlebaugh b)rt@lb{
+bartles b)rt@lz
+bartleson b)rt@ls~
+bartlesville b)rt@lzvil
+bartlett b)rtl@t
+bartlett's b)rtl@ts
+bartley b)rtl/
+bartling b)rtl6N
+bartlow b)rtl]
+bartman b)rtm~
+bartmess b)rtmcs
+bartnick b)rtn6k
+bartnicki bPtnitsk/
+bartnik b)rtn6k
+barto b)rt]
+bartok b)rt@k
+bartol b)rt@l
+bartoletti bort]let/
+bartoli bortOl/
+bartolini bort]lEn/
+bartolo bortOl]
+bartolomei bort]l]mA/
+bartolomeo bort{l}A]
+bartolucci bort]lUC/
+barton b)rt~
+barton's b)rt~z
+bartone bortOn/
+bartoo b)rCU
+bartos b)rt]z
+bartosch b)rt{S
+bartosh b)rt6S
+bartosiewicz bPtos@v6C
+bartosik bPtOs6k
+bartoszek bPtoSck
+bartow b)rtO
+bartram b)rtram
+barts b)rts
+bartsch b)rC
+bartunek b)rt~6k
+bartus b)rt@s
+bartz b)rts
+baruch borUk
+barwick b)rwik
+baryshnikov bPiSn6kov
+baryshnikov's bPiSn6kovz
+barz b)rz
+bas-relief bor/lEf
+bas-relief bosr/lEf
+bas-reliefs bor/lEfs
+bas-reliefs bosr/lEfs
+basa bos@
+basal bAs@l
+basaldua bosoldU@
+basalt b@s{lt
+basalts b@s{lts
+basara b@s,r@
+basara's b@s,r@z
+basayev basoyef
+basayev basoyev
+bascay baskA
+basch baS
+basco bosk]
+bascom bask}
+basden basd~
+base bAs
+base's bAs@z
+baseball bAsb{l
+baseball's bAsb{lz
+baseballs bAsb{lz
+baseboard bAsb{rd
+baseboards bAsb{rdz
+based bAst
+basehore bash{r
+basel boz@l
+baseless bAsl@s
+baseline bAslIn
+baseman bAsm~
+basement bAsm~t
+basements bAsm~ts
+basenji b@senj/
+bases bAs/z
+bases bAs@z
+basey bAs/
+basford basfPd
+basgall basg@l
+bash baS
+basha boS@
+basham baS}
+bashaw b6S{
+bashed baSt
+basher baSP
+bashers baSPz
+bashes baS@z
+bashford baSfPd
+bashful baSf@l
+bashing baS6N
+bashir b6Sir
+bashor baSP
+bashore baSP
+basic bAs6k
+basic's bAs6ks
+basically bAs6kl/
+basich bosih
+basics bAs6ks
+basie bAz/
+basil baz@l
+basile bos@l
+basilia bosEl/@
+basilica b@sil@k@
+basilica b@zil@k@
+basilio bosEl/]
+basim bosEm
+basim's bosEmz
+basin bAs~
+basing bAs6N
+basinger bAs6NP
+basins bAs~z
+basinski b@sinsk/
+basis bAsis
+basista b@sist@
+basix bAs6ks
+bask bask
+basked baskt
+baskerville baskPvil
+basket bask@t
+basketball bask@tb{l
+basketball's bask@tb{lz
+basketballs bask@tb{lz
+basketmaker bask@tmAkP
+basketmaking bask@tmAk6N
+basketry bask@tr/
+baskets bask@ts
+baskett baskct
+baskette b@sket
+baskin baskin
+basking bask6N
+baskins baskinz
+basks basks
+basle bas@l
+basler bAz@lP
+basner basnP
+basnett basnct
+basnight baznIt
+bason bas~
+basore bos{r/
+basque bask
+basques basks
+basquez boskwez
+basra bosro
+bass bAs
+bass bas
+bass's bAs@z
+bassa bas@
+bassam bas}
+basse bas
+basses bAs@z
+basses bas@z
+basset bas@t
+bassett basct
+bassette b@set
+bassetti boset/
+bassford basfPd
+bassham baS}
+bassi bas/
+bassin basin
+bassinger basinjP
+bassir b@sir
+bassir's b@sirz
+bassist bAsist
+bassists bAsists
+bassler baslP
+bassman basm~
+basso bas]
+bassoon b@sUn
+bast bast
+basta bast@
+bastarache bost)rAk
+bastard bastPd
+bastards bastPdz
+bastedo bostAd]
+basten bAst~
+bastian basC~
+bastien bast~
+bastille bastil
+bastille bastil
+bastin bastin
+bastion basC~
+bastions basC~z
+bastogne bastOn
+bastogne's bastOnz
+baston bast~
+bastone bost]n
+bastow bast]
+bastyr bAst6r
+basu bosU
+basulto b@sult]
+basurto bosqrt]
+baswell baswcl
+basye basI
+bat bat
+bataan b@ton
+batan bAt~
+batat b@tot
+batavia b@tAv/@
+batch baC
+batchelder baCeldP
+batcheller baC@lP
+batchelor baC@lP
+batches baC@z
+batdorf batd{rf
+bate bAt
+bated bAt@d
+bateman bAtm~
+bates bAts
+bates' bAts
+bateson bAts~
+bateson bats~
+batesville bAtsvil
+batey bAt/
+bath baT
+bathe bAT
+bathed bATd
+bather baTP
+bathers baTPz
+bathes bATz
+bathgate baTgAt
+bathing bAT6N
+bathke baTk
+batholith baT@liT
+batholiths baT@liTs
+bathrick baTr6k
+bathrobe baTrOb
+bathrobes baTrObz
+bathroom baTrUm
+bathrooms baTrUmz
+bathrooms boTrUmz
+baths baTs
+bathsheba baTSEb@
+bathtub baTt@b
+bathtubs baTtubz
+bathurst baTPst
+bathurst's baTPsts
+batibot bat@bot
+batie bAt/
+batignolles batinyOl@s
+batik b@tEk
+batiks b@tEks
+batiks bat6ks
+batista b@tist@
+batley batl/
+batman batman
+batogowski bat]g?sk/
+baton b@ton
+baton baton
+baton bat~
+baton-rouge bat~rUj
+baton-rouge's bat~rUj@z
+batons batonz
+bator bot{r
+batra batr@
+batres bAtPz
+bats bats
+batson bats~
+batson's bats~z
+batt bat
+battaglia botogl/@
+battaglini botoglEn/
+battalion b@taly~
+battalions b@taly~z
+batte bat
+batted bat@d
+battelle b@tel
+battelle's b@telz
+batten bat~
+battenberg bat~bVg
+battenfield bat~fEld
+battening bat~6N
+batter batP
+battered batPd
+batterer batPP
+batterers batPPz
+batteries batP/z
+battering batP6N
+batterman batPm~
+batters batPz
+battersby batPsb/
+batterson batPs~
+battery batP/
+batterymarch b@t,r/morC
+battey bat/
+battiato bot/ot]
+batticaloa bat6k@lO@
+battin batin
+batting bat6N
+battipaglia bat@pagl/@
+battis batis
+battison bat@s~
+battista b@tEst@
+battiste botEst/
+battisti botEst/
+battistoni bot/stOn/
+battle bat@l
+battle's bat@lz
+battled bat@ld
+battlefield bat@lfEld
+battlefields bat@lfEldz
+battlefront bat@lfrunt
+battleground bat@lgr?nd
+battlegrounds bat@lgr?ndz
+battlement bat@lmcnt
+battlement bat@lm~t
+battlements bat@lm~ts
+battles bat@lz
+battleship bat@lSip
+battleships bat@lSips
+battling bat@l6N
+battling batl6N
+batton bat~
+batts bats
+batty bat/
+batuigas baCUEg@s
+batus bat@s
+batus b{t@s
+baty bAt/
+batz bats
+batzel batz@l
+batzer bAtzP
+bauble b{b@l
+baubles b{b@lz
+baublitz b?blits
+bauch b{C
+baucom b]kom
+baucum b]kum
+baucus bak@s
+baucus bok@s
+baud b{d
+baudendistel b?d~dist@l
+bauder b?dP
+baudoin b]dwoAn
+baudouin b{dUin
+bauer b?P
+bauerle b?P@l
+bauerlein b?PlIn
+bauermeister b?PmIstP
+bauernfeind b?PnfInd
+bauers b?Pz
+baugh b{
+baughan b{~
+baugher b{P
+baughman b{m~
+baughn b{n
+bauguess b?gcs
+baugus b{g@s
+bauknecht b?kn6kt
+bauknight b{knIt
+baum b?m
+baum b{m
+bauman b?m~
+baumann b?m~
+baumbach b?mbok
+baumberger b?mbPgP
+baumberger bombPgP
+baumeister b?mIstP
+baumel b?m@l
+baumer b?mP
+baumert b?mPt
+baumgard b?mgPd
+baumgard bomgord
+baumgardner b?mgordnP
+baumgardner bomgordnP
+baumgardt b?mgort
+baumgardt bomgort
+baumgarner b?mgornP
+baumgarner bomgornP
+baumgart b?mgort
+baumgart bomgort
+baumgarten b?mgort~
+baumgarten bomgort~
+baumgartner b?mgortnP
+baumgartner bomgortnP
+baumhardt b?mhort
+baumholder b?mh{ldP
+baumholder bomh{ldP
+baumler b?m@lP
+baumstark b?mstork
+baun b{n
+baur b?P
+baur b{r
+baus b{z
+bausch b?S
+bauserman b?sPm~
+bausman b?sm~
+bautch b?C
+bautista b{tEst@
+bautz b{ts
+bautzer b?tsP
+bauwens b?w~z
+bauxite b{ksIt
+bauza b?z@
+bava bov@
+bavadra b@vadr@
+bavaria b@v,r/@
+bavaria's b@v,r/@z
+bavarian b@v,r/~
+bavaro bov)r]
+baver bAvP
+bavis bAvis
+bawd b{d
+bawden b{d~
+bawdy b{d/
+bawer b{P
+bawl b{l
+bawled b{ld
+bax baks
+baxa baks@
+baxendale baks~dAl
+baxley baksl/
+baxt bakst
+baxter bakstP
+baxter's bakstPz
+bay bA
+bay's bAz
+bayanjou bIanjU
+bayar bAP
+bayard bAPd
+baybank bAbaNk
+baybank's bAbaNks
+baybanks bAbaNks
+baydhabo bAdob]
+baye bA
+bayed bAd
+bayer bAP
+bayer's bAPz
+bayerische bAPES
+bayers bAPz
+bayes bAz
+bayh bA
+baying bA6N
+bayle bAl
+baylee bAl/
+baylen bAl~
+bayles bAlz
+bayless bAlis
+bayley bAl/
+bayliff bAlif
+bayliner bAlInP
+baylis bAlis
+bayliss bAlis
+baylor bAlP
+bayly bAl/
+bayman bAm~
+baynard bAnPd
+bayne bAn
+baynes bAnz
+baynham bAnh}
+bayog bAog
+bayonet bA~et
+bayonets bA~ets
+bayonne bAyOn
+bayou bIU
+bayous bIUz
+bayouth bIUT
+bayreuth bAr<T
+bays bAz
+bayse bAz
+bayside bAsId
+baysinger bAs~jP
+baytown bAt?n
+baytree bAtrE
+baytree's bAtrEz
+bayuk bA@k
+bayul bA@l
+bayus bA@s
+baywatch bAwoC
+baz baz
+bazaar b@z)r
+bazaars b@z)rz
+bazan bAz~
+bazar b@z)r
+baze bAz
+bazemore bozm{r
+bazile bozIl
+bazinet baz~ct
+bazooka b@zUk@
+bazookas b@zUk@z
+bazzano botson]
+bazzell baz@l
+bazzle baz@l
+bbc bEb/sE
+bbc's bEb/sEs
+bbq b)rb6kyU
+bbq bEb/kyU
+be b/
+be bE
+bea bE
+beaber bEbP
+beabout b@bUt
+beach bEC
+beach's bEC@z
+beacham bEC}
+beachcomber bECkOmP
+beached bECt
+beachem bEk}
+beacher bECP
+beaches bEC@z
+beachfront bECfront
+beachhead bEChed
+beachheads bEChedz
+beaching bEC6N
+beachler bEk@lP
+beachum bEC}
+beachy bEC/
+beacom bEk}
+beacon bEk~
+beacons bEk~z
+bead bEd
+beaded bEd@d
+beadle bEd@l
+beadles bEd@lz
+beadling bEdl6N
+beads bEdz
+beadwork bEdwVk
+beady bEd/
+beagan b@gan
+beagen bEg~
+beagle bEg@l
+beagles bEg@lz
+beagley bEgl/
+beahan bEh~
+beahm bEm
+beaird bird
+beak bEk
+beaker bEkP
+beakley bEkl/
+beaklike bEklIk
+beakman bEkm~
+beakman's bEkm~z
+beal bEl
+beale bEl
+bealer bElP
+beales bElz
+beall bEl
+beals bElz
+beam bEm
+beam's bEmz
+beaman bEm~
+beamed bEmd
+beamer bEmP
+beaming bEm6N
+beamish bEm6S
+beamon bEm~
+beams bEmz
+bean bEn
+bean's bEnz
+beanblossom bEnbl@s}
+beane bEn
+beans bEnz
+beantown bEnt?n
+bear b,r
+bear's b,rz
+beara b,r@
+bearable b,r@b@l
+bearce bVs
+beard bird
+bearded bird@d
+bearden bird~
+beardmore birdm{r
+beards birdz
+beardslee birdzl/
+beardsley birdzl/
+beardstown birdst?n
+beare bir
+bearer b,rP
+bearers b,rPz
+bearfield bVf/ld
+bearing b,r6N
+bearings b,r6Nz
+bearish b,r6S
+bearishly b,r6Sl/
+bearishness b,r6Sn@s
+bearman b,rm~
+bears b,rz
+bears' b,rz
+bearse bVs
+bearss bVs
+bearup b,r@p
+beary bir/
+beas bEz
+beasley bEzl/
+beason bEz~
+beast bEst
+beastie bEst/
+beaston bEst~
+beasts bEsts
+beat bEt
+beata b/at@
+beaten bEt~
+beater bEtP
+beaters bEtPz
+beatie bEt/
+beating bEt6N
+beatings bEt6Nz
+beatle bEt@l
+beatles bEt@lz
+beatles' bEt@lz
+beatnik bEtn6k
+beatniks bEtn6ks
+beato b/at]
+beaton bEt~
+beatrice bE@tr@s
+beatrice bEtr@s
+beatrice's bE@tr@s@z
+beatrice's bEtr@s@z
+beatrix bE@tr6ks
+beatrix bEtr6ks
+beats bEts
+beatson bEts~
+beattie bEt/
+beatty bAt/
+beatty bEt/
+beaty bEt/
+beau bO
+beaubien b]bEn
+beaucage bOkAj
+beauce bOsE
+beauchaine bOSAn
+beauchamp bOSomp
+beauchemin bOS}an
+beauchene bOSEn
+beauchesne b]Sen
+beaudet b]det
+beaudette bOdet
+beaudin b]dan
+beaudoin b]d<n
+beaudreau bOdrO
+beaudry b]drE
+beauford b]f{rd
+beaufort bOfPt
+beaufrere bOfr,r
+beaujolais bOj]lA
+beaulac b]lak
+beaumier byUm/P
+beaumont bOm{nt
+beaupre bOpP
+beauregard bOr6gord
+beauregard b{r6gord
+beausoleil bOs@lA
+beautician bOtiS~
+beauties byUt/z
+beautiful byUt@f@l
+beautifullest byUt@f@l@st
+beautifully byUt@fl/
+beautify byUt@fI
+beauty byUt/
+beauvais b]vA
+beaux bO
+beavan b@van
+beaven bEv~
+beaver bEvP
+beavers bEvPz
+beaverson bEvPs~
+beaverton bEvPt~
+beavin bEvin
+beavis bEv@s
+beazer bEzP
+beazley bEzl/
+bebb beb
+bebber bebP
+bebbits beb@ts
+bebe bEb/
+bebe's bEb/z
+bebear b@bir
+bebeau bibO
+bebee beb/
+beber bEbP
+bebitch beb6C
+bebop bEbop
+bebout bibUt
+bec bek
+becalm b6kom
+becalmed b6komd
+became b/kAm
+became b6kAm
+because b6kuz
+because b6k{z
+becerra bcC,r@
+becerril bAscrEl
+bechard bekPd
+becher bekP
+becherer bekPP
+bechler beklP
+becht bekt
+bechtel bektel
+bechthold bekT]ld
+bechtle beCt@l
+bechtol bekt@l
+bechtold bektOld
+beck bek
+beck's beks
+becka besk@
+beckel bekcl
+becker bekP
+becker's bekPz
+beckerman bekPm~
+beckers bekPz
+beckert bekPt
+becket bek@t
+beckett bekct
+beckford bekf{rd
+beckham bekham
+becki bek/
+beckie bek/
+beckius bek/@s
+beckler beklP
+beckles bek@lz
+beckley bekl/
+becklund bekl~d
+beckman bekm~
+beckmann bekm~
+beckmeyer bekmIP
+becknell beknel
+beckner beknP
+beckom bekom
+beckon bek~
+beckoned bek~d
+beckoning bek~6N
+beckons bek~z
+becks beks
+beckstead beksted
+beckstrand bekstrand
+beckstrom bekstrom
+beckum bek}
+beckwith bekwiT
+beckwith's bekwiTs
+beckwitt bekwit
+beckworth bekwVT
+beckworth's bekwVTs
+becky bek/
+becnel bekn@l
+beco bEk]
+become b6kum
+becomes b6kumz
+becoming b6kum6N
+becor bek{r
+becor's bek{rz
+becraft bEkraft
+becton bekt~
+becvar bekvP
+bed bed
+beda bAd@
+bedard b@d)rd
+bedbug bedb@g
+bedbugs bedb@gz
+bedchamber bedCAmbP
+bedded bed@d
+bedding bed6N
+beddingfield bed6NfEld
+beddoe bed]
+beddors bedPz
+beddow bed]
+bede bEd
+bedeck b@dek
+bedecked b@dekt
+bedel b@del
+bedell bed@l
+bedenbaugh bed~b?
+bedevil b@dev@l
+bedeviled b@dev@ld
+bedfellow bedfel]
+bedfellows bedfel]z
+bedford bedfPd
+bedgood bedgqd
+bedient bEdy~t
+bedinger bed6NP
+bedingfield bed6NfEld
+bedke bedk/
+bedlam bedl}
+bedlington bedl6Nt~
+bedminster bedm~stP
+bednar bednP
+bednarczyk bednPC6k
+bednarek bednorck
+bednarik bednor6k
+bednarski bednorsk/
+bednarz bednorz
+bedner bednP
+bednorz bedn{rz
+bedolla bcdOl@
+bedore bed{r
+bedouin bed@w~
+bedouin bedUin
+bedouin bed]~
+bedouins bed@w~z
+bedouins bedUinz
+bedouins bed]~z
+bedoya bAd<@
+bedpan bedpan
+bedpans bedpanz
+bedraggle b@drag@l
+bedraggled b@drag@ld
+bedridden bedrid~
+bedrock bedrok
+bedroom bedrUm
+bedrooms bedrUmz
+bedrosian b@drOz/~
+bedrosian bcdroZ~
+beds bedz
+bedsaul beds{l
+bedside bedsId
+bedsole bedsOl
+bedspread bedspred
+bedstraw bedstr{
+bedtime bedtIm
+bedwell bedwel
+bee bE
+bee's bEz
+beeba's bEb@z
+beebe bEbE
+beebe's bEbEz
+beebes bEbEz
+beebower bEb?P
+beebower bEbOP
+beeby bEb/
+beech bEC
+beecham bEC}
+beecham's bEC}z
+beechcraft bECkraft
+beecher bECP
+beechler bEClP
+beechwood bECwqd
+beechy bEC/
+beeck bEk
+beecroft bEkr{ft
+beede bEd
+beedie bEd/
+beedle bEd@l
+beedy bEd/
+beef bEf
+beefeater bEfEtP
+beefed bEft
+beeferman bEfPm~
+beefing bEf6N
+beefs bEfs
+beefsteak bEfstAk
+beefy bEf/
+beeghly bEgl/
+beegle bEg@l
+beehive bEhIv
+beehler bElP
+beek bEk
+beekeeper bEkEpP
+beekeepers bEkEpPz
+beeker bEkP
+beekman bEkm~
+beeks bEks
+beel bEl
+beeler bElP
+beem bEm
+beeman bEm~
+beemer bEmP
+been bin
+been b~
+beene bEn
+beeney bEn/
+beenken bENk~
+beens binz
+beep bEp
+beeper bEpP
+beepers bEpPz
+beeping bEp6N
+beeps bEps
+beer bir
+beer's birz
+beerbower birb]P
+beerman birm~
+beers birz
+beers's birz@z
+beery bir/
+bees bEz
+beese bEz
+beesley bEzl/
+beeson bEz~
+beet bEt
+beethoven bAt]v~
+beethoven's bAt]v~z
+beethovenian bAt]vEn/~
+beetle bEt@l
+beetlejuice bEt@ljUs
+beetles bEt@lz
+beeton bEt~
+beets bEts
+beever bEvP
+beevers bEvPz
+beezley bEzl/
+befall b@f{l
+befallen b@fal~
+befalls b@f{lz
+befalto b@folt]
+befell b@fel
+beffa bifo
+befit b@fit
+befits b@fits
+befitting b@fit6N
+before b@f{r
+before bEf{r
+beforehand b@f{rhand
+befort befPt
+befriend b@frend
+befriended b@frend@d
+befriends b@frendz
+befuddle b@fud@l
+befuddled b@fud@ld
+befuddles b@fud@lz
+beg beg
+begajah bcgoj@
+begala bcgol@
+begala's bcgol@z
+began b/gan
+began b6gan
+begat b6gat
+begay begA
+begel bAg@l
+begelman bAg@lm~
+begeman bEgm~
+beger begP
+beget b6get
+begets b6gets
+begetting b6get6N
+begg beg
+beggar begP
+beggars begPz
+begged begd
+begging beg6N
+beggs begz
+beghin begin
+begin b6gin
+begin's b6ginz
+beginner b6ginP
+beginner's b6ginPz
+beginners b6ginPz
+beginning b6gin6N
+beginnings b6gin6Nz
+begins b6ginz
+begleiter beglItP
+begleiter's beglItPz
+begley begl/
+begnaud b6gnO
+begnoche bcgnOk/
+begonia b6gOny@
+begonias b6gOny@z
+begot b/g{t
+begotten b/g{t~
+begrudge b6gruj
+begs begz
+begue bAg
+beguelin bAg@l~
+beguile b6gIl
+beguiled b6gIld
+beguiling b6gIl6N
+begun b6gun
+begun bAg~
+behalf b@haf
+behan beh~
+behar behP
+behave b@hAv
+behaved b@hAvd
+behaves b@hAvz
+behaving b@hAv6N
+behavior b@hAvyP
+behavioral b/hAvyP@l
+behavioral b@hAvyP@l
+behaviorist b@hAvyP@st
+behaviorists b@hAvyP@s
+behaviorists b@hAvyP@ss
+behaviorists b@hAvyP@sts
+behaviors b@hAvyPz
+behead b@hed
+beheaded b@hed@d
+beheading b@hed6N
+beheadings b@hed6Nz
+beheler beh@lP
+behemoth b@hEm@T
+behemoth bEh}@T
+behemoths b@hEm@Ts
+behest bihest
+behind b@hInd
+behinds b@hIndz
+behl bel
+behle beh@l
+behler belP
+behling bel6N
+behlke belk
+behm bem
+behmer bemP
+behn ben
+behne ben
+behner benP
+behney ben/
+behning ben6N
+behnke beNk
+behnken beNk~
+behof bEhof
+behoff bEhof
+behold b@hOld
+beholden b@hOld~
+beholder b/hOldP
+beholding b@hOld6N
+behoove b@hUv
+behooves b@hUvz
+behr b,r
+behrend b,rcnd
+behrends b,rcndz
+behrendt b,r~t
+behrens b,r~z
+behring b,r6N
+behringer b,r6NP
+behringwerke b,riNwPk
+behrle b,r@l
+behrman b,rm~
+behrmann b,rm~
+behrns b,rnz
+behunin beh~~
+behymer behImP
+beidaihe bIdAh/
+beidleman bId@lm~
+beidler bId@lP
+beier bIP
+beierle bIP@l
+beiersdorf bIrzd{rf
+beige bAZ
+beige's bAZ@z
+beigel bIg@l
+beiges bAZ@z
+beighley bAgl/
+beightol bAt@l
+beijer bIr
+beijing bAZiN
+beijing's bAZiNz
+beil bEl
+beilenson bIl~s~
+beiler bIlP
+beilfuss bIlf@s
+beilin bAlin
+beilin belin
+beilke bElk
+beilman bIlm~
+beim bIm
+bein bEn
+bein' bE~
+beine bEn
+being bE6N
+being's bE6Nz
+beings bE6Nz
+beiny bIn/
+beira bAr@
+beirne birn
+beirut bArUt
+beirut's bArUts
+beisel bIs@l
+beiser bIsP
+beisner bIsnP
+beissel bIs@l
+beiswenger bIswcnjP
+beit bAt
+beit bIt
+beitel bIt@l
+beiter bItP
+beitler bIt@lP
+beitz bEts
+beitzel bItz@l
+bejar bAy)r
+bejarano bAyoron]
+bekaa b@ko
+bekaa bcko
+bekaert b@k,rt
+beker bekP
+beker's bekPz
+bekins bEk~z
+bekker bekP
+bekki bek/
+bel bel
+bel'c belk
+bela bel@
+belabor b@lAbP
+belabored b@lAbPd
+belaboring b@lAbP6N
+belabors b@lAbPz
+beladur bel@dqr
+beladur's bel@dqrz
+belafonte bel@font/
+belair bcl,r
+belaire b@l,r
+belak bel@k
+beland bel~d
+belanger bel@NP
+belanoff bel~{f
+belarus bcl)r@s
+belasco bclosk]
+belate b@lAt
+belated b@lAt@d
+belatedly b@lAt@dl/
+belcastro bclkastr]
+belch belC
+belched belCt
+belcher belCP
+belching belC6N
+belcourt belk{rt
+belden beld~
+beldin beldin
+belding beld6N
+beldock beldok
+beldon beld~
+beleaguer b@lEgP
+beleaguered b@lEgPd
+beleaguering b@lEgP6N
+belen bel~
+belet bel@t
+belew belU
+belfast belfast
+belfer belfP
+belfield belfEld
+belfiore bclf/{r/
+belflower belfl?P
+belford belfPd
+belfry belfr/
+belgacom belg@kom
+belgacom belj@kom
+belgard bclg)rd
+belgarde bclg)rd/
+belge belj/
+belger belgP
+belgian belj~
+belgians belj~z
+belgique bclZEk
+belgique's bcljEks
+belgium belj}
+belgium's belj}z
+belgo belgO
+belgrade belgrAd
+belgrade belgrod
+belgrade's belgrAdz
+belgrade's belgrodz
+belgrave belgrAv
+belich bel6k
+belie b@lI
+belied b@lId
+belief b@lEf
+beliefs b@lEfs
+belier belyP
+belies b@lIz
+believability b@lEv@bil@t/
+believable b@lEv@b@l
+believe b@lEv
+believed b@lEvd
+believer b@lEvP
+believers b@lEvPz
+believes b@lEvz
+believing b@lEv6N
+belin belin
+belinda b@lind@
+belinsky bclinsk/
+belisle belI@l
+belittle b@lit@l
+belittled b@lit@ld
+belittles b@lit@lz
+belittling b@lit@l6N
+belittling b@litl6N
+belitz belits
+beliveau bel6vO
+belize bclEz
+belk belk
+belka belk@
+belkacem belk@s}
+belke belk
+belkin belkin
+belknap belnap
+belko belk]
+bell bel
+bell's belz
+bella bel@
+bellah bel@
+bellamy bel}/
+bellanca bclonk@
+belland bel~d
+bellanger belaNgP
+bellante bclont/
+bellantoni bclontOn/
+bellar belP
+bellard bcl)rd
+bellas bel@z
+bellavance bclov~s
+bellavia bclov/@
+bellavista bel@vist@
+bellcore belk{r
+bellcore's belk{rz
+belle bel
+belleau bclO
+bellefeuille bel@f/Ul
+bellemare bel},r
+beller belP
+bellerose belP@z
+belles belz
+belleville b@lvil
+bellevue belvyU
+bellew bclU
+bellflower belfl?P
+bellflowers belfl?Pz
+bellhop belhop
+bellhops belhops
+belli bel/
+bellicose bel@kOs
+bellied bel/d
+bellies bel/z
+belligerence b@lijP~s
+belligerent b@lijP~t
+belligerents b@lijP~ts
+bellin belin
+bellina bclEn@
+belling bel6N
+bellinger bel6NP
+bellingham bel6Nham
+bellinghausen bel6Nh?z~
+bellini bclEn/
+bellini's bclEn/z
+bellino bclEn]
+bellis belis
+bellissimo bcl/sEm]
+belliveau bel6vO
+bellizzi bclEts/
+bellm belm
+bellman belm~
+bellmon belm~
+bellmore belm{r
+bello bel]
+bellomo bclOm]
+bellomy bel}/
+bellon bel~
+bellone bclOn/
+bellotti bclOt/
+bellow bel]
+bellow's bel]z
+bellowed bel]d
+bellowing bel]6N
+bellows bel]z
+bellrose belrOz
+bells belz
+bells' belz
+bellsouth bels?T
+bellsouth's bels?Ts
+bellucci bclUC/
+belluomini belw]mEn/
+bellville belvil
+bellwether belweTP
+bellwethers belweTPz
+bellwood belwqd
+belly bel/
+bellyache bel/Ak
+belman belm~
+belmont belmont
+belmonte bclmont/
+belmore belm{r
+belnap belnap
+belnick beln6k
+belo bel]
+beloff bel{f
+beloit b@l<t
+belong b@l{N
+belonged b@l{Nd
+belongia bclOnj@
+belonging b@l{N6N
+belongings b@l{N6Nz
+belongs b@l{Nz
+belote bclOt/
+belous bel@s
+belov belov
+belove b@luv
+beloved b@luv@d
+beloved b@luvd
+below b/lO
+below b@lO
+bels belz
+belser belsP
+belshaw belS{
+belshe belS
+belsito bclsEt]
+belsky belsk/
+belson bels~
+belt belt
+belt's belts
+belted belt@d
+belter beltP
+belth belT
+belting belt6N
+belton belt~
+beltram beltram
+beltran beltr~
+belts belts
+beltsville beltsvil
+beltway beltwA
+beltz belts
+belue belyU
+beluga b@lUg@
+belushi bclUS/
+belva bAlv@
+belveal belv@l
+belvedere belv@dir
+belvia belv/@
+belvidere belv@dir
+belville belvil
+belvin belvin
+bely b@lI
+belyea bclE@
+belyeu bel/U
+belying b@lI6N
+belz belz
+belzberg beltsbPg
+belzbergs beltsbPgz
+belzbergs' belzbPgz
+belzer belzP
+bem bem
+beman bEm~
+bembenek bemb~@k
+bembry bembr/
+bement bEm~t
+bemis bEm@s
+bemiss bemis
+bemoan b}On
+bemoaned b}Ond
+bemoaning b}On6N
+bemoans b}Onz
+bemuse b}yUz
+bemused b}yUzd
+bemusement bemyUsm~t
+ben ben
+ben's benz
+bena ben@
+benackova ben@kOv@
+benak ben@k
+benami ben}E
+benanty bcnont/
+benard b~)rd
+benassi bcnos/
+benasuli ben@sUl/
+benatar ben@tP
+benavente bcnovent/
+benavides bAnovEdcs
+benavidez bAnovEdcz
+benazir ben@zir
+benbow benb]
+benbrook benbrqk
+bence bens
+bench benC
+bencher benCP
+benchers benCPz
+benches benC@z
+benchley benCl/
+benchmark benCmork
+benchmark's benCmorks
+benchmarks benCmorks
+bencivenga bcnC/veNg@
+bencomo bcnkOm]
+bencsik beNks6k
+bend bend
+benda bend@
+bendall bend@l
+bendectin bcndekt~
+bended bend@d
+bendel bend@l
+bendel bendel
+bendele bend@l
+bender bendP
+bender's bendPz
+benders bendPz
+bendick bend6k
+bendickson bend6ks~
+bendig bend6g
+bending bend6N
+bendix bend6ks
+bendixen bcndiks~
+bendler bendlP
+bendorf bend{rf
+bends bendz
+bendt bent
+bendure bAndqrA
+bene ben@
+beneath b~ET
+benecke ben@k
+benedek ben@d6k
+benedetti ben@det/
+benedetti's ben@det/z
+benedetto bcn@det]
+benedick ben@d6k
+benedict ben@dikt
+benedicta ben@d/kt@
+benedictine ben@dikt/n
+benedictine's ben@dikt/nz
+benedictines ben@dikt/nz
+benediction ben@dikS~
+benedikt ben@d6kt
+benedix ben@d6ks
+benefactor ben@faktP
+benefactor's ben@faktPz
+benefactors ben@faktPz
+beneficence b~ef@s~s
+beneficent ben@fiS~t
+beneficial ben@fiS@l
+beneficial's ben@fiS@lz
+beneficially ben@fiS@l/
+beneficiaries ben@fiS/er/z
+beneficiary ben@fiS/er/
+beneficiary's ben@fiS/er/z
+benefiel ben@f/l
+benefield ben@f/ld
+benefit ben@fit
+benefited ben@fit@d
+benefiting ben@fit6N
+benefits ben@fits
+benefitted ben@fit@d
+benefitting ben@fit6N
+beneke ben@k
+benel ben@l
+benelux ben@l@ks
+benenati b~~ot/
+benequity benekw@t/
+benes ben/s
+benesch ben6S
+benesh ben6S
+benetti bcnet/
+benetton ben@t{n
+benetton ben@t~
+benetton's ben@t{nz
+benetton's ben@t~z
+benevento ben@vAnt]
+benevides ben@v/dcs
+benevolence b~ev@l~s
+benevolent b~ev@l~t
+benezra ben@zr@
+benfer benfP
+benfield benf/ld
+benford benfPd
+bengal beNg@l
+bengali bcNgol/
+bengalis bcNgol/z
+bengals beNg@lz
+benge benj
+bengel beNg@l
+bengoechea beNg]CE@
+bengoechea beNg]cCE@
+bengston beNgst~
+bengt beNkt
+bengtson beNts~
+benguet beNg@t
+benham benh}
+benhamou benh}U
+beni ben/
+benighted b~It@d
+benign b~In
+benigna bcnEgn@
+benignly b~Inl/
+benigno ben6gn]
+benigno benEny]
+benihana ben/hon@
+benin bEnin
+beninati bcn/not/
+benincasa bcn/nkos@
+bening ben6N
+benish ben6S
+benita b~Et@
+benites benIts
+benitez bAnEtcz
+benito bcnEt]
+benito b~Et]
+benjamin benj}~
+benjamin's benj}~z
+benjimen benj}cn
+benjy benj/
+benke beNk
+benker beNkP
+benkert beNkPt
+benko beNk]
+benlate benlAt
+benlox benloks
+benn ben
+bennardo b~)rd]
+benne ben
+bennefield ben@f/ld
+benner benP
+bennet ben@t
+bennett ben@t
+bennett's ben@ts
+bennette bcnet
+bennetts ben@ts
+benney ben/
+bennick ben6k
+bennie ben/
+bennigan ben6g~
+bennigan's ben6g~z
+benning ben6N
+benninger ben6NP
+benningfield ben6Nf/ld
+benninghoff ben6Nh{f
+bennington ben6Nt~
+bennink ben6Nk
+bennion beny~
+bennis benis
+bennison ben@s~
+bennitt benit
+benno ben]
+benny ben/
+beno bAn]
+benoist bEn]@st
+benoit b~<t
+benoni bcnOn/
+benowitz ben@wits
+benoy ben<
+bens benz
+bensalem bensAl}
+bensch benS
+benscoter bensk@tP
+bensel bens@l
+bensen bens~
+benshoof benSqf
+bensing bens6N
+bensinger bens~jP
+benskin benskin
+bensley bensl/
+bensman bensm~
+benson bens~
+benson's bens~z
+bensonhurst bens~hPst
+benstock benstok
+bent bent
+bente bent
+benten bet~
+benter bentP
+benthall benT@l
+bentivegna bcnt/vegn@
+bentler bentlP
+bentley bentl/
+bentley's bentl/z
+bently bentl/
+bento bent]
+benton bent~
+bentonite bent~It
+bentonville bent~vil
+bentsen bents~
+bentsen's bents~z
+bentson bents~
+bentz bents
+bentzel bentz@l
+bentzen bentz~
+benveniste bcnvcnEst/
+benvenuti bcnvcnUt/
+benvenuto bcnvcnUt]
+benware benwcr
+benway benwA
+benyamin beny}En
+benyo bAny]
+benz benz
+benz's benz@z
+benzel benz@l
+benzene bcnzEn
+benzene benz/n
+benzes benz@z
+benzie benz/
+benziger benz6gP
+benzine benz/n
+benzing benz6N
+benzinger benz6NP
+beougher b?fP
+beowulf bA@wqlf
+bequeath b6kwET
+bequeathed b@kwETt
+bequest b6kwest
+bequests b6kwes
+bequests b6kwess
+bequests b6kwests
+bequette b6ket
+bera b,r@
+beran b,r~
+beranek b,r~6k
+berard bP)rd
+berardi bP)rd/
+berardinelli bPord/nel/
+berardino bPordEn]
+berardo bP)rd]
+berarducci bPordUC/
+berate b6rAt
+berated b6rAt@d
+berating b6rAt6N
+berber bVbP
+berberian bPbir/~
+berberich bVbP6k
+berbick bVb6k
+bercaw bVk{
+berch bVk
+berchenall bVk~ol
+berchtold bVkt]ld
+bercier bVk/P
+bercor bVk{r
+berdahl bVdol
+berdan bVd~
+berdine bPdEn/
+bere bir
+berea bPE@
+bereave bPEv
+bereaved bPEvd
+bereavement bPEvm~t
+bereft bPeft
+beregovoy bPeg@v<
+beregovoy ber@gOv<
+beregovoy bereg@v<
+berend b,rcnd
+berends b,rcndz
+berendt b,rcnt
+berendzen b,r~dz~
+berens bir~z
+berenson b,r~s~
+berent b,r~t
+beres bErz
+beresford birzfPd
+beret b,r@t
+beret bPA
+berets b,r@ts
+berets bPAz
+beretta bPet@
+berettas bPet@s
+berezine bir@z/n
+berezine bir@zIn
+berg bVg
+berg's bVgz
+bergamini bPgomEn/
+bergamo bPgom]
+bergan bVg~
+bergdahl bVgdol
+bergdoll bVgdol
+bergdorf bVgd{rf
+berge bVj
+bergeman bVgm~
+bergemann bVgm~
+bergen bVg~
+bergendahl bVgcndol
+bergenfield bVg~fEld
+bergenthal bVg~Tol
+berger bVgP
+berger's bVgPz
+bergerman bVgPm~
+bergeron bVgP{n
+bergerson bVgPs~
+berges bVj@z
+bergeson bVg@s~
+berget bVgct
+bergevin bVgcvin
+bergey bVj/
+bergfeld bVgfcld
+berggren bVgrcn
+bergh bVg
+berghoff bVgh{f
+berghuis bVghU@z
+bergin bVgin
+bergland bVgland
+bergling bVgl6N
+berglund bVgl~d
+bergman bVgm~
+bergmann bVgm~
+bergner bVgnP
+bergquist bVgkwist
+bergren bVgrcn
+bergs bVgz
+bergschneider bVgSnIdP
+bergsma b,rgzm@
+bergstedt bVgstct
+bergstein bVgstEn
+bergstein bVgstIn
+bergsten bVgs~
+bergstrand bVgstrand
+bergstrausser bVgstr?sP
+bergstrausser's bVgstr?sPz
+bergstresser bVgstresP
+bergstrom bVgstrom
+bergthold bVgTOld
+bergum bVg}
+berhow bVh]
+beria b,r/@
+bering b,r6N
+beringer b,r6NP
+berisford b,r@sfPd
+berish bV6S
+berjaya bPjI@
+berk bVk
+berka bVk@
+berke bVk
+berkebile bVk@bIl
+berkel bVk@l
+berkeley bVkl/
+berkeley's bVkl/z
+berkelman bVk@lm~
+berkemeier bVk}IP
+berken bVk~
+berkery bVkP/
+berkes bVks
+berkey bVk/
+berkheimer bVkhImP
+berkland bVkl~d
+berklee bVkl/
+berkley bVkl/
+berkline bVklIn
+berkman bVkm~
+berko bVk]
+berkoff bVk{f
+berkovitz bVk@vits
+berkowitz bVk@wits
+berkshire bVkSIr
+berkshire bVkSP
+berkshires bVkSIrz
+berkshires bVkSirz
+berkson bVks~
+berkstresser bVkstrcsP
+berlack bVlak
+berland bVl~d
+berlanga bPloNg@
+berlascone berl@skOn/
+berlascone's berl@skOn/z
+berle bVl
+berlet bVlet
+berlet's bVlets
+berlex bVleks
+berlin bPlin
+berlin's bPlinz
+berliner bPlInP
+berliner bPlinP
+berliners bPlinPz
+berling bVl6N
+berlinger bVl6NP
+berlitz bPlits
+berlottes bPlots
+berls bVlz
+berlusconi bVl@skOn/
+berlusconi's bVl@skOn/z
+berm bVm
+berman bVm~
+berman's bVm~z
+bermans bVm~z
+bermea b,rm/@
+bermel bVm@l
+bermuda bPmyUd@
+bermudas bPmyUd@z
+bermudes bPmyUdz
+bermudez bPmyUdez
+bermudez bVmyUdez
+bern bVn
+berna b,rn@
+bernabe bVn@b
+bernabei bVn@bI
+bernacki bPnotsk/
+bernadene bVn@d/n
+bernadette bPn@det
+bernadin bVn@din
+bernadine bPn@dEn
+bernadino bVn@dEn]
+bernal bVn@l
+bernama bPnom@
+bernard bPn)rd
+bernard bVnPd
+bernard's bPn)rdz
+bernardi bPn)rd/
+bernardin bVnord/n
+bernardini bPnordEn/
+bernardino bPn@dEn]
+bernardino bVnordEn]
+bernardo bPn)rd]
+bernardo's bPn)rd]z
+bernards bPn)rdz
+bernardy bPn)rd/
+bernas bVn@z
+bernasconi bPnoskOn/
+bernat bVn@t
+bernath bVn@T
+bernauer bVn?P
+bernay bPnA
+bernbach bVnbok
+bernd bVnt
+berndt bVnt
+berne bVn
+berneice bPnIs
+berner bVnP
+bernet bPnet
+bernett bVnct
+berney bVn/
+bernhagen bVnh@g~
+bernhard bVnhord
+bernhardt bVnhort
+bernhart bVnhort
+bernheim bVnhIm
+bernheimer bVnhImP
+berni b,rn/
+bernia b,rn/@
+bernice bPnEs
+bernick bVn6k
+bernie bVn/
+bernie's bVn/z
+bernier bVn/P
+berning bVn6N
+berninger bVn6NP
+bernita bPnEt@
+bernoulli bPnUl/
+berns bVnz
+bernsen bVns~
+bernson bVns~
+bernstein bVnst/n
+bernstein bVnstIn
+bernstein's bVnstEnz
+bernstein's bVnstInz
+bernsteins bVnst/nz
+bernsteins bVnstInz
+bernt bVnt
+berntsen bVnts~
+berntson bVnts~
+berny bVn/
+bero b,r]
+beron b,r~
+berquist bVkwist
+berra b,r@
+berra's b,r@z
+berrard bP)rd
+berrard ber)rd
+berres b,rz
+berreth b,r@T
+berrett b,r@t
+berrey b,r/
+berri b,r/
+berrian b,r/~
+berridge b,r6j
+berrie b,r/
+berrien b,r/~
+berrier b,r/P
+berries b,r/z
+berrigan b,r6g~
+berrill b,r@l
+berringer b,r6NP
+berrios bcrE]z
+berris b,r/z
+berrong b,r{N
+berry b,r/
+berry's b,r/z
+berryhill b,r/hil
+berrylike b,r/lIk
+berryman b,r/m~
+bersch bVS
+berserk bPsVk
+bershad bPSod
+berson bVs~
+berst bVst
+berstein bVst/n
+berstein bVstIn
+bert bVt
+berta bVt@
+bertch bVC
+berte bVt
+bertelli bPtel/
+bertels bVt@lz
+bertelsen bVt@ls~
+bertelsmann bVt@lzm~
+bertelsmann's bVt@lzm~z
+bertelson bVt@ls~
+berth bVT
+bertha bVT@
+berthelot bVT@lot
+berthelsen bVT@ls~
+berthiaume bVT/Um/
+berthold bVTOld
+bertholf bVT]lf
+berths bVTs
+berths bVTz
+berti b,rt/
+bertie bVt/
+bertil bVtil
+bertilde bVtild
+bertin bVt~
+bertini bPtEn/
+bertino bPtEn]
+bertke bVtk/
+bertling bVt@l6N
+bertold bVt]ld
+bertoldi bPtOld/
+bertoli bPtOl/
+bertolini bPt]lEn/
+bertolino bPt]lEn]
+bertolotti bPt]lOt/
+bertolucci bVt]lUC/
+berton bVt~
+bertone bPtOn/
+bertoni bPtOn/
+bertrade bVtr@d
+bertram bVtr}
+bertran bVtr~
+bertrand bVtr~d
+bertsch bVC
+bertsche bVC
+bertucci bPtUC/
+bertucci's bPtUC/z
+berty bVt/
+bertz bVts
+berube b,rUb
+berumen birUmcn
+berwald bVw{ld
+berwanger bVw{NP
+berwick bVw6k
+berwyn bVwin
+beryl b,r@l
+beryllium bPil/}
+berzin bVzin
+berzins bVzinz
+bes bEz
+besancon b@sank~
+besant bez~t
+besaw bEs{
+besch beS
+beschloss beSl{s
+beschloss' beSl{s
+beschloss's beSl{s@s
+besecker bes6kP
+besemer bes/mP
+beset b@set
+besetting b@set6N
+beshara biS)r@
+besharov beSPov
+beshears beS6rz
+beshloss beSl{s
+beshore beSP
+beside b@sId
+besides b@sIdz
+besiege b@sEj
+besieged b@sEjd
+besieging b@sEj6N
+beske besk
+besler bes@lP
+besner bresnP
+besner's bresnPz
+bespeak b@spEk
+bespeaks b@spEks
+bespectacle b@spekt@k@l
+bespectacled b@spekt@k@ld
+bess bes
+besse bes
+bessemer bes}P
+bessent bes~t
+besser besP
+bessert besPt
+bessette bcset
+bessey bes/
+bessie bes/
+bessinger bes~jP
+bessire bcsir/
+bessler beslP
+besso bes]
+besson bes~
+bessy bes/
+best best
+best's bests
+beste best
+bested best@d
+bester bestP
+bestial besC@l
+bestiality bcsCal@t/
+besting best6N
+bestow b@stO
+bestowed b@stOd
+bestowing b@stO6N
+bestows b@stOz
+bestrode b@strOd
+bestseller beselP
+bestseller besselP
+bestseller bestselP
+bestsellers beselPz
+bestsellers besselPz
+bestsellers bestselPz
+bestselling besel6N
+bestselling bessel6N
+bestselling bestsel6N
+bestul best@l
+bestwick bestwik
+beswick besw6k
+bet bet
+bet's bets
+beta bAt@
+betamax bAt}aks
+betancourt bet~k{rt
+betancur b@taNkP
+betar betor
+betas bAt@z
+betaseron bAt@s,ron
+betavon bet@von
+betcha beC@
+betcher beCP
+betel bet@l
+beteta bctAt@
+beth beT
+bethany beT~/
+bethard beTPd
+bethards beTPdz
+bethea beT/@
+bethel beT@l
+bethel beTel
+bethell beT@l
+bethesda b@Tezd@
+bethke beTk
+bethlehem beTl@hem
+bethlehem's beTl@hemz
+bethpage beTpAj
+bethune b@TyUn
+betide bitId
+betke betk/
+betker betkP
+betley betl/
+betray b@trA
+betrayal b@trA@l
+betrayals b@trA@lz
+betrayed b@trAd
+betraying b@trA6N
+betrays b@trAz
+bets bets
+betsch beC
+betschart beCort
+betschart betshort
+betsey bets/
+betsill bets@l
+betsy bets/
+betsy's bets/z
+bett bet
+betta bet@
+bettcher betCP
+bette bet/
+betten bet~
+bettenberg bet~bPg
+bettencourt bet~k{rt
+bettendorf bet~d{rf
+bettenhausen bet~h?z~
+better betP
+bettered betPd
+betteridge betP6j
+bettering betP6N
+betterment betPm~t
+betters betPz
+betterton betPt~
+bettes bet/z
+betti bet/
+bettin betin
+bettina b@tEn@
+betting bet6N
+bettinger bet6NP
+bettini bctEn/
+bettino bctEn]
+bettis betis
+bettman betm~
+bettman's betm~z
+bettner betnP
+betton bet~
+bettor betP
+bettors betPz
+betts bets
+betty bet/
+betty's bet/z
+between b/twEn
+between b@twEn
+betweens b/twEnz
+betweens b@twEnz
+betz bets
+betzer betzP
+betzler betslP
+betzold betz]ld
+beu bU
+beucler b<k@lP
+beukema bUkEm@
+beula bUl@
+beulah byUl@
+beumer bE}P
+beury bur/
+beury's bur/z
+beutel byUtel
+beuthin byUTin
+beutler b<t@lP
+beuys byU/z
+bev bev
+bevacqua bcvokw@
+bevalaqua bcv@lok@
+bevan bev~
+bevans bev~z
+bevaqua bcvok@
+bevard b6v)rd
+bevel bev@l
+bevelled bev@ld
+beven bev~
+bevens bEv~z
+bever bevP
+beverage bevP6j
+beverage bevr6j
+beverages bevr6j@z
+beveridge bevP6j
+beverley bevPl/
+beverlin bevPlin
+beverly bevPl/
+beverly's bevPl/z
+bevers bevPz
+bevier bev/P
+bevil bev@l
+bevilacqua bcv/lokw@
+bevill bev@l
+beville bEvil
+bevin bevin
+bevington bev6Nt~
+bevins bevinz
+bevis bevis
+bevmark bevmork
+bevy bev/
+beware b@w,r
+bewilder b@wildP
+bewildered b@wildPd
+bewildering b@wildP6N
+bewilderment b@wildPm~t
+bewilders b@wildPz
+bewitch b@wiC
+bewitched b@wiCt
+bewley byUl/
+bexley beksl/
+bey bA
+beyer bAP
+beyerle bIr@l
+beyerlein bIrlIn
+beyers bAPz
+beyersdorf bIrsd{rf
+beyl bAl
+beymer bAmP
+beynon bAn~
+beyond b6ond
+beyond bE{nd
+beytout bAt?t
+bezaire b@z,r
+bezanson bez~s~
+bezdek bezd6k
+bezek bezck
+bezner beznP
+bezold bez]ld
+bhagwan bogwon
+bhakta bokt@
+bhangra boNgr@
+bharata borot@
+bhatia boS@
+bhatia boty@
+bhatt bat
+bhatt bot
+bhattacharjy bot@C)rj/
+bhatti bot/
+bhatti botE
+bhiksha bEkSo
+bhiksha bikSo
+bhirud bir@d
+bhopal b]pol
+bhutan b@ton
+bhutan bUtan
+bhutto bUt]
+bhutto's bUt]z
+bi bI
+biaggi b/aj/
+biaggini bE@gEn/
+biagi b/oj/
+biagini b/@jEn/
+biagioni b/oj/On/
+bialas b/ol@s
+bialecki b/@lek/
+bialek b/olck
+bialik b/ol6k
+bialkin b/olk~
+bialkowski b/@lk?sk/
+bialy b/ol/
+biamby b/omb/
+biamby's b/omb/z
+biamonte b/}{nt/
+biana b/on@
+bianca b/oNk@
+bianchi b/onC/
+bianchini b/onCEn/
+bianco b/oNk]
+bianconi b/oNkOn/
+bianculli b/oNkUl/
+biannual bIanU@l
+bias bI@s
+biased bI@st
+biases bI@s@z
+biasi b/os/
+biaxial bIaks/@l
+bib bib
+biba bEb@
+bibb bib
+bibbee bib/
+bibbins bibinz
+bibbo bEb]
+bibbs bibz
+bibby bib/
+bibeau bibO
+bibeault bibO
+bibee bibE
+biber bIbP
+bibi bEbE
+bibi bibE
+bibi's bEbEz
+bibi's bibEz
+bible bIb@l
+bible's bIb@lz
+bibler bIb@lP
+bibles bIb@lz
+biblical bibl@k@l
+bibliographies bibl/ogr@f/z
+bibliography bibl/ogr@f/
+bibs bibz
+biby bIb/
+bic bik
+bicarbonate bIk)rb~@t
+bice bIs
+bicentenary bIsent~er/
+bicentennial bIscnten/@l
+biceps bIseps
+bichler bik@lP
+bichsel biks@l
+bick bik
+bickel bik@l
+bickell bik@l
+bicker bikP
+bickered bikPd
+bickering bikP6N
+bickers bikPz
+bickerstaff bikPstaf
+bickert bikPt
+bickerton bikPt~
+bickett bik@t
+bickford bikfPd
+bickham bikh}
+bickhart bikhort
+bicking bik6N
+bickle bik@l
+bickler biklP
+bickley bikl/
+bickmore bikm{r
+bicknell bikn@l
+bickner biknP
+bicksler bikslP
+bickwit bikwit
+bicoastal b6kOst@l
+bicuspid bIkusp@d
+bicuspids bIkusp@dz
+bicycle bIs6k@l
+bicycled bIs6k@ld
+bicycles bIs6k@lz
+bicycling bIsik@l6N
+bicycling bIsikl6N
+bicyclist bIsikl@st
+bicyclists bIsikl@s
+bicyclists bIsikl@ss
+bicyclists bIsikl@sts
+bid bid
+bid's bidz
+bidco bidk]
+bidcos bidk]s
+bidder bidP
+bidder's bidPz
+bidders bidPz
+biddie bid/
+bidding bid6N
+biddinger bid6NP
+biddison bid@s~
+biddix bid6ks
+biddle bid@l
+biddle's bid@lz
+biddy bid/
+bide bId
+biden bId~
+biderman bIdPm~
+bidgood bidgqd
+biding bId6N
+bidinger bId6NP
+bidlack bidlak
+bidlo bidl]
+bidlo's bidl]z
+bids bidz
+bidwell bidwel
+bidwill bidwil
+biebel bEb@l
+bieber bEbP
+bieda bEd@
+biederman bEdPm~
+biedermann bIdPm~
+biedermeier bEdPmIr
+biedrzycki b6jitsk/
+biegel bEg@l
+biegler bEg@lP
+biehl bEl
+biehle bEh@l
+biehler bElP
+biehn bEn
+bieker bEkP
+biel bEl
+biela bEl@
+bielak bEl@k
+bielanski b/lansk/
+bielat bEl@t
+bielawski b/lofsk/
+bielby bElb/
+bielecki b/letsk/
+bielecki bIlek/
+bielefeld bEl@fcld
+bielefeldt bEl@filt
+bielen bEl~
+bielenberg bEl~bPg
+bieler bElP
+bielicki b@litsk/
+bielinski b@linsk/
+bielke bElk
+bielski bElsk/
+bien bEn
+bieniek bin/ck
+bienkowski b6Nk{fsk/
+biennale b/enAl
+biennial bIen/@l
+bienstock bEnstok
+bienvenu b~venU
+bienvenue b~vAnwc
+bier bEr
+bierbarror birborP
+bierbauer birb?P
+bierbauer's birb?Pz
+bierbaum birb?m
+bierbusse birb@s
+bierce birs
+bierer birP
+bieri bir/
+bierlein birlIn
+bierley birl/
+bierly birl/
+bierma birm@
+bierman birm~
+biermann birm~
+biernacki b6rnotsk/
+biernat b6rnat
+biers bErz
+bierwirth birwPT
+biery bir/
+bies bIz
+biesecker bEs6kP
+bieser bEsP
+bietz bEts
+biev bEv
+biev's bEvz
+biever bEvP
+bifano b@fon]
+biff bif
+biffle bif@l
+bifida bif@d@
+bifocal bIf]k@l
+bifocals bIf]k@lz
+bifulco b@fUlk]
+bifurcate bIfPkAt
+bifurcate bifPkAt
+bifurcated bIfPkAt@d
+bifurcated bifPkAt@d
+bifurcation bIfPkAS~
+bifurcation bifPkAS~
+big big
+bigbee bigbE
+bigbie bigb/
+bigby bigb/
+bigelow big@lO
+bigelow's big@lOz
+bigeyes bigIz
+bigfoot bigfqt
+bigford bigfPd
+biggar bigP
+bigger bigP
+biggers bigPz
+biggerstaff bigPstaf
+biggest big@st
+biggie big/
+biggies big/z
+biggins biginz
+biggio bEj/]
+biggs bigz
+bigham bIgh}
+bighorn bigh{rn
+bighorns bigh{rnz
+bigler bIg@lP
+bigler bIglP
+bigley bigl/
+biglin biglin
+biglow bigl]
+bignell b6gnel
+bigness bign@s
+bigos bEg]z
+bigot big@t
+bigoted big@t@d
+bigotry big@tr/
+bigots big@ts
+bigs bigz
+bigsby bigzb/
+bigtime bigtIm
+bigwig bigwig
+bigwigs bigwigz
+bigwood bigwqd
+bihac bEhoC
+bihac's bEhoC@z
+bihari b/h)r/
+bihari bih)r/
+bihl bil
+bihm bim
+bihn bin
+bijac bEjak
+bijac bIjak
+bijan bij~
+bijeljina b6jelj/n@
+bijur b/Zqr
+bike bIk
+biked bIkt
+biker bIkP
+bikers bIkPz
+bikes bIks
+bikin bikin
+biking bIk6N
+bikini b6kEn/
+bikinis b@kEn/z
+biko bEk]
+bil bil
+bila bEl@
+bilateral bIlatP@l
+bilaterally bIlatP@l/
+bilbao bilb?
+bilbo bilbO
+bilbrey bilbr/
+bilbro bElbr]
+bilby bilb/
+bild bild
+bilderback bIldPbak
+bildner bildnP
+bildt bilt
+bildt's bilts
+bile bIl
+bilek bilck
+bilello b@lel]
+biles bIlz
+bilger bilgP
+bilicki b@litsk/
+bilings bIl6Nz
+bilingual bIliNgw@l
+bilingualism bIliNgw@liz}
+bilinski b@linsk/
+bilious bil/@s
+bilirakis b@lir@k@s
+bilk bilk
+bilka bilk@
+bilked bilkt
+bilking bilk6N
+bilko bilk]
+bill bil
+bill's bilz
+billable bil@b@l
+billancourt bil~k{rt
+billard b@l)rd
+billboard bilb{rd
+billboard's bilb{rdz
+billboards bilb{rdz
+bille bIl
+billed bild
+biller bilP
+billerica bilPEk@
+billes bilz
+billet bil@t
+billeter bil/tP
+billets bil@ts
+billett bil@t
+billfold bilfOld
+billiard bilyPd
+billiards bilyPdz
+billick bil6k
+billie bil/
+billig bil6g
+billing bil6N
+billinger bil6NP
+billingham bil6Nham
+billings bil6Nz
+billingslea bil6Nzl/
+billingsley bil6Nzl/
+billingsly bil6Nzl/
+billington bil6Nt~
+billion bily~
+billionaire bily~,r
+billionaires bily~,rz
+billions bily~z
+billionth bily~T
+billionths bily~Ts
+billiot bil/ot
+billips bil@ps
+billiter bil/tP
+billiton bil@t~
+billman bilm~
+billmeyer bilmIP
+billon bil~
+billow bil]
+billowed bil]d
+billowing bil]6N
+billows bil]z
+bills bilz
+bills' bilz
+billup bil@p
+billups bil@ps
+billy bil/
+billy's bil/z
+bilodeau bil@d]
+bilotta bilOt@
+bilotti bilot/
+bilow bil]
+biloxi b@luks/
+biloxi's b@luks/z
+bilski bilsk/
+bilsky bilsk/
+bilson bils~
+biltmore biltm{r
+bilton bilt~
+biltz bilts
+bily bil/
+bilyeu bil/U
+bilyk bil6k
+bilzerian bilz,r/~
+bilzerian's bilz,r/~z
+bima bEm@
+bimbo bimb]
+bimbos bimb]s
+bimini bim~/
+bimini b}En/
+bimiodal bImOd@l
+bimonthly bImunTl/
+bin bin
+bina bEn@
+binary bInP/
+binational bInaS~@l
+bind bInd
+bindel bind@l
+binder bIndP
+binders bIndPz
+binding bInd6N
+bindle bind@l
+bindles bind@lz
+bindley bindl/
+binds bIndz
+binegar bin6gP
+bines bInz
+binette binet
+binetti binet/
+binfield binfEld
+binford binfPd
+bing biN
+binga bENg@
+bingaman biN}~
+binge binj
+bingel biNg@l
+bingenheimer biNg~hImP
+binger biNP
+binges binj@z
+bingham biN}
+binghamton biN}t~
+binging biNg6N
+bingle biNg@l
+bingley biNl/
+bingman biNm~
+bingo biNg]
+binion biny~
+bink biNk
+binkley biNkl/
+binkowski biNk{fsk/
+binn bin
+binner binP
+binney bin/
+binnie bin/
+binning bin6N
+binns binz
+binocular b~oky@lP
+binoculars b~oky@lPz
+binomial bInOm/@l
+bins binz
+binstock binstok
+bintz bints
+binz binz
+bio bIO
+bio's bIOz
+biochem bI@C}
+biochemical bI]kem@k@l
+biochemist bI]kem@st
+biochemistry bI]kem@str/
+biocine bI@sEn
+biocontrol bI@kontrol
+biocraft bI]kraft
+biodegradable bI]d@grAd@b@l
+biodiverse bI]dIvVs
+biodiversity bI]dIvVs@t/
+bioengineer bI]enj~ir
+bioengineered bI]enj~ird
+bioengineering bI]enj~ir6N
+bioethics bI]eT6ks
+biofeedback bI]fEdbak
+biogen bI]jen
+biogen's bI]jenz
+biographer bIogr@fP
+biographers bIogr@fPz
+biographical bI@graf6k@l
+biographies bIogr@f/z
+biography bIogr@f/
+biohazard bI]hazPd
+biohazards bI]hazPdz
+biologic bI@loj6k
+biological bI@loj6k@l
+biologically bI@loj6kl/
+biologicals bI@loj6k@lz
+biologics bI@loj6ks
+biologist bIol@j@st
+biologists bIol@j@s
+biologists bIol@j@ss
+biologists bIol@j@sts
+biology bIol@j/
+biology's bIol@j/z
+biomass bI}as
+biomaterial bI]m@tir/@l
+biomaterials bI]m@tir/@lz
+biome bIOm
+biomed bI]med
+biomed's bI]medz
+biomedical bI]med6k@l
+biomedicals bI]med6k@lz
+biomes bIOmz
+biomet bI]mct
+biondi b/ond/
+biondo b/Ond]
+biondolillo b/]nd]lil]
+bionetic bI]net6k
+bionetics bI]net6ks
+biopharm bI@form
+biopharmaceutical bI]form@sUt6k@l
+biopharmacy bI]f)rm@s/
+biophysics bI]fis6ks
+biopsies bIops/z
+biopsy bIops/
+bios bI]s
+biosafety bI]sAft/
+bioscience bI]sE~s
+biosciences bI{s/ens@z
+biosensor bI]sensP
+biosensors bI]sensPz
+biosis b/Osis
+biosis b/Ozis
+biosphere bI]sfir
+biosphere's bI]sfirz
+biospheres bI]sfirz
+biospherian bI]sfir/~
+biospherians bI]sfir/~z
+biosys bI]s6s
+biosystem bI]sist}
+biosystems bI]sist}z
+biotech bI]tek
+biotechnica bI]tekn6k@
+biotechnica's bI]tekn6k@z
+biotechnological bI]tekn@loj6k@l
+biotechnologies bI]teknol@j/z
+biotechnology bI]teknol@j/
+biotechnology's bI]teknol@j/z
+biotechs bI]teks
+biotherapeutic bI]Ter@pyUt6k
+biotherapeutics bI]Ter@pyUt6ks
+biotin bI@t~
+biotite bI@tIt
+biovest bI]v@st
+bipartisan bIp)rt@s~
+bipartisan bIp)rt@z~
+bipartisanship bIp)rt@s~Sip
+bipartisanship bIp)rt@z~Sip
+biphenyl bif~@l
+biphenyls bif~@lz
+biplane bIplAn
+bipolar bIpOlP
+bippus bip@s
+bir bV
+biracial bIrAS@l
+birch bVC
+birch's bVC@z
+birchall bVk@l
+birchard bVkPd
+bircher bVCP
+birchett bVC@t
+birchfield bVCfEld
+birchler bVk@lP
+birchmeier bVkmIP
+birckhead bVkhcd
+bird bVd
+bird's bVdz
+birdcage bVdkAj
+birden bVd~
+birder bVdP
+birders bVdPz
+birdfeather bVdfeTP
+birdfeather's bVdfeTPz
+birdfeeder bVdf/dP
+birdfeeders bVdf/dPz
+birdfinder bVdfIndP
+birdie bVd/
+birdied bVd/d
+birdlife bVdlIf
+birdman bVdman
+birds bVdz
+birds' bVdz
+birdsall bVdz{l
+birdsell bVds@l
+birdsong bVds{N
+birdwell bVdwel
+birdy bVd/
+bireme bIrEm
+biremes bIrEmz
+birenbaum bIr~b?m
+bires bIrz
+birge bVj
+birinyi b6rEny/
+birk bVk
+birkedal bVk@dol
+birkel bVk@l
+birkeland bVkl~d
+birkenau bVk~?
+birkes bVks
+birkett bVk@t
+birkey bVk/
+birkhead bVkhcd
+birkhimer bVkhimP
+birkholz bVkh]lz
+birkland bVkl~d
+birkner bVknP
+birks bVks
+birky bVk/
+birle bVl
+birley bVl/
+birman bVm~
+birmid bVm@d
+birmid's bVm@dz
+birmingham bVm6Nham
+birnbaum bVnb?m
+birney bVn/
+birnie bVn/
+biro bir]
+biron bIr~
+biros bIr]z
+birr bV
+birren bV~
+birt bVt
+birtcher bVCP
+birth bVT
+birthday bVTdA
+birthdays bVTdAz
+birthing bVT6N
+birthmark bVTmork
+birthmarks bVTmorks
+birthplace bVTplAs
+birthrate bVTrAt
+birthrates bVTrAts
+birthright bVTrIt
+births bVTs
+birtle bVt@l
+birtley bVtl/
+birtley's bVtl/z
+bis bis
+bisaillon bIs@lon
+bisbee bisb/
+bisbing bisb6N
+biscardi bisk)rd/
+biscayne biskAn
+bisceglia bisCegl/@
+bisch biS
+bischel biS@l
+bischof biS@f
+bischofberger biS{fbPgP
+bischoff biskh{f
+biscoe biskO
+biscuit bisk@t
+biscuits bisk@ts
+bise bIz
+bisek bis6k
+bisel bis@l
+biser bIzP
+bisesi bises/
+bisexual bIsekSU@l
+bisexuality bIsckSUal@t/
+bisexuals bIsekSU@lz
+bish biS
+bisher biSP
+bishoff bish{f
+bishop biS@p
+bishop's biS@ps
+bishoprics biS@pr6ks
+bishops biS@ps
+bishops' biSops
+bishopsgate biS@psgAt
+bisiani bis/on/
+bisig bis6g
+bisignano bis/gnon]
+biskup bisk@p
+bismarck bizmork
+bismarck's bizmorks
+bismark bizmork
+bismuth bizm@T
+bison bIs~
+bisping bisp6N
+bisque bisk
+biss bis
+bissell bis@l
+bissen bis~
+bisset bisit
+bissett bisit
+bissette biset
+bissey bis/
+bissinger bis~jP
+bisso bEs]
+bisson bis~
+bissonette bis~ct
+bissonnette bis~et
+bistline bistlIn
+bistodeau bist@d]
+bistro bistr]
+bisuteki bEsUtAk/
+bisuteki's bEsUtAk/z
+bit bit
+bitar bitP
+bitch biC
+bitches biC@z
+bitchy biC/
+bite bIt
+biter bItP
+bites bIts
+bitesize bitsIz
+bither biTP
+biting bIt6N
+bitler bIt@lP
+bitler bItlP
+bitner bitnP
+bitney bitn/
+bits bits
+bitsy bits/
+bittel bit@l
+bitten bit~
+bittenbender bit~bendP
+bitter bitP
+bitterest bitP@st
+bitterly bitPl/
+bitterman bitPm~
+bitterman's bitPm~z
+bittermann bitPm~
+bittermann's bitPm~z
+bitterness bitPn@s
+bitterroot bitPrUt
+bitters bitPz
+bittersweet bitPswEt
+bittick bit6k
+bitting bit6N
+bittinger bit6NP
+bittle bit@l
+bittman bitm~
+bittner bitnP
+bitton bit~
+bitty bit/
+bitumen bItUm~
+bitumen bitUm~
+bituminous b@tUm~@s
+bitz bits
+bitzer bitzP
+bivalve bIvalv
+bivalves bIvalvz
+biven bIv~
+bivens bIv~z
+biviano bEv/on]
+bivin bivin
+bivins bivinz
+bivona b6vOn@
+bivouac bivwak
+biweekly bIwEkl/
+bix biks
+bixby biksb/
+bixel biks@l
+bixler bikslP
+biz biz
+bizango bizaNg]
+bizarre b@z)r
+bizmart bizmort
+bizub biz@b
+bizzell biz@l
+bizzy biz/
+bjelasnica byclasn6k@
+bjelland byel~d
+bjerke byVk
+bjoern by{rn
+bjorge by{rg
+bjork by{rk
+bjorklund by{rkl~d
+bjorkman by{rkm~
+bjorn by{rn
+bjornstad by{rnst@d
+blachly bloCl/
+blachly blokl/
+black blak
+black's blaks
+blackard blakPd
+blackball blakb{l
+blackberries blakber/z
+blackberry blakber/
+blackbird blakbPd
+blackbirds blakbPdz
+blackboard blakb{rd
+blackboards blakb{rdz
+blackburn blakbPn
+blacked blakt
+blacken blak~
+blackened blak~d
+blackening blakn6N
+blackening blak~6N
+blackens blak~z
+blacker blakP
+blackerby blakPb/
+blackest blak@st
+blacketer blak/tP
+blackett blakit
+blackfoot blakfqt
+blackford blakfPd
+blackham blakh}
+blackhawk blakh{k
+blackhawk's blakh{ks
+blackhawks blakh{ks
+blackheath blakhET
+blackhurst blakhPst
+blackjack blakjak
+blackledge blaklej
+blackley blakl/
+blacklist blaklist
+blacklisted blaklist@d
+blacklisting blaklist6N
+blacklock blaklok
+blackmail blakmAl
+blackmailed blakmAld
+blackmailing blakmAl6N
+blackman blakm~
+blackmer blakmP
+blackmon blakm~
+blackmore blakm{r
+blackmun blakm~
+blackmun's blakm~z
+blackness blakn@s
+blackout blak?t
+blackouts blak?ts
+blackpool blakpUl
+blackrock blakrok
+blacks blaks
+blacks' blaks
+blacksburg blaksbPg
+blackshear blakS6r
+blacksher blakSP
+blackshire blakSIr
+blacksmith blaksmiT
+blackson blaks~
+blackstock blakstok
+blackston blakst~
+blackstone blakstOn
+blackstone's blakstOnz
+blacktop blaktop
+blackwelder blakweldP
+blackwell blakwel
+blackwood blakwqd
+bladder bladP
+bladders bladPz
+blade blAd
+bladed blAd@d
+bladen blAd~
+blades blAdz
+blading blAd6N
+bladow blad]
+blaese blAz
+blaesing bles6N
+blagden blagd~
+blagg blag
+blah blo
+blaha bloh@
+blahnik blon6k
+blahut blah@t
+blaich blAC
+blaikie blAk/
+blain blAn
+blaine blAn
+blair bl,r
+blair's bl,rz
+blais blez
+blaisdell blAsd@l
+blaise blAz
+blaiser blAzP
+blaize blAz
+blake blAk
+blake's blAks
+blakeley blAkl/
+blakeley's blAkl/z
+blakely blAkl/
+blakely's blAkl/z
+blakeman blAkm~
+blakemore blAkm{r
+blakeney blAkn/
+blakeney's blAkn/z
+blakenham blAk~ham
+blakenship blAk~Sip
+blaker blAkP
+blakes blAks
+blakeslee blAksl/
+blakesley blAksl/
+blakey blAk/
+blakley blakl/
+blakney blakn/
+blalack blal@k
+blalock blalok
+blame blAm
+blamed blAmd
+blameless blAml@s
+blames blAmz
+blaming blAm6N
+blampied blamp/d
+blan blan
+blanc blaNk
+blanca bloNk@
+blancett blansit
+blanch blanC
+blanchard blanCPd
+blanchard's blanCPdz
+blanchards blanCPdz
+blanche blanC
+blanchet blank@t
+blanchett blanC@t
+blanchette bl~Set
+blanchfield blanCfEld
+blanck blaNk
+blanco blaNk]
+bland bland
+blanda bland@
+blander blandP
+blandford blandf{rd
+blandin blandin
+blanding bland6N
+blandino blondEn]
+blandishment bland6Sm~t
+blandishments bland6Sm~ts
+blandly blandl/
+blandness blandn@s
+blando bland]
+blandon bland~
+blane blAn
+blaney blAn/
+blanford blanfPd
+blank blaNk
+blanke blaNk
+blanked blaNkt
+blanken blaNk~
+blankenbaker blaNk~bAkP
+blankenbeckler blaNk~beklP
+blankenburg blaNk~bPg
+blankenhorn blaNk~hPn
+blankenship blaNk~Sip
+blanket blaNk@t
+blanketed blaNk@t@d
+blanketing blaNk@t6N
+blankets blaNk@ts
+blanking blaNk6N
+blankinship blaNk~Sip
+blankley blaNkl/
+blankly blaNkl/
+blankly's blaNkl/z
+blanks blaNks
+blann blan
+blanquita blonkEt@
+blansett blansit
+blanton blant~
+blare bl,r
+blared bl,rd
+blares bl,rz
+blaring bl,r6N
+blas blos
+blaschke blaSk
+blasco blosk]
+blasdel blasd@l
+blasdell blasd@l
+blase blAz
+blaser blAzP
+blasi blAz/
+blasia blos/@
+blasier blAZP
+blasier blAz/P
+blasier's blAZPz
+blasier's blAz/Pz
+blasing blAz6N
+blasingame blos6Ngom/
+blasini bl@sEn/
+blasius blAs/@s
+blaske blAsk
+blasko blosk]
+blasphemous blasf}@s
+blasphemy blasf}/
+blass blas
+blassingame blos6Ngom/
+blast blast
+blastdown blastd?n
+blasted blast@d
+blaster blastP
+blasting blast6N
+blastoff blast{f
+blasts blasts
+blaszak bloS@k
+blaszczyk bloSC6k
+blatant blAt~t
+blatantly blAt~tl/
+blatchford blaCfPd
+blatchley blaCl/
+blather blaTP
+blatnik blatn6k
+blatt blat
+blatter blatP
+blattner blatnP
+blatz blats
+blau bl?
+blauch bl{C
+blauer bl?r
+blaum bl{m
+blauser bl?sP
+blaustein bl?st/n
+blaustein bl?stIn
+blauvelt bl?vclt
+blay blA
+blaydes blAdz
+blaydon blAd~
+blaylock blAl@k
+blayne blAn
+blayney blAn/
+blayze blAz
+blaze blAz
+blazed blAzd
+blazejewski bl@zAefsk/
+blazek blozck
+blazer blAzP
+blazers blAzPz
+blazes blAz@z
+blazier blAz/P
+blazina blozEn@
+blazing blAz6N
+blea blE
+bleach blEC
+bleached blECt
+bleacher blECP
+bleachers blECPz
+bleaching blEC6N
+bleak blEk
+bleaker blEkP
+bleakest blEk@st
+bleakley blEkl/
+bleakness blEkn@s
+bleakney blEkn/
+bleam blEm
+bleary blir/
+bleau blO
+blech blek
+blech's bleks
+blecha bleC@
+blecher blekP
+blechley blekl/
+blechman blekm~
+bleck blek
+blecker blekP
+bled bled
+bledsoe bleds]
+bleecker blEkP
+bleed blEd
+bleeding blEd6N
+bleeds blEdz
+bleeker blEkP
+bleep blEp
+bleeping blEp6N
+blegen bleg~
+blehm blem
+bleich blIk
+bleicher blIkP
+bleier blIP
+bleil blEl
+bleiler blIlP
+blelloch blelok
+blemish blem6S
+blemished blem6St
+blemishes blem6S@z
+blend blend
+blenda blend@
+blendax blendaks
+blended blend@d
+blender blendP
+blenders blendPz
+blending blend6N
+blends blendz
+blenheim blenhIm
+blepharisma blefPizm@
+bleser blEzP
+bless bles
+blessed blest
+blesses bles@z
+blessing bles6N
+blessinger bles6NP
+blessings bles6Nz
+blessington bles6Nt~
+blest blest
+blethen bleT~
+bleu blU
+blevens blEv~z
+blevins blevinz
+blew blU
+blewett blUit
+blewitt blUit
+bley blA
+blick blik
+blickenstaff blik~st@f
+bligh blI
+blight blIt
+blighted blIt@d
+bliley blIl/
+blimp blimp
+blimps blimps
+blincoe blinkO
+blind blInd
+blinded blInd@d
+blinder blIndP
+blinder's blIndPz
+blinders blIndPz
+blindfold blIndfOld
+blindfolded blIndfOld@d
+blinding blInd6N
+blindly blIndl/
+blindness blIndn@s
+blindness blInn@s
+blinds blIndz
+blindside blIndsId
+blindsided blIndsId@d
+blink bliNk
+blinked bliNkt
+blinking bliNk6N
+blinks bliNks
+blinn blin
+blip blip
+blips blips
+bliscoll blisk{l
+blish bliS
+bliss blis
+blissett blisit
+blissful blisf@l
+blissfully blisf@l/
+blister blistP
+blistered blistPd
+blistering blistP6N
+blisters blistPz
+blitch bliC
+blithe blIT
+blithely blITl/
+blitstein blitst/n
+blitstein blitstIn
+blitz blits
+blitzed blitst
+blitzer blitzP
+blitzer's blitzPz
+blitzes blits@z
+blitzkrieg blitskrEg
+bliven blIv~
+blixt blikst
+blizard blizPd
+blizzard blizPd
+blizzards blizPdz
+bloat blOt
+bloated blOt@d
+bloating blOt6N
+blob blob
+blobby blob/
+blobs blobz
+bloc blok
+bloc's bloks
+bloch blok
+bloch's bloks
+blocher blokP
+block blok
+block's bloks
+blockade blokAd
+blockaded blokAd@d
+blockades blokAdz
+blockading blokAd6N
+blockage blok6j
+blockages blok6j@z
+blockbuster blokbustP
+blockbuster's blokbustPz
+blockbusters blokbustPz
+blocked blokt
+blocker blokP
+blockers blokPz
+blocking blok6N
+blocks bloks
+blocs bloks
+blodgett bloj@t
+bloedel blOd@l
+bloedorn blOdPn
+bloem blOm
+bloemer blOmP
+bloemker blOmkP
+blohm blOm
+blok blok
+bloke blOk
+blokes blOks
+blom blom
+blomberg blombPg
+blome blOm
+blomgren blomgrcn
+blomquist blomkwist
+blomstrom blomstr}
+blond blond
+blonde blond
+blonde's blondz
+blondell blond@l
+blonder blondP
+blondes blondz
+blondie blond/
+blondin blondin
+blonds blondz
+blood blud
+blood's bludz
+bloodbath bludbaT
+blooded blud@d
+bloodgood bludgqd
+bloodhound bludh?nd
+bloodhounds bludh?ndz
+bloodhounds bludh?nz
+bloodied blud/d
+bloodier blud/P
+bloodiest blud/@st
+bloodless bludl@s
+bloodletting bludlet6N
+bloodline bludlIn
+bloodlines bludlInz
+bloods bludz
+bloodshed bludSed
+bloodstain bludstAn
+bloodstained bludstAnd
+bloodstains bludstAnz
+bloodstone bludstOn
+bloodstream bludstrEm
+bloodsucker bludsukP
+bloodsuckers bludsukPz
+bloodsucking bludsuk6N
+bloodsworth bludzwVT
+bloodthirsty bludTVst/
+bloodworth bludwVT
+bloody blud/
+bloom blUm
+bloom's blUmz
+bloomberg blUmbPg
+bloomberg's blUmbPgz
+bloomed blUmd
+bloomer blUmP
+bloomers blUmPz
+bloomfield blUmfEld
+blooming blUm6N
+bloomingdale blUm6NdAl
+bloomingdale's blUm6NdAlz
+bloomingdales blUm6NdAlz
+bloomington blUm6Nt~
+bloomquist blUmkwist
+blooms blUmz
+blooper blUpP
+bloopers blUpPz
+bloor blqr
+blose blOz
+bloss bl{s
+blosser bl{sP
+blossom blos}
+blossomed blos}d
+blossoming blos}6N
+blossoms blos}z
+blot blot
+blotnick blotn6k
+blots blots
+blotter blotP
+blouch bl?C
+blough bl?
+blouin blwEn
+blount bl?nt
+blouse bl?s
+blouses bl?s@z
+blow blO
+blowe blO
+blowed blOd
+blower blOP
+blowers blOPz
+blowfish blOf6S
+blowing blO6N
+blown blOn
+blowout blO?t
+blowouts blO?ts
+blows blOz
+blowtorch blOt{rC
+blowup blOup
+blowy blO/
+bloxham bloks}
+bloxom bloks}
+bloxsom bloks}
+bloyd bl<d
+bloyer bl<P
+blubaugh blub{
+blubber blubP
+bludgeon bluj~
+bludgeoned bluj~d
+bludgeoning bluj~6N
+blue blU
+blue's blUz
+blueberries blUber/z
+blueberry blUber/
+bluebird blUbVd
+bluebonnet blUbon@t
+bluebonnets blUbon@ts
+bluechip blUCip
+bluefield blUfEld
+bluegrass blUgras
+bluejay blUjA
+bluemel blqm@l
+blueprint blUprint
+blueprints blUprints
+bluer blUP
+blues blUz
+blues' blUz
+bluest blU@st
+bluestein blqst/n
+bluestein blqstIn
+bluestine blUstIn
+bluestone blUstOn
+bluett blUt
+bluey blU/
+bluff bluf
+bluffed bluft
+bluffing bluf6N
+bluffs blufs
+bluford blUfPd
+bluhdorn blud{rn
+bluhm blum
+bluing blU6N
+bluish blU6S
+bluitt blUt
+blum blUm
+blumberg blumbPg
+blume blUm
+blumenberg blUmcnbPg
+blumenfeld blum~fcld
+blumenschein blum~SIn
+blumenshine blum~SIn
+blumenstein blUmcnst/n
+blumenstein blUmcnstIn
+blumenstock blUmcnstok
+blumenthal blUm~T{l
+blumer blUmP
+blumstein blumst/n
+blumstein blumstIn
+blunck bluNk
+blundall blund@l
+blundell blund@l
+blunder blundP
+blundered blundPd
+blundering blundP6N
+blunders blundPz
+blunk bluNk
+blunt blunt
+blunted blunt@d
+blunter bluntP
+bluntest blunt@st
+blunting blunt6N
+bluntly bluntl/
+bluntness bluntn@s
+blunts blunts
+blur blV
+blurb blVb
+blurbs blVbz
+blurred blVd
+blurring blV6N
+blurry blV/
+blurs blVz
+blurt blVt
+blurted blVt@d
+blurton blVt~
+blurts blVts
+blush bluS
+blushed bluSt
+blushes bluS@z
+blushing bluS6N
+blust blust
+bluster blustP
+blustering blustP6N
+blustery blustP/
+bluth blUT
+blvd bql@vord
+bly blI
+blye blI
+blyler blIlP
+blystone blIstOn
+blyth bliT
+blythe blIT
+bo bO
+bo-shek bOSek
+boa bO@
+boak bOk
+boake bOk
+boal bOl
+boals bOlz
+boan bOn
+boar b{r
+board b{rd
+board's b{rdz
+boarda b{rd@
+boardbent b{rdbent
+boarded b{rd@d
+boarder b{rdP
+boarders b{rdPz
+boarding b{rd6N
+boardinghouse b{rd6Nh?s
+boardinghouses b{rd6Nh?s@z
+boardings b{rd6Nz
+boardman b{rdm~
+boardroom b{rdrUm
+boardrooms b{rdrUmz
+boards b{rdz
+boardwalk b{rdw{k
+boarman b{rm~
+boart b{rt
+boas bO@z
+boase bOz
+boast bOst
+boasted bOst@d
+boastful bOstf@l
+boasting bOst6N
+boasts bOs
+boasts bOss
+boasts bOsts
+boat bOt
+boat's bOts
+boated bOt@d
+boaters bOtPz
+boathouse bOth?s
+boating bOt6N
+boatlift bOtlift
+boatlift's bOtlifts
+boatlifts bOtlifts
+boatload bOtlOd
+boatloads bOtlOdz
+boatman bOtm~
+boatmen's bOtmcnz
+boatner bOtnP
+boatright bOtrIt
+boats bOts
+boatwright bOtrIt
+boatyard bOtyord
+boaz bOaz
+bob bob
+bob's bobz
+boback bObak
+bobadilla b]bodil@
+bobak bOb@k
+bobb bob
+bobber bobP
+bobbett bob@t
+bobbette bob@t
+bobbi bob/
+bobbie bob/
+bobbin bob~
+bobbing bob6N
+bobbinger bob6NP
+bobbinger's bob6NPz
+bobbitt bobit
+bobbitt's bobits
+bobbitts bobits
+bobbo bob]
+bobby bob/
+bobby's bob/z
+bobcat bobkat
+bobcats bobkatz
+bobe bOb
+bobeck bObek
+bobek bOb6k
+bober bobP
+boberg bObPg
+bobick bob6k
+bobier bOb/P
+bobinski b@binsk/
+boblitt b@blit
+bobo bOb]
+bobolas bOb]l@s
+bobrow bobrO
+bobrowski b@br{fsk/
+bobsled bobsled
+bobst bobst
+bobzien bobz/n
+boca bOk@
+bocanegra bOk~egr@
+bocce bOC/
+bocce bOk@
+bocchino bOkEn]
+boccia bOC@
+boccio bOC/]
+boccuzzi b]kUts/
+bocek bOCek
+boch bok
+bocharov boCPov
+bochco boCk]
+boche boC
+bochenek bok~6k
+boches boC@z
+bochicchio b]kEk/]
+bochner boknP
+bochram bokr}
+bocian bOS~
+bock bok
+bockelman bok@lm~
+bockius bok/@s
+bockman bokm~
+bockus bok@s
+bocock bok@k
+bocook bokqk
+boda bOd@
+bodamer bod}P
+bodanis b]don@s
+bodden bod~
+boddie bod/
+boddington bod6Nt~
+boddy bod/
+bode bOd
+bodegas b]dAg@s
+bodell b@del
+boden bOd~
+bodenhamer bod~h}P
+bodenheimer bod~hImP
+bodenstein bOd~stEn
+bodenstein bOd~stIn
+bodensteiner bOd~stInP
+bodes bOdz
+bodey bOd/
+bodi bOd/
+bodie bOd/
+bodied bod/d
+bodies bod/z
+bodikova bod6kOv@
+bodily bod@l/
+bodin bOdin
+bodine b]dEn/
+bodkin bodkin
+bodkins bodkinz
+bodle bOd@l
+bodley bodl/
+bodman bodm~
+bodmer bodmP
+bodnar b@dn)r
+bodner bodnP
+bodo bOd]
+bodwell bodwel
+body bod/
+body's bod/z
+bodyguard bod/gord
+bodyguards bod/gordz
+bodziak b{dz/ak
+bodziak's b{dz/aks
+boe bO
+boeck bOk
+boeckel bOk@l
+boecker bOkP
+boeckman bOkm~
+boeckmann bOkm~
+boedecker bOd6kP
+boedeker bOd6kP
+boeder bOdP
+boeding bOd6N
+boege bOj
+boeger bOgP
+boeh bO
+boehl bOl
+boehle bOh@l
+boehler bOlP
+boehlert bOlPt
+boehlke bOlk
+boehm bAm
+boehm bOm
+boehme bAm
+boehme bOm
+boehmer bOmP
+boehmke bOmk/
+boehne bOn
+boehner bOnP
+boehning bOn6N
+boehnke bONk
+boehnlein bOnlIn
+boehringer b{r6NP
+boeing bO6N
+boeing's bO6Nz
+boeke bOk
+boeker bOkP
+boelens bOl~z
+boelkow bOlk?
+boelman bOlm~
+boelter bOltP
+boen bOn
+boenig bOn6g
+boening bo~6N
+boepple bOp@l
+boer b{r
+boerger b{rgP
+boerman b{rm~
+boerner b{rnP
+boers b{rz
+boersma b{rsm@
+boes bOz
+boesak bOzak
+boesch bOS
+boeschenstein bOS~stEn
+boeschenstein bOS~stIn
+boese bOs
+boesel bOs@l
+boesen bOs~
+boesky bOsk/
+boesky's bOsk/z
+boeskys bOsk/z
+boetcher bOCP
+boettcher bOCP
+boettger bOtgP
+boettner bOtnP
+boeve bOv
+boff b{f
+boffa bof@
+boffo b{f]
+bofors bOfPz
+bofors's bOfPz@z
+bog bog
+bogacki b@gotsk/
+bogacz bog@C
+bogan bOg~
+bogar b@g)r
+bogard bogPd
+bogardus bogord@s
+bogart bOgort
+bogdan bogd~
+bogdanoff bogd~{f
+bogdanowicz b@gdan@witz
+bogdanski b@gdansk/
+bogden bogd~
+bogdon bogd~
+boge bOj
+bogelsong bog@ls{N
+bogen bog~
+bogenschutz bog~S@ts
+boger bOgP
+bogert bogPt
+bogey bOg/
+bogeyed bOg/d
+bogeyman bOg/man
+bogeyman bqg/man
+bogeymen bOg/min
+bogeymen bqg/min
+boggan bog~
+bogged bogd
+boggess bogcs
+bogging b{g6N
+boggio bOj/]
+boggle bog@l
+boggled bog@ld
+boggles bog@lz
+boggling bog@l6N
+boggling bogl6N
+boggs b{gz
+boggus bog@s
+boghosian b@ghoZ~
+bogie bqg/
+bogin bOjin
+bogle bOg@l
+bognar b@gn)r
+bogner bognP
+bogor bOg{r
+bogosian b@goZ~
+bogota bOg@to
+bogs bogz
+bogucki b@gutsk/
+bogue bOg
+bogus bOg@s
+boguslavskaya b]gusl@vskI@
+bogusz bog6S
+bohac bOh@k
+bohall boh@l
+bohan bOh~
+bohanan boh~an
+bohannan b@han~
+bohannon boh~on
+bohanon boh~on
+bohart bohort
+boheme b]hAmA
+bohemia b]hEm/@
+bohemian b]hEm/~
+bohen bO~
+bohl bOl
+bohland bOl~d
+bohlander bOl~dP
+bohle bOh@l
+bohlen bOl~
+bohler bOlP
+bohlin bOlin
+bohling bOl6N
+bohlinger bOl6NP
+bohlke bOlk
+bohlke bok
+bohlken bOlk~
+bohlman bOlm~
+bohlmann bOlm~
+bohm bom
+bohman bOm~
+bohmer bOmP
+bohn bOn
+bohne bOn
+bohnen bOn~
+bohnenkamp bOn~kamp
+bohner bOnP
+bohnert bOnPt
+bohnet bonit
+bohnhoff bOnh{f
+bohning bon6N
+bohnsack bOns@k
+bohon bOh~
+bohr b{r
+bohren b{r~
+bohrer b{rP
+boice b<s
+boies b<z
+boik b<k
+boike b<k
+boil b<l
+boilard b<l)rd
+boileau b<lO
+boiled b<ld
+boiler b<lP
+boilermaker b<lPmAkP
+boilerplate b<lPplAt
+boilers b<lPz
+boiling b<l6N
+boils b<lz
+boipatong b<p@t{N
+bois bwo
+boisclair bwokl,r
+boise b<s/
+boise b<z/
+boise's b<s/z
+boise's b<z/z
+boisen b<s~
+boisi b<s/
+boisjoly b<sj@l/
+boisseau bwosO
+boissonneault bwos~]
+boisterous b<stP@s
+boisterous b<str@s
+boisvert bwovVt
+boitano b<ton]
+boitnott b<tnot
+boivin b<van
+bojangles' b]jaNg@lz
+bojanowski b@y~{fsk/
+bojarski b@y)rsk/
+bojenka b@jeNk@
+bojorquez b]y{rkwcz
+bok bok
+bokassa b@kos@
+boker bOkP
+bokor bOkP
+boksen boks~
+bol bol
+bola bOl@
+bolam bOl}
+bolan bOl~
+boland bOl~d
+bolander bol~dP
+bolanger bOl~jP
+bolanos b]lon]z
+bolar bOlP
+bolar's bOlPz
+bolch bOlC
+bolcom bOlk}
+bold bOld
+bolda bOld@
+bolden bOld~
+bolder bOldP
+boldest bOld@st
+boldface bOldfAs
+boldin bOldin
+bolding bOld6N
+boldly bOldl/
+boldman bOldm~
+boldness bOldn@s
+boldon bOld~
+bolds bOldz
+boldt bOlt
+bolduc bOld@k
+bolduc's bOld@ks
+bole bOl
+bolek bOl6k
+bolen bOl~
+bolenbaugh b@lenb{
+bolender bolcndP
+boler bOlP
+bolerjack bolPj@k
+bolero b]l,r]
+boles bOlz
+boleware bOlwcr
+boley bOl/
+bolf bOlf
+bolger bOljP
+bolger's bOljPz
+bolich bol6k
+bolick bol6k
+boliden bOl@d~
+bolin bOlin
+boline bolIn
+boling bOl6N
+bolinger bOl6NP
+bolio bOl/]
+bolitho b]liT@
+bolivar bol@vP
+bolivars bol@vPz
+bolivia b@liv/@
+bolivia b]liv/@
+bolivia's b@liv/@z
+bolivian b@liv/~
+bolivian b]liv/~
+bolker bOlkP
+bolkow bOlk?
+boll bOl
+bolla bol@
+bolland bol~d
+bollapragada b]lopr@god@
+bollard bolPd
+bolle bol
+bollen bol~
+bollenbach bol~bok
+bollenbacher bol~bokP
+boller bolP
+bolles bOlz
+bollettieri b@let/,r/
+bollier bol/P
+bollig bol6g
+bolliger bol6gP
+bollin bolin
+bolling bOl6N
+bollinger bol6NP
+bollman bolm~
+bollmann bolm~
+bollore bol{r
+bolls bOlz
+bologna b@lOn/
+bolognese b]l]gnAz/
+bolognesi bolognes/
+bolon bOl~
+bolotin bol@tin
+bolsa bOls@
+bolsa's bOls@z
+bolser bOlsP
+bolshevik bOlS@vik
+bolsheviks bOlS@viks
+bolshevism bOlS@viz}
+bolshevist bOlS6vist
+bolshoi b]lS<
+bolshoi's b]lS<z
+bolson bOls~
+bolstad bOlst@d
+bolster bOlstP
+bolstered bOlstPd
+bolstering bOlstP6N
+bolsters bOlstPz
+bolt bOlt
+bolte bOlt
+bolted bOlt@d
+bolten bOlt~
+bolter bOltP
+bolthouse bOlth?s
+bolting bOlt6N
+bolton bOlt~
+bolts bOlts
+boltz bOlts
+boltzmann's bOltsm~z
+boltzmanns bOltsm~z
+bolus bOl@s
+bolyard b@ly)rd
+bolz bOlz
+bom bom
+bomag bOmag
+boman bOm~
+bomar b})r
+bomb bom
+bomb's bomz
+bomba bomb@
+bombard bomb)rd
+bombarded bomb)rd@d
+bombardier bombPdir
+bombarding bomb)rd6N
+bombardment bomb)rdm~t
+bombardments bomb)rdm~ts
+bombast bombast
+bombastic bombast6k
+bombay bombA
+bombay's bombAz
+bombeck bombek
+bombed bomd
+bomber bomP
+bomber's bomPz
+bomberg bombPg
+bomberger bombPgP
+bombers bomPz
+bombing bom6N
+bombings bom6Nz
+bombmaker bommAkP
+bombmaking bommAk6N
+bombs bomz
+bombshell bomSel
+bombshells bomSelz
+bomer bOmP
+bomgardner bomgordnP
+bommarito bomPEt]
+bommer bomP
+bon bon
+bona bOn@
+bonacci b]noC/
+bonadio b]nod/]
+bonadonna bon@don@
+bonaduce bon@dUC/
+bonaduce bon@dUs
+bonafide bOn@fId
+bonafide bon@fId
+bonanni b]non/
+bonanno b]non]
+bonanza b~anz@
+bonaparte bOn@port
+bonaparte's bOn@ports
+bonar bOnP
+bonasera b]nos,r@
+bonaventura b]novcntqr@
+bonaventure bon@venCP
+bonavia bonAv/@
+bonavita b]novEt@
+bonawitz bon@wits
+bonczek bonCck
+bond bond
+bond's bondz
+bondage bond6j
+bondar b~d)r
+bonde bond
+bonded bond@d
+bonderman bondPm~
+bondholder bondhOldP
+bondholders bondhOldPz
+bondholders' bondhOldPz
+bondi bond/
+bonding bond6N
+bonds bondz
+bonds' bondz
+bondt bont
+bondurant b]ndqr~t
+bondy bond/
+bone bOn
+bonebrake bOnbrAk
+bonecrusher bOnkruSP
+bonecutter bOnkutP
+boned bOnd
+boneless bOnl@s
+bonelli b]nel/
+bonello b]nel]
+bonenberger bOn~bPgP
+bonenfant bOnf~t
+boner bOnP
+bones bOnz
+bonesteel bOnstEl
+bonet bOnt
+bonetti b]net/
+boney bOn/
+bonfanti b]nfont/
+bonfield bonfEld
+bonfiglio bonfigl/]
+bonfire bonfIP
+bonfires bonfIPz
+bong boN
+bongard b@Ng)rd
+bongarten boNgort~
+bongers b{NPz
+bongiorno b]nj{rn]
+bongiovanni b]nj]von/
+bongjin b{Njin
+bongo boNgO
+bongos boNgOz
+bonham bonh}
+boni bOn/
+bonica bon6k@
+bonier bonyP
+bonifacio bon@fAs/]
+bonifas bon@f@z
+bonifay bon@fA
+bonifield bon@fEld
+bonilla b~il@
+bonin bOnin
+bonine b]nEn/
+boning bOn6N
+bonini b]nEn/
+bonino b]nEn]
+bonior bOn/P
+bonior bOnw)r
+bonita b]nEt@
+bonito b~Et]
+bonjour b~Zqr
+bonk boNk
+bonker b{NkP
+bonkers boNkPz
+bonkowski b@Nk{fsk/
+bonn bon
+bonn's bonz
+bonne bon
+bonneau b~O
+bonnell bon@l
+bonnema bon}@
+bonner b{nP
+bonnes b{nz
+bonnet bon@t
+bonnett bonct
+bonnette b~et
+bonneville bon@vil
+bonnevilles bon@vilz
+bonney bon/
+bonnibel bon@b@l
+bonnibelle bon@bcl
+bonnie bon/
+bonnie's bon/z
+bonnin bonin
+bonnor bonP
+bonny bon/
+bono bOn]
+bonobos bon@b@z
+bonobos bonob]z
+bonomo bon}]
+bonsai bOnsI
+bonsai bonsI
+bonsall b]nsol
+bonser bonsP
+bonsignore b]ns/gn{r/
+bonta bont@
+bonte bont
+bontempo bontemp]
+bontrager bontrAgP
+bonum bon}
+bonura b]nqr@
+bonus bOn@s
+bonuses bOn@s@z
+bonvillain bonv@lAn
+bonville bOnvil
+bonwell bonwel
+bonwit bonwit
+bonwit's bonwits
+bony bOn/
+bonzo bonz]
+boo bU
+boob bUb
+boobs bUbz
+booby bUb/
+boock bUk
+boodle bUd@l
+boodles bUd@lz
+boody bUd/
+booe bo]
+booed bUd
+booee bU/
+boogie bUg/
+boogie bqg/
+boogie-woogie bUg/wUg/
+boogie-woogie bqg/wqg/
+booher bUP
+booing bU6N
+book bqk
+book's bqks
+bookbinder bqkbIndP
+bookcase bqkkAs
+bookcases bqkkAs@z
+bookcellar bqkselP
+booked bqkt
+bookend bqkend
+bookends bqkendz
+booker bqkP
+bookers bqkPz
+bookie bqk/
+bookies bqk/z
+bookin bqkin
+booking bqk6N
+bookings bqk6Nz
+bookish bqk6S
+bookkeeper bqkkEpP
+bookkeepers bqkkEpPz
+bookkeeping bqkkEp6N
+booklet bqkl@t
+booklets bqkl@ts
+bookmaking bqkmAk6N
+bookman bqkm~
+bookmobile bqkm]bEl
+booknote bqknOt
+booknotes bqknOts
+bookout bqk?t
+books bqks
+books' bqks
+bookseller bqkselP
+booksellers bqkselPz
+bookshelf bqkSelf
+bookshelves bqkSelvz
+bookshop bqkSop
+bookshops bqkSops
+booksmith bqksmiT
+bookstop bqkstop
+bookstore bqkst{r
+bookstores bqkst{rz
+bookwalter bqkw@ltP
+bookworm bqkwVm
+boole bUl
+boom bUm
+boom's bUmz
+boombox bqmboks
+boomed bUmd
+boomer bUmP
+boomerang bUmPaN
+boomeranged bUmPaNd
+boomers bUmPz
+boomers' bUmPz
+boomershine bUmPSIn
+boomhower bUmh]P
+booming bUm6N
+boomlet bUml@t
+booms bUmz
+boomsma bUmzm@
+boomtown bUmt?n
+boon bUn
+boondocks bUndoks
+boondoggle bUndog@l
+boondoggles bUndog@lz
+boone bUn
+boonstra bUnstr@
+boonton bUnt~
+boonville bUnvil
+boop bUp
+boor bqr
+booras bqr@z
+boord bqrd
+boorda bqrd@
+boorda's bqrd@z
+boorish bqr6S
+boorishness bqr6Sn@s
+boorman bqrm~
+boors bqrz
+boorstin bUrstin
+boortz b{rts
+boos bUz
+boose bUs
+boost bUst
+boosted bUst@d
+booster bUstP
+booster's bUstPz
+boosterism bUstPiz}
+boosters bUstPz
+boosting bUst6N
+boosts bUsts
+boot bUt
+boote bUt
+booted bUt@d
+booten bUt~
+booth bUT
+boothby bUTb/
+boothe bUT
+boothman bUTm~
+boothroyd bUTr<d
+booths bUTs
+bootie bUt/
+booties bUt/z
+booting bUt6N
+bootleg bUtleg
+bootlegger bUtlegP
+bootleggers bUtlegPz
+bootlegging bUtleg6N
+bootlegs bUtlegz
+booton bUt~
+boots bUts
+bootstrap bUtstrap
+bootstraps bUtstraps
+booty bUt/
+bootz bUts
+booz bUz
+booze bUz
+boozer bUzP
+boozier bUz/P
+boozing bUz6N
+boozy bUz/
+bop bop
+bopeep b]pEp
+bopera b]p,r@
+bopha bOf@
+bophuthatswana bOfUTotswon@
+bopp bop
+bopper bopP
+boppers bopPz
+boquist bokwist
+bora b{r@
+borah b{r@
+borak b{r@k
+boral b{r@l
+borawski bPofsk/
+borax b{raks
+borba b{rb@
+borchard bPS)rd
+borchardt bPS)rdt
+borchelt b{rkclt
+borcherding b{rkPd6N
+borchers b{rkPz
+borchert b{rkPt
+borck b{rk
+borda b{rd@
+borda's b{rd@z
+bordallo b{rdal]
+bordas b{rd@z
+bordeau bPdO
+bordeaux b{rdO
+bordello b{rdelO
+bordelon b{rd@lon
+borden b{rd~
+borden's b{rd~z
+bordenave b{rdcnov
+border b{rdP
+border's b{rdPz
+bordered b{rdPd
+bordering b{rdP6N
+borderline b{rdPlIn
+borders b{rdPz
+bordes b{rdz
+bordman b{rdm~
+bordner b{rdnP
+bordonaro b{rd]n)r]
+bordwell b{rdwcl
+bore b{r
+borealis b{r/al@s
+bored b{rd
+boredom b{rd}
+borek b{r6k
+borel b{r@l
+borell b{r@l
+borella b{rel@
+borelli b{rel/
+borello b{rel]
+boren b{r~
+boren's b{r~z
+borenstein b{r~stEn
+borenstein b{r~stIn
+borer b{rP
+bores b{rz
+borg b{rg
+borge b{rj
+borgelt b{rgclt
+borgen b{rg~
+borger b{rgP
+borgerding b{rgPd6N
+borgert b{rgPt
+borges b{rgAs
+borgeson b{rg@s~
+borgess b{rgcs
+borghi b{rg/
+borgia b{rj@
+borgman b{rgm~
+borgmann b{rgm~
+borgmeyer b{rgmIP
+borgstrom b{rgstr}
+borgwardt b{rgw{rt
+boric b{r6k
+borin b{rin
+boring b{r6N
+boris b{ris
+boris' b{ris
+boris's b{ris@z
+borja b{ry@
+borjas b{ry@z
+bork b{rk
+bork's b{rks
+borkenhagen b{rk~hAg~
+borkenhagen b{rk~hog~
+borkowski bPk{fsk/
+borland b{rl~d
+borland's b{rl~dz
+borman b{rm~
+borman's b{rm~z
+bormann b{rm~
+born b{rn
+borne b{rn
+borneman b{rnm~
+bornemann b{rnm~
+borneo b{rn/O
+borner b{rnP
+bornholdt b{rnh]lt
+bornhorst b{rnh{rst
+bornman b{rnm~
+borns b{rnz
+bornstein b{rnstEn
+bornstein b{rnstIn
+borntrager b{rntrAgP
+boro bV]
+boroff b{r{f
+boroian b{r<~
+boron b{ron
+boros bV]z
+borosage b{r@s6j
+boroski bP?sk/
+borough bVO
+borough's bVOz
+boroughs bVOz
+borowiak bP?/ak
+borowicz bV]v6C
+borowiec bP?/k
+borowski bP{fsk/
+borowsky bP?sk/
+borowy bP?/
+borquez b{rkwez
+borras b{r@z
+borre b{r
+borrego b{reg]
+borrell b{rAl
+borrelli b{rel/
+borrello b{rel]
+borrero b{r,r]
+borris b{ris
+borroff b{r{f
+borror b{Pr
+borrow b)rO
+borrowed b)rOd
+borrower b)r]P
+borrower's b)r]Pz
+borrowers b)r]Pz
+borrowers' b{r@Pz
+borrowing b)r]6N
+borrowings b)r]6Nz
+borrowman b)r]m~
+borrows b)r]z
+borruso b{rUs]
+bors b{rz
+borsch b{rS
+borscht b{rSt
+borse b{rs
+borseth b{rscT
+borski b{rsk/
+borst b{rst
+borsuk b{rs@k
+bort b{rt
+bortel b{rtel
+borten b{rt~
+borth b{rT
+borthwick b{rTw6k
+bortle b{rt@l
+bortner b{rtnP
+bortnick b{rtn6k
+borton b{rt~
+bortz b{rts
+boruch b{r@k
+borucki bPutsk/
+boruff b{r@f
+borum b{r}
+borunda b{rUnd@
+borup b{r@p
+borwn b{rwin
+borys b{r/z
+bos bos
+bosak bOs@k
+bosarge bosorg
+boscarino b]skorEn]
+bosch b{S
+boschee b{S/
+boschen b{S~
+boschert b{SPt
+boschwitz b{Swits
+boscia bOsC@
+bosco b{sk]
+bose bOz
+boseman bOsm~
+bosendorfer bOz~d{rfP
+boser bOzP
+bosh boS
+boshart boSort
+boshears boS6rz
+boshell boS@l
+bosher boSP
+boshers boSPz
+boskin b{skin
+bosko bOsk]
+boskovich bosk@v6C
+boslego b{slAg]
+bosler bos@lP
+bosley bozl/
+bosma bOsm@
+bosman bosm~
+bosnia bozn/@
+bosnia's bozn/@z
+bosnian bozn/~
+bosnian's bozn/~z
+bosnians bozn/~z
+bosnias bozn/@z
+boso bOs]
+bosom bqz}
+bosqi bosk/
+bosquez b]skwez
+boss b{s
+boss' b{s
+boss's b{s@z
+bossard b@s)rd
+bossart b@s)rt
+bosse bos
+bossed bost
+bossen bos~
+bosserman b{sPm~
+bossert bosPt
+bosses b{s@z
+bosses' b{s@z
+bosshardt b{short
+bosshart b{short
+bossi bOs/
+bossidy b{s@d/
+bossie b{s/
+bossier b{s/P
+bossler bos@lP
+bossman b{sm~
+bosso bOs]
+bossy b{s/
+bost bost
+bostelman bost@lm~
+boster bostP
+bostian bosCin
+bostic bost6k
+bostick bOst6k
+bostock bOstok
+boston bost~
+boston's bost~z
+bostonian bostOn/~
+bostonians bost]n/~z
+bostra bostr@
+bostrom bostr}
+bostwick bostw6k
+boswell bozwcl
+bosworth b{zwPT
+botanic b@tan6k
+botanical b@tan6k@l
+botanically b@tan@k@l/
+botanically b@tan@kl/
+botanist bot~@st
+botanists bot~@s
+botanists bot~@ss
+botanists bot~@sts
+botany bot~/
+botch boC
+botched boCt
+boteler bot@lP
+botelho b]tel]
+botello b]tel]
+botero b]t,r]
+botfly botflI
+both bOT
+botha bOt@
+botha bOtu
+botha boT@
+botha's bOt@z
+botha's bOtuz
+botha's boT@z
+botham boT}
+botham's boT}z
+bothe bOT
+bothell boT@l
+bother boTP
+bothered boTPd
+bothering boTP6N
+bothers boTPz
+bothersome boTPs}
+bothun boT~
+bothwell boTwel
+botin botin
+botkin botkin
+botkins botkinz
+botner botnP
+botolf bot]lf
+botos bOt]z
+botrytis b@tritis
+botsford botsfPd
+botshabelo boC@bel]
+botswana botswon@
+bott bot
+botta bot@
+bottari b]t)r/
+bottcher botCP
+bottel bot@l
+botten bot~
+bottenfield b@tenf/ld
+bottger botgP
+botting bot6N
+bottini b]tEn/
+bottino b]tEn]
+bottle bot@l
+bottled bot@ld
+bottleneck bot@lnek
+bottlenecks bot@lneks
+bottler botlP
+bottlers botlPz
+bottlers' botlPz
+bottles bot@lz
+bottling bot@l6N
+bottling botl6N
+bottom bot}
+bottom's bot}z
+bottomed bot}d
+bottomfish bot}fiS
+bottoming bot}6N
+bottomless bot}l@s
+bottomley bot}l/
+bottoms bot}z
+bottone b]tOn/
+bottorf botPf
+bottorff botPf
+bottrell botr@l
+botts bots
+botulism boCUliz}
+botz bots
+bouch b?C
+bouchard bUS)rd
+bouche b?C
+boucher b?CP
+boucher bUS@
+boucher b{CP
+bouchey bUSE
+bouchie b?C/
+bouchillon b?C@lon
+bouck bOk
+boudin bUdin
+boudoin bUd<n
+boudoir bUd<r
+boudreau bUdrO
+boudreaux bUdrO
+bouffard bUf)rd
+bougainville bUg~vil
+bougainvillea bUgAnvil/@
+bough b?
+boughan b?~
+bougher b?P
+boughman b?m~
+boughner b?nP
+boughs b?z
+bought bot
+boughten b{t~
+boughter b{tP
+boughton b?t~
+bougie bUZE
+bouie bUE
+bouillon bUwil~
+bouknight b?knIt
+boulais bUlA
+boulalas bUl@l@s
+boulanger b?l@NP
+boulangerie bUlaNgP/
+boulay bUlA
+boulden bqd~
+boulder bOldP
+boulders bOldPz
+boule bUl
+bouler b?lP
+boulet bUlet
+boulette bUlet
+boulevard bql@vord
+boulevards bql@vordz
+bouley bUlE
+boulez bUlez
+boulier bUl/P
+boullion bUly~
+boulos bUlOz
+boulter bOltP
+boultinghouse b?lt6Nh?s
+boulton b?lt~
+boulware b?lwcr
+bouma bOm@
+bouman bUman
+bounce b?ns
+bounced b?nst
+bouncer b?nsP
+bouncers b?nsPz
+bounces b?ns@z
+bounciness b?ns/n@s
+bouncing b?ns6N
+bouncy b?ns/
+bound b?nd
+boundaries b?ndP/z
+boundaries b?ndr/z
+boundary b?ndP/
+boundary b?ndr/
+bounded b?nd@d
+bounder b?ndP
+bounding b?nd6N
+boundless b?ndl@s
+bounds b?ndz
+boundy b?nd/
+bounties b?nt/z
+bountiful b?n@f@l
+bountiful b?nt@f@l
+bounty b?nt/
+bouquet bUkA
+bouquets bUkAz
+bouquets b]kAz
+bour b?r
+bourassa bqros@
+bourbeau bqrbO
+bourbon bVb~
+bourbons bVb~z
+bourcier b?rk/P
+bourdeau bqrdO
+bourg b{rg
+bourgault bqrgO
+bourgeois bqrZwo
+bourgeois bqrZwo
+bourgeoisie bqrZwozE
+bourget bqrZet
+bourgoin bqrg<n
+bourguiba b{rgwEb@
+bourguignon bqrg/nyOn
+bourke bVk
+bourland bqrland
+bourn b{rn
+bourne b{rn
+bournewood b{rnwqd
+bournias b{rn/@s
+bournonville b{rn~vil
+bourque bqrk
+bourquin bqrkwan
+bourret bqret
+bourse b{rs
+bourse's b{rs@z
+bourses b{rs@z
+boursicot bUrs6k{t
+boursicot burs6k{t
+bouse b?s
+bouska bUsk@
+bousman b@sman
+bousquet bUsket
+boussac bUsak
+boustany bUst~/
+bout b?t
+boutell bUtel
+boutelle bUtel
+bouthillier b?T@l/P
+boutilier b?t@l/P
+boutin bUtan
+boutique bUtEk
+boutiques bUtEks
+bouton b?t~
+boutros bUtrOs
+bouts b?ts
+boutte bUt
+boutwell b?twel
+bouvier bUv/A
+bouwens b?~z
+bouwkamp b?kamp
+bouwman b?m~
+bouwsma bUzm@
+bouyer b<P
+bouygues b<ZA
+bouygues b<gcz
+bouza bUz@
+bova bOv@
+bovard b@v)rd
+bove bOv
+bovee buv/
+boven buv~
+bovenzi b]venz/
+boveri b]v,r/
+bovespa bOvspo
+bovey bOv/
+bovik bOv6k
+bovin bOvin
+bovine bOvIn
+bovino b]vEn]
+bow b?
+bow bO
+bowar bOP
+boward bOPd
+bowater b?utP
+bowater bOw{tP
+bowater bO{tP
+bowcan bOk~
+bowden b?d~
+bowden bOd~
+bowdish bOd6S
+bowditch bOd6C
+bowdle bOd@l
+bowdoin b]d<n
+bowe bO
+bowed b?d
+bowed bOd
+bowel b?@l
+bowell bowcl
+bowels b?@lz
+bowels b?lz
+bowen bO~
+bowens bO~z
+bower b?P
+bowerman bOPm~
+bowermaster bOPmastP
+bowers b?Pz
+bowersock b]Vs@k
+bowersox b]Vsoks
+bowery b?P/
+bowery's b?P/z
+bowes bOz
+bowick bO6k
+bowie bO/
+bowing b?6N
+bowing bO6N
+bowker bOkP
+bowl bOl
+bowland bOl~d
+bowlby bOlb/
+bowlds bOldz
+bowled bOld
+bowlen bOl~
+bowler bOlP
+bowlers bOlPz
+bowles bOlz
+bowley bOl/
+bowlin bOlin
+bowling bOl6N
+bowling's bOl6Nz
+bowls bOlz
+bowlus bOl@s
+bowman bOm~
+bowman's bOm~z
+bowmen bOm~
+bowmer bOmP
+bown bOn
+bownds bOndz
+bowne bOn
+bowring bOr6N
+bowron bOron
+bowron bOr~
+bows b?z
+bows bOz
+bowse bOs
+bowsed b?zd
+bowser bOzP
+bowses b?z@z
+bowsher bOSP
+bowsing b?z6N
+bowyer bOyP
+box boks
+boxberger boksbPgP
+boxcar bokskor
+boxcars bokskorz
+boxed bokst
+boxell boks@l
+boxer boksP
+boxer's boksPz
+boxers boksPz
+boxes boks@z
+boxing boks6N
+boxing's boks6Nz
+boxley boksl/
+boxwell bokswel
+boxwood bokswqd
+boxx boks
+boxy boks/
+boy b<
+boy's b<z
+boy-ar-dee b<ordE
+boyack b<@k
+boyajian b<aj/~
+boyan b<on
+boyar b]y)r
+boyce b<s
+boycott b<kot
+boycotted b<kot@d
+boycotting b<kot6N
+boycotts b<kots
+boyd b<d
+boyd's b<dz
+boyde b<d
+boyden b<d~
+boydston b<dst~
+boydstun b<dst~
+boye b<
+boyea b</@
+boyer b<P
+boyers b<Pz
+boyes b<z
+boyett b<it
+boyette b<et
+boyfriend b<frend
+boyfriends b<frendz
+boyfriends b<frenz
+boyhood b<hqd
+boyington b<6Nt~
+boyish b<6S
+boykin b<kin
+boykins b<kinz
+boyko b<k]
+boylan b<l~
+boyland b<l~d
+boyle b<l
+boylen b<l~
+boyles b<lz
+boylls b<lz
+boylston b<lst~
+boylston's b<lst~z
+boyne b<n
+boynton b<nt~
+boys b<z
+boys' b<z
+boysel b<s@l
+boysen b<s~
+boyson b<z~
+boyt b<t
+boyte b<t
+boyter b<tP
+boyum b<um
+boyz b<z
+boza bOz@
+bozard b@z)rd
+bozarth bozPT
+boze bOz
+bozek bOzck
+bozell b]zel
+bozell's b]zelz
+bozeman bOzm~
+bozian bOz/~
+bozic boz6k
+bozich bozih
+bozman bozm~
+bozo bOzO
+bozos bOzOz
+boztepe b]ztep
+boztepe b]ztep/
+boztepe boztep
+boztepe boztep/
+bozza boz@
+bozzi boz/
+bozzo boz]
+bra bro
+braaksma broksm@
+braasch broS
+braaten broAt~
+braatz brots
+brabant brob~t
+brabec brob6k
+brabender brabcndP
+brabham brabh}
+brabson brabs~
+brac brak
+bracamonte brak}ont/
+bracamonte's brak}ont/z
+bracamontes brak}ont/z
+bracci broC/
+bracco brak]
+brace brAs
+brace's brAs@z
+braced brAst
+bracelet brAsl@t
+bracelets brAsl@ts
+bracer brAsP
+bracero broC,r]
+braces brAs@z
+bracewell brAswel
+bracey brAs/
+brach braC
+bracher brakP
+bracher's brakPz
+brachfeld brokfeld
+brachiopod brAk/@pod
+brachiopods brAk/@podz
+bracht brakt
+bracing brAs6N
+bracingly brAs6Ngl/
+brack brak
+brackbill brakb@l
+brackeen br@kEn
+bracken brak~
+brackenbury brak~ber/
+brackens brak~z
+brackets brak@ts
+brackett brakit
+brackin brak~
+brackins brak~z
+brackish brak6S
+brackman brakm~
+bracknell braknel
+brackney brakn/
+bracy brAs/
+brad brad
+brad's bradz
+bradberry bradber/
+bradburn bradbVn
+bradbury bradber/
+bradco bradk]
+braddock brad@k
+braddy brad/
+bradeen br@dEn
+brademas br@dAm@s
+braden brAd~
+bradenton brad~t~
+brader bradP
+bradfield bradf/ld
+bradford bradfPd
+bradford's bradfPdz
+bradfords bradfPdz
+bradham bradh}
+bradish brad6S
+bradlee bradlE
+bradlees bradlEz
+bradley bradl/
+bradley's bradl/z
+bradleys bradl/z
+bradner bradnP
+bradney bradn/
+bradshaw bradS{
+bradsher bradSP
+bradstreet bradstrEt
+bradstreet's bradstrEts
+bradt bradt
+bradtke bradk/
+bradtmiller bratmilP
+bradway bradwA
+bradwell bradwel
+brady brAd/
+brady's brAd/z
+bradycardia brad@k)rd/@
+bradykinin br@dik~in
+bradys brAd/z
+brae brA
+braendstroem brandstr]m
+braer brAr
+braff braf
+brafford brafPd
+brag brag
+braga brog@
+bragan brAg~
+bragdon bragd~
+brager brAgP
+bragg brag
+braggadocio brag@dOS/O
+bragged bragd
+bragger bragP
+braggers bragPz
+bragging brag6N
+braggiotti braz/ot/
+braggs bragz
+brags bragz
+braham brah}
+brahm brom
+brahmin bromin
+brahms bromz
+brahms's bromz@z
+braid brAd
+braided brAd@d
+braiding brAd6N
+braids brAdz
+braidwood brAdwqd
+brailey brAl/
+braille brAl
+brailles brAlz
+brailsford brAlsfPd
+brain brAn
+brain's brAnz
+brainard brAnPd
+brainchild brAnCIld
+brained brAnd
+brainer brAnP
+brainerd brAnPd
+brainless brAnl@s
+brainpower brAnp?P
+brains brAnz
+brainstorm brAnst{rm
+brainstorming brAnst{rm6N
+braintree brAntrE
+brainwash brAnwoS
+brainwashed brAnwoSt
+brainwashing brAnwoS6N
+brainy brAn/
+braise brAz
+braised brAzd
+braithwaite brATwAt
+brajdas brId@s
+brajovic broj]v6C
+brake brAk
+brakebill brAkbil
+braked brAkt
+brakefield brAkfEld
+brakeman brAkm~
+brakemen brAkmcn
+braker brAkP
+brakes brAks
+braking brAk6N
+brakke brak
+braley bral/
+bralley bral/
+brallier bral/P
+bralorne bral{rn
+braly brol/
+bram bram
+bramah brom@
+bramalea bram@lE@
+bramalea's bram@lEz
+braman brAm~
+brambila brombEl@
+bramble bramb@l
+brambles bramb@lz
+bramblett brambl@t
+brame brAm
+bramel bram@l
+bramer brAmP
+bramhall bramh@l
+bramlage braml6j
+bramlet braml@t
+bramlett bramlit
+bramlette bramlet
+bramley braml/
+brammeier bramIP
+brammer bramP
+brampton brampt~
+brams bramz
+bramson brams~
+bramwell bramwel
+bran bran
+branagan bran@gan
+branagh bran@g
+branam bran}
+branaman bran}~
+branan brAn~
+branca braNk@
+brancaccio bronkoC/]
+brancato bronkot]
+branch branC
+branch's branC@z
+branche branC
+brancheau br~SO
+branched branCt
+branches branC@z
+branching branC6N
+branchlet branCl@t
+branchlets branCl@ts
+branco braNk]
+brand brand
+brand's brandz
+branda brand@
+brandau brand?
+brande brand
+brandeberry brandbcr/
+branded brand@d
+brandeis brandIs
+brandel brand@l
+branden brand~
+brandenberg brand~bPg
+brandenberger brand~bPgP
+brandenburg brand~bPg
+brandenburger brand~bPgP
+brandenstein brandcnstEn
+brandenstein brandcnstIn
+brander brandP
+brandes brandz
+brandford brandfPd
+brandhorst brandh{rst
+brandi brand/
+branding brand6N
+brandis brandis
+brandish brand6S
+brandished brand6St
+brandishes brand6S@z
+brandishing brand6S6N
+brandl brand@l
+brandle brand@l
+brandname brandnAm
+brandner brandnP
+brando brand]
+brando's brand]z
+brandon brand~
+brandon's brand~z
+brandow brand?
+brands brandz
+brands' brandz
+brands's brandz@z
+brandstetter brandstctP
+brandt brant
+brandtner brantnP
+brandvold brandvOld
+brandwein brandwIn
+brandy brand/
+brandywine brand/wIn
+braner brAnP
+branford branfPd
+branham branh}
+brani braNk/
+braniff branif
+braniff's branifs
+branigan bran6g~
+branin branin
+branislov bran@slov
+branitzky br~itsk/
+brank braNk
+branko braNk]
+brann bran
+branna bran@
+brannam bran}
+brannan bran~
+brannen bran~
+branner branP
+brannick bran6k
+brannigan bran6g~
+branning bran6N
+brannock bran@k
+brannon bran~
+brannum bran}
+branon bran~
+branscom bransk}
+branscomb bransk}
+branscome branzkum
+branscum bransk}
+bransfield branzfEld
+bransford bransfPd
+bransom brans}
+branson brans~
+branson's bransunz
+branstad branstad
+branstetter branstctP
+brant brant
+brantley brantl/
+brantly brantl/
+brantner brantnP
+branton brant~
+branum bran}
+branyon brany~
+branz branz
+braque brak
+bras bras
+bras broz
+brascade br@skAd
+brascan brask~
+brasch braS
+brase brAz
+brasel bras@l
+braselton br@selt~
+brasfield brasf/ld
+brash braS
+brashear braS6r
+brashears braS6rz
+brasher braSP
+brashers braSPz
+brashier braS/P
+brashness braSn@s
+brasil br@sEl
+brasil bras@l
+brasilia br@sily@
+brasilia br@zily@
+brasington bras6Nt~
+brasow bras]
+brasow braz]
+brass bras
+brassard brasPd
+brasseaux br@sO
+brassell bras@l
+brasserie brasP/
+brasseur brasP
+brassfield brasfEld
+brasso bras]
+brasso's bras]z
+brassy bras/
+braswell braswcl
+brat brat
+bratcher braCP
+braton brat~
+brats brats
+bratsch braC
+bratt brat
+brattain br@tAn
+brattaslava brot@slov@
+brattaslava's brot@slov@z
+bratten brat~
+brattin bratin
+brattle brat@l
+bratton brat~
+bratwurst bratwPst
+bratz brats
+brau br?
+brauch br{C
+braucher br{CP
+brauchli br{Cl/
+braud br{d
+braude br{d
+brauer br?P
+braughton br{t~
+brault br{lt
+braun br{n
+braun's br{nz
+braund br{nd
+braune br{n
+brauner br{nP
+brauns br{nz
+braunschweig br?nSwIg
+braunstein br{nstEn
+braunstein br{nstIn
+braunwald br{nw{ld
+brause br{z
+brautigam brOt6g}
+brautigams br{t6gamz
+bravado br@vod]
+brave brAv
+braved brAvd
+braveheart brAvhort
+bravely brAvl/
+braver brAvP
+braverman brAvPm~
+bravery brAvP/
+braves brAvz
+braves' brAvz
+bravest brAv@st
+braving brAv6N
+bravo brov]
+bravura br@vyqr@
+brawer br{P
+brawl br{l
+brawley br{l/
+brawling br{l6N
+brawls br{lz
+brawn br{n
+brawner br{nP
+brawny br{n/
+braxton brakst~
+bray brA
+brayboy brAb<
+brayer brAP
+brayfield brAfEld
+brayman brAm~
+brayton brAt~
+braz braz
+brazda brazd@
+brazeal br@zEl
+brazeau br@zO
+brazee braz/
+brazel braz@l
+brazell braz@l
+brazelton br@zelt~
+brazen brAz~
+brazenly brAz~l/
+braziel br@zEl
+brazier brAz/P
+braziers brAZPz
+brazil br@zil
+brazil's br@zilz
+brazile brozIl
+brazilian br@zily~
+brazilians br@zily~z
+brazill braz@l
+brazos broz]s
+brazzaville braz@vil
+brazzel braz@l
+brazzell braz@l
+brca brik@
+brcko bVCk]
+brcko's bVCk]z
+brea brE
+breach brEC
+breached brECt
+breaches brEC@z
+breaching brEC6N
+bread bred
+breadbasket bredbask@t
+breadbox bredboks
+breaded bred@d
+breadfruit bredfrUt
+breading bred6N
+breads bredz
+breadth bredT
+breadwinner bredwinP
+breadwinners bredwinPz
+bready bred/
+break brAk
+breakable brAk@b@l
+breakage brAk6j
+breakaway brAk@wA
+breakdown brAkd?n
+breakdowns brAkd?nz
+breaker brAkP
+breakers brAkPz
+breakeven brAkEv~
+breakey brAk/
+breakfast brekf@st
+breakfasts brekf@sts
+breakfield brAkfEld
+breaking brAk6N
+breakmate brAkmAt
+breakneck brAknek
+breakout brAk?t
+breakouts brAk?ts
+breaks brAks
+breakthrough brAkTrU
+breakthroughs brAkTrUz
+breakup brAkup
+breakups brAk@ps
+breakwater brAkw{tP
+breaky brAk/
+bream brEm
+brean brEn
+brearley brVl/
+breast brest
+breasted brest@d
+breastfed brestfed
+breastfeed brestf/d
+breastfeeding brestf/d6N
+breastfeeding's brestf/d6Nz
+breastfeeds brestf/dz
+breasting brest6N
+breastplate brestplAt
+breasts brests
+breath breT
+breathe brET
+breathed brETd
+breather brETP
+breathes brETz
+breathing brET6N
+breathless breTl@s
+breathlessly breTl@sl/
+breaths breTs
+breathtaking breTtAk6N
+breathtakingly breTtAk6Nl/
+breathy breT/
+breau brO
+breault brO
+breaux brO
+breaux brU
+breazeale brEzEl
+brebach breb@k
+brechbill brekb@l
+brecheen brek/n
+brecheisen brekIs~
+brecher brekP
+brecht brekt
+brechtel brekt@l
+breck brek
+breckenridge brek~rij
+brecker brekP
+breco brek]
+bred bred
+breda brAd@
+brede brEd
+breden brEd~
+bredeson bred@s~
+bree brE
+breece brEs
+breech brEC
+breed brEd
+breed's brEdz
+breeden brEd~
+breeden's brEd~z
+breeder brEdP
+breeders brEdPz
+breeders' brEdPz
+breeding brEd6N
+breedlove brEdluv
+breeds brEdz
+breeland brEl~d
+breen brEn
+brees brEz
+breese brEz
+breeze brEz
+breezed brEzd
+breezes brEz@z
+breezeway brEzwA
+breezy brEz/
+brege brEj
+breger brEgP
+breglio bregl/]
+bregman bregm~
+breguet brEg@t
+brehm brem
+brehmer bremP
+breidenbach brId~bok
+breidenstein brId~st/n
+breidenstein brId~stIn
+breier brIP
+breighner brAnP
+breighton brIt~
+breiner brInP
+breining brIn6N
+breininger brIn6NP
+breisch brIS
+breit brEt
+breitbach brItbok
+breitbarth brItborT
+breitenbach brIt~bok
+breitenstein brIt~st/n
+breitenstein brIt~stIn
+breithaupt brIT?pt
+breitkreutz brItkr<ts
+breitling brIt@l6N
+breitling brItl6N
+breitman brItm~
+breitschwerdt brICwPt
+breitweiser brItwIsP
+breitzman brItsm~
+brekke brek
+breland brel~d
+brelsford brelsfPd
+brem brem
+bremen brem~
+bremer brEmP
+bremmer bremP
+bremner bremnP
+brems bremz
+bren bren
+brenda brend@
+brenda's brend@z
+brendan brend~
+brendel brend@l
+brenden brend~
+brender brendP
+brendle brend@l
+brendlinger brend@l6NP
+brendor brendP
+brendsel brends@l
+breneman brEnm~
+brener brEnP
+brenes brEnz
+brengle briN@l
+brenizer brenIzP
+brenn bren
+brenna bren@
+brennan bren~
+brennan's bren~z
+brennans bren~z
+brennecke bren6k
+brenneke bren@k/
+brenneman brenm~
+brennen bren~
+brenner brenP
+brenning bren6N
+brensinger brens6NP
+brent brent
+brentano brenton]
+brentanos brenton]z
+brentlinger brent@l6NP
+brenton brent~
+brents brents
+brentwood brentwqd
+breon brE~
+bresca bresk@
+brescia bresC@
+bresee br@sE
+bresette br@set
+breshears breS6rz
+breslaw breslo
+bresler breslP
+breslin breslin
+breslow bresl]
+bresnahan bresn@han
+bresnan bresn~
+bresnick bresn6k
+bress bres
+bresse bres
+bresseau bres]
+bresser bresP
+bresser's bresPz
+bressette breset
+bressler breslP
+bressman bresm~
+bresson bres~
+brest brest
+brester brestP
+bret bret
+breth breT
+brethauer breT?P
+brethen brET~
+brethren breTr~
+breton bret~
+bretschneider breCnIdP
+brett bret
+bretthauer breT?P
+bretton bret~
+bretts brets
+brettschneider breCnIdP
+brettschneider bretsnIdP
+bretz brets
+breuer brUP
+breunig brUn6g
+breuninger brUn@NP
+brevard brevPd
+brevets br@vets
+brevig brev6g
+brevik brev6k
+brevity brev@t/
+brew brU
+brewbaker brUbAkP
+brewed brUd
+brewer brUP
+brewer's brUPz
+breweries brUP/z
+breweries brUr/z
+brewers brUPz
+brewers' brUPz
+brewery brUP/
+brewing brU6N
+brewington brU6Nt~
+brewry brUr/
+brews brUz
+brewster brUstP
+brewton brUt~
+brey brA
+breyer brAP
+breyer's brAPz
+breyfogle brAfOg@l
+breza brez@
+brezhnev brezn@v
+brezhnev brezncf
+brezhnev's brezn@vz
+brezhnev's brezncfs
+brezina brczEn@
+brezinski br@zinsk/
+bria brE@
+brian brI~
+brian's brI~z
+briana br/an@
+briana br/on@
+briana's br/an@z
+briana's br/on@z
+briancon brI~s~
+briand brI~d
+brianna br/an@
+brianna's br/an@z
+briant brI~t
+briar brIP
+briarcliff brIrklif
+bribe brIb
+bribed brIbd
+bribery brIbP/
+bribes brIbz
+bribing brIb6N
+bric brik
+briccetti br6Cet/
+bricco brik]
+brice brIs
+briceno br/Cen]
+brick brik
+brickbat brikbat
+brickbats brikbats
+brickel brik@l
+brickell brik@l
+bricker brikP
+brickey brik/
+brickhouse brikh?s
+bricklayer briklAP
+bricklayers briklAPz
+brickle brik@l
+brickler briklP
+brickley brikl/
+bricklin briklin
+bricklin's briklinz
+brickman brikm~
+brickner briknP
+bricks briks
+brickyard brikyord
+bricom brik}
+bridal brId@l
+bride brId
+bride's brIdz
+brideau br@dO
+bridegroom brIdgrUm
+bridegroom's brIdgrUmz
+briden brId~
+bridenbaugh brid~b?
+bridenstine brid~st/n
+brides brIdz
+bridesburg brIdzb@rg
+bridesmaid brIdzmAd
+bridesmaid's brIdzmAdz
+bridesmaids brIdzmAdz
+bridesmaids' brIdzmAdz
+bridge brij
+bridge's brij@z
+bridged brijd
+bridgeford brijf{rd
+bridgeforth brijf{rT
+bridgehead brijhed
+bridgeman brijm~
+bridgeport brijp{rt
+bridger brijP
+bridgers brijPz
+bridges brij@z
+bridgestone brijstOn
+bridgestone's brijstOnz
+bridget brij@t
+bridget's brij@ts
+bridgeton brijt~
+bridgetown brijt?n
+bridgett brij@t
+bridgette brijEt
+bridgette brijit
+bridgewater brijw{tP
+bridgham brijh}
+bridging brij6N
+bridgman brijm~
+bridie brid/
+bridle brId@l
+bridled brId@ld
+bridwell bridwel
+brie brE
+brieant brE~t
+brief brEf
+briefcase brEfkAs
+briefcases brEfkAs@z
+briefed brEft
+briefer brEfP
+briefers brEfPz
+briefest brEf@st
+briefing brEf6N
+briefings brEf6Nz
+briefly brEfl/
+briefs brEfs
+briegel brEg@l
+brieger brEgP
+briel brEl
+brien brI~
+brienza brEnz@
+brier brIP
+briere brir
+brierley brIPl/
+brierly brIPl/
+briese brEz
+brietzke brEtzk/
+brig brig
+brigade br@gAd
+brigadeer brig@dir
+brigades br6gAdz
+brigadier brig@dir
+brigance brig~s
+brigandi br6gand/
+brigante br/gont/
+briganti br6gant/
+briggs brigz
+briggstone brigst]n
+brigham brig}
+brigham's brig}z
+brighams brig}z
+bright brIt
+bright's brIts
+brightbill brItbil
+brighten brIt~
+brightened brIt~d
+brightening brItn6N
+brightening brIt~6N
+brightens brIt~z
+brighter brItP
+brightest brIt@st
+brightly brItl/
+brightman brItm~
+brightness brItn@s
+brighton brIt~
+brightwell brItwel
+brigitte brij@t
+brigman brigm~
+brignac brign@k
+brigner brIgnP
+brigode br6gOd@
+briguglio br6gugl/]
+briles brIlz
+briley bril/
+brill bril
+brillhart brilhort
+brilliance brily~s
+brilliant brily~t
+brilliantly brily~tl/
+brillstein brilstEn
+brillstein brilstIn
+brim brim
+brimberry brimber/
+brimelow brim@l]
+brimer brImP
+brimhall brimh{l
+brimm brim
+brimmed brimd
+brimmer brimP
+brimming brim6N
+brimstone brimst]n
+brin brin
+brindel brindel
+brindle brind@l
+brindley brindl/
+brine brIn
+brinegar brin6gP
+briner brInP
+brines brInz
+briney brin/
+bring briN
+bringhurst briNhPst
+bringing briN6N
+bringle briNg@l
+bringman briNm~
+brings briNz
+brining brIn6N
+brink briNk
+brink's briNks
+brinker briNkP
+brinkerhoff briNkPh{f
+brinkley briNkl/
+brinkly briNkl/
+brinkman briNkm~
+brinkmann briNkm~
+brinkmann's briNkm~z
+brinkmanship briNkm~Sip
+brinkmeier briNkmIP
+brinkmeyer briNkmIP
+brinks briNks
+brinksmanship briNksm~Sip
+brinlee brinl/
+brinley brinl/
+brinn brin
+brinner brinP
+brinser brinsP
+brinsfield brinsf/ld
+brinson brins~
+brintec brintek
+brinton brint~
+brio brI]
+brioche brEOS
+brioche brEoS
+briody brI@d/
+brion brI~
+briones br/Oncs
+briquemont brikm{nt
+brisbane brizbAn
+brisbin brizbin
+brisbois brizbwo
+brisbois brizbwo
+brisbon brizb~
+brisburg brisbPg
+brisco brEsk]
+briscoe brisk]
+brisendine bris~dIn
+briseno br/sen]
+briseno's br/sen]z
+brisk brisk
+brisker briskP
+brisket brisk@t
+briskey brisk/
+briski brisk/
+briskin briskin
+briskly briskl/
+brisky brisk/
+brislin brislin
+brison bris~
+brissette briset
+brissey bris/
+brisson bris~
+brister bristP
+bristle bris@l
+bristled bris@ld
+bristles bris@lz
+bristling bris@l6N
+bristling brisl6N
+bristol brist@l
+bristow brist]
+brit brit
+brita brEt@
+britain brit~
+britain's brit~z
+britains brit~z
+britannia br@tan/@
+britannica br@tan6k@
+britcher briCP
+britches briC@z
+brite brIt
+britian briS~
+british brit6S
+britnell britn@l
+brito brEt]
+britoil brit<l
+briton brit~
+britons brit~z
+britons' brit~z
+brits brits
+britsch briC
+britt brit
+brittain brit~
+brittan brit~
+brittany brit~/
+britten brit~
+brittenham brit~h}
+brittian brit/~
+brittin britin
+brittingham brit6Nham
+brittle brit@l
+britton brit~
+britts brits
+britz brits
+brix briks
+brixey briks/
+brixius brIks/@s
+brizendine br/zcndEn/
+brizill brizil
+brizola brizOl@
+brizzi briz/
+brizzolara br/ts]l)r@
+bro brO
+bro's brOz
+broach brOC
+broached brOCt
+broaches brOC@z
+broaching brOC6N
+broad br{d
+broad's br{dz
+broadaway br{d@wA
+broadband br{dband
+broadbase br{dbAs
+broadbased br{dbAst
+broadbeach br{dbEC
+broadbent br{dbent
+broadcast br{dkast
+broadcaster br{dkastP
+broadcaster's br{dkastPz
+broadcasters br{dkastPz
+broadcasters' br{dkastPz
+broadcasting br{dkast6N
+broadcasting's br{dkast6Nz
+broadcasts br{dkas
+broadcasts br{dkass
+broadcasts br{dkasts
+broaddus br{d@s
+broaden br{d~
+broadened br{d~d
+broadening br{dn6N
+broadening br{d~6N
+broadens br{d~z
+broader br{dP
+broadest br{d@st
+broadhead br{dhed
+broadhurst br{dhPst
+broadie br{d/
+broadley br{dl/
+broadly br{dl/
+broadnax br{dnaks
+broadpfoot br{dfqt
+broadrick br{dr6k
+broadside br{dsId
+broadsided br{dsId@d
+broadstreet br{dstrEt
+broadsword br{ds{rd
+broadus brOd@s
+broadview br{dvyU
+broadway br{dwA
+broadway's br{dwAz
+broadwell br{dwel
+broady br{d/
+brobdingnagian br{bd6gnag/~
+brobdingnagians br{bd6gnag/~z
+brobeck brObek
+broberg brObPg
+brobst brobst
+broc brok
+brocade br]kAd
+brocades br]kAdz
+brocato br]kot]
+brocco brok]
+broccoli brok@l/
+broccoli brokl/
+broce brOs
+brochu brOkU
+brochure br]Sqr
+brochures br]Sqrz
+brocious br{SEs
+brock brok
+brock's broks
+brockbank brokb@Nk
+brockel brok@l
+brocker brokP
+brockert brokPt
+brockett brok@t
+brockhaus brokh?s
+brockhoff brokh{f
+brockhouse brokh?s
+brockie brok/
+brockington brok6Nt~
+brocklehurst brok@lhPst
+brockley brokl/
+brocklin broklin
+brocklin's broklinz
+brockman brokm~
+brockmann brokm~
+brockmeier brokmIP
+brockmeyer brokmIP
+brockner broknP
+brocksmith broksmiT
+brockton brokt~
+brockway brokwA
+brockway's brokwAz
+brockwell brokwel
+brod brod
+broda brOd@
+brodbeck brodbek
+brode brOd
+broden brOd~
+broder brOdP
+broder's brOdPz
+broderbund brOtPb~d
+broderick brodP6k
+broderick brodr6k
+broderick's brodP6kz
+broderick's brodr6kz
+brodersen brodPs~
+brodersohn brOtPs~
+broderson brodPs~
+brodeur brodP
+brodhead brodhed
+brodie brOt/
+brodin brOdin
+brodkin brodkin
+brodman brodm~
+brodnax brodnaks
+brodowski br@d{fsk/
+brodrick brodr6k
+brodry brodr/
+brodsky brodsk/
+brodt brodt
+brody brOd/
+brody's brOd/z
+brodzinski br@jinsk/
+broe brO
+broecker brOkP
+broeker brOkP
+broer brOP
+broerman brOPm~
+broers brOPz
+brogan brOg~
+brogden brogd~
+brogdon brogd~
+brogna brOgn@
+broich br<C
+broil br<l
+broiled br<ld
+broiler br<lP
+broilers br<lPz
+broiling br<l6N
+brok brok
+brokaw brOk{
+broke brOk
+broken brOk~
+broken-wind brOk~wind
+broken-winded brOk~wind@d
+broker brOkP
+broker's brOkPz
+brokerage brOkP6j
+brokerage brOkr6j
+brokerage's brOkP6j@z
+brokerage's brOkr6j@z
+brokerages brOkP6j@z
+brokerages brOkr6j@z
+brokerages' brOkP6j@z
+brokerages' brOkr6j@z
+brokered brOkPd
+brokering brOkP6N
+brokers brOkPz
+brokers' brOkPz
+broking brOk6N
+brolin brOlin
+brolly brol/
+brom brom
+broman brOm~
+bromberg brombPg
+bromfield bromfEld
+bromfield's bromfEldz
+bromide brOmId
+bromides brOmIdz
+bromine brOmEn
+bromley broml/
+bromm brom
+brommer bromP
+bromont brOmont
+brompheril bromfcril
+bromwell bromwel
+bromwich bromw6C
+bronaugh bron{
+bronc broNk
+bronchial bronC/@l
+bronchitis broNkIt@s
+bronco broNk]
+broncos broNk]z
+bronder brondP
+broner brOnP
+bronfman bronfm~
+bronfman's bronfm~z
+bronfmans bronfm~z
+bronk broNk
+bronkema br@NkEm@
+bronn bron
+bronner bronP
+brons bronz
+bronson brons~
+bronstein bronstEn
+bronstein bronstIn
+bronston bronst~
+bronte bront/
+bronte's bront/z
+brontosaurus br{n@s{r@s
+brontosaurus br{nt@s{r@s
+bronwen br{nwcn
+bronx broNks
+bronze bronz
+bronzed bronzd
+bronzen bronz~
+bronzes bronz@z
+brooch brOC
+brood brUd
+brooded brUd@d
+brooding brUd6N
+broody brUd/
+brook brqk
+brook's brqks
+brookbank brqkbaNk
+brooke brqk
+brooke's brqks
+brookehill brqkhil
+brooken brqk~
+brookens brqk~z
+brooker brqkP
+brookes brqks
+brookfield brqkfEld
+brookhart brUkhort
+brookhaven brqkhAv~
+brookhurst brqkhVst
+brooking brqk6N
+brookings brqk6Nz
+brookins brUkinz
+brookline brqklIn
+brooklyn brqkl~
+brooklyn's brqkl~z
+brookman brqkm~
+brookner brqknP
+brookner's brqknPz
+brookover brqkOvP
+brooks brqks
+brooks' brqks
+brooks's brqks
+brooks's brqks@z
+brookshier brUkS/P
+brookshire brUkSIr
+brookside brqksId
+brookstone brqkstOn
+brooksville brqksvil
+brooksville's brqksvilz
+broom brUm
+broomall brUm@l
+broome brUm
+broomfield brUmfEld
+brooms brUmz
+broomstick brUmstik
+broomsticks brUmstiks
+brophy brOf/
+brosch br{S
+brose brOz
+brosh broS
+broshears broS6rz
+brosious brOz/@s
+brosius brOs/@s
+broski br?sk/
+brosky brosk/
+brosnahan brosn@han
+brosnan brosn~
+bross br{s
+brossard br@s)rd
+brossart brosort
+brosseau br@sO
+brosser brosP
+brossette br@set
+brossman br{sm~
+brost brost
+brostrom brostr}
+brosz broS
+broten brOt~
+broth br{T
+brothel broT@l
+brothels broT@lz
+brother bruTP
+brother's bruTPz
+brotherhood bruTPhqd
+brotherly bruTPl/
+brothers bruTPz
+brothers' bruTPz
+brothers's bruTPz@z
+brotherson bruTPs~
+brotherton bruTPt~
+broths br{Ts
+brotman brotm~
+brott brot
+brotzman brotsm~
+broucek brUCck
+broudy br?d/
+brough br?
+brougham brUg}
+brougher br?P
+broughman br?m~
+brought br{t
+broughton br{t~
+brouhaha brUhoho
+brouhard broUPd
+brouillard brw/l)rd
+brouillet brw/let
+brouillette brw/let
+broun brUn
+brountas br?nt@s
+brouse br?s
+broussard brUs)rd
+brousseau brUsO
+brousset brUsct
+brouwer br?wP
+brow br?
+broward br?Pd
+browbeat br?bEt
+browder br?dP
+browe brO
+browed br?d
+brower br?P
+brown br?n
+brown's br?nz
+brownback br?nbak
+browne br?n
+browned br?nd
+brownell br?nel
+browner br?nP
+brownest br?ncst
+brownfield br?nfEld
+brownfields br?nfEldz
+brownie br?n/
+brownies br?n/z
+browning br?n6N
+browning's br?n6Nz
+brownish br?niS
+brownlee br?nl/
+brownley br?nl/
+brownlie br?nl/
+brownlow br?nlO
+brownmiller br?nmilP
+brownout br?n?t
+brownouts br?n?ts
+brownrigg br?nr6g
+browns br?nz
+browns' br?nz
+brownson br?ns~
+brownstein br?nstEn
+brownstein br?nstIn
+brownstone br?nstOn
+brownsville br?nzvil
+brows br?z
+browse br?z
+browsed br?zd
+browser br?zP
+browsers br?zPz
+browsing br?z6N
+brox broks
+broxson broks~
+broxterman brokstPm~
+broxton brokst~
+broy br<
+broyard br<Pd
+broyhill br<hil
+broyles br<lz
+broz broz
+brozek brOzck
+brozman brozm~
+brozovich broz@v6C
+brozowski br@z{fsk/
+brubaker brub@kP
+brubeck brUbek
+brucato brUkot]
+bruce brUs
+bruce's brUs@z
+bruch bruC
+bruchhausen brUkh?z~
+brucie bruk/
+brucite brUsIt
+bruck bruk
+bruck's bruks
+brucker brukP
+bruckheimer brukhImP
+bruckman brukm~
+bruckner bruknP
+brucks bruks
+bruder brUdP
+brue brU
+bruecher brUCP
+brueck brUk
+brueckner brqknP
+bruegge brUg@
+brueggeman brUgm~
+brueggemann brUgm~
+brueggen brUg~
+bruegger brUgP
+bruegger's brUgPz
+bruehl brUl
+bruella brUel@
+bruemmer brUmP
+bruen brUn
+bruening brUn6N
+bruer brUP
+bruff bruf
+bruford brUfPd
+bruges brUj
+bruges brUj@z
+bruggeman brugm~
+brugger brugP
+brugh bru
+brugman brugm~
+bruha brUh@
+bruhl brul
+bruhn brun
+bruin brU~
+bruington brU6Nt~
+bruins brU~z
+bruinsma brUinsm@
+bruise brUz
+bruised brUzd
+bruises brUz@z
+bruising brUz6N
+brule brUl
+bruley brUl/
+brum brum
+brumbach brumbok
+brumback brumbak
+brumbaugh brumb{
+brumbelow brumb@l]
+brumer brUmP
+brumett brumit
+brumfield brumfEld
+brumit brUmit
+brumitt brUmit
+brumley bruml/
+brumlow bruml]
+brumm brum
+brummel brum@l
+brummell brum@l
+brummer brumP
+brummet brumit
+brummett brumit
+brummitt brumit
+brummond brum~d
+brun brun
+bruna brUn@
+brunch brunC
+brunches brunC@z
+bruncor brunk{r
+brundage brund6j
+brundidge brund6j
+brundige brund6g
+brundtland bruntl~d
+brune brUn
+bruneau br~O
+brunei brUnI
+brunell brun@l
+brunella brUnel@
+brunelle br~el
+brunelli brUnel/
+bruner brUnP
+brunet brUnet
+brunett brun@t
+brunetta brUnet@
+brunette brUnet
+brunettes brUnets
+brunetti brUnet/
+brunetto brUnet]
+bruney brUn/
+brungard bruNgPd
+brungardt bruNgort
+brunger bruNP
+brunhilda brUnhEld@
+bruni brUn/
+brunick brUn6k
+bruning brUn6N
+brunjes br~ZEz
+brunk bruNk
+brunke bruNk
+brunken bruNk~
+brunker bruNkP
+brunkhorst bruNkh{rst
+brunkow bruNk]
+brunn brun
+brunner brunP
+brunnhilde brunhild
+bruno brUn]
+bruno's brUn]z
+bruns brunz
+brunskill brunskil
+brunsman brunsm~
+brunson bruns~
+brunsvold brunsvOld
+brunswick brunzw6k
+brunswick's brunzw6ks
+brunswig brunsw6g
+brunswig's brunsw6gz
+brunt brunt
+bruntjen bruntjen
+brunton brunt~
+brunty brunt/
+bruntz brunts
+brus brus
+brusca brusk@
+bruschi brUsk/
+brusco brUsk]
+bruse brUz
+brusett brUset
+brusett brqset
+brusette brUset
+brush bruS
+brushaber bruS@bP
+brushed bruSt
+brushes bruS@z
+brushfire bruSfIr
+brushfires bruSfIrz
+brushing bruS6N
+brushwork bruSwVk
+brushy bruS/
+bruske brusk
+bruski brusk/
+brusky brusk/
+bruso brUs]
+brusque brusk
+brusquely bruskl/
+bruss brus
+brusseau br@sO
+brussel brus@l
+brusselmans brus@lm~z
+brussels brus@lz
+brust brust
+bruster brustP
+brustoloni brUst]lOn/
+brut brUt
+brutal brUt@l
+brutalities brUtal@t/z
+brutality brUtal@t/
+brutalization brUt@l@zAS~
+brutalize brUt@lIz
+brutalized brUt@lIzd
+brutalizes brUt@lIz@z
+brutalizing brUt@lIz6N
+brutally brUt@l/
+brute brUt
+brutish brUtiS
+bruton brUt~
+brutsche bruC/
+brutus brUt@s
+bruun brUn
+bruxelles br@ksel@s
+bruyette brUet
+bruynes brUinz
+bruzzese brUtsAz/
+bryan brI~
+bryan's brI~z
+bryans brI~z
+bryant brI~t
+bryars brIPz
+bryce brIs
+bryden brId~
+brydges brij@z
+brydie brid/
+brydon brid~
+brye brI
+bryen brI~
+bryer brIP
+bryk brik
+brymer brImP
+bryn brin
+bryna brin@
+bryne brIn
+bryner brInP
+bryngelson briNg@ls~
+bryon brI~
+brys bris
+bryson brIs~
+brzezinski br@zinsk/
+brzoska brOsk@
+brzozowski br@z{fsk/
+brzycki britsk/
+bt bEtE
+bta bEtEA
+bua bEyUA
+bua byU@
+bub bub
+bubar bUbP
+bubb bub
+bubba bub@
+bubble bub@l
+bubbled bub@ld
+bubbles bub@lz
+bubbling bub@l6N
+bubbling bubl6N
+bubbly bub@l/
+bubbly bubl/
+bubeck bUbck
+bubel bUb@l
+bubier byUb/P
+bubka bubk@
+bublitz bublits
+buboltz byUbOlts
+bubolz byUbOlz
+bubonic byUbon6k
+buc buk
+bucaro bUk)r]
+bucase byUkAs
+buccaneer buk~Er
+buccaneers buk~Erz
+buccellato bUCclot]
+buccheri bUk,r/
+bucci bUC/
+bucciarelli bUCPel/
+buccieri bUCir/
+buccino bUCEn]
+buccola bUkOl@
+bucek bUCck
+bucey byUs/
+buch buC
+buchalter buk@ltP
+buchan buk~
+buchanan byUkan~
+buchanan's byUkan~z
+buchananism byUkan~iz}
+buchanans byUkan~z
+buchannan byUkan~
+buchanon byUkan~
+bucharest bUkPest
+bucharest byUkPest
+buchberger bukbPgP
+buchbinder bukbIndP
+buchbinder bukbindP
+buche buC
+buchen buk~
+buchenwald byUkcnwold
+bucher bukP
+buchert buCPt
+buchheit bukhIt
+buchholtz bukh]lts
+buchholz bukh]lz
+buchi bUC/
+buchi buC/
+buchi's bUC/z
+buchi's buC/z
+buchinger buk~jP
+buchko buCk]
+buchler buk@lP
+buchman bukm~
+buchmann bukm~
+buchmiller bukm@lP
+buchner buknP
+bucholtz buk]lts
+bucholz buk]lz
+buchs buks
+buchsbaum buksb?m
+buchta buCt@
+buchter buktP
+buchwald bukw{ld
+buck buk
+buck's buks
+buckalew buk@lU
+buckbee bukbE
+bucked bukt
+buckel buk@l
+buckelew buk@lU
+buckels buk@lz
+bucket buk@t
+buckets buk@ts
+buckey buk/
+buckeye bukI
+buckhantz bukhants
+buckholtz bukhOlts
+buckholz bukh]lz
+buckhorn bukh{rn
+bucking buk6N
+buckingham buk6Nham
+buckland bukl~d
+buckle buk@l
+buckled buk@ld
+buckler buk@lP
+buckles buk@lz
+bucklew buklU
+buckley bukl/
+bucklin buklin
+buckling bukl6N
+buckman bukm~
+buckmaster bukmastP
+buckminster bukminstP
+bucknam bukn}
+bucknell buknel
+buckner buknP
+bucko buk]
+bucks buks
+buckshot bukSot
+buckskin bukskin
+buckstein bukstEn
+buckthorn bukT{rn
+buckwalter bukw@ltP
+buckwheat bukwEt
+bucky buk/
+bucoba byUkOb@
+bucolic byUkol6k
+bucy byUs/
+buczek buCck
+buczkowski b@Ck{fsk/
+buczynski b@Cinsk/
+bud bud
+bud's budz
+bud-test budtest
+budai bUdo/
+budapest bUd@pest
+budapest's bUd@pests
+buday bUdA
+budd bud
+budde bud
+budden bud~
+buddenbrooks bud~brqks
+buddenhagen bud~h@g~
+buddha bUd@
+buddha's bUd@z
+buddhism bUdiz}
+buddhist bUd@st
+buddhists bUd@s
+buddhists bUd@ss
+buddhists bUd@sts
+buddie bud/
+buddier bud/P
+buddiers bud/Pz
+buddies bud/z
+buddin budin
+budding bud6N
+buddy bud/
+buddy's bud/z
+buder byUdP
+budge buj
+budged bujd
+budget buj@t
+budget's buj@ts
+budgetary buj@ter/
+budgeted buj@t@d
+budgeteer buj@tir
+budgeteers buj@tirz
+budgeting buj@t6N
+budgets buj@ts
+budging buj@N
+budick bud@k
+budick's bud@ks
+budiman byUt}~
+budin bUdin
+budinger byUd6NP
+budka budk@
+budke budk/
+budlong budl{N
+budner budnP
+budney budn/
+budnick budn6k
+budnik budn6k
+budny budn/
+budreau b@drO
+budrow budrO
+buds budz
+budson buds~
+budvar bqdvor
+budvar budvor
+budweiser budwIzP
+budyonnovsk bUdy~ovsk
+budz budz
+budzinski b@jinsk/
+budzyn budzin
+budzynski b@jinsk/
+bue bwe
+bueche bUC
+buechel byUk@l
+buechele byUk@l
+buechler byUk@lP
+buechner byUknP
+buege bUj
+buegler byUglP
+buehl byUl
+buehler byUlP
+buehner byUnP
+buehrer byUP
+buehrer byUhP
+buehring byUr6N
+buehrle byUr@l
+bueker byUkP
+buel byUl
+buell byU@l
+buelow bUl]
+buena bUn@
+buendia bUnd/@
+buenger byUnjP
+buening bwen6N
+bueno bwAn]
+buenos bwAn@s
+buenos bwAn]s
+buenrostro bwcnrOstr]
+buentello bUntel]
+buer bUP
+buerge byUrj
+buerger byUrgP
+buerkle byUrk@l
+buerry b,r/
+buescher byUSP
+buesing byUs6N
+bueter byUtP
+buetow bUt]
+buettner byUtnP
+bufano bUfon]
+bufe byUf
+bufete byUfEt
+buff buf
+buff's bufs
+buffa buf@
+buffalo buf@lO
+buffalo's buf@lOz
+buffalos buf@lOz
+buffer bufP
+buffered bufPd
+bufferin bufPin
+buffers bufPz
+buffet b@fA
+buffet buf@t
+buffeted b@fAd
+buffeted bufit@d
+buffeting b@fA6N
+buffeting buf@t6N
+buffets buf@ts
+buffett buf@t
+buffett's buf@ts
+buffin bufin
+buffington buf6Nt~
+buffkin bufkin
+buffo bUf]
+buffone bUfOn/
+buffoon b@fUn
+bufford bufPd
+buffs bufs
+buffton buft~
+buffum buf}
+buffy buf/
+bufkin bufkin
+buford byUfPd
+bug bug
+buga bEyUjEA
+buga byUg@
+bugaboo bug@bU
+bugaj bUg@j
+bugarin byUgPin
+bugay byUgA
+bugbee bugbE
+bugeye bugI
+bugeyed bugId
+bugg bug
+bugge bug
+bugged bugd
+bugger bugP
+buggers bugPz
+buggies bug/z
+bugging bug6N
+buggs bugz
+buggy bug/
+bugh byUg
+bugher byUgP
+bugle byUg@l
+bugles byUg@lz
+bugling byUg@l6N
+bugling byUgl6N
+bugliosi bUgl/Os/
+bugliosi's bUgl/Os/z
+bugojno bUgOZn]
+bugs bugz
+bugsy bugz/
+buhl byUl
+buhler bUlP
+buhman bum~
+buhr byqr
+buhrman bqrm~
+buhrow bqr]
+bui bi
+bui bwE
+buice bis
+buice bwEs
+buick byU6k
+buick's byU6ks
+buicks byU6ks
+buie bUE
+buie bwE
+buikema b6kAm@
+buikema bw6kAm@
+build bild
+buildable bild@b@l
+builder bildP
+builder's bildPz
+builders bildPz
+builders' bildPz
+building bild6N
+building's bild6Nz
+buildings bild6Nz
+builds bildz
+buildup bildup
+buildups bildups
+built bilt
+buis biz
+buisson bwEson
+buist bUist
+buitoni byUtOn/
+buitrago b@trog]
+buitron bitr~
+bujak bUy@k
+bujumbura bUj}bqr@
+bukavu bUkovU
+bukavu's bUkovUz
+buker byUkP
+bukharin bukhP~
+bukovsky bUkovsk/
+bukowski byUk{fsk/
+bula byUl@
+bulat bUl@t
+bulb bulb
+bulbous bulb@s
+bulbs bulbz
+bulen bul~
+bulent byUl~t
+buley byUl/
+bulfinch bqlfinC
+bulfinch's bqlfinC@z
+bulgaria b@lg,r/@
+bulgaria's b@lg,r/@z
+bulgarian b@lg,r/~
+bulgarians b@lg,r/~z
+bulge bulj
+bulged buljd
+bulger bulgP
+bulges bulj@z
+bulging bulj6N
+bulgrin bqlgrin
+bulimia byUlim/@
+bulimic byUlim6k
+bulin byUlin
+bulk bulk
+bulkeley bqlk@l/
+bulkhead bulkhed
+bulkheads bulkhedz
+bulkier bulk/P
+bulkley bulkl/
+bulky bulk/
+bull bql
+bull's bqlz
+bulla bql@
+bullard bqlPd
+bulldog bqld{g
+bulldogs bqld{gz
+bulldoze bqldOz
+bulldozed bqldOzd
+bulldozer bqldOzP
+bulldozers bqldOzPz
+bulldozing bqldOz6N
+bullen bql~
+buller bqlP
+bullet bql@t
+bulletin bql@t~
+bulletins bql@t~z
+bulletproof bql@tprUf
+bullets bql@ts
+bullfight bqlfIt
+bullfighter bqlfItP
+bullfighting bqlfIt6N
+bullfights bqlfItz
+bullfrog bqlfr{g
+bullfrogs bqlfr{gz
+bullhead bqlhed
+bullheads bqlhedz
+bullhorn bqlh{rn
+bullhorns bqlh{rnz
+bullied bql/d
+bullies bql/z
+bullinger bql6NP
+bullington bql6Nt~
+bullins bqlinz
+bullion bqly~
+bullis bqlis
+bullish bqliS
+bullishly bqliSl/
+bullishness bqliSn@s
+bullitt bUl@t
+bullman bqlm~
+bulloch bql@k
+bullock bql@k
+bullock's bql@ks
+bullocks bql@ks
+bullpen bqlpen
+bulls bqlz
+bulls' bqlz
+bullseye bUlzI
+bullshit bqlSit
+bulluck bql@k
+bullwinkle bqlwiNk@l
+bully bql/
+bullying bql/6N
+bulman bulm~
+bulmer bulmP
+bulova byUlOv@
+bulow byUl]
+bulrush bqlruS
+bulson bqls~
+bult bult
+bultema bUltem@
+bulthuis bulTU@z
+bultman bqltm~
+bulwark bqlwPk
+bulwinkle bqlwiNk@l
+bum bum
+bumann byUm~
+bumbalough bumb@l?
+bumbarger bumborgP
+bumbaugh bumb{
+bumble bumb@l
+bumbling bumb@l6N
+bumbling bumbl6N
+bumgardner bumgordnP
+bumgarner bumgornP
+bumiputra bUm/pyUtr@
+bummed bumd
+bummer bumP
+bump bump
+bumpas bump@z
+bumpass bumpas
+bumped bumpt
+bumper bumpP
+bumpers bumpPz
+bumpersticker bumpPstikP
+bumperstickers bumpPstikPz
+bumping bump6N
+bumpings bump6Nz
+bumpkin bumpkin
+bumps bumps
+bumpus bump@s
+bumpy bump/
+bums bumz
+bumstead bumsted
+bun bun
+bunce buns
+bunch bunC
+bunche bunC
+bunched bunCt
+bunches bunC@z
+bunching bunC6N
+bunchy bunC/
+bund bund
+bunda bund@
+bunde bund
+bundesbank bond@sbaNk
+bundesbank bqnd@sbaNk
+bundesbank bqnd@sboNk
+bundesbank's bqnd@sbaNks
+bundespost bqnd@spOst
+bundespost's bqnd@spOsts
+bundesrat bqnd@srat
+bundestag bund@stag
+bundeswehr bund@swer
+bundick bund6k
+bundle bund@l
+bundled bund@ld
+bundles bund@lz
+bundling bund@l6N
+bundling bundl6N
+bundren bundP~
+bundrick bundr6k
+bunds bundz
+bundschuh bundSU
+bundy bund/
+bundy's bund/z
+bundys bund/z
+bung buN
+bungalow buNg@lO
+bungalows buNg@lOz
+bungard buNgPd
+bunge bunj
+bungee bunj/
+bunger buNP
+bungert buNgPt
+bungey bunj/
+bungled buNg@ld
+bungler buNglP
+bunglers buNglPz
+bungling buNg@l6N
+bungling buNgl6N
+bunk buNk
+bunke buNk
+bunker buNkP
+bunkers buNkPz
+bunkley buNkl/
+bunks buNks
+bunn bun
+bunnell bun@l
+bunner bunP
+bunney bun/
+bunni bUn/
+bunnie bun/
+bunnies bun/z
+bunning bun6N
+bunny bun/
+bunowski bUn?sk/
+buns bunz
+bunt bun
+bunt's bunts
+buntain b~tAn
+bunte bunt
+bunten bunt~
+buntin buntin
+bunting bunt6N
+bunton bunt~
+buntrock buntrok
+buntstrock buntstrok
+buntyn buntin
+buntz bunts
+bunyan buny~
+bunyard b~y)rd
+bunzl bunz@l
+buol bOl
+buonanno bw]non]
+buonicontis bwon6kont/z
+buono bwOn]
+buonocore bw]n]k{r/
+buonomo bw]nOm]
+buoy bU/
+buoyancy b<~s/
+buoyant b<~t
+buoyed bU/d
+buoying b<6N
+buoys bU/z
+bupkus bupk@s
+bupp bup
+buprenorphine byUpr~PfEn
+bur bV
+burack byUr@k
+burak byUr@k
+buran byUr~
+burandt byUr~t
+buras byUr@z
+burba bVb@
+burbach bVbok
+burback bVbak
+burbage bVb6j
+burbank bVbaNk
+burbank's bVbaNks
+burbidge bVb6j
+burbridge bVbr6j
+burby bVb/
+burch bVC
+burcham bPSam
+burchard bPS)rd
+burchell bVk@l
+burcher bVCP
+burchett bVCct
+burchette bPSet
+burchfield bVCf/ld
+burchill bVkhil
+burciaga bqrs/og@
+burck bVk
+burckhard bVkhPd
+burckhardt bVkhort
+burd bVd
+burda bqrd@
+burdell bPdel
+burden bVd~
+burdened bVd~d
+burdening bVd~6N
+burdens bVd~z
+burdensome bVd~s}
+burdett bVdit
+burdette bPdet
+burdge bVj
+burdi bqrd/
+burdick bVd6k
+burdin bVdin
+burdine bPdEn
+burdine bPdIn
+burdine's bPdEnz
+burdine's bPdInz
+burdines bPdEnz
+burdines bPdInz
+burditt bPdit
+burdo bqrd]
+burdon bVd~
+burdsall bVds@l
+bureau byqr]
+bureau's byqr]z
+bureaucracies byqrokr@s/z
+bureaucracy byqrokr@s/
+bureaucracy's byqrokr@s/z
+bureaucrat byqr@krat
+bureaucrat byqr]krat
+bureaucratese byqr@kratEz
+bureaucratic byqr@krat6k
+bureaucrats byqr@krats
+bureaucrats byqr]krats
+bureaus byqr]z
+burek b,r6k
+burel b,r@l
+burell b,r@l
+buren byqr~
+bures b,r@z
+bures b,rz
+buresh b,rcS
+burfeind bVfInd
+burfield bVf/ld
+burford bVfPd
+burg bVg
+burgamy bVg}/
+burgan bVgan
+burgard bVgPd
+burgdorf bVgd{rf
+burge bVg
+burgee bVg/
+burgener bVg/nP
+burgeon bVj~
+burgeoned bVj~d
+burgeoning bVj~6N
+burger bVgP
+burger's bVgPz
+burgers bVgPz
+burgert bVgPt
+burges bVgz
+burgeson bVg@s~
+burgess bVj@s
+burget bVgct
+burgett bVjit
+burggraf bVgr@f
+burghardt bVgort
+burghart bVghort
+burgher bVgP
+burghley bVgl/
+burgin bVgin
+burgio bVg/]
+burglar bVglP
+burglaries bVglP/z
+burglarize bVglPIz
+burglarized bVglPIzd
+burglars bVglPz
+burglary bVglP/
+burgling bVgl6N
+burgman bVgm~
+burgmaster bVgmastP
+burgner bVgnP
+burgo bVg]
+burgomaster bVg}astP
+burgomaster's bVg}astPz
+burgomasters bVg}astPz
+burgoon bVgUn
+burgos bVg]z
+burgoyne bPg<n
+burgoyne's bPg<nz
+burgundian bPgund/~
+burgundians bPgund/~z
+burgundies bVg~d/z
+burgundy bVg~d/
+burgundy's bVg~d/z
+burgy bVj/
+burham bVh}
+burhans bVh~z
+buri bqr/
+burial b,r/@l
+burials b,r/@lz
+burian byqr/~
+burich b,r6k
+buried b,r/d
+buries b,r/z
+burk bVk
+burkard bVkPd
+burkart bVkort
+burke bVk
+burke's bVks
+burkeen bPkEn
+burkel bVk@l
+burkemper bVkcmpP
+burkert bVkPt
+burkes bVks
+burket bVk@t
+burkett bVkct
+burkey bVk/
+burkhalter bVkh@ltP
+burkhammer bVkh}P
+burkhard bVkhPd
+burkhardt bVkhort
+burkhart bVkhort
+burkhead bVkhcd
+burkholder bVkh]ldP
+burkina bPkEn@
+burkins bVkinz
+burkitt bVkit
+burkland bVkl~d
+burkle bVk@l
+burkley bVkl/
+burklow bVkl?
+burklund bVkl~d
+burkman bVkm~
+burks bVks
+burkus bVk@s
+burl bVl
+burland bVl~d
+burlap bVlap
+burlapped bVlapt
+burlatsky bPlatsk/
+burleigh bVl@
+burleson bVl@s~
+burlesque bPlesk
+burlew bVlU
+burley bVl/
+burling bVl6N
+burlingame bVl6NgAm
+burlingham bVl6Nham
+burlington bVl6Nt~
+burlington's bVl6Nt~z
+burlison bVl@s~
+burly bVl/
+burma bVm@
+burma's bVm@z
+burmah bVm@
+burman bVm~
+burmans bVm~z
+burmaster bVmastP
+burmeister bVmIstP
+burmese bPmEz
+burmester bVmcstP
+burn bVn
+burnable bVn@b@l
+burnaby bVn@b/
+burnam bVn}
+burnap bVn@p
+burnard bPn)rd
+burndy bVnd/
+burne bVn
+burned bVnd
+burnell bVn@l
+burner bVnP
+burners bVnPz
+burnes bVnz
+burness bVn@s
+burnet bVnct
+burnett bPnet
+burnett's bPnets
+burnette bPnet
+burney bVn/
+burnham bVnham
+burnham bVn}
+burnham's bVnhamz
+burnham's bVn}z
+burning bVn6N
+burningham bVn6Nham
+burnings bVn6Nz
+burnish bVniS
+burnished bVniSt
+burnley bVnl/
+burnley's bVnl/z
+burnout bVn?t
+burns bVnz
+burns' bVnz
+burns's bVnz@z
+burnsed bVnzd
+burnside bVnsId
+burnside's bVnsIdz
+burnstein bVnstEn
+burnstein bVnstIn
+burnsworth bVnzwVT
+burnt bVnt
+burnup bVnup
+burnworth bVnwVT
+buroker byUr@kP
+burow byqr]
+burp bVp
+burpee bVp/
+burping bVp6N
+burpo bqrp]
+burr bV
+burrage bV6j
+burrell bPel
+burrer bVP
+burres bVz
+burress bV@s
+burri bqr/
+burridge b{r6j
+burrier bV/P
+burright b{rIt
+burrill b{r@l
+burrington bV6Nt~
+burris bV@s
+burriss bV@s@z
+burrito bPEt]
+burritos bPEt]s
+burritt bVit
+burro bV]
+burrola bqrOl@
+burros bV]z
+burrough bV]
+burroughs bV]z
+burroughs bur]z
+burrous bV@s
+burrow bV]
+burrower bV]P
+burrowers bV]Pz
+burrowes bVOz
+burrowing bV]6N
+burrows bV]z
+burrus bqr@s
+burruss bqr@s
+burry bV/
+bursch bVS
+burse bVs
+bursey bVs/
+bursley bVsl/
+burson bVs~
+burst bVst
+burstein bVst/n
+burstein bVstIn
+bursting bVst6N
+burston bVst~
+bursts bVsts
+burt bVt
+burtch bVC
+burtis bVtis
+burtner bVtnP
+burtness bVtn@s
+burtnett bVtnct
+burton bVt~
+burton's bVt~z
+burts bVts
+burtt bVt
+burundi bPund/
+burundi's bPund/z
+burwell bVwcl
+burwick bVw6k
+bury b,r/
+bury's b,r/z
+burying b,r/6N
+burzynski bPzinsk/
+bus bus
+busa byUs@
+busalacchi bUsolok/
+busam bis}
+busbee busbE
+busbey busb/
+busbin busbin
+busboom busbUm
+busboy busb<
+busboys busb<z
+busby buzb/
+buscaglia bUskogl/@
+buscemi bUsCem/
+busch bqS
+busch's bqS@z
+buschbaum bqSb?m
+busche buS
+buscher bUSP
+buschman buSm~
+buschmann buSm~
+buse byUz
+bused bust
+buseman bism~
+busenbark bis~bork
+buser bisP
+buses bus@z
+busey bus/
+busey byUz/
+bush bqS
+bush's bqS@z
+busha buS@
+bushard bqSPd
+bushart bqSort
+bushaw bqS{
+bushby bqSb/
+bushee bqS/
+bushel bqS@l
+bushell bqS@l
+bushels bqS@lz
+busher bqSP
+bushes bqS@z
+bushey bqS/
+bushings bqS6Nz
+bushkin bqSkin
+bushman bqSm~
+bushmen bqSmcn
+bushnell bqSn@l
+bushong bqS{N
+bushway bqSwA
+bushy bqS/
+busic bus6k
+busick bis6k
+busied biz/d
+busier biz/P
+busiest biz/@st
+busily biz@l/
+business bizn@s
+business' bizn@s
+business's bizn@s@z
+businesses bizn@s@z
+businesses' bizn@s@z
+businessland bizn@sland
+businesslike bizn@slIk
+businessman bizn@sman
+businessman's bizn@smanz
+businessmen bizn@smen
+businesspeople bizn@spEp@l
+businessperson bizn@spVs~
+businessphone bizn@sfOn
+businessphones bizn@sfOnz
+businesswoman bizn@swqm~
+businesswomen bizn@sw6mcn
+busing bus6N
+busk busk
+buske busk
+busker buskP
+buskey buskE
+buskirk buskPk
+buslease buslEs
+busler bus@lP
+busload b@slOd
+busloads b@slOdz
+buspar buspP
+buss bus
+bussa bUs@
+bussard busPd
+busse bus
+bussed bust
+bussell bus@l
+bussen bus~
+busser busP
+bussert busPt
+busses bus@z
+bussey bus/
+bussi bus/
+bussi byUs/
+bussie bus/
+bussie byUs/
+bussiere bus/cr
+bussing bus6N
+bussinger bus~jP
+bussman busm~
+bust bust
+busta bust@
+bustamante bUst}ont/
+bustard bustPd
+busted bust@d
+buster bustP
+busters bustPz
+busti bust/
+bustier bustyP
+bustillo bUstil]
+bustillos bustIl]z
+bustin bustin
+busting bust6N
+bustle bus@l
+bustling bus@l6N
+bustling busl6N
+busto bust]
+bustos bust]z
+busts busts
+busulaki byUs@lak/
+buswell buswel
+busy biz/
+but but
+but's buts
+butala bUtol@
+butane byUtAn
+butane byUtAn
+butare bUt)r/
+butare byUt)r/
+butare's bUt)r/z
+butare's byUt)r/z
+butch bqC
+butchart bqCPt
+butcher bqCP
+butcher's bqCPz
+butchered bqCPd
+butchering bqCP6N
+butchers bqCPz
+butchery bqCP/
+butchko bqCk]
+butchko buCk]
+bute byUt
+buteau byUtO
+buteco bUtek]
+butenhoff byUt~h{f
+butera bUt,r@
+buterbaugh byUtPb?
+buth bUT
+buthelezi bUt@lAz/
+buthelezi's bUt@lAz/z
+butka butk@
+butkiewicz butk@v6C
+butkovich butk@v6C
+butkus butk@s
+butler butlP
+butler's butlPz
+butlers butlPz
+butman butm~
+butner butnP
+butorac byUt{r@k
+butrick butr6k
+butros bUtr@s
+butros bUtrOs
+buts buts
+butsch buC
+butson buts~
+butt but
+buttacavoli bUtokovOl/
+buttafuoco bUt@fwOk]
+buttafuoco's bUt@fwOk]z
+buttars butPz
+butte byUt
+butter butP
+butterball butPb{l
+butterbaugh butPb?
+buttercup butPkup
+buttercups butPkups
+buttered butPd
+butterfat butPfat
+butterfield butPf/ld
+butterflies butPflIz
+butterfly butPflI
+butterfly's butPflIz
+butterick butP6k
+buttermilk butPmilk
+buttermore butPm{r
+butters butPz
+butterscotch butPskoC
+butterworth butPwVT
+buttery butP/
+butthead buthed
+butting but6N
+buttitta bUtEt@
+buttke butk/
+buttler butlP
+buttner butnP
+buttock but@k
+buttocks but@ks
+button but~
+buttoned but~d
+buttonhole but~hOl
+buttonholed but~hOld
+buttonholes but~hOlz
+buttons but~z
+buttonville but~vil
+buttram butram
+buttress butr@s
+buttressed butr@st
+buttresses butr@s@z
+buttressing butr@s6N
+buttrey butr/
+buttrick butr6k
+buttrum butr}
+buttry butr/
+butts buts
+butulesi bUt@lAz/
+butulesi's bUt@lAz/z
+butyl byUt@l
+butz buts
+butzberger butsbPgP
+butzen buts~
+butzer butsP
+butzin buts~
+buus bUz
+buxbaum buksb?m
+buxom buks}
+buxton bukst~
+buy bI
+buy's bIz
+buyback bIbak
+buybacks bIbaks
+buyer bIP
+buyer's bIPz
+buyers bIPz
+buyers' bIPz
+buying bI6N
+buyout bI?t
+buyouts bI?ts
+buys bIz
+buysse bIs
+buza byUz@
+buzan byUz~
+buzard byUz)rd
+buzbee buzbE
+buzby buzb/
+buzek bUzck
+buzz buz
+buzzard buzPd
+buzzard's buzPdz
+buzzards buzPdz
+buzzed buzd
+buzzell b@zel
+buzzelli bUtsel/
+buzzer buzP
+buzzes buz@z
+buzzetta byUzet@
+buzzing buz6N
+buzzword buzwPd
+buzzwords buzwPdz
+buzzy buz/
+buzzy's buz/z
+by bI
+byam bI}
+byard bIPd
+byard by)rd
+byars bIPz
+byas bI@s
+byassee b/os/
+bybee bIbE
+bye bI
+bye-bye bIbI
+byelorussia bI@l]ruS@
+byelorussia bIel]ruS@
+byelorussia bel]ruS@
+byer bIP
+byerlein bIrlIn
+byerley bIPl/
+byerly bIPl/
+byers bIPz
+byfield bIfEld
+byford bifPd
+bygone bIg{n
+bygones bIg{nz
+byington bI6Nt~
+byker bIkP
+bykowski b6k{fsk/
+byland bIl~d
+bylaw bIl{
+bylaws bIl{z
+byler bIlP
+byles bIlz
+byline bIlIn
+bylines bIlEnz
+bylsma bilsm@
+bylund bil~d
+byner bInP
+bynes bInz
+bynoe bin]
+bynum bin}
+bypass bIpas
+bypassed bIpast
+bypasses bIpas@z
+bypassing bIpas6N
+byproduct bIprod@kt
+byproducts bIpr{d@kts
+byram bir}
+byrd bVd
+byrd's bVdz
+byrer bIrP
+byrge bIrj
+byrle bIr@l
+byrn birn
+byrne bVn
+byrne's bVnz
+byrnes bVnz
+byrns birnz
+byrom bIr}
+byron bIr~
+byron's bIr~z
+byrum bir}
+bystander bIstandP
+bystanders bIstandPz
+bystrom bistr}
+byte bIt
+bytes bIts
+byu bEwIyU
+byun byun
+byus bI@s
+bywater bIw{tP
+byway bIwA
+byways bIwAz
+byword bIwVd
+byzantine biz~tEn
+byzantine biz~tIn
+byzantium b@zant/}
+c sE
+c'est sA
+c'est sest
+c'mon k}on
+c's sEz
+c-code sEkOd
+c-codes sEkOdz
+c-span sEspan
+c-span's sEspanz
+c. sE
+c.'s sEz
+c.d.s sEdEz
+c.s sEz
+c1 sEwun
+c2 sEtU
+c3 sETrE
+c4 sEf{r
+c5 sEfIv
+ca ko
+ca ku
+ca sEA
+caan kon
+cab kab
+cab's kabz
+caba kob@
+cabal k@bol
+caballero kab@y,r]
+caban kAb~
+cabana k@ban@
+cabanas k@ban@z
+cabaniss kab~is
+cabaret kabPA
+cabbage kab@j
+cabbages kab@j@z
+cabbie kab/
+cabbies kab/z
+cabby kab/
+cabdriver kabdrIvP
+cabdrivers kabdrIvPz
+cabe kAb
+cabell kobel
+cabello k@bel]
+cabernet kabPnA
+cabernets kabPnAz
+cabernets kabPnets
+cabey kAb/
+cabezas k@bAz@z
+cabin kab~
+cabinda k@bind@
+cabiness kAb/n@s
+cabinet kabn@t
+cabinet kab~@t
+cabinet's kabn@ts
+cabinetry kabn@tr/
+cabinets kabn@ts
+cabinets kab~@ts
+cabins kab~z
+cable kAb@l
+cable's kAb@lz
+cablec kAb@lsE
+cablec kAblck
+cablec kabl@k
+cablecomm kAb@lkom
+cablecomms kAb@lkomz
+cabled kAb@ld
+cablegram kAb@lgram
+cableone kAb@lwun
+cabler kAb@lP
+cables kAb@lz
+cablesystem kAb@lsist}
+cablesystems kAb@lsist}z
+cabletron kAb@ltr{n
+cabletron's kAb@ltr{nz
+cablevision kAb@lviZ~
+cablevision's kAb@lviZ~z
+cabo kabO
+cabo sEAbEO
+cabok ab]
+caboodle k@bUd@l
+caboose k@bUs
+cabooses k@bUs@z
+cabot kab@t
+cabot's kab@ts
+cabotage kab@t6j
+cabral kabr@l
+cabrales kobrolcs
+cabrall k@brol
+cabrall's k@brolz
+cabranes k@brAnz
+cabrera kobr,r@
+cabrini k@brEn/
+cabrini's k@brEn/z
+cabriolet kabr/]lA
+cabriolet kabr/]let
+cabs kabz
+cac kak
+cac sEAsE
+cac's kaks
+cacace kak@s
+cacaci k@kos/
+cacao k@kA]
+caccamise kokom@s
+caccamo kokom]
+caccavale kok@vol/
+caccia koC@
+cacciatore koC@t{r/
+cacciola kokCOl@
+caceres kos,rcs
+cache kaS
+cache kaSA
+caches kaS@z
+caches kaSAz
+cachet kaSA
+cacho kaC]
+cacioppo koCOp]
+cacique k@sEk
+cackle kak@l
+cackling kak@l6N
+cackling kakl6N
+cacld kak@ld
+cacld sEAsEeldE
+cacophony kakof~/
+cacti kakt/
+cacti kaktI
+cactus kakt@s
+cad kad
+cada kod@
+cadam kad}
+cadaver k@davP
+cadavers k@davPz
+cadbury kadber/
+cadbury's kadber/z
+cadby kadb/
+caddell kad@l
+cadden kad~
+caddick kad6k
+caddies kad/z
+caddock kad@k
+caddy kad/
+caddyshack kad/Sak
+cade kAd
+cadell kodAl
+cadena k@dEn@
+cadence kAd~s
+cadences kAd~s@z
+cadenhead kAd~hed
+cadet k@det
+cadets k@dets
+cadieux kad/]
+cadillac kad@lak
+cadillac's kad@laks
+cadillacs kad@laks
+cadiz k@dEz
+cadle kAd@l
+cadman kadm~
+cadmium kadm/}
+cadmus kadm@s
+cadnetix kadnet6ks
+cadogan kod]gon
+cadorette kadPct
+cadotte k@d{t
+cadre kadr/
+cadres kadr/z
+cadrone k@drOn
+cadrone k@drOn/
+cads kads
+cadwalader kadw{l@dP
+cadwalader's kadw{l@dPz
+cadwallader kadw{l@dP
+cadwell kadwel
+cady kAd/
+caen kan
+caen kon
+caen's kanz
+caen's konz
+caesar sEzP
+caesar's sEzPz
+caesarea kAsPE@
+caesarean kAsPEn
+caesareans kAsPEnz
+caesars sEzPz
+caesars' sEzPz
+caetano k@ton]
+cafarella koforel@
+cafarelli koforel/
+cafaro kof)r]
+cafe k@fA
+cafe kafA
+cafes kafAz
+cafeteria kaf@tir/@
+cafeterias kaf@tir/@z
+cafetizer kaf@tIzP
+caffee kaf/
+caffeinate kaf~At
+caffeinated kaf~At@d
+caffeine kafEn
+cafferty kafPt/
+caffery kafP/
+caffey kaf/
+caffrey kafr/
+cafiero kaf/,r]
+cagan kAg~
+cage kAj
+cage's kAj@z
+caged kAjd
+cages kAj@z
+cagey kAj/
+caggiano koj/on]
+cagle kAg@l
+cagley kagl/
+cagliari kagl/)r/
+cagney kagn/
+caguas kogwos
+cahalan kah@l~
+cahall kah@l
+cahan kah~
+cahasa k@hos@
+cahill kAhil
+cahn kan
+cahners konPz
+cahoon k@hUn
+cahoot k@hUt
+cahoots k@hUts
+cahora k@h{r@
+cahouet k@hUt
+cai kI
+caiazzo koyoz]
+caicedo k@CAd]
+cail kAl
+caillier kAl/P
+caillouet kAlUt
+cain kAn
+cain's kAnz
+caine kAn
+caines kAnz
+caiola kI]l@
+caire k,r
+cairnes k,rnz
+cairns k,rnz
+cairo kIr]
+cairo's kIr]z
+caison kAz~
+caisse kAs
+caissie kAs/
+caitlin kAtlin
+caito kAt]
+cajole k@jOl
+cajoled k@jOld
+cajoling k@jOl6N
+cajun kAj~
+cajuns kAj~z
+cake kAk
+cake's kAks
+caked kAkt
+cakes kAks
+cal kal
+cala kol@
+calabasas kal@bos@s
+calabrese kolobrAz/
+calabria k@labr/@
+calabro k@labr]
+caladiums k@lAd/}z
+calaf kal@f
+calahan kal@han
+calais k@lA
+calamander kal}andP
+calamari kolom)r/
+calame kolom/
+calamia k@lAm/@
+calamine kal}In
+calamine's kal}Inz
+calamities k@lam@t/z
+calamitous k@lam@t@s
+calamity k@lam@t/
+calan kAl~
+calandra k@landr@
+calandro k@landr]
+calantha k@lanT@
+calarco k@l)rk]
+calaveras kal@v,r@z
+calaway kol@wA
+calbert kalbPt
+calbos kolb]s
+calcagni kolkogn/
+calcagno kolkogn]
+calcaterra kalk@t,r@
+calcified kals@fId
+calcify kals@fI
+calcite kalsIt
+calcium kals/}
+calcomp k{lkomp
+calcote kolkOt/
+calculate kalky@lAt
+calculated kalky@lAt@d
+calculates kalky@lAts
+calculating kalky@lAt6N
+calculation kalky@lAS~
+calculations kalky@lAS~z
+calculator kalky@lAtP
+calculators kalky@lAtPz
+calculus kalky@l@s
+calcutt kalk@t
+calcutta kalkut@
+caldeira kold,r@
+calder k{ldP
+caldera kald,r@
+caldera k{ld,r@
+calderaro koldP)r]
+calderon kaldPOn
+calderon k{ldPon
+calderone koldPOn/
+calderwood k{ldPwqd
+caldor kald{r
+caldrello koldrel]
+caldwell k{ldwcl
+caldwell's k{ldwclz
+cale kAl
+caleb kAl@b
+calebs kAl@bz
+caleca kolek@
+caledonia kal@dOn/@
+caledonian kal@dOn/~
+caledonian's kal@dOn/~z
+calef kalif
+calemburg kal}bPg
+calendar kal~dP
+calendars kal~dPz
+caler kAlP
+calero k@l,r]
+cales kAlz
+caley kAl/
+calf kaf
+calf's kafs
+calfed kaft
+calfed kalfed
+calfed's kalfedz
+calfee kalf/
+calgary kalgP/
+calgene kaljEn
+calgene's kaljEnz
+calgon kalg{n
+calgroup kalgrUp
+calhoon kalhUn
+calhoun kalhUn
+cali kal/
+cali kol/
+calia kol/@
+caliber kal@bP
+calibrate kal@brAt
+calibrated kal@brAt@d
+calibration kal@brAS~
+calico kal@kO
+calida kolEd@
+caliendo kol/end]
+calif kal@f{rny@
+calif kalif
+calif. kal@f{rny@
+califano kol/fon]
+califf kalif
+california kal@f{rny@
+california's kal@f{rny@z
+californian kal@f{rny~
+californian's kal@f{rny~z
+californians kal@f{rny~z
+caligiuri kal@jir/
+calill k@lil
+calills k@lilz
+caliper kal@pP
+calipers kal@pPz
+caliph kal@f
+caliri kolir/
+calise kolIz
+calista k@list@
+calisthenic kal@sTen6k
+calisthenics kal@sTen6ks
+calite kAlIt
+calite kalIt
+calix kAl@ks
+calix kal6ks
+calk k{k
+calkin kalkin
+calkins kalkinz
+call k{l
+call's kolz
+calla kal@
+callable k{l@b@l
+callace kal@s
+callaghan kal@han
+callaham kal@ham
+callahan kal@han
+callahan's kal@hanz
+callais k@lA
+callan kal~
+callanan kal~~
+calland kal~d
+callander kal~dP
+callari kol)r/
+callas kal@z
+callaway kal@wA
+callaway's k{l@wAz
+calle kAl
+callebs kAlebz
+called k{ld
+callegari kolcg)r/
+calleja kolAy@
+callejas kolAyoz
+callen kal~
+callender k@lendP
+callens k{l~z
+caller k{lP
+caller's k{lPz
+callers k{lPz
+callery kalP/
+calles kAlz
+calley kal/
+callicoat kal6kOt
+callicott kal6kot
+callicutt kal6k@t
+callie k{l/
+callier kal/P
+callies kal/z
+calligan kal6g~
+calligraphic kal@graf6k
+calligraphy k@ligr@f/
+callihan kal@han
+callinan kal~~
+calling k{l6N
+calliope k@lI@pE
+calliopes k@lI@pEz
+callis kalis
+callison kal@s~
+callister k{l@stP
+callous kal@s
+calloused kal@st
+callously kal@sl/
+callousness kal@sn@s
+callow kal]
+calloway kal]wA
+calls k{lz
+callula kalUl@
+callum kal}
+callus kal@s
+cally kal/
+calm kolm
+calm kom
+calma kolm@
+calmaquip kalm@kwip
+calmar kalmor
+calmark kolmork
+calmart kalmort
+calmart kolmort
+calmart's kalmorts
+calmart's kolmorts
+calmat kalmat
+calmat's kalmats
+calmed kolmd
+calmed komd
+calmer kolmP
+calmer komP
+calmes kolmcs
+calming kolm6N
+calming kom6N
+calmly kolml/
+calmly koml/
+calmness kolmn@s
+calmness komn@s
+calms kolmz
+calms komz
+calnan kaln~
+calny kaln/
+calo kol]
+calogero kol]j,r]
+calor kalP
+caloric k@l{r6k
+calorie kalP/
+calories kalP/z
+caloway kal]wA
+calpers kalpPz
+calpers's kalpPz@z
+calpis kalpis
+caltabiano koltob/on]
+caltagirone koltoj6rOn/
+caltex kalteks
+caltha kalT@
+calton kalt~
+caltrans kaltranz
+calumet kaly}et
+calumny kal}n/
+calutzi k@lUtz/
+caluzzi k@lUz/
+calvani k{lvon/
+calvano kolvon]
+calvaries kalvP/z
+calvary kalvP/
+calveras kalv,r@s
+calverley kalvPl/
+calvert kalvPt
+calvery kalvP/
+calves kavz
+calvet kalv@t
+calvey kalvA
+calvi kolv/
+calvillo kolvil]
+calvin kalv~
+calvin's kalv~z
+calvina kolvEn@
+calving kav6N
+calvinist kalv~@st
+calvino k{lvEn]
+calvo kolv]
+calypso k@lipsO
+calypsos k@lipsOz
+calyx kal6ks
+calzada kolzod@
+cam kam
+cam's kamz
+camacho k}oC]
+caman kAm~
+camara kom)r@
+camaraderie komPodP/
+camarata komorot@
+camarena komPAn@
+camarena komoren@
+camargo kom)rg]
+camarillo komoril]
+camaro k},r]
+camaros k})r]s
+cambell kamb@l
+camber kambP
+cambex kamb@ks
+cambior kamb/P
+cambodia kambOd/@
+cambodia's kambOd/@z
+cambodian kambOd/~
+cambodians kambOd/~z
+cambra kambr@
+cambre kambP
+cambria kambr/@
+cambrian kambr/~
+cambrian's kambr/~z
+cambridge kAmbr6j
+cambridgeport kAmbrijp{rt
+cambridgeside kAmbrijsId
+cambron kambr~
+camburn kambVn
+camby kamb/
+camby's kamb/z
+camco kamk]
+camcorder kamk{rdP
+camcorders kamk{rdPz
+camden kamd~
+camden's kamd~z
+camdessus kamdes@s
+came kAm
+cameco kam6k]
+camejo komAy]
+camel kam@l
+camel's kam@lz
+camelot kam@lot
+camels kam@lz
+cameo kam/O
+cameos kam/Oz
+camera kamP@
+camera kamr@
+camera's kamr@z
+cameraman kamP}~
+cameramen kamP}cn
+cameras kamP@z
+cameras kamr@z
+camerer kamPP
+camero k},r]
+cameron kamP~
+cameron's kamP~z
+cameroon kamPUn
+camfield kamfEld
+camhi kamh/
+camilla k}il@
+camille k}El
+camilleri kom/l,r/
+camilli k}il/
+camillo k}il]
+caminiti kom/nEt/
+camino k}En]
+camire komir/
+camm kam
+cammack kam@k
+cammarano komoron]
+cammarata komorot@
+cammarota komorOt@
+cammer kamP
+cammermeyer kamPmIP
+cammie kam/
+cammisa k}Es@
+cammon kam~
+cammy kam/
+camorra k}{r@
+camouflage kam@floZ
+camouflaged kam@floZd
+camouflaging kam@floZ6N
+camp kamp
+camp's kamps
+campa kamp@
+campaign kampAn
+campaign's kampAnz
+campaigned kampAnd
+campaigner kampAnP
+campaigners kampAnPz
+campaigning kampAn6N
+campaigns kampAnz
+campana kompan@
+campanale komponol/
+campanaro kompon)r]
+campanella kamp~el@
+campanelli komponel/
+campanis kampon@s
+campau komp?
+campbell kamb@l
+campbell's kamb@lz
+campbells kamb@lz
+campeau kampO
+campeau's kampOz
+camped kampt
+campen kamp~
+camper kampP
+campers kampPz
+campesinos kampcsEn]s
+campfield kampfEld
+campfire kampfIP
+campfires kampfIPz
+campground kampgr?nd
+campgrounds kampgr?ndz
+campi kamp/
+camping kamp6N
+campion kamp/~
+campione komp/On/
+campise kompIz
+campisi kompEs/
+campo kamp]
+campobasso komp]bos]
+campofrio kamp{fr/]
+campoli kompOl/
+campopiano komp]p/on]
+campos kamp]z
+camps kamps
+camps' kamps
+campsite kampsIts
+campsites kampsIts
+campton kampt~
+campus kamp@s
+campuses kamp@s@z
+campuzano kompUzon]
+campy kamp/
+camro kamr]
+camry kamr/
+camrys kamr/z
+camshaft kamSaft
+camshafts kamSafts
+camus kam@s
+camuso komUs]
+can kan
+can k~
+can's kanz
+can't kant
+cana kan@
+canaan kAn~
+canaanite kAn~It
+canace konoC/
+canada kan@d@
+canada's kan@d@z
+canadair kan@d,r
+canaday kan@dA
+canadian k~Ad/~
+canadian's k~Ad/~z
+canadians k~Ad/~z
+canadians' k~Ad/~z
+canadienne k~ad/en
+canady k~od/
+canal k~al
+canal's k~alz
+canale konol/
+canales kan@lz
+canals k~alz
+canam kan}
+canan kAn~
+canandaigua kan~dAgw@
+cananea kan~E@
+canard k~)rd
+canaries k~,r/z
+canary k~,r/
+canas kan@z
+canasta k~ast@
+canavan kan@van
+canaveral k~avP@l
+canaveral k~avr@l
+canberra kanb,r@
+canby kanb/
+cancan kankan
+cancel kans@l
+canceled kans@ld
+canceling kans@l6N
+canceling kansl6N
+cancellation kans@lAS~
+cancellations kans@lAS~z
+cancelled kans@ld
+cancelling kans@l6N
+cancelling kansl6N
+cancels kans@lz
+cancer kansP
+cancer's kansPz
+cancerous kansP@s
+cancerphobia kansPfOb/@
+cancers kansPz
+canchola konkOl@
+cancienne konCEcn
+cancilla konCil@
+cancino konCEn]
+cancio kans/]
+cancom kaNk}
+cancro konkr]
+cancun kaNk~
+cancun koNkUn
+candace kand@s
+candee kand/
+candela kandel@
+candelabra kand@lobr@
+candelaria kondcl)r/@
+candelario kondcl)r/]
+candella kondel@
+candellin kand@l~
+candia kand/@
+candice kand@s
+candice's kand@s@z
+candid kand@d
+candida kand@d@
+candidacies kand@d@s/z
+candidacy kand@d@s/
+candidate kan@d@t
+candidate kand@dAt
+candidate's kand@dAts
+candidates kan@d@ts
+candidates kand@dAts
+candidates' kand@dAts
+candidly kand@dl/
+candido kandEd]
+candie kand/
+candied kand/d
+candies kand/z
+candilin kand@l~
+candiotti kand/ot/
+candiotti's kand/ot/z
+candle kand@l
+candlelight kand@llIt
+candlemaker kand@lmAkP
+candler kand@lP
+candles kand@lz
+candlestick kand@lstik
+candlesticks kand@lstiks
+candlish kandliS
+candor kandP
+candy kand/
+candy's kand/z
+candyman kand/man
+cane kAn
+caned kAnd
+canedo konAd]
+canedy k~Ed/
+canelo k~el]
+canepa konep@
+canes kAnz
+canevari koncv)r/
+canez konez
+canfield kanfEld
+canfor kanfP
+canfor's kanfPz
+cangelosi koNgclOs/
+cangemi koNgem/
+cangialosi konj@lOs/
+cangiano koNg/on]
+canham kanh}
+canida konEd@
+caniglia k~igl/@
+canilles k~il/z
+canin kAnin
+canine kAnIn
+canines kAnInz
+caning kAn6N
+canings kAn6Nz
+canino konEn]
+canion kany~
+canipe konEp/
+canister kan@stP
+canisters kan@stPz
+canker kaNkP
+cankers kaNkPz
+cann kan
+cannabis kan@b@s
+cannaday kan@dA
+cannady kan@d/
+cannan kan~
+cannata konot@
+cannavino kan@vEn]
+cannavo konov]
+canned kand
+cannedy kan@d/
+cannell kan@l
+cannella konel@
+cannelton kan@lt~
+canner kanP
+canneries kanP/z
+cannery kanP/
+cannes kan
+cannes kanz
+canney kan/
+cannibal kan@b@l
+cannibalism kan@b@liz}
+cannibalization kan@b@l@zAS~
+cannibalize kan@b@lIz
+cannibalizing kan@b@lIz6N
+cannibals kan@b@lz
+canniff kanif
+canning kan6N
+cannister kan@stP
+cannisters kan@stPz
+cannistraro kan@str)r]
+cannizzaro kon/ts)r]
+cannizzo konEz]
+cannon kan~
+cannon's kan~z
+cannonball kan~b{l
+cannondale kan~dAl
+cannone konOn/
+cannons kan~z
+cannonsburg kan~zbPg
+cannot kanot
+cannot k~ot
+canny kan/
+cano kon]
+canoe k~U
+canoed k~Ud
+canoeing k~U6N
+canoeist k~U@st
+canoes k~Uz
+canoga k~Og@
+canola k~Ol@
+canon kan~
+canon's kan~z
+canonico kon]nEk]
+canonie kan~/
+canons kan~z
+canopy kan@p/
+canosa k~Os@
+canova konOv@
+canoy kan<
+canrad kanrad
+canron kanr~
+cans kanz
+canseco kansek]
+cansler kans@lP
+canso kans]
+canstar kanstor
+cant kant
+cantaloupe kant@lOp
+cantaloupes kant@lOps
+cantalupo kant@lUp]
+cantankerous kantaNkP@s
+cantara kont)r@
+cantata kantot@
+canteen kantEn
+canteens kantEnz
+cantel kantel
+canter kantP
+canterbury kantPber/
+canterbury's kanPber/z
+canterbury's kantPber/z
+cantero kont,r]
+canterra kont,r@
+cantey kant/
+cantin kontEn
+cantina kantEn@
+cantle kant@l
+cantley kantl/
+cantlin kantl~
+cantlon kantl~
+canto kant]
+canton kant~
+cantonal kant~@l
+cantone kontOn/
+cantonese kant~Ez
+cantons kant~z
+cantor kantP
+cantor's kantPz
+cantore kant{r
+cantrall kantr@l
+cantrell kantrel
+cantrelle k~trel
+cantu kantU
+cantv kantEvE
+cantwell kantwel
+canty kant/
+canup kanup
+canupp kan@p
+canvas kanv@s
+canvases kanv@s@z
+canvass kanv@s
+canvassed kanv@st
+canvassers kanv@sPz
+canvasses kanv@s@z
+canvassing kanv@s6N
+canwest kanwest
+canyon kany~
+canyon's kany~z
+canyons kany~z
+canzano konzon]
+canzoneri konz]n,r/
+cao k?
+caouette kAUt
+cap kap
+cap's kaps
+capabilities kAp@bil@t/z
+capability kAp@bil@t/
+capable kAp@b@l
+capacious k@pAS@s
+capacitance k@pas@t~s
+capacities k@pas@t/z
+capacitor k@pas@tP
+capacitors k@pas@tPz
+capacity k@pas@t/
+capalbo k@palb]
+capaldi kopold/
+capaldo kopold]
+capano kopon]
+capasso kopos]
+capcom kapk}
+cape kAp
+capece k@pEs
+capeci k@pEC/
+capeci k@peC/
+caped kApt
+capehart kAphort
+capek kap6k
+capel kAp@l
+capel's kap@lz
+capell kopAl
+capella k@pel@
+capelle k@pel
+capelli k@pel/
+capello k@pel]
+capen kAp~
+caper kApP
+capers kApPz
+caperton kApPt~
+capes kAps
+capetillo kopctil]
+capetown kApt?n
+capillaries kap@ler/z
+capillary kap@ler/
+capistrano kap@stron]
+capita kap@t@
+capital kap@t@l
+capital's kap@t@lz
+capitalism kap@t@liz}
+capitalism's kap@t@liz}z
+capitalist kap@t@l@st
+capitalistic kap@t@list6k
+capitalists kap@t@l@s
+capitalists kap@t@l@ss
+capitalists kap@t@l@sts
+capitalization kap@t@l@zAS~
+capitalizations kap@t@l@zAS~z
+capitalize kap@t@lIz
+capitalized kap@t@lIzd
+capitalizes kap@t@lIz@z
+capitalizing kap@t@lIz6N
+capitals kap@t@lz
+capitan kapit~
+capitano kop/ton]
+capito kopEt]
+capitol kap@t@l
+capitol's kap@t@lz
+capitoline kap@tOlIn
+capitols kap@t@lz
+capitulate k@piCUlAt
+capitulated k@piC@lAt@d
+capitulation k@piC@lAS~
+capizzi kopEts/
+caplan kapl~
+caple kAp@l
+caples kAp@lz
+capley kapl/
+caplin kaplin
+caplinger kAp@l6NP
+capo kop]
+capobianco kop]b/onk]
+capon kApon
+capone k@pOn
+caponi kopOn/
+caponigro kop]nEgr]
+caporale kop{rol/
+caporaso kop{ros]
+capote k@pOt
+capote's k@pOts
+capoten k@pOt~
+capozzi k@poz/
+capozzoli kop]tsOl/
+capp kap
+cappa kap@
+cappadona kopodOn@
+capparelli koporel/
+capped kapt
+cappel kap@l
+cappella kopel@
+cappelletti kopclet/
+cappelli kopel/
+cappello kopel]
+capper kapP
+cappetta kopet@
+cappiello kop/el]
+capping kap6N
+cappo kap]
+capps kaps
+cappuccino kapUCEn]
+cappuccio kopUC/]
+cappy kap/
+cappy's kap/z
+capra kapr@
+capraro kopr)r]
+capri k@prE
+capri kapr/
+capri's k@prEz
+capri's kapr/z
+capriati kapr/ot/
+capriati's kapr/ot/z
+caprice k@prEs
+capricious k@priS@s
+capriciously k@priS@sl/
+capricorn kapr@k{rn
+caprio kapr/]
+capriotti kopr/Ot/
+capron kapr~
+caps kaps
+capsaicin kapsAs~
+capshaw kapS{
+capsize kapsIz
+capsized kapsIzd
+capstan kapst~
+capstick kapstik
+capstone kapstOn
+capsule kaps@l
+capsules kaps@lz
+captain kapt~
+captain's kapt~z
+captains kapt~z
+caption kapS~
+captioned kapS~d
+captioning kapS~6N
+captions kapS~z
+captivate kapt6vAt
+captivated kapt6vAt@d
+captivating kapt6vAt6N
+captive kapt6v
+captives kapt6vz
+captivity kaptiv@t/
+captor kaptP
+captors kaptPz
+capture kapCP
+captured kapCPd
+captures kapCPz
+capturing kapCP6N
+capua kapyU@
+capuano kopUon]
+caputi kopUt/
+caputo kopUt]
+capwell kapwel
+caq kak
+caq's kaks
+car k)r
+car's k)rz
+cara k,r@
+cara's k,r@z
+cara'veras kor@v,r@z
+carabajal kPab@j@l
+caraballo kar@bal]
+carabello kar@bel]
+caracara kor@k)r@
+caracas kPok@s
+caracci koroC/
+caracciolo korokCOl]
+caradine korodEn/
+caradonna korodOn@
+carafate k,r@fAt
+caraher kar@hP
+caraker kar@kP
+caramandi kar}ond/
+caramel k,r}@l
+caramelize k,r}@lIz
+caramelized k,r}@lIzd
+carangelo koroNgel]
+carano koron]
+caras k)r@z
+carat k,r@t
+carats k,r@ts
+carava kar@v@
+caravan kar@van
+caravans kar@vanz
+caravel k,r@vel
+caravella kar@vel@
+caravelle k,r@vel
+caravello kar@vel]
+caraveo korov/]
+carawan kar@wan
+caraway kar@wA
+carbajal korboyal
+carballo korbol]
+carbary k)rbcr/
+carbaugh k)rb{
+carberry k)rber/
+carberry's k)rber/z
+carbide k)rbId
+carbide's k)rbIdz
+carbin k)rbin
+carbine k)rbIn
+carbo k)rb]
+carbohydrate korb]hIdr@t
+carbohydrate korb]hIdrAt
+carbohydrates korb]hIdrAts
+carbon k)rb~
+carbonara korb]n)r@
+carbonaro korb]n)r]
+carbonate k)rb~At
+carbonated k)rb~At@d
+carbonates k)rb~Ats
+carbondale k)rb~dAl
+carbone k)rbOn
+carbonell k)rb]n@l
+carbonetto korb]net]
+carboni korbOn/
+carboniferous korb~ifP@s
+carbonize k)rb~Iz
+carbonized k)rb~Izd
+carbonneau k)rb~O
+carbons k)rb~z
+carborundum korbPund}
+carboy k)rb<
+carburete k)rbyPet
+carbureted k)rbyPet@d
+carburetion korbyPES~
+carburetor k)rbPAtP
+carburetors k)rbPAtPz
+carby k)rb/
+carcass k)rk@s
+carcasses k)rk@s@z
+carcinogen korsin@j~
+carcinogenic kors~]jen6k
+carcinogens korsin@j~z
+carcinoma kors~Om@
+carcione korCOn/
+card k)rd
+card's k)rdz
+carda k)rd@
+cardarelli kordorel/
+cardboard k)rdb{rd
+cardboards k)rdb{rdz
+carded k)rd@d
+cardell kordAl
+cardella kordel@
+cardello kordel]
+carden k)rd~
+cardenas kordEn@s
+cardenas's kordEn@s@z
+carder k)rdP
+cardholder k)rdhOldP
+cardholders k)rdhOldPz
+cardia k)rd/@
+cardiac k)rd/ak
+cardiel k)rdEl
+cardiff k)rdif
+cardigan k)rd6g~
+cardigans k)rd6g~z
+cardiges k)rd6j@z
+cardillo kordil]
+cardin k)rdin
+cardinal k)rd~@l
+cardinal's k)rd~@lz
+cardinale kord/nol/
+cardinali kord/nol/
+cardinals k)rd~@lz
+cardinals' k)rd~@lz
+cardio k)rd/]
+cardiologist kord/ol@j@st
+cardiologists kord/ol@j@s
+cardiologists kord/ol@j@ss
+cardiologists kord/ol@j@sts
+cardiology kord/ol@j/
+cardiopulmonary kord/]pqlm~er/
+cardiovascular kord/]vasky@lP
+cardis k)rdis
+cardiss k)rdis
+cardizem kord@zem
+cardoen k)rdO~
+cardon kord{n
+cardona kordOn@
+cardone kordOn/
+cardoni kordOn/
+cardoon kordUn
+cardosa kordOs@
+cardosi kordOs/
+cardoso kordOs]
+cardoso's kordOs]z
+cardoza kordOz@
+cardozo kordOz]
+cards k)rdz
+cards' k)rdz
+carducci kordUC/
+cardwell k)rdwel
+cardy k)rd/
+care k,r
+care's k,rz
+cared k,rd
+careen kPEn
+careened kPEnd
+careening kPEn6N
+careens kPEnz
+career kPir
+careercom kPirkom
+careerism k@rEr@z}
+careerist kPirist
+careerists kPiris
+careerists kPiriss
+careerists kPirists
+careers kPirz
+carefree k,rfrE
+careful k,rf@l
+carefully k,rf@l/
+caregiver k,rgivP
+caregivers k,rgivPz
+caregiving k,rgiv6N
+carel korel
+careless k,rl@s
+carelessly k,rl@sl/
+carelessness k,rl@sn@s
+carella korel@
+carelli korel/
+carello kerel]
+carelock kar@lok
+caremark k,rmork
+caremark's k,rmorks
+carena kerEn@
+careplus kerplus
+carer k,rP
+cares k,rz
+caress kPes
+caresse k)rcs
+caressing kPes6N
+caretaker k,rtAkP
+caretakers k,rtAkPz
+careunit k,ryUn@t
+carew karU
+carey k,r/
+carey's k,r/z
+carfagno korfogn]
+carfora korf{r@
+cargal korgal
+cargile k)rj@l
+cargill k)rgil
+cargo k)rgO
+cargo's k)rgOz
+cargoes k)rgOz
+cargonoff k)rg~{f
+cargos k)rgOz
+carhart k)rhort
+caribbean kPib/~
+caribe kerEb
+caribou k,r@bU
+caricature k,r@k@CP
+caricatured kPik@CPd
+caricatures kPik@CPz
+caricaturist k,r@k@CP@st
+carico korEk]
+caricom k,r6kom
+caricom's k,r6komz
+caridi korEd/
+carie k,r/
+cariello kor/el]
+carignan kar6gn~
+cariker kar6kP
+carilla koril@
+carillo koril]
+carillon k,r@lon
+carin karin
+carine korEn/
+caring k,r6N
+carini korEn/
+carinii kerEn/
+carino korEn]
+carioca ker/Ok@
+caris karis
+carisbrook k,r@sbrqk
+carissa korEs@
+carita korEt@
+carithers kar@TPz
+carjack k)rjak
+carjacked k)rjakt
+carjacker k)rjakP
+carjacker's k)rjakPz
+carjackers k)rjakPz
+carjacking k)rjak6N
+carjackings k)rjak6Nz
+carjacks k)rjaks
+carkhuff k)rkh@f
+carl k)rl
+carl's k)rlz
+carla k)rl@
+carla's k)rl@z
+carlan k)rl~
+carland k)rl~d
+carlberg k)rlbPg
+carle k)r@l
+carleen korlEn
+carlen k)rl~
+carlene k)rlEn
+carles k)rlz
+carleton k)rlt~
+carley k)rl/
+carli k)rl/
+carlile k)rlIl
+carlin k)rlin
+carlin's k)rlinz
+carliner k)rlInP
+carling k)rl6N
+carling's k)rl6Nz
+carlini korlEn/
+carlino korlEn]
+carlisi korlEs/
+carlisle k)rlIl
+carlita korlEt@
+carlito korlEt]
+carlito's korlEt]z
+carll k)rl
+carlo k)rl]
+carload k)rlOd
+carloading k)rlOd6N
+carloadings k)rlOd6Nz
+carloads k)rlOdz
+carlock k)rlok
+carlon k)rl~
+carlone korlOn/
+carloni korlOn/
+carlos k)rl]s
+carlotta korl{t@
+carlough k)rl]
+carlow k)rlO
+carls k)rlz
+carlsbad k)rlsbad
+carlsberg k)rlzbPg
+carlsen k)rls~
+carlson k)rls~
+carlson's k)rls~z
+carlsson k)rls~
+carlstadt k)rlstat
+carlston k)rlst~
+carlstrom k)rlstr}
+carlton k)rlt~
+carlton's k)rlt~z
+carlucci korlUC/
+carly k)rl/
+carlyle k)rlIl
+carlyle's korlIlz
+carlyon k)rl/on
+carlzon k)rlzon
+carma k)rm@
+carmack k)rm@k
+carmaker k)rmAkP
+carmaker's k)rmAkPz
+carmakers k)rmAkPz
+carmakers' k)rmAkPz
+carman k)rm~
+carmany k)rm~/
+carmean k)rm/~
+carmel k)rm@l
+carmel kormel
+carmela kormel@
+carmelita korm@lEt@
+carmelite k)rm@lIt
+carmelo kormel]
+carmen k)rm~
+carmer k)rmP
+carmical k)rm6k@l
+carmichael k)rmIk@l
+carmickle k)rm6k@l
+carmie k)rm/
+carmike k)rmIk
+carmine k)rm~
+carmita kormEt@
+carmody k)rm@d/
+carmon k)rm~
+carmona kormOn@
+carmony k)rm]n/
+carmouche kormUS
+carmoy k)rm<
+carmy k)rm/
+carn k)rn
+carnage k)rn6j
+carnahan k)rn@han
+carnal k)rn@l
+carnathan k)rn@Tan
+carnation kornAS~
+carnations kornAS~z
+carnauba korn{b@
+carnaud korn{b
+carne k)rn
+carneal k)rn@l
+carnegie k)rn@g/
+carnegie kornAg/
+carnegie's k)rn@g/z
+carnegie's kornAg/z
+carnegies k)rn@g/z
+carnegies kornAg/z
+carneiro korn,r]
+carnell k)rn@l
+carner k)rnP
+carnes k)rnz
+carnett k)rn@t
+carnevale kornAvolA
+carney k)rn/
+carnicero korn@s,r]
+carnine kornEn/
+carnival k)rn@v@l
+carnival's k)rn@v@lz
+carnivals k)rn@v@lz
+carnivore k)rn6v{r
+carnivores k)rn@v{rz
+carnivorous kornivP@s
+carnley k)rnl/
+carns k)rnz
+caro k)r]
+carob k,r@b
+caroche kPOC
+carol kar@l
+carol's kar@lz
+carolan k,r@lan
+carolco kPolk]
+carolco's k,r@lkOz
+carolco's kPelkOz
+carole kar@l
+carolina ker@lIn@
+carolina's ker@lIn@z
+carolinas ker@lIn@z
+caroline k,r@lIn
+caroline's k,r@lInz
+carolingian ker@linj/~
+carolinian ker@lin/~
+carolinian ker]lin/~
+carolinians ker@lin/~z
+carollan kPol~
+carollo kPol]
+carols k,r@lz
+carolus k,r@l@s
+carolyn k,r@l~
+carolyne k,r@lIn
+caron kor{n
+carone kPOn
+caronna kPon@
+carosella kor]sel@
+caroselli kor]sel/
+carosi kPOs/
+carota kPOt@
+carotene k,r@tEn
+carotenuto kor]tcnUt]
+carothers kar@TPz
+carotid kPot@d
+carouse kP?z
+carousel k,r@sel
+carousing kP?z6N
+carow kar]
+carozza kPoz@
+carp k)rp
+carpal k)rp@l
+carpencic korpenC6k
+carpencic's korpenC6ks
+carpenito korpcnEt]
+carpenter k)rp~tP
+carpenter's k)rp~tPz
+carpenters k)rp~tPz
+carpentier k)rp~t/P
+carpentieri korpcntir/
+carpentry k)rp~tr/
+carper k)rpP
+carpet k)rp@t
+carpetbagger k)rp@tbagP
+carpetbaggers k)rp@tbagPz
+carpeted k)rp@t@d
+carpeting k)rp@t6N
+carpets k)rp@ts
+carpinelli korp/nel/
+carping k)rp6N
+carpino korpEn]
+carpio k)rp/]
+carpool k)rpUl
+carport k)rp{rt
+carports k)rp{rts
+carr k)r
+carr's k)rz
+carra k)r@
+carragher kar@ghP
+carraher kar@hP
+carranco koronk]
+carrano koron]
+carranza koronz@
+carrara kor)r@
+carras kar@z
+carrasco korosk]
+carrasquel ker@skel
+carrasquillo ker@skil]
+carraway kar@wA
+carre k)r
+carre korA
+carreira kor,r@
+carreiro kor,r]
+carreker k,r6kP
+carrel kar@l
+carrell korAl
+carreno koren]
+carreon korA{n
+carrera kor,r@
+carreras kor,roz
+carrere kor,rA
+carrero kor,r]
+carretta koret@
+carrey k,r/
+carrey's kar/z
+carriage kar6j
+carriages kar6j@z
+carrian k,r/~
+carrian's kar/~z
+carribean k@rib/~
+carribean kar@bE~
+carrick k,r6k
+carrico korEk]
+carrie k,r/
+carried kar/d
+carrier kar/P
+carrier's kar/Pz
+carriere korir/
+carriero korir]
+carriers kar/Pz
+carriers' kar/Pz
+carriers's kar/Pz@z
+carries kar/z
+carrig kar6g
+carrigan kar6g~
+carriger kar6jP
+carrigg kar6g
+carriker kar6kP
+carrillo kPil]
+carringer kar6NP
+carrington k,r6Nt~
+carrington's k,r6Nt~z
+carrino korEn]
+carrion k,r/~
+carris karis
+carrisyn kar@sin
+carrithers kar@TPz
+carriveau kar6vO
+carrizales kor/zolcs
+carro k)r]
+carrol kar@l
+carroll kar@l
+carroll's kar@lz
+carrollton k,r@lt~
+carron kar~
+carrot kar@t
+carrothers kar@TPz
+carrots kar@ts
+carrousel k,r@sel
+carrow kar]
+carrozza korOz@
+carrubba korUb@
+carruth karUT
+carruthers kPuTPz
+carry kar/
+carryanne kar/an
+carryforward k,r/f{rwPd
+carryforwards k,r/f{rwPdz
+carrying kar/6N
+carryover k,ryOvP
+cars k)rz
+cars koz
+cars' k)rz
+carse k)rs
+carsey k)rs/
+carsick k)rs6k
+carson k)rs~
+carson k)rz~
+carson's k)rs~z
+carstarphen korst)rf~
+carsten k)rst~
+carstens k)rst~z
+carstensen korstens~
+carswell k)rswel
+cart k)rt
+carta k)rt@
+cartagena kort@jEn@
+cartaya kortI@
+carte k)rt
+carted k)rt@d
+cartee k)rt/
+cartel kortel
+cartel's kortelz
+cartels kortelz
+carter k)rtP
+carter's k)rtPz
+cartera kort,r@
+carteret k)rtPct
+carteret's kortPets
+carters k)rtPz
+cartersville k)rtPzvil
+carthage k)rT@j
+carthaginian korT@jin/~
+cartier k)rt/P
+cartilage k)rt@l@j
+carting k)rt6N
+cartland k)rtl~d
+cartledge k)rtlej
+cartlidge k)rtl6j
+cartmell kortmAl
+cartmill k)rtmil
+cartner k)rtnP
+carton k)rt~
+cartoneros kortOn,r]s
+cartons k)rt~z
+cartoon kortUn
+cartooning kortUn6N
+cartoonist kortUn@st
+cartoonists kortUn@s
+cartoonists kortUn@ss
+cartoonists kortUn@sts
+cartoons kortUnz
+cartrette kortret
+cartridge k)rtr@j
+cartridges k)rtr@j@z
+carts k)rts
+cartusciello kortUs/el]
+cartwheel k)rtwEl
+cartwheels k)rtwElz
+cartwright k)rtrIt
+carty k)rt/
+caruana korUan@
+carucci korUC/
+caruso kPUs]
+carusone korUsOn/
+caruth karUT
+caruthers kPuTPz
+carvajal korvoyal
+carvalho korvolh]
+carve k)rv
+carved k)rvd
+carvel korvel
+carvell korvAl
+carver k)rvP
+carver's k)rvPz
+carvers k)rvPz
+carves k)rvz
+carvey k)rv/
+carville k)rvil
+carville's k)rvilz
+carvin k)rvin
+carving k)rv6N
+carvings k)rv6Nz
+carwell k)rwel
+carwile k)rwIl
+cary k,r/
+caryl k,r@l
+caryn k)rin
+cas kas
+casa kos@
+casablanca kas@blaNk@
+casad kas@d
+casada kosod@
+casado kosod]
+casados kosod]z
+casady k@sod/
+casagrande kosogrand/
+casal kosol
+casale kosol/
+casali kosol/
+casalino kosolEn]
+casals k@solz
+casals kosolz
+casamento kas}ent]
+casanova kas~Ov@
+casares kos)rcs
+casarez kos)rcz
+casas kos@z
+casassa kosos@
+casaus kas{z
+casavant kas@v~t
+casazza kosots@
+casbah kasb@
+cascade kaskAd
+cascade's kaskAdz
+cascaded kaskAd@d
+cascades kaskAdz
+cascades' kaskAdz
+cascading kaskAd6N
+casciano kosC/on]
+casciato kosCot]
+cascio kas/]
+casco kask]
+cascone koskOn/
+casdorph kasdPf
+case kAs
+case's kAs@z
+casebeer kas@bir
+casebier kas@b/P
+casebolt kAsbOlt
+casein kAsEn
+casella k@sel@
+caselli k@sel/
+caseload kAslOd
+caseloads kas@lOdz
+casera k@s,r@
+caserta kos,rt@
+cases kAs@z
+casesa k@ses@
+casework kAswVk
+caseworker kAswVkP
+caseworkers kAswVkPz
+casey kAs/
+casey's kAs/z
+caseze k@sEz/
+caseze's k@sEz/z
+casgrain kasgrAn
+cash kaS
+cashatt kaS@t
+cashdollar kaSdolP
+cashed kaSt
+cashen kaS~
+casher kaSP
+cashes kaS@z
+cashew kaSU
+cashews kaSUz
+cashflow kaSflO
+cashier kaSir
+cashier's kaSirz
+cashiered kaSird
+cashiers kaSirz
+cashin kaSin
+cashing kaS6N
+cashion koSEn
+cashless kaSl@s
+cashman kaSm~
+cashmere kaZm6r
+cashmore kaSm{r
+cashon kaS~
+cashway kaSwA
+cashways kaSwAz
+cashwell kaSwel
+casiano kos/on]
+casias kosE@z
+casillas kosil@z
+casillo k@sil]
+casimir kas}Er
+casimiro kos/mir]
+casing kAs6N
+casings kAs6Nz
+casino k@sEn]
+casino's k@sEn]z
+casinos k@sEn]z
+casio kas/]
+cask kask
+casket kask@t
+caskets kask@ts
+caskey kask/
+casks kasks
+casler kas@lP
+caslin kaslin
+casner kasnP
+caso kos]
+casola kosOl@
+cason kas~
+caspar kaspP
+caspar kaspor
+casper kaspP
+caspers kaspPz
+caspersen kaspPs~
+casperson kaspPs~
+caspian kasp/~
+cass kas
+cassada kosod@
+cassaday kas@dA
+cassady kas@d/
+cassandra k@sandr@
+cassandras k@sandr@s
+cassani koson/
+cassano koson]
+cassar kasP
+cassara kos)r@
+cassarino kosorEn]
+cassaro kos)r]
+cassata kosot@
+cassatt kas@t
+cassavetes kas@vEt/z
+casseb kas@b
+cassedy kas@d/
+cassel kas@l
+casselberry kas@lber/
+cassell kas@l
+cassella kosel@
+cassells kas@lz
+casselman kas@lm~
+cassels kas@lz
+cassens kas~z
+casserly kasPl/
+casserole kasPOl
+cassese kosAz/
+cassetta koset@
+cassette k@set
+cassettes k@sets
+cassetty kas@t/
+cassia kaS/@
+cassiday kas/dA
+cassidy kas@d/
+cassidy's kas@d/z
+cassie kas/
+cassin kasin
+cassinelli kos/nel/
+cassini k@sEn/
+cassino k@sEn]
+cassis kasis
+cassity kas@t/
+casso kas]
+cassock kas@k
+casson kas~
+cassone kosOn/
+cassoni k@sOn/
+cassoni's k@sOn/z
+cassowary kas@wer/
+casstevens kostAvA~z
+cast kast
+casta kast@
+castagna kostogn@
+castagno kostogn]
+castagnola kostognOl@
+castaldi kostold/
+castaldo kostold]
+castaneda kostoned@
+castano koston]
+castanon kast~on
+castaway kast@wA
+castaways kast@wAz
+caste kast
+casteel kAst/l
+casteen k@stEn
+castel kAst@l
+castell kAst@l
+castellana kostclan@
+castellani kostclon/
+castellano kostclon]
+castellanos kostAlon]z
+castellaw kAst@l{
+castelli kostel/
+castello k@stel]
+castellon kAst@lon
+castellucci kostclUC/
+castelluccio kostclUC/]
+castellvi k@stelv/
+castelo kostel]
+casten kast~
+caster kastP
+casterline kastPlIn
+casters kastPz
+castes kasts
+castigate kast@gAt
+castigated kast@gAt@d
+castigating kast@gAt6N
+castiglia kostEgl/@
+castiglione kost/gl/On/
+castilla kostil@
+castille kastil
+castilleja kost/lAy@
+castillo kastE]
+castillo kastil]
+castillon kast@lon
+castine kostEn/
+casting kast6N
+castings kast6Nz
+castle kas@l
+castle's kas@lz
+castleberry kas@lber/
+castleman kas@lm~
+castles kas@lz
+castner kastnP
+casto kast]
+castoff kast{f
+castoffs kast{fs
+caston kast~
+castonguay k@stoNgA
+castor kastP
+castorena kost{rn@
+castoro kost{r]
+castpart kastport
+castparts kastports
+castrate kastrAt
+castrated kastrAt@d
+castrates kastrAts
+castrating kastrAt6N
+castration kastrAS~
+castrations kastrAS~z
+castrejon kastr6jon
+castrillon k@strily~
+castro kastr]
+castro's kastr]z
+castrol kastrol
+castronova kastr]nOv@
+castronovo kastr]nOv]
+castrucci k@strUC/
+castruita kostrUt@
+casts kasts
+casual kaZ@w@l
+casual kaZw@l
+casually kaZ@w@l/
+casually kaZw@l/
+casualness kaZ@w@ln@s
+casualness kaZw@ln@s
+casuals kaZ@w@lz
+casualties kaZ@lt/z
+casualties kaZ@w@lt/z
+casualties kaZw@lt/z
+casualty kaZ@lt/
+casualty kaZ@w@lt/
+casualty kaZw@lt/
+caswell kazwel
+cat kat
+cat's kats
+cat-2 kattU
+cat-3 katTrE
+cat-4 katf{r
+cat-o-nine-tails kat~IntAlz
+cataclysm kat@klis}
+cataclysmic kat@klizm6k
+catacomb kat@kOm
+catacombs kat@kOmz
+catacosinos k@tak@sEn]s
+catacosinos's k@tak@sEn@s@z
+catain katAn
+catalan kat@l~
+catalano kotolon]
+catalanotto kotolonOt]
+cataldi kotold/
+cataldo kotold]
+catalfamo kotolfom]
+catalina kat@lEn@
+catalog kat@l{g
+cataloged kat@l{gd
+cataloger kat@l{gP
+catalogers kat@l{gPz
+cataloging kat@log6N
+catalogs kat@logz
+catalogue kat@l{g
+catalogued kat@l{gd
+catalogues kat@l{gz
+cataloguing kat@l{g6N
+catalonia kat@lOny@
+catalyst kat@l@st
+catalyst's kat@l@sts
+catalysts kat@l@s
+catalysts kat@l@ss
+catalysts kat@l@sts
+catalytic kat@lit6k
+catalyze kat@lIz
+catalyzed kat@lIzd
+catamaran kat}Pan
+catamarans k@tamP~z
+catamount kat}?nt
+catanese kotonAz/
+catania k@tAny@
+catano koton]
+catanzarite k@tanzPIt
+catanzaro kotonz)r]
+catapano kotopon]
+catapult kat@pult
+catapulted kat@pult@d
+catapulting kat@pult6N
+catapults kat@p@lts
+cataract katPakts
+cataracts katPakts
+catastrophe k@tastr@f/
+catastrophes k@tastr@f/z
+catastrophic kat@strof6k
+catatonic kat@ton6k
+catawba k@t{b@
+catbird katbVd
+catcall katk{l
+catcalls katk{lz
+catch kaC
+catchacan kaC@kon
+catchall kaC{l
+catcher kaCP
+catcher's kaCPz
+catchers kaCPz
+catches kaC@z
+catching kaC6N
+catchings kaC6Nz
+catchup kaC@p
+catchword kaCwVd
+catchy kaC/
+cate kAt
+catechism kat@kiz}
+categorical kat@g)r6k@l
+categorically kat@g)r6kl/
+categories kat@g{r/z
+categorization kat@gP@zAS~
+categorize kat@gPIz
+categorized kat@gPIzd
+categorizes kat@gPIz@z
+categorizing kat@gPIz6N
+category kat@g{r/
+catelli k@tel/
+catena k@tEn@
+cater kAtP
+catered kAtPd
+caterer kAtPP
+caterers kAtPPz
+catering kAtP6N
+caterino kotPEn]
+caterpillar kat@pilP
+caterpillar katPpilP
+caterpillar's katPpilPz
+caterpillars kat@pilPz
+caterpiller kat@pilP
+caterpiller katPpilP
+caterpiller's kat@pilPz
+caterpiller's katPpilPz
+caters kAtPz
+cates kAts
+catfish katfiS
+catharine kaTPin
+catharine kaTrin
+catharines kaTPinz
+catharines kaTrinz
+catharsis k@T)rs@s
+cathartic k@T)rt6k
+cathay kaTA
+cathcart kaTkort
+cathedral k@TEdr@l
+cathedrals k@TEdr@lz
+cathell kaT@l
+cather kaTP
+cather's kaTPz
+catherina koTPEn@
+catherine kaTP~
+catherine kaTrin
+catherine's kaTrinz
+catherman kaTPm~
+cathers kaTPz
+catherwood kaTPwqd
+catheter kaT@tP
+catheters kaT@tPz
+cathey kaT/
+cathie kaT/
+cathleen kaTlEn
+cathmor kaT}P
+cathode kaTOd
+cathodes kaTOdz
+catholic kaTl6k
+catholicism k@T{l@siz}
+catholics kaTl6ks
+cathy kaT/
+cathy's kaT/z
+catija k@tEj@
+catino kotEn]
+catkins katk~z
+catledge katl6j
+catlett katlet
+catlike katlIk
+catlin katlin
+catnap katnap
+catnip katn@p
+cato kAt]
+catoe kat]
+catolica k@tOl6k@
+caton kat~
+catone k@tOn
+catrambone katrambOn
+catrett katr@t
+catron katr~
+cats kats
+catskill katskil
+catskills katskilz
+catsup keC@p
+catt kat
+cattanach kat~aC
+cattaneo koton/]
+cattani koton/
+cattell k@tel
+catterall katP{l
+catterson katPs~
+catterton katPt~
+cattle kat@l
+cattlemen kat@lm~
+cattlemen's kat@lm~z
+catto kat]
+cattolica k@tOl6k@
+catton kat~
+catty kat/
+catwalk katwok
+catwoman katwqm~
+cauble k{b@l
+caucasian k{kAZ~
+caucasians k{kAZ~z
+caucasus k{k@s@s
+caucus kok@s
+caucus's k{k@s@z
+caucuses k{k@s@z
+caudal kod@l
+caudell k]del
+caudill k{d@l
+caudillo k{dil]
+caudle k{d@l
+cauffman k{fm~
+caufield kOf/ld
+caughey k{/
+caughlin k{lin
+caughman k{m~
+caughron k{r~
+caught kot
+caul kol
+caulder k{ldP
+cauldron koldr~
+cauley k{l/
+caulfield k{lfEld
+cauliflower kol@fl?P
+caulk kok
+caulking k{k6N
+caulkins k{lkinz
+causal k{z@l
+causalities k{zal@t/z
+causality k{zal@t/
+causation k{zAS~
+causative koz@t6v
+causby k{zb/
+cause koz
+caused kozd
+causer k{zP
+causes koz@z
+causeway kozwA
+causeways k{zwAz
+causey k{z/
+causing koz6N
+caustic kost6k
+cauthen k{T~
+cauthon k{T~
+cauthorn k{TPn
+caution koS~
+cautionary k{S~er/
+cautioned koS~d
+cautioning k{S~6N
+cautions k{S~z
+cautious k{S@s
+cautiously k{S@sl/
+cautiousness k{S@sn@s
+cava kov@
+cavaco k@vok]
+cavaco kav@k]
+cavagnaro kovogn)r]
+cavalcade kav@lkAd
+cavalier kav@lir
+cavaliere kovolir/
+cavalieri kovolir/
+cavalierly kav@lirl/
+cavaliers kav@lirz
+cavallaro kovol)r]
+cavallero kovol,r]
+cavalli k@val/
+cavalli-sfor k@val/sf{r
+cavallo k@val]
+cavalry kav@lr/
+cavan kAv~
+cavanagh kav~ag
+cavanah kav~@
+cavanaugh kav~{
+cavaness kov~@s
+cavataio kovoto/]
+cavazos kav@zOs
+cavazos kovoz]z
+cave kAv
+cave's kAvz
+caveat kAv/at
+caveats kAv/ats
+caved kAvd
+cavell k@vel
+caveman kAvman
+caven kAv~
+cavenaugh kav~{
+cavender k@vendP
+cavendish kav~diS
+caver kAvP
+caverly kAvPl/
+cavern kavPn
+cavernous kavPn@s
+caverns kavPnz
+cavers kAvPz
+caves kAvz
+cavett kav@t
+cavey kAv/
+caviar kav/or
+cavin kavin
+caviness kAv/n@s
+caving kAv6N
+cavins kav~z
+cavities kav@t/z
+cavitt kav@t
+cavity kav@t/
+cavness kavn@s
+cavort k@v{rt
+cavorting k@v{rt6N
+caw k{
+cawley k{l/
+cawood kowqd
+cawsl k{s@l
+cawthon k{T~
+cawthorn k{TPn
+cawthorne k{TPn
+caxton kakst~
+cay kA
+caya kA@
+cayce kAs
+cayenne kAen
+cayenne kIen
+cayer kAP
+cayes kAz
+caylin kAlin
+caylor kAlP
+cayman kAm~
+caymans kAm~z
+cayne kAn
+cayson kAs~
+cayton kAt~
+cayuses kIUs@z
+caywood kAwqd
+cazares koz)rcs
+cazenove kaz~Ov
+cazier kAz/P
+cc sEsE
+ccs sEsEes
+ccs sEsEz
+cd sEdE
+cdebaca s/d@bok@
+cdrom sEdErom
+cdroms sEdEromz
+cds sEdEz
+cea sE@
+cea sEEA
+ceara sEr@
+cearley sVl/
+ceasar s@s)r
+cease sEs
+cease-fire sEsfIP
+cease-fire sEsfIr
+ceased sEst
+ceasefire sEsfIP
+ceasefires sEsfIPz
+ceaseless sEsl@s
+ceaselessly sEzl@sl/
+ceaser sEsP
+ceases sEs@z
+ceasing sEs6N
+ceaucescu C?CeskyU
+ceausescu C?CeskyU
+ceausescu's C?CeskyUz
+ceballos sAbol]z
+cebu s/bU
+cebu's s/bUz
+cebula CcbUl@
+cebulski C@bulsk/
+cecala Cckol@
+ceccarelli CckPel/
+cecchi sek/
+cecchini CckEn/
+cecconi CckOn/
+cece sEs
+cecelia s@sEly@
+cecere CcC,r/
+cech sek
+ceci ses/
+cecil sEs@l
+cecil's sEs@lz
+cecile s@sEl
+cecilia s@sEly@
+cecin sesin
+ceco sEk]
+cecola sckOl@
+cecos sEk]s
+cedar sEdP
+cedars sEdPz
+cede sEd
+ceded sEd@d
+cedeno Ccden]
+ceder sEdP
+cederberg sEdPbPg
+cedergren sEdPgrcn
+cederholm sEdPh]m
+cederquist sedPkwist
+cedes sEdz
+cedillo Ccdil]
+ceding sEd6N
+cedras sAdr@s
+cedras sAdros
+cedras' sAdr@s
+cedras' sAdros
+cedras's sAdr@s@s
+cedras's sAdros@s
+cedric sEdr6k
+cedric sedr6k
+cedrone sAdrOnA
+cees sEz
+cefalo Ccfol]
+cefalu CcfolU
+cegielski C6gElsk/
+ceiling sEl6N
+ceilings sEl6Nz
+ceja sAy@
+cejka CAk@
+cel sEEel
+cel sel
+cela sel@
+celadon sel@don
+celandine sel~dIn
+celanese sel~Ez
+celani Cclon/
+celano Cclon]
+celaya sAlA@
+cele sEl
+celebrant sel@br~t
+celebrants sel@br~ts
+celebrate sel@brAt
+celebrated sel@brAt@d
+celebrates sel@brAts
+celebrating sel@brAt6N
+celebration sel@brAS~
+celebrations sel@brAS~z
+celebratory s@lebr@t{r/
+celebre sel@br@
+celebrities s@lebr@t/z
+celebrity s@lebr@t/
+celena Cclen@
+celene Cel/n
+celentano Cclcnton]
+celeron selPon
+celery selP/
+celesta s@lest@
+celeste s@lest
+celestial s@lesC@l
+celestin selcstin
+celestina CclcstEn@
+celestine CclcstEn/
+celestino CclcstEn]
+celia sEly@
+celibacy sel@b@s/
+celibate sel@b@t
+celica sel6k@
+celie sel/
+celimene sel}En
+celina s@lEn@
+celinda CclEnd@
+celine s@lEn
+celio sEl/]
+celis selis
+cell sel
+cell's selz
+cella sel@
+cellar selP
+cellars selPz
+celled seld
+celli Cel/
+cellini CclEn/
+cellio Cel/]
+cellist Cel@st
+cellmark selmork
+cellmark's selmorks
+cellnet selnet
+cello Cel]
+cellophane sel@fAn
+cellphone self]n
+cellpro selpr]
+cells selz
+cells' selz
+cellstar selstor
+cellucci CclUC/
+cellular sely@lP
+cellular's sely@lPz
+celluloid sel@l<d
+cellulosa selUlOs@
+cellulose sely@lOs
+celmer selmP
+celnik seln6k
+celo sEEelO
+celo sEl]
+celo sel]
+celona CclOn@
+celosia CclOs/@
+cels selz
+celsius sels/@s
+celso sels]
+celt kelt
+celt selt
+celtic kelt6k
+celtic selt6k
+celtics selt6ks
+celtics' seltiks
+celts kelts
+celts selts
+cement s}ent
+cemented s}ent@d
+cementing s}ent6N
+cementos scment]s
+cemeteries sem@ter/z
+cemetery sem@ter/
+cemex kemeks
+cemp semp
+cencall sensel
+cenci CenC/
+cencor senk{r
+cendejas sAndAyoz
+cenergy senPj/
+ceniceros sAn/s,r]z
+cenith sen@T
+cenith's sen@Ts
+cenozoic sEn@zO6k
+censer sensP
+censor sensP
+censored sensPd
+censoring sensP6N
+censors sensPz
+censorship sensPSip
+censure senSP
+censured senSPd
+census sens@s
+censuses sens@s@z
+cent sent
+centanni Ccnton/
+centanni scnton/
+centaur sent{r
+centaur's sent{rz
+centaurs sent{rz
+centavos scntovOs
+centel sentel
+centel's sentelz
+centenarian sent~,r/~
+centenarians sent~,r/~z
+centenary sent~er/
+centennial scnten/@l
+centennial's scnten/@lz
+centeno Ccnten]
+centeno scnten]
+center senP
+center sentP
+center's senPz
+center's sentPz
+centerbanc sentPbaNk
+centerbank sentPbaNk
+centered sentPd
+centerfielder sentPfEldP
+centerfold sentPfOld
+centering sentP6N
+centerior sentir/P
+centerpiece sentPpEs
+centerre sentP
+centerre's sentPz
+centers senPz
+centers sentPz
+centers' senPz
+centers' sentPz
+centerville sentPvil
+centex senteks
+centigrade sent@grAd
+centigram sent@gram
+centime sentIm
+centimes sentImz
+centimeter sent}EtP
+centimeters sent}EtPz
+centipede sent@pEd
+centner sentnP
+centocor sent@k{r
+centocor's sent@k{rz
+centofanti Ccnt]font/
+centola CcntOl@
+centoxin sentoks~
+central sentr@l
+central's sentr@lz
+centrale scntrol
+centralia scntrAl/@
+centralism sentr@liz}
+centralists sentr@l@s
+centralists sentr@l@ss
+centralists sentr@l@sts
+centrality scntal@t/
+centralization sentr@l@zAS~
+centralize sentr@lIz
+centralized sentr@lIzd
+centralizing sentr@lIz6N
+centrally sentr@l/
+centram sentram
+centre sentP
+centrella sentrel@
+centres sentPz
+centrex sentr@ks
+centrifugal scntrify6g@l
+centrifuge sentr@fyUj
+centrifuges sentr@fyUj@z
+centrist sentrist
+centrists sentris
+centrists sentriss
+centrists sentrists
+centro sentr]
+centromin sentr}in
+centronics sentron6ks
+centrust sentrust
+centrust's sentrusts
+cents sens
+cents sents
+centum kent}
+centuri scntqr/
+centuries senCP/z
+centurion scntqr/~
+century senCP/
+century's senCP/z
+cenvill senvil
+cep sep
+cepeda sApAd@
+cepero sAp,r]
+cephalon sef@lon
+cephalopod sef@l@pod
+cephalosporin sef@l{spP~
+cephas sef@z
+cephus sef@s
+cera s,r@
+ceraceous sPAS@s
+ceradyne s,r@dIn
+cerami CPom/
+ceramic sPam6k
+ceramics sPam6ks
+cerankosky ser@Nk{sk/
+cerasoli CPosOl/
+ceravolo CPovOl]
+cerbone CVb]n
+cercone CPkOn/
+cerda C,rd@
+cereal sir/@l
+cereals sir/@lz
+cerebral s,r@br@l
+cerebral sPEbr@l
+cerebrally sPEbr@l/
+ceredase s,r@dAz
+cereghino CPcgEn]
+cerelia CPel/@
+ceremonial ser}On/@l
+ceremonies s,r}On/z
+ceremony s,r}On/
+cereno sPAn]
+ceres sir/z
+cerezo sPAz]
+cerezo serAz]
+cerf sVf
+ceridian sPid/~
+cerino CPEn]
+cerio C,r/]
+cerise sPEs
+cermak CVm@k
+cern sVn
+cerna C,rn@
+cerney sVn/
+cerniglia CPnEgl/@
+cernuda sPnUd@
+cernuda's sPnUd@z
+cerny sVn/
+cerone CPOn/
+cerra s,r@
+cerrato CPot]
+cerreta CPet@
+cerrito CPEt]
+cerritos scrEt]s
+cerro s,r]
+cerrone CPOn/
+cerruti CPUt/
+cerruti sPUt/
+cerska kVsk@
+cerska sVsk@
+certain sVt~
+certainly sVt~l/
+certainteed sVt~tEd
+certainties sVt~t/z
+certainty sVt~t/
+certificate sPtif6k@t
+certificates sPtif6k@ts
+certification sVt@f@kAS~
+certifications sVt@f@kAS~z
+certified sVt@fId
+certified's sVt@fIdz
+certifies sVt@fIz
+certify sVt@fI
+certifying sVt@fI6N
+certitude sVt@tUd
+certo C,rt]
+certron sVtron
+cerulli CPUl/
+cerullo CPUl]
+cerus s,r@s
+cerutti CPUt/
+cervantez scrvontcz
+cerveceria sVv@sir/@
+cervenka scrvANk@
+cerveny CPvEn/
+cervera CPv,r@
+cervesato servcsotO
+cerveza sVvAz@
+cerveza servAz@
+cervi C,rv/
+cervical sVv6k@l
+cervini CPvEn/
+cervix sVv6ks
+cervone CPvOn/
+ceryl s,r@l
+cesar sEzP
+cesare CAz)rA
+cesario Ccs)r/]
+cesaro Ccs)r]
+cesarz sAsorz
+cesena Ccsen@
+cesium sEz/}
+cespedes sAspAdcs
+cessation sesAS~
+cessna sesn@
+cessna sezn@
+cessna's sesn@z
+cessna's sezn@z
+cesspool sespUl
+cestaro Ccst)r]
+ceta sEEtEA
+ceta set@
+cetacean s/tAS~
+cetacean s@tAS~
+cetec sEtek
+cetera setP@
+cetus sEt@s
+cetus's sEt@s@z
+cevallos sAvol]z
+cevaxs sevaks@z
+ceylon s/lon
+ceylon s@lon
+cezanne sezan
+cezanne's sezanz
+cha Co
+cha-chas CoCoz
+chablis S@blE
+chabon CAb~
+chabot S@bO
+chacabuco Cak@byUk]
+chace CAs
+chachere S@Sir
+chachi CoC/
+chacin SAsin
+chacko Cak]
+chacon Cak~
+chad Cad
+chad's Cadz
+chadbourne S@dbqrn
+chadd Cad
+chadderdon C@dVd~
+chaddock Cad@k
+chadel Cad@l
+chadian CAd/~
+chadick Cad6k
+chadli Cadl/
+chadron Cadr~
+chadwell Cadwel
+chadwick Cadw6k
+chadwick's Cadw6ks
+chae CI
+chaebol CAb@l
+chafe CAf
+chafed CAft
+chafee CAf/
+chafee Caf/
+chafee's CAf/z
+chafee's Caf/z
+chafes CAfs
+chaff Caf
+chaffee Caf/
+chaffin Cafin
+chaffins Cafinz
+chaffy Caf/
+chafin Cafin
+chafing CAf6N
+chagall C@gal
+chagall C@gol
+chagnon Cagn~
+chagrin S@grin
+chagrined S@grind
+chai CI
+chaidez CoEdcz
+chaiken CAk~
+chaikin CAkin
+chaim hIim
+chain CAn
+chain's CAnz
+chained CAnd
+chaining CAn6N
+chains CAnz
+chains' CAnz
+chainsaw CAns{
+chainsaws CAns{z
+chair C,r
+chaired C,rd
+chaires S,rz
+chairez Coircz
+chairing C,r6N
+chairman C,rm~
+chairman's C,rm~z
+chairmanship C,rm~Sip
+chairmanships C,rm~Sips
+chairmen C,rmcn
+chairpeople C,rpEp@l
+chairperson C,rpVs~
+chairs C,rz
+chairwoman C,rwqm~
+chairwomen C,rwimcn
+chaise SAz
+chaisson CAs~
+chait CAt
+chajet Caj@t
+chalabi C@lob/
+chalasani Cal@san/
+chalet S@lA
+chalet SalA
+chalets S@lAz
+chalets SalAz
+chalfant Cafont
+chalfant Caf~t
+chalfin Calfin
+chalifoux Sal@fU
+chalk Cok
+chalked C{kt
+chalker C{kP
+chalking C{k6N
+chalkley Calkl/
+chalks C{ks
+challender C@lendP
+challenge Cal~j
+challenged Cal@jd
+challenger Cal~jP
+challenger's Cal~jPz
+challengers Cal~jPz
+challengery Cal~jP/
+challenges Cal~j@z
+challenging Cal~j6N
+challis Calis
+chalmers ComPz
+chalmette Salmet
+chaloupka C@lUpk@
+chaloux S@lU
+chalsty Calst/
+chalupa C@lUp@
+cham Cam
+chamber CAmbP
+chamber's CAmbPz
+chambered CAmbPd
+chamberlain CAmbPl~
+chamberlain's CAmbPl~z
+chamberland CambPl~d
+chamberlayne CAmbPlAn
+chamberlin CAmbPlin
+chambers CAmbPz
+chambers' CAmbPz
+chambers's CAmbPz@z
+chamblee Cambl/
+chambless S}blEs
+chamblin Camblin
+chambliss Camblis
+chambon Camb~
+chameleon C}el/~
+chamlee Caml/
+chamlong Caml{N
+chamness Camn@s
+chamorro C]m{r]
+chamorro C}{r]
+chamorro's C}{r]z
+champ Camp
+champa komp@
+champagne SampAn
+champagnes SampAnz
+champaign CampAn
+champeau SampO
+champine CampIn
+champion Camp/~
+champion's Camp/~z
+championed Camp/~d
+championing Camp/~6N
+champions Camp/~z
+championship Camp/~Sip
+championships Camp/~Sips
+champlain SamplAn
+champlin Camplin
+champney Campn/
+champoux SampU
+champs Camps
+chan Can
+chan's Canz
+chana Can@
+chance Cans
+chancellor Cans@lP
+chancellor CanslP
+chancellor's Cans@lPz
+chancellors Cans@lPz
+chancery CansP/
+chances Cans@z
+chancey Cans/
+chancy Cans/
+chand Cand
+chanda Cand@
+chandelier Sand@lir
+chandeliers Sand@liz
+chandler CandlP
+chandler's CandlPz
+chandley Candl/
+chandon Cand~
+chandon Sandon
+chandra Candr@
+chandross Candr{s
+chanel S~el
+chaney CAn/
+chang CaN
+chang-hsin CoNSin
+chang-ming CaNmiN
+chang-ming CoNmiN
+changchun CoNCqn
+change CAnj
+changeable CAnj@b@l
+changed CAnjd
+changeover CAnjOvP
+changeovers CAnjOvPz
+changer CAnjP
+changers CAnjPz
+changes CAnj@z
+changing CAnj6N
+changsho CaNSO
+chanin Canin
+chanley Canl/
+channel Can@l
+channel's Can@lz
+channeled Can@ld
+channeling Can@l6N
+channell Can@l
+channell's S~elz
+channels Can@lz
+channing Can6N
+channon Can~
+chanos Con]s
+chant Cant
+chantal Cant@l
+chanted Cant@d
+chantilly Santil/
+chanting Cant6N
+chants Cants
+chanukah hon@k@
+chany CAn/
+chao C?
+chaos kAos
+chaotic kAot6k
+chap Cap
+chapa Cop@
+chaparral SapPal
+chaparro kop)r]
+chapas Cop@s
+chapdelaine Sapd@lAn
+chapek Cap6k
+chapel Cap@l
+chapel's Cap@lz
+chapell S@pel
+chapelle S@pel
+chaperone SapPOn
+chaperoning SapPOn6N
+chapin S@pan
+chaplain Capl~
+chaplains Capl~z
+chaplin Capl~
+chaplin's Caplinz
+chapman Capm~
+chapman's Capm~z
+chapnick Capn6k
+chapoton Cap]on
+chapp Cap
+chappaquiddick Cap@kwid6k
+chappel Cap@l
+chappelear Sap@lP
+chappell Cap@l
+chappelle S@pel
+chappie Cap/
+chapple Cap@l
+chappuis SapU@z
+chaps Caps
+chapter CaptP
+chapters CaptPz
+chaput Cap@t
+char C)r
+character k,r6ktP
+character's k,r6ktPz
+characteristic ker@ktPist6k
+characteristically ker@ktPist6kl/
+characteristics ker@ktPist6ks
+characterization ker@ktP@zAS~
+characterizations Cer@ktP@zAS~z
+characterize k,r@ktPIz
+characterized k,r@ktPIzd
+characterizes k,r@ktPIz@z
+characterizing k,r6ktPIz6N
+characters kar6ktPz
+characters' C,r@ktPz
+charade SPAd
+charades SPAdz
+charalambos Cor@lomb]s
+charasse C,ras
+charboneau S)rb~]
+charbonneau S)rb~O
+charbonnet S)rb~et
+charcoal C)rkOl
+charcoals C)rkOlz
+chard C)rd
+chardonnay CordonA
+chardonnays CordonAz
+charen C)r~
+charen's C)r~z
+charest CorAcst
+charette SPet
+charge C)rj
+chargeable C)rj@b@l
+charged C)rjd
+charger C)rjP
+chargers C)rjPz
+charges C)rj@z
+chargeurs CorgyUrz
+charging C)rj6N
+chargit C)rjit
+chargois Sorgwo
+chariot C,r/@t
+chariots C,r/@ts
+charisma kPizm@
+charismatic kcr@zmat6k
+charismatics ker@zmat6ks
+charissa korEs@
+charita korEt@
+charitable C,r@t@b@l
+charitably C,r@t@bl/
+charities C,r@t/z
+charities' C,r@t/z
+charity C,r@t/
+charity's C,r@t/z
+charla C)rl@
+charland C)rl~d
+charlatan S)rl@t~
+charlatans S)rl@t~z
+charlayne SorlAn
+charle C)rl
+charlebois S)rl@bwo
+charleen CorlEn
+charlemagne S)rl}An
+charlene SorlEn
+charles C)r@lz
+charles C)rlz
+charles' C)r@lz
+charles' C)rlz
+charles's C)rlz@z
+charles's C)rlz@z
+charleston C)r@lst~
+charleston C)rlst~
+charleston's C)r@lst~z
+charleston's C)rlst~z
+charlestown C)r@lzt?n
+charlestown C)rlzt?n
+charlesworth C)r@lswPT
+charlesworth C)r@lzwPT
+charlet C)rl@t
+charley C)rl/
+charley's C)rl/z
+charlie C)rl/
+charlie's C)rl/z
+charlier C)rl/P
+charline SorlEn
+charlot C)rl@t
+charlotte S)rl@t
+charlotte's S)rl@ts
+charlottesville S)rl@tsvil
+charlottetown S)rl@tt?n
+charlotteville S)rl@tvil
+charls C)rlz
+charlson C)rls~
+charlton C)rlt~
+charm C)rm
+charmain SormAn
+charmaine SormAn
+charmed C)rmd
+charmer C)rmP
+charmers C)rmPz
+charmian C)rm/~
+charming C)rm6N
+charmingly C)rm6Nl/
+charmion C)rm/~
+charms C)rmz
+charney C)rn/
+charnley C)rnl/
+charnock C)rn@k
+charon k,r~
+charpentier Sorp~tir
+charpie C)rp/
+charred C)rd
+charren C,r~
+charrier Car/P
+charring C)r6N
+charron C,r~
+charron k,r~
+charry Car/
+chart C)rt
+charted C)rt@d
+charter C)rtP
+charter's C)rtPz
+chartered C)rtPd
+charterhouse C)rtPh?s
+chartering C)rtP6N
+charters C)rtPz
+chartier C)rt/P
+charting C)rt6N
+chartist C)rtist
+chartists C)rtis
+chartists C)rtiss
+chartists C)rtists
+chartrand C)rtr~d
+chartres C)rtr/z
+charts C)rts
+chartwell C)rtwel
+charvat C)rv@t
+chary C)r/
+charyl Car@l
+chas C)rlz
+chas Coz
+chase CAs
+chase's CAs@z
+chased CAst
+chasen CAs~
+chaser CAsP
+chasers CAsPz
+chases CAs@z
+chasin Casin
+chasing CAs6N
+chaska Cask@
+chasm kaz}
+chason Cas~
+chasse Cas
+chassis Cas/
+chastain S@stAn
+chaste CAst
+chasteen C@stEn
+chasten CAs~
+chastened CAs~d
+chastise CastIz
+chastised CastIzd
+chastises CastIz@z
+chastising CastIz6N
+chastity Cast@t/
+chat Cat
+chateau SatO
+chateaux S@tO
+chatfield CatfEld
+chatham Cat}
+chatichai Cat6CI
+chatichai's Cat6CIz
+chatichai's CatikIz
+chatihachi Cat@hoC/
+chatihachi's Cat@hoC/z
+chatman Catm~
+chatmon Catm~
+chats Cats
+chatswood Catswqd
+chatsworth CatswVT
+chattahoochee Cat@hUC/
+chattahoochee's Cat@hUC/z
+chattanooga Cat~Ug@
+chattanooga's Cat~Ug@z
+chattanuga Cat~Ug@
+chatted Cat@d
+chattel Cat@l
+chatter CatP
+chattering CatP6N
+chatterjee C@tVj/
+chatterton CatPt~
+chatterton's CatPt~z
+chattin Catin
+chatting Cat6N
+chatty Cat/
+chatwal Catw{l
+chatwin Catwin
+chatz Cats
+chatz' Cats
+chatz's Cats@z
+chau SO
+chaucer C{sP
+chaucer's C{sPz
+chaudhry C{dr/
+chaudoin S]d<n
+chauffeur SOfP
+chauffeur S]fV
+chauffeur's SOfPz
+chauffeur's S]fVz
+chauffeured SOfPd
+chauffeured S]fVd
+chauffeurs SOfPz
+chauffeurs S]fVz
+chaumet C{mct
+chaunce C{ns
+chauncey C{ns/
+chauncy C{ns/
+chaus C?s
+chausse C?s
+chaussee C?s/
+chautauqua S@t{kw@
+chautauquan S@t{kw~
+chautauquans S@t{kw~z
+chauvin S]van
+chauvinism SOv~iz}
+chauvinist SOv~@st
+chauvinistic COv~ist6k
+chavarria C@var/@
+chavers CAvPz
+chaves CAvz
+chavez Cavez
+chavez S@vez
+chavez Sovcz
+chavin CAvin
+chavira kovir@
+chavis CAvis
+chavis Cavis
+chavis' CAvis
+chavis' Cavis
+chavitz Cav@ts
+chavous S@v{s
+chaw C{
+chawla C{l@
+chaz Caz
+chazanoff Caz~{f
+chazen CAz~
+chazov Cazov
+chazz Caz
+chazz Coz
+che CA
+chea CE
+cheadle CEd@l
+cheane CEn
+cheane's CEnz
+cheaney CEn/
+cheap CEp
+cheapen CEp~
+cheapened CEp~d
+cheapening CEp~6N
+cheaper CEpP
+cheapest CEp@st
+cheaply CEpl/
+cheapness CEpn@s
+cheapo CEpO
+cheapskate CEpskAt
+cheat CEt
+cheated CEt@d
+cheater CEtP
+cheaters CEtPz
+cheatham CEt}
+cheating CEt6N
+cheats CEts
+cheatum CEt}
+cheatwood CEtwqd
+chebrikov Cebr6kov
+checchi Cek/
+chechen CeC~
+chechen's CeC~z
+chechens CeC~z
+chechnya CeCn/@
+chechnya's CeCn/@z
+chechnyan CeCn/~
+chechnyan's CeCn/~z
+chechnyans CeCn/~z
+check Cek
+checkbook Cekbqk
+checkbooks Cekbqks
+checked Cekt
+checker CekP
+checkerboard CekPb{rd
+checkerboarding CekPb{rd6N
+checkerboards CekPb{rdz
+checkered CekPd
+checkers CekPz
+checkerspot CekPspot
+checketts Cek@ts
+checking Cek6N
+checklist Ceklist
+checkmate CekmAt
+checkoff Cek{f
+checkout Cek?t
+checkouts Cek?ts
+checkpoint Cekp<nt
+checkpoints Cekp<nts
+checks Ceks
+checkup Cekup
+checkups Cekups
+cheddar CedP
+cheddars CedPz
+chedester Ced@stP
+chee CE
+cheech CEC
+cheek CEk
+cheekbone CEkbOn
+cheekbones CEkbOnz
+cheeked CEkt
+cheeks CEks
+cheektowaga CEkt@wog@
+cheeky CEk/
+cheely CEl/
+cheer Cir
+cheered Cird
+cheerful Cirf@l
+cheerfully Cirf@l/
+cheerfully Cirfl/
+cheering Cir6N
+cheerio Cir/]
+cheerios Cir/]s
+cheerleader CirlEdP
+cheerleaders CirlEdPz
+cheerleading CirlEd6N
+cheers Cirz
+cheery Cir/
+cheese CEz
+cheeseburger CEzbPgP
+cheeseburgers CEzbPgPz
+cheesecake CEzkAk
+cheeseman CEzm~
+cheeser CEzP
+cheeses CEz@z
+cheesier CEz/P
+cheesiest CEz/ist
+cheesman CEzm~
+cheesy CEz/
+cheetah CEt@
+cheetahs CEt@z
+cheetal CEt@l
+cheetham CET}
+cheever CEvP
+chef Sef
+chef's Sefs
+chefitz Cefits
+chefs Sefs
+cheil CIl
+cheimi CAm/
+chek Cek
+chekhov Cekov
+chekhov's Cekovz
+chelan Cel~
+chelette Sclet
+chelf Celf
+chell Cel
+chellis Celis
+chelmsford CelmsfPd
+chelsea Cels/
+chelsea's Cels/z
+chelyabinsk Ccly@binsk
+chem kem
+chema Cemo
+chemclear Cemklir
+chemdesign Cemd@zIn
+chemed kemcd
+chemed kemd
+chemel kemcl
+chemerinsky CemPinsk/
+chemetron Cem@tron
+chemfix Cemf6ks
+chemical kem@k@l
+chemical's kem6k@lz
+chemically kem@kl/
+chemicals kem6k@lz
+chemicals' Cem@k@lz
+chemie Cem/
+chemins Ceminz
+chemins S}inz
+chemise S}Ez
+chemist kemist
+chemistry kem@str/
+chemists kemis
+chemists kemiss
+chemists kemists
+chemlawn keml{n
+chemlawn's keml{nz
+chemo kEm]
+chemotherapy kEm]T,r@p/
+chemyr kem6r
+chen Cen
+chen's Cenz
+chenard CenPd
+chenault SinO
+chenette Sinet
+chenevert Cen6vPt
+cheney CAn/
+cheney's CAn/z
+cheng CeN
+cheng-chung CeNCqN
+cheng-hua CeNhwo
+chengdu CeNdU
+chengxiang CeNSoN
+chenier CEn/P
+chennault Cen{lt
+chenoweth Cen@wcT
+chenowitz Cen@wits
+chenxiang CenSoN
+cheong CEoN
+cher S,r
+cheramie C,r}/
+cherbourg S,rb@rg
+cheri S,r/
+cherico kPEk]
+cherie Cir/
+cherish C,riS
+cherished C,riSt
+cherishes C,r6S@z
+chermak CVm@k
+chern CVn
+cherne CVn
+chernenko CPneNk]
+cherney CVn/
+chernick CVn6k
+chernin CVnin
+chernobyl CPnOb@l
+chernobyl's CPnOb@lz
+chernoff kVn{f
+chernomyrdin Cern]mird~
+chernomyrdin's Cern]mird~z
+chernow CVn]
+cherny CVn/
+cherokee C,r@kE
+cherokee's C,r@kEz
+cherokees C,r@kEz
+cherrapunji Cer@punj/
+cherrier C,r/P
+cherries C,r/z
+cherrington C,r6Nt~
+cherry C,r/
+cherrystone C,r/stOn
+cherrystones C,r/stOnz
+chert CVt
+chertkow CVtk?
+chertoff CVtof
+cherts CVts
+cherub C,r@b
+cherubic CPUb6k
+cherubini kPUbEn/
+cherubs C,r@bz
+cherumirdan Cer}ird~
+cherumirdan's Cer}ird~z
+chervenak CVv~ak
+chery C,r/
+cheryl S,r@l
+ches Ces
+chesapeake Ces@pEk
+chesbro kesbr]
+chesebro kcsebr]
+chesebrough Ces@brU
+chesher CeSP
+cheshier CeS/P
+cheshire CeSP
+chesler Ces@lP
+chesley Cesl/
+cheslock Cesl@k
+chesney Cesn/
+chesnut Cesnut
+chesnutt Ccsnut
+chess Ces
+chessboard Cesb{rd
+chesser CesP
+chessher CeSP
+chesshir ScSV
+chessman Cesm~
+chesson Ces~
+chest Cest
+chestang Cest@N
+chested Cest@d
+chester CestP
+chesterfield CestPfEld
+chesterman CestPm~
+chesters CestPz
+chesterson CestPs~
+chesterton CestPt~
+chestman Cestm~
+chestnut Cesnut
+chestnut Cestnut
+chestnuts Cesn@ts
+chestnutt Cestn@t
+cheston Cest~
+chests Cests
+chet Cet
+chetniks Cetn6ks
+chetwin Cetwin
+cheung CyUN
+cheuse CUs
+cheuvront SUvront
+chevalier Sev@lir
+cheverly CevPl/
+cheves CEvz
+chevette S@vet
+chevies Cev/z
+cheviot Sev/@t
+cheviots CEv/@ts
+chevis Cevis
+chevrette S6vret
+chevrier CevP/P
+chevrolet Sevr@lA
+chevrolet Sevr]lA
+chevrolet's Sevr@lAz
+chevrolet's Sevr]lAz
+chevrolets Sevr@lAz
+chevrolets Sevr]lAz
+chevron Sevron
+chevron Sevr~
+chevron's Sevronz
+chevron's Sevr~z
+chevy Cev/
+chevy's Cev/z
+chevys Cev/z
+chew CU
+chewed CUd
+chewer CUP
+chewers CUPz
+chewing CU6N
+chewning CUn6N
+chews CUz
+chewy CU/
+cheyenne SIan
+cheyenne's SIanz
+cheyennes SIanz
+cheyne CAn
+cheyney CAn/
+chez Cez
+chi kI
+chi's kIz
+chia CE@
+chianese k/onAz/
+chiang CaN
+chiang's CaNz
+chianti C/ant/
+chiapas C/op@s
+chiapparone C/apPOn
+chiappetta k/opet@
+chiappone k/opOn/
+chiara ky)r@
+chiaramonte k/oromOnt/
+chiarella k/orel@
+chiarelli k/orel/
+chiarello k/orel]
+chiarenza k/orenz@
+chiarnim k/)rnim
+chiaro k/)r]
+chiasson C/os~
+chiat CEat
+chiavetta k/ovet@
+chiba CEb@
+chic SEk
+chicago S@kogO
+chicago's S@kogOz
+chicagoan Cik@gOn
+chicagoans S@kogO~z
+chicanery S6kAnP/
+chicano C6kon]
+chicanos C6kon]z
+chichauha CEC?@
+chichauha's CEC?@z
+chichester CiCcstP
+chichi CEC/
+chick Cik
+chickasaw Cik@s{
+chickasaws Cik@s{z
+chicked C6kt
+chicken Cik~
+chicken's Cik~z
+chickened Cik~d
+chickens Cik~z
+chickering CikP6N
+chicks Ciks
+chico CEkO
+chico's CEkOz
+chicoine C6k<n
+chicots Cik@ts
+chide CId
+chided CId@d
+chides CIdz
+chidester Cid@stP
+chideya C@dAy@
+chideya C@dEy@
+chiding CId6N
+chidsey Cidz/
+chief CEf
+chief's CEfs
+chiefdom CEfd}
+chieffo kEf]
+chiefly CEfl/
+chiefs CEfs
+chiefs' CEfs
+chieftain CEft~
+chieftain's CEft~z
+chieftains CEft~z
+chien Cen
+chiengmai CeNmI
+chiesa kEs@
+chiffon Sifon
+chiggers CigPz
+chigney Cign/
+chihuahua C@wowo
+chihuahua CEwow@
+chikane C6konA
+chikatilo C6k@til]
+chikos CEk]s
+chilcoat CilkOt
+chilcote CilkOt
+chilcott Cilk@t
+chilcutt Cilk@t
+child CIld
+child's CIldz
+childbearing CIldber6N
+childbirth CIldbVT
+childcare CIldker
+childcraft CIldkraft
+childe Cild
+childener CildnP
+childener Cild~P
+childener's CildnPz
+childener's Cild~Pz
+childers CildPz
+childhood CIldhqd
+childhoods CIldhqdz
+childish CIldiS
+childless CIldl@s
+childlike CIldlIk
+childraising CIldrAz6N
+childree CIldrE
+children Cildr~
+children's Cildr~z
+childrens Cildr~z
+childrens' Cildr~z
+childres CIldPz
+childress Cildr@s
+childrey Cildr/
+childs CIldz
+chile Cil/
+chile's Cil/z
+chilean Cil/~
+chileans Cil/~z
+chiles CIlz
+chiles Cil/z
+chiles's Cil/z@z
+chili Cil/
+chili's Cil/z
+chilies Cil/z
+chilis Cil/z
+chill Cil
+chilled Cild
+chillemi k/lem/
+chiller CilP
+chillicothe Cil6k{T
+chillier Cil/P
+chillies Cil/z
+chilling Cil6N
+chillingly Cil6Nl/
+chills Cilz
+chilly Cil/
+chilmark Cilmork
+chilson Cils~
+chilton Cilt~
+chimayo CimI]
+chime CIm
+chimed CImd
+chimenti Ciment/
+chimento Ciment]
+chimera Cim,r@
+chimerine CimPEn
+chimes CImz
+chimicles Cim6k@lz
+chimie Cim/
+chimney Cimn/
+chimneys Cimn/z
+chimp Cimp
+chimpanzee Cimpanz/
+chimpanzees Cimpanz/z
+chimps Cimps
+chin Cin
+china CIn@
+china's CIn@z
+chinatown CIn@t?n
+chinchilla CinCil@
+chinen Cin~
+chinese CInEz
+ching CiN
+chinh Cin
+chink CiNk
+chinks CiNks
+chinn Cin
+chinn's Cinz
+chinnici k/nEC/
+chinnock Cin@k
+chino CEn]
+chinook Cinqk
+chinook Sinqk
+chinooks Cinqks
+chinooks Sinqks
+chinoy Cin<
+chintung Cint@N
+chintzy Cints/
+chiodo k/Od]
+chip Cip
+chip's Cips
+chipboard Cipb{rd
+chipcom Cipkom
+chipcom's Cipkomz
+chipello C@pel]
+chipetas C@pEt@z
+chipley Cipl/
+chipmaker CipmAkP
+chipmakers CipmAkPz
+chipman Cipm~
+chipote C@pOt
+chipped Cipt
+chipper CipP
+chippewa Cip@wo
+chipping Cip6N
+chipps Cips
+chippy Cip/
+chips Cips
+chipsoft Cips{ft
+chiquita C6kEt@
+chiquita C6kwEt@
+chiquita k6kwEt@
+chirac S6rak
+chirac's S6raks
+chirco kirk]
+chirico k6rEk]
+chiron CIr~
+chiron's CIr~z
+chiropractic kIr]prakt6k
+chiropractor kIr@praktP
+chiropractor's kIr]praktPz
+chiropractors kIr@praktPz
+chirp CVp
+chirping CVp6N
+chirps CVps
+chirpy CVp/
+chisam Cis}
+chisel Ciz@l
+chiseled Ciz@ld
+chisels Ciz@lz
+chisenhall Cisenh@l
+chisholm Ciz}
+chisler Cis@lP
+chism Ciz}
+chisman Cism~
+chismar CizmP
+chisolm Cis]m
+chisom Cis}
+chissano C@son]
+chisum Ciz}
+chit Cit
+chita CEt@
+chitchat CitCat
+chitinous kIt~@s
+chitra Citr@
+chitra's Citr@z
+chitrao Citr?
+chits Cits
+chittenden Cit~d~
+chittick Cit6k
+chittum Cit}
+chitty Cit/
+chitwood Citwqd
+chiu CU
+chiusano k/Uson]
+chivalry Siv@lr/
+chivas CEv@s
+chivas SEv@s
+chivers CIvPz
+chives CIvz
+chiyoda C@yOd@
+chizek Cizck
+chizmar CizmP
+chlamydia klamId/@
+chlamydia klamid/@
+chlebowski Cl@b{fsk/
+chlebowski kl@b{fsk/
+chloe klO/
+chlorate kl{rAt
+chlordane kl{rdAn
+chloride kl{rId
+chlorinate kl{r~At
+chlorinated kl{r~At@d
+chlorinating kl{r~At6N
+chlorine kl{r/n
+chloris kl{ris
+chlorofluorocarbon kl{r]fl{r]k)rbon
+chlorofluorocarbons kl{r]fl{r]k)rbonz
+chloroform kl{r@f{rm
+chlorophyll kl{r@fil
+chloroplast kl{r@plast
+chloroplasts kl{r@plas
+chloroplasts kl{r@plass
+chloroplasts kl{r@plasts
+chloroprene kl{r@prEn
+chmiel C}El
+chmielewski C}@lUsk/
+chmielewski C}@lefsk/
+chmura C}qr@
+cho CO
+choat COt
+choate COt
+chock Cok
+chocolat Cokl@t
+chocolate C{kl@t
+chocolates C{kl@ts
+chodorow COdP]
+choe CO
+choi C<
+choice C<s
+choicer C<sP
+choicers C<sPz
+choices C<s@z
+choicest C<s@st
+choiniere S<n/cr
+choinski C<nsk/
+choir kwIP
+choirs kwIrz
+chojnacki C@ynotsk/
+chojnowski C@yn{fsk/
+chok Cok
+choke COk
+choked COkt
+chokehold COkhOld
+chokes COks
+choking COk6N
+cholera kolP@
+choleric kolP6k
+cholesterol k@lestP@l
+cholesterol k@lestP{l
+cholestyramine C]lest6r}In
+cholet COl@t
+cholewa C@lU@
+cholla Col@
+choma COm@
+chomp Comp
+chomping Comp6N
+chon Con
+chong C{N
+chongqing C{NkiN
+chonko CoNk]
+chontales SontAlz
+choo CU
+choon CUn
+choong CUN
+choose CUz
+chooses CUz@z
+choosing CUz6N
+choosy CUz/
+chop Cop
+chop-suey CopsU/
+choper COpP
+chopin SOpan
+choplin Coplin
+chopp Cop
+chopped Copt
+chopper CopP
+chopper's CopPz
+choppers CopPz
+chopping Cop6N
+choppy Cop/
+chopra Copr@
+chops Cops
+chopstick Copstik
+chopsticks Copstiks
+chopsuey CopsU/
+choquette S@ket
+choral k{r@l
+chorals k{r@lz
+chorba k{rb@
+chord k{rd
+chordates k{rdAts
+chords k{rdz
+chore C{r
+choreograph k{r/@graf
+choreographed k{r/@graft
+choreographer k{r/ogr@fP
+choreographer's k{r/ogr@fPz
+choreographers k{r/ogr@fPz
+choreographic k{r/@graf6k
+choreographing k{r/@graf6N
+choreographing k{r/ogr@f6N
+choreography k{r/ogr@f/
+chores C{rz
+choric k{r6k
+chorney k{rn/
+chortle C{rt@l
+chortled C{rt@ld
+chortles C{rt@lz
+chortling C{rt@l6N
+chortling C{rtl6N
+chorus k{r@s
+choruses k{r@s@z
+chose COz
+chosen COz~
+chosun COz~
+chotilla C@til@
+chou CU
+chouinard Sw/n)rd
+chovan COv~
+chovanec C@van6k
+chow C?
+chowder C?dP
+chowdhury C?dhyUr/
+chowning C?n6N
+chows C?z
+choy C<
+choyce C<s
+chrest krest
+chrestman krestm~
+chretien SritEn
+chriboniko CrEb]nEk]
+chriboniko Crib~Ek]
+chriboniko's CrEb]nEk]z
+chriboniko's Crib~Ek]z
+chriptosporidium kript]sp{rid/}
+chris kris
+chris' kris
+chrisco krEsk]
+chriscoe krisk]
+chrisman krism~
+chrismer kViz}P
+chrismer krismP
+chrismon krizm~
+chrisp krisp
+chriss kris
+chrissie kris/
+chrissy kris/
+christ krIst
+christ's krIsts
+christa krist@
+christabelle Srist@b@l
+christakos krist@k]z
+christal krist@l
+christchurch krIstCPC
+christel krist@l
+christen kris~
+christenberry kris~ber/
+christenbury kris~ber/
+christendom kris~d}
+christened kris~d
+christening krisn6N
+christening kris~6N
+christensen krist~s~
+christenson krist~s~
+christeson krist@s~
+christi krist/
+christiaan krist/on
+christian krisC~
+christiana krist/an@
+christiane krist/on
+christianity krisC/an@t/
+christianization krisC~@zAS~
+christianize krisC~Iz
+christianized krisC~Izd
+christianna krist/an@
+christianne krist/on
+christiano kr/st/on]
+christians krisC~z
+christiansen krisC~s~
+christianson krisC~s~
+christic krist6k
+christie krist/
+christie's krist/z
+christies krist/z
+christina kristEn@
+christine kristEn
+christine's kristEnz
+christison krist@s~
+christlieb kristlEb
+christman kristm~
+christman's kristm~z
+christmann kristm~
+christmas krism@s
+christmas' krism@s
+christmases krism@s@z
+christmastime kristm@stIm
+christner kristnP
+christo krist]
+christoff krist{f
+christoffel krist@fcl
+christoffersen krist@fVs~
+christofferson kr6stofPs~
+christon krist~
+christoph krist{f
+christophe kr6str{f
+christophel krist@fcl
+christopher krist@fP
+christopher's krist@fPz
+christophersen kristofPs~
+christopherson kr6stofPs~
+christopoulos kristop@l@s
+christy krist/
+christy's krist/z
+chriswell kriswel
+chrobak krOb@k
+chromakalim CrOm@kolEm
+chromalloy kr]mal<
+chromatogram kr]mat@gram
+chromatograms kr]mat@gramz
+chromatography kr]m@togr@f/
+chrome krOm
+chrominance krOm~~s
+chromium krOm/}
+chromosome krOm@sOm
+chromosome krOm@zOm
+chromosomes krOm@sOmz
+chromosomes krOm@zOmz
+chronar kronP
+chronic kron6k
+chronically kron6k@l/
+chronically kron6kl/
+chronicle kron@k@l
+chronicle's kron6k@lz
+chronicled kron6k@ld
+chronicler kron6klP
+chroniclers kron@klPz
+chronicles kron@k@lz
+chronicling kron6kl6N
+chronis krOnis
+chronister kron@stP
+chronological kron@loj6k@l
+chronologically kron@loj6kl/
+chronologies kr~ol@j/z
+chronology kr~ol@j/
+chronowitz kron@wits
+chrostowski kr@st{fsk/
+chrusciel krusEl
+chrysanthemum kr@sanT}}
+chrysanthemums kr@sanT}}z
+chryseis kris@z
+chrysler krIslP
+chrysler's krIslPz
+chryslers krIslPz
+chryst Crist
+chrystal krist@l
+chrzan kVzan
+chrzanowski kVz~{fsk/
+chseing CAN
+chu CU
+chua kU@
+chua kwo
+chuah CUo
+chuan CUon
+chuang CaN
+chuang CwoN
+chuba CUb@
+chubais CUbI
+chubb Cub
+chubb's Cubz
+chubbuck Cub@k
+chubby Cub/
+chubu CUbU
+chuck Cuk
+chuck's Cuks
+chuck-a-luck Cuk@luk
+chucked Cukt
+chuckie Cuk/
+chucking Cuk6N
+chuckle Cuk@l
+chuckled Cuk@ld
+chuckles Cuk@lz
+chuckling Cukl6N
+chudler CudlP
+chudy CUd/
+chudzik Cudz6k
+chudzinski C@jinsk/
+chug Cug
+chugai CUgI
+chugged Cugd
+chugging Cug6N
+chugoku CUgOkU
+chui kU6
+chujitsuya CUj/tsUy@
+chukchi CUkC/
+chul Cul
+chula CUl@
+chum Cum
+chumbley Cumbl/
+chumley Cuml/
+chummy Cum/
+chumney Cumn/
+chump Cump
+chums Cumz
+chun Cun
+chun's Cunz
+chung CuN
+chung's CuNz
+chunk CuNk
+chunks CuNks
+chunky CuNk/
+chunn Cun
+chunnel Cun@l
+chupp Cup
+chura Cqr@
+church CVC
+church's CVC@z
+churches CVC@z
+churches' CVC@z
+churchgoer CVCgOP
+churchgoers CVCgOPz
+churchgoing CVCgO6N
+churchill CVChil
+churchill CVCil
+churchill's CVChilz
+churchill's CVCilz
+churchman CVCm~
+churchmen CVCm~
+churchwell CVCwel
+churchyard CVCyord
+churilla CPil@
+churkin CVk~
+churkin's CVk~z
+churlish CVliS
+churn CVn
+churned CVnd
+churning CVn6N
+churns CVnz
+churry CV/
+chuse CUz
+chuse CyUz
+chusmir Cqsmir
+chustz Custs
+chute SUt
+chutes SUts
+chutney Cutn/
+chutzpah Cutspo
+chutzpah hqtspo
+chykatka C/kotk@
+chynoweth Cin?cT
+chyron CIr~
+chyron's CIr~z
+cia sE@
+ciaccia C/@CE@
+ciaccia s/@sE@
+ciaccio C{C/]
+ciampa C{mp@
+ciampi C{mp/
+cian SEn
+cianci C{nC/
+ciancio C{nC/]
+cianciola C{nC]l@
+cianciolo C{nC]l]
+cianciulli C{nCUl/
+ciani C{n/
+ciano C/on]
+ciaobella C?bel@
+ciaramella CPomel@
+ciaramitaro CVom/tor]
+ciaravino CPovEn]
+ciardi CVd/
+ciarlo CVl]
+ciavarella C@vorel@
+ciba sEb@
+ciba sIb@
+ciba's sEb@z
+ciba's sIb@z
+ciborowski C@bP{fsk/
+cibro sibr]
+cibula C/bUl@
+cicada s@kAd@
+cicadas s6kAd@z
+cicala s6kol@
+cicalese C/kolAz/
+ciccarelli C/kPel/
+ciccarello C/kPel]
+ciccarone sikPOn
+cicco sik]
+ciccone C/kOn/
+cicely sis@l/
+cicero sisPO
+cicerone sisPOn
+cichocki s6Cok/
+cichon siC~
+cichowski Cih{fsk/
+cichy siC/
+cicily CiC@l/
+cicio sis/]
+cicippio s@sip/]
+cid sid
+cider sIdP
+cie sE
+cie sEIE
+ciel sEl
+ciera sEr@
+cieri sEr/
+ciesielski CcsElsk/
+ciesla Cesl@
+cieslak Cesl@k
+cieslewicz Cesl6v6C
+cieslik Cesl6k
+cieslinski Ccslinsk/
+cifelli s@fel/
+cifra sifr@
+cifuentes s/fwentcs
+ciga sEg@
+cigar s6g)r
+cigarette sigPet
+cigarette's sigPets
+cigarettes sigPets
+cigars s6g)rz
+cigna sign@
+cigna's sign@z
+cihak sih@k
+cihlar silP
+cilag silag
+cilantro s@lantr]
+cilcorp silk{rp
+cilento s@lent]
+ciliates sil/@ts
+ciliberto C/l/b,rt]
+cilicia s@liS@
+ciller silP
+cilley sil/
+cillo sil]
+cilluffo s@lUf]
+cilva silv@
+cima CEm@
+cimaglia simagl/@
+cimarron simPon
+ciments siments
+ciminero sEm~,r]
+cimini C/mEn/
+cimino C/mEn]
+cimmino C/mEn]
+cimo CEm]
+cimorelli C/m{rel/
+cina CEn@
+cinch sinC
+cinched sinCt
+cincinnati sins~at/
+cincinnati's sins~at/z
+cinco siNk]
+cincotta C/nkOt@
+cinder sindP
+cinderella sindPel@
+cinders sindPz
+cindie sInd/
+cindric sindr6k
+cindy sind/
+cindy's sind/z
+cinelli s~el/
+cinema sin}@
+cinema's sin}@z
+cinemark sin}ok
+cinemas sin}@z
+cinematic sin}at6k
+cinematographer sin}@togr@fP
+cinematography sin}@togr@f/
+cinemax sin}aks
+cineplex sin@pleks
+cineplex's sin@pleks@z
+cinergy sinPj/
+cini CEn/
+cinnabar sin@bor
+cinnabon sin@b{n
+cinnaminson sin}~s~
+cinnamon sin}~
+cinnamonson sin}~s~
+cino CEn]
+cinq siNk
+cinque siNk
+cinquemani C/nkwcmon/
+cinram sinram
+cinthie sinT/
+cintron sintr~
+ciocca COk@
+cioffi C/Of/
+ciolek C/Olck
+ciolino C]lEn]
+ciotti COt/
+cipher sIfP
+cipolla sipol@
+cipollone sip@lOn
+cipollone sip@lOn/
+cipri sipr/
+cipriani C/pr/on/
+cipriano C/pr/on]
+cira sV@
+ciraulo sP{l]
+circa sVk@
+circadian sPkAd/~
+circle sVk@l
+circle's sVk@lz
+circled sVk@ld
+circles sVk@lz
+circling sVk@l6N
+circling sVkl6N
+circon sVkon
+circuit sVk@t
+circuit's sVk@ts
+circuited sVk@t@d
+circuitous sPkyU@t@s
+circuitry sVk@tr/
+circuits sVk@ts
+circular sVky@lP
+circularly sVky@lPl/
+circulars sVky@lPz
+circulate sVky@lAt
+circulated sVky@lAt@d
+circulates sVky@lAts
+circulating sVky@lAt6N
+circulation sVky@lAS~
+circulations sVky@lAS~z
+circulatory sVky@l@t{r/
+circumcise sVk}sIz
+circumcised sVk}sIzd
+circumcision sVk}siZ~
+circumference sPkumfr~s
+circumscribe sVk}skrIb
+circumscribed sVk}skrIbd
+circumspect sVk}spekt
+circumspection sVk}spekS~
+circumstance sVk}stans
+circumstances sVk}stans@z
+circumstantial sVk}stanC@l
+circumstantial sVk}stanS@l
+circumstantially sVk}stanC@l/
+circumstantially sVk}stanS@l/
+circumvene sVk}vEn
+circumvent sVk}vent
+circumvented sVk}vent@d
+circumventing sVk}vent6N
+circumvention sVk}venC~
+circumvents sVk}vents
+circus sVk@s
+circus's sVk@s@z
+circuses sVk@s@z
+cirelli s6rel/
+ciresi sPes/
+ciriaco sir/ok]
+ciriello sP/el]
+cirigliano sP/gl/on]
+cirillo s6ril]
+cirincione sP/nCOn/
+cirino sPEn]
+cirkin sVk~
+cirone s6rOn
+ciros sirOz
+cirque sVk
+cirrhosis sPOs@s
+cirrincione sPr/nCOn/
+cirrus sir@s
+cisar sis)r
+cisco sisk]
+cisco's sisk]z
+cisek Cisck
+cisewski Cisefsk/
+ciskei siskA
+cisler sis@lP
+cislo CEsl]
+cisneros sisn,r]s
+cisney sizn/
+cissell sis@l
+cissie sis/
+cissna sisn@
+cist sist
+cistercian sistVS~
+cistern sistPn
+cisterns sistPnz
+ciszek CiSck
+ciszewski CiSefsk/
+citadel sit@del
+citadel's sit@delz
+citation sItAS~
+citations sItAS~z
+cite sIt
+cited sIt@d
+cites sIts
+citgo sitg]
+citi sit/
+citibank sit/baNk
+citibank's sit/baNks
+citic sit6k
+citicorp sit/k{rp
+citicorp's sit/k{rps
+citicorps sit/k{rps
+citicorps' sit/k{rps
+cities sit/z
+cities' sit/z
+citing sIt6N
+citisteel sit/stEl
+citizen sit@z~
+citizen's sit@z~z
+citizenry sit@z~r/
+citizens sit@z~z
+citizens' sit@z~z
+citizenship sit@z~Sip
+citrano C/tron]
+citric sitr6k
+citrin sitrin
+citrine sitrEn
+citro sitr]
+citroen sitr]n
+citron sitronz
+citron sitr~
+citron's sitronz
+citron's sitr~z
+citronella sitronel@
+citrosuco sitr@sUk]
+citrucel sitr@sel
+citrucel's sitr@selz
+citrus sitr@s
+citrus's sitr@s@z
+cittadino C/todEn]
+city sit/
+city's sit/z
+cityfed sit/fed
+cityplace sit/plAs
+cityside sit/sId
+citytrust sit/trust
+citywide sit/wId
+ciucci CUC/
+ciudad sEUdad
+ciulla CUl@
+ciullo CUl]
+civet siv@t
+civic siv6k
+civics siv6ks
+civil siv@l
+civiletti sEv@let/
+civilian s@vily~
+civilians s@vily~z
+civility s@vil@t/
+civilization siv@l@zAS~
+civilizations siv@l@zAS~z
+civilize siv@lIz
+civilized siv@lIzd
+civilly siv@l/
+civitello C/v/tel]
+cizek Cizck
+cizik sEz6k
+cizneros sizn,r]s
+claar kl)r
+claassen klos~
+clabaugh klab{
+clabir klab6r
+clabo klob]
+claborn klabPn
+clabough klab?
+clack klak
+clackamas klak}@s
+clad klad
+claddagh kladu
+claes klAz
+claeys klAz
+claffey klaf/
+claflin klaflin
+clagett klajit
+clagg klag
+claggett klagit
+clague klog
+claiborn klAbPn
+claiborne klAbPn
+claiborne's klAbPnz
+claiborne's klAb{rnz
+claim klAm
+claimant klAm~t
+claimants klAm~ts
+claimants' klAm~ts
+claimed klAmd
+claiming klAm6N
+claims klAmz
+clair kl,r
+claire kl,r
+claire's kl,rz
+clairmont kl,rm~t
+clairol kl,rol
+clairson kl,rs~
+clairvoyance klcrv<~s
+clairvoyant klcrv<~t
+clam klam
+clamber klambP
+clambered klambPd
+clamen klAm~
+clammy klam/
+clamor klamP
+clamored klamPd
+clamoring klamP6N
+clamp klamp
+clampdown klampd?n
+clamped klampt
+clamping klamp6N
+clampitt kl}pit
+clamps klamps
+clams klamz
+clamshell klamSel
+clan klan
+clancey klans/
+clancy klans/
+clancy's klans/z
+clandestine klandest~
+clandestinely klandest~l/
+clang klaN
+clanging klaN6N
+clanin klanin
+clank klaNk
+clanking klaNk6N
+clannish klaniS
+clans klanz
+clanton klant~
+clap klap
+clapboard klapb{rd
+clapboards klapb{rdz
+clapham klaf}
+clapman klapm~
+clapp klap
+clapped klapt
+clapper klapP
+clapping klap6N
+claps klaps
+clapsaddle klapsad@l
+clapton klapt~
+clapton's klapt~z
+clar kl)r
+clara klar@
+clarabelle klar@bel
+claramae kloromI
+claran kl,r~
+clarcor kl)rk{r
+clardy kl)rd/
+clare kl,r
+claremont kl,rmont
+claren klar~
+clarence kl,r~s
+clarendon kl,r~d~
+claresta klorest@
+clarette klPet
+clarey klar/
+claribel kl,r@bel
+clarice klPEs
+clarida klorEd@
+claridge kl,r6j
+claridges kl,r6j@z
+clarification kler@f6kAS~
+clarifications kler@f6kAS~z
+clarified kl,r@fId
+clarifies kl,r@fIz
+clarify kl,r@fI
+clarifying kl,r@fI6N
+clarimond klar}~d
+clarinda klPind@
+clarine kl,r/n
+clarinet kler~et
+clarinetist kler~et@st
+clarinetists kler~et@s
+clarinetists kler~et@ss
+clarinetists kler~et@sts
+clarins kl,rinz
+clarion kl,r/~
+claris kl,ris
+clarissa klPis@
+clarisse klar/s
+clarita klorEt@
+claritin kl,r@t~
+clarity kl,r@t/
+clark kl)rk
+clark's kl)rks
+clarke kl)rk
+clarke's kl)rks
+clarken kl)rkcn
+clarkin kl)rkin
+clarks kl)rks
+clarksburg kl)rksbPg
+clarkson kl)rks~
+clarkston kl)rkst~
+clarksville kl)rksvil
+claro kl)r]
+clarostat kl,r@stat
+clarridge klar6j
+clarrisse klaris
+clary kl,r/
+clasby klasb/
+clasen klAs~
+clash klaS
+clashed klaSt
+clashes klaS@z
+clashing klaS6N
+clason klas~
+clasp klasp
+clasped klaspt
+class klas
+class's klas@z
+classaction klasakS~
+classed klast
+classen klas~
+classes klas@z
+classic klas6k
+classical klas6k@l
+classically klas6kl/
+classicism klas@siz}
+classicist klas@s@st
+classics klas6ks
+classier klas/P
+classifiable klas@fI@b@l
+classification klas@f@kAS~
+classifications klas@f@kAS~z
+classified klas@fId
+classifies klas@fIz
+classify klas@fI
+classifying klas@fI6N
+classing klas6N
+classless klasl@s
+classmate klasmAt
+classmates klasmAts
+classon klas~
+classroom klasrUm
+classrooms klasrUmz
+classy klas/
+clatter klatP
+claud kl{d
+claude kl{d
+claudet kl{det
+claudette kl]det
+claudia kl{d/@
+claudian kl{d/~
+claudie kl{d/
+claudina kl{d/n@
+claudine kl{dEn
+claudio kl{d/O
+claudius kl{d/@s
+claudson kl{ds~
+claunch kl{nC
+claus kl{z
+claus' kl{z
+clause kl{z
+clausell kl{z@l
+clausen kl?s~
+clauser kl{zP
+clauses kl{z@z
+clausing kl{z6N
+clauson kl{z~
+clauss kl{s
+claussen kl{zs~
+claustrophobia kl{str@fOb/@
+claustrophobic kl{str@fOb6k
+clavette kl@vet
+clavichord klav@k{rd
+clavicle klav@k@l
+clavin klav~
+claw kl{
+clawed kl{d
+clawing kl{6N
+claws kl{z
+clawson kl{s~
+claxon klaks~
+claxton klakst~
+clay klA
+claybaugh klAb{
+clayborn klAbPn
+clayborne klAbPn
+claybourne klAbPn
+claybrook klAbrqk
+claybrooks klAbrqks
+clayburn klAbVn
+claycomb klAk}
+clayey klA/
+clayman klAm~
+claymation klAmAS~
+claymont klAmont
+claymore klAm{r
+claypool klApUl
+claypoole klApUl
+clays klAz
+clayson klAz~
+clayton klAt~
+clayton's klAt~z
+claytor klAtP
+claywell klAwel
+cleah kE@
+clean klEn
+cleaned klEnd
+cleaner klEnP
+cleaners klEnPz
+cleanest klEn@st
+cleaning klEn6N
+cleanliness klenl/n@s
+cleanly klEnl/
+cleanness klEn@s
+cleanness klEnn@s
+cleans klEnz
+cleanse klenz
+cleansed klenzd
+cleanser klenzP
+cleansers klenzPz
+cleansing klenz6N
+cleantha klEnT@
+cleanup klEnup
+cleanups klEnups
+clear klir
+clearance klir~s
+clearances klir~s@z
+clearcut klirkut
+clearcuts klirkuts
+clearcutting klirkut6N
+cleared klird
+clearer klirP
+clearest klirist
+clearing klir6N
+clearinghouse klir6Nh?s
+clearinghouses klEr6Nh?s@z
+clearly klirl/
+clearman klirm~
+clears klirz
+clearwater klirw{tP
+cleary klir/
+cleat klEt
+cleats klEts
+cleavage klEv@j
+cleave klEv
+cleaveland klEvl~d
+cleavenger klEv~jP
+cleaver klEvP
+cleaves klEvz
+cleckler kleklP
+cleckley klekl/
+cleckner kleknP
+cleek klEk
+cleere klir
+cleese klEs
+cleeton klEt~
+clef klef
+cleft kleft
+clegg kleg
+cleghorn kleghPn
+cleland klel~d
+clell klel
+clelland klel~d
+clem klem
+clemans klem~z
+clematis klem@tis
+clematis kl}at@s
+clemen klem~
+clemence klem~s
+clemency klem~s/
+clemens klem~z
+clemensen klem~s~
+clemenson klem~s~
+clement klem~t
+clemente kl}entA
+clementi klAmAnt/
+clementia klAmAnS@
+clementine klem~tIn
+clements klem~ts
+clementson klem~ts~
+clementz klem~ts
+clemmer klemP
+clemmie klem/
+clemmons klem~z
+clemmy klem/
+clemo klAm]
+clemons klem~z
+clemson klems~
+clench klenC
+clenched klenCt
+clencher klenCP
+clenches klenC@z
+clendaniel klend~El
+clendenen klend~~
+clendenin klendcn~
+clendening klend~6N
+clendenning klenden6N
+clenney klen/
+clenwar klenwP
+cleo klE]
+cleopatra klE@patr@
+cleopatra's klE@patr@z
+clephane klefAn
+clepper klepP
+clerc klVk
+clercq klVk
+clergy klVj/
+clergyman klVj/man
+clergyman klVj/m~
+clergymen klVj/mcn
+clergymen klVj/men
+cleric kl,r6k
+clerical kl,r@k@l
+clerics kl,r6ks
+clerissa klPEs@
+clerk klVk
+clerk's klVks
+clerkin klVkin
+clerks klVks
+clerks' klVks
+clermont kl,rmont
+cleva klEv@
+cleve klEv
+cleveland klEvl~d
+cleveland's klEvl~dz
+clevelander klEvl~dP
+clevelanders klEvl~dPz
+cleven klEv~
+clevenger klev~jP
+clever klevP
+cleverly klevPl/
+cleverness klevPn@s
+clevetrust klEvtrust
+clevie klEv/
+clevinger klev@NP
+clevite kl@vIt
+clevite's kl@vIts
+clewell klewcl
+clewis klUis
+clews klUz
+cliantha kl/anT@
+cliburn klIbPn
+cliche kl/SA
+cliched klESAd
+cliches kl/SAz
+click klik
+clicked klikt
+clicker klikP
+clicking klik6N
+clickner kliknP
+clicks kliks
+client klI~t
+client's klI~ts
+clientele klI~tel
+clients klI~ts
+clients' klI~ts
+cliett klEt
+clif klif
+cliff klif
+cliff's klifs
+cliffe klif
+cliffhanger klifhaNP
+cliffhangers klifhaNPz
+clifford klifPd
+clifford's klifPdz
+cliffs klifs
+cliffs' klifs
+clift klift
+clifton klift~
+cliggott klig@t
+clim klim
+climaco klim@k]
+climactic klImakt6k
+climate klIm@t
+climates klIm@ts
+climatic klImat6k
+climatologist klim@tol@jist
+climax klImaks
+climaxed klImakst
+climaxes klimaks@z
+climb klIm
+climbed klImd
+climber klImP
+climbers klImPz
+climbers' klImPz
+climbing klIm6N
+climbs klImz
+climer klImP
+climes klImz
+clinard klinPd
+clinch klinC
+clinched klinCt
+clincher klinCP
+clinches klinC@z
+clinching klinC6N
+cline klIn
+clines klInz
+clines's klInz@z
+cling kliN
+clingan kliNg~
+clingenpeel kl6Ngenp/l
+clinger kliNP
+clingerman kliNPm~
+clinging kliN6N
+clingman kliNm~
+clings kliNz
+clini klEn/
+clinic klin6k
+clinic's klin6ks
+clinical klin@k@l
+clinical's klin6k@lz
+clinically klin6k@l/
+clinically klin6kl/
+clinician kl~iS~
+clinicians kl~iS~z
+clinics klin6ks
+clink kliNk
+clinkenbeard kl6NkenbPd
+clinkscale kliNkskAl
+clinkscales kliNkskAlz
+clint klint
+clinton klint~
+clinton's klint~z
+clintonite klint~It
+clintonites klint~Its
+clintonomics klint~om6ks
+clintons klint~z
+clintons' klint~z
+clio klE]
+clip klip
+clipboard klipb{rd
+clippard klipPd
+clipped klipt
+clipper klipP
+clippers klipPz
+clipping klip6N
+clippinger klip6NP
+clippings klip6Nz
+clips klips
+clique klEk
+cliques kliks
+clites klIts
+clitoris klIt{ris
+clive klIv
+cliver klIvP
+cloak klOk
+cloaked klOkt
+cloaking klOk6N
+cloakroom klOkrUm
+clobber klobP
+clobbered klobPd
+clobbering klobP6N
+clock klok
+clock's kloks
+clocked klokt
+clocker klokP
+clockers klokPz
+clocks kloks
+clockwise klokwIz
+clockwork klokwVk
+clodfelter klodfeltP
+clodoveo kl]dOv/]
+cloe klO
+cloer klOP
+cloey klO/
+clog klog
+clogged kl{gd
+clogging klog6N
+clogs klogz
+clogston klogst~
+cloherty klohPt/
+clohessy klohcs/
+cloister kl<stP
+cloistered kl<stPd
+cloisters kl<stPz
+cloke klOk
+clomipramine klOm@pr}In
+clonch klonC
+clone klOn
+cloned klOnd
+clones klOnz
+clones' klOnz
+clonidine klon@dEn
+cloning klOn6N
+cloninger klOn6NP
+clonts klonts
+clontz klonts
+cloonan klUn~
+clooney klUn/
+clootie klUt/
+clopper klopP
+clopton klopt~
+clore kl{r
+clore's kl{rz
+clorinda kl{rEnd@
+clorox kl{roks
+clos klos
+close klOs
+close klOz
+close-up klOsup
+closed klOzd
+closedown klOzd?n
+closedowns klOzd?nz
+closely klOsl/
+closeness klOsn@s
+closer klOsP
+closer klOzP
+closes klOz@z
+closest klOs@st
+closet kloz@t
+closeted kloz@t@d
+closets kloz@ts
+closeup klOsup
+closeups klOsups
+closing klOz6N
+closings klOz6Nz
+closs kl{s
+closser kl{sP
+closson klos~
+closure klOZP
+closures klOZPz
+clot klot
+clotfelter klotfeltP
+cloth kl{T
+clothe klOT
+clothed klOTd
+clothes klOTz
+clothes klOz
+clotheshorse klOzh{rs
+clothestime klOTztIm
+clothier klOTyP
+clothiers klOTyPz
+clothilda kl@Tild@
+clothilde kloTild
+clothing klOT6N
+cloths kl{Ts
+clotilda kl@tild@
+clots klots
+clott klot
+clotted klot@d
+clotting klot6N
+cloture klOCP
+clouatre kl?@tr
+cloud kl?d
+cloudburst kl?dbVst
+clouded kl?d@d
+cloudiness kl?d/n@s
+clouding kl?d6N
+cloudless kl?dl@s
+clouds kl?dz
+cloudy kl?d/
+clough kl?
+clougherty kl?Pt/
+clouse kl?s
+clouser kl?sP
+clout kl?t
+clouthier kl?T/P
+clouthier klOT/P
+clouthier klOT/P
+cloutier kl?t/P
+clover klOvP
+cloverleaf klOvPlEf
+cloves klOvz
+clovis klOvis
+clow klO
+cloward klOwPd
+clowdus kl?d@s
+clower kl?P
+clowers kl?Pz
+clowes kl?z
+clown kl?n
+clowney kl?n/
+clowning kl?n6N
+clowns kl?nz
+cloy kl<
+cloyd kl<d
+cloying kl<6N
+clozapine klOz@pIn
+club klub
+club's klubz
+clubb klub
+clubbed klubd
+clubbing klub6N
+clubby klub/
+clubhouse klubh?s
+clubhouses klubh?s@z
+clubs klubz
+clucas klUk@z
+cluck kluk
+cluckey kluk/
+clucking kluk6N
+clucks kluks
+clue klU
+clued klUd
+clueless klUl@s
+clues klUz
+cluett klUit
+cluff kluf
+clugston klugst~
+cluj klUj
+cluj sEelyUjA
+clukey klUk/
+clum klum
+clump klump
+clumping klump6N
+clumps klumps
+clumpy klump/
+clumsily klums@l/
+clumsiness klumz/n@s
+clumsy klumz/
+clune klUn
+clung kluN
+clunk kluNk
+clunker kluNkP
+clunkers kluNkPz
+clunks kluNks
+clunky kluNk/
+cluny klUn/
+cluster klustP
+clustered klustPd
+clustering klustP6N
+clusters klustPz
+clutch kluC
+clutched kluCt
+clutches kluC@z
+clutching kluC6N
+clute klUt
+clutter klutP
+cluttered klutPd
+cluttering klutP6N
+clutts kluts
+clyatt klI@t
+clyburn klibPn
+clyde klId
+clydesdale klIdzdAl
+clymene klimEn
+clymer klImP
+clyne klIn
+clyte klIt
+clytie klit/
+clyve klIv
+cmos sEemOes
+cmos sEm]s
+cmx k}eks
+cnn sEenen
+cnn.com sEenendotkom
+cnnfn sEenenefen
+co kO
+co-op kOop
+co-operative kOopV@t6v
+co-operative kOopr@t6v
+co-opt k]opt
+co-opted k]opt@d
+co-wife kOwIf
+co. kO
+co. kup~/
+coach kOC
+coach's kOC@z
+coached kOCt
+coaches kOC@z
+coaching kOC6N
+coachman kOCm~
+coad kOd
+coady kOd/
+coagulate k]agy@lAt
+coagulating k]agy@lAt6N
+coagulation k]agy@lAS~
+coakley kOkl/
+coal kOl
+coal's kOlz
+coale kOl
+coalesce kO@les
+coalesced kO@lest
+coalescing kO@les6N
+coalition kO@liS~
+coalition's kO@liS~z
+coalitions kO@liS~z
+coals kOlz
+coalson kOls~
+coan kOn
+coar k{r
+coarse k{rs
+coarsening k{rs~6N
+coarser k{rsP
+coast kOst
+coast's kOsts
+coastal kOst@l
+coastal's kOst@lz
+coastamerica kOst},r6k@
+coastamerica's kOst},r6k@z
+coasted kOst@d
+coaster kOstP
+coasters kOstPz
+coasting kOst6N
+coastline kOstlIn
+coastlines kOstlInz
+coasts kOs
+coasts kOss
+coasts kOsts
+coat kOt
+coat's kOts
+coate kOAt
+coated kOt@d
+coates kOAts
+coatesville kOtsvil
+coating kOt6N
+coatings kOt6Nz
+coatney kOtn/
+coats kOts
+coattail kOttAl
+coattails kOttAlz
+coauthor kOoTP
+coauthors kOoTPz
+coax kOks
+coaxed kOkst
+coaxes kOks@z
+coaxial kOaks/@l
+coaxing kOks6N
+coaxum kOks}
+cob kob
+cobain kObAn
+cobain's kObAnz
+cobaine kObAn
+cobalt kOb{lt
+cobaugh kob{
+cobb kob
+cobbett kobit
+cobbins kob~z
+cobble kob@l
+cobbled kob@ld
+cobbler koblP
+cobbler's koblPz
+cobblers koblPz
+cobblestone kob@lstOn
+cobblestones kob@lstOnz
+cobbs kobz
+cobe kOb
+coben kOb~
+cobepa k]bAp@
+coberly kObPl/
+cobern kobPn
+cobert kobPt
+cobey kOb/
+cobia kOb/@
+cobian kOb/~
+cobin kObin
+coble kOb@l
+cobleigh kobl@
+coblentz koblcnts
+cobler kOb@lP
+cobliner koblInP
+cobo kOb]
+cobos kOb]z
+cobra kObr@
+cobras kObr@z
+cobre kobr@
+cobrin kobrin
+cobs kobz
+coburn kObPn
+cobweb kobweb
+cobwebs kobwebz
+coby kOb/
+coca kOk@
+cocaine k]kAn
+cocanino kOk~En]
+cocanougher kok~ufP
+cocca kOk@
+coccaro k]k)r]
+cocchi kOk/
+coccia kOC@
+cocco kOk]
+coccus kok@s
+cochairman kOCerm~
+cochenour koS~qr
+cochin kOCin
+cochlea kokl/@
+cochlear kokl/P
+cochran kokr~
+cochran's kokr~z
+cochrane kokr~
+cock kok
+cockamamie k{k}Am/
+cockatoo kok@tU
+cockatoos kok@tUz
+cockburn kokbVn
+cockburn's kObPnz
+cockburn's kokbVnz
+cocke kOk
+cocked kokt
+cocker kokP
+cockerell kokPel
+cockerham kokPham
+cockerill kokPil
+cockey kok/
+cockeyed kokId
+cockfield kokfEld
+cockiness kok/n@s
+cocking kok6N
+cocklin koklin
+cockman kokm~
+cockney kokn/
+cockpit kokpit
+cockpits kokpits
+cockran kokr~
+cockrell kokr@l
+cockrill kokr@l
+cockroach kokrOC
+cockroaches kokrOC@z
+cockroft kokr@ft
+cockrum kokr}
+cocks koks
+cocktail koktAl
+cocktails koktAlz
+cockwell kokwel
+cockwell's kokwelz
+cocky kok/
+coco kOkO
+cocoa kOk]
+cocoanuts kOk]nuts
+cocom kOkom
+coconino kOk~En]
+coconut kOk~ut
+coconuts kOk~uts
+cocoon k@kUn
+cocooning k@kUn6N
+cocoons k@kUnz
+cocos kOkOz
+cocozza k]kOts@
+cocuzza k]kUts@
+cod kod
+cod sEOdE
+coda kOd@
+codag kOdag
+coday kOdA
+codd kod
+codding kod6N
+coddington kod6Nt~
+coddle kod@l
+coddled kod@ld
+coddling kod@l6N
+coddling kodl6N
+code kOd
+code's kOdz
+codebreaker kOdbrAkP
+codebreakers kOdbrAkPz
+coded kOd@d
+codelco k]delk]
+coder kOdP
+coderre k@d,r
+codes kOdz
+codesa k]des@
+codification kod@f@kAS~
+codified kod@fId
+codifies kOd@fIz
+codify kOd@fI
+codifying kOd@fI6N
+coding kOd6N
+codispoti k]d/spOt/
+codlin kodlin
+codner kodnP
+codrescu k@dreskyU
+codrescu's k@dreskyUz
+cody kOd/
+coe kO
+coeburn kObPn
+coed kOd
+coed kOed
+coeds kOedz
+coeducational kOcj@kAS~@l
+coefficient kO@fiS~t
+coefficients kO@fiS~ts
+coehlo kOl]
+coelacanth sEl@kanT
+coelho kOel]
+coello kOel]
+coen kO~
+coenen k]En~
+coenzyme k]enzIm
+coequal k]Ekw@l
+coerce k]Vs
+coerced k]Vst
+coercing k]Vs6N
+coercion k]VS~
+coercive k]Vs6v
+coeur kUr
+coexist kO@gzist
+coexisted kO@gzist@d
+coexistence kO6gzist~s
+coexisting kO6gzist6N
+coey kO/
+cofer kOfV
+coffaro k]f)r]
+coffee kof/
+coffee's kof/z
+coffeehouse k{f/h?s
+coffeehouses k{f/h?s@z
+coffeen k@fEn
+coffees k{f/z
+coffel kof@l
+coffelt kofclt
+coffer k{fP
+coffers kofPz
+coffey kof/
+coffield kof/ld
+coffin k{fin
+coffin's k{finz
+coffing k{f6N
+coffins k{finz
+cofflin k{flin
+coffman k{fm~
+cofide kOfId
+cofield kOfEld
+cofounder kOf?ndP
+cog k{g
+cogan kOg~
+cogar kOgP
+cogbill kogbil
+cogburn kogbVn
+cogdell kogd@l
+cogdill kogd@l
+cogeco kOjek]
+cogema kOgmo
+cogency kOj~s/
+cogenerate kOjenPAt
+cogenerated kOjenPAt@d
+cogeneration k]jenPAS~
+cogenerator k]jenPAtP
+cogenerators k]jenPAtPz
+cogent kOj~t
+coger kOjP
+coggeshall kog6S{l
+coggin kogin
+coggins koginz
+coghill koghil
+coghlan kogl~
+cogitate koj@tAt
+cogitation koj@tAS~
+cogley kogl/
+coglianese k]gl/~Az/
+cogliano k]gl/on]
+cognac kOnyak
+cognac konyak
+cognetics kognet6ks
+cognex kogncks
+cognition kogniS~
+cognitive kogn@t6v
+cognizance kogn@z~s
+cognizant kogn@z~t
+cognoscenti kogn{Sent/
+cogswell kogswel
+cohabit k]hab@t
+cohabitation k]hab@tAS~
+cohabiting k]hab@t6N
+cohan kOh~
+cohasset k]has@t
+cohea koh/@
+cohee koh/
+cohen kO~
+cohen's kO~z
+cohenour k@henP
+coherence k]hir~s
+coherent k]hir~t
+coherently k]hEr~tl/
+cohesion k]hEZ~
+cohesive k]hEs6v
+cohesively k]hEs6vl/
+cohesiveness k]hEs6vn@s
+cohick koh6k
+cohill kOh6l
+cohn kOn
+coho kOh]
+cohoon k@hUn
+cohort kOh{rt
+cohorts kOh{rts
+cohost kOhOst
+cohosts kOhOs
+cohosts kOhOss
+cohosts kOhOsts
+cohr k{r
+cohron k)r~
+cohrs k{rz
+coia kOy@
+coiffe k<f
+coiffed k<ft
+coil k<l
+coile k<l
+coiled k<ld
+coils k<lz
+coin k<n
+coin's k<nz
+coinage k<n6j
+coincide kO~sId
+coincided kO~sId@d
+coincidence k]ins@d~s
+coincidences k]ins@dens@z
+coincident k]ins@d~t
+coincidental k]ins@dent@l
+coincidentally k]ins@den@l/
+coincidentally k]ins@dent@l/
+coincides kO~sIdz
+coinciding kO~sId6N
+coined k<nd
+coiner k<nP
+coining k<n6N
+coins k<nz
+coinsurance kOinSV~s
+cointreau k{ntrO
+coipa k<p@
+coiro k<r]
+coit k<t
+coitsville k<tsvil
+cojimar kOj}or
+cojimar's kOj}orz
+cojuangco k]jwaNk]
+cojuangco k]woNk]
+coke kOk
+coke's kOks
+coker kOkP
+cokes kOks
+cokie kOk/
+cokie's kOk/z
+coking kOk6N
+cokley kokl/
+cola kOl@
+cola's kOl@z
+colab kOlab
+colabella kOl@bel@
+colaianni k]loyon/
+colaizzi kOlAz/
+colaluca kOl@lUk@
+colan kOl~
+colangelo k]loNgel]
+colantonio k]lontOn/]
+colantuono k]lontwOn]
+colao kOl?
+colarusso k]lorUs]
+colas kOl@s
+colasanti kOl@sant/
+colasurdo k]losqrd]
+colavito k]lovEt]
+colaw kOl{
+colbath kOlb@T
+colbaugh kOlb{
+colbeck kolbck
+colberg kolbPg
+colbern kOlbPn
+colbert kOlbPt
+colborn kOlb{rn
+colborne kOlb{rn
+colburn kOlbPn
+colby kOlb/
+colby's kOlb/z
+colbys kOlb/z
+colclasure k]lkloZP
+colclough kOlkl?
+colcord kOlkPd
+cold kOld
+cold-blood kOldblud
+cold-blooded kOldblud@d
+colden kOld~
+colder kOldP
+coldest kOld@st
+coldiron kOldPon
+coldly kOldl/
+coldness kOldn@s
+coldren kOldP~
+colds kOldz
+coldwater kOldw{tP
+coldwell kOldwel
+cole kOl
+cole's kOlz
+colebank kOlbaNk
+colebrook kOlbrqk
+coleco kOlek]
+coleco's kOlek]z
+colee kOlE
+coleen k{lEn
+colegrove kOlgrOv
+colella kOlel@
+colello kOlel]
+coleman kOlm~
+coleman's kOlm~z
+colen kOl~
+coler kOlP
+coleridge kOlr6j
+coles kOlz
+coleslaw kOlslo
+coleson kol@s~
+coleson kols~
+colestipol kOlstipol
+colestock kOlstok
+coletta k]let@
+colette k]let
+coletti k]let/
+coleus kOl/@s
+coleville kOlvil
+coley kOl/
+colfer kOlfP
+colford kOlfPd
+colgan kOlg~
+colgate kOlgAt
+colgate's kOlgAts
+colgin kOljin
+colglazier kOlgl@z/P
+colgrove kOlgr@v
+coli kOl/
+colicchio kOlik/]
+colier kOl/P
+colin kOlin
+colina k]lEn@
+colinas k]lEn@s
+coline k]lEn/
+colino k]lEn]
+colis kOlis
+coliseum kol@sE}
+coll kol
+colla kOl@
+collaborate k@labPAt
+collaborated k@labPAt@d
+collaborating k@labPAt6N
+collaboration k@labPAS~
+collaborations kol@bPAS~z
+collaborative k@labPAt6v
+collaborative(20 k@labr@t6v
+collaborator k@labPAtP
+collaborators k@labPAtPz
+collado k]lod]
+collage k@loZ
+collagen kol@g~
+collages k@loZ@z
+collamore k]lom{r
+collapse k@laps
+collapsed k@lapst
+collapses k@laps@z
+collapsible k@laps@b@l
+collapsing k@laps6N
+collar kolP
+collarbone kolPbOn
+collard kolPd
+collards kolPdz
+collared kolPd
+collars kolPz
+collate k@lAt
+collateral k@latP@l
+collateralize k@latP@lIz
+collateralized k@latP@lIzd
+collazo k]loz]
+colle kOl
+colleague kol/g
+colleague's kol/gz
+colleagues kol/gz
+colleagues' kol/gz
+collect k@lekt
+collected k@lekt@d
+collectibility k@lekt@bil@t/
+collectible k@lekt@b@l
+collectibles k@lekt@b@lz
+collecting k@lekt6N
+collection k@lekS~
+collections k@lekS~z
+collective k@lekt6v
+collectively k@lekt6vl/
+collectives k@lekt6vz
+collectivism k@lekt6viz}
+collectivist k@lekt6vist
+collectivization k@lekt6v@zAS~
+collectivize k@lekt6vIz
+collectivized k@lekt6vIzd
+collector k@lektP
+collector klektP
+collector's k@lektPz
+collector's klektPz
+collectors k@lektPz
+collectors klektPz
+collectors' k@lektPz
+collectors' klektPz
+collects k@lekts
+colledge kol6j
+colleen kolEn
+college kol6j
+college's kol6j@z
+colleges kol6j@z
+colleges' kol6j@z
+collegeville kol@jvil
+collegial k@lEj/@l
+collegiality k@lEj/al@t/
+collegian k@lEj~
+collegians k@lEj~z
+collegiate k@lEj@t
+collen kol~
+collender kol~dP
+coller kolP
+colleran kolPan
+collet kol@t
+collett kolct
+colletta k]let@
+collette k@let
+colletti k]let/
+colleville kOlvil
+colleville's kOlvilz
+colley kol/
+colli kOl/
+collick kol6k
+collide k@lId
+collided k@lId@d
+collider k@lIdP
+collides k@lIdz
+colliding k@lId6N
+collie kol/
+collier kolyP
+collier's kolyPz
+colliers kolyPz
+collies kol/z
+colligan kol6gan
+collignon k@lign~
+collin kolin
+colling kol6N
+collinge kolinj
+collings kol6Nz
+collingsworth k@liNzwPT
+collingwood kol6Nwqd
+collins kolinz
+collins' kolinz
+collins's kolinz
+collins's kolinz@z
+collinson kolins~
+collinsworth k@linswPT
+collis kolis
+collision k@liZ~
+collisional k@liZ~@l
+collisions k@liZ~z
+collison kol@s~
+collister kol@stP
+colliver kol6vP
+collman kolm~
+collodion k@lOd/~
+colloid kol<d
+colloidal k@l<d@l
+collom kol}
+collomb kolom
+collopy k@lOp/
+colloquial k@lOkw/@l
+colloquium k@lOkw/}
+colloquy kol@kw/
+collor kolP
+collor's kolPz
+collosio k@lOs/]
+collosio's k@lOs/]z
+collude k@lUd
+colluded k@lUd@d
+colluding k@lUd6N
+collum kol}
+collums kol}z
+collura kolqr@
+collusion k@lUZ~
+collusive k@lUs6v
+collver kolvP
+colly kol/
+collyer kol/P
+colman kOlm~
+colmenero k]lmAn,r]
+colmer kOmP
+colo kOl]
+colodny k@lodn/
+cologne k@lOn
+coloma kOlOm@
+colomb kol}
+colombari kolomb)r/
+colombe k]lOmb/
+colombia k@lumb/@
+colombia's k@lumb/@z
+colombian k@lumb/~
+colombians k@lumb/~z
+colombo k@lumb]
+colon kOl~
+colonel kVn@l
+colonel's kVn@lz
+colonels kVn@lz
+colonia k@lOn/@
+colonial k@lOn/@l
+colonial's k@lOn/@lz
+colonialism k@lOn/@liz}
+colonialist k@lOn/@l@st
+colonialists k@lOn/@l@s
+colonialists k@lOn/@l@ss
+colonialists k@lOn/@l@sts
+colonials k@lOn/@lz
+colonies kol~/z
+colonist kol~@st
+colonists kol~@s
+colonists kol~@ss
+colonists kol~@sts
+colonization kol~@zAS~
+colonize kol~Iz
+colonized kol~Izd
+colonizer kol~IzP
+colonizers kol~IzPz
+colonna k]lOn@
+colonnade kol~Ad
+colonus k@lOn@s
+colony kol~/
+colony's kol~/z
+colopy k@lOp/
+color kulP
+color k{lP
+coloradan kolPod~
+coloradans kolPod~z
+colorado kolPad]
+colorado kolPod]
+colorado's kolPad]z
+colorado's kolPod]z
+coloration kulPAS~
+coloratura k@lP@tqr@
+colorblind kulPblInd
+colorcraft kulPkraft
+colored kulPd
+coloreds kolP@dz
+colorfast kulPfast
+colorful kulPf@l
+colorfully kulPfl/
+coloring kulP6N
+coloristic kulPist6k
+colorization kulP@zAS~
+colorize kulPIz
+colorized kulPIzd
+colorizing kulPIz6N
+colorless kulPl@s
+colorocs kulPoks
+coloroll kulPOl
+colors kulPz
+colorwatch kulPwoC
+colosi k@lOs/
+colosimo k]l]sEm]
+colosio k@lOs/]
+colosio's k@lOs/]z
+colossal k@los@l
+colossally k@los@lE
+colosseum kol@sE}
+colossus k@los@s
+coloured kulPd
+colpepper kulpepP
+colpitts kOlpits
+colquitt kOlkwit
+colson kOls~
+colston kOlst~
+colstrip kOlstr@p
+colt kOlt
+colt's kOlts
+coltec kOltek
+colter kOltP
+coltharp kOlTorp
+coltie kOlt/
+colton kOlt~
+coltrain kOltrAn
+coltrane kOltr~
+coltrane's kOltr~z
+coltrin kOltrin
+colts kOlts
+coltsfoot kOltsfqt
+colucci k]lUC/
+coluccio k]lUC/]
+columba kOlumb@
+columbia k@lumb/@
+columbia's k@lumb/@z
+columbian kOlumb/~
+columbians kOlumb/~z
+columbine kol}bIn
+columbines kol}bInz
+columbo kOlumb]
+columbus k@lumb@s
+columbus' k@lumb@s
+columbus's k@lumb@s@z
+column kol}
+columned kol}d
+columnist kol}n@st
+columnists kol}n@s
+columnists kol}n@ss
+columnists kol}n@sts
+columns kol}z
+colunga k]lUNg@
+colussy k@lUs/
+colvard kolvPd
+colver kOlvP
+colvert kolvPt
+colville kolvil
+colvin kOlvin
+colwell kOlwel
+colyer kOl/P
+com kom
+com's komz
+coma kOm@
+comair kom,r
+coman kOm~
+comanche k}anC/
+comanches k}anC/z
+comandante kOm~dontA
+comandantes kOm~dontcz
+comarco k]m)rk]
+comas kOm@z
+comatose kOm@tOs
+comb kOm
+combat kombat
+combat k}bat
+combatant k}bat~t
+combatants k}bat~ts
+combating k}bat6N
+combative kombativ
+combative k}bat6v
+combativeness k}bat6vn@s
+combats k}bats
+combatting k}bat6N
+combe kOm
+combed kOmd
+combee kombE
+comber kOmP
+combes kOmz
+combest kOm@st
+combinability kumb~@bil@t/
+combinability k}bIn@bil@t/
+combinable k}bIn@b@l
+combination komb~AS~
+combinations komb~AS~z
+combine kombIn
+combine k}bIn
+combined k}bInd
+combines k}bInz
+combing kOm6N
+combining k}bIn6N
+combo kombO
+combs kOmz
+combust k}bust
+combustable k}bust@b@l
+combustion k}busC~
+comcast komkast
+comcast's komkasts
+comdata komdAd@
+comdata komdad@
+comden komdin
+comdex komd@ks
+comdisco komdisk]
+come kum
+come-on kumon
+come-ons kumonz
+comeau k}O
+comeaux k}O
+comeback kumbak
+comebacks kumbaks
+comecon kom@kon
+comedian k}Ed/~
+comedian's k}Ed/~z
+comedians k}Ed/~z
+comedic k}Ed6k
+comedienne k}Ed/en
+comedies kom@d/z
+comedown kumd?n
+comedy kom@d/
+comedy's kom@d/z
+comegys kom6j/z
+comella k]mel@
+comely kuml/
+comer kumP
+comerford k}VfPd
+comerica k},r6k@
+comers kumPz
+comes kumz
+comet kom@t
+comet's kom@ts
+cometary kom@ter/
+cometh kumiT
+cometra k]metr@
+comets kom@ts
+comeuppance kumup~s
+comex komeks
+comex's komeks@z
+comfed komfed
+comfinance komf~~s
+comfort kumfPt
+comfortable kumfPt@b@l
+comfortably kumfPt@bl/
+comforted kumfPt@d
+comforter kumfPtP
+comforters kumfPtPz
+comforting kumfPt6N
+comforts kumfPts
+comfrey kumfr/
+comfy kumf/
+comic kom6k
+comical kom6k@l
+comically kom6k@l/
+comically kom6kl/
+comicopia kom6kOp/@
+comics kom6ks
+comin' kum~
+cominco k]miNk]
+coming kum6N
+comings kum6Nz
+comino k}En]
+comins kOm~z
+cominsky k}insk/
+comiskey kOmiskE
+comitatus k{m@tAt@s
+comito k]mEt]
+comity kOmit/
+comley koml/
+comly koml/
+comma kom@
+commack kom@k
+command k}and
+command's k}andz
+commandant kom~dont
+commanded k}and@d
+commandeer kom~dir
+commandeered kom~dird
+commander k}andP
+commander's k}andPz
+commanders k}andPz
+commanding k}and6N
+commandment k}andm~t
+commandments k}andm~ts
+commando k}andO
+commandos k}andOz
+commands k}andz
+commas kom@z
+commemorate k}emPAt
+commemorated k}emPAt@d
+commemorates k}emPAts
+commemorating k}emPAt6N
+commemoration k}emPAS~
+commemorations k}emPAS~z
+commemorative k}emPAt6v
+commemorative k}emr@t6v
+commence k}ens
+commenced k}enst
+commencement k}ensm~t
+commences k}ens@z
+commencing k}ens6N
+commend k}end
+commendable k}end@b@l
+commendation kom~dAS~
+commended k}end@d
+commending k}end6N
+commends k}endz
+commensurate k}enSP@t
+commensurate k}ensP@t
+commensurately k}enSP@tl/
+commensurately k}ensP@tl/
+comment komcnt
+commentaries kom~ter/z
+commentary kom~ter/
+commentator kom~tAtP
+commentator's kom~tAtPz
+commentators kom~tAtPz
+commented komcnt@d
+commenter komcntP
+commenters komcntPz
+commenting komcnt6N
+comments komcnts
+commerce komPs
+commerce's komPs@z
+commercebancorp komPsbank{rp
+commercial k}VS@l
+commercial's k}VS@lz
+commerciale k}Vs/al
+commerciale's k}Vs/alz
+commercialism k}VS@liz}
+commercialization k}VS@l@zAS~
+commercialize k}VS@lIz
+commercialized k}VS@lIzd
+commercializing k}VS@lIz6N
+commercially k}VS@l/
+commercials k}VS@lz
+commerford komPfPd
+commerical k}VS@l
+commerzbank komPzbaNk
+commerzbank's komPzbaNks
+commie kom/
+commies kom/z
+commingle k]miNg@l
+commingle k}iNg@l
+commingled k]miNg@ld
+commingled komiNg@ld
+commingling k]miNg@l6N
+commingling k]miNgl6N
+commingling komiNg@l6N
+commins kominz
+commiserate k}isPAt
+commish k}iS
+commision k}iS~
+commision k}iz~
+commissar kom@sor
+commissaries kom@ser/z
+commissars kom@soz
+commissary kom@ser/
+commission k}iS~
+commission's k}iS~z
+commissioned k}iS~d
+commissioner k}iS~P
+commissioner's k}iS~Pz
+commissioners k}iS~Pz
+commissioning k}iS~6N
+commissions k}iS~z
+commisso k]mEs]
+commit k}it
+commitee komit/
+commitee k}it/
+commitment k}itm~t
+commitments k}itm~ts
+commits k}its
+committal k}it@l
+committed k}it@d
+committee k}it/
+committee's k}it/z
+committeeman k}it/m~
+committees k}it/z
+committees' k}it/z
+committing k}it6N
+commode k}Od
+commodious k}Od/@s
+commodities k}od@t/z
+commodity k}od@t/
+commodity's k}od@t/z
+commodore kom@d{r
+commodore's kom@d{rz
+common kom~
+commonalities kom~al@t/z
+commonality kom~al@t/
+commoner kom~P
+commoners kom~Pz
+commonly kom~l/
+commonplace kom~plAs
+commons kom~z
+commonsense kom~sens
+commonsensical kom~sens@k@l
+commonwealth kom~welT
+commonwealth's kom~welTs
+commotion k}OS~
+communal k}yUn@l
+commune komyUn
+commune k}yUn
+communes komyUnz
+communes k}yUnz
+communicable k}yUn@k@b@l
+communicate k}yUn@kAt
+communicated k}yUn@kAt@d
+communicates k}yUn6kAts
+communicating k}yUn@kAt6N
+communication k}yUn@kAS~
+communication's k}yUn6kAS~z
+communications k}yUn@kAS~z
+communications' k}yUn@kAS~z
+communicative k}yUn@k@t6v
+communicator k}yUn@kAtP
+communicators k}yUn@kAtPz
+communion k}yUny~
+communique k}yUn@kA
+communique k}yUn@kA
+communiques k}yUn6kAz
+communism komy~iz}
+communism's komy~iz}z
+communist komy~@st
+communist's komy~@sts
+communists komy~@s
+communists komy~@ss
+communists komy~@sts
+communists' komyUn@sts
+communities k}yUn@t/z
+community k}yUn@t/
+community's k}yUn@t/z
+communitywide k}yUn@t/wId
+communization komy~@zAS~
+communize komy~Iz
+commute k}yUt
+commuted k}yUt@d
+commuter k}yUtP
+commuters k}yUtPz
+commutes k}yUts
+commuting k}yUt6N
+como kOm]
+comp komp
+compact kompakt
+compact k}pakt
+compacted k}pakt@d
+compactness k}paktn@s
+compactor k}paktP
+compacts kompakts
+compacts k}pakts
+compagnie kump~/
+companhia k}panh/@
+compania k}pAn/@
+companies kump~/z
+companies' kump~/z
+companies's kump~/z@z
+companion k}pany~
+companions k}pany~z
+companionship k}pany~Sip
+companionway k}pany~wA
+company kump~/
+company's kump~/z
+companywide kump~/wId
+compaq kompak
+compaq's kompaks
+comparability kompP@bil@t/
+comparable kompP@b@l
+comparable k}p,r@b@l
+comparable k}pr@b@l
+comparably kompP@bl/
+comparably kompr@bl/
+comparative k}p,r@t6v
+comparatively k}p,r@t6vl/
+comparator k}pV@tP
+compare k}p,r
+compared k}p,rd
+compares k}p,rz
+comparing k}p,r6N
+comparison k}p,r@s~
+comparisons k}p,r@s~z
+compartment k}p)rtm~t
+compartmental k}portment@l
+compartmentalize k}portment@lIz
+compartmentalized komportment@lIzd
+compartments k}p)rtm~ts
+compas komp@s
+compass kump@s
+compassion k}paS~
+compassionate k}paS~@t
+compassionately k}paS~@tl/
+compatibility k}pat@bil@t/
+compatible k}pat@b@l
+compatibles k}pat@b@lz
+compatriot k}pAtr/@t
+compatriots k}pAtr/@ts
+compean komp~
+compeau k}pO
+compel k}pel
+compelled k}peld
+compelling k}pel6N
+compellingly k}pel6Nl/
+compels k}pelz
+compendium k}pend/}
+compensable k}pens@b@l
+compensate komp~sAt
+compensated komp~sAt@d
+compensates komp~sAts
+compensating komp~sAt6N
+compensation komp~sAS~
+compensations komp~sAS~z
+compensatory k}pens@t{r/
+compete k}pEt
+competed k}pEt@d
+competence komp@t~s
+competencies komp@t~s/z
+competency komp@t~s/
+competent komp@t~t
+competently komp@t~tl/
+competes k}pEts
+competing k}pEt6N
+competition komp@tiS~
+competition's komp@tiS~z
+competitions komp@tiS~z
+competitive k}pet@t6v
+competitively k}pet@t6vl/
+competitiveness k}pet@t6vn@s
+competitor k}pet@tP
+competitor's k}pet@tPz
+competitors k}pet@tPz
+competitors' k}pet@tPz
+compher komfP
+compilation komp@lAS~
+compilations komp@lAS~z
+compile k}pIl
+compiled k}pIld
+compiler k}pIlP
+compilers k}pIlPz
+compiles k}pIlz
+compiling k}pIl6N
+complacency k}plAs~s/
+complacent k}plAs~t
+complacently k}plAs~tl/
+complain k}plAn
+complainant k}plAn~t
+complainants k}plAn~ts
+complained k}plAnd
+complainer k}plAnP
+complainers komplAnPz
+complaining k}plAn6N
+complains k}plAnz
+complaint k}plAnt
+complaints k}plAnts
+complaisant k}plAs~t
+complement kompl}~t
+complementary kompl}enC/
+complementary kompl}entr/
+complemented kompl}ent@d
+complementing kompl}ent6N
+complements kompl}~ts
+complete k}plEt
+completed k}plEt@d
+completely k}plEtl/
+completeness k}plEtn@s
+completes k}plEts
+completing k}plEt6N
+completion k}plES~
+completions k}plES~z
+complex komplcks
+complex k}pleks
+complexes komplcks@z
+complexion k}pekS~
+complexions k}pekS~z
+complexities k}pleks@t/z
+complexity k}pleks@t/
+compliance k}plI~s
+compliant k}plI~t
+complicate kompl@kAt
+complicated kompl@kAt@d
+complicates kompl6kAts
+complicating kompl@kAt6N
+complication kompl@kAS~
+complications kompl@kAS~z
+complicit k}plis@t
+complicity k}plis@t/
+complied k}plId
+complies k}plIz
+compliment kompl}cnt
+complimentary kompl}entP/
+complimented kompl}ent@d
+complimenting kompl}ent6N
+compliments kompl}cnts
+comply k}plI
+complying k}plI6N
+compo kompO
+component k}pOn~t
+components k}pOn~ts
+comport k}p{rt
+comportment k}p{rtm~t
+compose k}pOz
+composed k}pOzd
+composer k}pOzP
+composer's k}pOzPz
+composers k}pOzPz
+composes k}pOz@z
+composing k}pOz6N
+composite kompoz@t
+composite k}poz@t
+composite's kompoz@ts
+composite's k}poz@ts
+composites kompoz@ts
+composites k}poz@ts
+composition komp@ziS~
+compositional komp@ziS~@l
+compositions komp@ziS~z
+compost komp]st
+composting kompOst6N
+composure k}pOZP
+compote komp]t
+compound komp?nd
+compound k}p?nd
+compounded k}p?nd@d
+compounded k}p?nd@d
+compounding k}p?nd6N
+compounds komp?ndz
+compounds k}p?ndz
+comprehend kompr/hend
+comprehended kompr@hend@d
+comprehending kompr@hend6N
+comprehensibility kompr/hens@bil@t/
+comprehensible kompr/hens@b@l
+comprehension kompr/henS~
+comprehensive kompr/hens6v
+comprehensively kompr@hens6vl/
+compress komprcs
+compress k}pres
+compressed k}prest
+compresses komprcs@z
+compresses k}pres@z
+compressing k}pres6N
+compression k}preS~
+compressor k}presP
+compressors k}presPz
+comprint komprint
+comprise k}prIz
+comprised k}prIzd
+comprises k}prIz@z
+comprising k}prIz6N
+compromise kompr}Iz
+compromised kompr}Izd
+compromiser kompr}IzP
+compromises kompr}Iz@z
+compromising kompr}Iz6N
+compston kompst~
+comptek komptek
+compton kompt~
+compton's kompt~z
+comptroller kontrOlP
+comptroller k~trOlP
+comptroller's komtrOlPz
+comptroller's k~trOlPz
+comptronix komptroniks
+compuadd kompyUad
+compuchem kompyUkem
+compudyne kompyUdIn
+compufund kompyUfund
+compugraphic kompyUgraf6k
+compulsion k}pulS~
+compulsions k}pqlS~z
+compulsive k}puls6v
+compulsively k}puls6vl/
+compulsory k}pulsP/
+compumat kompyUmat
+compunction k}puNkS~
+compusa kompyUesA
+compusa's kompyUesAz
+compuserve kompyUsPv
+compuserve's kompyUsPvz
+computalog kompyUtal{g
+computation kompy@tAS~
+computational kompyUtAS~@l
+computations kompyUtAS~z
+compute k}pyUt
+computed k}pyUt@d
+computer k}pyUtP
+computer's k}pyUtPz
+computercraft k}pyUtPkraft
+computerization k}pyUtP@zAS~
+computerize k}pyUtPIz
+computerized k}pyUtPIzd
+computerizing k}pyUtPIz6N
+computerland k}pyUtPland
+computerland's k}pyUtPlandz
+computerlike k}pyUtPlIk
+computers k}pyUtPz
+computers' k}pyUtPz
+computervision k}pyUtPviZ~
+computerworld k}pyUtPwVld
+computes k}pyUts
+computing k}pyUt6N
+computrac kompyUtrak
+compuware kompyUwer
+comrade komrad
+comrades komradz
+comrie komP/
+coms komz
+comsat komsat
+comsat's komsats
+comstock komstok
+comtois k}two
+comtrex komtreks
+comunale k]mUnol/
+con kon
+cona kOn@
+conable kOn@b@l
+conable's kOn@b@lz
+conagra konagr@
+conagra's konagr@z
+conahan kon@han
+conair koner
+conal kOn@l
+conan kOn~
+conant kOn~t
+conant-pablos kOn~tpobl]s
+conard konPd
+conasupo kon@sUp]
+conatser kon@tsP
+conaty kon@t/
+conaway kon@wA
+conboy konb<
+conca koNk@
+concannon k~kan~
+concatenate k~kat~At
+concatenation k~kat~AS~
+concave konkAv
+concave konkAv
+conceal k~sEl
+concealed k~sEld
+concealing k~sEl6N
+concealment k~sElm~t
+conceals k~sElz
+concede k~sEd
+conceded k~sEd@d
+concedes k~sEdz
+conceding k~sEd6N
+conceit k~sEt
+conceited k~sEt@d
+conceivable k~sEv@b@l
+conceivably k~sEv@bl/
+conceive k~sEv
+conceived k~sEvd
+conceiving k~sEv6N
+concentrate kons~trAt
+concentrated k{ns~trAt@d
+concentrates kons~trAts
+concentrating kons~trAt6N
+concentration kons~trAS~
+concentrations kons~trAS~z
+concentric k~sentr6k
+concepcion k~seps/On
+concept konscpt
+conception k~sepS~
+conceptions k~sepS~z
+concepts konscps
+concepts konscpts
+conceptual k~sepCU@l
+conceptualization k~sepCw@l@zAS~
+conceptually k~sepCU@l/
+concern k~sVn
+concern's k~sVnz
+concerned k~sVnd
+concerning k~sVn6N
+concerns k~sVnz
+concerns' k~sVnz
+concert konsPt
+concert k~sVt
+concerted k~sVt@d
+concerti k~C,rt/
+concertina konsPtEn@
+concertmaster konsPtmastP
+concerto k~C,rt]
+concertos k~C,rt]z
+concerts konsPts
+concerts k~sVts
+concession k~seS~
+concessionaire k~seS~,r
+concessional k~seS~@l
+concessionary k~seS~er/
+concessions k~seS~z
+conch koNk
+conch konC
+concha konC@
+conchemco konCemk]
+conchita k~CEt@
+concierge kons/,rZ
+conciliation k~sil/AS~
+conciliator k~sEl/AtP
+conciliator's k~sil/AtPz
+conciliatory k~silE@t{r/
+concise k~sIs
+concisely k~sIsl/
+conclave konklAv
+conclude k~klUd
+concluded k~klUd@d
+concludes k~klUdz
+concluding k~klUd6N
+conclusion k~klUZ~
+conclusions k~klUZ~z
+conclusive k~klUs6v
+conclusively k~klUs6vl/
+concoct k~kokt
+concocted k~kokt@d
+concocting k~kokt6N
+concoction k~kokS~
+concoctions k~kokS~z
+concomitant konkom@t~t
+concomitantly konkom@t~tl/
+concord konkPd
+concord konk{rd
+concord's konkPdz
+concord's konk{rdz
+concorde konk{rd
+concourse konk{rs
+concourses konk{rs@z
+concrete konkr/t
+concrete k~krEt
+concretely konkrEtl/
+concubinage konkyUb~@j
+concubine konky@bIn
+concubines konky@bInz
+concur k~kV
+concurred k~kVd
+concurrence k~kV~s
+concurrent k~kV~t
+concurrently k~kV~tl/
+concurring k~kV6N
+concurs k~kVz
+concussion k~kuS~
+concussions k~kuS~z
+conde kond
+condello k~del]
+condemn k~dem
+condemnation kond}nAS~
+condemnations kond}nAS~z
+condemned k~demd
+condemning k~dem6N
+condemns k~demz
+condensate kond~sAt
+condensates kond~sAts
+condensation kond~sAS~
+condense k~dens
+condensed k~denst
+condenser k~densP
+condensing k~dens6N
+conder kondP
+condescend kond@send
+condescending kond@send6N
+condescension kond@senS~
+condie kond/
+condiment kond}~t
+condiments kond}~ts
+condit kondit
+condition k~diS~
+conditional k~diS~@l
+conditionality k~diS~al@t/
+conditionally k~diSn@l/
+conditionally k~diS~@l/
+conditioned k~diS~d
+conditioner k~diS~P
+conditioners k~diS~Pz
+conditioning k~diS~6N
+conditions k~diS~z
+conditt kondit
+condo kond]
+condolence k~dOl~s
+condolences k~dOl~s@z
+condom kond}
+condominium kond}in/}
+condominiums kond}in/}z
+condoms kond}z
+condon kond~
+condone k~dOn
+condoned k~dOnd
+condones k~dOnz
+condoning k~dOn6N
+condor kondP
+condors kondPz
+condos kond]z
+condra kondr@
+condracky kondrak/
+condracky's kondrak/z
+condray kondrA
+condren kondP~
+condrey kondr/
+condron kondr~
+condry kondP/
+conducive k~dUs6v
+conduct kond@kt
+conduct k~dukt
+conducted k~dukt@d
+conducting k~dukt6N
+conduction k~dukS~
+conductive k~dukt6v
+conductivity konduktiv@t/
+conductor k~duktP
+conductors k~duktPz
+conducts k~dukts
+conduit kondUit
+conduit kondwit
+conduit konjUit
+conduits kondU@ts
+conduits kondwits
+cone kOn
+cone's kOnz
+coneflower kOnfl?P
+conehead kOnhcd
+coneheads kOnhcdz
+conely kOnl/
+conerly kOnPl/
+conery kOnP/
+cones kOnz
+conestoga kon@stOg@
+coney kOn/
+confabulation k~faby@lAS~
+confair konfer
+confect k~fekt
+confection k~fekS~
+confectionaries k~fekS~er/z
+confectionary k~fekS~er/
+confectioner k~fekS~P
+confectioners k~fekS~Pz
+confectionery k~fekS~er/
+confections k~fekS~z
+confederacy k~fedP@s/
+confederacy's k~fedP@s/z
+confederate k~fedP@t
+confederate k~fedPAt
+confederation k~fedPAS~
+confer k~fV
+conferee konfPE
+conferees konfPEz
+conference konfP~s
+conference konfr~s
+conference's konfP~s@z
+conference's konfr~s@z
+conferences konfP~s@z
+conferences konfr~s@z
+conferencing konfr~s6N
+conferred k~fVd
+conferring k~fV6N
+confers k~fVz
+confess k~fes
+confessed k~fest
+confesses k~fes@z
+confessing k~fes6N
+confession k~feS~
+confessional k~feS~@l
+confessionals k~feS~@lz
+confessions k~feS~z
+confetti k~fet/
+confidant konf@dont
+confidante konf@dant
+confidants konf@dants
+confide k~fId
+confided k~fId@d
+confidence konf@d~s
+confidence's konf@d~s@z
+confidences konf@d~s@z
+confident konf@d~t
+confidential konf@denC@l
+confidential konf@denS@l
+confidentiality konf@denC/al@t/
+confidentiality konf@denS/al@t/
+confidentially konf@denC@l/
+confidentially konf@denS@l/
+confidently konf@d~tl/
+confides k~fIdz
+confiding k~fId6N
+configuration k~figyPAS~
+configurations k~figyPAS~z
+configure k~figyP
+configured k~figyPd
+configuring k~figyP6N
+confindustria konfindustr/@
+confine k~fIn
+confined k~fInd
+confinement k~fInm~t
+confines konfInz
+confines k~fInz
+confining k~fIn6N
+confirm k~fVm
+confirmable k~fVm@b@l
+confirmation konfPmAS~
+confirmations konfPmAS~z
+confirmatory k~fVm@t{r/
+confirmed k~fVmd
+confirming k~fVm6N
+confirms k~fVmz
+confiscate konf@skAt
+confiscated konf@skAt@d
+confiscating konf@skAt6N
+confiscation konf@skAS~
+confiscatory k~fisk@t{r/
+confiterias konf@tir/@z
+conflagration konfl@grAS~
+conflate k~flAt
+conflates k~flAts
+conflict konfl6kt
+conflict k~flikt
+conflicted k~flikt@d
+conflicting k~flikt6N
+conflicts konfl6ks
+conflicts konfl6kts
+conflicts k~fliks
+conflicts k~flikts
+confluence konflU~s
+confluent konflU~t
+conform k~f{rm
+conformance k~f{rm~s
+conformational konfPmAS~@l
+conformed k~f{rmd
+conforming k~f{rm6N
+conformist k~f{rmist
+conformists k~f{rm@s
+conformists k~f{rm@ss
+conformists k~f{rm@sts
+conformity k~f{rm@t/
+conforms k~f{rmz
+conforti konf{rt/
+confound konf?nd
+confound konf?nd
+confound k~f?nd
+confounded k~f?nd@d
+confounding k~f?nd6N
+confounds k~f?ndz
+confront k~frunt
+confrontation konfr~tAS~
+confrontational konfr~tAS~@l
+confrontations konfr~tAS~z
+confronted k~frun@d
+confronted k~frunt@d
+confronting k~frunt6N
+confronts k~frunts
+confucian k~fyUS~
+confucianism k~fyUS~iz}
+confucius k~fyUS@s
+confuse k~fyUz
+confused k~fyUzd
+confuses k~fyUz@z
+confusing k~fyUz6N
+confusingly k~fyUz6Nl/
+confusion k~fyUZ~
+confusions k~fyUZ~z
+cong k{N
+conga k{Ng@
+congdon koNd~
+congeal k~jEl
+congealed k~jEld
+congenial k~jEny@l
+congeniality k~jEn/al@t/
+congenital k~jen@t@l
+conger k{NP
+congest k~jest
+congested k~jest@d
+congestion k~jesC~
+congestive k~jest6v
+congleton koNg@lton
+conglomerate k~glomP@t
+conglomerate's k~glomP@ts
+conglomerates k~glomP@ts
+conglomeration k~glomPAS~
+congo koNg]
+congratulate k~graC@lAt
+congratulated k~graC@lAt@d
+congratulating k~graC@lAt6N
+congratulation k~graC@lAS~
+congratulations k~graC@lAS~z
+congratulatory k~graC@l@t{r/
+congregate koNgr@gAt
+congregated koNgr@gAt@d
+congregation koNgr@gAS~
+congregation's koNgr@gAS~z
+congregational koNgr@gAS~@l
+congregations koNgr@gAS~z
+congress koNgr@s
+congress' koNgr@s
+congress' kongr@s@z
+congress's koNgr@s@z
+congresses koNgr@s@z
+congressional k~greS~@l
+congressionally k~greS~@l/
+congressman koNgr@sm~
+congressman's koNgr@sm~z
+congressmen koNgr@smcn
+congresspeople koNgr@spEp@l
+congressperson koNgr@spVs~
+congresspersons koNgr@spVs~z
+congresswoman koNgr@swqm~
+congresswoman's koNgr@swqm~z
+congresswomen koNgr@swimcn
+congrove koNgr@v
+congruence k{ngrU~s
+congruity k~grU@t/
+conic kon6k
+conical kOn6k@l
+conical kon6k@l
+conics kon6ks
+conifer kon@fP
+conifer's kon@fPz
+coniferous k~ifP@s
+conifers kon@fPz
+conigliaro k~igl/)r]
+coniglio k~igl/]
+coniston kon@st~
+conjecture k~jekCP
+conjecture k~jekSP
+conjectures k~jekCPz
+conjoin konj<n
+conjoined konj<nd
+conjugal konj@g@l
+conjugate konj@gAt
+conjugate konj@gAt
+conjugated konj@gAt@d
+conjugated konj@gAt@d
+conjugates konj@gAts
+conjugates konj@gAts
+conjugation konj@gAS~
+conjugations konj@gAS~z
+conjul konj@l
+conjunction k~juNkS~
+conjunctions k~juNkS~z
+conjunctiva konj@NktIv@
+conjure konjP
+conjured konjPd
+conjures konjPz
+conjuring konjP6N
+conjuror konjPP
+conk koNk
+conkel koNk@l
+conkey konk/
+conkin koNkin
+conkle koNk@l
+conklin koNklin
+conkling koNkl6N
+conkright koNkrIt
+conlan konl~
+conlee konl/
+conley konl/
+conlin konlin
+conlon konl~
+conlow konl]
+conly konl/
+conn kon
+conn. kon
+conn. k~et@k@t
+connally kon@l/
+connally's kon@l/z
+connaught kon{t
+connaught's kon{ts
+connaughton kon{ton
+connaway kon@wA
+connect k~ekt
+connected k~ekt@d
+connecter k~ektP
+connecticut k~et@k@t
+connecticut's k~et@k@ts
+connecting k~ekt6N
+connection k~ekS~
+connections k~ekS~z
+connective k~ekt6v
+connectivity k~cktiv@t/
+connector k~ektP
+connectors k~ektPz
+connects k~ekts
+conned kond
+conneely k~El/
+connell kon@l
+connelley kon@l/
+connelly kon@l/
+connelly's kon@l/z
+connely konl/
+conner konP
+conner's konPz
+connerly konPl/
+conners konPz
+connery konP/
+connery's konP/z
+connett konct
+connick kon6k
+connie k{n/
+connie's k{n/z
+conniff konif
+conning kon6N
+conniption k~ipS~
+connivance k~Iv~s
+connive k~Iv
+conniving k~Iv6N
+connoisseur kon@sV
+connoisseurs kon@sVz
+connole kon@l
+connolly k{n@l/
+connon kon~
+connor konP
+connors konPz
+connotation kon@tAS~
+connotational kon@tAS~@l
+connotations kon@tAS~z
+connote k~Ot
+connotes k~Ots
+conny kon/
+conoco kon@k]
+conoco k~ok]
+conoco's kon@k]z
+conolly kon]l/
+conoly kon]l/
+conover kon@vP
+conquer koNkP
+conquered koNkPd
+conquering koNkP6N
+conqueror koNkPP
+conqueror's koNkPPz
+conquerors koNkPPz
+conquers koNkPz
+conquest koNkwcst
+conquest's koNkwcsts
+conquests konkwes
+conquests konkwess
+conquests konkwests
+conrac konrak
+conrad konrad
+conrad's konradz
+conrades k~rAdz
+conradi konrod/
+conradine konr@dIn
+conrads konradz
+conradt konrat
+conrady k~rod/
+conrail konrAl
+conrail's konrAlz
+conran konr~
+conrath konr@T
+conrey konr/
+conroe konr]
+conrow konr]
+conroy k{nr<
+conry konr/
+cons konz
+consalvo konsolv]
+conscience konS~s
+consciences konS~s@z
+conscientious konS/enS@s
+conscientiously konC/enC@sl/
+conscious konS@s
+consciously konS@sl/
+consciousness konS@sn@s
+conscript konskript
+conscript k~skript
+conscripted k~skript@d
+conscription k~skripS~
+conscripts konskripts
+conseco konsAk]
+conseco k~sAk]
+conseco's konsAk]z
+conseco's k~sAk]z
+consecrate kons@krAt
+consecrated kons@krAt@d
+consecration kons@krAS~
+consecrations kons@krAS~z
+consecutive k~seky@t6v
+consecutively k~seky@t6vl/
+consensual k~senSU@l
+consensual k~sensU@l
+consensus k~sens@s
+consent k~sent
+consented k~sen@d
+consented k~sent@d
+consenting k~sen6N
+consenting k~sent6N
+consentino konscntEn]
+consents k~sents
+consequence kons@kw~s
+consequences kons@kwens@z
+consequent kons@kw~t
+consequential kons@kwenC@l
+consequently kons@kwentl/
+consequently kons@kw~tl/
+conser konsP
+conservancy k~sVv~s/
+conservancy's k~sVv~s/z
+conservation konsPvAS~
+conservationist konsPvAS~@st
+conservationists konsPvAS~@s
+conservationists konsPvAS~@ss
+conservationists konsPvAS~@sts
+conservatism k~sVv@tiz}
+conservative k~sVv@t6v
+conservatively k~sVv@t6vl/
+conservatives k~sVv@t6vz
+conservatives' k~sVv@t6vz
+conservativism k~sVv@t6viz}
+conservator k~sVv@tP
+conservatories k~sVv@t{r/z
+conservators k~sVv@tPz
+conservatorship k~sVv@tPSip
+conservatory k~sVv@t{r/
+conserve k~sVv
+conserved k~sVvd
+conserving k~sVv6N
+conshohocken konS@hok~
+consider k~sidP
+considerable k~sidP@b@l
+considerably k~sidP@bl/
+considerate k~sidP@t
+consideration k~sidPAS~
+considerations k~sidPAS~z
+considered k~sidPd
+considering k~sidP6N
+considers k~sidPz
+considine kons@dIn
+consiglio konsEgl/]
+consign k~sIn
+consigned k~sInd
+consignment k~sInm~t
+consist k~sist
+consisted k~sist@d
+consistence k~sist~s
+consistency k~sist~s/
+consistent k~sist~t
+consistently k~sist~tl/
+consisting k~sist6N
+consists k~sis
+consists k~siss
+consists k~sists
+consob konsob
+consol konsol
+consol's konsolz
+consolata kons]lot@
+consolation kons@lAS~
+consolations kons@lAS~z
+console kons]l
+console k~sOl
+consoled k~sOld
+consoles k~sOlz
+consoli konsOl/
+consolidate k~sol@dAt
+consolidated k~sol@dAt@d
+consolidated's k~sol@dAt@dz
+consolidates k~sol@dAts
+consolidating k~sol@dAt6N
+consolidation k~sol@dAS~
+consolidations k~sol@dAS~z
+consolidator k~sol@dAtP
+consolidators k~sol@dAtPz
+consoling k~sOl6N
+consolo konsOl]
+consonant kons~~t
+consonantal kons~on@l
+consonantal kons~ont@l
+consonants kons~~ts
+consort k~s{rt
+consortia k~s{rS@
+consorting k~s{rt6N
+consortium k~s{rS/}
+consortium k~s{rSy}
+consortium's k~s{rS/}z
+consortium's k~s{rSy}z
+consortiums k~s{rS/}z
+consortiums k~s{rSy}z
+conspicuous k~spikyU@s
+conspicuously k~spikyU@sl/
+conspiracies k~spir@s/z
+conspiracy k~spir@s/
+conspirator k~spir@tP
+conspiratorial k~spir@t{r/@l
+conspiratorially k~spir@t{r/@l/
+conspiratorially k~spir@t{ry@l/
+conspirators k~spir@tPz
+conspire k~spIP
+conspired k~spIPd
+conspiring k~spIr6N
+constable konst@b@l
+constables konst@b@lz
+constabulary k~staby@ler/
+constance konst~s
+constancy konst~s/
+constant konst~t
+constant's konst~ts
+constanta konstont@
+constantin k~stantin
+constantina konstontEn@
+constantine konst~tEn
+constantine konst~tIn
+constantino konst~tEn]
+constantinople konstant~Op@l
+constantinos konst~tEn]s
+constantly konst~tl/
+constants konst~ts
+constar konstor
+constellation konst@lAS~
+constellation's konst@lAS~z
+constellations konst@lAS~z
+consternation konstPnAS~
+constipate konst@pAt
+constipated konst@pAt@d
+constipation konst@pAS~
+constituencies k~stiCU~s/z
+constituency k~stiCU~s/
+constituent k~stiCU~t
+constituents k~stiCU~ts
+constituents' k~stiCU~ts
+constitute konst@tUt
+constituted konst@tUt@d
+constitutes konst@tUts
+constituting konst@tUt6N
+constitution konst@tUS~
+constitution's konst@tUS~z
+constitutional konst@tUS~@l
+constitutionality konst@tUS~al@t/
+constitutionally konst@tUS~@l/
+constitutionist konst@tUS~@st
+constitutionists konst@tUS~@s
+constitutionists konst@tUS~@ss
+constitutionists konst@tUS~@sts
+constitutions konst@tUS~z
+constrain k~strAn
+constrained k~strAnd
+constraining k~strAn6N
+constrains k~strAnz
+constraint k~strAnt
+constraints k~strAnts
+constrict k~strikt
+constricted k~strikt@d
+constricting k~strikt6N
+constriction k~strikS~
+constrictions k~strikS~z
+constrictor k~striktP
+constrictors k~striktPz
+construcciones k~strUC/OnAz
+construct konstr@kt
+construct k~strukt
+constructed k~strukt@d
+constructing k~strukt6N
+construction k~strukS~
+constructionist k~strukS~ist
+constructions k~strukS~z
+constructive k~strukt6v
+constructively k~strukt6vl/
+constructor k~struktP
+constructors k~struktPz
+constructs konstr@kts
+constructs k~strukts
+construe k~strU
+construed k~strUd
+consuela k~swAl@
+consul kons@l
+consular kons@lP
+consulate kons@l@t
+consulates kons@l@ts
+consulship kons@lSip
+consult k~sult
+consultancy k~sult~s/
+consultant k~sult~t
+consultant's k~sult~ts
+consultants k~sult~ts
+consultants' k~sultunts
+consultation kons@ltAS~
+consultations kons@ltAS~z
+consultative k~sult@t6v
+consulted k~sult@d
+consulting k~sult6N
+consults k~sults
+consumable k~sUm@b@l
+consume k~sUm
+consumed k~sUmd
+consumer k~sUmP
+consumer's k~sUmPz
+consumerism k~sUmPiz}
+consumerist k~sUmPist
+consumerists k~sUmPis
+consumerists k~sUmPiss
+consumerists k~sUmPists
+consumers k~sUmPz
+consumers' k~sUmPz
+consumes k~sUmz
+consuming k~sUm6N
+consummate kons}@t
+consummate kons}At
+consummated kons}At@d
+consummating kons}At6N
+consummation kons}AS~
+consumption k~sumS~
+consumption k~sumpS~
+contac kontak
+contact kontakt
+contacted kontakt@d
+contacting kontakt6N
+contacts kontaks
+contacts kontakts
+contadora kont@d{r@
+contagion k~tAj~
+contagious k~tAj@s
+contagiousness k~tAj@sn@s
+contain k~tAn
+contained k~tAnd
+container k~tAnP
+container's k~tAnPz
+containerboard k~tAnPb{rd
+containerize k~tAnPIz
+containerized k~tAnPIzd
+containers k~tAnPz
+containers' k~tAnPz
+containing k~tAn6N
+containment k~tAnm~t
+contains k~tAnz
+contaminant k~tam~~t
+contaminants k~tam~~ts
+contaminate k~tam~At
+contaminated k~tam~At@d
+contaminates k~tam~Ats
+contaminating k~tam~At6N
+contamination k~tam~AS~
+contant kont~t
+conte k{nt
+conte k{ntA
+contel kontel
+contemplate kont}plAt
+contemplated kont}plAt@d
+contemplates kont}plAts
+contemplating kont}plAt6N
+contemplation kont}plAS~
+contemplative k~templ@t6v
+contempo kontemp]
+contemporaneous k~tempPAn/@s
+contemporaneously k~tempPAn/@sl/
+contemporaries k~tempPer/z
+contemporary k~tempPer/
+contempt k~tempt
+contemptible k~tempt@b@l
+contemptuous k~tempCU@s
+contemptuously k~tempCw@sl/
+contend k~tend
+contended k~tend@d
+contender k~tendP
+contenders k~tendPz
+contending k~tend6N
+contends k~tendz
+contends k~tenz
+content kontcnt
+content k~tent
+contented k~tent@d
+contentedly k~tent@dl/
+contention k~tenS~
+contentioned k~tenS~d
+contentions k~tenS~z
+contentious k~tenS@s
+contentiousness k~tenS@sn@s
+contentment k~tentm~t
+contento k~tent]
+contents kontcnts
+contents k~tents
+contest kontcst
+contest k~test
+contest's kontcsts
+contestable k~test@b@l
+contestant k~test~t
+contestants k~test~ts
+contested k~test@d
+contesting k~test6N
+contests kontcs
+contests kontcss
+contests kontcsts
+contests k~tes
+contests k~tess
+contests k~tests
+context kontckst
+contexts konteksts
+conti kont/
+contibel kont@b@l
+conticommodity kont6k}od@t/
+contiguous k~tigyU@s
+continent kont~~t
+continent's kont~~ts
+continental kont~en@l
+continental kont~ent@l
+continental's kont~ent@lz
+continentally kont~en@l/
+continentally kont~ent@l/
+continentals kont~en@lz
+continentals kont~ent@lz
+continents kont~~ts
+contingencies k~tinj~s/z
+contingency k~tinj~s/
+contingent k~tinj~t
+contingents k~tinj~ts
+contini k~tEn/
+contino kontEn]
+continual k~tinyU@l
+continually k~tinyU@l/
+continually k~tinyUl/
+continuance k~tinyU~s
+continuances k~tinyU~s@z
+continuation k~tinyUAS~
+continue k~tinyU
+continued k~tinyUd
+continues k~tinyUz
+continuing k~tinyU6N
+continuity kont~U@t/
+continuous k~tinyU@s
+continuously k~tinyU@sl/
+continuum k~tinyU}
+contois k~two
+contort k~t{rt
+contorted k~t{rt@d
+contortion k~t{rS~
+contortionist k~t{rS~@st
+contortions k~t{rS~z
+contorts k~t{rts
+contos kont]z
+contour kontqr
+contoured kontqrd
+contours kontqrz
+contra kontr@
+contraband kontr@band
+contrabassoon kontr@basUn
+contraception kontr@sepS~
+contraceptive kontr@sept6v
+contraceptives kontr@sept6vz
+contract kontrakt
+contract k~trakt
+contract's kontrakts
+contracted kontrakt@d
+contracting kontrakt6N
+contraction k~trakS~
+contractionary k~trakS~cr/
+contractions k~trakS~z
+contractor kontraktP
+contractor's kontraktPz
+contractors kontraktPz
+contractors' k~traktPz
+contracts kontrakts
+contracts k~trakts
+contractual k~trakCU@l
+contractually k~trakCU@l/
+contradict kontr@dikt
+contradicted kontr@dikt@d
+contradicting kontr@dikt6N
+contradiction kontr@dikS~
+contradictions kontr@dikS~z
+contradictorily kontr@diktP@l/
+contradictory kontr@diktP/
+contradicts kontr@dikts
+contran kontran
+contraption k~trapS~
+contraptions k~trapS~z
+contrarian kontr,r/~
+contrarians k~tr,r/~z
+contrariness kontrcr/n@s
+contrary kontrcr/
+contrary k~tr,r/
+contras kontr@z
+contras' kontr@z
+contrast kontrast
+contrast k~trast
+contrasted k~trast@d
+contrasting k~trast6N
+contrasts kontras
+contrasts kontrass
+contrasts kontrasts
+contrasts k~tras
+contrasts k~trass
+contrasts k~trasts
+contravene kontr@vEn
+contravention kontr@venC~
+contreras kontr,roz
+contretemps kontr@temps
+contribute k~tribyUt
+contributed k~tribyUt@d
+contributes k~tribyUts
+contributing k~tribyUt6N
+contribution kontr@byUS~
+contributions kontr@byUS~z
+contributor k~triby@tP
+contributors k~triby@tPz
+contributory k~triby@t{r/
+contrite k~trIt
+contrition k~triS~
+contrivance k~trIv~s
+contrivances k~trIv~s@z
+contrive k~trIv
+contrived k~trIvd
+control k~trOl
+control's k~trOlz
+controladora k~trOl@d{r@
+controllable k~trOl@b@l
+controlled k~trOld
+controller k~trOlP
+controller's k~trOlPz
+controllers k~trOlPz
+controllers' k~trolPz
+controlling k~trOl6N
+controls k~trOlz
+controls' kontrolz
+controversial kontr@vVS@l
+controversies kontr@vVs/z
+controversy kontr@vVs/
+contura kontqr@
+contusion k~tUZ~
+contusions k~tUZ~z
+conundrum k~undr}
+conus kOn@s
+convair konv,r
+convalesce konv@les
+convalescence konv@les~s
+convalescent konv@les~t
+convection k~vekS~
+convene k~vEn
+convened k~vEnd
+convenes k~vEnz
+convenience k~vEny~s
+conveniences k~vEny~s@z
+convenient k~vEny~t
+conveniently k~vEny~tl/
+convening k~vEn6N
+convent konvent
+convent konv~t
+convention k~venS~
+convention's k~venS~z
+conventional k~venS~@l
+conventionally k~venS~@l/
+conventioneer k~venS~ir
+conventioneers k~venS~irz
+conventions k~venS~z
+converge k~vVj
+converged k~vVjd
+convergence k~vVj~s
+convergent k~vVj~t
+converging k~vVj6N
+conversant k~vVs~t
+conversation konvPsAS~
+conversational konvPsAS~@l
+conversationalist konvPsAS~@l@st
+conversations konvPsAS~z
+converse konvPs
+converse k~vVs
+conversed k~vVst
+conversely konvPsl/
+converses konvPs@z
+converses k~vVs@z
+conversing k~vVs6N
+conversion k~vVZ~
+conversion's k~vVZ~z
+conversions k~vVZ~z
+convert konvPt
+convert k~vVt
+converted k~vVt@d
+converter k~vVtP
+converters k~vVtPz
+convertibility konvPt@bil@t/
+convertible k~vVt@b@l
+convertibles k~vVt@b@lz
+converting k~vVt6N
+converts konvPts
+converts k~vVts
+convery konvP/
+convex konveks
+convex k~veks
+convey k~vA
+conveyance k~vA~s
+conveyed k~vAd
+conveyer k~vAP
+conveying k~vA6N
+conveyor k~vAP
+conveys k~vAz
+convict konv6kt
+convict k~vikt
+convict's konv6kts
+convict's k~vikts
+convicted k~vikt@d
+convicting k~vikt6N
+conviction k~vikS~
+convictions k~vikS~z
+convicts konv6kts
+convicts k~vikts
+conville konvil
+convince k~vins
+convinced k~vinst
+convinces k~vins@z
+convincing k~vins6N
+convincingly k~vins6Nl/
+convivial k~viv/@l
+convocation konv@kAS~
+convolute konv@lUt
+convoluted konv@lUt@d
+convolution konv@lUS~
+convoy konv<
+convoys konv<z
+convulsion k~vulS~
+convulsions k~vulS~z
+convulsive k~vuls6v
+conway konwA
+conwell konwel
+conyer konyP
+conyers konyPz
+coo kU
+coochie kUC/
+coody kUd/
+coogan kUg~
+coogle kUg@l
+coogler kUg@lP
+cooing kU6N
+cook kqk
+cook's kqks
+cookbook kqkbqk
+cookbook's kqkbqks
+cookbooks kqkbqks
+cooke kqk
+cooked kqkt
+cooker kqkP
+cookers kqkPz
+cookie kqk/
+cookies kqk/z
+cookin' kqk~
+cooking kqk6N
+cookingham kqkiNham
+cookman kqkm~
+cookout kqk?t
+cookouts kqk?ts
+cooks kqks
+cooksey kqks/
+cookson kqks~
+cookston kqkst~
+cookware kqkwer
+cool kUl
+coolant kUl~t
+coolants kUl~ts
+coolbaugh kUlb{
+coole kUl
+cooled kUld
+cooler kUlP
+coolers kUlPz
+coolest kUl@st
+cooley kUl/
+cooley's kUl/z
+coolidge kUl6j
+coolidge's kUl6j@z
+cooling kUl6N
+coolio kUlE]
+coolio kUly]
+coolly kUl/
+coolman kUlm~
+coolness kUln@s
+cools kUlz
+coombe kUmb
+coombes kUmbz
+coombes kUmz
+coombs kUmz
+coomer kUmP
+coomes kUmz
+coon kUn
+coonan kUn~
+coonce kUns
+coone kUn
+cooner kUnP
+coones kUnz
+cooney kUn/
+coonradt kUnrat
+coonrod kUnrod
+coons kUnz
+coontz kUnts
+coop kUp
+cooped kUpt
+cooper kUpP
+cooper's kUpPz
+cooperage kUpP@j
+cooperate k]opPAt
+cooperate kwopPAt
+cooperated k]opPAt@d
+cooperated kwopPAt@d
+cooperates k]opPAts
+cooperating k]opPAt6N
+cooperation k]opPAS~
+cooperation kwopPAS~
+cooperations k]opPAS~z
+cooperations kwopPAS~z
+cooperative k]opPAt6v
+cooperatively k]opr@t6vl/
+cooperatives k]opr@t6vz
+cooperider kUpPIdP
+cooperman kUpPman
+cooperrider kUpPIdP
+coopers kUpPz
+coopersmith kUpPsmiT
+cooperstein kUpPstEn
+cooperstein kUpPstIn
+cooperstown kUpPzt?n
+coopervision kUpPviZ~
+coopman kUpm~
+cooprider kUprIdP
+coordinate k]{rd~@t
+coordinate k]{rd~At
+coordinated k]{rd~At@d
+coordinates k]{rd~@ts
+coordinates k]{rd~Ats
+coordinating k]{rd~At6N
+coordination k]{rd~AS~
+coordinator k]{rd~AtP
+coordinators k]{rd~AtPz
+coors kUrz
+coors's kUrz@z
+coos kUs
+coosa kUs@
+coot kUt
+coote kUt
+cooter kUtP
+coots kUts
+coover kUvP
+coovick kUv6k
+cop kop
+copa kOp@
+copacabana kOp@k@ban@
+copartner kOportnP
+copartners kOportnPz
+copas kOp@z
+copayment kOpAm~t
+copayments kOpAm~ts
+copco kopk]
+cope kOp
+coped kOpt
+copelan kop@lan
+copeland kOpl~d
+copeland's kOpl~dz
+copelco kOpelk]
+copelin kop@lin
+copeman kOpm~
+copen kOp~
+copenhagen kOp~hAg~
+copenhaver k@penh@vP
+copernican k@pVn@k~
+copernicus k@pVn@k@s
+copes kOps
+copetas k@pAt@s
+copetas k@pEt@s
+copher kofP
+copiague kOp/ag
+copied kop/d
+copier kop/P
+copiers kop/Pz
+copies kop/z
+copilot kOpIl@t
+coping kOp6N
+copious kOp/@s
+coplan kopl~
+copland kopl~d
+coplen kop@l~
+copley kopl/
+copley's kopl/z
+copleys kopl/z
+coplin koplin
+copolla k]pOl@
+copp kop
+coppa kOp@
+coppage kop6j
+copped kopt
+coppedge kop6j
+coppee kopE
+coppel kop@l
+coppens kop~z
+copper kopP
+copper's kopPz
+copperfield kopPfEld
+copperfield's kopPfEldz
+copperfields kopPfEldz
+copperfields' kopPfEldz
+copperhead kopPhed
+copperheads kopPhedz
+copperman kopPm~
+coppernoll k@pVn]l
+coppers kopPz
+coppersmith kopPsmiT
+copperweld kopPweld
+coppery kopP/
+coppess kop@s
+coppin kopin
+copping kop6N
+coppinger kop6NP
+coppins kopinz
+copple kop@l
+coppock kop@k
+coppola k]pOl@
+coppola's k]pOl@z
+coppolino k]p]lEn]
+copps kops
+copra kOpr@
+coprocessor kOproscsP
+coprocessors kOproscsPz
+cops kops
+copsey kops/
+coptic kopt6k
+copulate kopy@lAt
+copus kOp@s
+copy kop/
+copycat kop/kat
+copycats kop/kats
+copycatting kop/kat6N
+copycode kop/kOd
+copying kop/6N
+copyreader kop/rEdP
+copyreaders kop/rEdPz
+copyright kop/rIt
+copyrightable kop/rIt@b@l
+copyrighted kop/rIt@d
+copyrights kop/rIts
+copytele kop/tel@
+copywrite kop/rIt
+copywrited kop/rIt@d
+copywriter kop/rItP
+copywriters kop/rItPz
+cor k{r
+cora k{r@
+cora's k{r@z
+corabelle k{r@b@l
+corabelle k{r@bel
+coracle k{r@k@l
+coral k{r@l
+coralie k{r@l/
+coraline k{r@lIn
+corallo k{ral]
+corals k{r@lz
+coram k{ram
+corath k{raT
+corazon k{r@zOn
+corban k{rb~
+corbeil k{rbIl
+corbel k{rb@l
+corbell k{rbcl
+corbelled k{rb@ld
+corbello kPbel]
+corbet k{rbct
+corbett k{rbct
+corbin k{rbin
+corbit k{rbit
+corbitt k{rbit
+corbo k{rb]
+corbridge k{rbr6j
+corbu k{rbU
+corbusier k{rbyUsyP
+corby k{rb/
+corcap k{rkap
+corcoran k{rkP~
+cord k{rd
+corda k{rd@
+cordage k{rd6j
+cordaro kPd)r]
+cordasco kPdosk]
+corday k{rdA
+corded k{rd@d
+cordeiro kPd,r]
+cordell k{rdel
+corder k{rdP
+cordero kPd,r]
+cordes k{rdz
+cordesman k{rd@sm~
+cordial k{rj@l
+cordially k{rj@l/
+cordiant k{rd/~t
+cordiant's k{rd/~ts
+cordie k{rd/
+cordier k{rd/P
+cordill k{rd@l
+cording k{rd6N
+cordis k{rdis
+cordle k{rd@l
+cordless k{rdl@s
+cordner k{rdnP
+cordoba k{rdOb@
+cordoba's k{rdOb@z
+cordobas k{rdOb@z
+cordon k{rd~
+cordone k{rd~
+cordoned k{rd~d
+cordova k{rdOv@
+cordover k{rdOvP
+cordovez k{rdOvcz
+cordray k{rdrA
+cordrey k{rdr/
+cordry k{rdP/
+cords k{rdz
+cordts k{rdts
+corduroy k{rdP<
+cordy k{rd/
+core k{r
+corea k{rE@
+corel k{rel
+corell k{rel
+corella kPel@
+coren k{r~
+cores k{rz
+corespondent k{r@spond~t
+corestate k{rstAt
+corestates k{rstAts
+corestates' k{r@stAts
+coretech k{rtek
+coretta k{ret@
+corette k{ret
+corexit k{reksits
+corey k{r/
+corgi k{rg/
+coria k{r/@
+coriander k{r/andP
+coriell k{r/l
+corigliano kP/gl/on]
+corina k{rEn@
+corinn k{r~
+corinn's k{r~z
+corinna k{rin@
+corinne kPEn
+corinth k{r~T
+corinthian kPinT/~
+corinto k{rint]
+corio k{r/]
+corisa kPEs@
+corissa k{ris@
+cork k{rk
+corken k{rk~
+corker k{rkP
+corkern k{rkPn
+corkery k{rkP/
+corkill k{rkil
+corking k{rk6N
+corkins k{rkinz
+corkran k{rkr~
+corks k{rks
+corkscrew k{rkskrU
+corkum k{rk}
+corkwood k{rkwqd
+corky k{rk/
+corl k{rl
+corle k{r@l
+corleone k{rl/On
+corless k{rl@s
+corlett k{rlct
+corlew k{rlU
+corley k{rl/
+corliss k{rlis
+cormac k{rm@k
+cormack k{rm@k
+corman k{rm~
+cormany k{rm~/
+cormen k{rm~
+cormican k{rm6k~
+cormick k{rm6k
+cormier k{rm/P
+cormorant k{rmP~t
+cormorants k{rmP~ts
+corn k{rn
+cornacchia kPnok/@
+cornall k{rn@l
+cornblume k{rnblUm
+cornbread k{rnbred
+corncob k{rnkob
+corncrib k{rnkrib
+corne k{rn
+cornea k{rn/@
+corneal k{rnEl
+corneas k{rn/@z
+cornejo kPnAy]
+cornel k{rn@l
+cornela kPnel@
+cornelia k{rnEly@
+cornelio kPnel/]
+cornelious k{rncl/@s
+cornelious k{rnely@s
+cornelison kPnel@s~
+cornelius k{rnEly@s
+corneliuson k{rn@lyUs~
+cornell k{rnel
+cornell's k{rnelz
+cornelle kPnel
+corner k{rnP
+cornerback k{rnPbak
+cornered k{rnPd
+cornering k{rnP6N
+corners k{rnPz
+cornerstone k{rnPstOn
+cornerstones k{rnPstOnz
+cornet k{rnet
+cornett k{rnct
+cornette kPnet
+cornettist k{rnet@st
+corney k{rn/
+cornfeld k{rnfeld
+cornfield k{rnfEld
+cornfields k{rnfEldz
+cornflower k{rnfl?P
+cornflowers k{rnfl?Pz
+cornforth k{rnfPT
+cornhusk k{rnhusk
+cornhusking k{rnhusk6N
+cornia k{rn/@
+corniche k{rn6S
+cornick k{rn6k
+cornie k{rn/
+corniel k{rnEl
+corniel's k{rnElz
+corning k{rn6N
+corning's k{rn6Nz
+cornish k{rn6S
+cornman k{rnm~
+cornmeal k{rnmEl
+corns k{rnz
+cornstalk k{rnst{k
+cornstalks k{rnst{ks
+cornstarch k{rnstorC
+cornucopia k{rn@kOp/@
+cornwall k{rnw{l
+cornwall's k{rnw{lz
+cornwallis k{rnw{l@s
+cornwell k{rnwel
+corny k{rn/
+corolla kPol@
+corollaries k{r@ler/z
+corollary k{r@ler/
+corologis kProl@jis
+corona kPOn@
+corona's kPOn@z
+coronado kP]nod]
+coronary k{r~er/
+coronation k{r~AS~
+coroner k{r~P
+coroner's k{r~Pz
+coroners k{r~Pz
+coronet k{r~et
+coronets k{r~ets
+corp k{rp
+corp k{rpPAS~
+corp's k{rpPAS~z
+corp's k{rps
+corp. k{rp
+corp. k{rpPAS~
+corp.'s k{rpPAS~z
+corp.'s k{rps
+corpening k{rp~6N
+corpora k{rpP@
+corporacion k{rpPos/On
+corporal k{rpP@l
+corporal k{rpr@l
+corporate k{rpP@t
+corporate k{rpr@t
+corporates k{rpP@ts
+corporatewatch k{rpr@twoC
+corporatewide k{rpP@twId
+corporation k{rpPAS~
+corporation's k{rpPAS~z
+corporations k{rpPAS~z
+corporations' k{rpPAS~z
+corporatism k{rpP@tiz}
+corporatist k{rpP@tist
+corps k{r
+corps k{rz
+corps' k{rz
+corpse k{rps
+corpses k{rps@z
+corpsman k{rm~
+corpulant k{rpy@l~t
+corpus k{rp@s
+corpuz k{rpUz
+corr k{r
+corradi kPod/
+corradino kPodEn]
+corrado kPod]
+corral kPal
+corrales kPolcs
+corralled kPald
+corralling kPal6N
+corrao k{r?
+correa k{r/@
+correale k{r/@l
+correct kPekt
+corrected kPekt@d
+correcting kPekt6N
+correction kPekS~
+correctional kPekS~@l
+corrections kPekS~z
+corrective kPekt6v
+correctly kPektl/
+correctness kPektn@s
+corrects kPekts
+corregidor kPeg@d{r
+correia kPA/@
+correira kP,r@
+correlate k{r@l@t
+correlate k{r@lAt
+correlated k{r@lAt@d
+correlates k{r@l@ts
+correlates k{r@lAts
+correlating k{r@lAt6N
+correlation k{r@lAS~
+correlations k{r@lAS~z
+correll kPAl
+correne k{r/n
+corrente kPent/
+correnti kPent/
+correspond k{r@spond
+corresponded k{r@spond@d
+correspondence k{r@spond~s
+correspondent k{r@spond~t
+correspondents k{r@spond~ts
+correspondents' k{r@spond~ts
+corresponding k{r@spond6N
+correspondingly k{r@spond6Nl/
+corresponds k{r@spondz
+corrib k{rib
+corrick k{r6k
+corridor k{r@dP
+corridors k{r@dPz
+corrie k{r/
+corriere k{ry,r
+corrigan k{r6g~
+corrigan's k{r6g~z
+corriher k{r@hP
+corrin k{rin
+corrina kPEn@
+corrington k{r6Nt~
+corriveau k{r6v]
+corroborate kPobPAt
+corroborated kPobPAt@d
+corroborates kP{bPAts
+corroborating kPobPAt6N
+corroboration kP{bPAS~
+corroborative kPobP@tiv
+corroborative kPobr@tiv
+corrode kPOd
+corroded kPOd@d
+corrodes kPOdz
+corron kP{n
+corroon k{rUn
+corrosion kPOZ~
+corrosive kPOs6v
+corrow k{r]
+corrugate k{r@gAt
+corrugated k{r@gAt@d
+corrupt kPupt
+corrupted kPupt@d
+corrupting kPupt6N
+corruption kPupS~
+corruptions kPupS~z
+corruptive kPupt6v
+corrupts kPupts
+corry k{r/
+corsa k{s@
+corsage k{rsoZ
+corsair k{rscr
+corsaro kPs)r]
+corse k{rs
+corsello kPsel]
+corsentino kPscntEn]
+corser k{rsP
+corset k{rs@t
+corsetti kPset/
+corsi k{rs/
+corsica k{rs6k@
+corsican k{rs@k~
+corsicas k{rs6k@z
+corsiglia kPsEgl/@
+corsini kPsEn/
+corso k{rs]
+corson k{rs~
+cort k{rt
+corte k{rt
+cortelyou k{rtclyU
+corten k{rt~
+cortens k{rtcnz
+cortens' k{rtcnz
+corter k{rtP
+cortes k{rts
+cortese kPtAz/
+cortesi kPtes/
+cortex k{rtcks
+cortez k{rtez
+corti k{rt/
+cortical k{rt@k@l
+corticosteroid k{rt6k]st,r<d
+corticosteroids k{rt6k]st,r<dz
+cortin k{rtin
+cortina kPtEn@
+cortinas k{rt/n@z
+cortine k{rtEn
+cortines k{rtEnz
+cortisone k{rt@zOn
+cortland k{rtl~d
+cortner k{rtnP
+cortopassi kPt]pos/
+cortright k{rtrIt
+corum k{r}
+corundum kPund}
+corva k{rv@
+corvallis k{rvalis
+corvette k{rvet
+corvettes k{rvets
+corvin k{rvin
+corvino kPvEn]
+corvo k{rv]
+corvus k{rv@s
+corwin k{rwin
+cory k{r/
+corzine kPzEn/
+corzo k{rz]
+cos k{s
+cosa kOs@
+cosatu k@sotU
+cosatu's k@sotUz
+cosby k{zb/
+cosby's k{zb/z
+coscia kOsC@
+cose kOz
+cosell k]sel
+cosens kOs~z
+cosentino kOscntEn]
+cosenza kOsenz@
+coseratz kOzPats
+cosette k@set
+cosey kOz/
+cosgriff kosgrif
+cosgrove kosgr@v
+cosi kOs/
+cosic kOs6k
+cosic kOz6k
+cosic kos6k
+cosima k]sEm@
+cosio kOs/]
+coslett koslct
+cosma kOzm@
+cosmair k{zmer
+cosman kosm~
+cosme kOzm
+cosmetic kozmet6k
+cosmetically k{zmet6kl/
+cosmetics kozmet6ks
+cosmetology kozm@tol@j/
+cosmic kozm6k
+cosmo k{zm]
+cosmo's kozm]z
+cosmology k{zm{l@j/
+cosmonaut k{zm~{t
+cosmonauts k{zm~{ts
+cosmopolitan kozm@pol@t~
+cosmopulos k{zm@pyUl]s
+cosmos kozm]s
+cosner kosnP
+cosper kospP
+cosponsor kOsp{nsP
+cosponsors kOsp{nsPz
+coss k{s
+cossa k{s@
+cossack k{s@k
+cossacks kosaks
+cossairt kosPt
+cossat kosat
+cosset kos@t
+cossette k@set
+cossey kos/
+cossiga k{sEg@
+cossin kosin
+cossman k{sm~
+cost kost
+costa k{st@
+costabile k{st@bIl
+costain kOstAn
+costales kost@lz
+costano k]ston]
+costantini k]stontEn/
+costantino k]stontEn]
+costanza k]stonz@
+costanzo k]stonz]
+costar kOstor
+costars kOstorz
+costas k{st@z
+costco k{stk]
+costcutting k{stkut6N
+coste kOst
+costed kost@d
+costeira kOst/,r@
+costella k{stel@
+costello k{stel]
+costello's k{stel]z
+costen k{st~
+coster k{stP
+costigan kost6gan
+costilla k]stil@
+costilow kost@l]
+costin kostin
+costing k{st6N
+costley kostl/
+costlier k{stl/P
+costliest k{stl/ist
+costlow k{stlO
+costly kostl/
+costner kostnP
+costner's kostnPz
+coston kost~
+costra kostr@
+costs kos
+costs koss
+costs kosts
+costume kostUm
+costume kostUm
+costumed k{stUmd
+costumer kostUmP
+costumers kostUmPz
+costumes kostUmz
+costumes kostUmz
+cosurtuh k@sVt@
+cosy kOz/
+cot kot
+cota kOt@
+cote kOt
+cotelle kOtel
+coterie kOtP/
+cotes kOts
+cotham koT}
+cothern kuTPn
+cothran koTr~
+cothren koTP~
+cothron koTr~
+cotija k]tEj@
+cotilla k@til@
+cotler kOt@lP
+cotler kotlP
+cotman kotm~
+cotner kotnP
+cotney kotn/
+cotnoir k@tnw)r
+coto kOt]
+cotret kotr@t
+cotrone k]trOn/
+cotroneo k]trOn/]
+cots kots
+cott kot
+cotta kot@
+cottage kot@j
+cottages kot6j@z
+cottam kot}
+cottee k]tE
+cotten kot~
+cotter kotP
+cotterill kotPil
+cotterman kotPm~
+cottier kot/P
+cottingham kot6Nham
+cottle kot@l
+cottman kotm~
+cotto kOt]
+cottom kot}
+cotton kot~
+cotton's kot~z
+cottone k]tOn/
+cottoned kot~d
+cottongin k@tonjin
+cottonmouth kot~m?T
+cottons kot~z
+cottonseed kot~sEd
+cottonwood kot~wqd
+cottonwoods kot~wqdz
+cottrell kotrel
+cottrill kotr@l
+cotty kot/
+cotugno k]tUgn]
+coty kOt/
+cou kU
+couch k?C
+couched k?Ct
+couches k?C@z
+couchman kUSman
+coudersport k?dPzp{rt
+coudert kUdPt
+couey kUE
+coufal kUfal
+cougar kUgP
+cougars kUgPz
+cough kof
+coughed koft
+coughenour k{fenP
+coughing kof6N
+coughlan k{gl~
+coughlin k{glin
+coughran k{gr~
+coughs k{fs
+couillard kw/l)rd
+could kqd
+could've kqd@v
+couldn't kqd~
+couldn't kqd~t
+coulee kUl/
+coull k?l
+coulombe k?lOmb/
+coulon k?l~
+coulson k?ls~
+coulston k?lst~
+coultas kUltoz
+coulter kOltP
+coulthard kUlT)rd
+counce k?ns
+council k?ns@l
+council's k?ns@lz
+councilman k?ns@lm~
+councilmen k?ns@lmcn
+councilor k?ns@lP
+councilor k?nslP
+councilors k?ns@lPz
+councilors k?nslPz
+councils k?ns@lz
+councilwoman k?ns@lwqm~
+councilwomen k?ns@lwim~
+counihan k?n@han
+counsel k?ns@l
+counsel's k?ns@lz
+counseled k?ns@ld
+counseling k?ns@l6N
+counseling k?nsl6N
+counsell k?ns@l
+counsellor k?ns@lP
+counsellor k?nslP
+counsellors k?ns@lPz
+counsellors k?nslPz
+counselman k?ns@lm~
+counselor k?ns@lP
+counselors k?ns@lPz
+counsels k?ns@lz
+count k?nt
+countable k?nt@b@l
+countdown k?ntd?n
+countdowns k?ntd?nz
+counted k?n@d
+counted k?nt@d
+countenance k?nt~~s
+countenanced k?nt~~st
+countenances k?nt~~s@z
+counter k?ntP
+counteract k?ntPakt
+counteracted k?ntPakt@d
+counteracting k?ntPakt6N
+counterattack k?nP@tak
+counterattack k?ntP@tak
+counterattacked k?nP@takt
+counterattacked k?ntP@takt
+counterattacks k?nP@taks
+counterattacks k?ntP@taks
+counterbalance k?nPbal~s
+counterbalance k?ntPbal~s
+counterbalanced k?nPbal~st
+counterbalanced k?ntPbal~st
+counterbid k?ntPbid
+counterchallenge k?nPCal~j
+counterchallenge k?ntPCal~j
+countercharge k?ntPCorj
+countercharges k?ntPCorj@z
+counterclaim k?ntPklAm
+counterclaims k?ntPklAmz
+counterclockwise k?tPkl{kwIz
+countercultural k?nPkulCP@l
+countercultural k?ntPkulCP@l
+counterculture k?nPkulCP
+counterculture k?ntPkulCP
+countered k?nPd
+countered k?ntPd
+counterespionage k?nPesp/~oj
+counterespionage k?ntPesp/~oj
+counterfeit k?nPfit
+counterfeit k?ntPfit
+counterfeited k?nPfit@d
+counterfeited k?ntPfit@d
+counterfeiter k?nPfitP
+counterfeiter k?ntPfitP
+counterfeiters k?nPfitPz
+counterfeiters k?ntPfitPz
+counterfeiting k?nPfit6N
+counterfeiting k?ntPfit6N
+counterfeits k?nPfits
+counterfeits k?ntPfits
+counterforce k?ntPf{rs
+countering k?nP6N
+countering k?ntP6N
+counterinsurgency k?nPinsVj~s/
+counterinsurgency k?ntPinsVj~s/
+counterintelligence k?nPintel6j~s
+counterintelligence k?ntPintel6j~s
+counterlife k?ntPlIf
+counterman k?ntPman
+countermeasure k?nPmeZP
+countermeasure k?ntPmeZP
+countermeasures k?nPmeZPz
+countermeasures k?ntPmeZPz
+countermove k?ntPmUv
+countermoves k?ntPmUvz
+counteroffensive k?nP{fens6v
+counteroffensive k?ntP{fens6v
+counteroffer k?nP{fP
+counteroffer k?ntP{fP
+counteroffers k?nP{fPz
+counteroffers k?ntP{fPz
+counterpart k?nPport
+counterpart k?ntPport
+counterparts k?nPports
+counterparts k?ntPports
+counterparty k?ntPport/
+counterpoint k?nPp<nt
+counterpoint k?ntPp<nt
+counterproductive k?nPpr@dukt6v
+counterproductive k?ntPpr@dukt6v
+counterproposal k?nPpr@pOz@l
+counterproposal k?ntPpr@pOz@l
+counterproposals k?nPpr@pOz@lz
+counterproposals k?ntPpr@pOz@lz
+counterpunch k?ntPpunC
+counterrevolt k?ntPr/vOlt
+counterrevolution k?nPrcv@lUS~
+counterrevolution k?ntPrcv@lUS~
+counterrevolutionary k?nPrcv@lUS~er/
+counterrevolutionary k?ntPrcv@lUS~er/
+counters k?ntPz
+countersue k?nPsU
+countersue k?ntPsU
+countersued k?nPsUd
+countersued k?ntPsUd
+countersuit k?nPsUt
+countersuit k?ntPsUt
+countertenor k?ntPtenP
+counterterrorism k?nPterPiz}
+counterterrorism k?ntPterPiz}
+counterterrorist k?nPt,rPist
+counterterrorist k?ntPt,rPist
+countertop k?nPtop
+countertop k?ntPtop
+countertrade k?ntPtrAd
+countervailing k?ntPvAl6N
+counterweight k?ntPwAt
+countess k?nt@s
+counties k?n/z
+counties k?nt/z
+counting k?n6N
+counting k?nt6N
+countless k?ntl@s
+countries kuntr/z
+countries' kuntr/z
+country kuntr/
+country's kuntr/z
+countryfolk kuntr/fOk
+countryman kuntr/m~
+countrymen kuntr/mcn
+countryside kuntr/sId
+countrywide kuntr/wId
+counts k?nts
+county k?n/
+county k?nt/
+county's k?n/z
+county's k?nt/z
+coup kU
+coupe kUp
+couper kUP
+coupes kUps
+coupland kUpl~d
+couple kup@l
+couple's kup@lz
+coupled kup@ld
+coupler kuplP
+couplers kuplPz
+couples kup@lz
+coupley kupl/
+coupling kupl6N
+couplings kupl6Nz
+coupon kUp{n
+coupon kyUp{n
+couponing kUpon6N
+couponing kyUpon6N
+couponite kUponIt
+couponite kyUponIt
+couponites kUponIts
+couponites kyUponIts
+coupons kUp{nz
+coupons kyUp{nz
+coups kU
+coups kUz
+courage kV@j
+courageous kPAj@s
+courageously kPAj@sl/
+courant kqr~t
+courchaine kqrSAn
+courchesne kqrSen
+couric k{r6k
+courier kV/P
+courier's kV/Pz
+couriers kV/Pz
+courington k{r6Nt~
+cournoyer k{rn<P
+course k{rs
+course's k{rs@z
+coursen k{rs~
+courser k{rsP
+courses k{rs@z
+coursey k{rs/
+coursing k{rs6N
+courson k{rs~
+court k{rt
+court's k{rts
+courtade k{rtAd
+courtaulds k{rt{ldz
+courteau kVt]
+courted k{rt@d
+courtemanche k{rtmanS
+courtemanche k{rtmonS
+courtenay kVt~A
+courtenay k{rtnA
+courteous kVt/@s
+courter k{rtP
+courter's k{rtPz
+courtesies kVt@s/z
+courtesy kVt@s/
+courthouse k{rth?s
+courthouses k{rth?s@z
+courtier k{rt/P
+courtiers k{rt/Pz
+courting k{rt6N
+courtis k{rtis
+courtland k{rtland
+courtly k{rtl/
+courtney k{rtn/
+courtois k{rtwo
+courtright k{rtrIt
+courtroom k{rtrUm
+courtrooms k{rtrUmz
+courts k{rts
+courts' k{rts
+courtship k{rCip
+courtwright k{rtrIt
+courtyard k{rtyord
+courtyards k{rtyordz
+courville kqrvil
+coury k{r/
+cousar kUs)r
+couse k?s
+cousens k?s~z
+cousens kUs~z
+couser k?sP
+cousin kuz~
+cousin's kuz~z
+cousineau kUs~O
+cousino k?sEn]
+cousins kuz~z
+cousteau kUstO
+cousy kUz/
+coutant kUt{nt
+coutee kUtE
+couto k?t]
+couts k?ts
+coutts k?ts
+coutu kUCU
+couture kUtqr
+couturier kUtqr/P
+couvillion kUv/ly{n
+couvillon kUv/l{n
+couzens kUz~z
+coval k]vAal
+covalt kOvolt
+covarrubias k]vorUbE@z
+covas kOv@s
+covatta k]vot@
+covault kOv{lt
+cove kOv
+covel kOv@l
+covell kov@l
+covelli kOvel/
+covello kOvel]
+coven kOv~
+coven kuv~
+covenant kuv~~t
+covenanter kuv~~tP
+covenanters kuv~~tPz
+covenants kuv~~ts
+coveney kov~/
+covent kuv~t
+coventry kuv~tr/
+cover kuvP
+coverage kuvP@j
+coverage kuvr@j
+coverages kuvPAj@z
+coverall kuvP{l
+coveralls kuvP{lz
+coverdale kuvPdAl
+coverdell kuvPdel
+covered kuvPd
+covering kuvP6N
+covering kuvr6N
+coverings kuvP6Nz
+covers kuvPz
+coverstone kuvPstOn
+covert kOvPt
+covertly kuvPtl/
+coverup kuvPup
+coverups kuvPups
+coves kOvz
+covet kuv@t
+coveted kuv@t@d
+covets kuv@ts
+covey kuv/
+covia kOv/@
+coviello kOv/el]
+covill kov@l
+coville kOvil
+covin kOvin
+covina k]vEn@
+covington kuv6Nt~
+covino k]vEn]
+covitz kOvits
+covy kuv/
+cow k?
+cow's k?z
+cowan k?~
+cowans k?~z
+coward k?Pd
+coward's k?Pdz
+cowardice k?Pd@s
+cowardly k?Pdl/
+cowards k?Pdz
+cowart k?ort
+cowbell k?bel
+cowbells k?belz
+cowboy k?b<
+cowboy's k?b<z
+cowboys k?b<z
+cowboys' k?b<z
+cowden k?d~
+cowdery k?dP/
+cowdrey k?dr/
+cowed k?d
+coweda k@wEd@
+cowell kowcl
+cowen k?~
+cowen kO~
+cowens k?~z
+cowens kO~z
+cower k?P
+cowering k?P6N
+cowger k?jP
+cowgill k?gil
+cowgirl k?gVl
+cowgirls k?gVlz
+cowher kowP
+cowherd k?hVd
+cowie k?/
+cowin k?in
+cowing k?6N
+cowl k?l
+cowles k?@lz
+cowley k?l/
+cowling k?l6N
+cowling's k?l6Nz
+cowlings k?l6Nz
+cowlings' k?l6Nz
+cowlings's k?l6Nz@z
+cowman k?m~
+coworker kOwVkP
+coworkers kOwVkPz
+cowper k?pP
+cowper kUpP
+cowperthwaite k?pPTwAt
+cowries k?r/z
+cows k?z
+cowser k?zP
+cowsert k?sPt
+cowslip k?slip
+cox koks
+cox's koks@z
+coxe koks
+coxen koks~
+coxon koks~
+coxwell kokswel
+coy k<
+coye k<
+coyer k<P
+coykendall k<kend@l
+coyle k<l
+coyly k<l/
+coym k<m
+coyne k<n
+coyner k<nP
+coyote kIOt/
+coyote kI]t
+coyotes kIOt/s
+coyotes kI]ts
+coz koz
+cozad kOz@d
+cozart kozort
+cozby kozb/
+cozier kOz/P
+cozine k]zEn/
+coziness kOz/n@s
+cozman kOzm~
+cozy kOz/
+cozying kOz/6N
+cozza kOts@
+cozzens koz~z
+cozzi kOts/
+cozzolino k]ts]lEn]
+cps sEpEes
+crab krab
+crabb krab
+crabbe krab
+crabbed krabd
+crabbs krabz
+crabby krab/
+crabeater krabEtP
+crabill krab@l
+crable krAb@l
+crabmeat krabmEt
+crabs krabz
+crabtree krabtrE
+cracchiolo krok/Ol]
+crace krAs
+crack krak
+crackdown krakd?n
+crackdowns krakd?nz
+cracked krakt
+crackel krak@l
+cracker krakP
+crackerjack krakPjak
+crackers krakPz
+cracking krak6N
+crackle krak@l
+crackled krak@ld
+crackles krak@lz
+crackling krakl6N
+crackpot krakpot
+crackpots krakpots
+cracks kraks
+cracraft krokraft
+craddock krad@k
+crader krAdP
+cradic krad6k
+cradle krAd@l
+cradles krAd@lz
+cradling krAd@l6N
+cradling krAdl6N
+cradock krad@k
+crady krAd/
+craft kraft
+craft's krafts
+crafted kraft@d
+crafting kraft6N
+crafton kraft~
+crafts krafs
+crafts krafts
+craftsman krafsm~
+craftsman kraftsm~
+craftsmanship krafsm~Sip
+craftsmanship kraftsm~Sip
+craftsmen krafsm~
+craftsmen kraftsm~
+craftspeople krafspEp@l
+craftspeople kraftspEp@l
+crafty kraft/
+crager krAjP
+cragg krag
+craggs kragz
+craggy krag/
+craghead kraghed
+cragin krajin
+cragle krAg@l
+crago krog]
+cragun krag~
+craib krAb
+craig krAg
+craig's krAgz
+craighead krAghed
+craigie krAg/
+craigo krAg]
+crail krAl
+crain krAn
+crain's krAnz
+craine krAn
+craker krAkP
+crall kr{l
+cram kram
+cramblit kramblit
+cramer krAmP
+cramer's krAmPz
+crames krAmz
+crammed kramd
+crammer kramP
+cramming kram6N
+cramp kramp
+cramped krampt
+cramping kramp6N
+cramps kramps
+crampton krampt~
+crams kramz
+cramton kramt~
+cranberries kranber/z
+cranberry kranber/
+crance krans
+crandall krand@l
+crandall's krand@lz
+crandell krand@l
+crane krAn
+crane's krAnz
+craned krAnd
+craner krAnP
+cranes krAnz
+cranesbill krAnzbil
+cranesbills krAnzbilz
+craney krAn/
+cranfield kranfEld
+cranfill kranf@l
+cranford kranfPd
+crank kraNk
+cranked kraNkt
+cranking kraNk6N
+cranks kraNks
+crankshaft kraNkSaft
+crankshafts kraNkSafts
+cranky kraNk/
+cranley kranl/
+cranmer kranmP
+cranmore kronm{r
+crannell kran@l
+cranney kran/
+crannies kran/z
+cranny kran/
+cranor krAnP
+crans kranz
+cranshaw kranS{
+cranston kranst~
+cranston's kranst~z
+crap krap
+crapo krop]
+crappie krap/
+crapps kraps
+craps kraps
+crapser krapsP
+crapshoot krapSUt
+crary kVcr/
+crase krAz
+crash kraS
+crash's kraS@z
+crashed kraSt
+crashes kraS@z
+crashing kraS6N
+crasner kraznP
+crasnianski krasn/ansk/
+crass kras
+crassweller kraswelP
+crassweller's kraswelPz
+crate krAt
+crater krAtP
+cratered krAtPd
+craters krAtPz
+crates krAts
+crating krAt6N
+craton krat~
+cratty krat/
+craugh kr{
+craun kr{n
+cravath krav@T
+crave krAv
+craved krAvd
+craven krAv~
+craven's krAv~z
+cravens krAv~z
+craver krAvP
+craves krAvz
+cravey krAv/
+cravin krAvin
+craving krAv6N
+cravings krAv6Nz
+craw kr{
+crawfish kr{fiS
+crawford kr{fPd
+crawford's kr{fPdz
+crawfordsville kr{fPdzvil
+crawl kr{l
+crawled kr{ld
+crawley kr{l/
+crawling kr{l6N
+crawls kr{lz
+crawly kr{l/
+crawmer kr{mP
+crawshaw kr{S{
+craxi kraks/
+cray krA
+cray's krAz
+craycraft krAkraft
+crayfish krAf6S
+crayne krAn
+crayon krAon
+crayons krAonz
+crays krAz
+crayton krAt~
+craze krAz
+crazed krAzd
+crazier krAz/P
+crazies krAz/z
+craziest krAz/@st
+crazily krAz@l/
+craziness krAz/n@s
+crazy krAz/
+crea krE
+creach krEC
+creager krE6jP
+creagh krEg
+creak krEk
+creaked krEkt
+creaking krEk6N
+creaky krEk/
+creal krEl
+cream krEm
+creamed krEmd
+creamer krEmP
+creamery krEmP/
+creamier krEm/P
+creamiest krEm/@st
+creams krEmz
+creamy krEm/
+crean krEn
+crear krir
+crease krEs
+creases krEs@z
+creasey krEs/
+creasman krEzm~
+creason krEs~
+creasy krEs/
+create kr/At
+create-a-book kr/At@bqk
+created kr/At@d
+creates kr/Ats
+creath kreT
+creating kr/At6N
+creation kr/AS~
+creationism kr/AS~iz}
+creations kr/AS~z
+creative kr/At6v
+creatively kr/At6vl/
+creativeness kr/At6vn@s
+creativity krEAtiv@t/
+creatologist kr/At{l@j@st
+creatologists kr/At{l@j@s
+creatologists kr/At{l@j@ss
+creatologists kr/At{l@j@sts
+creator kr/AtP
+creators kr/AtPz
+creature krECP
+creatures krECPz
+crecelius kr@sEl/@s
+credence krEd~s
+credential kr@denC@l
+credential kr@denS@l
+credentialed kr@denC@ld
+credentialed kr@denS@ld
+credentials kr@denC@lz
+credentials kr@denS@lz
+credeur kr@dV
+credibility kred@bil@t/
+credible kred@b@l
+credibly kred@bl/
+credit kred@t
+credit's kred@ts
+creditable kred@t@b@l
+creditably kred@t@bl/
+creditanstalt kredit~St{lt
+creditbank kred@tbaNk
+credited kred@t@d
+credithrift kred@Trift
+crediting kred@t6N
+credito krcdEt]
+creditor kred@tP
+creditors kred@tPz
+creditors' kred@tPz
+credits kred@ts
+creditwatch kred@twoC
+creditworthiness kred@twVT/n@s
+creditworthy kred@twVT/
+credle kred@l
+credo krAd]
+credo krEd]
+credulity kr@dUl@t/
+cree krE
+creech krEC
+creecy krEs/
+creed krEd
+creeden krEd~
+creedon krEd~
+creeds krEdz
+creegan krEg~
+creek krEk
+creek's krEks
+creekmore krEkm{r
+creekmur krEkmP
+creeks krEks
+creel krEl
+creelman krElm~
+creely krEl/
+creep krEp
+creepiness krEp/n@s
+creeping krEp6N
+creeps krEps
+creepy krEp/
+creer krir
+crees krEz
+cref kref
+cref's krefs
+cregan krEg~
+cregar krEgP
+creger krEjP
+cregg kreg
+cregger kregP
+crego kreg]
+crehan kreh~
+creighton krAt~
+creko krek]
+crellin krelin
+cremate krEmAt
+cremated krEmAt@d
+cremation kr/mAS~
+crematoria kr/m@t{r/@
+crematorium kr/m@t{r/}
+creme krEm
+cremeans krem~z
+cremeens krimEnz
+cremer krEmP
+cremin kremin
+crenelate kren@lAt
+crenelated kren@lAt@d
+crenshaw krenS{
+crenwelge krenwclj
+creole krE]l
+creoles kr/Olz
+creolize krEOlIz
+creolized krEOlIzd
+creosote krE@sOt
+crepe krAp
+crepeau kr@pO
+crepes krAps
+creps kreps
+crept krept
+creque krek
+cresap krEs@p
+cresap kres@p
+crescendo kr6Send]
+crescent kres~t
+crescenzi krcsCenz/
+crescenzo krcsCenz]
+cresci kres/
+crescott kreskot
+creson kres~
+crespi kresp/
+crespin krespin
+crespo kresp]
+cress kres
+cresses kres@z
+cressey kres/
+cressler kreslP
+cressman kresm~
+cresson kres~
+cresswell kreswel
+cressy kres/
+crest krest
+crestar krestor
+crested krest@d
+crestfallen krestf{l~
+cresting krest6N
+crestmont krestmont
+crests kres
+crests kress
+crests krests
+creswell kreswel
+cretaceous kr@tAS@s
+cretchen kreC~
+crete krEt
+cretella krctel@
+cretien krESy~
+cretsinger kretsinjP
+creutzfeldt krqtsfcld
+creutzfeldt krqtsfclt
+creveling krev@l6N
+crevice krev@s
+crevices krev@s@z
+crevier krEv/P
+creviston krev@ston
+crew krU
+crew's krUz
+crewe krU
+crewel krU@l
+crewes krUz
+crewman krUm~
+crewmen krUmcn
+crews krUz
+crib krib
+cribari kr/b)r/
+cribb krib
+cribbage krib6j
+cribbs kribz
+cribs kribz
+crichlow krikl]
+crichton kriCt~
+crick krik
+cricket krik@t
+cricket's krik@ts
+crickets krik@ts
+criddle krid@l
+crider krIdP
+cried krId
+crier krIP
+cries krIz
+criger krIjP
+crigger krigP
+crigler kriglP
+crihfield krif/ld
+crill kril
+crilley kril/
+crilly kril/
+crim krim
+crime krIm
+crime's krImz
+crimea krImE@
+crimean krImE~
+crimean kr}En
+crimes krImz
+crimi krEm/
+criminal krim~@l
+criminal's krim~@lz
+criminalist krim~@l@st
+criminalist's krim~@l@sts
+criminalistics krim~@list6ks
+criminalists krim~@l@s
+criminalists krim~@l@ss
+criminalists krim~@l@sts
+criminality krim~al@t/
+criminalization krim~@l@zAS~
+criminalize krim~@lIz
+criminalized krim~@lIzd
+criminalizing krim~@lIz6N
+criminally krim~@l/
+criminals krim~@lz
+criminals' krim~@lz
+criminologist krim~ol@j@st
+criminologists krim~ol@j@s
+criminologists krim~ol@j@ss
+criminologists krim~ol@j@sts
+criminology krim~ol@j/
+crimm krim
+crimmins kriminz
+crimp krimp
+crimped krimpt
+crimping krimp6N
+crimps krimps
+crimson krimz~
+criner krInP
+cringe krinj
+cringed krinjd
+cringes krinj@z
+cringing krinj6N
+crip krip
+cripe krIp
+crippen krip~
+cripple krip@l
+crippled krip@ld
+cripples krip@lz
+crippling krip@l6N
+crippling kripl6N
+cripps krips
+crips krips
+cris kris
+crisafi kr/sof/
+crisafulli kr/sofUl/
+crisanti kr@sant/
+crisci kris/
+criscione kr/sCOn/
+crisco krEsk]
+criscuolo kr/skwOl]
+crise krIz
+crises krIs/z
+crishman kriSm~
+crishman's kriSm~z
+crisis krIs@s
+crisler kris@lP
+crislip krislip
+crisman krism~
+crismon krizm~
+crisostomo kr/s]stOm]
+crisp krisp
+crispell krisp@l
+crispen krisp~
+crisper krispP
+crispin krispin
+crispina kr/spEn@
+crispino kr/spEn]
+crisply krispl/
+crispness krispn@s
+crispo krEsp]
+crispy krisp/
+criss kris
+criss-cross kriskr{s
+criss-crossed kriskr{st
+crisscross kriskr{s
+crisscrossed kriskr{st
+crisscrossing kriskr{s6N
+crissey kris/
+crissinger kris~jP
+crisslow krisl]
+crissman krism~
+crist krist
+cristabel krist@bcl
+cristal krist@l
+cristiani krisC/on/
+cristiani krist/on/
+cristiani's krisC/on/z
+cristiani's krist/on/z
+cristiano kr/st/on]
+cristina kristEn@
+cristo kristO
+cristo's kristOz
+cristobal krist@b@l
+cristobel krist@bcl
+cristobel's krist@bclz
+criswell kriswcl
+critcher kriCP
+critchfield kriCf/ld
+critchley kriCl/
+critchlow kriCl]
+critelli kr@tel/
+criteria krItir/@
+criterion krItir/~
+crites krIts
+critic krit6k
+critic's krit6ks
+critical krit6k@l
+criticality krit@kal@t/
+critically krit6k@l/
+critically krit6kl/
+criticism krit@siz}
+criticisms krit@siz}z
+criticize krit@sIz
+criticized krit@sIzd
+criticizes krit@sIz@z
+criticizing krit@sIz6N
+critics krit6ks
+critics' krit6ks
+critique kr@tEk
+critiqued kr@tEkt
+critiques kr@tEks
+critiquing kr@tEk6N
+criton krIt~
+critser kritsP
+crittenden kritend~
+crittendon krit~d~
+critter kritP
+critters kritPz
+critz krits
+critzer kritzP
+crivaro kr6var]
+crivelli kr6vel/
+crivello kr6vel]
+crnkovich sVn@viC
+cro krO
+croak krOk
+croaker krOkP
+croaking krOk6N
+croat krOot
+croat's krOots
+croatia kr]AS@
+croatia's kr]AS@z
+croatian kr]AS~
+croatian's kr]AS~z
+croatians kr]AS~z
+croatians' kr]AS~z
+croats krOots
+croc krok
+crocco krok]
+croce krOC/
+crochet kr]SA
+crocheted kr]SAd
+crochetiere krOS@tir
+crocheting kr]SA6N
+crock krok
+crocker krokP
+crocker's krokPz
+crockery krokP/
+crockett krok@t
+crockford krokfPd
+crocodile krok@dIl
+crocodiles krok@dIlz
+crocus krOk@s
+crocuses krOk@s@z
+croff kr{f
+crofford krofPd
+crofoot krOfqt
+croft kr{ft
+crofton kroft~
+crofts kr{fts
+crogan krOg~
+croghan krogh~
+croissant kr@sont
+croissant kwosont
+croissants kr@sonts
+croissants kwosonts
+croitzer kr<tsP
+croix kr<
+croix's kr<z
+croke krOk
+croker krOkP
+croley krOl/
+croll krOl
+crom krom
+cromartie kromort/
+crombie kromb/
+cromer krOmP
+cromie krom/
+cromley kroml/
+crompton krompt~
+cromwell kromw@l
+cromwell's kromw@lz
+cron kron
+cronan krOn~
+cronauer kron?r
+cronce krons
+crone krOn
+cronen krOn~
+croner krOnP
+croney krOn/
+cronies krOn/z
+cronin krOnin
+cronk kroNk
+cronkhite kroNkhIt
+cronkite kroNkIt
+cronkright kroNkrIt
+cronquist kronkwist
+cronus krOn@s
+crony krOn/
+cronyism krOn/iz}
+crook krqk
+crooke krqk
+crooked krqk@d
+crookedness krqk@dn@s
+crooker krqkP
+crooklyn krqklin
+crooklyn's krqklinz
+crooks krqks
+crookshank krqkSaNk
+crookshanks krqkSaNks
+crookston krqkst~
+croom krUm
+crooms krUmz
+croon krUn
+crooner krUnP
+crooning krUn6N
+croons krUnz
+crop krop
+crop's krops
+cropland kropland
+cropley kropl/
+cropp krop
+cropped kropt
+cropper kropP
+cropping krop6N
+crops krops
+cropsey krops/
+croquet kr]kA
+cros kr{s
+crosbey krosb/
+crosbie kr{zb/
+crosby kr{zb/
+crosby's kr{zb/z
+crose krOz
+croshaw kroS{
+croskey krosk/
+crosland krosl~d
+crosley krosl/
+croslin kroslin
+croson krOs~
+cross kr{s
+cross's kr{s@z
+cross-pollinate kr{spol~At
+crossan kros~
+crossbill kr{sbil
+crossbills kr{sbilz
+crossbones kr{sbOnz
+crossborder kr{sb{rdP
+crossbow kr{sbO
+crosscurrent kr{skV~t
+crosscurrents kr{skV~ts
+crosse kros
+crossed kr{st
+crossen kr{s~
+crosser kr{sP
+crosses kr{s@z
+crossett kros@t
+crossfield kr{sfEld
+crossfire kr{sfIP
+crossfire kr{sfIr
+crossfire kr{sfIr
+crossfire's kr{sfIrz
+crossin krosin
+crossing kr{s6N
+crossings kr{s6Nz
+crossland kr{sland
+crossley krosl/
+crosslin kroslin
+crossman kr{sm~
+crossnine kr{snIn
+crossno krOsn]
+crosson kros~
+crossover kr{sOvP
+crosspiece kr{spEs
+crosspieces kr{spEs@z
+crossroad kr{srOd
+crossroads kr{srOdz
+crosstalk kr{st{k
+crosstown kr{st?n
+crossville krosvil
+crosswalk kroswok
+crosswhite kroswIt
+crosswise kr{swIz
+crossword kr{swVd
+crosswords kr{swVdz
+crosthwait krosTw@t
+crosthwaite krosTw@t
+croston krost~
+croswell kroswcl
+crotch kroC
+crotchety kroC@t/
+croteau kr@tO
+crothers kruTPz
+crotonville krOt~vil
+crotteau kr@tO
+crotts krots
+crotty krot/
+crotwell krotwel
+crotzer krOtzP
+crouch kr?C
+crouched kr?Ct
+croucher kr?CP
+crouching kr?C6N
+crough kr?
+crounse kr?ns
+croup krUp
+crouse kr?s
+crouser kr?sP
+crout kr?t
+crouthamel kr?T}cl
+crovitz krOvits
+crovitz's krOvits@z
+crovl krOv@l
+crovls krOv@lz
+crow krO
+crow's krOz
+crowbar krObor
+crowborough krObP]
+crowd kr?d
+crowd's kr?dz
+crowded kr?d@d
+crowden kr?d~
+crowder kr?dP
+crowding kr?d6N
+crowds kr?dz
+crowe krO
+crowed krOd
+crowell krO@l
+crowing krO6N
+crowkeeper krOkEpP
+crowkeepers krOkEpPz
+crowl kr?l
+crowle kr?l
+crowley kr?l/
+crowley's kr?l/z
+crown kr?n
+crown's kr?nz
+crowne kr?n
+crowned kr?nd
+crowner kr?nP
+crowning kr?n6N
+crownlike kr?nlIk
+crownover kr?nOvP
+crowns kr?nz
+crownx kr?neks
+crows krOz
+crowson kr?s~
+crowther kr?TP
+crowther's krOTPz
+crowthers krOTPz
+croxton krokst~
+croy kr<
+croyle kr<l
+crozier krOZP
+cruce krUs
+cruces krUs/z
+crucial krUS@l
+crucially krUS@l/
+crucially krUS@ll/
+crucible krUs@b@l
+crucified krUs@fId
+crucifix krUs@fiks
+crucifixes krUs@fiks@z
+crucifixion krUs@fikS~
+crucify krUs@fI
+crud krud
+cruddy krud/
+crude krUd
+crude's krUdz
+crudele krUd@l
+crudely krUdl/
+crudes krUdz
+crudup krudup
+cruea krU/@
+cruel krU@l
+cruel krUl
+cruelest krUl@st
+cruelly krUl/
+cruelties krU@lt/z
+cruelties krUlt/z
+cruelty krU@lt/
+cruelty krUlt/
+cruey kru/
+cruger krUjP
+cruickshank krqkSaNk
+cruikshank krU6kSaNk
+cruise krUz
+cruised krUzd
+cruiser krUzP
+cruiser's krUzPz
+cruisers krUzPz
+cruises krUz@z
+cruising krUz6N
+crull krul
+crum krum
+crumb krum
+crumbaugh krumb{
+crumble krumb@l
+crumbled krumb@ld
+crumbles krumb@lz
+crumbley krumbl/
+crumbling krumb@l6N
+crumbling krumbl6N
+crumbs krumz
+crumby krumb/
+crume krUm
+crumitie krUm@tI
+crumley kruml/
+crumly kruml/
+crumm krum
+crummett krumct
+crummey krum/
+crummy krum/
+crump krump
+crumpacker krump@kP
+crumple krump@l
+crumpled krump@ld
+crumpler krump@lP
+crumpton krumpt~
+crumrine krumrEn
+crunch krunC
+crunched krunCt
+cruncher krunCP
+crunchers krunCPz
+crunches krunC@z
+crunching krunC6N
+crunchy krunC/
+crunk kruNk
+crunkleton kruNk@lton
+crupi krUp/
+crusade krUsAd
+crusader krUsAdP
+crusaders krUsAdPz
+crusades krUsAdz
+crusading krUsAd6N
+crusan krUz~
+cruse krUz
+cruser krUzP
+crush kruS
+crushed kruSt
+crusher kruSP
+crushers kruSPz
+crushes kruS@z
+crushing kruS6N
+crusoe krUs]
+crust krust
+crustacean kr@stAS~
+crustaceans kr@stAS~z
+crustal krust@l
+crusted krust@d
+crusts krusts
+crusty krust/
+crutch kruC
+crutcher kruCP
+crutches kruC@z
+crutchfield kruCfEld
+crutchfield's kruCfEldz
+crutchley kruCl/
+crute krUt
+cruthirds kruTPdz
+crux kruks
+cruz krUz
+cruz's krUz@z
+cruzado krUzod]
+cruzados krUzod]s
+cruzan krUzan
+cruzan krUz~
+cruze krUz
+cruzen krUz~
+cry krI
+cryan krI~
+crybaby krIbAb/
+cryder krIdP
+cryderman krIdPm~
+crye krI
+cryer krIP
+crying krI6N
+crymes krImz
+cryogenic krI@jen@k
+cryogenics krI@jen@ks
+cryolite krI@lIt
+crypt kript
+cryptic kript6k
+crypto kript]
+cryptoclearance kript]lir~s
+cryptosporidium kript]sp{rid/}
+crypts kripts
+crysler kris@lP
+crystal krist@l
+crystal's krist@lz
+crystalline krist@lIn
+crystallize krist@lIz
+crystallized krist@lIzd
+crystallizing krist@lIz6N
+crystallographer krist@logr@fP
+crystallography krist@logr@f/
+crystals krist@lz
+cryster krIstP
+crytzer krItzP
+csar z)r
+csaszar k@soSP
+csaszar soSP
+cspan sEspan
+cspi sEespEI
+ct k{rt
+cuadra kUodr@
+cuadrado kUodrod]
+cuajone kyU@jOn
+cuauhtemoc kyU?t}ok
+cub kub
+cuba kyUb@
+cuba's kyUb@z
+cuban kyUb~
+cubans kyUb~z
+cubbage kub6j
+cubbies kub/z
+cubbison kub@s~
+cubbyhole kub/hOl
+cube kyUb
+cubed kyUbd
+cubes kyUbz
+cubic kyUb6k
+cubic's kyUb6ks
+cubicle kyUb6k@l
+cubicles kyUb6k@lz
+cubism kyUbiz}
+cubist kyUbist
+cubit kyUbit
+cubs kubz
+cubs' kubz
+cuccaro kUk)r]
+cucchi kUk/
+cucchiara kUk/)r@
+cucci kUC/
+cuccia kUC@
+cuccio kUC/]
+cuckoo kUkU
+cuckoo kukU
+cuckoo's kUkUz
+cuckoos kUkUz
+cuco kUk]
+cucumber kyUk}bP
+cucumbers kyUk}Pz
+cudahy kud@h/
+cudd kud
+cuddeback kudbak
+cuddihy kudih/
+cuddle kud@l
+cuddled kud@ld
+cuddling kudl6N
+cuddly kudl/
+cuddy kud/
+cude kyUd
+cudgel kuj@l
+cudgels kuj@lz
+cudmore kudm{r
+cudney kudn/
+cudworth kudwVT
+cue kyU
+cued kyUd
+cuellar kyUlP
+cuello kUel]
+cuenca kwenk@
+cuero kw,r]
+cuervo kqrv]
+cues kyUz
+cuesta kwest@
+cueto kwet]
+cueva kwev@
+cuevas kwevoz
+cuff kuf
+cuffe kuf
+cuffed kuft
+cuffee kuf/
+cuffs kufs
+cugini kUjEn/
+cuhney kUn/
+cuisinart kwEsinot
+cuisinarts kwEzinorts
+cuisine kwizEn
+cuisines kwizEnz
+cul kul
+cul_de_sac kuld@sak
+culberson kulbPs~
+culbert kulbPt
+culbertson kulbPts~
+culbreath kulbreT
+culbreth kulbrcT
+culbro kulbr]
+culhane kulhAn
+culinary kyUl~er/
+culinova kyUl~Ov@
+culkin kulkin
+cull kul
+cullan kul~
+culled kuld
+cullen kul~
+cullens kul~z
+culler kulP
+culler's kulPz
+cullers kulPz
+cullerton kulPt~
+cullerton's kulPt~z
+culleton kUl@ton
+culley kul/
+cullifer kul@fP
+culligan kul@g~
+cullimore kul/m{r
+cullin kulin
+cullinan kul~~
+cullinane kul~An
+cullinet kul~et
+culling kul6N
+cullins kulinz
+cullipher kul@fP
+cullison kul@s~
+cullman kulm~
+cullom kul}
+cullop kul@p
+cullud kul@d
+cullum kul}
+cullum's kul}z
+cully kul/
+culmer kulmP
+culminate kulm~At
+culminated kulm~At@d
+culminates kulm~Ats
+culminating kulm~At6N
+culmination kulm~AS~
+culp kulp
+culpa kulp@
+culpability kulp@bil@t/
+culpable kulp@b@l
+culpepper kulpcpP
+culprit kulpr@t
+culprits kulpr@ts
+cult kult
+cult's kults
+cultic kult6k
+cultist kult@st
+cultists kult@s
+cultists kult@ss
+cultists kult@sts
+cultivate kult@vAt
+cultivated kult6vAt@d
+cultivates kult6vAts
+cultivating kult6vAt6N
+cultivation kult6vAS~
+culton kult~
+cults kults
+cultural kulCP@l
+culturalism kulCP@liz}
+culturally kulCP@l/
+culture kulCP
+culture's kulCPz
+cultured kulCPd
+cultures kulCPz
+culturing kulCP6N
+culvahouse kulv@h?s
+culver kulvP
+culver's kulvPz
+culverhouse kulvPh?s
+culverhouse's kulvPh?s@z
+culvert kulvPt
+culwell kulwel
+cum kum
+cumbee kumbE
+cumber kumbP
+cumberbatch kumbPbaC
+cumberland kumbPl~d
+cumberledge kumbPlej
+cumbersome kumbPs}
+cumbie kumb/
+cumbo kumb]
+cumby kumb/
+cumings kUm6Nz
+cummick kum@k
+cumming kum6N
+cummings kum6Nz
+cummington kum6Nt~
+cummins kuminz
+cummins's kuminz@z
+cummiskey kumisk/
+cumpston kumpst~
+cumpton kumpt~
+cumulative kyUmy@l@t6v
+cumulatively kyUmy@l@t6vl/
+cunanan kyUnan~
+cunard kyUnPd
+cundall kund@l
+cundari kUnd)r/
+cundiff kundif
+cundill kundil
+cundy kund/
+cuneiform kyUn/@f{rm
+cuneo kyUn/]
+cunha kunh@
+cunliffe kunlif
+cunnane kun~
+cunneen k~En
+cunniff kunif
+cunning kun6N
+cunningham kun6Nham
+cunningham's kun6Nhamz
+cunnington kun6Nt~
+cuny kyUn/
+cuoco kwOk]
+cuomo kwOm]
+cuomo's kwOm]z
+cuong kw{N
+cuozzo kwOz]
+cup kup
+cupboard kubPd
+cupboards kubPdz
+cupcake kupkAk
+cupcakes kupkAks
+cupertino kUpPtEn]
+cupid kyUp@d
+cupids kyUp@dz
+cupit kyUpit
+cupo kyUp]
+cupp kup
+cuppett kupct
+cupples kup@lz
+cupps kups
+cuppy kup/
+cups kups
+cur kV
+curable kyqr@b@l
+curacao kyqr@s?
+curate kyqr@t
+curative kyqr@t6v
+curatolo kqrotOl]
+curator kyqr@tP
+curator kyqrAtP
+curator's kyqr@tPz
+curator's kyqrAtPz
+curatorial kyqr@t{r/@l
+curators kyqr@tPz
+curb kVb
+curbed kVbd
+curbelo kqrbel]
+curbing kVb6N
+curbow kVb]
+curbs kVbz
+curbside kVbsId
+curbstone kVbstOn
+curby kVb/
+curci kqrC/
+curcio kqrC/]
+curcuru kqrkqrU
+curd kVd
+cure kyqr
+cured kyqrd
+cures kyqrz
+cureton kyqrt~
+curfew kVfyU
+curfews kVfyUz
+curfman kVfm~
+curiale kqr/ol/
+curie kyqr/
+curie kyqrE
+curiel kyUr/l
+curing kyqr6N
+curington kyqr6Nt~
+curiosities kyqr/os@t/z
+curiosity kyqr/os@t/
+curious kyqr/@s
+curiouser kyqr/@sP
+curiously kyqr/@sl/
+curitiba kyq@tEb@
+curl kVl
+curle k{r@l
+curled kVld
+curlee kVl/
+curler kVlP
+curlers kVlPz
+curless kVl@s
+curlett kVlct
+curley kVl/
+curlin kVlin
+curling kVl6N
+curls kVlz
+curly kVl/
+curmudgeon kPmuj~
+curnow kVn]
+curnutt kVn@t
+curnutte kPnut
+curragh kV@
+curragh kur@
+curran kV~
+curren kV~
+currence kV~s
+currencies kV~s/z
+currencies' kPens/z
+currency kV~s/
+currency's kV~s/z
+currencywatch kV~s/woC
+currens kV~z
+current k)r~t
+current kVnt
+current kV~t
+current's kV~ts
+currently kV~tl/
+currents kV~ts
+curreri kqr,r/
+currey kV/
+curricula kPiky@l@
+curricular kPiky@lP
+curriculum kPiky@l}
+curriculums kPiky@l}z
+currie kV/
+curried kV/d
+currier kV/P
+curries kV/z
+currin k{rin
+currington kV6Nt~
+curro kqr]
+curry kV/
+curry kur/
+curry's kV/z
+curry's kur/z
+currying kV/6N
+currys kV/z
+currys kur/z
+curse kVs
+cursed kVst
+curses kVs@z
+cursing kVs6N
+cursor kVsP
+cursory kVsP/
+curt kVt
+curt's kVts
+curtail kPtAl
+curtailed kPtAld
+curtailing kPtAl6N
+curtailment kPtAlm~t
+curtailments kPtAlm~ts
+curtails kPtAlz
+curtain kVt~
+curtains kVt~z
+curti kqrt/
+curtice kqrtis
+curtin kVtin
+curtis kVt@s
+curtis' kVt@s
+curtiss kVt@s
+curtly kVtl/
+curtner kVtnP
+curto kqrt]
+curtright kVtrIt
+curts kVts
+curtsinger kVts~jP
+curvature kVv@CP
+curve kVv
+curved kVvd
+curves kVvz
+curvin kVvin
+curving kVv6N
+curvy kVv/
+curzio kVz/]
+cus kus
+cus sEyUes
+cusack kyUz@k
+cusano kUson]
+cush kqS
+cush kuS
+cushey kqS/
+cushing kqS6N
+cushion kqS~
+cushioned kqS~d
+cushioning kqSn6N
+cushioning kqS~6N
+cushions kqS~z
+cushitic k@Sit6k
+cushman kqSm~
+cushy kqS/
+cusiana kyUz/an@
+cusic kyUz6k
+cusick kyUz6k
+cusimano kUs/mon]
+cusip kus@p
+cusip kyUs@p
+cusk kusk
+cusmano kUsmon]
+cuso kUs]
+cuso kyUs]
+cuso's kUs]z
+cuso's kyUs]z
+cusp kusp
+cuss kus
+cussed kust
+cussing kus6N
+cusson kus~
+custard kustPd
+custer kustP
+custer's kustPz
+custis kustis
+custodial k@stOd/@l
+custodian k@stOd/~
+custodians k@stOd/~z
+custodio kUstOd/]
+custody kust@d/
+custom kust}
+customarily kust},r@l/
+customary kust}er/
+customer kust}P
+customer's kust}Pz
+customers kust}Pz
+customers' kust}Pz
+customize kust}Iz
+customized kust}Izd
+customizing kust}Iz6N
+customs kust}z
+cusumano kUsUmon]
+cut kut
+cutaia kUtoy@
+cutaway kut@wA
+cutback kutbak
+cutbacks kutbaks
+cutbirth kutbVT
+cutchall kuC@l
+cutcher kuCP
+cutchin kuCin
+cutchins kuCinz
+cute kyUt
+cuteness kyUtn@s
+cuter kyUtP
+cutesiness kyUtsEn@s
+cutest kyUtist
+cutesy kyUts/
+cuthbert kuTbPt
+cuthbertson kuTbPts~
+cuthrell kuTr@l
+cuticle kyUt@k@l
+cutillo kyUtil]
+cutlass kutl@s
+cutler kutlP
+cutler's kutlPz
+cutlery kutlP/
+cutlip kutlip
+cutoff kut{f
+cutoffs kut{fs
+cutout kut?t
+cutouts kut?ts
+cutrale kutrAl
+cutrell kutr@l
+cutrer kutrP
+cutright kutrIt
+cutrona kUtrOn@
+cutrone kUtrOn/
+cuts kuts
+cutsforth kutsf{rT
+cutshall kuC@l
+cutshaw kuC{
+cutsinger kuts~jP
+cutter kutP
+cutters kutPz
+cutthroat kutTrOt
+cutting kut6N
+cuttings kut6Nz
+cuttino kUtEn]
+cuttlefish kut@lfiS
+cutts kuts
+cutty kut/
+cutugno kyUtuny]
+cutworm kutwVm
+cutworms kutwVmz
+cuvelier kyUvl/P
+cuyahoga kI@hOg@
+cuyler kIlP
+cuzzort kuzPt
+cwiertnia kwErtn/@
+cwik kwik
+cwikla kwikl@
+cwiklinski kw6klinsk/
+cwynar kwinP
+cxc sEeksE
+cxc sEekssE
+cy sI
+cyacq sIak
+cyan sIan
+cyanamid sIan}@d
+cyanamid's sIan}@dz
+cyanazine sI~@zEn
+cyanide sInId
+cyanide sI~Id
+cyanuric sIanP6k
+cyb sEwIbE
+cyb sIb
+cyber sIbP
+cybercash sIbPkaS
+cyberporn sIbPp{rn
+cybersex sIbPseks
+cyberspace sIbPspAs
+cyberspace's sIbPspAs@z
+cybill sIbil
+cybulski k@bulsk/
+cycads sIkadz
+cycare sIker
+cyclades sIklAd/z
+cyclades sIkladz
+cycle sIk@l
+cycled sIk@ld
+cycles sIk@lz
+cyclical sIkl6k@l
+cyclical sikl6k@l
+cyclicality sikl6kal@t/
+cyclicals sikl6k@lz
+cycling sIk@l6N
+cycling sIkl6N
+cyclist sIk@l@st
+cyclist sIkl@st
+cyclists sIk@l@s
+cyclists sIk@l@ss
+cyclists sIk@l@sts
+cyclists sIkl@s
+cyclists sIkl@ss
+cyclists sIkl@sts
+cyclohexane sIkl@heksAn
+cyclone s6klOn
+cyclones s6klOnz
+cyclopean sIkl@pE~
+cyclops sIkl{ps
+cyclops's sIkl{ps@z
+cyclosporine s6kl{spPEn
+cyclostome sIkl@stOm
+cyclostomes sIkl@stOmz
+cycolor sik@lP
+cyd sid
+cydonia s@dOn/@
+cydrome s@drOm
+cygan sIg~
+cygne sign@
+cygnus sign@s
+cyhexatin sIheks@t~
+cylinder sil~dP
+cylinders sil~dPz
+cylindrical s@lindr6k@l
+cymbal simb@l
+cymbals simb@lz
+cymrot simr@t
+cynara kin)r@
+cyndi sind/
+cynic sin6k
+cynical sin6k@l
+cynically sin6k@l/
+cynically sin6kl/
+cynicism sin@siz}
+cynics sin6ks
+cynric sinr6k
+cynth sinT
+cynthia sinT/@
+cynthia's sinT/@z
+cynthie sinT/
+cynwyd sinw@d
+cypert sIpPt
+cypher sIfP
+cyphers sIfPz
+cyphert sIfPt
+cypress sIpr@s
+cypress's sIpr@s@z
+cyprian sipr/~
+cypriot sipr/@t
+cypriot sipr/ot
+cypriots sipr/@ts
+cypriots sipr/ots
+cypris sIpris
+cyprus sIpr@s
+cyr sir
+cyran kir~
+cyrano k/ron]
+cyrano sir~O
+cyrena k6rEn@
+cyril sir@l
+cyrilla s6ril@
+cyrillic sPil6k
+cyrix sIriks
+cyrix sir6ks
+cyrix's sIriks@z
+cyrix's sir6ks@z
+cyrus sIr@s
+cyst sist
+cystic sist6k
+cysts sis
+cysts siss
+cysts sists
+cytherea siTPE@
+cytogen sIt]jcn
+cytology sItol@j/
+cytomegalovirus sIt}eg@l]vIr@s
+cytoplasm sIt@plaz}
+cytoplasmic sIt@plazm6k
+cytotech sIt]tek
+cytotechs sIt]teks
+cywinski k6vinsk/
+czaja CI@
+czajka CIk@
+czajkowski CIk{fsk/
+czapla Copl@
+czaplewski C@plefsk/
+czaplicki C@plitsk/
+czar z)r
+czar's z)rz
+czarist z)rist
+czarnecki CPnetsk/
+czarnik C)rn6k
+czarny C)rn/
+czars z)rz
+czech Cek
+czechoslovak Cek@slOvok
+czechoslovakia Cek@sl]vok/@
+czechoslovakia's Cek@sl]vok/@z
+czechoslovakian CeC@sl]vok/~
+czechoslovaks Cek@slOvoks
+czechowski C@h{fsk/
+czechs Ceks
+czekajewski Cek@jUsk/
+czepiel Cep/l
+czerniak CVn/ak
+czerny CVn/
+czerwinski CPvinsk/
+czerwonka CPvoNk@
+czeslaw Ccsl{
+czyz Ciz
+czyzewski Cizefsk/
+d dE
+d'affaires d@f,rz
+d'agostino dog@stEn]
+d'alene d@lEn
+d'alessandro dalcsandr]
+d'allest dalest
+d'amato d}ot]
+d'amato's d}ot]z
+d'america d},r6k@
+d'amico dam/kO
+d'amore dE}{rA
+d'amore's dE}{rAz
+d'andrea dandr/@
+d'angelo d/anj@l]
+d'arcy d)rs/
+d'aubuisson d{bwEson
+d'aviation dAv/AS~
+d'electricite d@lektris@tA
+d'escoto dcskOt]
+d'estaing d@stAN
+d'etat dAto
+d'etat detat
+d'etats dAtoz
+d'etre detr/
+d'etude detUd
+d'genetta d/j~et@
+d'ivoire d/vw)r
+d'oeuvre dVv
+d'oeuvres dVvz
+d'or d{r
+d'orsay d{rsA
+d's dEz
+d'souza d/sUz@
+d'souza d@sUz@
+d. dE
+d.'s dEz
+d.s dEz
+da dEA
+da do
+da's dEAz
+daane don
+dab dab
+dabah d@bo
+dabah dab@
+dabbing dab6N
+dabble dab@l
+dabbled dab@ld
+dabbles dab@lz
+dabbling dab@l6N
+dabbling dabl6N
+dabbs dabz
+dabchick dabC6k
+dabhol dab]l
+dabkowski d@bk{fsk/
+dabney dabn/
+dabrowski d@br{fsk/
+dac dak
+dace dAs
+dacey dAs/
+dacha doC@
+dachau dak?
+dachshund dokshqnd
+dachshunds dokshqnts
+dacia dAS/@
+dack dak
+dacosta dokOst@
+dacquisto dakwist]
+dacron dakron
+dacruz dokrUz
+dacs daks
+dacunha d@kunh@
+dacus dak@s
+dacy dAs/
+dad dad
+dad's dadz
+dada dodo
+dadamo dodom]
+daddario dod)r/]
+daddies dad/z
+daddona dodOn@
+daddy dad/
+daddy's dad/z
+daddy-o dad/]
+daddy-o's dad/]z
+dade dAd
+dadeland dAdl~d
+dadfar dadfor
+dadisman dad@sm~
+dado dAdO
+dads dadz
+dady dAd/
+dae dA
+daedalus dAdal@s
+daedalus ded@l@s
+daelim dAlEm
+daemon dAm~
+daemon dEm~
+daenzer denzP
+daewoo dAwU
+daffern dafPn
+daffin dafin
+daffodil daf@dil
+daffodils daf@dilz
+daffron dafr~
+daffy daf/
+daffynition daf/niS~
+dafna dafn@
+dafoe daf]
+dafsa dafs@
+daft daft
+dag dag
+dagan dAg~
+dagata dogot@
+dagen dag~
+dagenais daZ~A
+dagenham dag~ham
+dagenhart dag~hort
+dager dAgP
+dagestan dagcstan
+dagg dag
+dagger dagP
+daggers dagPz
+daggett dag@t
+daggs dagz
+daggy dag/
+dagle dAg@l
+dagley dagl/
+dagmar dagmor
+dagon dAg~
+dagostino dog]stEn]
+dague dog
+dagwood dagwqd
+dah du
+daher doP
+dahill dohil
+dahl dol
+dahl's dolz
+dahlberg dolbPg
+dahle do@l
+dahlem dol}
+dahlen dol~
+dahler dolP
+dahlgren dalgrcn
+dahlheimer dolhImP
+dahlia daly@
+dahlin dolin
+dahlke dolk
+dahlman dolm~
+dahlquist dolkwist
+dahlstrom dolstr}
+dahm dam
+dahman dom~
+dahmen domcn
+dahmer domP
+dahmer's domPz
+dahms domz
+dahn dan
+dahn don
+dahnke daNk
+dahrain d@rAn
+dai dI
+daido dAd]
+daidone dAdOn
+daiei dIA
+daigle dAg@l
+daigler dAglP
+daignault dcgnO
+daigneault dcgnO
+daigre dAgP
+daigrepont dAgr@pont
+daihatsu dIhatsU
+daiichi dIEC/
+daikin dAkin
+dail dAl
+daile dAl
+dailey dAl/
+dailies dAl/z
+daily dAl/
+daimler dAmlP
+daimler demlP
+daimler's dAmlPz
+daimones dAmOnz
+dain dAn
+daines dAnz
+daini dAn/
+dainippon dAnipon
+dains dAnz
+dainty dAnt/
+dairies d,r/z
+dairy d,r/
+dairying d,r/6N
+dairymen dAr/m~
+dais dAz
+daise dAz
+daisey dAs/
+daishowa dAS?@
+daisies dAz/z
+daisy dAz/
+daisy's dAz/z
+daiwa dAw@
+daiwa's dAw@z
+dajun dAj~
+dak dEAkA
+dak dak
+dakar dok)r
+dake dAk
+dakin dAkin
+dakota d@kOt@
+dakota's d@kOt@z
+dakotan d@kOt~
+dakotans d@kOt~z
+dakotas d@kOt@z
+dal dal
+dalafield dal@fEld
+dalai dalA
+dalai dolE
+dalal dAl@l
+dalbar dalbor
+dalbec dalb6k
+dalbert dalbPt
+dalbey dalb/
+dalby d{lb/
+dale dAl
+dale's dAlz
+daleiden dalId~
+dalen dal~
+daleo dol/]
+dales dAlz
+dalesandro dolcsondr]
+dalesio d@lEs/]
+dalessandro dolcsondr]
+dalessio d@les/]
+daleth doleT
+daley dAl/
+daley's dAl/z
+dalfen dalf~
+dalfonso dalfons]
+dalfort d{lfPt
+dalgety dalget/
+dalgleish dalg@liS
+dalgleish dalgliS
+dalhouse d{lh?s
+dali dol/
+dalia doly@
+dalian dAl/~
+daliberti dal@b,rt/
+dalila d@lIl@
+dalis dalis
+dalke dAlk
+dalkon dalk~
+dall d{l
+dalla dal@
+dallaire dolcr
+dallara dal)r@
+dallas dal@s
+dallas' dal@s
+dallas's dal@s@z
+dalley dal/
+dallhold d{lhOld
+dalliance dal/~s
+dallied dal/d
+dallman d{lm~
+dallmann d{lm~
+dally dal/
+dalma dolm@
+dalman dalm~
+dalmatian dalmAS~
+dalmatians dalmAS~z
+dalmo d{lm]
+dalo dol]
+daloia dolOy@
+daloisio dol<s/]
+dalonzo d@lonz]
+dalpe dAlp
+dalpiaz dolpEoz
+dalporto dolp{rt]
+dalrymple dalrimp@l
+dalto dolt]
+dalton d{lt~
+dalton's d{lt~z
+daltons d{lt~z
+daly dAl/
+dalzell dalz@l
+dalziel dalzEl
+dam dam
+dam's damz
+dama dom@
+damaclean dam@kl/n
+damage dam@j
+damaged dam@jd
+damages dam@j@z
+damaging dam6j6N
+daman dAm~
+damaris d})r@s
+damas dom@z
+damascus d}ask@s
+damascus's d}ask@s@z
+damask dam@sk
+damasks dam@sks
+damato domot]
+dambach dambok
+dambacher dambokP
+dambra dambr@
+dambrosia dombrOs/@
+dambrosio dambrOs/]
+dame dAm
+dame's dAmz
+damelio d}El/]
+damer dAmP
+dameron domcr{n
+dames dAmz
+damewood dAmwqd
+damgard damgord
+damian dAm/~
+damiani dom/on/
+damiano dom/on]
+damico domEk]
+damien dAm/~
+damien's dAm/~z
+damietta dam/et@
+daminozide damin@zId
+damita domEt@
+damitz damits
+damm dam
+dammam dam}
+damman dam~
+dammann dam~
+damme dAm
+damme dam
+dammed damd
+dammen dam~
+dammer damP
+dammerman damPm~
+damming dam6N
+dammit damit
+damn dam
+damnation damnAS~
+damned damd
+damning dam6N
+damocles dam@klEz
+damon dAm~
+damon's dAm~z
+damone d}On
+damons dAm~z
+damoose d}Us
+damore dAm{r
+damour d}qr
+damp damp
+damped dampt
+dampen damp~
+dampened damp~d
+dampening dampn6N
+dampening damp~6N
+damper dampP
+dampers dampPz
+dampier damp/P
+damping damp6N
+dampness dampn@s
+damps damps
+damron damr~
+damrow damrO
+dams damz
+damsel damz@l
+damson dams~
+damuth damUT
+dan dan
+dan's danz
+dana dAn@
+dana's dAn@z
+danaher dan@hP
+danahy dan@h/
+danbury danbP/
+danby danb/
+danca doNk@
+dancanet daNk~et
+dance dans
+danced danst
+dancer dansP
+dancer's dansPz
+dancers dansPz
+dancers' dansPz
+dances dans@z
+dancey dans/
+dancin' dans~
+dancing dans6N
+dancsak danksak
+dancy dans/
+dandelion dand@lI~
+dandelions dand@lI~z
+dandeneau dand~]
+dando dand]
+dandrea dandr/@
+dandridge dandr6j
+dandruff dandr@f
+dandurand dandP~d
+dandy dand/
+dandyism dand/iz}
+dane dAn
+dane's dAnz
+danek dan6k
+danella d~el@
+danelle d~el
+daner dAnP
+danes dAnz
+danese donAz/
+daney dAn/
+danford danfPd
+danforth danfPT
+dang daN
+dangel dANg@l
+dangelo danj@l]
+danger dAnjP
+dangerfield dAnjPfEld
+dangerous dAnjP@s
+dangerously dAnjP@sl/
+dangers dAnjPz
+dangews dAnjUz
+dangle daNg@l
+dangled daNg@ld
+dangler daNg@lP
+dangles daNg@lz
+dangling daNg@l6N
+dangling daNgl6N
+dango daNg]
+dani don/
+dania dAny@
+danica dan6k@
+daniel dany@l
+daniel's dany@lz
+daniela danyel@
+daniele danyel
+daniell dan/l
+daniella danyel@
+danielle dan/el
+danielle danyel
+daniello don/el]
+daniels dany@lz
+daniels's dany@lz@z
+daniels's danyelz@z
+danielsen dany@ls~
+danielski d~Elsk/
+danielson dany@ls~
+daniloff dan@l{f
+danis don/z
+danish dAniS
+danju danjU
+danju's danjUz
+danjub danjUb
+danjub's danjUbz
+danjube danjUb
+danjube's danjUbz
+danjus danj@s
+danjus danjUz
+dank daNk
+danker daNkP
+dankert daNkPt
+dankner daNknP
+danko daNk]
+danks daNks
+danley danl/
+danly danl/
+dann dan
+danna dan@
+dannelly dan@l/
+dannels dan@lz
+dannemeyer danmIr
+dannemeyer dan}Ir
+dannemiller danmilP
+dannemiller dan}ilP
+dannen dan~
+dannenberg dan~bPg
+danner danP
+danners danPz
+dannie dan/
+dannunzio donUnz/]
+danny dan/
+danny's dan/z
+dano don]
+danos dAn]z
+danowski d~{fsk/
+dansby dansb/
+danser dansP
+dansereau dansPO
+dansforth dansfPT
+dansforth's dansfPTs
+dansie dans/
+danske dansk
+danskin danskin
+dansky dansk/
+danson dans~
+danstett danstct
+dansville danzvil
+dansville's danzvilz
+dant dant
+dante dontA
+dante's dant/z
+dantin dantin
+danton dant~
+dantoni dontOn/
+dantonio dantOn/]
+dantrell dantrel
+dantuono dontwOn]
+dantzler dantslP
+danube danyUb
+danvers danvPz
+danville danvil
+danvy danv/
+danylyszyn dan@lEz~
+danz danz
+danza danz@
+danzer danzP
+danzig danz6g
+danziger danz6gP
+danzy danz/
+dao d?
+daoud d?d
+daoust d?st
+daphne dafn/
+daphne's dafn/z
+daphnis dafn@s
+dapice dopis
+dapolito dop]lEt]
+daponte dopOntA
+dapozzo d@pozO
+dapp dap
+dapper dapP
+dapuzzo d@puz]
+daquila dokwEl@
+dar d)r
+dara dar@
+darak d,rak
+darblay d)rblA
+darbonne d)rb~
+darby d)rb/
+darby's d)rb/z
+darbyshire d)rb6SIr
+darcangelo dorkoNgel]
+darcey d)rs/
+darcie d)rk/
+darco d)rk]
+darcy d)rs/
+dardar dord)r
+darden d)rd~
+darden's d)rd~z
+dardis d)rdis
+dare d,r
+dared d,rd
+daredevil d,rdev@l
+daremblum d,r}blUm
+daren dar~
+darensbourg dar~sbPg
+darensbourg dar~zbPg
+dares d,rz
+daresay d,rsA
+darga d)rg@
+dargan d)rg~
+dargis d)rgis
+daria d)r/@
+darice d)ris
+darien d,r/~
+darienzo dorEnz]
+darin darin
+daring d,r6N
+dario d,r/O
+darity dar@t/
+darius dPI@s
+darjeeling dorZEl6N
+darjeeling dorjEl6N
+dark d)rk
+darke d)rk
+darken d)rk~
+darkened d)rk~d
+darkening d)rkn6N
+darkening d)rk~6N
+darker d)rkP
+darkest d)rk@st
+darkie d)rk/
+darkly d)rkl/
+darkness d)rkn@s
+darkroom d)rkrUm
+darland d)rl~d
+darlene d)rlEn
+darley d)rl/
+darlin d)rlin
+darline d)rlIn
+darling d)rl6N
+darlings d)rl6Nz
+darlington d)rl6Nt~
+darman d)rm~
+darman's d)rm~z
+darmstadt d)rmstat
+darn d)rn
+darnall d)rn@l
+darned d)rnd
+darnedest d)rncst
+darnedest d)rndcst
+darnel d)rn@l
+darnell dornel
+darner d)rnP
+darnold d)rnOld
+darns d)rnz
+darocha dorOk@
+darosa dorOs@
+darpa d)rp@
+darpino dorpEn]
+darr d)r
+darr d,r
+darragh d,r@
+darrah dar@
+darrell d,r@l
+darrelle dPel
+darren d)r~
+darrick dar6k
+darrigo dorEg]
+darrington dar6Nt~
+darroch dar@k
+darrough dar?
+darrow d,r]
+darryl d,r@l
+darsey d)rs/
+darst d)rst
+darsy d)rs/
+dart d)rt
+dart's d)rts
+dartboard d)rtb{rd
+darted d)rt@d
+darter d)rtP
+dartez dortez
+darth d)rT
+darting d)rt6N
+dartmouth d)rtm@T
+dartmouth's d)rtm@Ts
+darton d)rt~
+darts d)rts
+dartt d)rt
+darty d)rt/
+darty's d)rt/z
+darville d)rvil
+darwin d)rwin
+darwinian dorwin/~
+darwinism d)rw~iz}
+darwish d)rw6S
+daryl d,r@l
+das das
+dasa das@
+dasa dos@
+dasaro dos)r]
+dasburg dasbPg
+dascenzo dosCenz]
+dasch daS
+daschle daSl/
+dascoli doskOl/
+dase dAz
+daseke dAs@k/
+dash daS
+dashboard daSb{rd
+dashboards daSb{rdz
+dashed daSt
+dashel daS@l
+dashell daS@l
+dasher daSP
+dashes daS@z
+dashiell daS/l
+dashiki d@SEk/
+dashing daS6N
+dashnaw daSn{
+dashner daSnP
+dashville daSvil
+dashwood daSwqd
+dasilva d@silv@
+daspin daspin
+daspit daspit
+dass das
+dassault das{lt
+dassault's das{lts
+dassler daslP
+dassow das]
+dastardly dastPdl/
+dat dat
+data dAt@
+data dat@
+data's dAt@z
+data's dat@z
+database dAt@bAs
+database dat@bAs
+databases dAt@bAs@z
+databases dat@bAs@z
+datacard dAt@kord
+datacard dat@kord
+datacomm dAt@kom
+datacomm dat@kom
+datacomp dAt@komp
+datacomp dat@komp
+datacopy dAt@kop/
+datacopy dat@kop/
+datagraphix dAt@graf6ks
+datagraphix dAt@graf6ks
+datametrics dAt}etr6ks
+datametrics dat}etr6ks
+datapoint dAt@p<nt
+datapoint dat@p<nt
+datapoint's dAt@p<nts
+datapoint's dat@p<nts
+datapower dAt@p?r
+datapower dat@p?r
+dataproducts dAt@prod@kts
+dataproducts' dAt@pr{d@kts
+dataproducts' dat@pr{d@kts
+dataquest dAt@kwest
+dataquest dat@kwest
+dataquest's dAt@kwests
+dataquest's dat@kwests
+dataram dAtPam
+dataram datPam
+datarex dAtPeks
+datarex datPeks
+datas dAt@z
+datas dat@z
+date dAt
+dated dAt@d
+datek datck
+dateline dAtlIn
+dateline's dAtlInz
+datelines dAtlInz
+dates dAts
+datext datekst
+dating dAt6N
+dato dot]
+datron datr~
+dats dats
+datsun dats~
+datsun dots~
+datsun's dats~z
+datsun's dots~z
+dattilio dotEl/]
+dattilo dotEl]
+datuk dotUk
+datum dAt}
+datum dat}
+datura d@tqr@
+datz dats
+dau dO
+daub d{b
+daube d{b
+daubed d{bd
+daubenspeck d?b~sp6k
+dauber d?bP
+daubert d?bPt
+dauch d?C
+daudelin dOd@lan
+dauenhauer d?~h?P
+dauer d?P
+daufuskie dOfusk/
+daughdrill d{dril
+daughenbaugh d{enb{
+daugherty dokPt/
+daughety d{@t/
+daughney d{n/
+daughter d{tP
+daughter's d{tPz
+daughters d{tPz
+daughters' d{tPz
+daughtery d{tP/
+daughton d{t~
+daughtrey d{tr/
+daughtridge d{tr6j
+daughtry d{tr/
+daul d{l
+dault d{lt
+daulton d{lt~
+daum d{m
+daun d{n
+daunt d{nt
+daunted d{nt@d
+daunting d{nt6N
+dauphin d?fin
+dauphinais dOf~A
+dauphinee d{f~E
+dauria d{r/@
+daus d{z
+dauster d?stP
+dauterive dOtP6v
+dauzat d?z@t
+davalos dovol]z
+davanzo d@vanz]
+davao d@vO
+davao dAv]
+davault d@vO
+davco davk]
+dave dAv
+dave's dAvz
+davee dav/
+davenport dav~p{rt
+davenport's dav~p{rts
+davern davPn
+daversa dov,rs@
+daves dAvz
+davey dAv/
+davi dov/
+davia dov/@
+david dAv@d
+david's dAv@dz
+davida dovEd@
+davide duvEdA
+davidge dav6j
+davidian d@vid/~
+davidian's d@vid/~z
+davidians d@vid/~z
+davidoff dAv@d{f
+davidow dav@d]
+davids dAv@dz
+davidson dAv@ds~
+davidson's dAv@ds~z
+davie dAv/
+davies dAv/z
+davignon dov/gn{n
+davila d@vil@
+davilla d@vil@
+davin davin
+davina dovEn@
+davino dovEn]
+davio's dav/]z
+davis dAv@s
+davis' dAv@s
+davis' dAv@s@z
+davis's dAv@s@z
+davison dAv@s~
+davisson dav@s~
+davitt d@vit
+davlin davlin
+davoli dovOl/
+davos dov]s
+davox davoks
+davy dAv/
+davydov dAv@d{v
+daw d{
+dawdle d{d@l
+dawdling d{dl6N
+dawdy d{d/
+dawe d{
+dawes d{z
+dawit dawit
+dawkins d{kinz
+dawley d{l/
+dawn d{n
+dawn's d{nz
+dawned d{nd
+dawning d{n6N
+dawns d{nz
+daws d{z
+dawsey d{s/
+dawson d{s~
+dawson's d{s~z
+dax daks
+dax' daks
+dax's daks@z
+daxor daksP
+day dA
+day's dAz
+daya dI@
+daya's dI@z
+dayan dA~
+daybreak dAbrAk
+daycare dAker
+dayco dAk]
+daydream dAdrEm
+daydreamed dAdrEmd
+daydreaming dAdrEm6N
+daye dA
+dayhoff dAh{f
+dayhuff dAhuf
+dayle dAl
+dayley dAl/
+daylight dAlIt
+daylights dAlIts
+daylong dAl{N
+daynard dAnPd
+dayne dAn
+days dAz
+days' dAz
+daytime dAtIm
+daytimes dAtImz
+dayton dAt~
+dayton's dAt~z
+daytona dAtOn@
+daytop dAtop
+daywalt dAw@lt
+daze dAz
+dazed dAzd
+dazey dAz/
+dazs dos
+dazzle daz@l
+dazzled daz@ld
+dazzling daz@l6N
+dazzling dazl6N
+dazzo daz]
+dbase dEbAs
+ddt dEdEtE
+de d@
+de dA
+de dE
+de-excite dE6ksIt
+de-excites dE6ksIts
+dea dE
+deacon dEk~
+deaconess dEk~@s
+deacons dEk~z
+deactivate dEakt6vAt
+deactivated dEakt6vAt@d
+dead ded
+deadbeat dedbEt
+deadbeats dedbEts
+deadbolt dedbOlt
+deaden ded~
+deadening dedn6N
+deadening ded~6N
+deader dedP
+deadhead dedhed
+deadheads dedhedz
+deadlier dedl/P
+deadliest dedl/@st
+deadline dedlIn
+deadlines dedlInz
+deadliness dedl/n@s
+deadlock dedlok
+deadlocked dedlokt
+deadlocks dedloks
+deadly dedl/
+deadpan dedpan
+deadweight dedwAt
+deadwood dedwqd
+deadwyler dedwIlP
+deady ded/
+deaf def
+deafen def~
+deafening defn6N
+deafening def~6N
+deafness defn@s
+deahl dEl
+deak dEk
+deak's dEks
+deakin dEkin
+deakins dEkinz
+deal dEl
+deal's dElz
+dealba dEalb@
+deale dEl
+dealer dElP
+dealer's dElPz
+dealerline dElPlIn
+dealers dElPz
+dealers' dElPz
+dealership dElPSip
+dealership's dElPSips
+dealerships dElPSips
+dealey dEl/
+dealfish dElfiS
+dealing dEl6N
+dealings dEl6Nz
+dealmaker dElmAkP
+dealmakers dElmAkPz
+dealmaking dElmAk6N
+dealmeida d@lmEd@
+deals dElz
+dealt delt
+dealy dEl/
+deam dEm
+deamer dEmP
+dean dEn
+dean's dEnz
+deana dEan@
+deanda dEand@
+deandrade d~drod/
+deandrea dEadrA@
+deandrea dadr/@
+deandrea's dEadrA@z
+deandrea's dadr/@z
+deane dEn
+deaner dEnP
+deangelis d/anj@l@s
+deangelo d@Ngel]
+deanna dEan@
+deans dEnz
+dear dir
+dearborn dirb{rn
+dearden dird~
+deardorff dird{rf
+deardourff dird{rf
+dearest dir@st
+dearing dir6N
+dearinger dir6NP
+dearly dirl/
+dearman dirm~
+dearmas dVm@z
+dearment dirm~t
+dearmon dVm~
+dearmond dVm~d
+dearth dVT
+deary dir/
+deas dEz
+dease dEs
+deason dEz~
+deasy dEs/
+deater dEtP
+death deT
+death's deTs
+deathbed deTbed
+deatherage deTP6j
+deatherage deTr6j
+deathly deTl/
+deaths deTs
+deathshot deTS{t
+deathwatch deTwoC
+deatley dEtl/
+deaton dEt~
+deatrick dEtr6k
+deats dEts
+deaver dEvP
+deaver's dEvPz
+deavers dEvPz
+deavila d@vEl@
+deb deb
+debacker dEbakP
+debacle d@bok@l
+debacles dAbok@lz
+debakey d@bAk/
+debarment d@b)rm~t
+debarr dibar
+debarros dAb)r]z
+debartolo d@b)rt@l]
+debartolo d@bortOl]
+debartolos d@b)rt@l]z
+debartolos d@bortOl]z
+debase d@bAs
+debased d@bAst
+debasement d@bAsm~t
+debasing d@bAs6N
+debatable d@bAt@b@l
+debate d@bAt
+debate's d@bAts
+debated d@bAt@d
+debater d@bAtP
+debaters d@bAtPz
+debates d@bAts
+debating d@bAt6N
+debator d/bAtP
+debator's d/bAtPz
+debauche deb?k
+debauchery d@b{CP/
+debaun deb?n
+debbie deb/
+debbie's deb/z
+debby deb/
+debeer deb6r
+debeers d@birz
+debelak deb@l@k
+debell dEbcl
+debella d@bel@
+debellis deb@l@s
+debello d@bel]
+debenedetto dibcn@det]
+debenedictis debcn@d6kt@s
+debenture d@benCP
+debentures d@benCPz
+debentures' d@benCPz
+debernardi dibPn)rd/
+deberry dEbcr/
+debes dEbz
+debevoise debcvwoz
+debi deb/
+debiase dib/os/
+debilitate d@bil@tAt
+debilitated d@bil@tAt@d
+debilitating d@bil@tAt6N
+debility d@bil@t/
+debit debit
+deblanc diblaNk
+deblasio d@blos/]
+deblock debl@k
+deblois deblU
+debnam debn}
+debo dEb]
+deboard dEb{rd
+deboe d@bO
+deboer dEb]P
+deboers dEb]Pz
+debold deb]ld
+debolt deb]lt
+debona d@bOn@
+debonair deb~,r
+debonis deb~is
+debono d@bOn]
+debor deb{r
+debora debr@
+deborah debP@
+deborah debr@
+deborah's debP@z
+deborah's debr@z
+debord dib{rd
+deborde dib{rd
+debose deb@s
+debow deb]
+deboy dib<
+debra debr@
+debraudwick d@brodw6k
+debrief d@brEf
+debriefed d@brEft
+debriefing d@brEf6N
+debris d@brE
+debrosse debr@s
+debruhl debr@l
+debruin debrU~
+debruler debrUlP
+debruyn debrIn
+debruyne debrIn
+debs debz
+debt det
+debt's dets
+debtholder dethOldP
+debtholders dethOldPz
+debtor detP
+debtor's detPz
+debtors detPz
+debtors' detPz
+debts dets
+debug d/bug
+debugging d/bug6N
+debuhr debqr
+debunk d@buNk
+debunked d@buNkt
+debunking d@buNk6N
+debus deb@s
+debusk deb@sk
+debussy dcbus/
+debussy dcbyUs/
+debussy's dcbus/z
+debussy's dcbyUs/z
+debut dAbyU
+debut dAbyU
+debutante deby@tont
+debutantes deby@tonts
+debuted dAbyUd
+debuted dAbyUd
+debuting dAbyU6N
+debuts dAbyUz
+dec dek
+dec's deks
+decade dckAd
+decade dekAd
+decade's dekAdz
+decadence dek@d~s
+decadent dek@d~t
+decades dckAdz
+decades dekAdz
+decaf dEkaf
+decaffeinate d/kaf~At
+decaffeinated d/kaf~At@d
+decaffeinating d/kaf~At6N
+decaffeination d/kaf~AS~
+decaire dEkcr
+decals dEkalz
+decamillo dek}il]
+decamillo's dek}il]z
+decamp d@kamp
+decamped d/kampt
+decandia d6kond/@
+decant d@kant
+decanting d@kant6N
+decapitate d/kap@tAt
+decapitated d/kap@tAt@d
+decapitation d6kap@tAS~
+decapitations d6kap@tAS~z
+decaprio d6kopr/]
+decapua d6kopU@
+decarava d6ka@v@
+decarava's d6ka@v@z
+decarli d6k)rl/
+decarlo d6k)rl]
+decaro d6k)r]
+decarolis dekP@lis
+decastro d6kastr]
+decathlete d/kaTl/t
+decathlon d/kaTl{n
+decato d6kot]
+decatur d6kAtP
+decay d@kA
+decayed d@kAd
+decaying d@kA6N
+decays d@kAz
+decca dek@
+decease d@sEs
+deceased d@sEst
+dececco d@Cek]
+decedent dcsEd~t
+decedent's dcsEd~ts
+decedents dcsEd~ts
+deceit d@sEt
+deceitful d@sEtf@l
+deceits d@sEts
+deceive d@sEv
+deceived d@sEvd
+deceiving d@sEv6N
+decelerate d@selPAt
+decelerated d@selPAt@d
+decelerating d@selPAt6N
+deceleration d@selPAS~
+decelle disel
+decelles des@lz
+december d@sembP
+december's d@sembPz
+decency dEs~s/
+decennial d@sen/@l
+decent dEs~t
+decently dEs~tl/
+decentralization d@sentr@l@zAS~
+decentralize d@sentr@lIz
+decentralized d@sentr@lIzd
+decentralizing d@sentr@lIz6N
+deception d@sepS~
+deceptions d@sepS~z
+deceptive d@sept6v
+deceptively d@sept6vl/
+decertification d/sVt@f@kAS~
+decertified d/sVt@fId
+decertify d/sVt@fI
+decesare d@Ccs)r/
+decesaris d@sesP@s
+dech dek
+dechant dAC~t
+dechellis dekcl@s
+dechene dek/n
+decherd deCPd
+dechert dekPt
+dechine d@Cin
+dechine deCin
+dechristopher d@kristofP
+decibel des@bel
+decibels des@b@lz
+decicco d@CEk]
+decide d@sId
+decided d@sId@d
+decidedly d@sId@dl/
+decides d@sIdz
+deciding d@sId6N
+deciduous d@sijU@s
+deciliter des@lEtP
+decima d6CEm@
+decimal des}@l
+decimals des}@lz
+decimate des}At
+decimated des}At@d
+decimating des}At6N
+decimation des}AS~
+decipher d@sIfP
+deciphered d@sIfPd
+deciphering d@sIfP6N
+decision d@siZ~
+decision's d@siZ~z
+decisionmaker d@siZ~mAkP
+decisionmaking d@siZ~mAk6N
+decisions d@siZ~z
+decisive d@sIs6v
+decisively d@sIs6vl/
+decisiveness d@sIs6vn@s
+deck dek
+deckard d6k)rd
+decked dekt
+decker dekP
+decker's dekPz
+deckert dekPt
+decking dek6N
+deckman dekm~
+decks deks
+declaim d6klAm
+declaimed d6klAmd
+declarant d6kl,r~t
+declaration deklPAS~
+declarations deklPAS~z
+declaratory d6kl,r@t{r/
+declare d6kl,r
+declared d6kl,rd
+declares d6kl,rz
+declaring d6kl,r6N
+declassified d6klas@fId
+declassify d6klas@fI
+declerck d@klVk
+declerck's d@klVks
+declercq d@klVk
+declercq's d@klVks
+declerk d@klVk
+declerk's d@klVks
+declerque d@klVk
+declerque's d@klVks
+decline d6klIn
+declined d6klInd
+decliner d6klInP
+decliners d6klInPz
+declines d6klInz
+declining d6klIn6N
+declue deklU
+deco dek]
+decode d6kOd
+decoder d6kOdP
+decoders d6kOdPz
+decoding d6kOd6N
+decola d6kOl@
+decom dekom
+decommission d/k}iS~
+decommissioned d/k}iS~d
+decommissioning d/k}iS~6N
+decompose dEk}pOz
+decomposed dEk}pOzd
+decomposes dEk}pOz@z
+decomposing dEk}pOz6N
+decomposition dEk}p@ziS~
+decomposition dEk}p]ziS~
+decompression dEk}preS~
+deconcini dEk~sEn/
+decongestant d/k~jest~t
+decongestant d6k~jest~t
+decongestants d/k~jest~ts
+decongestants d6k~jest~ts
+deconstruct dEk~strukt
+deconstruction d/k~strukS~
+decontaminate d/k~tam~At
+decontaminated d/k~tam~At@d
+decontamination d/k~tam~AS~
+decontrol dEk~trOl
+decontrolled dEk~trOld
+decook dckqk
+decor d6k{r
+decor dAk{r
+decorate dekPAt
+decorated dekPAt@d
+decorating dekPAt6N
+decoration dekPAS~
+decorations dekPAS~z
+decorative dekr@t6v
+decorator dekPAtP
+decorators dekPAtPz
+decordova dEk{rdOv@
+decorous dekP@s
+decorte d6k{rt/
+decorum d6k{r}
+decosta d6kOst@
+decoste d6kOst/
+decoster dek@stP
+decoteau dek@t]
+decou d6kU
+decouple d/kup@l
+decoupling d/kupl6N
+decourcy dekqrk/
+decoursey dek{rs/
+decoy d@k<
+decoys dEk<z
+decrane d@krAn
+decrease d6krEs
+decrease dEkrEs
+decreased d6krEst
+decreased dEkrEst
+decreases d6krEs@z
+decreases d6krEs@z
+decreases dEkrEs@z
+decreasing d6krEs6N
+decreasing dEkrEs6N
+decree d6krE
+decreed d6krEd
+decrees d6krEz
+decrepit d@krep@t
+decrescenzo d6krcsCenz]
+decried d6krId
+decries d6krIz
+decriminalization d/krim~@l@zAS~
+decriminalize d/krim~@lIz
+decriminalizing d/krim~@lIz6N
+decristofaro d6kr/st]f)r]
+decry d6krI
+decrying d6krI6N
+decter dektP
+decuir dek6r
+decurtis d/kVt@s
+decworld dekwPld
+dede dEd
+dedeaux d@dO
+dedecker ded6kP
+dederichs dedr6ks
+dederick dedP6k
+dedeurwaerder d@dVwordP
+dedham ded}
+dedic ded6k
+dedicate ded@kAt
+dedicated ded@kAt@d
+dedicates ded6kAts
+dedicating ded6kAt6N
+dedication ded@kAS~
+dedios dAdE]z
+dedman dedm~
+dedmon dedm~
+dedo dAd]
+dedominicis dAd]m/nEs@s
+dedrick dedr6k
+deduce d@dUs
+deduced d@dUst
+deduct d@dukt
+deducted d@dukt@d
+deductibility d@dukt@bil@t/
+deductible d@dukt@b@l
+deductibles d@dukt@b@lz
+deducting d@dukt6N
+deduction d@dukS~
+deductions d@dukS~z
+deducts d@dukts
+dee dE
+dee's dEz
+deeb dEb
+deed dEd
+deeded dEd@d
+deedee dEd/
+deedrick dEdr6k
+deedrick's dEdr6ks
+deeds dEdz
+deedy dEd/
+deeg dEg
+deegan dEg~
+deehan dEhan
+deehan dE~
+deel dEl
+deeley dEl/
+deely dEl/
+deem dEm
+deemed dEmd
+deemer dEmP
+deemphasize d/emf@sIz
+deemphasizing d/emf@sIz6N
+deems dEmz
+deen dEn
+deener dEnP
+deeney dEn/
+deep dEp
+deepak dEpak
+deepen dEp~
+deepened dEp~d
+deepening dEpn6N
+deepening dEp~6N
+deepens dEp~z
+deeper dEpP
+deepest dEp@st
+deeply dEpl/
+deepwater dEpw{tP
+deer dir
+deerborne dirb{rn
+deere dir
+deere's dirz
+deerfield dirf/ld
+deering dir6N
+deerman dirm~
+deerskin dirskin
+deery dir/
+dees dEz
+deese dEz
+deeter dEtP
+deets dEts
+deetz dEts
+defabio d@fob/]
+deface d@fAs
+defaced d@fAst
+defacing d@fAs6N
+defalco d@folk]
+defamation def}AS~
+defamatory d@fam@t{r/
+defame d@fAm
+defamed d@fAmd
+defarges d@f)rj@z
+default d@f{lt
+defaulted d@f{lt@d
+defaulters d@f{ltPz
+defaulting d@f{lt6N
+defaults d@f{lts
+defazio d@foz/]
+defeasance d@fEz~s
+defeat d@fEt
+defeated d@fEt@d
+defeating d@fEt6N
+defeatism d@fEtiz}
+defeatist d@fEtist
+defeats d@fEts
+defect d@fekt
+defect dEfckt
+defected d@fekt@d
+defecting d@fekt6N
+defection d@fekS~
+defections d@fekS~z
+defective d@fekt6v
+defector d@fektP
+defectors d@fektPz
+defects d@fekts
+defects dEfckts
+defee def/
+defelice difel@s
+defenbaugh def~b?
+defence d@fens
+defend d@fend
+defendant d@fend~t
+defendant's d@fend~ts
+defendants d@fend~ts
+defendants' d@fend~ts
+defended d@fend@d
+defender d@fendP
+defender's d@fendPz
+defenders d@fendPz
+defending d@fend6N
+defends d@fendz
+defense d@fens
+defense's d@fens@z
+defenseless d@fensl@s
+defenses d@fens@z
+defensible d@fens@b@l
+defensive d@fens6v
+defensively d@fens6vl/
+defensiveness d@fens6vn@s
+defeo dEf/]
+defer d@fV
+deference defP~s
+deference defr~s
+deferential defPenC@l
+deferential defPenS@l
+deferment d@fVm~t
+deferments d@fVm~ts
+deferral d@fV@l
+deferrals d@fV@lz
+deferred d@fVd
+deferring d@fV6N
+defers d@fVz
+defex defeks
+deffenbaugh def~b?
+deffeyes dcfIz
+defiance d@fI~s
+defiant d@fI~t
+defiantly d@fI~tl/
+defibaugh defib{
+defibrillator d/fibr@lAtP
+defibrillators d/fibr@lAtPz
+deficiencies d@fiS~s/z
+deficiency d@fiS~s/
+deficient d@fiS~t
+deficit def@s@t
+deficit's def@s@ts
+deficits def@s@ts
+defied d@fId
+defies d@fIz
+defilippis d@f@lip@s
+defilippis def@l@p@s
+defilippo d@f/lEp]
+defina d@fEn@
+definable d@fIn@b@l
+define d@fIn
+defined d@fInd
+defines d@fInz
+defining d@fIn6N
+definite def~@t
+definitely def~@tl/
+definition def~iS~
+definitions def~iS~z
+definitive d@fin@t6v
+definitively d@fin@t6vl/
+defino d@fEn]
+defiore d@f/{r/
+deflate d@flAt
+deflated d@flAt@d
+deflating d@flAt6N
+deflation d@flAS~
+deflationary d@flAS~er/
+deflator d@flAtP
+deflect d@flekt
+deflected d@flekt@d
+deflecting d@flekt6N
+deflects d@flekts
+defleur d@fV
+defoe d@fO
+defoe's d@fOz
+defoliant d@fOl/~t
+defoliants d@fOl/~ts
+defoor defqr
+deford defPd
+deford's defPdz
+defore dEf{r
+deforest d@f{r@st
+deforestation d@f{r@stAS~
+deforge defPg
+deform dEf{rm
+deformation dEf{rmAS~
+deformed d@f{rmd
+deformities d@f{rm@t/z
+deformity d@f{rm@t/
+deforrest dAf{r@st
+defrain d@frAn
+defrance dEfr~s
+defrancesco d@fronCesk]
+defrancisco d@fronCEsk]
+defranco d@fronk]
+defrank defr@Nk
+defrates defPAts
+defraud d@fr{d
+defrauded d@fr{d@d
+defrauding d@fr{d6N
+defray d@frA
+defrays d@frAz
+defrees d@frEz
+defreese defr/s
+defreitas defrIt@z
+defries d@frEz
+defrost d@fr{st
+defrosting d@fr{st6N
+deft deft
+defterios deft,r/]z
+deftly deftl/
+defunct d@fuNkt
+defund d/fund
+defunding d/fund6N
+defusco d@fUsk]
+defuse d@fyUz
+defused d/fyUzd
+defused d@fyUzd
+defusing d@fyUz6N
+defy d@fI
+defying d@fI6N
+degaetano d@gocton]
+degan dEg~
+degarmo d@g)rm]
+degas dAg@s
+degaulle d@gol
+degaulle's d@golz
+degen deg~
+degener deg/nP
+degeneracy d6jenP@s/
+degenerate d6jenP@t
+degenerate d6jenPAt
+degenerated d6jenPAt@d
+degenerates d6jenP@ts
+degenerating d6jenPAt6N
+degeneration d6jenPAS~
+degenerative d6jenP@t6v
+degeneres d/j~,rcs
+degeneres d6j~,rcs
+degenhardt deg~hort
+degenhart deg~hort
+degennaro d6jcn)r]
+degeorge deg/Pg
+deger dEgP
+degiacomo dEj@k]m]
+degidio d6jEd/]
+degirolamo d6j6r]lom]
+degler deglP
+degnan degn~
+degner degnP
+degood degqd
+degraaf degrof
+degrace d6grAs
+degrace d6groC/
+degradable d6grAd@b@l
+degradation degr@dAS~
+degradations degr@dAS~z
+degrade d6grAd
+degraded d6grAd@d
+degrades d6grAdz
+degrading d6grAd6N
+degraff degr@f
+degraffenreid degr@f~rId
+degrand degrand
+degrange degrAnj
+degrasse d6gros/
+degrave d6grov/
+degraw degr{
+degray degrA
+degrazia d6groz/@
+degree d6grE
+degreed d6grEd
+degrees d6grEz
+degregorio d6grcg{r/]
+degregory degr6gP/
+degroat degr]t
+degroff degr{f
+degroot degrUt
+degroote d@grUt
+deguerin d6gV~
+deguire dAgwirA
+degussa d6gyUs@
+degutare degUt)r/
+degutare's degUt)r/z
+deguzman dAgUzman
+dehaan dehon
+dehaas dehoz
+deharbe d@h)rb/
+dehart dehort
+dehaven deh@v~
+dehecq dchek
+dehere d@hir/
+deherrera dAhcr,r@
+dehler delP
+dehm dem
+dehmer demP
+dehn den
+dehne den
+dehner denP
+dehnert denPt
+dehoff deh{f
+dehoyos deh<]z
+dehumanization dEhyUm~@zAS~
+dehumanize d@hyUm~Iz
+dehumanized d@hyUm~Izd
+dehumanizing d/hyUm~Iz6N
+dehydrate d@hIdrAt
+dehydrated d@hIdrAt@d
+dehydration dEhIdrAS~
+deibel dIb@l
+deibert dIbPt
+deibler dIb@lP
+deichert dIkPt
+deidre dEdr@
+deidre's dEdr@z
+deification dE@f@kAS~
+deify dE@fI
+deighan dAgh~
+deighton dAt~
+deignan d@gnan
+deihl dIl
+deike dEk
+deikel dIk@l
+deily dEl/
+deines dEnz
+deininger dIn6NP
+deinstitutionalization d/inst@tUS~@l@zAS~
+deinstitutionalize d/inst@tUS~@lIz
+deion dEon
+deion dEyon
+deirdre dErdr@
+deis dA6z
+deis dEz
+deisher dE6SP
+deism dEiz}
+deiss dIs
+deist dE@st
+deitch dIC
+deiter dItP
+deiters dItPz
+deities dE@t/z
+deitrich dItr6k
+deitrick dItr6k
+deitsch dIC
+deity dE@t/
+deitz dEts
+deja dAZo
+deja dEj@
+dejager dejAgP
+dejarnett d6j)rnct
+dejarnette deZornct
+dejean d6ZEn
+deject d6jekt
+dejected d6jekt@d
+dejesus d6jEz@s
+dejohn d@jon
+dejong d@j{N
+dejonge d@j{N
+dejongh d@j{N
+dejoseph d@jOs@f
+dejoy d@j<
+dejulio d@jUl/]
+dekalb d6kalb
+dekay d@kA
+dekeyser d@kIzP
+dekker dekP
+dekle dek@l
+deklerk d@klVk
+deklerk's d@klVks
+dekom dek}
+dekoning dek~6N
+dekroon dekrUn
+dekuyper d6kIpP
+del del
+del-campos dclkamp]z
+dela del@
+delacerda dcloC,rd@
+delacruz dAlokrUz
+delacy d@l{s/
+delafield del@fEld
+delafuente dAlofwentA
+delagarza dclog)rz@
+delage del6j
+delagrange dclogronj
+delahanty del@h~t/
+delahoussaye dcl@h?sA
+delahunt del@h~t
+delahunty del@h~t/
+delaine d@lAn
+delair d@l,r
+delamar dAlom)r
+delamater del}AtP
+delancey del~s/
+delancy del~s/
+deland d@land
+delane del~
+delaney d@lAn/
+delange delAnj
+delano d@lon]
+delano del~]
+delanoy del~<
+delany del~/
+delao del?
+delap del@p
+delapaz dAlopoz
+delapena dclopen@
+delapp del@p
+delara dcl)r@
+delariva dclorEv@
+delarosa dclorOs@
+delashmit del@Smit
+delashmutt del@Sm@t
+delaski d@lask/
+delatorre dclot{r/
+delatte d@lat
+delauder del?dP
+delaughter del{tP
+delaune del{n
+delaura dcl{r@
+delaurel d@l)r@l
+delaurentiis d/l{rentEz
+delaurentis dAl?rAntis
+delauter del?tP
+delaval del@val
+delavan del@v~
+delavega dAlovAg@
+delaware del@wer
+delaware's del@werz
+delawarian del@wer/~
+delawarians del@wer/~z
+delawder del{dP
+delay d@lA
+delayed d@lAd
+delaying d@lA6N
+delays d@lAz
+delbarco dclb)rk]
+delbarco's dclb)rk]z
+delbene dclben/
+delbert delbPt
+delbianco dclb/onk]
+delbosque dclbOsk
+delbridge delbr6j
+delbuono delbwOn]
+delcambre dclkombr/
+delcamp delkamp
+delcampo dclkomp]
+delcarlo delk)rl]
+delcastillo dclkostil]
+delchamps delCamps
+delcine dclCEn/
+delco delk]
+delconte dclkOnt/
+delcor delk{r
+delduca deldUk@
+delebarre del@b)r
+delectable d@lekt@b@l
+delee del/
+deleeuw del/U
+delegate del@g@t
+delegate del@gAt
+delegate's del6g@ts
+delegated del@gAt@d
+delegates del@g@ts
+delegates del@gAts
+delegates' del@gAts
+delegating del@gAt6N
+delegation del@gAS~
+delegation's del@gAS~z
+delegations del@gAS~z
+delehanty del@h~t/
+delellis d@lel@s
+delellis delcl@s
+deleo del/]
+deleon del/~
+deleonardis del/~ord@s
+delete d@lEt
+deleted d@lEt@d
+deleterious del@tir/@s
+deleting d@lEt6N
+deletion d@lES~
+deletions d@lES~z
+delfavero dclfov,r]
+delfin delfin
+delfina delfEn@
+delfine dclfEn/
+delfino delfEn]
+delfosse delf@s
+delfs delfs
+delft delft
+delftware delftwer
+delgadillo dclgodil]
+delgado dclgod]
+delgaudio dclg{d/]
+delgiorno dclj{rn]
+delgiudice dcljUd@s
+delgrande delgrand/
+delgreco delgrek]
+delgrosso delgrOs]
+delguercio dclg,rC/]
+delguidice dclgIdis
+delhaize delhAz
+delhi del/
+delhi's del/z
+deli del/
+delia dEly@
+delial d/lIcl
+delial d@lIcl
+deliberate d@libP@t
+deliberate d@libPAt
+deliberate d@libr@t
+deliberated d@libPAt@d
+deliberately d@libP@tl/
+deliberately d@libr@tl/
+deliberates d@libPAts
+deliberates d@librAts
+deliberating d@libPAt6N
+deliberation d@libPAS~
+deliberations d@libPAS~z
+deliberative d@libPAt6v
+delicacies del6k@s/z
+delicacy del@k@s/
+delicate del@k@t
+delicately del@k@tl/
+delicatessen del6k@tes~
+delicatessens del6k@tes~z
+delich del6k
+delicia dclEC@
+delicious d@liS@s
+deliciously d@liS@sl/
+delight d@lIt
+delighted d@lIt@d
+delightful d@lItf@l
+delightfully d@lItf@l/
+delighting d@lIt6N
+delights d@lIts
+delila dclEl@
+delilah d@lIl@
+delillo d@lil]
+delima dclEm@
+deline dclEn/
+delineate d@lin/At
+delineated d@lin/At@d
+delineates d@lin/Ats
+delineating d@lin/At6N
+delineation d@lin/AS~
+delinquencies d@liNkw~s/z
+delinquency d@liNkw~s/
+delinquent d@liNkw~t
+delinquents d@liNkw~ts
+delio dAl/]
+delirious d@lir/@s
+delirium d@lir/}
+delisa dclEs@
+delise delIz
+delisi dclEs/
+delisio dclEs/]
+delisle d@lIl
+delist dElist
+delisted dElist@d
+delisting d/list6N
+deliver d@livP
+deliverable d@livP@b@l
+deliverable d@livr@b@l
+deliverance d@livP~s
+deliverance d@livr~s
+delivered d@livPd
+deliverer d@livPP
+deliverers d@livPPz
+deliveries d@livP/z
+deliveries d@livr/z
+delivering d@livP6N
+delivers d@livPz
+delivery d@livP/
+delk delk
+delker delkP
+dell del
+dell'aquila del@kwEl@
+dell's delz
+della del@
+dellaert delPt
+dellaert delort
+dellapenna del@pen@
+dellaquila dAlokwEl@
+dellarocco delP]k]
+dellavalle del@vol/
+dellavecchia del@vek/@
+delle del
+deller delP
+delligatti dcl/got/
+delling del6N
+dellinger del6NP
+dellis delis
+dellolio dclOl/]
+dellums del}z
+delma delm@
+delman delm~
+delmar delmP
+delmarva delm)rv@
+delmas delm@z
+delmastro delmastr]
+delmed delmed
+delmed's delmedz
+delmer delmP
+delmonaco dclm]nok]
+delmonico dclmonEk]
+delmont dAlm]nt
+delmonte dclmont/
+delmore delm{r
+delnegro delnegr]
+delnero dcln,r]
+delo del]
+deloach del]C
+deloatch del]C
+deloitte d@l<t
+deloney del~/
+delong d@l{N
+delora dcl{r@
+delore d@l{r
+delore d@l{r/
+delore's d@l{r/z
+delore's d@l{rz
+delorean d@l{r/~
+delorenzo dAl{renz]
+delorenzo dcl{renz]
+delores d@l{r@s
+delorey delP/
+deloria dcl{r/@
+deloris delPis
+delorme dcl{rm/
+delors d@l{rz
+delosh deluS
+delosreyes dcl]srA@z
+delosreyes dcl]srAz
+delosreyes dclosPIz
+delossantos dAl]sont]z
+delouis delUEz
+delozier del@z/P
+delp delp
+delph delf
+delphax delfaks
+delphi delfI
+delphia delf/@
+delphic delf6k
+delphina dclfEn@
+delphine dclfEn/
+delpino delpEn]
+delpizzo dclpEz]
+delponte dclpOnt/
+delpozo delpOz]
+delprete delpr/t
+delpriore dclpr/{r/
+delray delrA
+delre delr
+delreal delr@l
+delrina delrEn@
+delrina's delrEn@z
+delrio delr/]
+delrosario dclr]s)r/]
+delrossi dclros/
+delrosso dclrOs]
+delsanto dclsont]
+delsignore dcls/gn{r/
+delta delt@
+delta's delt@z
+deltacorp delt@k{rp
+deltadromeus delt@drOm@s
+deltaic dcltA6k
+deltak deltak
+deltec deltek
+deltona deltOn@
+deltona's deltOn@z
+deltoro dclt{r]
+deluca d@lUk@
+delucas d@lUk@z
+delucca dclUk@
+delucchi dclUk/
+deluccia dclUC@
+delucia dclUC@
+delude d@lUd
+deluded d@lUd@d
+deluding d@lUd6N
+deluge delyUj
+deluged delyUjd
+deluise dclUs/
+deluna dclUn@
+delusion d@lUZ~
+delusional d@lUZ~@l
+delusions d@lUZ~z
+deluxe d@luks
+delvalle delval/
+delvalle's delval/z
+delve delv
+delvecchio delvek/]
+delved delvd
+delves delvz
+delving delv6N
+delwin delwin
+delwip delw@p
+delwyn delwin
+delzell delz@l
+delzer delzP
+demaggio d}oj/]
+demagogic dem@goj6k
+demagogue dem@gog
+demagoguery dem@gogP/
+demagogues dem@gogz
+demagoguing dem@gog6N
+demagogy dem@goj/
+demain d}An
+demaio d}o/]
+deman dEm~
+demand dimand
+demanded dimand@d
+demanding dimand6N
+demandingly dimand6Nl/
+demands dimandz
+demar dim)r
+demarais demPA
+demaray demPA
+demarcation dEmorkAS~
+demarcations dEmorkAS~z
+demarche d/m)rC
+demarche dim)rC
+demarchi dim)rk/
+demarco dim)rk]
+demarcus demork@s
+demaree dcmPE
+demarest dAmorAcst
+demarest demP@st
+demaria dim)r/@
+demarinis demPin@s
+demarino dimorEn]
+demario dim)r/]
+demaris demPis
+demark d})rk
+demars demPz
+demarsh demorS
+demartin dim)rtin
+demartini dimortEn/
+demartino dimortEn]
+demary demcr/
+demarzo dim)rz]
+demas dEm@s
+demasi dimos/
+demasters dEmastPz
+dematteis dem@tIz
+dematteo dimot/]
+demattia dimoS@
+demauro dim{r]
+demay demA
+demayo dAmA]
+dembeck dembek
+dembinski dcmbinsk/
+dembowski dcmb{fsk/
+dembski demsk/
+demby demb/
+demchak demC@k
+demean dimEn
+demeaned dimEnd
+demeaning dimEn6N
+demeanor dimEnP
+demeans dimEnz
+demel dem@l
+demello dimel]
+demelo dimel]
+dement d}ent
+demented diment@d
+dementia dimenS/@
+demeo dEm/]
+demeree demP/
+demerger d/mVjP
+demerist dcmVist
+demerist demP@st
+demerist's dcmV@s
+demerist's dcmV@ss
+demerist's dcmV@sts
+demerit d/m,r@t
+demerits d/m,r@ts
+demeritt demP@t
+demers dEmPz
+demery dcmV/
+demeter dimEtP
+demetre dcmEtP
+demetria dimetr/@
+demetrio dimetr/]
+demetriou dimctrEU
+demetrius dimEtr/@s
+demeyer demIP
+demi dem/
+demi's dem/z
+demicco dimEk]
+demichael dem6kcl
+demichele dem6k@l
+demick dem6k
+demilio dimEl/]
+demilitarization d/mil@tP@zAS~
+demilitarize d/mil@tPIz
+demilitarized d/mil@tPIzd
+demilitarizes d/mil@tPIz@z
+demilitarizing d/mil@tPIz6N
+demille dimEl/
+demille d}il
+demilo d}Il]
+demilo d}il]
+deming dem6N
+demint dAm/nt
+demirag dAm6roj
+demirel d}ir@l
+demirjian dimVj/~
+demisch d}iS
+demise dimIz
+demish demiS
+demjanjuk dcmyanyUk
+demjanjuk dcmyonyUk
+demjanjuk's dcmyanyUks
+demjanjuk's dcmyonyUks
+demko demk]
+demler demlP
+demma dEm@
+demme dem
+demmer demP
+demming dem6N
+demmon dem~
+demmons dem~z
+demo dem]
+demobilization d/mOb@l@zAS~
+demobilization d/mOb@lIzAS~
+demobilize dimOb@lIz
+demobilized dimOb@lIzd
+democracies dimokr@s/z
+democracy dimokr@s/
+democracy's dimokr@s/z
+democrat dem@krat
+democrat's dem@krats
+democratic dem@krat6k
+democratic's dem@krat6ks
+democratica dem@krat6k@
+democratically dem@krat6kl/
+democratics dem@krat6ks
+democratization dimokr@t@zAS~
+democratize dimokr@tIz
+democratized dimokr@tIzd
+democratizing dimokr@tIz6N
+democrats dem@krats
+democrats' dem@krats
+demodulate dEmoj@lAt
+demodulation dEmoj@lAS~
+demographer dcmogr@fP
+demographers dcmogr@fPz
+demographic dem@graf6k
+demographically dem@graf6kl/
+demographics dem@graf6ks
+demography dcmogr@f/
+demolish d}ol6S
+demolished dimol6St
+demolishing dimol6S6N
+demolition dem@liS~
+demon dEm~
+demond d}ond
+demonic dimon6k
+demonization dEm~@zAS~
+demonize dEm~Iz
+demonized dEm~Izd
+demonizer dEm~IzP
+demonizez dEm~Iz@z
+demonizing dEm~Iz6N
+demons dEm~z
+demonstrable dem~str@b@l
+demonstrably dimonstr@bl/
+demonstrate dem~strAt
+demonstrated dem~strAt@d
+demonstrates dem~strAts
+demonstrating dem~strAt6N
+demonstration dem~strAS~
+demonstrations dem~strAS~z
+demonstrative dimonstr@t6v
+demonstrator dem~strAtP
+demonstrators dem~strAtPz
+demont dem~t
+demonte d}ont/
+demopoulos d}op@l@s
+demoralization dim{r@l@zAS~
+demoralize dim{r@lIz
+demoralized dim{r@lIzd
+demoralizing dim{r@lIz6N
+demore dem{r
+demorest dAm{rcst
+demory dimV/
+demory's dimV/z
+demos demOz
+demoss d}os
+demote dimOt
+demoted dimOt@d
+demotion dimOS~
+demotions dimOS~z
+demott d}ot
+demoulin demUlan
+demov demov
+dempewolf dempyUqlf
+demps demps
+dempsey demps/
+dempster dempstP
+demski demsk/
+demsky demsk/
+demur dimV
+demure dimyqr
+demurely dimyqrl/
+demuro dimqr]
+demurred dimVd
+demurring dimV6N
+demurs dimVz
+demus dEm@s
+demuth dEm@T
+demyan demy~
+demystify d/mist@fI
+den den
+dena dEn@
+denapoli d~op@l/
+denard d~)rd
+denardo d~)rd]
+denarii d~ar/
+denarius d~ar/@s
+denaro d~)r]
+denatale dinotol/
+denationalization dEnaS~@l@zAS~
+denationalizations d/naS~@l@zAS~z
+denationalize d~aS~@lIz
+denationalized d~aS~@lIzd
+denationalizing d~aS~@lIz6N
+denature d~ACP
+denatured d~ACPd
+denault dinO
+denbo dEnb]
+denboer denb]P
+denbow denb]
+denby denb/
+denden dend~
+dendinger dEnd6NP
+dendritic dcndrit6k
+dendrochronology dendrOkr~ol@j/
+dendy dend/
+deneau dinO
+deneault dinO
+deneen dinEn
+deneke den6k
+denenberg den~bPg
+denes dEnz
+deneuve d/nuv
+deneuve dinuv
+deneve den6v
+deng deN
+deng's deNz
+dengel deNg@l
+dengler diN@lP
+dengue deng
+denham den}
+denhart denhort
+denhartog denhort@g
+denherder denhVdP
+denholm denhOlm
+deniability d~I@bil@t/
+denial d~I@l
+denials d~I@lz
+denice dinEs
+denicola dcn/kOl@
+denied d~Id
+denies d~Iz
+denigrate den6grAt
+denigrated den6grAt@d
+denigrating den6grAt6N
+denigris den6gris
+denike den6k
+denim den}
+denio dEn/]
+deniro d~ir]
+deniro's d~ir]z
+denis denis
+denise d~Es
+denison den@s~
+denison's den@s~z
+deniston den@ston
+deniz dAn/z
+denizen den@z~
+denizens den@z~z
+denk deNk
+denker deNkP
+denki deNk/
+denkins deNkinz
+denko deNk]
+denktas deNkt@s
+denlea denlE
+denley denl/
+denlinger den@l6NP
+denman denm~
+denmark denmork
+denmark's denmorks
+denmon denm~
+denn den
+dennard d~)rd
+denne den
+dennehy den@h/
+dennen den~
+denner denP
+dennett den@t
+denney den/
+dennie den/
+dennin denin
+denning den6N
+denninger den6NP
+dennington den6Nt~
+dennis denis
+dennison den@s~
+denniston den@ston
+denno den]
+denny den/
+denny's den/z
+deno dEn]
+denoble den]b@l
+denominate d~om~At
+denominated d~om~At@d
+denomination d~{m~AS~
+denomination's d~{m~AS~z
+denominational d~{m~AS~@l
+denominations d~{m~AS~z
+denominator d~om~AtP
+denomme den}
+denosse d~Os
+denosse d~{s/
+denote d~Ot
+denoted d~Ot@d
+denotes d~Ots
+denouement dAnUmon
+denounce d~?ns
+denounced d~?nst
+denounces d~?ns@z
+denouncing d~?ns6N
+denoyer den<P
+dens denz
+dense dens
+densely densl/
+denser densP
+densest dens@st
+denshin denSin
+densities dens@t/z
+densitometer dens@tom@tP
+density dens@t/
+densley densl/
+denslow denslO
+densmore dEnsm{r
+densmore densm{r
+denson dens~
+dent dent
+dental den@l
+dental dent@l
+dentals den@lz
+dentals dent@lz
+dente dent
+dented dent@d
+dentin dent~
+dentine dent/n
+denting dent6N
+dentino dcntEn]
+dentist den@st
+dentist dent@st
+dentist's den@s
+dentist's den@ss
+dentist's dent@sts
+dentistry den@str/
+dentistry dent@str/
+dentists den@s
+dentists den@ss
+dentists dent@sts
+dentists' den@sts
+dentists' dent@sts
+dentition dcntiS~
+dentler dentlP
+denton dent~
+dentremont dAntrAmont
+dents dents
+dentsu dentsU
+dentton dent~
+denture denCP
+dentures denCPz
+dentzer dentzP
+denucci d~UC/
+denuclearization d/nUkl/P@zAS~
+denuclearize d/nUkl/PIz
+denuclearized d/nUkl/PIzd
+denude d~Ud
+denuded d~Ud@d
+denuding d~Ud6N
+denunciation d~uns/AS~
+denunciations d~uns/AS~z
+denunzio d~unz/]
+denver denvP
+denver's denvPz
+denwa denwo
+deny d~I
+denying d~I6N
+denys denis
+denyse denIs
+denz denz
+denzel denz@l
+denzer denzP
+denzil denz@l
+denzler denzlP
+deo dE]
+deodorant d/OdP~t
+deodorants d/OdP~ts
+deoliveira dEol6vAr@
+deon dEon
+deoxyribonucleic d/oks/rIb]nUklA6k
+dep d@p)rtm~t
+dep dep
+depace d@poC/
+depalma d@polm@
+depalma's d@polm@z
+depalo d@pol]
+depaola d@p?l@
+depaoli d@p?l/
+depaolis dcp?lis
+depaolo d@p?l]
+depardieu dEpordU
+depardieu dEpordyu
+depart d@p)rt
+departed d@p)rt@d
+departing d@p)rt6N
+department d@p)rtm~t
+department's d@p)rtm~ts
+departmental d@portmen@l
+departmental d@portment@l
+departmentalize d@portmen@lIz
+departmentalize d@portment@lIz
+departmentalized d@portmen@lIzd
+departmentalized d@portment@lIzd
+departments d@p)rtm~ts
+departs d@p)rts
+departure d@p)rCP
+departures d@p)rCPz
+depascale d@poskol/
+depasquale d@poskwol/
+depass d@pas
+depaul d@p{l
+depaula d@p{l@
+depaulo d@p{l]
+depauw d@p?
+depend d@pend
+dependability d@pend@bil@t/
+dependable d@pend@b@l
+depended d@pend@d
+dependence d@pend~s
+dependencies d@pend~s/z
+dependency d@pend~s/
+dependent d@pend~t
+dependents d@pend~ts
+depending d@pend6N
+depends d@pendz
+depersonalize d/pVsn@lIz
+depersonalize d/pVs~@lIz
+depetro d@petr]
+depew d@pyU
+dephillips d@fil@ps
+dephillips def@l@ps
+depict d@pikt
+depicted d@pikt@d
+depicting d@pikt6N
+depiction d@pikS~
+depictions d@pikS~z
+depicts d@pikts
+depietro d@pEtr]
+depilatory d@pil@t{r/
+depina d@pEn@
+depinto d@pEnt]
+deplete d@plEt
+depleted d@plEt@d
+depleter d@plEtP
+depleters d@plEtPz
+depletes d@plEts
+depleting d@plEt6N
+depletion d@plES~
+deplorable d@pl{r@b@l
+deplore d@pl{r
+deplored d@pl{rd
+deplores d@pl{rz
+deploring d@pl{r6N
+deploy d@pl<
+deployable d@pl<@b@l
+deployed d@pl<d
+deploying d@pl<6N
+deployment d@pl<m~t
+deployments d@pl<m~ts
+deploys d@pl<z
+depner depnP
+depo dEp]
+depo dep]
+depolo d@pOl]
+deponte d@pOnt/
+depopulate d/popy@lAt
+depopulation d@popy@lAS~
+depopulation dEpopy@lAS~
+deport d@p{rt
+deportation dEp{rtAS~
+deportations dEp{rtAS~z
+deported d@p{rt@d
+deportee dEp{rtE
+deportees dEp{rtEz
+deporting d@p{rt6N
+deportment d@p{rtm~t
+depose d@pOz
+deposed d@pOzd
+deposit d@poz@t
+depositary d@poz@ter/
+deposited d@poz@t@d
+depositing d@poz@t6N
+deposition dep@ziS~
+depositional dep@ziS~@l
+depositions dep@ziS~z
+depositor d@poz@tP
+depositor's d@poz@tPz
+depositors d@poz@tPz
+depositors' d@pos@tPz
+depository d@poz@t{r/
+deposits d@poz@ts
+depot dEp]
+depot's dEp]z
+depots dEp]z
+depoy dep<
+depp dep
+deppe dep
+deppen dep~
+depravation depr@vAS~
+deprave d/prAv
+depraved d/prAvd
+depravity d@prav@t/
+deprecate depr@kAt
+deprecating depr@kAt6N
+depreciable d@priS@b@l
+depreciate d@prES/At
+depreciated d@prES/At@d
+depreciates d@prES/Ats
+depreciating d@prES/At6N
+depreciation d@prES/AS~
+depreciations d@prES/AS~z
+depredation depr@dAS~
+depredations depr@dAS~z
+depree d@prE
+deprenyl depr~il
+depress d@pres
+depressant d@pres~t
+depressants d@pres~ts
+depressed d@prest
+depresses d@pres@z
+depressing d@pres6N
+depressingly d@pres6Nl/
+depression d@preS~
+depressions d@preS~z
+depressive d@pres6v
+depressurize d@preSPIz
+depressurized d@preSPIzd
+deprey depr/
+deprez dAprez
+depriest d@prEst
+depriest depP/@st
+deprivation depr@vAS~
+deprivations depr@vAS~z
+deprive d@prIv
+deprived d@prIvd
+deprives d@prIvz
+depriving d@prIv6N
+deprogram d/prOgram
+deprogramming d/prOgram6N
+depth depT
+depths depTs
+deptula dcptUl@
+depue d@pyU
+deputies depy@t/z
+deputies depyUt/z
+deputize depy@tIz
+deputized depy@tIzd
+deputy depy@t/
+deputy depyUt/
+depuy d@pwE
+dequeker d@kwekP
+der dV
+derail d6rAl
+derailed d6rAld
+derailing d6rAl6N
+derailment d6rAlm~t
+derailments d6rAlm~ts
+derails d6rAlz
+deramo d6rom]
+deramus d,r}@s
+derange d6rAnj
+deranged d6rAnjd
+derasmo d6rosm]
+derby dVb/
+derchin dVC~
+dercole d6rkOl/
+derden dVd~
+derderian dPdir/~
+derecktor dPektP
+deregt dPekt
+deregulate d/regy@lAt
+deregulated d/regy@lAt@d
+deregulating d/regy@lAt6N
+deregulation d/regy@lAS~
+deregulator d/regy@lAtP
+deregulators d/regy@lAtPz
+deregulatory d/regy@l@t{r/
+derek d,r6k
+derelict d,r@likt
+dereliction der@likS~
+derelicts d,r@liks
+derelicts d,r@likts
+deremer d,r/mP
+deren dir~
+derenzo d6renz]
+derflinger dVf@l6NP
+derham dVh}
+derhammer dVh}P
+derick d,r6k
+derickson d,r6ks~
+deridder d,r@dP
+deride d6rId
+derided d6rId@d
+derides d6rIdz
+deriding d6rId6N
+derienzo d6rEnz]
+derik d,r6k
+dering dir6N
+deringer d,r~jP
+derington dV6Nt~
+derise d,rIz
+derision dPiZ~
+derisive dPIs6v
+derisive dPis6v
+derisively dPIs6vl/
+derisively dPis6vl/
+deriso d6rEs]
+derivation der@vAS~
+derivative dPiv@t6v
+derivatives dPiv@t6vz
+derive dPIv
+derived dPIvd
+derives d6rIvz
+derives dPIvz
+deriving dPIv6N
+derk dVk
+derks dVks
+derksen dVks~
+derleth dVlcT
+derma dVm@
+dermal dVm@l
+derman dVm~
+dermatological dVm@t@loj6k@l
+dermatologist dVm@tol@j@st
+dermatologists dVm@tol@j@s
+dermatologists dVm@tol@j@ss
+dermatologists dVm@tol@j@sts
+dermatology dVm@tol@j/
+dermer dVmP
+dermis dVm@s
+dermody dVm@d/
+dermot dVm@t
+dermott dVm@t
+dern dVn
+derner dVnP
+derobertis d,r@bPtis
+derocco d6rOk]
+deroche d,r@k
+derocher d,r@kP
+derogatory dPog@t{r/
+deroo d,rU
+deroos dirUz
+derosa d6rOs@
+derose d,r@s
+derosia d6rOs/@
+derosier d,r@s/P
+derossett d,r@sct
+derouen dPwen
+derouin dPwEn
+derousse dPUs
+deroy dir<
+derr d,r
+derrick d,r6k
+derrickson d,r6ks~
+derrico d6rEk]
+derrig d,r6g
+derring d,r6N
+derringer d,r~jP
+derrington d,r6Nt~
+derrow d,r]
+derry d,r/
+derryberry d,r/ber/
+dersch dVS
+dershem dVS}
+dershowitz dVS@wits
+dershowitz's dVS@wits@z
+derstine dVst/n
+derthick dVT6k
+derubeis d,r@bIz
+deruiter dirUtP
+deruko d6rUk]
+derus d,r@s
+derusha d,ruS@
+deruyter dirItP
+dervin dVvin
+dervish dVviS
+derward dVwPd
+derwin dVwin
+derwinski dPwinsk/
+dery d,r/
+deryck d,r6k
+deryle d,r@l
+des de
+des di
+desai dAso/
+desalination d/sAl~AS~
+desalinization d/sAl~@zAS~
+desalvo d@solv]
+desanctis dcsaNkt@s
+desanti d@sont/
+desantiago d@sont/og]
+desantis dAsont@s
+desanto d@sont]
+desantos dAsont]z
+desaulniers des]ln/Pz
+desautel des]t@l
+desautels des]t@lz
+descarpentries dAk)rp~tr/z
+descartes dAk)rt
+descartes's dAk)rts
+descend d@send
+descendant d@send~t
+descendants d@send~ts
+descendants d@sen~ts
+descended d@send@d
+descendent d@send~t
+descendents d@send~ts
+descending d@send6N
+descends d@sendz
+descent d@sent
+descents d@sents
+descenza dcSenz@
+desch deS
+deschaine dcskAn
+deschamps deS}ps
+deschene deS/n
+deschenes deS/nz
+deschepper deScpP
+deschler deS@lP
+deschner deSnP
+descoteaux desk@t]
+describable d@skrIb@b@l
+describe d@skrIb
+described d@skrIbd
+describes d@skrIbz
+describing d@skrIb6N
+description d@skripS~
+descriptions d@skripS~z
+descriptive d@skript6v
+desecrate dcs@krAt
+desecrate dcz@krAt
+desecrated dcs@krAt@d
+desecrated dcz@krAt@d
+desecration dcs@krAS~
+desecration dcz@krAS~
+desecrations dcs@krAS~z
+desecrations dcz@krAS~z
+desegregate d/segr@gAt
+desegregated d/segr6gAt@d
+desegregation d/segr@gAS~
+desegregation dEscgr@gAS~
+desena disen@
+desensitize d@sens@tIz
+desensitized d@sens@tIzd
+desensitizing d@sens@tIz6N
+deseret desPet
+deseret dezPA
+desert d@zVt
+desert dezPt
+deserted d@zVt@d
+deserter dezPtP
+deserters dezPtPz
+deserting dezPt6N
+desertion d@zVS~
+desertions d@zVS~z
+deserts d@zVts
+deserts dezPts
+deserve d@zVv
+deserved d@zVvd
+deservedly d@zVv@dl/
+deserves d@zVvz
+deserving d@zVv6N
+desha deS@
+deshaies dcSAz
+deshane deS~
+deshaw deS{
+deshazer deS@zP
+deshazo dASoz]
+deshields deS/ldz
+deshler deSlP
+deshon deS~
+deshong deS{N
+deshotel deS@t@l
+deshotels deS@t@lz
+desi dez/
+desiccation des@kAS~
+desiderio dcs/d,r/]
+design d@zIn
+designate dez6gnAt
+designated dez6gnAt@d
+designates dez6gnAts
+designating dez6gnAt6N
+designation dez6gnAS~
+designations dez6gnAS~z
+designcraft d@zInkraft
+designed d@zInd
+designee dez6gnE
+designees dez6gnEz
+designer d@zInP
+designer's d@zInPz
+designers d@zInPz
+designers' d@zInPz
+designing d@zIn6N
+designs d@zInz
+desilets des@lits
+desillers disilPz
+desilva disElv@
+desimone d@s/mOn/
+desio dEs/]
+desir disir
+desirability d@zIr@bil@t/
+desirable d@zIP@b@l
+desirable d@zIr@b@l
+desire d@zIP
+desired d@zIPd
+desiree desIr/
+desires d@zIPz
+desiring d@zIP6N
+desirous d@zIr@s
+desist d@sist
+desist d@zist
+desisto disEst]
+desjardin desZordan
+desjardins desZordinz
+desjarlais desZorlA
+desk desk
+deskin deskin
+deskins deskinz
+deskjet deskjet
+deskpro deskprO
+desks desks
+desktop desktop
+desktops desktops
+deslatte d@slat
+deslauriers desl{r/Pz
+desma dEsm@
+desman desm~
+desmarais dezmPA
+desmet desmct
+desmids desm@dz
+desmith desmiT
+desmona dcsmOn@
+desmond dezm~d
+desnoyers desn<Pz
+desolate des@l@t
+desolate des@lAt
+desolate dez@l@t
+desolation des@lAS~
+desormeaux desPm]
+desoto disOt]
+desousa dis?s@
+desouza dAsUz@
+despain dispAn
+despair disp,r
+despaired disp,rd
+despairing disp,r6N
+despairs disp,rz
+desper despP
+desperado despPod]
+desperadoes despPod]z
+desperate despP@t
+desperate despr@t
+desperately despP@tl/
+desperately despr@tl/
+desperation despPAS~
+despicable dispik@b@l
+despina's desp/n@z
+despise dispIz
+despised dispIzd
+despises dispIz@z
+despite dispIt
+despondency dispond~s/
+despondent dispond~t
+desposito disp]sEt]
+despot desp@t
+despotic dispot6k
+despotism desp@tiz}
+despres despPz
+desrochers dArOSPz
+desroches dArOS@z
+desrosier dArOS/P
+desrosiers dArOS/Pz
+desrosiers dAr]Zirz
+dessauer des?r
+dessauer dis?r
+desselle disel
+dessent disent
+dessert dizVt
+desserts dizVts
+dest dest
+destabilization d/stAb@l@zAS~
+destabilize d/stAb@lIz
+destabilized d/stAb@lIzd
+destabilizing d/stAb@lIz6N
+destec destek
+destefanis d@st@fon6s
+destefano d@stcfon]
+destin destin
+destination dest~AS~
+destinations dest~AS~z
+destined dest~d
+destinies dest~/z
+destiny dest~/
+destitute dest@tUt
+destitution dest@tUS~
+destroy d@str<
+destroyed d@str<d
+destroyer d@str<P
+destroyers d@str<Pz
+destroying d@str<6N
+destroys d@str<z
+destruct d@strukt
+destructed d@strukt@d
+destructing d@strukt6N
+destruction d@strukS~
+destructive d@strukt6v
+destructiveness d@strukt6vn@s
+destructs d@strukts
+desultory des@lt{r/
+detach d/taC
+detach d@taC
+detachable d/taC@b@l
+detachable d@taC@b@l
+detached d/taCt
+detached d@taCt
+detaches d/taC@z
+detaches d@taC@z
+detachment d/taCm~t
+detachment d@taCm~t
+detail d@tAl
+detail dEtAl
+detailed d@tAld
+detailee d@tAlE
+detailer dEtAlP
+detailing d@tAl6N
+details d@tAlz
+details dEtAlz
+detain d@tAn
+detained d@tAnd
+detainee dEtAnE
+detainees d@tAnEz
+detaining d@tAn6N
+detamore dctom{r
+detar d/t)r
+detect d@tekt
+detectable d@tekt@b@l
+detected d@tekt@d
+detecting d@tekt6N
+detection d@tekS~
+detective d@tekt6v
+detective's d@tekt6vz
+detectives d@tekt6vz
+detector d@tektP
+detectors d@tektPz
+detects d@tekts
+detemple detcmp@l
+detente dAtont
+detention d@tenS~
+detentions d@tenS~z
+deter d@tV
+deterding detPd6N
+detergent d@tVj~t
+detergents d@tVj~ts
+deteriorate d@tir/PAt
+deteriorated d@tir/PAt@d
+deteriorates d@tir/PAts
+deteriorating d@tir/PAt6N
+deterioration d@tir/PAS~
+determan dEtPm~
+determent d@tVm~t
+determinable d@tVm~@b@l
+determinant d@tVm~~t
+determinants d@tVm~~ts
+determinate d@tVm~At
+determination d@tVm~AS~
+determination's d@tVm~AS~z
+determinations d@tVm~AS~z
+determinative d@tVm~@tiv
+determine d@tVm~
+determined d@tVm~d
+determinedly d@tVm~@dl/
+determinedly d@tVm~dl/
+determines d@tVm~z
+determining d@tVm~6N
+determinism d@tVm~iz}
+determinist d@tVm~@st
+deterministic d@tVm~ist6k
+deterred d@tVd
+deterrence d@tV~s
+deterrent d@tVr~t
+deterrents d@tV~ts
+deterring d@tV6N
+deters d@tVz
+detert detPt
+detest d/test
+detest d@test
+detested d/test@d
+detested d@test@d
+detherage deTP6j
+dethlefs deTlcfs
+dethlefsen deTlcfs~
+dethloff deTl{f
+dethomas diTOm@z
+dethrone d/TrOn
+dethroned d/TrOnd
+detienne det/cn
+detjen detj~
+detlefsen detlcfs~
+detloff detl{f
+detmer detmP
+detonate det~At
+detonated det~At@d
+detonating det~At6N
+detonation det~AS~
+detonations det~AS~z
+detonator det~AtP
+detonators det~AtPz
+detore dit{r/
+detour dEtqr
+detour ditqr
+detoured dEtqrd
+detours dEtqrz
+detours ditqrz
+detox dEtoks
+detoxication d@toks6kAS~
+detoxification d@toks@f6kAS~
+detoxify d@toks@fI
+detract d@trakt
+detracted d@trakt@d
+detracting d@trakt6N
+detractor d/traktP
+detractor d@traktP
+detractors d/traktPz
+detractors d@traktPz
+detracts d@trakts
+detrich detr6k
+detrick detr6k
+detriment detr}~t
+detrimental detr}en@l
+detrimental detr}ent@l
+detritus d@trIt@s
+detritus detr@t@s
+detro dEtr]
+detroit d@tr<t
+detroit dEtr<t
+detroit's d@tr<ts
+detroit's dEtr<ts
+detroiters d@tr<tPz
+detroiters dEtr<tPz
+detter detP
+dettinger det~jP
+dettling detl6N
+dettloff detl{f
+dettman detm~
+dettmann detm~
+dettmer detmP
+dettore d@t{r/
+detty det/
+deturk detPk
+detweiler detwIlP
+detwiler detwIlP
+detzel detz@l
+deubel d<b@l
+deubler d<b@lP
+deuce dUs
+deuel dUcl
+deukmejian dUkmAj/~
+deukmejian's dUkmAj/~z
+deupree dUprE
+deuschle d<S@l
+deuser d<sP
+deuss dUs
+deutch d<C
+deuterium dUtEr/}
+deuterons dUtPonz
+deutsch d<C
+deutsche d<C
+deutschemark d<Cmork
+deutschemark's d<Cmorks
+deutschemarks d<Cmorks
+deutscher d<CP
+deutschland d<Cland
+deutschman d<Cm~
+deutz d<ts
+deux dU
+dev dev
+deva dAv@
+deval d6vol
+deval's d6volz
+devall dAvol
+devalle d6val
+devaluate d6valyUAt
+devaluated d6valyUAt@d
+devaluation d6valyUAS~
+devaluation dEvalyUAS~
+devaluations dEvalyUAS~z
+devalue d6valyU
+devalued d/valyUd
+devalued d6valyUd
+devaluing d6valyU6N
+devan dev~
+devane d6vAn
+devaney dev~/
+devany dev~/
+devastate dev@stAt
+devastated dev@stAt@d
+devastating dev@stAt6N
+devastatingly dev@stAt6Nl/
+devastation dev@stAS~
+devaughn dev{n
+devaul d6vOl
+devault d6vO
+devaux d6vO
+deveau d6vO
+deveaux d6vO
+develcon d@velk~
+develle d@vel
+develop d6vel@p
+developable d6vel@p@b@l
+developed d6vel@pt
+developer d6vel@pP
+developer's d6vel@pPz
+developers d6vel@pPz
+developers' d6vel@pPz
+developing d6vel@p6N
+development d6vel@pm~t
+development's d6vel@pm~ts
+developmental d6vel@pmen@l
+developmental d6vel@pment@l
+developmentally d6vel@pmen@l/
+developmentally d6vel@pment@l/
+developments d6vel@pm~ts
+develops d6vel@ps
+devendorf dev~d{rf
+deveney dev~/
+devenney dev~/
+devenny dev~/
+devenport d6venp{rt
+devens dEv~z
+deveny d6vEn/
+dever dEvP
+devera dAv,r@
+deveraux devP]
+devere dAv,rA
+devereaux devP]
+deverell dAvcrAl
+devereux devPU
+deveroy devP<
+devers devPz
+devey d6vA
+deviance dEv/~s
+deviancy dEv/ens/
+deviancy dEvycns/
+deviant dEv/~t
+deviants dEv/~ts
+deviate dEv/At
+deviated dEv/At@d
+deviates dEv/Ats
+deviation dEv/AS~
+deviations d/v/AS~z
+device d6vIs
+device's d6vIs@z
+devices d6vIs@z
+devil dev@l
+devil's dev@lz
+devilbiss d@vilb@s
+devilbiss dev@lb@s
+devilish devl6S
+devilishly dev@l6Sl/
+devilishly devl6Sl/
+deville d@vil
+deville's d@vilz
+devillier d@vilyP
+devillier's d@vilyPs
+devils dev@lz
+devilwood dev@lwqd
+devin devin
+devincent dAvEns~t
+devincentis dcvinsent@s
+devincenzi d6v/nCenz/
+devincenzo d6v/nCenz]
+devinci's d6vinC/z
+devine d@vIn
+deviney devin/
+devinney devin/
+devino d6vEn]
+devins devinz
+devious dEv/@s
+devise d6vIs
+devise d6vIz
+devised d6vIzd
+devises d6vIz@z
+devising d6vIz6N
+devita d6vEt@
+devito d6vEt]
+devitt d6vit
+devivo d6vEv]
+devlin devlin
+devoe d6vO
+devoid d6v<d
+devol dev{l
+devolder dev]ldP
+devoll dev@l
+devolution dev@lUS~
+devolve d6volv
+devolved d6volvd
+devon dev~
+devona dev~@
+devonian d6vOn/~
+devonshire d6vonSIr
+devor d6v{r
+devore devP
+devos dEv]z
+devoss d6vos
+devote d6vOt
+devoted d6vOt@d
+devotee dev@tE
+devotees dev@tEz
+devotes d6vOts
+devoting d6vOt6N
+devotion d6vOS~
+devotional d6vOS~@l
+devoto d6vOt]
+devour d6v?P
+devoured d6v?Pd
+devouring d6v?P6N
+devours d6v?Pz
+devout d6v?t
+devoutly d6v?tl/
+devoy dev<
+devries d6vrEs
+devry devr/
+dew dU
+dewaard dU)rd
+dewaele dUcl
+dewald dU@ld
+dewall dU@l
+dewalt dU@lt
+dewan dU~
+dewar dUP
+dewar's dUPz
+deware dUcr
+dewarr dUP
+dewart dUort
+dewayne d/wAn
+dewayne diwAn
+dewberry dUber/
+dewbre dUbP
+dewclaw dUkl{
+deweerd dU6rd
+dewees dU/z
+deweese dU/z
+deweiss d@wIs
+dewell dewcl
+dewey dU/
+dewey's dU/z
+dewhirst dewPst
+dewhurst dewPst
+dewilde dEwIld
+dewine d@wIn
+dewing dU6N
+dewinter d@wintP
+dewinter dUintP
+dewire dUIr
+dewit dU@t
+dewitt d@wit
+dewitte dUit
+dewitz dewits
+dewolf dUqlf
+dewolfe dUqlf
+dewoody dEwqd/
+dews dUz
+dewulf dU@lf
+dewy dU/
+dex deks
+dexfenfluramine deks~fl{r}/n
+dexheimer dekshImP
+dexter dekstP
+dexter's dekstPz
+dexterity dckst,r@t/
+dextra dekstr@
+dextran dekstran
+dextrathoraphan dckstr@T{r@f~
+dextro dekstr]
+dextrose dekstr]s
+dextrous dekstr@s
+dey dA
+deyo dA]
+deyoe dA]
+deyoung dey@N
+deyton dAt{n
+dezarn dAz)rn
+dezeeuw dizEU
+dezern dAz,rn
+deziel dez/l
+dfw dEefdub@lyU
+dfw dEefdub@yU
+dhabi dob/
+dhaharan d@ron
+dhahran d@ron
+dhahran duron
+dhaka dak@
+dhaka daka
+dhaka dok@
+dhali dol/
+dharma d)rm@
+dhein dIn
+dhia dE@
+dhillon dil~
+dhiraj diroZ
+dhlakama d@l@kom@
+dhole dOl
+dhondt dhont
+dhows d?z
+di dE
+di dI
+di's dIz
+dia dE@
+diab dI@b
+diabase dI@bAs
+diabasic dI@bAs6k
+diabetes dI@bEt/z
+diabetic dI@bet6k
+diabetics dI@bet6ks
+diablo dEabl]
+diablo dIabl]
+diabolical dI@bol6k@l
+diaconate dIak~@t
+diacritic dI@krit@k
+diacritical dI@krit@k@l
+diadem dI@dem
+diagnose dI@gnOs
+diagnosed dI@gnOst
+diagnoses dI@gnOs/z
+diagnosing dI@gnOs6N
+diagnosis dI@gnOs@s
+diagnostek dI@gnostck
+diagnostic dI@gnost6k
+diagnostics dI@gnost6ks
+diagonal dIag~@l
+diagonally dIag~@l/
+diagonals dIag~@lz
+diagram dI@gram
+diagraming dI@gram6N
+diagrammatic dI@gr}at6k
+diagrammed dI@gramd
+diagrams dI@gramz
+diahann dIan
+dial dI@l
+dial dIl
+dial's dI@lz
+dial's dIlz
+dialect dI@lekt
+dialectic dI@lekt6k
+dialectical dI@lekt6k@l
+dialects dI@lekts
+dialed dI@ld
+dialing dI@l6N
+dialing dIl6N
+dialog dI@l{g
+dialogue dI@l{g
+dialogues dI@l{gz
+dials dI@lz
+dials dIlz
+dialtone dI@ltOn
+dialtone dIltOn
+dialysis dIal@s@s
+diamagnetic dI}agnet6k
+diamagnetism dI}agn@tiz}
+diamandis dE}andis
+diamandis dI}andis
+diamant dI}~t
+diamanta dI}ant@
+diamante dI}ont/
+diameter dIam@tP
+diametrically dI}etr6k@l/
+diametrically dI}etr6kl/
+diamond dIm~d
+diamond's dIm~dz
+diamonds dIm~dz
+dian dI~
+diana dIan@
+diana's dIan@z
+diane dIan
+diane's dIanz
+dianetics dI~et6ks
+diangelo dI@Ngel]
+dianna dIan@
+dianne dIan
+diantha dIanT@
+dianthe dIanT/
+dianthia dIanT/@
+diantonio dI~tOn/]
+diaper dIpP
+diapering dIpP6N
+diapers dI@pPz
+diapers dIpPz
+diaphonia dI@fOn/@
+diaphragm dI@fram
+diapsid dIaps@d
+diaries dIP/z
+diaries dIr/z
+diario dI,r/]
+diarrhea dIPE@
+diarrhoea dIPE@
+diary dIP/
+diary dIr/
+dias dI@z
+diasa d/os@
+diasa's d/os@z
+diasonic dI@son6k
+diasonics dI@son6ks
+diaspora dIaspP@
+diastase dI@stAs
+diastole dIast@lE
+diastolic dI@stol6k
+diastrophism dIastr@fiz}
+diathermy dI@TVm/
+diatomic dI@tom6k
+diatoms dI@tomz
+diatonic dI@ton6k
+diatribe dI@trIb
+diatribes dI@trIbz
+diaz dEaz
+diaz dEoz
+diaz-calderon dEazkaldPOn
+diazo dIazO
+dibacco d@bok]
+dibari d@b)r/
+dibartolo dEbortOl]
+dibartolomeo d/bort]lOm/]
+dibattista d/botEst@
+dibb dib
+dibbern dibPn
+dibble dib@l
+dibbled dib@ld
+dibella d@bel@
+dibello d@bel]
+dibenedetto d/bcn@det]
+dibernardo d/bPn)rd]
+dibert dibPt
+dibiase dEb/os/
+dibiasio d@b/os/]
+diblasi d@blos/
+diblasio d@blos/]
+dible dIb@l
+diboll dib@l
+dibona d@bOn@
+dibrell dibr@l
+dibs dibz
+dibuono d@bwOn]
+dic dik
+dicamba d6kamb@
+dicamillo d6komil]
+dicaprio d6kapr/]
+dicarlo d6k)rl]
+dice dIs
+dicecco disek]
+diced dIst
+dicello disel]
+dicenso disens]
+dicenzo disenz]
+diceon dis/~
+dicesare diCcs)r/
+dicey dIs/
+dichiara dik/)r@
+dichotomy dIkot}/
+dichroic dIkrO6k
+dichromate dIkrOmAt
+dichromate dIkr]mAt
+dichter diktP
+dicicco disik]
+dicier dIs/P
+dicioccio d6COC/]
+dick dik
+dick's diks
+dickard dikPd
+dickason dik@s~
+dicke dik
+dickel dik@l
+dicken dik~
+dickens dik~z
+dickens' dik~z
+dickens's dik~z@z
+dickensheets dik~SEts
+dickensian d6kenz/~
+dickenson dik~s~
+dicker dikP
+dickered dikPd
+dickering dikP6N
+dickerman dikPm~
+dickerson dikPs~
+dickert dikPt
+dickes diks
+dickeson dik@s~
+dickey dik/
+dickey's dik/z
+dickhaut dikh?t
+dickie dik/
+dickinson dik~s~
+dickison dik@s~
+dickler diklP
+dickman dikm~
+dickmann dikm~
+dickmeyer dikmIP
+dicks diks
+dickson diks~
+dickstein dikst/n
+dickstein dikstIn
+dickstein's dikstEnz
+dickstein's dikstInz
+dicky dik/
+diclemente dikl}entA
+dicocco d6kOk]
+dicola d6kOl@
+dicomed d/kOmd
+dicomed dik}cd
+dicostanzo d6k]stonz]
+dicots dIkots
+dicta dikt@
+dictaphone dikt@fOn
+dictate d6ktAt
+dictate diktAt
+dictated diktAt@d
+dictates d6ktAts
+dictates diktAts
+dictating diktAt6N
+dictation d6ktAS~
+dictator d6ktAtP
+dictator diktAtP
+dictatorial dikt@t{r/@l
+dictators d6ktAtPz
+dictators diktAtPz
+dictatorship d6ktAtPSip
+dictatorships d6ktAtPSips
+diction dikS~
+dictionaries dikS~er/z
+dictionary dikS~er/
+dictum dikt}
+dicus dIk@s
+did d@d
+did did
+didactic dIdakt6k
+diddley didl/
+diddy did/
+didemeyer dEd}IP
+didemeyer's dEd}IPz
+dideoxycytidine did/oks/sIt@dIn
+didi dEd/
+didier did/P
+didinium d@din/}
+didion did/~
+didion's did/~z
+didn't did~
+didn't did~t
+didn't dint
+dido dId]
+didomenico d@d]men6k]
+didonato d@d]not]
+didonna d@don@
+die dI
+diebel dEb@l
+diebold dIbOld
+dieck dEk
+dieckman dEkm~
+dieckmann dEkm~
+died dId
+diede dEd
+diederich dEdP6k
+diedre dEdr@
+diedrich dEdr6k
+diedrick dEdr6k
+diefenbach dEf~bok
+diefenderfer dEf~dPfP
+diefendorf dEf~d{rf
+dieffenbach dEf~bok
+diegans dEg~z
+diegel dEg@l
+diego d/Ag]
+diego's dEAgOz
+diego-garcia dEAg]gorsE@
+dieguez d6gez
+diehard dIhord
+diehards dIhordz
+diehl dEl
+diehm dEm
+diekman dEkm~
+diekmann dEkm~
+diel dEl
+diem dEm
+diemer dEmP
+diemert dEmPt
+diener dEnP
+dienes dEncz
+dienst dEnst
+diep dEp
+dier dEP
+diercks dErks
+dieringer dir~jP
+dierker dErkP
+dierkes dErks
+dierking dIPk6N
+dierks dErks
+dierolf dir]lf
+diers dEPz
+diery dir/
+dies dIz
+diesel dEs@l
+diesel dEz@l
+diesels dEz@lz
+dieses dIz@z
+diesing dEs6N
+diet dI@t
+diet's dI@ts
+dietary dI@ter/
+dietel dEt@l
+dieter dEtP
+dieterich dEtP6k
+dieterle dEtP@l
+dieters dI@tPz
+dietetic dI@tet6k
+dieting dI@t6N
+dietitian dI@tiS~
+dietitian's dI@tiS~z
+dietitians dI@tiS~z
+dietl dI@tl
+dietrich dEtr6k
+dietrick dEtr6k
+diets dI@ts
+dietsch dEC
+dietsche dEC
+dietz dEts
+dietze dI@tz
+dietzel dEtz@l
+dietzen dEtz~
+dietzler dEtslP
+dietzman dEtsm~
+dievler dEvlP
+diez dI@z
+difabio d@fAb/]
+difalco d@falk]
+difazio d@fAz/]
+difelice d@fel/s
+difelice d@fel@s
+difelice dif@lECA
+diff dif
+diffee dif/
+diffenderfer dif~dPfP
+differ difP
+differed difPd
+difference difP~s
+difference difr~s
+differences difP~s@z
+differences difr~s@z
+different difP~t
+different difr~t
+differential difPenC@l
+differential difPenS@l
+differentials difPenC@lz
+differentials difPenC@lz
+differentiate difPenC/At
+differentiate difPenS/At
+differentiated difPenC/At@d
+differentiated difPenS/At@d
+differentiates difPenC/Ats
+differentiates difPenS/Ats
+differentiating difPenC/At6N
+differentiating difPenS/At6N
+differentiation difPenC/AS~
+differentiation difPenS/AS~
+differently difPentl/
+differently difr~tl/
+differing difP6N
+differing difr6N
+differs difPz
+difficult dif@k@lt
+difficulties dif@k@lt/z
+difficultly dif@k@ltl/
+difficulty dif6kult/
+diffin difin
+diffley difl/
+diffract d@frakt
+diffraction d@frakS~
+diffuse d@fyUs
+diffuse d@fyUz
+diffused d@fyUzd
+diffuses d@fyUz@z
+diffusing d@fyUz6N
+diffusion d@fyUZ~
+difilippo dif/lEp]
+difiore d@f/{r/
+difiore d@fy{r/
+difm dEIefem
+difm difm
+difonzo d@fonz]
+difrancesco d@fronCesk]
+difranco d@fronk]
+dig dig
+digaetano d6j@ton]
+digalakis d6j@lok@s
+digangi d6ganj/
+digate dIgAt
+digby digb/
+digennaro d6jcn)r]
+digenova dEjcnOv@
+digeronimo d6jP]nEm]
+digest dIjcst
+digest dIjest
+digest's dIjests
+digested dIjest@d
+digester dIjestP
+digestible dIjest@b@l
+digesting dIjest6N
+digesting dIjest6N
+digestion dIjesC~
+digestive dIjest6v
+digests d@jes
+digests d@jess
+digests d@jests
+digests dIjcs
+digests dIjcss
+digests dIjcsts
+digga dig@
+digger digP
+diggers digPz
+digges digz
+digging dig6N
+diggins diginz
+diggle dig@l
+diggs digz
+digiacomo dEj@k]m]
+digicon dij6kon
+digidyne dij@dIn
+digilio d6jEl/]
+digioia d6jOy@
+digiorgio d6j{rj/]
+digiovanna d6j]von@
+digiovanni d6j]von/
+digirolamo d6j6r]lom]
+digit dij@t
+digital dij@t@l
+digital's dij@t@lz
+digitalis dij@tal@s
+digitally dij@t@l/
+digitech dij@tek
+digitize dij@tIz
+digitized dij@tIzd
+digitizing dij@tIz6N
+digits dij@ts
+digiulio d6jUl/]
+digiuseppe dEjUsep/
+digman digm~
+dignan dign~
+dignified dign@fId
+dignify dign@fI
+dignitaries dign@ter/z
+dignitary dign@ter/
+dignity dign@t/
+digrazia d6groz/@
+digregorio d6grcg{r/]
+digress dIgres
+digressed dIgrest
+digressing dIgres6N
+digression dIgreS~
+digressions dIgreS~z
+digs digz
+diguglielmo d6gUgl/elm]
+diianni dEan/
+diiorio d@y{r/]
+dijker dEkP
+dijon d/ZOn
+dijon dEZon
+dike dIk
+dikeman dIkm~
+dikes dIks
+dilapidate d@lap@dAt
+dilapidated d@lap@dAt@d
+dilatation dil@tAS~
+dilate dIlAt
+dilated dIlAt@d
+dilation dIlAS~
+dilatory dil@t{r/
+dilaura d@l{r@
+dilauro d@l{r]
+dilbeck dilbek
+dilday dildA
+dildine dildEn/
+dildy dild/
+dilella d@lel@
+dilello d@lel]
+dilemma d@lem@
+dilemmas d@lem@z
+dilenschneider dIl~SnIdP
+dileo dil/]
+dileonardo d@l/~)rd]
+diles dIlz
+dilg dilg
+dilger dilgP
+diliberto d@l/b,rt]
+diligence dil@j~s
+diligent dil6j~t
+diligently dil@j~tl/
+dilip dilip
+dilithium dIliT/}
+dilks dilks
+dill dil
+dillahunt dil@hunt
+dillahunty dil@hunt/
+dillard dil@d
+dillard dilPd
+dillard dilord
+dillard's dil@dz
+dillard's dilPdz
+dillard's dilordz
+dille dil
+dillehay dil@hA
+dillen dil~
+dillenbeck dil~bek
+dillenburg dil~bPg
+diller dilP
+diller's dilPz
+dilley dil/
+dillie dil/
+dillin dilin
+dilling dil6N
+dillinger dil6NP
+dillingham dil6Nham
+dillion dily~
+dillman dilm~
+dillmore dilm{r
+dillon dil~
+dillon's dil~z
+dillow dil]
+dills dilz
+dillworth dilwVT
+dilly dil/
+dilmore dElm{r
+dilorenzo d@l{renz]
+diloreto d@l{ret]
+dilorio d@l{r/]
+dils dilz
+dilsaver dils@vP
+dilson dils~
+diltiazem diltE@zem
+dilts dilts
+diltz dilts
+dilullo d@lUl]
+dilute d@lUt
+dilute dIlUt
+diluted d@lUt@d
+diluted dIlUt@d
+dilutes d@lUts
+dilutes dIlUts
+diluting d@lUt6N
+diluting dIlUt6N
+dilution d@lUS~
+dilution dIlUS~
+dilutive d/lUt6v
+dilutive d@lUt6v
+diluzio d@lUz/]
+dilworth dilwPT
+dim dim
+dimaggio d}aj/]
+dimaio dimo/]
+dimambro dimambr]
+dimarco dim)rk]
+dimare dim)r/
+dimaria dim)r/@
+dimarino d/morEn]
+dimario dim)r/]
+dimartino dEmortEn]
+dimarzio dim)rz/]
+dimarzo dim)rz]
+dimas dIm@z
+dimascio dimas/]
+dimasi dimos/
+dimatteo dimot/]
+dimauro dim{r]
+dime dIm
+dime's dImz
+dimeglio dimegl/]
+dimenaci dime@C/
+dimension dimenS~
+dimensional dimenS~@l
+dimensionality dimenS~al@t/
+dimensioned d}enC~d
+dimensions dimenS~z
+dimeo dEm/]
+dimer dImP
+dimercurio dimPkqr/]
+dimes dImz
+dimetapp dIm@tap
+dimiceli dim/Cel/
+dimichele dim/kel/
+dimick dim6k
+diming dIm6N
+diminish d}in6S
+diminished d}in6St
+diminishes d}in6S@z
+diminishing d}in6S6N
+diminishment d}in6Sm~t
+dimino d}En]
+diminution dim~US~
+diminutive d}iny@t6v
+dimitri dimEtr/
+dimitrios dimEtr/]s
+dimitrius dimEtr/@s
+dimitrius' dimEtr/@s
+dimitrius's dimEtr/@s@z
+dimitroff dim@tr{f
+dimitruk dimEtrqk
+dimly diml/
+dimmed dimd
+dimmer dimP
+dimmers dimPz
+dimmick dim6k
+dimming dim6N
+dimmitt dimit
+dimock dim@k
+dimon dim~
+dimona dimOn@
+dimond dIm~d
+dimorphic dIm{rf6k
+dimorphism dIm{rfiz}
+dimperio dimp,r/]
+dimple dimp@l
+dimpled dimp@ld
+dimry dimr/
+dims dimz
+dimsdale dimzdAl
+dimuro dimqr]
+dimuzio dimUz/]
+din din
+dina dEn@
+dinah dIn@
+dinan din~
+dinapoli d~ap@l/
+dinar din)r
+dinardo din)rd]
+dinars dInPz
+dinars din)rz
+dinatale d/notol/
+dinda dind@
+dine dIn
+dined dInd
+dineen d~En
+dinehart dInhort
+diner dInP
+diners dInPz
+dines dInz
+dinesh dincS
+ding diN
+dingee diNg/
+dingel diNg@l
+dingell diNg@l
+dingell's diNg@lz
+dinger diNP
+dinges dinj@z
+dingess diNgis
+dingham diN}
+dinghy diN/
+dingle diNg@l
+dingledine diNg@ldIn
+dingler diNg@lP
+dingler diNglP
+dingley diNgl/
+dingman diNm~
+dingo diNg]
+dings diNz
+dingus diNg@s
+dingwall diNgw@l
+dingy dinj/
+dinh din
+dini dEn/
+dinicola din/kOl@
+dining dIn6N
+dinino d~En]
+dinius dIn/is
+dink diNk
+dinkel diNk@l
+dinkins diNk~z
+dinkins' diNk~z
+dinky diNk/
+dinmukhamed dinmUkomcd
+dinneen d~En
+dinner dinP
+dinners dinPz
+dinnertime dinPtIm
+dinnerware dinPwer
+dinning din6N
+dino dEn]
+dinosaur dIn@s{r
+dinosaurs dIn@s{rz
+dinoseb dIn]seb
+dinoto d~Ot]
+dinotopia dIn@tOp/@
+dinovo d~Ov]
+dinsa dins@
+dinsdale dinzdAl
+dinse dins
+dinsmore dEnsm{r
+dint dint
+dinunzio d~unz/]
+dinwiddie dinw@d/
+diocesan dIos@s~
+diocese dI@s@s
+diocese dI@sEz
+dioceses dI@sEz
+dioceses dI@sEz@z
+diodati d/]dot/
+diodato d/]dot]
+diode dIOd
+diodes dIOdz
+dioguardi d/]g)rd/
+dion dE{n
+dion dI~
+diona d/On@
+dione dEon
+dionisio dI~is/]
+dionne dEon
+dionysius dI~is/@s
+dior dE{r
+diorio d/{r/]
+diorite dIPIt
+dios dE]s
+dios' dE]s
+dios's dE]s@z
+dioxide dIoksId
+dioxides dIoksIdz
+dioxin dIoks~
+dioxins dIoks~z
+dip dip
+dipalma d@polm@
+dipaola d@poOl@
+dipaolo d@poOl]
+dipasquale d/poskwol/
+diperna dip,rn@
+diphtheria difTir/@
+dipiazza d/p/ots@
+dipiero d/pir]
+dipierro d/pir]
+dipietro d/pEtr]
+dipinto d/pint]
+dipirro d/pir]
+diploma d@plOm@
+diplomacy d@plOm@s/
+diplomas d@plOm@z
+diplomat dipl}at
+diplomat's dipl}ats
+diplomatic dipl}at6k
+diplomatically dipl}at6kl/
+diplomats dipl}ats
+diplomats' dipl}ats
+dipole dIpOl
+dipped dipt
+dippel dip@l
+dipper dipP
+dippers dipPz
+dipping dip6N
+dipple dip@l
+dippold dipOld
+dippolito d/p]lEt]
+dippy dip/
+diprima d@prEm@
+dips dips
+dipstick dipstik
+dircks dVks
+dire dIP
+dire dIr
+direct d/rekt
+direct d6rekt
+direct dIrekt
+direct dPekt
+directed d/rekt@d
+directed d6rekt@d
+directed dIrekt@d
+directed dPekt@d
+directing d/rekt6N
+directing d6rekt6N
+directing dIrekt6N
+directing dPekt6N
+direction d/rekS~
+direction d6rekS~
+direction dIrekS~
+direction dPekS~
+directional d/rekS~@l
+directional d6rekS~@l
+directional dIrekS~@l
+directional dPekS~@l
+directionless d/rekS~l@s
+directionless d6rekS~l@s
+directionless dIrekS~l@s
+directionless dPekS~l@s
+directions d/rekS~z
+directions d6rekS~z
+directions dIrekS~z
+directions dPekS~z
+directive d/rekt6v
+directive d6rekt6v
+directive dIrekt6v
+directive dPekt6v
+directives d/rekt6vz
+directives d6rekt6vz
+directives dIrekt6vz
+directives dPekt6vz
+directly d/rekl/
+directly d6rekl/
+directly dIrekl/
+directly dPektl/
+directness d/rekn@s
+directness d6rekn@s
+directness dIrekn@s
+directness dPektn@s
+director d/rektP
+director d6rektP
+director dIrektP
+director dPektP
+director's d/rektPz
+director's d6rektPz
+director's dIrektPz
+director's dPektPz
+directoral dPektP@l
+directorate d/rektP@t
+directorate d6rektP@t
+directorate dIrektP@t
+directorate dPektP@t
+directorial d/rckt{r/@l
+directorial d6rckt{r/@l
+directorial dIrckt{r/@l
+directorial dPckt{r/@l
+directories d/rektP/z
+directories d6rektP/z
+directories dIrektP/z
+directories dPektP/z
+directors d/rektPz
+directors d6rektPz
+directors dIrektPz
+directors dPektPz
+directors' d/rektPz
+directors' d6rektPz
+directors' dPektPz
+directorship d/rektPSip
+directorship d6rektPSip
+directorship dIrektPSip
+directorship dPektPSip
+directorships d/rektPSips
+directorships d6rektPSips
+directorships dIrektPSips
+directorships dPektPSips
+directory d/rektP/
+directory d6rektP/
+directory dIrektP/
+directory dPektP/
+directs d/rekts
+directs d6rekts
+directs dIrekts
+directs dPekts
+directv d/rektEvE
+directv d6rektEvE
+directv dIrektEvE
+directv dPektEvE
+direnzo d6renz]
+direst dIr@st
+dirge dVj
+dirhams dV}z
+dirickson d{r6ks~
+dirienzo d6rEnz]
+dirk dVk
+dirkes dVks
+dirks dVks
+dirkse dVks
+dirksen dVks~
+dirlam dPlam
+dirocco d6rok]
+dirosa d6rOs@
+dirr dV
+dirt dVt
+dirt's dVts
+dirtier dVt/P
+dirtiest dVt/@st
+dirty dVt/
+dirusso d6rUs]
+dis dis
+disa dis@
+disabatino disobotEn]
+disabato disobot]
+disabilities dis@bil@t/z
+disability dis@bil@t/
+disability dis@bil@t/z
+disable disAb@l
+disabled disAb@ld
+disables disAb@lz
+disabling disAb@l6N
+disabling disAbl6N
+disabuse dis@byUs
+disabuse dis@byUz
+disabused dis@byUzd
+disabuses dis@byUs@z
+disadvantage dis@dvan6j
+disadvantage dis@dvant6j
+disadvantaged dis@dvan6jd
+disadvantaged dis@dvant6jd
+disadvantageous disadvantAj@s
+disadvantages dis@dvan6jz
+disadvantages dis@dvant6j@z
+disaffect dis@fekt
+disaffected dis@fekt@d
+disaffection dis@fekS~
+disagree dis@grE
+disagreeable dis@grE@b@l
+disagreed dis@grEd
+disagreeing dis@grE6N
+disagreement dis@grEm~t
+disagreements dis@grEm~ts
+disagrees dis@grEz
+disallow dis@l?
+disallowance dis@l?~s
+disallowances dis@l?~s@z
+disallowed dis@l?d
+disallowing dis@l?6N
+disalvo disolv]
+disano dison]
+disanti disant/
+disantis disontis
+disanto disant]
+disappear dis@pEr
+disappear dis@pir
+disappearance dis@pEr~s
+disappearance dis@pir~s
+disappearances dis@pEr~s@z
+disappearances dis@pir~s@z
+disappeared dis@pErd
+disappeared dis@pird
+disappearing dis@pEr6N
+disappearing dis@pir6N
+disappears dis@pErz
+disappears dis@pirz
+disappoint dis@p<nt
+disappointed dis@p<n@d
+disappointed dis@p<nt@d
+disappointing dis@p<n6N
+disappointing dis@p<nt6N
+disappointingly dis@p<n6Nl/
+disappointingly dis@p<nt6Nl/
+disappointment dis@p<ntm~t
+disappointments dis@p<ntm~ts
+disappoints dis@p<nts
+disapproval dis@prUv@l
+disapprove dis@prUv
+disapproved dis@prUvd
+disapproves dis@prUvz
+disapproving dis@prUv6N
+disarm dis)rm
+disarmament dis)rm}~t
+disarmed dis)rmd
+disarming dis)rm6N
+disarmingly dis)rm6Nl/
+disarray dis@rA
+disarray disPA
+disassemble dis@semb@l
+disassembled dis@semb@ld
+disassociate dis@sOS/At
+disassociated dis@sOS/At@d
+disaster dizastP
+disasters dizastPz
+disastrous dizastr@s
+disastrously dizastr@sl/
+disavow dis@v?
+disavowed dis@v?d
+disavowing dis@v?6N
+disband disband
+disbanded disband@d
+disbanding disband6N
+disbar disb)r
+disbarment disb)rm~t
+disbarred disb)rd
+disbelief disb@lEf
+disbelieve disb@lEv
+disbelieving disb@lEv6N
+disbro disbr]
+disbrow disbr?
+disburse disbVs
+disbursed disbVst
+disbursement disbVsm~t
+disbursements disbVsm~ts
+disbursing disbVs6N
+disc disk
+discard disk)rd
+discarded disk)rd@d
+discarding disk)rd6N
+discards disk)rdz
+discenza disCenz@
+discern disVn
+discerned disVnd
+discernible disVn@b@l
+discerning disVn6N
+discernment disVnm~t
+disch diS
+discharge disC)rj
+discharge disCorj
+discharged disC)rjd
+discharged disCorjd
+discharges disC)rj@z
+discharges disCorj@z
+discharging disC)rj6N
+discharging disCorj6N
+discher diSP
+dischinger diS~jP
+disciple d@sIp@l
+disciples d@sIp@lz
+disciplinarian dis@pl~,r/~
+disciplinarians dis@pl~,r/~z
+disciplinary dis@pl~er/
+discipline dis@pl~
+disciplined dis@pl~d
+disciplines dis@pl~z
+disciplining dis@pl~6N
+disclaim disklAm
+disclaimed disklAmd
+disclaimer disklAmP
+disclaimers disklAmPz
+disclaiming disklAm6N
+disclaims d6sklAmz
+discland diskland
+disclose disklOz
+disclosed disklOzd
+discloses disklOz@z
+disclosing disklOz6N
+disclosure disklOZP
+disclosures disklOZPz
+disco disk]
+discography d@sk{gr@f/
+discolor diskulP
+discoloration diskulPAS~
+discolorations diskulPAS~z
+discolored diskulPd
+discolors diskulPz
+discomfort diskumfPt
+disconcert disk~sVt
+disconcerting disk~sVt6N
+disconcerts disk~sVts
+disconnect disk~ekt
+disconnected disk~ekt@d
+disconnecting disk~ekt6N
+disconnection disk~ekS~
+discontent disk~tent
+discontented disk~tent@d
+discontents disk~tents
+discontinuance disk~tinyU~s
+discontinuation disk~tinyUAS~
+discontinue disk~tinyU
+discontinued disk~tinyUd
+discontinuing disk~tinyU6N
+discontinuity diskont~U@t/
+discord disk{rd
+discordant disk{rd~t
+discos disk]z
+discotheque disk]tek
+discount disk?nt
+discount disk?nt
+discountable disk?nt@b@l
+discounted disk?n@d
+discounted disk?nt@d
+discounter disk?ntP
+discounters disk?nPrz
+discounters disk?ntPz
+discounting disk?n6N
+discounting disk?nt6N
+discounts disk?nts
+discounts disk?nts
+discourage diskV6j
+discouraged diskV@jd
+discouragement diskV6jm~t
+discourages diskV6j@z
+discouraging diskV@j6N
+discourse disk{rs
+discourses disk{rs@z
+discover diskuvP
+discoverable diskuvP@b@l
+discoverable diskuvr@b@l
+discovered diskuvPd
+discoverer diskuvPP
+discoveries diskuvP/z
+discovering diskuvP6N
+discovers diskuvPz
+discovery diskuvP/
+discovery diskuvr/
+discovery's diskuvP/z
+discovery's diskuvr/z
+discredit diskred@t
+discredited diskred@t@d
+discrediting diskred@t6N
+discredits diskred@ts
+discreet diskrEt
+discreetly diskrEtl/
+discrepancies diskrep~s/z
+discrepancy diskrep~s/
+discrete diskrEt
+discretion diskreS~
+discretionary diskreS~er/
+discriminate diskrim~At
+discriminated diskrim~At@d
+discriminates diskrim~Ats
+discriminating diskrim~At6N
+discrimination diskrim~AS~
+discriminatory diskrim~@t{r/
+discs disks
+discursive diskVs6v
+discus disk@s
+discuss diskus
+discussed diskust
+discusses diskus@z
+discussing diskus6N
+discussion diskuS~
+discussions diskuS~z
+disdain disdAn
+disdained disdAnd
+disdainful disdAnf@l
+disdaining disdAn6N
+disdains disdAnz
+dise dIs
+dise dIz
+disease dizEz
+disease's dizEz@z
+diseased dizEzd
+diseases dizEz@z
+disembark discmb)rk
+disembarkation disemborkAS~
+disembodied dis@bod/d
+disembody dis@bod/
+disenchant dis~Cant
+disenchanted dis~Can@d
+disenchanted dis~Cant@d
+disenchantment dis~Cantm~t
+disenfranchise dis~franCIz
+disenfranchised dis~franCIzd
+disenfranchisement dis~franCIzm~t
+disengage dis~gAj
+disengaged dis~gAjd
+disengagement dis~gAjm~t
+disengaging dis~gAj6N
+disentangle dis~taNg@l
+disequilibrium disEkw@libr/}
+disestablishment dis@stabl6Sm~t
+disfavor disfAvP
+disfavoring disfAvP6N
+disfigure disfigyP
+disfigured disfigyPd
+disfigurement disfigyPmcnt
+disfiguring disfigyP6N
+disgorge disg{rj
+disgorged disg{rjd
+disgorgement disg{rjm~t
+disgrace disgrAs
+disgraced disgrAst
+disgraceful disgrAsf@l
+disgruntle disgrunt@l
+disgruntled disgrun@ld
+disgruntled disgrunt@ld
+disgruntlement disgrunt@lm~t
+disgruntling disgrunt@l6N
+disgruntling disgruntl6N
+disguise disgIz
+disguised disgIzd
+disguises disgIz@z
+disguising disgIz6N
+disgust disgust
+disgusted disgust@d
+disgusting disgust6N
+disgusts disgus
+disgusts disguss
+disgusts disgusts
+dish diS
+disharmony dish)rm~/
+disharoon diSPUn
+dishaw diS{
+dishearten dish)rt~
+disheartened dish)rt~d
+disheartening dish)rtn6N
+disheartening dish)rt~6N
+dished diSt
+disher diSP
+dishes diS@z
+dishevel diSev@l
+disheveled diSev@ld
+dishing diS6N
+dishman diSm~
+dishner diSnP
+dishon dis~
+dishonest dison@st
+dishonestly dis{n@stl/
+dishonesty dison@st/
+dishong dis{N
+dishonor disonP
+dishonorable disonP@b@l
+dishonored disonPd
+dishwasher diSwoSP
+dishwashers diSwoSPz
+dishwashing diSwoS6N
+disillusion dis@lUZ~
+disillusioned dis@lUZ~d
+disillusioning dis@lUZ~6N
+disillusionment dis@lUZ~m~t
+disilvestro dis/lvestr]
+disimone dis/mOn/
+disincentive dis~sent6v
+disincentives dis~sent6vz
+disinclination disinkl~AS~
+disincline dis~klIn
+disinclined dis~klInd
+disinfect dis~fekt
+disinfectant dis~fekt~t
+disinfectants dis~fekt~ts
+disinfection dis~fekS~
+disinflate dis~flAt
+disinflation dis~flAS~
+disinflationary dis~flAS~er/
+disinform disinf{rm
+disinformation disinfPmAS~
+disingenuous disinjenyU@s
+disingenuousness disinjenyU@sn@s
+disintegrate disint@grAt
+disintegrated disint@grAt@d
+disintegrates disint@grAts
+disintegrating disint@grAt6N
+disintegration disin@grAS~
+disintegration disint@grAS~
+disinterest disintP@st
+disinterested disinr@st@d
+disinterested disintr@st@d
+disinvestment disinvesm~t
+disinvestment disinvestm~t
+disinvite disinvIt
+disinvited disinvIt@d
+disjoint disj<nt
+disjointed disj<nt@d
+disk disk
+diskette disket
+diskettes diskets
+diskin diskin
+diskless diskl@s
+disks disks
+dislike dislIk
+disliked dislIkt
+dislikes dislIks
+disliking dislIk6N
+dislocate disl]kAt
+dislocated disl]kAt@d
+dislocation disl]kAS~
+dislocations disl]kAS~z
+dislodge disloj
+dislodged dislojd
+dislodging disloj6N
+disloyal disl<@l
+disloyalty disl<@lt/
+dismal dizm@l
+dismally dizm@l/
+dismantle disman@l
+dismantle dismant@l
+dismantled disman@ld
+dismantled dismant@ld
+dismantlement dismant@lm~t
+dismantles disman@lz
+dismantles dismant@lz
+dismantling disman@l6N
+dismantling dismant@l6N
+dismantling dismantl6N
+dismay dismA
+dismayed dismAd
+dismaying dismA6N
+dismays dismAz
+dismember dismembP
+dismembered dismembPd
+dismembering dismembP6N
+dismemberment dismembPm~t
+dismiss dismis
+dismissal dismis@l
+dismissals dismis@lz
+dismissed dismist
+dismisses dismis@z
+dismissing dismis6N
+dismissive dismis6v
+dismore dism{r
+dismuke dismyUk
+dismukes dismyUks
+dismutase dismyUtAz
+disney dizn/
+disney's dizn/z
+disneyland dizn/land
+disneyworld dizn/wPld
+disobedience dis@bEd/~s
+disobedience dis]bEd/~s
+disobedient dis@bEd/~t
+disobedient dis]bEd/~t
+disobey dis@bA
+disobeyed dis]bAd
+disobeying dis]bA6N
+dison dis~
+disorder dis{rdP
+disordered dis{rdPd
+disorderly dis{rdPl/
+disorders dis{rdPz
+disorganization dis{rg~@zAS~
+disorganize dis{rg~Iz
+disorganized dis{rg~Izd
+disorient dis{r/ent
+disorientation dis{r/~tAS~
+disoriented dis{r/ent@d
+disorienting dis{r/ent6N
+disown disOn
+disowned disOnd
+dispair disp,r
+disparage disp,r6j
+disparaged disp,r6jd
+disparages disp,r6j@srupt6v
+disparaging disp,r6j6N
+disparagingly disp,r6j6Nl/
+disparate dispP@t
+disparities disp,r@t/z
+disparity disp,r@t/
+dispassionate dispaS~@t
+dispassionately dispaS~@tl/
+dispatch dispaC
+dispatched dispaCt
+dispatcher dispaCP
+dispatcher dispaCP
+dispatcher's dispaCPz
+dispatcher's dispaCPz
+dispatchers dispaCPz
+dispatches dispaC@z
+dispatching dispaC6N
+dispel dispel
+dispell dispel
+dispelled dispeld
+dispelling dispel6N
+dispels dispelz
+dispensable dispens@b@l
+dispensary dispcnser/
+dispensary dispensP/
+dispensation disp~sAS~
+dispense dispens
+dispensed dispenst
+dispenser dispensP
+dispensers dispensPz
+dispenses dispens@z
+dispensing dispens6N
+dispenza dispenz@
+dispersal dispVs@l
+dispersant dispVs~t
+dispersants dispVs~ts
+disperse dispVs
+dispersed dispVst
+dispersing dispVs6N
+dispersion dispVZ~
+dispersive dispVs6v
+dispirited dispir@t@d
+dispiriting dispir@t6N
+displace displAs
+displaced displAst
+displacement displAsm~t
+displacements displAsm~ts
+displaces displAs@z
+displacing displAs6N
+display displA
+displayed displAd
+displaying displA6N
+displays displAz
+displaywrite displArIt
+displease displEz
+displeased displEzd
+displeasure displeZP
+disposable dispOz@b@l
+disposables dispOz@b@lz
+disposal dispOz@l
+disposals dispOz@lz
+dispose dispOz
+disposed dispOzd
+disposer dispOzP
+disposes dispOz@z
+disposing dispOz6N
+disposition disp@ziS~
+dispositions disp@ziS~z
+dispositive dispoz@t6v
+dispossess disp@zes
+dispossessed disp@zest
+disproportionate dispr@p{rS~@t
+disproportionately dispr@p{rS~@tl/
+disprove disprUv
+disproved disprUvd
+disproven disprUv~
+disproves disprUvz
+disputation dispyUtAS~
+dispute dispyUt
+disputed dispyUt@d
+disputes dispyUts
+disputing dispyUt6N
+disqualification diskwol@f@kAS~
+disqualified diskwol@fId
+disqualifies diskwol@fIz
+disqualify diskwol@fI
+disqualifying diskwol@fI6N
+disque disk
+disquiet diskwI@t
+disquieting diskwI@t6N
+disraeli dizrAl/
+disregard disr6g)rd
+disregarded disr6g)rd@d
+disregarding disr6g)rd6N
+disregards disr6g)rdz
+disrepair disr@p,r
+disreputable disrepy@t@b@l
+disrepute disr@pyUt
+disrespect disr@spekt
+disrespected disr@spekt@d
+disrespectful disr@spektf@l
+disrespecting disr@spekt6N
+disrespects disr@spekts
+disrupt disrupt
+disrupted disrupt@d
+disrupting disrupt6N
+disruption disrupS~
+disruptions disrupS~z
+disruptive disrupt6v
+disrupts disrupts
+diss dis
+dissatisfaction disat@sfakS~
+dissatisfied disat@sfId
+dissatisfy disat@sfI
+dissect dIsekt
+dissected dIsekt@d
+dissecting dIsekt6N
+dissection dIsckS~
+dissection dIsekS~
+dissections dIsckS~z
+dissections dIsekS~z
+dissects dIseks
+dissects dIsekts
+dissemble disemb@l
+dissembling disembl6N
+disseminate disem~At
+disseminated disem~At@d
+disseminating disem~At6N
+dissemination disem~AS~
+dissension disenS~
+dissent disent
+dissented disen@d
+dissented disent@d
+dissenter disentP
+dissenters disenPz
+dissenters disentPz
+dissenting disen6N
+dissenting disent6N
+dissents disents
+dissertation disPtAS~
+disservice disVv@s
+disservice dissVv@s
+dissidence dis@d~s
+dissident dis@d~t
+dissidents dis@d~ts
+dissidents' dis@d~ts
+dissimilar disim@lP
+dissimilar dissim@lP
+dissimilarity disim@lar@t/
+dissimilarity dissim@lar@t/
+dissinger dis~jP
+dissipate dis@pAt
+dissipated dis@pAt@d
+dissipates dis@pAts
+dissipating dis@pAt6N
+dissipation dis@pAS~
+dissipative dis@pAt6v
+dissociate disOs/At
+dissociation disOs/AS~
+dissolution dis@lUS~
+dissolve dizolv
+dissolved dizolvd
+dissolver dizolvP
+dissolvers dizolvPz
+dissolves dizolvz
+dissolving diz{lv6N
+dissonance dis~~s
+dissonant dis~~t
+dissuade diswAd
+dissuaded diswAd@d
+dissymmetric dis}etr6k
+dissymmetry disim@tr/
+distad dist@d
+distal dist@l
+distance dist~s
+distanced dist~st
+distances dist~s@z
+distancing dist~s6N
+distant dist~t
+distasi distos/
+distasio distos/]
+distaste distAst
+distasteful distAstf@l
+distefano distcfon]
+distel dist@l
+distemper distempP
+distend distend
+distended distend@d
+distil distil
+distill distil
+distillate dist@l@t
+distillate dist@lAt
+distillates dist@lAts
+distillation dist@lAS~
+distilled distild
+distiller distilP
+distiller's distilPz
+distilleries distilP/z
+distillers distilPz
+distillers' distilPz
+distillers's distilPz@z
+distillery distilP/
+distilling distil6N
+distills distilz
+distinct distiNkt
+distinction distiNkS~
+distinctions distiNkS~z
+distinctive distiNkt6v
+distinctively distiNkt6vl/
+distinctiveness distiNkt6vn@s
+distinctly distiNktl/
+distinguish distiNgwiS
+distinguishable distiNgwiS@b@l
+distinguished distiNgw6St
+distinguishes distiNgw6S@z
+distinguishing distiNgw6S6N
+distler distlP
+distort dist{rt
+distorted dist{rt@d
+distorting dist{rt6N
+distortion dist{rS~
+distortions dist{rS~z
+distorts dist{rts
+distract distrakt
+distracted distrakt@d
+distracting distrakt6N
+distraction distrakS~
+distractions distrakS~z
+distracts distrakts
+distraught distr{t
+distress distres
+distressed distrest
+distresses distres@z
+distressing distres6N
+distressingly distres6Nl/
+distribute distribyUt
+distributed distriby@t@d
+distributes distribyUts
+distributing distribyUt6N
+distribution distr@byUS~
+distributions distr@byUS~z
+distributive distribyUt6v
+distributor distriby@tP
+distributor's distribyUtPz
+distributors distriby@tPz
+distributors' distriby@tPz
+distributorship distribyUtPSip
+distributorships distribyUtPSips
+district distrikt
+district's distrikts
+districting distr6kt6N
+districts distr6kts
+distrigas distrEg@s
+distron distron
+distrust distrust
+distrusted distrust@d
+distrustful distrustf@l
+distrusts distrus
+distrusts distruss
+distrusts distrusts
+disturb distVb
+disturbance distVb~s
+disturbances distVb~s@z
+disturbed distVbd
+disturbing distVb6N
+disturbingly distVb6Nl/
+disturbs distVbz
+disunion disyUny~
+disunity disyUn@t/
+disuse disyUs
+ditch diC
+ditched diCt
+ditches diC@z
+ditching diC6N
+dith diT
+dither diTP
+dithering diTP6N
+dithers diTPz
+dithyramb diTPam
+ditka ditk@
+ditka's ditk@z
+ditlow ditl]
+ditmars ditmPz
+ditmer ditmP
+ditmore ditm{r
+ditomasso dit]mos]
+ditommaso dit]mos]
+ditsy dits/
+dittberner ditbPnP
+dittemore ditem{r
+ditter ditP
+ditties dit/z
+dittman ditm~
+dittmann ditm~
+dittmar ditmP
+dittmer ditmP
+ditto dit]
+ditton dit~
+dittrich ditr6k
+dittus dit@s
+ditty dit/
+ditullio d@tul/]
+ditzel ditz@l
+ditzler ditslP
+diuretic dIUret6k
+diuretics dIUret6ks
+diurnal dIVn@l
+diurnally dIVn@l/
+diva dEv@
+divad divad
+divalent dIvAl~t
+divall div@l
+divan d6van
+divas dEv@z
+dive dIv
+dived dIvd
+divelbiss d6velbis
+diveley div@l/
+dively dIvl/
+diven dIv~
+divens dIv~z
+diver dIvP
+diver's dIvPz
+diverge d6vVj
+diverged dIvVjd
+divergence d6vVj~s
+divergence dIvVj~s
+divergences dIvVj~s@z
+divergent d6vVj~t
+divergent dIvVj~t
+diverges dIvVj@z
+diverging dIvVj6N
+divers dIvPz
+diverse d6vVs
+diverse dIvVs
+diversicare divPs6ker
+diversification d6vVs@f@kAS~
+diversification dIvVs@f@kAS~
+diversifications d6vVs@f@kAS~z
+diversifications dIvVs@f@kAS~z
+diversified d6vVs@fId
+diversified dIvVs@fId
+diversify d6vVs@fI
+diversify dIvVs@fI
+diversifying d6vVs@fI6N
+diversifying dIvVs@fI6N
+diversion d6vVZ~
+diversion dIvVZ~
+diversionary d6vVZ~er/
+diversionary dIvVZ~er/
+diversions d6vVZ~z
+diversions dIvVZ~z
+diversity d6vVs@t/
+diversity dIvVs@t/
+divert d6vVt
+divert dIvVt
+diverted d6vVt@d
+diverted dIvVt@d
+diverticula dIvPtiky@l@
+diverticulum dIvPtiky@l}
+divertimento d6vVt}entO
+diverting d6vVt6N
+diverting dIvVt6N
+diverts d6vVts
+diverts dIvVts
+dives dIvz
+divest d6vest
+divest dIvest
+divested dIvest@d
+divesting dIvest6N
+divestiture d6vest6CP
+divestiture dIvest6CP
+divestitures d6vest6CPz
+divestitures dIvest6CPz
+divestment d6vesm~t
+divestment dIvesm~t
+divestment dIvestm~t
+divestments d6vesm~ts
+divestments dIvesm~ts
+divestments dIvestm~ts
+divests dIves
+divests dIvess
+divests dIvests
+divi dEv/
+divide d6vId
+divided d6vId@d
+dividend div@dend
+dividend's div@dendz
+dividends div@dendz
+divider d6vIdP
+divides d6vIdz
+dividing d6vId6N
+divination div~AS~
+divincenzo d6v/nCenz]
+divine d6vIn
+divinely d6vInl/
+diviney divin/
+diving dIv6N
+divining d@vIn6N
+divinitas div~Et@s
+divinities d6vin@t/z
+divinity d6vin@t/
+divirgilio d6v6rjEl/]
+divis dEvis
+divisible d6viz@b@l
+division d6viZ~
+division's d6viZ~z
+divisional d6viZ~@l
+divisions d6viZ~z
+divisions' d6viZ~z
+divisive d6vIs6v
+divisiveness d6vIs6vn@s
+divisor d6vIzP
+divita d6vEt@
+divito d6vEt]
+divorce d6v{rs
+divorced d6v{rst
+divorcee d@v{rsA
+divorcee d@v{rsE
+divorces d6v{rs@z
+divorcing d6v{rs6N
+divulge d6vulj
+divulge dIvulj
+divulged d6vuljd
+divulged dIvuljd
+divulging d6vulj6N
+divulging dIvulj6N
+divvied div/d
+divvy div/
+diwa dEw@
+dix diks
+dixie diks/
+dixieland diks/land
+dixon diks~
+dixon's diks~z
+dixons diks~z
+dixson diks~
+dixville diksvil
+dixy diks/
+dizon diz~
+dizziness diz/n@s
+dizzy diz/
+dizzying diz/6N
+djakarta j@k)rt@
+djakarta's j@k)rt@z
+djibouti jibUtE
+djurdjevic jVj@v6k
+dk dEkA
+dlouhy d@l?/
+dlugos d@lUg]s
+dlugosz d@lUg]S
+dlugosz d@lUg]s
+dmitri dmEtr/
+dmitri d}Etr/
+dnase dEnAs
+dnase dEnAz
+dniester d~/stP
+do dU
+do's dUz
+doable dU@b@l
+doak dOk
+doan dOn
+doane dOn
+doanh dOn
+doanna dOn@
+dob dob
+dobb dob
+dobberstein dobPstEn
+dobberstein dobPstIn
+dobbie dob/
+dobbin dobin
+dobbins dobinz
+dobbs dobz
+dobek dOb6k
+dober dObP
+doberman dObPm~
+doberstein dObPst/n
+doberstein dObPstIn
+dobesh dobcS
+dobey dob/
+dobias d]bE@z
+dobie dob/
+dobies dOb/z
+dobis dObis
+dobkin dobkin
+dobkins dobkinz
+doble dOb@l
+dobler dOb@lP
+dobmeier dobmIP
+dobos dOb]z
+dobosz dobuS
+dobransky d@bransk/
+dobratz dobr@ts
+dobrimir d@brEm6r
+dobrin dobrin
+dobrinja d@brEnj@
+dobrinja d@brEny@
+dobrins dobrinz
+dobrinski d@brinsk/
+dobrowolski d@br?Olsk/
+dobrowski d@br{fsk/
+dobry dobr/
+dobrynin d@brEn~
+dobrzynski dObr@Zinsk/
+dobson dobs~
+dobson's dobs~z
+dobsons dobs~z
+doby dOb/
+dobyns dObinz
+doc dok
+docent dOs~t
+docents dOs~ts
+docherty doCPt/
+dochow dOC?
+dochterman doktPm~
+docie dok/
+docila dosil@
+docile dos@l
+docility dosil@t/
+dock dok
+dock's doks
+docked dokt
+docken dok~
+dockendorf dok~d{rf
+docker dokP
+dockers dokPz
+dockery dokP/
+docket dok@t
+dockets dok@ts
+dockham dokh}
+dockiers dokyPz
+docking dok6N
+dockins dokinz
+dockland dokl~d
+docklands dokl~dz
+docks doks
+dockside doksId
+dockson doks~
+dockstader dokst@dP
+dockter doktP
+dockworker dokwVkP
+dockworkers dokwVkPz
+dockyard dokyord
+doctor doktP
+doctor's doktPz
+doctoral doktP@l
+doctorate doktP@t
+doctorates doktP@ts
+doctored doktPd
+doctoring doktP6N
+doctors doktPz
+doctors' doktPz
+doctrinaire doktr~,r
+doctrinal doktr~@l
+doctrine doktP~
+doctrine doktr~
+doctrine's doktr~z
+doctrines doktr~z
+docudrama dOk@dram@
+document dokyUmcnt
+document doky}cnt
+documenta dokyUment@
+documentaries dokyUmenP/z
+documentaries dokyUmentP/z
+documentaries doky}enP/z
+documentaries doky}entP/z
+documentary dokyUmenP/
+documentary dokyUmentP/
+documentary doky}enP/
+documentary doky}entP/
+documentation dokyUmcntAS~
+documentation doky}cntAS~
+documented dokyUmen@d
+documented dokyUment@d
+documented doky}en@d
+documented doky}ent@d
+documenting dokyUm~6N
+documenting dokyUm~t6N
+documenting doky}~6N
+documenting doky}~t6N
+documents dokyUm~ts
+documents doky}~ts
+dodaro d]d)r]
+dodd dod
+dodd's dodz
+doddering dodP6N
+doddington dod6Nt~
+doddington dod~t~
+doddridge dodr6j
+dodds dodz
+dodge doj
+dodge's doj@z
+dodged dojd
+dodgen doj~
+dodger dojP
+dodger's dojPz
+dodgers dojPz
+dodgers' dojPz
+dodges doj@z
+dodging doj6N
+dodo dOd]
+dodo's dOd]z
+dodos dOd]z
+dodrill dodr@l
+dodson dods~
+dodsworth dodswPT
+doe dO
+doe's dOz
+doebler dOb@lP
+doeden dOd~
+doege dOj
+doehring d{r6N
+doell dOl
+doenges dOnj@z
+doepke dOpk
+doepker dOpkP
+doer dUr
+doerfler d{rf@lP
+doerflinger d{rf@l6NP
+doering dUP6N
+doernberg d{rnbPg
+doerner d{rnP
+doerr d{r
+doers dUPz
+doersam d{rs}
+does d@z
+does duz
+doescher dOSP
+doesn't duz~
+doesn't duz~t
+doetsch dOC
+dofasco d@fask]
+doff d{f
+doffing d{f6N
+doffs d{fs
+dog d{g
+dog's d{gz
+dogan dOg~
+dogbane d{gbAn
+dogberry d{gber/
+doge dOj
+dogfight dogfIt
+dogfights d{gfIts
+dogfish d{gfiS
+dogged d{gd
+doggedly d{g@dl/
+doggerel dogP@l
+doggett dogit
+doggie d{g/
+doggies d{g/z
+dogging d{g6N
+doggone d{g{n
+doggy d{g/
+doggy's d{g/z
+doghouse d{gh?s
+dogle dOg@l
+dogle dog@l
+doglike d{glIk
+dogma dogm@
+dogmatic dogmat6k
+dogmatically dogmat6kl/
+dogmatism dogm@tiz}
+dogs dogz
+dogs' dogz
+dogwood d{gwqd
+dogwoods d{gwqdz
+doh dO
+doheny dohcn/
+doherty dOPt/
+doherty dohPt/
+doherty d{rt/
+dohm dom
+dohman dOm~
+dohme dOm
+dohmen dOmcn
+dohn don
+dohnanyi dOnony/
+dohner dOnP
+dohr d{r
+dohrman d{rm~
+dohrmann d{rm~
+dohse dOs
+doi d<
+doidge d<j
+doig d<g
+doilies d<l/z
+doily d<l/
+doin' dU~
+doing dU6N
+doings dU6Nz
+doiron d<r{n
+doke dOk
+dokey dOk/
+dokken dok~
+doktor doktP
+dol dol
+dolak dOl@k
+dolan dOl~
+doland dUl~d
+dolata d]lot@
+dolbow dOlb]
+dolby dOlb/
+dolce dOlCA
+dolch dOlC
+dold dOld
+dolder dOldP
+doldrum dOldr}
+doldrums dOldr}z
+dole dOl
+dole's dOlz
+dolecki d@letsk/
+doled dOld
+doleful dOlf@l
+dolen dOl~
+dolence dOl~s
+doles dOlz
+doles's dOlz@z
+doley dOl/
+dolezal d]lAzal
+dolf dOlf
+dolfi dOlf/
+dolgen dOljcn
+dolgin dOljin
+dolin dOlin
+dolinar dol~P
+doling dOl6N
+dolinger dOl6NP
+dolinski d@linsk/
+dolinsky d@linsk/
+doll dol
+doll's dolz
+dollar dolP
+dollar's dol@z
+dollar's dolPz
+dollard dolPd
+dollarhide dolPhId
+dollars dolPz
+dollars' dolPz
+dolle dol
+dolled dold
+dollens dol~z
+dolley dol/
+dollhouse dolh?s
+dollhouses dolh?s@z
+dollie dol/
+dollinger dol6NP
+dollins dolinz
+dollison dol@s~
+dolliver dol6vP
+dolloff dol{f
+dollop dol@p
+dolls dolz
+dolly dol/
+dolly's dol/z
+dolman dolm~
+dolney dOln/
+dolomite dOl}It
+dolomite's dOl}Its
+dolomites dOl}Its
+dolores d@l{r@s
+dolorita d]l{rEt@
+dolph dOlf
+dolphin dolf~
+dolphins dolf~z
+dolphins' dolf~z
+dols dolz
+dolson dOls~
+dolton dOlt~
+dom dom
+domagala d]mogol@
+domagalski d}@golsk/
+domain d]mAn
+domaine d]mAn
+domains d]mAnz
+doman dUm~
+domangue dOmoN
+domanico d]monEk]
+domanski d}ansk/
+domas dOm@s
+dombeck dombek
+dombek domb6k
+dombkowski d}k{fsk/
+dombroski d}br?sk/
+dombrosky d}brOsk/
+dombrowski d}br{fsk/
+dome dOm
+dome's dOmz
+domecq dOmek
+domed dOmd
+domeier domIP
+domek dOmck
+domenech domcn6k
+domenici d]men/C/
+domenici d]min/C/
+domenici d}en@C/
+domenici's d]men/C/z
+domenici's d]min/C/z
+domenici's d}en@C/z
+domenick domcn6k
+domenico d]mAn/k]
+domeniconi d]men6kOn/
+domer dOmP
+domes dOmz
+domestic d}est6k
+domestically d}est6kl/
+domesticate d}est@kAt
+domesticated d}est@kAt@d
+domesticating d}est@kAt6N
+domestication d}est@kAS~
+domesticity dOmestis@t/
+domestics d}est6ks
+domical dom@k@l
+domico dOm@k]
+domin dOmin
+domina d]mEn@
+dominance dom~~s
+dominant dom~~t
+dominate dom~At
+dominated dom~At@d
+dominates dom~Ats
+dominating dom~At6N
+domination dom~AS~
+domine d]mEn/
+dominee dOm~A
+domineer dom~ir
+domineering dom~ir6N
+dominelli dOm~el/
+dominelli's dOm~el/z
+dominey dom~/
+domingo d]miNg]
+domingo d}iNg]
+domingos d}iNg]z
+domingue dOm6N
+domingues d]mEngcs
+dominguez d}iNcz
+domini dom~/
+dominiak d}in/ak
+dominic dom~6k
+dominic's dom~6ks
+dominica d}in6k@
+dominican d}in@k~
+dominicana d]min6kan@
+dominicana d]min6kon@
+dominicans d]min6k~z
+dominici d]m/nEC/
+dominick dom~6k
+dominik d}in6k
+dominion d}iny~
+dominion's d}iny~z
+dominique d{m~Ek
+domino dom~O
+domino's dom~Oz
+dominoes dom~Oz
+dominos dom~Oz
+dominquez d]mEnkwcz
+dominski d}insk/
+dominus d]mEn@s
+dominy d}In/
+domke domk
+dommer domP
+dommie dom/
+domoling dom{l6N
+domtar domtP
+domtar's domtPz
+domzalski d}zolsk/
+don don
+don's donz
+don't dOn
+don't dOnt
+don'ts dOns
+don'ts dOnts
+dona dOn@
+donadio d]nod/]
+donaghey don@gh/
+donaghue don@hU
+donaghy don@gh/
+donahey don@h/
+donaho d]noh]
+donahoe don@hO
+donahoo don@hU
+donahue don@hyU
+donahue don@yU
+donais d~A
+donald don@ld
+donald's don@ldz
+donalda d]nold@
+donaldo d]nold]
+donaldo's d]nold]z
+donaldson don@lds~
+donaldson's don@lds~z
+donaldsons don@lds~z
+donalson don@ls~
+donapria d~apr/@
+donar donP
+donat dOn@t
+donata d~ot@
+donate dOnAt
+donated dOnAt@d
+donatelli d]notel/
+donates dOnAts
+donath don@T
+donathan don@T~
+donati d]not/
+donating dOnAt6N
+donation d]nAS~
+donations d]nAS~z
+donatists don@t@s
+donatists don@t@ss
+donatists don@t@sts
+donato d~ot]
+donavan don@van
+donaway don@wA
+donde dond
+dondero d]nd,r]
+dondlinger dond@l6NP
+done dun
+donegan don6gan
+donehoo d]nAhU
+donelan don@lan
+donella d]nel@
+donelson don@ls~
+doner d{nP
+dones dunz
+doney don/
+dong d{N
+dong d{Ng
+dongen d{Ng~
+dongmei d]NmI
+donham donh}
+donia dOn/@
+donica don6k@
+donigan don6g~
+doniger don6gP
+donilon don@lon
+donis dOnis
+donizetti don@zet/
+donizetti's don@zet/z
+donkey doNk/
+donkeys doNk/z
+donlan donl~
+donley donl/
+donlin donlin
+donlon donl~
+donmoyer donm<P
+donn don
+donna don@
+donna's don@z
+donnan don~
+donnas don@z
+donnay donA
+donne dun
+donned dond
+donnell don@l
+donnellan don@lan
+donnelley don@l/
+donnelley doncl/
+donnelley's don@l/z
+donnelley's doncl/z
+donnelly don@l/
+donnelly doncl/
+donnelly's don@l/z
+donnelly's doncl/z
+donner donP
+donnie don/
+donning don6N
+donny don/
+donnybrook don/brqk
+donofrio d]nOfr/]
+donoghue don@hyU
+donoghue don@yU
+donoghue's don@hyUz
+donoghue's don@yUz
+donoho don@h]
+donohoe don@h]
+donohoo don@hU
+donohue don@hyU
+donohue don@yU
+donohue's don@hyUz
+donohue's don@yUz
+donor dOnP
+donor's dOnPz
+donors dOnPz
+donors' dOnPz
+donovan don@v~
+donovan's don@v~z
+dons donz
+donsbach donzbok
+donut dOnut
+donuts dOnuts
+donuts' dOnuts
+donvan donv~
+donvan's donv~z
+donze donz
+doo dU
+doodad dUdad
+doodads dUdadz
+doodle dUd@l
+doodles dUd@lz
+doody dUd/
+doogie dUg/
+doolan dUl~
+doolen jUl~
+dooley dUl/
+doolin dUlin
+dooling dUl6N
+doolittle dUlit@l
+doom dUm
+doomed dUmd
+dooming dUm6N
+dooms dUmz
+doomsayer dUmsAP
+doomsayers dUmsAPz
+doomsaying dUmsA6N
+doomsday dUmzdA
+doonan dUn~
+dooner dUnP
+doonesbury dUnzber/
+door d{r
+door's d{rz
+doorbell d{rbel
+doordarshan dUrd)rS~
+doorenbos dqrcnb]s
+doorkeeper d{rkEpP
+doorknob dUrnob
+doorknobs dUrnobz
+doorman d{rman
+doormat d{rmat
+doormats d{rmats
+doorn d{rn
+doornail d{rnAl
+doornbos d{rnb]z
+doors d{rz
+doorsill d{rsil
+doorstep d{rstep
+doorsteps d{rsteps
+doorway d{rwA
+doorways d{rwAz
+doose dUs
+doozy dUz/
+dopa dOp@
+dopamine dop}In
+dope dOp
+doped dOpt
+dopey dOp/
+dopp dop
+doppler doplP
+dopson dops~
+dora d{r@
+dorado d{rod]
+dorais dPA
+doral d{ral
+doralin d{rolEn
+doralynne d{r@lIn
+doran d{ran
+doraville d{r@vil
+dorazio d{rAz/]
+dorazio d{roz/]
+dorcas d{rk@s
+dorch d{rk
+dorchester d{rCestP
+dordies d{rd/z
+dore d{r
+dorea d{r/@
+doreen d{rEn
+dorelia d{rel/@
+doremus d{r}@s
+doren d{r~
+dorena d{rcn@
+dorene d{r/n
+dorer d{rP
+dorette dPet
+doretti d{ret/
+dorey d{r/
+dorf d{rf
+dorff d{rf
+dorfman d{rfm~
+dorgan d{rg~
+dorgan's d{rg~z
+dori d{r/
+doria d{r/@
+dorian d{r/~
+dorians d{r/~z
+doric d{r6k
+dorice d{ris
+dorie d{r/
+dorin d{rin
+dorinda d{rEnd@
+dorine d{rEn/
+doring d{r6N
+dorio d{r/]
+dorion d{r/{n
+doris d{ris
+dorise d{rIz
+doritos d{rEt]z
+dority d{r@t/
+dorko d{rk]
+dorland d{rl~d
+dorm d{rm
+dorman d{rm~
+dormancy d{rm~s/
+dormant d{rm~t
+dormer d{rmP
+dorminey d{rmin/
+dormitories d{rm@t{r/z
+dormitory d{rm@t{r/
+dormouse d{rm?s
+dorms d{rmz
+dorn d{rn
+dornak d{rn@k
+dornam d{rn}
+dornan d{rn~
+dornan's d{rn~z
+dornbusch d{rnbuS
+dornbush d{rnbqS
+dorner d{rnP
+dorney d{rn/
+dornfeld d{rnfcld
+dornhens d{rnhcnz
+dornier d{rnir
+dornin d{n~
+doro d{r]
+doron d{r~
+dorotea d{r@tA@
+dorothea d{r@TE@
+dorothy d{r@T/
+dorothy d{rT/
+dorothy's d{r@T/z
+dorothy's d{rT/z
+dorough d{r?
+dorow d{r]
+dorr d{r
+dorrance d{r~s
+dorrell d{rAl
+dorrie d{r/
+dorries d{r/z
+dorris d{ris
+dorroh d{r]
+dorrough d{r?
+dorsa d{rs@
+dorsal d{rs@l
+dorsally d{rs@l/
+dorsch d{rS
+dorset d{rsct
+dorsett d{rsct
+dorsey d{rs/
+dorsi d{rs/
+dorst d{rst
+dort d{rt
+dorta d{rt@
+dortch d{rC
+dorthea d{rT/@
+dorthy d{rT/
+dortmund d{rtm~d
+dorton d{rt~
+dorval d{rv@l
+dorward d{rwPd
+dorwart d{rw{rt
+dory d{r/
+dos dOs
+dos d{s
+dosage dOs@j
+dosages dOs@j@z
+dosch d{S
+doscher d{SP
+dose dOs
+doser dOsP
+doses dOs@z
+dosh doS
+dosher doSP
+doshi dOS/
+doshier doS/P
+dosia dOs/@
+dosie dos/
+dosier dOs/P
+dosimeters d]sim@tPz
+dosing dOs6N
+doskocil d{sk@sil
+dospasos d]spas]s
+dospasos' d]spas]s
+doss d{s
+dossantos d]sont]z
+dossett dosct
+dossey dos/
+dossier d{s/A
+dossier d{syA
+dossiers d{s/Az
+dossiers d{syAz
+dost dost
+dostal dost@l
+doster dostP
+dostie dost/
+dostoevski d{stOvsk/
+dostoevsky d{st<efsk/
+dostoevsky d{st<evsk/
+dostoevsky d{stOvsk/
+doswell doswcl
+dot dot
+dotan dOt~
+dote dOt
+doten dOt~
+doth d{T
+dothan doT~
+doting dOt6N
+doto dOt]
+dots dots
+dotson dots~
+dott dot
+dottavio d]tov/]
+dotted dot@d
+dotter dotP
+dotterer dotPP
+dottie dot/
+dotting dot6N
+dotts dots
+dotty dot/
+doty dOt/
+dotzler dotslP
+doub d?b
+doubek d?b6k
+doubet d?bct
+double dub@l
+double-entendre dub@lontondr@
+doubled dub@ld
+doubleday dub@ldA
+doubles dub@lz
+doublespeak dub@lspEk
+doublethink dub@lTiNk
+doubletree dub@ltrE
+doubling dub@l6N
+doubling dubl6N
+doubly dubl/
+doubrava d?br@v@
+doubt d?t
+doubted d?t@d
+doubter d?tP
+doubters d?tPz
+doubtfire d?tfIP
+doubtfire d?tfIr
+doubtfire's d?tfIPz
+doubtfire's d?tfIrz
+doubtfires d?tfIPz
+doubtfires d?tfIrz
+doubtful d?tf@l
+doubting d?t6N
+doubtless d?tl@s
+doubts d?ts
+doucet dUset
+doucette dUset
+doud d?d
+doudna d?dn@
+douds d?dz
+doug dug
+doug's dugz
+dougal dUg@l
+dougall d?g@l
+dougall dUg@l
+dougan d?g~
+dougan dUg~
+dougans d?g~
+dougans dUg~
+dougens d?g~z
+dougens dUg~z
+dough dO
+doughboy dOb<
+dougher dOP
+dougherty dOPt/
+dougherty dogPt/
+doughman dOm~
+doughnut dOnut
+doughnuts dOnuts
+doughten d{t~
+doughtie d{t/
+doughty d{t/
+doughy dO/
+dougie dUg/
+dougie's dUg/z
+dougl dUg@l
+douglas dugl@s
+douglas' dugl@s
+douglas's dugl@s@z
+douglass dugl@s@z
+doukas d?k@z
+doulton dOlt~
+douma dOm@
+doupe dUp
+dour d?P
+dour d?r
+douse d?s
+doused d?st
+dousing d?s6N
+douthat d?T@t
+douthett d?Tct
+douthit dUTit
+douthitt dUTit
+doutt d?t
+douty d?t/
+douville dUvil
+douwe dU
+dov dov
+dove dOv
+dove duv
+dovel d]vel
+dover dOvP
+dover's dOvPz
+doverspike d@vVsp6k
+doves duvz
+dovetail duvtAl
+dovetailed duvtAld
+dovetails duvtAlz
+dovey d@vA
+dovidio d]vEd/]
+dovish dOv6S
+dovish duv6S
+dow d?
+dow's d?z
+dowager d?@jP
+dowd d?d
+dowda d?d@
+dowdall d?d@l
+dowdell d?d@l
+dowden d?d~
+dowding d?d6N
+dowdle d?d@l
+dowds d?dz
+dowdy d?d/
+dowe d?
+dowel d?@l
+dowell dowcl
+dowels d?@lz
+dowen d?~
+dower d?r
+dowers d?rz
+dowie d?/
+dowis d?is
+dowland d?l~d
+dowlen d?l~
+dowler d?lP
+dowless d?l@s
+dowling d?l6N
+down d?n
+down's d?nz
+downard d?nPd
+downbeat d?nbEt
+downcast d?nkast
+downdraft d?ndraft
+downe d?n
+downed d?nd
+downen d?n~
+downer d?nP
+downers d?nPz
+downes d?nz
+downes's d?nz@z
+downey d?n/
+downey's d?n/z
+downfall d?nf{l
+downgrade d?ngrAd
+downgraded d?ngrAd@d
+downgrades d?ngrAdz
+downgrading d?ngrAd6N
+downgradings d?ngrAd6Nz
+downham d?nh}
+downhill d?nh6l
+downie d?n/
+downing d?n6N
+downingtown d?n6Nt?n
+download d?nlOd
+downloaded d?nlOd@d
+downloading d?nlOd6N
+downpayment d?npAm~t
+downplay d?nplA
+downplayed d?nplAd
+downplaying d?nplA6N
+downplays d?nplAz
+downpour d?np{r
+downpours d?np{rz
+downrange d?nrAnj
+downright d?nrIt
+downriver d?nrivP
+downs d?nz
+downscale d?nskAl
+downside d?nsId
+downsides d?nsIdz
+downsize d?nsIz
+downsized d?nsIzd
+downsizing d?nsIz6N
+downsizings d?nsIz6Nz
+downstage d?nstAj
+downstairs d?nst,rz
+downstate d?nstAt
+downstream d?nstrEm
+downswing d?nsw6N
+downtime d?ntIm
+downtown d?nt?n
+downtowns d?nt?nz
+downtrend d?ntrend
+downtrodden d?ntrod~
+downturn d?ntVn
+downturns d?ntVnz
+downum d?n}
+downward d?nwPd
+downwardly d?nwPdl/
+downwards d?nwPdz
+downwind d?nwind
+downy d?n/
+dowry d?r/
+dowse d?s
+dowsing d?s6N
+dowsman d?zm~
+dowty d?t/
+doxey doks/
+doxie doks/
+doxologies doksol@j/z
+doxology doksol@j/
+doxtater dokstAtP
+doxy doks/
+doyal d<ol
+doyel d<@l
+doyen d<in
+doyle d<l
+doyle's d<lz
+doyon d<~
+doze dOz
+dozed dOzd
+dozen duz~
+dozens duz~z
+dozes dOz@z
+dozier dOz/P
+dozing dOz6N
+dqalpha dEkyUalf@
+dr doktP
+dr drIv
+dr. doktP
+dr. drIv
+drab drab
+drabbed drabd
+drabble drab@l
+drabek drab6k
+drabenstott dr@benst@t
+drabik drob6k
+drabinsky dr@binsk/
+drabkin drabkin
+drabs drabz
+drace drAs
+drach draC
+drachenberg drak~bPg
+drachma drakm@
+drachmas drokm@z
+drackett drakct
+draco drAk]
+draco drak]
+draconian dr@kOn/~
+draconian drAkOn/~
+dracula drakyUl@
+draeger dregP
+draffen draf~
+draft draft
+draft's drafts
+drafted draft@d
+draftee draftE
+draftees draftEz
+drafter draftP
+drafters draftPz
+drafting draft6N
+drafts drafts
+draftsman draftsm~
+draftsmanship draftsm~Sip
+draftsmen draftsm~
+drafty draft/
+drag drag
+dragan drog~
+drage drAj
+drager drAgP
+dragged dragd
+dragging drag6N
+draggy drag/
+dragline draglIn
+dragnet dragnet
+dragnets dragnets
+drago drog]
+dragon drag~
+dragon's drag~z
+dragonair drag~er
+dragone dr@gOn
+dragonhead drag~hed
+dragonheart drag~hort
+dragons drag~z
+dragoo drogU
+dragovich drag@v6C
+drags dragz
+draheim drahIm
+drahos drAh]z
+drahuschak drahuSak
+drain drAn
+drainage drAn@j
+draine drAn
+drained drAnd
+drainer drAnP
+drainers drAnPz
+draining drAn6N
+drains drAnz
+drake drAk
+drakeford drakf{rd
+drakes drAks
+drakos drAk]z
+dralle drAl
+dram dEram
+dram dram
+drama drom@
+dramamine dram}En
+dramas drom@z
+dramatic dr}at6k
+dramatically dr}at6k@l/
+dramatically dr}at6kl/
+dramatist drom@tist
+dramatization dram@t@zAS~
+dramatizations dram@t@zAS~z
+dramatize dram@tIz
+dramatize drom@tIz
+dramatized dram@tIzd
+dramatizes dram@tIz@z
+dramatizing dram@tIz6N
+drams dEramz
+drams dramz
+drane drAn
+draney drAn/
+drang draN
+drank draNk
+dransfield dransfEld
+drape drAp
+drapeau dr@pO
+draped drApt
+draper drApP
+draperies drApP/z
+drapery drApP/
+drapes drAps
+draping drAp6N
+drapkin drapkin
+drasner drasnP
+drastic drast6k
+drastically drast6kl/
+draughn dr{n
+draughon dr{~
+draught draft
+draughts drafts
+draus dr{z
+dravecky dr@vek/
+draves drAvz
+dravis dravis
+dravo drav]
+dravo's drav]z
+draw dr{
+drawback dr{bak
+drawbacks dr{baks
+drawbaugh dr{b{
+drawbridge dr{brij
+drawdown dr{d?n
+drawdowns dr{d?nz
+drawdy dr{d/
+drawer dr{r
+drawers dr{rz
+drawing dr{6N
+drawings dr{6Nz
+drawl dr{l
+drawled dr{ld
+drawls dr{lz
+drawn dr{n
+draws dr{z
+dray drA
+drayer drAP
+drayton drAt~
+drayton's drAt~z
+dread dred
+dreaded dred@d
+dreadful dredf@l
+dreadfully dredf@l/
+dreading dred6N
+dreadnought dredn{t
+dreads dredz
+dream drEm
+dreamed drEmd
+dreamer drEmP
+dreamers drEmPz
+dreaming drEm6N
+dreamland drEmland
+dreamlike drEmlIk
+dreams drEmz
+dreamt dremt
+dreamworks drEmwVks
+dreamworks' drEmwVks
+dreamworld drEmwVld
+dreamy drEm/
+dreariness drEr/n@s
+dreary drir/
+drebsky drebsk/
+drechsel dreks@l
+drechsler dreks@lP
+dred dred
+dredd dred
+dredge drej
+dredged drejd
+dredges drej@z
+dredging drej6N
+drees drEz
+dreese drEz
+dreessen drEs~
+dreger dregP
+dregs dregz
+dreher dr,r
+dreibelbis drIbclb@s
+dreier drIP
+dreighton drIt~
+dreiling drIl6N
+dreis drEz
+dreisbach drIsbok
+dreman drEm~
+drench drenC
+drenched drenCt
+drenching drenC6N
+drennan dren~
+drennen dren~
+drenning dren6N
+drennon dren~
+drenth drenT
+drepung drApuN
+drepung drAp{N
+dresbach dresbok
+dresch dreS
+drescher dreSP
+dresden drezd~
+dresdner drezdnP
+dresdner's drezdnPz
+dresen drEz~
+dresher dreSP
+dresner dreznP
+dress dres
+dressage drcsoZ
+dressed drest
+dressel dres@l
+dressen dres~
+dresser dresP
+dresser's dresPz
+dressers dresPz
+dresses dres@z
+dressier dres/P
+dressing dres6N
+dressings dres6Nz
+dressler dreslP
+dressmaker dresmAkP
+dressmakers dresmAkPz
+dressmaking dresmAk6N
+dressy dres/
+drew drU
+drewery drUP/
+drewes drUz
+drewett drU@t
+drewry drUr/
+drews drUz
+drexel dreks@l
+drexel's dreks@lz
+drexler drekslP
+drey drA
+dreyer drAP
+dreyfus drAf@s
+dreyfus drIf@s
+dreyfus's drAf@s@z
+dreyfuss drAf@s
+dribbed dribd
+dribble drib@l
+dribbled drib@ld
+dribbling drib@l6N
+dribbling dribl6N
+dribs dribz
+dried drId
+driehaus drEh?s
+drier drIP
+dries drIz
+driessen drEs~
+driest drI@st
+driever drEvP
+drift drift
+drifted drift@d
+drifter driftP
+drifters driftPz
+drifting drift6N
+driftnet driftnet
+drifts drifts
+driftwood driftwqd
+driggers drigPz
+driggs drigz
+drill dril
+drillbit drilbit
+drilled drild
+driller drilP
+drillers drilPz
+drilling dril6N
+drilling's dril6Nz
+drills drilz
+drina dEn@
+drina's dEn@z
+drinas dEn@z
+dring driN
+drink driNk
+drinkable drink@b@l
+drinkard driNkPd
+drinker driNkP
+drinker's driNkPz
+drinkers driNkPz
+drinking driNk6N
+drinks driNks
+drinkwater driNkw{tP
+drinkwine driNkwIn
+drinnon drin~
+drip drip
+dripped dript
+dripping drip6N
+dripps drips
+drips drips
+driscoll drisk@l
+driskell drisk@l
+driskill driskil
+drivable drIv@b@l
+drive drIv
+drive's drIvz
+drivel driv@l
+driven driv~
+driver drIvP
+driver's drIvPz
+driverless drIvPl@s
+drivers drIvPz
+drivers' drIvPz
+drives drIvz
+driveway drIvwA
+driveways drIvwAz
+driving drIv6N
+drizzle driz@l
+drizzling driz@l6N
+drizzling drizl6N
+drizzly drizl/
+drobkov dr{bk{f
+drobkov dr{bk{v
+drobny drobn/
+droddy drod/
+droege drOj
+droessler drOs@lP
+droge drOj
+drogoul dr]gUl
+drogoul's dr]gUlz
+drogue drOg
+drohan drO~
+droke drOk
+drolet drOlct
+droll drOl
+drollinger drOl6NP
+dromedary drom@der/
+dromer drOmP
+dromey drOm/
+dromgoole dromgUl
+dromgooles dromgUlz
+dromi drom/
+dromomania drOm]mAn/@
+dromomania drOm]mAny@
+dromon drOm~
+drone drOn
+droned drOnd
+drones drOnz
+dronet drOnct
+droney drOn/
+droning drOn6N
+drool drUl
+drooling drUl6N
+droop drUp
+drooped drUpt
+drooping drUp6N
+droopy drUp/
+drop drop
+dropkin dropkin
+droplet dropl@t
+droplets dropl@ts
+dropoff drop{f
+dropout drop?t
+dropouts drop?ts
+dropped dropt
+dropper dropP
+droppers dropPz
+dropping drop6N
+droppings drop6Nz
+drops drops
+dropsy drops/
+droser drOzP
+dross dr{s
+drost drost
+droste drOst
+drotar drOtP
+drought dr?t
+drought's dr?ts
+droughts dr?ts
+drouillard drw/l)rd
+drouin drwEn
+drove drOv
+drover drOvP
+droves drOvz
+drown dr?n
+drowned dr?nd
+drowning dr?n6N
+drownings dr?n6Nz
+drowns dr?nz
+drowsiness dr?z/n@s
+drowsy dr?z/
+droz droz
+drozd drozd
+drozda drozd@
+drozdowski dr@zd{fsk/
+dru drU
+drub drub
+drubbed drubd
+drubbing drub6N
+druce drUs
+drucie druk/
+druck druk
+druckenmiller druk~milP
+drucker drukP
+druckman drukm~
+drudge druj
+drudgery drujP/
+druella drUel@
+drug drug
+drug's drugz
+drugan drUg~
+drugged drugd
+drugging drug6N
+druggist drug@st
+druggist's drug@sts
+druggists drug@s
+druggists drug@ss
+druggists drug@sts
+drugmaker drugmAkP
+drugmakers drugmAkPz
+drugs drugz
+drugs' drugz
+drugstore drugst{r
+drugstores drugst{rz
+druid drU@d
+druidism drU@diz}
+druids drU@dz
+druisilla dr@sil@
+drum drum
+drumbeat drumbEt
+drumhead drumhed
+drumheller drumhelP
+drumlin's drumlinz
+drumm drum
+drummed drumd
+drummer drumP
+drummers drumPz
+drummey drum/
+drumming drum6N
+drummond drum~d
+drummonds drum~dz
+drumright drumrIt
+drums drumz
+drumstick drumst6k
+drumwright drumrIt
+drunk druNk
+drunkard druNkPd
+drunkards druNkPdz
+drunken druNk~
+drunkenness druNk~n@s
+drunks druNks
+drupe drUp
+drupes drUps
+drury drUr/
+drusa drUs@
+druse drUz
+drusie drus/
+drusilla drUsil@
+druthers druTPz
+druze drUz
+dry drI
+dryclean drIklEn
+dryden drId~
+drye drI
+dryer drIP
+dryers drIPz
+drying drI6N
+dryly drIl/
+dryness drIn@s
+drypers drIpPz
+drypoint drIp<nt
+drysdale drIzdAl
+dryser drIsP
+drywall drIwol
+drzewiecki jUEtsk/
+dsouza d@sUz@
+dss dEeses
+dsv dEesvE
+du d@
+du dU
+dual dU@l
+dual dUl
+dualism dU@liz}
+dualisms dU@liz}z
+dualist dU@list
+dualistic dU@list6k
+duality dUal@t/
+duals dU@lz
+duan dwAn
+duan dwan
+duana dUan@
+duane dwAn
+duarte dw)rtA
+duarte's dw)rtAz
+dub dub
+duba dUb@
+dubach dubok
+dubai dUbI
+dubarry dUber/
+dubas dUb@z
+dubay dubA
+dubbed dubd
+dubberly dubPl/
+dubbing dub6N
+dubbs dubz
+dubcek dUbCek
+dubcek dubCek
+dube dUb
+dubeau d@bO
+duberstein dUbPstEn
+duberstein dUbPstIn
+duberstein's dUbPstEnz
+duberstein's dUbPstInz
+dubey dub/
+dubhi dUb/
+dubicki d@bitsk/
+dubie dub/
+dubiel dub/l
+dubilier dUb@lIP
+dubilier dUb@lir
+dubin dUbin
+dubinin dUbin~
+dubinsky d@binsk/
+dubious dUb/@s
+dubis dUbis
+dublin dubl~
+dublin's dubl~z
+duboff dub{f
+dubois dUb<s
+dubois dUbwo
+duboise dUb<s
+duboise dUbwo
+dubord d@b{rd
+dubose dUbOz
+dubow dUb]
+dubrawski dUbr?sk/
+dubray dubrA
+dubree d@brE
+dubreuil dubrUl
+dubroc dubr@k
+dubroff dUbr{f
+dubrovnik dUbrovn6k
+dubrovnik's dUbrovn6kz
+dubrovniks dUbrovn6kz
+dubrow dubrO
+dubs dubz
+dubuc dUb@k
+dubuisson dub@s~
+dubuque d@byUk
+dubuque's d@byUks
+duby dUb/
+duc duk
+duca dUk@
+ducal dUk@l
+duce dUs
+ducey dus/
+duch duC
+duchaine duSAn
+duchamp dUSomp
+duchamp's dUSomps
+ducharme duS)rm
+duchemin duS}an
+duchene duk/n
+duchenne dUSen
+duchesneau duS@sn]
+duchess duC@s
+duchin dUCin
+duchon duC~
+duchossois dUC{swo
+duchow duC]
+duchy duC/
+duck duk
+duck's duks
+ducked dukt
+ducker dukP
+duckett duk@t
+ducking duk6N
+duckling dukl6N
+ducklings dukl6Nz
+ducks duks
+ducks' duks
+ducksworth dukswVT
+duckwall dukw{l
+duckweed dukwEd
+duckworth dukwVT
+duclos d@klOz
+ducommun dUkomUn
+ducommun dUkom~
+ducote d@kOt
+duct dukt
+ductile dukt@l
+ductility d@ktil@t/
+ductless duktl@s
+ducts dukts
+dud dud
+duda dUd@
+dudack dUdak
+dudar dUdP
+dudas dUd@z
+dudash dud6S
+dudayev dUdIev
+dudayev's dUdIevz
+dudd dud
+dudding dud6N
+duddy dud/
+dude dUd
+dudeck dUdck
+dudeck's dUdcks
+dudek dUd6k
+duden dUd~
+dudenhoeffer dud~h]fP
+dudes dyUdz
+dudgeon duj~
+dudik dUd6k
+dudley dudl/
+dudman dudm~
+dudney dudn/
+duds dudz
+dudziak duj/ak
+dudzik dudz6k
+dudzinski d@jinsk/
+due dU
+due dyU
+duecker dUkP
+dueitt dU@t
+dueker dUkP
+duel dU@l
+dueled dU@ld
+dueling dUl6N
+duelist dU@l6st
+duell dUl
+duell jUl
+duels dU@lz
+duena dUen@
+duena dwAny@
+duenas dUen@s
+duenas dwAny@s
+duenez dwcnez
+duenow dUn]
+duensing dqns6N
+duer dUP
+duerksen dqrks~
+duerr dqr
+duerson dqrs~
+duerst dqrst
+dues dUz
+duesberg dUzbPg
+duesing dUs6N
+duesler dUs@lP
+duesseldorf dUs@ld{rf
+duet dUet
+duet dyUet
+duets dUets
+duets dyUets
+duey dU/
+duey dyU/
+dufault d@fO
+dufek dUf6k
+duff duf
+duffee duf/
+duffek duf6k
+duffel duf@l
+duffell duf@l
+duffer dufP
+duffett duf@t
+duffey duf/
+duffie duf/
+duffield dufEld
+duffin dufin
+duffner dufnP
+dufford dufPd
+duffour duf{r
+duffus duf@s
+duffy duf/
+dufner dufnP
+duford dufPd
+dufort dufPt
+dufour d@fqr
+dufrane d@frAn
+dufrene d@frEn
+dufresne d@fren
+dufur d@fV
+dug dug
+dugal dUj@l
+dugald dug@ld
+dugan dug~
+dugar dUgP
+dugas dUg@z
+dugdale dugdAl
+duggan dug~
+duggar dugP
+dugger dugP
+duggin dugin
+duggins duginz
+dugo dUg]
+dugout dug?t
+dugouts dug?ts
+duguay dugA
+duguid dugw@d
+duh du
+duhaime dUIm
+duhamel dUham@l
+duhart duhort
+duhe dUh
+duhon dUh~
+duhr dV
+dui dEyUI
+duignan d6gnan
+duis dEyUIz
+duis dU@z
+duisburg dUsbPg
+duitsman dUtsm~
+duk duk
+dukakis dUkok@s
+dukakis' dUkok@s
+dukakis' dUkok@s@z
+dukakis's dUkok@s@z
+dukakises dUkok@s@z
+dukart dukort
+duke dUk
+duke's dUks
+dukedom dUkd}
+dukeman dUkm~
+duker dUkP
+dukes dUks
+duking dUk6N
+dula dUl@
+dulac d@lak
+dulak dUl@k
+dulaney dyUl~/
+dulany dyUl{n/
+dulay dyUlA
+dulce duls
+dulcea duls/@
+dulcet duls@t
+dulciana dUlCan@
+dulcibelle duls@b@l
+dulcie dulk/
+dulcimer duls}P
+dulcine dulsin
+dulcinea dulsinE@
+dule dUl
+duley dyUl/
+dulin dUlin
+duling dyUl6N
+dull dul
+dulle dul
+dullea dul/@
+dulled duld
+duller dulP
+dulles dul@s
+dullest dul@st
+dulling dul6N
+dullness duln@s
+dulmage dulm@j
+dulong dyUl{N
+dulski dulsk/
+dulude dyUlUd
+duluth d@lUT
+dulwich dulwiC
+dulworth dulwPT
+duly dUl/
+dum dum
+duma dUm@
+dumaine d}An
+dumais d}A
+duman dUm~
+dumas dUm@z
+dumas dUmo
+dumb dum
+dumbbell dumbel
+dumbbells dumbelz
+dumber dumP
+dumbest dum@st
+dumbfound dumf?nd
+dumbfounded dumf?nd@d
+dumbing dum6N
+dumbo dumb]
+dumbstruck dumstruk
+dumenil dUm~il
+dumez dUmcz
+dumford dumfPd
+dumire dUmirA
+dumke dumk/
+dumlao dUml?
+dumler dumlP
+dumm dum
+dummer dumP
+dummies dum/z
+dummitt dumit
+dummy dum/
+dumond d}ond
+dumont dUmont
+dumoulin dumUlan
+dump dump
+dumped dumpt
+dumper dumpP
+dumping dump6N
+dumpling dumpl6N
+dumplings dumpl6Nz
+dumps dumps
+dumpster dumpstP
+dumpsters dumpstPz
+dumptruck dumptruk
+dumptrucks dumptruks
+dumpty dumpt/
+dumpy dump/
+dun dun
+dun's dunz
+duna dUn@
+dunagan dUnogon
+dunahoo dUnohU
+dunaj dUn@j
+dunavan dun@van
+dunavant dUnov~t
+dunaway dun@wA
+dunay dunA
+dunbar dunbor
+dunblane dunblAn
+dunc duNk
+duncan duNk~
+duncanson duNk~s~
+dunckel duNk@l
+duncombe duNk}
+dundas dund@z
+dundee d~dE
+dundon dund~
+dundore dundP
+dune dUn
+dunedin dUn@din
+dunegan dun@gan
+dunes dUnz
+dunfee dunfE
+dunford dunfPd
+dung duN
+dungan duNg~
+dungeon dunj~
+dungeons dunj~z
+dungey dunj/
+dunham dun}
+dunhill dunhil
+dunigan dun6gan
+dunite dUnIt
+dunivan dun6van
+dunja dUny@
+dunja dunj@
+dunk duNk
+dunked duNkt
+dunkel duNk@l
+dunkelberg duNk@lbPg
+dunkelberger duNk@lbPgP
+dunker duNkP
+dunkerley duNkPl/
+dunkin duNkin
+dunkin' duNk~
+dunkirk dunkPk
+dunkle duNk@l
+dunkleberger duNk@lbPgP
+dunklee duNklE
+dunkley duNkl/
+dunklin duNklin
+dunks duNks
+dunlaevy d~lAv/
+dunlap dunlap
+dunlavey d~l@vA
+dunlavy dunl@v/
+dunlay dunlA
+dunleavy dUnl@v/
+dunlevy dUnl6v/
+dunley dunl/
+dunlop dunlop
+dunman dunm~
+dunmire dUnmirA
+dunn dun
+dunnagan dun@gan
+dunnam dun}
+dunnavant dun@v~t
+dunnaway dun@wA
+dunne dun
+dunned dund
+dunnell dun@l
+dunnett dun@t
+dunnigan dun6g~
+dunning dun6N
+dunnington dun6Nt~
+dunphy dunf/
+duns dunz
+dunshee dunS/
+dunsmoor dunzmqr
+dunsmore dunsm{r
+dunson duns~
+dunst dunst
+dunstan dunst~
+dunster dunstP
+dunston dunst~
+dunsworth dunzwVT
+dunton dunt~
+dunwoody dunwqd/
+dunworth dunwVT
+duo dU]
+duodenal dUod~@l
+duodenum dUod~}
+duong dU]N
+duopoly dU]pol/
+duopoly dyUop@l/
+dupay dUpA
+dupe dUp
+duped dUpt
+dupee dUpE
+duper dUpP
+dupes dUps
+dupin d@pan
+duplantis d@plantis
+duplechain dUp@lSAn
+duplechin dUpl6kin
+dupler dUp@lP
+duplessis dUplcsis
+duplex dUpleks
+duplicate dUpl@k@t
+duplicate dUpl@kAt
+duplicated dUpl6kAt@d
+duplicated dyUpl@kAt@d
+duplicates dyUpl@kAts
+duplicating dUpl6kAt6N
+duplication dyUpl@kAS~
+duplications dUpl6kAS~z
+duplicative dUplik@t6v
+duplicitous dUplis@t@s
+duplicity dUplis@t/
+dupont dUpont
+dupont's dUponts
+dupras d@proz
+dupre dupP
+dupree d@prE
+duprey dupr/
+dupriest dUprEst
+dupriest dupP/@st
+dupuis dupU@z
+dupuy d@pI
+duque dUk
+duquesne dUkAn
+duquesne's dUkAnz
+duquette d@ket
+dura dqr@
+durability dP@bil@t/
+durable dqr@b@l
+durables dqr@b@lz
+duracell dqr@sel
+durakon dqr@k~
+durall dyUr@l
+duramed dqr}ed
+duran dPan
+duran's dPans
+durando dqrond]
+durang dPaN
+durango dPaNg]
+durant dqr~t
+durant's dPants
+durante dqront/
+duration dqrAS~
+durations dqrAS~z
+duray dqrA
+durazo dqroz]
+durban dVb~
+durben dVb~
+durbin dVbin
+durch dVC
+durchholz dVCOlts
+durden dVd~
+durdin dVdin
+duree dqrE
+durell dyUr@l
+duren dqr~
+durenberger dqr~bPgP
+durene dyUr/n
+durer dqrP
+duress dqrcs
+durette dPet
+durfee dVf/
+durfey dVf/
+durflinger dVf@l6NP
+durgan dVg~
+durgin dVjin
+durham dV}
+durham dqrham
+durham dqr}
+duri dqr/
+durick dyUr6k
+durie dqr/
+during dV6N
+during dqr6N
+during dyqr6N
+durio dqr/]
+duriron dUrir~
+duris dyUris
+durkee dVk/
+durkheim dVkhIm
+durkheim's dVkhImz
+durkin dVkin
+durland dVl~d
+durley dVl/
+durling dVl6N
+durn dVn
+durnell dVn@l
+durney dVn/
+durnil dVn@l
+durnin dVnin
+durning dVn6N
+duro dqrO
+durocher dyUr@kP
+duron dyUr~
+duross dyUr@s
+durr dV
+durrah d{r@
+durrance dqr~s
+durrant d{r~t
+durrell d{r@l
+durrence d{r~s
+durrett d{r@t
+durso dqrs]
+durst dVst
+durum dqr}
+durward dVwPd
+durwin dVwin
+dury dqr/
+duryea dqrE@
+duryee dqrE
+dusch duC
+dusch duS
+dusek dUsck
+dusenberry dUs~bcr/
+dusenbery d@senbP/
+dusenbury dUs~bcr/
+dush dUS
+dush duS
+dushane dUSAn
+dushyanth dUS/onT
+dusing dUs6N
+dusk dusk
+duskin duskin
+dussault d@sO
+dusseau d@sO
+dusseault d@sO
+dusseldorf dUs@ld{rf
+dust dust
+dustbin dustbin
+dusted dust@d
+duster dustP
+dusters dustPz
+dustin dustin
+dusting dust6N
+dustman dustm~
+duston dust~
+dusts dus
+dusts duss
+dusts dusts
+dusty dust/
+dusza duS@
+duszynski duSinsk/
+dutch duC
+dutcher duCP
+dutchman duCm~
+duthie duT/
+duties dUt/z
+dutiful dUt/f@l
+dutifully dUt/f@l/
+dutil d@til
+dutka dutk@
+dutkiewicz dutk@v6C
+dutko dutk]
+dutoit dUt<t
+dutra dUtr@
+dutro dutr]
+dutrow dutr]
+dutson duts~
+dutt dut
+dutter dutP
+dutton dut~
+duty dUt/
+duty dyUt/
+duva dUv@
+duval dUval
+duvalier dUvalyP
+duvaliers dUvAlyPz
+duvall dUvol
+duve dUv
+duvernay d@vVnA
+duvrees dUvrEz
+duwayne dUwAn
+duwe dUw
+dux duks
+duzan dUz~
+dvoracek dv{r@Cck
+dvorak dv{r@k
+dvorsky dv{rsk/
+dwan dwon
+dwana dwon@
+dwarf dw{rf
+dwarfed dw{rft
+dwarfing dw{rf6N
+dwarfism dw{rfiz}
+dwarfs dw{rfs
+dwarves dw{rvz
+dwayne dwAn
+dweck dwek
+dwell dwel
+dwelle dwel
+dwelled dweld
+dweller dwelP
+dwellers dwelPz
+dwelley dwel/
+dwelling dwel6N
+dwellings dwel6Nz
+dwells dwelz
+dwelt dwelt
+dwi dEdub@lyUI
+dwi dEdub@yUI
+dwiggins dwiginz
+dwight dwIt
+dwindle dwind@l
+dwindled dwind@ld
+dwindles dwind@lz
+dwindling dwind@l6N
+dwindling dwindl6N
+dwinell dwin@l
+dwire dwIr
+dwivedi dw6ved/
+dworak dwV@k
+dworin dw{rin
+dworkin dw{rkin
+dworsky dwVsk/
+dwyer dwIP
+dyad dIad
+dyal dI@l
+dyan dIan
+dyana dIan@
+dyane dIan
+dyansen dI~s~
+dyar dIP
+dyas dI@s
+dyatron dI@tr~
+dyazide dI@zId
+dybas dIb@z
+dyce dIs
+dyche dIC
+dyches dIC@z
+dyck dIk
+dyckman dikm~
+dyco dIk]
+dycus dIk@s
+dye dI
+dyed dId
+dyeing dI6N
+dyer dIP
+dyes dIz
+dyess dI@s
+dyestuff dIstuf
+dyestuffs dIstufs
+dygert digPt
+dying dI6N
+dyk dik
+dykas dIk@z
+dyke dIk
+dykeman dIkm~
+dykes dIks
+dykhouse dikh?s
+dykman dikm~
+dykstra dIkstr@
+dylan dil~
+dylan's dil~z
+dylewski d@lefsk/
+dylex dIl@ks
+dymally dim@l/
+dymek dimck
+dyment dim~t
+dymond dIm~d
+dynafac dIn@fak
+dynalectric dIn@lektr6k
+dynalectron dIn@lektr~
+dynamic dInam6k
+dynamics dInam6ks
+dynamics' dInam6ks
+dynamics's dInam6ks@z
+dynamism dIn}iz}
+dynamite dIn}It
+dynamo dIn}O
+dynapac dIn@pak
+dynascan dIn@skan
+dynastic dInast6k
+dynasties dIn@st/z
+dynasty dIn@st/
+dynatech din@tek
+dyncorp dInk{rp
+dyncorp dink{rp
+dyneer dInir
+dynes dInz
+dysan dIs~
+dysart disPt
+dysentery dis~ter/
+dysert disPt
+dysfunction disfuNkS~
+dysfunctional disfuNkS~@l
+dysinger dis~jP
+dyslexia disleks/@
+dyslexic disleks6k
+dyson dIs~
+dysplasia displAZ@
+dystrophin distr@fin
+dystrophy distr@f/
+dzhirkvelov d@zVkv@lov
+dzhokhar jOk)r
+dzhokhar's jOk)rz
+dziak dzEak
+dzialo j/ol]
+dziedzic jEj6k
+dziekan jEk~
+dzik dzik
+dzikowski j6k{fsk/
+dziuba j/Ub@
+dziuk j/Uk
+dzokhar jOk)r
+e E
+e's Ez
+e. E
+e.'s Ez
+e.s Ez
+each EC
+eachan EC~
+eachus EC@s
+eaddy Ed/
+eade Ed
+eader EdP
+eades Edz
+eadie ed/
+eads Edz
+eady Ed/
+eagan Eg~
+eagar EgP
+eagen Eg~
+eager EgP
+eagerly EgPl/
+eagerness EgPn@s
+eagle Eg@l
+eagle's Eg@lz
+eagleburger Eg@lbPgP
+eagles Eg@lz
+eagleson Eg@ls~
+eagleton Eg@lt~
+eagleye Eg@lI
+eaglin Eglin
+eagon Eg~
+eaken Ek~
+eaker EkP
+eakes Eks
+eakin Ekin
+eakins Ekinz
+eakle Ek@l
+eales Elz
+ealey El/
+ealing El6N
+ealy El/
+eamer EmP
+eames Emz
+eamon Em~
+eanes Enz
+eap EApE
+eap Ep
+ear Er
+ear ir
+eardley Vdl/
+eardley irdl/
+eared ird
+earfull irful
+eargle irg@l
+earhart ,rhort
+earhart irhort
+earl Vl
+earldom Vld}
+earle Vl
+earlene Vl/n
+earles Vlz
+earless Erl@s
+earless irl@s
+earley Vl/
+earlie Vl/
+earlier Vl/P
+earlier's Vl/Pz
+earliest Vl/@st
+earline VlIn
+earll Vl
+earls Vlz
+early Vl/
+earlywine Vl/wIn
+earmark Ermork
+earmark irmork
+earmarked Ermorkt
+earmarked irmorkt
+earmarking Ermork6N
+earmarking irmork6N
+earmarks Ermorks
+earmarks irmorks
+earmuff Ermuf
+earmuff irmuf
+earmuffs Ermufs
+earmuffs irmufs
+earn Vn
+earned Vnd
+earner VnP
+earners VnPz
+earnest Vn@st
+earnestly Vn@stl/
+earnestness Vn@stn@s
+earney Vn/
+earnhardt Vnhort
+earnhart Vnhort
+earnheart Vnhort
+earning Vn6N
+earnings Vn6Nz
+earnings' Vn6Nz
+earns Vnz
+earnshaw VnS{
+earp Vp
+earphone ErfOn
+earphone irfOn
+earphones ErfOnz
+earphones irfOnz
+earpiece Erp/s
+earpiece irp/s
+earpieces Erp/s@z
+earpieces irp/s@z
+earplug Erplug
+earplug irplug
+earplugs Erplugz
+earplugs irplugz
+earring Er6N
+earring ir6N
+earrings Er6Nz
+earrings ir6Nz
+ears Erz
+ears irz
+earshot ErSot
+earshot irSot
+earth VT
+earth's VTs
+eartha VT@
+earthbound VTb?nd
+earthen VT~
+earthenware VT~wer
+earthling VTl6N
+earthlings VTl6Nz
+earthly VTl/
+earthmoving VTmUv6N
+earthquake VTkwAk
+earthquake's VTkwAks
+earthquakes VTkwAks
+earths VTs
+earthshaking VTSAk6N
+earthshine VTSIn
+earthstar VTstor
+earthwork VTwVk
+earthworm VTwVm
+earthworms VTwVmz
+earthy VT/
+earvin Vv~
+earwax Erwaks
+earwax irwaks
+earwood Erwqd
+earwood irwqd
+eary ir/
+easco Esk]
+ease Ez
+eased Ezd
+easel Ez@l
+easement Ezm~t
+eases Ez@z
+eash ES
+easier Ez/P
+easiest Ez/@st
+easily Ez@l/
+easing Ez6N
+easler EzlP
+easley Ezl/
+easom Ez}
+eason Ez~
+east Est
+east's Ests
+eastbound Estb?nd
+eastburn EstbVn
+eastdil Estdil
+eastend Eztend
+eastender EztendP
+eastenders EztendPz
+eastep Eztcp
+easter EstP
+easterbrook EstPbrqk
+easterday EstPdA
+easterlin @ztVlin
+easterling EstPl6N
+easterly EstPl/
+eastern EstPn
+eastern's EstPnz
+eastern-west EstPnwest
+easterner EstPnP
+easterners EstPnPz
+easterwood EstPwqd
+eastes Ests
+eastgroup EstgrUp
+eastham Est}
+eastin Eztin
+eastland Esland
+eastland Esl~d
+eastland Estland
+eastland Estl~d
+eastland's Eslandz
+eastland's Esl~dz
+eastland's Estlandz
+eastland's Estl~dz
+eastlick Estlik
+eastman Estm~
+eastmet Estmet
+eastmet's Estmets
+easton Est~
+eastover EstOvP
+eastpac Estpak
+eastpac's Estpaks
+eastridge Estrij
+eastward EstwPd
+eastwick Estwik
+eastwood Estwqd
+eastwood's Estwqdz
+easudes AsUdAs
+easy Ez/
+easy's Ez/z
+easygoing Ez/gO6N
+eat Et
+eatable Et@b@l
+eaten Et~
+eater EtP
+eateries EtP/z
+eaters EtPz
+eatery EtP/
+eatherly eTPl/
+eatherton ETVt~
+eatherton cTVt~
+eating Et6N
+eatman Etm~
+eatmon Etm~
+eaton Et~
+eaton's Et~z
+eats Ets
+eau O
+eaux Oz
+eave Ev
+eavenson Ev~s~
+eaves Evz
+eavesdrop Evzdrop
+eavesdropping Evzdrop6N
+eb eb
+eba Eb@
+eban Eb~
+eban eb~
+ebanks eb@Nks
+ebano Eb~]
+ebano cbon]
+ebarb eborb
+ebasco cbask]
+ebaugh eb{
+ebb eb
+ebba eb@
+ebbed ebd
+ebben eb~
+ebbers ebPz
+ebbert ebPt
+ebbing eb6N
+ebbs ebz
+ebby eb/
+ebel eb@l
+ebeling eb@l6N
+eben eb~
+ebeneezer eb~EzP
+ebenezer eb~EzP
+eber ebP
+eberhard ebPhort
+eberhardt ebPhort
+eberhart ebPhort
+eberl ebPl
+eberle ebP@l
+eberlein ebPlIn
+eberlin ebPlin
+eberling ebPl6N
+eberly ebPl/
+ebers ebPz
+ebersol ebPsol
+ebersold ebPsOld
+ebersole ebPsOl
+eberstadt ebPstat
+ebert ebPt
+eberts ebPts
+eberwein ebPwIn
+ebey eb/
+ebinger eb6NP
+eble eb@l
+eblen eb@l~
+eblin eblin
+ebling eb@l6N
+ebner ebnP
+ebola /bOl@
+ebonics /b{n6ks
+ebony eb~/
+ebright cbrIt
+ebro EbrO
+ebron ebr~
+ebullience @bqly~s
+ebullient @bqly~t
+eby Eb/
+ecad Ekad
+eccentric 6ksentr6k
+eccentric eksentr6k
+eccentricities ekscntris@t/z
+eccentricity eks~tris@t/
+eccentrics 6ksentr6ks
+eccentrics eksentr6ks
+eccles ek@lz
+ecclesiastic 6klEz/ast6k
+ecclesiastical 6klEz/ast6k@l
+eccleston ekl@ston
+ecevit es@v@t
+echard eCPd
+echavarria eC@var/@
+echelon eS@lon
+echelons eS@lonz
+echenberg ek~bPg
+echevarria ACAv)r/@
+echeverria ACAv,r/@
+echlin eklin
+echlin's eklinz
+echo ek]
+echo's ek]z
+echoed ek]d
+echoes ek]z
+echohawk ek]h{k
+echohawk's ek]h{ks
+echoing ek]6N
+echolocation ek]l]kAS~
+echols ek@lz
+echos ek]z
+eck ek
+eckard ekPd
+eckard ekhord
+eckardt ekPt
+eckardt ekhort
+eckardt's ekPts
+eckardt's ekhorts
+eckart ekort
+eckberg ekbPg
+eckel ek@l
+eckelberry ek@lber/
+eckels ek@lz
+eckenfelder ek~feldP
+eckenrod ek~r@d
+eckenrode ek~rOd
+eckenroth ek~r{T
+ecker ekP
+eckerd ekPd
+eckerle ekP@l
+eckerman ekPm~
+eckersley ekPsl/
+eckerson ekPs~
+eckert ekPt
+eckes eks
+eckhard ekhord
+eckhardt ekhort
+eckhart ekhort
+eckhoff ekh{f
+eckl ek@l
+eckland ekl~d
+eckler eklP
+eckles ek@lz
+eckley ekl/
+ecklund ekl~d
+eckman ekm~
+eckmann ekm~
+eckrich ekr6k
+eckrote ekr@t
+eckroth ekr{T
+eckstein ekstEn
+eckstein ekstIn
+eckstrom ekstr}
+eclectic 6klekt6k
+eclipse /klips
+eclipse 6klips
+eclipsed /klipst
+eclipsed 6klipst
+eclipses /klips@z
+eclipses 6klips@z
+eclipsing /klips6N
+eclipsing 6klips6N
+ecliptic 6klipt6k
+eco Ek]
+eco ek]
+ecogen Ek]g~
+ecolab Ek]lab
+ecolab ek]lab
+ecolaire Ek]ler
+ecole 6kOl
+ecological /k@loj6k@l
+ecological ck@loj6k@l
+ecologically /k@loj6kl/
+ecologically ck@loj6kl/
+ecologist /kol@j@st
+ecologist 6kol@j@st
+ecologists /kol@j@s
+ecologists /kol@j@ss
+ecologists /kol@j@sts
+ecologists 6kol@j@s
+ecologists 6kol@j@ss
+ecologists 6kol@j@sts
+ecology /kol@j/
+ecology 6kol@j/
+econ Ekon
+econocom /kon]kom
+econoline /kon]lIn
+econometric 6kon}etr6k
+econometrics 6kon}etr6ks
+economic Ek~om6k
+economic ek~om6k
+economical Ek~om6k@l
+economical ek~om6k@l
+economically Ek~om6kl/
+economically ek~om6kl/
+economico /kon}Ek]
+economics Ek~om6ks
+economics ek~om6ks
+economies /kon}/z
+economies 6kon}/z
+economist /kon}@st
+economist 6kon}@st
+economist's /kon}@s
+economist's /kon}@ss
+economist's /kon}@sts
+economist's 6kon}@s
+economist's 6kon}@ss
+economist's 6kon}@sts
+economists /kon}@s
+economists /kon}@ss
+economists 6kon}@s
+economists 6kon}@ss
+economists 6kon}@sts
+economists' /kon}@s
+economists' /kon}@ss
+economists' /kon}@sts
+economists' 6kon}@s
+economists' 6kon}@ss
+economists' 6kon}@sts
+economize /kon}Iz
+economize 6kon}Iz
+economizing /kon}Iz6N
+economizing 6kon}Iz6N
+economos ck~Om]z
+economou ck]nOmU
+economy /kon}/
+economy 6kon}/
+economy's /kon}/z
+economy's 6kon}/z
+econships EkonSips
+ecosystem Ek]sist}
+ecosystems Ek]sist}z
+ecru ekrU
+ecstasy ekst@s/
+ecstatic ckstat6k
+ecstatically ckstat6kl/
+ecton ekt~
+ector ektP
+ecuador ekw@d{r
+ecuador's ekw@d{rz
+ecuadoran ekw@d{r~
+ecuadorean ekw@d{r/~
+ecuadorian ekw@d{r/~
+ecumena ekyUmEn@
+ecumenical ekyUmen6k@l
+eczema eks}@
+ed ed
+ed's edz
+eda Ed@
+edam Ed}
+edan Ed~
+edana cdan@
+edberg edbPg
+edbert edbPt
+eddie ed/
+eddie's edEz
+eddies ed/z
+eddinger ed6NP
+eddings ed6Nz
+eddington ed6Nt~
+eddins edinz
+eddleman ed@lm~
+eddlemon ed@lmon
+edds edz
+eddy ed/
+ede Ed
+edel ed@l
+edelen ed@l~
+edeline ed@lIn
+edell @del
+edelman Ad@lm~
+edelman ed@lm~
+edelman's Ad@lm~z
+edelman's ed@lm~z
+edelmann ed@lm~
+edelmar ed@lmP
+edelson ed@ls~
+edelstein ed@lstEn
+edelstein ed@lstIn
+edelweiss Ad@lvIs
+edema @dEm@
+eden Ed~
+edenfield ed~fEld
+edens Ed~z
+edenton ed~t~
+eder edP
+ederer edPP
+edes Edz
+edgar edgP
+edgar's edgPz
+edgcomb ejk}
+edge ej
+edgecomb ejk{m
+edgecombe ejk]m
+edged ejd
+edgell ej@l
+edgemon ejm~
+edger ejP
+edgerly ejPl/
+edgerton ejPt~
+edges ej@z
+edgett ejit
+edgeway ejwA
+edgeways ejwAz
+edgewise ejwIz
+edgewood ejwqd
+edgeworth ejwPT
+edgin ejin
+edginess ej/n@s
+edging ej6N
+edgington ej6Nt~
+edgington's ej6Nt~z
+edgley ejl/
+edgmon ejm~
+edgren edgrcn
+edgy ej/
+edi Ed/
+edible ed@b@l
+edibles ed@b@lz
+edick ed6k
+edict Ed6kt
+edicts Ed6kts
+edie ed/
+edification ed@f@kAS~
+edifice ed@f@s
+edify ed@fI
+edifying ed@fI6N
+ediger ed6gP
+edin edin
+edina @dEn@
+edinboro ed~bP]
+edinburgh ed~bP]
+edinger ed6NP
+edington ed6Nt~
+edison ed@s~
+edison's ed@s~z
+edisto edist]
+edit ed@t
+edited ed@t@d
+edith EdiT
+editha ed@T@
+edithe ed@T
+editing ed@t6N
+edition @diS~
+edition's @diS~z
+editions @diS~z
+editor ed@tP
+editor's ed@tPz
+editorial ed@t{r/@l
+editorial's ed@t{r/@lz
+editorialist ed@t{r/@l@st
+editorialists ed@t{r/@l@s
+editorialists ed@t{r/@l@ss
+editorialists ed@t{r/@l@sts
+editorialize ed@t{r/@lIz
+editorialized ed@t{r/@lIzd
+editorializing ed@t{r/@lIz6N
+editorially ed@t{r/@l/
+editorials ed@t{r/@lz
+editors ed@tPz
+editors' ed@tPz
+editorship ed@tPSip
+edits ed@ts
+ediva cdEv@
+edival cdEv@l
+edival ed/val
+edizione cdEz/On/
+edleman ed@lm~
+edler edlP
+edley edl/
+edlin edlin
+edling edl6N
+edlund edl~d
+edlyn edlin
+edman edm~
+edmands edm~dz
+edmar edmor
+edmark edmork
+edminster @dminstP
+edmison edm@s~
+edmisten cdmis~
+edmister edm@stP
+edmiston edm@ston
+edmond edm~d
+edmonda edmond@
+edmonds edm~dz
+edmondson edm~ds~
+edmonson edm~s~
+edmonston @dmonst~
+edmonton edm~t~
+edmund edm~d
+edmunda edmund@
+edmundo edmund]
+edmunds edm~dz
+edmundson edm~ds~
+edna edn@
+edney edn/
+edo Ed]
+edoardo edw)rd]
+edolf ed]lf
+edouard edUord
+edper edpP
+edquist edkwist
+edra edr@
+edrea edr/@
+edric edr6k
+edrington edP6Nt~
+edris @drEs
+edsall @ds{l
+edsel eds@l
+edson eds~
+edstrom edstr}
+eduard edwPd
+eduardo cdw)rd]
+educate ej@kAt
+educate ejyUkAt
+educated ej@kAt@d
+educated ejyUkAt@d
+educates ej@kAtz
+educates ejUkAts
+educates ejy@kAts
+educates ejyUkAts
+educating ej@kAt6N
+educating ejyUkAt6N
+education ej@kAS~
+education ejyUkAS~
+education's ej@kAS~z
+education's ejyUkAS~z
+educational ej@kAS~@l
+educational ejyUkAS~@l
+educationally ej@kASn@l/
+educationally ej@kAS~@l/
+educationally ejyUkASn@l/
+educationally ejyUkAS~@l/
+educations ej@kAS~z
+educations ejyUkAS~z
+educator ej@kAtP
+educator ejyUkAtP
+educators ej@kAtPz
+educators ejyUkAtPz
+edwald @dw{ld
+edward edwPd
+edward's edwPdz
+edwardian cdw{rd/~
+edwardine @dw{rdIn
+edwards edwPdz
+edwards' edwPdz
+edwards's edwPdz@z
+edwardson edw{rds~
+edwin edw~
+edwina cdwEn@
+edye Ed/
+edye ed/
+edyth ediT
+edythe edIT
+edzard edzPd
+ee E
+eeg Eg
+eel El
+eelam Elam
+eelgrass Elgras
+eellike EllIk
+eelpout Elp?t
+eelpouts Elp?ts
+eels Elz
+eeo EEO
+eerie ir/
+eerily ir@l/
+efaw ef{
+efface @fAs
+effacing @fAs6N
+effect @fekt
+effect Efckt
+effected @fekt@d
+effected Efckt@d
+effecting @fekt6N
+effecting Efckt6N
+effective @fekt6v
+effective Efckt6v
+effectively @fekt6vl/
+effectively Efckt6vl/
+effectiveness @fekt6vn@s
+effectiveness Efckt6vn@s
+effects @feks
+effects @fekts
+effects Efcks
+effects Efckts
+effectuate @fekCUAt
+effeminate /fem~@t
+efferent efP~t
+efferson efPs~
+effertz efPts
+effervescent efPves~t
+effete cfEt
+efficacious ef@kAS@s
+efficacy ef6kas/
+efficiencies @fiS~s/z
+efficiency @fiS~s/
+efficient @fiS~t
+efficiently @fiS~tl/
+effie ef/
+effigy ef6j/
+effinger ef6NP
+effingham ef6Nh}
+effingham ef6N}
+effler eflP
+effluent eflU~t
+efflux efl@ks
+effort efPt
+effortless efPtl@s
+effortlessly efPtl@sl/
+efforts efPts
+effron efr~
+effrontery @fruntP/
+effusive efyUs6v
+effusively @fyUs6vl/
+effy ef/
+efird efPd
+efron efr~
+efta eft@
+egaldey Eg@ldA
+egalitarian 6gal@t,r/~
+egalitarianism /gal@t,r/~iz}
+egan Eg~
+egbert egbPt
+egberta Agb,rt@
+egbertina cgbPtEn@
+egbertine egbPtEn
+egberts egbPts
+ege Ej
+egeland eg@l~d
+egeler eg@lP
+egelhoff eg@lh{f
+egelston eg@lst~
+egelton eg@lt~
+eger EgP
+egerer egPP
+egert egPt
+egerton egPt~
+egg eg
+egge eg
+eggebrecht eg@br6kt
+egged egd
+eggemeyer eg}IP
+eggen eg~
+eggenberger eg~bPgP
+egger egP
+eggers egPz
+eggert egPt
+egghead eghed
+egghead's eghedz
+eggleston eg@lst~
+eggleton eg@lton
+eggplant egplant
+eggplants egplants
+eggs egz
+eggshell egSel
+eggshells egSelz
+eggum eg}
+egland egl~d
+eglantine egl~tIn
+egle eg@l
+egler eglP
+egleston eg@lston
+egley egl/
+egli egl/
+eglin eglin
+eglise eglEs
+egloff egl{f
+egly egl/
+egner egnP
+egnew 6gnU
+egnor egnP
+ego Eg]
+egocentric Eg]sentr6k
+egoism Eg]iz}
+egolf eg]lf
+egomaniac Eg]mAn/ak
+egon Egon
+egon Eg~
+egos Eg]z
+egotism Eg@tiz}
+egotist Eg@tist
+egotistical eg@tist6k@l
+egregious 6grEj@s
+egregiously 6grEj@sl/
+egress 6gres
+egypt Ej@pt
+egypt's Ej@pts
+egyptair Ej@pter
+egyptian 6jipS~
+egyptians 6jipS~z
+egyptology Ej@ptol@j/
+eh e
+ehinger ehinjP
+ehle el
+ehlen el~
+ehler elP
+ehlers elPz
+ehlert elPt
+ehlinger el6NP
+ehlke elk
+ehly el/
+ehman em~
+ehmann em~
+ehmen emcn
+ehmke emk/
+ehren ,r~
+ehrenberg ,r~bPg
+ehrenfeld ,r~fcld
+ehrenhalt ,r~h{lt
+ehrenkrantz ,r~krants
+ehrenreich ,r~rIk
+ehrenreich ,r~riC
+ehresman ,r@sm~
+ehret ,rit
+ehrhard ,rhPd
+ehrhardt ,rhort
+ehrhart ,rhort
+ehrich ,r6k
+ehrig ,r6g
+ehrke ,rk
+ehrler ,rlP
+ehrlich Vl6k
+ehrlichman Vl6km~
+ehrman ,rm~
+ehrmann ,rm~
+ehrsam ,rs}
+ehud chud
+eiben Ib~
+eich Ik
+eichberg IkbPg
+eichel Ik@l
+eichelberger Ik@lbPgP
+eichen Ik~
+eichenbaum Ik~b?m
+eichenberg Ik~bPg
+eichenberger Ik~bPgP
+eichenlaub Ik~l?b
+eicher IkP
+eichholz Ikh]lz
+eichhorn IkhPn
+eichhorst Ikh{rst
+eichinger Ik~jP
+eichler Ik@lP
+eichman Ikm~
+eichmann Ikm~
+eichner IknP
+eicholtz Ik]lts
+eichorn Ik{rn
+eichorst Ikh{rst
+eichstadt Ikstat
+eichstaedt Ikstat
+eick Ik
+eickhoff Ikh{f
+eickholt IkhOlt
+eickmeyer IkmIP
+eid Id
+eide Id
+eidem Idcm
+eiden Id~
+eidson Eds~
+eiermann Irm~
+eifert IfPt
+eiffel If@l
+eifler If@lP
+eigen Ig~
+eighmey Am/
+eighmy Agm/
+eight At
+eight's Ats
+eighteen At/n
+eighteen AtEn
+eighteen's AtEnz
+eighteens AtEnz
+eighteenth At/nT
+eighteenth AtEnT
+eightfold AtfOld
+eighth AT
+eighth AtT
+eighths AtTs
+eighties At/z
+eightieth At/@T
+eights Ats
+eighty At/
+eighty's At/z
+eigner IgnP
+eiichi AEC/
+eiji Aj/
+eike Ik
+eikenberry Ek~bcr/
+eilan Il~
+eiland Il~d
+eileen IlEn
+eiler IlP
+eilerman IlPm~
+eilers IlPz
+eilert IlPt
+eiley Il/
+eilts Ilts
+eimer ImP
+eimers ImPz
+ein In
+einar InP
+einbender InbendP
+eindhoven IndhOv~
+einhorn Inh{rn
+einon In{n
+einon's In{nz
+einspahr Inspor
+einstein InstIn
+einstein's InstInz
+eir Ir
+eirena PAn@
+eirich Ir6k
+eis Iz
+eisa As@
+eisai IsI
+eisaman Is}~
+eischeid ISId
+eischen IS~
+eischens IS~z
+eisel Is@l
+eisele Is@l
+eiseman Ism~
+eisemann Ism~
+eisen Is~
+eisenach Iz~ok
+eisenbach Iz~bok
+eisenbarth Iz~borT
+eisenbeis Iz~bIs
+eisenberg Iz~bPg
+eisenberger Iz~bPgP
+eisenbraun Iz~br?n
+eisenhardt Iz~hort
+eisenhart Iz~hort
+eisenhauer Iz~h?P
+eisenhour Iz~?r
+eisenhower Iz~h?P
+eisenhower's Iz~h?Pz
+eisenhowers Iz~h?Pz
+eisenhut Iz~h@t
+eisenhuth Iz~hUT
+eisenman Iz~m~
+eisenmann Iz~m~
+eisenmenger Iz~mcNP
+eisenstadt Iz~stat
+eisenstein Iz~st/n
+eisenstein Iz~stIn
+eiserman IzPm~
+eisert IsPt
+eishi AS/
+eisin Is~
+eisinger Is~jP
+eisler IslP
+eisman Ism~
+eisner IsnP
+eisner's IsnPz
+eison Iz~
+eissler Is@lP
+eiszner IznP
+eitel It@l
+either ETP
+either ITP
+eitzen Itz~
+eizenstat Iz~stat
+ejaculate 6jakyUlAt
+ejaculation /jakyUlAS~
+eject 6jekt
+ejected 6jekt@d
+ejection 6jekS~
+ejup Ej@p
+ejup EjUp
+ejup's Ej@ps
+ejup's EjUps
+ek EkA
+ek ek
+eka ek@
+ekaterina AkotcrEn@
+ekberg ekbPg
+ekblad ekblad
+ekco ek]
+ekdahl ekdol
+eke Ek
+eked Ekt
+ekern ekPn
+ekeus EkUs
+ekholm ekhOlm
+eking Ek6N
+ekins ekinz
+ekk EkAkA
+ekkehard ekhord
+eklund ekl~d
+ekman ekm~
+eko ek]
+ekofisk ek@fisk
+eksportfinans eksp{rtf~~z
+ekstrand ekstr~d
+ekstrom ekstr}
+el el
+el-greco clgrek]
+el-paso clpas]
+el-salvador clsalv@d{r
+ela el@
+elaborate @labPAt
+elaborate @labr@t
+elaborated @labPAt@d
+elaborately @labr@tl/
+elaborates @labPAts
+elaborating @labPAt6N
+elaboration @labPAS~
+elaina @lAn@
+elaine @lAn
+elaine ElAn
+elaine's @lAnz
+elaine's ElAnz
+elam el}
+elamin el}in
+elan El~
+eland El~d
+elane @lAn
+elapse @laps
+elapsed @lapst
+elardo cl)rd]
+elastic @last6k
+elasticity Elastis@t/
+elastomer @last}P
+elastomers @last}Pz
+elat clat
+elata clot@
+elate @lAt
+elated @lAt@d
+elater el@tP
+elaters el@tPz
+elating @lAt6N
+elation @lAS~
+elayne @lAn
+elbaum elb?m
+elbe elb
+elber elbP
+elberson elbPs~
+elbert elbPt
+elberta clb,rt@
+elbertine elbPtEn
+elbow elbO
+elbowed elbOd
+elbowing elbO6N
+elbowroom elbOrUm
+elbows elbOz
+elbrus elbr@s
+elchibey elC@bA
+elco elk]
+elcock clkok
+elcor elk{r
+elcotel elk]tel
+eldar eldor
+elden eld~
+elder eldP
+elderkin eldPkin
+elderly eldPl/
+elderly's eldPl/z
+elders eldPz
+elders' eldPz
+elders's eldPz@z
+eldest eld@st
+eldin eldin
+eldon cldon
+eldora cld{r@
+eldorado eldPod]
+eldorado's eldPod]z
+eldred eldPd
+eldredge cldrej
+eldreth cldreT
+eldric eldr6k
+eldrida cldrEd@
+eldridge eldrij
+eldritch eldr6C
+eldwin cldwin
+eleanor el~P
+eleanor el~{r
+eleanor's el~Pz
+eleanor's el~{rz
+eleanora el~{r@
+eleanore el~{r
+eleazer el@zP
+elect @lekt
+elect's @lekts
+electability @lekt@bil@t/
+electable @lekt@b@l
+elected @lekt@d
+electing @lekt6N
+election @lekS~
+election's @lekS~z
+electioneer @lekS~ir
+electioneering @lekS~ir6N
+electioneers @lekS~irz
+elections @lekS~z
+elective @lekt6v
+electives @lekt6vz
+electoral @lektP@l
+electorate @lektP@t
+electorate's @lektP@ts
+electorates @lektP@ts
+electors @lektPz
+electra @lektr@
+electric @lektr6k
+electric's @lektr6ks
+electrical @lektr6k@l
+electrically @lektr6k@l/
+electrically @lektr6kl/
+electricals @lektr6k@lz
+electricar @lektr6kor
+electrician @lcktriS~
+electricians @lcktriS~z
+electricians' @lcktriS~z
+electricite @lektrisitA
+electricity @lektris@t/
+electrics @lektr6ks
+electrification @lektr@f6kAS~
+electrified @lektr@fId
+electrifies @lektr@fIz
+electrify @lektr@fI
+electrifying @lektr@fI6N
+electrique elcktrEk
+electro @lektr]
+electrobiology @lektr]bIol@j/
+electrobiology's @lektr]bIol@j/z
+electrocardiogram @lektr]k)rd/@gram
+electrocardiograms @lektr]k)rd/@gramz
+electrochemical @lektr]kem6k@l
+electrocom @lektr]kom
+electrocute @lektr@kyUt
+electrocuted @lektr@kyUt@d
+electrocution @lektr@kyUS~
+electrocutions @lektr@kyUS~z
+electrode @lektr]d
+electrodes @lektr]dz
+electrodynamic @lektr]dInam6k
+electrodynamics @lektr]dInam6ks
+electrolux @lektr@l@ks
+electrolysis @lektrol@s@s
+electrolytic @lektr@lit6k
+electromagnet @lektr]magn@t
+electromagnetic @lektr]magnet6k
+electromagnetism @lektr]magn@tiz}
+electromagnets @lektr]magn@ts
+electromechanical @lektr]m@kan6k@l
+electromedics @lektr]med6ks
+electron @lektron
+electronic @lektron6k
+electronically @lektron6k@l/
+electronically @lektron6kl/
+electronics @lektron6ks
+electronics' @lektron6ks
+electrons @lektronz
+electrophoresis @lcktr]fPEsis
+electrophoresis @lcktr]f{risis
+electrophoretogram @lektrof@ret@gram
+electroplate @lektr@plAt
+electroplating @lektr@plAt6N
+electroshock @lektrOSok
+electrosound @lektr]s?nd
+electrospace @lektr]spAs
+electrospray @lektr]sprA
+electrostatic @lektr]stat6k
+elects @lekts
+eledge el6j
+eleen el/n
+elefante clcfont/
+elegance el@g~s
+elegant el@g~t
+elegantly el6g~tl/
+elegy el@j/
+elek el6k
+elektra clektr@
+elektrisk @lektrisk
+elektrizitaetswerk el6ktriz@tatswPk
+element el}~t
+elemental el}en@l
+elemental el}ent@l
+elementary el}enCr/
+elementary el}entPr/
+elementary el}entr/
+elements el}~ts
+elena elAn@
+elena el~@
+elenbaas el~boz
+elene el/n
+elenore el~P
+eleonore cl/~{r/
+elephant el@f~t
+elephant's el@f~ts
+elephantine el@fantEn
+elephants el@f~ts
+eletr el@tP
+eleuthera @lUTP@
+elevate el@vAt
+elevated el@vAt@d
+elevates el@vAts
+elevating el@vAt6N
+elevation el@vAS~
+elevations el@vAS~z
+elevator el@vAtP
+elevators el@vAtPz
+eleven @lev~
+eleven Elcv~
+eleven's @lev~z
+eleven's Elcv~z
+elevens @lev~z
+elevens Elcv~z
+eleventh @lev~T
+eleventh Elcv~T
+elexis cleks@s
+eley El/
+elf elf
+elf's elfs
+elfers elfPz
+elfie elf/
+elfin elfin
+elfman elfm~
+elford elfPd
+elfreda clfred@
+elfrida clfrEd@
+elfrieda clfrEd@
+elfrink elfr6Nk
+elfstrom elfstr}
+elg elg
+elga clgo
+elgabrowny clg@br?n/
+elgar elgP
+elgar's elgPz
+elgart Algort
+elger elgP
+elgersma clj,rsm@
+elgie elj/
+elgin eljin
+eli ElI
+elia @lI@
+eliades ElEAdz
+elias @lI@s
+eliason @lI@s~
+eliassen @lI@s~
+elich el6k
+elicit @lis@t
+elicited @lis@t@d
+eliciting @lis@t6N
+elicits @lis@ts
+elick el6k
+elicker el6kP
+elie el/
+eligibility el6j@bil@t/
+eligible el@j@b@l
+elihu elihU
+elijah /lIj@
+elijah clIj@
+eliminate @lim~At
+eliminated @lim~At@d
+eliminates @lim~Ats
+eliminating @lim~At6N
+elimination @lim~AS~
+eliminations @lim~AS~z
+eline elIn
+elinor el~P
+elinore cl/n{r/
+elio el/]
+eliopoulos cl/op@l@s
+eliot el/@t
+eliot's el/@ts
+eliott el/ot
+elisa @lEs@
+elisa @lEz@
+elisa's @lEs@z
+elisa's @lEz@z
+elisabeth @liz@beT
+elise @lEs
+elish eliS
+elisha eliS@
+elison elis~
+elissa clEs@
+elite @lEt
+elite AlEt
+elites @lEts
+elites AlEts
+elitism @lEtiz}
+elitism AlEtiz}
+elitist @lEt@st
+elitist AlEt@st
+elitists @lEt@s
+elitists @lEt@ss
+elitists @lEt@sts
+elitists AlEt@sts
+elixir @liksP
+eliza @lIz@
+elizabeth iliz@b@T
+elizabeth's iliz@b@Ts
+elizabethan eliz@bET~
+elizabethtown iliz@bcTt?n
+elizalde cl/zold/
+elizondo el@zond]
+eljer eljP
+elk elk
+elkes elks
+elkhart elkhort
+elkhorn elkh{rn
+elkin clkin
+elkind clkInd
+elkind elkind
+elkington elk6Nt~
+elkins elkinz
+elko elk]
+elks elks
+elkton elkt~
+ell el
+ella el@
+ella's el@z
+ellamay el}A
+ellan el~
+ellan's el~z
+ellard elPd
+elle el
+elledge el6j
+ellefson el@fs~
+ellegood el@gqd
+ellemann el}~
+ellen el~
+ellen's el~z
+ellena clen@
+ellenbecker el~bckP
+ellenberg el~bPg
+ellenberger el~bPgP
+ellenbogen el~b@g~
+ellenburg el~bPg
+ellender elcndP
+ellene elEn
+ellenpore el~p{r
+ellenson el~s~
+ellenwood el~wqd
+eller elP
+ellerbe elPb
+ellerbee clVb/
+ellerbrock clVbr@k
+ellerby elPb/
+ellerey elP/
+ellerman elPm~
+ellers elPz
+ellert elPt
+ellertson elPts~
+ellery elP/
+ellesmere elzmir
+ellesse cles
+ellestad el@st@d
+ellett elct
+ellette clet
+elley el/
+ellice elis
+ellicott el6kot
+ellie el/
+elliff elif
+ellijay /lIjA
+elliman el}~
+elling el6N
+ellinger el6NP
+ellingsen el6Ns~
+ellingson el6Ns~
+ellingsworth el6NzwVT
+ellington el6Nt~
+ellington's el6Nt~z
+ellingwood el6Nwqd
+ellinwood el~wqd
+elliot el/@t
+elliott el/@t
+elliott's el/@ts
+ellipse @lips
+ellipsoid @lips<d
+ellipsoids @lips<dz
+elliptical @lipt6k@l
+ellis el@s
+ellis's elis@z
+ellison el@s~
+ellisor elisP
+elliston eliston
+ellithorpe el@T{rp
+ellman elm~
+ellmann elm~
+ellner elnP
+ellroy elr<
+ells elz
+ellsberg elzbPg
+ellsberg's elzbPgz
+ellsburg elzbPg
+ellsworth elzwPT
+ellwanger elw{NP
+ellwood elwqd
+ellwood's elwqdz
+elly el/
+ellyn elin
+ellyson elis~
+ellzey elz/
+elm elm
+elma elm@
+elman elm~
+elmendorf elm~d{rf
+elmer elmP
+elmes elmz
+elmhurst elmhPst
+elmira clmIr@
+elmo elm]
+elmootazbell clmUtuzbel
+elmootazbellah clmUtuzbel@
+elmore elm{r
+elmquist elmkwist
+elms elmz
+elmsford elmzfPd
+elmwood elmwqd
+elna clno
+elnora cln{r@
+elnore cln{r
+elnozahy elnOzoh/
+elocution el@kyUS~
+elocutions el@kyUS~z
+eloisa cl<s@
+eloise cl<z
+eloise el]/z
+elongate @l{NgAt
+elongated @l{NgAt@d
+elongation El{NgAS~
+elope @lOp
+elopes @lOps
+eloquence el@kw~s
+eloquent el@kw~t
+eloquently el@kw~tl/
+elouise el@wEz
+elpers elpPz
+elrica elr6k@
+elrick elr6k
+elrod clrod
+elron elr~
+elroy clr<
+els elz
+elsa els@
+elsas els@z
+elsasser els@sP
+elsberry elzber/
+elsbury elzber/
+elsdon elsd~
+else els
+else's els@z
+elsea els/@
+elsen els~
+elser elsP
+elses els@z
+elsesser els@sP
+elsevier clsevyP
+elsevier els@vir
+elsevier's clsevyPz
+elsevier's els@virz
+elsewhere elswer
+elsey els/
+elsie els/
+elsie's els/z
+elsinore els~{r
+elsner elsnP
+elson els~
+elstad elst@d
+elster elstP
+elston clston
+elswick elzwik
+elsworth elzwVT
+elting elt6N
+elton elt~
+eltringham eltr6Nam
+eltzroth eltsr{T
+elucidate @lUs@dAt
+elucidated @lUs@dAt@d
+elucidative @lUs@dAt6v
+elude @lUd
+eluded @lUd@d
+eludes @lUdz
+eluding @lUd6N
+elusive @lUs6v
+elusiveness @lUs6vn@s
+elva elv@
+elvera Alv,r@
+elvers elvPz
+elves elvz
+elvgren elvgrcn
+elvia elv/@
+elvie elv/
+elvin elvin
+elvina clvEn@
+elving elv6N
+elvington elv6Nt~
+elvira clvIr@
+elvire elvIr
+elvis elvis
+elvis' elvis
+elvis's elvis@z
+elvy elv/
+elway elwA
+elway's elwAz
+elwell clwel
+elwin elwin
+elwood elwqd
+elxsi elks/
+ely ElI
+elyn elin
+elyria @lir/@
+elyse elIs
+elysee el/sE
+elysees el/sEz
+elysia @lEZ@
+elysia @liZ/@
+elysium @liz/}
+elza elz@
+elzey elz/
+elzinga clzENg@
+elzy elz/
+em em
+ema Em@
+emaciate }AS/At
+emaciated }AS/At@d
+emad Emad
+email EmAl
+emailed EmAld
+emailing EmAl6N
+emails EmAlz
+emanate em~At
+emanated em~At@d
+emanates em~Ats
+emanating em~At6N
+emanation em~AS~
+emanations em~AS~z
+emancipate }ans@pAt
+emancipated }ans@pAt@d
+emancipation }ans@pAS~
+emanuel imanyU@l
+emanuele AmonUelA
+emanuelson imanUls~
+emard emPd
+emasculate }askyUl@t
+emasculate }askyUlAt
+emasculated }askyUlAt@d
+embalm cmbom
+embalmed cmbomd
+embalming cmbom6N
+embankment cmbaNkm~t
+embarcadero cmbork@d,r]
+embargo cmb)rg]
+embargoed cmb)rg]d
+embargoes cmb)rg]z
+embark cmb)rk
+embark cmb)rk
+embarkation emborkAS~
+embarked cmb)rkt
+embarking cmb)rk6N
+embarks cmb)rks
+embarrass cmb,r@s
+embarrassed cmb,r@st
+embarrasses cmbar@s@z
+embarrassing cmb,r@s6N
+embarrassingly cmb,r@s6Nl/
+embarrassment cmb,r@sm~t
+embarrassments cmb,r@sm~ts
+embassies emb@s/z
+embassy emb@s/
+embassy's emb@s/z
+embattle cmbat@l
+embattled cmbat@ld
+embayment cmbAm~t
+embed cmbed
+embedded cmbed@d
+embellish cmbel6S
+embellished cmbel6St
+embellishing cmbel6S6N
+embellishment cmbel6Sm~t
+ember embP
+embers embPz
+emberson embPs~
+emberton cmbVt~
+embezzle cmbez@l
+embezzled cmbez@ld
+embezzlement cmbez@lm~t
+embezzler cmbez@lP
+embezzler cmbezlP
+embezzlers cmbez@lPz
+embezzlers cmbezlPz
+embezzles cmbez@lz
+embezzling cmbez@l6N
+embezzling cmbezl6N
+embitter cmbitP
+embittered cmbitPd
+emblazon cmblAz~
+emblazoned cmblAz~d
+emblem embl}
+emblematic embl}at6k
+emblems embl}z
+embler emblP
+embleton emb@lton
+embodied cmbod/d
+embodies cmbod/z
+embodiment cmbod/m~t
+embody cmbod/
+embodying cmbod/6N
+embolden cmbOld~
+emboldened cmbOld~d
+embolism emb]liz}
+embolisms emb]liz}z
+emboss cmb{s
+embossed cmb{st
+embrace cmbrAs
+embrace cmbrAs
+embraceable cmbrAs@b@l
+embraced cmbrAst
+embraces cmbrAs@z
+embracing cmbrAs6N
+embree cmbrE
+embrey embr/
+embroider cmbr<dP
+embroidered cmbr<dPd
+embroiderer cmbr<dPP
+embroiderers cmbr<dPPz
+embroideries cmbr<dP/z
+embroidering cmbr<dP6N
+embroidery cmbr<dP/
+embroil cmbr<l
+embroiled cmbr<ld
+embrose embr]z
+embry embr/
+embryo embr/O
+embryology embr/ol@j/
+embryonic embr/on6k
+embryos embr/Oz
+embury ember/
+emcee cmsE
+emch emC
+emco emk]
+emde emd
+emdr EemdE)r
+emel em@l
+emelda cmeld@
+emelie em@l/
+emelina emclEn@
+emeline em@lIn
+emelita cmclEt@
+emelyne em@lIn
+emens emcnz
+emera cm,r@
+emerald emPr@ld
+emerald emr@ld
+emeralds emPr@ldz
+emeralds emr@ldz
+emerant Am,r~t
+emeraude emP?d
+emerge EmPj
+emerge imVj
+emerged EmPjd
+emerged imVjd
+emergence EmPj~s
+emergence imVj~s
+emergencies EmPj~s/z
+emergencies imVj~s/z
+emergency EmPj~s/
+emergency imVj~s/
+emergent EmPj~t
+emergent imVj~t
+emerges EmPj@z
+emerges imVj@z
+emerging EmPj6N
+emerging imVj6N
+emerich emP6k
+emerick emP6k
+emerine emPEn
+emeritus im,r@t@s
+emerse imVs
+emersed imVst
+emerson emPs~
+emerson's emPs~z
+emert emPt
+emerton cmVt~
+emery emP/
+emery's emP/z
+emeryville emP/vil
+emetic cmet6k
+emfinger emf6NP
+emge emj
+emhart emhort
+emick em6k
+emig em6g
+emigh emI
+emigrant em@gr~t
+emigrants em@gr~ts
+emigrate em@grAt
+emigrated em@grAt@d
+emigrates em@grAts
+emigrating em@grAt6N
+emigration em@grAS~
+emigrations em@grAS~z
+emigre em@grA
+emigres em@grAz
+emil cmEl
+emile AmEl
+emilia }El/@
+emilie em@l/
+emilio }El/]
+emilo cmEl]
+emilo's cmEl]z
+emily em@l/
+emily's em@l/z
+emina cmEn@
+eminase em~os/
+eminence em~~s
+eminences em~~s@z
+eminent em~~t
+eminently em~~tl/
+emir Amir
+emir cmir
+emirate emP@t
+emirate emPAt
+emirates emP@ts
+emirates emPAts
+emirates' emP@ts
+emirates' emPAts
+emison em@s~
+emissaries em@ser/z
+emissary em@ser/
+emission imiS~
+emissions imiS~z
+emit cmit
+emits cmits
+emitted cmit@d
+emitting cmit6N
+emler emlP
+emley eml/
+emling eml6N
+emlyn cmlin
+emlynne cmlIn
+emma em@
+emmaline cmolEn/
+emmanuel cmanyU@l
+emmaus em?s
+emme em
+emmel em@l
+emmeline em@lIn
+emmendorfer em~d{rfP
+emmer emP
+emmerich emP6k
+emmerling emPl6N
+emmerson emPs~
+emmert emPt
+emmery emP/
+emmet emit
+emmett emct
+emmi em/
+emmick em6k
+emmie em/
+emminger em6NP
+emmis emis
+emmit emit
+emmitt emct
+emmons em~z
+emmott em@t
+emmy em/
+emmy's em/z
+emmys em/z
+emogene em@g/n
+emond em~d
+emory emP/
+emory's emP/z
+emotion Em]S~
+emotion imOS~
+emotional Em]S~@l
+emotional imOS~@l
+emotionalism Em]S~@liz}
+emotionalism imOS~@liz}
+emotionally Em]Sn@l/
+emotionally imOSn@l/
+emotions Em]S~z
+emotions imOS~z
+empanel cmpan@l
+empaneled cmpan@ld
+empaneling cmpan@l6N
+empath empaT
+empathetic emp@Tet6k
+empathize emp@TIz
+empathy emp@T/
+emperor empPP
+emperor's empPPz
+emperors empPPz
+empey emp/
+emphases emf@sEz
+emphasis emf@sis
+emphasize emf@sIz
+emphasized emf@sIzd
+emphasizes emf@sIz@z
+emphasizing emf@sIz6N
+emphatic cmfat6k
+emphatically cmfat6k@l/
+emphatically cmfat6kl/
+emphysema emf@zEm@
+empie emp/
+empire empIP
+empire's empIPz
+empires empIPz
+empirical empir6k@l
+empirically cmpir6k@l/
+empirically cmpir6kl/
+empiricism cmpir@siz}
+empiricist cmpir@s@st
+emplacement cmplAsm~t
+emplacements cmplAsm~ts
+employ cmpl<
+employ }pl<
+employable cmpl<@b@l
+employed cmpl<d
+employed }pl<d
+employee cmpl</
+employee }pl</
+employee's cmpl</z
+employee's }pl</z
+employees cmpl</z
+employees }pl</z
+employees' cmpl</z
+employer cmpl<P
+employer }pl<P
+employer's cmpl<Pz
+employer's }pl<Pz
+employers cmpl<Pz
+employers }pl<Pz
+employers' cmpl<Pz
+employers' }pl<Pz
+employing cmpl<6N
+employing }pl<6N
+employment cmpl<m~t
+employment }pl<m~t
+employments cmpl<m~ts
+employments }pl<m~ts
+employs cmpl<z
+employs }pl<z
+emporia cmp{r/@
+emporium emp{r/}
+empower imp?P
+empowered imp?Pd
+empowering imp?P6N
+empowerment imp?Pm~t
+empowers imp?Pz
+empresa cmpres@
+empresas cmpres@z
+empress emprcs
+emprise cmprIz
+empson emps~
+empt empt
+empt emt
+empted empt@d
+empted emt@d
+emptied empt/d
+emptied emt/d
+emptier empt/P
+emptier emt/P
+empties empt/z
+empties emt/z
+emptiness empt/n@s
+emptiness emt/n@s
+empting empt6N
+empting emt6N
+emption empS~
+emptive empt6v
+emptor emptP
+empts empts
+empty empt/
+empty emt/
+emptying empt/6N
+emptying emt/6N
+emrich emr6k
+emrick emr6k
+emry emr/
+emslie ems@l/
+emswiler emzwIlP
+emu EmyU
+emuil emyUil
+emuil's emyUilz
+emulate emy@lAt
+emulated emy@lAt@d
+emulating emy@lAt6N
+emulation emy@lAS~
+emulex emyUl@ks
+emulsifier imuls@fIP
+emulsion imulS~
+en en
+ena en@
+enable cnAb@l
+enable ~Ab@l
+enabled cnAb@ld
+enabled ~Ab@ld
+enabler cnAb@lP
+enabler cnAblP
+enabler ~Ab@lP
+enabler ~AblP
+enables cnAb@lz
+enables ~Ab@lz
+enabling cnAb@l6N
+enabling ~Ab@l6N
+enabling ~Abl6N
+enact cnakt
+enacted cnakt@d
+enacting cnakt6N
+enactment cnakm~t
+enactment cnaktm~t
+enactments enakm~s
+enactments enakm~ts
+enactments enaktm~ts
+enacts inakts
+enamel ~am@l
+enameled ~am@ld
+enamels ~am@lz
+enamor cnamP
+enamored cnamPd
+enasa Anos@
+enberg enbPg
+encamp cnkamp
+encamped cnkampt
+encampment cnkampm~t
+encampments cnkampm~ts
+encapsulate cnkaps@lAt
+encapsulated cnkaps@lAt@d
+encapsulating cnkaps@lAt6N
+encarnacion cnkornos/{n
+encarta cnk)rt@
+encarta cnk)rtu
+encase cnkAs
+encased cnkAst
+encata cnkot@
+encata cnkotu
+encata's cnkot@z
+encata's cnkotuz
+encephalitis cnsef@lIt@s
+encephalopathy cnsef@l{p@T/
+enchant cnCant
+enchanted cnCan@d
+enchanted cnCant@d
+enchanter cnCantP
+enchanter's cnCanPz
+enchanter's cnCantPz
+enchanters cnCanPz
+enchanters cnCantPz
+enchanting cnCan6N
+enchanting cnCant6N
+enchantment cnCantm~t
+enchilada cnC@lod@
+encinas ens~@z
+encinias cns/nE@z
+encino cnsEn]
+encircle cnsVk@l
+encircled cnsVk@ld
+encirclement cnsVk@lm~t
+encircling cnsVk@l6N
+encircling cnsVkl6N
+enciso cnsEs]
+enck eNk
+enclave enklAv
+enclave onklAv
+enclaves enklAvz
+enclaves onklAvz
+enclose cnklOz
+enclosed cnklOzd
+enclosed ~klOzd
+enclosing cnklOz6N
+enclosing ~klOz6N
+enclosure cnklOZP
+enclosure ~klOZP
+enclosures ~klOZPz
+encode cnkOd
+encoded cnkOd@d
+encoding cnkOd6N
+encompass cnkump@s
+encompassed cnkump@st
+encompasses cnkump@s@z
+encompassing cnkump@s6N
+encor enk{r
+encor's enk{rz
+encore onk{r
+encores onk{rz
+encounter cnk?nP
+encounter cnk?ntP
+encountered cnk?nPd
+encountered cnk?ntPd
+encountering cnk?nP6N
+encountering cnk?ntP6N
+encounters cnk?nPz
+encounters cnk?ntPz
+encourage cnkV6j
+encourage cnkV@j
+encouraged cnkV6jd
+encouraged cnkV@jd
+encouragement cnkV6jm~t
+encourages cnkV6j@z
+encourages cnkV@j@z
+encouraging cnkV6j6N
+encouraging cnkV@j6N
+encroach cnkrOC
+encroached cnkrOCt
+encroaches cnkrOC@z
+encroaching cnkrOC6N
+encroachment cnkrOCm~t
+encroachments cnkrOCm~ts
+encrust cnkrust
+encrusted cnkrust@d
+encrusting cnkrust6N
+encrypt cnkript
+encrypt ~kript
+encrypted cnkript@d
+encrypted ~kript@d
+encryption cnkripS~
+encumber cnkumbP
+encumbered cnkumbPd
+encyclical cnsikl6k@l
+encyclicals cnsikl6k@lz
+encyclopaedia ~sIkl@pEd/@
+encyclopaedia ~sIkl]pEd/@
+encyclopedia ~sIkl@pEd/@
+encyclopedia ~sIkl]pEd/@
+encyclopedias ~sIkl@pEd/@z
+encyclopedias ~sIkl]pEd/@z
+encyclopedic ~sIkl@pEd6k
+encyclopedic ~sIkl]pEd6k
+encyclopedist ~sIkl@pEd@st
+encyclopedist ~sIkl]pEd@st
+end end
+endaka cndok@
+endanger cndAnjP
+endangered cndAnjPd
+endangered ~dAnjPd
+endangering cndAnjP6N
+endangerment cndAnjPm~t
+endangers cndAnjPz
+endara cnd)r@
+ende end
+endear cndEr
+endeared cndErd
+endearing cndEr6N
+endearment cndirm~t
+endeavor cndevP
+endeavor's cndevPz
+endeavored cndevPd
+endeavoring cndevP6N
+endeavors cndevPz
+endeavour cndevP
+endeavour's cndevPz
+ended end@d
+endemic cndem6k
+ender endP
+enderby endPb/
+enderle endP@l
+enderlin endPlin
+enders endPz
+enderson endPs~
+endevco cndevk]
+endgame endgAm
+endgames endgAmz
+endicott end6kot
+ending end6N
+endings end6Nz
+endive endIv
+endler endlP
+endless endl@s
+endlessly endl@sl/
+endlich endl6k
+endo end]
+endocrine end]krIn
+endocrinologist end]kr~ol@j@st
+endocrinologist's end]kr~ol@j@sts
+endocrinologists end]kr~ol@j@s
+endocrinologists end]kr~ol@j@ss
+endocrinologists end]kr~ol@j@sts
+endocrinology end]kr~ol@j/
+endodermal end]dVm@l
+endometrial end]metr/@l
+endometriosis end]metr/Osis
+endorphin cnd{rf~
+endorphins cnd{rf~z
+endorse cnd{rs
+endorsed cnd{rst
+endorsement cnd{rsm~t
+endorsements cnd{rsm~ts
+endorser cnd{rsP
+endorsers cnd{rsPz
+endorses cnd{rs@z
+endorsing cnd{rs6N
+endoscopic end]skop6k
+endosperm end@spVm
+endothermic end]TVm6k
+endotronics end]tron6ks
+endotronics' end@tron6ks
+endotronics's end]tron6ks@z
+endow cnd?
+endowed cnd?d
+endowing cnd?6N
+endowment cnd?m~t
+endowment's cnd?m~ts
+endowments cnd?m~ts
+endpoint endp<nt
+endres endPz
+endress endr@s
+endrizzi cndrEts/
+ends endz
+endsley endsl/
+endtimer endtImP
+endtimers endtImPz
+endued cndUd
+endurance endP~s
+endure cndyqr
+endure ~dqr
+endured cndyqrd
+endured ~dqrd
+endures cndyqrz
+endures ~dqrz
+enduring cndyqr6N
+enduring ~dqr6N
+endy end/
+enea en/@
+enema en}@
+enemas en}@z
+enemies en}/z
+enemies' en}/z
+enemy en}/
+enemy's en}/z
+energas enPgas
+energen enPjen
+energetic enPjet6k
+energetically enPjet6kl/
+energies enPj/z
+energize enPjIz
+energized enPjIzd
+energizer enPjIzP
+energizes enPjIz@z
+energizing enPjIz6N
+energy enPj/
+energy's enPj/z
+enerson enPs~
+enex En@ks
+enfant enfont
+enfant onfont
+enfeeble cnfEb@l
+enfeebled cnfEb@ld
+enfield enf/ld
+enfield's enf/ldz
+enfinger enf6NP
+enfold cnfOld
+enforce cnf{rs
+enforceability cnf{rs@bil@t/
+enforceable cnf{rs@b@l
+enforced cnf{rst
+enforcement cnf{rsm~t
+enforcement's cnf{rsm~ts
+enforcements cnf{rsm~ts
+enforcer cnf{rsP
+enforcers cnf{rsPz
+enforces cnf{rs@z
+enforcing cnf{rs6N
+enfranchise cnfranCIz
+enfranchised cnfranCIzd
+enfranchises cnfranCIz@z
+eng eN
+engage cngAj
+engaged cngAjd
+engagement cngAjm~t
+engagements cngAjm~ts
+engages cngAj@z
+engaging cngAj6N
+engberg eNbPg
+engdahl eNdol
+enge enj
+engebretsen eNg@brets~
+engebretson eNg@brets~
+engel eng@l
+engelberg eNg@lbPg
+engelbert eNg@lbPt
+engelberta cNgclb,rt@
+engelbrecht eNg@lbr6kt
+engeleiter eNg@lItP
+engelhard eNg@lhord
+engelhardt eNg@lhort
+engelhart eNg@lhort
+engelke eNgclk
+engelken eNgclk~
+engelking eNgclk6N
+engelman eNg@lm~
+engelmann eNg@lm~
+engels eNg@lz
+engelson eNg@ls~
+engelstad eNg@lst@d
+engeman enjm~
+engen eN~
+engender cnjendP
+engender ~jendP
+engendered cnjendPd
+engenders eNg~dPz
+enger eNgP
+engert eNgPt
+engesser eNg@sP
+engh eN
+engholm eNh]lm
+engine enj~
+engine inj~
+engine's enj~z
+engined enj~d
+engineer enj~ir
+engineer's enj~Erz
+engineered enj~Erd
+engineering enj~ir6N
+engineers enj~irz
+engineers' enj~irz
+engines enj~z
+engines' eNg~z
+england iNgl~d
+england's iNgl~dz
+englander iNgl~dP
+englanders iNgl~dPz
+englands iNgl~dz
+engle eNg@l
+englebert iN@lbPt
+englehardt iN@lhort
+englehart iN@lhort
+engleman iN@lm~
+engler eNg@lP
+engler eNglP
+engler's eNg@lPz
+engler's eNglPz
+englert iNlPt
+englerth iNlPT
+engles iN@lz
+englewood eNg@lwqd
+english iNgliS
+english iNliS
+englishman iNgliSm~
+englishmen iNgliSmcn
+englishwoman iNgliSwqm~
+englund iNl~d
+engman eNm~
+engquist eNkwist
+engram engram
+engrave ~grAv
+engraved ~grAvd
+engraver ~grAvP
+engraving ~grAv6N
+engravings ~grAv6Nz
+engross ~grOs
+engrossed ~grOst
+engrossing ~grOs6N
+engstrand eNstr~d
+engstrom eNstr}
+engulf cngulf
+engulfed cngulft
+engulfing cngulf6N
+engwall cNw{l
+enhance cnhans
+enhanced cnhanst
+enhanced ~hanst
+enhancement cnhansm~t
+enhancements cnhansm~ts
+enhancer cnhansP
+enhances cnhans@z
+enhancing cnhans6N
+enholm enhOlm
+enholme enhOlm
+eniac En/ak
+enichem en6C}
+enid En@d
+enigma ~igm@
+enigmatic en6gmat6k
+enimont Enimont
+enis enis
+enitt en@t
+enix en6ks
+enjoin cnj<n
+enjoin ~j<n
+enjoined cnj<nd
+enjoining cnj<n6N
+enjoy cnj<
+enjoy ~j<
+enjoyable cnj<@b@l
+enjoyed cnj<d
+enjoyed ~j<d
+enjoying cnj<6N
+enjoying ~j<6N
+enjoyment cnj<m~t
+enjoyment ~j<m~t
+enjoyments cnj<m~ts
+enjoys cnj<z
+enjoys ~j<z
+enke eNk
+enlarge cnl)rj
+enlarge ~l)rj
+enlarged cnl)rjd
+enlarged ~l)rjd
+enlargement ~l)rjm~t
+enlargements ~l)rjm~ts
+enlarger ~l)rgP
+enlarges ~l)rj@z
+enlarging ~l)rj6N
+enlighten cnlIt~
+enlightened cnlIt~d
+enlightening cnlItn6N
+enlightening cnlIt~6N
+enlightenment cnlIt~m~t
+enlist cnlist
+enlisted cnlist@d
+enlistee cnlistE
+enlistees cnlistEz
+enlisting cnlist6N
+enlistment cnlistm~t
+enlists cnlis
+enlists cnliss
+enlists cnlists
+enliven cnlIv~
+enlivened cnlIv~d
+enlo enl]
+enloe cnlO
+enlow cnlO
+enman enm~
+enmesh cnmeS
+enmeshed cnmeSt
+enmities enm@t/z
+enmity enm@t/
+ennea en/@
+enneking en6k6N
+ennen en~
+ennes encz
+ennes enz
+ennis enis
+ennoble cnOb@l
+ennosuke en@sUk
+enns enz
+ennui cnU/
+eno en]
+enoch En@k
+enochs en@ks
+enola ~Ol@
+enomoto cn]mOt]
+enormity /n{rm@t/
+enormity ~{rm@t/
+enormous /n{rm@s
+enormous ~{rm@s
+enormously /n{rm@sl/
+enormously ~{rm@sl/
+enough /nuf
+enough ~uf
+enough's /nufs
+enough's ~ufs
+enqueso cnkwes]
+enquire cnkwIP
+enquirer cnkwIrP
+enquist enkwist
+enrage cnrAj
+enraged cnrAjd
+enraged ~rAjd
+enraging cnrAj6N
+enrapture cnrapCP
+enraptured cnrapCPd
+enrica cnrEk@
+enrich cnriC
+enrich ~riC
+enriched cnriCt
+enriches cnriC@z
+enriching cnriC6N
+enriching ~riC6N
+enrichment cnriCm~t
+enrichment ~riCm~t
+enrico cnrEk]
+enright cnrIt
+enrile cnrEl
+enrile cnrElA
+enrique cnrEkA
+enriquez ~rEkwcz
+enro enr]
+enroll cnrOl
+enroll ~rOl
+enrolled cnrOld
+enrollee cnr]lE
+enrollees cnr]lEz
+enrolling cnrOl6N
+enrollment cnrOlm~t
+enrollments cnrOlm~ts
+enrolls cnrOlz
+enron enron
+enron's enronz
+enroute cnrUt
+ensco ensk]
+ensco's ensk]z
+ensconce ~skons
+ensconced ~skonst
+enseco cnsek]
+ensemble onsomb@l
+ensembles onsomb@lz
+enserch ensPC
+ensey enz/
+enshrine cnSrIn
+enshrined cnSrInd
+enshroud ~Sr?d
+enshrouded ~Sr?d@d
+ensign ens~
+ensing ens6N
+ensinger ens~jP
+enskilda cnskild@
+enslave cnslAv
+enslaved cnslAvd
+enslavement cnslAvm~t
+enslen ens@l~
+ensley ensl/
+enslin enslin
+enslow cnslO
+ensminger ens}@NP
+ensnare cnsn,r
+ensnared cnsn,rd
+ensnarl cnsn)rl
+ensnarled cnsn)rld
+ensor ensP
+ensource cns{rs
+ensrud enzrUd
+enstrom enstr}
+ensue cnsU
+ensued cnsUd
+ensues cnsUz
+ensuing ensU6N
+ensure cnSqr
+ensure ~Sqr
+ensured cnSqrd
+ensured ~Sqrd
+ensures cnSqrz
+ensures ~Sqrz
+ensuring cnSqr6N
+ensuring ~Sqr6N
+ensz enS
+ent ent
+entail cntAl
+entailed cntAld
+entailing cntAl6N
+entails cntAlz
+entangle cntaNg@l
+entangled cntaNg@ld
+entanglement cntaNg@lm~t
+entanglement ~taNg@lm~t
+entanglements cntaNg@lm~ts
+entanglements ~taNg@lm~ts
+entangling cntaNl6N
+entangling ~taNl6N
+ente entA
+entebbe enteb/
+entebbe's enteb/z
+entendre ontondr@
+entenmann ent~m~
+entenmann's ent~m~z
+enter enP
+enter entP
+entered enPd
+entered entPd
+entergy entPj/
+entering enP6N
+entering entP6N
+enteritidis entPit@dis
+enterividous entPiv@d@s
+enterline entPlIn
+enterline's entPlInz
+enterprise enPprIz
+enterprise entPprIz
+enterprise's enPprIz@z
+enterprise's entPprIz@z
+enterprises enPprIz@z
+enterprises entPprIz@z
+enterprises' enPprIz@z
+enterprises' entPprIz@z
+enterprising enPprIz6N
+enterprising entPprIz6N
+enterra cnt,r@
+enters enPz
+enters entPz
+entertain enPtAn
+entertain entPtAn
+entertained enPtAnd
+entertained entPtAnd
+entertainer enPtAnP
+entertainer entPtAnP
+entertainer's enPtAnPz
+entertainer's entPtAnPz
+entertainers enPtAnPz
+entertainers entPtAnPz
+entertaining enPtAn6N
+entertaining entPtAn6N
+entertainment enPtAnm~t
+entertainment entPtAnm~t
+entertainment's enPtAnm~ts
+entertainment's entPtAnm~ts
+entertainments enPtAnm~ts
+entertainments entPtAnm~ts
+entertains enPtAnz
+entertains entPtAnz
+entex enteks
+enthral cnTr{l
+enthralled cnTr{ld
+enthuse cnTUz
+enthused cnTUzd
+enthusiasm cnTUz/az}
+enthusiasms cnTUz/az}z
+enthusiast cnTUz/ast
+enthusiastic cnTUz/ast6k
+enthusiastically cnTUz/ast6kl/
+enthusiasts cnTUz/as
+enthusiasts cnTUz/ass
+enthusiasts cnTUz/asts
+entice cntIs
+enticed cntIst
+enticement cntIsm~t
+enticements cntIsm~ts
+enticing cntIs6N
+entin entin
+entire cntIP
+entirely cntIPl/
+entirety cntIPt/
+entities ent@t/z
+entities' ent@t/z
+entitle cntIt@l
+entitle ~tIt@l
+entitled cntIt@ld
+entitlement cntIt@lm~t
+entitlements cntIt@lm~ts
+entitles cntIt@lz
+entitling cntIt@l6N
+entitling cntItl6N
+entity ent@t/
+entity's ent@t/z
+entler entlP
+entoffen ent@f~
+entoffen's ent@f~z
+entomb cntUm
+entombed cntUmd
+entombment cntUmm~t
+entomologist ent}ol@j@st
+entomologists ent}ol@j@s
+entomologists ent}ol@j@ss
+entomologists ent}ol@j@sts
+entomology ent}ol@j/
+entourage ontPoZ
+entourage ontqroZ
+entrail entr@l
+entrails entr@lz
+entrance entr~s
+entranced cntranst
+entrances entr~s@z
+entrant entr~t
+entrants entr~ts
+entrap cntrap
+entrapment cntrapm~t
+entrapped cntrapt
+entre ontr@
+entre ontrA
+entreaties cntrEt/z
+entreaty cntrEt/
+entree ontrA
+entrees ontrAz
+entregrowth entr@gr]T
+entrekin entr6kin
+entrench cntrenC
+entrenched cntrenCt
+entrenched cntrenCt
+entrenches cntrenC@z
+entrenching cntrenC6N
+entrenchment cntrenCm~t
+entrepreneur ontr@pr~V
+entrepreneur ontr@pr~qr
+entrepreneur's ontr@pr~Vz
+entrepreneurial ontr@pr~V/@l
+entrepreneurialism entr@pr~UrE@liz}
+entrepreneurs ontr@pr~Vz
+entrepreneurship ontr@pr~VSip
+entries entr/z
+entrikin entr6kin
+entringer entP6NP
+entropy entr@p/
+entrust cntrust
+entrusted cntrust@d
+entrusting cntrust6N
+entry entr/
+entryway entr/wA
+entsminger ents}6NP
+entwine cntwIn
+entwined cntwInd
+entwisle entwI@l
+entwistle cntwis@l
+entz ents
+entzminger entsm6NP
+enumerate ~UmPAt
+enumerated ~UmPAt@d
+enumerates ~UmPAts
+enumeration ~UmPAS~
+enunciate /nuns/At
+enunciate ~uns/At
+enunciated ~uns/At@d
+enunciating ~uns/At6N
+envelop cnvel@p
+envelope env@lOp
+enveloped cnvel@pt
+envelopes env@lOps
+enveloping cnvel@p6N
+envelops cnvel@ps
+enviable env/@b@l
+envied env/d
+envious env/@s
+enviously env/@sl/
+envirodyne cnvIr]dIn
+environic envIr{n6k
+environics envIr{n6ks
+environment ~vIr~m~t
+environment's ~vIr~m~ts
+environmental ~vIr~men@l
+environmental ~vIr~ment@l
+environmentalism cnvIr~men@liz}
+environmentalism cnvIr~ment@liz}
+environmentalist ~vIr~men@l@st
+environmentalist ~vIr~ment@l@st
+environmentalists cnvIr~men@l@s
+environmentalists cnvIr~men@l@ss
+environmentalists cnvIr~men@l@sts
+environmentalists cnvIr~ment@l@s
+environmentalists cnvIr~ment@l@ss
+environmentalists cnvIr~ment@l@sts
+environmentalists' cnvIr~men@l@sts
+environmentalists' ~vIr~ment@l@sts
+environmentally ~vIr~men@l/
+environmentally ~vIr~ment@l/
+environments ~vIr~m~ts
+environs cnvIr~z
+enviropact cnvIr]pakt
+envirosafe cnvIr]sAf
+envirotest invIr]test
+envisage cnviz6j
+envisaged cnviz6jd
+envisages cnviz6j@z
+envision cnviZ~
+envisioned cnviZ~d
+envisioning cnviZ~6N
+envisions cnviZ~z
+envos env]s
+envoy env<
+envoy onv<
+envoys env<z
+envoys onv<z
+envy env/
+enwright cnrIt
+enyart enyort
+enyeart enyPt
+enz enz
+enzo enz]
+enzon enzon
+enzor enzP
+enzymatic enzImat6k
+enzyme enzIm
+enzymes enzImz
+eocene E@sEn
+eoff A{f
+eohippus E]hip@s
+eolande A]lond/
+eon Eon
+eon E~
+eons E~z
+eos Eos
+eos's Eos@z
+epcot epkot
+epeda cpAd@
+epeda's cpAd@z
+epes Eps
+ephedrine cfedrin
+ephemeral cfemP@l
+ephlin eflin
+ephraim Efr}
+ephron efr~
+epic ep6k
+epic's ep6ks
+epicenter ep@sentP
+epics ep6ks
+epicure ep6kyqr
+epicurean ep@kyqr/~
+epicurean ep@kyqrE~
+epidemic ep@dem6k
+epidemics ep@dem6ks
+epidemiological ep@d/m/@loj6k@l
+epidemiologist ep@d/m/ol@j@st
+epidemiologists ep@d/m/ol@j@s
+epidemiologists ep@d/m/ol@j@ss
+epidemiologists ep@d/m/ol@j@sts
+epidemiology ep@dem/ol@j/
+epidermal ep@dVm@l
+epidermis ep@dVm@s
+epidural ep@dV@l
+epigenetic ep@j~et6k
+epigram ep@gram
+epigraphic ep@graf6k
+epilepsies ep@leps/z
+epilepsy ep@leps/
+epileptic ep@lept6k
+epilogue ep@l{g
+epiphany ipif~/
+episcopal ipisk@p@l
+episcopalian ipisk@pAl/~
+episcopalian ipisk@pAly~
+episcopalians ipisk@pAl/~z
+episcopalians ipisk@pAly~z
+episcopo ipiskOp]
+episode ep@sOd
+episodes ep@sOdz
+episodic ep@sod6k
+episteme epistEm
+epistemology @pist}ol@j/
+epistle ipis@l
+epistolary ipist@ler/
+epitaph ep@taf
+epitaphs ep@tafs
+epithelial cp@Tely@l
+epithet ep@Tet
+epithets ep@Tets
+epitome @pit}/
+epitomize @pit}Iz
+epitomized @pit}Izd
+epitomizes @pit}Iz@z
+epitope ep@tOp
+epler eplP
+epley epl/
+eplin eplin
+epling epl6N
+epoch Ep@k
+epoch ep@k
+epochal ep@k@l
+epochs Ep@ks
+epochs ep@ks
+epogen ep@jcn
+epoxy ipoks/
+epp ep
+eppard epPd
+eppel ep@l
+epperly epPl/
+eppers epPz
+epperson epPs~
+eppes eps
+eppich ep6C
+epping ep6N
+eppinger ep6NP
+epple ep@l
+eppler eplP
+eppley epl/
+eppner epnP
+eppolito cp]lEt]
+epps eps
+eprom epr}
+eproms epr}z
+epsco epsk]
+epsilon eps@lon
+epsom eps}
+epsomite eps}It
+epson eps~
+epstein epstEn
+epstein epstIn
+epting ept6N
+equable ekw@b@l
+equal Ekw@l
+equaled Ekw@ld
+equaling Ekw@l6N
+equality 6kwol@t/
+equalization Ekw@l@zAS~
+equalize Ekw@lIz
+equalized Ekw@lIzd
+equalizer Ekw@lIzP
+equalizing Ekw@lIz6N
+equally Ekw@l/
+equals Ekw@lz
+equanimity Ekw~im@t/
+equate 6kwAt
+equated 6kwAt@d
+equates 6kwAts
+equating 6kwAt6N
+equation 6kwAZ~
+equations 6kwAZ~z
+equator 6kwAtP
+equatorial Ekw@t{r/@l
+equestrian 6kwestr/~
+equiangular Ekw@aNgy@lP
+equibank ekw@baNk
+equicor ekwik{r
+equifax ekw@faks
+equilibria Ekw@libr/@
+equilibrium Ekw@libr/}
+equilink ekw@liNk
+equimark ekw}ork
+equine EkwIn
+equinox Ekw~oks
+equion ekw/on
+equip 6kwip
+equipment 6kwipm~t
+equipment's 6kwipm~ts
+equipments 6kwipm~ts
+equipped 6kwipt
+equipping 6kwip6N
+equips 6kwips
+equitable ekw@t@b@l
+equitable's @kwit@b@lz
+equitable's ekw@t@b@lz
+equitably ekw@t@bl/
+equitas ekw@t@s
+equitation ekw@tAS~
+equitec ekw@tek
+equitex ekw@teks
+equiticorp ekw@t/k{rp
+equities ekw@t/z
+equities' ekw@t/z
+equity ekw@t/
+equity's ekw@t/z
+equivalence 6kwiv@l~s
+equivalency 6kwiv@l~s/
+equivalent 6kwiv@l~t
+equivalents 6kwiv@l~ts
+equivocal 6kwiv@k@l
+equivocate 6kwiv@kAt
+equivocating 6kwiv@kAt6N
+equivocation 6kw6v@kAS~
+er P
+era ,r@
+era ir@
+era's ,r@z
+era's ir@z
+eradicate 6rad@kAt
+eradicated 6rad@kAt@d
+eradicating 6rad@kAt6N
+eradication 6rad@kAS~
+erakat crok@t
+eralp ,r{lp
+eramo crom]
+eranthe ,r~T
+erany @rAn/
+eras ir@z
+erasable 6rAs@b@l
+erasable ErAs@b@l
+erase /rAs
+erase 6rAs
+erased /rAst
+erased 6rAst
+eraser /rAsP
+eraser 6rAsP
+erasers /rAsPz
+erasers 6rAsPz
+erases /rAs@z
+erases 6rAs@z
+erasing /rAs6N
+erasing 6rAs6N
+erasmus 6razm@s
+erastus 6rast@s
+erawan ,r@won
+erazo croz]
+erb Vb
+erbacher VbokP
+erbamont Vb}ont
+erbamont's Vb}onts
+erbe Vb
+erber VbP
+erbes Vbz
+erburu PbqrU
+erby Vb/
+erceg Vs6g
+erck Vk
+ercole PkOl/
+ercros Vkr]z
+erda ,rd@
+erdahl Vdol
+erdman Vdm~
+erdmann Vdm~
+erdos Vd]z
+erdrich Vdr6k
+erect 6rekt
+erected 6rekt@d
+erecting 6rekt6N
+erection 6rekS~
+erections 6rekS~z
+erector 6rektP
+erects 6rekts
+erena Pen@
+erensel ,r~scl
+ergle Vg@l
+ergo Vg]
+ergonomic Vg~om6k
+ergonomics Vg~om6ks
+ergot Vg@t
+ergot's Vg@ts
+ergotism Vg@tiz}
+ergots Vg@ts
+erhard ,rhord
+erhardt Vhort
+erhart Vhort
+eric ,r6k
+eric's ,r6ks
+erica ,r6k@
+erich ,r6k
+erichsen ,r6ks~
+erick ,r6k
+ericka ,r6k@
+ericksen ,r6ks~
+erickson ,r6ks~
+ericson ,r6ks~
+ericsson ,r6ks~
+ericsson's ,r6ks~z
+eridania er@dan/@
+erie ir/
+erik ,r6k
+erik's ,r6ks
+erika ,r6k@
+eriksen ,r6ks~
+erikson ,r6ks~
+erikson's ,r6ks~z
+eriksson ,r6ks~
+erin ,rin
+erina PEn@
+erion cr/{n
+erisa crEs@
+erisman ,r@sm~
+eritrea er@trA@
+eritrea er@trE@
+eritrean er@trA~
+eritrean er@trE~
+eritreans ,r@trEnz
+eritreans er@trA~z
+erk Vk
+erker VkP
+erkkila Vkil@
+erl Vl
+erlach Vlok
+erland Vl~d
+erlandson Vl~ds~
+erlangen PlaNg~
+erlanger ,rlaNP
+erlanger ,rlaNgP
+erle {r@l
+erlene Vl/n
+erler VlP
+erlich Vl6k
+erlichman ,rl6km~
+erlichman Vl6km~
+erlick ,rl6k
+erlick Vl6k
+erline VlIn
+erling Vl6N
+erly Vl/
+erma Vm@
+erma's Vm@z
+erman Vm~
+ermer VmP
+ermin Vmin
+ermina PmEn@
+ermine Vm~
+erminia PmEn/@
+erminie Vm~/
+ermis Vmis
+erna Vn@
+ernaline Vn@lIn
+erne Vn
+ernest Vn@st
+ernest's Vn@sts
+ernestine Vn@stEn
+ernesto Pnest]
+ernests Vn@s
+ernests Vn@ss
+ernests Vn@sts
+erney Vn/
+ernie Vn/
+erno ,rn]
+ernsberger VnzbPgP
+ernst Vnst
+ernster VnstP
+erny Vn/
+ero ir]
+erode 6rOd
+erode Er]d
+eroded 6rOd@d
+erodes /rOdz
+erodes 6rOdz
+erodible /rOd@b@l
+erodible 6rOd@b@l
+eroding /rOd6N
+eroding 6rOd6N
+eroh ,r]
+eroica P<k@
+erol ,r@l
+erol's ,r@lz
+eron iron
+eros iros
+erosion 6rOZ~
+erosional 6rOZ~@l
+erosive 6rOs6v
+erotic 6rot6k
+erotica 6rot6k@
+eroticism Pot@siz}
+erpelding Vp@ld6N
+erps Vps
+err ,r
+err V
+erra ,r@
+errand ,r~d
+errands ,r~dz
+errant ,r~t
+erratic 6rat6k
+erratically crat6kl/
+erred ,rd
+errett ,rct
+erria ,r/@
+errickson ,r6ks~
+errico PEk]
+errington ,r6Nt~
+errol ,r@l
+erroneous POn/@s
+erroneous crOn/@s
+erroneously crOn/@sl/
+error ,rP
+errors ,rPz
+errs ,rz
+ers E)res
+ers Vz
+ersatz ,rsots
+ersatz ,rzots
+ershad VSad
+ershad VSod
+erskin Vskin
+erskine VskIn
+erstwhile VstwIl
+erte Vt
+erte VtA
+ertel Vt@l
+ertha VT@
+ertl Vt@l
+ertle Vt@l
+ertman Vtm~
+ertz Vts
+erudite ,r@dIt
+erudition er@diS~
+erupt 6rupt
+erupt Er@pt
+erupted /rupt@d
+erupted 6rupt@d
+erupting /rupt6N
+erupting 6rupt6N
+eruption /rupS~
+eruption 6rupS~
+eruptions /rupS~z
+eruptions 6rupS~z
+eruptive /rupt6v
+eruptive 6rupt6v
+erupts /rups
+erupts /rupts
+erupts 6rups
+erupts 6rupts
+erven Vv~
+ervin Vvin
+erving Vv6N
+erway VwA
+erwin Vwin
+erwina PvIn@
+erxleben Pksleb~
+erythropoietin criTr@p<tin
+es es
+esarey esP/
+esau Es{
+esbenshade esb~S@d
+esbenshade esb~SAd
+esber esbP
+escada eskod@
+escalante cskolont/
+escalate esk@lAt
+escalated esk@lAt@d
+escalates esk@lAts
+escalating esk@lAt6N
+escalation esk@lAS~
+escalator esk@lAtP
+escalators esk@lAtPz
+escalera cskol,r@
+escalona cskolOn@
+escambia eskamb/@
+escamez cskomcz
+escamilla cskomil@
+escanaba esk~ob@
+escandon @skand~
+escapade esk@pAd
+escapades esk@pAdz
+escape @skAp
+escaped @skApt
+escapee @skApE
+escapees @skApEz
+escapement @skApm~t
+escapes @skAps
+escaping @skAp6N
+escapism @skApiz}
+escarcega cskorCeg@
+escareno cskoren]
+escarpment csk)rpm~t
+escarpments csk)rpm~ts
+esch eS
+eschatological esk@t@loj6k@l
+eschbach eSbok
+esche eS
+eschen eS~
+eschenbach eS~bok
+eschenburg eS~bPg
+escher eSP
+eschete eS/t
+eschew csCU
+eschewed eSUd
+eschewed eskyUd
+eschewing eSU6N
+eschewing eskyU6N
+eschews csCUz
+eschmann eSm~
+esco esk]
+escobar esk@bor
+escobar esk]bor
+escobar's esk@borz
+escobar's esk]borz
+escobedo csk]bAd]
+escoe cskO
+escondido eskondEd]
+escort csk{rt
+escort esk{rt
+escorted csk{rt@d
+escorting esk{rt6N
+escorts esk{rts
+escoto cskOt]
+escott esk@t
+escrow cskrO
+escrow eskr]
+escrowed eskr]d
+escudero cskUd,r]
+escudo cskUd]
+escudos cskUd]z
+escue AskyU
+esculent cskUl~t
+esh eS
+esham eS}
+eshbach eSbok
+eshbaugh cSb{
+eshelman eS@lm~
+eshleman eS@lm~
+eskandarian esk~d,r/~
+eskelson esk@ls~
+eskenazi AskAnoz/
+eskenazi csk~oz/
+esker eskP
+eskew eskyU
+eskey esk/
+eskimo esk}O
+eskimos esk}Oz
+eskin cskin
+eskridge eskrij
+esler es@lP
+eslick esl6k
+eslinger es@l6NP
+esmark esmork
+esme ezm
+esmerelda csmPeld@
+esmine ezm~
+esmond ezm~d
+esophagus @sof@g@s
+esoteric es@t,r6k
+esoteric es]t,r6k
+espada Aspod@
+espalier cspalyP
+espana cspany@
+espanol esponyOl
+espanola esp~Ol@
+esparza csp)rz@
+espe esp
+especially @speS@l/
+especially @speSl/
+espectador cspekt@d{r
+espejo AspAy]
+espeland esp@l~d
+espenschied espcnS/d
+espenshade esp~S@d
+espenshade esp~SAd
+esper espP
+esperanto espPant]
+esperanto's espPant]z
+espeseth esp@scT
+espey esp/
+espinal AspEn@l
+espino AspEn]
+espinola csp/nOl@
+espinosa csp~Oz@
+espinoza Asp/nOz@
+espionage esp/~oj
+espirito esp6rEt]
+espirito espir@t]
+espiritu csp6rECU
+espitia cspES@
+esplanade espl~od
+esplin esplin
+esposito csp@zEt]
+espouse @sp?s
+espouse @sp?z
+espoused @sp?st
+espoused @sp?zd
+espouses @sp?s@z
+espouses @sp?z@z
+espousing @sp?s6N
+espousing @sp?z6N
+espresso espres]
+esprit csprE
+esprit's csprEz
+espy esp/
+espy's esp/z
+esque esk
+esqueda cskwAd@
+esquer cskV
+esquibel Askw/bel
+esquire eskwIr
+esquire's eskwIrz
+esquivel Askw/vel
+esrey esr/
+ess es
+essa es@
+essary escr/
+essay csA
+essay esA
+essayist esAist
+essays csAz
+essays esAz
+esse es
+esselman es@lm~
+esselte cselt/
+essen es~
+essenburg es~bPg
+essence es~s
+essential /senC@l
+essential /senS@l
+essential @senC@l
+essential @senS@l
+essentially /senC@l/
+essentially /senS@l/
+essentially @senC@l/
+essentially @senS@l/
+essentials /senC@lz
+essentials /senS@lz
+essentials @senC@lz
+essentials @senS@lz
+esser esP
+esses es/z
+esses es@z
+essex es6ks
+essex's es6ks@z
+essick es6k
+essie es/
+essig es6g
+esslinger es@l6NP
+essman esm~
+essner esnP
+esso es]
+esson es~
+est @stAt
+esta est@
+establish /stabl6S
+establish @stabl6S
+established /stabl6St
+established @stabl6St
+establishes /stabl6S@z
+establishes @stabl6S@z
+establishing /stabl6S6N
+establishing @stabl6S6N
+establishment /stabl6Sm~t
+establishment @stabl6Sm~t
+establishment's /stabl6Sm~ts
+establishment's @stabl6Sm~ts
+establishments /stabl6Sm~ts
+establishments @stabl6Sm~ts
+estabrook est@brqk
+estabrooks est@brqks
+estai estA
+estate @stAt
+estate's @stAts
+estatehood @stAthqd
+estates @stAts
+este est
+esteban est@bon
+estedat estcdat
+estee est/
+esteem @stEm
+esteem's cstEmz
+esteemed cstEmd
+estefan cstev~
+estefan est@fon
+estel est@l
+estell est@l
+estella cstel@
+estelle cstel
+estenson est~s~
+estep estcp
+estepp estcp
+ester estP
+esterline estPlIn
+esterline's estPlInz
+esterly estPl/
+esters estPz
+estes est/z
+esteve est6v
+esteves AstAvcs
+estevez AstAvcz
+estey est/
+esther estP
+estill AstEl
+estimable est}@b@l
+estimate est}@t
+estimate est}At
+estimated est}At@d
+estimates est}@ts
+estimates est}Ats
+estimating est}At6N
+estimation est}AS~
+estimations est}AS~z
+estimator @stim@tP
+estimators @stim@tPz
+estis estis
+estle es@l
+estock estok
+estok cstok
+estonia cstOn/@
+estonian cstOn/~
+estonians cstOn/~z
+estrada cstrod@
+estrange cstrAnj
+estranged cstrAnjd
+estrangement @strAnjm~t
+estrella estrel@
+estrich estr6k
+estridge cstrij
+estrin estrin
+estrogen estr@j~
+estrogens estr@j~z
+estrous estr@s
+estrus estr@s
+estruth estrUT
+estuaries esCUer/z
+estuary esCUer/
+esty est/
+esworthy eswPT/
+eszterhas estPhos
+et et
+etablissements etablis}onts
+etc etsetP@
+etcetera ctsetP@
+etcetera ctsetr@
+etch eC
+etched eCt
+etches eC@z
+etcheverry eC6vcr/
+etching eC6N
+etchings eC6Nz
+etchison eC@s~
+eternal /tVn@l
+eternal itVn@l
+eternally /tVn@l/
+eternally itVn@l/
+eternit etPnit
+eternity /tVn@t/
+eternity itVn@t/
+etess etes
+ethan ET~
+ethane eTAn
+ethanol eT~{l
+ethel eT@l
+ethelbert eT@lbPt
+ethelda @Teld@
+ethelinda cTclEnd@
+etheline eT@lIn
+etheljean eT@ljEn
+etheljean eT@ly~
+ethelson eT@ls~
+ethelyn eT@l~
+ethene eTEn
+ether ETP
+ethereal @Tir/@l
+etheredge eTPcj
+etheridge eTPij
+etherington eTP6Nt~
+ethernet eTPnet
+ethers ETPz
+etherton cTVt~
+etherton eTPt~
+ethic eT6k
+ethical eT6k@l
+ethically eT6k@l/
+ethically eT6kl/
+ethicist eT@s@st
+ethicists eT@s@s
+ethicists eT@s@ss
+ethicists eT@s@sts
+ethicon eT6kon
+ethics eT6ks
+ethier eT/P
+ethington eT6Nt~
+ethiopia ET/Op/@
+ethiopia's ET/Op/@z
+ethiopian ET/Op/~
+ethiopians ET/Op/~z
+ethnic eTn6k
+ethnical eTn6k@l
+ethnically eTn6kl/
+ethnicity cTnis@t/
+ethnics eTn6ks
+ethnocentric eTn]sentr6k
+ethnocentrism eTn]sentriz}
+ethnographic eTn@graf6k
+ethnology cTnol@j/
+ethnomusicologist cTn}yUz@kol@g@st
+ethnos eTn]s
+ethnos's eTn@s@z
+ethology cTol@j/
+ethos ETos
+ethridge cTrij
+ethyl eT@l
+ethylene eT@lEn
+ethyol eTIol
+etienne et/cn
+etiologies Et/ol@j/z
+etiology Et/ol@j/
+etiology EtEol@j/
+etiquette et@k@t
+etling etl6N
+etna etn@
+eton Et~
+etops Etops
+etruscan itrusk~
+etruscans itrusk~z
+etsty etst/
+etsu etsU
+etta et@
+etter etP
+etters etPz
+ettie et/
+ettinger et6NP
+ettinger's et6NPz
+ettlinger etl6NP
+etty et/
+etudes AtUdz
+etymological et}@loj@k@l
+etymology et}ol@j/
+etzel etz@l
+etzel's etz@lz
+etzioni etsEOn/
+etzkorn etskPn
+etzler etslP
+euan yU~
+eubank yUbaNk
+eubanks yUbaNks
+eucalypti yUk@lipt/
+eucalypti yUk@liptI
+eucalyptus yUk@lipt@s
+eucharist yUkP@st
+euchre yUkP
+euchred yUkPd
+euclea yUkl/@
+euclid yUkl@d
+eudocia yUdOC@
+eudora yUd{r@
+eudosia yUdOs/@
+eudoxia yUdoks/@
+eudy yUd/
+eugene yUjEn
+eugenia yUjEn/@
+eugenia's yUjEn/@z
+eugenic yUjen6k
+eugenics yUjen6ks
+eugenie yUjEn/
+eugenio yUjEn/]
+eugenio's yUjEn/]z
+eula yUl@
+euler <lP
+eulich yUl6k
+eulogies yUl@j/z
+eulogize yUl@jIz
+eulogized yUl@jIzd
+eulogy yUl@j/
+eulogy's yUl@j/z
+eunice yUn@s
+euphemia yUfEm/@
+euphemism yUf}iz}
+euphemisms yUf}iz}z
+euphemistic yUf}ist6k
+euphemistically yUf}ist6kl/
+euphoria yUf{r/@
+euphoric yUf)r6k
+euphrates yUfrAt/z
+eurasia yqrAZ@
+eurasian yqrAZ~
+eure V
+eureca yUrck@
+eureka yqrEk@
+eurest yqrcst
+eurich <r6k
+euro yUr]
+euro yqr@
+euro yqr]
+eurobond yUr]bond
+eurobonds yUr]bondz
+eurocheck yUr@Cek
+eurochecks yUr@Ceks
+eurocom yUr@k}
+eurocom yUr]kom
+eurocommercial yUr]k}VS@l
+eurocopter yqr]koptP
+eurocrat yUr@krat
+eurocrats yUr@krats
+eurodebenture yUr]d@benCP
+eurodebentures yUr]d@benCPz
+eurodebt yUr]det
+eurodeposit yUr]d@poz@t
+eurodeposits yUr]d@poz@ts
+eurodisney yUr]dizn/
+eurodisney yqr]dizn/
+eurodollar yUr]dolP
+eurodollar yqr]d{lP
+eurodollars yUr]dolPz
+eurofighter yUr]fItP
+eurofima yUr@fEm@
+euromark yUr}ork
+euromarket yUr]mork@t
+euromarkets yUr]mork@ts
+euromissile yUr]mis@l
+euromissiles yUr]mis@lz
+euromobiliare yUr]m]b@l,r
+euromobiliare's yUr]m]b@l,rz
+euromoney yUr]mun/
+euronote yUr~Ot
+euronotes yUr~Ots
+europa yqrOp@
+europe yqr@p
+europe's yqr@ps
+european yqr@pE~
+europeans yqr@pE~z
+europeans' yqr@pE~z
+europeenne yUr]pEn
+europewide yqr@pwId
+europhile yqr]fIl
+europhiles yqr]fIlz
+europium yqrOp/}
+eurosid yUr@s@d
+eurostar yqr]stor
+eurostat yUr{stat
+eurosterling yUr]stVl6N
+eurotunnel yUr]tun@l
+eurotunnel's yqr]tun@lz
+euroyen yUr]yen
+eury yUr/
+eusebio yUsEb/]
+eustace yUst@s
+eustachian yUstAk/~
+eustacia yUstoC@
+eustice yUstis
+eustis yUst@s
+euthanasia yUT~AZ@
+euthanasia yUT~AZy@
+euthanasia's yUT~AZ@z
+euthanize yUT~Iz
+eutsey yUts/
+eutsler yUtslP
+ev ev
+eva Av@
+eva Ev@
+eva's Av@z
+eva's Ev@z
+evacuate /vaky@At
+evacuate 6vaky@At
+evacuated /vaky@wAt@d
+evacuated 6vaky@wAt@d
+evacuating /vaky@wAt6N
+evacuating 6vaky@wAt6N
+evacuation /vaky@wAS~
+evacuation 6vaky@wAS~
+evacuations /vaky@wAS~z
+evacuations 6vaky@wAS~z
+evacuee /vakyU/
+evacuee 6vakyU/
+evacuees /vakyU/z
+evacuees 6vakyU/z
+evade /vAd
+evade 6vAd
+evaded /vAd@d
+evaded 6vAd@d
+evader /vAdP
+evader 6vAdP
+evaders /vAdPz
+evaders 6vAdPz
+evades /vAdz
+evades 6vAdz
+evading /vAd6N
+evading 6vAd6N
+evadne 6vedn/
+evald Evold
+evald ev@ld
+evaleen ev@lEn
+evaluate /valyUAt
+evaluate 6valyUAt
+evaluated /valyUAt@d
+evaluated 6valyUAt@d
+evaluates /valyUAts
+evaluates 6valyUAts
+evaluating /valyUAt6N
+evaluating 6valyUAt6N
+evaluation /valyUAS~
+evaluation 6valyUAS~
+evaluations /valyUAS~z
+evaluations 6valyUAS~z
+evan ev~
+evancho cvonk]
+evander EvandP
+evandro Avondr]
+evandro Evandr]
+evanescence ev~es~s
+evanescent ev~es~t
+evangelical Evanjel6k@l
+evangelicals Evanjel6k@lz
+evangeline 6vanj@lIn
+evangelism /vanj@liz}
+evangelism 6vanj@liz}
+evangelist /vanj@list
+evangelist 6vanj@list
+evangelista cvoNgclEst@
+evangelistic /vanj@list6k
+evangelists /vanj@lis
+evangelists /vanj@liss
+evangelists /vanj@lists
+evangelists 6vanj@lis
+evangelists 6vanj@liss
+evangelists 6vanj@lists
+evangelize /vanj@lIz
+evangelize 6vanj@lIz
+evangi 6vanj/
+evanko 6vaNk]
+evanoff ev~{f
+evans ev~z
+evans' ev~z
+evans's ev~z@z
+evanson ev~s~
+evanston ev~st~
+evansville ev~zvil
+evaporate 6vapPAt
+evaporated /vapPAt@d
+evaporated 6vapPAt@d
+evaporates /vapPAts
+evaporates 6vapPAts
+evaporating /vapPAt6N
+evaporating 6vapPAt6N
+evaporation /vapPAS~
+evaporation 6vapPAS~
+evaporator /vapPAtP
+evaporator 6vapPAtP
+evarts evPts
+evasion /vAZ~
+evasion 6vAZ~
+evasions /vAZ~z
+evasions 6vAZ~z
+evasive /vAs6v
+evasive /vAz6v
+evasive 6vAs6v
+evasive 6vAz6v
+evatt ev@t
+eve Ev
+evel ev@l
+eveland Evl~d
+eveleth ev@lcT
+evelina evclEn@
+eveline ev@lin
+evelyn ev@l~
+even Ev~
+evendale ev~dAl
+evened Ev~d
+evenhanded /v~hand@d
+evenhandedly /v~hand@dl/
+evening Evn6N
+evening's Evn6Nz
+evenings Evn6Nz
+evenly Ev~l/
+evenness Ev~n@s
+evens Ev~z
+evensen ev~s~
+evensky Evensk/
+evenson ev~s~
+event /vent
+event 6vent
+event's /vents
+event's 6vents
+eventful /ventf@l
+eventful 6ventf@l
+events /vents
+events 6vents
+eventual /venCU@l
+eventual @venCU@l
+eventuality /venCUal@t/
+eventuality @venCUal@t/
+eventually /venC@w@l/
+eventually /venS@l/
+eventually 6venC@w@l/
+eventually 6venS@l/
+ever evP
+everage evP6j
+everard evPPd
+everbach evPbok
+everding evPd6N
+eveready evPred/
+evered evPd
+everest evP@st
+everest evr@st
+everest's evP@sts
+everest's evr@sts
+everett evP@t
+everett evr@t
+everette evP@t
+everetts evP@ts
+everetts evr@ts
+everex evP@ks
+everglades evPglAdz
+everglades' evPglAdz
+evergood evPgqd
+evergreen evPgrEn
+evergreens evPgrEnz
+everhardt evPhort
+everhart evPhort
+everidge evPij
+everingham evP6Nham
+everington evPiNt~
+everitt evPit
+everlasting evPlast6N
+everlastings evPlast6Nz
+everley evPl/
+everling evPl6N
+everly evPl/
+everman evPm~
+evermore evPm{r
+evers evPz
+evers' evPz
+eversman evPsm~
+eversole evPsOl
+everson evPs~
+evert 6vVt
+everton evPt~
+everts evPts
+every evP/
+every evr/
+everybody evr/bod/
+everybody'd evr/bod/d
+everybody's evr/bod/z
+everyday evr/dA
+everyman evr/m~
+everyman's evr/m~z
+everyone evr/wun
+everyone's evr/wunz
+everyplace evr/plAs
+everything evr/TiN
+everything's evr/TiNz
+everytime evr/tIm
+everywhere evr/hwer
+everywhere evr/wer
+eves Evz
+evett ev@t
+evetts ev@ts
+evian ev/~
+evict 6vikt
+evicted 6vikt@d
+evicting 6vikt6N
+eviction 6vikS~
+evictions 6vikS~z
+evidence ev@d~s
+evidenced ev@d~st
+evidences ev@d~s@z
+evident ev@d~t
+evidentiary ev@denS/cr/
+evidently ev@d~tl/
+evil Ev@l
+evildoer Ev@ldUP
+evildoers Ev@ldUPz
+evils Ev@lz
+evilsizer Ev@lsIzP
+evilsizor Ev@lsIzP
+evin evin
+evince 6vins
+evinced 6vinst
+evinger Ev6NP
+evins evinz
+eviscerate @visPAt
+eviscerated @visPAt@d
+evita cvEt@
+evitt evit
+evitts evits
+evjen evj~
+evlyn evl~
+evocation Ev]kAS~
+evocative 6vok@t6v
+evoke /vOk
+evoke 6vOk
+evoked /vOkt
+evoked 6vOkt
+evokes /vOks
+evokes 6vOks
+evoking /vOk6N
+evoking 6vOk6N
+evola cvOl@
+evolution Ev@lUS~
+evolution Ev]lUS~
+evolution ev@lUS~
+evolution ev]lUS~
+evolutionary Ev@lUS~er/
+evolutionary Ev]lUS~er/
+evolutionary ev@lUS~er/
+evolutionary ev]lUS~er/
+evolve /volv
+evolve 6volv
+evolved /volvd
+evolved 6volvd
+evolves /volvz
+evolves 6volvz
+evolving /volv6N
+evolving 6volv6N
+evon ev~
+evonne evon
+evrard evrPd
+evren evr~
+ewald yU@ld
+ewalt yU@lt
+ewan yU~
+ewart yUPt
+ewbal yUbol
+ewbank yUb@Nk
+ewe yU
+ewell yU@l
+ewen yU~
+ewer yUP
+ewers yUPz
+ewert yUPt
+ewes yUz
+ewig yU6g
+ewing yU6N
+ewing's yU6Nz
+ewings yU6Nz
+ewoldt yU]lt
+eworld EwVld
+ewton yUt~
+ewy yU/
+ex eks
+ex-fighter cksfItP
+exabyte eks@bIt
+exacerbate 6gzasPbAt
+exacerbated 6gzasPbAt@d
+exacerbates 6gzasPbAts
+exacerbating 6gzasPbAt6N
+exacerbation 6gzasPbAS~
+exacerbations 6gzasPbAS~z
+exact 6gzakt
+exacted 6gzakt@d
+exacting 6gzakt6N
+exaction 6gzakS~
+exactions 6gzakS~z
+exactitude 6gzakt@tUd
+exactly 6gzaktl/
+exacts 6gzakts
+exaggerate 6gzajPAt
+exaggerated 6gzajPAt@d
+exaggerates 6gzajPAts
+exaggerating 6gzajPAt6N
+exaggeration 6gzajPAS~
+exaggerations 6gzajPAS~z
+exalt 6gz{lt
+exalted 6gz{lt@d
+exalting 6gz{lt6N
+exalts 6gz{lts
+exam 6gzam
+examination 6gzam~AS~
+examinations 6gzam~AS~z
+examine 6gzam~
+examined 6gzam~d
+examiner 6gzam~P
+examiner's cgzam~Pz
+examiners 6gzam~Pz
+examiners' 6gzam~Pz
+examines 6gzam~z
+examining 6gzam~6N
+example 6gzamp@l
+examples 6gzamp@lz
+exams 6gzamz
+exar eksP
+exasperate 6gzaspPAt
+exasperated 6gzaspPAt@d
+exasperating 6gzaspPAt6N
+exasperation eksaspPAS~
+exboyfriend eksb<frend
+exbroker cksbrOkP
+exbroker's cksbrOkPz
+exbrokers cksbrOkPz
+excalibur ekskal@bP
+excavate eksk@vAt
+excavated eksk@vAt@d
+excavating eksk@vAt6N
+excavation eksk@vAS~
+excavations eksk@vAS~z
+excavator eksk@vAtP
+excavators eksk@vAtPz
+excedrin cksedr~
+exceed 6ksEd
+exceeded 6ksEd@d
+exceeding 6ksEd6N
+exceedingly 6ksEd6Nl/
+exceeds 6ksEdz
+excel 6ksel
+excel's 6kselz
+excelan eksel~
+excelled 6kseld
+excellence eks@l~s
+excellencies eksl~s/z
+excellency eksl~s/
+excellent eks@l~t
+excellently eks@l~tl/
+excelling 6ksel6N
+excels 6kselz
+excelsior 6ksels/P
+except 6ksept
+excepted 6ksept@d
+excepting eksept6N
+exception 6ksepS~
+exceptional 6ksepS~@l
+exceptionally 6ksepSn@l/
+exceptionally 6ksepS~@l/
+exceptions 6ksepS~z
+excerpt cksVpt
+excerpt eksPpt
+excerpted eksVpt@d
+excerpts cksVpts
+excerpts eksPpts
+excess 6kses
+excess ekses
+excesses 6kses@z
+excesses ekses@z
+excessive 6kses6v
+excessively 6kses6vl/
+exchange 6ksCAnj
+exchange's 6ksCAnj@z
+exchangeable 6ksCAnj@b@l
+exchanged 6ksCAnjd
+exchanger 6ksCAnjP
+exchangers 6ksCAnjPz
+exchanges 6ksCAnj@z
+exchanges 6ksCAnj@z
+exchanges' cksCAnj@z
+exchanging 6ksCAnj6N
+exchequer eksCekP
+excimer eksimP
+excise cksIs
+excise eksIz
+excised eksIzd
+excises eksIz@z
+excision 6ksiZ~
+excitable 6ksIt@b@l
+excitation eksItAS~
+excite 6ksIt
+excited 6ksIt@d
+excitedly 6ksIt@dl/
+excitement 6ksItm~t
+excites 6ksIts
+exciting 6ksIt6N
+exclaim 6ksklAm
+exclaimed 6ksklAmd
+exclaiming 6ksklAm6N
+exclaims 6ksklAmz
+exclamation ekskl}AS~
+exclamation-point ekskl}AS~p<nt
+exclamations ekskl}AS~z
+excludable 6ksklUd@b@l
+exclude 6ksklUd
+excluded 6ksklUd@d
+excludes 6ksklUdz
+excluding 6ksklUd6N
+exclusion 6ksklUZ~
+exclusionary 6ksklUZ~er/
+exclusions 6ksklUZ~z
+exclusive 6ksklUs6v
+exclusively 6ksklUs6vl/
+exclusives 6ksklUs6vz
+exclusivity eksklUsiv@t/
+exco eksk]
+excoa ekskO@
+excommunicate eksk}yUn@kAt
+excommunicated eksk}yUn@kAt@d
+excommunication eksk}yUn@kAS~
+excoriate cksk{r/At
+excoriated cksk{r/At@d
+excoriating cksk{r/At6N
+excoriation cksk{r/AS~
+excrement ekskr}~t
+excrete 6kskrEt
+excretion 6kskrES~
+excretory ekskr@t{r/
+excruciating 6kskrUS/At6N
+excruciatingly ekskrUs/At6Nl/
+exculpate ekskulpAt
+exculpatory ekskulp@t{r/
+excursion 6kskVZ~
+excursions 6kskVZ~z
+excusable 6kskyUz@b@l
+excuse 6kskyUs
+excuse 6kskyUz
+excused 6kskyUzd
+excuses 6kskyUs@z
+excuses 6kskyUz@z
+excusing 6kskyUz6N
+exec egzek
+execrable egzekr@b@l
+execs egzeks
+execute eks@kyUt
+executed eks@kyUt@d
+executes eks@kyUts
+executing eks@kyUt6N
+execution eks@kyUS~
+executioner eks@kyUS~P
+executioner's eks@kyUS~Pz
+executioners eks@kyUS~Pz
+executions eks@kyUS~z
+executive 6gzeky@t6v
+executive's cgzeky@t6vz
+executives 6gzeky@t6vz
+executives' cgzeky@t6vz
+executone egzekyUtOn
+executor 6gzeky@tP
+executors 6gzeky@tPz
+exel eks@l
+exemplar 6gzemplor
+exemplars 6gzemplorz
+exemplary 6gzemplP/
+exemplified 6gzempl@fId
+exemplifies 6gzempl@fIz
+exemplify 6gzempl@fI
+exemplifying 6gzempl@fI6N
+exemplum 6gzempl}
+exempt 6gzempt
+exempted 6gzempt@d
+exempting 6gzempt6N
+exemption 6gzemS~
+exemption 6gzempS~
+exemptions 6gzemS~z
+exemptions 6gzempS~z
+exempts 6gzempts
+exercisable eksPsIz@b@l
+exercise eksPsIz
+exercised eksPsIzd
+exerciser eksPsIzP
+exercisers eksPsIzPz
+exercises eksPsIz@z
+exercising eksPsIz6N
+exert 6gzVt
+exerted 6gzVt@d
+exerting 6gzVt6N
+exertion 6gzVS~
+exertions 6gzVS~z
+exerts 6gzVts
+exes eks@z
+exeter eks@tP
+exfoliate cksfOl/At
+exfoliation cksfOl/AS~
+exhalation eksh@lAS~
+exhale ckshAl
+exhaled ckshAld
+exhaust 6gz{st
+exhausted 6gz{st@d
+exhausting 6gz{st6N
+exhaustion 6gz{sC~
+exhaustive 6gz{st6v
+exhaustively 6gzost6vl/
+exhausts 6gz{s
+exhausts 6gz{ss
+exhausts 6gz{sts
+exhibit 6gzib@t
+exhibit's 6gzib@ts
+exhibited 6gzib@t@d
+exhibiting 6gzib@t6N
+exhibition eks@biS~
+exhibitionist eks@biS~@st
+exhibitionists eks@biS~@s
+exhibitionists eks@biS~@ss
+exhibitionists eks@biS~@sts
+exhibitions eks@biS~z
+exhibitor 6gzib@tP
+exhibitors 6gzib@tPz
+exhibits 6gzib@ts
+exhilarate 6gzilPAt
+exhilarated 6gzilPAt@d
+exhilarating 6gzilPAt6N
+exhilaration 6gzilPAS~
+exhort 6gz{rt
+exhortation egz{rtAS~
+exhortations egz{rtAS~z
+exhorted 6gz{rt@d
+exhorting 6gz{rt6N
+exhorts 6gz{rts
+exhumation ckshyUmAS~
+exhume ckshyUm
+exhumed ckshyUmd
+exhumes ckshyUmz
+exide eksId
+exigencies eksij~s/z
+exigency eksij~s/
+exigent eks6j~t
+exigents eks6j~ts
+exile egzIl
+exile eksIl
+exiled egzIld
+exiled eksIld
+exiles egzIlz
+exiles eksIlz
+exim eksim
+exim's eksimz
+exist 6gzist
+existed 6gzist@d
+existence 6gzist~s
+existence cgzist~s
+existent cgzist~t
+existential egzistenC@l
+existential egzistenS@l
+existential eksistenC@l
+existential eksistenS@l
+existing 6gzist6N
+exists 6gzis
+exists 6gziss
+exists 6gzists
+exit egz@t
+exit eks@t
+exited egz@t@d
+exiting egz@t6N
+exits egz@ts
+exits eks@ts
+exler ekslP
+exley eksl/
+exline ekslIn
+exner eksnP
+exocet eks]set
+exodus eks@d@s
+exogenous eksOj~@s
+exon eks{n
+exonerate 6gzonPAt
+exonerated 6gzonPAt@d
+exonerates 6gzonPAts
+exonerating 6gzonPAt6N
+exoneration 6gzonPAS~
+exorbitant 6gz{rb@t~t
+exorcist eksPs@st
+exoskeleton eks]skel@t~
+exothermic eks]TVm6k
+exotic 6gzot6k
+exotics cgzot6ks
+exovir eks]vir
+expand 6kspand
+expandable 6kspand@b@l
+expanded 6kspand@d
+expanding 6kspand6N
+expands 6kspandz
+expanse 6kspans
+expanses 6kspans@z
+expansion 6kspanS~
+expansion's 6kspanC~z
+expansionary 6kspanS~er/
+expansionism 6kspanC~iz}
+expansionist 6kspanC~ist
+expansions 6kspanS~z
+expansive 6kspans6v
+expatriate ckspAtr/@t
+expatriate ckspAtr/At
+expatriates ckspAtr/@ts
+expatriates ckspAtr/Ats
+expatriation ckspAtr/AS~
+expect 6kspekt
+expectancies 6kspekt~s/z
+expectancy 6kspekt~s/
+expectant 6kspekt~t
+expectation ekspcktAS~
+expectations ekspcktAS~z
+expected 6kspekt@d
+expecting 6kspekt6N
+expectorant 6kspektP~t
+expects 6kspeks
+expects 6kspekts
+expedience 6kspEd/~s
+expediency 6kspEd/~s/
+expedient 6kspEd/~t
+expedite eksp@dIt
+expedited eksp@dIt@d
+expediting eksp@dIt6N
+expedition eksp@diS~
+expeditionary eksp@diS~er/
+expeditions eksp@diS~z
+expeditious eksp@diS@s
+expeditiously eksp@diS@sl/
+expel 6kspel
+expelled 6kspeld
+expelling 6kspel6N
+expend 6kspend
+expendable 6kspend@b@l
+expended 6kspend@d
+expending ekspend6N
+expenditure 6kspend@CP
+expenditures 6kspend@CPz
+expense 6kspens
+expenses 6kspens@z
+expensing 6kspens6N
+expensive 6kspens6v
+expensively ekspens6vl/
+experience 6kspir/~s
+experienced 6kspir/~st
+experiences 6kspir/~s@z
+experiencing 6kspir/~s6N
+experiential cksper/enS@l
+experiment 6ksp,r}~t
+experiment's 6ksp,r}~ts
+experimental 6kspPmen@l
+experimental 6kspPment@l
+experimental 6ksper}en@l
+experimental 6ksper}ent@l
+experimentalist 6ksper}en@list
+experimentalist 6ksper}ent@list
+experimentally 6kspcr}en@l/
+experimentally 6kspcr}ent@l/
+experimentation 6ksper}~tAS~
+experimented 6ksp,r}~t@d
+experimenter 6ksp,r}entP
+experimenters 6ksp,r}entPz
+experimenting cksp,r}cn6N
+experimenting cksp,r}ent6N
+experiments 6ksp,r}~ts
+expert ekspPt
+expert's ekspPts
+expertise ekspPtEz
+expertly ekspPtl/
+experts ekspPts
+experts' ekspPts
+expiate eksp/At
+expiration ekspPAS~
+expirations ekspPAS~z
+expiratory 6kspIr@t{r/
+expire 6kspIr
+expired 6kspIrd
+expires 6kspIPz
+expiring 6kspIr6N
+expiry ekspIr/
+explain 6ksplAn
+explainable 6ksplAn@b@l
+explained 6ksplAnd
+explaining 6ksplAn6N
+explains 6ksplAnz
+explanation ekspl~AS~
+explanations ekspl~AS~z
+explanatory 6ksplan@t{r/
+expletive ekspl@t6v
+expletives ekspl@t6vz
+explication ekspl@kAS~
+explicit 6ksplis@t
+explicitly 6ksplis@tl/
+explode 6ksplOd
+exploded 6ksplOd@d
+explodes 6ksplOdz
+exploding 6ksplOd6N
+exploit ekspl<t
+exploit ekspl<t
+exploitation ekspl<tAS~
+exploitative ekspl<t@t6v
+exploited 6kspl<t@d
+exploited ekspl<t@d
+exploiting 6kspl<t6N
+exploiting ekspl<t6N
+exploitive 6kspl<t6v
+exploitive ckspl<t6v
+exploits ekspl<ts
+exploration eksplPAS~
+exploration ekspl{rAS~
+exploration's eksplPAS~z
+exploration's ekspl{rAS~z
+explorations eksplPAS~z
+explorations ekspl{rAS~z
+exploratory 6kspl{r@t{r/
+explore 6kspl{r
+explored 6kspl{rd
+explorer 6kspl{rP
+explorers 6kspl{rPz
+explores 6kspl{rz
+exploring 6kspl{r6N
+explosion 6ksplOZ~
+explosions 6ksplOZ~z
+explosive 6ksplOs6v
+explosively eksplOs6vl/
+explosives 6ksplOs6vz
+explosivos ekspl@sEv]s
+expo eksp]
+exponent ekspOn~t
+exponential eksp]nenC@l
+exponential eksp]nenS@l
+exponentially eksp]nenC@l/
+exponentially eksp]nenS@l/
+exponents 6kspOn~ts
+export eksp{rt
+exportable cksp{rt@b@l
+exported 6ksp{rt@d
+exporter 6ksp{rtP
+exporters 6ksp{rtPz
+exporters' eksp{rtPz
+exporting 6ksp{rt6N
+exports eksp{rts
+expos eksp]z
+expose 6kspOz
+exposed 6kspOzd
+exposes 6kspOz@z
+exposing 6kspOz6N
+exposition eksp@ziS~
+expositions eksp@ziS~z
+exposito cksp@zEt]
+exposure 6kspOZP
+exposures 6kspOZPz
+expound 6ksp?nd
+expounded 6ksp?nd@d
+expounding 6ksp?nd6N
+expounds 6ksp?ndz
+express 6kspres
+express' 6kspres
+express's 6kspres@z
+expressed 6ksprest
+expresses 6kspres@z
+expressing 6kspres6N
+expression 6kspreS~
+expressionism 6kspreS~iz}
+expressionist 6kspreS~@st
+expressionistic 6kspreS~ist6k
+expressionless 6kspreS~l@s
+expressions 6kspreS~z
+expressive 6kspres6v
+expressivity ekspr@siv@t/
+expressly ckspresl/
+expresso 6kspes]
+expresso ckspes]
+expressway 6kspreswA
+expropriate cksprOpr/At
+expropriated cksprOpr/At@d
+expropriation eksprOpr/AS~
+expropriations eksprOpr/AS~z
+expulsion 6kspulS~
+expulsions 6kspulS~z
+expunge 6kspunj
+expunged 6kspunjd
+exquisite ekskw@z@t
+exquisitely ekskwiz@tl/
+extant ekst~t
+extel ekstel
+extend 6kstend
+extendable ekstend@b@l
+extended 6kstend@d
+extender ekstendP
+extenders ekstendPz
+extendible ekstend@b@l
+extending 6kstend6N
+extends 6kstendz
+extension 6kstenS~
+extensions 6kstenS~z
+extensive 6kstens6v
+extensively 6kstens6vl/
+extent 6kstent
+extenuate 6kstenyUAt
+extenuating 6kstenyUAt6N
+exterior 6kstir/P
+exteriors ckstir/Pz
+exterminate 6kstVm~At
+exterminated 6kstVm~At@d
+exterminates 6kstVm~Ats
+exterminating 6kstVm~At6N
+extermination 6kstVm~AS~
+exterminator 6kstVm~AtP
+exterminators 6kstVm~AtPz
+external 6kstVn@l
+externally 6kstVn@l/
+extinct 6kstiNkt
+extinction 6kstiNS~
+extinction 6kstiNkS~
+extinguish 6kstiNgw6S
+extinguished 6kstiNgw6St
+extinguisher 6kstiNgw6SP
+extinguishers 6kstiNgw6SPz
+extinguishing 6kstiNgw6S6N
+extinguishment 6kstiNgw6Sm~t
+extirpate ekstPpAt
+extol 6kstOl
+extolled 6kstOld
+extolling 6kstOl6N
+extols 6kstOlz
+exton ekst~
+extort 6kst{rt
+extorted 6kst{rt@d
+extorting 6kst{rt6N
+extortion 6kst{rS~
+extortionate 6kst{rS~@t
+extortionate 6kst{rS~At
+extra ekstr@
+extracellularly ekstr@sely@lPl/
+extract 6kstrakt
+extract ekstrakt
+extracted 6kstrakt@d
+extracting 6kstrakt6N
+extraction 6kstrakS~
+extractions 6kstrakS~z
+extracts 6kstrakts
+extracts ekstrakts
+extracurricular ekstr@kPiky@lP
+extradite ekstr@dIt
+extradited ekstr@dIt@d
+extraditing ekstr@dIt6N
+extradition ekstr@diS~
+extragalactic ekstr@g@lakt6k
+extralegal ekstr@lEg@l
+extramarital ekstr},r@t@l
+extraneous ckstrAn/@s
+extraordinaire ekstr@{rd~er
+extraordinarily 6kstr{rd~,r@l/
+extraordinary 6kstr{rd~er/
+extraordinary ekstr@{rd~er/
+extrapolate 6kstrap@lAt
+extrapolated 6kstrap@lAt@d
+extrapolating 6kstrap@lAt6N
+extrapolation 6kstrap@lAS~
+extras ekstr@z
+extrasensory ekstr@sensP/
+extraterrestrial ekstr@tPestr/@l
+extraterrestrials ekstr@tVestr/@lz
+extraterritorial ekstr@ter@t{r/@l
+extraterritoriality ekstr@ter@t{r/al@t/
+extravagance 6kstrav@g~s
+extravagant 6kstrav@g~t
+extravagantly ekstrav@g~tl/
+extravaganza 6kstrav@ganz@
+extravaganzas 6kstrav@ganz@z
+extreme 6kstrEm
+extremely 6kstrEml/
+extremes 6kstrEmz
+extremism ekstrEmiz}
+extremism ekstremiz}
+extremist 6kstrEm@st
+extremists 6kstrEm@s
+extremists 6kstrEm@ss
+extremists 6kstrEm@sts
+extremities 6kstrem@t/z
+extremity 6kstrem@t/
+extricate ekstr@kAt
+extricated ekstr6kAt@d
+extrinsic ckstrins6k
+extrovert ekstr@vVt
+extroverted ekstr@vVt@d
+extrude 6kstrUd
+extruded 6kstrUd@d
+extruding 6kstrUd6N
+extrusion 6kstrUZ~
+exuberance 6gzUbP~s
+exuberant 6gzUbP~t
+exude 6gzUd
+exuded 6gzUd@d
+exudes 6gzUdz
+exult 6gzult
+exultant 6gzult~t
+exultantly 6gzult~tl/
+exulted 6gzult@d
+exults 6gzults
+exum 6gzum
+exxon ekson
+exxon's eksonz
+eyde Ad
+eydie Ad/
+eye I
+eye's Iz
+eyeball Ib{l
+eyeballs Ib{lz
+eyebrow Ibr?
+eyebrows Ibr?z
+eyecare Iker
+eyed Id
+eyedrop Idrop
+eyedropper IdropP
+eyedrops Idrops
+eyeglass Iglas
+eyeglasses Iglas@z
+eyeing I6N
+eyelab Ilab
+eyelash IlaS
+eyelashes IlaS@z
+eyeless Il@s
+eyelet Il@t
+eyelets Il@ts
+eyelid Ilid
+eyelids Ilidz
+eyelike IlIk
+eyeliner IlInP
+eyepiece IpEs
+eyer IP
+eyerly EPl/
+eyerman EPm~
+eyes Iz
+eyes' Iz
+eyeshade ISAd
+eyesight IsIt
+eyesore Is{r
+eyespot Ispot
+eyestone IstOn
+eyestrain IstrAn
+eyetech Itek
+eyetech's Iteks
+eyewear Iwer
+eyewitness Iwitn@s
+eyewitnesses Iwitn@s@z
+eyler AlP
+eyman Am~
+eynon An~
+eyre ,r
+eyrich ,r6C
+eyrie ,r/
+eyring Ar6N
+eyster AstP
+eyton At~
+ezekiel ez6kEl
+ezell @zel
+ezell's @zelz
+ezelle czel
+ezer EzP
+ezer ezP
+ezoe ez]
+ezola AzOl@
+ezra ezr@
+ezzell ez@l
+ezzo ez]
+f ef
+f'd efd
+f's efs
+f. ef
+f.'s efs
+faal fol
+faal's folz
+faas foz
+fab fab
+fabbri fabr/
+fabel fab@l
+fabela fobel@
+faber fAbP
+faberge fabPjA
+faberman fAbPm~
+fabia fob/@
+fabian fAb/~
+fabiani fob/on/
+fabiano fob/on]
+fabien fab/n
+fabio fob/]
+fable fAb@l
+fabled fAb@ld
+fables fAb@lz
+fabre fAbP
+fabri fabr/
+fabric fabr6k
+fabricant fabr6k~t
+fabricate fabr@kAt
+fabricated fabr6kAt@d
+fabricates fabr6kAts
+fabricating fabr6kAt6N
+fabrication fabr6kAS~
+fabrications fabr6kAS~z
+fabricator fabr6kAtP
+fabricators fabr6kAtPz
+fabrics fabr6ks
+fabris fabris
+fabrizi fobrEz/
+fabrizio fobrEts/]
+fabrizius fabrEz/@s
+fabron fabr~
+fabry fabr/
+fabulous faby@l@s
+fabulously fabyUl@sl/
+fac fak
+facade f@sod
+facades f@sodz
+facchini fokEn/
+facciola faC/Ol@
+face fAs
+faced fAst
+facedown fAsd?n
+faceless fAsl@s
+facelift fAslift
+facemire foCcmir/
+facer fAsP
+faces fAs@z
+facet fas@t
+facet's fas@ts
+faceted fas@t@d
+facetious f@sES@s
+facetiously f@sES@sl/
+facets fas@ts
+facey fAs/
+facial fAS@l
+facials fAS@lz
+faciane fos/onA
+facie fAs/
+facile fas@l
+facilitate f@sil@tAt
+facilitated f@sil@tAt@d
+facilitates f@sil@tAts
+facilitating f@sil@tAt6N
+facilitation f@sil@tAS~
+facilitator f@sil@tAtP
+facilitator's f@sil@tAtPz
+facilitators f@sil@tAtPz
+facilities f@sil@t/z
+facility f@sil@t/
+facility's f@sil@t/z
+facing fAs6N
+facings fAs6Nz
+fackler faklP
+fackrell fakr@l
+facsimile faksim@l/
+facsimiles faksim@l/z
+fact fakt
+facteau f@ktO
+faction fakS~
+factional fakS~@l
+factionalism fakS~@liz}
+factions fakS~z
+factitious faktiS@s
+factly faktl/
+facto fakt]
+factor faktP
+factored faktPd
+factories faktP/z
+factoring faktP6N
+factors faktPz
+factors' faktPz
+factory faktP/
+factory's faktP/z
+facts faks
+facts fakts
+factual fakCU@l
+factually fakCU@l/
+facultative fak@ltAt6v
+faculties fak@lt/z
+faculty fak@lt/
+fad fad
+fadden fad~
+faddis fadis
+faddish fad6S
+fade fAd
+faded fAd@d
+fadel fad@l
+fadeley fad@l/
+fadely fAdl/
+faden fAd~
+fader fAdP
+fades fAdz
+fading fAd6N
+fadlallah fadlal@
+fadness fadn@s
+fads fadz
+fae fI
+faerber f,rbP
+faeth fET
+fag fag
+fagan fAg~
+fagen fag~
+fager fAgP
+fagerberg fAgPbPg
+fagerstrom fAgPstr}
+fagg fag
+faggart fagort
+faggot fag@t
+fagin fAgin
+fagley fagl/
+fagnant fagn~t
+fagoth fag@T
+fags fagz
+fagundes fag~dz
+fahd fod
+faherty fahPt/
+fahey fah/
+fahl fol
+fahlman folm~
+fahmy fom/
+fahnestock fonstok
+fahr f)r
+fahrenheit f,r~hIt
+fahrenheit's f,r~hIts
+fahrenkopf f)r~kopf
+fahrer f)rP
+fahringer f)r6NP
+fahrner f)rnP
+fahrney f)rn/
+fahs fas
+fahy fAh/
+faidley fAdl/
+faiella fIel@
+fail fAl
+faile fAl
+failed fAld
+failing fAl6N
+failings fAl6Nz
+failla fAl@
+failor fAlP
+fails fAlz
+failsafe fAlsAf
+failure fAlyP
+failures fAlyPz
+fain fAn
+faint fAnt
+fainted fAnt@d
+fainter fAntP
+faintest fAnt@st
+fainthearted fAnthort@d
+fainting fAnt6N
+faintly fAntl/
+faintness fAntn@s
+faiola fI]l@
+fair f,r
+fair's f,rz
+fairall fcr{l
+fairbairn f,rbPn
+fairbank f,rb@Nk
+fairbanks f,rb@Nks
+fairbrother f,rbr@TP
+fairburn f,rbVn
+fairchild f,rCIld
+fairchild's f,rCIldz
+faircloth f,rkl@T
+fairclough f,rkl?
+faire f,r
+fairer f,rP
+faires f,rz
+fairest f,r@st
+fairey f,r/
+fairfax f,rfaks
+fairfield f,rfEld
+fairground f,rgr?nd
+fairgrounds f,rgr?ndz
+fairhaven f,rhAv~
+fairhurst fIrhPst
+fairies f,r/z
+fairlawn f,rl{n
+fairleigh f,rl@
+fairless f,rl@s
+fairley f,rl/
+fairlie f,rl/
+fairlow f,rl]
+fairly f,rl/
+fairman fIrm~
+fairmont f,rmont
+fairness f,rn@s
+fairs f,rz
+fairview f,rvyU
+fairway f,rwA
+fairways f,rwAz
+fairweather f,rweTP
+fairy f,r/
+fairyland f,r/land
+fairytale f,r/tAl
+fairytales f,r/tAlz
+faisal fAz@l
+faison fAz~
+faist fo@st
+fait fAt
+faith fAT
+faithful fATf@l
+faithfully fATf@l/
+faithfuls fATf@lz
+faiths fATs
+faivre fAvP
+fajardo foy)rd]
+fajita f@hEt@
+fajita f@jEt@
+fajitas f@hEt@z
+fajitas f@jEt@z
+fake fAk
+faked fAkt
+faker fAkP
+fakers fAkPz
+fakes fAks
+faking fAk6N
+falafel f@lof@l
+falanga foloNg@
+falardeau falordO
+falasco folosk]
+falb f{lb
+falbo falb]
+falcigno falsign]
+falcigno felsEny]
+falck falk
+falco falk]
+falcoff falk{f
+falcon falk~
+falconbridge falk~brij
+falconbridge's falk~brij@z
+falcone folkOn/
+falconer falk~P
+falconers falk~Pz
+falconet falk~et
+falconets falk~ets
+falconi folkOn/
+falconry falk~r/
+falcons falk~z
+faldo fold]
+faler fAlP
+fales fAlz
+faley fAl/
+falgoust folgUst
+falgout falg?t
+falik fol6k
+falin falin
+falise f@lEs
+falk f{k
+falke f{k
+falkenberg f{k~bPg
+falkenstein f{k~st/n
+falkenstein f{k~stIn
+falkland f{kl~d
+falklands f{kl~dz
+falkner f{knP
+falkowski f@lk{fsk/
+fall fol
+fall's folz
+falla fal@
+fallacies fal@s/z
+fallacious f@lAS@s
+fallaciously f@lAS@sl/
+fallacy fal@s/
+fallaw fal{
+fallback f{lbak
+fallen fol~
+faller f{lP
+fallert falPt
+fallibility fal@bil@t/
+fallible fal@b@l
+fallin falin
+falling fol6N
+fallis falis
+falloff f{l{f
+fallon fal~
+fallopian f@lOp/~
+fallout f{l?t
+fallouts f{l?ts
+fallow falO
+fallows falOz
+falls f{lz
+falmouth falm@T
+falor falP
+falotico fol]tEk]
+false f{ls
+falsehood falshqd
+falsehoods falshqdz
+falsely f{lsl/
+falsetto f{lsetO
+falsettos f{lsetOz
+falsification fals@f@kAS~
+falsified f{ls@fId
+falsify f{ls@fI
+falsifying f{ls@fI6N
+falsity f{ls@t/
+falsone f{ls~
+falstaff f{lstaf
+falstaff's f{lstafs
+falter f{ltP
+faltered foltPd
+faltering f{ltP6N
+falters f{ltPz
+falvey falv/
+falvo folv]
+falwell f{lwel
+falwell's f{lwelz
+falynn falin
+falzarano folzoron]
+falzon folz~
+falzone folzOn/
+fama fom@
+fambro fambr]
+fambrough fambr?
+fame fAm
+famed fAmd
+famer fAmP
+famers fAmPz
+famiglietti f}igl/et/
+familial f}ily@l
+familiar f}ilyP
+familiarity f}ily,r@t/
+familiarize f}ilyPIz
+familiarized f}ilyPIzd
+families fam@l/z
+families faml/z
+families' fam@l/z
+family fam@l/
+family faml/
+family's fam@l/z
+family's faml/z
+famine fam~
+famines fam~z
+famous fAm@s
+famously fAm@sl/
+famularo fomUl)r]
+fan fan
+fan's fanz
+fanara fon)r@
+fanatic f~at6k
+fanatical f~at6k@l
+fanatically f~at6k@l/
+fanatically f~at6kl/
+fanaticism f~at@siz}
+fanatics f~at6ks
+fancher fanCP
+fanchon fanC~
+fancied fans/d
+fancier fans/P
+fanciers fans/Pz
+fancies fans/z
+fanciest fans/@st
+fanciful fans@f@l
+fancy fans/
+fandango fandaNgO
+fandel fand@l
+fandrich fandr6k
+fane fAn
+fanech fanek
+fanech's faneks
+fanelli f~el/
+faneuil fanyU@l
+fanfare fanfer
+fang faN
+fanger faNP
+fangle faNg@l
+fangled faNg@ld
+fangman faNm~
+fangs faNz
+fanguy f@NgwE
+fankhauser faNkh?zP
+fanlike fanlIk
+fann fan
+fanned fand
+fannie fan/
+fannin fanin
+fanning fan6N
+fanning's fan6Nz
+fannon fan~
+fanny fan/
+fans fanz
+fans' fanz
+fansler fans@lP
+fant fant
+fanta font@
+fantail fantAl
+fantasia fantAZ@
+fantasies fan@s/z
+fantasies fant@s/z
+fantasize fan@sIz
+fantasize fant@sIz
+fantasized fan@sIzd
+fantasized fant@sIzd
+fantasizes fan@sIz@z
+fantasizes fant@sIz@z
+fantasizing fan@sIz6N
+fantasizing fant@sIz6N
+fantastic fantast6k
+fantastically fantast6kl/
+fantastik fantast6k
+fantasy fan@s/
+fantasy fant@s/
+fantasyland fan@s/land
+fantasyland fant@s/land
+fantini fontEn/
+fantle fant@l
+fanton fant~
+fantozzi fontOts/
+fantroy fantr<
+fanuc fan@k
+fanucchi fonUk/
+fanueil fany@l
+fao f?
+far f)r
+far's f)rz
+farabaugh far@b{
+farabee far@b/
+farabundo fer@bUndO
+farace foroC/
+faraci foroC/
+faraday far@dA
+faraday's far@dAz
+faragher far@ghP
+farago forog]
+farah f,r@
+farahkan far@kan
+farai f)rA
+farai f)rI
+farai f,rA
+faranda fPand@
+faraone foroOn/
+faraway f)r@wA
+farb f)rb
+farben f)rb~
+farber f)rbP
+farberware f)rbPwer
+farbman f)rbm~
+farce f)rs
+farcical f)rs@k@l
+fare f,r
+fared f,rd
+fares f,rz
+farese forAz/
+faretlow f@retl]
+farewell ferwel
+farewells ferwelz
+farfen f)rf~
+farfetched forfeCt
+farge f)rj
+fargnoli forgnOl/
+fargo f)rgO
+fargo's f)rgOz
+farha f)rh@
+farhat f)rhat
+faria f)r/@
+farias f,r/@z
+faribault far@bolt
+farica forEk@
+faridoun f)r@dUn
+fariello for/el]
+faries fcrEz
+farina fPEn@
+farinacci for/noC/
+farinas fPEn@z
+farinella for/nel@
+faring f,r/N
+farino forEn]
+faris f,ris
+farish f,riS
+fariss fPis
+farkas f)rk@s
+farland f)rl~d
+farlee f)rlE
+farler f)rlP
+farless f)rl@s
+farley f)rl/
+farling f)rl6N
+farlow f)rlO
+farly f)rl/
+farm f)rm
+farm's f)rmz
+farman f)rm~
+farmboy f)rmb<
+farmed f)rmd
+farmer f)rmP
+farmer's f)rmPz
+farmers f)rmPz
+farmers' f)rmPz
+farmers's f)rmPz@z
+farmhand f)rmhand
+farmhands f)rmhandz
+farmhouse f)rmh?s
+farmhouses f)rmh?s@z
+farming f)rm6N
+farming's f)rm6Nz
+farmingdale f)rm6NdAl
+farmington f)rm6Nt~
+farmland f)rmland
+farmlands f)rmlandz
+farms f)rmz
+farms' f)rmz
+farmstead f)rmsted
+farmworker f)rmwVkP
+farmworkers f)rmwVkPz
+farmyard f)rmyord
+farnall f)rn@l
+farnam f)rn}
+farnan f)rn~
+farnborough f)rnbP]
+farnell f)rn@l
+farner f)rnP
+farnes f)rnz
+farney f)rn/
+farnham f)rn}
+farnley f)rnl/
+farnsworth f)rnswPT
+farnum f)rn}
+farnworth f)rnwPT
+faro f,r]
+farold far]ld
+faron f,r~
+farone fPOn
+farouk f@rUk
+farquar forkw)r
+farquhar f)rkwP
+farquharson forkuhors~
+farr f)r
+farra f)r@
+farragut f,r@g@t
+farrah f,r@
+farrakhan f)r@kon
+farrakhan's f)r@konz
+farran far~
+farrand far~d
+farrant f)r~t
+farrar fP)r
+farrel f,r@l
+farrell f,rcl
+farrell's f,rclz
+farrelly f,r@l/
+farren f,r~
+farrens far~z
+farrer f)rP
+farrey far/
+farrier f,r/P
+farrington f,r6Nt~
+farrior forEP
+farris f,ris
+farrish fariS
+farro f)r]
+farron f,r~
+farrow f,rO
+farrow's f,rOz
+farrowing farO6N
+farruggia forUgj@
+farrugia forUj@
+farry far/
+farsi f)rs/
+farsighted f)rsIt@d
+farsightedness forsIt@dn@s
+farson f)rs~
+farther f)rTP
+farthest f)rT@st
+farthing f)rT6N
+farthingale f)rT6NgAl
+farve f)rv
+farver f)rvP
+farwell f)rwel
+farwest forwest
+fasano foson]
+fasbender fasbendP
+fascell f@sel
+fasching faS6N
+fasciano fosC/on]
+fascinate fas~At
+fascinated fas~At@d
+fascinates fas~Ats
+fascinating fas~At6N
+fascination fas~AS~
+fascism faSiz}
+fascist faS@st
+fascists faS@s
+fascists faS@ss
+fascists faS@sts
+fashion faS~
+fashion's faS~z
+fashionable faSn@b@l
+fashionable faS~@b@l
+fashionably faS~@bl/
+fashioned faS~d
+fashioning faS~6N
+fashions faS~z
+fasick fas6k
+fasig fas6g
+fasnacht fasn@kt
+faso fos]
+fason fas~
+fasone fosOn/
+fass fas
+fassbender fasbendP
+fassett fasct
+fassler faslP
+fassnacht fasn@kt
+fassulo f@sUl]
+fast fast
+fastball fastb{l
+fasted fast@d
+fasten fas~
+fastened fas~d
+fastener fasnP
+fastener fas~P
+fasteners fasnPz
+fasteners fas~Pz
+fastening fasn6N
+fastening fas~6N
+fastenings fasn6Nz
+fastenings fas~6Nz
+faster fastP
+fastest fast@st
+fastfood fastfUd
+fastidious fastid/@s
+fasting fast6N
+fastness fastn@s
+fasts fasts
+fasulo f@sUl]
+fat fat
+fata fot@
+fatah f@to
+fatah fot@
+fatal fAt@l
+fatalism fAt@liz}
+fatalist fAt@list
+fatalistic fAt@list6k
+fatalists fAt@l@s
+fatalists fAt@l@ss
+fatalists fAt@l@sts
+fatalities f@tal@t/z
+fatality f@tal@t/
+fatally fAt@l/
+fate fAt
+fated fAt@d
+fateful fAtf@l
+fates fAts
+fath faT
+father foTP
+father's foTPz
+fathered foTPd
+fatheree faTPE
+fatherhood foTPhqd
+fathering foTP6N
+fatherland foTPland
+fatherless foTPl@s
+fatherly foTPl/
+fathers foTPz
+fathers' faTPz
+fathi faT/
+fathom faT}
+fathomable faT}@b@l
+fathoms faT}z
+fatigue f@tEg
+fatigued f@tEgd
+fatigues f@tEgz
+fatiguing f@tEg6N
+fatima faT}@
+fatimah faT}@
+fats fats
+fatten fat~
+fattened fat~d
+fattening fatn6N
+fattening fat~6N
+fatter fatP
+fattest fat@st
+fatties fat/z
+fatty fat/
+fatula fotUl@
+fatuous faC@w@s
+fatwa fotwo
+fatzinger fAtz6NP
+faubel f?b@l
+fauber f?bP
+faubert f?bPt
+faubion f?b/~
+fauble f{b@l
+faubus f{b@s
+faucet f{s@t
+faucets f{s@ts
+faucett f{sct
+faucette f]set
+faucher f?kP
+faucheux f]SO
+fauci f{s/
+faughn f{n
+faughnan f{n~
+faught f{t
+faught's f{ts
+faul f{l
+faulcon f{lk~
+faulconer f{lk~P
+faulding f{ld6N
+faulds f{ldz
+faulhaber f?lh@bP
+faulk f{k
+faulkenberry f{lk~ber/
+faulkner f{knP
+faulkner's f{knPz
+faulks f{ks
+faull f{l
+faulstich f{lst6C
+fault f{lt
+faulted f{lt@d
+faulting f{lt6N
+faults f{lts
+faulty f{lt/
+fauna f{n@
+faunal fon@l
+faunce f{ns
+fauntleroy f{ntlP<
+fauntroy f{ntr<
+faupel f]pel
+faure f{r
+faurot f{rO
+fauroux f{rU
+faus f{z
+fauser f?sP
+fausett f{sit
+fausey f{s/
+fausnaugh f{sn{
+fauss f{s
+faust f?st
+fausta f{st@
+faustian f{sC~
+faustina f{stEn@
+faustine f?st/n
+faustino f{stEn]
+fausto f{st]
+faustus f{st@s
+fauteux f]tO
+fauth f{T
+fauver f?vP
+faux f{ks
+fava fov@
+favale fovol/
+favaloro fovol{r]
+favaro fov)r]
+favata fovot@
+favazza fovots@
+favela fovel@
+faver fAvP
+favero fov,r]
+favia fov/@
+favinger fAv6NP
+favor fAvP
+favorability favP@bil@t/
+favorable fAvP@b@l
+favorable fAvr@b@l
+favorably fAvP@bl/
+favorably fAvr@bl/
+favored fAvPd
+favoring fAvP6N
+favorite fAvP@t
+favorite fAvr@t
+favorites fAvP@ts
+favorites fAvr@ts
+favoritism fAvP@tiz}
+favors fAvPz
+favre fAvP
+favreau f@vrO
+favro favr]
+faw f{
+fawbush f{bqS
+fawcett f{sct
+fawkes f{ks
+fawley f{l/
+fawn f{n
+fawning f{n6N
+fawver f{vP
+fax faks
+faxed fakst
+faxer faksP
+faxes faks@z
+faxing faks6N
+faxon faks~
+fay fA
+fay's fAz
+fayanjuu fI~jU
+fayanne fA~
+fayard f@y)rd
+faye fA
+fayed fAd
+fayette fAet
+fayetteville fAetvil
+fayez fAcz
+fayme fAm
+faymonville fAm~vil
+fayne fAn
+fayrouz fArUz
+faz faz
+faze fAz
+fazed fAzd
+fazekas faz6k@z
+fazenbaker fAz~bAkP
+fazio fAz/]
+fazio foz/]
+fazzino fotsEn]
+fazzio faz/]
+fe fA
+fe's fAz
+feagan fAg~
+feagans fEg~z
+feagin fEjin
+feagins fEjinz
+feagle fEg@l
+fealty fE@lt/
+fealty fElt/
+fear fir
+feared fird
+fearful firf@l
+fearing fir6N
+fearless firl@s
+fearn fVn
+fearnow fVn]
+fearon fir~
+fears firz
+fearsome firs}
+feasel fEz@l
+feasibility fEz@bil@t/
+feasible fEz@b@l
+feasibly fEz@bl/
+feast fEst
+feasted fEst@d
+feaster fEstP
+feasting fEst6N
+feasts fEs
+feasts fEss
+feasts fEsts
+feat fEt
+feather feTP
+featherbed feTPbed
+featherbedding feTPbed6N
+feathered feTPd
+feathering feTP6N
+feathering feTr6N
+featherless feTPl@s
+featherly feTPl/
+feathers feTPz
+featherston feTPst~
+featherstone feTPstOn
+featherweight feTPwAt
+feathery feTP/
+feathery feTrE
+feats fEts
+feature fECP
+featured fECPd
+featureless fECPl@s
+features fECPz
+featuring fECP6N
+feazel fEz@l
+feazell fEz@l
+feb feby@wer/
+febles feb@lz
+febres febr@s
+february feb@wer/
+february febUwer/
+february febrUwer/
+february feby@wer/
+february febyUwer/
+february's feb@wer/z
+february's febUwer/z
+february's febrUwer/z
+february's feby@wer/z
+february's febyUwer/z
+fecal fEk@l
+feces fEsEz
+fecher fekP
+fechner feknP
+fecht fekt
+fechter fektP
+feck fek
+feckless fekl@s
+fecteau f6ktO
+fed fed
+fed's fedz
+fedak fed@k
+fedder fedP
+fedders fedPz
+fedders's fedPz@z
+feddersen fedPs~
+fede fEd
+fedeccredito fcdekrcdEtO
+fedele fed@l
+fedeli fcdel/
+feder fedP
+federal fedP@l
+federal fedr@l
+federal's fedP@lz
+federal's fedr@lz
+federalism fedP@liz}
+federalism fedr@liz}
+federalist fedP@l@st
+federalist fedr@l@st
+federalists fedP@l@s
+federalists fedP@l@ss
+federalists fedP@l@sts
+federalists fedr@l@s
+federalists fedr@l@ss
+federalists fedr@l@sts
+federalize fedP@lIz
+federalize fedr@lIz
+federalized fedP@lIzd
+federalized fedr@lIzd
+federalizing fedP@lIz6N
+federalizing fedr@lIz6N
+federally fedP@l/
+federally fedr@l/
+federals fedP@lz
+federals fedr@lz
+federate fedPAt
+federated fedPAt@d
+federated's fedPAt@dz
+federation fedPAS~
+federation's fedPAS~z
+federations fedPAS~z
+federative fedP@t6v
+federative fedr@t6v
+federbush fedPbqS
+federer fedPP
+federica fcdPEk@
+federici fcdPEC/
+federico fcdPEk]
+federle fedP@l
+federman fEdPm~
+federoff fedP{f
+federov fedP{v
+federspiel fedPsp/l
+fedewa f@dU@
+fedex fedcks
+fediay fEd/A
+fedler fedlP
+fedor fedP
+fedora f@d{r@
+fedorchak fedPk@k
+fedorko f@d{rk]
+fedrick fedr6k
+feds fedz
+fee fE
+feeback fEbak
+feebis fEb@s
+feeble fEb@l
+feebly fEbl/
+feed fEd
+feedback fEdbak
+feeder fEdP
+feeders fEdPz
+feeding fEd6N
+feedings fEd6Nz
+feedlot fEdlot
+feedlots fEdlots
+feeds fEdz
+feedstock fEdstok
+feedstocks fEdstoks
+feehan fE~
+feel fEl
+feeler fElP
+feelers fElPz
+feeley fEl/
+feelin' fEl~
+feeling fEl6N
+feelings fEl6Nz
+feels fElz
+feely fEl/
+feemster fEmstP
+feeney fEn/
+feenstra fEnstr@
+feeny fEn/
+fees fEz
+feese fEz
+feeser fEzP
+feet fEt
+feezor fEzP
+feffer fefP
+fegan feg~
+feger fEgP
+fegley fegl/
+feher fehP
+fehl fel
+fehling fel6N
+fehlman felm~
+fehn fen
+fehnel fen@l
+fehr f,r
+fehrenbach f,r~bok
+fehrenbacher f,r~bokP
+fehring f,r6N
+fehringer f,r6NP
+fehrman f,rm~
+feick fEk
+feickert fIkPt
+feig fEg
+feige fEj
+feigel fIg@l
+feigen fIg~
+feigenbaum fIg~b?m
+feiger fIgP
+feighan fAg~
+feighner fAnP
+feight fAt
+feigin fIgin
+feign fAn
+feigned fAnd
+feigning fAn6N
+feil fEl
+feild fEld
+feiler fIlP
+feimster fImstP
+fein fAn
+fein fIn
+fein's fAnz
+fein's fInz
+feinauer fIn?P
+feinberg fInbPg
+feiner fInP
+feingold fINg]ld
+feinman fInm~
+feinstein fInstEn
+feinstein fInstIn
+feinstein's fInstEnz
+feinstein's fInstInz
+feint fAnt
+feis fIs
+feist fIst
+feister fIstP
+feisty fIst/
+feit fIt
+feith fIT
+feith's fITs
+feitz fIts
+fejes fcZEz
+fekete fek/t
+fel fel
+fela fel@
+felan fel~
+felbatol felb@tol
+felber felbP
+felch felC
+feld feld
+felda feld@
+feldberg feldbPg
+feldblum feldblUm
+feldblum feldbl}
+felde feld
+feldene fcldEn
+felder feldP
+felderman feldPm~
+feldhaus feldh?s
+feldkamp feldkamp
+feldman feldm~
+feldman's feldm~z
+feldmann feldm~
+feldmeier feldmIP
+feldmuehle feldmyUl@
+feldner feldnP
+feldpausch feldp?S
+feldspar feldspor
+feldspars feldsporz
+feldstein feldst/n
+feldstein feldstIn
+feldstein's feldstEnz
+feldstein's feldstInz
+feldt felt
+felgenhauer felg~h?P
+felger felgP
+felice f@lEs
+felicetti fcl/Cet/
+felicia f@lES@
+felicia's f@lES@z
+feliciano f@l/s/on]
+felicite felisIt
+felicitous f@lis@t@s
+felicity f@lis@t/
+feline fElIn
+felines fElInz
+felipe f@lEp
+felis felis
+felix fEl6ks
+feliz feliz
+felkel felk@l
+felker felkP
+felker's felkPz
+felkins felkinz
+felkner felknP
+fell fel
+fella fel@
+felland fel~d
+fellas fel@s
+felled feld
+felleisen felIs~
+fellenz felins
+feller felP
+fellers felPz
+fellheimer felhImP
+fellin felin
+felling fel6N
+fellinger fel6NP
+fellini f@lEn/
+fellman felm~
+fellmeth felm@T
+fellner felnP
+fellow fel]
+fellow's fel]z
+fellowes felOz
+fellows fel]z
+fellowship fel]Sip
+fellowships fel]Sips
+fells felz
+fellsway felzwA
+felman felm~
+felmlee felml/
+felon fel~
+felonies fel~/z
+felonious fclOn/@s
+felons fel~z
+felony fel~/
+felps felps
+felrice felrIs
+fels felz
+felsenthal felz~Tol
+felske felsk
+felt felt
+felten felt~
+felter feltP
+feltes felts
+feltler feltlP
+feltman feltm~
+feltner feltnP
+felton felt~
+feltrax feltraks
+felts felts
+feltsman feltsm~
+feltus felt@s
+felty felt/
+feltz felts
+felucca f@luk@
+felver felvP
+female fEmAl
+female's fEmAlz
+females fEmAlz
+femia fEm/@
+femina fem~@
+feminine fem~~
+femininity fem~in@t/
+feminism fem~iz}
+feminist fem~@st
+feminists fem~@s
+feminists fem~@ss
+feminists fem~@sts
+femme fem
+femoral femP@l
+femrite femrIt
+femsa fems@
+femur fEmP
+fence fens
+fenced fenst
+fenceless fensl@s
+fences fens@z
+fencing fens6N
+fencl feNk@l
+fend fend
+fended fend@d
+fender fendP
+fenders fendPz
+fenderson fendPs~
+fendi fend/
+fending fend6N
+fendler fendlP
+fendley fendl/
+fendrick fendr6k
+fends fendz
+fendt fent
+fenech fen6k
+fenella fcnel@
+fenelon fen@lon
+feng feN
+fenger feNP
+fenian fEn/~
+fenichell fen6C@l
+fenimore fen}{r
+fenjves fcnhevcz
+fenjves fenvcz
+fenley fenl/
+fenlon fenl~
+fenn fen
+fennel fen@l
+fennell fen@l
+fennelly fen@l/
+fennema fen}@
+fenner fenP
+fennessey fen@s/
+fennessy fen@s/
+fennewald fen@w{ld
+fenney fen/
+fennimore fen}{r
+fenno fen]
+fenoglio fcnOgl/]
+fenske fensk
+fenster fenstP
+fenstermacher fenstPm@kP
+fenstermaker fenstPmAkP
+fensterstock fenstPstok
+fent fent
+fenter fentP
+fenton fent~
+fentress fentr@s
+fenugreek fenUgrEk
+fenway fenwA
+fenwick fenwik
+fenwood fenwqd
+fenyvessy fen6ves/
+fenzel fenz@l
+feodor fE@dP
+feodora f/@d{r@
+feola f/ol@
+fer f,r
+fer fV
+fera f,r@
+feral f,r@l
+ferarro fcr)r]
+ferber fVbP
+ferch fVk
+ferd fVd
+ferderer fVdPP
+ferdie fVd/
+ferdig fVd6g
+ferdinand fVd~an
+ferdinand fVd~and
+ferdinanda fPd/nond@
+ferdlow f,rdl]
+ferdon fcrd{n
+ferebee f,r@b/
+ferenc fPens
+ference fir~s
+ferencz f,rinC
+feretlow f,r@tl]
+feretlow f,rtl]
+ferg fVg
+fergason fVg@s~
+ferger fVgP
+fergerson fVgPs~
+fergeson fVg@s~
+fergie fVg/
+fergus fVg@s
+ferguson fVg@s~
+ferguson's fVg@s~z
+fergusson fVg@s~
+feria f,r/@
+ferko fVk]
+ferland fVl~d
+ferm fVm
+ferman fVm~
+ferment fPment
+ferment fVmcnt
+fermenta fPmen@
+fermenta fPment@
+fermenta's fPmen@z
+fermenta's fPment@z
+fermentation fVm~tAS~
+fermented fPment@d
+fermenting fPment6N
+ferments fPments
+fermi fVm/
+fermilab fVm@lab
+fermin fVmin
+fermium f,rm/}
+fermoyle fVm<l
+fern fVn
+fernald fPnold
+fernald fernold
+fernand fPnand
+fernand fPnon
+fernand fPnond
+fernanda fPnand@
+fernanda fPnond@
+fernandes fPnandcs
+fernandes fPnondcs
+fernandez fPnandcz
+fernandez fPnondcz
+fernandez fcrnandcz
+fernandez fcrnondcz
+fernandina fPn~dEn@
+fernando fPnand]
+fernando fPnond]
+fernao fPn?
+fernau fVn?
+fernbank fVnbaNk
+fernberg fVnbPg
+ferndale fVndAl
+ferner fVnP
+fernery fVnP/
+fernholz fVnh]lz
+fernicola fPn/kOl@
+fernlike fVnlIk
+ferns fVnz
+fernstrom fVnstr}
+fero f,r]
+ferocious fPOS@s
+ferociously fPOS@sl/
+ferocity fPos@t/
+ferol f,r@l
+ferra f,r@
+ferraioli f,rI]l/
+ferrall f,r@l
+ferran f,r~
+ferrand f,r~d
+ferrandino fPondEn]
+ferrando ferand]
+ferrant f,r~t
+ferrante fPont/
+ferranti fcran/
+ferranti fcrant/
+ferrara fP)r@
+ferrari fP)r/
+ferrario fP)r/]
+ferraris fP)ris
+ferraro fP)r]
+ferre f,r
+ferrebee f,r@b/
+ferree fPE
+ferreira fcrAr@
+ferreiro fcr,r]
+ferrel fcrel
+ferrell f,rcl
+ferrelli fPel/
+ferren f,r~
+ferrency ferens/
+ferrentino fPcntEn]
+ferrer f,rP
+ferrera fcr,r@
+ferreri fP,r/
+ferrero fcr,r]
+ferret f,r@t
+ferreted f,r@t@d
+ferreting f,r@t6N
+ferrets f,r@ts
+ferretti fPet/
+ferri f,r/
+ferrick f,r6k
+ferrie f,r/
+ferried f,r/d
+ferrier f,r/P
+ferriera fPir@
+ferriers f,r/Pz
+ferries f,r/z
+ferrigno fPEgn]
+ferrill fcrEl
+ferrin f,rin
+ferrington f,r6Nt~
+ferrini fPEn/
+ferris f,r@s
+ferriss f,r@s@z
+ferrite f,rIt
+ferriter f,rItP
+ferriz f,r@z
+ferro f,r]
+ferrochrome f,r@krOm
+ferrofluidic fer]flUid6k
+ferrofluidics fer]flUid6ks
+ferromagnet fer]magn@t
+ferromagnetic fer]magnet6k
+ferromagnetism fer]magn@tiz}
+ferron f,r~
+ferrone fPOn/
+ferronickel fer~ik@l
+ferrotype f,r@tIp
+ferrous f,r@s
+ferrucci fPUC/
+ferruzzi fcrUz/
+ferruzzi's fVUz/z
+ferry f,r/
+ferry's f,r/z
+ferryboat f,r/bOt
+ferryboats f,r/bOts
+ferrying f,r/6N
+ferryman f,r/m~
+fertig fVt6g
+fertile fPtIl
+fertile fVt@l
+fertility fPtil@t/
+fertilization fVt@l@zAS~
+fertilize fVt@lIz
+fertilized fVt@lIzd
+fertilizer fVt@lIzP
+fertilizers fVt@lIzPz
+fertilizes fVt@lIz@z
+fertilizing fVt@lIz6N
+fertitta fPtEt@
+fertlow fVtl]
+ferullo fPUl]
+fervent fVv~t
+fervently fVv~tl/
+fervid fVv@d
+fervor fVvP
+fery f,r/
+feschbach feSbok
+fescue feskyU
+feser fEzP
+feshbach feSbok
+fesler fes@lP
+fesmire fesmIr
+fesperman fespPm~
+fess fes
+fessed fest
+fessel fes@l
+fessenden fes~d~
+fessler feslP
+fest fest
+festa fest@
+fester festP
+festered festPd
+festering festP6N
+festiva fcstEv@
+festival fest@v@l
+festival's fest@v@lz
+festivals fest@v@lz
+festive fest6v
+festivities fcstiv@t/z
+festivity fcstiv@t/
+festoon festUn
+festooned festUnd
+fests fes
+fests fess
+fests fests
+festspielhaus festspElh?s
+festus fest@s
+fetal fEt@l
+fetch feC
+fetched feCt
+fetches feC@z
+fetching feC6N
+fete fAt
+feted fAt@d
+fetherolf feTP]lf
+fetherston feTPst~
+fetid fet@d
+fetish fet6S
+fetishism fet6Siz}
+fetishist fet6S@st
+fetishists fet6S@s
+fetishists fet6S@ss
+fetishists fet6S@sts
+fetner fetnP
+fetrow fetr]
+fetsch feC
+fetsko fetsk]
+fett fet
+fette fet
+fetter fetP
+fettered fetPd
+fetterhoff fetPh{f
+fetterly fetPl/
+fetterman fetPm~
+fetterolf fetP]lf
+fetters fetPz
+fettes fets
+fettig fet6g
+fetting fet6N
+fettuccine fet@CEn/
+fetty fet/
+fetus fEt@s
+fetuses fEt@s@z
+fetz fets
+fetzer fetsP
+feucht f<kt
+feud fyUd
+feudal fyUd@l
+feudalism fyUd@liz}
+feudalistic fyUd@list6k
+feuded fyUd@d
+feuding fyUd6N
+feuds fyUdz
+feuer fyUP
+feuerborn f<PbPn
+feuerman fyUPm~
+feuerstein fyUPstEn
+feuerstein fyUPstIn
+feulner f<lnP
+feur fV
+feustel f<st@l
+feutz fyUts
+fever fEvP
+fevered fEvPd
+feverfew fEvPfyU
+feverfews fEvPfyUz
+feverish fEvPiS
+feverishly fevPiSl/
+fevers fEvPz
+few fyU
+fewell fewcl
+fewer fyUP
+fewest fyU@st
+fey fA
+feyen fIn
+feynman fAnm~
+fez fez
+fi fE
+fi fI
+fiacco f/ok]
+fiala f/ol@
+fialkowski f/@lk{fsk/
+fiance f/onsA
+fiance fEonsA
+fiancee f/ans/
+fianna f/an@
+fiasco f/ask]
+fiascos f/ask]z
+fiat fIat
+fiat's fEats
+fiato f/at]
+fiato fyat]
+fiber fIbP
+fiber's fIbPz
+fiberboard fIbPb{rd
+fiberglas fIbPglas
+fiberglass fIbPglas
+fiberoptic fIbPopt6k
+fibers fIbPz
+fiberweb fIbPweb
+fibre fIbP
+fibreboard fIbPb{rd
+fibrile fIbril
+fibriles fIbrilz
+fibrillation fibr@lAS~
+fibrin fIbr~
+fibroid fIbr<d
+fibroids fIbr<dz
+fibronic f@bron6k
+fibronics f@bron6ks
+fibrosis fIbrOs@s
+fibrous fIbr@s
+fibula fiby@l@
+ficarra f/k)r@
+ficco fik]
+ficek fis6k
+fichera f/k,r@
+fichtel fiCtel
+fichter fiktP
+fichtner fiktnP
+fichus fiC@s
+fick fik
+ficke fik
+fickel fik@l
+ficken fik~
+ficker fikP
+fickes fiks
+fickett fik@t
+fickle fik@l
+fickleness fik@ln@s
+ficklin fiklin
+fickling fikl6N
+fico fEk]
+ficom fikom
+ficorca f6k{rk@
+fiction fikS~
+fictional fikS~@l
+fictionalize fikS~@lIz
+fictionalized fikS~@lIzd
+fictions fikS~z
+fictitious f6ktiS@s
+fidalgo f/dolg]
+fidata f@dot@
+fiddle fid@l
+fiddled fid@ld
+fiddler fid@lP
+fiddler fidlP
+fiddler's fid@lPz
+fiddler's fidlPz
+fiddlers fid@lPz
+fiddlers fidlPz
+fiddles fid@lz
+fiddling fidl6N
+fide fId
+fidel f@del
+fidel's f@delz
+fidelco f@delk]
+fidelcor fid@lk{r
+fidelia f@dEly@
+fidelities f@del@t/z
+fidelity f@del@t/
+fidelity fIdel@t/
+fidelity's f@del@t/z
+fidenas fidcn@s
+fides fIdz
+fidget fij@t
+fidgeting fij@t6N
+fidler fId@lP
+fido fId]
+fidora f@d{r@
+fidora's f@d{r@z
+fiduciaries f@dUS/er/z
+fiduciary f@dUS/er/
+fiebelkorn fEb@lkPn
+fieber fEbP
+fiebig fEb6g
+fiebiger fEb6gP
+fiechter fiktP
+fiedler fEdlP
+fiedler's fEdlPz
+fief fEf
+fiefdom fEfd}
+fiefdoms fEfd}z
+fiegel fEg@l
+fieger fEgP
+fieger's fEgPz
+fiel fEl
+field fEld
+field's fEldz
+fieldcrest fEldkrest
+fielded fEld@d
+fielden fEld~
+fielder fEldP
+fielder's fEldPz
+fielders fEldPz
+fieldhouse fEldh?s
+fielding fEld6N
+fields fEldz
+fields' fEldz
+fieldwork fEldwVk
+fiend fEnd
+fiendish fEndiS
+fiends fEndz
+fiene fEn
+fiennes f/encs
+fiennes fyencs
+fier fir
+fierce firs
+fiercely firsl/
+fiercer firsP
+fiercest firs@st
+fierman firm~
+fiero fEr]
+fieros f/,r]s
+fierro fir]
+fierros fir]z
+fiers fErz
+fierst fErst
+fierstein fErstEn
+fierstein fErstIn
+fiery fIP/
+fieser fEsP
+fiest fE@st
+fiesta f/est@
+fife fIf
+fifer fIfP
+fifi fEf/
+fifield fif/ld
+fifteen fiftEn
+fifteen fiftEn
+fifteen's fiftEnz
+fifteens fiftEnz
+fifteenth fiftEnT
+fifth fiT
+fifth fifT
+fifths fifTs
+fifths fifs
+fifties fift/z
+fiftieth fift/@T
+fifty fift/
+fifty's fift/z
+fig fig
+figallo f6gol]
+figaro figPO
+figaroa figPO@
+figaroa's figPO@z
+figel fig@l
+figg fig
+figge fig
+figgie fig/
+figgie's fig/z
+figgins figinz
+figgs figz
+fight fIt
+fight's fItz
+fighter fItP
+fighter's fItPz
+fighters fItPz
+fighters' fItPz
+fightin' fIt~
+fighting fIt6N
+fighting's fIt6Nz
+fightings fIt6Nz
+fightmaster fItmastP
+fights fIts
+figler fIg@lP
+figler figlP
+figley figl/
+figment figm~t
+figments figm~ts
+figone fig~
+figs figz
+figueira f/g,r@
+figueiredo f/gPAd]
+figueras f/g,roz
+figueredo f/gcrAd]
+figueroa f/gcrO@
+figura f/gqr@
+figuration figyPAS~
+figurative figyP@t6v
+figuratively f6gyqr@t6vl/
+figure figyP
+figure's figyPz
+figured figyPd
+figurehead figyPhed
+figures figyPz
+figurine figyPEn
+figurines figyPEnz
+figuring figyP6N
+figurski f6gVsk/
+fiji fEj/
+fiji's fEj/z
+fijian fEj/~
+fijians fij/~z
+fike fIk
+fikes fIks
+fil fil
+fila fIl@
+filament fil}~t
+filaments fil}~ts
+filbert filbPt
+filbert's filbPts
+filberts filbPts
+filby filb/
+filch filC
+filched filCt
+fildes fildz
+file fIl
+filed fIld
+filegate fIlgAt
+filene f@lEn
+filene's f@lEnz
+filenet fIlnet
+filer fIlP
+filers fIlPz
+files fIlz
+filet f@lA
+filets f@lAz
+filial fil/@l
+filibuster fil@bustP
+filibustered fil@bustPd
+filibustering fil@bustP6N
+filibusters fil@bustPz
+filice fElis
+filigree fil@grE
+filigrees fil@grEz
+filing fIl6N
+filings fIl6Nz
+filinski f@linsk/
+filion fily~
+filip filip
+filipa f/lEp@
+filipek fil@p6k
+filipiak f@lip/ak
+filipino fil@pEn]
+filipinos fil@pEn]z
+filipkowski fil@pk{fsk/
+filipovic fil@pOv6k
+filipowicz f@lip@v6C
+filippelli f/l/pel/
+filippello fEl@pel]
+filippi f@lip/
+filippini f/l/pEn/
+filippo f@lEp]
+filippone fil@pOn
+filipski f@lipsk/
+filkins filk~z
+fill fil
+fill-a-buster fil@bustP
+filla fil@
+fillauer fil?P
+filled fild
+filler filP
+fillers filPz
+fillet f@lA
+filleted f@lAd
+filleted fil@t@d
+fillets fil@ts
+filley fil/
+fillies fil/z
+filling fil6N
+fillingame f/l6Ngom/
+fillinger fil6NP
+fillingham fil6Nham
+fillingim fil6Ngim
+fillings fil6Nz
+fillion fily~
+fillip fil@p
+fillman film~
+fillmore film{r
+fills filz
+filly fil/
+film film
+film's filmz
+filma film@
+filmed filmd
+filmer filmP
+filming film6N
+filmless filml@s
+filmmaker filmAkP
+filmmaker's filmAkPz
+filmmakers filmAkPz
+filmmaking filmAk6N
+filmore film{r
+films filmz
+filo fEl]
+filofax fIl]faks
+filofax fil]faks
+filomena fil}En@
+filosa f/lOs@
+filsinger fils6NP
+filson fils~
+filter filtP
+filtered filtPd
+filtering filtP6N
+filters filtPz
+filtertek filtPtek
+filth filT
+filthy filT/
+filtration f@ltrAS~
+filtrol filtrol
+filyaw filEov
+filyaw fily?
+fima fEm@
+fimbres fimbPz
+fin fin
+fina fIn@
+finagle f~Ag@l
+finagler f~AglP
+final fIn@l
+finalco f~alk]
+finale f~al/
+finalist fIn@l@st
+finalists fIn@l@s
+finalists fIn@l@ss
+finalists fIn@l@sts
+finality fInal@t/
+finalize fIn@lIz
+finalized fIn@lIzd
+finalizing fIn@lIz6N
+finally fIn@l/
+finals fIn@lz
+finamore fin}{r
+finan fin~
+finance fInans
+finance f~ans
+financed fInanst
+financed f~anst
+financement fInansm~t
+financement f~ansm~t
+financer fInansP
+financer f~ansP
+finances fInans@z
+finances f~ans@z
+financial fInanS@l
+financial f~anS@l
+financial's fInanS@lz
+financial's f~anS@lz
+financially fInanS@l/
+financially f~anS@l/
+financials fInanS@lz
+financials f~anS@lz
+financier fInansir
+financier fin~sir
+financiera f~ans/,r@
+financiere finansir
+financiero f~ans/,r]
+financiers fin~sirz
+financing fInans6N
+financing f~ans6N
+financings fInans6Nz
+financings f~ans6Nz
+financo f~aNk]
+finanz finanz
+finanza f~anz@
+finanziaria f~anz/,r/@
+finanziario f~anz/,r/]
+finarte finort
+finazzo f/noz]
+finberg finbPg
+fincannon finkan~
+fincannon fink~on
+finch finC
+fincham finC}
+fincher finCP
+finches finC@z
+finchum fink}
+finck fiNk
+fincke fiNk
+finckle fiNk@l
+find fInd
+finder fIndP
+finder's fIndPz
+finders fIndPz
+finding fInd6N
+findings fInd6Nz
+findlay findl/
+findler findlP
+findley findl/
+findling find@l6N
+finds fIndz
+fine fIn
+fineberg fInbPg
+fined fInd
+finefrock fInfrok
+finegan fin6gan
+finegold fIngOld
+finella f~el@
+finelli f~el/
+finely fInl/
+fineman fInm~
+finer fInP
+fineran finPan
+finerty finPt/
+finery fInP/
+fines fInz
+finesse f~es
+finessed f~est
+finest fIn@st
+finestone fInstOn
+finevest fInvest
+finex fineks
+finfrock finfrok
+finger fiNgP
+fingerboard fiNgPb{rd
+fingered fiNgPd
+fingerhut fiNgPhut
+fingering fiNgP6N
+fingernail fiNgPnAl
+fingernails fiNgPnAlz
+fingerpaint fiNgPpAnt
+fingerpainted fiNgPpAn@d
+fingerpainted fiNgPpAnt@d
+fingerpointing fiNgPp<nt6N
+fingerprint fiNgPprint
+fingerprinted fiNgPprint@d
+fingerprinting fiNgPprint6N
+fingerprints fiNgPprints
+fingers fiNgPz
+fingertip fiNgPtip
+fingertips fiNgPtips
+fini fEn/
+finian fin/~
+finian's fin/~z
+finicky fin@k/
+finigan fin6g~
+fining fIn6N
+fininvest fininvest
+fininvest's fininvests
+finish fin6S
+finished fin6St
+finisher fin6SP
+finishers fin6SPz
+finishes fin6S@z
+finishing fin6S6N
+finite fInIt
+fink fiNk
+fink's fiNks
+finkbeiner fiNkbInP
+finkbiner fiNkbInP
+finke fiNk
+finkel fiNk@l
+finkelman fiNk@lm~
+finkelson fiNk@ls~
+finkelstein fiNk@lstEn
+finkelstein fiNk@lstIn
+finkelstein's fiNk@lstEnz
+finkelstein's fiNk@lstInz
+finken fiNk~
+finkenbinder fiNk~bIndP
+finkielstain fiNkElst~
+finkle fiNk@l
+finklea fiNkl/@
+finkler fiNklP
+finkley fiNkl/
+finks fiNks
+finland finland
+finland finl~d
+finland's finl~dz
+finlandization finland@zAS~
+finlay finl/
+finlayson finl/s~
+finlets finl@ts
+finley finl/
+finley's finl/z
+finmeccanica finm@kan6k@
+finn fin
+finn's finz
+finnair fincr
+finnan fin~
+finne fin
+finnegan fin@g~
+finnell fin@l
+finneran finPan
+finnerty finPt/
+finney fin/
+finnick fin6k
+finnicum fin6k}
+finnie fin/
+finnigan fin6g~
+finning fin6N
+finnish finiS
+finns finz
+fino fEn]
+finocchiaro f/n]k/)r]
+finocchio f/nOk/]
+fins finz
+finscher finSP
+finsider finsIdP
+finsider's finsIdPz
+finstad finst@d
+finster finstP
+finstrom finstr}
+finton fint~
+finucane fin@kAn
+finzel finz@l
+fiola f/Ol@
+fiona f/On@
+fioravanti f/{rovont/
+fiore f/{r/
+fiorella f/{rel@
+fiorelli f/{rel/
+fiorello f/{rel]
+fiorentino f/{rcntEn]
+fiorenza f/{renz@
+fioretti f/{ret/
+fiori f/{r/
+fiorillo f/{ril]
+fiorina f/{rEn@
+fiorini f/{rEn/
+fiorino f/{rEn]
+fiorito f/{rEt]
+fiorucci f/{rUC/
+fipple fip@l
+fipps fips
+fir fV
+fire fIP
+fire fIr
+fire's fIPz
+firearm fIPorm
+firearm fIrorm
+firearms fIPormz
+firearms fIrormz
+fireball fIPb{l
+fireball fIrb{l
+fireballs fIPb{lz
+fireballs fIrb{lz
+firebaugh fIrb{
+firebird fIPbVd
+firebirds fIPbVdz
+firebomb fIPbom
+firebomb fIrbom
+firebombed fIrbomd
+firebombing fIPbom6N
+firebombs fIrbomz
+firebrand fIPbrand
+firebrands fIPbrandz
+firebrick fIPbrik
+firebug fIPbug
+firebush fIPbqS
+firebush's fIrbqS@z
+firecracker fIPkrakP
+firecrackers fIPkrakPz
+fired fIPd
+firedamp fIPdamp
+firefight fIrfIt
+firefighter fIrfItP
+firefighters fIPfItPz
+firefighting fIrfIt6N
+firefights fIrfIts
+fireflies fIPflIz
+firefly fIPflI
+firehouse fIPh?s
+firehouses fIPh?s@z
+fireman fIrm~
+fireman's fIrm~z
+firemen fIrm~
+firenza f6renz@
+firenzas fPenz@z
+fireplace fIPplAs
+fireplaces fIPplAs@z
+fireplaces fIrplAs@z
+firepower fIrp?P
+fireproof fIPprUf
+fireproofing fIPprUf6N
+fires fIPz
+fires fIrz
+fireside fIPsId
+firesign fIPsIn
+firesign's fIPsInz
+firestine fIrstEn/
+firestone fIrstOn
+firestone's fIrstOnz
+firestorm fIrst{rm
+firewall fIrwol
+fireweed fIPwEd
+firewood fIPwqd
+firewood fIrwqd
+firework fIrwVk
+fireworks fIrwVks
+firfer fVfP
+firing fIPr6N
+firing fIr6N
+firings fIPr6Nz
+firings fIr6Nz
+firino f6rEn]
+firkins fVkinz
+firkus fVk@s
+firm fVm
+firm's fVmz
+firma fVm@
+firman fVm~
+firmans fVm~z
+firmed fVmd
+firmer fVmP
+firmest fVm@st
+firmin fVmin
+firming fVm6N
+firmly fVml/
+firmness fVmn@s
+firms fVmz
+firms' fVmz
+firpo firp]
+firs fVz
+first fVst
+first's fVsts
+firstar fVstor
+firstborn fVstb{rn
+firstfed fVstfed
+firsthand fPshand
+firsthand fPsthand
+firsthand fVshand
+firsthand fVsthand
+firstier fVst/P
+firstier fVstyP
+firstly fVstl/
+firsts fVs
+firsts fVss
+firsts fVsts
+firstsouth fVsts?T
+firth fVT
+firzite fVzIt
+fis fis
+fisc fisk
+fiscal fisk@l
+fiscally fisk@l/
+fisch fiS
+fischbach fiSbok
+fischbach's fiSboks
+fischbein fiSbIn
+fischel fiS@l
+fischer fiSP
+fischer's fiSPz
+fischetti f/sket/
+fischl fisk@l
+fischler fiS@lP
+fischman fiSm~
+fiscus fisk@s
+fiser fIzP
+fiserv fisPv
+fisette f@set
+fish fiS
+fish's fiS@z
+fishbach fiSbuk
+fishback fiSbak
+fishbaine fiSbAn
+fishbaugh fiSb{
+fishbeck fiSbek
+fishbein fiSbIn
+fishbowl fiSbOl
+fishburn fiSbVn
+fishburne fiSbPn
+fisheater fiSEtP
+fisheaters fiSEtPz
+fished fiSt
+fishel fiS@l
+fishell fiS@l
+fisher fiSP
+fisher's fiSPz
+fisheries fiSP/z
+fisherman fiSPman
+fisherman fiSPm~
+fisherman's fiSPm~z
+fishermen fiSPmcn
+fishers fiSPz
+fishery fiSP/
+fishes fiS@z
+fishing fiS6N
+fishkill fiSkil
+fishkin fiSkin
+fishlow fiSlO
+fishman fiSman
+fishman fiSm~
+fishmonger fiSmoNgP
+fishy fiS/
+fisk fisk
+fisk's fisks
+fiske fisk
+fiske's fisks
+fisler fis@lP
+fisons fIz~z
+fiss fis
+fissel fis@l
+fissell fis@l
+fissile fis@l
+fission fiS~
+fissionable fiS~@b@l
+fissure fiSP
+fissured fiSPd
+fissures fiSPz
+fist fist
+fisted fist@d
+fister fistP
+fistful fistf@l
+fisticuff fist6kuf
+fisticuffs fist6kufs
+fists fists
+fit fit
+fitak fitak
+fitch fiC
+fitchburg fiCbPg
+fitchett fiC@t
+fite fIt
+fites fIts
+fitful fitf@l
+fitfully fitf@l/
+fithe fiT
+fithian fiT/~
+fitness fitn@s
+fits fits
+fitswater fitsw{tP
+fitt fit
+fitted fit@d
+fitter fitP
+fitterer fitPP
+fittest fit@st
+fitting fit6N
+fittingly fit6Nl/
+fittings fit6Nz
+fittipaldi fit@pold/
+fitton fit~
+fittro fitr]
+fitts fits
+fitz fits
+fitzco fitsk]
+fitzer fitsP
+fitzgerald fitsj,r@ld
+fitzgerald's fitsj,r@ldz
+fitzgibbon fitsjib~
+fitzgibbons fitsjib~z
+fitzharris fitshar@s
+fitzhenry fitshenP/
+fitzhugh fitshyU
+fitzmaurice fitsm{r@s
+fitzmorris fitsm{r@s
+fitzner fitsnP
+fitzpatrick fitspatr6k
+fitzroy fitsr<
+fitzsimmons fitsim~z
+fitzsimons fitsim~z
+fitzwater fitsw{tP
+fitzwater's fitsw{tPz
+fitzwilliam fitswily}
+fiumara fEUm)r@
+five fIv
+five's fIvz
+fiveash fIvaS
+fivecoat fIvkOt
+fivefold fIvfOld
+fives fIvz
+fix fiks
+fixable fiks@b@l
+fixate fiksAt
+fixated fiksAt@d
+fixation f6ksAS~
+fixative fiks@t6v
+fixatives fiks@t6vz
+fixed fikst
+fixer fiksP
+fixes fiks@z
+fixing fiks6N
+fixings fiks6Nz
+fixler fikslP
+fixture fiksCP
+fixtures fiksCPz
+fizer fIzP
+fizz fiz
+fizzle fiz@l
+fizzled fiz@ld
+fizzles fiz@lz
+fizzling fiz@l6N
+fizzling fizl6N
+fjeld fyeld
+fjelstad fyelst@d
+fjord fy{rd
+fjords fy{rdz
+flab flab
+flabbergast flabPgast
+flabbergasted flabPgast@d
+flabby flab/
+flaccid flaks@d
+flach flaC
+flack flak
+flad flad
+flag flag
+flagella fl@jel@
+flagellate flaj@lAt
+flagellated flaj@lAt@d
+flagellum fl@jel}
+flageolet flaj@let
+flagg flag
+flagged flagd
+flagging flag6N
+flagler flaglP
+flagpole flagpOl
+flagpoles flagpOlz
+flagrant flAgr~t
+flagrantly flAgr~tl/
+flags flagz
+flagship flagSip
+flagships flagSips
+flagstaff flagstaf
+flagstar flagstor
+flagstone flagstOn
+flaharty fl,rt/
+flaherty fl,rt/
+flahive flah6v
+flaig flAg
+flail flAl
+flailing flAl6N
+flaim flAm
+flair fl,r
+flak flak
+flake flAk
+flakes flAks
+flaking flAk6N
+flaky flAk/
+flam flam
+flamboyance flamb<~s
+flamboyant flamb<~t
+flamboyantly flamb<~tl/
+flame flAm
+flamed flAmd
+flamemaster flAmastP
+flamenco fl}eNkO
+flamer flAmP
+flames flAmz
+flaming flAm6N
+flamingo fl}iNg]
+flamingos fl}iNg]z
+flaminian fl}in/~
+flamm flam
+flammability flam@bil@t/
+flammable flam@b@l
+flammang flam@N
+flammer flamP
+flammia flam/@
+flamson flams~
+flan flan
+flanagan flan@g~
+flanagin flan@gin
+flanary flanP/
+flanders flandPz
+flanery flAnP/
+flange flanj
+flanges flanj@z
+flanigan flan6g~
+flanigan's flan6g~z
+flank flaNk
+flanked flaNkt
+flanking flaNk6N
+flanks flaNks
+flann flan
+flanna flan@
+flannagan flan@g~
+flannel flan@l
+flanneled flan@ld
+flannels flan@lz
+flannery flanP/
+flannigan flan6g~
+flansburg flansbPg
+flap flap
+flaplike flaplIk
+flapped flapt
+flapper flapP
+flappers flapPz
+flapping flap6N
+flaps flaps
+flare fl,r
+flared fl,rd
+flares fl,rz
+flaring fl,r6N
+flasch flaS
+flash flaS
+flash's flaS@z
+flashback flaSbak
+flashbacks flaSbaks
+flashbulb flaSb@lb
+flashdance flaSdans
+flashed flaSt
+flasher flaSP
+flasher's flaSPz
+flashers flaSPz
+flashes flaS@z
+flashier flaS/P
+flashing flaS6N
+flashlight flaSlIt
+flashlights flaSlIts
+flashpoint flaSp<nt
+flashpoints flaSp<nts
+flashy flaS/
+flask flask
+flasks flasks
+flat flat
+flatau flat?
+flatbed flatbed
+flatboat flatbOt
+flatbush flatbqS
+flaten flat~
+flater flAtP
+flatfish flatfiS
+flatfishes flatfiS@z
+flath flaT
+flathead flathed
+flatheads flathedz
+flathers flaTPz
+flatland flatland
+flatlands flatlandz
+flatley flatl/
+flatly flatl/
+flatness flatn@s
+flats flats
+flatt flat
+flatten flat~
+flattened flat~d
+flattening flatn6N
+flattening flat~6N
+flatter flatP
+flattered flatPd
+flattering flatP6N
+flattery flatP/
+flattish flatiS
+flatulent flaC@l~t
+flatware flatwer
+flatworm flatwPm
+flaubert fl?bPt
+flaugh fl{
+flaugher fl{P
+flaum fl{m
+flaunt fl{nt
+flaunted fl{nt@d
+flaunting fl{nt6N
+flaunts fl{nts
+flavell flav@l
+flavia flav/@
+flavier flAvyP
+flavier flavyP
+flavin flAvin
+flavio flov/]
+flavius flAv/@s
+flavor flAvP
+flavored flAvPd
+flavorful flAvPf@l
+flavoring flAvP6N
+flavorings flAvP6Nz
+flavorist flAvPist
+flavorists flAvPis
+flavorists flAvPiss
+flavorists flAvPists
+flavors flAvPz
+flaw fl{
+flawed fl{d
+flawless fl{l@s
+flawlessly fl{l@sl/
+flawn fl{n
+flaws fl{z
+flax flaks
+flaxman flaksm~
+flaxseed flaksEd
+flay flA
+flayed flAd
+flea flE
+fleagle flEg@l
+fleas flEz
+fleck flek
+fleckenstein flek~stEn
+fleckenstein flek~stIn
+flecks fleks
+fled fled
+fledermaus fledPm?s
+fledge flej
+fledged flejd
+fledging flej6N
+fledgling flejl6N
+flee flE
+fleece flEs
+fleeced flEst
+fleecy flEs/
+fleeger flEgP
+fleeing flE6N
+fleek flEk
+fleeman flEm~
+fleener flEnP
+fleenor flEnP
+fleer flir
+flees flEz
+fleet flEt
+fleet's flEts
+fleeting flEt6N
+fleetingly flEt6Nl/
+fleets flEts
+fleetwood flEtwqd
+flegal flEg@l
+flegel fleg@l
+fleharty flehort/
+fleig flEg
+fleisch flIS
+fleischauer flIS?P
+fleischer flISP
+fleischhacker flISh@kP
+fleischman flISm~
+fleischmann flISm~
+fleisher flISP
+fleishman flISm~
+fleiss flIS
+fleiss' flIS
+fleiss's flIS@z
+fleissner flIsnP
+fleitas flIt@s
+fleming flem6N
+fleming's flem6Nz
+flemings flem6Nz
+flemington flem6Nt~
+flemish flemiS
+flemister flem@stP
+flemmer flemP
+flemming flem6N
+flemons flem~z
+flener flEnP
+flenner flenP
+flenniken flen6k~
+flesch fleS
+flesh fleS
+fleshed fleSt
+flesher fleSP
+fleshman fleSm~
+fleshy fleS/
+flesner flesnP
+flessner flesnP
+fleta flEt@
+fletchall fleC@l
+fletcher fleCP
+flett flet
+fleur flV
+fleurette flPet
+fleuri flVr/
+fleuri flqr/
+fleury flqr/
+flew flU
+flewellen flUel~
+flewelling flUel6N
+flex fleks
+flexed flekst
+flexer fleksP
+flexes fleks@z
+flexi fleks/
+flexibility fleks@bil@t/
+flexible fleks@b@l
+flexibly fleks@bl/
+flexing fleks6N
+flexion flekS~
+flexnor fleksn{r
+flextime flekstIm
+flextronic flekstron6k
+flextronics flekstron6ks
+flicek fliCck
+flick flik
+flicker flikP
+flickered flikPd
+flickering flikP6N
+flickers flikPz
+flicking flik6N
+flickinger flik6NP
+flicks fliks
+flied flId
+fliegel flEg@l
+flier flIP
+fliers flIPz
+flies flIz
+flight flIt
+flight's flIts
+flightless flItl@s
+flights flIts
+flightsafety flItsAft/
+flighty flIt/
+flim flim
+flimflam flimflam
+flimsiest flimz/@st
+flimsy flimz/
+flinch flinC
+flinchbaugh flinCb{
+flinched flinCt
+flinching flinC6N
+flinchum flink}
+flinders flindPz
+fling fliN
+flinging fliN6N
+flings fliNz
+flink fliNk
+flinn flin
+flinner flinP
+flint flint
+flint's flints
+flintlock flintlok
+flintlocks flintloks
+flintoff flint{f
+flints flints
+flintstone flintstOn
+flintstones flintstOnz
+flinty flint/
+flip flip
+flippant flip~t
+flipped flipt
+flippen flip~
+flipper flipP
+flippers flipPz
+flippin flipin
+flipping flip6N
+flippo flip]
+flips flips
+flirt flVt
+flirtation flPtAS~
+flirtations flPtAS~z
+flirtatious flPtAS@s
+flirted flVt@d
+flirting flVt6N
+flirts flVts
+flis flis
+fliss flis
+flit flit
+flitting flit6N
+flo flO
+float flOt
+floated flOt@d
+floater flOtP
+floaters flOtPz
+floating flOt6N
+floats flOts
+floc flok
+flock flok
+flocked flokt
+flockhart flokhort
+flocking flok6N
+flocks floks
+flodin flOdin
+floe flO
+floersheim fl{rSIm
+flog flog
+flogging flog6N
+flohr fl)r
+floirenda fl<rend@
+flom flom
+flonorial flon{r/@l
+flood flud
+flooded flud@d
+floodgate fludgAt
+floodgates fludgAts
+flooding flud6N
+floodlight fludlIt
+floodlights fludlIts
+floodplain fludplAn
+floods fludz
+floodwater fludw{tP
+floodwaters fludw{tPz
+flook flqk
+floor fl{r
+floorboard fl{rb{rd
+floorboards fl{rb{rdz
+floored fl{rd
+flooring fl{r6N
+floors fl{rz
+flop flop
+flopped flopt
+flopping flop6N
+floppy flop/
+flops flops
+floptical flopt6k@l
+flor fl{r
+flora fl{r@
+florafax fl{r@faks
+floral fl{r@l
+florally fl{r@l/
+florance fl{r~s
+flore fl{r
+florea fl{r/@
+florek fl{r6k
+floren fl{r~
+florence fl{r~s
+florence's fl{r~s@z
+florentina fl{rcntEn@
+florentine fl{r~tEn
+florentino fl{rcntEn]
+florer fl{rP
+flores fl{rez
+florescue fl{r@skyU
+floresheim fl{rSIm
+florey fl{r/
+florez fl{rez
+flori fl{r/
+floria fl{r/@
+florian fl{r/~
+florid fl{r@d
+florida fl{r@d@
+florida's fl{r@d@z
+floridabanc fl{r@d@baNk
+floridian fl{rid/~
+floridians fl{rid/~z
+florin fl{rin
+florinda fl{rEnd@
+florine fl{rEn/
+florio fl{r/]
+florio's fl{r/]z
+floris fl{ris
+florist fl)r@st
+florists fl{r@s
+florists fl{r@ss
+florists fl{r@sts
+floro fl{r]
+florrie fl{r/
+florry fl{r/
+florsheim fl{rSIm
+flory fl{r/
+floss flos
+flossie fl{s/
+flotation fl]tAS~
+flotilla fl]til@
+flotow flot?
+flotsam flots}
+flott flot
+flotta flotu
+flounce fl?ns
+flounces fl?ns@z
+flounder fl?ndP
+floundered fl?ndPd
+floundering fl?ndP6N
+flounders fl?ndPz
+flour fl?P
+flour fl?r
+flourish flV6S
+flourished flV6St
+flourishes flV6S@z
+flourishing flV6S6N
+flournoy flqrn<
+flours fl?Pz
+flout fl?t
+flouted fl?t@d
+flouting fl?t6N
+flow flO
+flowe flO
+flowed flOd
+flower fl?P
+flowered fl?Pd
+flowering fl?P6N
+flowerpot fl?Ppot
+flowers fl?Pz
+flowers' fl?Pz
+flowery fl?P/
+flowing flO6N
+flown flOn
+flows flOz
+flowton flOt~
+floy fl<
+floyd fl<d
+flu flU
+flubs flubz
+fluck fluk
+fluctuate flukC@wAt
+fluctuated flukC@wAt@d
+fluctuates flukCUAts
+fluctuating flukC@wAt6N
+fluctuation flukCUAS~
+fluctuations flukCUAS~z
+flud flud
+fludd flud
+flue flU
+fluegel flqg@l
+fluegge flUg
+fluency flU~s/
+fluent flU~t
+fluently flU~tl/
+fluet flUt
+fluff fluf
+fluffed fluft
+fluffier fluf/P
+fluffs flufs
+fluffy fluf/
+fluharty fluPt/
+fluhr flV
+fluhr flqr
+fluid flU@d
+fluidity flUid@t/
+fluids flU@dz
+fluitt flU@t
+fluke flUk
+fluker flUkP
+flukes flUks
+flulike flUlIk
+flume flUm
+flumenbaum flUm~b?m
+flumes flUmz
+flummox fl}{ks
+flummoxed fl}{kst
+flung fluN
+flunk fluNk
+flunked fluNkt
+flunking fluNk6N
+flunks fluNks
+fluor flUP
+fluor's flUPz
+fluoresce flqres
+fluoresce fl{res
+fluorescent flqres~t
+fluorescent fl{res~t
+fluorescently flqres~tl/
+fluorescently fl{res~tl/
+fluorescents flqres~ts
+fluorescents fl{res~ts
+fluoridation flqr@dAS~
+fluoridation fl{r@dAS~
+fluoride flqrId
+fluoride fl{rId
+fluorides flqrIdz
+fluorides fl{rIdz
+fluorine flqrEn
+fluorine fl{rEn
+fluorite flqrIt
+fluorite fl{rIt
+fluorocarbon flqr]k)rb~
+fluorocarbon fl{r]k)rb~
+fluorocarbons flqr]k)rb~z
+fluorocarbons fl{r]k)rb~z
+fluorometer flqrom@tP
+fluorometer fl{rom@tP
+fluorspar flqrspor
+fluorspar fl{rspor
+flurried flV/d
+flurries flV/z
+flurry flV/
+flury flUr/
+flury flV/
+flus flUz
+flush fluS
+flushed fluSt
+flushes fluS@z
+flushing fluS6N
+fluster flustP
+flustered flustPd
+flute flUt
+flutes flUts
+flutist flUtist
+flutter flutP
+fluttered flutPd
+fluttering flutP6N
+flutters flutPz
+fluty flUt/
+fluvial flUv/@l
+flux fluks
+fluxional flukS~@l
+fly flI
+flyby flIbI
+flycatcher flIkaCP
+flye flI
+flyer flIP
+flyers flIPz
+flying flI6N
+flynn flin
+flynt flint
+flypaper flIpApP
+flythe flIT
+flytrap flItrap
+flyway flIwA
+flywheel flIwEl
+fm efem
+foal fOl
+foale fOl
+foaling fOl6N
+foam fOm
+foaming fOm6N
+foams fOmz
+foamy fOm/
+foard f{rd
+fob f{b
+fobbs fobz
+fobel fOb@l
+fobel's fOb@lz
+fobes fObz
+focal fOk@l
+focht fokt
+fochtman foktm~
+fockler foklP
+focus fOk@s
+focused fOk@st
+focuses fOk@s@z
+focusing fOk@s6N
+focussed fOk@st
+fodder fodP
+fodera f]d,r@
+fodor fOdP
+foe fO
+foehlich fOl6C
+foell fEl
+foeller fOlP
+foerster f{rstP
+foertsch f{rC
+foes fOz
+fog fog
+fogal fOj@l
+fogarty fOgort/
+fogarty fogort/
+fogel fOg@l
+fogelberg fOg@lbPg
+fogelman fOg@lm~
+fogelson fOg@ls~
+fogerty fojPt/
+fogg fog
+foggiest fog/@st
+foggy fog/
+fogle fOg@l
+fogleman fOg@lm~
+fogler fOg@lP
+fogler fOglP
+foglesong fog@ls{N
+foglia fogl/@
+foglio fogl/]
+fogt fogt
+fogy fOg/
+fohl fOl
+foia efOIA
+foia fOy@
+foible f<b@l
+foibles f<b@lz
+foie f<
+foil f<l
+foiled f<ld
+foiles foIlz
+foiling f<l6N
+foils f<lz
+foist f<st
+foisted f<st@d
+foister f<stP
+foisy f<z/
+fojtik foyt6k
+fokker fokP
+folan fOl~
+foland fOl~d
+folck fOlk
+fold fOld
+folded fOld@d
+folden fOld~
+folder fOldP
+folders fOldPz
+folding fOld6N
+folds fOldz
+foley fOl/
+foley's fOl/z
+folger fOljP
+folger's fOljPz
+folgers fOljPz
+folha fOlh@
+foliage fOl/6j
+foliage fOl6j
+foliate fOl/At
+foliation fOl/AS~
+folic fol6k
+folino f]lEn]
+folk fOk
+folker fOkP
+folkers fOkPz
+folkert fOkPt
+folkerts fOkPts
+folkes fOks
+folkish fOk6S
+folklore fOkl{r
+folkman fOkm~
+folkrock fOkrok
+folks fOks
+folks' fOks
+folkstone fOkstOn
+folkstone's fOkstOnz
+folksy fOks/
+folktale fOktAl
+folkway fOkwA
+folkways fOkwAz
+folland fol~d
+follett fol@t
+follette folet
+folley fol/
+folliard folyPd
+follicle fol@k@l
+follicles fol@k@lz
+follies fol/z
+follin folin
+follis folis
+follman folm~
+follmer folmP
+follow fol]
+followed fol]d
+followell fol@wcl
+follower fol]P
+followers fol]Pz
+following fol]6N
+followings fol]6Nz
+follows fol]z
+followup fol]up
+folly fol/
+folmar fOlmP
+folmer fOlmP
+folse fOls
+folsom fOls}
+folson fOls~
+folta fOlt@
+foltene f]ltEn
+folts fOlts
+foltz fOlts
+folwell fOlwel
+folz fOlz
+fomby fomb/
+foment fOmcnt
+fomented fOmcnt@d
+fomenting fOmcnt6N
+fomento fOment]
+fomon fOm~
+fomon's fOm~z
+fonar fonP
+foncier fonsyP
+fond fond
+fonda fond@
+fonda's fond@z
+fonder fondP
+fondest fond@st
+fondiaria fond/,r/@
+fondkommission fondk}iS~
+fondle f{nd@l
+fondled f{nd@ld
+fondling fond@l6N
+fondling fondl6N
+fondly fondl/
+fondness fondn@s
+fondren fondP~
+fondue fondU
+fondue fondyU
+fondues fondUz
+fone fOn
+foner fOnP
+fones fOnz
+fong f{N
+fonger f{NP
+fonner fonP
+fons fonz
+fonseca f]nsek@
+font font
+fontaine f{ntAn
+fontana f{ntan@
+fontanella font~el@
+fontanez f]ntoncz
+fontanilla font~il@
+fonte font
+fontenette font~ct
+fontenot font~@t
+fontes fOntcs
+fonts fonts
+fonville fOnvil
+foo fU
+food fUd
+food's fUdz
+foodarama fUdPam@
+foodmaker fUdmAkP
+foodmaker's fUdmAkPz
+foods fUdz
+foods' fUdz
+foodservice fUdsPv@s
+foodstuff fUdstuf
+foodstuffs fUdstufs
+foodtown fUdt?n
+foodway fUdwA
+foodways fUdwAz
+fooks fqks
+fool fUl
+fool's fUlz
+fooled fUld
+foolery fUlP/
+foolhardy fUlhord/
+fooling fUl6N
+foolish fUliS
+foolishly fUliSl/
+foolishness fUliSn@s
+foolproof fUlprUf
+fools fUlz
+foong fUN
+foor fqr
+foos fUz
+foose fUs
+fooshee fUS/
+foot fqt
+footage fqt6j
+football fqtb{l
+football's fqtb{lz
+footballs fqtb{lz
+foote fqt
+foote's fqts
+footed fqt@d
+footer fqtP
+footfall fqtf{l
+foothill fqthil
+foothills fqthilz
+foothold fqthOld
+footholds fqthOldz
+footing fqt6N
+footlight fqtlIt
+footlights fqtlIts
+footloose fqtlUs
+footman fqtm~
+footnote fqtnOt
+footnoted fqtnOt@d
+footnotes fqtnOts
+footnoting fqtnOt6N
+footpath fqtpaT
+footprint fqtprint
+footprints fqtprints
+footrace fqtrAs
+footstep fqtstep
+footsteps fqtsteps
+footwall fqtw{l
+footware fqtwer
+footwear fqtwer
+footwork fqtwVk
+fop efOpE
+fop f{p
+foppiano f]p/on]
+for fP
+for frP
+for f{r
+fora f{r@
+forage f{r6j
+forages f{r@j@z
+foraging f{r6j6N
+foraker f{r@kP
+foramen fPAm~
+foran f{r~
+forand f{r~d
+foray f{rA
+forays f{rAz
+forbad fPbad
+forbade fPbAd
+forbearance f{rb,r~s
+forbes f{rbz
+forbes' f{rbz
+forbes's f{rbz@z
+forbeses f{rbz@z
+forbess f{rbes
+forbid fPbid
+forbid f{bid
+forbidden fPrbid~
+forbidden f{rb@d~
+forbidding fPbid6N
+forbidding f{bid6N
+forbids fPbidz
+forbids f{bidz
+forbis f{rbis
+forbus f{rb@s
+forbush f{rbqS
+force f{rs
+force's f{rs@z
+forced f{rst
+forceful f{rsf@l
+forcefully f{rsf@l/
+forcefulness f{rsf@ln@s
+forceps f{rscps
+forces f{rs@z
+forces' f{rs@z
+forcible f{rs@b@l
+forcibly f{rs@bl/
+forcier f{rk/P
+forcing f{rs6N
+forcum f{rk}
+ford f{rd
+ford's f{rdz
+forde f{rd
+fordham f{rd}
+fordice f{rdIs
+fordice f{rdis
+fords f{rdz
+fordyce f{rdIs
+fore f{r
+forearm f{r)rm
+forearm f{rorm
+forebear f{rber
+forebearance f{rb,r~s
+forebears f{rberz
+forebode f{rbOd
+foreboding f{rbOd6N
+forebrain f{rbrAn
+forecast f{rkast
+forecasted f{rkast@d
+forecaster f{rkastP
+forecasters f{rkastPz
+forecasting f{rkast6N
+forecasts f{rkas
+forecasts f{rkas
+forecasts f{rkass
+forecasts f{rkass
+forecasts f{rkasts
+forecasts f{rkasts
+foreclose f{rklOz
+foreclosed f{rklOzd
+forecloses f{rklOz@z
+foreclosing f{rklOz6N
+foreclosure f{rklOZP
+foreclosures f{rklOZPz
+foree f{rE
+forefather f{rfoTP
+forefathers f{rfoTPz
+forefinger f{rfiNgP
+forefingers f{rfiNgPz
+forefoot f{rfqt
+forefront f{rfrunt
+forego f{rgO
+foregoing f{rgO6N
+foregone f{rg{n
+foreground f{rgr?nd
+forehand f{rhand
+forehands f{rhandz
+forehead f{rhcd
+foreheads f{rhedz
+foreign f{r~
+foreigner f{rnP
+foreigner f{r~P
+foreigners f)rnPz
+foreigners f)r~Pz
+foreigners' f)rnPz
+foreigners' f)r~Pz
+forelimb f{rlim
+forelimbs f{rlimz
+foreman f{rm~
+foremen f{rm~
+foremost f{rmOst
+forensic fPens6k
+forensic f{rens6k
+forensically fPens6k@l/
+forensically fPens6kl/
+forensics fPens6ks
+forensics f{rens6ks
+foreperson f{rpPs~
+foreplay f{rplA
+forero f{r]
+forerunner f{runP
+forerunners f{runPz
+foresaw f{rs{
+foresee f{rsE
+foreseeable f{rsE@b@l
+foreseeing f{rsE6N
+foreseen f{rsEn
+foresees f{rsEz
+foreshadow f{rSad]
+foreshadowed f{rSad]d
+foreshadowing f{rSad]6N
+foreshadows f{rSad]z
+foresight f{rsIt
+foresman f{rsm~
+forest f{r@st
+forest's f{r@sts
+foresta f{rst@
+forestall f{rst{l
+forestalled f{rstold
+forestalling f{rstol6N
+forested f{r@st@d
+forester f{r@stP
+foresters f{r@stPz
+forestry f{r@str/
+forests f{r@s
+forests f{r@ss
+forests f{r@sts
+forestville f{rcstvil
+foret f{rct
+foret f{rt
+foretaste f{rtAst
+foretaste f{rtAst
+foretell f{rtel
+foretelling f{rtel6N
+forethought f{rT{t
+foretold f{rtOld
+forever fPevP
+forewarned f{rw{rnd
+forewing f{rwiN
+forewings f{rwiNz
+forewoman f{rwUm~
+foreword f{rwVd
+forex f{rcks
+forfeit f{rf@t
+forfeitable f{rf@t@b@l
+forfeited f{rf@t@d
+forfeiting f{rf@t6N
+forfeiture f{rf@CP
+forfeitures f{rf@CPz
+forgave fPgAv
+forge f{rj
+forged f{rjd
+forger f{rjP
+forgeries f{rjP/z
+forgers f{rjPz
+forgery f{rjP/
+forges f{rj@z
+forget fPget
+forget f{rget
+forgetful fPgetf@l
+forgetful f{rgetf@l
+forgets fPgets
+forgets f{rgets
+forgettable fPget@b@l
+forgettable f{rget@b@l
+forgette fPZet
+forgetting fPget6N
+forgetting f{rget6N
+forgey f{rj/
+forgie f{rj/
+forging f{rj6N
+forgings f{j6Nz
+forgione f{rjOn/
+forgivable fPgiv@b@l
+forgivable f{rgiv@b@l
+forgive fPgiv
+forgive f{rgiv
+forgiven fPgiv~
+forgiven f{rgiv~
+forgiveness fPgivn@s
+forgiveness f{rgivn@s
+forgives fPgivz
+forgives f{rgivz
+forgiving fPgiv6N
+forgiving f{rgiv6N
+forgo f{rgO
+forgoes f{rgOz
+forgoing f{rgO6N
+forgone f{rgon
+forgot fPgot
+forgot f{rgot
+forgotten fPgot~
+forgotten f{rgot~
+forgue f{rg
+forgy f{rj/
+forhan f{rh~
+forie f{r/
+forin f{rin
+forinash f{r~aS
+forint f{rint
+forints f{rints
+forister f{r@stP
+fork f{rk
+fork-lift f{rkl6ft
+forked f{rkt
+forker f{rkP
+forkey f{rkE
+forking f{rk6N
+forklift f{rklift
+forklifts f{rklifts
+forkner f{rknP
+forks f{rks
+forlenza f{rlenz@
+forlorn fPl{rn
+form f{rm
+forma f{rm@
+formal f{rm@l
+formaldehyde fPmald@hId
+formaldehyde f{rmald@hId
+formalism f{rm@liz}
+formalist f{rm@l@st
+formalities f{rmal@t/z
+formality f{rmal@t/
+formalization f{rm@l@zAS~
+formalize f{rm@lIz
+formalized f{rm@lIzd
+formalizes f{rm@lIz@z
+formalizing f{rm@lIz6N
+formally f{rm@l/
+forman f{rman
+formanek f{rm~6k
+formant f{rm~t
+formants f{rm~ts
+format f{rmat
+formation f{rmAS~
+formations f{rmAS~z
+formative f{rm@t6v
+formato f{rmot]
+formats f{rmats
+formbey f{rmb/
+formby f{rmb/
+formed f{rmd
+former f{rmP
+formerly f{rmPl/
+formic f{rm6k
+formica fPmIk@
+formica f{rmIk@
+formica's fPmIk@z
+formica's f{rmIk@z
+formidable f{rmid@b@l
+formidably f{rm@d@bl/
+forming f{rm6N
+formosa f{rmOs@
+formoso f{rmOs]
+forms f{rmz
+formula f{rmy@l@
+formulaic f{rmy@lA6k
+formulary f{rmy@ler/
+formulas f{rmy@l@z
+formulate f{rmy@lAt
+formulated f{rmy@lAt@d
+formulates f{rmy@lAts
+formulating f{rmy@lAt6N
+formulation f{rmy@lAS~
+formulation f{rmyUlAS~
+formulations f{rmyUlAS~z
+formylin f{rm@lin
+fornal f{rn@l
+forner f{rnP
+fornes f{rnz
+forness fVnis
+forney f{rn/
+forni f{rn/
+fornoff f{rn{f
+fornwalt f{rnw@lt
+forquer f{rkP
+forrer f{Pr
+forrest f{r@st
+forrestal f{r@st@l
+forrester f{r@stP
+forrey f{r/
+forry f{r/
+fors fVz
+forsake f{rsAk
+forsaken f{rsAk~
+forsaking f{rsAk6N
+forsberg f{rsbPg
+forsburg f{rsbPg
+forsburg's f{rsbPgz
+forschner f{rSnP
+forse f{rs
+forsee fPsE
+forseeable fPsE@b@l
+forseeable f{rsE@b@l
+forsell f{rs@l
+forseth f{rscT
+forsgren f{rsgrcn
+forshan f{rS~
+forshee f{rS/
+forshey f{rS/
+forslund f{rsl~d
+forsman f{rsm~
+forson f{rs~
+forsook f{rsqk
+forst f{rst
+forster f{rstP
+forstmann f{rstm~
+forstner f{rstnP
+forstrom f{rstr}
+forswear f{rsw,r
+forsworn f{rsw{rn
+forsyth f{rsIT
+forsythe f{rsIT
+forsythia f{rsiT/@
+forsythias f{rsiT/@z
+fort f{rt
+fortas f{rt@s
+fortas's f{rt@s@z
+forte f{rt
+forte f{rtA
+fortenberry f{rt~bcr/
+fortes f{rtAz
+fortes f{rts
+forth f{rT
+forthcoming f{rTkum6N
+forthright f{rTrIt
+forthrightly f{rTrItl/
+forthrightness f{rTrItn@s
+forthwith f{rTwiT
+forti f{rt/
+fortier f{rt/P
+fortier f{rtyP
+fortier's f{rt/Pz
+fortier's f{rtyPz
+forties f{rt/z
+fortieth f{rt/@T
+fortification f{rt@f@kAS~
+fortifications f{rt@f@kAS~z
+fortified f{rt@fId
+fortifier f{rt@fIP
+fortifiers f{rt@fIPz
+fortify f{rt@fI
+fortifying f{rt@fI6N
+fortin f{rtin
+fortini f{rtEn/
+fortino f{rtEn]
+fortis f{rtis
+fortitude f{rt@tUd
+fortman f{rtm~
+fortna f{rtn@
+fortner f{rtnP
+fortney f{rtn/
+fortnight f{rtnIt
+fortnightly f{rtnItl/
+forton f{rt~
+fortress f{rtr@s
+fortresses f{rtr@s@z
+forts f{rts
+fortson f{rts~
+fortuitous f{rtU@t@s
+fortuna f{rtUn@
+fortunate f{rCUn@t
+fortunate f{rC~@t
+fortunately f{rCUn@tl/
+fortunately f{rC~@tl/
+fortunato f{rCUnot]
+fortunato f{rtUnot]
+fortune f{rCUn
+fortune f{rC~
+fortune's f{rCUnz
+fortune's f{rC~z
+fortunes f{rCUnz
+fortunes f{rC~z
+forty f{rt/
+forty's f{rt/z
+forum f{r}
+forum's f{r}z
+forums f{r}z
+forward f{rwPd
+forwarded f{rwPd@d
+forwarder f{rwPdP
+forwarders f{rwPdPz
+forwarding f{rwPd6N
+forwards f{rwPdz
+forwood f{rwqd
+forys f{r/z
+forza f{rz@
+fosamax fos}aks
+fosback fosbak
+fosberg fosbPg
+fosco fosk]
+fosdick fosd6k
+foshee foS/
+fosia fOZ@
+foskett fosk@t
+foskey fosk/
+fosler fos@lP
+fosnaugh fosn{
+foss fos
+fosse fos
+fossel fos@l
+fossen fos~
+fossett fos@t
+fossey fos/
+fossey's fos/z
+fossil fos@l
+fossiliferous fos@lifP@s
+fossilize fos@lIz
+fossilized fos@lIzd
+fossils fos@lz
+fossum fos}
+foster fostP
+foster's fostPz
+fostered fostPd
+fostering fostP6N
+fosters fostPz
+foth foT
+fothergill fuTPgil
+fotheringham fuTP6Nham
+foti fOt/
+fotis fOtis
+fotopoulos f@top@l@s
+fouad fUad
+fouch f?C
+fouche f?C
+foucher f?kP
+fougere f?gP
+fought f{t
+fouhy fU/
+fouhy fUh/
+foul f?l
+foulds fOldz
+fouled f?ld
+fouling f?l6N
+foulk f?lk
+foulke f?lk
+foulkes f?lks
+foulks fUlks
+foulness f?ln@s
+fouls f?lz
+found f?nd
+foundation f?ndAS~
+foundation's f?ndAS~z
+foundational f?ndAS~@l
+foundations f?ndAS~z
+founded f?nd@d
+founder f?ndP
+founder's f?ndPz
+foundered f?ndPd
+foundering f?ndP6N
+founders f?ndPz
+founders' f?ndPz
+founding f?nd6N
+foundling f?ndl6N
+foundries f?ndr/z
+foundry f?ndr/
+fountain f?nt~
+fountaine fUntAn
+fountains f?nt~z
+four f{r
+four's f{rz
+fourfold f{rfOld
+fourman f{rm~
+fournet fqrnet
+fournier f{rn/P
+fours f{rz
+foursome f{rs}
+foursquare f{rskwcr
+fourteen f{rtEn
+fourteens f{rtEnz
+fourteenth f{rtEnT
+fourth f{rT
+fourth's f{rTs
+fourthly f{rTl/
+fourthquarter f{rTkw{rtP
+fourthquarter f{rTk{rtP
+fourths f{rTs
+fourths f{rs
+fourtou f{rtU
+fouse f?s
+fousek f?s6k
+foushee f?S/
+foust f?st
+fout f?t
+foutch f?C
+fouts f?ts
+fouty f?t/
+foutz f?ts
+fowble f?b@l
+fowers f?Pz
+fowkes f?ks
+fowl f?l
+fowle f?@l
+fowler f?lP
+fowler's f?lPz
+fowles f?@lz
+fowlkes f?lks
+fox foks
+fox's foks@z
+foxboro foksbP]
+foxes foks@z
+foxfire foksfIP
+foxfire foksfIr
+foxglove foksgluv
+foxhole fokshOl
+foxholes fokshOlz
+foxhound foksh?nd
+foxman foksm~
+foxman's foksm~z
+foxmeyer foksmIr
+foxtail fokstAl
+foxwell fokswel
+foxwood fokswqd
+foxwoods fokswqdz
+foxworth fokswVT
+foxworthy fokswVT/
+foxworthy's fokswVT/z
+foxx foks
+foxy foks/
+foy f<
+foye f<
+foyer f<P
+foyle f<l
+foyt f<t
+fraas froz
+frable frAb@l
+fracas frAk@s
+frace frAs
+fractal frakt@l
+fraction frakS~
+fractional frakS~@l
+fractionally frakSn@l/
+fractionally frakS~@l/
+fractions frakS~z
+fractious frakS@s
+fractiousness frakS@sn@s
+fracture frakCP
+fracture frakSP
+fractured frakCPd
+fractures frakCPz
+fractures frakSPz
+fracturing frakCP6N
+fradette fr@det
+fradkin fradkin
+frady frAd/
+fraga frog@
+fragale frogol/
+frager frAgP
+fragile fraj@l
+fragility fr@jil@t/
+fragment fragm~t
+fragmentary fragm~ter/
+fragmentation fragm~tAS~
+fragmented fragm~@d
+fragmented fragm~t@d
+fragmenting fragm~6N
+fragmenting fragm~t6N
+fragments fragm~ts
+frago frAg]
+fragonard frag~ord
+fragoso frogOs]
+fragrance frAgr~s
+fragrances frAgr~s@z
+fragrant frAgr~t
+fraher froP
+frahm fram
+frail frAl
+frailey frAl/
+frailties frAlt/z
+frailty frAlt/
+fraim frAm
+frain frAn
+fraine frAn
+fraioli frIOl/
+fraire fr,r
+fraiser frAZP
+fraizer frAZP
+fraker frAkP
+frakes frAks
+fraleigh frAl/
+fraley frAl/
+fralick fral6k
+fralin fralin
+fralix fral6ks
+fram fram
+framatome fram@tOm
+frame frAm
+framed frAmd
+framer frAmP
+framers frAmPz
+framers' framPz
+frames frAmz
+framework frAmwVk
+framing frAm6N
+framingham frAm6Nham
+frampton frampt~
+fran fran
+frana fran@
+franc fraNk
+franc's fraNks
+franca fraNk@
+francais fronsA
+francaise fronsez
+francaises fronsez
+francavilla fronkovil@
+france frans
+france's frans@z
+francek franCek
+frances frans@s
+francesca franCesk@
+franceschi fronCesk/
+franceschini fronCcskEn/
+francesco franCesk]
+francesco's franCesk]z
+francesconi fronCcskOn/
+francese fronCAz/
+francesmary frans@sm,r/
+franchi fronk/
+franchik franC6k
+franchini fronkEn/
+franchino fronkEn]
+franchise franCIz
+franchise's franCIz@z
+franchised franCIzd
+franchisee franCIzE
+franchisees franCIzEz
+franchisees' franCIzEz
+franchiser franCIzP
+franchisers franCIzPz
+franchises franCIz@z
+franchising franCIz6N
+franchot frank@t
+francia fronC@
+francie fraNk/
+francies fr~sEz
+francine fransEn
+francine's fransEnz
+francines fransEnz
+francis frans@s
+francis' frans@s
+franciscan fransisk~
+franciscans fransisk~z
+francisco fransisk]
+francisco's fransisk]z
+franciso fransEs]
+francisville frans@svil
+franck fraNk
+francke fraNk
+francklin fraNklin
+francklyn fraNklin
+franckowiak fr~sk?/ak
+franco fraNk]
+franco's fraNk]z
+francoeur fr~kV
+francois fronswo
+francoise franswo
+francoise franswoz
+francom fraNkom
+francophile fraNk@fIl
+francorp frank{rp
+francs fraNks
+francy frans/
+francyne fransIn
+franczak franCak
+frandsen frands~
+frane frAn
+franek fran6k
+franey frAn/
+frangos fraNg]z
+franjo franj]
+frank fraNk
+frank's fraNks
+franke fraNk
+franked fraNkt
+frankel fraNk@l
+franken fraNk~
+frankenberg fraNk~bPg
+frankenberger fraNk~bPgP
+frankenberry fraNk~ber/
+frankenfield fraNk~fEld
+frankenheimer fraNk~hImP
+frankenstein fraNk~stEn
+frankenstein fraNk~stIn
+frankenstein's fraNk~stEnz
+frankenstein's fraNk~stInz
+frankfort fraNkfPt
+frankfort's fraNkfPts
+frankfurt fraNkfPt
+frankfurt's fraNkfPts
+frankfurter fraNkfPtP
+frankfurters fraNkfPtPz
+frankhouser fraNkh?sP
+frankie fraNk/
+frankiewicz frank@v6C
+frankincense fraNk~sens
+franking fraNk6N
+frankino fraNkEn]
+frankish fraNk6S
+frankl fraNk@l
+frankland fraNkl~d
+franklin fraNklin
+franklin's fraNklinz
+franklinite fraNkl~It
+franklinville fraNkl~vil
+frankly fraNkl/
+franklyn fraNklin
+frankness fraNkn@s
+franko fraNk]
+frankovich fraNk@v6C
+frankowski fr@Nk{fsk/
+franks fraNks
+frankson fraNks~
+frankum fraNk}
+frannie fran/
+franny fran/
+frans franz
+fransen frans~
+franson frans~
+franssen frans~
+franta frant@
+frantic frant6k
+frantically fran@k@l/
+frantically fran@kl/
+frantically frant@k@l/
+frantically frant@kl/
+frantom frant}
+frantz frants
+frantzen frantz~
+franyo frony]
+franz franz
+franze franz
+franzel franz@l
+franzen franz~
+franzese fronzAz/
+franzone fronzOn/
+franzoni fronzOn/
+frap frap
+fraph fraf
+fraph's frafs
+frappier frap/P
+frary fr,r/
+frasca frosk@
+frascella frosCel@
+frasch fraS
+frasco frosk]
+frase frAz
+fraser frAzP
+fraser's frAzPz
+frasher fraSP
+frashier frAZyP
+frasier frAZP
+frasure froZP
+fratangelo frotoNgel]
+frate frAt
+frater frAtP
+fraternal fr@tVn@l
+fraternities fr@tVn@t/z
+fraternity fr@tVn@t/
+fraternize fratPnIz
+fraternizing fratPnIz6N
+frates frAts
+fratricide fratr@sId
+fratricides fratr@sIdz
+fratus frat@s
+fratzke fratsk
+fratzke fratsk/
+frau fr?
+fraud fr{d
+frauds fr{dz
+fraudster fr{dstP
+fraudster's fr{dstPz
+fraudsters fr{dstPz
+fraudulent fr{j@l~t
+fraudulently fr{dUl~tl/
+fraught fr{t
+fraum fr?m
+fraum from
+frausto fr{st]
+fravel frav@l
+frawley fr{l/
+fray frA
+frayed frAd
+frayer frAP
+fraying frA6N
+frayn frAn
+frayne frAn
+fraze frAz
+frazee fr@zE
+frazer frAzP
+frazier frAZP
+frazzano fr@zon]
+frazzini frotsEn/
+frazzle fraz@l
+frazzled fraz@ld
+fread fred
+freak frEk
+freaked frEkt
+freaking frEk6N
+freaks frEks
+freaky frEk/
+frean frEn
+frear frir
+frears frErz
+freas frEz
+frease frEz
+freberg frEbPg
+frech frek
+frechette frcSet
+freck frek
+freckle frek@l
+freckled frek@ld
+freckles frek@lz
+fred fred
+fred's fredz
+freda fred
+freddie fred/
+freddy fred/
+freddy's fred/z
+freddye fred/
+frede frEd
+fredell fred@l
+fredella frcdel@
+fredenburg frEd~bPg
+frederic fredr6k
+frederica fredPEk@
+frederick fredP6k
+frederick fredr6k
+frederick's fredP6ks
+frederick's fredr6ks
+fredericka frAdcrEk@
+fredericks fredr6ks
+fredericksburg fredP6ksbPg
+fredericksburg fredr6ksbPg
+fredericksen fredP6ks~
+fredericksen fredr6ks~
+frederickson fredP6ks~
+frederickson fredr6ks~
+frederico frcdPEk]
+frederika frAdcrEk@
+frederiksen fredP6ks~
+frederking fredPkiN
+fredette fr@det
+frediani frcd/on/
+fredin fredin
+fredkin fredkin
+fredlund fredl~d
+fredman fredm~
+fredo frEd]
+fredric fredr6k
+fredrich fredr6k
+fredrick fredr6k
+fredricks fredr6ks
+fredricksen fredr6ks~
+fredrickson fredr6ks~
+fredriksen fr@driks~
+fredrikson fredr6ks~
+free frE
+freeberg frEbPg
+freebie frEb/
+freebies frEb/z
+freeborn frEbPn
+freeburg frEbPg
+freeburn frEbVn
+freed frEd
+freedenberg frEdenbPg
+freedland frEdl~d
+freedle frEd@l
+freedman frEdm~
+freedman's frEdm~z
+freedom frEd}
+freedom's frEd}z
+freedoms frEd}z
+freefall frEf{l
+freeform frEf{rm
+freeh frE
+freeh's frEz
+freehand frEhand
+freehling frEl6N
+freehold frEhOld
+freeholder frEhOldP
+freeholders frEhOldPz
+freeing frE6N
+freel frEl
+freelance frElans
+freelancer frElansP
+freelancers frElansPz
+freelancing frElans6N
+freeland frEl~d
+freeloader frElOdP
+freeloaders frElOdPz
+freelove frEluv
+freels frElz
+freely frEl/
+freeman frEm~
+freeman's frEm~z
+freemans frEm~z
+freemason frEmAs~
+freemasonry frEmAs~r/
+freemen frEmcn
+freemen's frEmcnz
+freemon frEm~
+freemont frEmont
+freemyer frEm/P
+freen frEn
+freeney frEn/
+freeny frEn/
+freeport frEp{rt
+freeport's frEp{rts
+freer frEP
+frees frEz
+freese frEz
+freest frE@st
+freestanding frEstand6N
+freestone frEstOn
+freestyle frEstIl
+freet frEt
+freethinker frETiNkP
+freethinkers frETiNkPz
+freetown frEt?n
+freeway frEwA
+freeways frEwAz
+freewheeling frEhwEl6N
+freewheeling frEwEl6N
+freewing frEw6N
+freeze frEz
+freezer frEzP
+freezers frEzPz
+freezes frEz@z
+freezing frEz6N
+fregeau friZO
+fregia frEj/@
+fregoso frcgOs]
+frei frI
+freia frE@
+freiberg frIbPg
+freiberger frIbPgP
+freiburger frIbPgP
+freid frEd
+freidan frEd~
+freidel frId@l
+freidman frEdm~
+freidman frIdm~
+freidy frEd/
+freidy frId/
+freidy's frEd/z
+freidy's frId/z
+freier frAP
+freiermuth frIPmUT
+freight frAt
+freighter frAtP
+freighters frAtPz
+freightliner frAtlInP
+freightway frAtwA
+freightways frAtwAz
+freiheit frIhIt
+freije frEj
+freilich frIl6k
+freiman frEm~
+freiman frIm~
+freimark frImork
+freimuth frImUT
+frein frAn
+freind frInd
+freire frir
+freis frEz
+freise frEs
+freitag frIt@g
+freitas frIt@z
+freiwald frIw{ld
+frel frel
+frelimo frel}O
+frels frelz
+fremd fremd
+fremd's fremdz
+fremin fremin
+fremont frEmont
+french frenC
+french's frenC@z
+french-polynesia frenCpol~EZ@
+frenchman frenCman
+frenchmen frenCmcn
+frenetic fr~et6k
+frenette fr~et
+freni fren/
+frenkel freNk@l
+frentz frents
+frenz frenz
+frenzel frenz@l
+frenzel frenzel
+frenzied frenz/d
+frenzy frenz/
+freon frEon
+freons frEonz
+frequencies frEkw~s/z
+frequency frEkw~s/
+frequent frEkwent
+frequent frEkw~t
+frequented frEkw~t@d
+frequently frEkw~tl/
+frequents frEkwents
+frequents frEkw~ts
+frere frir
+freres frErz
+frerichs fr,r6ks
+frericks fr,r6ks
+frerika fr,r6k@
+frerking frVk6N
+fresco fresk]
+fresco's fresk]z
+frescoed fresk]d
+frescoes fresk]z
+frese frEz
+fresenius fr@sEn/@s
+fresh freS
+freshbake freSbAk
+freshbake's freSbAks
+freshen freS~
+freshener freSnP
+freshener freS~P
+fresheners freSnPz
+fresheners freS~Pz
+freshening freSn6N
+freshening freS~6N
+fresher freSP
+freshest freS@st
+freshkill freSkil
+freshkills freSkilz
+freshley freSl/
+freshly freSl/
+freshman freSm~
+freshmen freSmcn
+freshness freSn@s
+freshour fres?r
+freshwater freSw{tP
+fresno frezn]
+fresno's frezn]z
+fresquez frAskwez
+freston frest~
+fret fret
+fretful fretf@l
+frets frets
+frett fret
+fretted fret@d
+fretter fretP
+fretting fret6N
+fretwell fretwel
+fretz frets
+freud fr<d
+freud's fr<dz
+freudenberg fr<d~bPg
+freudenthal fr<d~T@l
+freudian frUd/~
+freund frUnd
+freundlich fr<ndl6k
+frevert frevPt
+frew frU
+frewen frU~
+frewin frUin
+frey frA
+freya frA@
+freyer frAP
+freyermuth fVIrmUT
+freyman frAm~
+freymiller frAmilP
+freyne frAn
+freyre fr,r
+freytag frAt@g
+frezza frez@
+friar frIP
+friars frIPz
+friary frIP/
+frias frE@z
+friberg frIbPg
+fribourg frIb{rg
+fricano fr/kon]
+frick frik
+fricke frik
+fricker frikP
+frickey frik/
+fricks friks
+friction frikS~
+frictionless frikS~l@s
+frictions frikS~z
+frida frEd@
+friday frId/
+friday frIdA
+friday's frId/z
+friday's frIdAz
+fridays frId/z
+fridays frIdAz
+friddle frid@l
+fridge frij
+fridley fridl/
+fridman fridm~
+fridolf frid]lf
+fridovich frid@v6C
+fridrich fridr6k
+fridson frids~
+frie fV/
+friebel frEb@l
+fried frEd
+fried frId
+frieda frEd@
+friedan frEd~
+friedberg frIdbPg
+friede frEd
+friedel frEd@l
+frieden frEd~
+friedenberg frEd~bPg
+frieder frIdP
+friederich frEdP6k
+friederike frEdP6k
+friedhelm frEdhelm
+friedhoff frEdh{f
+friedl frEd@l
+friedland frEdl~d
+friedlander frEdl~dP
+friedley frEdl/
+friedli frEdlE
+friedline frEdlIn
+friedly frEdl/
+friedman frEdm~
+friedman's frEdm~z
+friedmann frEdm~
+friedrich frEdr6k
+friedrichs frEdr6ks
+friedrichsen frEdr6ks~
+friedrick frEdr6k
+friedsam frEdsam
+friedson frEds~
+friedt frEdt
+friel frEl
+frieling frEl6N
+frieman frEm~
+friend frend
+friend's frendz
+friend's frenz
+friendlier frendl/P
+friendlier frenl/P
+friendliest frendl/@st
+friendliest frenl/@st
+friendliness frendl/n@s
+friendliness frenl/n@s
+friendly frendl/
+friendly frenl/
+friendly's frendl/z
+friendly's frenl/z
+friends frendz
+friends frenz
+friends' frendz
+friends' frenz
+friendship frenSip
+friendship frendSip
+friendships frenSips
+friendships frendSips
+frier frIP
+frierson frirs~
+fries frIz
+friese frEz
+friesen frEs~
+friesenhahn frEs~h~
+friesner frEsnP
+frieson frEz~
+friess frEs
+friesz frES
+frieze frEz
+frigate frig@t
+frigate's frig@ts
+frigates frig@ts
+fright frIt
+frighten frIt~
+frightened frIt~d
+frightening frItn6N
+frightening frIt~6N
+frighteningly frIt~6Nl/
+frightens frIt~z
+frightful frItf@l
+frightfully frItf@l/
+frigid frij@d
+frigo frEg]
+frigon frig~
+friis frEz
+frikkie frik/
+fril fril
+friley fril/
+frill fril
+frills frilz
+frilly fril/
+fringe frinj
+fringer frinjP
+fringes frinj@z
+frink friNk
+friona fr/On@
+frisa frEz@
+frisbee frisb/
+frisbie frisb/
+frisby frisb/
+frisch friS
+friscia frEsC@
+frisco frEsk]
+frisella frisel@
+frishman friSm~
+frisina fr/sEn@
+frisinger fris~jP
+frisk frisk
+friske frisk
+frisked friskt
+friskin frisk~
+frisky frisk/
+frison fris~
+frist frist
+fristoe frist]
+fritch friC
+fritcher friCP
+fritchman friCm~
+frith friT
+frito frEt]
+fritos frEt]z
+frits frits
+fritsch friC
+fritsche friC
+fritter fritP
+frittered fritPd
+frittering fritP6N
+fritts frits
+fritz frits
+fritze fritz
+fritzen fritz~
+fritzi frEtz/
+fritzie fritz/
+fritzinger fritz6NP
+fritzler fritslP
+fritzsche fritS
+frivolity fr@vol@t/
+frivolous friv@l@s
+frivolously friv@l@sl/
+frix friks
+frizell friz@l
+frizzell friz@l
+fro frO
+froberg frObPg
+frock frok
+frocks froks
+froder frOdP
+froedge frOj
+froehlich frOl6k
+froelich frOl6k
+froemming frOm6N
+froese frOs
+frog frog
+frog's frogz
+frogg frog
+frogge frog
+frogman frogman
+frogmen frogmcn
+frogmouth frogm?T
+frogmouths frogm?Ts
+frogmouths frogm?Tz
+frogs frogz
+froh frO
+frohlich frOl6k
+frohman frOm~
+frohn fron
+frohnmayer fr{nmIP
+froio frO/]
+frolic frol6k
+frolicking frol6k6N
+frolo frOl]
+from fPm
+from frum
+froman frOm~
+frombuger frOmbyUgP
+frombuger's frOmbyUgPz
+frome frOm
+fromer frOmP
+fromm from
+fromme from
+frommelt fromclt
+frommer fromP
+fromstein fromstEn
+fromstein fromstIn
+fronczak fronCak
+frond frond
+fronde frond
+fronds frondz
+fronek frOn6k
+froning frOn6N
+fronk froNk
+front frunt
+front's frunts
+frontage frunt6j
+frontal frunt@l
+fronted frunt@d
+frontera fr]nt,r@
+fronterhouse fruntPh?s
+frontier fr~tir
+frontier's fr~tirz
+frontiere fronty,r
+frontieres fronty,rz
+frontiers fr~tirz
+fronting frunt6N
+frontline fruntlIn
+frontline's fruntlInz
+frontrunner fruntrunP
+frontrunners fruntrunPz
+fronts frunts
+frontz fronts
+frosch fr{S
+fross fr{s
+frost fr{st
+frostban fr{stban
+frostbite fr{stbIt
+frostbitten fr{stbit~
+frosted fr{st@d
+frosting fr{st6N
+frostings fr{st6Nz
+frosts fr{sts
+frosty fr{st/
+froth fr{T
+frothiness fr{T/n@s
+frothingham fr{T6Nham
+froths fr{Ts
+frothy fr{T/
+frown fr?n
+frowned fr?nd
+frownfelter fr?nfeltP
+frowning fr?n6N
+frowningly fr?n6Nl/
+frowns fr?nz
+froze frOz
+frozen frOz~
+frucher frUkP
+fruchey fruC/
+fruchter fruktP
+fruchtman fruktm~
+fructose fruktOs
+frueh frU
+fruehauf frUh{f
+fruehling frUl6N
+frugal frUg@l
+frugality frUgal@t/
+frugally frUg@l/
+fruge frUj
+fruin frUin
+fruit frUt
+fruitcake frUtkAk
+fruitcakes frUtkAks
+fruitful frUtf@l
+fruiting frUt6N
+fruition frUiS~
+fruitless frUtl@s
+fruitlessly frUtl@sl/
+fruitopia frUtOp/@
+fruits frUts
+fruity frUt/
+frum frum
+frumkin frumkin
+frump frump
+frumpy frump/
+frunze frunz
+frusen frUz~
+frush fruS
+frustrate frustrAt
+frustrated frustrAt@d
+frustrates frustrAts
+frustrating frustrAt6N
+frustratingly frustrAt6Nl/
+frustration fr@strAS~
+frustrations fr@strAS~z
+frutchey fruC/
+fruth frUT
+frutiger frut6gP
+fry frI
+fry's frIz
+fryar frIP
+fryberger frIbPgP
+frye frI
+fryer frIP
+fryers frIPz
+frying frI6N
+fryling frIl6N
+fryman frIm~
+frymire fr/mIr
+fryrear frIrir
+frysinger fris~jP
+fs efes
+fs fs
+fsi fsE
+fthenakis fTcnokis
+fu fU
+fucci fUC/
+fuchs fyUks
+fuchsias fyUS@z
+fuck fuk
+fucked fukt
+fucking fuk6N
+fucks fuks
+fudala fUdol@
+fuddrucker fudr@kP
+fuddruckers fudr@kPz
+fuddy fud/
+fudge fuj
+fudged fujd
+fudging fuj6N
+fudgy fuj/
+fudo fyUd]
+fudosan fyUd@son
+fuel fyU@l
+fuel fyUl
+fuel's fyU@lz
+fueled fyU@ld
+fueling fyUl6N
+fuelled fyU@ld
+fuelling fyUl6N
+fuels fyU@lz
+fuente fwentA
+fuentes fwentAz
+fuentez fwentAz
+fuer fyUr
+fuerst fw,rst
+fuerstenberg fqrst~bPg
+fugard fyUgord
+fugate fugAt
+fugazy fyUg@z/
+fuge fyUj
+fugere fyUgP
+fugett fyUjct
+fugitive fyUj@t6v
+fugitives fyUj@t6vz
+fugitt fyUj@t
+fugotsten fyUg{tstcn
+fugue fyUg
+fugues fyUgz
+fuhr fqr
+fuhrer fqrP
+fuhrman fqrm~
+fuhrman's fqrm~z
+fuhrmann fqrm~
+fuhrmann's fqrm~z
+fuhrmans fqrm~z
+fuhs fus
+fuji fUj/
+fuji's fUj/z
+fujian fUjE~
+fujii fUjE/
+fujikawa fUj/kow@
+fujikura fUj6kUr@
+fujimori fUj/m{r/
+fujimori's fUj/m{r/z
+fujimoto fUj/mOt]
+fujio fUj/]
+fujioka fUj/Ok@
+fujis fyUjis
+fujisankei fUjisoNkA
+fujisawa fUjisow@
+fujita fUjEt@
+fujitsu fUjitsU
+fujitsu's fUjitsUz
+fujiwara fUj/w)r@
+fujiya fUjEy@
+fujiyama fUj/yom@
+fuke fUk
+fuklah fUkl@
+fuklah's fUkl@z
+fukowoka fUk]w{k@
+fukuda fUkUd@
+fukui fUkU/
+fukumoto fUkUmOt]
+fukunaga fUkUnog@
+fukuoka fUkUOk@
+fukushima fUkUSEm@
+fukuyama fUkUyom@
+fulani fUlon/
+fulbright fqlbrIt
+fulcher fqlCP
+fulco fqlk]
+fulcrum fqlkr}
+fuld fqld
+fulenwider fyUl~wIdP
+fulfer fqlfP
+fulfill fqlfil
+fulfilled fqlfild
+fulfilling fqlfil6N
+fulfillment fqlfilm~t
+fulfills fqlfilz
+fulford fqlfPd
+fulgham fulg}
+fulghum fulg}
+fulginiti fqlj~it/
+fulk fulk
+fulkerson fulkPs~
+fulks fulks
+full fql
+full's fqlz
+fullam fql}
+fullard fqlPd
+fullback fqlbak
+fullbright fqlbrIt
+fullen fql~
+fullenkamp fql~kamp
+fullenwider fql~wIdP
+fuller fqlP
+fuller's fqlPz
+fullerton fqlPt~
+fullest fql@st
+fullilove fUl/lOv/
+fullington fql6Nt~
+fullman fqlm~
+fullmer fqlmP
+fullness fqln@s
+fulltime fqltIm
+fullwood fqlwqd
+fully fql/
+fulmer fulmP
+fulminate fqlm~At
+fulmore fqlm{r
+fulop fUl@p
+fulp fqlp
+fulsome fqls}
+fulton fqlt~
+fulton's fqlt~z
+fults fqlts
+fultz fqlts
+fulvia fqlv/@
+fulwider fulwIdP
+fulwiler fulwIlP
+fulwood f@lwqd
+fumaroles fyUmPOlz
+fumble fumb@l
+fumbled fumb@ld
+fumbles fumb@lz
+fumbling fumb@l6N
+fumbling fumbl6N
+fume fyUm
+fumed fyUmd
+fumes fyUmz
+fumi fUm/
+fumi fyUm/
+fumigate fyUm@gAt
+fumigation fyUm@gAS~
+fuming fyUm6N
+fumio fyUm/]
+fun fun
+funari fUn)r/
+funaro fUn)r]
+funaro's fUn)r]z
+funches funC@z
+funchess funk@s
+funck fuNk
+function fuNkS~
+functional fuNkS~@l
+functionality fuNkS~al@t/
+functionally fuNkSn@l/
+functionally fuNkS~@l/
+functionaries fuNkS~er/z
+functionary fuNkS~er/
+functioned fuNkS~d
+functioning fuNkS~6N
+functions fuNkS~z
+fund fund
+fund's fundz
+fundamental fund}en@l
+fundamental fund}ent@l
+fundamentalism fund}en@liz}
+fundamentalism fund}ent@liz}
+fundamentalist fund}en@l@st
+fundamentalist fund}ent@l@st
+fundamentalists fund}en@l@s
+fundamentalists fund}en@l@ss
+fundamentalists fund}en@l@sts
+fundamentalists fund}ent@l@s
+fundamentalists fund}ent@l@ss
+fundamentalists fund}ent@l@sts
+fundamentally fund}en@l/
+fundamentally fund}ent@l/
+fundamentals fund}en@lz
+fundamentals fund}ent@lz
+funded fund@d
+funder fundP
+funderburg fundPbPg
+funderburk fundPbPk
+funderburke fundPbVk
+funders fundPz
+funding fund6N
+fundora fUnd{r@
+fundraiser fundrAzP
+fundraiser's fundrAzPz
+fundraisers fundrAzPz
+fundraising fundrAs6N
+funds fundz
+funds' fundz
+funeral fyUnP@l
+funerals fyUnP@lz
+funerary fyUnPer/
+funes fyUnz
+fung fuN
+fung's fuNz
+fungal fuNg@l
+fungi funjI
+fungible funj@b@l
+fungicide funj@sId
+fungicides funj@sIdz
+fungus fuNg@s
+funicello fun@Cel]
+funk fuNk
+funke fuNk
+funkhouser fuNkh?sP
+funks fuNks
+funky fuNk/
+funnel fun@l
+funneled fun@ld
+funneling fun@l6N
+funnell fun@l
+funnels fun@lz
+funnest fun@st
+funnier fun/P
+funniest fun/@st
+funniness fun/n@s
+funny fun/
+funs funz
+funston funst~
+funtime funtIm
+fuoco fUOk]
+fuoss fUs
+fuqua fUkw@
+fuquay fUkA
+fur fV
+furash fyPaS
+furbee fVbE
+furber fVbP
+furbish fVbiS
+furbishing fVbiS6N
+furbush fVbqS
+furby fVb/
+furches fPSEz
+furer fyqrP
+furey fyqr/
+furfaro fqrf)r]
+furgason fVg@s~
+furgerson fVgPs~
+furgeson fVg@s~
+furia fyqr/@
+furini fqrEn/
+furini's fqrEn/z
+furino fqrEn]
+furious fyqr/@s
+furiouser fyqr/@sP
+furiously fyqr/@sl/
+furlan fVl~
+furlaud fPlO
+furlett fPlet
+furlett fVl@t
+furlong fVl{N
+furlough fVl]
+furloughed fVl]d
+furloughs fVl]z
+furlow fVlO
+furman fVman
+furmark fVmork
+furnace fVn@s
+furnaces fVn@s@z
+furnari fqrn)r/
+furnas fVn@s
+furner fVnP
+furness fVnis
+furney fVn/
+furnish fVniS
+furnished fVniSt
+furnishes fVniS@z
+furnishing fVniS6N
+furnishings fVniS6Nz
+furniss fPnis
+furniture fVn6CP
+furniture's fVn6CPz
+furno fqrn]
+furor fyqr{r
+furr fV
+furr's fVz
+furrer fVP
+furrh fV
+furrier fV/P
+furriers fV/Pz
+furrow fV]
+furrowed fV]d
+furry fV/
+furs fVz
+furse fVs
+furst fVst
+furstenberg fVst~bPg
+furtado fqrtod]
+furtak fVt@k
+furtaw fVt{
+furth fVT
+further fVTP
+furtherance fVTP~s
+furthered fVTPd
+furthering fVTP6N
+furthermore fVTPm{r
+furthers fVTPz
+furthest fVT@st
+furtick fVt6k
+furtive fVt6v
+furtively fVt6vl/
+furukawa fqrUkow@
+furuta fPUt@
+furuya fqrUy@
+fury fyqr/
+fusaro fUs)r]
+fusco fUsk]
+fuse fyUz
+fused fyUzd
+fuselage fyUs@l6j
+fuselage fyUs@loj
+fuselages fyUs@l6j@z
+fuselages fyUs@loj@z
+fuselier fyUsl/P
+fuses fyUz@z
+fusible fyUz@b@l
+fusillade fyUs@lAd
+fusilli fyUsil/
+fusing fyUz6N
+fusion fyUZ~
+fuson fUs~
+fuss fus
+fussed fust
+fussell fus@l
+fusselman fus@lm~
+fusses fus@z
+fussing fus6N
+fussner fusnP
+fussy fus/
+fust fust
+fustat fustat
+fustok fustok
+fuston fust~
+futch fuC
+futher fuTP
+futile fyUt@l
+futility fyUtil@t/
+futral futr@l
+futrell fyUtrel
+futterman futPm~
+future fyUCP
+future's fyUCPz
+futures fyUCPz
+futures' fyUCPz
+futurism fyUCPiz}
+futurist fyUCPist
+futuristic fyUCPist6k
+futurists fyUCPis
+futurists fyUCPiss
+futurists fyUCPists
+fuzes fyUz@z
+fuzz fuz
+fuzzier fuz/P
+fuzzy fuz/
+fye fI
+fyfe fIf
+fyffe fIf
+fyffes fIfs
+fyffes fifs
+fyke fIk
+fyock fyok
+fyodor fyOdP
+fyodor's fyOdPz
+fyodorov fyOdP{v
+fyodorov's fyOdP{vz
+g jE
+g's jEz
+g'vanni's jE]von/z
+g. jE
+g.'s jEz
+g.s jEz
+ga go
+ga jEA
+ga j{rj@
+gaal gol
+gaar g)r
+gaarder g)rdP
+gab gab
+gaba gob@
+gabaldon gobold{n
+gabardine gabPdEn
+gabardines gabPdEnz
+gabay gabA
+gabbard g@b)rd
+gabbert gabPt
+gabbing gab6N
+gabbro gabr]
+gabbroic gabrO6k
+gabby gab/
+gabe gAb
+gabehart gAbhort
+gabel g@bel
+gabele g@belA
+gabelli g@bel/
+gaber gAbP
+gabert gabPt
+gabhart gabhort
+gabie gab/
+gable gAb@l
+gabler gAb@lP
+gables gAb@lz
+gabon g@bon
+gabor g@b{r
+gaboriault gabP/]
+gaboury gabqr/
+gabrall gAbr@l
+gabrall's gAbr@lz
+gabriel gAbr/@l
+gabriel's gAbr/@lz
+gabriela gobr/el@
+gabriele gobr/el
+gabriella gobr/el@
+gabrielle gabr/cl
+gabrielli gobr/el/
+gabrielsen gAbr/cls~
+gabrielsen gabr/ls~
+gabrielson gAbr/cls~
+gabrielson gabr/ls~
+gabrowny g@br?n/
+gabrys gabP/z
+gaby gab/
+gaccione gokCOn/
+gacek goCek
+gach gaC
+gacy gAs/
+gacy's gAs/z
+gad gad
+gadberry gadber/
+gadbois gadbwo
+gadd gad
+gaddie gad/
+gadding gad6N
+gaddis gadis
+gaddum gad}
+gaddy gad/
+gade gAd
+gadflies gadflIz
+gadfly gadflI
+gadget gaj@t
+gadgetry gaj@tr/
+gadgets gaj@ts
+gadhafi g@dhof/
+gadhafi g@dof/
+gadhafi's g@dhof/z
+gadhafi's g@dof/z
+gadomski g@domsk/
+gadoury gadqr/
+gads gadz
+gadsby gadzb/
+gadsden gadzd~
+gadson gads~
+gadway gadwA
+gadzinski g@jinsk/
+gae gI
+gaea gE@
+gaebel geb@l
+gaede gEd
+gael gAl
+gaelic gAl6k
+gaertner g,rtnP
+gaeta gEt@
+gaetano gIton]
+gaeth gET
+gaetz gEts
+gaf gaf
+gaff gaf
+gaffe gaf
+gaffes gafs
+gaffey gaf/
+gaffin gafin
+gaffney gafn/
+gafford gafPd
+gag gag
+gagan gAg~
+gagarin g@gar~
+gage gAj
+gagel gag@l
+gagen gag~
+gager gAgP
+gagged gagd
+gaggle gag@l
+gagliano gagl/on]
+gagliano gogl/on]
+gagliardi gagl/)rd/
+gagliardi gogl/)rd/
+gagliardo gagl/)rd]
+gagliardo gogl/)rd]
+gaglio gagl/]
+gaglione gagl/On/
+gaglione gogl/On/
+gagne gAn/
+gagne gagn/
+gagner gagnP
+gagnier gagn/P
+gagnon gany~
+gags gagz
+gahagan gohogon
+gahan gah~
+gahli gol/
+gahm gam
+gahn gan
+gahr g)r
+gaia gI@
+gaidar gIdor
+gaidar's gIdorz
+gaier gAP
+gaige gAj
+gail gAl
+gail's gAlz
+gaile gAl
+gailey gAl/
+gaillard gAlPd
+gaily gAl/
+gain gAn
+gained gAnd
+gainer gAnP
+gainers gAnPz
+gaines gAnz
+gainesville gAnzvil
+gainey gAn/
+gainful gAnf@l
+gainfully gAnf@l/
+gaining gAn6N
+gainor gAnP
+gainous gAn@s
+gains gAnz
+gainsay gAnsA
+gainsboro gAnzbP]
+gainsco gAnsk]
+gair g,r
+gaiser gAzP
+gait gAt
+gaitan gIton
+gaiter gAtP
+gaither gATP
+gaithersburg gATPzbPg
+gaitskill gAtsk6l
+gajda gId@
+gajewski gIefsk/
+gal gal
+gala gAl@
+gala gal@
+galactic g@lakt6k
+galactose g@lakt]s
+galahad gal@had
+galambos golomb]z
+galan gAl~
+galane g@lAn
+galang gal@N
+galanis g@lonis
+galant gol~t
+galante golont/
+galanter g@lantP
+galanti g@lant/
+galapagos g@lop@g]z
+galarneau galornO
+galarza g@l)rz@
+galas gAl@z
+galasie gal@s/
+galassi golos/
+galasso golos]
+galatas golotoz
+galatea gal@tE@
+galati golot/
+galaviz gal@viz
+galax galaks
+galaxies gal@ks/z
+galaxy gal@ks/
+galaxy's gal@ks/z
+galban galb~
+galbo galb]
+galbraith galbrAT
+galbreath galbreT
+gale gAl
+gale's gAlz
+galea gAl/@
+galeano golEn]
+galeb gAl@b
+galeb gal@b
+galebs gAl@bz
+galebs gal@bz
+galef gal@f
+galen gAl~
+galen's gAl~z
+galena g@lEn@
+galenical g@len6k@l
+galentine golcntEn/
+galer gAlP
+galeria galPE@
+galerias galPE@z
+galeries galP/z
+galernter g@lVntP
+gales gAlz
+galesburg gAlzbPg
+galesi g@les/
+galey gAl/
+galford galfPd
+galgano golgon]
+gali gol/
+gali's gol/z
+galiano gol/on]
+galicia g@liS/@
+galie gAl/
+galiena golEn@
+galik gal6k
+galilean gal@lE~
+galilee gal@lE
+galileo gal@lA]
+galileo gal@lE]
+galileo's gal@lA]z
+galileo's gal@lE]z
+galin galin
+galindo golEnd]
+galinski g@linsk/
+galinsky g@linsk/
+galioto gol/Ot]
+galipault gal@pO
+galipault gal@p{lt
+galipeau gal@pO
+galitsin g@litsin
+galka galk@
+gall g{l
+galla gal@
+gallacher gal@kP
+gallager g{l6jP
+gallagher gal@gP
+gallahan gal@han
+gallaher gal@hP
+gallamore golom{r
+galland gal~d
+gallant gal~t
+gallantry gal~tr/
+gallard g@l)rd
+gallardo gol)rd]
+gallas gal@z
+gallatin gal@tin
+gallaudet gal@dct
+gallaway g{l@wA
+gallbladder g{lbladP
+galle gAl
+galle galA
+gallego goleg]
+gallegos gal6g]z
+gallemore golem{r
+gallen g{l~
+gallentine golcntEn/
+galleon gal/~
+galleons gal/~z
+galler g{lP
+gallerani golPon/
+galleria galPE@
+galleries galP/z
+gallery galP/
+gallery's galP/z
+galles gAlz
+gallet galct
+galletti golet/
+galley gal/
+galleys gal/z
+galli gal/
+gallia galy@
+galliano gol/on]
+gallic gal6k
+gallick gal6k
+gallien g@lEn
+gallier gal/P
+galligan gal6g~
+galliher gal@hP
+gallik gal6k
+gallimard gal}Pd
+gallimore golEm{r
+gallina golEn@
+galling g{l6N
+gallinger g{l6NP
+gallinsky g@linsk/
+gallion galy~
+gallium gal/}
+gallivan gal6v~
+gallman g{lm~
+gallo gal]
+gallo's gal]z
+gallogly gal@gl/
+gallon gal~
+gallons gal~z
+galloon g@lUn
+gallop gal@p
+galloped gal@pt
+galloping gal@p6N
+gallos gal]z
+gallow gal]
+galloway gal]wA
+galloways gal]wAz
+gallows gal]z
+galls g{lz
+gallstone g{lstOn
+gallstones golstOnz
+gallucci golUC/
+galluccio golUC/]
+gallup gal@p
+gallus gal@s
+galluzzo golUz]
+gallway g{lwA
+galoob g@lUb
+galoob's g@lUbz
+galore g@l{r
+galosh g@loS
+galoshes g@loS@z
+galotti g@lot/
+galpin galpin
+gals galz
+galster galstP
+galsworthy galzwVT/
+galt g{lt
+galton galt~
+galudet galyUdet
+galus gal@s
+galusha gal6S@
+galuska g@lisk@
+galvan golvon
+galvanic galvan6k
+galvanize galv~Iz
+galvanized galv~Izd
+galvanizes galv~Iz@z
+galvanizing galv~Iz6N
+galven golv~
+galveston galv@st~
+galvez golvez
+galvin galvin
+galvin's galvinz
+galway golwA
+galyean gal/~
+galyen gal/cn
+galyon gal/on
+gama gom@
+gamache gomAk
+gamage gam6j
+gamal g}ol
+gamba gamb@
+gambale gombol/
+gambardella gombordel@
+gamber gambP
+gambia gamb/@
+gambill g}bil
+gambino gambEn]
+gambit gambit
+gambits gambits
+gamble gamb@l
+gamble's gamb@lz
+gambled gamb@ld
+gambler gamblP
+gambler's gamblPz
+gamblers gamblPz
+gambles gamb@lz
+gamblin gamblin
+gambling gamb@l6N
+gambling gambl6N
+gambling's gambl6Nz
+gamboa gombO@
+gambone gomb]n
+gambrel gambr@l
+gambrell gambr@l
+gambrill gambr@l
+gambro gambr]
+gamco gamk]
+game gAm
+game's gAmz
+gamel gom@l
+gamelin gam@lin
+gamello g}el]
+gamely gAml/
+gamer gAmP
+gamers gAmPz
+games gAmz
+games' gAmz
+gameshow gAmSO
+gameshows gAmSOz
+gamesmanship gAmzm~Sip
+gamet gam@t
+gametangia gam@tanj/@
+gamete gam/t
+gamete g}Et
+gametophyte g}Et@fIt
+gamez gomez
+gaming gAm6N
+gaming's gAm6Nz
+gamino gomEn]
+gamm gam
+gamma gam@
+gammage gam6j
+gammal g}ol
+gammel gam@l
+gammell gam@l
+gammill gamil
+gammon gam~
+gammons gam~z
+gamons gam~z
+gamp gamp
+gamper gampP
+gamsakhurdia gams@kVd/@
+gamsakhurdia gams@kVdy@
+gamunde g}Und
+gamunde's g}Undz
+gamut gam@t
+gan gan
+ganas gan@z
+ganatieuganauf g~AS@gan@lf
+ganaway gan@wA
+gancarz gonkorz
+ganci gans/
+ganda gand@
+gandalf gand{lf
+gandalf's gand{lfs
+gandara gond)r@
+gandee gand/
+gander gandP
+gandhi gond/
+gandhi's gond/z
+gandolfi gondOlf/
+gandolfo gondOlf]
+gandy gand/
+ganem ganim
+ganes gAnz
+ganey gAn/
+gang gaN
+gang's gaNz
+gangbanger gaNbaNgP
+gangbangers gaNbaNgPz
+gangbuster gaNbustP
+gangbusters gaNbustPz
+gange ganj
+gangemi goNgem/
+ganger gaNP
+ganges ganj/z
+gangi ganj/
+ganging gaN6N
+gangl gaNg@l
+ganglia gaNgl/@
+ganglionic gaNgl/on6k
+gangloff gaNgl{f
+gangly gaNl/
+gangplank gaNplaNk
+gangs gaNz
+gangsta gaNst@
+gangster gaNstP
+gangsters gaNstPz
+gangwer gaNwP
+ganic gan6k
+ganim ganim
+ganis ganis
+ganley ganl/
+gann gan
+gannaway gan@wA
+gannett gan@t
+gannett's gan@ts
+gannon gan~
+gano gon]
+ganoe gan]
+ganong gan{N
+gans ganz
+gansen gans~
+ganser gansP
+ganske gansk
+ganson gans~
+ganster ganstP
+gant gant
+gantenbein gant~bIn
+ganter gantP
+gantlet g{ntl@t
+gantner gantnP
+gantos gant]s
+gantry gantr/
+gantt gant
+gantz gants
+ganus gAn@s
+ganymede gan}Ed
+ganz ganz
+ganzel ganz@l
+ganzer ganzP
+gaona goOn@
+gap gap
+gap's gaps
+gape gAp
+gaping gAp6N
+gapinski g@pinsk/
+gapp gap
+gappa gap@
+gaps gaps
+gar g)r
+gara gar@
+garabedian gar@bEd/~
+garafalo gorofol]
+garafola gorofOl@
+garage gPoZ
+garages gPoZ@z
+garagiola gPaj/Ol@
+garagiola ger@j/Ol@
+garajda gPoZd@
+garajda g{roZd@
+garajda's gPoZd@z
+garajda's g{roZd@z
+garamendi ger}end/
+garamendi's ger}end/z
+garand gar~d
+garant g)r~t
+garard gP)rd
+garavaglia gorovogl/@
+garay garA
+garb g)rb
+garbacz g)rb@C
+garbage g)rb6j
+garbarini gorborEn/
+garbarino gorborEn]
+garbe g)rb
+garbed g)rbd
+garber g)rbP
+garbers g)rbPz
+garbett g)rbct
+garble g)rb@l
+garbled g)rb@ld
+garbo g)rb]
+garbutt g)rb@t
+garceau gorsO
+garces g)rscs
+garcetti gorCet/
+garcetti's gorCet/z
+garcia gorsE@
+garcia's gorsE@z
+garcias gorsE@z
+garczynski gPCinsk/
+gard g)rd
+garda g)rd@
+garde g)rd
+gardea g)rd/@
+gardella gordel@
+garden g)rd~
+garden's g)rd~z
+gardena gordEn@
+gardenamerica gord~},r6k@
+gardened g)rd~d
+gardener g)rd~P
+gardener's g)rd~Pz
+gardeners g)rdnPz
+gardeners g)rd~Pz
+gardenhire g)rd~hIr
+gardenia gordEny@
+gardenias gordEny@z
+gardening g)rdn6N
+gardening g)rd~6N
+gardens g)rd~z
+gardin g)rdin
+gardiner g)rdnP
+gardini gordEn/
+gardini's gordEn/z
+gardinier g)rd~/P
+gardinier g)rd~yP
+gardner g)rdnP
+gardner's g)rdnPz
+gardolin g)rd]lin
+gardolin's g)rd]linz
+garduno gordUn]
+gardyne g)rdIn
+gare g,r
+gareau gPO
+garelick gar@l6k
+gareth g,riT
+garett garit
+garey gar/
+garfield g)rfEld
+garfinkel g)rfiNk@l
+garfinkle g)rfiNk@l
+garfunkel g)rf@Nk@l
+garg g)rg
+gargan g)rg~
+gargano gorgon]
+gargantuan gorganCU~
+garger g)rgP
+garges g)rj@z
+gargill g)rjil
+gargis g)rgis
+gargiulo g)rjUl]
+gargoyle g)rg<l
+gargoyles g)rg<lz
+garguilo gorgwEl]
+gargus g)rg@s
+gari g)r/
+garibaldi gar@b{ld/
+garibay gar@bA
+gariepy gPEp/
+garin g,rin
+garing g,r6N
+garinger g,r6NP
+garis garis
+garish g,r6S
+garity gar@t/
+garl g)rl
+garlan g)rl~
+garland g)rl~d
+garlic g)rl6k
+garlick g)rl6k
+garlicky g)rl6k/
+garling g)rl6N
+garlinger g)rl6NP
+garlinghouse g)rl6Nh?s
+garlington g)rl6Nt~
+garlitz g)rlits
+garlock g)rl@k
+garlow g)rl]
+garman g)rm~
+garmany gPm{n/
+garment g)rm~t
+garments g)rm~ts
+garmon g)rm~
+garmond g)rm~d
+garms g)rmz
+garmund g)rm~d
+garn g)rn
+garneau gornO
+garner g)rnP
+garnered g)rnPd
+garnering g)rnP6N
+garners g)rnPz
+garnes g)rnz
+garnet g)rn@t
+garnett g)rnct
+garnette gornet
+garney g)rn/
+garnica gornEk@
+garnier g)rn/P
+garnish g)rn6S
+garnished g)rn6St
+garnishes g)rn6S@z
+garnishment g)rn6Sm~t
+garno g)rn]
+garnock g)rn@k
+garnsey g)rns/
+garo g,r]
+garofalo gor]fol]
+garofano gor]fon]
+garofolo gcr@fOl@
+garols gar{lz
+garon gor{n
+garone gPOn
+garonzik gPonz6k
+garoutte gPUt
+garr gar
+garrabrant gorobr~t
+garrahan gar@han
+garramone gar}On
+garrard garPd
+garratt g,r@t
+garraway gar@wA
+garrell gorAl
+garrels gar@lz
+garrelts garclts
+garren g)r~
+garret g,r@t
+garret's g,r@ts
+garrets g,r@ts
+garretson gar@ts~
+garrett g,r@t
+garrett gar@t
+garrett's g,r@tz
+garrett's gar@tz
+garrette gPet
+garrey gar/
+garrick g,r6k
+garrido gorEd]
+garrido-luna gorEd]lUn@
+garriga gar6g@
+garrigan gar6g~
+garrigues gorEgcs
+garrigus gorEg@s
+garringer gar6NP
+garriott gar/@t
+garris garis
+garrison gar@s~
+garrisoned gar@s~d
+garritano gor/ton]
+garritt garit
+garrity g,r@t/
+garro g)r]
+garrod gar@d
+garrol gar@l
+garrols gar@lz
+garron gar~
+garron's g,r~z
+garros g,r]s
+garrott gar@t
+garrow g,r]
+garroway gar]wA
+garroz gar@z
+garrulous g,r@l@s
+garry gar/
+gars g)rz
+garside g)rsId
+garske g)rsk
+garson g)rs~
+garst g)rst
+garsten g)rstcn
+garsten's g)rstcnz
+garstin g)rst~
+garstka g)rstk@
+garston g)rst~
+garten g)rt~
+gartenberg g)rt~bPg
+garter g)rtP
+garters g)rtPz
+garth g)rT
+garthwaite g)rTwAt
+gartin g)rtin
+gartland g)rtl~d
+gartley g)rtl/
+gartman g)rtm~
+gartmore g)rtm{r
+gartner g)rtnP
+garton g)rt~
+gartrell g)rtr@l
+gartside g)rtsId
+gartzke g)rtsk/
+garuda g@rUd@
+garver g)rvP
+garverick g)rvP6k
+garvey g)rv/
+garvie g)rv/
+garvin g)rvin
+garwin g)rwin
+garwood g)rwqd
+gary g,r/
+gary's g,r/z
+garza g)rz@
+garzarelli g)rzPel/
+garzon g)rz~
+gas gas
+gas's gas@z
+gasaway gas@wA
+gasbarro gosb)r]
+gasca gosk@
+gascon gask~
+gascons gask~z
+gase gAz
+gaseous gas/@s
+gases gas@z
+gash gaS
+gashed gaSt
+gashes gaS@z
+gasich gAz6k
+gasification gas@f@kAS~
+gasify gas@fI
+gasior gas/P
+gasiorowski g@s/{r{fsk/
+gaska gosk@
+gaskamp gaskamp
+gaskell gask@l
+gasket gask@t
+gaskets gask@ts
+gaskey gaskE
+gaskill gaskil
+gaskin gaskin
+gaskins gaskinz
+gaslight gaslIt
+gasner gasnP
+gasohol gas@h{l
+gasoline gas@lEn
+gasolines gas@lEnz
+gasp gasp
+gaspar gaspP
+gaspard g@sp)rd
+gaspari gosp)r/
+gasparini gosporEn/
+gasparro gosp)r]
+gaspe gasp/
+gasped gaspt
+gasper gaspP
+gasperini gospPEn/
+gasping gasp6N
+gasps gasps
+gasque gAsk
+gass gas
+gassaway gas@wA
+gassed gast
+gassee gas/
+gassen gas~
+gasser gasP
+gassert gasPt
+gasses gas@z
+gassett gasct
+gassing gas6N
+gassman gasm~
+gassmann gasm~
+gassner gasnP
+gast gast
+gastelli g@stel/
+gaster gastP
+gastilum gAst@l}
+gastineau gast~O
+gaston gast~
+gaston's gast~z
+gastonia g@stOn/@
+gastric gastr6k
+gastritis gastrIt@s
+gastrointestinal gastr]intest~@l
+gastronomic g@stronom6k
+gastronomy gastron}/
+gastroscope gastr@skOp
+gastrovascular gastr]vasky@lP
+gastrulate gastr@lAt
+gastrulation gastr@lAS~
+gat gat
+gatch gaC
+gatchel gaC@l
+gatchell gaC@l
+gate gAt
+gated gAt@d
+gatekeeper gAtkEpP
+gatekeepers gAtkEpPz
+gateley gat@l/l/
+gately gAtl/
+gates gAts
+gates' gAts
+gates's gAts
+gates's gAts@z
+gateway gAtwA
+gateway's gAtwAz
+gateways gAtwAz
+gatewood gAtwqd
+gath gaT
+gather gaTP
+gathered gaTPd
+gatherer gaTPP
+gatherers gaTPPz
+gathering gaTP6N
+gatherings gaTP6Nz
+gathers gaTPz
+gathings gaT6Nz
+gathman gaTm~
+gathright gaTrIt
+gatien gAtycn
+gatley gatl/
+gatliff gatlif
+gatlin gatlin
+gatling gatl6N
+gatling's gatl6Nz
+gatoil g@t<l
+gator gAtP
+gatorade gatPAd
+gators gAtPz
+gatos gAtOs
+gatos gAt]s
+gatos gatOs
+gatos gotOs
+gatrell gatr@l
+gatsby gatsb/
+gatson gats~
+gatt gat
+gatten gat~
+gatti gat/
+gatting gat6N
+gattis gat/z
+gattis gatis
+gatton gat~
+gattuso gotUs]
+gatty gat/
+gatward gatwPd
+gatwick gAtwik
+gatwick gatwik
+gatx gateks
+gatz gats
+gatza gotz@
+gatzke gatsk
+gatzke gatsk/
+gau gO
+gaub g{b
+gaubatz g?b@ts
+gaubert g?b,rt
+gaubert g?bPt
+gaubert's g?b,rts
+gaubert's g?bPts
+gauch g{C
+gauche gOS
+gaucher gOSP
+gaucho g?C]
+gauchos g?C]z
+gaudet g]det
+gaudette g]det
+gaudin g]dan
+gaudino g{dEn]
+gaudio g{d/]
+gaudioso g{d/Os]
+gaudreau g]drO
+gaudy g{d/
+gauer g?P
+gauerke g?Pk
+gaufman g{fm~
+gaufman's g{fm~z
+gauge gAj
+gauged gAjd
+gauger gAjP
+gauges gAj@z
+gaugh g{
+gaughan g{~
+gaughman g{m~
+gaughran g{r~
+gauging gAj6N
+gaugler g{glP
+gauguin gOgan
+gauguin g{gw~
+gaul g{l
+gaulan g{l~
+gaulden g?d~
+gaulding g{ld6N
+gaulin g]lan
+gaulke g{lk
+gaulle g{l
+gaullist g{list
+gauls g{lz
+gault g{lt
+gaultier gOltyA
+gaultier goltyP
+gaultney g{ltn/
+gaumer g?mP
+gaumond g]mond
+gauna g{n@
+gaunce g{ns
+gaunt g{nt
+gauntlet g{ntl@t
+gauntness g{ntn@s
+gauntt g{nt
+gaus g{z
+gause g{z
+gausman g?sm~
+gauss g?s
+gaustad g?st@d
+gaut g{t
+gauthier g?T/P
+gauthreaux g]TrO
+gautier g?t/P
+gautney g{tn/
+gautreau g]trO
+gautreaux g]trO
+gauvain g]van
+gauvin g]van
+gauvreau g]vrO
+gauze g{z
+gavalda g@vold@
+gavan gAv~
+gave gAv
+gavel gav@l
+gaven gAv~
+gaver gAvP
+gavigan gav6g~
+gavin gavin
+gaviotas gav/{t@z
+gaviotas gavy{t@z
+gaviria g@vir/@
+gavitt gav@t
+gavras gavr@s
+gavras's gavr@s@z
+gaw g{
+gawain gow~
+gawel g{@l
+gawen g{~
+gawk g{k
+gawker gokP
+gawkers gokPz
+gawking g{k6N
+gawky g{k/
+gawlik g{l6k
+gawne g{n
+gawron g{r~
+gawronski govronsk/
+gawthrop g{Tr@p
+gaxiola gaks/Ol@
+gay gA
+gayda gAd@
+gayden gAd~
+gaydos gAd]z
+gaydosh gAduS
+gaye gA
+gayer gAP
+gayhart gAhort
+gayheart gAhort
+gayle gAl
+gayler gAlP
+gayles gAlz
+gaylor gAlP
+gaylord gAl{rd
+gayman gAman
+gaymon gAm~
+gaynatie gAn@t/
+gayner gAnP
+gayness gAn@s
+gaynor gAnP
+gays gAz
+gayshill gASil
+gayshill gAzhil
+gaytan gAt~
+gayton gAt~
+gaz gaz
+gaz goz
+gaza goz@
+gaza's goz@z
+gazans goz~z
+gazaway goz@wA
+gazda gazd@
+gazdik gazd6k
+gaze gAz
+gazed gAzd
+gazella g@zel@
+gazelle g@zel
+gazelles g@zelz
+gazes gAz@z
+gazeta g@zAt@
+gazeta g@zet@
+gazette g@zet
+gazing gAz6N
+gazonsky g@zonsk/
+gazonsky's g@zonsk/z
+gazprom gazprom
+gazzola gotsOl@
+gdansk g@dansk
+geac gEk
+geac jEEAsE
+geagea jE@jE@
+gean jEn
+gear gir
+gear's girz
+gearan gir~
+gearan's gir~z
+gearbox girboks
+gearboxes girboks@z
+geared gird
+gearey gir/
+gearhart gErhort
+gearhart girhort
+gearheart gErhort
+gearheart girhort
+gearin girin
+gearing gir6N
+gears girz
+geary gir/
+gebauer geb?P
+gebbia jeb/@
+gebbie jeb/
+gebbie's jeb/z
+gebel geb@l
+gebert gebPt
+gebhard gebhPd
+gebhardt gebhort
+gebhart gebhort
+gebler geb@lP
+gebo jAb]
+gechem geC}
+geck jek
+gecko gek]
+geckos gek]z
+ged ged
+ged jEEdE
+geddes ged@s
+geddes ged@z
+geddie jed/
+geddings jed6Nz
+geddis gedis
+gedeon ged/~
+gedney jedn/
+geduld ged@ld
+gee jE
+gee's jEz
+geeing jE6N
+geek gEk
+geeks gEks
+geeky gEk/
+geena gEn@
+geenen gEn~
+geer gir
+geerdes girdz
+geers gEPz
+geerts girts
+gees jEs
+geesaman gEs}~
+geese gEs
+geesey gEs/
+geeslin gEslin
+geeting gEt6N
+geez jEz
+geffen gef~
+geffert gefPt
+geffner gefnP
+geffre jefP
+gefinor gef~P
+gegenheimer geg~hImP
+gegg jeg
+gehl gel
+gehle jeh@l
+gehlhausen gelh?z~
+gehling geliN
+gehm jem
+gehman gem~
+gehr j,r
+gehres j,rz
+gehret g,rct
+gehrig g,r6g
+gehrig's g,r6gz
+gehring g,r6N
+gehringer g,r6NP
+gehris g,ris
+gehrke j,rk
+gehrman g,rm~
+gehrmann g,rm~
+gehrt g,rt
+gehry g,r/
+geib gIb
+geibel gIb@l
+geico gIk]
+geico's gIk]z
+geidar gIdor
+geidel gId@l
+geier gIP
+geiger gIgP
+geigle gIg@l
+geigy gIg/
+geigy's gIg/z
+geiken gIk~
+geil gIl
+geiler gIlP
+geiman gIm~
+geimer gImP
+geis gIz
+geise gIs
+geisel gIs@l
+geiselman gIs@lm~
+geisen gIs~
+geiser gIsP
+geisert gIsPt
+geisha gAS@
+geisinger gIs~jP
+geisler gIslP
+geiss gIs
+geissinger gIs~jP
+geissler gIslP
+geist gIst
+geister gIstP
+geiszler gIslP
+geitner gItnP
+geitz gIts
+gejdenson gAd~s~
+gekko gek]
+gel jel
+gelardi jcl)rd/
+gelardin g@l)rd~
+gelasia jclos/@
+gelatin jel@t~
+gelatine jel@tEn
+gelatinous j@lat~@s
+gelb jelb
+gelbart gelbort
+gelber gelbP
+gelco jelk]
+gelder geldP
+geldermann geldPm~
+gelernter g@lVntP
+gelett jelct
+gelette Zclet
+gelfand gelf~d
+gelinas gel~@z
+gelineau Zel~]
+gell jel
+gellatly jel@tl/
+geller gelP
+gellerman gelPm~
+gellert gelPt
+gelles jelz
+gelli gel/
+gellis gelis
+gellman gelm~
+gellner gelnP
+gelman gelm~
+gelpi jelp/
+gels jelz
+gelsinger gels~jP
+geltz gelts
+gelvin gelvin
+gem jem
+gem's jemz
+gemayel g}A@l
+gemayel g}I@l
+gemayel j}I@l
+gemayel's g}A@lz
+gemayel's g}I@lz
+gemayel's j}I@lz
+gemberling gembPl6N
+gemco jemk]
+gemcraft jemkraft
+gemcraft's jemkrafts
+gemex jemcks
+gemfibrozil gemfibr]z@l
+gemfibrozil jimfAbr]zil
+gemignani jcm/gnon/
+gemina gcmEn@
+geminate jem~@t
+geminate jem~At
+gemini jem~E
+gemini jem~I
+gemma jem@
+gemme jem
+gemmell gem@l
+gemmer gemP
+gemmill gem@l
+gems jemz
+gemsbok gemzbok
+gemstone jemstOn
+gemstones jemstOnz
+gen jenP@l
+gen. jen
+gen. jenP@l
+gena jen@
+genady j~Ad/
+gencarelli jcnkorel/
+genco jeNk]
+gencor jenk{r
+gencorp jenk{r
+gencorp jenk{rp
+gencorp's jenk{rps
+gencorp's jenk{rs
+gendarme Zondorm
+gender jendP
+genders jendPz
+gendler jendlP
+gendreau ZcndrO
+gendrisek jedr@sek
+gendrisek's jedr@seks
+gendron jendr~
+gene jEn
+gene's jEnz
+genealogy jEn/ol@j/
+geneen j~En
+genego gen@gO
+genego jEEenEjEO
+genego jen@g]
+genelab jen@lab
+genelabs jen@labz
+genemedicine jen}ed@s~
+genencor jen~k{r
+genentech jen~tek
+genentech's jen~teks
+genera jenP@
+general jenP@l
+general jenr@l
+general's jenP@lz
+general's jenr@lz
+generale jenPal
+generales jencrolcs
+generali jenPol/
+generalissimo jencr@lis}O
+generalist jenP@l@st
+generalists jenP@l@s
+generalists jenP@l@ss
+generalists jenP@l@sts
+generalities jenPal@t/z
+generality jenPal@t/
+generalization jenP@l@zAS~
+generalization jenr@l@zAS~
+generalizations jenP@l@zAS~z
+generalizations jenr@l@zAS~z
+generalize jenP@lIz
+generalized jenP@lIzd
+generalized jenr@lIzd
+generalizing jenP@lIz6N
+generalizing jenr@lIz6N
+generally jenP@l/
+generally jenr@l/
+generals jenP@lz
+generals jenr@lz
+generalship jenP@lSip
+generate jenPAt
+generated jenPAt@d
+generates jenPAts
+generating jenPAt6N
+generation jenPAS~
+generation's jenPAS~z
+generational jenPAS~@l
+generationally jenPAS~@l/
+generations jenPAS~z
+generative jenP@t6v
+generator jenPAtP
+generators jenPAtPz
+genereux ZenP]
+generic j~,r6k
+generically j~,r6kl/
+generics j~,r6ks
+genero j~V]
+generosity jenPos@t/
+generous jenP@s
+generously jenP@sl/
+genes jEnz
+genesco jcnesk]
+genesee jen@sE
+genesis jen@s@s
+genet jenct
+genetic j~et6k
+genetically j~et6kl/
+geneticist j~et@s@st
+geneticists j~et@s@s
+geneticists j~et@s@ss
+geneticists j~et@s@sts
+genetics j~et6ks
+genetization jen@t@zAS~
+geneva j~Ev@
+geneve j~Ev
+genevieve jen@vEv
+genex jencks
+genex's jencks@z
+geng jeN
+gengenbach geN~bok
+gengenbach jeN~bok
+genger jeNgP
+genghis jeNh@s
+gengler geNlP
+gengler jeNlP
+genial jEny@l
+geniality jEn/al@t/
+genicom jen6kom
+genie jEn/
+geniere jcny,r
+genis genis
+genisco jcnisk]
+genital jen@t@l
+genitalia jcn@toly@
+genitals jen@t@lz
+genius jEny@s
+geniuses jEny@s@z
+genk jeNk
+genlyte jenlIt
+genmar jenmor
+genna jen@
+gennadi jcnod/
+gennady g~od/
+gennaro j~)r]
+gennett jenct
+gennifer jen@fP
+geno jEn]
+genoa jen]@
+genocidal jen@sId@l
+genocide jen@sId
+genoese jen]s
+genome jEnOm
+genossenschaftsbank gcnOscnSaftsbaNk
+genotype jen@tIp
+genotypes jen@tIps
+genova jen]v@
+genovese jen@v/z
+genovesi jen]ves/
+genovise jen@v/z
+genpharm jenform
+genrad jenrad
+genre Zonr@
+genres Zonr@z
+genrich genr6k
+gens jenz
+genscher genSP
+gensel gens@l
+gensia jensE@
+genske jensk
+gensler gens@lP
+genson jens~
+genstar jenstor
+gent jent
+genteel jcntEl
+genter jentP
+genther genTP
+genthner jenTnP
+gentian jenS~
+gentile jentIl
+gentile's jentIlz
+gentiles jentIlz
+gentility jcntil@t/
+gentle jen@l
+gentle jent@l
+gentleladies jent@lAd/z
+gentlelady jent@lAd/
+gentleman jen@lm~
+gentleman jent@lm~
+gentleman's jen@lmunz
+gentleman's jent@lmunz
+gentlemanly jen@lm~l/
+gentlemanly jent@lm~l/
+gentlemen jen@lmcn
+gentlemen jent@lmcn
+gentlemen's jen@lmenz
+gentlemen's jent@lmenz
+gentleness jen@ln@s
+gentleness jent@ln@s
+gentler jentlP
+gentles jen@lz
+gentles jent@lz
+gentlest jent@l@st
+gentlewoman jen@lwqm~
+gentlewoman jent@lwqm~
+gentlewoman's jen@lwqm~z
+gentlewoman's jent@lwqm~z
+gentlewomen jen@lwim~
+gentlewomen jent@lwim~
+gentlewomen's jen@lwim~z
+gentlewomen's jent@lwim~z
+gently jentl/
+gentner jentnP
+gentrification jentr@f6kAS~
+gentrified jentr@fId
+gentrify jentr@fI
+gentrifying jentr@fI6N
+gentry jentr/
+gentz jents
+gentzler jentslP
+genuine jeny@w~
+genuine jenyUwIn
+genuinely jeny@w~l/
+genuinely jenyUwInl/
+genuineness jeny@w~@s
+genung jen@N
+genus jEn@s
+genz jenz
+genzyme jenzIm
+geo jE]
+geocentric jE]sentr6k
+geochemistry jE]kem@str/
+geodesic jE@des6k
+geodesy j/od@s/
+geodyne jE]dIn
+geoff jef
+geoffrey jefr/
+geoffrey's jefr/z
+geoffrion jEofr/~
+geoffroy jE@fr<
+geoghegan g@hAg~
+geographer j/ogr@fP
+geographic jE@graf6k
+geographic's jE@graf6ks
+geographical jE@graf6k@l
+geographically jE@graf6k@l/
+geographically jE@graf6kl/
+geography j/ogr@f/
+geoid jE<d
+geologic jE@loj6k
+geological jE@loj6k@l
+geologist j/ol@j@st
+geologists j/ol@j@s
+geologists j/ol@j@ss
+geologists j/ol@j@sts
+geology j/ol@j/
+geomagnetic jE]magnet6k
+geometric jE}etr6k
+geometrical jE}etr6k@l
+geometrically jE}etr6kl/
+geometrics jE}etr6ks
+geometries j/om@tr/z
+geometry j/om@tr/
+geomorphology jE}{rfol@j/
+geon jEon
+geophysical jE]fiz@k@l
+geopolitic jE]pol@t6k
+geopolitical jE]p@lit6k@l
+geopolitically jE]p@lit6kl/
+geopolitics jE]pol@t6ks
+geordie jEPd/
+georg gA{rg
+georgakis j{rjok@s
+georgann j{rjan
+george j{rj
+george's j{rj@z
+georgene j{rjEn
+georges j{rj@z
+georgeson j{rj@s~
+georgeson j{rjs~
+georgetown j{rjt?n
+georgette j{rjet
+georgi j/)rj/
+georgia j{rj@
+georgia's j{rj@z
+georgiades j{rj/od@s
+georgiadis j{rj/odis
+georgian j{rj~
+georgiana j{rj/an@
+georgians j{rj~z
+georgie j{rj/
+georgienne j{rj/en
+georgina j{rjEn@
+georgine j{rjEn
+georgio j{rjE]
+georgiou j{rjO
+georgopoulos j{rjop@l@s
+georgy j{rj/
+geostrophic jE]strof6k
+geosyncline jE]sinklIn
+geotaxis jE]taks@s
+geotek gE]tek
+geothermal jE]TVm@l
+geotropic jE@trop6k
+geotropism j/otr@piz}
+geoworks jE]wPks
+gephardt gephort
+gephardt's gephorts
+gephart gephort
+geppert gepPt
+gera j,r@
+gerace jPoC/
+geraci jPoC/
+geraghty j,r@t/
+gerais jPA
+gerald j,r@ld
+geraldi hcrald/
+geraldi jcrald/
+geraldina jPoldEn@
+geraldine jcr@ldEn
+geraldo hPold]
+geraldo jPold]
+geralds j,r@ldz
+geran j,r~
+geranium jPAn/}
+geraniums jPAn/}z
+gerard jP)rd
+gerardi jP)rd/
+gerardo jP)rd]
+gerashchenko ge@SANk]
+gerasimov gPas}ov
+gerasimov jPas}ov
+gerbasi jPbos/
+gerber gVbP
+gerber's gVbPz
+gerberding gVbPd6N
+gerbert gVbPt
+gerbig gVb6g
+gerbino jPbEn]
+gerbrandt gVbrant
+gerchas gVC@z
+gerchas gVS@z
+gerd gVd
+gerda gVd@
+gerdeman gVdm~
+gerdes ZVdz
+gerdes' ZVdz
+gerding g,rt6N
+gerdts jVts
+gere gir
+gere jir
+geremia jPEm/@
+geren gir~
+gerena jPen@
+gerety Z,r@t/
+gergel gVg@l
+gergely jVjl/
+gergen gVg~
+gergen's gVg~z
+gerger gVgP
+gergrude gVgrUd
+gerhard gVhord
+gerhardt gVhort
+gerhart gVhort
+gerhold gVh]ld
+geriatric jer/atr6k
+geriatrician jer/@triS~
+geriatricians jer/@triS~z
+geriatrics jer/atr6ks
+gerich g,r6k
+gericke j,r6k
+gerig j,r6g
+gering gir6N
+geringer g,r~jP
+gerk jVk
+gerke jVk
+gerken gVk~
+gerkin jVkin
+gerlach gVl@k
+gerleman g{r@lm~
+gerlich gVl6k
+gerling gVl6N
+gerlock gVl@k
+gerloff gVl{f
+germ jVm
+germain jPmAn
+germain's jPmAnz
+germaine ZPmAn
+german jVm~
+german's jVm~z
+germane jPmAn
+germani jPmon/
+germania jPmAn/@
+germanic jPman6k
+germann gVm~
+germano jPmon]
+germans jVm~z
+germans' jVm~z
+germantown jVm~t?n
+germany jVm~/
+germany's jVm~/z
+germanys jVm~/z
+germe jVm
+germer jVmP
+germicide jVm@sId
+germinate jVm~At
+germinated jVm~At@d
+germination jVm~AS~
+germiston jVm@ston
+germiston's jVm@stonz
+germond gVm~d
+germs jVmz
+gerner gVnP
+gernert gVnPt
+gero j,r]
+gerold g,r]ld
+gerome g,r}
+geron j,r~
+geronimo j@r{n}O
+gerontologist jer~tol@j@st
+gerontology jer~tol@j/
+geroux ZPU
+gerow j,r]
+gerrald j,r@ld
+gerri j,r/
+gerrick j,r6k
+gerrie j,r/
+gerringer j,r6NP
+gerrish j,riS
+gerrit j,r@t
+gerrits j,r@ts
+gerritsen g,r@ts~
+gerrity j,r@t/
+gerry j,r/
+gerry's j,r/z
+gerrymander j,r/mandP
+gerrymandered jer/mandPd
+gerrymandering jer/mandP6N
+gerrymanders j,r/mandPz
+gersch gVS
+gersh gVS
+gershman gVSm~
+gershon gVS~
+gershowitz gVS@wits
+gershwin gVSw~
+gershwin's gVSw~z
+gerski gVsk/
+gerson gVs~
+gerson jVs~
+gerst gVst
+gerstein gVst/n
+gerstein gVstIn
+gerstel gVst@l
+gersten gVst~
+gerstenberger gVst~bPgP
+gerstenhaber gVst~hAbP
+gerster gVstP
+gerstman gVstm~
+gerstner gVstnP
+gerstner's gVstnPz
+gerszewski gPSefsk/
+gert gVt
+gerth gVT
+gertie jVt/
+gertler gVt@lP
+gertner gVtnP
+gertrud gVtrUd
+gertrude gVtrUd
+gertsch gVC
+gerty jVt/
+gertz gVts
+gervais ZPvA
+gervase gVv@s
+gervasi jPvos/
+gervasio jPvos/]
+gerwig gVw6g
+gerwin gVwin
+gery j,r/
+gesamtmetall gcsamtmet@l
+geschke geSk
+gesco gesk]
+gesell ges@l
+gesell's ges@lz
+gesellschaft g@selSaft
+geske jesk
+gesner gesnP
+gess jes
+gessel ges@l
+gessert gesPt
+gessler ges@lP
+gessner gesnP
+gest jest
+gestal jest@l
+gestapo g@stop]
+gestate jcstAt
+gestation jcstAS~
+gestetner g@stetnP
+gesture jesCP
+gestured jesCPd
+gestures jesCPz
+gesturing jesCP6N
+gesualdi jcsUold/
+get get
+get git
+get-together get@geTP
+get-together gett@geTP
+get-togethers get@geTPz
+get-togethers gett@geTPz
+get-well gethwel
+get-well getwel
+getaway get@wA
+getaways get@wAz
+getchell geC@l
+geter getP
+gethers geTPz
+getman getm~
+gets gets
+gets gits
+getsinger gets~jP
+gettel get@l
+getter getP
+getters getPz
+gettin' git~
+getting get6N
+getting git6N
+gettinger get6NP
+gettinger get~jP
+gettings get6Nz
+gettis getis
+gettle get@l
+gettler get@lP
+gettman getm~
+getts gets
+getty get/
+getty's get/z
+gettys get/z
+gettysburg get/zbPg
+getulio g@CUl/]
+getz gets
+geurin ZPan
+geurts ZVts
+geva gAv@
+gevaert g@v,rt
+geving jEv6N
+gewirtz gUPts
+geyelin jAilin
+geyer gAP
+geyser gIzP
+geysers gIzPz
+gfeller g@felP
+ghada god@
+ghadafi g@daf/
+ghadafi g@dof/
+ghadafi k@dof/
+ghafar g@f)r
+ghafar g{fP
+ghali gol/
+ghali's gol/z
+ghana gan@
+ghana's gan@z
+ghanaian g~I~
+ghanaians g~I~z
+ghandi gond/
+gharbonifar gorbon@for
+ghastliness gastl/n@s
+ghastly gastl/
+ghattas gotus
+ghaznavi g@znov/
+ghee gE
+gheen gEn
+ghent gent
+gherardi gP)rd/
+gherig g,r6g
+gherig's g,r6gz
+gherman gVm~
+ghetto get]
+ghettos get]z
+ghez gez
+ghezzi gez/
+ghidella g@del@
+ghio gI]
+gholamreza gOl}rAz@
+gholson gOls~
+gholston gOlst~
+ghorbanifar g{rban@fP
+ghorbanifar g{rban@for
+ghorbanifar g{rbon@fP
+ghorbanifar g{rbon@for
+ghormley g{rml/
+ghose gOz
+ghosh goS
+ghost gOst
+ghostbuster gOstbustP
+ghostbusters gOstbustPz
+ghostlike gOstlIk
+ghostly gOstl/
+ghosts gOs
+ghosts gOss
+ghosts gOsts
+ghoulish gUl6S
+ghrist grist
+ghulam gyUlam
+ghuloum gUlOm
+gia's jE@z
+giacalone jokol]n/
+giacco jok]
+giacinta joC/nt@
+giacobbe jok]b/
+giacomelli j@k]mel/
+giacometti j@k}et/
+giacomini j@k]mEn/
+giacomo jok}]
+giaconda jE@kond@
+giaconda's jE@kond@z
+giacone jE@kOn/
+giaimo jAm]
+gialanella j@lonel@
+giamatti jE}ot/
+giambalvo jombolv]
+giambra jombr@
+giambrone jombr]n/
+giammalva jE}{lv@
+giammarco jomork]
+giammarino j}orEn]
+giampa jomp@
+giampaolo jomp?l]
+giampapa jompop@
+giampietro jomp/tr]
+gian jEon
+giancana j/@kon@
+giancarlo jEaNk)rl]
+giancola joNk]l@
+gianelli j~el/
+gianfrancesco jonfranCesk]
+gianfranco jE~frank]
+gianfranco j~fronk]
+giang j/oN
+giang joN
+giangrande jongrand/
+gianini j~En/
+gianino j~En]
+giannattasio jonotos/]
+giannelli j~el/
+giannetti j~et/
+giannetto j~et]
+gianni j/on/
+gianni jon/
+giannini j~En/
+giannino jE~En]
+giannola jon]l@
+giannone jon]n/
+giannotti jon]t/
+gianotti jon]t/
+giant jI~t
+giant's jI~ts
+giants jI~ts
+giants' jI~ts
+giap j/ap
+giap jyap
+giaquinto jokw/nt]
+giard j)rd
+giard j/)rd
+giardina j)rd/n@
+giardini jPdEn/
+giardino jPdEn]
+giarratano jor@ton]
+giarrusso jorUs]
+gib gib
+gibas jIb@z
+gibb jib
+gibb's gibz
+gibbard Zib)rd
+gibbens gib~z
+gibberish gibP6S
+gibbins jibinz
+gibble jib@l
+gibbon gib~
+gibboney jib~/
+gibbons gib~z
+gibbs gibz
+gibbs's gibz@z
+gibby jib/
+gibe jIb
+gibeau ZibO
+gibeault ZibO
+giberson jibPs~
+gibert gibPt
+gibian gib/~
+gibian's gib/~z
+giblen gibl~
+gibler jib@lP
+giblet jibl@t
+giblin jiblin
+gibney jibn/
+giboney jib~/
+gibraltar j@br{ltP
+gibson gibs~
+gibson's gibs~z
+gick jik
+gidcumb gidk}
+giddens gid~z
+giddings gid6Nz
+giddy gid/
+gidel gIdel
+gideon gid/~
+gidget gij@t
+gidley gidl/
+gidney gidn/
+gidwitz gidwits
+giebel gEb@l
+giebler gEb@lP
+gieck jEk
+giefer gEfP
+gieger gEgP
+giegerich gEgP6k
+giel jEl
+gielgud gElg@d
+gielow jEl]
+gienger gEnjP
+gienow gEn?
+gier jir
+giere jir
+gierhart girhort
+gierke jirk
+gierman girm~
+giersch girS
+gies gEz
+giesbrecht gEsbr6kt
+giese jEs
+giesecke gEs6k
+gieseke gEs6k
+gieseler gEs@lP
+gieselman gEs@lm~
+giesen gEs~
+gieser gEsP
+giesey jEs/
+gieske jEsk
+giesler gEs@lP
+giessen gEzs~
+gietzen gEtz~
+giff gif
+giffard gifPd
+giffen gif~
+gifferd gifPd
+giffin gifin
+gifford gifPd
+gifford's gifPdz
+giffords gifPdz
+giffy gif/
+gift gift
+gifted gift@d
+gifting gift6N
+giftrust giftrust
+gifts gifs
+gifts gifts
+giftware giftwer
+gig gig
+gigabyte gig@bIt
+gigabytes gig@bIts
+gigaflop gig@flop
+gigaflops gig@flops
+gigante j/gont/
+gigantic jIgan6k
+gigantic jIgant6k
+giger gIgP
+gigging gig6N
+giggle gig@l
+giggled gig@ld
+giggles gig@lz
+giggling gig@l6N
+giggling gigl6N
+giggly gig@l/
+gigi jEj/
+giglia jEgl/@
+giglio jigl/]
+gigliotti j/gl/Ot/
+gignac gign@k
+gignoux ginU
+gigot jig@t
+gigot's jig@ts
+gigs gigz
+giguere j/g,rA
+gikas gIk@z
+gil gil
+gilardi j/l)rd/
+gilb gilb
+gilberg gilbPg
+gilbert gilbPt
+gilbert's gilbPts
+gilberta j/lb,rt@
+gilberte gilbPt
+gilberti j/lb,rt/
+gilbertina j/lbPtEn@
+gilbertine j/lbPtEn/
+gilberto gilb,rtO
+gilberto gilbVt]
+gilbertson gilbPts~
+gilbey gilb/
+gilbo jElb]
+gilboy gilb<
+gilbreath gilbreT
+gilbreth gilbrcT
+gilbride gilbrId
+gilby gilb/
+gilchrest gilkPist
+gilchrist gilkrist
+gilcrease gilkrEs
+gilcrest gilkPist
+gilcrest gilkrcst
+gild gild
+gilda gild@
+gilday gildA
+gildea jEld/@
+gilded gild@d
+gilden gild~
+gilder gildP
+gilder's gildPz
+gildersleeve gildPslEv
+gilding gild6N
+gildner gildnP
+gildon gild~
+gile gIl
+gilead gilEd
+giles jIlz
+gilfillan gilfil~
+gilford gilfPd
+gilger gilgP
+gilgit giljit
+gilgore gilg{r
+gilham gilh}
+gilhooly gilhUl/
+gilkerson gilkPs~
+gilkes gilks
+gilkeson gilk@s~
+gilkey gilk/
+gilkison gilkis~
+gilkisons gilkis~z
+gill gil
+gill's gilz
+gillam gil}
+gillan gil~
+gilland gil~d
+gillard Zil)rd
+gillaspie gil@sp/
+gillaspy gil@sp/
+gille gIl
+gillean gil~
+gilleland gil@land
+gillem gilim
+gillen gil~
+gillen's gil~z
+gillentine gil~tIn
+giller gilP
+gilleran gilPan
+gillers gilPz
+gilles ZEl
+gillespie g@lesp/
+gillet gilct
+gillett jilit
+gillette j@let
+gillette's j@lets
+gilley gil/
+gillham gilh}
+gilliam gil/}
+gillian jil/~
+gilliand gil/~d
+gilliard gil/Pd
+gilliatt gil/at
+gillick gil6k
+gillie gil/
+gillies gil/z
+gillig gil6g
+gilligan gil@g~
+gilligan's gil@g~z
+gillihan gil@han
+gillikin gil@k~
+gillilan gil@l~
+gilliland gil@l~d
+gillin gilin
+gillingham gil@Nham
+gillings gil6Nz
+gillinov gil~ov
+gillins gilinz
+gillis gilis
+gillison gil@s~
+gillispie g@lesp/
+gillman gilm~
+gillmore jElm{r
+gillock gil@k
+gillogly gil@gl/
+gillon gil~
+gillooly gilUl/
+gillooly's gilUl/z
+gillott gil@t
+gillotti j/lOt/
+gills gilz
+gillson gils~
+gillum gil}
+gilly gil/
+gilman gilm~
+gilmartin gilm)rt~
+gilmer gilmP
+gilmore gilm{r
+gilmour Zilmqr
+gilpatrick gilp@tr6k
+gilpatrick gilpatr6k
+gilpin gilpin
+gilreath gilrcT
+gilroy gilr<
+gilsdorf gilsd{rf
+gilson gils~
+gilstrap gilstr@p
+gilt gilt
+giltner giltnP
+gilts gilts
+gilvin gilvin
+gilyard Z@ly)rd
+gimbel gimb@l
+gimenez j/mAncz
+gimlin gimlin
+gimme gim/
+gimmick gim6k
+gimmickry gim6kr/
+gimmicks gim6ks
+gimmicky gim@k/
+gimpel gimp@l
+gin jin
+gina jEn@
+gina's jEn@z
+ginandjar j~anjP
+ginas jEn@z
+ginder gIndP
+gindin gindin
+gindlesperger gind@lspPgP
+gines jInz
+ginevra j~evr@
+ging jiN
+gingell giNg@l
+ginger jinjP
+gingerbread jinjPbred
+gingerich giNgP6k
+gingerly jinjPl/
+gingery jinjP/
+gingham giN}
+ginghams giN}z
+gingles jiNg@lz
+gingold gingOld
+gingold jingOld
+gingras giNgr@z
+gingrich giNgr6C
+gingrich's giNgr6C@z
+gingriches giNgr6C@z
+ginley jinl/
+ginn jin
+ginned jind
+ginnell jinel
+ginnie jin/
+ginning jin6N
+ginny jin/
+gino jEn]
+ginocchio j/nOk/]
+ginsberg ginsbPg
+ginsburg ginzbPg
+ginsburg's ginzbPgz
+ginseng jinseN
+ginsu ginsU
+ginsu's ginsUz
+gintel jintel
+ginter gintP
+ginther ginTP
+ginting jint6N
+ginty jint/
+gintz gints
+ginyard jinyord
+ginza ginz@
+ginzberg ginzbPg
+gioia jOy@
+gionet j/OnAt
+gionfriddo j]nfrEd]
+giordani j{rdon/
+giordano j{rdon]
+giorgi j{rj/
+giorgia j{rj@
+giorgio j{rj/]
+giovanelli j]vonel/
+giovanetti j]vonet/
+giovannetti j]vonet/
+giovanni j@von/
+giovanni jE]von/
+giovanni's j@von/z
+giovanni's jE]von/z
+giovanniello j]von/el]
+giovannini j]vonEn/
+giovannoni j]vonOn/
+giovenco j]venk]
+giovinazzo j]v/noz]
+gipe jIp
+gipp jip
+gipper gipP
+gipple jip@l
+gipson gEps~
+giraffe jPaf
+giraffes jPafs
+giraldo j6rold]
+girard jP)rd
+girardi j6r)rd/
+girardin Z{rordan
+girardot Z{rord]
+giraud ZIrO
+gird gVd
+girder gVdP
+girders gVdPz
+girding gVd6N
+girdle gVd@l
+girdler gVd@lP
+girdley gVdl/
+girdner gVdnP
+girds gVdz
+gire gIr
+giren gir~
+giren jir~
+girgenti j6rjent/
+girgis gVgis
+girija girEj@
+girl gVl
+girl's gVlz
+girlfriend gVlfrend
+girlfriend's gVlfrendz
+girlfriends gVlfrendz
+girlhood gVlhqd
+girlie gVl/
+girlish gVl6S
+girlishly gVl6Sl/
+girls gVlz
+girls' gVlz
+girobank gir]baNk
+girod ZPod
+giroir ZIrw)r
+girolamo j6r]lom]
+giroldi g6rOld/
+giroldi's g6rOld/z
+giron g{r~
+girouard ZIrUPd
+giroux g6rU
+girozentrale g6rOz~trol
+girsky gVsk/
+girt gVt
+girten gVt~
+girth gVT
+girtman gVtm~
+girton gVt~
+girvan gVv~
+girven gVv~
+girvin gVvin
+gisbert gisbPt
+gisbert jisbPt
+giscard Zisk)r
+giscard gisk)rd
+gisclair Ziskl,r
+gisela gEz@l@
+gisella jisel@
+giselle Zisel
+gisenyi jisen/
+gisenyi jiseny/
+gish giS
+gish jiS
+gisi jEs/
+gisler gis@lP
+gismondi j/smOnd/
+gissendanner gis~danP
+gissi gis/
+gist jist
+gitana j/tan@
+gitano giton]
+gitano's giton]z
+gitchell jiC@l
+githa jiT@
+githens giT~z
+gitlin jitlin
+gittelman git@lm~
+gittens git~z
+gitter gitP
+gittings jit6Nz
+gittins jitinz
+gittis gitis
+gittis jit@s
+gittleman git@lm~
+gittleman's git@lm~z
+gittler gitlP
+gitto jEt]
+giudice jUdis/
+giudici jUdiC/
+giuffre jUfr/
+giuffre's jUfr/z
+giuffrida jUfr/d@
+giuliani jUl/on/
+giuliani's jUl/on/z
+giuliano jUl/on]
+giulio jUl/]
+giunta jUnt@
+giurescu jUreskU
+giuseppe j@sep/
+giusti jUst/
+giusto jUst]
+givan giv~
+give giv
+giveaway giv@wA
+giveaways giv@wAz
+giveback gIvbak
+givebacks gIvbaks
+given giv~
+givenchy g6venC/
+givenness giv~@s
+givens giv~z
+givens's giv~z@z
+giver givP
+givers givPz
+gives givz
+giveth givcT
+givhan givh~
+givin' giv~
+giving giv6N
+givins givinz
+givler givlP
+giza gEz@
+giza giz@
+gizbert gizbPt
+gizbert's gizbPts
+gizmo gizmO
+gizmos gizm]z
+gizzard gizPd
+gizzi jEts/
+gjelten jelt~
+gjelten's jelt~z
+gjerde jVd
+glaab glob
+glab glab
+glace glAs
+glacial glAS@l
+glaciate glAS/At
+glaciated glAS/At@d
+glaciation glAS/AS~
+glacier glASP
+glacier's glASPz
+glaciers glASPz
+glacis glAs@s
+glacken glak~
+glackin glakin
+glad glad
+gladd glad
+gladden glad~
+gladding glad6N
+gladdock glad@k
+glade glAd
+glades glAdz
+gladfelter gladfeltP
+gladhill gladhil
+gladiator glad/AtP
+gladiators glad/AtPz
+gladieux glad/]
+gladiolus glad/Ol@s
+gladis gladis
+gladish gladiS
+gladje gladjE
+gladly gladl/
+gladman gladm~
+gladney gladn/
+gladson glads~
+gladstein gladstEn
+gladstein gladstIn
+gladstone gladstOn
+gladstones gladstOnz
+gladu glAdU
+gladwell gladwel
+gladwin gladwin
+gladys gladis
+glaeser glAzP
+glahn glan
+glamor glamP
+glamorize glamPIz
+glamorized glamPIzd
+glamorizing glamPIz6N
+glamorous glamP@s
+glamour glamP
+glance glans
+glanced glanst
+glances glans@z
+glancing glans6N
+glancy glans/
+gland gland
+glander glandP
+glandon gland~
+glands glandz
+glandular glanj@lP
+glanton glant~
+glantz glants
+glanville glanvil
+glanz glanz
+glanzer glanzP
+glanzman glanzm~
+glare gl,r
+glared gl,rd
+glares gl,rz
+glaring gl,r6N
+glaris gl,ris
+glas glas
+glasby glasb/
+glasco glosk]
+glascock glask@k
+glascoe glask]
+glaser glAzP
+glasgow glasgO
+glasgow glaskO
+glasheen gluSEn
+glashow glaS?
+glasner glasnP
+glasnost glasnost
+glasnost gl{snOst
+glasnost gl{stnOst
+glasow glAz]
+glasper glaspP
+glaspie glasp/
+glaspy glasp/
+glass glas
+glass's glas@z
+glassberg glasbPg
+glassblower glasblOP
+glassblowers glasblOPz
+glassblowing glasblO6N
+glassburn glasbVn
+glassco glask]
+glasscock glaskok
+glassed glast
+glasser glasP
+glasses glas@z
+glassey glas/
+glassford glasf{rd
+glasslike glaslIk
+glassmaker glasmAkP
+glassmaking glasmAk6N
+glassman glasman
+glassman glasm~
+glassmeyer glasmIP
+glassner glasnP
+glasson glas~
+glassware glaswer
+glassy glas/
+glastetter glastctP
+glatfelter glatfcltP
+glatt glat
+glatz glats
+glatzer glAtzP
+glaub gl{b
+glauber gl?bP
+glaucoma gl{kOm@
+glaude gl{d
+glaus gl{z
+glauser gl?sP
+glavan glAv~
+glavin glavin
+glavine glavEn
+glavine glavin
+glawe gl{
+glaxo glaks]
+glaxo's glaks]z
+glaza gloz@
+glaze glAz
+glazebrook glAzbrqk
+glazed glAzd
+glazener glaz/nP
+glazer glAzP
+glazes glAz@z
+glazier glAz/P
+glazing glAz6N
+glazner glaznP
+glazunov glazUnov
+gleacher glECP
+gleam glEm
+gleamed glEmd
+gleaming glEm6N
+gleams glEmz
+glean glEn
+gleaned glEnd
+gleason glEs~
+gleason's glEs~z
+gleaton glEt~
+gleave glEv
+gleaves glEvz
+gleba glEb@
+gleckler gleklP
+gleda glAd@
+gledhill gledhil
+glee glE
+gleeful glEf@l
+gleefully glEf@l/
+gleeson glEz~
+gleghorn gleghPn
+gleich glIk
+gleichauf glIk{f
+gleim glEm
+gleisner glIsnP
+glemp glemp
+glen glen
+glenayre glen,r
+glenayre glenIr
+glenbrook glenbrqk
+glenda glend@
+glendale glendAl
+glendening glend~6N
+glendenning glend~6N
+glendinning glend~6N
+glendon glend]n
+glenfed glenfed
+glenfed's glenfedz
+glengarry gleng,r/
+glenham glenh}
+glenham glen}
+glenmore glenm{r
+glenn glen
+glenn's glenz
+glenna glen@
+glennie glen/
+glennon glen~
+glenny glen/
+glens glenz
+glenview glenvyU
+glenville glenvil
+glenwood glenwqd
+glenwood's glenwqdz
+gless gles
+glessner glesnP
+glew glU
+glib glib
+glibly glibl/
+glick glik
+glickenhaus glik~h?s
+glickman glikm~
+glickman's gliksm~z
+glicksman gliksm~
+glickstein glikstEn
+glickstein glikstIn
+glidden glid~
+glide glId
+glided glId@d
+glider glIdP
+gliders glIdPz
+glides glIdz
+glidewell glIdwel
+gliding glId6N
+glimcher glimCP
+glimmer glimP
+glimmering glimP6N
+glimmers glimPz
+glimpse glimps
+glimpsed glimpst
+glimpses glimps@z
+glines glInz
+glinka gliNk@
+glinski glinsk/
+glint glint
+glinting glint6N
+glissandi gl@sond/
+glisson glis~
+glisten glis~
+glistened glis~d
+glistening glisn6N
+glistening glis~6N
+glitch gliC
+glitches gliC@z
+glitter glitP
+glittered glitPd
+glittering glitP6N
+glitters glitPz
+glittery glitP/
+glitz glits
+glitzy glits/
+glo glO
+gloaming glOm6N
+gloat glOt
+gloated glOt@d
+gloating glOt6N
+gloats glOts
+glob glob
+global glOb@l
+global's glOb@lz
+globalization glOb@l@zAS~
+globalize glOb@lIz
+globalized glOb@lIzd
+globally glOb@l/
+globalstar glOb@lstor
+globcom globkom
+globe glOb
+globe's glObz
+globes glObz
+globetrotter glObtr{tP
+globetrotters glObtr{tPz
+globex glOb@ks
+globo glOb]
+globs globz
+globular globy@lP
+globulin globy@l~
+globulins globy@l~z
+globus glOb@s
+glock glok
+glockenspiel glok~spEl
+glockner gloknP
+glod glod
+glodowski gl@d{fsk/
+gloe glO
+gloeckner glOknP
+gloede glOd
+glogowski gl@g{fsk/
+glomar glOmor
+glomb glom
+glomski glomskE
+glonass glon@s
+gloom glUm
+gloomier glUm/P
+gloomily glUm@l/
+gloomy glUm/
+gloor glqr
+glop glop
+gloppy glop/
+glor gl{r
+glore gl{r
+glori gl{r/
+gloria gl{r/@
+gloriana gl{r/an@
+gloriane gl{r/an
+glories gl{r/z
+glorification gl{r@f6kAS~
+glorified gl{r@fId
+glorifies gl{r@fIz
+glorify gl{r@fI
+glorifying gl{r@fI6N
+glorioso gl{r/Os]
+glorious gl{r/@s
+gloriously gl{r/@sl/
+glory gl{r/
+gloss gl{s
+glossary gl{sP/
+glossed gl{st
+glosser gl{sP
+glosses gl{s@z
+glossier gl{s/P
+glossman gl{sm~
+glosson glos~
+glossy gl{s/
+gloster glostP
+glotfelty glotfclt/
+glottal glot@l
+glottis glot@s
+glotzbach glotsbok
+gloucester gl{stP
+glove gluv
+gloved gluvd
+glover gluvP
+gloves gluvz
+glow glO
+glowacki gl?otsk/
+glowed glOd
+glower gl?P
+glowered gl?Pd
+glowering gl?P6N
+glowing glO6N
+glowingly glO6Nl/
+glows glOz
+gloyd gl<d
+gluck gluk
+gluck's gluks
+gluckman glukm~
+glucksman gluksm~
+glucose glUkOs
+glucoside glUk@sId
+glucosides glUk@sIdz
+glue glU
+glueck glUk
+glued glUd
+glues glUz
+glum glum
+glumly gluml/
+glunt glunt
+gluntz glunts
+glunz glunz
+gluskin gluskin
+glut glut
+glutamate glUt}At
+glutamic glUtam6k
+glutaric glUtar6k
+gluten glUt~
+gluth glUT
+gluts gluts
+glutted glut@d
+gluttonous glut~@s
+gluttons glut~z
+gluttony glut~/
+glycel glis@l
+glycerol glisPOl
+glycine glIsEn
+glycine glIs~
+glycogen glIk@j~
+glycol glIkOl
+glycol glIk{l
+glycolic glIk{l@k
+glycomed glIkOmd
+glycomed glIk]med
+glycoside glIk@sId
+glymph glimf
+glyn glin
+glyndebourne glindb{rn
+glynis glinis
+glynn glin
+glynnie glin/
+glynnis glinis
+gmbh g}
+gmbh jEembEAC
+gnagey naj/
+gnaizda nAzd@
+gnann nan
+gnarl n)rl
+gnarle n)rl
+gnarled n)rld
+gnarly n)rl/
+gnash naS
+gnashing naS6N
+gnat nat
+gnatcatcher natkaCP
+gnats nats
+gnau n?
+gnaw n{
+gnawed n{d
+gnawing n{6N
+gnaws n{z
+gnc nk
+gneiss nIs
+gnomes nOmz
+gnomic nOm6k
+gnomonic n]mon6k
+gnosticism nost@siz}
+gnu nU
+go gO
+go-cart gOkort
+goa gO@
+goad gOd
+goaded gOd@d
+goading gOd6N
+goal gOl
+goalie gOl/
+goalkeeper gOlkEpP
+goalpost gOlpOst
+goals gOlz
+goan gOn
+goans gOnz
+goar g{r
+goard g{rd
+goat gOt
+goat's gOts
+goatee gOtE
+goates gOAts
+goatley gOtl/
+goats gOts
+gob gob
+gobain gObin
+gobble gob@l
+gobbled gob@ld
+gobbledygook gob@ld/gqk
+gobbler gob@lP
+gobblers gob@lPz
+gobbling gob@l6N
+gobbling gobl6N
+gobel gOb@l
+goben gob~
+gober gObP
+goberstein gObPstEn
+goberstein gObPstIn
+gobert gobPt
+gobi gOb/
+gobie gOb/
+gobin gObin
+gobinot gOb~ot
+gobioff gOb/{f
+goble gOb@l
+goblet gobl@t
+goblin goblin
+goblins goblinz
+goblirsch goblPS
+gobs gobz
+gochenour goS~qr
+gochnauer gokn?P
+gochnour guSnqr
+gocke gok
+gockel gok@l
+gockley gokl/
+god god
+god's godz
+goda gOd@
+godar g@d)r
+godard g@d)rd
+godart godort
+godbee godbE
+godbey godb/
+godbold godbOld
+godbolt godbOlt
+godbout godb?t
+godby godb/
+goddam goddam
+goddamn goddam
+goddard godPd
+goddart godort
+goddeau godO
+godden god~
+goddess god@s
+goddesses god@s@z
+godding god6N
+godek gOd6k
+godette g@det
+godfather godfoTP
+godfather's godfoTPz
+godfrey godfr/
+godhead godhed
+godin gOdin
+godina g]dEn@
+godine g]dEn
+godines godInz
+godinez g]dEncz
+goding gOd6N
+godino g]dEn]
+godiva g@dIv@
+godkin godkin
+godleski g@dlesk/
+godless godl@s
+godlewski g@dlefsk/
+godley godl/
+godlove godluv
+godly godl/
+godman godm~
+godmother godmuTP
+godot gOd@t
+godown gOd?n
+godoy god<
+godrej godrA
+gods godz
+godsell gods@l
+godsend godsend
+godsey godz/
+godshalk godS@k
+godshall godS@l
+godspeed godsp/d
+godunov gOdUnov
+godwin godwin
+godzilla godzil@
+goe gO
+goeas gO/@z
+goeas gOy@z
+goebbels gOb@lz
+goebel gOb@l
+goecke gOk
+goedde gOd
+goede gOd
+goedecke gOd6k
+goeden gOd~
+goedert gOdPt
+goedken gOdk~
+goeglein gOglIn
+goehner gOnP
+goehring g{r6N
+goeke gOk
+goeken gOk~
+goeller gOlP
+goellner gOlnP
+goelz gOlz
+goelzer gOlzP
+goeman gOm~
+goemon gOAm~
+goen gOn
+goens gOnz
+goepfert gOpfPt
+goer gOP
+goergen g{rg~
+goering gOP6N
+goerke g{rk
+goerlitz g{rlits
+goerner g{rnP
+goers gOPz
+goertz g{rts
+goertzen g{rtz~
+goes gOz
+goeser gOzP
+goetabanken gOt@baNk~
+goethals gOT@lz
+goethe gOT
+goetsch gOC
+goette get
+goettel gOt@l
+goetting gOt6N
+goettl gOt@l
+goettsch gOtC
+goetz gets
+goetze gOtz
+goetzinger gOtz6NP
+goetzke gOtsk/
+goetzman gOtsm~
+goewey goU/
+goff g{f
+goffin gofin
+goffinet gof~ct
+goffman gofm~
+goffman's gofm~z
+goffney gofn/
+goffredo g]frAd]
+goforth g]f{rT
+goga gOg@
+gogan gOg~
+gogel gOg@l
+goggans gog~z
+goggin gogin
+goggins goginz
+goggle gog@l
+goggles gog@lz
+gogh gO
+goghs gOz
+goglia gogl/@
+gogo gOgO
+goguen gOgw~
+goh gO
+goheen g@hEn
+gohl gOl
+gohlke gOk
+gohlke gok
+gohman gOm~
+gohn gon
+gohr g)r
+goin g<n
+goin' gO~
+goines g<nz
+going gO6N
+going gO~
+goings gO6Nz
+goings-on gO6Nzon
+goings-ons gO6Nzonz
+goins g<nz
+goiter g<tP
+goizueta g<zwAt@
+gokey gOkE
+goksel g{ks@l
+gola gOl@
+golab gOlab
+golan g@lon
+golan gOl~
+goland gOl~d
+golas gOl@z
+golaszewski g@l@Sefsk/
+golay golA
+golba gOlb@
+golberg gOlbPg
+golconda golkond@
+gold gOld
+gold's gOldz
+golda gOld@
+goldade gOldAd
+goldammer gOld}P
+goldbach gOldbok
+goldbaum gOldb?m
+goldbeck gOldbek
+goldberg gOldbPg
+goldberg's gOldbPgz
+goldberger gOldbPgP
+goldblatt gOldbl@t
+goldblum gOldbl}
+goldcor gOldk{r
+goldcreek gOldkrEk
+goldcrest gOldkrest
+golde gOld
+golden gOld~
+golden's gOld~z
+goldenberg gOld~bPg
+goldeneye gOld~I
+goldenrod gOld~rod
+goldenson gOld~s~
+goldenson's gOld~s~z
+goldenstein gOld~stEn
+goldenstein gOld~stIn
+goldenthal gOld~Tol
+goldenthal's gOld~Tolz
+golder gOldP
+goldest gOld@st
+goldey gOld/
+goldfarb gOldforb
+goldfeder gOldfedP
+goldfield gOldfEld
+goldfields gOldfEldz
+goldfinch gOldfinC
+goldfinches gOldfinC@z
+goldfine gOldfIn
+goldfinger gOldfiNgP
+goldfish gOldfiS
+goldfus gOldfus
+goldhammer gOldhamP
+goldie gOld/
+goldilocks gOld/l{ks
+goldin gOldin
+golding gOld6N
+goldinger gOld6NP
+goldman gOldm~
+goldman's gOldm~z
+goldmann gOldm~
+goldmans gOldm~z
+goldmark gOldmork
+goldmine gOldmIn
+goldner gOldnP
+goldome gOldOm
+goldome gOlddOm
+goldress gOldres
+goldrick gOldr6k
+goldring gOldriN
+golds gOldz
+goldsberry gOldzber/
+goldsborough gOldzbP]
+goldsby gOldzb/
+goldschmid gOldSmid
+goldschmidt gOldSmit
+goldsmith gOldsmiT
+goldsmith's gOldsmiTs
+goldson gOlds~
+goldstar gOldstor
+goldstein gOldstEn
+goldstein gOldstIn
+goldstein's gOldstEnz
+goldstein's gOldstInz
+goldstock gOldstok
+goldston gOldst~
+goldstone gOldstOn
+goldstrike gOldstrIk
+goldsworthy gOldzwVT/
+goldthwaite gOldTwAt
+goldwasser gOldw{sP
+goldwater gOldw{tP
+goldwater's gOldw{tPz
+goldwin gOldwin
+goldwire gOldwIr
+goldwyn gOldwin
+goldy gOld/
+golec gOl6k
+golem gOl}
+goleman gOlm~
+golembeski g@lcmbesk/
+golembiewski g@lcmb/efsk/
+golen gol~
+goley gOl/
+golf golf
+golf's golfs
+golfarb g{lforb
+golfed golft
+golfer golfP
+golfer's golfPz
+golfers golfPz
+golfie golf/
+golfing golf6N
+golfman golfm~
+golfs golfs
+golgi gOlj/
+golgo gOlg]
+goliath g@lI@T
+goliaths gOl/aTs
+golightly gOlItl/
+golinski g@linsk/
+golisano gOl@son]
+golkar gOlkor
+goll gol
+golla gol@
+golladay gol@dA
+golle gol
+goller golP
+golliday gol/dA
+golliher gol@hP
+gollnick goln6k
+gollum gol}
+gollust gOl@st
+golly gol/
+golob gOl@b
+golomb gol}
+golonka g]lONk@
+goloven gOl@v~
+golphin gOlfin
+golson gOls~
+golston gOlst~
+goltz gOlts
+golub gOl@b
+golubski g@lubsk/
+golz gOlz
+goma gOm@
+gombar g}b)r
+gomberg gombPg
+gombert gombPt
+gombos gOmb]z
+gomer gOmP
+gomery gOmP/
+gomes gOmez
+gomez gOmcz
+gomillion gomily~
+gomoll gom@l
+gomorrah g}{r@
+gomory gOmP/
+gonaives g]nIvz
+goncalves g]nkolvcs
+gonce gons
+goncharov gonCPov
+gond gond
+gonda gond@
+gondek gond6k
+gonder gondP
+gondola gond@l@
+gondola gondOl@
+gondolas gond@l@z
+gondolas gondOl@z
+gondolier gond@lir
+gondoliers gond@lirz
+gone g{n
+goner gonP
+gonet gOnct
+gong g{N
+gongaware goNg@wcr
+gongora g]Ng{r@
+gongs g{Nz
+gonia gOn/@
+goniometer gOn/om@tP
+gonium gOn/}
+gonna gon@
+gonnella g]nel@
+gonnerman gonPm~
+gonococcal gon@kok@l
+gonorrhea gonPE@
+gonsales gOnsAlz
+gonsalez g]nsolcz
+gonsalves g]nsolvcs
+gonser gonsP
+gonsoulin gons?lin
+gonterman gontPm~
+gonya gOny@
+gonyea gOnyc
+gonyer gOnyP
+gonyo gOny]
+gonzales gonzol@s
+gonzalez gonzol@z
+gonzalez's gonzol@z@z
+gonzalo gonzol]
+gonzo gonz]
+gonzo's gonz]z
+goo gU
+gooch gUC
+good g@d
+good gqd
+good's gqdz
+good-bye g@dbI
+good-bye gqdbI
+good-heartedly gqdh)rt@dl/
+good-naturedly gqdnACPdl/
+gooda gUd@
+gooda gqd@
+goodale gqdAl
+goodall gqd{l
+goodbar gqdbor
+goodbread gqdbred
+goodby gqdbI
+goodbye gqdbI
+goodbyes gqdbIz
+goodchild gqdCIld
+goode gqd
+goodell gqdcl
+gooden gqd~
+gooden's gqd~z
+goodenough gqd~?
+goodenow gqdcn]
+gooder gqdP
+gooderham gqdPham
+gooders gqdPz
+goodfella gqdfel@
+goodfellas gqdfel@z
+goodfellow gqdfel]
+goodfellows gqdfel]z
+goodfriend gqdfrend
+goodfriends gqdfrendz
+goodgame gqdgAm
+goodhart gqdhort
+goodheart gqdhort
+goodhue gqdhyU
+goodie gqd/
+goodies gqd/z
+goodin gqd~
+goodine gqdIn
+gooding gqd6N
+gooding's gqd6Nz
+goodison gqd@s~
+goodkin gqdkin
+goodland gqdland
+goodland gqdl~d
+goodlet gqdlet
+goodlett gqdlet
+goodley gqdl/
+goodlin gqdlin
+goodling gqdl6N
+goodloe gqdlO
+goodlow gqdlO
+goodly gqdl/
+goodman gqdm~
+goodman's gqdmanz
+goodmorning gqdm{rn6N
+goodner gqdnP
+goodness gqdn@s
+goodnight gqdnIt
+goodnough gqdnuf
+goodnow gqdn]
+goodpaster gqdpastP
+goodpasture gqdpasCP
+goodreau gqdrO
+goodrich gqdriC
+goodrich's gqdriC@z
+goodrick gqdr6k
+goodridge gqdrij
+goodroe gqdrO
+goodrow gqdrO
+goodrum gqdrum
+goods gqdz
+goodsell gqdsel
+goodson gqds~
+goodson's gqds~z
+goodspeed gqdspEd
+goodspeed's gqdspEdz
+goodstein gqdstEn
+goodstein gqdstIn
+goodtab gqdtab
+goodwill gqdwil
+goodwin gqdwin
+goodwine gqdwIn
+goodwyn gqdwin
+goody gqd/
+goody's gqd/z
+goodyear gqdy/r
+goodyear gqdy6r
+goodyear's gqdy6rz
+gooey gU/
+goof gUf
+goofed gUft
+goofing gUf6N
+goofs gUfs
+goofy gUf/
+googe gUj
+googin gUgin
+googins gUginz
+gook gqk
+gookin gqkin
+goold gUld
+gooley gUl/
+goolsby gUlsb/
+goon gUn
+goonan gUn~
+goons gUnz
+goop gUp
+goos gUz
+goosby gUsb/
+goose gUs
+gooseberry gUsber/
+goosefish gUsfiS
+goosefoot gUsfqt
+goosen gUs~
+goosey gUs/
+goossen gUs~
+goossens gUs~z
+goostree gUstrE
+gootee gUt/
+gopac gOpak
+gopac's gOpaks
+gopal gOpol
+gopher gOfP
+gophers gOfPz
+gora g{r@
+goracke g{r@k
+goradze g{rodz@
+goral g{r@l
+goralski gPolsk/
+goranson g{r~s~
+gorazde gPoZd@
+gorazde g{roZd@
+gorazde's gPoZd@z
+gorazde's g{roZd@z
+gorbachev g{rb@Ccv
+gorbachev g{rb@C{f
+gorbachev's g{rb@Ccvz
+gorbachev's g{rb@C{fs
+gorbachevs g{rb@Ccvz
+gorbachevs g{rb@C{fs
+gorby g{rb/
+gorczyca gPCik@
+gorczynski gPCinsk/
+gorda g{rd@
+gordan g{rd~
+gorden g{rd~
+gorder g{rdP
+gordeyev g{rdI@v
+gordian g{rd/~
+gordie g{rd/
+gordillo g{rdil]
+gordin g{rdin
+gordinier g{rd~/P
+gordji g{rj/
+gordner g{rdnP
+gordon g{rd~
+gordon's g{rd~z
+gordy g{rd/
+gore g{r
+gore's g{rz
+gorecki gPetsk/
+gored g{rd
+goree g{rE
+gorelick g{r@l6k
+goren g{r~
+gorenflo g{renfl]
+gores g{rz
+gorey g{r/
+gorgas g{rg@z
+gorge g{rj
+gorgeous g{rj@s
+gorges g{rj@z
+gorgon g{rg~
+gorgone g{rg~
+gorgonian g{rgOn/~
+gorgons g{rg~z
+gorguze g{rgyUz
+gorham g{r}
+gori g{r/
+goria g{r/@
+gorilla gPil@
+gorillas gPil@z
+gorin g{r~
+goring g{r6N
+goris g{r@s
+gorka g{rk@
+gorki g{rk/
+gorky g{rk/
+gorky's g{rk/z
+gorley g{rl/
+gorman g{rm~
+gormley g{rml/
+gormly g{rml/
+gorney g{rn/
+gorniak g{rn/ak
+gornick g{rn6k
+gornik g{rn6k
+gornto g{rnt]
+gorny g{rn/
+gorospe g{rOspA
+gorr g{r
+gorrell g{rAl
+gorrid g{r@d
+gorrids g{r@dz
+gorski g{rsk/
+gorsky g{rsk/
+gorsline g{rslIn
+gorsuch g{rs@C
+gort g{rt
+gortari g{rt)r/
+gorter g{rtP
+gortney g{rtn/
+gorton g{rt~
+gorum g{r}
+gory g{r/
+gosa gOs@
+gosbank g{sbaNk
+gosch g{S
+gosdin gosdin
+gose gOz
+gosh goS
+gosha gOS@
+goshawk gosh{k
+goshen gOS~
+goshorn goSPn
+goslee gosl/
+goslin goslin
+gosline goslIn
+gosman gosm~
+gosnell gosn@l
+gosney gosn/
+gosornstem g@s{rnstcm
+gospel gosp@l
+gospels gosp@lz
+gosplan g{splan
+goss g{s
+gossage g{s6j
+gossamer gos}P
+gossard g@s)rd
+gosse gos
+gosselin gos@lin
+gossen g{s~
+gosser g{sP
+gossett gosct
+gossip gos@p
+gossiper gos@pP
+gossipers gos@pPz
+gossiping gos@p6N
+gossips gos@ps
+gossipy gos@p/
+gossman g{sm~
+gostev g{st@v
+gostomski g@stomsk/
+goswick gosw6k
+got got
+gotaas gotos
+gotbaum gotb?m
+gotbaum gotb{m
+gotch goC
+gotcha goC@
+gotcher goCP
+goth goT
+gotham goT}
+gothard goTPd
+gothenburg gOt~bPg
+gothenburg got~bPg
+gothic goT6k
+gotlieb gotlEb
+goto gOtU
+goto gOt]
+gotsch goC
+gotschal goC@l
+gotschall goC@l
+gotshal goC@l
+gotshal's goC@lz
+gotshall goC@l
+gott got
+gotta got@
+gotten got~
+gotterdammerung gotPdamP@N
+gottesman gotsm~
+gottfried g{tfr/d
+gotthardt goTort
+gotthelf gothelf
+gotti got/
+gotti's got/z
+gottis got/z
+gottlieb gotlEb
+gottlieb's gotlEbz
+gottman gotm~
+gotts gots
+gottsch goC
+gottschalk goC@k
+gottschalks goC@ks
+gottschall goC@l
+gottshall goC@l
+gottwald gotw@ld
+gotwalt gotw@lt
+gotz gots
+goucher g?kP
+goude g?d
+goudeau gUdO
+goudie g?d/
+goudreau gUdrO
+goudy g?d/
+gouge g?j
+gouged g?jd
+gougeon g?j~
+gouger g?jP
+gough g{f
+goughnour g?nP
+gouging g?j6N
+gouin gwEn
+gouker g?kP
+goulart gUl)rt
+goulash gUloS
+gould gUld
+gould's gUldz
+goulden gqd~
+goulding gUld6N
+goulet gUlet
+goulette gUlet
+goulston gUlst~
+goupil gUp@l
+gourd g{rd
+gourdine gqrdIn
+gourds g{rdz
+gourlay g{rlA
+gourley g{rl/
+gourment g{rment
+gourmet gqrmA
+gourmets gqrmAz
+gousha gUS@
+gout g?t
+goutal gUt@l
+gouty g?t/
+gouvea gUvA@
+gouveia gUvA/@
+gov guv
+gov guvPnP
+govan gOv~
+gove gOv
+govea guv/@
+gover guvP
+govern guvPn
+governale guvPnAl
+governance guvPn~s
+governed guvPnd
+governess guvPn@s
+governing guvPn6N
+government guvPm~t
+government guvPnm~t
+government's guvPm~ts
+government's guvPnm~ts
+governmental guvPment@l
+governmental guvPnment@l
+governmentally guvPmen@l/
+governmentally guvPment@l/
+governments guvPm~ts
+governments guvPnm~ts
+governments' guvPm~ts
+governments' guvPnm~ts
+governor guvPnP
+governor's guvPnPz
+governors guvPnPz
+governors' guvPnPz
+governorship guvPnPSip
+governorships guvPnPSips
+governs guvPnz
+govett guv@t
+govier gOv/P
+govoni g]vOn/
+govpx guvpEeks
+govs govz
+gow g?
+gowan g?~
+gowans g?~z
+goward gOwPd
+gowdy g?d/
+gowell gowcl
+gowen g?~
+gowens g?~z
+gower g?P
+gowin g?in
+gowing g?6N
+gowins g?inz
+gown g?n
+gowns g?nz
+goy g<
+goya g<@
+goyer g<P
+goyette g<et
+goyim g<im
+goyko g<k]
+goyne g<n
+goynes g<nz
+goza gOz@
+gozo gOz]
+gozo's gOz]z
+gozofsky g@z{fsk/
+grab grab
+grabau grab?
+grabbe grab
+grabbed grabd
+grabber grabP
+grabbers grabPz
+grabbing grab6N
+grabe grAb
+grabel grab@l
+graben grab~
+grabens grob~z
+grabenstein grab~stEn
+grabenstein grab~stIn
+graber grAbP
+grabert grabPt
+grabill gr@bil
+grabinski gr@binsk/
+grable grAb@l
+grabner grabnP
+graboski gr@b?sk/
+grabow grab]
+grabowski gr@b{fsk/
+graboy grAb<
+grabs grabz
+grabski grabskE
+grace grAs
+grace's grAs@z
+graced grAst
+graceffa gr@sef@
+graceful grAsf@l
+gracefully grAsf@l/
+graceland grAsland
+graceless grAsl@s
+graces grAs@z
+gracey grAs/
+grachev groCcv
+grachev's groCcvz
+grachov groC{v
+graci groC/
+gracia groC@
+graciano groC/on]
+gracie grAs/
+gracile gras@l
+gracious grAS@s
+graciously grAS@sl/
+graciousness grAS@sn@s
+grackle grak@l
+grackles grak@lz
+graco grak]
+gracy grAs/
+graczyk groC6k
+grad grad
+gradation grAdAS~
+gradations grAdAS~z
+gradchev gradCcf
+gradchev gradC{v
+gradco gradk]
+graddy grad/
+grade grAd
+graded grAd@d
+gradel grad@l
+graden grAd~
+grader grAdP
+graders grAdPz
+grades grAdz
+grading grAd6N
+gradison grad@s~
+gradney gradn/
+grado grod]
+gradov grAd{f
+gradovs grAd{fs
+grads gradz
+gradstein gradst/n
+gradstein gradstIn
+gradstein's gradst/nz
+gradstein's gradstInz
+gradual grajU@l
+gradualism graj@w@liz}
+gradualist graj@w@list
+gradually grajU@l/
+gradually grajUl/
+graduate graj@w@t
+graduate graj@wAt
+graduate grajUAt
+graduate grajUw@t
+graduated graj@wAt@d
+graduated grajUAt@d
+graduates graj@w@ts
+graduates graj@wAts
+graduates grajUAts
+graduates grajUw@ts
+graduating graj@wAt6N
+graduating grajUAt6N
+graduation graj@wAS~
+graduation grajUAS~
+graduations graj@wAS~z
+graduations grajUAS~z
+gradus grAd@s
+grady grAd/
+graeber grebP
+graebner grebnP
+graef grEf
+graef graf
+graefe grEf
+graefe graf
+graeff grEf
+graeff graf
+graeme grAm
+graeme gram
+graeser grAzP
+graessle gres@l
+graetz grEts
+graf graf
+grafe grAf
+graff graf
+graffam graf}
+graffeo grof/]
+graffiti gr@fEt/
+graffius graf/@s
+graft graft
+grafted graft@d
+grafting graft6N
+grafton graft~
+grafts grafts
+grage grAj
+gragert grAgPt
+gragg grag
+graham grA}
+graham gram
+graham's grA}z
+graham's gramz
+grahams grA}z
+grahams gramz
+grahek grah6k
+grahl grol
+grahn gran
+graichen grIk~
+grail grAl
+grain grAn
+grained grAnd
+grainery grAnP/
+grainger gro6NP
+grains grAnz
+grainy grAn/
+grajeda grIEd@
+graley gral/
+grall gr{l
+gram gram
+grama gram@
+gramaphone gram@fOn
+grambling gramb@l6N
+grambling grambl6N
+gramer grAmP
+gramercy gr}Vs/
+gramersey gr}Vs/
+grames grAmz
+gramley graml/
+gramlich graml6k
+gramling graml6N
+gramm gram
+gramm's gramz
+grammar gramP
+grammatical gr}at@k@l
+grammatico gromotEk]
+grammer gramP
+grammies gramEz
+grammophon gram@fon
+gramms gramz
+grammy gram/
+grammy's gram/z
+grammys gram/z
+grams gramz
+gramza gramz@
+gran gran
+grana gran@
+granada gr~od@
+granada's gr~od@z
+granade gr~Ad
+granado gronod]
+granados gronod]z
+granahan gran@han
+granat gran@t
+granata gronot@
+granato gronot]
+granberg granbPg
+granberry granber/
+grancare granker
+grand grand
+grand's grandz
+granda grand@
+grandad grandad
+grandbaby granbAb/
+grandbaby grandbAb/
+grandberry grandber/
+grandchamp grandCamp
+grandchild granCIld
+grandchild grandCIld
+grandchildren granCildr~
+grandchildren grandCildr~
+grandchildren's granCildr~z
+grandchildren's grandCildr~z
+granddaddy grandad/
+granddaughter grand{tP
+granddaughter's grand{tPz
+granddaughters grand{tPz
+grande grand
+grander grandP
+granderson grandPs~
+grandest grand@st
+grandeur grandUr
+grandfather grandfoTP
+grandfather granfoTP
+grandfather's grandfoTPz
+grandfather's granfoTPz
+grandfathered grandfoTPd
+grandfathered granfoTPd
+grandfathering grandfoTP6N
+grandfathering granfoTP6N
+grandfatherly grandfoTPl/
+grandfatherly granfoTPl/
+grandfathers grandfoTPz
+grandfathers granfoTPz
+grandfield grandfEld
+grandi grand/
+grandillo grandil]
+grandiloquent grandil@kw~t
+grandin grandin
+grandinetti grand/net/
+grandiose grand/Os
+grandiose grand/Os
+grandis grandis
+grandison grand@s~
+grandkid grandkid
+grandkid grankid
+grandkids grandkidz
+grandkids grankidz
+grandly grandl/
+grandma gramo
+grandma grandmo
+grandma's gramoz
+grandma's grandmoz
+grandmaison grandmAs~
+grandmaison grandmIzon
+grandmas gramoz
+grandmas grandmoz
+grandmas granmoz
+grandmaster grandmastP
+grandmaster granmastP
+grandmet grandmet
+grandmother gramuTP
+grandmother grandmuTP
+grandmother granmuTP
+grandmother's gramuTPz
+grandmother's grandmuTPz
+grandmother's granmuTPz
+grandmotherly gramuTPl/
+grandmotherly grandmuTPl/
+grandmotherly granmuTPl/
+grandmothers gramuTPz
+grandmothers grandmuTPz
+grandmothers granmuTPz
+grandnephew grandnefyU
+grandnephew grannefyU
+grandon grandon
+grandpa grampo
+grandpa grandpo
+grandpa granpo
+grandparent gramper~t
+grandparent grandper~t
+grandparent granper~t
+grandparents gramper~ts
+grandparents grandper~ts
+grandparents granper~ts
+grandparents' gramper~ts
+grandparents' grandper~ts
+grandparents' granper~ts
+grandpre grandprA
+grands grandz
+grandson grandsun
+grandson gransun
+grandson's grandsunz
+grandson's gransunz
+grandsons grandsunz
+grandsons gransunz
+grandstaff grandstaf
+grandstaff granstaf
+grandstand grandstand
+grandstand granstand
+grandstanding grandstand6N
+grandstanding granstand6N
+grandt grant
+granduncle granduNk@l
+grandview grandvyU
+grandy grand/
+graner grAnP
+granese gran/z
+graney grAn/
+granfield granfEld
+grange grAnj
+granger grAnjP
+grangers grAnjPz
+granges grAnj@z
+granholm granhOlm
+granier grAn/P
+granieri gronir/
+granillo gr~il]
+graningeverken gran6NgevPk~
+graningeverken's gran6NgevPk~z
+granite gran@t
+granitic gr~it6k
+granito gronEt]
+granlund granl~d
+grannan gran~
+grannis granis
+granny gran/
+grano gron]
+granoff gran{f
+granola gr~Ol@
+granquist grankwist
+granstrom granstr}
+grant grant
+grant's grants
+granted gran@d
+granted grant@d
+grantham granT}
+granting gran6N
+granting grant6N
+grantland grantl~d
+grantor grantP
+grantors grantPz
+grantree grantrE
+grantree's grantrEz
+grants grants
+grantz grants
+granular grany@lP
+granulation grany@lAS~
+granule grany@l
+granules grany@lz
+granulocyte gr~Ul]sIt
+granum gran}
+granville granvil
+granville's granvilz
+granz grants
+granzow granz]
+grapage grAp@j
+grape grAp
+grapefruit grApfrUt
+grapefruits grApfrUts
+graper grApP
+grapes grAps
+grapeshot grApSot
+grapevine grApvIn
+grapevines grApvInz
+graph graf
+graphic graf6k
+graphical graf6k@l
+graphically graf6kl/
+graphics graf6ks
+graphics' graf6ks
+graphite grafIt
+graphology gr@fol@j/
+graphs grafs
+grapple grap@l
+grappled grap@ld
+grapples grap@lz
+grappling grap@l6N
+grappling grapl6N
+gras gras
+gras gro
+graser grAzP
+grasmick grazm6k
+grasp grasp
+grasped graspt
+grasping grasp6N
+grasps grasps
+grass gras
+grasse gras
+grassed grast
+grassel gras@l
+grasser grasP
+grassers grasPz
+grasses gras@z
+grassfield grasfEld
+grassfield's grasfEldz
+grassgreen grasgrEn
+grasshopper grashopP
+grasshoppers grashopPz
+grassi gras/
+grassia gros/@
+grassl gras@l
+grassland grasland
+grasslands graslandz
+grassley grasl/
+grasslike graslIk
+grassman grasm~
+grasso gras]
+grassroot grasrUt
+grassroots grasrUts
+grassy gras/
+grasty grast/
+grata grot@
+grate grAt
+grated grAt@d
+grateful grAtf@l
+gratefully grAtf@l/
+grater grAtP
+grates grAts
+grathwohl graTwOl
+gratification grat@f@kAS~
+gratified grat@fId
+gratify grat@fI
+gratifying grat@fI6N
+grating grAt6N
+gratis grat@s
+gratitude grat@tUd
+grattan grat~
+gratton grat~
+gratuities gr@tU@t/z
+gratuitous gr@tU@t@s
+gratuitously gr@tU@t@sl/
+gratuity gr@tU@t/
+gratz grats
+gratzer grAtzP
+grau gr?
+grauberger gr?bPgP
+graue gr?
+graue grU
+grauel gr?@l
+grauel grU@l
+grauer gr?P
+grauer grUP
+graul gr{l
+grauman gr{m~
+graumann gr{m~
+graunke gr{Nk
+gravano gr@van]
+gravano gr@von]
+gravatt grav@t
+grave grAv
+gravel grav@l
+graveline grAvlIn
+gravell grav@l
+gravelle gr@vel
+gravelly grav@l/
+gravely grAvl/
+graven grAv~
+graver grAvP
+graves grAvz
+graves's grAvz@z
+graveside grAvsId
+gravesite grAvsIt
+gravest grav@st
+gravestone grAvstOn
+gravestones grAvstOnz
+gravett grav@t
+gravette gr@vet
+graveyard grAvyord
+graveyards grAvyordz
+gravies grAv/z
+gravimeter grav}EtP
+gravimetric grav}etr6k
+gravina grovEn@
+gravino grovEn]
+gravitas grav@t@s
+gravitate grav@tAt
+gravitated grav@tAt@d
+gravitates grav@tAts
+gravitating grav@tAt6N
+gravitation grav@tAS~
+gravitational grav@tAS~@l
+gravitationally grav@tASn@l/
+gravitt gravit
+gravitt's gravits
+gravity grav@t/
+gravley gravl/
+gravlin gravlin
+gravois gr@vwo
+gravy grAv/
+graw gr{
+grawe gr{
+gray grA
+gray's grAz
+graybeal grAb@l
+graybeard grAb/rd
+graybeards grAb/rdz
+graybill grAbil
+graydon grAd~
+graye grA
+grayer grAP
+grayest grA@st
+graying grA6N
+grayish grA6S
+grayling grAl6N
+grays grAz
+grayson grAs~
+graze grAz
+grazed grAzd
+grazer grAzP
+graziani groz/on/
+graziano grots/on]
+grazier grAz/P
+grazing grAz6N
+grbavica gPbov6k@
+grbavica gVb@vIk@
+greaney grEn/
+grear grir
+grease grEs
+greased grEst
+greaser grEsP
+greasewood grEswqd
+greasing grEs6N
+greason grEs~
+greasy grEs/
+great grAt
+great's grAts
+great-circle grAtsVk@l
+greater grAtP
+greatest grAt@st
+greathouse grAth?s
+greatly grAtl/
+greatness grAtn@s
+greats grAts
+greave grEv
+greaves grEvz
+greb greb
+grebe grEb
+greber grEbP
+grebner grebnP
+grecco grek]
+grech grek
+grecian grES~
+grecko grek]
+greco grek]
+greco-roman grek]rOm~
+grede grEd
+gredel gred@l
+greditor greditP
+greear grEP
+greece grEs
+greece's grEs@z
+greed grEd
+greedier grEd/P
+greediest grEd/@st
+greedily grEd@l/
+greedy grEd/
+greek grEk
+greeks grEks
+greeley grEl/
+greeleyville grEl/vil
+greelieville grEl/vil
+greely grEl/
+green grEn
+green's grEnz
+greenan grEn~
+greenawalt grEn@w{lt
+greenaway grEn@wA
+greenback grEnbak
+greenback's grEnbaks
+greenbacks grEnbaks
+greenbaum grEnb?m
+greenbelt grEnbelt
+greenberg grEnbPg
+greenberg's grEnbPgz
+greenberger grEnbPgP
+greenblatt grEnbl@t
+greenburg grEnbPg
+greenbury grEnbP/
+greenbush grEnbqS
+greencastle grEnkas@l
+greene grEn
+greene's grEnz
+greened grEnd
+greener grEnP
+greenery grEnP/
+greenest grEn@st
+greenfeld grEnfeld
+greenfeld's grEnfeldz
+greenfell grEnfel
+greenfell's grEnfelz
+greenfield grEnfEld
+greenfield's grEnfEldz
+greenhalgh grEnhulg
+greenham grEn}
+greenhaw grEnh{
+greenhill grEnhil
+greenhoe grEnhO
+greenhouse grEnh?s
+greenhouses grEnh?s@z
+greenhut grEnh@t
+greeniaus grEn/?s
+greenidge grEn6j
+greening grEn6N
+greenish grEniS
+greenland grEnland
+greenland grEnl~d
+greenlaw grEnl{
+greenleaf grEnlEf
+greenlee grEnlE
+greenlees grEnlEz
+greenley grEnl/
+greenly grEnl/
+greenmail grEnmAl
+greenmailer grEnmAlP
+greenman grEnm~
+greenness grEnn@s
+greeno grEn]
+greenough grEn@f
+greenpeace grEnpEs
+greenpeace's grEnpEs@z
+greens grEnz
+greens' grEnz
+greensboro grEnzbPr]
+greensburg grEnzbPg
+greenshield grEnSEld
+greenshields grEnSEldz
+greenslade grEnsl@d
+greenslet grEnslet
+greenspan grEnspan
+greenspan's grEnspanz
+greenspon grEnspon
+greenspun grEnspun
+greenstein grEnstEn
+greenstein grEnstIn
+greenstone grEnstOn
+greenstreet grEnstrEt
+greenup grEnup
+greenvale grEnvAl
+greenville grEnvil
+greenwald grEnw{ld
+greenwald's grEnw{ldz
+greenwalds grEnw{ldz
+greenwalt grEnw@lt
+greenway grEnwA
+greenwell grEnwel
+greenwich grEnwiC
+greenwich gren6C
+greenwich's gren6C@z
+greenwood grEnwqd
+greer grir
+greeson grEs~
+greet grEt
+greeted grEt@d
+greetham grET}
+greeting grEt6N
+greetings grEt6Nz
+greets grEts
+greever grEvP
+grefe grEf
+greff gref
+greg greg
+greg's gregz
+grega grEg@
+gregarious gr@g,r/@s
+greger gregP
+gregersen gregPs~
+gregerson gregPs~
+gregg greg
+greggs gregz
+grego greg]
+gregoire gr6gw)r
+gregor gregP
+gregori grcg{r/
+gregoria grcg{r/@
+gregorian gr@g{r/~
+gregorich gregP6k
+gregorie gregP/
+gregorio gr6g{r/]
+gregory gregP/
+gregory's gregP/z
+gregson gregs~
+gregston gregst~
+gregus grEg@s
+greider grIdP
+greif grEf
+greiff grEf
+greiff grIf
+greig grEg
+greim grEm
+greiman grIm~
+grein grAn
+greiner grInP
+greinke grANk
+greis grEz
+greitz grIts
+greitz grets
+greiwe grEw
+grell grel
+grella grel@
+grelle grel
+gremban gremban
+gremillion gremily~
+gremlin greml~
+gremlins greml~z
+gren gren
+grenada gr~Ad@
+grenada gr~od@
+grenade gr~Ad
+grenades gr~Adz
+grenda grend@
+grendel grend@l
+grendel's grend@lz
+grenell gren@l
+grenfell grenf@l
+grenier grEn/P
+greninger gren6NP
+grennan gren~
+grenoble gr~Ob@l
+grenon gren~
+grenouille gr~U/
+grenz grenz
+gresh greS
+gresham greS}
+gresham's greS}z
+gresko gresk]
+gress gres
+gresser gresP
+gressett gres@t
+gressley gresl/
+gressman gresm~
+greta grEt@
+greta's grEt@z
+gretal gret@l
+gretchen greC~
+grete grEt
+gretel gret@l
+greth greT
+grethel greT@l
+grether greTP
+gretna gretn@
+gretna's gretn@z
+grettenberger gret~bPgP
+gretz grets
+gretzinger gretz6NP
+gretzky gretsk/
+greubel gr<b@l
+greuel grU@l
+greulich gr<l6k
+greunke grUNk
+greve grEv
+grever grevP
+grew grU
+grewal grU@l
+grewe grU
+grewell grewcl
+grey grA
+grey's grAz
+greyhound grAh?nd
+greyhound's grAh?ndz
+greylag grAlag
+greystone grAstOn
+gribben grib~
+gribbin gribin
+gribbins gribinz
+gribble grib@l
+gribbles grib@lz
+gribbon grib~
+grice grIs
+grid grid
+grid's gridz
+grider grIdP
+gridiron gridIPn
+gridley gridl/
+gridley's gridl/z
+gridlock gridlok
+gridlock's gridloks
+gridlocked gridlokt
+grids gridz
+grieb grEb
+griebel grEb@l
+grieco grEk]
+grieder grEdP
+grief grEf
+grieger grEgP
+griego grEg]
+grieme grEm
+griep grEp
+griepentrog grEp~tr@g
+grier grEr
+grier grIP
+grier's grErz
+grier's grIPz
+grierson grirs~
+gries grIz
+griesa gr/es@
+griesbach grEsbok
+griese grEz
+griesemer grEs/mP
+grieser grEsP
+grieshaber grES@bP
+griesinger grEs6NP
+griess grEs
+griesser grEsP
+griest grI@st
+grievance grEv~s
+grievances grEv~s@z
+grieve grEv
+grieved grEvd
+griever grEvP
+grievers grEvPz
+grieves grEvz
+grieveson grEv@s~
+grieveson grEvs~
+grieving grEv6N
+grievous grEv@s
+grievously grEv@sl/
+griff grif
+griffee grif/
+griffen grif~
+griffeth grifcT
+griffey grif/
+griffey's grif/z
+griffie grif/
+griffin grifin
+griffin's grifinz
+griffing grif6N
+griffis grifis
+griffith grifiT
+griffith's grifiTs
+griffiths grifiTs
+griffitts grifits
+griffo grif]
+griffon grif~
+griffy grif/
+grigas grIg@z
+grigg grig
+griggs grigz
+griggy grig/
+grignon grign~
+grigoli gr6gOl/
+grigorovich gr6g{r@v6C
+grigory grEgP/
+grigory gregP/
+grigoryant gr6g{ryant
+grigoryants gr6g{ryants
+grigsby grigzb/
+grijalva gr/yolv@
+grill gril
+grille gril
+grilled grild
+grilli gril/
+grilling gril6N
+grilliot gril/@t
+grillo gril]
+grillot gril@t
+grills grilz
+grim grim
+grima grEm@
+grimace grim@s
+grimaced grim@st
+grimaces grim@s@z
+grimacing grim@s6N
+grimaldi gr/mold/
+grimaldo gr/mold]
+grime grIm
+grimes grImz
+grimley griml/
+grimly griml/
+grimm grim
+grimm's grimz
+grimme grim
+grimmer grimP
+grimmest grim@st
+grimmett grimit
+grimness grimn@s
+grimshaw grimS{
+grimsley grimzl/
+grimstad grimst@d
+grimwood grimwqd
+grimy grIm/
+grin grin
+grinage grin6j
+grinberg grinbPg
+grinch grinC
+grind grInd
+grinde grind
+grinder grIndP
+grinders grIndPz
+grinding grInd6N
+grindlay grIndlA
+grindlays grIndlAz
+grindle grind@l
+grindley grindl/
+grindrod grIndrod
+grinds grIndz
+grindstaff grIndstaf
+grindstone grIndstOn
+grine grIn
+griner grInP
+gring griN
+gringo griNg]
+gringos griNg]z
+grinned grind
+grinnell grinel
+grinning grin6N
+grins grinz
+grinstead grinsted
+grinstein grinstEn
+grinstein grinstIn
+grip grip
+gripe grIp
+griped grIpt
+gripes grIps
+griping grIp6N
+gripp grip
+gripped gript
+grippi grip/
+gripping grip6N
+grippo grip]
+grips grips
+grisanti gr@sant/
+grisby grisb/
+griscom grisk}
+grise grIz
+grisham griS}
+grisham's griS}z
+grishilda gr6Sild@
+grishman griSm~
+grisly grizl/
+grismer gViz}P
+grismer grismP
+grismore grEsm{r
+grissett grisct
+grissinger gris6NP
+grisso gris]
+grissom gris}
+grisson gris~
+grist grist
+gristle gris@l
+griswell griswcl
+griswold griswOld
+grit grit
+grites grIts
+grits grits
+gritter gritP
+gritting grit6N
+gritton grit~
+gritty grit/
+gritz grits
+gritzmacher gritsmokP
+grivas grEvoz
+griz griz
+grizelda gr/zeld@
+grizzard grizPd
+grizzell griz@l
+grizzle griz@l
+grizzled griz@ld
+grizzlies grizl/z
+grizzly grizl/
+gro grO
+groan grOn
+groaned grOnd
+groaning grOn6N
+groans grOnz
+groat grOt
+grob grob
+grobe grOb
+groben grob~
+grober grObP
+grobian grOb/~
+grobler groblP
+groce grOs
+grocer grOsP
+grocer's grOsPz
+groceries grOsP/z
+groceries grOsr/z
+grocers grOsPz
+grocery grOsP/
+grocery grOsr/
+groch grok
+grochowski gr@h{fsk/
+grode grOd
+groden grOd~
+grodin grOdin
+grodsky grodsk/
+groebner grObnP
+groeger grOgP
+groen grOn
+groene gro/n
+groeneveld grOn6vcld
+groenewold grOnU]ld
+groening gro~6N
+groep grOp
+groer grOP
+groesbeck grOsbck
+groff gr{f
+groft groft
+grogan grOg~
+grogg grog
+groggy grog/
+groh grO
+grohman grOm~
+grohs grOs
+groin gr<n
+groined gr<nd
+groins gr<nz
+groleau gr@lO
+grolier grOlyP
+groll grOl
+grom grom
+groma grom@
+groman grOm~
+gromek grOm6k
+gromer grOmP
+gromes grOmz
+gromyko gr]mEk]
+gronau grOn?
+gronberg gronbPg
+grondahl grondol
+grondin grondin
+grone grOn
+gronemeyer gron}IP
+groner grOnP
+gronewold gronU]ld
+groninger grOn6NP
+gronlund gronl~d
+gronowski gr~{fsk/
+gronseth gronscT
+gronski gronsk/
+groom grUm
+groome grUm
+groomed grUmd
+groomer grUmP
+groomers grUmPz
+groomes grUmz
+grooming grUm6N
+grooms grUmz
+groopman grUpm~
+groos grUz
+groot grUt
+grooters grUtPz
+groove grUv
+groover grUvP
+grooves grUvz
+grooviest grUv/@st
+groovy grUv/
+grope grOp
+groped grOpt
+groping grOp6N
+gropp grop
+gropper gropP
+groppy grop/
+groppy's grop/z
+gros grOs
+grosbeak grOsbEk
+grosbeaks grOsbEks
+grosch gr{S
+grose grOz
+groseclose gros6klOz
+grosh groS
+groshek groS6k
+groshong groS{N
+grosjean gr@sZEn
+groskopf grOsk{f
+groskopf grosk{pf
+gross grOs
+gross's grOs@z
+grossbard grOsbord
+grossberg grOsbPg
+grosse gros
+grossed grOst
+grossenbacher gros~bokP
+grosser grOsP
+grosses grOs@z
+grossfeld grOsfeld
+grosshans groS~z
+grossi grOs/
+grossing grOs6N
+grosskopf grOsk{f
+grosskopf grOsk{pf
+grossly grOsl/
+grossman grOsm~
+grossman's grOsm~z
+grossmann gr{sm~
+grossnickle grosn6k@l
+grosso grOs]
+grosvenor grOvnP
+grosz grOs
+grote grOt
+grotesque gr]tesk
+grotesquely gr]teskl/
+groth groT
+grothaus groth?s
+grothe grOT
+grotheer gr{T6r
+groton grot~
+grotto grotO
+grotz grots
+grouch gr?C
+groucho gr?C]
+groulx gr?lks
+ground gr?nd
+groundbreaking gr?nbrAk6N
+groundbreaking gr?ndbrAk6N
+grounded gr?nd@d
+groundhog gr?ndhog
+grounding gr?nd6N
+groundless gr?ndl@s
+groundling gr?ndl6N
+groundnut gr?ndnut
+groundnuts gr?ndnuts
+grounds gr?ndz
+grounds gr?nz
+groundskeeper gr?ndskEpP
+groundskeepers gr?ndskEpPz
+groundswell gr?ndswel
+groundwater gr?ndwotP
+groundwater gr?nwotP
+groundwork gr?ndwVk
+group grUp
+group's grUps
+groupe grUp
+grouped grUpt
+groupement grUpm~t
+grouper grUpP
+groupers grUpPz
+groupie grUp/
+groupies grUp/z
+grouping grUp6N
+groupings grUp6Nz
+groups grUps
+groups' grUps
+groupware grUpwer
+grouse gr?s
+groused gr?st
+grouses gr?s@z
+grousing gr?s6N
+groussman gr?sm~
+grout gr?t
+grouting gr?t6N
+grove grOv
+grove's grOvz
+grovel grov@l
+groveling gr{v@l6N
+groveman grOvm~
+grover grOvP
+grover's grOvPz
+grovers grOvPz
+groves grOvz
+grow grO
+growe grO
+grower grOP
+growers grOPz
+growers' grOPz
+growing grO6N
+growl gr?l
+growled gr?ld
+growling grOl6N
+growls gr?lz
+grown grOn
+grownup grOnup
+grownups grOnups
+grows grOz
+growth grOT
+growths grOTs
+grozny grOzn/
+grozny's grOzn/z
+grua grU@
+grub grub
+gruba grUb@
+grubaugh grub{
+grubb grub
+grubbs grubz
+grubby grub/
+grube grUb
+gruben grub~
+gruber grUbP
+gruberova grUbcrOv@
+grubman grubm~
+grubs grubz
+grubstein grubstEn
+grubstein grubstIn
+grucci grUC/
+grudenstein grUd~stEn
+grudenstein grUd~stIn
+grudge gruj
+grudges gruj@z
+grudging gruj6N
+grudgingly gruj6Ngl/
+grudgingly gruj6Nl/
+grudzien grudz/n
+grudzinski gr@jinsk/
+gruel grU@l
+grueling grU@l6N
+grueling grUl6N
+gruen grUn
+gruenberg grqnbPg
+gruener grqnP
+gruenewald grqn@w{ld
+gruenhagen grqnh@g~
+gruenwald grqnw{ld
+gruesome grUs}
+gruet grU@t
+gruetzmacher grqtsmokP
+gruff gruf
+gruhlke grUlk
+gruhn grun
+gruis grU@z
+grulke grulk
+grullon grul~
+grum grum
+grumbine grumbIn
+grumble grumb@l
+grumbled grumb@ld
+grumbles grumb@lz
+grumbling grumb@l6N
+grumbling grumbl6N
+grumblings grumb@l6Nz
+grumblings grumbl6Nz
+grumman grum~
+grumman's grum~z
+grummond grum~d
+grummond's grum~dz
+grump grump
+grumpier grump/P
+grumpier grumpyP
+grumpy grump/
+grun grun
+grunberg grunbPg
+grund grund
+grunden grund~
+grunder grundP
+grundfest grqndfest
+grundfest grundfest
+grundhofer grundhofP
+grundig grund6g
+grundman grundm~
+grundstrom grundstr}
+grundy grund/
+grunebaum grUnb?m
+gruneich grUnIk
+gruner grUnP
+grunert grUnPt
+grunewald grun@w{ld
+grunge grunj
+grungy grunj/
+grunion gruny~
+grunow grUn]
+grunt grunt
+gruntal grunt@l
+gruntal's grunt@lz
+grunted grunt@d
+grunting grunt6N
+grunts grunts
+grunwald grunw{ld
+grupe grUp
+grupo grUp]
+grupp grup
+gruppo grUp]
+grush gruS
+grushow gruS]
+gruss grus
+grussing grus6N
+gruszka gruSk@
+grutman grutm~
+gruver grUvP
+gruwell gruwcl
+gryder grIdP
+grygiel grij/l
+gryphons grif~z
+grzelak gVz@lak
+grzesiak gPzes/ak
+grzeskowiak gPz@sk?/ak
+grzyb gVzib
+grzybowski gVz@b?sk/
+grzywacz gVz6vaC
+grzywinski gPz@winsk/
+gschwind g@SwInd
+gsell g@sel
+gtech jEtek
+gtech's jEteks
+gu gU
+guacamole gwok}Ol/
+guadagno godogn]
+guadalajara gwodl@h)r@
+guadalajara gwodul@h)r@
+guadalcanal gwod@lk~al
+guadalupe gwod@lUp
+guadalupe gwod@lUpA
+guadarrama gUodorom@
+guadeloupe gwod@lUp
+guagliardo gwogl/)rd]
+guajardo gwoy)rd]
+gualdoni goldOn/
+gualtieri goltir/
+guam gwom
+guanaco gw~okO
+guandjo gwonj]
+guandjo's gwonj]z
+guandjong gwonj]N
+guandjong's gwonj]Nz
+guandong gwondON
+guandong's gwondONz
+guangdong gwaNd{N
+guangdong gwoNd{N
+guangjo gwoNjO
+guangjo's gwoNjOz
+guangzhou gwaNzU
+guanine gwonEn
+guano gwonO
+guantanamo gwonton}O
+guantanamo's gwonton}Oz
+guarani gworon/
+guarani gwor~E
+guarantee ger~tE
+guarantee's ger~tEz
+guaranteed ger~tEd
+guaranteeing ger~tE6N
+guarantees ger~tEz
+guaranties ger~tEz
+guarantor ger~t{r
+guarantors ger~t{rz
+guaranty ger~tE
+guaranty's ger~tEz
+guaranty-first ger~tEfVst
+guard g)rd
+guard's g)rdz
+guardado gordod]
+guarded g)rd@d
+guardedly g)rd@dl/
+guardfish g)rdfiS
+guardfish's g)rdfiS@z
+guardia gw)rd/@
+guardian g)rd/~
+guardian's g)rd/~z
+guardians g)rd/~z
+guardianship g)rd/~Sip
+guardin g)rd~
+guarding g)rd6N
+guardino gordEn]
+guardiola gord/Ol@
+guardrail g)rdrAl
+guardrails g)rdrAlz
+guards g)rdz
+guardsman g)rdzman
+guardsman g)rdzm~
+guardsmen g)rdzmin
+guariglia gorEgl/@
+guarin g)rin
+guarin gw)rin
+guarini gorEn/
+guarino gorEn]
+guarisco gorEsk]
+guarnaccia gornaC/@
+guarneri gorn,r/
+guarnieri gornir/
+guasch gwaS
+guastella gostel@
+guatemala gwot}ol@
+guatemala's gwot}ol@z
+guatemalan gwot}ol~
+guatemalans gwot}ol~z
+guattery gwotP/
+guava gwov@
+guavas gwov@z
+guay gA
+guayabera gwI@b,r@
+guba gUb@
+guba's gyUb@z
+gubbels gub@lz
+gubbins gubinz
+guber gUbP
+guber gyUbP
+guberman gUbPm~
+gubernatorial gUbPn@t{r/@l
+gubler gyUb@lP
+gubser gubsP
+gucci gUC/
+gucciardo gUC)rd]
+guccio gUC/]
+guccione gUkCOn/
+guck guk
+guckert gukPt
+gucwa gukw@
+gude gyUd
+gudelay gUd@lA
+guderian gyUdEr/~
+gudgel guj@l
+gudgeon guj~
+gudger gujP
+gudino gUdEn]
+gudmundson gudm~ds~
+gue gyU
+guedry gedr/
+guei-yuan gwAyUon
+guel gel
+guenette ginet
+guenna gAn@
+guenter gentP
+guenther gqnTP
+guenthner genTnP
+guerard gP)rd
+guercio g,rs/]
+guerette gPet
+guerilla gPil@
+guerillas gPil@z
+guerin g,rin
+guerino gcrEn]
+guerneville gVn@vil
+guernsey gVnz/
+guerra gw,r@
+guerrant g,r~t
+guerre g,r
+guerrera gwP,r@
+guerrero gP,r]
+guerrette gPet
+guerrier g,r/P
+guerrieri gPir/
+guerriero gPir]
+guerrilla gPil@
+guerrillas gPil@z
+guerrillas' gPil@z
+guerrini gPEn/
+guerry gPE
+guertin gcrtEn
+guess ges
+guessed gest
+guesser gesP
+guessers gesPz
+guesses ges@z
+guessing ges6N
+guesstimate gest}@t
+guesstimate gest}At
+guesstimates gest}@ts
+guesstimates gest}Ats
+guesswork geswVk
+guest gest
+guest's gests
+guested gest@d
+guesthouse gesth?s
+guesthouses gesth?s@z
+guests ges
+guests gess
+guests gests
+guests' ges
+guests' gess
+guests' gests
+guettler get@lP
+guevara gAv)r@
+guez gez
+guez's gez@z
+guff guf
+guffaw g@f{
+guffaws g@f{z
+guffey guf/
+guffin gufin
+guffy guf/
+gugel gUg@l
+guggenheim gUg~hIm
+guggisberg gug@sbPg
+gugino gUjEn]
+guglielmetti gUgl/clmet/
+guglielmi gUgl/elm/
+guglielmo gUgl/elm]
+gugliotta gUgl/Ot@
+gugliotti gUgl/Ot/
+gugliuzza gUgl/Uts@
+guhl gul
+guiana g/on@
+guice gIs
+guichard giS)rd
+guida gEd@
+guidance gId~s
+guide gId
+guide's gIdz
+guidebook gIdbqk
+guidebooks gIdbqks
+guided gId@d
+guideline gIdlIn
+guidelines gIdlInz
+guidepost gIdpOst
+guideposts gIdpOs
+guideposts gIdpOss
+guideposts gIdpOsts
+guider gIdP
+guidera g/d,r@
+guides gIdz
+guidi gEd/
+guidice gIdis
+guiding gId6N
+guido gwEd]
+guidone g/dOn/
+guidotti g/dOt/
+guidroz gwEdr]z
+guidry gidP/
+guier gIP
+guiffre gifP
+guilbault gilbO
+guilbeau gilbO
+guilbeault gilbO
+guilbeaux gilbO
+guilbert gilbPt
+guild gild
+guild's gildz
+guilder gildP
+guilder's gildPz
+guilders gildPz
+guildhall gildh{l
+guilds gildz
+guile gIl
+guileless gIll@s
+guiles gIlz
+guilfoil gilf<l
+guilford gilfPd
+guilford's gilfPdz
+guilfoyle gilf<l
+guiliani gEl/on/
+guiliano gEl/on]
+guilin gilin
+guill gil
+guilla gwil@
+guillaume gil?m
+guillaume gwElOm
+guillemette gil}et
+guillen gil~
+guillermo g/,rm]
+guillermo gw/,rm]
+guillermo gw@ly,rm]
+guillet gilet
+guillette gilet
+guilliams gw/lEomz
+guillory gilP/
+guillot gilO
+guillotine gEy@tEn
+guillotine gil@tEn
+guillotte gil{t
+guilmartin gilm)rt~
+guilmette gilmet
+guilt gilt
+guiltless giltl@s
+guilty gilt/
+guimaraes gimPAz
+guimond gimond
+guimont gimont
+guin gin
+guinan gw/non
+guinarou gwin)rO
+guinarou's gwin)rOz
+guindon gind~
+guinea gin/
+guineas gin/z
+guiney gin/
+guinier gwinir
+guinier's gwinirz
+guinn gin
+guinness gin@s
+guinness's gin@s@z
+guinta gwEnt@
+guinther ginTP
+guinto gwEnt]
+guinyard giny)rd
+guion gw/{n
+guire gIr
+guise gIz
+guises gIz@z
+guisewite gIswIt
+guisinger gis~jP
+guitar g@t)r
+guitarist git)r@st
+guitarist's git)r@sts
+guitarists git)r@s
+guitarists git)r@ss
+guitarists git)r@sts
+guitarro git)r]
+guitarro's git)r]z
+guitars g@t)rz
+guiterrez gw/t,rcz
+guitierrez gw/tircz
+guizar gw/z)r
+gujarat gyUjPat
+gul gul
+gula gyUl@
+gulag gUlog
+gulag gyUlag
+gulas gyUl@z
+gulbrandsen gulbr~ds~
+gulbrandson gulbr~ds~
+gulbransen gulbr~s~
+gulbranson gulbr~s~
+gulbuddin gubUd~
+gulbuddin's gubUd~z
+gulch gulC
+guldin guldin
+gulf gulf
+gulf's gulfs
+gulfport gulfp{rt
+gulfstream gulfstrEm
+gulick gyUl6k
+gulino gUlEn]
+gull gul
+gull's gulz
+gulla gul@
+gullah gul@
+gullatt gul@t
+gulledge gUl6j
+gullet gul@t
+gullett gUlct
+gullette gUlet
+gulley gul/
+gulli gUl/
+gullibility gul@bil@t/
+gullible gul@b@l
+gullick gul6k
+gullickson gul6ks~
+gullies gul/z
+gulliford gul@fPd
+gullikson gul@ks~
+gullion guly~
+gulliver gul6vP
+gullo gUl]
+gulls gulz
+gully gul/
+gulp gulp
+gulped gulpt
+gulping gulp6N
+gulps gulps
+gulyas gUly@s
+gum gum
+gumaer gum?P
+gumaer gumor
+gumbel gumb@l
+gumbert gumbPt
+gumbi gumb/
+gumbi's gumb/z
+gumbiner gumbInP
+gumbinger gumbiNP
+gumbo gumb]
+gumbo-limbo gumb]limb]
+gumbs gumz
+gumi gUm/
+gumina gUmEn@
+gumm gum
+gummed gumd
+gummi gum/
+gummy gum/
+gump gump
+gump's gumps
+gumpert gumpVt
+gumport gump{rt
+gumpp gump
+gumption gumpS~
+gums gumz
+gumshoe gumSU
+gumucio gyUmyUs/]
+gumz gumz
+gun gun
+gun's gunz
+gunadi g~od/
+gunatilake gUnotilokA
+gunboat gunbOt
+gunboats gunbOts
+gunby gunb/
+guncotton gunkot~
+gundel gund@l
+gunder gundP
+gunderman gundPm~
+gundersen gundPs~
+gunderson gundPs~
+gundlach gundl@k
+gundle gund@l
+gundog gund{g
+gundrum gundr}
+gundry gundP/
+gundy gund/
+gunfight gunfIt
+gunfighter gunfItP
+gunfighter's gunfItPz
+gunfighters gunfItPz
+gunfighting gunfIt6N
+gunfights gunfIts
+gunfire gunfIP
+gunfire gunfIr
+gunflint gunflint
+gung guN
+gunhilda gUnhEld@
+gunia gUn/@
+gunkel guNk@l
+gunlick gunl6k
+gunlicks gunl6ks
+gunman gunm~
+gunman's gunm~z
+gunmen gunmen
+gunn gun
+gunn's gunz
+gunnar gunP
+gunnarson gunors~
+gunned gund
+gunnell gun@l
+gunnells gun@lz
+gunnels gun@lz
+gunner gunP
+gunners gunPz
+gunnerson gunPs~
+gunnery gunP/
+gunning gun6N
+gunnison gun@s~
+gunnoe gun]
+gunny gun/
+gunnysack gun/sak
+gunnysacks gun/saks
+gunpoint gunp<nt
+gunpowder gunp?dP
+gunrunner gunrunP
+guns gunz
+gunsalus g~sol@s
+gunship gunSip
+gunships gunSips
+gunshot gunSot
+gunshots gunSots
+gunslinger gunsliNP
+gunslingers gunsliNPz
+gunsmoke gunsmOk
+gunst gunst
+gunter guntP
+gunther gunTP
+guntur guntP
+gunty gunt/
+guppies gup/z
+guppy gup/
+gupta gqpt@
+guptill guptil
+gupton gupt~
+gura gqr@
+gural gyqr@l
+gurevich gyUr6v6C
+gurganious gVg~/@s
+gurganus gVg~@s
+gurgle gVg@l
+gurgling gVg@l6N
+gurgling gVgl6N
+gurian gyqr/~
+gurion gyqr/~
+gurit gqrit
+gurit gyqrit
+gurka gVk@
+gurkin gVkin
+gurley gVl/
+gurnards gVnPdz
+gurnee gPnE
+gurney gVn/
+gurney's gVn/z
+gurnsey gVns/
+gurr gV
+gurria gV/@
+gurrola gqrOl@
+gurry gV/
+gurski gVsk/
+gursky gVsk/
+gurtler gVt@lP
+gurtner gVtnP
+gurtz gVts
+guru gUrU
+guru's gUrUz
+gurule gPUl
+gurus gUrUz
+gus gus
+gusciora gUs/{r@
+guse gyUz
+gusella gyUsel@
+guseman gUsm~
+guses gus@z
+guses gyUz@z
+gush guS
+gushed guSt
+gusher guSP
+gushers guSPz
+gushes guS@z
+gushing guS6N
+gusinsky g@sinsk/
+gusky gusk/
+guslan gUzlon
+gusler gus@lP
+gusman gusm~
+guss gus
+gussie gus/
+gussied gus/d
+gussman gusm~
+gussy gus/
+gust gust
+gustaf gUstof
+gustafson gust@fs~
+gustafsson gUstofs~
+gustav gqstof
+gustava gUstov@
+gustave gUstov/
+gustaveson gUstovAs~
+gustavo g@stov]
+gustavson gust@vs~
+guste gust
+gusted gust@d
+guster gustP
+gustin gustin
+gusting gust6N
+gusto gustO
+guston gust~
+gusts gusts
+gustus gust@s
+gusty gust/
+gut gut
+gutekunst gut6k~st
+gutenberg gUt~bPg
+guterman gyUtPm~
+gutermuth gutPmUT
+gutfeld gutfeld
+gutfreund gqtfrend
+guth gUT
+gutherie guTP/
+guthery guTP/
+guthmiller guTm@lP
+guthridge guTr6j
+guthrie guTr/
+guthrie's guTr/z
+gutierez gUtircz
+gutierres gUty,rcz
+gutierrez gUty,rcz
+gutknecht gUtnckt
+gutkowski g@tk{fsk/
+gutless gutlcs
+gutman gutm~
+gutmann gutm~
+gutowski g@t{fsk/
+gutridge gutrij
+guts guts
+gutshall guC@l
+gutsy gutsE
+gutt gut
+gutted gut@d
+guttenberg gut~bPg
+gutter gutP
+guttered gutPd
+guttering gutP6N
+gutterman gutPm~
+gutters gutPz
+gutting gut6N
+guttmacher gutmokP
+guttman gutm~
+guttmann gutm~
+guttural gutP@l
+gutwaks gutwoks
+gutwein gutwIn
+gutzman gutsm~
+gutzmer gutsmP
+gutzwiller gutswilP
+guy gI
+guy's gIz
+guyana gIon@
+guyer gIP
+guyett gIet
+guyette gIet
+guymon gIm~
+guynes gInz
+guynn gIn
+guyon gI~
+guyot gI@t
+guys gIz
+guys' gIz
+guyton gIt~
+guza gyUz@
+guzek gUzck
+guzik gyUz6k
+guzman gUzmon
+guzman guzm~
+guzowski g@z{fsk/
+guzy gyUz/
+guzzardo gUts)rd]
+guzzetta gUtset@
+guzzetti gyUzet/
+guzzi gUts/
+guzzle guz@l
+guzzler guzlP
+guzzlers guz@lPz
+guzzles guz@lz
+guzzling guz@l6N
+guzzling guzl6N
+guzzo gUz]
+gvaryahu g@vcryohU
+gwaltney gw{ltn/
+gwartney gw{rtn/
+gway gwA
+gwen gwen
+gwenda gwend@
+gwendolyn gwend@l~
+gwennie gwen/
+gwenore gwenP
+gwin gwin
+gwinn gwin
+gwinner gwinP
+gwinnett gwinet
+gwizdala gwizdol@
+gwozdz gwozdz
+gwyn gwin
+gwynn gwin
+gwynne gwin
+gyger gIgP
+gyi gE
+gyi jEwII
+gyles jIlz
+gyllenhammar jilcnhamP
+gym jim
+gym's jimz
+gymboree jimb{rE
+gymnasia jimnAz/@
+gymnasium jimnAz/}
+gymnasiums jimnAz/}z
+gymnast jimn@st
+gymnastic jimnast6k
+gymnastics jimnast6ks
+gymnasts jimnas
+gymnasts jimnass
+gymnasts jimnasts
+gyms jimz
+gyn gIn
+gyn gin
+gynecologic gIn@k@loj6k
+gynecological gIn@k@loj6k@l
+gynecologist gIn@kol@j@st
+gynecologists gIn@kol@j@s
+gynecologists gIn@kol@j@ss
+gynecologists gIn@kol@j@sts
+gynecology gIn@kol@j/
+gynex jin@ks
+gyohten gyOt~
+gyosai gyOsA
+gyp jip
+gypped jipt
+gypsies jips/z
+gypsum jips}
+gypsum's jips}z
+gypsy jips/
+gyr jIr
+gyrate jIrAt
+gyrated jIrAt@d
+gyrating jIrAt6N
+gyration jIrAS~
+gyrations jIrAS~z
+gyro jIrO
+gyrocompass jIr]kump@s
+gyropilot jIr]pIl@t
+gyros jIrOz
+gyroscope jIr@skOp
+gyroscopes jIr@skOps
+gyroscopic jIr@skop6k
+gytha jIT@
+gyuhama gyUhom@
+h AC
+h's AC@z
+h. AC
+h.'s AC@z
+ha ACA
+ha ho
+ha'aretz h)rcts
+ha'aretz h@)rcts
+ha'etzni h@etsn/
+haab hob
+haack hok
+haacke hok
+haaf hof
+haag hog
+haagen hog~
+haagenson hog~s~
+haak hok
+haake hok
+haakenson hok~s~
+haaland hol~d
+haan hon
+haapala hopol@
+haar h)r
+haas hos
+haase hos
+haass hos
+haavelmo hovelm]
+habben hab~
+habeas hab/@s
+habeck hobck
+habecker habckP
+habeeb hab/b
+habegger hab6gP
+habel hab@l
+habenicht hab~6kt
+haber hAbP
+haberdashery habPdaSP/
+haberer habPP
+haberkorn habPkPn
+haberl habPl
+haberland habPl~d
+haberle habP@l
+haberman hAbPm~
+habermann hAbPm~
+habermehl habPm@l
+haberson hAbPs~
+haberson habPs~
+haberstroh hob,rstr]
+habib h@bEb
+habibie h@bEb/
+habich hab6k
+habicht hab6kt
+habig hab6g
+habiger hab6gP
+habit hab@t
+habitable hab@t@b@l
+habitat hab@tat
+habitat's hab@tats
+habitation hab@tAS~
+habitats hab@tats
+habits hab@ts
+habitual h@biCU@l
+habitually h@biCU@l/
+habitually h@biCUl/
+habitues hab6CUz
+hable hAb@l
+habs habz
+habsburg hapsbPg
+haby hAb/
+habyarimana hab/P/mon@
+habyarimana hab/or/mon@
+hach haC
+hachette huSet
+hachey haC/
+hachtel hakt@l
+hacienda has/end@
+hack hak
+hackathorn hak@TPn
+hackbart hakbort
+hackbarth hakborT
+hackberry hakber/
+hacke hak
+hacked hakt
+hackel hak@l
+hackenberg hak~bPg
+hackensack hak~sak
+hacker hakP
+hacker's hakPz
+hackers hakPz
+hackert hakPt
+hackett hakct
+hackford hakfPd
+hacking hak6N
+hackl hak@l
+hackle hak@l
+hackleman hak@lm~
+hackler hak@lP
+hackler haklP
+hackles hak@lz
+hackley hakl/
+hackman hakman
+hackman hakm~
+hackmann hakm~
+hackmatack hakm@tak
+hackney hakn/
+hackneyed hakn/d
+hacks haks
+hacksaw haks{
+hackstaff hakstaf
+hackworth hakwVT
+had had
+hada hod@
+hadad had@d
+hadaway hod@wA
+hadd had
+haddad had@d
+haddan had~
+haddaway had@wA
+hadden had~
+haddock had@k
+haddon had~
+haddow had]
+hade hAd
+haden hAd~
+hader hAdP
+hades hAd/z
+hades hAdz
+hadfield hadfEld
+hadid hodEd
+hadleigh hadl@
+hadler hAd@lP
+hadley hadl/
+hadline hadlIn
+hadlock hadl@k
+hadn't had~
+hadn't had~t
+hadnot hadn@t
+hadria hadr/@
+hadrian hAdr/~
+hadrian hadr/~
+hadrian's hAdr/~z
+hadsall hads@l
+hadsell hads@l
+hadson hads~
+hadwin hadwin
+haeberle hebP@l
+haecker hekP
+haefele hef@l
+haeffner hefnP
+haefner hefnP
+haegele heg@l
+haeger hegP
+haen hEn
+haenel hen@l
+haering hoP6N
+haertel h,rt@l
+haese hEs
+haessly hasl/
+haeussler h?slP
+hafele haf@l
+hafeman hAfm~
+hafen haf~
+hafer hAfP
+hafey hAf/
+hafez hofcz
+haff haf
+haffey haf/
+haffez hofcz
+haffner hafnP
+hafford hafPd
+hafif hofEf
+hafif's hofEfs
+hafley hafl/
+hafner hafnP
+hafnia hafn/@
+hafnium hafn/}
+haft haft
+haft's hafs
+haft's hafts
+hafta haft@
+hafts hafs
+hafts hafts
+hafts' hafs
+hafts' hafts
+hag hag
+haga hog@
+hagadorn hag@d{rn
+hagaman hag}~
+hagan hAg~
+hagans hAg~z
+hagar hAgP
+hagar hAgor
+hagarty hagort/
+hagberg hagbPg
+hage hAj
+hagedorn hag@dPn
+hagee haj/
+hagel hag@l
+hagelin hag@l~
+hageman hAjm~
+hagemann hAjm~
+hagemeier hag}IP
+hagemeister hag}IstP
+hagemeyer hag}IP
+hagen hAg~
+hagenbuch hag~b@k
+hagenlocker hAg~lokP
+hagenow haj~]
+hagens hAg~z
+hager hAgP
+hagerman hAgPm~
+hagerstown hAgPzt?n
+hagerty hajPt/
+hagewood hAjwqd
+hagey haj/
+hagfish hagfiS
+hagg hag
+haggadah h@gud@
+haggan hag~
+haggar hagP
+haggard hagPd
+haggart hagPt
+haggarty hagort/
+hagge hag
+haggerty hagPt/
+haggett hagct
+haggins hag~z
+haggle hag@l
+haggled hag@ld
+haggling hag@l6N
+haggling hagl6N
+hagglund hagl~d
+haggstrom hagstr}
+hagin hagin
+hagin hajin
+hagins haginz
+hagins hajinz
+hagiography hag/ogr@f/
+hagiwara hog@w)r@
+hagle hAg@l
+hagler haglP
+hagley hagl/
+haglund hagl~d
+hagman hagm~
+hagmann hagm~
+hagner hagnP
+hagood hagqd
+hagopian h@gOp/~
+hagstrom hagstr}
+hague hAg
+hagwood hagwqd
+hagy hAg/
+hah ho
+hahl hol
+hahm ham
+hahn hon
+hahne hAn
+hahner honP
+hahs hos
+haid hAd
+haidee hAd/
+haider hAdP
+haidet hAd@t
+haifa hIf@
+haifong hIf{N
+haig hAg
+haig's hAgz
+haigh hA
+haight hAt
+haigler hAglP
+haik hAk
+haiku hIkU
+hail hAl
+hailand hAl~d
+haile hAl
+haile hIl/
+hailed hAld
+hailes hAlz
+hailes hIl/z
+hailey hAl/
+hailing hAl6N
+hails hAlz
+hailstone hAlstOn
+hailstones hAlstOnz
+hailstorm hAlst{rm
+haim hAm
+haim hIm
+haimes hAmz
+haimovitch hAm@v6C
+haimovitz hAm@vits
+haimowitz hIm@wits
+hain hAn
+hainan hAn~
+hainer hAnP
+haines hAnz
+hainey hAn/
+hainley hAnl/
+hainline hAnlIn
+hains hAnz
+hainsworth hAnswPT
+hair h,r
+hair's h,rz
+haircut h,rkut
+haircuts h,rkuts
+hairdo h,rdU
+hairdos h,rdUz
+hairdresser h,rdresP
+hairdressers h,rdresPz
+hairdressing h,rdres6N
+haire h,r
+haired h,rd
+hairfield h,rfEld
+hairgrove hIrgr@v
+hairiness h,r/n@s
+hairless h,rl@s
+hairline h,rlIn
+hairr h,r
+hairs h,rz
+hairspray h,rsprA
+hairston hIrst~
+hairstyle h,rstIl
+hairy h,r/
+haisley hAzl/
+haislip hIslip
+haist ho@st
+hait hAt
+haith hAT
+haithcock hATkok
+haiti hAt/
+haiti's hAt/z
+haitian hAS~
+haitians hAS~z
+haitien hAS~
+haitiens hAS~z
+haitis hAt/z
+haizlip hAzlip
+hajdu hoydU
+hajduk hId@k
+hajek hIck
+hajime hojEm/
+hajj haj
+hajjar hoy)r
+hakala h@kol@
+hakan hAk~
+hakan hok~
+hakanson hak~s~
+hake hAk
+hakes hAks
+hakim hokEm
+hakim okEm
+hakim's hokEmz
+hakim's okEmz
+hakki hak/
+hakko hak]
+hakon hak~
+hakuhodo hokUhOd]
+hal hal
+hal's halz
+halama holom@
+halamandaris hal}andPis
+halas hol@z
+halasz holiS
+halbach halbok
+halberg halbPg
+halberstadt halbPStat
+halberstam halbPstam
+halbert halbPt
+halbig halb6g
+halbrook halbrqk
+halbrooks halbrqks
+halbur halbP
+halbutogullari halbUtOgUl)r/
+halcion hals/~
+halcion's hals/~z
+halcomb halk}
+halcyon hals/~
+halcyone hals/]n
+hald h{ld
+haldan hald~
+haldana h@ldan@
+haldeman holdm~
+haldeman hold}~
+haldeman's holdm~z
+haldeman's hold}~z
+halden h{ld~
+halder h{ldP
+halderman h{ldPm~
+hale hAl
+hale's hAlz
+halen hAlcn
+hales hAlz
+haley hAl/
+haley's hAl/z
+half haf
+half's hafs
+halfacre hafAkP
+halfback hafbak
+halfdan halfd~
+halferty hafPt/
+halfhearted hafhort@d
+halfhill hafhil
+halfman hafm~
+halfmann hafm~
+halford hafPd
+halfrida hafr@d@
+halftime haftIm
+halftone haftOn
+halfway hafwA
+halgren halgrcn
+haliburton hal@bVt~
+halibut hal@b@t
+halide halId
+halifax hal@faks
+halik hal6k
+halima h@lEm@
+halimeda hol/mAd@
+halite halIt
+halko halk]
+hall h{l
+hall's h{lz
+halla hal@
+halladay hal@dA
+hallahan hal@han
+hallam hal}
+hallanan hal~~
+hallandale hal~dAl
+hallas hal@z
+hallauer hal?P
+hallbauer h{lb?r
+hallberg h{lbPg
+halle hal
+halle hal/
+halleck hal6k
+hallelujah hal@lUy@
+hallen h{l~
+hallenbeck h{l~bek
+haller h{lP
+halleran halPan
+hallet halct
+hallett halct
+halley hAl/
+halley hal/
+hallford halfPd
+hallgarten h{lgort~
+hallgren halgrcn
+halliburton hal@bVt~
+halliburton's hal@bVt~z
+halliciforn h@lis@f{rn
+halliday hal@dA
+hallie h{l/
+halligan hal6g~
+hallin halin
+hallinan hal~~
+halling h{l6N
+hallingby h{l6Nb/
+hallisey hal@s/
+hallman h{lm~
+hallmark holmork
+hallmark's h{lmorks
+hallmarks h{lmorks
+hallock hal@k
+halloran halP~
+hallow hal]
+halloway hal]wA
+hallowe'en hal@wEn
+hallowed hal]d
+halloween hal@wEn
+hallowell hal@wcl
+hallows hal]z
+hallquist halkwist
+halls h{lz
+hallstrom halstr}
+hallucinate h@lUs~At
+hallucinated h@lUs~At@d
+hallucinates h@lUs~Ats
+hallucinating h@lUs~At6N
+hallucination h@lUs~AS~
+hallucinations h@lUs~AS~z
+hallucinatory h@lUs~@t{r/
+hallucinogenic h@lUs~@jen6k
+hallum hal}
+hallums hal}z
+hallward h{lwPd
+hallway h{lwA
+hallways h{lwAz
+hallwood h{lwqd
+hally hal/
+halm hom
+halmi h{lm/
+halmos h{lm]s
+halmstad holmstad
+halo hAl]
+halogen hal@j~
+halogenate hal@j~At
+halogenated hal@j~At@d
+halon hAlon
+halophytic hal@fit6k
+halos hAl]z
+halper halpP
+halperin halpPin
+halperin halprin
+halpern halpPn
+halpert halpPt
+halpin halpin
+halprin halprin
+halsell hals@l
+halseth halscT
+halsey hals/
+halstead halstcd
+halsted halst@d
+halston h{lst~
+halt h{lt
+halted h{lt@d
+halteman hAltm~
+halter h{ltP
+halterman h{ltPm~
+halters h{ltPz
+halting h{lt6N
+haltingly h{lt6Nl/
+haltiwanger halt@w@NP
+haltom halt}
+halton halt~
+halts h{lts
+haluska h@lusk@
+halve hav
+halved havd
+halverson halvPs~
+halves havz
+halving hav6N
+halvorsen halv{rs~
+halvorson halvPs~
+ham ham
+hama hom@
+hamacher ham@kP
+hamad ham@d
+hamada homod@
+hamadei ham@dA
+hamadi h}od/
+hamaker homAkP
+hamal hAm@l
+hamamoto homomOt]
+haman hAm~
+hamanaka h}~ok@
+hamann hom~
+hamar h})r
+hamas homos
+hamas' homos
+hamasaki homosok/
+hambelton h}belt~
+hamberg hambPg
+hamberger hambPgP
+hamblen hamb@l~
+hamblet hamblit
+hambleton hamb@lton
+hambley hambl/
+hamblin hamblin
+hambly hambl/
+hambrecht hambrekt
+hambrick hambrik
+hambright hambrIt
+hambro hambr]
+hambros hambr]s
+hamburg hambPg
+hamburger hambPgP
+hamburgers hambPgPz
+hamby hamb/
+hamdan hamd~
+hamdoon hamdUn
+hamed hamd
+hameister hamIstP
+hamel ham@l
+hamelin ham@lin
+hamer hamP
+hames hAmz
+hamid h}Ed
+hamiel ham/l
+hamil ham@l
+hamill ham@l
+hamilton ham@lt~
+hamilton's ham@lt~z
+hamish hamiS
+hamiter hamItP
+hamitic hamit6k
+hamler ham@lP
+hamlet haml@t
+hamlets haml@ts
+hamlett hamlct
+hamley haml/
+hamley's haml/z
+hamlin hamliN
+hamlisch haml6S
+hamlisch's haml6S@z
+hamm ham
+hammac ham@k
+hammacher hamokP
+hammack ham@k
+hammaker hamAkP
+hamman ham~
+hammann ham~
+hammar hamP
+hammas h}os
+hammas' h}os
+hammas's h}os@s
+hamme ham
+hammel ham@l
+hammell ham@l
+hammen ham~
+hammer hamP
+hammer's hamPz
+hammered hamPd
+hammering hamP6N
+hammerle hamP@l
+hammerlock hamPlok
+hammerman hamPm~
+hammermeister hamPmIstP
+hammermill hamPmil
+hammers hamPz
+hammerschmidt hamPSmit
+hammersley hamPsl/
+hammersmith hamPsmiT
+hammerson hamPs~
+hammerstein hamPstEn
+hammerstein hamPstIn
+hammerstein's hamPstEnz
+hammerstein's hamPstInz
+hammerstrom hamPstr}
+hammes hamz
+hammett hamct
+hammill ham@l
+hammitt hamit
+hammock ham@k
+hammocks ham@ks
+hammon ham~
+hammond ham~d
+hammonds ham~dz
+hammons ham~z
+hammontree ham~trE
+hamner hamnP
+hamon ham~
+hamor hamP
+hamp hamp
+hampe hamp
+hampel hamp@l
+hamper hampP
+hampered hampPd
+hampering hampP6N
+hampers hampPz
+hample hamp@l
+hampshire hamSIP
+hampshire hamSP
+hampshire hampSIP
+hampshire hampSP
+hampshire's hamSIPz
+hampshire's hamSPz
+hampshire's hampSIPz
+hampshire's hampSPz
+hampshirites hampSPIts
+hampson hamps~
+hampstead hampsted
+hampton hampt~
+hampton's hampt~z
+hamptons hampt~z
+hamre hamP
+hamric hamr6k
+hamrick hamr6k
+hamrock hamrok
+hams hamz
+hamsher hamSP
+hamson hams~
+hamsphire hamsfIr
+hamster hamstP
+hamsters hamstPz
+hamstra hamstr@
+hamstring hamstriN
+hamstrings hamstriNz
+hamstrung hamstr@N
+hamtramck hamtram6k
+han han
+han hon
+han's hanz
+han's honz
+hana han@
+hanafin han@fin
+hanagan honogon
+hanahan han@han
+hanak hon@k
+hanan hAn~
+hanas han@z
+hanauer han?P
+hanawalt han@w{lt
+hanaway han@wA
+hanback hanbak
+hanberry hanber/
+hanbury hanber/
+hanby hanb/
+hance hans
+hancher hanCP
+hanchett hanCct
+hanchey hanC/
+hancock hankok
+hancock's hankoks
+hancox hankoks
+hand hand
+handa hand@
+handbag handbag
+handbags handbagz
+handball handb{l
+handbill handbil
+handbills handbilz
+handbook handbqk
+handbooks handbqks
+handclasp handklasp
+handcraft handkraft
+handcrafted handkraft@d
+handcrafts handkrafts
+handcuff handkuf
+handcuffed handkuft
+handcuffs handkufs
+handed hand@d
+handedly hand@dl/
+handedness hand@dn@s
+handel hand@l
+handel's hand@lz
+handeland hand@l~d
+handelman hand@lm~
+handels hand@lz
+handelsbank hand@lzbaNk
+handelsbanken hand@lsbaNk~
+handelsman hand@lsm~
+hander handP
+handers handPz
+handford handfPd
+handful handfql
+handfuls handfqlz
+handgun handgun
+handguns handgunz
+handheld handheld
+handhold handhOld
+handholding handhOld6N
+handicap hand/kap
+handicapped hand/kapt
+handicapper hand/kapP
+handicappers hand/kapPz
+handicapping hand/kap6N
+handicaps hand/kaps
+handicraft hand/kraft
+handicrafts hand/krafts
+handier hand/P
+handily hand@l/
+handing hand6N
+handiwork hand/wVk
+handke handk/
+handkerchief haNkPC/f
+handkerchief haNkPC@f
+handkerchiefs haNkPC/fs
+handkerchiefs haNkPC@fs
+handle hand@l
+handlebar hand@lbor
+handlebars hand@lborz
+handled hand@ld
+handler hand@lP
+handler handlP
+handlers hand@lPz
+handlers handlPz
+handles hand@lz
+handley handl/
+handlin handlin
+handling hand@l6N
+handling handl6N
+handlon handl~
+handloom handlUm
+handlooms handlUmz
+handly handl/
+handmade handmAd
+handmade hanmAd
+handout hand?t
+handouts hand?ts
+handover hand]vP
+handpick handpik
+handpicked handpikt
+handrail handrAl
+handrich handr6k
+handros handr]s
+hands handz
+hands hanz
+handsaw hands{
+handset handset
+handsets handsets
+handshake handSAk
+handshakes handSAks
+handshaking handSAk6N
+handsome hans}
+handsomely hans}l/
+handstand handstand
+handstands handstandz
+handwerk handwPk
+handwerker handwPkP
+handwoven handwOv~
+handwoven hanwOv~
+handwriting handrIt6N
+handwritten handrit~
+handy hand/
+handyman hand/man
+handymen hand/men
+hane hAn
+haneda h~Ad@
+hanel han@l
+haneline han@lIn
+hanemann hAnm~
+haner hAnP
+hanes hAnz
+haney hAn/
+hanf hanf
+hanford hanfPd
+hanft hanft
+hang haN
+hangar haNP
+hangars haNPz
+hangartner haNgortnP
+hanged haNd
+hangen haN~
+hanger haNP
+hangers haNPz
+hangin' haNg~
+hanging haN6N
+hanging haNg6N
+hangings haNg6Nz
+hangman haNm~
+hangout haN?t
+hangouts haN?ts
+hangover haNOvP
+hangovers haNOvPz
+hangs haNz
+hangsang haNsaN
+hangsang's haNsaNz
+hangup haNgup
+hangups haNgups
+hani han/
+hani's han/z
+hanifen han@f~
+hanifin han@f~
+hanigan han@g~
+haning hAn6N
+hanisch han6S
+hanisee han@s/
+hanish han6S
+hanjin hanj~
+hank haNk
+hank's hanks
+hanke haNk
+hankel haNk@l
+hanken haNk~
+hanker haNkP
+hankering haNkP6N
+hankerson haNkPs~
+hankes haNks
+hankey haNk/
+hankin haNkin
+hankins haNkinz
+hankinson haNkins~
+hankla haNkl@
+hanko haNk]
+hanks haNks
+hanky haNk/
+hanley hanl/
+hanley's hanl/z
+hanlin hanlin
+hanlon hanl~
+hanly hanl/
+hanmer hanmP
+hann han
+hanna han@
+hanna's han@z
+hannaford han@fPd
+hannagan han@gan
+hannah han@
+hannahs han@z
+hannam han}
+hannaman han}~
+hannan han~
+hannay hanA
+hanneken han6k~
+hanneman hanm~
+hannemann hanm~
+hannen han~
+hanner hanP
+hanners hanPz
+hannes hanz
+hannesson han@s~
+hanney han/
+hanni han/
+hannibal han@b@l
+hannie han/
+hannifin han@f~
+hannig han6g
+hannigan han6g~
+hanning han6N
+hannis hanis
+hannity han@t/
+hannoch han@k
+hannold hanOld
+hannon han~
+hannula hanUl@
+hannum han}
+hanny han/
+hano hon]
+hanoi han<
+hanoi's h~<z
+hanold han]ld
+hanover han]vP
+hanover's han]vPz
+hanoverian han]vir/~
+hanrahan hanr@han
+hanratty hanr@t/
+hans hanz
+hans hons
+hansa hans@
+hansard hansPd
+hansberger hansbPgP
+hansberry hansber/
+hansbrough hansbr?
+hansbury hansbcr/
+hansche hanS/
+hanscom hansk}
+hanseatic hans/at6k
+hansel hans@l
+hansell hans@l
+hanselman hans@lm~
+hansen hans~
+hansen's hans~z
+hanser honsP
+hansford hansfPd
+hanshaw hanS{
+hanshew hanSU
+hanshin hanSin
+hansley hansl/
+hansman hansm~
+hansmann hansm~
+hansom hans}
+hanson hans~
+hanson's hans~z
+hanssen hans~
+hansson hans~
+hanta hant@
+hanta hont@
+hantavirus hant@vIr@s
+hanten hant~
+hanthorn hanTPn
+hantman hantm~
+hantz hants
+hanukkah hon@k@
+hanukkah's hon@k@z
+hanukkahs hon@k@z
+hanus hAn@s
+hanvey hanv/
+hanwa hanw@
+hanwa's hanw@z
+hanway hanwA
+hany hAn/
+hany's hAn/z
+hanzel hanz@l
+hanzlik hanzl6k
+hao h?
+hao-chi h?CE
+hap hap
+hapag hApag
+hapeman hApm~
+hapgood hapgqd
+haphazard haphazPd
+haphazardly haphazPdl/
+hapke hApk/
+hapless hapl@s
+haploid hapl<d
+hapner hapnP
+hapoalim h@pOlim
+hapoalim h@p]@lEm
+happ hap
+happe hap
+happel hap@l
+happen hap~
+happened hap~d
+happening hapn6N
+happening hap~6N
+happenings hapn6Nz
+happenings hap~6Nz
+happens hap~z
+happenstance hap~stans
+happier hap/P
+happiest hap/@st
+happily hap@l/
+happiness hap/n@s
+happy hap/
+hapsburg hapsbPg
+haq hak
+haq's haks
+haque hak
+hara h,r@
+hara-kiri h)r6kir/
+harada horod@
+haradim h@radEm
+haradim h@radim
+harahan har@han
+harald h)r@ld
+haralda horold@
+haralson har@ls~
+haran har~
+harangue hPaN
+harangued hPaNd
+harangues hPaNz
+haranguing hPaN6N
+harare hP)r/
+harass hPas
+harassed hPast
+harasser hPasP
+harassers hPasPz
+harassing hPas6N
+harassment hPasm~t
+haraszti hPast/
+haraway h)r@wA
+harb h)rb
+harbach h)rbok
+harbaugh h)rb{
+harbeck h)rbek
+harber h)rbP
+harbert h)rbPt
+harberts h)rbPts
+harbeson h)rb@s~
+harbin h)rbin
+harbinger h)rb~jP
+harbingers h)rb~jPz
+harbinson h)rb~s~
+harbison h)rbis~
+harbold h)rbOld
+harbor h)rbP
+harbor's h)rbPz
+harbored h)rbPd
+harboring h)rbP6N
+harbors h)rbPz
+harborside h)rbPsId
+harbour h)rbP
+harbuck h)rb@k
+harbury h)rbP/
+harc h)rk
+harclerode h)rk@lP]d
+harcourt h)rk{rt
+harcourt's h)rkPts
+harcrow h)rkr]
+harcum h)rk}
+hard h)rd
+hardacre h)rdAkP
+hardage h)rd6j
+hardart h)rdort
+hardaway h)rd@wA
+hardback h)rdbak
+hardball h)rdb{l
+hardboard h)rdb{rd
+hardcastle h)rdkas@l
+hardcore h)rdk{r
+hardcover h)rdkuvP
+hardebeck h)rdbck
+hardee h)rdE
+hardee's h)rdEz
+hardegree hord6grE
+hardeman h)rdm~
+harden h)rd~
+harden's h)rd~z
+hardenbrook h)rd~brqk
+hardened h)rd~d
+hardener h)rd~P
+hardening h)rdn6N
+hardening h)rd~6N
+hardens h)rd~z
+harder h)rdP
+harders h)rdPz
+hardest h)rd@st
+hardesty h)rd@st/
+hardey h)rd/
+hardgood h)rdgqd
+hardgoods h)rdgqdz
+hardgrave h)rdgrAv
+hardgrove h)rdgrOv
+hardhead h)rdhed
+hardheaded h)rdhed@d
+hardick h)rd6k
+hardie h)rd/
+hardier h)rd/P
+hardigree hord6grE
+hardiman h)rd}~
+hardimon h)rd}on
+hardin h)rdin
+harding h)rd6N
+harding's h)rd6Ns
+hardinger h)rd6NP
+hardison h)rd@s~
+hardister h)rd@stP
+hardisty h)rd@st/
+hardline h)rdlIn
+hardliner h)rdlInP
+hardliners h)rdlInPz
+hardly h)rdl/
+hardman h)rdm~
+hardness h)rdn@s
+hardnett h)rdnct
+hardpressed h)rdprest
+hardrick h)rdr6k
+hards h)rdz
+hardscrabble h)rdskrab@l
+hardship h)rdSip
+hardships h)rdSips
+hardt h)rt
+hardtke h)rdk/
+hardware h)rdwer
+hardway h)rdwA
+hardwick h)rdwik
+hardwicke h)rdw6k
+hardwin h)rdwin
+hardwood h)rdwqd
+hardwoods h)rdwqdz
+hardwork h)rdwVk
+hardworking h)rdwVk6N
+hardy h)rd/
+hardy's h)rd/z
+hardymon h)rd/mon
+hare h,r
+hare's h,rz
+harebrained h,rbrAnd
+harelson har@ls~
+harem h,r}
+haren h,r~
+harer h,rP
+hares h,rz
+harewood h,rwqd
+harff h)rf
+harford h)rfPd
+hargadon horgod{n
+hargan h)rg~
+hargarten h)rgort~
+hargens h)rg~z
+harger h)rgP
+hargett h)rj@t
+hargis h)rgis
+hargrave h)rgrAv
+hargraves h)rgrAvz
+hargreaves h)rgrEvz
+hargrove h)rgrOv
+hargus h)rg@s
+hari h)r/
+harig har6g
+harima hcrEm@
+haring h,r6N
+hariri hPir/
+haris h)r/s
+haris h,ris
+haritos hcrEt]s
+hariz h,riz
+harjo h)rj]
+harju h)ryU
+hark h)rk
+harkavy h)rk@v/
+harke h)rk
+harken h)rk~
+harker h)rkP
+harkey h)rk/
+harkin h)rkin
+harkin's h)rkinz
+harking h)rk6N
+harkins h)rkinz
+harkleroad h)rklP]d
+harkless h)rkl@s
+harkness h)rkn@s
+harkrader h)rkr@dP
+harkrider h)rkrIdP
+harks h)rks
+harl h)rl
+harlacher h)rl@kP
+harlan h)rl~
+harland h)rl~d
+harle h)r@l
+harlem h)rl}
+harlem's h)rl}z
+harleman h)r@lm~
+harlequin h)rl@kw~
+harless h)rl@s
+harley h)rl/
+harley's h)rl/z
+harleysville h)rl/zvil
+harlin h)rlin
+harlin's h)rlinz
+harling h)rl6N
+harlingen h)rl6N~
+harlison h)rl@s~
+harloff h)rl{f
+harlot h)rl@t
+harlow h)rl]
+harm h)rm
+harm's h)rmz
+harman h)rm~
+harmata hormot@
+harmattan horm@tan
+harmed h)rmd
+harmel h)rm@l
+harmening h)rm~6N
+harmer h)rmP
+harmes h)rmz
+harmetz h)rmets
+harmeyer h)rmIP
+harmful h)rmf@l
+harmfulness h)rmf@ln@s
+harming h)rm6N
+harmison h)rm@s~
+harmless h)rml@s
+harmlessly h)rml@sl/
+harmon h)rm~
+harmon's h)rm~z
+harmonia hormOn/@
+harmonic hormon6k
+harmonica hormon6k@
+harmonics hormon6ks
+harmonie h)rm~/
+harmonies h)rm~/z
+harmonious hormOn/@s
+harmoniously hormOn/@sl/
+harmonium hormOn/}
+harmonization horm~@zAS~
+harmonize h)rm~Iz
+harmonized h)rm~Izd
+harmonizing h)rm~Iz6N
+harmony h)rm~/
+harms h)rmz
+harmsen h)rms~
+harn h)rn
+harnack h)rn@k
+harnage h)rn6j
+harnden h)rnd~
+harne h)rn
+harned h)rnd
+harner h)rnP
+harness h)rn@s
+harnessed h)rn@st
+harnesses h)rn@s@z
+harnessing h)rn@s6N
+harnett h)rnct
+harney h)rn/
+harnisch h)rn6S
+harnischfeger h)rn6SfegP
+harnischfeger's h)rn6SfegPz
+harnish h)rniS
+harnois hornwo
+haro h)r]
+harold h,r@ld
+harold's h,r@ldz
+haroldson har]lds~
+harp h)rp
+harpe h)rp
+harped h)rpt
+harpel horpel
+harpenau h)rp~]
+harper h)rpP
+harper's h)rpPz
+harpercollins h)rpPk{l~z
+harpers h)rpPz
+harpham h)rf}
+harpin horpan
+harping h)rp6N
+harpist h)rpist
+harpists h)rpis
+harpists h)rpiss
+harpists h)rpists
+harpley h)rpl/
+harpo h)rp]
+harpold h)rpOld
+harpole h)rpOl
+harpoon horpUn
+harpoons horpUnz
+harpootlian horpUtl/~
+harps h)rps
+harpsichord h)rps@k{rd
+harpst h)rpst
+harpster h)rpstP
+harquebus h)rkw@b@s
+harr har
+harrah har@
+harrah's h,r@z
+harral har@l
+harralson har@ls~
+harre har
+harrel har@l
+harreld har@ld
+harrell h,r@l
+harrell's har@lz
+harrelson h,r@ls~
+harren har~
+harrer h)rP
+harried h,r/d
+harrier h,r/P
+harries h,r/z
+harriet h,r/@t
+harriette har/ct
+harrigan h,r6g~
+harriger har6gP
+harrill har@l
+harriman h,r}~
+harring har6N
+harrington h,r6Nt~
+harriott har/@t
+harris h,ris
+harris' h,ris
+harris's h,ris@z
+harrisburg harisbPg
+harrisburg's harisbPgz
+harrison h,r@s~
+harrison's h,r@s~z
+harriss haris
+harrity har@t/
+harrod h,r@d
+harrod's h,r@dz
+harrods h,r@dz
+harrold h,r@ld
+harron har~
+harrop h,r@p
+harroun hPUn
+harrow har]
+harrower har]wP
+harrowing h,r]6N
+harry h,r/
+harry's h,r/z
+harryman har/m~
+harsch h)rS
+harsco h)rsk]
+harsh h)rS
+harsha h)rS@
+harsham h)rS}
+harshaw h)rS{
+harshbarger h)rSborgP
+harshberger h)rSbPgP
+harsher h)rSP
+harshest h)rS@st
+harshfield h)rSfEld
+harshly h)rSl/
+harshman h)rSm~
+harshness h)rSn@s
+harstad h)rst@d
+harston h)rst~
+hart h)rt
+hart's h)rts
+harte h)rt
+hartel h)rt@l
+hartell h)rt@l
+harten h)rt~
+hartenstein h)rt~stEn
+hartenstein h)rt~stIn
+harter h)rtP
+hartfiel h)rtfEl
+hartfield h)rtfEld
+hartford h)rtfPd
+hartford's h)rtfPdz
+hartgraves h)rtgrAvz
+hartgrove h)rtgrOv
+harth h)rT
+hartig h)rt6g
+hartigan h)rt6g~
+hartin h)rtin
+harting h)rt6N
+hartinger h)rt6NP
+hartis h)rtis
+hartje h)rtjA
+hartke h)rtk/
+hartkopf h)rtk{f
+hartl h)rt@l
+hartlage h)rtl6j
+hartland h)rtl~d
+hartlaub h)rtl?b
+hartle h)rt@l
+hartless h)rtl@s
+hartley h)rtl/
+hartlieb h)rtlEb
+hartline h)rtlIn
+hartling h)rtl6N
+hartman h)rtm~
+hartmann h)rtm~
+hartmarx h)rtmorks
+hartnell h)rtn@l
+hartner h)rtnP
+hartness h)rtn@s
+hartnett h)rtnct
+hartney h)rtn/
+hartog h)rt@g
+harton h)rt~
+hartong h)rt{N
+hartranft h)rtrunft
+harts h)rts
+hartsell h)rts@l
+hartsfield h)rtsfEld
+hartshorn h)rtsh{rn
+hartshorne h)rCPn
+hartsock h)rts@k
+hartsoe h)rts]
+hartson h)rts~
+hartsook h)rtsqk
+hartsough h)rts?
+hartstein h)rtstEn
+hartstein h)rtstIn
+hartsville h)rtsvil
+hartt h)rt
+hartter h)rtP
+hartung h)rt@N
+hartwell h)rtwel
+hartwick h)rtwik
+hartwig h)rtw6k
+hartwood h)rtwqd
+harty h)rt/
+hartz h)rts
+hartzel h)rtz@l
+hartzell h)rtz@l
+hartzler h)rtslP
+hartzog h)rtz@g
+haruo horU]
+harv h)rv
+harvard h)rvPd
+harvard's h)rvPdz
+harvath h)rv@T
+harve h)rv
+harvel h)rv@l
+harvell h)rv@l
+harvest h)rv@st
+harvestable h)rv@st@b@l
+harvested h)rv@st@d
+harvester h)rv@stP
+harvesters h)rv@stPz
+harvesting h)rv@st6N
+harvests h)rv@s
+harvests h)rv@ss
+harvests h)rv@sts
+harvey h)rv/
+harvey's h)rv/z
+harvie h)rv/
+harvill h)rvil
+harville h)rvil
+harvin h)rvin
+harvison h)rv@s~
+harward h)rwPd
+harwell h)rwel
+harwick h)rw6k
+harwood h)rwqd
+haryana hcryon@
+has h@z
+has haz
+has-been hazbin
+has-beens hazbinz
+hasan hAz~
+hasbro hazbr]
+hasbro's hazbrOz
+hasbrook hasbrqk
+hasbrouck hazbrqk
+hascall hask@l
+hasch haS
+haschke haSk
+hase hAz
+hasegawa hosAgow@
+hasek hosck
+haselden has@ld~
+haseley has@l/
+haselhorst has@lh{rst
+haseltine has@lt/n
+haselton h@selt~
+haseman hAsm~
+hasenauer has~?P
+hasenfus hAz~fus
+haser hezP
+hash haS
+hashagen haS@g~
+hashed haSt
+hashem haScm
+hashemi h@SAm/
+hashemite haS}It
+hasher haSP
+hasher's haSPz
+hashers haSPz
+hashes haS@z
+hashi haS/
+hashim haSim
+hashimoto hoS/mOt]
+hashing haS6N
+hashish haSiS
+hashish huSES
+hashman haSm~
+hashmi haSm/
+hashmi hoSm/
+hasidic h@sEd6k
+hasidic h@sid6k
+hasidim h@sEdim
+hasidim h@sidim
+haske hAsk
+haskell hask@l
+haskett haskct
+haskew haskyU
+haskin haskin
+haskins haskinz
+haslam hasl}
+hasler has@lP
+haslett haslct
+hasley hazl/
+hasn't haz~t
+haso hosO
+haso's hosOz
+haspel hasp@l
+hass has
+hassan h@son
+hasse hos
+hassebrock has@brok
+hassel has@l
+hasselbach has@lbok
+hasselbring has@lbr6N
+hassell has@l
+hasselman has@lm~
+hassen has~
+hassenberg has~bPg
+hassenfeld has~feld
+hassett hasct
+hassey has/
+hassig has6g
+hassing has6N
+hassinger has~jP
+hassle has@l
+hassled has@ld
+hassler haslP
+hassles has@lz
+hassling has@l6N
+hassling hasl6N
+hassman hasm~
+hasson has~
+hast hast
+hasta hast@
+hasta ost@
+haste hAst
+hasten hAs~
+hastened hAs~d
+hastening hAsn6N
+hastening hAs~6N
+hastens hAs~z
+hastert hastPt
+hastey hAst/
+hastie hAst/
+hastily hAst@l/
+hasting hAst6N
+hastings hAst6Nz
+haston hast~
+hasty hAst/
+haswell haswcl
+hasz hoS
+hat hat
+hat's hats
+hata hot@
+hatala hat@l@
+hataway hat@wA
+hatch haC
+hatch's haC@z
+hatchback haCbak
+hatched haCt
+hatchel haC@l
+hatchell haC@l
+hatcher haCP
+hatcheries haCP/z
+hatchery haCP/
+hatches haC@z
+hatchet haC@t
+hatchets haC@ts
+hatchett haCct
+hatching haC6N
+hate hAt
+hated hAt@d
+hateful hAtf@l
+hatem hatim
+hater hAtP
+haters hAtPz
+hates hAts
+hatfield hatfEld
+hatfield's hatfEldz
+hath haT
+hathaway haT@wA
+hathaway's haT@wAz
+hathcoat haTkOt
+hathcock haTk@k
+hatheway hATwA
+hathorn hoT{rn
+hathorne haTPn
+hating hAt6N
+hatler hAt@lP
+hatlestad hat@lst@d
+hatley hatl/
+hatmaker hatmAkP
+hatred hAtr@d
+hatreds hAtr@dz
+hats hats
+hatt hat
+hattabaugh hat@b{
+hattan hat~
+hattaway hat@wA
+hatten hat~
+hattendorf hat~d{rf
+hatter hatP
+hatteras hatP@s
+hattersley hatPzl/
+hattery hatP/
+hattie hat/
+hatton hat~
+hattori hot{r/
+hattusas h@tUs@s
+hatty hat/
+hatz hats
+hau h?
+haub h{b
+hauber h?bP
+haubert h?bPt
+haubner h?bnP
+haubrich h?br6k
+hauch h{C
+hauck h{k
+hauenstein h?~st/n
+hauenstein h?~stIn
+hauer h?P
+haueter h?tP
+hauf h{f
+haufer h{fP
+hauff h{f
+haug h{g
+haugan h{g~
+hauge h{j
+haugen h?g~
+hauger h?gP
+haugh h{
+haughey h{k/
+haughn h{n
+haught h{t
+haughtily h{t@l/
+haughton h{t~
+haughty h{t/
+haugland h{gl~d
+hauk h{k
+hauke h{k
+haul h{l
+hauled h{ld
+hauler h{lP
+haulers h{lPz
+hauling h{l6N
+hauls h{lz
+haulsey h{ls/
+haun h{n
+haunt h{nt
+haunted h{n@d
+haunted h{nt@d
+haunting h{nt6N
+hauntingly h{nt6Nl/
+haunts h{nts
+haupert h?pPt
+hauppauge h?p{j
+haupt h{pt
+hauptfuhrer h?ptfyqrP
+hauptman h?ptm~
+hauptmann h?ptm~
+haury h{r/
+haus h?s
+hausa h?s@
+hausauer h?s?P
+hausch h?S
+hauschild h?sCIld
+hauschildt h?Silt
+hause h?s
+hausen h?z~
+hauser h?zP
+hauserman h?zPm~
+hausfeld h?sfeld
+hausky h{sk/
+hausler h?s@lP
+hausman h?sm~
+hausmann h?sm~
+hausner h?snP
+hauss h?s
+hausser h?sP
+haussler h?s@lP
+haussmann h?sm~
+hausummi h?sUm/
+hauswirth h?swPT
+haut h{t
+hautala h{t@l@
+haute hOt
+haute hut
+hauter h?tP
+hauth h{T
+hauver h?vP
+havana h@van@
+havana's h@van@z
+havard havPd
+havas hovoz
+have hav
+havel hav@l
+havelka h@velk@
+havelock havlok
+haveman hAvm~
+havemann hav}~
+haven hAv~
+haven't hav~
+haven't hav~t
+havener hav/nP
+havens hAv~z
+haver hevP
+haverfield havPfEld
+haverford havPfPd
+haverkamp havPkamp
+haverland havPl~d
+haverly hAvPl/
+haverstick hAvPst6k
+haverstock hAvPstok
+haverty havPt/
+haves havz
+havey hAv/
+haviland hAv/l~d
+havill hovEl
+havilland hav@l~d
+havin' hav~
+having hav6N
+havington hav6Nt~
+havington's hav6Nt~z
+havins havinz
+havis havis
+havlicek hovl6Cck
+havlik havl6k
+havlin havlin
+havner havnP
+havoc hav@k
+havran havr~
+havranek h@vranck
+havrilla havril@
+havron havr~
+haw h{
+hawaii h@wIE
+hawaii's h@wIEz
+hawaiian h@wI~
+hawaiians h@wI~z
+hawass hawos
+hawbaker h{bAkP
+hawe h{
+hawes h{z
+hawing h{6N
+hawk h{k
+hawkbill h{kbil
+hawkbill's h{kbilz
+hawke h{k
+hawke's h{ks
+hawked h{kt
+hawken h{k~
+hawker h{kP
+hawkers h{kPz
+hawkes h{ks
+hawkey h{kE
+hawkeye h{kI
+hawkeye's h{kIz
+hawkiness h{kn@s
+hawking h{k6N
+hawkins h{kinz
+hawkins' h{kinz
+hawkinson h{k~s~
+hawkish h{k6S
+hawks h{ks
+hawksley h{ksl/
+hawley h{l/
+hawley's h{l/z
+hawn h{n
+haworth hawPT
+haws h{z
+hawthorn h{T{rn
+hawthorne h{T{rn
+hawthorne's h{T{rnz
+hawthorns h{T{rnz
+hawver h{vP
+haxton hakst~
+hay hA
+hayashi hoyoS/
+hayashida hoyoSEd@
+haycock hAkok
+haycraft hAkraft
+haydel hAd@l
+hayden hAd~
+haydn hId~
+haydn's hId~z
+haydock hAdok
+haydon hAd~
+haydu hAdU
+hayduk hAd@k
+haye hA
+hayek hA6k
+hayen hA~
+hayenga hAANg@
+hayer hAP
+hayes hAz
+hayfield hAfEld
+hayfields hAfEldz
+hayford hAfPd
+haygood hAgqd
+hayhurst hAhPst
+haying hA6N
+hayles hAlz
+hayley hAl/
+hayloft hAl{ft
+haymaker hAmAkP
+hayman hAm~
+haymarket hAmorkct
+haymes hAmz
+haymon hAm~
+haymond hAm~d
+haymore hAm{r
+hayn hAn
+hayne hAn
+hayner hAnP
+haynes hAnz
+haynesworth hAnzwPT
+haynie hAn/
+haynsworth hAnzwPT
+hays hAz
+hayse hAz
+hayslett hAslct
+hayslip hAslip
+haystack hAstak
+hayter hAtP
+hayton hAt~
+hayward hAwPd
+hayward's hAwPdz
+haywire hAwIr
+haywood hAwqd
+hayworth hAwVT
+hazan hAz~
+hazard hazPd
+hazardous hazPd@s
+hazards hazPdz
+haze hAz
+hazel hAz@l
+hazelbaker hAz@lbAkP
+hazelett haz@lct
+hazelett hazlct
+hazelip haz@lip
+hazell haz@l
+hazelnut hAz@lnut
+hazelrigg h@zelr6g
+hazelrigg hAzclr6g
+hazeltine hAz@ltIn
+hazelton hAz@lt~
+hazelwood hAz@lwqd
+hazelwood's hAz@lwqdz
+hazen hAz~
+hazing hAz6N
+hazle hAz@l
+hazleton hAz@lt~
+hazlett hazlct
+hazlewood hAz@lwqd
+hazy hAz/
+hazzard hazPd
+hbox ACb{ks
+hces ACsEEes
+he hE
+he'd hEd
+he'll hEl
+he's hEz
+heaberlin hEbPl~
+heacock hEk@k
+heacox hEkoks
+head hed
+head's hedz
+headache hedAk
+headaches hedAks
+headband hedband
+headbands hedbandz
+headboard hedb{rd
+headcheese hedCEz
+headcount hedk?nt
+headdress hedres
+headdresses heddres@z
+headed hed@d
+headen hed~
+header hedP
+headfirst hedfVst
+headgear hedgir
+headhunter hedhuntP
+headhunters hedhuntPz
+heading hed6N
+headings hed6Nz
+headington hed6Nt~
+headlee hedlE
+headless hedl@s
+headley hedl/
+headlight hedlIt
+headlights hedlIts
+headline hedlIn
+headlined hedlInd
+headliner hedlInP
+headlines hedlInz
+headlining hedlIn6N
+headlong hedl{N
+headlund hedl~d
+headman hedm~
+headmaster hedmastP
+headmistress hedmistr@s
+headphone hedfOn
+headphones hedfOnz
+headquarter hedkw{rtP
+headquarter hedk{rtP
+headquartered hedkw{rtPd
+headquartered hedk{rtPd
+headquarters hedkw{rtPz
+headquarters hedk{rtPz
+headrest hedrest
+headrests hedres
+headrests hedress
+headrests hedrests
+headrick hedr6k
+headroom hedrUm
+heads hedz
+headset hedset
+headsets hedsets
+headship hedSip
+headsman hedzm~
+headstart hedstort
+headstarts hedstorts
+headstone hedstOn
+headstones hedstOnz
+headstrong hedstr{N
+headwater hedw{tP
+headwaters hedw{tPz
+headway hedwA
+headwind hedwind
+heady hed/
+heafner hEfnP
+heagle hEg@l
+heagney hEgn/
+heagy hEj/
+heal hEl
+heald hEld
+healed hEld
+healer hElP
+healers hElPz
+healey hEl/
+healing hEl6N
+heals hElz
+health helT
+health's helTs
+healthamerica hElT},r6k@
+healthcare helTker
+healthcare's helTkerz
+healthcorp helTk{r
+healthcorp helTk{rp
+healthdyne helTdIn
+healthful helTf@l
+healthier helT/P
+healthiest helT/@st
+healthsource helTs{rs
+healthsouth helTs?T
+healthtrust helTtrust
+healthtrust's helTtrusts
+healthvest helTvest
+healthweek helTwEk
+healthwork helTwPk
+healthworks helTwPks
+healthy helT/
+healy hEl/
+healy's hEl/z
+heaney hEn/
+heap hEp
+heape hEp
+heaped hEpt
+heaphy hEf/
+heaping hEp6N
+heaps hEps
+hear hir
+heard hVd
+hearer hirP
+hearers hirPz
+hearin hirin
+hearing hir6N
+hearing's hir6Nz
+hearings hir6Nz
+hearl hVl
+hearn hVn
+hearne hVn
+hearns hVnz
+hearon hir~
+hearron h{r~
+hears hirz
+hearsay hirsA
+hearse hVs
+hearst hVst
+hearst's hVsts
+heart h)rt
+heart's h)rts
+heartache h)rtAk
+heartbeat h)rtbEt
+heartbeats h)rtbEts
+heartbreak h)rtbrAk
+heartbreaking h)rtbrAk6N
+heartbroken h)rtbrOk~
+heartburn h)rtbVn
+hearted h)rt@d
+heartedly h)rt@dl/
+hearten h)rt~
+heartened h)rt~d
+heartening h)rtn6N
+heartening h)rt~6N
+heartfelt h)rtfelt
+hearth h)rT
+hearths h)rTs
+heartily h)rt@l/
+heartland h)rtland
+heartless h)rtl@s
+hearts h)rts
+heartscan h)rtskan
+heartthrob h)rtTrob
+heartwarming h)rtw{rm6N
+heartwise h)rtwIz
+heartwood h)rtwqd
+hearty h)rt/
+heasley hEzl/
+heaslip hEslip
+heaston hEst~
+heat hEt
+heat's hEts
+heated hEt@d
+heatedly hEt@dl/
+heater hEtP
+heaters hEtPz
+heath hET
+heath's hETs
+heathcliff heTklif
+heathcock heTk@k
+heathcote heTk@t
+heathen hET~
+heather heTP
+heather's heTPz
+heatherington heTP6Nt~
+heatherly heTPl/
+heathers heTPz
+heathman hETm~
+heathrow hETr]
+heathwood hETwqd
+heating hEt6N
+heatley hEtl/
+heaton hEt~
+heats hEts
+heatwole hEtwOl
+heave hEv
+heaved hEvd
+heaven hev~
+heaven's hev~z
+heavener hev~P
+heavenly hev~l/
+heavens hev~z
+heaves hEvz
+heavey hEv/
+heavier hev/P
+heavies hev/z
+heaviest hev/@st
+heavily hev@l/
+heavin hevin
+heaving hEv6N
+heavner hEvnP
+heavrin hEvrin
+heavy hev/
+heavyhanded hev/hand@d
+heavyset hev/set
+heavyweight hev/wAt
+heavyweights hev/wAts
+hebard hebPd
+hebb heb
+hebda hebd@
+hebding hebd6N
+hebe hEb
+hebel heb@l
+hebeler heb@lP
+hebenstreit heb~strIt
+heber hEbP
+heberer hebPP
+heberle hebP@l
+heberlein hebPlIn
+heberling hebPl6N
+hebert hebPt
+hebner hebnP
+hebrew hEbrU
+hebrides hebr@d/z
+hebron hebr{n
+hebron hebr~
+hecco hek]
+hechinger hek~jP
+hechler heklP
+hecht hekt
+hecht's hekts
+hechtman hektm~
+heck hek
+heck's heks
+heckaman hek}~
+heckard hekPd
+heckart hekPt
+heckathorn hek@TPn
+heckbert hekbPt
+heckel hek@l
+heckendorn hekcnd{rn
+hecker hekP
+heckert hekPt
+heckle hek@l
+heckled hek@ld
+heckler heklP
+hecklers heklPz
+heckling hekl6N
+heckman hekm~
+heckmann hekm~
+heckuva hckyUv@
+heckuva hek@v@
+hecla hekl@
+hecla's hekl@z
+hecox hekoks
+hectare hektor
+hectares hektorz
+hectic hekt6k
+hectograph hekt@graf
+hector hektP
+hector's hektPz
+hectoring hektP6N
+hecuba heky@b@
+hecuba hekyUb@
+heda hAd@
+hedberg hedbPg
+hedda hed@
+hedden hed~
+hedding hed6N
+heddy hed/
+hedeen hed/n
+hedge hej
+hedgecock hejkok
+hedged hejd
+hedgehog hejhog
+hedgehogs hejhogz
+hedgepath hejpaT
+hedgepeth hej@pcT
+hedger hejP
+hedgers hejPz
+hedges hej@z
+hedging hej6N
+hedglin hejl~
+hedgpeth hejpcT
+hedi hed/
+hediger hed6gP
+hedin hedin
+hedinger hed6NgP
+hedley hedl/
+hedlund hedl~d
+hedman hedm~
+hedonic h@don6k
+hedonism hEd~iz}
+hedonistic hEd~ist6k
+hedquist hedkwist
+hedrich hedr6k
+hedrick hedr6k
+hedstrom hedstr}
+hedtke hedk/
+hedwig hedw6g
+hedwiga hedw6g@
+hedy hEd/
+hee hE
+heeb hEb
+heebner hEbnP
+heed hEd
+heeded hEd@d
+heeding hEd6N
+heeds hEdz
+heefner hEfnP
+heeg hEg
+heeke hEk
+heekin hEkin
+heel hEl
+heelan hEl~
+heeled hEld
+heels hElz
+heemstra hEmstr@
+heenan hEn~
+heeney hEn/
+heer hEP
+heeren hir~
+heermann hirm~
+hees hEz
+heesch hES
+heese hEz
+heeter hEtP
+hefei h@fA
+heffel hef@l
+heffelfinger hef@lf6NP
+hefferan hefP~
+hefferman hefPm~
+heffern hefPn
+heffernan hefPn~
+hefferon hefP~
+heffington hef6Nt~
+heffler heflP
+heffley hefl/
+heffner hefnP
+heffron hefr~
+hefler heflP
+hefley hefl/
+heflin heflin
+hefner hefnP
+hefner's hefnPz
+heft heft
+hefter heftP
+hefti heft/
+heftier heft/P
+heftiest heft/@st
+hefty heft/
+hegadorn heg@d{rn
+hegarty hegort/
+hege hEj
+hegedus heg@d@s
+hegel heg@l
+hegelian h/jEl/~
+hegeman hEgm~
+hegemonic heg}on6k
+hegemony h/jem~/
+hegenna hcgen@
+heger hEgP
+hegg heg
+hegge heg
+heggen heg~
+heggie heg/
+hegland hegl~d
+hegler heglP
+heglund hegl~d
+hegna hegn@
+hegner hegnP
+hegstrom hegstr}
+hegwood hegwqd
+hegyi hAgy/
+heh he
+hehir heh6r
+hehl hel
+hehman hem~
+hehmeyer hemIr
+hehn hen
+hehr h,r
+heibel hIb@l
+heiberg hIbPg
+heiberger hIbPgP
+heichel hIk@l
+heichelbech hIk@lb6k
+heick hIk
+heico hIk]
+heico's hIk]z
+heid hId
+heidbreder hIdbr@dP
+heidbrink hIdbr6Nk
+heide hId
+heidecker hId6kP
+heidel hId@l
+heidelberg hId@lbPg
+heidelberger hId@lbPgP
+heideman hIdm~
+heidemann hIdm~
+heiden hId~
+heidenreich hId~rIk
+heider hIdP
+heidi hId/
+heidi's hId/s
+heidinger hId6NP
+heidiwear hId/wcr
+heidler hId@lP
+heidorn hIdPn
+heidrich hIdr6k
+heidrick hIdr6k
+heidstra hIdstr@
+heidt hIdt
+heier hIP
+heifer hIfP
+heifer hefP
+heifers hIfPz
+heifers hefPz
+heifetz hIfits
+heifner hEfnP
+heiges hIj@z
+height hIt
+heighten hIt~
+heightened hIt~d
+heightening hItn6N
+heightening hIt~6N
+heightens hIt~z
+heighth hIT
+heights hIts
+heigl hIg@l
+heiken hIk~
+heikes hIk@z
+heikkila hIk@l@
+heikkinen hIk~~
+heiko hAk]
+heiko hIk]
+heil hIl
+heiland hIl~d
+heilbrun hIlbr~
+heileman hIlm~
+heileman's hIlm~z
+heiler hIlP
+heilig hIl6g
+heilman hIlm~
+heilmann hIlm~
+heim hIm
+heiman hIm~
+heimann hIm~
+heimbach hImbok
+heimberger hImbPgP
+heimbigner hImbIgnP
+heimbuch hImb@k
+heimburger hImbPgP
+heimer hImP
+heimerl hImPl
+heimlich hIml6k
+heims hImz
+heimsoth hIms@T
+hein hIn
+heinbach hInbok
+heinbaugh hInb?
+heinburger hInbPgP
+heindel hInd@l
+heindl hInd@l
+heine hIn
+heinecke hIn6k
+heineken hIn@k~
+heineman hInm~
+heinemann hInm~
+heinen hIn~
+heiner hInP
+heines hInz
+heiney hIn/
+heini hIn/
+heinicke hIn6k
+heinig hIn6g
+heininger hIn6NP
+heinisch hIn6S
+heinke hINk
+heinkel hINk@l
+heinl hIn@l
+heinle hIn@l
+heinlein hInlIn
+heinlen hIn@l~
+heinly hInl/
+heino hIn]
+heinold hIn]ld
+heinonen hIn~~
+heinous hAn@s
+heinrich hInr6k
+heinrichs hInr6ks
+heins hInz
+heinsohn hIns~
+heintz hInts
+heintze hInts
+heintzelman hIntz@lm~
+heintzman hIntsm~
+heiny hIn/
+heinz hInz
+heinz's hInz@z
+heinze hInz
+heinzel hInz@l
+heinzelman hInz@lm~
+heinzen hInz~
+heinzman hInzm~
+heinzmann hInzm~
+heiple hIp@l
+heir ,r
+heiress ,r@s
+heirloom ,rlUm
+heirlooms ,rlUmz
+heironimus ,ron}Us
+heironimus hIron}@s
+heirs ,rz
+heisbourg hIsb{rg
+heise hIs
+heisel hIs@l
+heiser hIsP
+heiserman hIsPm~
+heisey hIs/
+heishman hE6Sm~
+heisinger hIs~jP
+heiskell hIsk@l
+heisler hIs@lP
+heisman hIsm~
+heisman's hIsm~z
+heisner hIsnP
+heiss hIs
+heist hIst
+heistand hIst~d
+heister hIstP
+heit hIt
+heitkamp hItkamp
+heitman hItm~
+heitmann hItm~
+heitmeyer hItmIP
+heitner hItnP
+heitz hIts
+heitzenrater hItz~rAtP
+heitzman hItsm~
+heiwa hIw@
+heizer hIzP
+hejl hejl
+hejna hejn@
+hekker hekP
+hekmatyar hekm@ty)r
+hekmatyar's hekm@ty)rz
+helaba hclob@
+helander hel~dP
+helane h@lAn
+helber helbP
+helberg helbPg
+helbert helbPt
+helbig helb6g
+helbing helb6N
+helbling helb@l6N
+helbling helbl6N
+held held
+heldenbrand held~brand
+heldenbrand held~br~d
+heldentenor heldcntenP
+helder heldP
+helderman heldPm~
+heldman heldm~
+heldor heldP
+heldreth heldrcT
+heldring heldr6N
+helds heldz
+heldt helt
+helen hel~
+helen's hel~z
+helena hel~@
+helena's hel~@z
+helene h@lEn
+helens hel~z
+helf helf
+helfand helf~d
+helfer helfP
+helfgott helfgot
+helfman helfm~
+helfrich helfr6k
+helga helg@
+helgerson helgPs~
+helgesen helg/z~
+helgeson helg@s~
+helget helg@t
+helgren helgrcn
+helical hel6k@l
+helice helis
+helicon hel6kon
+helicons hel6konz
+helicopter hel6koptP
+helicopter's hel@koptPz
+helicopters hel6koptPz
+helie hel/
+helin helin
+heling hEl6N
+helinski h@linsk/
+helionetic hEl/]net6k
+helionetics hEl/]net6ks
+heliopolis hEl/op@l@s
+helios hEl/os
+heliotrope hEl/@trOp
+helium hEl/}
+helix hEl6ks
+helke helk
+hell hel
+hell's helz
+hellacious helAS@s
+hellaciously helAS@sl/
+hellaciousness helAS@sn@s
+hellams hel}z
+helland hel~d
+hellard helPd
+hellberg helbPg
+hellbusch helbuS
+helle hel
+hellen hel~
+hellenbrand hel~brand
+hellenic h@len6k
+hellenism hel~iz}
+hellenistic hel~ist6k
+hellenize hel~Iz
+hellenized hel~Izd
+heller helP
+heller's helPz
+hellerman helPm~
+hellfire helfIr
+hellickson hel6ks~
+helling hel6N
+hellinger hel6NP
+hellish hel6S
+hellman helm~
+hellmann helm~
+hellmer helmP
+hellmuth helmUT
+hellner helnP
+hello h@lO
+hello hclO
+hellraiser helrAzP
+hellstrom helstr}
+hellums hel}z
+helluva helUv@
+hellwig helw6g
+hellyer hel/P
+helm helm
+helma helm@
+helman helm~
+helmbrecht helmbr6kt
+helme helm
+helmer helmP
+helmerich helmP6k
+helmers helmPz
+helmes helmz
+helmet helm@t
+helmeted helm@t@d
+helmets helm@ts
+helmich helm6k
+helmick helm6k
+helmig helm6g
+helming helm6N
+helminiak helmin/ak
+helminski hclminsk/
+helminth helminT
+helmkamp helmkamp
+helmke helmk
+helmont helmont
+helms helmz
+helms' helmz
+helms's helmz@z
+helmsburton helmzbPt~
+helmsley helmzl/
+helmsley's helmzl/z
+helmsleys helmzl/z
+helmsman helmzman
+helmstetter helmstctP
+helmut helm@t
+helmuth helmUT
+helot hel@t
+helotism hel@tiz}
+helotry hel@tr/
+helots hel@ts
+help help
+helped helpt
+helper helpP
+helpers helpPz
+helpful helpf@l
+helpfully helpf@l/
+helping help6N
+helpings help6Nz
+helpless helpl@s
+helplessly helpl@sl/
+helplessness helpl@sn@s
+helprin helprin
+helps helps
+helsel hels@l
+helser helsP
+helseth helscT
+helsinki hels6Nk/
+helsley helsl/
+helstrom helstr}
+helt helt
+helter heltP
+helton helt~
+heltsley heltsl/
+heltzel heltz@l
+helvey helv/
+helvie helv/
+helwig helw6g
+helzer helzP
+hem hem
+heman hEm~
+hemani h}on/
+hemann hem~
+hemant hem~t
+hematite hem@tIt
+hematology hem@tol6j/
+hemberger hembPgP
+hembree hcmbrE
+hembrick hembrik
+hemby hemb/
+hemdale hemdAl
+hemdale's hemdAlz
+hemel hem@l
+hemenway hem~wA
+hemimorphite hem}{rfIt
+heming hem6N
+heminger hem6NP
+hemingway hem6NwA
+hemingway's hem6NwAz
+hemiplegia hem@plEj/@
+hemiplegia hem@plEjy@
+hemisphere hem@sfir
+hemispheric hem@sfir6k
+hemker hemkP
+hemler hemlP
+hemline hemlIn
+hemlines hemlInz
+hemlo heml]
+hemlock hemlok
+hemm hem
+hemme hem
+hemmed hemd
+hemmelgarn hemclgorn
+hemmen hem~
+hemmer hemP
+hemmerich hemP6k
+hemmerle hemPl/
+hemmerling hemPl6N
+hemmert hemPt
+hemmeter hem@tP
+hemming hem6N
+hemminger hem6NP
+hemminghaus hem6Nh?s
+hemmings hem6Nz
+hemmingsen hem6Ns~
+hemmingson hem6Ns~
+hemo hEm]
+hemocyanin hEm@sI~~
+hemodynamic hem]dInam6k
+hemodynamics hem]dInam6ks
+hemoglobin hEm@glOb~
+hemolytic hEm@lit6k
+hemond hem~d
+hemophilia hEm@fEl/@
+hemophiliac h/m@fil/ak
+hemophiliac h/m@filyak
+hemophiliac h/m]fil/ak
+hemophiliac h/m]filyak
+hemophiliacs hEm@fil/aks
+hemorrhage hemP6j
+hemorrhage hemr@j
+hemorrhaged hemP6jd
+hemorrhagic hemPag6k
+hemorrhaging hemP6j6N
+hemorrhoid hemP<d
+hemorrhoids hemP<dz
+hemotec hem]tek
+hemp hemp
+hempel hemp@l
+hempen hemp~
+hempfling hempf@l6N
+hemphill hemphil
+hempstead hempstcd
+hemric hemr6k
+hemrick hemr6k
+hemry hemr/
+hems hemz
+hemsley hemzl/
+hemstreet hemstrEt
+hemy hem/
+hen hen
+hen's henz
+henao hAn?
+henard henPd
+henault hen?lt
+henbane henbAn
+hence hens
+henceforth hensf{rT
+hench henC
+henchman henCm~
+henchmen henCm~
+henckel henk@l
+hendee hend/
+hendel hend@l
+hendershot hendPS@t
+hendershott hendPS@t
+henderson hendPs~
+hendler hendlP
+hendley hendl/
+hendon hend]n
+hendra hendr@
+hendren hendP~
+hendrich hendr6k
+hendrick hendr6k
+hendricks hendr6ks
+hendricksen hendr6ks~
+hendrickson hendr6ks~
+hendrie hendP/
+hendrik hendr6k
+hendriks hendr6ks
+hendriksen hendr6ks~
+hendrix hendr6ks
+hendrixson hendr6ks~
+hendron hendr~
+hendry hendr/
+hendry's hendr/z
+hendryx hendr6ks
+hendy hend/
+henegar hen6gP
+heneghan hcnegh~
+henehan hen@han
+henery henP/
+henes hEnz
+heney hen/
+heng heN
+hengel heNg@l
+hengst heNgst
+henhouse henh?s
+henie hen/
+henigan hen6g~
+henin henin
+heninger hen6NP
+henion heny~
+henk heNk
+henke heNk
+henkel heNk@l
+henkelman heNk@lm~
+henkels heNk@lz
+henken heNk~
+henkes heNks
+henkin heNkin
+henkle heNk@l
+henle hen@l
+henley henl/
+henley's henl/z
+henleys henl/z
+henline henlIn
+henly henl/
+henman henm~
+henn hen
+henna hen@
+hennan hen~
+henne hen
+henne hen/
+henneberger henbPgP
+henneberry henbcr/
+henneke hen6k
+hennelly hen@l/
+henneman henm~
+hennen hen~
+hennepin hen@pin
+henner henP
+hennes henz
+henness henis
+hennessee hen@s/
+hennessey hen@s/
+hennessey's hen@s/z
+hennessy hen@s/
+henney hen/
+hennick hen6k
+hennig hen6g
+hennigan hen6g~
+hennigar hen6gP
+henning hen6N
+henninger hen6NP
+hennings hen6Nz
+henningsen hen6Ns~
+hennington hen6Nt~
+hennis henis
+hennon hen~
+henpeck henpek
+henpecked henpekt
+henri henr/
+henri onrE
+henrich henr6k
+henrichs henr6ks
+henrichsen henr6ks~
+henrick henr6k
+henricks henr6ks
+henricksen henr6ks~
+henrickson henr6ks~
+henrie henP/
+henrietta henr/et@
+henriette henr/et
+henrik henr6k
+henrika henr6k@
+henriksen henr6ks~
+henrikson henr6ks~
+henrique onrEk
+henriques hcnrEkcz
+henriques onrEk
+henriquez hcnrEkcz
+henriquez onrEk
+henry henr/
+henry's henr/z
+hens henz
+hensarling hensorl6N
+hensch henS
+henschel henS@l
+henschen henS~
+hense hens
+hensel hens@l
+hensen hens~
+henshaw henS{
+henske hensk/
+henslee henzlE
+hensler hens@lP
+hensley henzl/
+henson hens~
+hentges hentj@z
+henthorn henTPn
+henthorne henTPn
+hentic hent6k
+hentoff hent{f
+henton hent~
+hentschel henC@l
+hentz hents
+henwood henwqd
+henze henz
+henzel henz@l
+henzler henzlP
+heon hE~
+hep hep
+heparin hepPin
+hepatic h@pat6k
+hepatitis hep@tIt@s
+hepburn hepbPn
+hepburn's hepbPnz
+hepfer hepfP
+hepker hepkP
+hepler heplP
+hepner hepnP
+hepp hep
+heppe hep
+hepper hepP
+heppler heplP
+heppner hepnP
+heptathlon hcptaTlon
+hepworth hepwPT
+her hP
+her hV
+her's hVz
+hera hir@
+herald h,r@ld
+herald's h,r@ldz
+heralded h,r@ld@d
+heraldic hcrald6k
+heralding h,r@ld6N
+heraldry h,r@ldr/
+heralds h,r@ldz
+herb Vb
+herb hVb
+herb's Vbz
+herb's hVbz
+herbaceous PbAS@s
+herbal Vb@l
+herbal hVb@l
+herbalife Vb@lIf
+herbalife hVb@lIf
+herbalist Vb@l@st
+herbalist hVb@l@st
+herbalist's Vb@l@sts
+herbalist's hVb@l@sts
+herbalists Vb@l@s
+herbalists Vb@l@ss
+herbalists Vb@l@sts
+herbalists hVb@l@s
+herbalists hVb@l@ss
+herbalists hVb@l@sts
+herbalists' Vb@l@sts
+herbalists' hVb@l@sts
+herbarium Pb,r/}
+herbarium hPb,r/}
+herbariums Pb,r/}z
+herbariums hPb,r/}z
+herbeck hVbck
+herbel hVb@l
+herber hVbP
+herberg hVbPg
+herberger hVbPgP
+herbers hVbPz
+herbert hVbPt
+herbert's hVbPts
+herbicide Vb@sId
+herbicide hVb@sId
+herbicides Vb@sIdz
+herbicides hVb@sIdz
+herbie hVb/
+herbig hVb6g
+herbin hVbin
+herbison hVbis~
+herbivore Vb6v{r
+herbivore hVb6v{r
+herbivorous PbivP@s
+herbivorous hPbivP@s
+herbold hVb]ld
+herbs Vbz
+herbst hVbst
+herbster hVbstP
+herceg hVs6g
+hercegovina hVrts@g]vEn@
+hercegovina herts@g]vEn@
+hercegovina's hVrts@g]vEn@z
+hercegovina's herts@g]vEn@z
+herculean hPkyUl/~
+hercules hVky@lEz
+herczeg hVC6g
+herd hVd
+herda h,rd@
+herdal h,rd@l
+herded hVd@d
+herder h,rdP
+herder hVdP
+herders hVdPz
+herding hVd6N
+herdman hVdm~
+herds hVdz
+herdsmen hVdzmcn
+herdt hVt
+here hir
+here's hirz
+hereabout hir@b?t
+hereabouts hir@b?ts
+hereafter h6raftP
+hereby h6rbI
+heredia hPed/@
+hereditary hPed@ter/
+heredity hPed@t/
+hereford h,r@fPd
+herein h6rin
+herendeen hirnd/n
+heresy h,r@s/
+heretic h,r@t6k
+heretical hPet6k@l
+heretofore hirt@f{r
+herewith hirwiT
+herford hVfPd
+herfurth hVfPT
+hergert hVgPt
+herget hVgct
+hergott hVg@t
+herin h,rin
+hering hV6N
+heringer h,r~jP
+herington h,r6Nt~
+heritable h,r@t@b@l
+heritage h,r@t@j
+heritage's h,r@t6j@z
+heritages h,r@t6j@z
+herk hVk
+herkert hVkPt
+herl hVl
+herlihy hVl@h/
+herling hVl6N
+herlong hVl{N
+herm hVm
+herman hVm~
+herman's hVm~z
+hermance hVm~s
+hermann hVm~
+hermanns hVmonz
+hermans hVm~z
+hermansen hVm~s~
+hermanson hVm~s~
+hermaphrodite hPmafr@dIt
+hermaphroditic hPmafr@dit6k
+hermes hVm/z
+hermetically hPmet6k@l/
+hermetically hPmet6kl/
+hermia hVm/@
+hermias hVm/@z
+hermida hcrmEd@
+hermie hVm/
+hermina hPmEn@
+hermina hVm~@
+hermine hVmin
+herminia hcrmEn/@
+herminie hVm~/
+hermit hVm@t
+hermitage hVm@t@j
+hermits hVm@ts
+hermon hVm~
+hermosa hcrmOs@
+hermosillo hPm@sil]
+herms hVmz
+hermsen hVms~
+hern hVn
+hernan hVn~
+hernandes hPnandcz
+hernandes hVn~dz
+hernandez hPnandcz
+hernando hPnond]
+herndon hVnd~
+herne hVn
+herner hVnP
+hernia hVn/@
+herniate hVn/At
+herniates hVn/Ats
+hernon hVn~
+hero hEr]
+hero hir]
+hero's hEr]z
+hero's hir]z
+herod h,r@d
+heroes hEr]z
+heroes hir]z
+heroic h6rO6k
+heroically hirO6kl/
+heroics h6rO6ks
+heroin h,r]~
+heroin's h,r]~z
+heroine h,r]~
+heroines h,rO~z
+heroism h,r]iz}
+heroize hEr]Iz
+heroized hEr]Izd
+herold h,r@ld
+heron h,r~
+heron's h,r~z
+herons h,r~z
+heros hir]z
+heroux hPU
+herpes hVp/z
+herr h,r
+herre h,r
+herre hur/
+herreid h,rId
+herrell h,r@l
+herren h,r~
+herrera hP,r@
+herrero hcr,r]
+herrhausen h,rh?z~
+herriage h,r/6j
+herrick h,r6k
+herridge h,r6j
+herrig h,r6g
+herriman h,r}~
+herrin h,rin
+herring h,r6N
+herrings h,r6Nz
+herringshaw h,r6NS{
+herrington h,r6Nt~
+herrington's h,r6Nt~z
+herriott h,r/@t
+herriott h,r/ot
+herrle h,r@l
+herrlinger h,rliNP
+herrlinger h,rliNgP
+herrman h,rm~
+herrmann h,rm~
+herro h,r]
+herrod h,r@d
+herrold h,rOld
+herron h,r~
+herronimo hPon}]
+herronimo's hPon}]z
+hers hPz
+hers hVz
+hersant hVs~t
+hersch hVS
+herschel hVS@l
+herschel's hVS@lz
+herschell hVS@l
+herschensohn hVS~s~
+herscu hPskU
+herself hPself
+hersey hVs/
+hersh hVS
+hershberger hVSbPgP
+hershey hVS/
+hershey's hVS/z
+hershiser hVSIzP
+hershkowitz hVSk@wits
+hershman hVSm~
+hershner hVSnP
+herskovitz hVsk@vits
+herskowitz hVsk@wits
+hersman hVsm~
+hersom hVs}
+herson hVs~
+herst hVst
+hert hVt
+herta hVt@
+hertel hVt@l
+hertenstein hVt~st/n
+hertenstein hVt~stIn
+herter hVtP
+hertha hVT@
+hertig hVt6g
+herting hVt6N
+hertlein hVtlIn
+hertog hVtog
+hertz h,rts
+hertz hVts
+hertzberg hVtsbPg
+hertzenleben hVt~lAb~
+hertzenleben's hVt~lAb~z
+hertzler hVtz@lP
+hertzog hVtz@g
+herve hVv
+herve hVvA
+hervey hPvA
+herwick hVwik
+herwig hVw6g
+herwitz hVwits
+heryana hPyan@
+herz hVz
+herzberg hVzbPg
+herzberger hVzbPgP
+herzegovina hVts@g]vEn@
+herzegovina herts@g]vEn@
+herzegovina's hVts@g]vEn@z
+herzegovina's herts@g]vEn@z
+herzer hVzP
+herzfeld hVzfcld
+herzig hVz6g
+herzing hVz6N
+herzlinger hVzliNP
+herzog hVzog
+hesch heS
+heseltine hes@ltEn
+heseltine hes@ltIn
+heselton hcselt~
+hesheng heSeN
+hesiod hEs/@d
+hesitancy hez@t~s/
+hesitant hez@t~t
+hesitantly hez@t~tl/
+hesitate hez@tAt
+hesitated hez@tAt@d
+hesitates hez@tAts
+hesitating hez@tAt6N
+hesitation hez@tAS~
+hesitations hez@tAS~z
+hesketh heskcT
+heskett heskct
+heslep heslip
+hesler hes@lP
+heslin heslin
+heslop hesl@p
+hesper hespP
+hespera hAsp,r@
+hess hes
+hesse hes
+hesse's hes@z
+hessel hes@l
+hesseltine hes@lt/n
+hesser hesP
+hessian heS~
+hessing hes6N
+hessinger hes~jP
+hession heS~
+hessite hesIt
+hessler heslP
+hessling hes@l6N
+hesson hes~
+hesston hest~
+hesston's hest~z
+hestand hest~d
+hester hestP
+hesther hesTP
+hestia hest/@
+heston hest~
+heterocercal hetP]sVk@l
+heterodox hetP@doks
+heterodoxy hetP@doks/
+heterodyne hetP@dIn
+heterogeneity hetP@j~A@t/
+heterogeneous hetP@jEny@s
+heterosexual hetP]sekS@w@l
+heterosexuality hetP]sckS@wal@t/
+heterosexuals hetP]sekS@w@lz
+heterosis hetPOs@s
+heterosporous hetPospP@s
+heterotrophic hetP@trof6k
+heterozygous hetP@zIg@s
+heth heT
+hetherington heTP6Nt~
+hetland hetl~d
+hetman hetm~
+hetrick hetr6k
+hett het
+hettel het@l
+hetti het/
+hettick het6k
+hettie het/
+hettler hetlP
+hettrick hetr6k
+hetty het/
+hetu hECU
+hetz hets
+hetzel hetz@l
+hetzer hetzP
+hetzler hetslP
+heuberger h<bPgP
+heublein hyUblIn
+heuer hyUP
+heuer's hyUPz
+heuerman h<Pm~
+heuermann h<Pm~
+heuman hyUm~
+heumann hyUm~
+heun hyUn
+heung-yeung hUNyUN
+heupel h<p@l
+heuring hV6N
+heusen hyUs~
+heuser h<sP
+heusser hyUsP
+hevener hev/nP
+heverly hevPl/
+hevey h6vA
+hevia hAv/@
+hew hyU
+heward hyUPd
+hewe hyU
+hewell hewcl
+hewell hyUwcl
+hewer hyUP
+hewes hyUz
+hewett hyUct
+hewey hyU/
+hewing hyU6N
+hewins hyUinz
+hewitt hyUit
+hewitt's hyUits
+hewler hyUlP
+hewler's hyUlPz
+hewlett hyUlct
+hewn hyUn
+hews hyUz
+hewson hyUs~
+hexachlorophene heks@kl{r@fEn
+hexagon heks@gon
+hexagonal hcksag~@l
+hexcel heks@l
+hext hekst
+hey hA
+heyboer hAb]P
+heyd hAd
+heyday hAdA
+heyde hAd
+heyden hAd~
+heydon hAd~
+heydt hAdt
+heye hI
+heyen hIn
+heyer hAP
+heying hA6N
+heyl hAl
+heyman hAm~
+heyman's hAm~z
+heymann hAm~
+heymann's hAm~z
+heyn hAn
+heyne hAn
+heys hAz
+heyse hAs
+heyser hAzP
+heyward hAwPd
+heywood hAwqd
+hezbollah hczbol@
+hezbollah hezb@l@
+hezbollah's hczbol@z
+hezbollah's hezb@l@z
+hezbullah hczbol@
+hezbullah hezb@l@
+hfdf ACefdEef
+hgh ACjEAC
+hi hI
+hi-fi hIfI
+hiaa ACIAA
+hiaasen hIos~
+hialeah hI@lE@
+hiam hI}
+hiatt hI@t
+hiatt's hI@ts
+hiatus hIAt@s
+hiawatha hI@woT@
+hibaaq hIbak
+hibachi h/boC/
+hibachi h@boC/
+hibbard hibPd
+hibben hib~
+hibberd hibPd
+hibbert hibPt
+hibbett hibit
+hibbitts hibits
+hibbler hiblP
+hibbs hibz
+hibdon hibd~
+hibernate hIbPnAt
+hibernation hIbPnAS~
+hibernia hIbVn/@
+hibernia's hIbVn/@z
+hibler h{b@lP
+hibma hibm@
+hibner hibnP
+hibor hIbP
+hibshman hibSm~
+hiccup hik@p
+hiccups hik@ps
+hice hIs
+hichens hik~z
+hick hik
+hickam hik}
+hickcox hikoks
+hickel hik@l
+hicken hik~
+hickerson hikPs~
+hickey hik/
+hickle hik@l
+hicklin hiklin
+hickling hikl6N
+hickman hikm~
+hickmon hikm~
+hickok hik@k
+hickories hikP/z
+hickory hikP/
+hickory hikr/
+hickox hikoks
+hicks hiks
+hickson hiks~
+hicksville hiksvil
+hid hid
+hidalgo h@dalgO
+hidden hid~
+hide hId
+hideaki hEdAok/
+hideaway hId@wA
+hidebound hIdb?nd
+hideo h@dA]
+hideous hid/@s
+hideously hid/@sl/
+hideout hId?t
+hideouts hId?ts
+hider hIdP
+hides hIdz
+hiding hId6N
+hidy hId/
+hieb hEb
+hieber hEbP
+hiebert hEbPt
+hiegel hEg@l
+hiems hEmz
+hiemstra hEmstr@
+hier hIP
+hierarchical hIr)rk@k@l
+hierarchies hIrork/z
+hierarchy hIPork/
+hierarchy hIrork/
+hierholzer hIrh]lzP
+hieroglyphic hIr]glif6k
+hieroglyphics hIr]glif6ks
+hiers hErz
+hiestand hEst~d
+hiester hI@stP
+hietala hIt@l@
+hietpas hItp@z
+hiett hIt
+higa hEg@
+higashi h/goS/
+higbee higbE
+higbie higb/
+higby higb/
+higdon higd~
+higgason hig@s~
+higgenbotham hig~b@T}
+higgens hig~z
+higgerson higPs~
+higginbotham h6g~boT}
+higginbottom h6g~bot}
+higgins higinz
+higginson hig~s~
+higgs higz
+high hI
+high-spirited hIspir@d@d
+high-spiritedness hIspir@d@dn@s
+higham hI}
+highberger hIbPgP
+highboy hIb<
+highbrow hIbr?
+highbrows hIbr?z
+higher hIP
+highest hI@st
+highfalutin hIf@lUt~
+highfield hIfEld
+highfill hIfil
+highflier hIflIP
+highfliers hIflIPz
+highflying hIflI6N
+highland hIl~d
+highlander hIlandP
+highlanders hIlandPz
+highlands hIl~dz
+highley hIl/
+highlight hIlIt
+highlighted hIlIt@d
+highlighting hIlIt6N
+highlights hIlIts
+highly hIl/
+highman hIm~
+highness hIn@s
+highosin hI]sin
+highrise hIrIz
+highrises hIrIz@z
+highs hIz
+highschool hIskUl
+highsmith hIsmiT
+highspeed hIspEd
+hight hIt
+hightech hItek
+hightower hIt?P
+hightower's hIt?Pz
+highway hIwA
+highway's hIwAz
+highways hIwAz
+highyield hIyEld
+higinbotham hig~b@T}
+higinbotham hig~b{T}
+higley higl/
+higman higm~
+hignight hignIt
+hignite hignIt
+higuchi h/gUC/
+higuera h/g,r@
+hijack hIjak
+hijacked hIjakt
+hijacker hIjakP
+hijackers hIjakPz
+hijacking hIjak6N
+hijackings hIjak6Nz
+hijinks hij6Nks
+hike hIk
+hiked hIkt
+hiker hIkP
+hikers hIkPz
+hikes hIks
+hiking hIk6N
+hiland hil~d
+hilaria h/l)r/@
+hilario h/l)r/]
+hilarious h@l,r/@s
+hilariously h@l,r/@sl/
+hilarity h@l,r@t/
+hilary hilP/
+hilb hilb
+hilberg hilbPg
+hilbert hilbPt
+hilborn hilbPn
+hilbun hilb~
+hilburn hilbPn
+hild hild
+hilda hild@
+hilde hild
+hildebran hild@br~
+hildebrand hild@brand
+hildebrandt hild@br~t
+hildebrant hild@br~t
+hildegard hild@gord
+hildegarde hild6gord
+hildegardes hild@gordz
+hildemar hild}P
+hilden hIld~
+hildenbrand hild~brand
+hildenbrand hild~br~d
+hilder hildP
+hilderbrand hildPbr~d
+hilderbrandt hildPbr~t
+hildie hIld/
+hilditch hild6C
+hildreth hildrcT
+hildum hild}
+hildy hild/
+hile hIl
+hileman hIlm~
+hilemon hIlm~
+hilemon's hIlm~z
+hiler hIlP
+hiles hIlz
+hiley hil/
+hilfiger hilf6gP
+hilfiger hilfIgP
+hilfiker hilf6kP
+hilgart hilgort
+hilgeman hilgm~
+hilgenberg hilg~bPg
+hilgendorf hilg~d{rf
+hilger hilgP
+hilgers hilgPz
+hilgert hilgPt
+hilinski h@linsk/
+hilke hilk@
+hilker hilkP
+hill hil
+hill's hilz
+hilla hil@
+hillard hilPd
+hillard's hilPdz
+hillary hilP/
+hillary's hilP/z
+hillas hil@s
+hillbillies hilbil/z
+hillbilly hilbil/
+hillcrest hilkrcst
+hille hil
+hilleary hilP/
+hillebrand hil@br~d
+hillegas hil6g@z
+hillegass hil6g@s
+hillel hilel
+hillen hil~
+hillenbrand hil~brand
+hillenbrand's hil~brandz
+hillenburg hil~bPg
+hiller hilP
+hillerman hilPm~
+hillery hilP/
+hillesheim hil@shIm
+hillestad hil@st@d
+hilley hil/
+hillhaven hilhAv~
+hillhaven's hilhAv~z
+hillhouse hilh?s
+hilliard hilyord
+hillier hil/P
+hilligoss hil6gos
+hilliker hil6kP
+hilliker hilIkP
+hillin hilin
+hilling hil6N
+hillis hil@s
+hillman hilman
+hillmann hilm~
+hillmer hilmP
+hillock hil@k
+hills hilz
+hills' hilz
+hillsboro hilzbP]
+hillsborough hilzbP]
+hillsdale hilzdAl
+hillsdown hilzd?n
+hillside hilsId
+hillsides hilsIdz
+hillsman hilsm~
+hillson hils~
+hillstrom hilstr}
+hilltop hiltop
+hilltops hiltops
+hilly hil/
+hillyard hilyord
+hillyer hil/P
+hilma hilm@
+hilmer hilmP
+hilmes hilmz
+hilo hEl]
+hilpert hilpPt
+hilsabeck hils@bek
+hilscher hilSP
+hilsinger hils@NP
+hilsman hilzm~
+hilson hils~
+hilt hilt
+hiltner hiltnP
+hilton hilt~
+hilton's hilt~z
+hilts hilts
+hiltunen hilt~~
+hilty hilt/
+hiltz hilts
+hilyard h@ly)rd
+hilyer hil/P
+him him
+him im
+himalaya him@lI@
+himalayan him@lA~
+himalayas him@lI@s
+hime hIm
+himebaugh him@b{
+himel him@l
+himes hImz
+himmel him@l
+himmelberger him@lbPgP
+himmelfarb him@lforb
+himmelsbach him@lsbok
+himmelstein him@lst/n
+himmelstein him@lstIn
+himmler himlP
+himont hIm~t
+himont him~t
+himself himself
+hinch hinC
+hinchcliff hinCklif
+hinchcliffe hinCklif
+hinchey hinC/
+hinchliffe hinklif
+hinchman hiNkm~
+hinck hiNk
+hinckley hiNkl/
+hind hInd
+hinde hind
+hindelong hind@l{N
+hinder hindP
+hindered hindPd
+hinderer hindPP
+hindering hindP6N
+hinderliter hindPl/tP
+hinderman hIndPm~
+hinders hindPz
+hindes hindz
+hindi hind/
+hindle hind@l
+hindley hindl/
+hindman hIndm~
+hindquarter hIndk{rtP
+hindquarter hIndw{rtP
+hindquarters hIndk{rtPz
+hindquarters hIndw{rtPz
+hindrance hindr~s
+hindrances hindr~s@z
+hinds hIndz
+hindsight hIndsIt
+hindsight hInsIt
+hindsight's hIndsIts
+hindsight's hInsIts
+hindu hindU
+hinduism hinjUiz}
+hindus hindUz
+hindustan hindUstan
+hine hIn
+hinebaugh hin@b{
+hineline hin@lIn
+hinely hInl/
+hineman hInm~
+hiner hInP
+hinerman hInPm~
+hines hInz
+hinesley hInsl/
+hinesley hin@sl/
+hiney hin/
+hing hiN
+hinge hinj
+hinged hinjd
+hinger hinjP
+hinges hinj@z
+hingham hiN}
+hingle hiNg@l
+hingst hiNst
+hingston hiNst~
+hink hiNk
+hinkel hiNk@l
+hinkelman hiNk@lm~
+hinkle hiNk@l
+hinkley hiNkl/
+hinkson hiNks~
+hinman hinm~
+hinmen hinmcn
+hinn hin
+hinnant hin~t
+hinnenkamp hin~kamp
+hinners hinPz
+hinny hin/
+hino hEn]
+hinojos h/nOy]z
+hinojosa h/n]jOs@
+hinote hinOt
+hinrichs hinr6ks
+hinrichsen hinr6ks~
+hinsch hinS
+hinsdale hinsdAl
+hinshaw hinS{
+hinsley hinsl/
+hinson hins~
+hint hint
+hinted hint@d
+hinterland hintPland
+hinterlands hintPlandz
+hinting hint6N
+hinton hint~
+hints hints
+hintz hints
+hintze hintz
+hinz hinz
+hinzack hinzak
+hinze hinz
+hinzman hinzm~
+hiott hI@t
+hip hip
+hip-pocket hippok@t
+hipbone hipbOn
+hipbones hipbOnz
+hipkins hipkinz
+hipolito Ep]lEt]
+hipp hip
+hippe hip
+hippen hip~
+hippensteel hip~st/l
+hipper hipP
+hippert hipPt
+hippest hip@st
+hippie hip/
+hippies hip/z
+hipple hip@l
+hippler hiplP
+hippo hip]
+hippocrates h@p{kr@t/z
+hippocrates hip@krAts
+hippocratic hip@krat6k
+hippodrome hip@drOm
+hippolytus h@pol@t@s
+hippopotamus hip@pot}@s
+hippopotamuses hip@pot}@s@z
+hippos hip]z
+hipps hips
+hips hips
+hipsher hipSP
+hipskind hipskind
+hipwell hipwel
+hirabayashi h6r@bIoS/
+hiradin h6rodin
+hirai h6ro/
+hiram hIr}
+hirano h6ron]
+hirata h6rot@
+hirayama h6royom@
+hird hVd
+hire hIP
+hire hIr
+hired hIPd
+hires hIPz
+hires hIrz
+hiriart hir/ort
+hiring hIr6N
+hirings hIr6Nz
+hirn hVn
+hiro hir]
+hiroaki hir]ok/
+hirohito hir@hEtO
+hirohito hir]hEtO
+hirohito's hir@hEtOz
+hirohito's hir]hEtOz
+hiromasa hir]mos@
+hirons h{r~z
+hirosakamoki hir@sak}Ok/
+hirosakima hir@s@kEm@
+hirose h6rOsA
+hiroshi h6rOS/
+hiroshima hirOS}@
+hiroshima hir]SEm@
+hirota h6rOt@
+hiroyuki hir]yUk/
+hirsch hVS
+hirsch's hVS@z
+hirschberg hVSbPg
+hirschfeld hVSfcld
+hirschfield hVskf/ld
+hirschhorn hVShPn
+hirschi hirsk/
+hirschman hVSm~
+hirschmann hVSm~
+hirschy hVS/
+hirsh hVS
+hirshberg hVSbPg
+hirshfield hVSf/ld
+hirshhorn hVSh{rn
+hirshhorn hVS{rn
+hirshman hVSm~
+hirst hVst
+hirt hVt
+hirth hVT
+hirtle hVt@l
+hirtz hVts
+hirulog hirUlog
+hirzel hVz@l
+his h@z
+his hiz
+hisada hisod@
+hisao hiso]
+hisaw hIs{
+hiscock hisk@k
+hiscox hiskoks
+hise hIz
+hisel his@l
+hiser hIzP
+hisey his/
+hisham hiS}
+hisle hI@l
+hislop hisl@p
+hispanic h@span6k
+hispanics h@span6ks
+hispano h@spon]
+hispanoil hisp~<l
+hiss his
+hiss's his@z
+hissed hist
+hisself hiself
+hisses his@z
+hissing his6N
+hissong his{N
+histadrut hist@dr@t
+histamine hist}En
+histidine hist@dEn
+histogram hist@gram
+histograms hist@gramz
+histology histol@j/
+historian hist{r/~
+historians hist{r/~z
+historic hist{r6k
+historical hist{r6k@l
+historically hist{r6k@l/
+historically hist{r6kl/
+histories histP/z
+histories histr/z
+historiography hist{r/ogr@f/
+history histP/
+history histr/
+history's histP/z
+history's histr/z
+histrionic histr/on6k
+histrionics histr/on6ks
+hit hit
+hitachi h@toC/
+hitch hiC
+hitchcock hiCkok
+hitchcock's hiCkoks
+hitched hiCt
+hitchens hiC~z
+hitches hiC@z
+hitchhike hiChIk
+hitchhiking hiChIk6N
+hitching hiC6N
+hitchings hiC6Nz
+hitchins hiCinz
+hitchman hiCm~
+hitchner hiCnP
+hite hIt
+hites hIts
+hither hiTP
+hitherto hiTVtU
+hitler hitlP
+hitler's hitlPz
+hitman hitman
+hitoshi h@tOS/
+hits hits
+hitschler hiClP
+hitschler hitslP
+hitsman hitsm~
+hitson hits~
+hitt hit
+hitter hitP
+hitters hitPz
+hitting hit6N
+hittite hitIt
+hittite hitIt
+hittle hit@l
+hittner hitnP
+hitty hit/
+hitz hits
+hitzeman hitsm~
+hive hIv
+hively hIvl/
+hives hIvz
+hiway hIwA
+hix hiks
+hixenbaugh h6gzenb{
+hixon hiks~
+hixson hiks~
+hizbollah hizbOl@
+hizer hIzP
+hjelm h@jelm
+hjelm jelm
+hjerpe h@jVp
+hjerpe jVp
+hjort h@j{rt
+hjort j{rt
+hlad h@lad
+hlad hlad
+hladik h@lad6k
+hladik hlad6k
+hladky h@ladk/
+hladky hladk/
+hlavac h@lov@k
+hlavac hlov@k
+hlavacek h@lov@Cck
+hlavacek hlov@Cck
+hlavaty h@l@vot/
+hlavaty hl@vot/
+hmmm hm
+hmmm hum
+hmong hm{N
+hmong h}{N
+hmong m{N
+hnat ACenAtE
+hnat ACnat
+hnat hnat
+hnat h~at
+ho hO
+ho's hOz
+hoadley hOdl/
+hoag hOg
+hoagie hOg/
+hoagland hOgl~d
+hoaglin hOglin
+hoaglund hOgl~d
+hoagy hOg/
+hoak hOk
+hoang hON
+hoar h{r
+hoard h{rd
+hoarded h{rd@d
+hoarding h{rd6N
+hoards h{rdz
+hoare h{r
+hoarse h{rs
+hoarseness h{rsn@s
+hoary h{r/
+hoax hOks
+hoaxes hOks@z
+hob hob
+hoback hObak
+hoban hOb~
+hobart hObort
+hobaugh hob{
+hobbes hob/z
+hobbes hobz
+hobbie hob/
+hobbies hob/z
+hobbing hob6N
+hobbins hobinz
+hobble hob@l
+hobbled hob@ld
+hobbles hob@lz
+hobbling hob@l6N
+hobbling hobl6N
+hobbs hobz
+hobby hob/
+hobbyist hob/@st
+hobbyists hob/@s
+hobbyists hob/@ss
+hobbyists hob/@sts
+hobday hobdA
+hobdy hobd/
+hoben hob~
+hoberg hObPg
+hoberman hObPm~
+hobert hobPt
+hobgood hobgqd
+hobin hObin
+hoblit hoblit
+hobnail hobnAl
+hobnob hobnob
+hobnobbing hobnob6N
+hobo hOb]
+hoboes hOb]z
+hoboken hOb]k~
+hobs hobz
+hobsbawm hobsb{m
+hobson hobs~
+hobson's hobs~z
+hoc hok
+hocevar h]sAv)r
+hoch hok
+hochberg hokbPg
+hochbrueckner hokbruknP
+hochhalter hokh@ltP
+hochhauser hokh?zP
+hochman hokm~
+hochmuth hokmUT
+hochstatter hokst@tP
+hochstedler hokst@d@lP
+hochstein hokst/n
+hochstein hokstIn
+hochstetler hokstct@lP
+hochstetler hokstctlP
+hochtief hoktEf
+hock hok
+hockaday hok@dA
+hockberg hokbPg
+hockenberry hok~ber/
+hockenbury hok~ber/
+hockensmith hok~smiT
+hocker hokP
+hockersmith hokPsmiT
+hockett hok@t
+hockey hok/
+hockey's hok/z
+hockin hokin
+hocking hok6N
+hockley hokl/
+hockman hokm~
+hockney hokn/
+hockney's hokn/z
+hoctor hoktP
+hocus hOk@s
+hocutt hok@t
+hodak hOd@k
+hodapp hod@p
+hodde hod
+hodder hodP
+hodding hod6N
+hoddur hodP
+hodel hOd@l
+hodes hOdz
+hodgdon hojd~
+hodge hoj
+hodge's hoj@z
+hodgen hoj~
+hodgens hoj~z
+hodgepodge hojpoj
+hodges hoj@z
+hodgin hojin
+hodgins hojinz
+hodgkin hojkin
+hodgkin's hojkinz
+hodgkins hojkinz
+hodgkinson hojk~s~
+hodgkiss hojkis
+hodgman hojm~
+hodgman's hojm~z
+hodgson hojs~
+hodkinson hodk~s~
+hodnett hodnct
+hodo hOd]
+hodsdon hodzd~
+hodson hods~
+hoe hO
+hoechst hOSt
+hoechst hOkst
+hoechst's hOSts
+hoechst's hOksts
+hoeck hOk
+hoecker hOkP
+hoedown hOd?n
+hoefer hOfP
+hoeffner hOfnP
+hoefle hOf@l
+hoefler hOf@lP
+hoeflich hOfl6k
+hoefling hOf@l6N
+hoefs hOfs
+hoeft hOft
+hoeg hOg
+hoeger hOgP
+hoehn hOn
+hoehne hOn
+hoeing hO6N
+hoek hOk
+hoeksema hOkscm@
+hoekstra hOkstr@
+hoel hOl
+hoell hOl
+hoelle hOl
+hoelscher hOlSP
+hoelterhoff hOltPh{f
+hoelterhoff's hOltPh{fs
+hoelting hOlt6N
+hoelzel hOlz@l
+hoelzer hOlzP
+hoen hOn
+hoene ho/n
+hoener hOnP
+hoenig hOn6g
+hoeper hOpP
+hoepfner hOpfnP
+hoepfner hOpnP
+hoepner hOpnP
+hoeppner hOpnP
+hoerig h{r6g
+hoerner h{rnP
+hoerr h{r
+hoes hOz
+hoesch hOS
+hoeschen hOS~
+hoesly hOsl/
+hoeveler hOvlP
+hoevet hOvet
+hoevet's hOvets
+hoey hO/
+hof hof
+hofacker hof@kP
+hofbauer hofb?P
+hofer hOfP
+hoff h{f
+hoffa h{f@
+hoffa's h{f@z
+hoffacker h{f@kP
+hoffart h{fort
+hoffarth h{forT
+hoffecker h{f6kP
+hoffenberg h{f~bPg
+hoffenberg's hof~bPgz
+hoffer hofP
+hofferber h{fPbP
+hoffert h{fPt
+hoffitz hof@ts
+hoffler h{f@lP
+hoffman h{fm~
+hoffman's h{fm~z
+hoffmann h{fm~
+hoffmaster h{fmastP
+hoffmeier h{fmIP
+hoffmeister h{fmIstP
+hoffmeyer h{fmIP
+hoffner h{fnP
+hoffpauir h{fp?P
+hofi hOf/
+hofland hofl~d
+hofler hoflP
+hofman hofm~
+hofmann hofm~
+hofmeister hofmIstP
+hofrichter hofr6ktP
+hofstad hofstad
+hofstetter hofstctP
+hofstra hofstr@
+hog hog
+hogan hOgon
+hogan hOg~
+hogan's hOgonz
+hogans hOgonz
+hogans hOg~z
+hoganson hog~s~
+hogarth hOgorT
+hogarty hogort/
+hogberg hogbPg
+hoge hOj
+hogeland hog@l~d
+hogen hog~
+hogenson hoj~s~
+hoger hOgP
+hogg hog
+hoggan hog~
+hoggard hogPd
+hoggart hogPt
+hoggatt hog@t
+hogge hog
+hogging h{g6N
+hogland hogl~d
+hogle hOg@l
+hoglund h{gl~d
+hoglund's h{gl~dz
+hoglunds h{gl~dz
+hognose hognOz
+hogrefe hogrcf
+hogs hogz
+hogsed hOgst
+hogsett hogsct
+hogston hogst~
+hogue hOg
+hogwash hogwoS
+hogwood h{gwqd
+hoh hO
+hoheisel hOIs@l
+hohenberger hO~bPgP
+hohensee hoh~sE
+hohenstein hO~st/n
+hohenstein hO~stIn
+hohl hOl
+hohler hOlP
+hohlt hOlt
+hohman hOm~
+hohmann hOm~
+hohn hon
+hohner hOnP
+hohnstein hOnst/n
+hohnstein hOnstIn
+hohorst hOh{rst
+hoi h<
+hoiland h<land
+hoilman h<lm~
+hoisington h<z6Nt~
+hoist h<st
+hoisted h<st@d
+hoisting h<st6N
+hoists h<s
+hoists h<ss
+hoists h<sts
+hoit h<t
+hoity h<t/
+hoium ho/}
+hojnacki h@ynotsk/
+hokanson hok~s~
+hoke hOk
+hokenson hok~s~
+hokey hOk/
+hokkaido h]kId]
+hokum hOk}
+hokuriku hokPEkU
+holaday hOl@dA
+holahan hol@han
+holan hOl~
+holaway hOl@wA
+holbein hOlbIn
+holben hOlb~
+holberg hOlbPg
+holbert hOlbPt
+holbrook hOlbrqk
+holbrooke hOlbrqk
+holbrooke's hOlbrqks
+holbrooks hOlbrqks
+holck hOlk
+holcomb hOlk}
+holcombe hOlk}
+hold hOld
+holda hOld@
+holdaway hOld@wA
+holde hOld
+holdeman hOldm~
+holden hOld~
+holden's hOld~z
+holder hOldP
+holder's hOldPz
+holderbank hOldPbaNk
+holderbaum hOldPb?m
+holderby hOldPb/
+holderfield hOldPfEld
+holderman hOldPm~
+holderness hOldPn@s
+holders hOldPz
+holders' hOldPz
+holdfast hOlfast
+holding hOld6N
+holding's hOld6Nz
+holdings hOld6Nz
+holdings' hOld6Nz
+holdman hOldm~
+holdorf hOld{rf
+holdout hOld?t
+holdouts hOld?ts
+holdover hOldOvP
+holdovers hOldOvPz
+holdren hOldP~
+holdridge hOldr6j
+holds hOldz
+holdsworth hOldzwVT
+holdup hOldup
+holdups hOldups
+hole hOl
+holecek hol6Cck
+holed hOld
+holeman hOlm~
+holen hOl~
+holes hOlz
+holewinski h@lUinsk/
+holford hOlfPd
+holgate hOlgAt
+holgerson hOlgPs~
+holguin hOlgin
+holian hOl/~
+holick hol6k
+holiday hol@dA
+holiday's hol@dAz
+holidays hol@dAz
+holidaysburg hol@dAzbPg
+holien hOl/~
+holier hOl/P
+holiest hOl/@st
+holifield hol@fEld
+holihan hol@han
+holik hOl6k
+holiman hol}~
+holiness hOl/n@s
+holing hOl6N
+holistic h]list6k
+holl hol
+hollabaugh hol@b{
+holladay hol@dA
+hollan hol~
+holland hol~d
+holland's hol~dz
+hollander hol~dP
+hollanders hol~dPz
+hollands hol~dz
+hollandsworth hol~dzwVT
+hollar holP
+hollars holPz
+hollatz hol@ts
+hollaway hol@wA
+holle hol
+holleman hOlm~
+hollen hol~
+hollenbach hol~bok
+hollenback hol~bak
+hollenbaugh h@lenb{
+hollenbeck hol~bek
+hollenberg hol~bPg
+hollender holcndP
+hollenkamp hol~kamp
+holler holP
+holleran holP~
+hollerbach holPbok
+hollered holPd
+hollering holP6N
+hollern holPn
+hollers holPz
+hollett holct
+holley hol/
+hollibaugh hol/b{
+hollick hol6k
+holliday hol@dA
+holliday's hol@dAz
+hollie hol/
+hollier h{l/P
+hollies hol/z
+hollifield hol@fEld
+holliman hol}~
+holliman's hol}~z
+hollimon hol}~
+hollin holin
+holling hol6N
+hollinger hol6NP
+hollings hol6Ngz
+hollings hol6Nz
+hollingshead hol6Nzhed
+hollingsworth hol6NzwVT
+hollingworth hol6NgwVT
+hollins holinz
+hollinshead hol~shed
+hollinshead hol~zhed
+hollinsworth hol~swVT
+hollinsworth hol~zwVT
+hollis holis
+hollister hol@stP
+holliston hol@st~
+hollman holm~
+hollmann holm~
+hollo holO
+hollobaugh hol@b{
+hollom h{l}
+holloman hol]m~
+hollomon hol}on
+hollon hol~
+hollopeter hol@p/tP
+holloran holP~
+hollow hol]
+hollow's hol]z
+holloway hol]wA
+hollowed hol]d
+hollowell hol@wcl
+hollowing hol]6N
+hollows hol]z
+hollstein holst/n
+hollstein holstIn
+holly hol/
+holly's hol/z
+hollyfield hol/fEld
+hollyfield hol@fEld
+hollyhead h{l/hed
+hollyhock hol/hok
+hollyhocks hol/hoks
+hollywood hol/wqd
+hollywood's hol/wqdz
+holm hOm
+holman holm~
+holmberg hOlmbPg
+holmdale hOlmdAl
+holme hOlm
+holmen holmcn
+holmer hOlmP
+holmes hOlmz
+holmes hOmz
+holmes's hOlmz@z
+holmes's hOmz@z
+holmgren hOlmgrcn
+holmium hOlm/}
+holmlund hOlml~d
+holmquest hOlmkwest
+holmquist hOlmkwist
+holmstrom hOlmstr}
+holness holn@s
+holocaust hol@k{st
+hologram hol@gram
+holograms hol@gramz
+holographic hol@graf6k
+holohan hol@han
+holquin hOlkwin
+holroyd hOlr<d
+holsapple hOls@p@l
+holscher hOlSP
+holsclaw hOlskl{
+holsey hOls/
+holshouser hOlsh?sP
+holsinger hOls@NP
+holsomback hOls}bak
+holsonback hOls~bak
+holsopple hOls@p@l
+holst hOlst
+holstad hOlst@d
+holste hOlst
+holstead hOlsted
+holstein hOlstEn
+holsten hOls~
+holster hOlstP
+holstine hOlstIn
+holston hOlst~
+holstrom hOlstr}
+holsworth hOlswPT
+holt hOlt
+holt's hOlts
+holtan hOlt~
+holte hOlt
+holten hOlt~
+holter hOltP
+holterman hOltPm~
+holthaus hOlth?s
+holthus hOlT@s
+holtkamp hOltkamp
+holtman hOltm~
+holtmann hOltm~
+holton hOlt~
+holtorf hOltPf
+holtrop hOltr@p
+holtry hOltr/
+holts hOlts
+holtsclaw hOltskl{
+holtz hOlts
+holtz's hOlts@z
+holtzapple hOltz@p@l
+holtzclaw hOltskl{
+holtzer hOltzP
+holtzinger hOltz6NP
+holtzman hOltsm~
+holub hOl@b
+holum hOl}
+holven h{lvcn
+holverson holvPs~
+holvis hOlv@s
+holvis' hOlv@s
+holvis's hOlv@s@z
+holway holwA
+holweger hOlw6gP
+holwerda h]lwVd@
+holy hOl/
+holycross hOl/kr{s
+holyfield hOl/fEld
+holyoak hOl/Ok
+holyoke hOl/Ok
+holz hOlz
+holzapfel hOlz@pf@l
+holzer hOlzP
+holzhauer hOlzh?P
+holzhauser hOlzh?zP
+holzheimer hOlzhImP
+holzinger hOlz6NP
+holzman hOlzm~
+holzmann hOlzm~
+holzschuh hOlSU
+holzstoff hOlst{f
+holzwarth hOlzwPT
+holzworth hOlzwPT
+hom hom
+homa hOm@
+homac hOmak
+homage hom@j
+homage om@j
+homan hOm~
+homann hOm~
+homans hOm~z
+homart hOmort
+hombre hombr@
+homburg hombPg
+home hOm
+home's hOmz
+home-made hOmmAd
+home-school hOmskUl
+homebound hOmb?nd
+homeboys hOmb<z
+homebuilder hOmbildP
+homebuilder's hOmbildPz
+homebuilders hOmbildPz
+homebuilding hOmbild6N
+homebuyer hOmbIP
+homebuyers hOmbIPz
+homecare hOmker
+homeclub hOmklub
+homecoming hOmkum6N
+homed hOmd
+homedco hOmedkO
+homefed hOmfed
+homefed's hOmfedz
+homefront hOmfr~t
+homegrown hOmgrOn
+homeland hOmland
+homeland's hOmlandz
+homelands hOmlandz
+homeless hOml@s
+homelessness hOml@sn@s
+homelike hOmlIk
+homely hOml/
+homemade hOmAd
+homemade hOmmAd
+homemaker hOmmAkP
+homemakers hOmmAkPz
+homemaking hOmmAk6N
+homen hOm~
+homeopathic hOm/]paT@k
+homeopathy hOm/]paT/
+homeostasis hOm/]stAs@s
+homeostatic hOm/]stat6k
+homeowner hOmOnP
+homeowner's hOmOnPz
+homeowners hOmOnPz
+homeowners' hOmOnPz
+homeownership hOmOnPSip
+homeporting hOmp{rt6N
+homer hOmP
+homer's hOmPz
+homeric h]m,r6k
+homers hOmPz
+homerun h]mrun
+homes hOmz
+homes' hOmz
+homesick hOmsik
+homesickness hOmsikn@s
+homesley hOmzl/
+homespun hOmspun
+homestake hOmstAk
+homestake's hOmstAks
+homestate hOmstAt
+homestead hOmsted
+homestead's hOmstedz
+homesteaded hOmsted@d
+homesteader hOmstcdP
+homesteaders hOmstcdPz
+homestretch hOmstreC
+hometown hOmt?n
+homeward hOmwPd
+homewood hOmwqd
+homework hOmwVk
+homeworker hOmwVkP
+homeworkers hOmwVkPz
+homey hOm/
+homeyer hOm/P
+homicidal hom@sId@l
+homicide hom@sId
+homicides hom@sIdz
+homiletic hom@let6k
+homilies hOm@l/z
+homily hom@l/
+hominem hom~cm
+homing hOm6N
+hominid hom~@d
+hominy hom~/
+homme hom
+hommel hom@l
+hommes homz
+homo hOm]
+homo-erectus hOm]6rekt@s
+homogeneity hom@j~E@t/
+homogeneous hOm@jEn/@s
+homogenization h]moj~@zAS~
+homogenize h]moj~Iz
+homogenized h]moj~Izd
+homogenous h}oj~@s
+homogeny h]moj~/
+homola h}ol@
+homolka h}olk@
+homologous h}ol@g@s
+homophobia hOm@fOb/@
+homophobic hOm@fOb6k
+homosexual hOm]sekS@w@l
+homosexuality hOm]sekS@wal@t/
+homosexuals hOm]sekS@w@lz
+homosporous h}ospP@s
+homozygote hOm]zIg]t
+homozygous hOm]zIg@s
+homrich homr6k
+homs homz
+homsey homz/
+homuth homUT
+hon hon
+hon hun
+hon unP@b@l
+honaker hon@kP
+honan hOn~
+honasan hon@z~
+honcho h{nC]
+honda h{nd@
+honda's hond@z
+hondas hond@s
+honderich hondP6k
+hondo hond]
+honduran hondqr~
+hondurans hondqr~z
+honduras hondqr@s
+hone hOn
+honea hon/@
+honeck hOnck
+honecker hOnckP
+honecker's hOnckPz
+honed hOnd
+honer hOnP
+honest on@st
+honestly on@sl/
+honestly on@stl/
+honestok hOn@st{k
+honesty on@st/
+honey hun/
+honeybee hun/bE
+honeybees hun/bEz
+honeycomb hun/kOm
+honeycutt hun/k@t
+honeydew hun/dU
+honeyman hon/m~
+honeymoon hun/mUn
+honeymooned hun/mUnd
+honeymooner hun/mUnP
+honeymooners hun/mUnPz
+honeymoons hun/mUnz
+honeys hun/z
+honeysuckle hun/suk@l
+honeysuckles hun/suk@lz
+honeywell hun/wel
+honeywell's hun/welz
+hong h{N
+hong-kong h{Nk{N
+hongkong h{Nk{N
+hongwei h{NwA
+honig hon6g
+honing hOn6N
+honk hoNk
+honking h{Nk6N
+honky h{Nk/
+honn hon
+honnold honOld
+honold hon]ld
+honolulu hon@lUlU
+honolulu's hon@lUlUz
+honor onP
+honor's onPz
+honora {n{r@
+honorable onP@b@l
+honorably onP@bl/
+honoraria onP,r/@
+honorarium onP,r/}
+honorariums onP,r/}z
+honorary onPer/
+honore onP
+honored onPd
+honoree onPE
+honorees onPEz
+honoria onV/@
+honorific onPif6k
+honoring onP6N
+honors onPz
+hons honz
+honsberger honsbPgP
+honse hons
+honshu honSU
+honsinger hons6NP
+hontz honts
+hoo hU
+hoobler hUblP
+hooch hUC
+hoochie hUC/
+hoock hUk
+hood hqd
+hooded hqd@d
+hoodlum hqdl}
+hoodlums hUdl}z
+hoods hqdz
+hoodwink hqdwiNk
+hoodwinked hqdwiNkt
+hooey hU/
+hoof hUf
+hoofed hUft
+hoofed hqft
+hoofs hUfs
+hoofs hqfs
+hoog hUg
+hooge hUj
+hoogland hUgl~d
+hoogovens hUg@v~z
+hook hqk
+hook's hqks
+hooke hqk
+hooked hqkt
+hooker hqkP
+hooker's hqkPz
+hookers hqkPz
+hooking hqk6N
+hooks hqks
+hookup hqkup
+hookups hqkups
+hookworm hqkwPm
+hooky hqk/
+hoole hUl
+hooley hUl/
+hooligan hUl6g~
+hooliganism hUl6g~iz}
+hooligans hUl6g~z
+hoolihan hUl@han
+hoon hUn
+hoop hUp
+hooper hUpP
+hooperman hUpPm~
+hoopes hUps
+hoopingarner hUpiNgornP
+hoopla hUplo
+hoopoe hUpU
+hoops hUps
+hooray hqrA
+hoos hUz
+hoose hUs
+hooser hUzP
+hoosier hUZP
+hoosiers hUzyPz
+hoot hUt
+hooted hUt@d
+hooten hUt~
+hooter hUtP
+hooters hUtPz
+hootie hUt/
+hootman hUtm~
+hooton hUt~
+hoots hUts
+hooven hUv~
+hoover hUvP
+hoover's hUvPz
+hooves hUvz
+hooves hqvz
+hoovler hUvlP
+hop hop
+hopalong hop@l{N
+hopburg hopbPg
+hopburg's hopbPgz
+hope hOp
+hope's hOps
+hoped hOpt
+hopeful hOpf@l
+hopefully hOpf@l/
+hopefulness hOpf@ln@s
+hopefuls hOpf@lz
+hopeless hOpl@s
+hopelessly hOpl@sl/
+hopelessness hOpl@sn@s
+hopes hOps
+hopewell hOpwel
+hopf hopf
+hopfensperger hopf~spPgP
+hopfer hopfP
+hopfinger hopf6NP
+hopgood hopgqd
+hopi hOp/
+hoping hOp6N
+hopke hOpk
+hopkin hopkin
+hopkin's hopkinz
+hopkins hopkinz
+hopkins' hopkinz
+hopkinson hopk~s~
+hopkinton hopk~t~
+hopkyns hopkinz
+hopman hopm~
+hopp hop
+hoppa hop@
+hoppe hop
+hopped hopt
+hoppel hop@l
+hopper hopP
+hopper's hopPz
+hoppers hopPz
+hoppert hopPt
+hoppes hops
+hopping hop6N
+hopple hop@l
+hopps hops
+hoppy h{p/
+hops hops
+hopscotch hopskoC
+hopscotched hopskoCt
+hopson hops~
+hopton hopt~
+hopwood hopwqd
+hora h{r@
+horace h{r@s
+horace's h{r@s@z
+horacek h{r@Cck
+horacia h{ros/@
+horacio h{rAs/]
+horak h{r@k
+horan h{r~
+horatia h{roS@
+horatian hPAS~
+horatio hPAS]
+horatio's h{rAS/]z
+horatius h{rAS@s
+horch h{rk
+horchow h{rC]
+hord h{rd
+horde h{rd
+hordes h{rdz
+horehound h)rh?nd
+horejsi h{rAys/
+horelick h{r@l6k
+horen h{r~
+horenstein h{r~st/n
+horenstein h{r~stIn
+horgan h{rg~
+horger h{rgP
+hori h{r/
+horiguchi h{r6gUC/
+horine h{r/n
+horiuchi h{r/UC/
+horizon hPIz~
+horizon's hPIz~z
+horizons hPIz~z
+horizontal h{r@zont@l
+horizontally h{r@zont@l/
+horkey h{rk/
+horky h{rk/
+horlacher h{rl@kP
+horlick h{rl6k
+horman h{rm~
+hormann h{rm~
+hormats h{rmats
+hormel h{rmel
+hormonal h{rmOn@l
+hormone h{rmOn
+hormones h{rmOnz
+hormuz h{rmUz
+horn h{rn
+horn's h{rnz
+hornack h{rn@k
+hornaday h{rn@dA
+hornak h{rn@k
+hornback h{rnbak
+hornbaker h{rnb@kP
+hornbeak h{rnb@k
+hornbeck h{rnbek
+hornberger h{rnbPgP
+hornbill h{rnbil
+hornbills h{rnbilz
+hornblende h{rnblend
+hornblower h{rnblOP
+hornbook h{rnbqk
+hornbostel h{rnb@s@l
+hornbostel h{rnb@st@l
+hornbrook h{rnbrqk
+hornbuckle h{rnb@k@l
+hornburg h{rnbPg
+hornby h{rnb/
+horne h{rn
+horned h{rnd
+hornell h{rnel
+horner h{rnP
+hornere h{rnP
+hornet h{rn@t
+hornet's h{rn@ts
+hornets h{rn@ts
+horney h{rn/
+hornick h{rn6k
+hornig h{rn6g
+hornik h{rn6k
+horning h{rn6N
+hornless h{rnl@s
+hornlike h{rnlIk
+hornor h{rnP
+horns h{rnz
+hornsby h{rnzb/
+hornstein h{rnstEn
+hornstein h{rnstIn
+hornung h{rn@N
+horny h{rn/
+hornyak h{rnyak
+horoscope h{r@skOp
+horoscopes h{r@skOps
+horovitz h)r@vits
+horowitz h{r]its
+horr h{r
+horrell h{r@l
+horrendous h{rend@s
+horrendously h{rend@sl/
+horrible h{r@b@l
+horribly h{r@bl/
+horrid h{r@d
+horrific h{rif6k
+horrified h{r@fId
+horrify h{r@fI
+horrifying h{r@fI6N
+horrigan h{r@g~
+horrocks h{r@ks
+horror h{rP
+horrors h{rPz
+hors h{rz
+hors {r
+hors-d-oeuvre {rdVv
+horsch h{rS
+horse h{rs
+horse's h{rs@z
+horseback h{rsbak
+horseflesh h{rsfleS
+horsehead h{rshed
+horsely h{rsl/
+horseman h{rsm~
+horsemanship h{rsm~Sip
+horsemen h{rsm~
+horseplay h{rsplA
+horsepower h{rsp?P
+horseradish h{rsrad6S
+horses h{rs@z
+horses' h{rs@z
+horseshoe h{rsSU
+horseshoes h{rsSUz
+horsetail h{rstAl
+horsetails h{rstAlz
+horsey h{rs/
+horsfall h{rsf@l
+horsham h{rS}
+horsham's h{rS}z
+horsing h{rs6N
+horsley h{rsl/
+horsman h{rsm~
+horst h{rst
+horstman h{rstm~
+horstmann h{rstm~
+horta h{rt@
+horten h{rt~
+horter h{rtP
+horticultural h{rt@kulCP@l
+horticulture h{rt6kulCP
+horticulturist h{rt6kulCPist
+hortman h{rtm~
+horton h{rt~
+horus h{r@s
+horvac h{rvak
+horvac's h{rvaks
+horvat h{rv@t
+horvath h{rvaT
+horvath's h{rvaTs
+horvitz h{rvits
+horwath h{rw{T
+horwich h{rw6k
+horwitz h{rwits
+hosack hos@k
+hosakawa h]s@kow@
+hosch h{S
+hose hOz
+hosea h]zA@
+hosea h]zE@
+hosea's h]zA@z
+hosea's h]zE@z
+hosed hOzd
+hosek hOsck
+hoselton h@selt~
+hoses hOz@z
+hosey hOz/
+hosford hosfPd
+hoshaw hoS{
+hoshimoto h]S/mOt]
+hosick hos6k
+hosie hOz/
+hosiery hOZP/
+hosing hOz6N
+hoskin hoskin
+hosking hosk6N
+hoskins hoskinz
+hoskinson hosk~s~
+hoskyns h{skinz
+hosler hos@lP
+hosley hosl/
+hosman hosm~
+hosner hosnP
+hosni hOzn/
+hosni h{sn/
+hosoka hOsok@
+hosoka's hOsok@z
+hosokawa hOs@kow@
+hosokawa's hOs@kow@z
+hospice hosp@s
+hospice's hosp@s@z
+hospices hosp@s@z
+hospitable hospit@b@l
+hospital hospit@l
+hospital's hospit@lz
+hospitality hosp@tal@t/
+hospitalization hosp@t@l@zAS~
+hospitalizations hosp@t@l@zAS~z
+hospitalize hosp@t@lIz
+hospitalized hosp@t@lIzd
+hospitals hospit@lz
+hospitals' h{sp@t@lz
+hoss hos
+hossack hos@k
+hossain h@sAn
+hossein h{sAn
+hosseini h]sAEn/
+hossler hos@lP
+host hOst
+host's hOsts
+hostage host6j
+hostages host6j@z
+hostages' host6j@z
+hosted hOst@d
+hostel host@l
+hostels host@lz
+hostench h{st~C
+hoster hOstP
+hosterman hOstPm~
+hostess hOst@s
+hostesses hOst@s@z
+hostetler hostct@lP
+hostetter hostctP
+hostettler hostct@lP
+hostettler hostctlP
+hostile host@l
+hostile hostIl
+hostilities hostil@t/z
+hostility hostil@t/
+hosting hOst6N
+hostler hoslP
+hosts hOs
+hosts hOss
+hosts hOsts
+hostutler hostUt@lP
+hot hot
+hot-cross hotkr{s
+hot-line hotlIn
+hotaling hot@l6N
+hotard hotPd
+hotbed hotbed
+hotbeds hotbedz
+hotcake hotkAk
+hotcakes hotkAks
+hotchkin hoCkin
+hotchkiss hoCkis
+hotdog hotd{g
+hotdogs hotd{gz
+hotel h]tel
+hotel's h]telz
+hotelier h]telyP
+hoteliers h]telyPz
+hotels h]telz
+hotels' h]telz
+hoth hoT
+hothouse hoth?s
+hotlanta h{tlant@
+hotline hotlIn
+hotlines hotlInz
+hotly hotl/
+hots hots
+hotshot hoCot
+hott hot
+hottel hot@l
+hottelet hotlct
+hottelet's hotlcts
+hottenstein hot~st/n
+hottenstein hot~stIn
+hotter hotP
+hottest hot@st
+hottinger hot6NP
+hottle hot@l
+hottman hotm~
+hotwire hotwIP
+hotwired hotwIPd
+hotz hots
+hotze hOtz
+hou hU
+houchen h?k~
+houchens h?k~z
+houchin h?kin
+houchins h?kinz
+houck h?k
+houdaille hUdAl
+houde h?d
+houdek h?d6k
+houdeshell hUd6S@l
+houdini hUdEn/
+houdini's hUdEn/z
+houff hOf
+houg h?g
+houge h?j
+hougen h?g~
+hough huf
+hougham h?}
+houghland h?l~d
+houghs h?z
+houghtaling h{t@l6N
+houghton h{t~
+houghton's h{t~z
+hougland h?gl~d
+houk h?k
+houle h?l
+houlihan hUl@han
+houlihan's hUl@hanz
+houlton hOlt~
+hound h?nd
+hounded h?nd@d
+hounding h?nd6N
+hounds h?ndz
+hounshell h?nS@l
+houp hUp
+houpt hUpt
+hour ?P
+hour ?r
+hour's ?Pz
+hourglass ?Pglas
+hourigan ?r6gan
+hourihan ?rEhon
+hourlong ?rl{N
+hourly ?rl/
+hours ?Pz
+hours ?rz
+hours' ?rz
+housand h?s~d
+housden h?sd~
+house h?s
+house's h?s@z
+houseal h?s@l
+houseboat h?sbOt
+housebroken h?sbrOk~
+housecleaning h?sklEn6N
+housed h?zd
+houseful h?sf@l
+houseguest h?sgcst
+household h?shOld
+household's h?shOldz
+householder h?shOldP
+householders h?shOldPz
+households h?shOldz
+housekeeper h?skEpP
+housekeepers h?skEpPz
+housekeeping h?skEp6N
+houseknecht h?skn6kt
+housel h?s@l
+houseman h?sm~
+houseman's h?sm~z
+houser h?zP
+houses h?s@z
+houses' h?s@z
+houseware h?swer
+housewares h?swerz
+housewife h?swIf
+housewives h?swIvz
+housework h?swVk
+houseworth h?swVT
+housewright h?srIt
+housh h?S
+housholder h?S]ldP
+housing h?z6N
+housings h?z6Nz
+houska h?sk@
+housley h?sl/
+housman h?sm~
+houston hyUst~
+houston's hyUst~z
+houstonian hUstOn/~
+houstonian hyUstOn/~
+hout h?t
+houtchens h?C~z
+houten h?tcn
+houten's h?tcnz
+houtman h?tm~
+houts h?ts
+houtz h?ts
+houx hU
+houy hoI
+houze h?z
+hovan hOv~
+hovanec h@van6k
+hovater hOv@tP
+hovatter hov@tP
+hovda hovd@
+hovde hOvd
+hovden hovd~
+hove hOv
+hovel huv@l
+hovels huv@lz
+hoven hOv~
+hover huvP
+hovercraft huvPkraft
+hovered huvPd
+hoverflies huvPflIz
+hoverfly huvPflI
+hovering huvP6N
+hovering huvr6N
+hovermale huvPm@l
+hovers huvPz
+hoverson huvPs~
+hovey hOv/
+hovhaness h{vhan@s
+hoving hOv6N
+hovious hOv/@s
+hovis hOvis
+hovland hovl~d
+hovnanian hovnAn/~
+hovorka h@v{rk@
+hovsepian h@vsEp/~
+hovy hOv/
+how h?
+how'd h?d
+how're h?P
+how's h?z
+howald h?@ld
+howard h?Pd
+howard's h?Pdz
+howarth h?orT
+howat h?@t
+howatt h?@t
+howcroft h?kr@ft
+howden h?d~
+howdeshell h?d6Scl
+howdy h?d/
+howdyshell h?d6Scl
+howe h?
+howe's h?z
+howell h?@l
+howell's h?@lz
+howells h?@lz
+howenstine h?~st/n
+hower h?P
+howerter h?PtP
+howerton h?Vt~
+howery h?P/
+howes h?z
+howeth h?cT
+however h?evP
+howey h?/
+howie h?/
+howie's h?/z
+howington h?6Nt~
+howison h?@s~
+howitt h?it
+howitzer h?@tsP
+howitzers h?@tsPz
+howk h?k
+howl h?l
+howland h?l~d
+howle h?@l
+howled h?ld
+howler h?lP
+howlett h?lit
+howley h?l/
+howling h?l6N
+howls h?lz
+howmet h?m@t
+howorth howPT
+howry h?r/
+howsare h?sP
+howse h?z
+howsell h?z@l
+howser h?zP
+howson h?s~
+howtek h?tek
+howton h?t~
+howze h?z
+hoxie hoks/
+hoxsey hoks/
+hoxsie hoks/
+hoxworth hokswPT
+hoy h<
+hoye h<
+hoyer h<P
+hoying h<6N
+hoylake h<lAk
+hoyland h<l~d
+hoyle h<l
+hoyne h<n
+hoyos h<]z
+hoyt h<t
+hoyvald h<v@ld
+hrabak hrob@k
+hrabak rob@k
+hrawi hPwow/
+hrawi hrow/
+hrdlicka hPdlisk@
+hreha hrEh@
+hreha rEh@
+hren hren
+hren ren
+hribar hrib)r
+hribar rib)r
+hritz hrits
+hritz rits
+hrivnak hrivn@k
+hrivnak rivn@k
+hrncir hVnCP
+hrncir hVns6r
+hron hron
+hron ron
+hronek hrOn6k
+hronek rOn6k
+hrovat hrOv@t
+hrovat rOv@t
+hrubik h6rUb6k
+hrubik hrUb6k
+hrubik rUb6k
+hruby hrUb/
+hruby rUb/
+hruska hrusk@
+hruska rUsk@
+hruska rusk@
+hsia So
+hsiao S?
+hsieh S/e
+hsiung S/uN
+hsiung's SyuNz
+hsu SU
+hu hU
+hua hU@
+hua hwo
+huachuca hwoCUk@
+huachuca woCUk@
+huadong hwodON
+huairou hwIrU
+huallaga hwolog@
+huallaga wolog@
+huan hwon
+huaneng hwoneN
+huang hwaN
+huard hw)rd
+hub hub
+hubbard hubPd
+hubbard's hubPdz
+hubbart hubPt
+hubbell hub@l
+hubbell's hub@lz
+hubbert hubPt
+hubble hub@l
+hubble's hub@lz
+hubbs hubz
+hubbub hub@b
+hubby hub/
+hubcap hubkap
+hubcaps hubkaps
+hubco hubk]
+hube hyUb
+huber hyUbP
+huberman hUbPm~
+hubers hUbPz
+hubert hyUbPt
+hubert's hyUbPts
+huberta hUb,rt@
+huberto hUb,rt]
+huberty hubPt/
+hubka hubk@
+hubler hyUb@lP
+hubley hubl/
+hubner hubnP
+hubor hyUbP
+hubris hyUbr@s
+hubs hubz
+huch huC
+huchison huC@s~
+huck huk
+huckaba huk@b@
+huckabay huk@bA
+huckabee huk@b/
+huckaby huk@b/
+hucke huk
+huckeba huk@b@
+huckelby huk@lb/
+huckelby'll huk@lb/@l
+huckelby's huk@lb/z
+hucker hukP
+huckins hukinz
+huckle huk@l
+huckleberry huk@lber/
+hucks huks
+huckstep hukstip
+huckster hukstP
+hucksters hukstPz
+hud hud
+hud's hudz
+hudak hUd@k
+huddie hud/
+huddle hud@l
+huddled hud@ld
+huddles hud@lz
+huddleson hud@ls~
+huddleston hud@lst~
+huddling hud@l6N
+huddling hudl6N
+huddy hud/
+hudec hUd6k
+hudecek hud6Cck
+hudek hUd6k
+hudelson hud@ls~
+hudgens huj~z
+hudgins hujinz
+hudkins hudkinz
+hudler hUd@lP
+hudlow hudl]
+hudman hudm~
+hudnall hudn@l
+hudnell hudn@l
+hudnut hudnut
+hudock hud@k
+hudon hUd~
+hudson huds~
+hudson's huds~z
+hudspeth hudspcT
+hudsucker hudsukP
+hudwon hudw~
+hudy hyUd/
+hudzik hudz6k
+hue hyU
+huebel hqb@l
+hueber hqbP
+huebert hqbPt
+huebner hyUbnP
+huebsch hqbS
+hued hyUd
+huegel hqg@l
+hueglin hyUglin
+huelskamp hqlskamp
+huelsman hqlsm~
+huelsmann hqlsm~
+huenink hqn6Nk
+huerst hVst
+huerta hw,rtu
+huerta w,rtu
+huerter hVtP
+hues hyUz
+huesman hqsm~
+huestis hqstis
+hueston hqst~
+huether hqTP
+huett hUt
+huetta hUet@
+huette hUt
+huettl hqt@l
+huettner hqtnP
+huey hyU/
+hufbauer hufb?P
+huff huf
+huff's hufs
+huffaker huf@kP
+huffed huft
+huffer hufP
+huffine hufIn
+huffines hufInz
+huffing huf6N
+huffington huf6Nt~
+huffington's huf6Nt~z
+huffman hufm~
+huffmaster hufmastP
+hufford hufPd
+huffs hufs
+huffstetler hufstct@lP
+huffstetler hufstctlP
+huffstutler hufstUt@lP
+huffstutler hufstUtlP
+huffy huf/
+huffy's huf/z
+hufnagel hufnAg@l
+hufnagle hufnAg@l
+hufstedler hufst@d@lP
+hufstedler hufst@dlP
+hufstetler hufstct@lP
+hufstetler hufstctlP
+hug hug
+huge hyUj
+huge yUj
+hugel hUg@l
+hugely hyUjl/
+hugest hyUj@st
+hugette h@Zet
+hugg hug
+huggard hugPd
+hugged hugd
+hugger hugP
+huggett hugct
+huggies hug/z
+hugging hug6N
+huggins huginz
+huggler huglP
+huggy hug/
+hugh hyU
+hugh yU
+hughart hughort
+hughart hyUort
+hughart yUort
+hughbanks hub@Nks
+hughbanks hyUb@Nks
+hughbanks yUb@Nks
+hughen hyU~
+hughen yU~
+hughes hyUz
+hughes yUz
+hughes' hyUz
+hughes' yUz
+hughes's hyUz@z
+hughes's yUz@z
+hughett hyUct
+hughett yUct
+hughette hyUet
+hughette yUet
+hughey hug/
+hughey hyU/
+hughey yU/
+hughie hyU/
+hughie yU/
+hughlett hyUl@t
+hughlett yUl@t
+hughley hugl/
+hughley hyUl/
+hughley yUl/
+hughs hyUz
+hughs yUz
+hughson hugs~
+hughson hyUs~
+hughson yUs~
+hughston hugst~
+hughston hyUst~
+hughston yUst~
+hughy hyU/
+hughy yU/
+hugill huj@l
+hugley hugl/
+hugo hyUg]
+hugo yUg]
+hugo's hyUg]z
+hugo's yUg]z
+hugoton hyUg]t~
+hugoton yUg]t~
+hugs hugz
+huguenin hUgAnEn
+huguenot hyUg~ot
+huguenot yUg~ot
+huguenots hyUg~ots
+huguenots yUg~ots
+huguet hUgAt
+huguley hugyUl/
+hugus hyUg@s
+hugus yUg@s
+huh hu
+huhn hun
+huhta hUt@
+hui hU6
+huibregtse hUbrckts
+huie hyU/
+huie yU/
+huish hyUiS
+huish yUiS
+huishman hUsm~
+huitt hUt
+huizar hiz)r
+huizenga hizANg@
+huizenga's hizANg@z
+huizinga hizENg@
+hukill hyUkil
+hukill yUkil
+hukstra h@kstr@
+hula hUl@
+hulbard hulbPd
+hulbert hulbPt
+hulbert's hulbPts
+hulburd hulbPd
+hulburt hulbPt
+hulce huls
+hulce's huls@z
+huldie hud/
+huldy huld/
+hulen hul~
+hulet hUlct
+hulett hyUlct
+hulett yUlct
+hulette hyUlet
+hulette yUlet
+hulgan hulg~
+hulick hyUl6k
+hulick yUl6k
+hulin hyUlin
+hulin yUlin
+huling hyUl6N
+huling yUl6N
+hulings hyUl6Nz
+hulings yUl6Nz
+hulk hulk
+hulking hulk6N
+hulks hulks
+hull hul
+hull's hulz
+hullabaloo hul@b@lU
+hulled huld
+hullender hUlcndP
+hullett hUlct
+hulliber hul@bP
+hullinger hul@NP
+hullinger hul~jP
+hulls hulz
+hullum hul}
+hulme hulm
+hulon hyUl~
+hulon's hyUl~z
+hulond hyUl~d
+hulond's hyUl~dz
+huls hulz
+hulse huls
+hulsebus huls@b@s
+hulsey huls/
+hulsizer hulsIzP
+hulslander hulsl~dP
+hulsman hulsm~
+hulst hulst
+hult hult
+hult's hults
+hultberg hultbPg
+hultgren hultgrcn
+hultman hultm~
+hulton hult~
+hultquist hultkwist
+hults hults
+hultz hults
+hulvey hulv/
+hum hum
+human hyUm~
+human yUm~
+human's hyUm~z
+humana hyUman@
+humana's hyUman@z
+humane hyUmAn
+humanely hyUmAnl/
+humanism hyUm~iz}
+humanist hyUm~ist
+humanistic hyUm~ist6k
+humanists hyUm~@s
+humanists hyUm~@ss
+humanists hyUm~@sts
+humanitarian hyUman@t,r/~
+humanitarian yUman@t,r/~
+humanitarians hyUman@t,r/~z
+humanitarians yUman@t,r/~z
+humanities hyUman@t/z
+humanities yUman@t/z
+humanity hyUman@t/
+humanity yUman@t/
+humanity yUman@t/z
+humanity's hyUman@t/z
+humanize hyUm~Iz
+humanized hyUm~Izd
+humanizes hyUm~Iz@z
+humanizing hyUm~Iz6N
+humankind hyUm~kInd
+humankind's hyUm~kIndz
+humanly hyUm~l/
+humann hyUm~
+humanness hyUm~n@s
+humans hyUm~z
+humans yUm~z
+humbarger humborgP
+humber humbP
+humbert humbPt
+humberto Umb,rtO
+humberto h}bVtO
+humble humb@l
+humbled humb@ld
+humbler humb@lP
+humbles humb@lz
+humblest humb@l@st
+humbling humb@l6N
+humbling humbl6N
+humbly humbl/
+humboldt humbOlt
+humbug humbug
+humburg humbPg
+humdinger humd6NP
+humdrum humdrum
+hume hyUm
+humenik hyUm~6k
+humerous hyUmP@s
+humerous yUmP@s
+humerus hyUmP@s
+humes hyUmz
+humfrey humfr/
+humfry humfP/
+humi hyUm/
+humid hyUm@d
+humid yUm@d
+humidifier hyUmid@fIP
+humidifiers hyUmid@fIPz
+humidity hyUmid@t/
+humidity's hyUmid@t/z
+humidor hyUm@d{r
+humiliate hyUmil/At
+humiliated hyUmil/At@d
+humiliating hyUmil/At6N
+humiliation hyUmil/AS~
+humiliations hyUmil/AS~z
+humility hyUmil@t/
+humiston hyUm@ston
+humke humk/
+huml hum@l
+humm hum
+hummel hum@l
+hummell hum@l
+hummer humP
+humming hum6N
+hummingbird hum6NbVd
+hummingbirds hum6NbVdz
+humongous hyUm{Ng@s
+humor hyUmP
+humoral hyUmP@l
+humored hyUmPd
+humorist hyUmP@st
+humorists hyUmPis
+humorists hyUmPiss
+humorists hyUmPists
+humorless hyUmPl@s
+humorous hyUmP@s
+humorously hyUmP@sl/
+hump hump
+humpal hump@l
+humpback humpbak
+humped humpt
+humpert humpVt
+humph humf
+humphery humfP/
+humphery humfr/
+humphery humpfP/
+humphery humpfr/
+humpherys humfP/z
+humpherys humpfP/z
+humphrey humfr/
+humphrey's humfr/z
+humphrey's humpfr/z
+humphreys humfP/z
+humphreys humfr/z
+humphreys humpfr/z
+humphries humfP/z
+humphries humpfP/z
+humphry humfr/
+humphry humpfr/
+humpty humpt/
+hums humz
+humulin hyUmyUl~
+humus hyUm@s
+humvee humvE
+humvee's humvEz
+humvees humvEz
+hun hun
+hunan hUnon
+hunch hunC
+hunchback hunCbak
+hunched hunCt
+hunches hunC@z
+hunchine h@CEn
+hund hund
+hundai hundA
+hundertmark hundPtmork
+hundley hundl/
+hundred hunPd
+hundred hundPd
+hundred hundr@d
+hundred's hundr@dz
+hundreds hunPdz
+hundreds hundPdz
+hundreds hundr@dz
+hundredth hundr@dT
+hundredths hundr@dTs
+hundredweight hundr@dwAt
+hundt hunt
+huneke hun6k
+huneycutt hun/k@t
+hung huN
+hungarian h@Ng,r/~
+hungarians h@Ng,r/~z
+hungary huNgP/
+hungary's huNgP/z
+hungate huNAt
+hunger huNgP
+hungerford huNgPfPd
+hungerfords huNgPfPdz
+hungering huNgP6N
+hungrier huNgr/P
+hungrily huNgr@l/
+hungry huNgr/
+hunk huNk
+hunke huNk
+hunkele huNk@l
+hunker huNkP
+hunkered huNkPd
+hunkering huNkP6N
+hunkins huNkinz
+hunks huNks
+hunky huNk/
+hunley hunl/
+hunn hun
+hunnell hun@l
+hunnewell hun@wcl
+hunnicutt hun6k@t
+hunsaker huns@kP
+hunsberger hunsbPgP
+hunsicker huns6kP
+hunsinger huns6NP
+hunsley hunsl/
+hunsucker huns@kP
+hunt hunt
+hunt's hunts
+huntco huntk]
+hunte hunt
+hunted hun@d
+hunted hunt@d
+hunter huntP
+hunter's huntPz
+hunters huntPz
+hunting hunt6N
+huntingdon hunt6Nd~
+huntington hunt6Nt~
+huntington's hunt6Nt~z
+huntley huntl/
+huntly huntl/
+hunton hunt~
+huntoon h~tUn
+huntress huntr@s
+hunts hunts
+hunts' hunts
+huntsinger hunts~jP
+huntsman huntsm~
+huntsville huntsvil
+huntway huntwA
+huntzinger huntz6NP
+hunza hunz@
+hunzeker hunz6kP
+hunziker hunz6kP
+huot hyU@t
+hupe hyUp
+hupfer hupfP
+hupp hup
+huppert hupPt
+hur hV
+hurco hVkO
+hurd hVd
+hurdle hVd@l
+hurdler hVd@lP
+hurdler hVdlP
+hurdles hVd@lz
+hurdling hVd@l6N
+hurdling hVdl6N
+hurdman hVdm~
+hurford hVfPd
+hurl hVl
+hurlbert hVlbPt
+hurlburt hVlbPt
+hurlbut hVlb@t
+hurlbutt hVlb@t
+hurled hVld
+hurless hVl@s
+hurley hVl/
+hurling hVl6N
+hurlock hVl@k
+hurly hVl/
+hurm hVm
+hurn hVn
+hurney hVn/
+huron hyUron
+huron hyqron
+hurrah hqro
+hurray h@rA
+hurrell h{r@l
+hurricane hV@kAn
+hurricane hur@kAnz
+hurricane's hV@kAnz
+hurricanes hV@kAnz
+hurried hV/d
+hurriedly hV/dl/
+hurries hV/z
+hurry hV/
+hurrying hV/6N
+hursey hVs/
+hursh hVS
+hurst hVst
+hurston hVst~
+hurt hVt
+hurta hVt@
+hurtado hPtod]
+hurteau hPtO
+hurtful hVtf@l
+hurtig hVt6g
+hurting hVt6N
+hurtle hVt@l
+hurtling hVtl6N
+hurts hVts
+hurtt hVt
+hurtubise hVt@bIz
+hurvey hVv/
+hurvitz hVvits
+hurwitz hVwits
+husain husIn
+husak hUs@k
+husar hUsP
+husband huzb~d
+husband's huzb~dz
+husbandry huzb~dr/
+husbands huzb~dz
+husbands' husb~dz
+husby husb/
+huschka huSk@
+huse hyUz
+huseby hus@b/
+huseman hUsm~
+husen hUs~
+huser hyUzP
+hush huS
+hushed huSt
+husic hyUz6k
+husk husk
+huska husk@
+huskey husk/
+huskins huskinz
+husks husks
+husky husk/
+husky's husk/z
+husman husm~
+husmann husm~
+huson hUs~
+huss hus
+hussain hUsAn
+hussar husP
+hussein hUsAn
+hussein's hUsAnz
+husseini hUsAn/
+husseini hyUsAn/
+husser husP
+hussey hus/
+hussite husIt
+hussman husm~
+husson hus~
+hussong hus{N
+hussy hus/
+hust hust
+hustad hust@d
+hustead hustcd
+husted hust@d
+huster hustP
+hustings hust6Nz
+hustle hus@l
+hustled hus@ld
+hustler hus@lP
+hustlers hus@lPz
+hustles hus@lz
+hustling hus@l6N
+hustling husl6N
+huston hust~
+hut hut
+hut's huts
+huta hUt@
+hutch huC
+hutchcraft huCkraft
+hutchens huC~z
+hutcheon huC/~
+hutcherson huCPs~
+hutcheson huC@s~
+hutchings huC6Nz
+hutchins hutCinz
+hutchinson huC~s~
+hutchison huC@s~
+hutchison's huC@s~z
+huth hUT
+hutmacher hutm@kP
+hutnick hutn6k
+huto hUtO
+huts huts
+hutsell huts@l
+hutson huts~
+hutt hut
+hutter hutP
+huttner hutnP
+hutto hUt]
+hutton hut~
+hutton's hut~z
+hutu hUtU
+hutu's hUtUz
+hutus hUtUz
+hutzel hutz@l
+hutzell hutz@l
+hutzelman huts@lm~
+hutzler hutslP
+huval hUval
+huwe hUw
+hux huks
+huxford huksfPd
+huxley huksl/
+huxtable hukst@b@l
+huxtables hukst@b@lz
+huyck hIk
+huyett hIct
+huyler hIlP
+huynh hIn
+huyser hIsP
+hwa hwo
+hwan hwon
+hwan's hwonz
+hwang hwaN
+hwang hwoN
+hwang-ho hwaNhO
+hwang-ho hwoNhO
+hwe hwA
+hy hI
+hyacinth hI@sinT
+hyacintha hI@sinT@
+hyacinthe hI@sinT
+hyacinthia hI@sinT/@
+hyacinthie hI@sinT/
+hyacinths hI@sinTs
+hyades hI@dEz
+hyakutake hI@kUtok/
+hyakutake hI@kyUtok/
+hyaluronic hI@lPon6k
+hyams hI}z
+hyannis hIanis
+hyannisport hIanisp{rt
+hyatt hI@t
+hyatt's hI@ts
+hybl hib@l
+hybl's hib@lz
+hybrid hIbr@d
+hybridization hIbr@d@zAS~
+hybridize hIbr@dIz
+hybrids hIbr@dz
+hybrienko hIbr/enk]
+hybritech hIbr@tek
+hyche hIC
+hycor hIk{r
+hycroft hIkr{ft
+hyde hId
+hyde's hIdz
+hydea hIdA@
+hydea hIdE@
+hydeia hIdA@
+hyden hId~
+hyder hIdP
+hyderabad hId,r@bad
+hyderabad hIdP@bad
+hydock hId@k
+hydra hIdr@
+hydrant hIdr~t
+hydrants hIdr~ts
+hydras hIdr@z
+hydrate hIdrAt
+hydrated hIdrAt@d
+hydration hIdrAS~
+hydraulic hIdr{l6k
+hydraulics hIdr{l6ks
+hydrazine hIdr@zEn
+hydrick hidr6k
+hydride hIdrId
+hydro hIdrO
+hydro's hIdrOz
+hydrocarbon hIdr]k)rb~
+hydrocarbons hIdr]k)rb~z
+hydroelectric hIdr]@lektr6k
+hydrofoil hIdr@f<l
+hydrogen hIdr@j~
+hydrogenate hIdr@j~At
+hydrogenated hIdr@j~At@d
+hydrogenated hIdroj~At@d
+hydrogenates hIdr@j~Ats
+hydrogenating hIdr@j~At6N
+hydrogenation hIdroj~AS~
+hydrogens hIdr@j~z
+hydrographic hIdr@graf6k
+hydrolysis hIdrol@s@s
+hydrolyze hIdr@lIz
+hydrolyzed hIdr@lIzd
+hydrolyzing hIdr@lIz6N
+hydrometer hIdrom@tP
+hydron hIdr~
+hydrophilic hIdr@fil6k
+hydroponic hIdr@pon6k
+hydropower hIdr]p?r
+hydrosol hIdr@sol
+hydrosulfide hIdr]sulfId
+hydrotherapy hIdr]T,r@p/
+hydrothermal hIdr]TVm@l
+hydrous hIdr@s
+hydrox hIdr{ks
+hydroxide hIdroksId
+hydroxides hIdroksIdz
+hydroxy hIdr{ks/
+hydstra hIdstr@
+hye hI
+hyena hIEn@
+hyenas hIEn@z
+hyer hIP
+hyers hIPz
+hygeia hIjA@
+hygiene hIjEn
+hygienist hIgEn@st
+hygienists hIgEn@s
+hygienists hIgEn@ss
+hygienists hIgEn@sts
+hygrometer hIgrom@tP
+hykes hIks
+hyland hIl~d
+hyle hIl
+hyler hIlP
+hylsa hIls@
+hyman hIm~
+hymans hIm~z
+hymas hIm@z
+hymel hIm@l
+hymen hIm~
+hymer hImP
+hymes hImz
+hymie hIm/
+hymies hIm/z
+hymn him
+hymnal himn@l
+hymnals himn@lz
+hymnology himnol@j/
+hymns himz
+hymowitz him@wits
+hynd hind
+hyndman hindm~
+hynds hindz
+hynek hIn6k
+hynes hInz
+hynes's hInz@z
+hynson hins~
+hyogo hyOg]
+hyotan hyOtan
+hype hIp
+hyped hIpt
+hyper hIpP
+hyperactive hIpPakt6v
+hyperactivity hIpPaktiv@t/
+hyperbaric hIpPb)r6k
+hyperbaric hIpVbar6k
+hyperbola hIpVb@l@
+hyperbole hIpVb@lE
+hyperbolic hIpPbol6k
+hyperborean hIpPb{r/~
+hypercard hIpPk)rd
+hypercritical hIpPkrit6k@l
+hyperinflation hIpPinflAS~
+hyperion hIpir/~
+hyperkinetic hIpPk~et6k
+hyperlink hIpPl6Nk
+hyperlinks hIpPl6Nks
+hypermarket hIpPmork@t
+hypermarkets hIpPmork@ts
+hyperopia hIpPOp/@
+hypersensitive hIpPsens@t6v
+hypersensitivity hIpPsens@t6v@t/
+hypersonic hIpPson6k
+hypertension hIpPtenS~
+hypertensive hIpPtens6v
+hypertext hIpPtekst
+hypertonic hIpPton6k
+hypes hIps
+hyphae hIfE
+hyphen hIf~
+hyphenate hIf~At
+hyphenated hIf~At@d
+hyping hIp6N
+hypnosis hipnOs@s
+hypnotic hipnot6k
+hypnotics hipnot6ks
+hypnotism hipn@tiz}
+hypnotism's hipn@tiz}z
+hypnotize hipn@tIz
+hypnotized hipn@tIzd
+hypo hIp]
+hypochondria hIp@kondr/@
+hypochondriac hIp@kondr/ak
+hypocrisy h@pokr@s/
+hypocrite hip6krit
+hypocrites hip6krits
+hypocritical hip6krit6k@l
+hypodermic hIp@dVm6k
+hypoglycemia hIp]glIsEm/@
+hypoglycemic hIp]glIsEm6k
+hypolite hIp@lIt
+hyponex hIp]neks
+hypotension hIp]tenS~
+hypothalamic hIp]T@lam6k
+hypotheken hIpoT@k~
+hypothermia hIp@TVm/@
+hypotheses hIpoT@sEz
+hypothesis hIpoT@s@s
+hypothesize hIpoT@sIz
+hypothesized hIpoT@sIzd
+hypothetical hIp@Tet@k@l
+hypothetically hIp@Tet6kl/
+hypotheticals hIp@Tet@k@lz
+hypoxia hIpoks/@
+hyraxes hIraks@z
+hyre hIr
+hysell hIs@l
+hyser hIzP
+hyslop hIsl@p
+hyson hIs~
+hysong hIs{N
+hyssop his@p
+hyster histP
+hysterectomies histPekt}/
+hysterectomy histPekt}/
+hysteria hist,r/@
+hysteric hist,r6k
+hysterical hist,r6k@l
+hysterically hist,r6kl/
+hysterics hist,r6ks
+hyun hI~
+hyun hyun
+hyundai hundA
+hyundai hyundA
+hyundai's hundAz
+hyundais hyundAz
+i I
+i'd Id
+i'ers IPz
+i'll Il
+i'm Im
+i's Iz
+i've Iv
+i. I
+i.'s Iz
+i.s Iz
+ia E@
+iacobelli /ok]bel/
+iacobellis /ok]belis
+iacobucci /ok]bUC/
+iacocca I@kOk@
+iacocca's I@kOk@z
+iacona I@kOn@
+iacono I@kOn]
+iacovelli /ok]vel/
+iafrate I@frAt/
+iago /og]
+iain /An
+iakovos /ok]v]s
+ialla Eol@
+ialla Iol@
+iams Eomz
+ian E~
+iannaccone /on@kOn/
+iannacone /on@kOn/
+iannamico /on}Ek]
+iannelli /~el/
+iannello /~el]
+ianni /on/
+ianniello /on/el]
+iannone /~On/
+iannotti /~Ot/
+iannucci /~UC/
+iannuzzi /~Uts/
+iannuzzi /~Uz/
+iantha /onT@
+ianthe /onTA
+ianthina /~TEn@
+iason E@s~
+iavarone /ovPOn/
+ib IbE
+ib ib
+iba Eb@
+ibach ibok
+ibanez iboncz
+ibaraki IbPok/
+ibarra ib)r@
+ibbotson ib@ts~
+iberia Ibir/@
+iberia's Ibir/@z
+iberian Ibir/~
+ibex Ibcks
+ibis Ib@s
+ibmer ibmP
+ibmers ibmPz
+ibn ib~
+ibogaine Ib@gAn
+ibogaine Ib]gAn
+ibrahim ibrohEm
+ibsen ibs~
+ibuprofen IbyUprOf~
+icahn Ikon
+icahn's Ikonz
+icard 6k)rd
+icarus ikV@s
+ice Is
+ice-nine IsnIn
+iceberg IsbPg
+icebergs IsbPgz
+icebox Isboks
+icebreaker IsbrAkP
+icebreakers IsbrAkPz
+iced Ist
+icefish IsfiS
+iceland Isl~d
+icelandair Island,r
+icelandic Island6k
+iceman Isman
+icenhour Is~?r
+icenhour is~?r
+icenhower Is~h?P
+icenhower is~h?P
+icenogle Is~Og@l
+icenogle is~Og@l
+ices Is@z
+iceskate IskAt
+iceskate IsskAt
+iceskating IskAt6N
+iceskating IsskAt6N
+ich iC
+ichi EC/
+ichikawa 6C/kow@
+ichiro EC6r]
+icicle Is6k@l
+icicles Is6k@lz
+icily Is@l/
+icing Is6N
+ickes iks
+icon Ikon
+iconoclasm Ikon@klaz}
+iconoclast Ikon@klast
+iconoclastic Ik~@klast6k
+iconography Ik~ogr@f/
+icons Ikonz
+icy Is/
+id IdE
+id id
+ida Id@
+idaho Id@hO
+idaho's Id@hOz
+idalia @doly@
+idalina @dolEn@
+idaline id@lIn
+iddings id6Nz
+ide Id
+idea IdE@
+idea's IdE@z
+ideal IdEl
+ideal's IdElz
+idealism IdEliz}
+idealist IdEl@st
+idealistic IdE@list6k
+idealists IdEl@s
+idealists IdEl@ss
+idealists IdEl@sts
+idealize IdElIz
+idealized IdE@lIzd
+ideally IdEl/
+ideals IdElz
+ideas IdE@z
+idec Id@k
+iden Id~
+identa Ident@
+identical Iden6k@l
+identical Ident6k@l
+identics Iden6ks
+identics Ident6ks
+identifiable Iden@fI@b@l
+identifiable Ident@fI@b@l
+identification Iden@f@kAS~
+identification Ident@f@kAS~
+identifications Iden@f@kAS~z
+identifications Ident@f@kAS~z
+identified Iden@fId
+identified Ident@fId
+identifier Iden@fIP
+identifier Ident@fIP
+identifies Iden@fIz
+identifies Ident@fIz
+identify Iden@fI
+identify Ident@fI
+identifying Iden@fI6N
+identifying Ident@fI6N
+identikit Ident6kit
+identities Iden@t/z
+identities Ident@t/z
+identity Iden@t/
+identity Ident@t/
+ideological Id/@loj6k@l
+ideologically Id/@loj6kl/
+ideologies Id/ol@j/z
+ideologist Id/ol@j@st
+ideologists Id/ol@j@s
+ideologists Id/ol@j@ss
+ideologists Id/ol@j@sts
+ideologue Id/@l]g
+ideologues Id/@l{gz
+ideology Id/ol@j/
+ideonomy Id/on}/
+idette Idet
+ididerod IdidPod
+idiocy id/@s/
+idiom id/}
+idiomatic id/}at6k
+idioms id/}z
+idiosyncrasies id/]sinkr@sEz
+idiosyncrasy id/]sinkr@sE
+idiosyncratic id/]sinkrat6k
+idiot id/@t
+idiotic id/ot6k
+idiotically id/ot6kl/
+idiots id/@ts
+iditarod idit@r{d
+idle Id@l
+idled Id@ld
+idleman Id@lm~
+idleness Id@ln@s
+idler Id@lP
+idles Id@lz
+idlewild Id@lwIl
+idlewild Id@lwIld
+idling Id@l6N
+idling Idl6N
+idly Idl/
+ido EdO
+idol Id@l
+idola @dOl@
+idolatrous Idol@tr@s
+idolatry Idol@tr/
+idolize Id@lIz
+idolized Id@lIzd
+idolizes Id@lIz@z
+idolizing Id@lIz6N
+idols Id@lz
+idona @dOn@
+idoney @dOn/
+idonia @dOn/@
+idrocarburi @drokorbqr/
+iduna @dUn@
+idyll Id@l
+idyllic Idil6k
+ierardi /P)rd/
+ierne irn
+iezzi /ets/
+if @f
+if if
+if_you're ifyqr
+iffy if/
+ifil IfEl
+ifill ifEl
+ifint Ifint
+ifor If{r
+ifs ifs
+igarashi EgoroS/
+ige Ij
+igel ig@l
+igene IjEn
+iger IgP
+iglehart Ig@lhort
+iglesia EglAs/@
+iglesias 6glAs/@s
+igloo iglU
+igman igm~
+ignace ign@s
+ignacio 6gnos/]
+ignacio's 6gnos/]z
+ignasiak 6gnos/ak
+ignatia 6gnoS@
+ignatius 6gnAS@s
+ignatowski 6gn@t{fsk/
+ignatz ign@ts
+igneous ign/@s
+ignite 6gnIt
+ignited 6gnIt@d
+ignites 6gnIts
+igniting 6gnIt6N
+ignition 6gniS~
+ignoble 6gnOb@l
+ignominious ign}in/@s
+ignominy ign]min/
+ignoramus ignPAm@s
+ignorance ignP~s
+ignorant ignP~t
+ignore 6gn{r
+ignored 6gn{rd
+ignores 6gn{rz
+ignoring 6gn{r6N
+igo Eg]
+igoe Eg]
+igon Ig~
+igor 6g{r
+igor Eg{r
+igou 6gU
+iguana Igwon@
+iguanas 6gwon@z
+igushi 6gUS/
+ihasz Ihas
+ihde id
+ihle Ih@l
+ihlenfeldt il~fclt
+ihnen in~
+ihrig ir6g
+ihrke irk
+iiams E}z
+iida Ed@
+iie E/
+ijames IjAmz
+ijames iyomcs
+ijaz /joz
+ijaz ij@z
+ikard ikPd
+ike Ik
+ike's Iks
+ikea IkE@
+ikeda 6kAd@
+ikenberry Ik~ber/
+ikerd ikPd
+ikeuchi /kUC/
+ikey ik/
+ikie ik/
+ikle ik@l
+ikner iknP
+il il
+ila El@
+ilalis ilal@s
+ilalis' ilal@s
+ilalis's ilal@s@z
+ilan Elon
+ilardi @l)rd/
+ilbo ilb]
+ileana il/an@
+ilene il/n
+iler IlP
+iles Ilz
+ileto IlAd]
+ilg ilg
+ilgenfritz ilg~frits
+ilhae ilhA
+iliad il/@d
+iliano il/on]
+ilidza @lidz@
+iliescu il/eskyU
+iliff ilif
+iljin iljin
+ilk ilk
+ilka ilk@
+ill il
+illegal ilEg@l
+illegalities il/gal@t/z
+illegality il/gal@t/
+illegally ilEg@l/
+illegals ilEg@lz
+illegible ilej@b@l
+illegitimacy il6jit}@s/
+illegitimate il6jit}@t
+illes Ilz
+illg ilg
+illicit ilis@t
+illicitly ilis@tl/
+illig il6g
+illingworth il6NwVT
+illinois il~<
+illinois il~<z
+illinois' il~<z
+illinois's il~<z
+illiquid ilikw@d
+illiquidity il6kwid@t/
+illiteracy ilitP@s/
+illiterate ilitP@t
+illiterates ilitP@ts
+illness iln@s
+illnesses iln@s@z
+illogic iloj6k
+illogical iloj6k@l
+ills ilz
+illuminate ilUm~At
+illuminated ilUm~At@d
+illuminates ilUm~Ats
+illuminating ilUm~At6N
+illumination ilUm~AS~
+illuminator ilUm~AtP
+illumine ilUm~
+illumined ilUm~d
+illusion ilUZ~
+illusionary ilUZ~er/
+illusionism ilUZ~iz}
+illusionist ilUZ~@st
+illusionist's ilUZ~@sts
+illusionists ilUZ~@s
+illusionists ilUZ~@ss
+illusionists ilUZ~@sts
+illusions ilUZ~z
+illusive ilUs6v
+illusory ilUsP/
+illustrate il@strAt
+illustrated il@strAt@d
+illustrates il@strAts
+illustrating il@strAt6N
+illustration il@strAS~
+illustrations il@strAS~z
+illustrative ilustr@t6v
+illustrator il@strAtP
+illustrators il@strAtPz
+illustrious @lustr/@s
+illyrian @lir/~
+ilo Il]
+ilona ilOn@
+ilopango El]paNg]
+ilsa ils@
+ilse ils
+ilsley ilzl/
+ilva ilv@
+ilya ily@
+ilyaronoff ilyor{n{f
+im im
+image im@j
+imageries im6jr/z
+imagery im@jr/
+images im@j@z
+imaginable imaj~@b@l
+imaginary imaj~er/
+imagination imaj~AS~
+imaginations imaj~AS~z
+imaginative imaj~@t6v
+imaginatively imaj~@t6vl/
+imagine imaj~
+imagined imaj~d
+imagineer imaj~ir
+imagineering imaj~ir6N
+imagines imaj~z
+imaging im6j6N
+imagining imaj~6N
+imai imI
+imam Imam
+imamura imomqr@
+iman Im~
+imari /m)r/
+imasco imas]
+imax Imaks
+imax' Imaks
+imax's Imaks@z
+imbalance imbal~s
+imbalances imbal~s@z
+imbecile imb@s@l
+imbecile imb@sIl
+imbed imbed
+imbedded imbed@d
+imber imbP
+imbibe imbIb
+imbibed imbIbd
+imboden imb]d~
+imbroglio imbrOly]
+imbrogno imbrOgn]
+imbue imbyU
+imbued imbyUd
+imburgia imbPg/@
+imcera ims,r@
+imel im@l
+imelda imeld@
+imes Imz
+imhof imh@f
+imhoff imh{f
+imig im6g
+imitable im@t@b@l
+imitate im@tAt
+imitated im@tAt@d
+imitates im@tAts
+imitating im@tAt6N
+imitation im@tAS~
+imitations im@tAS~z
+imitative im@tAt6v
+imitator im@tAtP
+imitators im@tAtPz
+imlay imlA
+imler imlP
+imm Iemem
+imm im
+immaculate imakyUl@t
+immaculately imaky@l@tl/
+immanence im~~s
+immanent im~~t
+immanuel im~ql
+immaterial im@tir/@l
+immature im@tyqr
+immaturity im@Cqr@t/
+immeasurable imeZPab@l
+immeasurably imeZPabl/
+immediacy imEd/@s/
+immediate imEd/@t
+immediately imEd/@tl/
+immel im@l
+immemorial im}{r/@l
+immense imens
+immensely imensl/
+immerman imPm~
+immerse imVs
+immersed imVst
+immersion imVZ~
+immigrant im@gr~t
+immigrant's im@gr~ts
+immigrants im@gr~ts
+immigrants' im6gr~ts
+immigrate im@grAt
+immigrated im@grAt@d
+immigration im@grAS~
+imminence im~~s
+imminent im~~t
+imminently im~~tl/
+immiscible imis@b@l
+immobile imOb@l
+immobile imObEl
+immobile imObIl
+immobility im]bil@t/
+immobilize imOb@lIzz
+immobilized imOb@lIzd
+immobilizing imOb@lIz6N
+immoral im{r@l
+immorality imPal@t/
+immortal im{rt@l
+immortality im{rtal@t/
+immortalize im{rt@lIz
+immortalized im{rt@lIzd
+immortalizes im{rt@lIz@z
+immortalizing im{rt@lIz6N
+immortals im{rt@lz
+immotile imOt@l
+immovable imUv@b@l
+immulogic imyUloj6k
+immune imyUn
+immunetech imyUntek
+immunex imyUncks
+immunities imyUn@t/z
+immunity imyUn@t/
+immunization imyUn@zAS~
+immunizations imyUn@zAS~z
+immunize imyUnIz
+immunized imy~Izd
+immunizes imy~Iz@z
+immunizing imy~Iz6N
+immuno imyUn]
+immunodeficiency imyUn]difiS~s/
+immunological imyUn@loj6k@l
+immunologist imyUnol@j@st
+immunology imyUnol@j/
+immunomedic imyUn]med6k
+immunomedics imyUn]med6ks
+immunotherapy imyUn]T,r@p/
+immutable imyUt@b@l
+imnet imnet
+imo IemO
+imo Im]
+imogen im@g~
+imogene im@jEn
+imondi imOnd/
+imp imp
+impact impakt
+impact impakt
+impacted impakt@d
+impacted impakt@d
+impacting impakt6N
+impacts impaks
+impacts impaks
+impacts impakts
+impacts impakts
+impair imp,r
+impaired imp,rd
+impairing imp,r6N
+impairment imp,rm~t
+impairments imp,rm~ts
+impairs imp,rz
+impala impol@
+impale impAl
+impaled impAld
+impanel impan@l
+impaneled impan@ld
+impart imp)rt
+imparted imp)rt@d
+impartial imp)rS@l
+impartiality imporS/al@t/
+impartially imp)rS@l/
+imparting imp)rt6N
+imparts imp)rts
+impassable impas@b@l
+impasse impas
+impasse impas
+impassion impaS~
+impassioned impaS~d
+impassive impas6v
+impassively impas6vl/
+impastato impostot]
+impatience impAS~s
+impatiens impAS~z
+impatient impAS~t
+impatiently impAS~tl/
+impeach impEC
+impeachable impEC@b@l
+impeached impECt
+impeaches impEC@z
+impeaching impEC6N
+impeachment impECm~t
+impeachments impECm~ts
+impeccable impek@b@l
+impeccably impek@bl/
+impedance impEd~s
+impede impEd
+impeded impEd@d
+impedes impEdz
+impediment imped}~t
+impediments imped}~ts
+impeding impEd6N
+impel impel
+impelled impeld
+impend impend
+impending impend6N
+impenetrable impen@tr@b@l
+imperative imp,r@t6v
+imperatives imp,r@t6vz
+imperato impPot]
+imperceptible impPsept@b@l
+imperceptibly impPsept@bl/
+imperfect impVf6kt
+imperfection impPfekS~
+imperfections impPfekS~z
+imperfectly impVf6ktl/
+imperia impEr/@
+imperial impir/@l
+imperial's impir/@lz
+imperiale impP/ol/
+imperialism impir/@liz}
+imperialist impir/@l@st
+imperialistic impEr/@list6k
+imperialists impir/@l@s
+imperialists impir/@l@ss
+imperialists impir/@l@sts
+imperil imp,r@l
+imperiled imp,r@ld
+imperiling imp,r@l6N
+imperils imp,r@lz
+imperious impir/@s
+impermissible impPmis@b@l
+impersonal impVs~@l
+impersonality impVs~al@t/
+impersonate impVs~At
+impersonated impVs~At@d
+impersonating impVs~At6N
+impersonation impPs~AS~
+impersonator impVs~AtP
+impersonators impVs~AtPz
+impertinent impVt~~t
+impervious impVv/@s
+impetuous impeCw@s
+impetus imp@t@s
+impinge impinj
+impinges impinj@z
+impish impiS
+implacable implak@b@l
+implant implant
+implant implant
+implantable implant@b@l
+implantation implantAS~
+implanted implant@d
+implanting implant6N
+implants implants
+implants implants
+implausible impl{z@b@l
+implausibly impl{z@bl/
+implement impl}~t
+implementation impl}cntAS~
+implemented impl}en@d
+implemented impl}ent@d
+implementing impl}en6N
+implementing impl}ent6N
+implements impl}~ts
+implicate impl6kAt
+implicated impl6kAt@d
+implicates impl6kAts
+implicating impl6kAt6N
+implication impl@kAS~
+implications impl@kAS~z
+implicit implis@t
+implicitly implis@tl/
+implied implId
+implies implIz
+implode implOd
+imploded implOd@d
+implodes implOdz
+imploding implOd6N
+implore impl{r
+implored impl{rd
+implores impl{rz
+imploring impl{r6N
+implosion implOZ~
+imply implI
+implying implI6N
+impolite imp@lIt
+impolitic imp{litik
+imponderable impondP@b@l
+imponderables impondP@b@lz
+import imp{rt
+import imp{rt
+importance imp{rt~s
+important imp{rt~t
+importantly imp{rt~tl/
+importation imp{rtAS~
+imported imp{rt@d
+importer imp{rtP
+importers imp{rtPz
+importers' imp{rtPz
+importing imp{rt6N
+imports imp{rts
+imports imp{rts
+imports' imp{rts
+impose impOz
+imposed impOzd
+imposes impOz@z
+imposing impOz6N
+imposition imp@ziS~
+impossibility imp{s@bil@t/
+impossible impos@b@l
+impossible's impos@b@lz
+impossibly impos@bl/
+imposter imp{stP
+impostor imp{stP
+impostors imp{stPz
+impotence imp@t~s
+impotent imp@t~t
+impound imp?nd
+impounded imp?nd@d
+impoundment imp?ndm~t
+impoundments imp?ndm~ts
+impoverish impovr6S
+impoverished impovr6St
+impoverishes impovr6S@z
+impoverishment impovr6Sm~t
+impracticable imprakt6k@b@l
+impractical imprakt@k@l
+imprecise impr@sIs
+impregnable impregn@b@l
+impregnate impregnAt
+impregnated impregnAt@d
+impregnation impregnAS~
+impresario imprcs)r/O
+impress impres
+impress impres
+impressed imprest
+impresses impres@z
+impressing impres6N
+impression impreS~
+impressionable impreS~@b@l
+impressionism impreS~iz}
+impressionist impreS~@st
+impressionistic impreS~ist6k
+impressionists impreS~@s
+impressionists impreS~@ss
+impressionists impreS~@sts
+impressions impreS~z
+impressive impres6v
+impressively impres6vl/
+impressment impresm~t
+imprimatur imprimotP
+imprimis imprEmis
+imprint imprint
+imprint imprint
+imprinted imprin@d
+imprinted imprint@d
+imprinting imprin6N
+imprinting imprint6N
+imprints imprints
+imprison impriz~
+imprisoned impriz~d
+imprisoning impriz~6N
+imprisonment impriz~m~t
+improbable improb@b@l
+improbably improb@bl/
+impromptu impromptU
+improper impropP
+improperly impropPl/
+improprieties impr@prI@t/z
+impropriety impr@prI@t/
+improv improv
+improve imprUv
+improved imprUvd
+improvement imprUvm~t
+improvements imprUvm~ts
+improves imprUvz
+improving imprUv6N
+improvisation improv@zAS~
+improvisational improv@zAS~@l
+improvisations improv@zAS~z
+improvise impr@vIz
+improvise impr@vIz
+improvised impr@vIzd
+improvising impr@vIz6N
+imprudence imprUd~s
+imprudent imprUd~t
+imprudently imprUd~tl/
+impson imps~
+impugn impyUn
+impugned impyUnd
+impugning impyUn6N
+impulse imp@ls
+impulse impuls
+impulses imp@ls@z
+impulses impuls@z
+impulsive impuls6v
+impulsively impuls6vl/
+impunity impyUn@t/
+impure impyqr
+impurities impyqr@t/z
+impurity impyqr@t/
+imputation impy@tAS~
+impute impyUt
+imputed impyUt@d
+imre imr@
+imreg imreg
+imreg's imregz
+imrie imP/
+imus Im@s
+in in
+in ~
+in. in
+in. inC
+ina En@
+inability in@bil@t/
+inabinet in@bin@t
+inaccessibility in@kses@bil@t/
+inaccessible in@kses@b@l
+inaccuracies inakyPas/z
+inaccuracy inakyP@s/
+inaccurate inakyP@t
+inaccurately inakyP@tl/
+inacom In@kom
+inacom in@kom
+inacomp In@komp
+inacomp in@komp
+inaction inakS~
+inactivate inakt6vAt
+inactivated inakt6vAt@d
+inactivation inakt6vAS~
+inactive inakt6v
+inactivity inaktiv@t/
+inadequacies inad@kw@s/z
+inadequacy inad6kw@s/
+inadequate inad@kw@t
+inadequate inad@kwAt
+inadequately inad@kw@tl/
+inadmissible in@dmis@b@l
+inadmissible inadmis@b@l
+inadvertence in@dvVt~s
+inadvertence inadvVt~s
+inadvertent in@dvVt~t
+inadvertent inadvVt~t
+inadvertently in@dvVt~tl/
+inadvertently inadvVt~tl/
+inadvisable in@dvIz@b@l
+inadvisable inadvIz@b@l
+inaez inAz
+inaez inaz
+inalienable inAly~@b@l
+inamura in}qr@
+inane inAn
+inanimate inan}@t
+inapplicable inapl6k@b@l
+inappropriate in@prOpr/@t
+inappropriately in@propr/@tl/
+inarticulate inortiky@l@t
+inasmuch inasm@k
+inattention in@tenC~
+inattentive in@tent6v
+inaudible in{d@b@l
+inaugural in{gP@l
+inaugural in{gyP@l
+inaugurate in{gyP@t
+inaugurate in{gyPAt
+inaugurated in{gPAt@d
+inaugurated in{gyPAt@d
+inaugurates in{gyP@ts
+inaugurates in{gyPAts
+inaugurating in{gyPAt6N
+inauguration in{gyPAS~
+inaugurations in{gyPAS~z
+inauspicious in?spiS@s
+inbio inbI]
+inboard inb{rd
+inboden inb]d~
+inbody inbod/
+inborn inb{rn
+inbound inb?nd
+inbred inbred
+inbreed inbrEd
+inbreeding inbrEd6N
+inc iNk
+inc. iNk
+inc. iNk{rp{rAt@d
+inc.'s iNks
+inca iNk@
+incalculable inkalky@l@b@l
+incandescent ink~des~t
+incant inkant
+incantation ink~tAS~
+incantatory inkant@t{r/
+incapable inkAp@b@l
+incapacitate ink@pas@tAt
+incapacitated ink@pas@tAt@d
+incapacitating ink@pas@tAt6N
+incapacitation ink@pas@tAS~
+incapacity ink@pas@t/
+incarcerate ink)rsPAt
+incarcerated ink)rsPAt@d
+incarcerating ink)rsPAt6N
+incarceration inkorsPAS~
+incarnate ink)rn@t
+incarnate ink)rnAt
+incarnation ink)rnAS~
+incarnations inkornAS~z
+incas iNk@z
+incase inkAs
+incata iNkot@
+incata's iNkot@z
+ince ins
+incendiary insend/cr/
+incense insens
+incense insens
+incensed insenst
+incentive insen6v
+incentive insent6v
+incentives insent6vz
+incentives insin6vz
+inception insepS~
+incessant inses~t
+incessantly inses~tl/
+incest insest
+incestuous insesCw@s
+inch inC
+inchcape inCkAp
+inched inCt
+inches inC@z
+inches' inC@z
+inching inC6N
+inchon inCon
+inchon inC~
+incidence ins@d~s
+incidences ins@d~s@z
+incident ins@d~t
+incidental ins@dent@l
+incidentally ins@dent@l/
+incidentally ins@dentl/
+incidentals ins@dent@lz
+incidents ins@d~ts
+incinerate insinPAt
+incinerated insinPAt@d
+incinerating insinPAt6N
+incineration insinPAS~
+incinerator insinPAtP
+incinerators insinPAtPz
+incipient insip/~t
+incirlik insVl6k
+incise insIz
+incised insIzd
+incision insiZ~
+incisions insiZ~z
+incisive insIs6v
+incisor insIzP
+incisors insIzPz
+incite insIt
+incited insIt@d
+incitement insItm~t
+incitements insItm~ts
+incites insIts
+inciting insIt6N
+incivility ins6vil@t/
+inclement inklem~t
+inclement inkl}~t
+inclination inkl~AS~
+inclinations inkl~AS~z
+incline inklIn
+incline inklIn
+inclined inklInd
+inclines inklInz
+inclines inklInz
+inclosure inklOZP
+include inklUd
+included inklUd@d
+includes inklUdz
+including inklUd6N
+inclusion inklUZ~
+inclusions inklUZ~z
+inclusive inklUs6v
+inclusiveness inklUs6vn@s
+inco inkO
+inco's iNk]z
+incognito ink{gnEt]
+incoherence ink]hir~s
+incoherent ink]hir~t
+incoherently ink]hir~tl/
+incom iNkom
+income inkum
+incomes inkumz
+incoming inkum6N
+incommunicado ink}yUn@kod]
+incomparable inkompP@b@l
+incomparably inkompP@bl/
+incompatibility inkomp@t@bil@t/
+incompatible ink}pat@b@l
+incompetence inkomp@t~s
+incompetency inkomp@t~s/
+incompetent inkomp@t~t
+incompetently inkomp@t~tl/
+incompetents iNkomp@t~ts
+incomplete ink}plEt
+incomprehensible iNkompr@hens@b@l
+incompressible ink}pres@b@l
+inconceivable ink~sEv@b@l
+inconclusive ink~klUs6v
+inconclusively iNkonklUs6vl/
+incongruity iNk{NrU@t/
+incongruous iNk{NrU@s
+incongruously iNk{NrU@sl/
+inconsequential iNkons@kwenC@l
+inconsistencies iNkonsistens/z
+inconsistency ink~sist~s/
+inconsistent ink~sist~t
+inconspicuous iNkonsp6kw@s
+inconstancy inkonst~s/
+incontinence inkont~~s
+incontinent inkont~~t
+incontrovertible iNkontr]vVt@b@l
+inconvenience ink~vEny~s
+inconvenienced ink~vEny~st
+inconveniences ink~vEny~s@z
+inconvenient ink~vEny~t
+incoordination ink]{rd~AS~
+incorporate ink{rpPAt
+incorporated ink{rpPAt@d
+incorporated's ink{rpPAt@dz
+incorporates ink{rpPAts
+incorporating ink{rpPAt6N
+incorporation ink{rpPAS~
+incorporation's ink{rpPAS~z
+incorporations ink{rpPAS~z
+incorrect inkPekt
+incorrectly inkPektl/
+incorrigible ink)r@j@b@l
+incorvaia ink{rvoy@
+increase inkrEs
+increase inkrEs
+increased inkrEst
+increased inkrEst
+increases inkr/s@z
+increases inkrEs@z
+increasing inkrEs6N
+increasingly inkrEs6Ngl/
+increasingly inkrEs6Nl/
+incredible inkred@b@l
+incredibly inkred@bl/
+incredulity inkr@dUl@t/
+incredulous inkrej@l@s
+increment inkr}~t
+incremental inkr}en@l
+incremental inkr}ent@l
+incrementalism inkr}en@liz}
+incrementalism inkr}ent@liz}
+incrementally inkr}en@l/
+incrementally inkr}ent@l/
+increments iNkr}~ts
+incriminate inkrim~At
+incriminating inkrim~At6N
+incrimination inkrim~AS~
+incrust inkrust
+incrustation inkr@stAS~
+incstar iNkstor
+incubate inky@bAt
+incubating inky@bAt6N
+incubation iNkyUbAS~
+incubator iNky@bAtP
+incubators iNkyUbAtPz
+inculcate iNk@lkAt
+inculcated iNk@lkAt@d
+inculcates iNk@lkAts
+incumbency inkumb~s/
+incumbent inkumb~t
+incumbent's inkumb~ts
+incumbents inkumb~ts
+incur inkV
+incurable inkyqr@b@l
+incurred inkVd
+incurring inkV6N
+incurs inkVz
+incursion inkVZ~
+incursions inkVZ~z
+inda End@
+indaba indob@
+indal ind@l
+indata indot@
+indebted indet@d
+indebtedness indet@dn@s
+indecency indEs~s/
+indecent indEs~t
+indecision ind@siZ~
+indecisive ind@sIs6v
+indecisiveness indesIs6vn@s
+indeed indEd
+indefatigable ind@fat6g@b@l
+indefensible ind@fens@b@l
+indefinable ind@fIn@b@l
+indefinite indef~@t
+indefinitely indef~@tl/
+indelible indel@b@l
+indelibly indel@bl/
+indelicate indel6k@t
+indelicato indcl/kot]
+indemnification indemn@f6kAS~
+indemnified indemn@fId
+indemnify indemn@fI
+indemnifying indemn@fI6N
+indemnities indemn@t/z
+indemnity indemn@t/
+indent indent
+indentation indentAS~
+indenture indenCP
+indentured indenCPd
+indentures indenCPz
+independence ind@pend~s
+independence's ind@pend~s@z
+independent ind@pend~t
+independently ind@pend~tl/
+independents ind@pend~ts
+inderal indP@l
+indescribable ind@skrIb@b@l
+indestructibility ind@strukt@bil@t/
+indestructible ind@strukt@b@l
+indeterminate ind@tVm~@t
+index indcks
+index's indcks@z
+indexation indeksAS~
+indexed indckst
+indexer indeksP
+indexers indeksPz
+indexes indcks@z
+indexing indcks6N
+india ind/@
+india's ind/@z
+indian ind/~
+indian's ind/~z
+indiana ind/an@
+indiana's ind/an@z
+indianapolis ind/~ap@lis
+indianapolis's ind/~ap@lis@z
+indianian ind/an/~
+indianians ind/an/~z
+indianola ind/~Ol@
+indians ind/~z
+indians' ind/~z
+indic ind6k
+indicate ind@kAt
+indicated ind@kAt@d
+indicates ind6kAts
+indicating ind@kAt6N
+indication ind@kAS~
+indications ind@kAS~z
+indicative indik@t6v
+indicator ind@kAtP
+indicators ind@kAtPz
+indices ind@sEz
+indicia indisy@
+indict indIt
+indicted indIt@d
+indicting indIt6N
+indictment indItm~t
+indictments indItm~ts
+indies ind/z
+indifference indifP~s
+indifference indifr~s
+indifferent indifP~t
+indifferent indifr~t
+indigenous indij~@s
+indigenously indij~@sl/
+indigent ind6j~t
+indigents ind6j~ts
+indigest indIjest
+indigestion indIjesC~
+indignant indign~t
+indignantly indign~tl/
+indignation ind6gnAS~
+indignities indign@t/z
+indignity indign@t/
+indigo ind@gO
+indira indir@
+indirect indPekt
+indirectly indPekl/
+indirectly indPektl/
+indiscreet ind@skrEt
+indiscretion ind@skreS~
+indiscretions ind@skreS~z
+indiscriminate ind@skrim~@t
+indiscriminately ind@skrim~@tl/
+indispensable ind@spens@b@l
+indisputable ind@spyUt@b@l
+indisputably ind@spyUt@bl/
+indistinct ind@stiNkt
+indistinguishable ind@stiNgw6S@b@l
+indite indIt
+indited indIt@d
+indium ind/}
+individual ind@vij@w@l
+individual's ind@vij@w@lz
+individualism ind6v@dU@liz}
+individualist ind6v@dU@l@st
+individualistic ind6vijU@list6k
+individualists ind@vijU@l@s
+individualists ind@vijU@l@ss
+individualists ind@vijU@l@sts
+individuality indiv6jUal@t/
+individualize ind6vij@lIz
+individualize ind6vijU@lIz
+individualized ind6vij@lIzd
+individualized ind6vijU@lIzd
+individually ind6vij@l/
+individually ind6vijU@l/
+individuals ind@vij@w@lz
+individuals' ind6vij@w@lz
+indivisible ind6viz@b@l
+indo ind]
+indo-european ind]yqr@pE~
+indochina ind]CIn@
+indochinese ind]CInEz
+indoctrinate indoktr~At
+indoctrinated indoktr~At@d
+indoctrination indoktr~AS~
+indolent ind@l~t
+indomitable indom@t@b@l
+indonesia ind]nEZ@
+indonesia's ind]nEZ@z
+indonesian ind]nEZ~
+indonesians ind]nEZ~z
+indoor ind{r
+indoors ind{rz
+indosuez ind]sUAz
+indosuez ind]sUcz
+indovina ind]vEn@
+indri indrE
+induce indUs
+induced indUst
+inducement indUsm~t
+inducements indUsm~ts
+induces indUs@z
+inducing indUs6N
+induct indukt
+inductance indukt~s
+inducted indukt@d
+inductee induktE
+inductees induktEz
+induction indukS~
+inductor induktP
+indulge indulj
+indulged induljd
+indulgence indulj~s
+indulgences indulj~s@z
+indulgent indulj~t
+indulges indulj@z
+indulging indulj6N
+indus ind@s
+industri industr/
+industria industr/@
+industrial industr/@l
+industrial's industr/@lz
+industriale ind@str/ol/
+industriali industr/ol/
+industrialist industr/@l@st
+industrialists industr/@l@s
+industrialists industr/@l@ss
+industrialists industr/@l@sts
+industrialization industr/@l@zAS~
+industrialize industr/@lIz
+industrialized industr/@lIzd
+industrializing industr/@lIz6N
+industrially industr/@l/
+industrials industr/@lz
+industrials' industr/@lz
+industrie ind@str/
+industrielle industr/@le
+industrielle industr/el
+industrier ind@strEP
+industries ind@str/z
+industries' ind@str/z
+industrious industr/@s
+industrivaerden ind@str/verd~
+industry ind@str/
+industry's ind@str/z
+industrywide ind@str/wId
+indy ind/
+indyk ind6k
+inedible ined@b@l
+ineffable inef@b@l
+ineffective in@fekt6v
+ineffectiveness in@fekt6vn@s
+ineffectual in@fekCU@l
+inefficiencies in@fiS~s/z
+inefficiency in@fiS~s/
+inefficient in@fiS~t
+inefficiently in@fiS~tl/
+inelastic in@last6k
+ineligible inel6j@b@l
+inept inept
+ineptitude inept@tUd
+ineptly ineptl/
+ineptness ineptn@s
+inequalities in/kwol@t/z
+inequalities in6kwol@t/z
+inequality in/kwol@t/
+inequality in6kwol@t/
+inequitable inekw@t@b@l
+inequities inekw@t/z
+inequity inekw@t/
+inerco inVk]
+inert inVt
+inertia inVS@
+inertial inVS@l
+inertness inVtn@s
+ines inis
+inescapable in@skAp@b@l
+inevitability inev@t@bil@t/
+inevitable inev@t@b@l
+inevitably inev@t@bl/
+inexact in6gzakt
+inexcusable in6kskyUz@b@l
+inexhaustible in6gz{st@b@l
+inexorable ineksP@b@l
+inexorably ineksP@bl/
+inexpensive in6kspens6v
+inexpensively in@kspens6vl/
+inexperience in6kspir/~s
+inexperienced in6kspir/~st
+inexplicable in@ksplis@b@l
+inexplicably in6ksplik@bl/
+inextricably inekstr6k@bl/
+inez inez
+infallibility infal@bil@t/
+infallible infal@b@l
+infamous inf}@s
+infamy inf}/
+infancy inf~s/
+infant inf~t
+infant's inf~ts
+infante infontA
+infanticide infant@sId
+infantile inf~t@l
+infantino infontEn]
+infantry inf~tr/
+infantryman infantr/m~
+infantrymen infantr/mcn
+infants inf~ts
+infants' inf~ts
+infarction inf)rkS~
+infatuate infaCUAt
+infatuated infaCUAt@d
+infatuating infaCUAt6N
+infatuation infaCUAS~
+infeasible infEz@b@l
+infect infekt
+infected infekt@d
+infecting infekt6N
+infection infekS~
+infections infekS~z
+infectious infekS@s
+infective infekt6v
+infects infekts
+infer infV
+inference infP~s
+inferences infPens@z
+inferior infir/P
+inferiority inf6r/{r@t/
+infernal infVn@l
+inferno infVn]
+inferred infVd
+inferring infV6N
+infers infVz
+infertile infVt@l
+infertility infPtil@t/
+infest infest
+infestation infestAS~
+infestations infestAS~z
+infested infest@d
+infests infes
+infests infess
+infests infests
+infidel inf@del
+infidelities inf@del@t/z
+infidelity inf@del@t/
+infidels inf@dclz
+infield infEld
+infielder infEldP
+infielders infEldPz
+infighting infIt6N
+infiltrate inf@ltrAt
+infiltrate infiltrAt
+infiltrated inf@ltrAt@d
+infiltrated infiltrAt@d
+infiltrating infiltrAt6N
+infiltration inf@ltrAS~
+infiltrator inf@ltrAtP
+infiltrators inf@ltrAtPz
+infinger inf6NP
+infinite inf~@t
+infinitely inf~@tl/
+infinitesimal infin@tes}@l
+infiniti infin@t/
+infinitive infin@t6v
+infinitum infin@t}
+infinity infin@t/
+infirm infVm
+infirmary infVmP/
+infirmed infVmd
+infirmities infVm@t/z
+infirmity infVm@t/
+inflame inflAm
+inflamed inflAmd
+inflames inflAmz
+inflaming inflAm6N
+inflammable inflam@b@l
+inflammation infl}AS~
+inflammatory inflam@t{r/
+inflatable inflAt@b@l
+inflate inflAt
+inflated inflAt@d
+inflates inflAts
+inflating inflAt6N
+inflation inflAS~
+inflation's inflAS~z
+inflationary inflAS~er/
+inflator inflAtP
+inflect inflekt
+inflected inflekt@d
+inflection inflekS~
+inflections inflekS~z
+inflexibility infleks@bil@t/
+inflexible infleks@b@l
+inflict inflikt
+inflicted inflikt@d
+inflicting inflikt6N
+infliction inflikS~
+inflicts infliks
+inflicts inflikts
+inflight inflIt
+inflow inflO
+inflows inflOz
+influence inflU~s
+influenced inflU~st
+influences inflU~s@z
+influencing inflU~s6N
+influential inflUenC@l
+influenza inflUenz@
+influx influks
+info inf]
+infocorp inf]k{rp
+infomercial inf]mVS@l
+infomercial's inf]mVS@lz
+infomercials inf]mVS@lz
+inform inf{rm
+informal inf{rm@l
+informality infPmal@t/
+informally inf{rm@l/
+informals inf{rm@lz
+informant inf{rm~t
+informants inf{rm~ts
+informatic infPmat6k
+informatic inf{rmat6k
+informatics infPmat6ks
+informatics inf{rmat6ks
+information infPmAS~
+information inf{rmAS~
+information's infPmAS~z
+information's inf{rmAS~z
+informational infPmAS~@l
+informational inf{rmAS~@l
+informations infPmAS~z
+informations inf{rmAS~z
+informative inf{rm@t6v
+informed inf{rmd
+informer inf{rmP
+informers inf{rmPz
+informing inf{rm6N
+informix inf{rm6ks
+informs inf{rmz
+infoscan inf]skan
+infotainment inf]tAnm~t
+infotech inf]tek
+infotechnology inf]tcknol@j/
+infotron inf]tron
+infotron's inf]tronz
+infoworld inf]wVld
+infra infr@
+infraction infrakS~
+infractions infrakS~z
+infrared infrPed
+infrastructural infr@strukCP@l
+infrastructure infr@strukCP
+infrastructures infr@strukCPz
+infrequency infrEkw~s/
+infrequent infrEkw~t
+infrequently infrEkw~tl/
+infringe infrinj
+infringed infrinjd
+infringement infrinjm~t
+infringements infrinjm~ts
+infringes infrinj@z
+infringing infrinj6N
+infuriate infyqr/At
+infuriated infyqr/At@d
+infuriates infyqr/Ats
+infuriating infyqr/At6N
+infuse infyUz
+infused infyUzd
+infuses infyUz@z
+infusing infyUz6N
+infusion infyUZ~
+infusions infyUZ~z
+ing iN
+inga ENg@
+ingalls 6Ng{lz
+ingalsbe iNg@lsb/
+ingar iNgP
+ingber iNbP
+inge inj
+ingelheim iNg@lhIm
+ingels iNg@lz
+ingemar iNgcmor
+ingenious injEny@s
+ingeniously injEny@sl/
+ingenito iNgcnEt]
+ingenue injenyU
+ingenue inj~U
+ingenue onj~U
+ingenuity inj~U@t/
+ingenuous injenyU@s
+inger iNP
+ingersoll iNgPs{l
+ingerson iNgPs~
+ingest injest
+ingested injest@d
+ingesting injest6N
+ingestion injesC~
+ingham iN}
+inghram iNgram
+ingimarson iN}ors~
+ingle iNg@l
+inglebert iNg@lbPt
+inglenook iNg@lnqk
+ingles iNg@lz
+inglese iNgl/z
+inglett iNglet
+inglewood iNg@lwqd
+inglis iNglis
+inglish iNg@l6S
+inglorious ingl{r/@s
+ingman iNm~
+ingmar iNmor
+ingmire iNmIr
+ingo iNg]
+ingoglia 6NgOgl/@
+ingold iNg]ld
+ingot iNg@t
+ingots iNg@ts
+ingraham iNgr@ham
+ingrain ingrAn
+ingrained ingrAnd
+ingram iNgr}
+ingrao ENgr?
+ingrassia 6NgroS@
+ingratiate 6NgrAS/At
+ingratiating 6NgrAS/At6N
+ingredient 6NgrEd/~t
+ingredients 6NgrEd/~ts
+ingria iNgr/@
+ingrid iNgr@d
+ingrum iNgr}
+ingvar iNvor
+ingwersen iNgwPs~
+inhabit inhab@t
+inhabitant inhab@t~t
+inhabitants inhab@t~s
+inhabitants inhab@t~ts
+inhabitation inhab@tAS~
+inhabited inhab@t@d
+inhabiting inhab@t6N
+inhabits inhab@ts
+inhalable inhAl@b@l
+inhalant inhAl~t
+inhalants inhAl~ts
+inhalation in@lAS~
+inhalation inh@lAS~
+inhale inhAl
+inhaled inhAld
+inhaler inhAlP
+inhaling inhAl6N
+inherent inh,r~t
+inherent inhir~t
+inherently 6nh,r~tl/
+inherently 6nhir~tl/
+inherit inh,r@t
+inheritable inh,r@t@b@l
+inheritance inh,r@t~s
+inherited inh,r@t@d
+inheriting inh,r@t6N
+inheritor inh,r@tP
+inherits inh,r@ts
+inhibit inhib@t
+inhibited inhib@t@d
+inhibiting inhib@t6N
+inhibition in@biS~
+inhibition inh@biS~
+inhibitions in@biS~z
+inhibitions inh@biS~z
+inhibitor inhib@tP
+inhibitors inhib@tPz
+inhibitory inhib@t{r/
+inhibits inhib@ts
+inhofe inhOf
+inhofe inho
+inhofe's inhOfs
+inhofe's inhofs
+inhospitable inhosp@t@b@l
+inhospitable inhospit@b@l
+inhouse inh?s
+inhuman inhyUm~
+inhumane inhyUmAn
+inhumanity inhyUman@t/
+iniga inEg@
+iniguez inEgcz
+iniki EnEk/
+inikpratt inEkprat
+inimical inim6k@l
+inimitable inim@t@b@l
+iniss inis
+initial iniS@l
+initialed iniS@ld
+initialing iniS@l6N
+initially iniS@l/
+initials iniS@lz
+initiate iniS/At
+initiated iniS/At@d
+initiates iniS/@ts
+initiating iniS/At6N
+initiation iniS/AS~
+initiative iniS@t6v
+initiatives iniS@t6vz
+initiator in6SEAtP
+initiators iniS/AtPz
+initio iniS/]
+initio init/]
+iniziativa inizE@tEv@
+inject injekt
+injectable injekt@b@l
+injected injekt@d
+injecting injekt6N
+injection injekS~
+injections injekS~z
+injector injektP
+injectors injektPz
+injects injekts
+injudicious injudiS@s
+injunction injuNS~
+injunction injuNkS~
+injunctions injuNS~z
+injunctions injuNkS~z
+injunctive injuNkt6v
+injunctive injuNt6v
+injure injP
+injured injPd
+injures injPz
+injuries injP/z
+injuring injP6N
+injurious injqr/@s
+injury injP/
+injustice injust@s
+injustices injust@s@z
+ink iNk
+inkatha 6NkaT@
+inkatha 6Nkot@
+inkatha 6Nkotu
+inkatha's 6NkaT@z
+inkatha's 6Nkot@z
+inkatha's 6Nkotuz
+inkblot iNkblot
+inkjet iNkjet
+inkling iNkl6N
+inks iNks
+inky iNk/
+inlaid inlAd
+inland inland
+inland's inl~dz
+inlaw inl{
+inlaw inl{
+inlaws inl{z
+inlaws inl{z
+inlay inlA
+inlet inlet
+inlets inlets
+inlow inlO
+inmac inmak
+inman inm~
+inman's inm~z
+inmarsat inm)rsat
+inmate inmAt
+inmate's inmAts
+inmates inmAts
+inmex inmeks
+inmobiliaria inmOb@l/,r/@
+inmon inm~
+inmont inmont
+inn in
+inn's inz
+innard inPd
+innards inPdz
+innate inAt
+innately inAtl/
+inner inP
+innermost inPmOst
+innerspace inPspAs
+innes in@s
+inness in@s
+inning in6N
+innings in6Nz
+innis inis
+inniss inis
+innkeeper inkEpP
+innkeepers inkEpPz
+inno in]
+innocence in@s~s
+innocent in@s~t
+innocenti in]Cent/
+innocently in@s~tl/
+innocents in@s~ts
+innocuous inokyU@s
+innominate inom~@t
+innopac in@pak
+innovate in@vAt
+innovate in]vAt
+innovated in@vAt@d
+innovated in]vAt@d
+innovating in@vAt6N
+innovating in]vAt6N
+innovation in@vAS~
+innovation in]vAS~
+innovations in@vAS~z
+innovations in]vAS~z
+innovative in@vAt6v
+innovative in]vAt6v
+innovator in@vAtP
+innovator in]vAtP
+innovators in@vAtPz
+innovators in]vAtPz
+inns inz
+inns' inz
+innuendo inyUend]
+innuendoes inyUend]z
+innuendos inyUend]z
+innumerable inUmP@b@l
+inocencio in]CenC/]
+inoculate inoky@lAt
+inoculated inoky@lAt@d
+inoculation inoky@lAS~
+inoculations inoky@lAS~z
+inoffensive in@fens6v
+inoperable inopP@b@l
+inoperative inopP@t6v
+inopportune inopPtUn
+inordinate in{rd~@t
+inordinately in{rd~@tl/
+inorganic in{rgan6k
+inoue inOA
+inouye inUA
+inpatient inpAS~t
+inpatients inpAS~ts
+input inpqt
+inputs inpqts
+inquest inkwest
+inquire inkwIr
+inquired inkwIPd
+inquirer inkwIrP
+inquires inkwIPz
+inquiries inkwIP/z
+inquiries inkwP/z
+inquiring inkwIP6N
+inquiry inkwIr/
+inquiry inkwPr/
+inquisition inkw@ziS~
+inquisitive inkwiz@t6v
+inquisitor inkwiz@tP
+inquisitors inkwiz@tPz
+inroad inrOd
+inroads inrOdz
+ins Ienes
+ins inz
+insalaco insolok]
+insane insAn
+insanity insan@t/
+insatiable insAS@b@l
+inscho inS]
+insco Ensk]
+inscoe inskO
+inscore insk{r
+inscribe inskrIb
+inscribed inskrIbd
+inscription inskripS~
+inscriptions inskripS~z
+inscrutable inskrUt@b@l
+insect insekt
+insect's insekts
+insecticide insekt@sId
+insecticides insekt@sIdz
+insectivorous inscktivP@s
+insects insekts
+insecure ins@kyP
+insecurities ins@kyqr@t/z
+insecurity ins6kyqr@t/
+insel ins@l
+inseminate insem~At
+insemination insem~AS~
+insensitive insens@t6v
+insensitivity insens@tiv@t/
+inseparable insepP@b@l
+inseparably insepP@bl/
+inserra ins,r@
+insert insVt
+insert insVt
+inserted insVt@d
+inserting insVt6N
+insertion insVS~
+inserts insVts
+inserts insVts
+inset inset
+inshore inS{r
+inside insId
+inside insId
+insider insIdP
+insider's insIdPz
+insiders insIdPz
+insiders' insIdPz
+insides insIdz
+insidious insid/@s
+insight insIt
+insightful insItf@l
+insights insIts
+insignia insign/@
+insignificance insignyif6k~s
+insignificant insignyif6k~t
+insilco insilk]
+insincere ins6nsir
+insinuate insinyUAt
+insinuated insinyUAt@d
+insinuates insinyUAts
+insinuating insinyUAt6N
+insinuation insinyUAS~
+insinuations insinyUAS~z
+insist insist
+insisted insist@d
+insistence insist~s
+insistent insist~t
+insistently insist~tl/
+insisting insist6N
+insists insis
+insists insiss
+insists insists
+insituform insitUf{rm
+inskeep inzkEp
+inskip inskip
+insko insk]
+inslaw inslo
+insley insl/
+insofar ins@for
+insolence ins@l~s
+insolent ins@l~t
+insoluble insoly@b@l
+insolvencies insolv~s/z
+insolvency insolv~s/
+insolvent insolv~t
+insomnia insomn/@
+insomniac insomn/ak
+inspect inspekt
+inspected inspekt@d
+inspecting inspekt6N
+inspection inspekS~
+inspections inspekS~z
+inspector inspektP
+inspector's inspektPz
+inspectorate inspektP@t
+inspectors inspektPz
+inspectors' inspektPz
+inspects inspekts
+inspeech inspEC
+inspiration inspPAS~
+inspirational inspPAS~@l
+inspirations inspPAS~z
+inspire inspIr
+inspired inspIPd
+inspires inspIrz
+inspiring inspIP6N
+inspiring inspIr6N
+instabilities inst@bil@t/z
+instability inst@bil@t/
+install inst{l
+installation inst@lAS~
+installations inst@lAS~z
+installed inst{ld
+installer inst{lP
+installers inst{lPz
+installing inst{l6N
+installment inst{lm~t
+installments inst{lm~ts
+installs inst{lz
+instance inst~s
+instances inst~s@z
+instant inst~t
+instantaneous inst~tan/@s
+instantaneously inst~tan/@sl/
+instantly inst~tl/
+instead insted
+instigate inst@gAt
+instigated inst@gAt@d
+instigating inst@gAt6N
+instigation inst6gAS~
+instigator inst@gAtP
+instigators inst@gAtPz
+instill instil
+instilled instild
+instilling instil6N
+instills instilz
+instinct inst6Nkt
+instinctive instiNkt6v
+instinctively instiNkt6vl/
+instincts inst6Nkts
+instinet instinet
+institucional inst@tUs/~al
+institut inst@tUt
+institute inst@tUt
+institute's inst@tUts
+instituted inst@tUt@d
+institutes inst@tUts
+institutes' inst@tUts
+instituting inst@tUt6N
+institution inst@tUS~
+institution's inst@tUS~z
+institutional inst@tUS~@l
+institutionalist inst@tUS~@l@st
+institutionalists inst@tUS~@l@s
+institutionalists inst@tUS~@l@ss
+institutionalists inst@tUS~@l@sts
+institutionalization inst@tUS~@l@zAS~
+institutionalize inst@tUS~@lIz
+institutionalized inst@tUS~@lIzd
+institutionalizes inst@tUS~@lIz@z
+institutionalizing inst@tUS~@lIz6N
+institutionally inst@tUSn@l/
+institutionally inst@tUS~@l/
+institutions inst@tUS~z
+institutions' inst@tUS~z
+instituto inst@tUt]
+instone instOn
+instruct instrukt
+instructed instrukt@d
+instructing instrukt6N
+instruction instrukS~
+instructional instrukS~@l
+instructions instrukS~z
+instructive instrukt6v
+instructor instruktP
+instructors instruktPz
+instructs instrukts
+instrument instr}~t
+instrument's instr}~ts
+instrumental instr}en@l
+instrumental instr}ent@l
+instrumentalist instr}en@l@st
+instrumentalist instr}ent@l@st
+instrumentalists instr}en@l@s
+instrumentalists instr}en@l@ss
+instrumentalists instr}en@l@sts
+instrumentalists instr}ent@l@s
+instrumentalists instr}ent@l@ss
+instrumentalists instr}ent@l@sts
+instrumentality instr}cntal@t/
+instrumentals instr}en@lz
+instrumentals instr}ent@lz
+instrumentation instr}entAS~
+instruments instr}~ts
+instruments' instr}~ts
+insubordinate ins@b{rd~@t
+insubordinate ins@b{rd~At
+insubordination ins@b{rd~AS~
+insubstantial ins@bstanC@l
+insubstantial ins@bstanS@l
+insubstantiate ins@bstanCEAt
+insubstantiate ins@bstanSEAt
+insubstantiated ins@bstanCEAt@d
+insubstantiated ins@bstanSEAt@d
+insufferable insufP@b@l
+insufficient ins@fiS~t
+insufficiently ins@fiS~tl/
+insular ins@lP
+insularity ins@l,r@t/
+insulate ins@lAt
+insulated ins@lAt@d
+insulating ins@lAt6N
+insulation ins@lAS~
+insulator ins@lAtP
+insulators ins@lAtPz
+insulin ins@l~
+insult insult
+insult insult
+insulted insult@d
+insulting insult6N
+insults insults
+insults insults
+insupportable ins@p{rt@b@l
+insurance inSqr~s
+insurance's inSqr~s@z
+insurances inSqr~s@z
+insure inSqr
+insured inSqrd
+insurer inSqrP
+insurer's inSqrPz
+insurers inSqrPz
+insurers' inSqrPz
+insures inSqrz
+insurgencies insVj~s/z
+insurgency insVj~s/
+insurgent insVj~t
+insurgents insVj~ts
+insurgents' insVj~ts
+insuring inSqr6N
+insurmountable insPm?nt@b@l
+insurrection insPekS~
+intact intakt
+intaglio intaly]
+intake intAk
+intan int~
+intangible intanj@b@l
+intangibles intanj@b@lz
+intefadeh int@fod@
+integer int@jP
+integers int@jPz
+integon int@gon
+integra integr@
+integral in@gr@l
+integral int@gr@l
+integrate in@grAt
+integrate int@grAt
+integrated in@grAt@d
+integrated int@grAt@d
+integrated's in@grAt@dz
+integrated's int@grAt@dz
+integrates in@grAts
+integrates int@grAts
+integrating in@grAt6N
+integrating int@grAt6N
+integration in@grAS~
+integration int@grAS~
+integrations in@grAS~z
+integrations int@grAS~z
+integrator in@grAtP
+integrator int@grAtP
+integrators in@grAtPz
+integrators int@grAtPz
+integrelin int@grel~
+integrelin integr@l6n
+integrity integr@t/
+integument integy}~t
+intel intel
+intel's intelz
+intelco intelk]
+intelcom intelkom
+intellect in@lekt
+intellect int@lekt
+intellects in@leks
+intellects in@lekts
+intellects int@lekts
+intellectual in@lekCU@l
+intellectual int@lekCU@l
+intellectualism inel@kCU@liz}
+intellectualism intel@kCU@liz}
+intellectually in@lekCU@l/
+intellectually in@lekCUl/
+intellectually int@lekCU@l/
+intellectually int@lekCUl/
+intellectuals int@lekCU@lz
+intellicall intel6k{l
+intellicorp intel6k{rp
+intelligence intel@j~s
+intelligent intel@j~t
+intelligently intel6j~tl/
+intelligentsia intel@jents/@
+intelligible intel@j@b@l
+intelogic int@loj6k
+intelsat intelsat
+intemperate intempP@t
+intend intend
+intended intend@d
+intending intend6N
+intends intendz
+intense intens
+intensely intensl/
+intensification intens@f@kAS~
+intensified intens@fId
+intensifies intens@fIz
+intensify intens@fI
+intensifying intens@fI6N
+intensities intens@t/z
+intensity intens@t/
+intensive intens@v
+intensively intens6vl/
+intent intent
+intention intenC~
+intentional intenS~@l
+intentionally intenS~@l/
+intentioned intenC~d
+intentions intenC~z
+intently intentl/
+intents intents
+inter intV
+interacciones intPaks/Onz
+interact inPakt
+interact intPakt
+interacted inPakt@d
+interacted intPakt@d
+interacting inPakt6N
+interacting intPakt6N
+interaction inPakS~
+interaction intPakS~
+interactions inPakS~z
+interactions intPakS~z
+interactive inPakt6v
+interactive intPakt6v
+interactivity inPaktiv@t/
+interactivity intPaktiv@t/
+interacts inPakts
+interacts intPakts
+interagency intPAj~s/
+interamerican intP},r@k~
+interand intP~d
+interbank intPbaNk
+interbred intPbred
+interbrew intPbrU
+interbrew intVbrU
+interbrew's intPbrUz
+interbrew's intVbrUz
+intercable intPkAb@l
+intercapital intPkap@t@l
+intercare intPker
+intercede intPsEd
+interceded intPsEd@d
+interceding intPsEd6N
+intercellular intPsely@lP
+intercept inPsept
+intercept intPsept
+intercepted inPsept@d
+intercepted intPsept@d
+intercepting inPsept6N
+intercepting intPsept6N
+interception inPsepS~
+interception intPsepS~
+interceptions inPsepS~z
+interceptions intPsepS~z
+interceptor inPseptP
+interceptor intPseptP
+interceptors inPseptPz
+interceptors intPseptPz
+intercepts inPsepts
+intercepts intPsepts
+intercession inPseS~
+intercession intPseS~
+interchange inPCAnj
+interchange intPCAnj
+interchangeable inPCAnj@b@l
+interchangeable intPCAnj@b@l
+interchangeably inPCAnj@bl/
+interchangeably intPCAnj@bl/
+interchanges inPCAnj@z
+interchanges intPCAnj@z
+intercity inPsit/
+intercity intPsit/
+interco intPkO
+interco's intPkOz
+intercollegiate intPk@lEj@t
+intercom intPkom
+intercompany intPkump~/
+interconnect intPk~ekt
+interconnected intPk~ekt@d
+interconnection intPk~ekS~
+interconnections intPk~ekS~z
+intercontinental intPkont~ent@l
+intercontinentale intPkontin~tol
+intercorp intPk{rp
+intercorporation intPk{rpPAS~
+intercourse inPk{rs
+intercourse intPk{rs
+intercultural intPkulCP@l
+intercurrent intPkV~t
+interdealer intPdElP
+interdependence intPd@pend~s
+interdependent intPd@pend~t
+interdict intPdikt
+interdicted intPdikt@d
+interdictes intPdikts
+interdicting intPdikt6N
+interdiction intPdikS~
+interdigital intPdij@t@l
+interdisciplinary intPdis@pl~er/
+interdyne intPdIn
+interest intP@st
+interest intr@st
+interested intP@st@d
+interested intr@st@d
+interesting intP@st6N
+interesting intr@st6N
+interestingly intPest6Nl/
+interestrate intP@strAt
+interests intP@s
+interests intP@ss
+interests intP@sts
+interests intr@ss
+interests intr@sts
+interface inPfAs
+interface intPfAs
+interfaces inPfAs@z
+interfaces intPfAs@z
+interfaith intPfAT
+interfax intPfaks
+interfere inPfir
+interfere intPfir
+interfered inPfird
+interfered intPfird
+interference inPfir~s
+interference intPfir~s
+interferes inPfirz
+interferes intPfirz
+interfering inPfir6N
+interfering intPfir6N
+interferometer intPfPom@tP
+interferon intPfiron
+interferons intPfironz
+interfirst intPfVst
+interflug intPfl@g
+interfunding intPfund6N
+intergenerational intPjenPAS~@l
+intergovernmental intPguvPnment@l
+intergraph intPgraf
+intergraph's intPgrafs
+intergroup intPgrUp
+intergroup's intPgrUps
+interim inP}
+interim intP}
+interim intr}
+interior intir/P
+interiors 6ntir/Pz
+interject intPjekt
+interjected intPjekt@d
+interjection intPjekS~
+interjections intPjekS~z
+interjects intPjekts
+interlace intPlAs
+interlaced intPlAst
+interlake intPlAk
+interlake's intPlAks
+interleaf intPlEf
+interleave intPlEv
+interleaving intPlEv6N
+interleukin intPlUk~
+interlink intPliNk
+interlinked intPliNkt
+interlock intPlok
+interlocked intPlokd
+interlocking intPlok6N
+interlocutor intPloky@tP
+interlocutors intPloky@tPz
+interloper intPlOpP
+interlopers intPlOpPz
+interlude intPlUd
+interludes intPlUdz
+interm intPm
+intermagnetic intPmagnet6k
+intermagnetics intPmagnet6ks
+intermark intPm)rk
+intermarket intPm)rk@t
+intermarriage intPm,r6j
+intermarried intPmar/d
+intermarry intPmar/
+intermec intPmck
+intermedia intPmEd/@
+intermediaries inPmEd/er/z
+intermediaries intPmEd/er/z
+intermediary inPmEd/cr/
+intermediary intPmEd/cr/
+intermediate inPmEd/@t
+intermediate intPmEd/@t
+intermediates inPmEd/@ts
+intermediates inPmEd/Ats
+intermediates intPmEd/@ts
+intermediates intPmEd/Ats
+intermedic intPmed6k
+intermedics intPmed6ks
+intermet intPmet
+interminable intVm~@b@l
+interminably intVm~@bl/
+intermingle intPmiNg@l
+intermingled intPmiNg@ld
+intermingling intPmiNg@l6N
+intermingling intPmiNgl6N
+intermission intPmiS~
+intermissions intPmiS~z
+intermittent intPmit~t
+intermittently intPmit~tl/
+intermix intPmiks
+intermixed intPmikst
+intermixing intPmiks6N
+intermodal intPmOd@l
+intermolecular intPm@leky@lP
+intermountain intPm?nt~
+intern intPn
+internacional intPnaS~@l
+internacional intPnos/]nal
+internal intVn@l
+internalize intVn@lIz
+internalized intVn@lIzd
+internally intVn@l/
+international inPnaS~@l
+international intPnaS~@l
+international's inPnaS~@lz
+international's intPnaS~@lz
+internationale inPnaS~ol/
+internationale intPnaS~ol/
+internationalism inPnaS~@liz}
+internationalism intPnaS~@liz}
+internationalist inPnaS~@l@st
+internationalist intPnaS~@l@st
+internationalists inPnaS~@l@s
+internationalists inPnaS~@l@ss
+internationalists inPnaS~@l@sts
+internationalists intPnaS~@l@s
+internationalists intPnaS~@l@ss
+internationalists intPnaS~@l@sts
+internationalization inPnaS~@l@zAS~
+internationalization intPnaS~@l@zAS~
+internationalize inPnaSn@lIz
+internationalize inPnaS~@lIz
+internationalize intPnaS~@lIz
+internationalized inPnaSn@lIzd
+internationalized inPnaS~@lIzd
+internationalized intPnaS~@lIzd
+internationally inPnaSn@l/
+internationally inPnaS~@l/
+internationally intPnaSn@l/
+internationally intPnaS~@l/
+internationals intPnaS~@lz
+internatonal inPnaS~@l
+internatonal intPnaS~@l
+internecine intVn@sEn
+interned intVnd
+internee intPnE
+internees intPnEz
+internet intPnet
+internet's intPnets
+internist intVn@st
+internists intVn@s
+internists intVn@ss
+internists intVn@sts
+internment intVnm~t
+internorth intPn{rT
+interns intPnz
+internship intPnSip
+internships intPnSips
+interoffice intP{f@s
+interpart intPport
+interpersonal intPpVs~@l
+interplanetary intPplan@ter/
+interplay intPplA
+interpol intPpOl
+interpolate itVp@lAt
+interpolated itVp@lAt@d
+interpose intPpOz
+interpret intVpr@t
+interpretation intVpr@tAS~
+interpretations intVpr@tAS~z
+interpreted intVpr@t@d
+interpreter intVpr@tP
+interpreters intVpr@tPz
+interpreting intPpret6N
+interpretive intVpr@t6v
+interprets intVpr@ts
+interprovincial intPpr@vinS@l
+interpublic intPpubl6k
+interpublic's intPpubl6ks
+interracial intPrAS@l
+interrante intPront/
+interred intVd
+interregnum intPregn}
+interrelate intPr@lAt
+interrelated intPr/lAt@d
+interrelated intPr@lAt@d
+interrelationship intPr/lAS~Sip
+interrent inPent
+interrent intPent
+interrogate int,r@gAt
+interrogated int,r@gAt@d
+interrogating int,r@gAt6N
+interrogation inter@gAS~
+interrogations inter@gAS~z
+interrogator int,r@gAtP
+interrogatories intcrog@t{r/z
+interrogators int,r@gAtPz
+interrogatory intcrog@t{r/
+interrupt inPupt
+interrupt intPupt
+interrupted inPupt@d
+interrupted intPupt@d
+interruptible inPrupt@b@l
+interruptible intPrupt@b@l
+interrupting inPupt6N
+interrupting intPupt6N
+interruption inPupS~
+interruption intPupS~
+interruptions inPupS~z
+interruptions intPupS~z
+interrupts inPupts
+interrupts intPupts
+interscholastic intPsk@last6k
+interscope intPskOp
+intersec intPsck
+intersect inPsekt
+intersect intPsekt
+intersected inPsekt@d
+intersected intPsekt@d
+intersecting inPsekt6N
+intersecting intPsekt6N
+intersection inPsekS~
+intersection intPsekS~
+intersections inPsekS~z
+intersections intPsekS~z
+intersects inPseks
+intersects inPsekts
+intersects intPseks
+intersects intPsekts
+intersegment intPsegm~t
+interspec intPspck
+intersperse intPspVs
+interspersed intPspVst
+intersperses intPspVs@z
+interstate inPstAt
+interstate intPstAt
+interstate's inPstAts
+interstate's intPstAts
+interstates inPstAts
+interstates intPstAts
+interstellar intPstelP
+intertan intPtan
+intertech intPtek
+intertechnology intPt@knol@j/
+intertect intPtekt
+intertidal intPtId@l
+intertrans intPtranz
+intertribal intPtrIb@l
+intertwine intPtwIn
+intertwined intPtwInd
+intertwining intPtwIn6N
+interurban intPVb~
+interval inPv@l
+interval intPv@l
+intervals inPv@lz
+intervals intPv@lz
+intervene inPvEn
+intervene intPvEn
+intervened inPvEnd
+intervened intPvEnd
+intervenes inPvEnz
+intervenes intPvEnz
+intervening inPvEn6N
+intervening intPvEn6N
+intervenor inPvEnP
+intervenor intPvEnP
+intervenors inPvEnPz
+intervenors intPvEnPz
+intervention inPvenC~
+intervention intPvenC~
+interventionism inPvenC~iz}
+interventionism intPvenC~iz}
+interventionist inPvenS~@st
+interventionist intPvenS~@st
+interventionists inPvenC~@s
+interventionists inPvenC~@ss
+interventionists inPvenC~@sts
+interventionists intPvenC~@s
+interventionists intPvenC~@ss
+interventionists intPvenC~@sts
+interventions inPvenC~z
+interventions intPvenC~z
+interview inPvyU
+interview intPvyU
+interviewed inPvyUd
+interviewed intPvyUd
+interviewee inPvyUE
+interviewee intPvyUE
+interviewees inPvyUEz
+interviewees intPvyUEz
+interviewer inPvyUP
+interviewer intPvyUP
+interviewers inPvyUPz
+interviewers intPvyUPz
+interviewing inPvyU6N
+interviewing intPvyU6N
+interviews inPvyUz
+interviews intPvyUz
+intervoice intPv<s
+interweave intPwEv
+interweaving intPwEv6N
+interwoven intPwOv~
+intestinal intest~@l
+intestine intest~
+intestines intest~z
+intex inteks
+inti int/
+intifada int@fod@
+intimacy int}@s/
+intimate int}@t
+intimate int}At
+intimate in}@t
+intimated int}At@d
+intimately int}@tl/
+intimates int}@ts
+intimation int}AS~
+intimations int}AS~z
+intimidate intim@dAt
+intimidated intim@dAt@d
+intimidates intim@dAts
+intimidating intim@dAt6N
+intimidation intim@dAS~
+intis intis
+into int@
+into intU
+into intU
+intolerable intolP@b@l
+intolerably intolP@bl/
+intolerance intolP~s
+intolerant intolP~t
+intonation int~AS~
+intone intOn
+intoned intOnd
+intones intOnz
+intoning intOn6N
+intourist intqr@st
+intoxicate intoks@kAt
+intoxicated intoks@kAt@d
+intoxicating intoks@kAt6N
+intoxication intoks@kAS~
+intra intr@
+intracompany intr@komp~/
+intracranial intr@krAn/@l
+intractable intrakt@b@l
+intraday intr@dA
+intramarginal intr})rj~@l
+intramural intr}yqr@l
+intransigence intrans@j~s
+intransigence intranz@j~s
+intransigent 6ntrans@j~t
+intransigent 6ntranz@j~t
+intraocular intr@OkyUlP
+intraparty intr@port/
+intrastate intr@stAt
+intrauterine intr@yUtP~
+intravenous intr@vEn@s
+intravenously intr@v/n@sl/
+intrawest intr@west
+intrepid intrep@d
+intrex intr@ks
+intricacies intr@k@s/z
+intricacy intr@k@s/
+intricate intr@k@t
+intricately intr@k@tl/
+intrie intr/
+intrieri intrir/
+intrigue intrEg
+intrigued intr/gd
+intrigues intrEgz
+intriguing intrEg6N
+intriguingly intrEg6Nl/
+intrinsic intrins6k
+intrinsically intrins6k@l/
+intrinsically intrins6kl/
+intro intr]
+introduce intr@dUs
+introduce intr]dUs
+introduced intr@dUst
+introduced intr]dUst
+introduces intr@dUs@z
+introduces intr]dUs@z
+introducing intr@dUs6N
+introducing intr]dUs6N
+introduction intr@dukS~
+introduction intr]dukS~
+introductions intr@dukS~z
+introductions intr]dukS~z
+introductory intr@duktP/
+introductory intr]duktP/
+intron intr~
+intros intr]z
+introspect intr@spekt
+introspection intr@spekS~
+introspection intr]spekS~
+introspective intr@spekt6v
+introspective intr]spekt6v
+introvert intr]vVt
+introverted intr]vVt@d
+intrude intrUd
+intruded intrUd@d
+intruder intrUdP
+intruders intrUdPz
+intrudes intrUdz
+intruding intrUd6N
+intrusion intrUZ~
+intrusions intrUZ~z
+intrusive intrUs6v
+intrusiveness intrUs6vn@s
+intuit intU@t
+intuit's intU@ts
+intuition intUiS~
+intuitive intU@t6v
+intuitively intU@t6vl/
+inuit inUt
+inundate in~dAt
+inundated in~dAt@d
+inundating 6nundAt6N
+inundating in~dAt6N
+inundation in~dAS~
+inundations in~dAS~z
+inure inyqr
+inured inyqrd
+invacare inv@ker
+invade invAd
+invaded invAd@d
+invader invAdP
+invaders invAdPz
+invades invAdz
+invading invAd6N
+invalid inv@l@d
+invalid inval@d
+invalidate inval@dAt
+invalidated inval@dAt@d
+invalidating inval@dAt6N
+invalidation inval@dAS~
+invalids inv@l@dz
+invaluable invaly@b@l
+invariably inv,r/@bl/
+invariance inv,r/~s
+invariant inv,r/~t
+invasion invAZ~
+invasions invAZ~z
+invasive invAs6v
+invective invekt6v
+invent invent
+invented inven@d
+invented invent@d
+inventing invent6N
+invention invenS~
+inventions invenS~z
+inventive invent6v
+inventiveness invent6vn@s
+inventor inventP
+inventoried inv~t{r/d
+inventories inv~t{r/z
+inventors inventPz
+inventory inv~t{r/
+inventory's inv~t{r/z
+invents invents
+inverlat invPlat
+inverness invPnes
+inverse invVs
+inversely invVsl/
+inversion invVZ~
+invert invVt
+invertebrate invVt@br@t
+invertebrate invVt@brAt
+invertebrates invVt@br@ts
+invertebrates invVt@brAts
+inverted invVt@d
+invesco invesk]
+invesco's inves]z
+invest invest
+investable invest@b@l
+investcorp investk{rp
+invested invest@d
+investigate invest@gAt
+investigated invest@gAt@d
+investigates invest@gAts
+investigating invest@gAt6N
+investigation invest@gAS~
+investigational invcst@gAS~@l
+investigations invest@gAS~z
+investigative invest@gAt6v
+investigator invest@gAtP
+investigator's invest@gAtPz
+investigators invest@gAtPz
+investigators' invest@gAtPz
+investigatory invest@g@t{r/
+investimento invest}ent]
+investing invest6N
+investissements investEz}onts
+investiture invest@CP
+investment invesm~t
+investment investm~t
+investment's invesm~ts
+investment's investm~ts
+investments invesm~ts
+investments investm~ts
+investments' invesm~ts
+investments' investm~ts
+investnet investnet
+investor investP
+investor's investPz
+investors investPz
+investors' investPz
+invests inves
+invests invess
+invests invests
+inveterate invetP@t
+invidious invid/@s
+invigorate invigPAt
+invigorated invigPAt@d
+invigorating invigPAt6N
+invincibility invins@bil@t/
+invincible invins@b@l
+inviolable invI@l@b@l
+inviolate invI@l@t
+invirase invIrAz
+invisibility inviz@bil@t/
+invisible inviz@b@l
+invisibles inviz@b@lz
+invitation inv@tAS~
+invitational inv@tAS~@l
+invitations inv@tAS~z
+invite invIt
+invited invIt@d
+invites invIts
+inviting invIt6N
+invitron invitron
+invitron's invitronz
+invocation inv@kAS~
+invoice inv<s
+invoices inv<s@z
+invoicing inv<s6N
+invoke invOk
+invoked invOkt
+invokes invOks
+invoking invOk6N
+involuntarily invol~tV@l/
+involuntary 6nvol~ter/
+involve involv
+involved involvd
+involvement involvm~t
+involvements involvm~ts
+involves involvz
+involving involv6N
+invulnerability invulnP@bil@t/
+invulnerable invulnP@b@l
+inward inwPd
+inwardly inwPdl/
+inwood inwqd
+iny in/
+inzer inzP
+io I]
+iodice I@dEsA
+iodice I@dIs
+iodide I@dId
+iodide's I@dIdz
+iodides I@dIdz
+iodine I@dIn
+iola IOl@
+iolande /]lond/
+iole /Ol/
+iomega I]mAg@
+ion Ion
+ion I~
+iona IOn@
+ione IOn/
+ionic Ion6k
+ionics Ion6ks
+ionics's Ion6ks@z
+ionization I~@zAS~
+ionize I~Iz
+ionizer I~IzP
+ionizers I~IzPz
+ionizing I~Iz6N
+ionosphere Ion@sf/r
+ionosphere Iyon@sf/r
+ionospheric Ion@sf,r6k
+ions Ionz
+ions I~z
+iorio /{r/]
+ios E]s
+ios I]s
+iosif I@sif
+iosif yes@f
+iosue IOsU
+iota IOt@
+iott I@t
+iou IOyU
+iovine /]vEn/
+iovino /]vEn]
+iowa I@w@
+iowa I]@
+iowa's I@w@z
+iowa's I]@z
+iowan I@w~
+iowan I]~
+iowans I@w~z
+iowans I]~z
+ip IpE
+ip ip
+ipalco /palk]
+ipalco's /palk]z
+ipco ipk]
+ipock ip@k
+ippolito ip]lEt]
+ipsco ipsk]
+ipsen ips~
+iptay iptA
+iqbal ikb@l
+ira I)rA
+ira Ir@
+ira's I)rAz
+ira's Ir@z
+iran 6ron
+iran Iran
+iran's 6ranz
+iran's Iranz
+iranamok Ir~omok
+irangate 6rongAt
+irani 6ron/
+iranian 6ron/~
+iranian IrAn/~
+iranians 6ron/~z
+iranians IrAn/~z
+iranians' IrAn/~z
+iranscam Iranskam
+iraq 6rok
+iraq Erok
+iraq's 6roks
+iraq's Eroks
+iraqgate 6rokgAt
+iraqgate ErokgAt
+iraqi 6rak/
+iraqi Erak/
+iraqi's 6rak/z
+iraqi's Erak/z
+iraqis 6rak/z
+iraqis Erak/z
+iras I)rAz
+iras Ir@z
+irascible 6ras@b@l
+irate IrAt
+irbinna Pbin@
+irby Vb/
+ire Ir
+ireene IrEn
+irelan 6rAlon
+ireland IPl~d
+ireland Irl~d
+ireland's Irl~dz
+irell Irel
+irena 6rAn@
+irene IrEn
+irene's IrEnz
+ireson ir@s~
+ireta 6rAt@
+ireton iriton
+iretta 6ret@
+irette 6ret
+irey Ir/
+irian Ir/~
+irianese IrE~Es
+irick ir6k
+iridescent ir@des~t
+iridium 6rid/}
+irimajiri IrEm@jir/
+irina 6rEn@
+iris Ir@s
+irises Ir@s@z
+irish IriS
+irishman IriSm~
+irit I)rItE
+irit irit
+irizarry ir@zar/
+irk Vk
+irked Vkt
+irks Vks
+irksome Vks}
+irkutsk 6rkqtsk
+irkutsk Pkqtsk
+irlbeck Vlbck
+irma Vm@
+irma's Vm@z
+iron IPn
+ironclad IPnklad
+ironed IPnd
+ironic Iron6k
+ironical Iron6k@l
+ironically Iron6kl/
+ironies Ir~/z
+ironing IPn6N
+ironing Irn6N
+ironize IPnIz
+ironized IPnIzd
+ironizer IPnIzP
+ironizes IPnIz@z
+ironizing IPnIz6N
+irons IPnz
+ironside IPnsId
+ironsides IPnsIdz
+ironton Irnt~
+ironwood IPnwqd
+ironwood's IPnwqdz
+irony Ir~/
+iroquois ir@kw<
+irradiate 6rAd/At
+irradiated 6rAd/At@d
+irradiation 6rAd/AS~
+irrational 6raS~@l
+irrationality 6raS~al@t/
+irrationally 6raSn@l/
+irrationally 6raS~@l/
+irreconcilable 6rek~sIl@b@l
+irredentism ir@dentiz}
+irrefutable 6r@fyUt@b@l
+irregardless ir@godl@s
+irregular 6regy@lP
+irregularities 6rcgy@l,r@t/z
+irregularity 6regy@l,r@t/
+irregularly 6regy@lPl/
+irregulars 6regy@lPz
+irrelevance 6rel@v~s
+irrelevancy 6rel@v~s/
+irrelevant 6rel@v~t
+irremediable ir}Ed/@b@l
+irreparable 6repP@b@l
+irreparably 6repP@bl/
+irreplaceable 6r@plAs@b@l
+irrepressible 6r@pres@b@l
+irresistible ir@zist@b@l
+irresistibly ir@zist@bl/
+irrespective 6r@spekt6v
+irresponsibility 6r@spons@bil@t/
+irresponsible 6r@spons@b@l
+irresponsibly 6r@spons@bl/
+irretrievably 6r@trEv@bl/
+irreverence 6revP~s
+irreverent 6revP~t
+irreversible ir6vVs@b@l
+irreversibly ir6vVs@bl/
+irrevocable 6rev@k@b@l
+irrevocably 6rev@k@bl/
+irrevocably 6revOk@bl/
+irrigate ir@gAt
+irrigated ir@gAt@d
+irrigation ir@gAS~
+irrigator ir@gAtP
+irrigators ir@gAtPz
+irritability 6r@t@bil@t/
+irritable ir@t@b@l
+irritant ir@t~t
+irritants ir@t~ts
+irritate ir@tAt
+irritated ir@tAt@d
+irritates ir@tAts
+irritating ir@tAt6N
+irritation ir@tAS~
+irritations ir@tAS~z
+irv Vv
+irve I)rvEE
+irve Vv
+irvette Pvet
+irvin Vvin
+irvine VvIn
+irving Vv6N
+irving's Vv6Nz
+irwin Vw~
+irwindale Vw6ndAl
+is @z
+is iz
+isa Es@
+isaac Iz@k
+isaacks isoks
+isaacs Iz6ks
+isaacson Iz6ks~
+isaak isok
+isabel iz@bel
+isabell isobel
+isabella iz@bel@
+isabelle iz@bel
+isackson is@ks~
+isadore isod{r
+isadore isod{rA
+isaiah IzA@
+isaksen is@ks~
+isakson is@ks~
+isaly Isl/
+isaly Izl/
+isautier Is{tyP
+isay IsA
+isbell isbcl
+isbill isbil
+iscariot isk,r/@t
+isch iS
+ischemia iskem/@
+ischo ES]
+ise Iz
+iselin is@l~
+iseman Ism~
+iseminger is/m6NP
+isenberg Iz~bPg
+isenhart Iz~hort
+isenhour is~?r
+isenhower is~h]P
+isensee Iz~sE
+iser IzP
+isetan is@t~
+isgrigg isgrig
+isgro Esgr]
+isgur isgP
+ish iS
+isham iS}
+ishaq iSak
+ishee iS/
+isherwood iSPwqd
+ishi iS/
+ishi's iS/z
+ishibashi 6S/boS/
+ishida 6SEd@
+ishihara 6S/h)r@
+ishii 6SE/
+ishikawa 6S/kow@
+ishikawajima ES6kow@jEm@
+ishikura iS6kqr@
+ishimura ES}Ur@
+ishler iSlP
+ishmael iSm/l
+ishmael iSmAl
+ishmail iSmAl
+ishman iSm~
+ishtar iStor
+isidore iz@d{r
+isikoff iz@k{f
+isis Is@s
+iskra iskr@
+islam islom
+islam islom
+islam izl}
+islam's islomz
+islam's islomz
+islamabad islam@bad
+islamabad's islam@badz
+islami izlom/
+islamic izlom6k
+islamist isl}@st
+islamists isl}@s
+islamists isl}@ss
+islamists isl}@sts
+islamiya islom/@
+islamization izlom@zAS~
+island Il~d
+island's Il~dz
+islander Il~dP
+islanders Il~dPz
+islandia Iland/@
+islands Il~dz
+islands' Isl~dz
+islas Il@z
+isle Il
+isleen Il/n
+isler IlP
+isles Ilz
+islets Il@ts
+isley Il/
+islip Islip
+ism iz}
+ismael ismAl
+ismail ismAl
+isms iz}z
+isn't @z~t
+isn't iz~
+isn't iz~t
+isner isnP
+isocyanate Is@sI~At
+isoda EsOd@
+isoelectronic Is]/lcktron6k
+isoelectronic Is]@lcktron6k
+isoetec Is]tek
+isola Isol@
+isolate Is@lAt
+isolated Is@lAt@d
+isolates Is@lAts
+isolating Is@lAt6N
+isolation Is@lAS~
+isolationism Is@lAS~iz}
+isolationist Is@lAS~@st
+isolationists Is@lAS~@s
+isolationists Is@lAS~@ss
+isolationists Is@lAS~@sts
+isolde isOld@
+isolde is]ld
+isom Is}
+isomedix Is]med6ks
+isomedix's Is]med6ks
+isomedix's Is]med6ks@z
+isomer Is}P
+isomers Is}Pz
+isomorphism Is}{rfiz}
+ison is~
+isoprinosine is@prin@sEn
+isosceles Is{s@lEz
+isothermal Is@TVm@l
+isotoner Is]tOnP
+isotonic Is@ton6k
+isotope Is@tOp
+isotopes Is@tOps
+isotopic Is@top6k
+isoxicam isoks6k}
+ispra ispr@
+israel izr/@l
+israel izrAl
+israel's izr/@lz
+israel's izrAlz
+israeli izrAl/
+israeli's izrAl/z
+israelis izrAl/z
+israelis' izrAl/z
+israelite izr@lIt
+israelites izr@lIts
+israeloff isrAl{f
+israelson isrcls~
+israhi izroh/
+isringhouser isr6Nh?zP
+issa is@
+issac Iz6k
+issac is@k
+issam is}
+issar Esor
+issie is/
+issing is6N
+issuable iSU@b@l
+issuance iSU~s
+issuances iSU~s@z
+issue iSU
+issue's iSUz
+issued iSUd
+issueless iSUl@s
+issuer iSUP
+issuer's iSUPz
+issuers iSUPz
+issuers' isUrz
+issues iSUz
+issues' isUz
+issuing iSU6N
+issy is/
+istanbul istonbUl
+istat istat
+istel istcl
+istel's istclz
+isthmus ism@s
+istituto ist@tUt]
+istook istqk
+istre istP
+isty IestEwI
+isty ist/
+isu IesyU
+isu isU
+isuzu isUzU
+it @t
+it it
+it'd it@d
+it'll it@l
+it'll itl
+it's @ts
+it's its
+it-wit itwit
+ita It@
+ita ItEA
+italia /tal/@
+italia /taly@
+italian @taly~
+italiana @tal/an@
+italianate @taly~At
+italiano @tol/on]
+italians @taly~z
+italic Ital6k
+italics Ital6ks
+italtel italtel
+italy it@l/
+italy's it@l/z
+itamar Et}or
+itami itom/
+itar Etor
+itasca Itask@
+itch iC
+itches iC@z
+itching iC6N
+itchy iC/
+itek Itek
+itel Itel
+item It}
+itemize It}Iz
+itemized It}Izd
+itemizer It}IzP
+itemizers It}IzPz
+itemizing It}Iz6N
+items It}z
+iten It~
+iterative itPAt6v
+ithaca iT@k@
+itinerant ItinP~t
+itineraries ItinPer/z
+itinerary ItinPer/
+itkin itkin
+ito EtO
+ito Et]
+ito's EtOz
+ito's Et]z
+itochu EtOCU
+itoh Et]
+its @ts
+its its
+itself @tself
+itstee itst/
+itsy its/
+itsy-bitsy its/bits/
+ittner itnP
+itty it/
+itty-bitty it/bit/
+itzhak itsak
+itzhak itshak
+itzhak itsok
+itzkowitz itsk@wits
+iuliano /Ul/on]
+iuliano yUl/on]
+iva Ev@
+ivaco Iv@kO
+ivan Iv~
+ivana 6von@
+ivancic 6vaNk6k
+ivane iv~
+ivanhoe Iv~hO
+ivanko /vonk]
+ivanna 6von@
+ivanoff iv~{f
+ivanov iv~ov
+ivanyenko Iv~yenk]
+ivar ivP
+ivatans Iv@t~z
+ivax Ivaks
+iven Iv~
+ivens Iv~z
+iver IvP
+ivern IvPn
+ivers IvPz
+iversen 6vVs~
+iverson IvPs~
+ivery IvP/
+ives Ivz
+ivester IvestP
+ivey Iv/
+ivie Iv/
+ivins ivinz
+ivo IvEO
+ivo IvO
+ivor IvP
+ivorian Iv{r/~
+ivorians Iv{r/~z
+ivory IvP/
+ivory Ivr/
+ivy Iv/
+iwai IwI
+iwaki Iwok/
+iwamoto iwomOt]
+iwan Ewon
+iwanicki 6v~itsk/
+iwanski 6vansk/
+iwasaki Ewosok/
+iwata iwot@
+iwate IwAt
+iwen iw~
+iwerks IwVks
+iwinski 6vinsk/
+iwo Iw]
+iwosaki Iw@sok/
+ixion 6ksI~
+iyer IP
+izaguirre iz@gwIr
+izaguirre iz@gwirA
+izansky izansk/
+izansky's izansk/z
+izard izPd
+izatt Ezot
+izetbegovic izctbeg]viC
+izetbegovic's izctbeg]viC@z
+izod Izod
+izquierdo izkwird]
+izumi izUm/
+izvestia izvest/@
+izzard izPd
+izzi iz/
+izzo iz]
+izzy iz/
+izzy's iz/z
+j jA
+j's jAz
+j. jA
+j.'s jAz
+ja yo
+jaan jan
+jaan yon
+jab jab
+jabah jab@
+jabaliya job@lE@
+jabar j@b)r
+jabar's j@b)rz
+jabbar j@b)r
+jabbed jabd
+jabbing jab6N
+jabbour Z@bqr
+jaber jAbP
+jablon jabl~
+jablonowski y@bl~{fsk/
+jablonski y@blonsk/
+jablonsky y@blonsk/
+jabril j@brEl
+jabril j@bril
+jabs jabz
+jac jak
+jacek joCek
+jachim jakim
+jacinda j@sind@
+jacinta j@sint@
+jacinth jasinT
+jacintha j@sinT@
+jacinthe jasinT
+jacinto j@sint]
+jack jak
+jack's jaks
+jacka jak@
+jackal jak@l
+jackass jakas
+jacked jakt
+jackel jak@l
+jackelyn jak@lin
+jacket jak@t
+jacketed jak@t@d
+jackets jak@ts
+jackett jak@t
+jackhammer jakhamP
+jackhammers jakhamPz
+jacki jak/
+jacki's jak/z
+jackie jak/
+jackie's jak/z
+jacking jak6N
+jackley jakl/
+jacklin jaklin
+jackman jakm~
+jacko jak]
+jackoby jak@b/
+jackovich jak@v6C
+jackowski y@sk{fsk/
+jackpot jakpot
+jackpots jakpots
+jackrabbit jakrab@t
+jacks jaks
+jacksdeit jaksd/@t
+jackson jaks~
+jackson's jaks~z
+jacksonian jaksOn/~
+jacksonians jaksOn/~z
+jacksons jaks~z
+jacksonville jaks~vil
+jacksonville's jaks~vilz
+jacky jak/
+jacky's jak/z
+jaclyn jaklin
+jaco yok]
+jacob jAk@b
+jacob's jAk@bz
+jacoba yokOb@
+jacobe jak@b
+jacobean jak@bE~
+jacober jAk@bP
+jacobi yokOb/
+jacobin jak@b~
+jacobina y@k@bIn@
+jacobine jak@bIn
+jacobite jak@bIt
+jacobites jak@bIts
+jacobo yokOb]
+jacoboski jak]b{sk/
+jacobowitz y@kob@wits
+jacobs jAk@bz
+jacobs' jAkubz
+jacobs's jAk@bz@z
+jacobsen jAk@bs~
+jacobson jAk@bs~
+jacobson's jAk@bs~z
+jacobus j@kOb@s
+jacoby j@kOb/
+jacome j@kOm
+jacor jAk{r
+jacot jak@t
+jacox jakoks
+jacque ZAk
+jacqueline jak@l~
+jacqueline jakl~
+jacqueline jakw@l~
+jacquelyn jakw@l~
+jacques Zok
+jacquet yokAt
+jacquetta joket@
+jacquez yokwez
+jacquie jakw/
+jacquin jakwin
+jacquot Z@kwO
+jacuzzi j@kyUz/
+jade jAd
+jaded jAd@d
+jadeite jAdIt
+jades jAdz
+jadwin jadwin
+jae jA
+jae's jAz
+jaeckel yek@l
+jaeger yegP
+jaegers yegPz
+jaekel yek@l
+jaenicke yen6k
+jafco jafk]
+jafco's jafk]z
+jaffa jaf@
+jaffar j@f)r
+jaffe jaf/
+jaffee jaf/
+jaffna jafn@
+jaffray jafrA
+jaffray's jafrAz
+jaffrey jafr/
+jagdish jagdiS
+jager jAgP
+jagged jagd
+jagger jagP
+jagger's jagPz
+jaggers jagPz
+jagiello jojel]
+jagielski y@gElsk/
+jaglom jagl}
+jaglom's jagl}z
+jago yog]
+jagoda jogOd@
+jagodzinski y@g@jinsk/
+jagow yog]
+jags jagz
+jagt jat
+jaguar jagwor
+jaguar's jagworz
+jaguars jagworz
+jahn jan
+jahner jonP
+jahnke jaNk
+jahns jonz
+jahr j)r
+jai hI
+jai jI
+jail jAl
+jail's jAlz
+jailed jAld
+jailer jAlP
+jailers jAlPz
+jailhouse jAlh?s
+jailing jAl6N
+jails jAlz
+jaime hIm/
+jaime's hIm/z
+jaimes hIm/z
+jaimie hIm/
+jaimie jAm/
+jain jAn
+jain jIn
+jainism jAniz}
+jakab jak@b
+jakarta j@k)rt@
+jakarta's j@k)rt@z
+jake jAk
+jake's jAks
+jakel jak@l
+jakes jAks
+jakeway jAkwA
+jakie jak/
+jakob jak@b
+jakobsen jak@bs~
+jakubek y@kUbck
+jakubiak y@kub/ak
+jakubik y@kUb6k
+jakubowicz y@kub@v6C
+jakubowski y@k@b{fsk/
+jalalabad j@lal@bad
+jalapeno hal@pEny]
+jalapeno jal@pEn]
+jalbert jalbPt
+jalopy j@lop/
+jam jam
+jam's jamz
+jama jam@
+jamaica j}Ak@
+jamaica's j}Ak@z
+jamaican j}Ak~
+jamaicans j}Ak~z
+jamail j}Al
+jamal j}ol
+jamal's j}olz
+jamar yom)r
+jamb jam
+jambor yomb{r
+jamerson jamPs~
+jamerson's jamPs~z
+james jAmz
+james' jAmz
+james's jAmz@z
+jameson jAms~
+jamestown jAmzt?n
+jamesway jAmzwA
+jami jAm/
+jamie jAm/
+jamie's jAm/z
+jamieson jAm@s~
+jamila j}il@
+jamison jAm@s~
+jammed jamd
+jammer jamP
+jammers jamPz
+jamming jam6N
+jammu j}U
+jammu's j}Uz
+jamrog jamr@g
+jamroz yomr]z
+jams jamz
+jamshedpur jamSedpP
+jamu jamU
+jan jan
+jan's janz
+jan. jan
+jan. janyUcr/
+jana jan@
+janacek yan@Cck
+janachowski jan@C?sk/
+janak yan@k
+janardhan j~)rd~
+janas jan@z
+janata j~ot@
+janca jaNk@
+janco jaNk]
+janczak yanCak
+janda jand@
+jandreau Z~drO
+jandt jant
+jane jAn
+jane's jAnz
+janeane jAnan
+janecek yan6Cck
+janeczko y~eCk]
+janeiro Z~,rO
+janeiro j~,rO
+janek yanck
+janel jan@l
+janella j~el@
+janelle Z~el
+janes jAnz
+janesville jAnzvil
+janet janct
+janet's jancts
+janette j~et
+janeway jAnwA
+janey jAn/
+jang jaN
+jangle jaNg@l
+jangled jaNg@ld
+jani yon/
+janiak yan/ak
+janice jan@s
+janicek yan6Cck
+janick jan6k
+janicke jan6k
+janicki j~ik/
+janie jAn/
+janiero j~,r]
+janiero j~y,r]
+janiga jan6g@
+janii j~E
+janik yan6k
+janikowski y~6k{fsk/
+janina j~En@
+janine j~En
+janis janis
+janisch jan6S
+janish yan6S
+janiszewski y~6Sefsk/
+janitor jan@tP
+janitorial jan@t{r/@l
+janitors jan@tPz
+jank jaNk
+janka jaNk@
+janke jaNk
+jankiewicz yank@v6C
+janklow jaNkl]
+janko jaNk]
+jankovic jaNk@v6k
+jankovich jaNk@v6C
+jankowiak y@Nk?/ak
+jankowski y@Nk{fsk/
+jann jan
+janna jan@
+janney jan/
+janning jan6N
+jannock jan@k
+jannotta j~ot@
+janoff jan{f
+janofsky j~{fsk/
+janos jan]s
+janosik y~Os6k
+janoski y~?sk/
+janosko y~Osk]
+janosky y~Osk/
+janota y~Ot@
+janousek y~Usck
+janovsky j~ovsk/
+janow yan]
+janowiak y~?/ak
+janowicz yan@v6C
+janowitz yan@wits
+janowski y~{fsk/
+jans janz
+jansa jans@
+jansen jans~
+jansenism jans~iz}
+jansenist jans~@st
+jansenists jans~@s
+jansenists jans~@ss
+jansenists jans~@sts
+jansky yansk/
+jansma yansm@
+janson jans~
+janssen jans~
+janssens jans~z
+jansson jans~
+janthina yonTEn@
+jantz jants
+jantzen jantz~
+january janyUer/
+january's janyUer/z
+janus jAn@s
+janusz yonqS
+januszewski y~6Sefsk/
+janvier janv/P
+janvrin janvrin
+janz janz
+janzen janz~
+jap jap
+japan j@pan
+japan's j@panz
+japanese jap~Ez
+japans j@panz
+japonica j@pon@k@
+japs japs
+jaqua yakw@
+jaquay Z@kA
+jaques jaks
+jaquess yokw@s
+jaquez yokwez
+jaquish jakw6S
+jaquith jakwiT
+jar j)r
+jara j)r@
+jaramillo jar}il]
+jarboe j)rbO
+jarchow j)rC?
+jardin j)rdin
+jardine j)rdIn
+jardine's j)rdInz
+jarecki yPetsk/
+jared j,r@d
+jarema yPEm@
+jares Z,rz
+jargon j)rg~
+jarislowsky jer@sl?sk/
+jarman j)rm~
+jarmon yorm{n
+jarnagin j)rn@jin
+jarnigan j)rn6gan
+jaros y)r]z
+jarosz y)r6S
+jaroszewski yP6Sefsk/
+jaroszynski jer@zinsk/
+jarrard ZP)rd
+jarratt jar@t
+jarreau ZPO
+jarred j)rd
+jarrell yorAl
+jarrells jar@lz
+jarrett j,r@t
+jarriel ZPEl
+jarriel's ZPElz
+jarring j)r6N
+jarryd jar@d
+jars j)rz
+jaruzelski jer@zelsk/
+jaruzelski yar@zelsk/
+jarvi j)rv/
+jarvia j)rv/@
+jarvie j)rv/
+jarvik j)rv6k
+jarvinen j)rv~~
+jarvis j)rv@s
+jarvis's j)rv@s@z
+jaryl jar@l
+jarzombek yPzombck
+jas jAmz
+jasek yosck
+jasinowski jas~?sk/
+jasinski y@sinsk/
+jaskiewicz yosk@v6C
+jasko yosk]
+jaskolski y@skOlsk/
+jaskot yosk@t
+jaskowiak y@sk?/ak
+jaskulski y@skulsk/
+jasmer jas}P
+jasmin jazmin
+jasmina y@smIn@
+jasmine jazm~
+jaso yos]
+jason jAs~
+jason's jAs~z
+jaspal jaspol
+jasper jaspP
+jasper's jaspPz
+jaspers jaspPz
+jasperson jaspPs~
+jass jas
+jasso jas]
+jaster jastP
+jauch j{C
+jaudon y?d{n
+jaundice j{nd@s
+jaundiced j{nd@st
+jaunt j{nt
+jauntily j{nt@l/
+jaunts j{nts
+jaunty j{nt/
+jauregui y?rAgw/
+jaurequi y?rAkw/
+java jov@
+javan j@von
+javanese jov~Ez
+javelin jav@l~
+javelin javl~
+javett jav@t
+javier hov/,r
+javits javits
+javorsky y@v{rsk/
+jaw j{
+jawad j@wod
+jawbone j{bOn
+jawboning j{bOn6N
+jawed j{d
+jaworowski y@wP{fsk/
+jaworski j@w{rsk/
+jaws j{z
+jay jA
+jay's jAz
+jaya jI@
+jayachandra jI@Condr@
+jayashankar jI6SoNkor
+jaycee jAsE
+jaycees jAsEz
+jaycox jAkoks
+jaye jA
+jayewardene jAw{rdEn
+jayhawker jAh{kP
+jayme jAm/
+jaymes jAm/z
+jayne jAn
+jaynes jAnz
+jayroe jArO
+jays jAz
+jayson jAz~
+jaywalk jAw{k
+jaywalking jAw{k6N
+jazmin jazmin
+jazz jaz
+jazzed jazd
+jazzman jazman
+jazzmen jazmcn
+jazzy jaz/
+je jAE
+je jE
+jealous jel@s
+jealousies jel@s/z
+jealously jel@sl/
+jealousy jel@s/
+jean jEn
+jean's jEnz
+jeana jEn@
+jeanbaptiste Zenb@ptist
+jeancourt ZoNk{rt
+jeancourt jEnk{rt
+jeane jEn
+jeaner jEnP
+jeanerette jEnret
+jeanes jEnz
+jeanette j~et
+jeaney jEn/
+jeanie jEn/
+jeanine j~En
+jeanlouis ZonlUEz
+jeanmichele Zonm6Sel
+jeanne jEn
+jeannette j~et
+jeannie jEn/
+jeanniot jEn/@t
+jeanpierre Z{np/,r
+jeans jEnz
+jeansonne jens~
+jeb jeb
+jech jek
+jed jed
+jedlicka y@dlisk@
+jee jE
+jeep jEp
+jeep's jEps
+jeepney jEpn/
+jeeps jEps
+jeer jir
+jeered jird
+jeering jEr6N
+jeers jErz
+jeeter jEtP
+jeez jEz
+jefcoat jefkOt
+jeff jef
+jeff's jefs
+jeffcoat jefk]t
+jeffe jef
+jeffe jef/
+jeffer jefP
+jefferey jefP/
+jefferies jefr/z
+jefferies' jefP/z
+jefferies's jefr/z@z
+jefferis jefPis
+jeffers jefPz
+jefferson jefPs~
+jefferson's jefPs~z
+jeffersonian jefPsOn/~
+jeffersonians jefPsOn/~z
+jeffery jefP/
+jefferys jefP/z
+jeffey jef/
+jeffords jefPdz
+jeffress jefr@s
+jeffrey jefr/
+jeffrey's jefr/z
+jeffreys jefr/z
+jeffries jefr/z
+jeffry jefr/
+jeffs jefs
+jeffus jef@s
+jeffy jef/
+jehle jeh@l
+jehovah j@hOv@
+jehovah's j@hOv@z
+jekel jek@l
+jekyll jek@l
+jelen jel~
+jelinek jel~6k
+jelinski y@linsk/
+jelks jelks
+jell jel
+jelley jel/
+jellied jel/d
+jellies jel/z
+jellison jel@s~
+jello jel]
+jello's jel]z
+jelly jel/
+jelly's jel/z
+jellyfish jel/fiS
+jelton jelt~
+jem jem
+jem's jemz
+jemie jem/
+jemima jcmEm@
+jemison jem@s~
+jemmie jem/
+jemmott jem@t
+jen jen
+jena jEn@
+jencks jeNks
+jendro jendr]
+jenin jenin
+jenison jen@s~
+jenkens jeNk~z
+jenkin jeNkin
+jenkins jeNk~z
+jenkinson jeNk~s~
+jenks jeNks
+jenn jen
+jenn's jenz
+jenne jen
+jenner jenP
+jenness jen@s
+jennett jen@t
+jennette Z~et
+jennewein jenUIn
+jenney jen/
+jenni jen/
+jennie jen/
+jennifer jen@fP
+jennifer's jen@fPz
+jenning jen6N
+jenninger jen6NP
+jennings jen6Nz
+jennison jen@s~
+jenny jen/
+jenny's jen/z
+jenrette jenret
+jenrette's jcnrets
+jens jenz
+jensen jens~
+jenson jens~
+jenssen jens~
+jent jent
+jentsch jenC
+jentz jents
+jeong jeN
+jeopardize jepPdIz
+jeopardized jepPdIzd
+jeopardizes jepPdIz@z
+jeopardizing jepPdIz6N
+jeopardy jepPd/
+jeppesen jep/z~
+jeppson jeps~
+jepsen jeps~
+jepson jeps~
+jepson's jeps~z
+jerabek j,r@b6k
+jerald j,r@ld
+jerboas jPbO@z
+jerde jVd
+jerden jVd~
+jere j,r/
+jereb j,rib
+jereissati jcrAsot/
+jerel j,r@l
+jereld j,r@ld
+jeremia ycrEm/@
+jeremiah jer}I@
+jeremy j,r}/
+jerez ycrez
+jergens jVg~z
+jergenson jVg~s~
+jerger jVgP
+jeri j,r/
+jericho j,r6kO
+jerk jVk
+jerked jVkt
+jerking jVk6N
+jerkins jVkinz
+jerks jVks
+jerky jVk/
+jermaine jPmAn
+jerman jVm~
+jermyn jVmin
+jernberg jVnbPg
+jernigan jVn6gan
+jeroboam jer@bO}
+jerold j,r]ld
+jerome jPOm
+jerr jV
+jerrell j,r@l
+jerrell ycrAl
+jerri j,r/
+jerrico j,r6kO
+jerrie j,r/
+jerritts j,rits
+jerrold j,r@ld
+jerrome j@rOm
+jerrome ycrOmA
+jerry j,r/
+jerry's j,r/z
+jersey jVz/
+jersey's jVz/z
+jerseys jVz/z
+jersian jVz/~
+jersians jVz/~z
+jerusalem jPUs@l}
+jerusalem's jPUs@l}z
+jerusha j,r@S@
+jervis jVvis
+jerzak yVz@k
+jerzy jVz/
+jeschke jeSk
+jeske jesk
+jesmer jes}P
+jesper jespP
+jespersen jespPs~
+jesperson jespPs~
+jess jes
+jessalynn jes@lin
+jessamine jes}in
+jessamyn jes}in
+jesse jes/
+jesse's jes/z
+jessee jesE
+jesselson jes@ls~
+jessen jes~
+jesser jesP
+jessica jes6k@
+jessica's jes6k@z
+jessie jes/
+jesson jes~
+jessop jes@p
+jessup jesup
+jessy jes/
+jessye jes/
+jest jest
+jester jestP
+jests jests
+jesudason jesUd@s~
+jesuit jeZU@t
+jesuits jeZU@ts
+jesup jes@p
+jesus jEz@s
+jesus' jEz@s
+jet jet
+jet's jets
+jetborne jetb{rn
+jeter jEtP
+jethro jeTr]
+jetliner jetlInP
+jetliner's jetlInPz
+jetliners jetlInPz
+jetro jetr]
+jets jets
+jets' jets
+jetson jets~
+jetsons jets~z
+jetstream jetstrEm
+jetstream's jetstrEmz
+jetstreams jetstrEmz
+jett jet
+jett's jets
+jetta jet@
+jette jet
+jetted jet@d
+jetter jetP
+jetting jet6N
+jettison jet@s~
+jettisoned jet@s~d
+jettisoning jet@s~6N
+jetton jet~
+jetty jet/
+jeumont jUmont
+jew jU
+jewel jU@l
+jewelcor jU@lk{r
+jeweler jU@lP
+jewelers jU@lPz
+jewell jUcl
+jewellers jU@lPz
+jewelmaster jU@lmastP
+jewelmasters jU@lmastPz
+jewelry jU@lr/
+jewelry jUlP/
+jewelry jUlr/
+jewels jU@lz
+jewelsburg jU@lzbPg
+jewess jU@s
+jewett jUct
+jewfish jUfiS
+jewfishes jUfiS@z
+jewish jUiS
+jewishness jUiSn@s
+jewitt jUit
+jewkes jUks
+jewry jUr/
+jews jUz
+jews' jUz
+jex jeks
+jeyaretnam jAPetn}
+jezek yezck
+jezewski y@zefsk/
+jezierski y@zirsk/
+jeziorski y@z/{rsk/
+jfet jfet
+jha jo
+jheryl j,r@l
+jhirmack jVmak
+ji jE
+jia jE@
+jian jE~
+jiang j/oN
+jiang joN
+jiang's j/oNz
+jiangsu jyoNsU
+jiar j/)r
+jiawen jEwen
+jib jib
+jibe jIb
+jibes jIbz
+jicha jiC@
+jie jE
+jif jif
+jifeng jEfeN
+jiffi-snak jif/snak
+jiffy jif/
+jig jig
+jiggetts jigcts
+jiggle jig@l
+jiggling jig@l6N
+jiggling jigl6N
+jigs jigz
+jigsaw jigs{
+jihad jEhad
+jihad jEhod
+jil jil
+jilek jil6k
+jiles jIlz
+jill jil
+jillian jil/~
+jillian jily~
+jillion jily~
+jillions jily~z
+jillson jils~
+jilt jilt
+jilted jilt@d
+jim jim
+jim's jimz
+jima jEm@
+jimbo's jimb]z
+jimenez himenez
+jimerson jimPs~
+jimi jim/
+jiminez himenez
+jimison jim@s~
+jimmerson jimPs~
+jimmie jim/
+jimmied jim/d
+jimmy jim/
+jimmy's jim/z
+jin jin
+jindo jind]
+jindra jindr@
+jines jInz
+jing jiN
+jingle jiNg@l
+jingles jiNg@lz
+jingoism jiNgOiz}
+jingoistic j6Ng]ist6k
+jingsheng jiNScN
+jinkins jiNkinz
+jinks jiNks
+jinright jinrIt
+jinx jiNks
+jipson jips~
+jirak j{r@k
+jirga jVg@
+jiri jir/
+jirik j{r6k
+jiron y6r{n
+jirsa yirs@
+jitney jitn/
+jitterbug jitPbug
+jitterbugging jitPbug6N
+jitters jitPz
+jittery jitP/
+jive jIv
+jividen y/vId~
+jiving jIv6N
+jna jAenA
+jo jO
+joachim wokEm
+joachim yOokim
+joachim's wokEmz
+joachim's yOokimz
+joachims wokEmz
+joachims yOokimz
+joakima jOkEm@
+joakima wokEm@
+joan jOn
+joann jOan
+joanna j]an@
+joanne jOan
+joanou jOnU
+joao jO]
+joaquim wokEm
+joaquin wokEn
+job jOb
+job job
+job's jObz
+job's jobz
+jobber jobP
+jobbers jobPz
+jobe jOb
+jobes jObz
+jobete j]bEt
+jobin jObin
+jobina y]bEn@
+jobless jobl@s
+joblessness jobl@sn@s
+jobs jobz
+jobs' jobz
+jobs's jobz@z
+jobson jobs~
+jobst jobst
+jobyna y@bEn@
+jocelin j{slin
+joceline j{slin
+jocelyn j{slin
+jocelyne j{slin
+jochem jok}
+jochen jOk~
+jochim jok}
+jochum jok}
+jock jok
+jockey jok/
+jockeying jok/6N
+jockeys jok/z
+jocks joks
+jocosa y]kOs@
+jocular joky@lP
+jocylan j{sl~
+jocylan's j{sl~z
+jodi jOd/
+jodie jOd/
+jodoin Z@d<n
+jody jOd/
+joe jO
+joe's jOz
+joedicke jOd6k
+joel jO@l
+joel's jO@lz
+joelle j]el
+joelson jOls~
+joens jOnz
+joerg j{rg
+joerger yVgP
+joers jOPz
+joes jOz
+joette Z]et
+joette j]et
+joey jO/
+joey's jO/z
+joffe jof
+joffrey j{fr/
+joffrion y]fr/{n
+jog jog
+jogged jogd
+jogger jogP
+joggers jogPz
+jogging jog6N
+jogs jogz
+joh jO
+johan y]hon
+johann yOhon
+johanna j@han@
+johannes j]han@s
+johannesburg jOhan@sbPg
+johannesburg's jOhan@sbPgz
+johannesen jOhan@s~
+johannessen jOhan@s~
+johanning jOhan6N
+johanning yOhan6N
+johanns yOhonz
+johannsen jOhans~
+johansen jOhans~
+johanson jOhans~
+johansson jOhons~
+johansson yOhons~
+john jon
+john's jonz
+johnathon jon@T~
+johnathon's jon@T~z
+johndrow jondr]
+johnie jon/
+johnnie jon/
+johnnie's jon/z
+johnny jon/
+johnny's jon/z
+johns jonz
+johns's jonz@z
+johnsen jons~
+johnsen's jons~z
+johnsey jonz/
+johnson jons~
+johnson's jons~z
+johnsons jons~z
+johnsrud jonsr@d
+johnston jonst~
+johnston's jonst~z
+johnstone jonstOn
+johnstown jonzt?n
+johnta jont@
+johny jon/
+johson jos~
+joice j<s
+joie Zwo
+join j<n
+joined j<nd
+joiner j<nP
+joinery j<nP/
+joines j<nz
+joining j<n6N
+joins j<nz
+joint j<nt
+jointed j<n@d
+jointed j<nt@d
+jointly j<ntl/
+jointness j<ntn@s
+joints j<nts
+joist j<st
+joists j<sts
+jojola y]yOl@
+joke jOk
+jokebook jOkbqk
+joked jOkt
+jokela jok@l@
+joker jOkP
+jokers jOkPz
+jokerst jokPst
+jokes jOks
+jokhang jokhaN
+joki jOk/
+jokinen j@kin~
+joking jOk6N
+jokingly jOk6Nl/
+jolene j]lEn
+joles jOlz
+joletta j]let@
+jolette jOlet
+jolicoeur Zol6kP
+joliet jOl/et
+jolin jOlin
+jolivette Zol6vct
+jolla h<y@
+jolla jOl@
+jolley jol/
+jollie jol/
+jollies jol/z
+jolliff jolif
+jolliffe jolif
+jolly jol/
+jollying jol/6N
+jolson jOls~
+jolt jOlt
+jolted jOlt@d
+jolting jOlt6N
+jolts jOlts
+joly jOl/
+jon jon
+jon's jonz
+jonah jOn@
+jonas jOn@s
+jonassaint jOn@sAnt
+jonassaint's jOn@sAnts
+jonassen jon@s~
+jonathan jon@T~
+jonathan's jon@T~z
+jonathon jon@T~
+jonbenet j{nb~A
+joncas joNk@z
+jone jOn
+jones jOnz
+jones' jOnz
+jones's jOnz@z
+jonesboro jOnzb@r]
+joneses jOnz@z
+jonestown jOnzt?n
+jong j{N
+joni jOn/
+jonker joNkP
+jonn jon
+jonothan jon@T~
+jonsman jonzm~
+jonson jons~
+jonsson jons~
+joo jU
+joon jUn
+joong jqN
+joos jUz
+joost jUst
+joosten yUs~
+joplin joplin
+jopling jOp@l6N
+jopp jop
+jordache j{rdaS
+jordahl j{rdol
+jordan j{rd~
+jordan's j{rd~z
+jordana y{rdan@
+jordanian j{rdAn/~
+jordanians j{rdAn/~z
+jordans j{rd~z
+jorde j{rd
+jorden j{rd~
+jordy j{rd/
+jorge h{rhA
+jorgensen j{rg~s~
+jorgenson j{rg~s~
+jorio j{r/]
+jornal j{rn@l
+jorstad j{rst@d
+jory j{r/
+jos jOz
+josceline jos@lIn
+joscelyn jos@l~
+joscelyne jos@lIn
+jose hOzA
+jose's hOzAz
+josef jOs@f
+joseph jOs@f
+joseph jOz@f
+joseph's jOz@fs
+josepha j]sef@
+josephina jos@fIn@
+josephine jOs@fEn
+josephs jOs@fs
+josephson jOs@fs~
+josephthal jOs@fT{l
+josephus j]sEf@s
+joser jOzP
+joser's jOzPz
+josette Z@set
+josey jOz/
+josh joS
+joshi jOS/
+joshua joSU@
+josiah j]sI@
+josie jOz/
+joske's j{sk/z
+josleyn joslin
+joslin joslin
+joslyn j{slin
+jospin jospin
+joss j{s
+josselyn jos@l~
+jost jost
+josten jos~
+jostens j{st~z
+jostes jOsts
+jostle jos@l
+jostled jos@ld
+jostling jos@l6N
+jostling josl6N
+joswick josw6k
+jot jot
+jotted jot@d
+joubert y?bPt
+jouett joUt
+joule jUl
+joules jUlz
+joulwan jUlhwon
+joulwan jUlwon
+jour j?r
+jourdan Zqrdan
+jouret ZworA
+jouret jPet
+jouret's ZworAz
+jouret's jPets
+journal jVn@l
+journal's jVn@lz
+journalese jVn@lEz
+journalism jVn@liz}
+journalism's jVn@liz}z
+journalist jVn@l@st
+journalist's jVn@l@sts
+journalistic jVn@list6k
+journalistically jVn@list6k@l/
+journalistically jVn@list6kl/
+journalists jVn@l@s
+journalists jVn@l@ss
+journalists jVn@l@sts
+journalists' jVn@l@sts
+journals jVn@lz
+journey jVn/
+journeyed jVn/d
+journeying jVn/6N
+journeyman jVn/man
+journeyman's jVn/m~z
+journeys jVn/z
+joust j?st
+jousting j?st6N
+jovan jOv~
+jovanovic y@v~ov6k
+jovanovich j]van@v6C
+jovi jOv/
+jovial jOv/@l
+jovian jOv/~
+jovita y@vIt@
+jovito j]vEt]
+jowers j?Pz
+jowett j?ct
+jowl j?l
+jowley jOl/
+jowls j?lz
+jowly j?l/
+joy j<
+joy's j<z
+joyal j<@l
+joyce j<s
+joyce's j<s@z
+joycelyn j<slin
+joycelyn's j<slinz
+joye j<
+joyful j<f@l
+joyfully j<f@l/
+joying j<6N
+joyner j<nP
+joynes j<nz
+joynt j<nt
+joyoni j<On/
+joyous j<@s
+joyride j<rId
+joyriding j<rId6N
+joys j<z
+joystick j<stik
+jozef jOz@f
+jozwiak yozv/ak
+jr jA)r
+jr jUnyP
+ju jU
+jua jU@
+juan hwon
+juan won
+juana hwon@
+juana won@
+juanita wonEt@
+juanita wonEt@
+juarez hw)rez
+juarez w)rez
+juarez-espin hworezespin
+juarez-espin worezespin
+juba jUb@
+jubb jub
+jubilant jUb@l~t
+jubilation jUb@lAS~
+jubilee jUb@lE
+jubilee jUb@lE
+juckett jukct
+judah jUd@
+judaism jUd/iz}
+judaism jUdAiz}
+judaism's jUd/iz}z
+judaism's jUdAiz}z
+judas jUd@s
+juday jUdA
+judd jud
+judds judz
+jude jUd
+jude's jUdz
+judea jUdE@
+judeo jUdA]
+judge juj
+judge's juj@z
+judged jujd
+judgement jujm~t
+judgemental j@jment@l
+judgements jujm~ts
+judges juj@z
+judges' juj@z
+judgeship jujSip
+judgeships jujSips
+judging juj6N
+judgment jujm~t
+judgmental j@jmen@l
+judgmental j@jment@l
+judgments jujm~ts
+judicate jUd6kAt
+judice jUdis
+judicial jUdiS@l
+judicially jUdiS@l/
+judiciary jUdiS/er/
+judicious jUdiS@s
+judiciously jUdiS@sl/
+judie jud/
+judishe jUdES
+judith jUd@T
+juditha jUdiT@
+judkins judk~z
+judo jUdO
+judsen juds~
+judson juds~
+judy jUd/
+judy's jUd/z
+jue jU
+juedes jwedcs
+juedes yUedcs
+juel jUl
+juenemann yUnm~
+juenger yUNgP
+juergen jVg~
+juergen yVg~
+juergens jVg~z
+juergens yVg~z
+jueteng jUteN
+juett jUt
+jug jug
+juge jUj
+juggernaut jugPn{t
+juggle jug@l
+juggled jug@ld
+juggler jug@lP
+jugglers jug@lPz
+juggles jug@lz
+juggling jug@l6N
+juggling jugl6N
+jugs jugz
+jugular jUgy@lP
+juhas jU@z
+juhasz yuhuS
+juhl jul
+juhlin jUlin
+juhnke juNk
+juice jUs
+juices jUs@z
+juicier jUisyP
+juiciest jUs/@st
+juicy jUs/
+juilliard jUl/ord
+jujitsu jUjitsU
+jujo jUj]
+juju jUjU
+juke jUk
+jukebox jUkboks
+jukeboxes jUkboks@z
+jukes jUks
+juki jUk/
+jule jUl
+julep jUl@p
+juleps jUl@ps
+jules jUlz
+juli jUl/
+julia jUly@
+julia's jUly@z
+julian jUl/~
+julian jUly~
+juliana jUl/an@
+juliann jUl/an
+juliann jUly~
+julianne jUl/en
+juliano jUl/on]
+julie jUl/
+julie's jUl/z
+julien jUl/~
+juliet jUl/et
+julieta yUlEt@
+julietta jUl/et@
+juliette jUl/et
+julin jUlin
+julina yUlEn@
+juline jUlIn
+julio hUl/]
+julio jUl/]
+julius jUly@s
+juliusz jUl/Us
+julliard jUl/ord
+julson juls~
+july j@lI
+july jUlI
+july's j@lIz
+july's jUlIz
+jumanji jUmonj/
+jumble jumb@l
+jumbled jumb@ld
+jumbo jumb]
+jumbos jumbOz
+jumbotron jumb]tr{n
+jumbotrons jumb]tr{nz
+jumonville Zum~vil
+jump jump
+jumped jumpt
+jumper jumpP
+jumpers jumpPz
+jumping jump6N
+jumps jumps
+jumpstart jumpstort
+jumpsuit jumpsUt
+jumpy jump/
+jun jun
+junco juNk]
+junction juNkS~
+juncture juNkCP
+junctures juNkCPz
+junda jund@
+jundt junt
+june jUn
+june's jUnz
+juneau jUn]
+junejo jUnAh]
+junek jUn6k
+junella jUnel@
+junes jUnz
+junette jUnet
+jung yqN
+jung's yqNz
+jungbluth juNblUT
+junge juN
+jungels juNg@lz
+junger juNP
+jungers juNPz
+junghans juNg~z
+jungle juNg@l
+jungles juNg@lz
+jungman juNm~
+jungwirth juNgwPT
+junia yUn/@
+juniata yUn/ot@
+junine junin
+junior jUnyP
+junior's jUnyPz
+juniors jUnyPz
+juniper jUn@pP
+junipers jUn@pPz
+junius jUn/@s
+junji junj/
+junk juNk
+junkbond juNkbond
+junked juNkt
+junker juNkP
+junket juNk@t
+junkets juNk@ts
+junkholder juNkhOldP
+junkholders juNkhOldPz
+junkie juNk/
+junkier juNk/P
+junkies juNk/z
+junkiest juNk/@st
+junkin juNkin
+junking juNk6N
+junkins juNkinz
+junky juNk/
+junkyard juNkyord
+junkyards juNkyordz
+juno jUn]
+juno's jUn]z
+junod jUn@d
+junot jUn@t
+junta hqnt@
+juntunen junt~~
+jupin jUpin
+jupiter jUp@tP
+jupiter's jUp@tPz
+juppe jUp/
+jurado yqrod]
+juran yqron
+juranek jqr~6k
+juras jqr@z
+jurassic jqras6k
+jurczak yVCak
+jurczyk yVC6k
+jure jqr
+jurek jqrck
+jurek yqrck
+jurewicz jqr@v6C
+jurewicz yqr@v6C
+jurgen jVg~
+jurgens jVg~z
+jurgensen jVg~s~
+jurgensmeyer jVg~zmIr
+jurgenson jVg~s~
+jurica jqr6k@
+jurich jqr6k
+juries jqr/z
+juris jqris
+jurisdiction jqr@sdikS~
+jurisdictional jqr@sdikS~@l
+jurisdictions jqr@sdikS~z
+jurisprudence jqr@sprUd~s
+jurisprudential jqr@sprUdenC@l
+jurisprudential jqr@sprUdenS@l
+jurist jqrist
+jurists jqris
+jurists jqriss
+jurists jqrists
+jurkiewicz yVk@v6C
+jurkovich yVk@v6C
+jurkowski yPk{fsk/
+jurney jVn/
+juror jqrP
+juror's jqrPz
+jurors jqrPz
+jurors' jqrPz
+jurs jVz
+jury jqr/
+jury's jqr/z
+jusco jusk]
+jusino yUsEn]
+just j@st
+just just
+justa j@st@
+justa just@
+justen just~
+juster justP
+justesen just/z~
+justice just@s
+justice's just@s@z
+justices just@s@z
+justices' just@s@z
+justifiable just@fI@b@l
+justifiably just@fI@bl/
+justification just@f6kAS~
+justifications just@f6kAS~z
+justified just@fId
+justifies just@fIz
+justify just@fI
+justifying just@fI6N
+justin just~
+justin's just~z
+justina yUstEn@
+justine j@stEn
+justiniano jUst/n/on]
+justino j@stEn]
+justis yUstis
+justiss yUst/s
+justly justl/
+justman justm~
+justo just]
+justus just@s
+justy just/
+jut jut
+jute jUt
+jutland jutl~d
+jutras yUtroz
+juts juts
+jutting jut6N
+juul jU@l
+juve jUv
+juvenile jUv~@l
+juvenile jUv~Il
+juvenile's jUv~@lz
+juvenile's jUv~Ilz
+juveniles jUv~@lz
+juveniles jUv~Ilz
+juxtapose jukst@pOz
+juxtaposed jukst@pOzd
+juxtaposition jukst@p@ziS~
+juxtapositions jukst@p@ziS~z
+jyishane jESAn
+jynx jiNks
+k kA
+k's kAz
+k-mart kAm)rt
+k-mart's kAm)rts
+k. kA
+k.'s kAz
+ka ko
+kaas koz
+kaatz kots
+kabart k@b)rt
+kabat kab@t
+kabbalah k@bol@
+kabbani k@bon/
+kabel kab@l
+kabi kab/
+kabi kob/
+kabivitrum k@biv@tr}
+kable kAb@l
+kabler kAb@lP
+kaboom k@bUm
+kabral k@brol
+kabuki k@bUkE
+kabul kobql
+kacer kAsP
+kach kaC
+kachel kak@l
+kachigian k@SEg/~
+kachigian k@Sig/~
+kachmar kakmP
+kachur kaCP
+kackley kakl/
+kaczmarczyk koCmPC6k
+kaczmarek k@Cm)rck
+kaczmarski k@Cm)rsk/
+kaczor koCP
+kaczorowski k@CP{fsk/
+kaczynski k@Cinsk/
+kaczynski k@zinsk/
+kaczynski's k@Cinsk/z
+kaczynski's k@zinsk/z
+kadar k@d)r
+kadar kadP
+kade kAd
+kadel kad@l
+kaden kAd~
+kader kAdP
+kading kAd6N
+kadish kAd6S
+kadlec kodl6k
+kadow kod]
+kadrescu k@dreskyU
+kadrmas kadPmoz
+kadumi k@dUm/
+kady kAd/
+kaeding ked6N
+kaehler kelP
+kael kAl
+kaelin kel~
+kaelin's kel~z
+kaercher k,rkP
+kaeser kAzP
+kaestner kestnP
+kaetzel ketz@l
+kafelnikov k@feln6k{f
+kafelnikov k@feln6k{v
+kafer kAfP
+kaffenberger kaf~bPgP
+kafka kofk@
+kafka's kofk@z
+kafkaesque kofk@esk
+kagami kag}/
+kagan kAg~
+kagarlitsky kagPlitskE
+kagawa k@gow@
+kage kAj
+kagel kAg@l
+kagey kAj/
+kageyama kog/om@
+kagin kAgin
+kagins kAginz
+kagler kaglP
+kagy kAg/
+kah ko
+kahan k@hon
+kahan's k@honz
+kahane k@hAn
+kahane k@honA
+kahl kol
+kahle kol
+kahler kolP
+kahley kol/
+kahn kon
+kahn's konz
+kahng koN
+kahr k)r
+kahr's k)rz
+kahre k)r
+kahre k,r
+kahrs k)rz
+kahuna k@hUn@
+kai kI
+kaifu kIfU
+kaigler kAglP
+kail kAl
+kailash kAl6S
+kaim kAm
+kain kAn
+kaine kAn
+kainer kAnP
+kainz kAnz
+kairamo kerom]
+kairey k,r/
+kaiser kIzP
+kaiser's kIzPz
+kaiseraugst kIzP{gst
+kaisertech kIzPtek
+kaisertech's kIzPteks
+kaisha kAS@
+kaji koj/
+kajima kojEm@
+kajuahar k@jU@hor
+kakadu kokodU
+kakimoto kok}Ot]
+kakos kAk]z
+kaktovik kaktOv6k
+kakuei kakyU/
+kakumaru kokUm)rU
+kal kAAel
+kal kal
+kalafut kal@f@t
+kalal kAl@l
+kalamazoo kal}@zU
+kalan kAl~
+kalas kol@z
+kalashnikov k@laSn6kov
+kalata k@lot@
+kalb kalb
+kalbach kalbok
+kalberer kalbPP
+kalbfleisch kalbflIS
+kale kAl
+kaleel kal/l
+kaleida k@lId@
+kaleidoscope k@lId@skOp
+kalen kAl~
+kaler kAlP
+kaleta kalct@
+kaley kAl/
+kalgoorlie kalgUrl/
+kalikow kal6k]
+kalil kal@l
+kalin kalin
+kalina k@lIn@
+kaliningrad k@lin6Ngrad
+kalinoski k@lin?sk/
+kalinowski k@lin{fsk/
+kalinske k@linsk/
+kalinski k@linsk/
+kalis kalis
+kalish kal6S
+kalisz kol6S
+kaliszewski k@l6Sefsk/
+kalivoda k@l6vOd@
+kalk k{k
+kalka kalk@
+kalkaska kalkosk@
+kalkbrenner kalkbrcnP
+kall k{l
+kalla kal@
+kallal kal@l
+kallam kal}
+kallas kal@z
+kallay kalA
+kallen k{l~
+kallenbach kal~bok
+kallenberger k{l~bPgP
+kallhoff kalh{f
+kalliel kal/@l
+kallins kalinz
+kallio kal/]
+kallis kalis
+kallman k{lm~
+kallmeyer kalmIP
+kallstrom kalstr}
+kallus kal@s
+kalman kalm~
+kalmanovitz kalman@vits
+kalmar kalmP
+kalmbach kalmbok
+kalmus kalmis
+kalnins kalninz
+kalo kAl]
+kalok kalok
+kalous kal@s
+kalp kalp
+kalt k{lt
+kaltenbach kalt~bok
+kaltenbacher kolt~bokP
+kalter k{ltP
+kalthoff kalT
+kalugin k@lUg~
+kaluza k@lUz@
+kaluzny k@luzn/
+kalvar kalvor
+kam kam
+kama kom@
+kamakau kom@koU
+kamakau's kom@koUz
+kamal kAm@l
+kamali k}ol/
+kaman kAm~
+kamber kambP
+kamchatka kamCatk@
+kamchatka komCotk@
+kamehameha k}A}A@
+kamehameha's k}A}A@z
+kamei kam/
+kamei komA
+kamel kom@l
+kamen kAmcn
+kamen komcn
+kamenar kam~P
+kamens kAmcnz
+kamens komcnz
+kamentsev k}entsov
+kamer kAmP
+kamerer kamPP
+kamikaze kom@koz/
+kamin kAmin
+kamin kamin
+kaminer kam~P
+kamins kAminz
+kamins kaminz
+kaminski k}insk/
+kaminsky k}insk/
+kamir k}ir
+kamke kamk/
+kamler kam@lP
+kamm kam
+kamman kam~
+kammer kamP
+kammerer kamPP
+kammerzell kamPz@l
+kammeyer kamIP
+kamneva kamnAv@
+kamp kamp
+kamp's kamps
+kampa kamp@
+kampala k}pol@
+kampe kamp
+kampelman kamp@lm~
+kampen kamp~
+kamper kampP
+kampf kampf
+kampfer kampfP
+kamphaus kamph?s
+kampman kampm~
+kampmann kampm~
+kamps kamps
+kampschulte kampSqlt/
+kamra kamr@
+kamradt kamr@t
+kamran kamr~
+kamrath kamr@T
+kamstra kamstr@
+kan kan
+kana kan@
+kanade k~odA
+kanady kan@d/
+kanagy kan@j/
+kanai k~I
+kanak kan@k
+kanan kAn~
+kanarek kanP6k
+kanawa konow@
+kanawha k~{h@
+kanazawa konozow@
+kanda kand@
+kandahar kand@hor
+kandel kand@l
+kandler kandlP
+kandt kant
+kane kAn
+kane's kAnz
+kaneb kan@b
+kanegsberg kan@gzbPg
+kaneko konAk]
+kanemaru kancm)rU
+kanemaru's konAm)rUz
+kaner kAnP
+kaneshiro konASir]
+kaney kAn/
+kang kaN
+kang koN
+kangaroo kaNgPU
+kangaroos kaNgPUz
+kangas kaNg@z
+kanghua kaNhyU@
+kangyo kanjy]
+kania konE@
+kaniewski kon/Usk/
+kaniewski kon/efsk/
+kanipe kanip
+kanis kanis
+kanitz kanits
+kanji kanj/
+kanjorski k~j{rsk/
+kanka kaNk@
+kanka kank@
+kankakee kaNk6k/
+kankaku konkokU
+kann kan
+kannan kon~
+kanne kan
+kannenberg kan~bPg
+kanner kanP
+kanno kan]
+kano kon]
+kanode k~Od
+kanon kAn~
+kanouse kon]UsA
+kansai kansI
+kansallis kansalis
+kansan kanz~
+kansan's kanz~z
+kansans kanz~z
+kansans' kanz~z
+kansas kanz@s
+kansas' kanz@s
+kansas's kanz@s@z
+kansian kanz/~
+kant kant
+kanter kantP
+kanter's kantPz
+kantian kant/~
+kantner kantnP
+kantola k~tOl@
+kantor kantP
+kantor's kantPz
+kantor's kant{rz
+kantrowitz kantr@wits
+kantz kants
+kanz kanz
+kanzi konz/
+kanzler kanzlP
+kao k?
+kao kAO
+kaohsiung kAOs/@N
+kaolin k?l~
+kaolin kA]l~
+kaori k{r/
+kapaun kap?n
+kapfer kapfP
+kapinos kap/n]z
+kapitan kap@t~
+kaplain kapl~
+kaplain's kapl~z
+kaplan kapl~
+kaplan's kapl~z
+kapler kAp@lP
+kaplin kaplin
+kaplow kapl]
+kaplowitz kopl@wits
+kapner kapnP
+kapnick kapn6k
+kapoor k@pUr
+kapor kApP
+kaposi k@pOs/
+kaposi's k@pOs/z
+kapp kap
+kappa kap@
+kappel kap@l
+kappeler kap@lP
+kappelman kap@lm~
+kapper kapP
+kappes kaps
+kappler kaplP
+kappus kap@s
+kapral kapr@l
+kaprayoon kapr@yUn
+kaps kaps
+kapton kapt~
+kaptur kaptP
+kapur kapP
+kapuscinski k@p@sCinsk/
+kapusta k@pust@
+kara k,r@
+karabakh k,r@bak
+karabin korob/n
+karachi koroC/
+karadzic koroj6k
+karadzic's koroj6ks
+karaffa kar@f@
+karajan k,r@j~
+karam kar}
+karami kPom/
+karan k,r~
+karan's k,r~z
+karanicki ker~ik/
+karanitski ker~itsk/
+karaoke ker/Ok/
+karas k)r@z
+karasawa kor@sow@
+karasek kPosck
+karasik kPos6k
+karat k,r@t
+karate kPot/
+karatirm kV@tPm
+karatsu kPatsU
+karatz k,r@ts
+karban k)rb~
+karbassioun korbas/Un
+karber k)rbP
+karbowski kPb{fsk/
+karch k)rk
+karcher k)rCP
+karcz k)rC
+karczewski kPCefsk/
+kardashian kod6SAn
+kardashian's kod6SAnz
+kardell k)rd@l
+kardos k)rd]z
+kareem kPEm
+kareem's kPEmz
+karel k,r@l
+karelian kPEl/~
+karels k,r@lz
+karen k,r~
+karen's k,r~z
+karenina k@ren~@
+karenina kercnEn@
+karet k,r@t
+karg k)rg
+karger k)rgP
+karges k)rj@z
+kargonaov k)rg~{v
+kari k,r/
+karibu kerEbU
+karim kPEm
+karimi korEm/
+karin k,rin
+karino kerEn]
+kariotis kor/Otis
+karis k,r/z
+karl k)rl
+karl's k)rlz
+karla k)rl@
+karle k)r@l
+karlen k)rl~
+karlheinz k)rlhInz
+karlik k)rl6k
+karlin k)rlin
+karline k)rlIn
+karlow k)rl]
+karls k)rlz
+karlsen k)rls~
+karlson k)rls~
+karlsruhe k)rlzrU
+karlsson k)rls~
+karma k)rm@
+karman k)rm~
+karn k)rn
+karnal k)rn@l
+karner k)rnP
+karnes k)rnz
+karney k)rn/
+karnicki kornik/
+karnow k)rn?
+karnow k)rn]
+karns k)rnz
+karnsund k)rns~d
+karol k,r{l
+karolina ker@lIn@
+karoline k,r@lIn
+karolinska ker]linsk@
+karoly kPOl/
+karolyi kPOly/
+karolyn kar@l~
+karon k,r~
+karos k)r]s
+karoun kPUn
+karow k)r]
+karp k)rp
+karpatkin korpatk~
+karpel k)rp@l
+karpen k)rp~
+karpf k)rpf
+karpinski kPpinsk/
+karpov k)rpov
+karpowicz k)rp@v6C
+karr k)r
+karraker k)r@kP
+karras kar@z
+karren kar~
+karrer k)rP
+karrick kar6k
+karriker kar6kP
+karry k,r/
+karsh k)rS
+karshner k)rSnP
+karson k)rs~
+karst k)rst
+karstadt k)rstat
+karsten k)rst~
+karstens k)rst~z
+karstetter k)rstctP
+kartasasmita kortas@smEt@
+kartchner k)rCnP
+karter k)rtP
+kartes k)rts
+karun kPUn
+karvonen k)rv~~
+karwoski kPv?sk/
+karwowski kPv{fsk/
+kary k,r/
+karydakis ker/dakis
+karyn karin
+kasabian k@sAb/~
+kasagic k@sog6k
+kasal kAs@l
+kasch kaS
+kaschak kaS@k
+kasdorf kasd{rf
+kase kAz
+kasel kas@l
+kasell kas@l
+kaseman kAsm~
+kaser kAzP
+kasese k@sEz/
+kasey kas/
+kash kaS
+kashiwagi kaS@wag/
+kashiwahara koS/w@h)r@
+kashiwahara's koS/w@h)r@z
+kashiyama koS/yom@
+kashmir kaSm/r
+kashmir kaSm6r
+kashmiri kaSmEr/
+kashner kaSnP
+kashoggi k@Soj/
+kashuba k@SUb@
+kasich kos6C
+kasich's kos6C@z
+kasick kos6k
+kasik kos6k
+kasinga k@siNg@
+kasinga's k@siNg@z
+kasinger kasinjP
+kaska kosk@
+kaske kask/
+kaskel kask@l
+kasler kas@lP
+kasmer kas}P
+kasmira k@smIr@
+kasner kasnP
+kaspar kaspP
+kasparek kaspP6k
+kasparian k@sp,r/~
+kasparov k@sp)rov
+kasparov kaspPov
+kasper kaspP
+kasperek kaspP6k
+kasperski k@spVsk/
+kasprowicz kospr@v6C
+kasprzak kospPz@k
+kasprzyk kospPz6k
+kasputys kaspyUt@s
+kasriel kasr/@l
+kass kas
+kassa kas@
+kassab kas@b
+kassan kas~
+kassar kasP
+kassebaum kas@b?m
+kassebaum kas@bom
+kassebaum's kas@b?mz
+kassebaum's kas@bomz
+kassel kas@l
+kassem kas}
+kassen kas~
+kassin kasin
+kassing kas6N
+kassis kasis
+kassler kaslP
+kassner kasnP
+kasson kas~
+kast kast
+kastel kAst@l
+kastelic k@stel6k
+kasten kast~
+kastenmeier kast~mIr
+kastens kAs~z
+kaster kastP
+kastl kast@l
+kastle kas@l
+kastler kastlP
+kastner kastnP
+kasun kosUn
+kasza koS@
+kaszuba k@SUb@
+kat kat
+kataoka kotoOk@
+katarina kotPEn@
+katarina's kotPEn@z
+katashiba kat@SEb@
+katayama kotoyom@
+katayan kot@yon
+katcher kaCP
+kate kAt
+kate's kAts
+katen kAt~
+kater kAtP
+kates kAts
+katey kAt/
+kath kaT
+katha kaT@
+kathalene kaT@lEn
+kathan kaT~
+katharina kaTcrEn@
+katharine kaTrin
+katherine kaTPin
+katherine kaTrin
+kathi kaT/
+kathie kaT/
+kathleen kaTlEn
+kathleen's kaTlEnz
+kathlene kaTlEn
+kathline kaTlIn
+kathman kaTm~
+kathryn kaTrin
+kathy kaT/
+kathy's kaT/z
+kati kAt/
+katia kot/@
+katie kAt/
+katja koty@
+katmandu katmandU
+kato kAt]
+kato's kAt]z
+katona kotOn@
+katragadda kotr@god@
+katrina k@trEn@
+kats kats
+katsanos katson]s
+katsaros katsP]z
+katsuhiko kotsUhEk]
+katsumi kotsUm/
+katsushi katsUS/
+katt kat
+kattner katnP
+katuni k@tUn/
+katy kAt/
+katya koty@
+katydid kAt/did
+katyn k@tEn
+katyn kAtin
+katyn kAt~
+katyusha k@tyUS@
+katyushas k@tyUS@z
+katz kats
+katzen katz~
+katzenbach kats~bok
+katzenberg kats~bPg
+katzenberg's kats~bPgz
+katzenberger katz~bPgP
+katzenstein kats~st/n
+katzenstein kats~stIn
+katzer katsP
+katzin katsin
+katzman katsm~
+kau k?
+kauai k?I
+kauble k{b@l
+kaucher k?kP
+kauer k?P
+kaufer k{fP
+kauffman k{fm~
+kauffmann k{fm~
+kaufhof k{fh{f
+kaufhold k?fh]ld
+kaufman k{fm~
+kaufman's k{fm~z
+kaufmann k{fm~
+kauk k{k
+kaul k{l
+kaunda k{nd@
+kaup k{p
+kaupp k{p
+kauppi k{p/
+kaus k{z
+kausch k?S
+kauth k{T
+kautz k{ts
+kautzman k?tsm~
+kauzlarich k?zlP6k
+kavan kAv~
+kavanagh kav~{
+kavanaugh kav~{
+kaveney kav~/
+kavner kavnP
+kavner k{vnP
+kawa kow@
+kawaguchi kowogUC/
+kawahara kowoh)r@
+kawai kowo/
+kawakami kowokom/
+kawamoto kowomOt]
+kawamura k?omqr@
+kawano kowon]
+kawasaki kowosok/
+kawashima kowoSEm@
+kawasmi k@wosm/
+kawate kowotA
+kawecki kovetsk/
+kaweske k@wesk/
+kaweske kovesk/
+kay kA
+kay's kAz
+kaya koy@
+kayak kIak
+kayaking kIak6N
+kayaks kIaks
+kayapo kI@pO
+kaydon kAd~
+kaye kA
+kayes kAz
+kayla kAl@
+kaylie kAl/
+kaylor kAlP
+kaylynn kAlin
+kayne kAn
+kayo kAO
+kaypro kApr]
+kays kAz
+kayser kAzP
+kaysersberg kIzPzbPg
+kayvon kAvon
+kazakh kazak
+kazakhs kazaks
+kazakhstan k@zakstan
+kazakhstan kozokston
+kazakhstan's k@zakstanz
+kazakhstan's kozokstonz
+kazan kAz~
+kazanjian k@zanj/~
+kazarian k@z,r/~
+kazarian's k@z,r/~z
+kazda kozd@
+kazee koz/
+kazempour k@zemp?r
+kazen kaz~
+kazikaev kaz6kAv
+kazin kAzin
+kazis kazis
+kazlauskas kazl?sk@z
+kazmer kazmP
+kazmierczak kozm6rCak
+kazmierski k@zmirsk/
+kazoo k@zU
+kazuhiko kozUhEk]
+kazuo kozU]
+kcal kAkol
+kcop kAk{p
+kea kE
+keach kEC
+keadle kEd@l
+keady kEd/
+keagan kEg~
+keagle kEg@l
+keagy kEj/
+keahey kEh/
+keal kEl
+kealey kEl/
+kealy kEl/
+kean kEn
+kean's kEnz
+keane kEn
+keaney kEn/
+keanu k/onU
+keanu kAonU
+kear kir
+kearby kVb/
+kearfott kirfot
+kearley kVl/
+kearn kVn
+kearney kVn/
+kearney's kVn/z
+kearns kVnz
+kearny kVn/
+kearsarge kErsorj
+kearse kVs
+keary kir/
+keas kEz
+keasler kEzlP
+keasling kEzl6N
+keast kEst
+keath kET
+keathley kETl/
+keathley's kETl/z
+keating kEt6N
+keating's kEt6Nz
+keatley kEtl/
+keaton kEt~
+keator kEtP
+keats kEts
+keatts kEts
+keaveney kEv~/
+keaveny kEv~/
+keay kE/
+kebab-n-kurry k@bob~kV/
+keck kek
+keckler keklP
+kedar kEdP
+keddy ked/
+kedo ked]
+kedrowski k@dr{fsk/
+keds kedz
+kedzierski k6jirsk/
+kee kE
+kee's kEz
+keeble kEb@l
+keebler kEblP
+keech kEC
+keedy kEd/
+keef kEf
+keefe kEf
+keefer kEfP
+keeffe kEf
+keegali kEgol/
+keegali's kEgol/z
+keegan kEg~
+keehan kE~
+keehn kEn
+keehner kEnP
+keel kEl
+keelan kEl~
+keele kEl
+keeler kElP
+keeley kEl/
+keelin kElin
+keeling kEl6N
+keels kElz
+keelson kels~
+keely kEl/
+keen kEn
+keena kEn@
+keenan kEn~
+keene kEn
+keeneland kEn@l~d
+keener kEnP
+keenest kEn@st
+keeney kEn/
+keenly kEnl/
+keenum kEn}
+keeny kEn/
+keep kEp
+keeper kEpP
+keepers kEpPz
+keeping kEp6N
+keeps kEps
+keepsake kEpsAk
+keepsakes kEpsAks
+keeran kir~
+kees kEz
+keese kEz
+keesee k/sE
+keesey kEs/
+keesler kEzlP
+keesling kEzl6N
+keetch kEC
+keeter kEtP
+keeth kET
+keeton kEt~
+keever kEvP
+keevil kEv@l
+keezer kEzP
+kefauver kef?vP
+keffer kefP
+keg keg
+kegel kej@l
+kegg keg
+kegler keglP
+kegley kegl/
+kegs kegz
+kehl kel
+kehler kelP
+kehm kem
+kehn ken
+kehne ken
+kehoe keh]
+kehr k,r
+kehrer k,rP
+kehres k,rz
+keicher kIkP
+keidanren kIdanr~
+keidel kId@l
+keifer kEfP
+keiffer kEfP
+keigley kEgl/
+keiichi kAEC/
+keiji kEj/
+keiko kAk]
+keil kEl
+keillor kElP
+keillor's kElPz
+keilman kIlm~
+keim kEm
+keimig kEm6g
+keinath kIn@T
+keiner kEnP
+keio kA]
+keiper kEpP
+keir kEr
+keiretsu kiretsU
+keirn kirn
+keirns kIrnz
+keirsey kirs/
+keisei kIsA
+keiser kIsP
+keisler kIs@lP
+keisling kIs@l6N
+keister kE@stP
+keisuke kAsUk/
+keitel kIt@l
+keiter kEtP
+keith kET
+keith's kETs
+keithley kETl/
+keithly kETl/
+keitt kEt
+keitz kEts
+keizai kEzA
+keizer kEzP
+keizer kIzP
+kekst kekst
+kelbaugh kelb{
+kelber kelbP
+kelberg kelbPg
+kelberg's kelbPgz
+kelby kelb/
+kelcey kels/
+kelch kelC
+kelchner kelknP
+kelda keld@
+kelder keldP
+keleher kel@hP
+keleman kElm~
+kelemen kElmcn
+kelker kelkP
+kell kel
+kellam kel}
+kellams kel}z
+kellan kel~
+kellar kelP
+kelleher kel@hP
+kellems kelcmz
+kellen kel~
+kellenberger kel~bPgP
+kellenyi keleny/
+keller kelP
+keller's kelPz
+kellerman kelPm~
+kellermann kelPm~
+kellett kelct
+kelley kel/
+kelley's kel/z
+kelli kel/
+kelli's kel/z
+kelliher kel@hP
+kelling kel6N
+kellis kelis
+kellison kel@s~
+kellman kelm~
+kellner kelnP
+kellogg kel{g
+kellogg's kel{gz
+kelloggs kel{gz
+kellough kel?
+kellow kel]
+kells kelz
+kellum kel}
+kellwood kelwqd
+kelly kel/
+kelly's kel/z
+kellyanne kel/an
+kellys kel/z
+kelm kelm
+kelman kelm~
+kelner kelnP
+kelnhofer kelnh@fP
+kelp kelp
+kelps kelps
+kelsall kels@l
+kelsay kelsA
+kelsch kelS
+kelsey kels/
+kelso kels]
+kelso's kels]z
+kelsoe kels]
+kelson kels~
+kelter keltP
+kelting kelt6N
+keltner keltnP
+kelton kelt~
+kelty kelt/
+keltz kelts
+kelvan kelv~
+kelven kelv~
+kelvin kelv~
+kelvin's kelv~z
+kem kem
+kemal k}ol
+kembel kemb@l
+kemble kemb@l
+kemeny kem~/
+kemerer kemPP
+kemery kemP/
+kemler kemlP
+kemmer kemP
+kemmerer kemPP
+kemmerling kemPl6N
+kemmons kem~z
+kemner kemnP
+kemnitz kemnits
+kemp kemp
+kemp's kemps
+kempa kemp@
+kempe kemp
+kempel kemp@l
+kempen kemp~
+kemper kempP
+kemper's kempPz
+kempf kempf
+kempfer kempfP
+kempke kempk
+kempker kempkP
+kemple kemp@l
+kempler kemplP
+kemplin kemplin
+kempner kempnP
+kemppainen kempIn~
+kempski kempsk/
+kempson kemps~
+kempster kempstP
+kempthorne kempT{rn
+kempton kempt~
+kemron kemr~
+ken ken
+ken's kenz
+kenaf kenaf
+kenagy ken@j/
+kenan kEn~
+kendal kend@l
+kendall kend@l
+kendall's kend@lz
+kendavis kendAvis
+kendell kend@l
+kender kendP
+kendig kend6g
+kendle kend@l
+kendra kendr@
+kendrick kendr6k
+kendricks kendr6ks
+kendzierski kcnjirsk/
+kendzior kcnjEP
+kenealy ken/@l/
+keneer k~ir
+kenefick kencf6k
+kenerson kenPs~
+kenesset kcnesct
+kenesset knesct
+kenetech ken@tck
+kenfield kenfEld
+kenichi kenEC/
+kenilworth ken@lwVT
+kenison ken@s~
+keniston ken@ston
+kenji kenj/
+kenkel keNk@l
+kenley kenl/
+kenmare kenm,r
+kenmore kenm{r
+kenn ken
+kenna ken@
+kennamer ken}P
+kennametal ken}et@l
+kennan ken~
+kennard kenPd
+kenneally ken@l/
+kennebeck kenbck
+kennebrew ken@brU
+kennebunkport ken@buNkp{rt
+kennecott ken@kot
+kennedy ken@d/
+kennedy's ken@d/z
+kennedys ken@d/z
+kennedys' ken@d/z
+kennel ken@l
+kennell ken@l
+kennelly ken@l/
+kennels ken@lz
+kennemer ken/mP
+kennemore kenm{r
+kenner kenP
+kenner's kenPz
+kennerly kenPl/
+kennerson kenPs~
+kennesaw ken@s{
+kenneth ken@T
+kennett ken@t
+kenney ken/
+kenning ken6N
+kennington ken6Nt~
+kennison ken@s~
+kennon ken~
+kenny ken/
+keno kEn]
+kenosha k~OS@
+kenoyer ken<P
+kenrick kenr6k
+kensinger kens~jP
+kensington kenz6Nt~
+kensler kens@lP
+kent kent
+kent's kents
+kente kentA
+kentner kentnP
+kenton kent~
+kentuckian kentuk/~
+kentuckians kentuk/~z
+kentucky k~tuk/
+kentucky's k~tuk/z
+kenward kenwPd
+kenway kenwA
+kenwood kenwqd
+kenworth kenwVT
+kenworthy kenwVT/
+kenya kEny@
+kenya keny@
+kenya's kEny@z
+kenya's keny@z
+kenyan kEny~
+kenyan keny~
+kenyans kEny~z
+kenyans keny~z
+kenyen keny~
+kenyon keny~
+kenzie kenz/
+kenzo kenz]
+keo kE]
+keogh kE?g
+keogh kE]
+keohane kE@hAn
+keokuk kE]k@k
+keokuk kE]kqk
+keough kE?g
+keough kE]
+keown kE]n
+kepco kepk]
+kephart kefort
+kepler keplP
+kepley kepl/
+keplinger kep@l6NP
+kepner kepnP
+kepp kep
+keppel kep@l
+kepple kep@l
+keppler keplP
+kept kapt
+kept kept
+ker kV
+kera k,r@
+kerala kerol@
+keranen k,r~~
+keratin k,r@tin
+keratotomy ker@t{t}/
+kerb kVb
+kerbel kVb@l
+kerber kVbP
+kerbow kVb]
+kerbs kVbz
+kerby kVb/
+kerce kVs
+kercher kVkP
+kercheval kVC6v@l
+kerchief kVC@f
+kerchiefs kVC@fs
+kerchner kVknP
+kerekes k,r6ks
+kerestes k,rcsts
+keresztes k,r@st/z
+kerfoot kVfqt
+kerfuffle kPfuf@l
+kerien k,r/~
+kerin k,rin
+kerins k,rinz
+kerker kVkP
+kerkhoff kVkh{f
+kerkman kVkm~
+kerkorian kPk{r/~
+kerkorian's kPk{r/~z
+kerl kVl
+kerley kVl/
+kerlin kVlin
+kerman kVm~
+kermit kVm@t
+kern kVn
+kern's kVnz
+kernaghan kPnagh~
+kernan kVn~
+kernel kVn@l
+kernels kVn@lz
+kernen kVn~
+kerner kVnP
+kernes kVnz
+kerney kVn/
+kernigan kVn@g~
+kernite kVnIt
+kernodle kVn]d@l
+kerns kVnz
+kerosene k,r@sEn
+kerouac k,rUak
+kerpedjiev kPpej/ev
+kerper kVpP
+kerr kV
+kerrey k,r/
+kerrey's k,r/z
+kerri k,r/
+kerrick k,r6k
+kerridge k,r6j
+kerrigan k,r6g~
+kerrigan's k,r6g~z
+kerrville kVvil
+kerry k,r/
+kerry's k,r/z
+kersch kVS
+kerscher kVSP
+kerschner kVSnP
+kersee kVs/
+kersey kVs/
+kersh kVS
+kershaw kVSo
+kershner kVSnP
+kerst kVst
+kerstein kVst/n
+kerstein kVstIn
+kersten kVst~
+kerstetter kVstctP
+kersting kVst6N
+kertesz kVt6S
+kerth kVT
+kertz kVts
+kervin kVvin
+kervorkian kPv{rk/~
+kervorkian kPv{rky~
+kerwen kVw~
+kerwin kVwin
+kerwood kVwqd
+kerzner kVznP
+kesel kes@l
+keshishian k@SiS/~
+kesinger kes6NP
+keske kesk
+keslar keslP
+kesler kes@lP
+kesling kes@l6N
+kesner kesnP
+kess kes
+kessel kes@l
+kessell kes@l
+kesselman kes@lm~
+kesselring kes@lr6N
+kessen kes~
+kessenich kes~6k
+kessinger kes6NP
+kessle kes@l
+kessler keslP
+kessler's keslPz
+kessner kesnP
+kestel kest@l
+kesten kes~
+kestenbaum kes~b?m
+kester kestP
+kesterson kestPs~
+kesting kest6N
+kestler kestlP
+kestler's kestlPz
+kestner kestnP
+kestrels kestr@lz
+keswick keswik
+ketch keC
+ketcham keC}
+ketchem keC}
+ketchen keC~
+ketcher keCP
+ketcherside keCPsId
+ketchie keC/
+ketchikan keC6kan
+ketchledge keClej
+ketchum keC}
+ketchup keC@p
+ketelhut ket@lh@t
+ketelsen ket@ls~
+ketema ketAm@
+keteyian k@tA~
+keteyian's k@tA~z
+ketler ketlP
+ketner ketnP
+ketney ketn/
+keto kAt]
+ketola ket@l@
+ketone kEt]n
+ketou k@tU
+ketron ketr~
+kett ket
+kettell ket@l
+ketter ketP
+ketterer ketPP
+kettering ketP6N
+ketterling ketPl6N
+ketterman ketPm~
+ketti ket/
+kettle ket@l
+kettler ket@lP
+kettles ket@lz
+kettlewell ket@lwel
+kettner ketnP
+ketura ketqr@
+ketz kets
+ketzel kets@l
+ketzel's kets@lz
+keune kyUn
+kevan kev~
+keven kEv~
+kever kevP
+kevex kev@ks
+keville kEvil
+kevin kevin
+kevin's kevinz
+kevlar kevlP
+kevlin kevlin
+kevorkian k@v{rk/~
+kevorkian's k@v{rk/~z
+kew kyU
+kewaunee kyU{n/
+kewley kyUl/
+key kE
+key's kEz
+keyboard kEb{rd
+keyboards kEb{rdz
+keycorp kEk{rp
+keycorp's kEk{rps
+keye kI
+keyed kEd
+keyes kEz
+keyes' kEz
+keyhole kEhOl
+keying kE6N
+keyless kEl@s
+keylon kAl~
+keynes kAnz
+keynesian kAnz/~
+keynesians kAnz/~z
+keynote kEnOt
+keypad kEpad
+keypad's kEpadz
+keypads kEpadz
+keys kEz
+keyser kIzP
+keysor kEsP
+keystone kEstOn
+keystone's kEstOnz
+keystroke kEstrOk
+keystrokes kEstrOks
+keyton kEt~
+keyword kEwVd
+keywords kEwVdz
+keyworth kEwVT
+keziah k@zE@
+kganakga k@g~ag@
+kgori k@g{r/
+khabarovsk kabPofsk
+khad kad
+khaki kak/
+khaki kok/
+khakis kak/z
+khalaf kal@f
+khalid kolid
+khalid's kolidz
+khalifa k@lEf@
+khalil kal@l
+khalsa kols@
+khamenei k}AnE
+khan kon
+khan's konz
+khanate konAt
+khanna kan@
+kharg k)rg
+khartoum kortUm
+khasbulatov kosb@lotof
+khasbulatov's kosb@lotofs
+khashoggi k@Soj/
+khat kot
+khe kA
+khe kAeCE
+khe kE
+kheel kEl
+khem kem
+khlebnikov klebn6kov
+khlebnikov's klebn6kovz
+khmer km,r
+khomeini h]mAn/
+khomeini k]mAn/
+khomeini's h]mAn/z
+khomeini's k]mAn/z
+khoo kU
+khosla k{sl@
+khost kOst
+khouri k?r/
+khoury k?r/
+khrushchev krUsCev
+khrushchev krUsC{f
+khrushchev's krUsCevz
+khrushchev's krUsC{fs
+khufu kUfU
+khumalo kyUmol]
+khuu kU
+ki kE
+kia kEP
+kiam kE}
+kiawah kE@wu
+kiawah kI@w@
+kibbe kib
+kibbee kibE
+kibbel kib@l
+kibbey kib/
+kibble kib@l
+kibbutz kibqts
+kibbutzim kibqtsim
+kibbutznik kibqtsn6k
+kibbutzniks kibqtsn6ks
+kibby kib/
+kibeho kib@h]
+kibell kib@l
+kibler k{b@lP
+kibodeaux kib@d]
+kibumba kibumb@
+kichline kiklIn
+kick kik
+kickback kikbak
+kickbacks kikbaks
+kicked kikt
+kicker kikP
+kickers kikPz
+kicking kik6N
+kicklighter kiklItP
+kickoff kik{f
+kicks kiks
+kid kid
+kid's kidz
+kida kEd@
+kidd kid
+kidde kid
+kidded kid@d
+kidder kidP
+kidder's kidPz
+kiddie kid/
+kiddies kid/z
+kidding kid6N
+kiddingly kid6Nl/
+kiddy kid/
+kidman kidm~
+kidnap kidnap
+kidnaped kidnapt
+kidnaping kidnap6N
+kidnapped kidnapt
+kidnapper kidnapP
+kidnappers kidnapPz
+kidnapping kidnap6N
+kidnappings kidnap6Nz
+kidnaps kidnaps
+kidney kidn/
+kidneys kidn/z
+kido kEd]
+kids kidz
+kids' kidz
+kidstock kidstok
+kidwa kidw@
+kidwell kidwel
+kiechl kEC@l
+kiechl kIC@l
+kiecker kEkP
+kiedrowski k/dr{fsk/
+kief kEf
+kiefer kEfP
+kieffer kEfP
+kieft kEft
+kiehl kEl
+kiehn kEn
+kiehne kEn
+kiel kEl
+kielar kElP
+kielb kElb
+kielbasa k/lbos@
+kieler kElP
+kielley kEl/
+kielman kElm~
+kielty kElt/
+kiely kEl/
+kienan kEn~
+kienast kEn@st
+kiene kEn
+kiener kEnP
+kieninger kEn6NP
+kienitz kEnits
+kienle kEn@l
+kientz kEnts
+kienzle kEnz@l
+kieper kEpP
+kier kir
+kieran kEr~
+kiernan kirn~
+kierscht kirSt
+kierstead kirstcd
+kierulff kEr@lf
+kies kIs
+kieschnick kESn6k
+kiesel kEs@l
+kieselmann kEz@lm~
+kieser kEsP
+kiesewetter kEsU@tP
+kiesler kEzlP
+kiesling kEzl6N
+kiesow kEs]
+kiess kEs
+kiessling kEsl6N
+kiester sI@stP
+kietzman kEtsm~
+kiev kEev
+kiev's kEevz
+kievan kEv~
+kievit kEv@t
+kiewit kEw@t
+kifer kIfP
+kiff kif
+kigale k/gol/
+kigale's k/gol/z
+kigali k/gol/
+kigali's k/gol/z
+kiger kIgP
+kiggins kiginz
+kight kIt
+kightlinger kIt@l6NP
+kihn kin
+kiichi k/EC/
+kiichi kEC/
+kijowski k@y{fsk/
+kika kik@
+kikatte kikat
+kiker kIkP
+kiki kEk/
+kikkoman kEk]mon
+kikta kikt@
+kikuchi k/kUC/
+kikumura kEkUmUr@
+kikwit kikw@t
+kila kil@
+kilbane kilb~
+kilborn kilbPn
+kilborne kilb{rn
+kilbourn kilbPn
+kilbourne kilbPn
+kilbride kilbrId
+kilburg kilbPg
+kilburn kilbPn
+kilbury kilber/
+kilby kilb/
+kilcoin kilk<n
+kilcoyne kilk<n
+kilcrease kilkr/s
+kilcrease kilkrEs
+kilcullen kilkul~
+kilday kildA
+kildee kild/
+kildow kild]
+kilduff kild@f
+kile kIl
+kilen kil~
+kiley kIl/
+kilgo kilg]
+kilgore kilg{r
+kilgour kilgP
+kilgus kilg@s
+kilian kil/~
+kilimanjaro kilEm~j)r]
+kilimanjaro kil}~j)r]
+kilker kilkP
+kill kil
+killam kil}
+kille kil
+killeagh kilEg
+killebrew kil@brU
+killed kild
+killeen kilEn
+killen kil~
+killer kilP
+killer's kilPz
+killers kilPz
+killey kil/
+killgore kilg{r
+killian kily~
+killifish kil@f6S
+killilea kil@lE@
+killin kilin
+killing kil6N
+killingbeck kil6Nbek
+killinger kil6NP
+killings kil6Nz
+killingsworth kil6NzwVT
+killington kil6Nt~
+killion kily~
+killjoy kilj<
+killman kilm~
+killman's kilm~z
+killmer kilmP
+killmon kilm~
+killoran kilP~
+killory kilP/
+killough kil?
+killpack kilpak
+kills kilz
+kilman kilm~
+kilmarnock kilm)rnok
+kilmartin kilm)rt~
+kilmer kilmP
+kiln kiln
+kilns kilnz
+kilo kilO
+kilobit kil@bit
+kilobyte kil]bIt
+kilobytes kil]bIts
+kilogram kil@gram
+kilograms kil@gramz
+kilometer k@lom@tP
+kilometer kil}EtP
+kilometers k@lom@tPz
+kilometers kil}EtPz
+kilos kElOz
+kilowatt kil@wot
+kilowatts kil@wots
+kilpatrick kilpatr6k
+kilroy kilr<
+kilt kilt
+kilter kiltP
+kilton kilt~
+kilts kilts
+kilty kilt/
+kilzer kilzP
+kim kim
+kim's kimz
+kimba kimb@
+kimball kimb@l
+kimball's kimb@lz
+kimbel kimb@l
+kimbell kimbcl
+kimber kimbP
+kimberley kimbPl/
+kimberlin kimbPlin
+kimberling kimbPl6N
+kimberly kimbPl/
+kimberly's kimbPl/z
+kimble kimb@l
+kimbler kimblP
+kimbley kimbl/
+kimbrel kimbr@l
+kimbrell kimbr@l
+kimbriel kimbr/@l
+kimbro kimbr]
+kimbrough kimbr?
+kimche kimC/
+kimchee kimC/
+kimchi kimC/
+kimco kimk]
+kime kIm
+kimel kim@l
+kimery kimP/
+kimes kImz
+kimler kim@lP
+kimm kim
+kimmel kim@l
+kimmell kim@l
+kimmelman kim@lm~
+kimmer kimP
+kimmerle kimP@l
+kimmet kimct
+kimmey kim/
+kimmich kim6C
+kimmins kiminz
+kimmitt kimit
+kimmons kim~z
+kimono k}On@
+kimonos k}On@z
+kimoto k/mOt]
+kimpel kimp@l
+kimple kimp@l
+kimpo kimp]
+kimpton kimpt~
+kimrey kimr/
+kims kimz
+kimsey kimz/
+kimura k/mqr@
+kimwipe kimwIp
+kimwipes kimwIps
+kimzey kimz/
+kin kin
+kin's kinz
+kinard kinPd
+kinark kinork
+kinburn kinbVn
+kincade kinkAd
+kincaid kinkAd
+kincaid's kinkAdz
+kincannon kinkan~
+kincer kinsP
+kinch kinC
+kincheloe kinC@l]
+kinchen kiNk~
+kincy kins/
+kind kInd
+kinda kind@
+kindall kind@l
+kindel kind@l
+kindell kind@l
+kinder kIndP
+kindergarten kindPgort~
+kindergartens kindPgort~z
+kindergartner kindPgortnP
+kindergartners kindPgortnPz
+kinderman kIndPm~
+kindest kInd@st
+kindig kind6g
+kindle kind@l
+kindleberger kind@lbPgP
+kindled kind@ld
+kindler kind@lP
+kindley kindl/
+kindling kindl6N
+kindly kIndl/
+kindness kIndn@s
+kindran kindr~
+kindred kindr@d
+kindrick kindr6k
+kinds kIndz
+kinds kInz
+kindt kint
+kindy kInd/
+kinepolis kinep@l@s
+kiner kInP
+kines kInz
+kinesiology kin@sEol@j/
+kinesthetic kin@sTet6k
+kineta kinct@
+kinetic k~et6k
+kinetics k~et6ks
+king kiN
+king's kiNz
+kingbird kiNbVd
+kingbirds kiNbVdz
+kingdom kiNd}
+kingdom's kiNd}z
+kingdoms kiNd}z
+kingdon kiNd~
+kingen kiN~
+kingery kiNgP/
+kingfisher kiNfiSP
+kingfishers kiNfiSPz
+kingham kiNham
+kinghorn kiNhPn
+kingly kiNl/
+kingma kiNm@
+kingmaker kiNmAkP
+kingman kiNm~
+kingon kiN{n
+kingpin kiNpin
+kingpins kiNpinz
+kingrey kiNgr/
+kingry kiNgP/
+kings kiNz
+kings' kiNz
+kingsborough kiNzbV]
+kingsbridge kiNzbrij
+kingsbury kiNzber/
+kingsey kiNz/
+kingsford kiNsfPd
+kingship kiNSip
+kingsland kiNzland
+kingsley kiNzl/
+kingsley's kiNzl/z
+kingsolver kiNsolvP
+kingsport kiNsp{rt
+kingston kiNst~
+kingsun kiNs~
+kingsville kiNzvil
+kingsway kiNgzwA
+kingswell kiNgzwcl
+kington kiNt~
+kinion kiny~
+kiniry kinIr/
+kinkade kiNk@d
+kinkead kiNkcd
+kinkel kiNk@l
+kinker kiNkP
+kinkle kiNk@l
+kinko kiNkO
+kinko's kiNkOz
+kinks kiNks
+kinky kiNk/
+kinlaw kinl{
+kinley kinl/
+kinloch kinl@k
+kinman kinm~
+kinmen kinmcn
+kinn kin
+kinnaird kinPd
+kinnaman kin}~
+kinnamon kin}~
+kinnan kin~
+kinnard kinPd
+kinne kin
+kinnear kinir
+kinnebrew kin@brU
+kinnell kin@l
+kinner kinP
+kinnett kinct
+kinney kin/
+kinnick kin6k
+kinnie kin/
+kinnison kin@s~
+kinnock kin@k
+kinnock's kin@ks
+kinnunen kinun~
+kinny kin/
+kinoshita k/n]SEt@
+kinsel kins@l
+kinsell kins@l
+kinsella k/nsel@
+kinser kinsP
+kinsey kinz/
+kinshasa kinSas@
+kinshasa kinSos@
+kinship kinSip
+kinsinger kinsinjP
+kinsler kins@lP
+kinsley kinzl/
+kinsley's kinzl/z
+kinslow kinslO
+kinsman kinzman
+kinst kinst
+kinstler kinstlP
+kint kint
+kinter kintP
+kintigh kintI
+kintner kintnP
+kinton kint~
+kintz kints
+kintzel kintz@l
+kinyon kiny~
+kinzel kinz@l
+kinzer kinzP
+kinzey kinz/
+kinzie kinz/
+kinzler kinzlP
+kinzlmaier kinz@lmIP
+kiosk kE{sk
+kiosks kE{sks
+kious kI@s
+kip kip
+kiper kIpP
+kipfer kipfP
+kipling kipl6N
+kiplinger kIp@l6NP
+kiplinger's kipliNPz
+kipnis kipnis
+kipp kip
+kipper kipP
+kipperman kipPm~
+kippers kipPz
+kippes kips
+kippur kipP
+kiracofe kir@kOf
+kiraly kir@l/
+kirby kVb/
+kirby's kVb/z
+kirch kVk
+kirchberg kVCbPg
+kirchberg kVkbPg
+kirchberger kVCbPgP
+kirchen kVk~
+kircher kVkP
+kirchgessner kVkgcsnP
+kirchhofer kVkh@fP
+kirchhoff kVkh{f
+kirchman kVkm~
+kirchner kVknP
+kirchners kVknPz
+kirchoff kVkh{f
+kirgan kVg~
+kirgiz kirgiz
+kiri kir/
+kiribati kiribot/
+kirin kirin
+kirk kVk
+kirk's kVks
+kirkbride kVkbrId
+kirkby kVkb/
+kirkeby kVk@b/
+kirkendall kPkend@l
+kirkendoll kPkend]l
+kirker kVkP
+kirkey kVk/
+kirkham kVkh}
+kirkhart kVkhort
+kirkland kVkl~d
+kirkland's kVkl~dz
+kirkley kVkl/
+kirklin kVklin
+kirkman kVkm~
+kirkner kVknP
+kirkpatrick kPkpatr6k
+kirkpatrick kPpatr6k
+kirks kVks
+kirksey kVks/
+kirkuk kirkqk
+kirkum kirk}
+kirkwood kVkwqd
+kirley kVl/
+kirlin kVlin
+kirmse kVms/
+kirn kVn
+kirnan kVn~
+kirner kVnP
+kirouac kIr?ak
+kirov kirov
+kirsch kVS
+kirschbaum kVSb?m
+kirschenbaum kVS~b?m
+kirschenmann kVS~m~
+kirschman kVSm~
+kirschner kVSnP
+kirsh kVS
+kirshbaum kVSb?m
+kirshenbaum kVS~b?m
+kirshner kVSnP
+kirst kVst
+kirstein kVst/n
+kirstein kVstIn
+kirsten kVst~
+kirstie kVst/
+kirstin kVstin
+kirt kVt
+kirtland kVtl~d
+kirtley kVtl/
+kirton kVt~
+kirts kVts
+kirven kVv~
+kirwan kVw{n
+kirwin kVwin
+kiryas kiry@s
+kiryas kiryos
+kiryat kiry@t
+kiryat kiryot
+kis kis
+kisamore k/som{r
+kisan kiz~
+kisch kiS
+kischell kiS@l
+kisco kisk]
+kise kIz
+kiser kIzP
+kish kiS
+kisha kiS@
+kishbaugh kiSb?
+kishi kES/
+kisiel kis/l
+kiska kisk@
+kiska's kisk@z
+kisler kis@lP
+kisling kis@l6N
+kismayu kismoyU
+kismayu kizmoyU
+kismet kizmct
+kismets kizmcts
+kisner kisnP
+kisor kIzP
+kiss kis
+kissack kis@k
+kissam kis}
+kissane kis~
+kissed kist
+kissee kisE
+kissel kis@l
+kissell kis@l
+kisser kisP
+kisses kis@z
+kissick kis6k
+kissimmee kisim/
+kissing kis6N
+kissinger kisinjP
+kissinger's kisinjPz
+kissler kislP
+kissling kisl6N
+kissner kisnP
+kist kist
+kister kistP
+kistler kistlP
+kistner kistnP
+kiszczak kiSak
+kiszczak kizak
+kit kit
+kita kEt@
+kitagawa k/togow@
+kitajima kEt@jEm@
+kitamura k/tomqr@
+kitcat kitkat
+kitch kiC
+kitchel kiC@l
+kitchell kiC@l
+kitchen kiC~
+kitchen's kiC~z
+kitchenaid kiC~Ad
+kitchener kiC~P
+kitchenette kiC~et
+kitchens kiC~z
+kitchenware kiC~wer
+kitchin kiCin
+kitching kiC6N
+kitchings kiC6Nz
+kite kIt
+kites kIts
+kithcart kiTkort
+kitimat kit}at
+kiting kIt6N
+kitner kitnP
+kitowski kit{fsk/
+kits kits
+kitsch kiC
+kitson kits~
+kitt kit
+kittaneh kitone
+kittel kit@l
+kittell kit@l
+kittelson kit@ls~
+kitten kit~
+kittens kit~z
+kitterman kitPm~
+kittinger kit6NP
+kittiwake kit@wAk
+kittle kit@l
+kittler kit@lP
+kittles kit@lz
+kittleson kit@ls~
+kittman kitm~
+kittner kitnP
+kittredge kitr6j
+kittrell kitr@l
+kitts kits
+kitty kit/
+kitz kits
+kitzhaber kitshAbP
+kitzhaber kitshobP
+kitzman kitsm~
+kitzmiller kitsmilP
+kivela kiv@l@
+kivett kivct
+kivi kiv/
+kiwani k@won@
+kiwanis k@won@s
+kiwi kEw/
+kiwi's kEw/z
+kiwis kEw/z
+kiyohida kE]hEd@
+kiyoshi k/OS/
+kiyotaka kE]tok@
+kizer kIzP
+kizziah kiz/@
+kjar k@j)r
+kjar kAjAA)r
+kjell kyel
+kjellberg jelbPg
+kjellberg k@jelbPg
+kjenstad kyenstad
+kjos k@jos
+kjos kAjAOes
+kkk kAkAkA
+klaas klos
+klaassen klos~
+klabunde klab~d
+kladstrup kladstr@p
+kladstrup's kladstr@ps
+klages klAj@z
+klahn klan
+klahr klar
+klaiber klAbP
+klamer klAmP
+klamm klam
+klammer klamP
+klamon klAm~
+klan klan
+klan's klanz
+klang klaN
+klann klan
+klans klanz
+klansman klanzm~
+klansmen klanzmcn
+klapp klap
+klapper klapP
+klapperich klapP6k
+klar kl)r
+klare kl,r
+klarich klar6k
+klarman kl)rm~
+klas klas
+klase klAz
+klasen klAs~
+klass klas
+klassen klas~
+klatsky klatsk/
+klatt klat
+klauber kl?bP
+klauer kl?P
+klaus kl?s
+klauser kl?sP
+klausing kl?s6N
+klausner kl?snP
+klaver klAvP
+klawitter kl{@tP
+klay klA
+klayman klAm~
+kleban kleb~
+klebba kleb@
+klebe klEb
+kleber klEbP
+kleck klek
+klecka klek@
+klecker klekP
+kleckner kleknP
+klee klE
+klee's klEz
+kleeman klEm~
+kleen klEn
+kleenex klEn@ks
+kleer klir
+klees klEz
+kleffner klefnP
+kleiber klIbP
+kleier klIP
+kleiman klIm~
+klein klIn
+klein's klInz
+kleinberg klInbPg
+kleindienst klIndEnst
+kleine klIn
+kleiner klInP
+kleinert klInPt
+kleinfeld klInfeld
+kleinfelter klInfcltP
+kleinhans klInh~z
+kleinhenz klInhcns
+kleinknecht klINknckt
+kleinman klInm~
+kleinpaste klInpAst
+kleinpeter klInp/tP
+kleinsasser klIns@sP
+kleinschmidt klInSmit
+kleinsmith klInsmiT
+kleinwort klInwPt
+kleis klIz
+kleiss klIs
+kleist klIst
+klejna klAnP
+klem klem
+klema klem@
+kleman klem~
+klemann klem~
+klemens klem~s
+klement klem~t
+klemm klem
+klemme klem
+klemmer klemP
+klemp klemp
+klempner klempnP
+klemz klemz
+klenge klenj
+klenk kleNk
+klenke kleNk
+klensch klenS
+klepac klep@k
+klepfer klepfP
+kleppe klep
+klepper klepP
+kleppinger klep6ngP
+klerk klVk
+klerk's klVks
+klesch kleS
+klesken klesk~
+kless kles
+klett klet
+kleve klEv
+kleven klEv~
+klever klevP
+kley klA
+klezmer klezmP
+klich kliC
+klick klik
+kliebert klEbPt
+klieg klEg
+klieman klIm~
+klier klIP
+kliethermes klETPmz
+kliewer klEwP
+kligman kligm~
+klim klim
+klima klIm@
+klimas klIm@z
+klimaszewski klim6Sefsk/
+klimczak klimCak
+klimek klim6k
+kliment klIm~t
+klimer klImP
+klimer klimP
+klimowicz klim@v6C
+klinck kliNk
+klindt klint
+klindworth klindwPT
+kline klIn
+klinedinst klin@dinst
+klinefelter klin@fcltP
+kling kliN
+klingaman kliNg}~
+klingbeil kliNbIl
+klingberg kliNbPg
+klinge klinj
+klingel kliNg@l
+klingenberg kliN~bPg
+klingensmith kliNg~smiT
+klinger kliNP
+klinger's kliNPz
+klingerman kliNPm~
+klinghoffer kliNh{fP
+klingler kliNg@lP
+klingler kliNglP
+klingman kliNm~
+klingon kliNd~
+klink kliNk
+klinke kliNk
+klinker kliNkP
+klinkhammer kliNkhamP
+klinkhammer's kliNkhamPz
+klinkner kliNknP
+klint klint
+klintworth klintwPT
+klinzing klinz6N
+klipfel klipf@l
+klipp klip
+klippel klip@l
+klish kliS
+klitz klits
+klitzke klitsk/
+klixshavich kl6ksav6C
+kloberdanz klobPd~s
+kloc klok
+klocek klOs6k
+klock klok
+klocke klok
+kloeckner klOknP
+kloehn klOn
+kloepfer klOpfP
+kloeppel klOp@l
+kloepper klOpP
+kloiber kl<bP
+klom kl{m
+klomp klomp
+klondike klondIk
+klonowski kl~{fsk/
+klontz klonts
+kloos klUz
+klooster klUstP
+kloosterman klUstPm~
+klopf klopf
+klopfenstein klopf~st/n
+klopfenstein klopf~stIn
+klopfer klopfP
+klopp klop
+kloppenburg klop~bPg
+klos klos
+klose klOz
+klosinski kl@sinsk/
+klosowski kl@s{fsk/
+kloss kl{s
+klossner klosnP
+kloster kl{stP
+klosterman klostPm~
+klostermann klostPm~
+kloth kloT
+klotz klots
+klotzbach klotsbok
+klucevsek klUsevsck
+kluck kluk
+kludt kludt
+kluender klqndP
+kluesner klqsnP
+kluever klqvP
+klug klug
+kluge klUj
+kluge's klUj@z
+kluger klUgP
+klugh klu
+klugman klugm~
+klugt klut
+klukas klUk@z
+klumb klum
+klump klump
+klumpp klump
+klunder klundP
+klundt klunt
+klunk kluNk
+klus klus
+klusman klusm~
+klute klUt
+kluth klUT
+klutts kluts
+kluttz kluts
+klutz kluts
+klutznick klutsn6k
+kluver klUvP
+kluwer klUwP
+klux kluks
+klym klim
+klynveld klinveld
+kmart kAmort
+kmart's kAmorts
+kmetz k}ets
+kmiec k}Ek
+kmiecik k}EC6k
+knaack nok
+knaak nok
+knab nab
+knabb nab
+knabe nAb
+knable nAb@l
+knack nak
+knacks naks
+knackstedt nakstct
+knaggs nagz
+knape nAp
+knapik nap6k
+knapke nApk
+knapp nap
+knapp's naps
+knappenberger nap~bPgP
+knapper napP
+knapsack napsak
+knapton napt~
+knarr nar
+knaub n{b
+knauer n?P
+knauf n{f
+knauff n{f
+knaup n{p
+knaus n{z
+knauss n{s
+knave nAv
+knaves nAvz
+knbc kAenbEsE
+knead nEd
+kneading nEd6N
+kneafsey nEfs/
+kneale nEl
+knebel neb@l
+knecht nekt
+knechtel nekt@l
+knee nE
+kneebone nEbOn
+kneecap nEkap
+kneecaps nEkaps
+kneece nEs
+kneed nEd
+kneel nEl
+kneeland nEl~d
+kneeling nEl6N
+kneer nir
+knees nEz
+kneip nEp
+kneisel nIs@l
+kneisley nEsl/
+knell nel
+kneller nelP
+knelt nelt
+knepp nep
+knepper nepP
+knerr n,r
+kness nes
+knesset knes@t
+knesset k~es@t
+knesset nes@t
+knew nU
+knew nyU
+knezevich nez6v6C
+knicely nIsl/
+knick nik
+knick-knack niknak
+knick-knacks niknaks
+knicker nikP
+knickerbocker nikPbokP
+knickerbockered nikPbokPd
+knickerbockers nikPbokPz
+knickers nikPz
+knickknack niknak
+knickknacks niknaks
+knicks niks
+knief nEf
+kniep nEp
+knieriem nErEm
+knierim nirim
+knies nIz
+kniess nEs
+knievel k~Ev@l
+knievel nEv@l
+knife nIf
+knifed nIft
+knifelike nIflIk
+knifepoint nIfp<nt
+kniffen nif~
+kniffin nifin
+knifing nIf6N
+knifings nIf6Nz
+knigge nig
+knight nIt
+knight's nIts
+knighted nIt@d
+knighten nIt~
+knighthood nIthqd
+knightly nItl/
+knighton nIt~
+knights nIts
+knill nil
+knin kAenIen
+knin knin
+knin nin
+knipe nIp
+knipfer nipfP
+knipl nip@l
+knipp nip
+knippa nip@
+knippel nip@l
+knippenberg nip~bPg
+knipper nipP
+knipple nip@l
+knisely nIzl/
+kniskern niskPn
+knisley nisl/
+knispel nisp@l
+kniss nis
+knit nit
+knits nits
+knitted nit@d
+knittel nit@l
+knitter nitP
+knitting nit6N
+knittle nit@l
+knitwear nitwer
+knives nIvz
+kniveton nIvt~
+knob nob
+knobbe nob
+knobby nob/
+knobel nOb@l
+knoblauch nobl?k
+knoble nOb@l
+knobloch nobl@k
+knoblock noblok
+knobs nobz
+knoch nok
+knoche noC
+knochel nok@l
+knock nok
+knockdown nokd?n
+knocked nokt
+knocking nok6N
+knockoff nok{f
+knockoffs nok{fs
+knockout nok?t
+knocks noks
+knode nOd
+knodel nOd@l
+knodle nOd@l
+knoebel nOb@l
+knoedler nOd@lP
+knoell nOl
+knoff n{f
+knogo nOg]
+knoke nOk
+knoles nOlz
+knoll nOl
+knoll's nOlz
+knoop nUp
+knop nop
+knope nOp
+knopf nof
+knopf nopf
+knopp nop
+knorr n{r
+knost nost
+knot not
+knotek nOt6k
+knoth noT
+knots nots
+knott not
+knott's nots
+knotted not@d
+knotts nots
+knotty not/
+knouff nOf
+knous n{s
+knouse n?s
+know nO
+knowed nOd
+knower nOP
+knowing nO6N
+knowingly nO6Nl/
+knowledge nol@j
+knowledgeable nol@j@b@l
+knowledgeably nol6j@bl/
+knowledgeware nol6jwer
+knowles nOlz
+knowlton nOlt~
+known nOn
+knowns nOnz
+knows nOz
+knox noks
+knox's noks@z
+knoxville noksvil
+knoy n<
+knuckle nuk@l
+knuckled nuk@ld
+knuckles nuk@lz
+knudsen nUds~
+knudsen's nUds~z
+knudson nUds~
+knudtson nUts~
+knueppel nUp@l
+knupp nup
+knust nust
+knut nut
+knute nUt
+knuth nUT
+knuts nuts
+knutsen nuts~
+knutson knUts~
+knutzen nutz~
+ko kO
+koala k]ol@
+koalas k]ol@z
+koba kOb@
+kobacker kObakP
+kobak kOb@k
+kobayashi kOboyoS/
+kobe kObA
+kobe's kObAz
+kobel kOb@l
+kober kObP
+koberstein kObPst/n
+koberstein kObPstIn
+kobes kObz
+koble kOb@l
+kobler kOb@lP
+kobren kobr~
+kobrin kobrin
+kobrin's kobrinz
+kobs kobz
+kobus kOb@s
+koby kOb/
+kobylarz k@bilPz
+kobylinski k@b@linsk/
+kobza kobz@
+kocak kOk@k
+koch kOk
+koch k{C
+kochan kok~
+kochanek kok~6k
+kochanowski k@h~{fsk/
+kochanski k@hansk/
+kochel kok@l
+kochendorfer kok~d{rfP
+kocher k{CP
+kochevar k@hevP
+kochis kokis
+kochman kokm~
+koci kOs/
+kocian kOS~
+kociemba kOs/emb@
+kocinski k@Cinsk/
+kociolek kOs/Olck
+kocis kOsis
+kock kok
+kocourek k@kqrck
+kocsis koks@s
+kocur kOkP
+kocur's kOkPz
+kocurek k@kyUrck
+kodacolor kOd@kulP
+kodak kOdak
+kodak's kOdaks
+kodama k]dom@
+kodiak kOd/ak
+kodo kOd]
+koebel kOb@l
+koedinger kOd6NP
+koegel kOg@l
+koegler kOg@lP
+koehl kOl
+koehler kOlP
+koehn kOn
+koehne kOn
+koehnen kOn~
+koeki kOk/
+koelle kOl
+koeller kOlP
+koelling kOl6N
+koelsch kOlS
+koelzer kOlzP
+koen kOn
+koeneman ko/nm~
+koenen kOn~
+koenig kVn6g
+koenigs kVn6gz
+koenigsberg kOn6gzbPg
+koenigsfeld kOn6gzfeld
+koep kOp
+koepke kOpk
+koepp kOp
+koeppe kOp
+koeppel kOp@l
+koeppen kOp~
+koepsel kOps@l
+koepsell kOps@l
+koerber k{rbP
+koerner k{rnP
+koernke kVn6k
+koernke kVn@k/
+koester kOstP
+koesters kOstPz
+koestler kOs@lP
+koestler koslP
+koestner kOstnP
+koether kOTP
+koetje kOtj
+koetter kOtP
+koetting kOt6N
+koff k{f
+koffler kof@lP
+koffman k{fm~
+kofi kOf/
+kofler kOf@lP
+kofoed kOf]d
+kofron kofr~
+koga kOg@
+kogan kOg~
+kogel kOg@l
+koger kOgP
+kogi kOg/
+kogler kOg@lP
+koglin koglin
+kogut kOg@t
+kogyo kOjy]
+koh kO
+kohan kOhon
+kohen kO~
+kohl kOl
+kohl's kOlz
+kohlbeck kOlbek
+kohlberg kOlbPg
+kohlberg's kOlbPgz
+kohlenberg kOl~bPg
+kohler kOlP
+kohles kOh@lz
+kohlhepp kOlhcp
+kohlhoff kOlh{f
+kohli kOl/
+kohlman kOlm~
+kohlmann kOlm~
+kohlmeier kOlmIP
+kohlmeyer kOlmIP
+kohls kOlz
+kohn kon
+kohne kOn
+kohnen kOn~
+kohner kOnP
+kohnke koNk
+kohout kO?t
+kohr k{r
+kohring k{r6N
+kohrs k{rz
+kohtaro k]t)r]
+kohtoro k]t{r]
+kohut kO@t
+koichi k]EC/
+koido k<d]
+koike k<k
+koito k<tO
+koito k<t]
+koito kOEtO
+koivisto k<vist]
+kojak kOjak
+koji kOj/
+kojima k@yIm@
+kok kok
+kokan kOk~
+kokan's kOk~z
+kokate kOkotA
+kokate kOkotA
+kokate's kOkotAz
+kokate's kOkotAz
+koke kOk
+koken kOk~
+koker kOkP
+kokes kOks
+kokesh kok6S
+koki kOk/
+kokinda k@kind@
+koko kOk]
+koko's kOk]z
+kokomo kOk}O
+kokoschka k@k{Sk@
+kokoszka k@koSk@
+kokusai kokyUsI
+kol kOl
+kolakowski k@l@k{fsk/
+kolander kol~dP
+kolar kOlP
+kolarik k@l)r6k
+kolasa k@los@
+kolasinski k@l@sinsk/
+kolb kOlb
+kolbe kOlb
+kolbeck kolbck
+kolber kOlbP
+kolberg kOlbPg
+kolbert kOlbPt
+kolbo kOlb]
+kolden kOld~
+kole kOl
+kolek kOlck
+kolenda k@lend@
+kolesar k@lesP
+kolich kolih
+kolin kOlin
+kolinski k@linsk/
+kolk kOk
+kolka kOlk@
+kolker kOkP
+koll kol
+kollar kolP
+kollasch koluS
+kollath kol@T
+kolle kol
+kollek kOlck
+kollek k{lck
+koller kolP
+kolli kol/
+kolling kol6N
+kollman kolm~
+kollmann kolm~
+kollmeyer kolmIP
+kollmorgen k]lm{rg~
+kolm kOm
+kolman kolm~
+kolodny k@lodn/
+kolodziej k@lodz/j
+kolodziejski k@loj/Ask/
+kolojejchick kOl]jAC6k
+kolokoff kol@k{f
+koloski k@l?sk/
+kolowich kol@w6C
+kolp kOlp
+kolski kOlsk/
+kolsky kOlsk/
+kolstad kOlst@d
+kolter kOltP
+kolterman kOltPm~
+kolton kOlt~
+kolts kOlts
+koltz kOlts
+komaba k]mob@
+komag kOmag
+koman kOm~
+komansky k]mansk/
+komar kOmP
+komara k]m)r@
+komarek k]m)rck
+komarik k]m)r6k
+komarik's k]m)r6ks
+komatsu k]motsU
+kombat kombat
+komer kOmP
+komercni kOmVCn/
+komi kOm/
+komine kOmIn
+komineft kom~cft
+komisar komisor
+komisar k}isP
+kommer komP
+komodo k]mOd]
+komodo k}Od]
+komori k]m{r/
+komorny k]m{rn/
+komorowski k}P{fsk/
+komoto k]mOt]
+komp komp
+kompanek komponek
+komsomol koms]m@l
+komsomol's koms]m@lz
+komura kOmqr@
+kon kon
+konaga k~og@
+konarski k~)rsk/
+konczal konC@l
+kondas kond@z
+kondo kond]
+kondracki k~drotsk/
+kondrat kondr@t
+konecny k~ekn/
+konen kon~
+kong k{N
+kong k{Ng
+kong's k{Ngz
+kong's k{Nz
+kongsberg k{NgzbPg
+kongsberg k{NzbPg
+kongsberg's k{NgzbPgz
+kongsberg's k{NzbPgz
+konica kon6k@
+konicek kon6Cek
+konicki k~itsk/
+konieczka k~ECk@
+konieczny k~ECn/
+konig kon6g
+koning kOn6N
+koninklijke kon6NklEk/
+konishi k]nES/
+konishiroku koniS6rOkU
+konitzer kon@tzP
+konkel koNk@l
+konkle koNk@l
+konkol koNk{l
+konner konP
+kono kOn]
+konold kon]ld
+konop kOn@p
+konopka k~Opk@
+konrad konr@d
+konrath konr@T
+konstantin konst~tEn
+konsultat kons@ltot
+kontos kont]z
+kontra kontr@
+kontras kontr@s
+kontrollbank kontr@lbaNk
+konwinski k~vinsk/
+konz konz
+konzen konz~
+konzi konz/
+konzi's konz/z
+koo kU
+koob kUb
+koogler kUglP
+kooi kU/
+kooiker kU6kP
+kooiman kU}~
+kooistra kUiztr@
+kook kUk
+kooken kUk~
+kooker kqkP
+kooks kUks
+kooky kUk/
+kool kUl
+koolhaas kUlhos
+koon kUn
+koon's kUnz
+koonce kUns
+koone kUn
+kooning kUn6N
+koons kUnz
+koonts kUnts
+koontz kUnts
+koop kUp
+koop's kUps
+koopman kUpm~
+koopmann kUpm~
+koops kUps
+koor kUr
+koors kqrz
+koos kUz
+kooser kUzP
+kootenay kUt~A
+kooy kU/
+kooyman ko<m~
+kopacz kop@C
+kopas kOp@z
+kopczynski k@pCinsk/
+kope kOp
+kopec kOp6k
+kopecky k@petsk/
+kopek kOp@k
+kopeks kOp@ks
+kopel kOp@l
+kopelman kOp@lm~
+koper kOpP
+kopera k@pir@
+koperski k@pVsk/
+kopetski k@petsk/
+kopf k{pf
+kopinski k@pinsk/
+kopischke k@piSk/
+kopit kopit
+kopka kOpk@
+kopke kOpk
+kopko kOpk]
+koplan kopl~
+koplin koplin
+koplovitz kopl@vits
+kopp kop
+koppe kop
+koppel kop@l
+koppel's kop@lz
+koppell kop@l
+koppelman kop@lm~
+koppen kop~
+koppenhaver kop~h@vP
+kopper kopP
+koppers kopPz
+koppers' kopPz
+koppes kops
+kopple kop@l
+kopplin koplin
+kopriva kopr6v@
+koprowski k@pr{fsk/
+kops kops
+kopy kop/
+kora k{r@
+koral k{r@l
+koran k{ron
+koranda kPand@
+koranic k{ran6k
+korb k{rb
+korba k{rb@
+korbel k{rb@l
+korber k{rbP
+korbren k{rbrcn
+korby k{rb/
+korczak k{rCak
+korda k{rd@
+korea kPrE@
+korea krE@
+korea k{rE@
+korea's kPrE@z
+korea's krE@z
+korea's k{rE@z
+koreagate kPrE@gAt
+koreagate k{rE@gAt
+korean kPrE~
+korean krE~
+korean k{rE~
+korean's kPE~z
+korean's krE~z
+koreans kPrE~z
+koreans krE~z
+koreans k{rE~z
+koreans' kPrE~z
+koreans' krE~z
+koreans' k{rE~z
+koreas kPr/@z
+koreas kr/@z
+koreas k{r/@z
+koreatown kPE@t?n
+korell k{rcl
+koren k{r~
+korenek k{r~6k
+koresh k{reS
+koresh's k{reS@z
+koret k{r@t
+korey k{r/
+korf k{rf
+korff k{rf
+korfhage k{rfh6j
+korhonen k{rh~~
+korinek k{r~6k
+korman k{rm~
+kormos k{rm]z
+korn k{rn
+kornacki kPnotsk/
+kornberg k{rnbPg
+kornblum k{rnbl}
+kornbluth k{rnblUT
+kornegay k{rn6gA
+korner k{rnP
+kornfeld k{rnfcld
+kornhauser k{rnh?zP
+kornreich k{rnrIk
+korns k{nz
+korol k{r{l
+korologos k{rolOg]s
+korona kPOn@
+korotich k{r@t6C
+korpela kPpEl@
+korpi k{rp/
+korry k{r/
+korry's k{r/z
+korson k{rs~
+kort k{rt
+korte k{rt
+korten k{rt~
+korth k{rT
+korthals k{rT@lz
+kortman k{rtm~
+kortum k{rt}
+kortz k{rts
+koruna k{rUn@
+korver k{rvP
+kory k{r/
+koryagin k{ryog~
+korzeniewski kPzin/efsk/
+korzeniewski k{rz~Ufsk/
+kos kos
+kosa kOs@
+kosak kOs@k
+kosakowski k@s@k{fsk/
+kosan kOz~
+kosanke kos@Nk
+kosanovich k@san@v6C
+kosar kOsP
+kosberg k{zbPg
+kosbie kozb/
+kosch k{S
+koscheck k{sCck
+koscheck's k{sCcks
+koscielniak k@sCEln/ak
+koscinski k@sCinsk/
+kosco kOsk]
+kosecoff kOs@k{f
+kosek kOsck
+kosel kOs@l
+koser kOzP
+kosh koS
+kosher kOSP
+kosiba k]sEb@
+kosier kOs/P
+kosik kOs6k
+kosin kOsin
+kosinski k@sinsk/
+koska kOsk@
+koskela k@skEl@
+koskey kosk/
+koski k?sk/
+koskinen kosk~~
+kosko kOsk]
+koskotas k{skOt@s
+kosky kosk/
+kosloski k@sl?sk/
+koslosky k@slOsk/
+koslow kosl]
+koslow's kozlOz
+koslowski k@sl{fsk/
+kosman kosm~
+kosmatka k@smotk@
+kosmetsky kozmetsk/
+kosmetsky's kozmetsk/z
+kosmicki k@smitsk/
+kosnovsky koznofsk/
+kosnovsky's koznofsk/z
+kosovo kOs]vO
+kosowski k@s{fsk/
+kosowsky k@s?sk/
+koss k{s
+kossman k{sm~
+kossow kos]
+kossuth kos@T
+kost kost
+kosta kOst@
+kostal kost@l
+kostas kOst@z
+kostecki k@stetsk/
+kostek kostck
+kostelecky k@stcletsk/
+kostelnik k@steln6k
+koster kostP
+kostic kost6k
+kostick kOst6k
+kostka kostk@
+kostmayer k{stmAP
+kostoff kost{f
+kostrzewa k@str@zU@
+kostrzewski k{stPzefsk/
+kosub kOs@b
+kosy kOs/
+kosyakov kOsy@kov
+kosygin kOs/g~
+kosygin kOs@gin
+kot kot
+kotara k]t)r@
+kotarski k@t)rsk/
+kotas kOt@z
+kotch koC
+kote kOt
+kotecki k@tetsk/
+kotek kOtek
+koteles kotclcz
+koth koT
+kothari koTP/
+kothe kOT
+kotila k@tIl@
+kotlarz kotlPz
+kotler kOt@lP
+kotler kotlP
+kotlowitz kotl@wits
+koto kOt]
+kotowski k@t{fsk/
+kotsonis k]tsOn@s
+kotsonis katsOn@s
+kotsonis' k]tsOn@s
+kotsonis' katsOn@s
+kotsonis's k]tsOn@s@z
+kotsonis's katsOn@s@z
+kott kot
+kotter kotP
+kottke kotk/
+kottler kotlP
+kottwitz kotwits
+kotula k@tUl@
+kotz kots
+kouba kUb@
+koudelka k?delk@
+kough k?
+kouns k?nz
+kountz k?nts
+kouri k]qr/
+kouril kUr@l
+kourou kUrU
+koury k?r/
+kouyate k?yotA
+kovac kOv@k
+kovacevic k@v@Cev6k
+kovacevich k@voC6v6C
+kovach kOvok
+kovach's kOvoks
+kovacic k@vok6k
+kovacich k@voCih
+kovacik kov@C6k
+kovack kov@k
+kovacs kOvaks
+kovaks kOvaks
+koval kOv@l
+kovalchik k@volh6k
+kovalcik kov@lC6k
+kovaleski k@v@lesk/
+kovalik k@vol6k
+kovalsky k@volsk/
+kovalyov kOvoly@v
+kovar kOvP
+kovarik k@v)r6k
+kovatch kov@C
+kovats kOv@ts
+koven kOv~
+kover kOvP
+koversada kuvPsot@
+kovich kov6C
+kowabunga k?@buNg@
+kowal k?@l
+kowalchuk k?olh@k
+kowalczyk k?@lC6k
+kowaleski k?@lesk/
+kowalewski k?@lefsk/
+kowalik k?ol6k
+kowalke kow{k
+kowalkowski kow{k{fsk/
+kowall k?@l
+kowalski k@wolsk/
+kowalsky k?olsk/
+kowitz kowits
+kownacki k?nok/
+kowtow k?t?
+kowtow kOtO
+koyama k]yom@
+koyo k<]
+koza kOz@
+kozak kOz@k
+kozakiewicz k@zok@v6C
+kozar kOzP
+kozberg kozbPg
+kozel kOz@l
+kozemchak kOzemCak
+kozicki k@zitsk/
+koziel koz/l
+kozik kOz6k
+kozikowski k@z6k{fsk/
+kozinski k@zinsk/
+koziol koz/{l
+kozlik kozl6k
+kozloff kozl{f
+kozloski k@zl?sk/
+kozlow kozl]
+kozlowski k@zl{fsk/
+kozma kOzm@
+kozminski k@zminsk/
+koznovsky koznofsk/
+koznovsky's koznofsk/z
+kozo kOz]
+kozol kOz@l
+kozub kOz@b
+kozuch koz@h
+kozyrev kozPev
+kozyrev's kozPevz
+kraai kro/
+kraatz krots
+krabbe krab
+krabbenhoft krab~h@ft
+krabill krab@l
+krach kraC
+kracht krakt
+krack krak
+kracke krak
+kraeger kregP
+kraemer kremP
+kraeutler kr?tlP
+krafft kraft
+kraft kraft
+kraft's krafts
+kraftwerk kraftwPk
+krage krAj
+krager krAgP
+kragh krag
+kragt kragt
+krah kro
+krahenbuhl kro~b@l
+krahl krol
+krahn kran
+krain krAn
+krajewski krIefsk/
+krajicek krI6Cck
+krajina krIEn@
+krajina krIn@
+krajina's krIEn@z
+krajina's krIn@z
+kraker krAkP
+krakow krak?
+krakow krok?
+krakow krokov
+krakower krak]P
+krakowski kr@k{fsk/
+kral kral
+kralicek krol6Cck
+kralik krol6k
+krall kr{l
+kram kram
+kramar kramP
+kramer krAmP
+kramer's krAmPz
+kramlich kraml6k
+kramm kram
+kramme kram
+krammer kramP
+krammes kramz
+kramp kramp
+krampe kramp
+krandall krand@l
+krane krAn
+kraner krAnP
+kranich kran6C
+krans kranz
+krantz krants
+kranz kranz
+kranzler kranzlP
+krapels krap@lz
+krapf krapf
+krapp krap
+kraprayoon kraproyUn
+kras kras
+krasinski kr@sinsk/
+kraska krosk@
+krasner krasnP
+krasnoff krasn{f
+krasnow krosn]
+krasnoyarsk krasn<orsk
+krasny krazn/
+krasowski kr@s{fsk/
+krass kras
+kraszewski kr@Sefsk/
+krat krat
+kratky kratk/
+kratochvil krat@kv@l
+kratt krat
+kratz krats
+kratzer krAtzP
+kratzke kratsk/
+krauer kr?r
+kraus kr?s
+krause kr{s
+krauser kr?sP
+kraushaar kr?Sor
+krauskopf kr?sk{f
+krauss kr?s
+krausse kr{s
+krausz kr?S
+kraut kr?t
+krauter kr?tP
+krauth kr{T
+krauthammer kr?thamP
+krauze kr?z
+kravchuk krovCqk
+kravchuk's krovCqkz
+kravetz kravits
+kravis kravis
+kravitz kravits
+krawccykiewi kr?C6kU/
+krawchuk kr{C@k
+krawczak krovCak
+krawczyk krovC6k
+krawiec krov/k
+krawitz krowits
+kray krA
+kraynak krAn@k
+kreager krEgP
+kreamer krEmP
+krebbs krebz
+krebs krebz
+krebs's krebz@z
+krebsbach krebzbok
+krech krek
+krecko krek]
+kredietbank krcd/tbaNk
+kredit kret@t
+kreditanstalt krcditunst{lt
+kreeger krEgP
+kreft kreft
+kreg kreg
+kregel kreg@l
+kreger krEgP
+kreh kre
+krehbiel kreb/l
+kreher kr,r
+kreicher krIkP
+kreider krIdP
+kreidler krId@lP
+kreifels krIf@lz
+kreig krEg
+kreiger krIgP
+kreiling krIl6N
+kreimer krImP
+krein krAn
+kreiner krInP
+kreis krEz
+kreisberg krIsbPg
+kreischer krISP
+kreisel krIs@l
+kreiser krIsP
+kreisher krE@SP
+kreisler krIslP
+kreisman krIsm~
+kreiss krIs
+kreiter krItP
+kreitman krItm~
+kreitner krItnP
+kreitz krEts
+kreitzberg krItsbPg
+kreitzer krItzP
+krejci krejs/
+krell krel
+kremer krEmP
+kremers krEmPz
+kremlin kreml~
+kremlin's kreml~z
+kremlinologist kreml~ol@j@st
+kremlinologists kreml~ol@j@s
+kremlinologists kreml~ol@j@ss
+kremlinologists kreml~ol@j@sts
+krempa kremp@
+krempasky krcmposk/
+kren kren
+krenek kren6k
+krengel kreNg@l
+krenik kren6k
+krenke kreNk
+krenn kren
+krentz krents
+krenwinkle krenwiNk@l
+krenwinkle's krenwiNk@lz
+krenz krenz
+krenzer krenzP
+krepps kreps
+kreps kreps
+kresa krEsP
+kresge kresg/
+kreslovsky krcsl{vsk/
+kress kres
+kresse kres
+kresser kresP
+kressin kresin
+kressler kreslP
+kretchman kreCm~
+kretchmer kreCmP
+kretsch kreC
+kretschmar kreCmP
+kretschmer kreCmP
+kretz krets
+kretzer kretzP
+kretzschmar kreCmP
+kreuger kr<gP
+kreul krUl
+kreuser kr<sP
+kreuter kr<tP
+kreutz krUts
+kreuzer krUzP
+krewson krUs~
+krey krA
+kribs kribz
+krichbaum krikb?m
+krick krik
+krider krIdP
+kridler kridlP
+kriebel krEb@l
+krieg krEg
+kriegel krEg@l
+krieger krEgP
+krieger's krEgPz
+krienke krENk
+krier krIP
+kriese krEz
+kriesel krEs@l
+kriete krEt
+krigbaum krigb?m
+kriger krIgP
+krigsten krigstin
+krikalev krik@lev
+krikalev's krik@levz
+krikorian kr6k{r/~
+krill kril
+krim krim
+krimmel krim@l
+kriner krInP
+kring kriN
+kringen kriN~
+kringley kriNgl/
+krings kriNz
+krinke kriNk
+krinsky krinsk/
+kris kris
+krisch kriS
+krischer kriSP
+krise krIz
+krisher kriSP
+krishna krESn@
+krishna kriSn@
+krishnan kriSn~
+krisko krisk]
+krispies krisp/z
+kriss kris
+krist krist
+krista krist@
+kristallnacht krist@lnokt
+kristen kris~
+kristensen krist~s~
+kristi krist/
+kristi's krist/z
+kristiansen krisC~s~
+kristie krist/
+kristin kristin
+kristine kristEn
+kristof krist@f
+kristoff krist{f
+kristoffe krist{f
+kristofferson krist{fPs~
+kristol krist@l
+kristol's krist@lz
+kristy krist/
+kritz krits
+kritzer kritzP
+krivanek kriv~6k
+kriz kriz
+krizan kriz~
+krizek krizck
+krob krob
+kroboth krob@T
+kroc krok
+kroc's kroks
+krock krok
+kroeber krObP
+kroeber's krObPz
+kroeger krOgP
+kroeger's krOgPz
+kroegers krOgPz
+kroeker krOkP
+kroener krOnP
+kroening kro~6N
+kroenke krONk
+kroes krOz
+kroese krOs
+kroeze krOz
+kroft kroft
+krog krog
+kroger krOgP
+kroger's krOgPz
+krogh krO
+krogman krogm~
+krogstad krogst@d
+kroh krO
+krohn krOn
+krok krok
+krol kr{l
+krolak krOl@k
+krolczyk krOlC6k
+krolick krol6k
+krolikowski kr@l6k{fsk/
+kroll kr{l
+krom krom
+krome krOm
+kromer krOmP
+kromm krom
+kron kron
+krona krOn@
+kronberg kronbPg
+krone krOn@
+kronen krOn~
+kronenberg kron~bPg
+kronenberger kron~bPgP
+kroner krOnP
+kronick kron6k
+kronish kron6S
+kronk kroNk
+kronor krOnP
+kronos krOn]s
+krontz kronts
+kroon krUn
+kropf kropf
+kropp krop
+kross kr{s
+krossel kr{s@l
+krotkov kr{tk{v
+krotz krots
+krotzer krOtzP
+krouner krUnP
+kroupa krUp@
+krouse kr?s
+krout kr?t
+krowe krO
+krowitz kr?its
+kroy kr<
+kruchten krukt~
+kruck kruk
+kruckeberg krukbPg
+kruckenberg kruk~bPg
+kruczek kruCck
+krudman krudm~
+krudman's krudm~z
+krueger krUgP
+kruer krUP
+krug krug
+kruger krUgP
+krugerrand krUg,rand
+krugh kru
+krugman krugm~
+kruk kruk
+krukowski kr@k{fsk/
+krul krul
+krull krul
+krulwich krulw6C
+krum krum
+krumholz krumhOlz
+krumm krum
+krumme krum
+krummel krum@l
+krumrey krumr/
+krumwiede krumwEd
+krupa krUp@
+krupicka krUpik@
+krupinski kr@pinsk/
+krupka krupk@
+krupman krupm~
+krupnick krupn6k
+krupp krup
+krupp's krups
+kruppa krup@
+krupski krupsk/
+krus krus
+kruschev krUsCev
+kruschke kruSk
+kruse krUz
+krusemark krus}ork
+krusinski kr@sinsk/
+kruszewski kr6Sefsk/
+kruszka kruSk@
+kruszynski kr6Sinsk/
+krutick krUtik
+krutsinger kruts~jP
+kruttschnitt kruCn@t
+krutz kruts
+kruzel krUz@l
+krych kriC
+kryder krIdP
+kryger krIgP
+krygier krIg/P
+krypton kripton
+kryptos kript]s
+krysiak kris/ak
+krzeminski kr}insk/
+krzysztof krIst{f
+krzywicki kr6vitsk/
+krzyzanowski kriz~{fsk/
+ksiazek k@s/ozck
+ku kU
+kuala kwol@
+kuan kwon
+kuba kyUb@
+kubacki k@botsk/
+kubala k@bol@
+kuban kyUb~
+kubas kUb@z
+kubat kUb@t
+kube kyUb
+kubena k@bEn@
+kuberski k@bVsk/
+kubes kyUbz
+kubiak kUb/ak
+kubic kyUb6k
+kubica kyUb6k@
+kubicek kub6Cck
+kubick kyUb6k
+kubicki k@bitsk/
+kubik kyUb6k
+kubin kyUbin
+kubinski k@binsk/
+kubis kUbis
+kubisiak k@bis/ak
+kubitz kyUbits
+kubler kyUb@lP
+kubly kubl/
+kubo kyUb]
+kubota kUbOt@
+kubrick kyUbrik
+kubrick's kyUbriks
+kuby kyUb/
+kuc kuk
+kucan kyUk~
+kucera k@Cir@
+kucewicz kyUs@wits
+kuch kuC
+kuchar kukP
+kucharski k@C)rsk/
+kuchenbecker kuk~bckP
+kucher kukP
+kuchera kUC,r@
+kuchera kuCP@
+kuchinski k@Cinsk/
+kuchinsky k@Cinsk/
+kuchler kuk@lP
+kuchma kUCm@
+kuchma's kUCm@z
+kuchta kuCt@
+kucinski k@Cinsk/
+kuck kuk
+kuczek kuCck
+kuczynski k@Cinsk/
+kuder kyUdP
+kudla kudl@
+kudlow kudl]
+kudner kudnP
+kudos kUd]s
+kudrna kudVn@
+kudzu kudzU
+kuebler kqb@lP
+kuechler kqk@lP
+kueck kUk
+kuecker kqkP
+kuehl kql
+kuehler kqlP
+kuehn kUn
+kuehne kUn
+kuehnel kqn@l
+kuehner kqnP
+kuehnle kqn@l
+kueker kqkP
+kuenheim kyU~hIm
+kuennen kqn~
+kuenstler kqns@lP
+kuenstler kqnslP
+kuenzel kqnz@l
+kuenzi kUAnz/
+kuenzli kqnzl/
+kuester kqstP
+kuether kqTP
+kufahl kufol
+kuffel kuf@l
+kuffner kufnP
+kugel kUg@l
+kugelman kug@lm~
+kugler kUg@lP
+kugler kUglP
+kuhar kUP
+kuhl kul
+kuhle kU@l
+kuhlenschmidt kyUl~Smit
+kuhlman kUlm~
+kuhlmann kUlm~
+kuhn kUn
+kuhne kun
+kuhner kUnP
+kuhnert kUnPt
+kuhnke kuNk
+kuhnle kun@l
+kuhns kUnz
+kuhr kV
+kuhrt kVt
+kuiken kUk~
+kuiper kUpP
+kuipers kUpPz
+kujala kIol@
+kujawa kUjow@
+kujawski k@yofsk/
+kuk kuk
+kuker kyUkP
+kukje kUkjA
+kukje kUkjE
+kukje kUky6
+kukla kukl@
+kuklinski k@klinsk/
+kukowski k@k{fsk/
+kukuk kUk@k
+kula kUl@
+kulaga kUlog@
+kulakowski kyUl@k{fsk/
+kulas kyUl@z
+kulesa kyUlEs@
+kulesza kyUleS@
+kulhanek kulh~ck
+kulich kyUl6k
+kulick kyUl6k
+kulig kyUl6g
+kuligowski kyUl6g{fsk/
+kulik kyUl6k
+kulikowski kyUl6k{fsk/
+kulinski kyUlinsk/
+kulis kUlis
+kulish kyUl6S
+kulka kulk@
+kulkarni k@lk)rn/
+kull kul
+kulla kul@
+kullberg kulbPg
+kullman kulm~
+kully kul/
+kulon kUl{n
+kulow kyUl]
+kulp kulp
+kulpa kulp@
+kulwicki k@lvitsk/
+kulzer kulzP
+kumagai kUmogo/
+kumar kUm)r
+kumble kumb@l
+kume kyUm
+kumho kumh]
+kumler kumlP
+kumm kum
+kummer kumP
+kumouri kUm{r/
+kumouri's kUm{r/z
+kump kump
+kumpf kumpf
+kumquat kumkwot
+kun kun
+kuna kyUn@
+kunaev kyUnAv
+kunath kun@T
+kunayev kyUnA@v
+kunce kuns
+kunda kund@
+kunde kund
+kundera k~d,r@
+kundert kundPt
+kundinger kund6NP
+kundrat kundr@t
+kunert kyUnPt
+kunes kyUnz
+kunesh kun6S
+kuney kyUn/
+kung kuN
+kunin kyUnin
+kunio kyUn/]
+kunka kuNk@
+kunkel kuNk@l
+kunkle kuNk@l
+kunkler kuNklP
+kuns kunz
+kunselman kuns@lm~
+kunsman kunsm~
+kunst kunst
+kunstler kunslP
+kunstler kunstlP
+kuntz kunts
+kuntze kuntz
+kuntzman kuntsm~
+kunz kunz
+kunze kunz
+kunzelman kunz@lm~
+kunzler kunzlP
+kunzman kunzm~
+kuo kU]
+kuomintang gwOmintaN
+kuomintang kwOmintaN
+kuomintang's gwOmintaNz
+kuomintang's kwOmintaNz
+kuow kyU]
+kupek kUp6k
+kuper kyUpP
+kuperman kUpPm~
+kupfer kupfP
+kupferman kupfPm~
+kupiec kup/k
+kupka kupk@
+kupor kyUpP
+kupper kupP
+kupres kUpr@s
+kuralt kyP{lt
+kuramoto kqromOt]
+kuranari kqr~)r/
+kuras kqr@z
+kurd kVd
+kurdish kVd6S
+kurdistan kVd@stan
+kurds kVdz
+kurdziel kVdz/l
+kurek kyUrck
+kurian kyqr/~
+kuriansky kqr/ansk/
+kurihara kUr@h)r@
+kuril kP@l
+kurilla kPil@
+kurinsky kyVinsk/
+kuriyama kUr@yom@
+kurk kVk
+kurka kVk@
+kurkjian kVkj/~
+kurkowski kPk{fsk/
+kurlak kVlak
+kurland kVl~d
+kurlander kVl~dP
+kurman kVm~
+kurmel kVm@l
+kurnit kVn@t
+kuroda kPOd@
+kurokawa kUr]kow@
+kurosawa kqr]sow@
+kurowski kP{fsk/
+kurshikov kVSn6k{f
+kurshikov kVSn6k{v
+kurt kVt
+kurtenbach kVt~bok
+kurth kVT
+kurtis kVtis
+kurtz kVts
+kurtzman kVtsm~
+kuruman kyqrUm~
+kurumizowa kqrUm/zO@
+kurumizowa's kqrUm/zO@z
+kury kyUr/
+kurylo kPil]
+kurz kVz
+kurzawa kqrzow@
+kurzban kVzban
+kurzweil kPzwIl
+kus kus
+kusa kUs@
+kusa kUz@
+kusch kuS
+kuschel kuS@l
+kuse kyUz
+kusek kUsck
+kusel kUs@l
+kush kqS
+kushner kuSnP
+kushnir kuSnP
+kusiak kus/ak
+kuske kusk
+kusler kus@lP
+kuss kus
+kusserow kusP]
+kussman kusm~
+kuster kustP
+kustra kustr@
+kut kut
+kutch kuC
+kutcher kuCP
+kutchna kuCn@
+kuter kyUtP
+kutner kutnP
+kutsch kuC
+kutscher kuCP
+kuttab kUtab
+kutter kutP
+kuttner kutnP
+kutuzovsky kUt@zovsk/
+kutz kuts
+kutzer kutzP
+kuvin kUvin
+kuwahara kUwoh)r@
+kuwait kUwAt
+kuwait's kUwAts
+kuwaiti kUwAt/
+kuwaitis kUwAt/z
+kuwam kyUwom
+kuykendall kIkcndol
+kuyper kIpP
+kuzara kyUz)r@
+kuze kyUz
+kuzel kUz@l
+kuzma kuzm@
+kuzminski k@zminsk/
+kuznets kuznets
+kuznia kuzn/@
+kuzniar kuznyP
+kuznicki k@znitsk/
+kvale k@vAl
+kvam k@vam
+kvamme k@vam
+kvamme k@vomA
+kvamme kvomA
+kvasnicka k@v@snisk@
+kvetch k@veC
+kvetch kveC
+kveton k@vet~
+kvistad k@vistad
+kvitsinsky k@vitsinsk/
+kvitsinsky kvitsinsk/
+kwai kwI
+kwak kwak
+kwan kwon
+kwang kwoN
+kwangju gwoNjU
+kwangju kwoNjU
+kwanza kwonz@
+kwanzaa kwonz@
+kwasniewski kw@znUsk/
+kwasniewski kw@znefsk/
+kwasnik kwozn6k
+kwasny kwozn/
+kwazulu kwozUlU
+kweisi kwIz/
+kwh kAdub@lyUAC
+kwiatek kw/otck
+kwiatkowski kw/@tk{fsk/
+kwiecien kwEs/n
+kwiecinski kw/Cinsk/
+kwik kwik
+kwitny kwitn/
+kwok kwok
+kwok-shing kw{kSiN
+kwolek kwOlck
+kwon kwon
+kwong kw{N
+kyd kid
+kyd's kidz
+kyer kIP
+kyes kIz
+kyger kIgP
+kyi kAwII
+kyi kE
+kyker kIkP
+kyl kIl
+kyle kIl
+kyle's kIlz
+kyler kIlP
+kyles kIlz
+kyllo kil]
+kyllonen kilon~
+kym kim
+kyna kin@
+kynard kinPd
+kyne kIn
+kynikos kinEk]s
+kyo kE]
+kyo kyO
+kyocera k/]s,r@
+kyocera ky]s,r@
+kyodo kyOd]
+kyokuto kyokUt]
+kyong ky{N
+kyongsang ky{NsaN
+kyoshi k/OS/
+kyoto kyOt]
+kyoung ky{N
+kyoung-min ky{Nmin
+kyowa kyO@
+kyra kIr@
+kyrgyzstan kirg@stan
+kyrgyzstan kirgEston
+kyron kIr~
+kysar kisP
+kyser kIsP
+kysor kIsP
+kyte kIt
+kytril kitril
+kyu kyU
+kyung kyuN
+kyushu kyuSU
+kyzar kizP
+kyzer kIzP
+l el
+l'amour lam{r
+l'eggs legz
+l'enfant lenfont
+l'enfant lonfont
+l'espalier lcspal/A
+l'expansion lekspanS~
+l'express lekspres
+l'heureux lhyUrq
+l'oreal l{r/al
+l's elz
+l. el
+l.'s elz
+l.s elz
+la lo
+la-carre lokorA
+la-paz lup{z
+laabs lobz
+laack lok
+laaco lok]
+laake lok
+laakso loks]
+laas loz
+laatsch loC
+lab lab
+lab's labz
+laba lob@
+labadie lab@d/
+laban lAb~
+laband loband
+labant l@bant
+labar l@b)r
+labarbera loborb,r@
+labarge laborg
+labarr l@bar
+labarre lob)rA
+labat lobot
+labate lobAt
+labaton lab@t~
+labatt l@bat
+labatt l@bot
+labatt's l@bats
+labatt's l@bots
+labauve l@bOv
+labay labA
+labbe lab
+labe lAb
+labeau l@bO
+label lAb@l
+label's lAb@lz
+labeled lAb@ld
+labeling lAb@l6N
+labeling lAbl6N
+labell l@bel
+labella l@bel@
+labelle l@bel
+labelled lAb@ld
+labels lAb@lz
+labenski lobensk/
+laber lAbP
+laberge lobPg
+labianca lob/oNk@
+labianca's lob/oNk@z
+labine lobEn/
+lablanc l@blaNk
+labo lob]
+laboda lobOd@
+labombard lab}bPd
+labonte l@bont
+labonte l@bont/
+labor lAbP
+labor's lAbPz
+laboratoires l@b{r@twoz
+laboratories labr@t{r/z
+laboratories' labr@t{r/z
+laboratory labr@t{r/
+laboratory's labr@t{r/z
+laborde l@b{rd
+labore l@b{r
+labored lAbPd
+laborer lAbPP
+laborers lAbPPz
+laboring lAbP6N
+laborious l@b{r/@s
+laboriously l@b{r/@sl/
+labors lAbPz
+labossiere lab@s/cr
+labouisse lobUs
+labounty l@b?nt/
+labour lAb?r
+labour lAbP
+labove l@buv
+labow lab]
+laboy l@b<
+labrador labr@d{r
+labrake labr@k
+labranche lobronk/
+labreck labr6k
+labrecque l@brek
+labree l@brE
+labrie labP/
+labrioche lobr/OS
+labriola lobr/Ol@
+labrosse lobrOs/
+labs labz
+labs' labz
+labuda l@byUd@
+labus lab@s
+labyrinth labPinT
+labyrinthine labPinTEn
+lac lak
+lac's laks
+lacana lokan@
+lacasse lokos/
+lacava lokov@
+lacayo lokA]
+lacaze lokoz/
+laccoliths lak@liTs
+lace lAs
+laced lAst
+lacefield lAsfEld
+lacer lAsP
+lacerate lasPAt
+laceration lasPAS~
+lacerations lasPAS~z
+lacerte loC,rt/
+laces lAs@z
+lacewell lAswel
+lacey lAs/
+lach laC
+lachance loC~s
+lachapelle laS@p@l
+lacharite laCPIt
+lache laC
+lachenbruch lak~brUk
+lacher lakP
+lachica laC6k@
+lachlan lakl~
+lachman lakm~
+lachmar lakmor
+lachney lakn/
+lachowicz loh@v6C
+lacina loCEn@
+lacivita loC/vEt@
+lack lak
+lackadaisical lak@dAz6k@l
+lackawanna lak@won@
+lacked lakt
+lackey lak/
+lackeys lak/z
+lackie lak/
+lacking lak6N
+lackluster laklustP
+lackman lakm~
+lackner laknP
+lacko lak]
+lackovic lak@v6k
+lacks laks
+laclair laklP
+laclede loklEd
+lacock lak@k
+lacomb lak}
+lacombe lokOmb/
+laconic lokon6k
+laconte lokOnt/
+lacorte lok{rt/
+lacoss l@kos
+lacosse lokOs/
+lacoste lok{st
+lacount l@kUnt
+lacour l@kqr
+lacourse l@kqrs
+lacoursiere lakqrs/cr
+lacouture lakUCP
+lacovara lok]v)r@
+lacquer lakP
+lacquered lakPd
+lacroix l@kr<
+lacross l@kr{s
+lacrosse l@kr{s
+lactase laktAs
+lactate laktAt
+lactating laktAt6N
+lactation laktAS~
+lacteals laktElz
+lacter laktP
+lactic lakt6k
+lactobacillus lakt]b@sil@s
+lactone lakt]n
+lactose lakt]s
+lacy lAs/
+lad lad
+lada lod@
+ladakh lod@k
+ladas lod@z
+ladbroke ladbrOk
+ladbroke's ladbrOks
+ladd lad
+ladd's ladz
+ladder ladP
+ladders ladPz
+lade lAd
+ladehoff lad@h{f
+laden lAd~
+ladenburg lAd~bPg
+lader lAdP
+ladewig ladU6g
+ladies lAd/z
+ladies' lAdEz
+lading lAd6N
+ladino l@dEn]
+ladish lodiS
+ladle lAd@l
+ladled lAd@ld
+ladles lAd@lz
+ladley ladl/
+ladner ladnP
+ladnier ladn/P
+ladouceur ladUsP
+ladow lad]
+lads ladz
+ladson lads~
+laduca lodUk@
+ladue lodwc
+laduke lodUkA
+ladwig ladw6g
+lady lAd/
+lady's lAd/z
+ladybird lAd/bVd
+ladybug lAd/bug
+ladybugs lAd/bugz
+ladylike lAd/lIk
+laenderbank landPbaNk
+laevo lAv]
+lafalce l@fols
+lafalce lofals/
+lafarge lof)rj
+lafata lofot@
+lafauci lof{C/
+lafave l@fAv
+lafavor laf@vP
+lafavre l@fAvP
+lafayette lof/et
+lafayette lofAet
+lafer lAfP
+laferriere lafP/cr
+lafever lafcvP
+lafevers lafcvPz
+lafeyette lof/et
+laff laf
+laffer lafP
+lafferty lafPt/
+laffey laf/
+laffin lafin
+laffitte l@fit
+laffoon l@fUn
+lafite lofIt
+lafitte l@fit
+laflam l@flam
+laflamme lafl}
+lafleche l@fleS
+lafler lAf@lP
+lafleur l@flV
+laflin laflin
+lafoe l@fO
+lafollette laf@lct
+lafon laf~
+lafond l@fond
+lafont l@font
+lafontaine laf~tAn
+lafontant lofont~t
+laforce l@f{rs
+laforest l@f{r@st
+laforge l@f{rg
+laforte l@f{rt
+lafortune lafPtUn
+lafosse l@fos
+lafountain lofontAn
+lafountaine lofontAn
+lafoy l@f<
+laframboise luframbwo
+lafrance l@frans
+lafreniere lafrin/cr
+lafrenz lafrcns
+lafuente lofwentA
+lag lag
+lagace logoC/
+lagan lag~
+lagana logan@
+lagarde log)rd/
+lagardere logordir
+lagasse logos/
+lagattuta logotUt@
+lage lAj
+lager logP
+lagerfeld lAgPfcld
+lagerfeld logPfcld
+lagergren lAgPgrcn
+lagerquist lAgPkwist
+lagerstrom lAgPstr}
+lagesse lagcs
+laggard lagPd
+laggards lagPdz
+lagged lagd
+lagging lag6N
+lagle lAg@l
+lagnado lognod]
+lago log]
+lagomarsino logOmorsEn]
+lagoon l@gUn
+lagoons l@gUnz
+lagos lAg{s
+lagow lag]
+lagrange lagrAnj
+lagreca logrek@
+lagroceria l@grOsPEu
+lagroceria logrOsPEu
+lagrone logrOn/
+lagrow lagrO
+lags lagz
+laguardia l@gw)rd/@
+lague log
+laguna l@gUn@
+lagunas l@gUn@z
+lahaie l@hI
+lahaie lah/
+laham lah}
+lahaye lahA
+lahey lAh/
+lahiff lahif
+lahm lam
+lahman lom~
+lahmann lom~
+lahn lan
+lahood lohqd
+lahore loh{r
+lahr l)r
+lahti lot/
+lahue lahyU
+lai lI
+laib lAb
+laible lAb@l
+laibowitz lAb@wits
+laibrook lAbrqk
+laiche lAC
+laid lAd
+laidig lAd6g
+laidlaw lAdl{
+laidlaw's lAdl{z
+laidler lAdlP
+laidley lAdl/
+lail lAl
+laimbeer lAmbir
+lain lAn
+laine lAn
+laing lo6N
+lainhart lInhort
+laino lAn]
+lair l,r
+laird l,rd
+lairmore l,rm{r
+lairson l,rs~
+lais lAz
+laissez lAzA
+laissez lezA
+lait lA
+laitinen lItin~
+laity lA@t/
+lajeune lajun
+lajeunesse lajuncs
+lajoie lajwo
+lajous l@ZUs
+lak lak
+lakatos lak@t]z
+lake lAk
+lake's lAks
+lakeberg lAkbPg
+lakefield lAkfEld
+lakefront lAkfrunt
+lakeland lAkl~d
+lakeman lAkm~
+laker lAkP
+lakers lAkPz
+lakes lAks
+lakes' lAks
+lakeshore lAkS{r
+lakeside lAksId
+lakeview lAkvyU
+lakewood lAkwqd
+lakey lAk/
+lakin lakin
+lakins lakinz
+lakota l@kOt@
+lakotas l@kOt@z
+lakotas' l@kOt@z
+lakshamanan lakS}on~
+lakshamanan's lakS}on~z
+lal lal
+lala lol@
+lalande lolond/
+lalas lol@s
+laliberte lol/b,rt/
+lalit l@lEt
+lalita l@lEt@
+lalitesh loliteS
+lall l{l
+lalla lal@
+lalley lal/
+lalli lal/
+lallie l{l/
+lallier lal/P
+lallo lal]
+lally lal/
+lalonde lolOnd/
+lalone lolOn/
+lalor lal{r
+lam lam
+lama lom@
+lama's lom@z
+lamacchia lomok/@
+lamagna lomogn@
+lamagna l}ony@
+lamaist lomIist
+laman lAm~
+lamanna lamin@
+lamantia lomonS@
+lamar l})r
+lamar's l})rz
+lamarca lom)rk@
+lamarche lom)rk/
+lamarr lom)r
+lamarre lom)r/
+lamartina lomortEn@
+lamas lom@z
+lamaster lomastP
+lamastus lam@st@s
+lamattina lomotEn@
+lamaur l}{r
+lamay lamA
+lamb lam
+lamb's lamz
+lambaste lambAst
+lambaste lambast
+lambasted lambAst@d
+lambasted lambast@d
+lambastes lambAs
+lambastes lambAss
+lambastes lambAsts
+lambastes lambas
+lambastes lambass
+lambastes lambasts
+lambasting lambAst6N
+lambda lamd@
+lambdin lamdin
+lambe lam
+lamberg lambPg
+lamberson lambPs~
+lambert lambPt
+lambert's lambPts
+lamberth lambPT
+lamberti lomb,rt/
+lamberto lomb,rtO
+lamberton lambPt~
+lambertson lambPts~
+lamberty lambPt/
+lambeth lambcT
+lambiase lomb/os/
+lambie lamb/
+lambing lam6N
+lamborghini lambPgEn/
+lamborghini's lambPgEn/z
+lamborghinis lambPgEn/z
+lamborn l}b{rn
+lamboy lamb<
+lambreau lambrO
+lambrecht lambr6kt
+lambright lambrIt
+lambro lambr]
+lambros lambr]z
+lambs lamz
+lambs' lamz
+lambsdorff lamzd{rf
+lambson lams~
+lamby lamb/
+lame lAm
+lamellar l}elP
+lamely lAml/
+lamendola lomcndOl@
+lament l}ent
+lamentable l}ent@b@l
+lamented l}ent@d
+lamenting l}ent6N
+laments l}ents
+lamer lAmP
+lamere lom,rA
+lamers lAmPz
+lameta l}et@
+lamey lAm/
+lamia lAm/@
+lamica lam6k@
+lamie lAm/
+lamina lam~@
+laminack lam~@k
+laminar lam~P
+laminate lam~@t
+laminate lam~At
+laminated lam~At@d
+laminates lam~@ts
+laminating lam~At6N
+lamine l}En
+lamine's l}Enz
+laminer lam~P
+lamirande lom6rond/
+lamison lamis~
+lamke lamk/
+lamkin lamkin
+lamle laml/
+lamm lam
+lamm's lamz
+lamme lam
+lammers lamPz
+lammert lamPt
+lammey lam/
+lammi lam/
+lammon lam~
+lammond lam~d
+lammons lam~z
+lamon lom{n
+lamond l}ond
+lamonica lom]nEk@
+lamons lom]nz
+lamont l}ont
+lamontagne lomontAn
+lamonte lomont
+lamora lom{r@
+lamore lom{r
+lamoreaux lamP]
+lamoreux lamP]
+lamorte lom{rt/
+lamos lom]s
+lamothe lam@T
+lamott l}ot
+lamotta lomOt@
+lamotte l}{t
+lamountain lamUntAn
+lamoureaux lamqr]
+lamoureux lamqr]
+lamp lamp
+lampe lamp
+lampert lampVt
+lampf lampf
+lamphear lamfP
+lamphere lamfP
+lamphier lamf/P
+lampi lamp/
+lamping lamp6N
+lampkin lampkin
+lampkins lampkinz
+lampl lamp@l
+lampley lampl/
+lamplighter lamplItP
+lamplighter's lamplItPz
+lamplighters lamplItPz
+lampman lampm~
+lampo lamp]
+lampoon lampUn
+lampoon's lampUnz
+lampooned lampUnd
+lamport lamp{rt
+lampp lamp
+lamppost lampOst
+lamppost lamppOst
+lampposts lampOs
+lampposts lampOss
+lampposts lamppOsts
+lamprey lampr/
+lampreys lampr/z
+lampron lampr~
+lampros lampr]z
+lamps lamps
+lampson lamps~
+lampton lampt~
+lamson lams~
+lamston lamst~
+lamy lAm/
+lan lan
+lana lan@
+lanagan lan@gan
+lanahan lan@han
+lanasa lonos@
+lancashire laNk@SIr
+lancaster laNk@stP
+lancaster lankastP
+lancastrian laNkastr/~
+lance lans
+lance's lans@z
+lancelet lansl@t
+lancelot lans@lot
+lanceolate lans/@lAt
+lancer lansP
+lancers lansPz
+lancet lans@t
+lancet's lans@ts
+lancets lans@ts
+lancia lonC@
+lancing lans6N
+lancit lansit
+lanclos lankl]z
+lancome lank}
+lancome lonkOm
+lancon laNk~
+lancour l~kqr
+lanctot laNkt@t
+lancz lanC
+land land
+land's landz
+landa land@
+landau land?
+landauer land?P
+landay landA
+landbank landbaNk
+landberg landbPg
+lande land
+landeck land6k
+landed land@d
+landefeld land@fcld
+landell landel
+landen land~
+landenberger land~bPgP
+lander landP
+landeros landP]z
+landers landPz
+landes landz
+landesbank land/zbaNk
+landesman land@sm~
+landess land@s
+landfair landfer
+landfall landf{l
+landfill landfil
+landfilling landfil6N
+landfills landfilz
+landform landf{rm
+landforms landf{rmz
+landfried landfP/d
+landgraf lanjr@f
+landgrave landgrAv
+landgrebe lanjrcb
+landgren landgrcn
+landholder landhOldP
+landholders landhOldPz
+landholding landhOld6N
+landholdings landhOld6Nz
+landi land/
+landin landin
+landing land6N
+landingham land6Nham
+landings land6Nz
+landini londEn/
+landino londEn]
+landis landis
+landlady landlAd/
+landler landlP
+landler's landlPz
+landless landl@s
+landlock landlok
+landlocked landlokt
+landlord landl{rd
+landlord's landl{rdz
+landlords landl{rdz
+landman landm~
+landmark landmork
+landmark's landmorks
+landmarks landmorks
+landmass landmas
+landmesser landmesP
+landmine landmIn
+landmines landmInz
+lando land]
+landolfi londOlf/
+landolt landOlt
+landon land~
+landor landP
+landover landOvP
+landow land]
+landowner landOnP
+landowners landOnPz
+landowski l~d{fsk/
+landreneau landr~]
+landress landrcs
+landreth landrcT
+landrieu landrEU
+landrieu landrU
+landrigan landr6g~
+landrith landriT
+landrum landr}
+landrus landr@s
+landry landr/
+landry's landr/z
+lands landz
+lands' landz
+landsat landsat
+landsberg landzbPg
+landsberger landzbPgP
+landsbergis landzbPg@s
+landscape landskAp
+landscape lanskAp
+landscaped landskApt
+landscaper landskApP
+landscapers landskApPz
+landscapes landskAps
+landscapes lanskAps
+landscaping landskAp6N
+landscaping lanskAp6N
+landslide landslId
+landslide lanslId
+landslides landslIdz
+landslides lanslIdz
+landsman landzm~
+landsner landznP
+landston landst~
+landstrom landstr}
+landt lant
+landview landvyU
+landview's landvyUz
+landviewite landvyUIt
+landviewites landvyUIts
+landward landwPd
+landwehr landw6r
+landy land/
+lane lAn
+lane's lAnz
+lanehart lAnhort
+lanes lAnz
+lanese lonAz/
+lanete l~Et
+laneve l~Ev
+laney lAn/
+lanfear lanfP
+lanford lanfPd
+lang laN
+langan laNg~
+langbehn laNbcn
+langbein laNbIn
+langbo laNb]
+langdale laNdAl
+langdon laNd~
+lange laN
+lange's laNz
+langel lANg@l
+langeland lANg@l~d
+langelier lAnjl/P
+langella lanjelP
+langen laN~
+langenbach lANg~bok
+langenberg laN~bPg
+langenderfer lANg~dPfP
+langendorf lANg~d{rf
+langenfeld lANg~fcld
+langer laNP
+langerman laNPm~
+langers laNPz
+langevin lANg6vin
+langfeldt laNfclt
+langfitt laNfit
+langford laNfPd
+langguth laNUT
+langham laNham
+langham laN}
+langhans laNh~z
+langhoff laNh{f
+langhorn laNh{rn
+langhorne laNh{rn
+langhorst laNh{rst
+langill laNg@l
+langille loNgEl/
+langlais l@NglA
+langland laNl~d
+langley laNgl/
+langley laNl/
+langlinais laNgl~A
+langlois l@Nlwo
+langman laNm~
+langner laNnP
+lango loNg]
+langone loNgOn/
+langowski l@Ng{fsk/
+langrehr laNgr6r
+langridge laNgr6j
+langsam laNs}
+langsdorf laNzd{rf
+langseth laNscT
+langsford laNzfPd
+langstaff laNstaf
+langston laNst~
+langton laNt~
+language laNgw@j
+languages laNgw@j@z
+languid laNgw@d
+languish laNgw6S
+languished laNgw6St
+languishes laNgw6S@z
+languishing laNgw6S6N
+langwell laNgwcl
+langworth laNgwPT
+langworthy laNwPT/
+lanham lan}
+lani lon/
+lanier l~ir
+lanigan lan6g~
+laning lAn6N
+laningham lan6Nham
+lanius lAn/@s
+lank laNk
+lanka laNk@
+lanka's laNk@z
+lankan laNk~
+lankans laNk~z
+lankford laNkfPd
+lanktree laNktrE
+lanky laNk/
+lanman lanm~
+lann lan
+lanna lan@
+lannan lan~
+lannen lan~
+lanners lanPz
+lanni lan/
+lanning lan6N
+lanno lan]
+lanno's lan]z
+lannom lan}
+lannon lan~
+lanny lan/
+lano lon]
+lanolin lan@l~
+lanoue lanUA
+lanouette lanUct
+lanphear lanfir
+lanpher lanfP
+lanphere lanfir
+lanphier lanf6r
+lansberry lanzber/
+lansbury lanzbV/
+lansbury's lanzbV/z
+lansdale lanzdAl
+lansdell lanzd@l
+lansdown lanzd?n
+lansdowne lansd?n
+lanser lansP
+lansford lansfPd
+lansing lans6N
+lansing's lans6Nz
+lansky lansk/
+lanston lanst~
+lant lant
+lantana lantan@
+lanter lantP
+lanterman lantPm~
+lantern lantPn
+lanterns lantPnz
+lanthanum lanT~}
+lanthier lanT/P
+lanting lant6N
+lantis lontis
+lantos lant]s
+lantrip lantrip
+lantry lantr/
+lantz lants
+lantzy lantz/
+lanum lan}
+lanvin lanvin
+lanyard lany@rd
+lanyi lony/
+lanyon lany~
+lanz lanz
+lanza lanz@
+lanzelotti lanz@lot/
+lanzer lanzP
+lanzet lanz@t
+lanzi lanz/
+lanzillo lanzil]
+lanzo lanz]
+lao l?
+laos l?s
+laos lA]s
+laos lo]s
+laotian l?S~
+laotian lAOS~
+laotian loOS~
+lap lap
+lapage lop6j
+lapaglia lopogl/@
+lapalme lopolm/
+lapan l@pan
+laparoscopic lapPosk@p6k
+laparoscopic lapr@skop6k
+laparoscopy lapPosk@p/
+lapd elApEdE
+lapd's elApEdEz
+lapdog lapd{g
+lape lAp
+lapel l@pel
+lapels l@pelz
+lapenna lopen@
+lapenta lopent@
+laperle lapP@l
+lapeyrouse lap6rUs
+lapham laf}
+lapiana lop/an@
+lapidary lap@der/
+lapides l@pIdz
+lapidus l@pEd@s
+lapidus lap@d@s
+lapier lAp/P
+lapierre lap/cr
+lapin lapin
+lapine lopEn/
+lapinski l@pinsk/
+lapinsky l@pinsk/
+lapka lopk@
+laplaca l@plok@
+lapland lapland
+laplant l@pl{nt
+laplante l@plont/
+laplume l@plUm
+lapoint l@p<nt
+lapointe l@p<nt
+lapolla l@pOl@
+laporta l@p{rt@
+laporte l@p{rt
+lapp lap
+lappe lap
+lapped lapt
+lappen lap~
+lappin l@pan
+lapping lap6N
+lapps laps
+laprade loprod/
+laprairie l@pr,r/
+lapre lApP
+laprise loprIz
+laps laps
+lapse laps
+lapsed lapst
+lapses laps@z
+lapsing laps6N
+lapsley lapsl/
+laptop laptop
+laptops laptops
+lar l)r
+lara l)r@
+larabee lar@b/
+laraia loroy@
+laraine lPAn
+laramee lar}/
+laramie l,r}/
+laramore lar}{r
+laraway lar@wA
+larcenous l)rs~@s
+larceny l)rs~/
+larch l)rC
+larche l)rC/
+larchmont l)rCmont
+larchmont's l)rCmonts
+larco l)rkO
+larcom l)rkom
+larcom l)rk}
+lard l)rd
+larded l)rd@d
+larder l)rdP
+lardner l)rdnP
+lare l,r
+lareau lPO
+laredo lPAd]
+lareina lorAEn@
+larena loren@
+larew larU
+large l)rj
+largely l)rjl/
+largen l)rg~
+largeness l)rjn@s
+largent l)rj~t
+larger l)rjP
+largess l)rj@s
+largesse lorges
+largest l)rj@st
+largo l)rg]
+lariat l,r/@t
+lariccia lorEC@
+larijani ler6jon/
+larimer lar}P
+larimore lorEm{r
+larina lorEn@
+larine lorEn/
+larios lorE]z
+lariscy lPisk/
+larison lar@s~
+larissa lorEs@
+larivee lar6v/
+lariviere lar6v/cr
+larizza lPiz@
+lark l)rk
+larke l)rk
+larkey l)rk/
+larkin l)rkin
+larkins l)rkinz
+larks l)rks
+larkspur l)rkspV
+larmer l)rmP
+larmon l)rm~
+larmore l)rm{r
+larned l)rnd
+larner l)rnP
+larocca lorOk@
+larocco lorOk]
+laroche lPOS
+laroche lorOS
+laroche's lorOS@z
+larochelle lar@S@l
+larock lar@k
+larocque lPOk
+laroe lar]
+laroque lPOk
+larosa lorOs@
+larose lorOs/
+larosiere lor]sy,r
+larouche lorUS
+laroux lPU
+larowe lar?
+larrabee lar@b/
+larrance lar~s
+larrea lar/@
+larrick lar6k
+larrimore lorEm{r
+larrison lar@s~
+larrivee lar6v/
+larroquette lor]ket
+larroquette's lor]kets
+larrow lar]
+larry l,r/
+larry's l,r/z
+lars l)rz
+larsen l)rs~
+larsh l)rS
+larson l)rs~
+larsson l)rs~
+larue lPU
+laruso lorUs]
+larussa lorUs@
+larusso lorUs]
+larva l)rv@
+larvae l)rv/
+larval l)rv@l
+lary l,r/
+laryngeal lPinj/@l
+laryngitis ler~jIt@s
+larynx l,r6Nks
+larzelere lPzelP
+las elAes
+las los
+lasagna l@zony@
+lasagna losony@
+lasala losol@
+lasalle l@sal
+lasater lasAtP
+lasca losk@
+lascala loskol@
+lasch laS
+lascivious l@siv/@s
+lasco losk]
+lascola loskOl@
+lase lAz
+lasecki l@setsk/
+lasek losck
+laser lAzP
+laser's lAzPz
+lasers lAzPz
+lasersonic losPson6k
+lasersonics losPson6ks
+laseter las/tP
+lash laS
+lashbrook laSbrqk
+lashed laSt
+lasher laSP
+lashes laS@z
+lashing laS6N
+lashings laS6Nz
+lashlee laSlE
+lashley laSl/
+lashomb laS}
+lashua laSUa
+lashway laSwA
+lasiter lasItP
+lask lask
+laska losk@
+laske lAsk
+lasker laskP
+laskey lask/
+laski losk/
+laskin laskin
+lasko lask]
+laskowski l@sk{fsk/
+lasky lask/
+lasley lasl/
+laslo losl]
+lasmo lasm]
+lasorda l@s{rd@
+lasorsa los{rs@
+lasota losOt@
+laspina lospEn@
+lass las
+lassa los@
+lasseigne l@sAny
+lassen las~
+lasser lasP
+lasseter las/tP
+lassetter lasctP
+lassie las/
+lassila losEl@
+lassiter lasItP
+lassman lasm~
+lassner lasnP
+lasso las]
+lasswell laswel
+last las
+last last
+last l{st
+last's lasts
+lasted last@d
+laster lastP
+lastest last@st
+lasting last6N
+lastinger last6NP
+lastly lastl/
+lastra lastr@
+lastrapes lostropcs
+lasts lasts
+lasumma l@sUm@
+lasure loZP
+laswell laswel
+laszlo lazl]
+lat lat
+lat lot
+lat-lon latlon
+lat-lons latlonz
+lata lot@
+lataif lotAf
+latanze l@tonzA
+latasha l@toS@
+latch laC
+latchaw laC{
+latched laCt
+latches laC@z
+latchford laCfPd
+latching laC6N
+latchkey laCkE
+late lAt
+latecomer lAtk}P
+latecomers lAtk}Pz
+latelies lAtl/z
+latella lotel@
+lately lAtl/
+latency lAt~s/
+latendresse lat~drcs
+lateness lAtn@s
+latent lAt~t
+later lAtP
+lateral latP@l
+laterites latPIts
+laterriere lotery,r
+laterza lot,rz@
+latest lAt@st
+latex lAteks
+latexes lAtcks@z
+lath laT
+latham laT}
+latham's laT}z
+lathan laT~
+lathe lAT
+lathem laTim
+lather laTP
+lathers laTPz
+lathes lATz
+lathon laT~
+lathouris l@TUr@s
+lathrop laTr@p
+latigo l@tEg]
+latimer lat}P
+latimore lotEm{r
+latin lat~
+latina l@tEn@
+latina lotEn@
+latinate lat~At
+latini lotEn/
+latino l@tEn]
+latino lotEn]
+latinos lotEn]s
+latins lat~z
+latiolais lat/@lA
+latisha l@tiS@
+latitude lat@tUd
+latitudes lat@tUdz
+latitudinal lat@tUd~@l
+latka lotk@
+latkas lotk@z
+latner latnP
+lato lot]
+laton lat~
+latona lotOn@
+latonia lotOn/@
+latorre lot{r/
+latour l@tqr
+latourette latqrct
+latoya l@t<@
+latoya's l@t<@z
+latrine l@trEn
+latrines l@trEnz
+latrobe lotrOb
+latrone l@trOn
+lats lats
+lats lots
+latsch laC
+latshaw laC{
+latson lats~
+latta lat@
+lattanzi lotonz/
+lattanzio lotonz/]
+latte lotA
+latter latP
+latter's latPz
+lattice lat@s
+latticework lat@swVk
+lattimer lat}P
+lattimore lotEm{r
+lattin latin
+lattner latnP
+latty lat/
+latulippe lotUlEp/
+latvala lotvol@
+latvia latv/@
+latvia's latv/@z
+latvian latv/~
+latvians latv/~z
+latz lats
+latzoff lats{f
+latzoff latz{f
+lau l?
+laub l{b
+laubach l?bok
+laubacher l?bokP
+laube l{b
+laubenstein l?b~st/n
+laubenstein l?b~stIn
+laubenthal l?b~T@l
+lauber l?bP
+laubhan l?bh~
+laubscher l?bSP
+lauch loC
+lauck l{k
+laud l{d
+laudable l{d@b@l
+laudanum l{d~}
+laudatory l{d@t{r/
+laude l{d
+lauded l{d@d
+laudenslager l?d~slAgP
+lauder l?dP
+lauder l{dP
+lauderback l?dPbak
+lauderbaugh l{dVb{
+lauderdale l{dPdAl
+laudicina l{d/CEn@
+lauding l{d6N
+laudise l{dIz
+laudon l{d~
+lauds l{dz
+laue l?/
+lauer l?P
+lauerman l?Pm~
+lauf l{f
+laufenberg l?f~bPg
+laufer l{fP
+lauffer l{fP
+laugh laf
+laughable laf@b@l
+laughed laft
+laugher lokP
+laughery lafP/
+laughing laf6N
+laughinghouse laf6Nh?s
+laughingly laf6Nl/
+laughingstock laf6Nstok
+laughler laflP
+laughlin lofl~
+laughlin lokl~
+laughman lafm~
+laughner lafnP
+laughrey lafr/
+laughridge lafrij
+laughs lafs
+laughter laftP
+laughton l{t~
+lauinger l?6NP
+lauman l?m~
+laumann l?m~
+laun l{n
+launcelot l{ns@lot
+launch l{nC
+launched l{nCt
+launcher l{nCP
+launchers l{nCPz
+launches l{nC@z
+launching l{nC6N
+launchings l{nC6Nz
+launder l{ndP
+laundered l{ndPd
+launderer l{ndPP
+launderers l{ndPPz
+laundering l{ndP6N
+laundries l{ndr/z
+laundromat l{ndr}at
+laundry l{ndr/
+launer l{nP
+launius l?n/@s
+lauper l?pP
+laur l{r
+laura l{r@
+laura's l{r@z
+laurance l{r~s
+laurdan l{rd~
+laure l{r
+laureano l{rEn]
+laureate l{r/@t
+laureates l{r/@ts
+laureen l{rEn
+laurel l{r@l
+laurel's l{r@lz
+laurels l{r@lz
+lauren l{r~
+laurena l{ren@
+laurence l{r~s
+laurene l{rEn
+laurens l{r~z
+laurent l{r~t
+laurentian l{renS~
+laurentiis l{r~tEz
+laurenz l?rAnz
+lauretarian l{r@t,r/~
+lauretta lPet@
+laurette l{ret
+laurey l{r/
+lauri l)r/
+lauria l{r/@
+lauriat's l)r/@ts
+lauriats l)r/@ts
+laurice l{ris
+lauricella l{risel@
+laurich l?r6k
+lauridsen l{rids~
+laurie l)r/
+laurie's l)r/z
+laurin l{rin
+laurino l{rEn]
+lauritsen l?r@ts~
+lauritsen lorEts~
+lauritzen l?r/tz~
+lauritzen lorEtz~
+lauro l{r]
+laursen l?rs~
+laury l{r/
+lausanne l{san
+lausch l?S
+laut l{t
+lauten l?t~
+lautenbach l?t~bok
+lautenberg l?t~bPg
+lautenburg l?t~bPg
+lautenschlager l?t~SlAgP
+lauter l?tP
+lauterbach l?tPbok
+lauth l{T
+lautner l?tnP
+lautzenheiser l?tz~hIzP
+lauver l?vP
+laux l{ks
+lauzon l?z~
+lava lov@
+laval l@vol
+lavalle lovol/
+lavallee lav@l/
+lavalley lav@l/
+lavan lAv~
+lavarnway l@v)rnwA
+lavatories lav@t{r/z
+lavatory lav@t{r/
+lave lAv
+laveau l@vO
+lavecchia lovek/@
+laveda lovAd@
+lavell lovAl
+lavelle l@vel
+lavely lAvl/
+laven lAv~
+lavender lav~dP
+laventhol lAv~Tol
+laventure lovenCP
+laver lAvP
+laverdiere lovPdir/
+laverdure lovPdqr/
+lavere lov,rA
+lavergne l@vVny
+laverne l@vVn
+lavers lAvPz
+laverty lavPt/
+lavery lAvP/
+lavetta lovet@
+lavette l@vet
+lavey lAv/
+lavi lAv/
+lavie l@vE
+lavie lAv/
+lavigne l@viny
+lavin lavin
+lavina lovEn@
+lavinder lavindP
+lavine lovEn/
+lavinia l@viny@
+laviolette lav/]let
+lavis lavis
+lavish lav6S
+lavished lav6St
+lavishes lav6S@z
+lavishing lav6S6N
+lavishly lav6Sl/
+lavoie l@vwo
+lavorgna l@v{rn@
+lavoro l@v{r]
+lavoy l@v<
+lavy lAv/
+law lo
+law's l{z
+lawall l?@l
+laware l@w,r
+lawbreaker l{brAkP
+lawbreakers l{brAkPz
+lawbreaking l{brAk6N
+lawes l{z
+lawford l{fPd
+lawful l{f@l
+lawfully l{f@l/
+lawhead l{hed
+lawhon l{h~
+lawhorn lawPn
+lawhorne lawPn
+lawing l{6N
+lawler l{lP
+lawless l{l@s
+lawlessness l{l@sn@s
+lawley l{l/
+lawlis l{lis
+lawlor l{lP
+lawmaker l{mAkP
+lawmaker's l{mAkPz
+lawmakers l{mAkPz
+lawmakers' l{mAkPz
+lawmaking l{mAk6N
+lawman l{m~
+lawmen l{men
+lawn l{n
+lawner l?nP
+lawner l{nP
+lawniczak lovn6Cak
+lawnmower l{nm]P
+lawnmowers l{nm]Pz
+lawns l{nz
+lawnsdale l{nzdAl
+lawnsdale's l{nzdAlz
+lawplan l{plan
+lawrance l{r~s
+lawrence l{r~s
+lawrence's l{r~s@z
+lawrenceburg l{r~sbPg
+lawrenceville l{r~svil
+lawrencium l{rens/}
+lawrenz lovrinz
+lawrie l{r/
+lawry l{r/
+laws l{z
+lawshe l{S
+lawson l{s~
+lawson's l{s~z
+lawsuit l{sUt
+lawsuit's l{sUts
+lawsuits l{sUts
+lawter l{tP
+lawther l{TP
+lawton l{t~
+lawver l{vP
+lawyer l<P
+lawyer l{yP
+lawyer's l{yPz
+lawyering l{yP6N
+lawyerly l{yPl/
+lawyers l<Pz
+lawyers l{yPz
+lawyers' l{yPz
+lax laks
+laxalt laksolt
+laxative laks@t6v
+laxatives laks@t6vz
+laxey laks/
+laxity laks@t/
+laxson laks~
+laxton lakst~
+lay lA
+lay's lAz
+lay-up lAup
+layah lA@
+layborne lAb{rn
+layborne's lAb{rnz
+laycock lAkok
+layden lAd~
+laye lA
+layer lAP
+layered lAPd
+layering lAP6N
+layers lAPz
+layfield lAfEld
+layhee lAh/
+laying lA6N
+layland lAl~d
+layman lAm~
+layman's lAm~z
+laymen lAm~
+laymon lAm~
+layne lAn
+layoff lA{f
+layoffs lA{fs
+layout lA?t
+layouts lA?ts
+layover lAOvP
+layovers lAOvPz
+laypeople lApEp@l
+layperson lApVs~
+lays lAz
+layson lAz~
+laythan lAT~
+layton lAt~
+lazar lAzP
+lazard l@z)rd
+lazare loz)rA
+lazaro l@z)r]
+lazaroff lazP{f
+lazarski l@z)rsk/
+lazarus lazP@s
+lazarz lozorz
+lazcano lozkon]
+lazear l@zir
+lazenby laz~b/
+lazer lAzP
+lazere l@zAr
+lazier lAz/P
+laziest lAz/@st
+lazily laz@l/
+laziness lAz/n@s
+lazo loz]
+lazor loz{r
+lazuli l@zUl/
+lazulite laz@lIt
+lazur lazP
+lazy lAz/
+lazzara lots)r@
+lazzari lots)r/
+lazzarini lotsorEn/
+lazzaro lots)r]
+lazzell laz@l
+lcs elsEes
+le l@
+lea lE
+leabo lEb]
+leach lEC
+leach's lEC@z
+leached lECt
+leaches lEC@z
+leaching lEC6N
+leachman lECm~
+leachman's lECm~z
+leacock lEkok
+lead lEd
+lead led
+leadbelly ledbcl/
+leadbetter lEdb@tP
+leadbetter ledbctP
+leadbetter ledbctP
+leaded led@d
+leaden led~
+leader lEdP
+leader's lEdPz
+leaderless lEdPl@s
+leaders lEdPz
+leaders' lEdPz
+leadership lEdPSip
+leadership's lEdPSips
+leaderships lEdPSips
+leading lEd6N
+leadingham lEd6Nham
+leadoff lEd{f
+leads lEdz
+leadville ledvil
+leadwork ledwVk
+leaf lEf
+leafed lEft
+leafhopper lEfhopP
+leafhoppers lEfhopPz
+leafing lEf6N
+leafless lEfl@s
+leaflet lEfl@t
+leaflets lEfl@ts
+leaflike lEflIk
+leafs lEfs
+leafy lEf/
+league lEg
+league's lEgz
+leaguer lEgP
+leaguers lEgPz
+leagues lEgz
+leagues' lEgz
+leah lE@
+leahey lAh/
+leahy lAh/
+leak lEk
+leakage lEk@j
+leake lEk
+leaked lEkt
+leaker lEkP
+leakers lEkPz
+leakey lEk/
+leaking lEk6N
+leaks lEks
+leaky lEk/
+leal lEl
+leala lEl@
+lealan lEl~
+lealia lEl/@
+lealie lEl/
+leaman lEm~
+leamer lEmP
+leaming lEm6N
+leamon lEm~
+leamy lEm/
+lean lEn
+leana lEn@
+leander l/andP
+leandro l/ondr]
+leaned lEnd
+leaner lEnP
+leaners lEnPz
+leanest lEn@st
+leaning lEn6N
+leanings lEn6Nz
+leann l/an
+leans lEnz
+leant lE~t
+leanza l/anz@
+leap lEp
+leaped lEpt
+leaped lept
+leapfrog lEpfr{g
+leapfrogged lEpfr{gd
+leapfrogging lEpfr{g6N
+leaphart lEphort
+leaping lEp6N
+leapley lEpl/
+leaps lEps
+leapt lEpt
+leapt lept
+lear lir
+lear's lErz
+leard lVd
+learjet lirjet
+learn lVn
+learned lVn@d
+learned lVnd
+learner lVnP
+learners lVnPz
+learning lVn6N
+learns lVnz
+learnt lVnt
+learonal lEr~@l
+leary lir/
+leary's lir/z
+leas lEz
+leasable lEs@b@l
+leasco lEsk]
+lease lEs
+lease's lEs@z
+leaseback lEsbak
+leasebacks lEsbaks
+leased lEst
+leasehold lEshOld
+leaser lEsP
+leases lEs@z
+leaseway lEswA
+leaseway's lEswAz
+leash lES
+leashed lESt
+leashes lES@z
+leasing lEs6N
+leasing's lEs6Nz
+leask lEsk
+leason lEs~
+least lEst
+leasure leZP
+leath lET
+leath's lETs
+leatham lET}
+leathem leTim
+leather leTP
+leatherback leTPbak
+leatherbacks leTPbaks
+leatherberry leTPber/
+leatherbury leTPber/
+leatherman leTPm~
+leathers leTPz
+leatherwood leTPwqd
+leathery leTP/
+leaton lEt~
+leatrice lEtris
+leave lEv
+leavell lEv@l
+leavelle l@vel
+leaven lev~
+leavened lev~d
+leavening lev~6N
+leavens lev~z
+leavenworth lev~wVT
+leaver lEvP
+leaver's lEvPz
+leaverton lEvPt~
+leaves lEvz
+leavey lEv/
+leaving lEv6N
+leavings lEv6Nz
+leavins lEvinz
+leavitt levit
+leavy lEv/
+leazer lEzP
+lebanese leb~Ez
+lebanon leb~~
+lebanon's leb~~z
+lebar l@b)r
+lebaron l@b,r~
+lebarron l@b,r~
+lebeau l@bO
+lebeck lEbck
+lebed lebcd
+lebed's lebcdz
+lebeda lAbAd@
+lebegue leb6g
+lebel leb@l
+leben leb~
+lebenthal leb~T{l
+leber lEbP
+lebert lebPt
+leblanc l@blaNk
+leble leb@l
+lebleu leblU
+leblond l@blond
+lebo lAb]
+leboeuf l@buf
+lebold leb]ld
+lebon leb~
+lebouef l@buf
+lebovitz leb@vits
+lebow l@bO
+lebow's l@bOz
+lebowitz leb@wits
+lebrecht lebr6kt
+lebreton lebriton
+lebron lebr~
+lebrun lebr~
+lebsack lebs@k
+lebudde l@bud
+lecates l6kAts
+leccese lcCAz/
+lech lek
+lecher leCP
+lecherous leCP@s
+lechler leklP
+lechman lekm~
+lechmere lekmir
+lechner leknP
+lechtenberg lekt~bPg
+lechters lektPz
+lechuga leCUg@
+lecithin les@Tin
+leck lek
+leckey lek/
+leckie lek/
+leckrone lekr~
+leclair leklP
+leclaire l6kl,r
+leclerc l@klVk
+leclercq leklPk
+leclere leklP
+lecli lekl/
+lecli's lekl/z
+lecocq lek@k
+lecomba l@kumb@
+lecompte lek}pt
+lecomte l6komt
+leconte lckOnt/
+lecount l6kUnt
+lecrone lckrOn/
+lecroy lekr<
+lectec lektek
+lecter lektP
+lectern lektPn
+lector lektP
+lecture lekCP
+lectured lekCPd
+lecturer lekCPP
+lecturers lekCPPz
+lectures lekCPz
+lecturing lekCP6N
+lecuyer lekIP
+lecy lEs/
+led led
+leda lEd@
+leday lEdA
+ledbetter ledbPtP
+ledden led~
+leddy led/
+ledeen l@dEn
+leder ledP
+lederer ledPP
+lederle ledPl/
+lederman lEdPm~
+ledesma lcdesm@
+ledet ledct
+ledezma lAdAzm@
+ledford ledfPd
+ledge lej
+ledger lejP
+ledgers lejPz
+ledgerwood lejPwqd
+ledges lej@z
+ledin ledin
+ledlow ledlO
+ledo lAd]
+ledonne led~
+ledoux l@dU
+ledvina lcdvEn@
+ledwell ledwel
+ledwith ledwiT
+ledyard ledyPd
+lee lE
+lee's lEz
+leeb lEb
+leece lEs
+leech lEC
+leeches lEC@z
+leeco lEk]
+leed lEd
+leeder lEdP
+leedham lEdh}
+leedom lEd}
+leeds lEdz
+leeds's lEdz@z
+leedy lEd/
+leek lEk
+leeks lEks
+leeman lEm~
+leeming lEm6N
+leemon lEm~
+leen lEn
+leena lEn@
+leep lEp
+leeper lEpP
+leery lir/
+lees lEz
+leesburg lEzbPg
+leese lEs
+leeser lEsP
+leeson lEs~
+leeson's lEs~z
+leet lEt
+leetch lEC
+leete lEt
+leeth lET
+leeuwen lU~
+leeuwen lyU~
+leever lEvP
+leeward lEwPd
+leeway lEwA
+lefauve l@fov
+lefave l@fAv
+lefcourt lefk{rt
+lefeber l@fAbP
+lefebre l@fAbP
+lefebure lef@byUr
+lefebvre l@fAbP
+lefever l@fAvP
+lefevers l@fAvPz
+lefevre l@fAvP
+leff lef
+leff's lefs
+leffel lef@l
+leffert lefPt
+lefferts lefPts
+leffew lefyU
+leffingwell lef6Ngwcl
+leffler leflP
+lefkowitz lefk@wits
+lefler leflP
+leflore leflP
+lefort lefPt
+lefrak lefrak
+lefrancois lefr~kwo
+lefrere l@fr,r
+left left
+left's lefts
+left-brace leftbrAs
+left-winger leftwiNP
+left-wingers leftwiNPz
+lefthand lcfthand
+lefthanded lcfthand@d
+lefties left/z
+leftism leftiz}
+leftist left@st
+leftists left@s
+leftists left@ss
+leftists left@sts
+lefton left~
+leftover leftOvP
+leftovers leftOvPz
+leftridge leftrij
+leftward leftwPd
+leftwich leftw6k
+leftwing leftwiN
+lefty left/
+leg leg
+leg's legz
+legacies leg@s/z
+legacy leg@s/
+legal lEg@l
+legalese leg@lEs
+legalism lEg@liz}
+legalistic leg@list6k
+legalities l/gal@t/z
+legality l/gal@t/
+legalization lEg@l@zAS~
+legalize lEg@lIz
+legalized lEg@lIzd
+legalizing lEg@lIz6N
+legally lEg@l/
+legals lEg@lz
+legan leg~
+legare lcg)r/
+legaspi lcgosp/
+legate leg@t
+legates leg@ts
+legato l@gotO
+legault l6gO
+lege lEj
+legend lej~d
+legendary lej~der/
+legendre leg~drA
+legends lej~dz
+legent lej~t
+legent's lej~ts
+leger lejP
+legerdemain lejPd}An
+legere legP
+leget legct
+legette liZet
+legg leg
+legge leg
+legged leg@d
+legged legd
+leggett legct
+leggette leget
+legging leg6N
+leggings leg6Nz
+leggio lej/]
+leggitt legct
+leggy leg/
+leghorn legh{rn
+leghorns legh{rnz
+legibility lej@bil@t/
+legible leg@b@l
+legion lEj~
+legionaries lEj~er/z
+legionnaire lEj~er
+legionnaire's lEj~erz
+legionnaires lEj~erz
+legions lEj~z
+legislate lej@slAt
+legislated lej@slAt@d
+legislates lej@slAts
+legislating lej@slAt6N
+legislation lej@slAS~
+legislation's lej@slAS~z
+legislative lej@slAt6v
+legislatively lej@slAt6vl/
+legislator lej@slAtP
+legislators lej@slAtPz
+legislators' lej@slAtPz
+legislature lej@slACP
+legislature's lej@slACPz
+legislatures lej@slACPz
+legit l@jit
+legit lejit
+legitimacy l@jit}@s/
+legitimate l@jit}@t
+legitimately l@jit}@tl/
+legitimize l@jit}Iz
+legitimized l6jit}Izd
+legitimizes l6jit}Iz@z
+legitimizing l6jit}Iz6N
+legler leglP
+legless legl@s
+legner legnP
+lego leg]
+legore leg{r
+legrand legrand
+legrande legrand
+legree l6grE
+legroom l@grUm
+legros legr]z
+legs legz
+legume legyUm
+legumes legyUmz
+legwork legwVk
+leh le
+lehan lEhan
+lehane l@hAn
+lehder ledP
+lehder's ledPz
+lehenbauer lA~b?P
+lehew lAhyU
+lehigh lEhI
+lehl lel
+lehman lEm~
+lehman's lEm~z
+lehmann lAm~
+lehmer lemP
+lehmkuhl lemk@l
+lehn len
+lehne len
+lehnen len~
+lehner lenP
+lehnert lenPt
+lehnhoff lenh{f
+lehr l,r
+lehrer l,rP
+lehrke l,rk
+lehrman l,rm~
+lehrmann l,rm~
+lehtinen let~~
+lehtonen l@ton~
+lei lA
+leib lEb
+leibel lIb@l
+leibensperger lIb~spPgP
+leiber lEbP
+leibert lIbPt
+leibfried lIbfP/d
+leibler lEblP
+leibman lEbm~
+leibniz lEbniz
+leibold lIbOld
+leibovit lEb@vit
+leibovitz lEb@vits
+leibowitz lEb]its
+leibrand lEbrand
+leibrand lIbrand
+leibrand's lEbrandz
+leibrand's lIbrandz
+leibrock lIbr@k
+leiby lEb/
+leicester lestP
+leichliter lIkl/tP
+leichner lIknP
+leicht lIkt
+leichter lIktP
+leichtman lIktm~
+leichty lIkt/
+leick lEk
+leider lIdP
+leiderman lIdPm~
+leiderman's lIdPm~z
+leidig lId6g
+leidner lIdnP
+leidy lEd/
+leier lIP
+leif lEf
+leifer lIfP
+leifeste lIfcst
+leifheit lIfhIt
+leigh lE
+leight lAt
+leighton lAt~
+leighty lAt/
+leija lEy@
+leikam lIk}
+leiken lIk~
+leiker lIkP
+leila lEl@
+leilani l@lon/
+leilia lEl/@
+leiman lIm~
+leimbach lImbok
+leimer lImP
+leimert lEmPt
+leimert lImPt
+lein lEn
+leinart lInort
+leinbach lInbok
+leinberger lInbPgP
+leindecker lInd6kP
+leinen lIn~
+leiner lInP
+leingang lINg@N
+leininger lIn6NP
+leino lAEn]
+leinonen lIn~~
+leins lEnz
+leinsdorf lInzd{rf
+leinweber lInwcbP
+leiper lEpP
+leiphart lIphort
+leipold lIp]ld
+leipzig lIps6g
+leis lAz
+leischner lISnP
+leise lEs
+leisenring lIs~r6N
+leiser lIsP
+leisey lEs/
+leishman lESm~
+leising lIs6N
+leisinger lIs~jP
+leisner lIsnP
+leiss lIs
+leist lE@st
+leister lEstP
+leistikow lIstik]
+leistner lIstnP
+leisure lEZP
+leisure leZP
+leisurely lEzPl/
+leisy lEs/
+leitch lEC
+leite lEt
+leiter lItP
+leiterman lItPm~
+leith lET
+leitha lET@
+leithia lET/@
+leitman lItm~
+leitmotif lItm]tEf
+leitner lItnP
+leitz lEts
+leitzel lItz@l
+leitzke lItsk/
+leiva lEv@
+leja lAy@
+lejeune ley<n
+lek lek
+lekachman lekokm~
+lekas lEk@z
+lekberg lekbPg
+lela lEl@
+lelah lel@
+leland lEl~d
+leleux l@lO
+lelia lEly@
+lellouche lclUS
+lem lem
+lema lEm@
+lemaire l},r
+lemaitre l}AtP
+lemaitre l}Atr@
+leman lEm~
+lemans lem~z
+lemanski l}ansk/
+lemar lim)r
+lemarr lemP
+lemaster lEmastP
+lemasters l}astPz
+lemay lemA
+lembcke lembk/
+lemberg lembPg
+lemberger lembPgP
+lembke lembk/
+lembo lemb]
+lemburg lembPg
+lemcke lemk
+lemelin lem@lin
+lemelle limel
+lemen lEmcn
+lemercier l}Vs/P
+lemercier's l}Vs/Pz
+lemere lemP
+lemery lemP/
+lemieux l}yU
+leming lEm6N
+leming lem6N
+lemire lAmirA
+lemke lemk/
+lemler lemlP
+lemley leml/
+lemm lem
+lemma lem@
+lemme lem@
+lemmen lemcn
+lemmer lemP
+lemmerman lemPm~
+lemmie lem/
+lemming lem6N
+lemmings lem6Nz
+lemmo lem]
+lemmon lem~
+lemmond lem~d
+lemmons lem~z
+lemoine lim<n
+lemon lem~
+lemonade lem~Ad
+lemond lem~d
+lemonds lem~dz
+lemons lem~z
+lemont l}ont
+lemos lEm]z
+lemp lemp
+lempert lempPt
+lempke lempk
+lemuela lcmUl@
+lemur lEmP
+lemurs lEmPz
+lemus lEm@s
+len len
+lena lEn@
+lena's lEn@z
+lenahan len@han
+lenard lenPd
+lenart lenPt
+lenarz lAnorz
+lencioni lcnCOn/
+lend lend
+lender lendP
+lender's lendPz
+lenderman lendPm~
+lenders lendPz
+lenders' lendPz
+lending lend6N
+lendings lend6Nz
+lendl lend@l
+lends lendz
+lene lEn
+lenehan len@han
+leneta lcnet@
+lenexa lcneks@
+leng leN
+lengacher leNg@kP
+lengel leNg@l
+lenger leNP
+lengle liN@l
+length leNT
+length leNkT
+lengthen leNT~
+lengthen leNkT~
+lengthened leNT~d
+lengthened leNkT~d
+lengthening leNT~6N
+lengthening leNkT~6N
+lengthens leNT~z
+lengthens leNkT~z
+lengths leNTs
+lengths leNkTs
+lengthways leNTwAz
+lengthwise leNTwIz
+lengthy leNT/
+lengyel leNyel
+lenhard lenPd
+lenhardt lenhort
+lenhart lenhort
+lenhoff lenh{f
+leniency lEny~s/
+lenient lEn/~t
+lenient lEny~t
+leniently lEny~tl/
+lenig len6g
+lenihan len@han
+lenin len~
+lenin's leninz
+leningrad len~grad
+lenington len6Nt~
+leninism len~iz}
+leninist len~ist
+lenis lEn@s
+lenita lcnEt@
+lenius lEn/@s
+lenk leNk
+lenke leNk
+lenker leNkP
+lennane lEnan
+lennane lcnAn
+lennar lenP
+lennard lenPd
+lennartz lenorts
+lennie len/
+lennig len6g
+lenning len6N
+lennon len~
+lennon's len~z
+lennox len@ks
+lenny len/
+leno lEn]
+leno len]
+leno's lEn]z
+leno's len]z
+lenon len~
+lenora lenP@
+lenore l~{r
+lenos lEn]z
+lenox len@ks
+lens lenz
+lenscrafter lenzkraftP
+lenscrafters lenzkraftPz
+lenses lenz@z
+lensing lens6N
+lent lent
+lentil lent@l
+lentils lent@lz
+lentinan lent~~
+lentine lcntEn/
+lentini lcntEn/
+lentner lentnP
+lento lent]
+lenton lent~
+lents lents
+lentsch lenC
+lentz lents
+lentzsch lents
+leny len/
+lenz lenz
+lenz's lenz@z
+lenzen lenz~
+lenzi lenz/
+lenzini lcnzEn/
+lenzo lenz]
+leo lE]
+leo's lE]z
+leoda led@
+leoine l6<n
+leola lel@
+leoma l6Om@
+leominster lE]minstP
+leon lEon
+leon's lEonz
+leona lE]n@
+leonara lcn)r@
+leonard lenPd
+leonard's lenPdz
+leonarda lcn)rd@
+leonardi lcn)rd/
+leonardis lenordis
+leonardo lE~)rd]
+leone l/On
+leonel lE]n@l
+leonelle lcnel
+leonelli lcnel/
+leonerd lE~Pd
+leones l/Onz
+leonetti lcnet/
+leong leN
+leonhard lE~hort
+leonhardt lenhort
+leonhart lenhort
+leoni l/On/
+leoni lcOn/
+leonid lE~@d
+leonie len/
+leonora lE~{r@
+leonore lE~{r
+leontine lEontIn
+leontine lcntEn/
+leontyne lEontIn
+leopard lepPd
+leopards lepPdz
+leopold lE@pOld
+leopoldina lcp]ldEn@
+leopoldine lcp]ldEn/
+leopoldo lE@pOld]
+leora l,r@
+leos lE]z
+leota let@
+leotard lE@tord
+lep lep
+lepage lep6j
+lepak lep@k
+lepard lepPd
+lepe lEp
+leper lepP
+lepera lcp,r@
+lepere lAp,rA
+lepers lepPz
+lepine lcpEn/
+lepisto lcpEst]
+lepkowski lcpk{fsk/
+lepley lepl/
+lepore lcp{r/
+lepp lep
+leppanen lep~~
+leppard lepPd
+leppek lep6k
+lepper lepP
+leppert lepPt
+leppla lepl@
+leppo lep]
+lepre lepP
+leprosy lepr@s/
+leptin leptin
+leptonic lcpton6k
+lequire lAkwirA
+lerach l,r@k
+lerch lVk
+lerche lVC
+lereah lerA@
+lerette lPet
+lerew l,rU
+lerhman lVm~
+lerma lVm@
+lerman l,rm~
+lerner lVnP
+lerner's lVnPz
+leroux lPU
+leroy lEr<
+lerro l,r]
+lersch lVS
+lerum l,r}
+les les
+lesa lEs@
+lesabre l@sAbP
+lesabres les@br@s
+lesage les6j
+lesane lAsonA
+lesbian lezb/~
+lesbianism lezb/~iz}
+lesbians lezb/~z
+lescaze l@skAz
+lesch leS
+leschly leSl/
+leser lesP
+lesesne lesin
+lesh leS
+lesharo lcS)r]
+lesher leSP
+lesiak les/ak
+lesieur les/P
+lesinski l@sinsk/
+lesion lEZ~
+lesions lEZ~z
+leske lesk
+lesko lesk]
+lesley lesl/
+leslie lesl/
+lesmeister lesmIstP
+lesner lesnP
+lesniak lesn/ak
+lesnick lesn6k
+lesniewski lcsnUsk/
+lesniewski lcsnefsk/
+lesotho lcsOT]
+lesperance lcspPons
+lespinasse lespinas
+less les
+lessard lesPd
+lessee lcsE
+lessees lcsEz
+lessen les~
+lessened les~d
+lessening les~6N
+lessens les~z
+lesser lesP
+lessig les6g
+lessin lesin
+lessing les6N
+lessley lesl/
+lessman lesm~
+lessnau lesn?
+lessnau lesnO
+lessner lesnP
+lesson les~
+lessons les~z
+lessor lesP
+lessors lesPz
+lest lest
+lestat lestat
+lester lestP
+lestrange lcstrAnj
+lesuer lcsUP
+lesueur lcsUP
+lesure lcSqr
+leszczynski lcSinsk/
+leszek lesck
+let let
+let's lets
+leta let@
+letarte letort
+letcher leCP
+letchworth leCwPT
+letdown letd?n
+letellier let@l/P
+letendre l@tondr@
+leth leT
+letha leT@
+lethal lET@l
+lethality l/Tal@t/
+lethargic l@T)rj6k
+lethargy leTPj/
+lethco leTk]
+lethia leT/@
+leticia l@tiS@
+letitia l@tiS/@
+letizia lctEz/@
+letner letnP
+leto lEt]
+letourneau letqrn]
+lets lets
+letsch leC
+letsinger letsinjP
+letson lets~
+lett let
+lettau l@tO
+letter letP
+lettered letPd
+letterhead letPhed
+lettering letP6N
+letterman letPm~
+letterman's letPm~z
+letterpress letPpres
+letters letPz
+lettice letis
+lettie let/
+lettiere let/cr
+lettieri lctir/
+letting let6N
+lettish letiS
+letts lets
+lettuce let@s
+letty let/
+letup letup
+letz lets
+leu lU
+leu's lUz
+leubert lUbPts
+leucadia lUkAd/@
+leucadia's lUkAd/@z
+leuck lUk
+leuenberger lU~bPgP
+leuffer lUfP
+leugers l<gPz
+leukemia lUkEm/@
+leukocyte lUk@sIt
+leumi lUm/
+leung lUN
+leupold l<p]ld
+leuschner l<SnP
+leuthold l<T]ld
+leutwiler lUtwIlP
+leuzzi lUz/
+lev lev
+leva lev@
+leval l@vol
+levalley lev@l/
+levamisole l@vam@sOl
+levan lev~
+levana l6van@
+levander lev~dP
+levandoski l6v~d?sk/
+levandowski l6v~d{fsk/
+levangie lev@N/
+levant l@vant
+levario lAv)r/]
+levasseur lev@sP
+levay levA
+levchenko levCeNk]
+leve lEv
+leveck lev6k
+levee lev/
+levees lev/z
+leveille levIl
+level lev@l
+level's lev@lz
+leveled lev@ld
+leveler's lev@lPz
+leveler's levlPz
+levelers lev@lPz
+levelers levlPz
+leveling lev@l6N
+leveling levl6N
+levell lAvAl
+levelled lev@ld
+levels lev@lz
+leven lEv~
+levenberg lEv~bPg
+levendusky l6v~dusk/
+levene lev/n
+levengood lev~gqd
+levenhagen lev~h@g~
+levens lEv~z
+levenson lev~s~
+levenstein lEv~st/n
+levenstein lEv~stIn
+leventhal lev~T{l
+leveque l@vEk
+lever lEvP
+lever levP
+leverage lEvP6j
+leverage levP6j
+leverage levr@j
+leveraged lEvP6jd
+leveraged levP6jd
+leveraged levr6jd
+leveraging levP6j6N
+leveraging levr6j6N
+leverenz levP~s
+leverett levPct
+leverette levPct
+leverich levP6k
+levering levP6N
+leverone lcvPOn/
+levers levPz
+leverson levPs~
+levert levPt
+leverton l6vVt~
+levesque l6vesk
+levett levct
+levey l6vA
+levi lEvI
+levi's lEvIz
+leviathan l@vI@T~
+levick lev6k
+levie lEv/
+levied lev/d
+levien lev/~
+levies lev/z
+levin levin
+levin's levinz
+levina lcvEn@
+levine l@vEn
+levine's l@vEnz
+leviner levinP
+levings lev6Nz
+levingston liv6Nst~
+levins levinz
+levinsky l6vinsk/
+levinson lev~s~
+levinstone lev~stOn
+levis lEvIz
+levis lev@s
+levison lev@s~
+levit levit
+levitan lev@t~
+levitate lev@tAt
+levitated lev@tAt@d
+levitating lev@tAt6N
+levitation lev@tAS~
+levitch leviC
+leviton l6vit~
+levitsky l6vitsk/
+levitt levit
+levitt's levits
+levitte levit
+levitte's levits
+levittown levit?n
+levittown's levit?nz
+levity lev@t/
+levitz levits
+levy lEv/
+levy lev/
+levy's lEv/z
+levy's lev/z
+levying lev/6N
+lew lU
+lewallen lU{l~
+lewan lU~
+lewanda l@wond@
+lewandoski lU~d?sk/
+lewandowski lU~d{fsk/
+lewanna lU~@
+lewd lUd
+lewellen lUel~
+lewelling lUel6N
+lewellyn lUel~
+lewensky lUensk/
+lewensky's lUensk/z
+lewers lUPz
+lewey lU/
+lewicki lUitsk/
+lewin lUin
+lewing lU6N
+lewins lUinz
+lewinski lUinsk/
+lewinsky lUinsk/
+lewinsohn lU~s~
+lewinton lU~t~
+lewis lU@s
+lewis' lU@s
+lewis's lU@s@z
+lewisburg lU@sbPg
+lewiston lU@st~
+lewkowicz lUk@v6C
+lewman lUm~
+lewter lUtP
+lewton lUt~
+lewy lU/
+lex leks
+lexical leks6k@l
+lexicographer leks6kogr@fP
+lexicon leks6kon
+lexie leks/
+lexine leksIn
+lexington leks6Nt~
+lexis leksis
+lexmark leksmork
+lexus leks@s
+lexus's leks@s@z
+ley lA
+leya lA@
+leyba lAb@
+leyda lAd@
+leyden lId~
+leyendecker lInd6kP
+leyh lA
+leyland lAl~d
+leyrer lArP
+leys lAz
+leysen lAs~
+leysen's lAs~z
+leyva lAv@
+lezotte liz{t
+lhasa los@
+lheureux lPO
+lhommedieu lOmcdyU
+li lE
+li's lEz
+li-kang lEkaN
+lia lE@
+liabilities lI@bil@t/z
+liability lI@bil@t/
+liable lI@b@l
+liacos lIok]s
+liaison l/Azon
+liaison lAzon
+liaisons l/Asonz
+liam lE}
+liam's lE}z
+lian lyon
+liana l/on@
+liane l/an
+liang l/aN
+liang lyaN
+lianna l/on@
+lianne l/an
+liao l/?
+liar lIP
+liars lIPz
+liason lI@s~
+liasson lI@s~
+lib lib
+libbed libd
+libbey lib/
+libbing lib6N
+libby lib/
+libel lIb@l
+libeled lIb@ld
+libelous lIb@l@s
+liberace libPoC/
+liberal libP@l
+liberal libr@l
+liberalism libP@liz}
+liberalism libr@liz}
+liberalism's libPr@liz}z
+liberalism's libr@liz}z
+liberality libPal@t/
+liberalization libP@l@zAS~
+liberalization libr@l@zAS~
+liberalizations libP@l@zAS~z
+liberalizations libr@l@zAS~z
+liberalize libP@lIz
+liberalize libr@lIz
+liberalized libP@lIzd
+liberalized libr@lIzd
+liberalizing libP@lIz6N
+liberalizing libr@lIz6N
+liberally libP@l/
+liberally libr@l/
+liberals libP@lz
+liberals libr@lz
+liberals' libP@lz
+liberals' libr@lz
+liberate libPAt
+liberated libPAt@d
+liberati l/bPot/
+liberating libPAt6N
+liberation libPAS~
+liberato l/bPot]
+liberator libPAt@r
+liberatore l/bPot{r/
+liberators libPAt@rz
+liberia lIbir/@
+liberia's lIbir/@z
+liberian lIbir/~
+liberians lIbir/~z
+liberman libPm~
+libert libPt
+libertarian libPt,r/~
+libertarians libPt,r/~z
+liberti l/b,rt/
+liberties libPt/z
+libertine libPtEn
+libertines libPtEnz
+liberto l/b,rt]
+liberty libPt/
+liberty's libPt/z
+libido l@bEd]
+libman libm~
+libor lEbP
+libra lEbr@
+librarian lIbr,r/~
+librarians lIbr,r/~z
+libraries lIbrer/z
+library lIbrer/
+library's lIbrer/z
+libration lIbrAS~
+librettist l@bret@st
+libretto l@bret]
+librizzi l/brEts/
+liby lIb/
+libya lib/@
+libya's lib/@z
+libyan lib/~
+libyans lib/~z
+licari l/k)r/
+licata l/kot@
+licausi l/k{s/
+licavoli l/kovOl/
+licciardi l/C)rd/
+lice lIs
+licea lis/@
+licence lIs~s
+licences lIs~s@z
+license lIs~s
+licensed lIs~st
+licensee lIs~sE
+licensees lIs~sEz
+licenser lIs~sP
+licenses lIs~s@z
+licensing lIs~s6N
+licensor lIs~sP
+licensure lIs~CP
+licentious lIsenC@s
+lich liC
+lichen lIk~
+lichens lIk~z
+lichlyter liklItP
+licht likt
+lichtblau liCtbl?
+lichte liCt
+lichten likt~
+lichtenberg likt~bPg
+lichtenberger likt~bPgP
+lichtenfels likt~f@lz
+lichtenstein likt~stEn
+lichtenstein likt~stIn
+lichtenwalner likt~w@lnP
+lichtenwalter likt~w@ltP
+lichter liktP
+lichterman liktPm~
+lichtman liktm~
+lichty liCt/
+licio lis/]
+licitra l/CEtr@
+lick lik
+licked likt
+licker likP
+lickety lik@t/
+licking lik6N
+licklider liklIdP
+licks liks
+lickteig liktIg
+lico lEk]
+licon lik~
+licorice likP6S
+lid lid
+lida lEd@
+liddell lid@l
+liddick lid6k
+liddicoat lid6kOt
+liddle lid@l
+liddy lid/
+liddy's lid/z
+lide lId
+liden lId~
+lidgerwood lijPwqd
+lido lEd]
+lids lidz
+lie lI
+lieb lEb
+liebe lEb
+liebel lEb@l
+liebeler lEb@lP
+liebelt lEbclt
+liebenow lEb~]
+lieber lEbP
+lieberman lEbPm~
+lieberman's lEbPm~z
+liebermann lEbPm~
+liebert lEbPt
+lieberthal lEbPT{l
+liebig lEb6g
+liebl lEb@l
+liebler lEblP
+liebling lEb@l6N
+liebman lEbm~
+liebmann lEbm~
+liebowitz lEb@wits
+liechtenstein likt~stIn
+liechty lECt/
+lied lId
+liedel lEd@l
+lieder lEdP
+liederman lEdPm~
+liederman's lEdPm~z
+liedtke lEtk/
+liedtke's lEtk/z
+lief lEf
+liefer lEfP
+liege lEj
+liem lEm
+liemandt lEmant
+lien lEn
+lienau l~O
+lienemann lEn}~
+liener lEnP
+lienhard lEnhord
+lienhart lEnhort
+liens lEnz
+lierman lirm~
+liermann lirm~
+lies lIz
+liesch lES
+liese lEz
+lieser lEsP
+liesin lEsin
+lieske lEsk/
+lieson lEs{n
+lietz lEts
+lietzke lEtsk/
+lieu lU
+lieu lyU
+lieurance lUr~s
+lieutenant lUten~t
+lieutenants lUten~ts
+life lIf
+life's lIfs
+lifeblood lIfblud
+lifeboat lIfbOt
+lifeboats lIfbOts
+lifeco lEfkO
+lifeguard lIfgord
+lifeguards lIfgordz
+lifeless lIfl@s
+lifelike lIflIk
+lifeline lIflIn
+lifelines lIflInz
+lifelong lIfl{N
+lifer lIfP
+lifers lIfPz
+lifes lIfs
+lifesaver lIfsAvP
+lifesavers lIfsAvPz
+lifesaving lIfsAv6N
+lifespan lIfspan
+lifestyle lIfstIl
+lifestyles lIfstIlz
+lifetime lIftIm
+lifetime's lIftImz
+lifetimes lIftImz
+liff lif
+liffe lif
+liffe's lifs
+lifland lifl~d
+lifo lEf]
+liford lifPd
+lifsey lifs/
+lifshitz lifSits
+lifson lifson
+lifson's lifsonz
+lift lift
+lifted lift@d
+lifter liftP
+lifters liftPz
+liftin lift~
+lifting lift6N
+liftoff lift{f
+lifton lift~
+lifts lifts
+ligachev lig@Ccv
+ligachev's lig@Ccvz
+ligament lig}~t
+ligaments lig}~ts
+ligand lig~d
+ligands lig~dz
+ligas lIg@z
+ligation lIgAS~
+ligget ligct
+liggett ligct
+liggett's ligets
+liggins liginz
+liggio lEj/]
+light lIt
+light's lIts
+lightbulb lItbulb
+lightbulbs lItbulbz
+lightcap lItkap
+lighted lIt@d
+lighten lIt~
+lightened lIt~d
+lightening lIt~6N
+lighter lItP
+lighters lItPz
+lightest lIt@st
+lightfast lItfast
+lightfastness lItfastn@s
+lightfoot lItfqt
+lighthall lIth{l
+lightheaded lIthed@d
+lightheadedness lIthed@dn@s
+lighthearted lIthort@d
+lighthizer lIthIzP
+lighthouse lIth?s
+lighthouses lIth?s@z
+lighting lIt6N
+lighting's lIt6Nz
+lightle lIt@l
+lightly lItl/
+lightner lItnP
+lightness lItn@s
+lightning lItn6N
+lightnings lItn6Nz
+lights lIts
+lightsey lIts/
+lightship lItSip
+lightships lItSips
+lightstone lItstOn
+lightweight lItwAt
+lighty lIt/
+ligman ligm~
+lignin lignin
+lignite lignIt
+ligon lig~
+liguori l/g{r/
+lijewski l@yefsk/
+likable lIk@b@l
+like lIk
+likeable lIk@b@l
+liked lIkt
+likelier lIkl/P
+likeliest lIkl/@st
+likelihood lIkl/hqd
+likely lIkl/
+liken lIk~
+likened lIk~d
+likeness lIkn@s
+likenesses lIkn@s@z
+likening lIk~6N
+likens lIk~z
+likes lIks
+likewise lIkwIz
+likhachov lik@Cov
+likhyani l6kyon/
+liking lIk6N
+likins likinz
+likud l/kUd
+likud lik@d
+likud's l/kUdz
+likud's lik@dz
+lil lil
+lila lEl@
+lilac lIlak
+lilacs lIlaks
+lilah lil@
+lilco lilk]
+lilco's lilk]z
+lile lIl
+liles lIlz
+liley lil/
+lili lil/
+lilia lEl/@
+lilian lil/~
+lilian lily~
+liliana lil/an@
+liliane l@l/an
+liliane lil/~
+lilias lIl/@z
+lilien lil/~
+lilienthal lil/nT@l
+lilies lil/z
+lilith liliT
+lilja lEly@
+liljedahl lilj@dol
+liljegren lilj6grcn
+lill lil
+lilla lil@
+lillard lilPd
+lille lil
+lillehamer lil/hamP
+lillehamer's lil/hamPz
+lillehammer lil/hamP
+lillehammer's lil/hamPz
+liller lilP
+lilley lil/
+lilli lil/
+lillian lil/~
+lillian's lil/~z
+lilliana lil/an@
+lillibridge lil@brij
+lillich lil6k
+lillicrop lil6krop
+lillie lil/
+lilliputian lil@pyUS~
+lillis lilis
+lillo lil]
+lilly lil/
+lilly's lil/z
+lilt lilt
+lily lil/
+lily's lilEz
+lilyan lil/~
+lilybell lil/bel
+lim lim
+lima lEm@
+lima lIm@
+liman lIm~
+limas lEm@z
+limas lIm@z
+limb lim
+limbach limbok
+limbaugh limb{
+limbaugh's limb{z
+limbed limd
+limber limbP
+limberg limbPg
+limbers limbPz
+limbert limbPt
+limbless liml@s
+limbo limb]
+limbrick limbr6k
+limbs limz
+limburg limbPg
+lime lIm
+limehouse lImh?s
+limelight lImlIt
+limerick limP6k
+limerick's limP6ks
+limericks limP6ks
+limes lImz
+limestone lImstOn
+limestones lImstOnz
+limine limEn
+limine limIn
+liming lIm6N
+limit lim@t
+limitation lim@tAS~
+limitations lim@tAS~z
+limited lim@t@d
+limited's lim@t@dz
+limiting lim@t6N
+limitless lim@tl@s
+limits lim@ts
+limmer limP
+limnology limnol@j/
+limo lim]
+limoges l}OZ
+limoges l}Oj@z
+limon lim~
+limonite lIm~It
+limos lEm]z
+limos lim]z
+limousine lim@zEn
+limousines lim@zEnz
+limp limp
+limped limpt
+limpert limpPt
+limpets limp@ts
+limping limp6N
+limps limps
+lin lin
+lina lEn@
+linafelter lIn@feltP
+linafelter lin@feltP
+linage lIn6j
+linam lin}
+linares linPz
+linc liNk
+lincare linker
+lince lins
+lincecum lins6k}
+linch linC
+linchpin linCpin
+lincicome lins6kOm
+linck liNk
+lincks liNks
+lincoln liNk~
+lincoln's liNk~z
+lincolns liNk~z
+lincolnshire liNk~Sir
+lind lind
+linda lind@
+linda's lind@z
+lindahl lindol
+lindaman lind}~
+lindamood lind}Ud
+lindane lindAn
+lindau lind?
+lindauer lind?P
+lindbeck lIndbck
+lindberg lIndbPg
+lindbergh lindbPg
+lindblad lindbl@d
+lindblom lindbl}
+lindbloom lindblUm
+lindburg lIndbPg
+linde lind
+lindeen lind/n
+lindell lind@l
+lindeman lindm~
+lindemann lind}~
+lindemuth lind}UT
+linden lind~
+linden's lind~z
+lindenbaum lInd~b?m
+lindenberg lind~bPg
+lindenberger lind~bPgP
+lindenmuth lind~mUT
+linder lindP
+linderman lIndPm~
+lindfors lindfPz
+lindgren lindgrcn
+lindh lind
+lindholm lindhOlm
+lindhorst lindh{rst
+lindig lind6g
+lindler lindlP
+lindley lindl/
+lindman lindm~
+lindmark lindmork
+lindner lindnP
+lindner's lindnPz
+lindo lind]
+lindon lind~
+lindow lind]
+lindquist lindkwist
+lindroth lindr{T
+lindsay lindz/
+lindseth lindscT
+lindsey lindz/
+lindsey's lindz/z
+lindskog lindsk@g
+lindsley lindsl/
+lindstedt lindstct
+lindstrand lindstr~d
+lindstrom lindstr}
+lindvall lindv@l
+lindy lind/
+line lIn
+line's lInz
+lineage lin/@j
+lineages lin/6j@z
+lineal lin/@l
+linear lin/P
+linear's lin/Pz
+linearly lin/Pl/
+lineback lInbak
+linebacker lInbakP
+linebackers lInbakPz
+linebarger lin@borgP
+linebaugh lin@b{
+lineberger lInbPgP
+lineberry lInber/
+lined lInd
+linehan lin@han
+lineman lInm~
+linemen lInm~
+linen lin~
+linenberger lin~bPgP
+linens lin~z
+liner lInP
+liner's lInPz
+linerboard lInPb{rd
+liners lInPz
+liners' lInPz
+lines lInz
+lines' lInz
+linette linet
+lineup lInup
+lineups lInups
+lineweaver lInwEvP
+linford linfPd
+ling liN
+lingafelter liNg@fcltP
+lingard liNgPd
+lingelbach liNg@lbok
+lingenfelter liNg~fcltP
+linger liNP
+linger liNgP
+lingered liNgPd
+lingerfelt liNgPfelt
+lingerie lonZPA
+lingering liNgP6N
+lingers liNgPz
+lingg liNg
+lingle liNg@l
+lingner liNnP
+lingo liNg]
+lingua liNgw@
+linguine l6NgwEn/
+linguist liNgw@st
+linguistic l6Ngwist6k
+linguistically l6Ngwist6kl/
+linguistics l6Ngwist6ks
+linguists liNgw@s
+linguists liNgw@ss
+linguists liNgw@sts
+lingus liNg@s
+linh lin
+linhardt linhort
+linhares linhPz
+linhart linhort
+lini lEn/
+lining lIn6N
+lininger lIn6NP
+linings lIn6Nz
+link liNk
+link's liNks
+linkage liNk@j
+linkages liNk@j@z
+linke liNk
+linked liNkt
+linkenhoker liNk~h@kP
+linker liNkP
+linking liNk6N
+linkletter liNkletP
+linkous liNk@s
+links liNks
+linkup liNkup
+linkups liNkups
+linley linl/
+linn lin
+linnane lin~
+linnas lin@s
+linne lin
+linnea lin/@
+linnehan lin@han
+linnell lin@l
+linneman linm~
+linnemann linm~
+linnet linit
+linney lin/
+linnik lin6k
+lino lEn]
+linoleum l~Ol/}
+linotype lin]tIp
+linowes lin]z
+linquist linkwist
+lins linz
+linsay linsA
+linscomb linsk}
+linscott linsk@t
+linse lins
+linseed linsEd
+linsey linz/
+linsey-woolsey linz/wqlz/
+linskey linsk/
+linsky linsk/
+linsley linsl/
+linson lins~
+linstrom linstr}
+lint lint
+lintas lint@s
+lintel lint@l
+linters lintPz
+linthicum linT6k}
+lintner lintnP
+linton lint~
+lintz lints
+linus lIn@s
+linville lEnvil
+linwick linwik
+linwood linwqd
+linz linz
+linzer linzP
+linzey linz/
+linzy linz/
+liomine lE}In
+lion lI~
+lion's lI~z
+lionberger lI~bPgP
+lionel lI~@l
+lionetti l/~et/
+lionetti lI~et/
+lionheart lI~hort
+lionize lI~Iz
+lionized lI~Izd
+lions lI~z
+liotier l/Ot/A
+liotier l/Ot/P
+liotta l/Ot@
+liou l/U
+lip lip
+lipa lEp@
+lipari l/p)r/
+lipe lIp
+lipford lipfPd
+lipham lif}
+lipid lIp@d
+lipide l@pEd
+lipinski l@pinsk/
+lipka lipk@
+lipke lipk
+lipkin lipkin
+lipkind lipkInd
+lipkind lipkind
+lipman lipm~
+lipnick lipnik
+lipoprotein lip@prOt/n
+lipoproteins lip]prOt/nz
+liposome lip@sOm
+liposomes lip@sOmz
+liposuction lIp]sukS~
+liposuction lip]sukS~
+lipovsky l@povsk/
+lipp lip
+lippa lip@
+lippard lipPd
+lippe lip
+lipped lipt
+lippens lip~z
+lipper lipP
+lipper's lipPz
+lippert lipPt
+lippi lip/
+lippincott lip~k@t
+lippitt lipit
+lippman lipm~
+lippmann lipm~
+lippo lip]
+lippold lipOld
+lipps lips
+lippy lip/
+lips lips
+lips' lips
+lipschitz lipSits
+lipschultz lipS@lts
+lipschutz lipS@ts
+lipscomb lipsk}
+lipsett lipsct
+lipsey lips/
+lipshie lipS/
+lipshutz lipS@ts
+lipsig lips6g
+lipsitz lipsits
+lipski lipskE
+lipsky lipskI
+lipson lips~
+lipstein lipstEn
+lipstein lipstIn
+lipstick lipstik
+lipsticks lipstiks
+liptak lipt@k
+lipton lipt~
+lipton's lipt~z
+lipuma l/pUm@
+liquefaction likw@fakS~
+liquefied likw@fId
+liquefy likw@fI
+liqueur l6kV
+liqueurs l6kVz
+liquid likw@d
+liquidate likw@dAt
+liquidated likw@dAt@d
+liquidates likw@dAts
+liquidating likw@dAt6N
+liquidation likw@dAS~
+liquidations likw@dAS~z
+liquidator likw@dAtP
+liquidators likw@dAtPz
+liquide l6kwId
+liquidities l6kwid@t/z
+liquidity l6kwid@t/
+liquids likw@dz
+liqun l6kUn
+liquor likP
+liquori l/k{r/
+liquors likPz
+lira lir@
+lira's lir@z
+lire lir@
+lirette lPet
+liro lir]
+liroff lir{f
+lis lis
+lisa lEs@
+lisa's lEs@z
+lisabet lis@bct
+lisabeth lis@bcT
+lisak lis@k
+lisanti l@sant/
+lisbeth lisbcT
+lisbon lizb~
+lisby lisb/
+lisco lisk]
+liscom lisk}
+lise lIz
+lisec liz@k
+lisenbee lisenb/
+lisenbee lis~b/
+lisenby lis~b/
+lisette liset
+lish liS
+lishman liSm~
+lisi lEs/
+lisiecki lisEtsk/
+lisk lisk
+liska lisk@
+liske lisk
+liskey lisk/
+lisko lisk]
+lisle lI@l
+lisman lizm~
+lisowski lis{fsk/
+lisp lisp
+liss lis
+lissa lis@
+lissack lis@k
+lissie lis/
+lissner lisnP
+lissy lis/
+list list
+list's lists
+listed list@d
+listen lis~
+listened lis~d
+listener lisnP
+listener lis~P
+listeners lisnPz
+listeners lis~Pz
+listening lisn6N
+listening lis~6N
+listens lis~z
+lister listP
+listeria listir/@
+listerine listPEn
+listerines listPEnz
+listing list6N
+listings list6Nz
+listless listl@s
+listlessly listl@sl/
+liston list~
+lists lis
+lists liss
+lists lists
+liszewski l6Sefsk/
+liszka liSk@
+liszt list
+lit lit
+lita lEt@
+litaker litAkP
+litalien lit@l/n
+litan lIt~
+litanies lit~/z
+litany lit~/
+litaro l@t)r]
+litchfield liCf/ld
+litchfield's liCf/ldz
+litchford liCfPd
+litchford's liCfPdz
+litco litkO
+litco's litkOz
+lite lIt
+litem lEtcm
+litem lItcm
+liter lEtP
+literacy litP@s/
+literal litP@l
+literally litP@l/
+literally litr@l/
+literary litPer/
+literate litP@t
+literati litPot/
+literature litP@CP
+literaturnaya liter@tPnI@
+liters lEtPz
+lites lIts
+lithe lIT
+litherland liTPl~d
+lithgow liTg?
+lithic liT6k
+lithium liT/}
+lithograph liT@graf
+lithographic liT@graf6k
+lithographs liT@grafs
+lithography l@Togr@f/
+lithotripter liT@triptP
+lithuania liT@wAn/@
+lithuania's liT@wAn/@z
+lithuanian liT@wAn/~
+lithuanians liT@wAn/~z
+litigant lit6g~t
+litigants lit6g~ts
+litigate lit6gAt
+litigated lit6gAt@d
+litigating lit6gAt6N
+litigation lit@gAS~
+litigations lit@gAS~z
+litigator lit@gAtP
+litigators lit@gAtPz
+litigious litij@s
+litke litk/
+litle lIt@l
+litman litm~
+litmus litm@s
+lits lits
+litsey lits/
+litt lit
+litteken lit6k~
+littell lit@l
+litten lit~
+litter litP
+litteral litP@l
+littered litPd
+littering litP6N
+litters litPz
+littig lit6g
+little lit@l
+little's lit@lz
+littleboy lit@lb<
+littlechild lit@lCIld
+littlefield lit@lfEld
+littleford lit@lfPd
+littlejohn lit@ljon
+littlepage lit@lpAj
+littler lit@lP
+littles lit@lz
+littlest lit@l@st
+littleton lit@lt~
+littlewood lit@lwqd
+littman litm~
+littmann litm~
+litton lit~
+litton's lit~z
+littoral litP@l
+littrell litr@l
+litts lits
+litty lit/
+liturgical l@tVj6k@l
+liturgy litPj/
+litvack litvak
+litvak litv@k
+litvin litvin
+litwack litw{k
+litwak litw@k
+litwiller litwilP
+litwin litwin
+litz lits
+litzenberg litz~bPg
+litzenberger litz~bPgP
+litzinger litziNP
+liu lyU
+liuzza l/Uts@
+liuzzi l/Uts/
+liv liv
+livable liv@b@l
+live lIv
+live liv
+lived lIvd
+lived livd
+livelier lIvl/P
+liveliest lIvlE@st
+livelihood lIvl/hqd
+livelihoods lIvl/hqdz
+liveliness lIvl/n@s
+lively lIvl/
+liven lIv~
+livened lIv~d
+livengood liv~gqd
+liver livP
+livergood livPgqd
+liveried livr/d
+liverman livPm~
+livermore l6vPm{r
+livernois livPnwo
+liverpool livPpUl
+livers livPz
+liverwort livPwPt
+liverworts livPwPts
+livery livP/
+lives lIvz
+lives livz
+lives' lIvz
+livesay liv@sA
+livesey liv@s/
+livestock lIvstok
+livezey liv@z/
+livia liv/@
+livid liv@d
+lividity l6vid@t/
+livin' liv~
+living liv6N
+livingood liv~gqd
+livingroom liv6NrUm
+livingrooms liv6NrUmz
+livings liv6Nz
+livingston liv6Nst~
+livingston's liv6Nst~z
+livingstone liv6NstOn
+livingstone's liv6NstOnz
+livingwell liv6Nwel
+livingwell's liv6Nwelz
+livolsi l/vOls/
+livonia l6vOny@
+livor l6v{r
+livoti l/vOt/
+livsey livz/
+livvie liv/
+liz liz
+liza lEz@
+lizabeth liz@bcT
+lizak liz@k
+lizard lizPd
+lizard's lizPdz
+lizards lizPdz
+lizarraga l/zorog@
+lizhi liz/
+lizotte liz{t
+lizzie liz/
+lizzy liz/
+ljubomir lyUb]mir
+llama lom@
+llamas lom@z
+llana lan@
+llanas lan@z
+llanes lAnz
+llano lon]
+llanos lon]z
+llerena lcrAn@
+llewellyn lUel~
+llewelyn lUcl~
+llewelyn lUel~
+llorens l{rA~z
+llorente l{rAntA
+llosa lOs@
+llosa's lOs@z
+llovio lOv/]
+lloyd l<d
+lloyd's l<dz
+lloyds l<dz
+lloyds' l<dz
+ln lAn
+lo lO
+lo's lOz
+load lOd
+loaded lOd@d
+loader lOdP
+loaders lOdPz
+loadholt lOdhOlt
+loading lOd6N
+loadings lOd6Nz
+loadman lOdm~
+loadman's lOdm~z
+loads lOdz
+loaf lOf
+loafer lOfP
+loafers lOfPz
+loafs lOfs
+loaiza l]oEz@
+loam lOm
+loamy lOm/
+loan lOn
+loan's lOnz
+loaned lOnd
+loaning lOn6N
+loanloss lOnl{s
+loans lOnz
+loans' lOnz
+loar l{r
+loath lOT
+loathe lOT
+loathed lOTd
+loathing lOT6N
+loathsome lOTs}
+loathsome lOTs}
+loaves lOvz
+lob lob
+lobato l]bot]
+lobaugh lob{
+lobb lob
+lobban lob~
+lobbed lobd
+lobbia lob/@
+lobbied lob/d
+lobbies lob/z
+lobbing lob6N
+lobby lob/
+lobby's lob/z
+lobbying lob/6N
+lobbyist lob/@st
+lobbyists lob/@s
+lobbyists lob/@ss
+lobbyists lob/@sts
+lobbyists' lob/@sts
+lobdell lobd@l
+lobe lOb
+lobed lObd
+lobel lOb@l
+lobell l]bel
+lobello l]bel]
+lober lObP
+loberg lObPg
+lobes lObz
+lobianco l]b/onk]
+loblaw lobl{
+loblolly loblol/
+lobo lOb]
+lobos lOb]s
+lobosco l]bOsk]
+lobotomy lObOtOm/
+lobs lobz
+lobster lobstP
+lobster's lobstPz
+lobsterman lobstPm~
+lobstermen lobstPmcn
+lobsters lobstPz
+lobue lObwc
+lobules lobyUlz
+loca lOk@
+locadia l]kAd/@
+local lOk@l
+local's lOk@lz
+locale l]kal
+locales l]kalz
+localities l]kal@t/z
+locality l]kal@t/
+localization lOk@l@zAS~
+localize lOk@lIz
+localized lOk@lIzd
+locally lOk@l/
+locals lOk@lz
+locascio l@kas/]
+locastro l@kastr]
+locate lOkAt
+located lOkAd
+located lOkAt@d
+locatelli l]kotel/
+locates lOkAts
+locating lOkAt6N
+location l]kAS~
+locations l]kAS~z
+locator lOkAtP
+locey lOs/
+loch lok
+locher lokP
+lochhead lokhed
+lochner loknP
+lochridge lokr6j
+loci lOk/
+loci lOkI
+locicero l]C/C,r]
+lock lok
+locka lok@
+lockaby lok@b/
+lockamy lok}/
+lockard lokPd
+lockart lokort
+lockdown lokd?n
+locke lok
+locke-ober lokObP
+locked lokt
+locken lok~
+locker lokP
+lockerbie lokPb/
+lockerby lokPb/
+lockerman lokPm~
+lockers lokPz
+lockert lokPt
+lockett lok@t
+lockett's lok@ts
+lockey lok/
+lockhart lokhort
+lockheed lokhEd
+lockheed's lokhEdz
+lockie lok/
+locking lok6N
+locklair loklP
+locklar loklP
+locklear loklP
+lockley lokl/
+locklin loklin
+lockman lokm~
+lockmiller lokmilP
+lockner loknP
+lockney loknA
+lockneys loknAz
+lockout lok?t
+lockouts lok?ts
+lockport lokp{rt
+lockrem lokrcm
+lockridge lokrij
+locks loks
+locksmith loksmiT
+lockstep lokstep
+lockup lokup
+lockwood lokwqd
+lockwood's lokwqdz
+lockyer lokyP
+loco lOk]
+lococo l]kOk]
+locomotion lOk}OS~
+locomotive lOk}Ot6v
+locomotives lOk}Ot6vz
+locomotor lOk}OtP
+loconte l]kOnt/
+locsin loksin
+loctite loktIt
+locurto l]kqrt]
+locus lOk@s
+locust lOk@st
+locusts lOk@s
+locusts lOk@ss
+locusts lOk@sts
+locy lOs/
+lodato l]dot]
+lode lOd
+lodema l]dem@
+loden lOd~
+loder lOdP
+lodes lOdz
+lodestar lOdstor
+lodestone lOdstOn
+lodge loj
+lodge's loj@z
+lodged lojd
+lodgepole lojpOl
+lodges loj@z
+lodging loj6N
+lodgings loj6Nz
+lodi lOdI
+lodico l]dEk]
+lodley lodl/
+lodwick lodw6k
+lodwrick lodr6k
+loe lO
+loeb lOb
+loeber lObP
+loeffel lOf@l
+loeffelholz lOf@lh]lz
+loeffler lOflP
+loehmann lOm~
+loehmann's lOm~z
+loehr l{r
+loella lOel@
+loeper lOpP
+loepfe lOpf/
+loera l{r@
+loesch lOS
+loesche lOS
+loescher lOSP
+loeser lOzP
+loess lO@s
+loesser lesP
+loesser losP
+loew lO
+loew loU
+loewe lO
+loewe loU
+loewen loU~
+loewenson lOw~s~
+loewenstein lO~st/n
+loewenstein lO~stIn
+loewenthal lO~T@l
+loewenthal loU~T@l
+loewi lOw/
+loews lOz
+loewy lO/
+lofaro l]f)r]
+lofaso l]fos]
+loffredo l]frAd]
+lofgren lofgrcn
+lofland lofl~d
+loflin loflin
+lofquist lofkwist
+lofstrom lofstr}
+loft l{ft
+loft's l{fts
+lofthouse l{fth?s
+lofthus lofT@s
+loftier l{ft/P
+loftin loftin
+loftis loftis
+lofton loft~
+lofts l{fts
+loftus l{ft@s
+lofty l{ft/
+log l{g
+logan lOg~
+logar lOgP
+logarithm logPiT}
+logarithmic logPiTm6k
+logarithms logPiT}z
+logbook l{gbqk
+loge lOj
+loges lOj@z
+logged l{gd
+logger logP
+loggerhead logPhed
+loggerheads logPhedz
+loggers logPz
+loggia log/@
+logging l{g6N
+loggins loginz
+loghry logr/
+logic loj6k
+logica loj6k@
+logical loj6k@l
+logically loj6kl/
+logician l]jiS~
+logicon loj6kon
+logie lOj/
+logistic l@jist6k
+logistical l@jist6k@l
+logistically l@jist6kl/
+logistics l@jist6ks
+logiudice l]jUd@s
+logjam logjam
+logjams logjamz
+logo lOg]
+logogram l{g@gram
+logograms l{g@gramz
+logographic l{g@graf6k
+logos lOgOz
+logothetis lOg]Tetis
+lograsso l]gros]
+logs l{gz
+logsdon logzd~
+logston logst~
+logue lOg
+loguidice l]gIdis
+logwood logwqd
+loh lO
+lohengrin lO~grin
+lohman lOm~
+lohmann lOm~
+lohmeier lOmIP
+lohmeyer lOmIP
+lohn lon
+lohner lOnP
+lohnes lOnz
+lohr l{r
+lohrenz l{rcns
+lohrey l)r/
+lohrman l{rm~
+lohrmann l{rm~
+lohse lOs
+loiacano l]y@kon]
+loiacono l]y@kOn]
+loibl l<b@l
+loin l<n
+loincloth l<nkl{T
+loire l<r
+lois lO@s
+loise lU/s
+loise lU@s
+loiseau lU@sO
+loisel l<zel
+loiselle l<zel
+loiter l<tP
+loitering l<tP6N
+lok lok
+loken lOk~
+loker lOkP
+lokey lOk/
+lokken lok~
+lola lOl@
+loleta l]let@
+lolita l]lEt@
+loll lol
+lollapalooza lol@p@lUz@
+lollapaloozas lol@p@lUz@z
+lollar lolP
+lollard lolPd
+lolley lol/
+lolli lol/
+lolling lol6N
+lollipop lol/pop
+lollipops lol/pops
+lollis l@lEs
+lolly lol/
+loma lOm@
+lomak lOmak
+loman lOm~
+lomas lOm@z
+lomasney lom@sn/
+lomax lOmaks
+lomb lom
+lomba lomb@
+lombard lombord
+lombardi lomb)rd/
+lombardo lomb)rd]
+lombards lombordz
+lomeli l]mel/
+lommen lOm~
+lomonaco l]m]nok]
+lompoc lompok
+lon lon
+lona lOn@
+lonardo l]n)rd]
+lonas lOn@z
+loncar lonkor
+londo lond]
+london lund~
+london's lund~z
+londonderry lund~der/
+londoner lund~P
+londoners lund~Pz
+londono l]ndOn]
+lone lOn
+loneliness lOnl/n@s
+lonely lOnl/
+loner lOnP
+lonergan lonPg~
+lonero l]n,r]
+loners lOnPz
+lones lOnz
+lonesome lOns}
+lonetree lOntrE
+loney lOn/
+long l{N
+long's l{Nz
+long-overdue l{NOvPdU
+long-range l{NrAnj
+long-term l{NtVm
+long-winded l{Nwind@d
+longacre l{NAkP
+longaker loNg@kP
+longan loNg~
+longanecker loNg~ckP
+longbow l{NbO
+longbrake l{NbrAk
+longcor l]Ngk{r
+longden l{Nden
+longe lonj
+longed l{Nd
+longenecker lonjnckP
+longer l{NgP
+longerbeam l{NgPbEm
+longest l{Ng@st
+longevity l{njev@t/
+longfellow l{Nfel]
+longfield l{NfEld
+longhair l{Nher
+longhand l{Nhand
+longhi lOng/
+longhorn l{Nh{rn
+longhorns l{Nh{rnz
+longhouse l{Nh?s
+longhurst loNhPst
+longing l{N6N
+longingly l{N6Nl/
+longings l{N6Nz
+longino l]NgEn]
+longish l{N6S
+longitude lonj@tUd
+longitudes lonj@tUdz
+longitudinal lonj@tUd~@l
+longleaf l{NlEf
+longleg l{Nleg
+longlegs l{Nlegz
+longley loNgl/
+longman l{Nm~
+longmeyer l{NmIP
+longmeyer's l{NmIPz
+longmire loNmIr
+longmont l{Nmont
+longmore lONm{r
+longnecker l{NnekP
+longo l{Ng]
+longobardi l]Ng]b)rd/
+longoria l]Ng{r/@
+longpre loNpP
+longrange l{NrAnj
+longs l{Nz
+longshore l{NS{r
+longshoremen l{NS{rm~
+longshoremen's l{NS{rm~z
+longshot l{NSot
+longspur l{NspV
+longspurs l{NspVz
+longstaff l{Nstaf
+longstanding l{Nstand6N
+longstreet l{NstrEt
+longstreth loNstrcT
+longsworth l{NzwVT
+longterm l{NtVm
+longtime l{NtIm
+longtin l{Ntin
+longton l{Nt~
+longuet l{Nwet
+longview l{NvyU
+longwell l{Nwel
+longwood l{Nwqd
+longworth l{NwVT
+loni lon/
+lonigro l]nEgr]
+lonnie l{n/
+lonny l{n/
+lonon lOn~
+lonrho lonr]
+lonrho's lonr]z
+lons lonz
+lonsdale lonsdAl
+lonski lonsk/
+lonsky lonsk/
+lonsky's lonsk/z
+lonsway lonswA
+loo lU
+looart lUort
+looby lUb/
+look lqk
+lookabaugh lUk@b{
+lookabill lqk@bil
+lookalike lqk@lIk
+looked lqkt
+looker lqkP
+lookers lqkPz
+lookin' lqk~
+looking lqk6N
+lookingbill lqk6Nbil
+lookit lqkit
+lookout lqk?t
+looks lqks
+loom lUm
+looman lUm~
+loomed lUmd
+loomer lUmP
+looming lUm6N
+loomis lUmis
+looms lUmz
+loon lUn
+looney lUn/
+loong lqN
+loons lUnz
+loony lUn/
+loop lUp
+looped lUpt
+looper lUpP
+loopers lUpPz
+loophole lUphOl
+loopholes lUphOlz
+loops lUps
+loopy lUp/
+loos lUz
+loose lUs
+loosed lUst
+loosely lUsl/
+loosen lUs~
+loosened lUs~d
+loosening lUs~6N
+loosens lUs~z
+looser lUsP
+looses lUs@z
+loosestrife lUsstrIf
+loosestrife lUstrIf
+loosestrifes lUsstrIfs
+loosestrifes lUstrIfs
+loosing lUs6N
+loot lUt
+looted lUt@d
+lootens lUt~z
+looter lUtP
+looters lUtPz
+looting lUt6N
+lop lop
+lopardo l]p)rd]
+lopata l]pot@
+lopatin l]potEn
+lope lOp
+lopeman lOpm~
+loper lOpP
+lopes lOps
+lopez lOpcz
+lopez's lOpcz@z
+lopiccolo l]p/kOl]
+lopid lOp@d
+lopinto l@pint]
+lopp lop
+lopped lopt
+loppers lopPz
+lopping lop6N
+loppnow lopn?
+lopresti l]prest/
+lopresto l]prest]
+loprete lOpr/t
+lopsided lopsId@d
+loquacious l]kwAS@s
+loquat lOkwot
+lor l{r
+lora l{r@
+lorah l{r@
+lorain lPAn
+loraine lPAn
+loral l{r@l
+loral's l{r@lz
+loran l{ran
+lorance l{r~s
+lorang l{r@N
+loranger l{rAnjP
+lorber l{rbP
+lorch l{rk
+lord l{rd
+lord's l{rdz
+lorden l{rd~
+lordi l{rd/
+lords l{rdz
+lordstown l{rdzt?n
+lordy l{rdE
+lore l{r
+lorean l{r/~
+lorean's l{rEnz
+loredo l{rAd]
+loree l{rE
+lorek l{r6k
+lorelei l{r@lI
+lorelli l{rel/
+lorello l{rel]
+loren l{r~
+lorena l{ren@
+lorena's l{ren@z
+lorenc l{r6Nk
+lorence l{r~s
+lorene l{rEn
+lorensen l{r~s~
+lorenson l{r~s~
+lorentz l{rcnts
+lorentzen l{rcntz~
+lorenz lPents
+lorenza l{renz@
+lorenzana l{rcnzan@
+lorenzen l{rcnz~
+lorenzetti l{rcnzet/
+lorenzi l{renz/
+lorenzini l{rcnzEn/
+lorenzo lPenz]
+lorenzo l{enz]
+lorenzo's lPenz]z
+lorenzo's l{renz]z
+loreto l{ret]
+loretta lPet@
+lorette l{ret
+loretto l{ret]
+lorey l{r/
+lorge l{rj
+lori l{r/
+lori's l{r/z
+loria l{r/@
+lorick l{r6k
+lorie l{r/
+lorillard l{r@lord
+lorimar l{r}or
+lorimar's l{r}orz
+lorimer l{r}P
+lorimor l{r}P
+lorin l{rin
+lorincz l{rinC
+loring l{r6N
+lorino l{rEn]
+lorio l{r/]
+loris l{ris
+lorita l{rEt@
+lorman l{rm~
+lormand l{rm~d
+lorna l{rn@
+lorne l{rn
+loro l{r]
+lorraine lPAn
+lorrie l{r/
+lorries l{r/z
+lorry l{r/
+lorson l{rs~
+lortel l{rtel
+lortie l{rt/
+lorton l{rt~
+lortz l{rts
+lorusso l{rUs]
+lory l{r/
+los lOs
+los l{s
+losada l]sod@
+losasso l]sos]
+loscalzo l]skolz]
+losch l{S
+loschiavo l]sk/ov]
+lose lUz
+losec lOz@k
+losee l@sE
+loseke los6k
+loser lUzP
+losers lUzPz
+losers' lOzPz
+loses lUz@z
+losey los/
+losh loS
+losing lUz6N
+losinski l@sinsk/
+losito l]sEt]
+loso lOs]
+losoya los<a
+loss l{s
+losses l{s@z
+lossing l{s6N
+lost l{st
+losurdo l]sqrd]
+losure lOZP
+lot lot
+lot's lots
+loth loT
+lothian loT/~
+lothrop lOTr@p
+lothrop loTr@p
+lothson loTs~
+lotion lOS~
+lotion's lOS~z
+lotions lOS~z
+lotito l]tEt]
+loton lOt~
+lots lots
+lotspeich lotspIk
+lott lot
+lott's lotz
+lotta lot@
+lotte lot
+lotter lotP
+lotteries lotP/z
+lottery lotP/
+lottes lots
+lottie lot/
+lottman lotm~
+lotto lotO
+lotto lot]
+lotts lots
+lotty lot/
+lotus lOt@s
+lotus' lOt@s
+lotus's lOt@s@z
+lotz lots
+lotze lOtz
+lou lU
+lou's lUz
+louanna l?on@
+louanna lUan@
+louanne lUan
+louart lUort
+louck l?k
+loucks l?ks
+loud l?d
+louden l?d~
+loudenslager l?d~slAgP
+louder l?dP
+louderback l?dPbak
+loudermilk l?dPmilk
+loudest l?d@st
+loudin lUdan
+loudly l?dl/
+loudon l?d~
+loudspeaker l?dspEkP
+loudspeakers l?dspEkPz
+louella l?el@
+louganis lUgAnis
+louganos lUgan]z
+lougee l?j/
+lough l?
+lougheed l?/d
+loughery l?P/
+loughlin l{flin
+loughman l?m~
+loughmiller l?m@lP
+loughner l?nP
+loughney l?n/
+loughran l?r~
+loughrey l?r/
+loughridge l?r6j
+loughry l?r/
+louie lUE
+louis lU/
+louis lU@s
+louisa lUEz@
+louise lUEz
+louisette lw/zet
+louisiana lUEz/an@
+louisiana's lUEz/an@z
+louisianian lUEz/an/~
+louisianians lUEz/an/~z
+louisville lU/vil
+louk l?k
+louks l?ks
+lounge l?nj
+lounges l?nj@z
+lounging l?nj6N
+lounsberry l?nsbcr/
+loup lUp
+loupe lUp
+louque lUk
+lour l?r
+lourdes l{rdz
+loureiro lqr,r]
+lourenco l?renk]
+lourie l?r/
+loury lUr/
+louse l?s
+lousiness l?z/n@s
+lousy l?z/
+louth l?T
+louthan l?T~
+loutzenhiser l?tz~hIzP
+louvier l?v/P
+louviere lUv/cr
+louvre lUvr@
+louw lU
+loux lU
+lovaas lovoz
+lovable luv@b@l
+lovage luv@j
+lovallo l]vol]
+lovan lOv~
+lovas lOv@z
+lovastatin l]vast@t~
+lovato l]vot]
+love luv
+love's luvz
+loveall luv{l
+lovecchio l@vek/]
+loved luvd
+loveday luvdA
+lovegrove luvgrOv
+lovejoy luvj<
+lovelace luvlAs
+loveland luvl~d
+loveless luvl@s
+lovell luv@l
+lovely luvl/
+lovemaking luvmAk6N
+loven luv~
+lover luvP
+lover's luvPz
+loverde l]v,rd/
+loveridge luvrij
+lovering luvP6N
+lovern luvPn
+lovers luvPz
+lovers' luvPz
+loves luvz
+lovett luvit
+lovette luvet
+lovewell luvwel
+lovgren lovgrcn
+lovick lov6k
+lovie luv/
+lovin lOvin
+loving luv6N
+lovinger luv6NP
+lovingly luv6Nl/
+lovingood lov6Ngqd
+lovings luv6Nz
+lovins lOvinz
+lovitt lovit
+lovitz lOvits
+lovler luvlP
+lovler's luvlPz
+lovvorn lovPn
+low lO
+low-spirited lOspir@t@d
+low-spiritedness lOspir@t@dn@s
+lowborn lOb{rn
+lowden lOd~
+lowder lOdP
+lowdermilk l]dVmilk
+lowdown lOd?n
+lowe lO
+lowe's lOz
+lowekamp lOkamp
+lowell lO@l
+lowen lO~
+lowenberg lO~bPg
+lowensky l]ensk/
+lowenstein lO~stEn
+lowenstein lO~stIn
+lowenthal lO~T@l
+lower lOP
+lowered lOPd
+lowering lOP6N
+lowers lOPz
+lowery l?P/
+lowes lOz
+lowest lO@st
+lowey lO/
+lowing lO6N
+lowinsky l@winsk/
+lowland lOland
+lowlands lOlandz
+lowly lOl/
+lowman lOm~
+lown l?n
+lowndes lOnd/z
+lowndes lOndz
+lowney lOn/
+lowrance l{r~s
+lowrey l?r/
+lowrie l{r/
+lowrimore l{r/m{r
+lowry l?r/
+lows lOz
+lowther lOTP
+lowy lO/
+lox loks
+loy l<
+loya l<@
+loyal l<@l
+loyalist l<@l@st
+loyalists l<@l@s
+loyalists l<@l@ss
+loyalists l<@l@sts
+loyall l<@l
+loyally l<@l/
+loyalties l<@lt/z
+loyalton l<@lt~
+loyalty l<@lt/
+loyce l<s
+loyd l<d
+loye l<
+loyer l<P
+loynd l<nd
+loyola l<Ol@
+loza lOz@
+lozada l]zod@
+lozano l]zon]
+lozano's l]zon]z
+lozeau l@zO
+lozenge l{z~j
+lozenges l{z~j@z
+lozier lOz/P
+lozinski l@zinsk/
+lozito l]zEt]
+lozon lOz~
+lozoya l]z<@
+lp elpE
+lpn elpEen
+ls eles
+lsd elesdE
+ltd eltEdE
+ltd lim@t@d
+lu lU
+lua lU@
+luallen lUal~
+luana lUan@
+luanda lUond@
+luanda's lUond@z
+luane lU~
+luau lU?
+luba lUb@
+lubar lUbor
+lubarsky l@b)rsk/
+lubas lUb@z
+lubavitch lUb@viC
+lubavitcher lUb@viCP
+lubavitcher lUbuv6CP
+lubavitcher's lUb@viCPz
+lubavitcher's lUbuv6CPz
+lubavitchers lUb@viCPz
+lubavitchers lUbuv6CPz
+lubben lub~
+lubber lubP
+lubbers lubPz
+lubbock lub@k
+lube lUb
+lube's lUbz
+lubeck lUbek
+lubell lUbcl
+lubensky lUbensk/
+luber lUbP
+lubicons lUb6konz
+lubin lUbin
+lubinski l@binsk/
+lubinsky l@binsk/
+lubitz lUbits
+lubke lubk
+lublin lubl~
+lubow lUb]
+lubowski lUb?sk/
+lubrano lUbron]
+lubricant lUbr@k~t
+lubricants lUbr@k~ts
+lubricants lUbr@k~z
+lubricate lUbr6kAt
+lubricated lUbr@kAt@d
+lubricating lUbr@kAt6N
+lubrication lUbr6kAS~
+lubrizol lUbr@zol
+luby lUb/
+luc lUk
+luca lUk@
+lucado lUkod]
+lucarelli lUkorel/
+lucas lUk@s
+lucas' lUk@s
+lucas's lUk@s@z
+lucasfilm lUk@sf@lm
+lucasville lUk@svil
+lucca lUk@
+lucchese lUkAz/
+lucchesi lUkes/
+lucchetti lUket/
+lucci lUC/
+lucco lUk]
+luce lUs
+luce's lUs@z
+lucent lUs~t
+lucente lUCent/
+lucerne lUsPn
+lucero lUC,r]
+lucette lUset
+lucey lUs/
+luchini lUkEn/
+luchsinger luks~jP
+lucht lukt
+lucia lUS@
+lucian lUS~
+luciani lUC~/
+lucianna lUC~@
+luciano lUC/on]
+lucich luCih
+lucid lUs@d
+lucida lUCEd@
+lucido lUCEd]
+lucie lUs/
+lucien lUs/~
+lucienne lUCEcn
+lucier lUs/P
+lucifer lUs@fP
+lucile lUsEl
+lucille lUsEl
+lucinda lUsind@
+lucio lUs/]
+lucite lUsIt
+lucius lUS@s
+luciw lUs6
+luck luk
+lucke luk
+lucken luk~
+luckenbach luk~bok
+luckenbaugh l@kenb{
+luckenbill luk~bil
+lucker lukP
+luckett luk@t
+luckey luk/
+luckhardt lukhort
+luckie luk/
+luckier luk/P
+luckiest l@kE@st
+luckily luk@l/
+lucking luk6N
+luckless lukl@s
+luckman lukm~
+luckow lusk]
+lucks luks
+lucky luk/
+lucky's luk/z
+luckyn lukin
+lucrative lUkr@t6v
+lucrecia lUkrES@
+lucretia lUkrES@
+lucus lUk@s
+lucy lUs/
+luczak luCak
+ludcke ludk/
+ludden lud~
+luddite ludIt
+luddites ludIts
+luddy lud/
+ludeke lud6k
+ludella lUdel@
+ludeman lUdm~
+ludemann lUdm~
+ludewig ludU6g
+ludicrous lUd@kr@s
+ludicrously lUd@kr@sl/
+ludington lud6Nt~
+ludite lUdIt
+ludites lUdIts
+ludke ludk/
+ludlam ludl}
+ludlam's ludl}z
+ludlow ludlO
+ludlum ludl}
+ludlum's ludl}z
+ludmer ludmP
+ludmila l@dmIl@
+ludmilla l@dmil@
+ludolph lud]lf
+ludtke ludk/
+ludvigsen ludv6gs~
+ludvigson ludv6gs~
+ludvik ludv6k
+ludwick ludw6k
+ludwig ludw6g
+ludwiga l@dvIg@
+ludwigshafen l@dwigS@f~
+ludwin ludwin
+ludy lUd/
+lue lU
+luebbe lUb
+luebbers lqbPz
+luebbert lqbPt
+luebke lUbk
+lueck lU6k
+luecke lUk
+luedecke lqd6k
+lueder lqdP
+lueders lqdPz
+luedke lUdk/
+luedtke lqdk/
+lueh lwe
+luehring lqr6N
+luehrs lqrz
+lueken lqk~
+luella lUel@
+luelle lUl
+luellen lql~
+luepke lUpk/
+luera lU,r@
+lueras lU,r@z
+lueras lqr@z
+luers lUPz
+luerssen lUrs~
+lueth lUT
+luetkemeyer lqtkcmIP
+luevano lUcvon]
+luff luf
+luffed luft
+luffman lufm~
+lufkin lufkin
+luft luft
+lufthansa l@ftanz@
+lufthansa's l@ftanz@z
+luftig luft6g
+luftkin luftk~
+lufttransport luftranzp{rt
+lug lug
+lugano lUgon]
+lugar lUgP
+lugar's lUgPz
+lugarda lUg)rd@
+luge lUj
+luger lUgP
+lugers lUgPz
+luggage lug@j
+lugging lug6N
+lugi lUg/
+luginbill lug~bil
+luginbuhl lug~b@l
+lugkov lUgk{v
+lugo lUg]
+lugosi l@gOs/
+lugosi lUgOs/
+lugs lugz
+luguarda lUgord@
+lugubrious lUgyUbr/@s
+lugworm lugwPm
+lugworms lugwPmz
+luhman lum~
+luhmann lum~
+luhn lun
+luhr lV
+luhr lqr
+luhring lqr6N
+luhrs lqrz
+lui lU6
+luick lUk
+luigi lUEj/
+luigi's lUEj/z
+luigi's lwEj/z
+luikart lUkort
+luis lUEs
+luisa lUEz@
+luisi lUs/
+luiz lUz
+lujan lUyon
+luk luk
+luka lUk@
+lukach luk@k
+lukacs luk@ks
+lukas lUk@z
+lukash lUkaS
+lukasiewicz l@kos@v6C
+lukasik l@kos6k
+lukaszewski l@k6Sefsk/
+lukavica lUk@vik@
+lukavizta lUk@vitst@
+luke lUk
+luke's lUks
+lukehart lUkhort
+luken lUk~
+lukenbill luk~bil
+lukens lUk~z
+luker lUkP
+lukes lUks
+lukewarm lUkw{rm
+lukin lUk6n
+lukins lUkinz
+lukman lukm~
+lukoil lUk<l
+lukowski l@k{fsk/
+luks luks
+lukyanov lUky~ov
+lula lUl@
+lula's lUl@z
+lulie lul/
+lull lul
+lullabies lul@bIz
+lullaby lul@bI
+lulled luld
+lulling lul6N
+lulls lulz
+lulu lUlU
+lum lum
+luma lUm@
+luman lUm~
+lumb lum
+lumbago l}bAgO
+lumbar lumbor
+lumbard lumbPd
+lumber lumbP
+lumbering lumbP6N
+lumberjack lumbPjak
+lumberman lumbPman
+lumberman's lumbPmanz
+lumbert lumbPt
+lumberton lumbPt~
+lumberyard lumbPyord
+lumberyards lumbPyordz
+lumbra lumbr@
+lumen lUm~
+lumet lUm@t
+lumex lUm@ks
+lumia lUm/@
+lumina lUm~@
+luminal lUm~@l
+luminance lUm~~s
+luminaries lUm~er/z
+luminary lUm~er/
+luminescence lUm~es~s
+luminescent lUm~es~t
+luminol lUm~{l
+luminoso lUm~Os]
+luminous lUm~@s
+lumley luml/
+lumm lum
+lummus lum@s
+lumonics lUmon6ks
+lump lump
+lumpectomies lumpekt}/z
+lumpectomy lumpekt}/
+lumped lumpt
+lumper lumpP
+lumper's lumpPz
+lumping lump6N
+lumpkin lumpkin
+lumpkins lumpkinz
+lumpp lump
+lumps lumps
+lumpur lumpqr
+lumpy lump/
+lumsden lumsd~
+lun lun
+luna lUn@
+lunacy lUn@s/
+lunar lUnP
+lunati lUnotE
+lunatic lUn@tik
+lunatics lUn@tiks
+lunberg lunbPg
+lunceford luns@f{rd
+lunceford lunsf{rd
+lunch lunC
+lunched lunCt
+luncheon lunC~
+luncheonette lunC~et
+luncheons lunC~z
+lunches lunC@z
+lunching lunC6N
+lunchroom lunCrUm
+lunchtime lunCtIm
+lund lund
+lundahl lundol
+lunday lundA
+lundberg lundbPg
+lundblad lundbl@d
+lundborg lundb{rg
+lunde lund
+lundeen lund/n
+lundell lund@l
+lunden lund~
+lunder lundP
+lundgren lundgrcn
+lundholm lundhOlm
+lundin lundin
+lundmark lundmork
+lundquist lundkwist
+lundstedt lundstct
+lundsten lunds~
+lundstrom lundstr}
+lundt lunt
+lundy lund/
+lunenberg lUnenbPg
+lunetta lUnet@
+lung luN
+lunge lunj
+lunged lunjd
+lunger luNP
+lunges lunj@z
+lungfish luNfiS
+lunging lunj6N
+lungren luNrcn
+lungs luNz
+lunn lun
+lunney lun/
+lunny lun/
+lunsford lunsfPd
+lunt lunt
+luntz lunts
+luntz' lunts
+luntz's lunts@z
+lunz lunz
+luo lwO
+luoma lUOm@
+luong lU{N
+luongo lUONg]
+lupa lUp@
+lupatkin lUpotkin
+lupe lUp
+luper lUpP
+lupfer lupfP
+lupi lUp/
+lupica lUpEk@
+lupien lup/n
+lupin lUp~
+lupinacci lUp/noC/
+lupine lUpIn
+lupinski l@pinsk/
+lupita lUpEt@
+luplow lupl]
+lupo lUp]
+lupone lUpOn
+luppino lUpEn]
+luptak lupt@k
+lupton lupt~
+lupus lUp@s
+luque lUk
+luquette l@ket
+lura lqr@
+lurch lVC
+lurched lVCt
+lurches lVC@z
+lurching lVC6N
+lure lqr
+lured lqrd
+lures lqrz
+lurette lPet
+lurgi lVj/
+luria lqr/@
+lurid lqr@d
+lurie lqr/
+luring lqr6N
+lurk lVk
+lurked lVkt
+lurking lVk6N
+lurks lVks
+lurleen lPlEn
+lurlene lVl/n
+lurline lVlIn
+lurvey lPvA
+lurz lVz
+lusaka lUsok@
+lusardi lUs)rd/
+lusby lusb/
+lusch luS
+luscher luSP
+luscious luS@s
+luscombe lUskOmb/
+luse lUz
+lush luS
+lusher luSP
+lushlife luSlIf
+lushly luSl/
+lusignan lus6gn~
+lusinchi lUsinC/
+lusitania lUs@tAn/@
+lusitania's lUs@tAn/@z
+lusitanias lUs@tAn/@z
+lusk lusk
+luskin luskin
+lusky lusk/
+lusser lusP
+lussier lus/P
+lust lust
+lusted lust@d
+luster lustP
+lustful lustf@l
+lustgarten lustgord~
+lustig lust6g
+lusting lust6N
+lustre lustP
+lustrous lustr@s
+lusty lust/
+lute lUt
+lutece lUtes
+lutecia lUtESy@
+luten lUt~
+luter lUtP
+lutes lUts
+lutey lUt/
+lutfalla l@tfal@
+lutgen lutg~
+luth lUT
+luther lUTP
+lutheran lUTP~
+luthi lUT/
+luthy luT/
+lutman lutm~
+luton lUt~
+lutsky lutsk/
+lutter lutP
+lutterman lutPm~
+luttman lutm~
+lutton lut~
+luttrell lutr@l
+luttrull lutr@l
+luttwak lutwok
+lutweiler lutwIlP
+luty lUt/
+lutz luts
+lutze lutz
+lutzke lutsk/
+luu lUU
+luvena luv~@
+luvs luvz
+luwana l@wan@
+lux luks
+luxembourg luks}bVg
+luxembourg luks}b{rg
+luxor luksP
+luxottica luks]tEk@
+luxottica luksot6k@
+luxottica's luks]tEk@z
+luxottica's luksot6k@z
+luxton lukst~
+luxuriant l@gZV/~t
+luxuries lugZP/z
+luxurious l@gZV/@s
+luxury lugZP/
+luyster lIstP
+luz luz
+luzader luz@dP
+luzar lUzP
+luzhkov lUZk{v
+luzier lUz/P
+luzon lUzon
+luzzi lUts/
+lwin elwin
+lwin lUin
+lwin lwin
+lxi eleksI
+lxi lksE
+ly lI
+lyall lI@l
+lyanne l/an
+lyanne lIan
+lybarger lIborgP
+lybeck lIbek
+lybrand lIbrand
+lybrand's lIbr~dz
+lycan lIk~
+lycoming lIkOm6N
+lycoming lIk}6N
+lycra lIkr@
+lyda lId@
+lydall lId@l
+lyday lIdA
+lyde lId
+lyden lId~
+lydia lid/@
+lydic lid6k
+lydick lid6k
+lydie lid/
+lydon lid~
+lye lI
+lyell lIel
+lyerla lIVl@
+lyerly lIPl/
+lyford lifPd
+lying lI6N
+lyke lIk
+lykens lIk~z
+lykes lIks
+lykin lIk~
+lykins lik~z
+lyle lIl
+lyle's lIlz
+lyles lIlz
+lyman lIm~
+lyme lIm
+lymph limf
+lymphadenopathy limf@den@paT/
+lymphatic limfat6k
+lymphocyte limf@sIt
+lymphocytes limf@sIts
+lymphoma limfOm@
+lymphomas limfOm@z
+lyn lin
+lynam lin}
+lynch linC
+lynch's linC@z
+lynchburg linCbPg
+lynched linCt
+lynching linC6N
+lynchings linC6Nz
+lynd lind
+lynda lind@
+lynde lind
+lynden lind~
+lyndhurst lindhPst
+lyndon lind~
+lynds lindz
+lyne lIn
+lynes lInz
+lyness lInes
+lynette lInet
+lynford linfPd
+lyng liN
+lynk liNk
+lynn lin
+lynn's linz
+lynna lIn@
+lynne lin
+lynott lIn@t
+lynskey linsk/
+lynton lint~
+lynx liNks
+lynxes liNks@z
+lyon lI~
+lyon's lI~z
+lyondell lI~del
+lyonnais lE~A
+lyonnais lI~Az
+lyonnais's lI~Az@z
+lyonnaise lI~Az
+lyons lI~z
+lyons's lI~z@z
+lyphomed lIf}cd
+lyphomed lif}cd
+lyphomed's lIf}cdz
+lyphomed's lif}cdz
+lyra lIr@
+lyre lIr
+lyric lir6k
+lyrical lir6k@l
+lyrically lir6kl/
+lyricism lir@siz}
+lyricist lir@s@st
+lyricists lir@s@s
+lyricists lir@s@ss
+lyricists lir@s@sts
+lyrics lir6ks
+lyris liris
+lyrist lirist
+lysaght lIsot
+lysander lIsandP
+lysandra lIsandr@
+lysine lIs/n
+lysis lIsis
+lyski lIsk/
+lysne lIn
+lysol lIs{l
+lyssy lis/
+lyster listP
+lyter lItP
+lythgoe liTg]
+lytle lIt@l
+lyttle lit@l
+lytton lit~
+lyubimov lyUb}ov
+lyubimov's lyUb}ovz
+lyvers lIvPz
+m em
+m'bow embO
+m'bow mbO
+m's emz
+m-8 emAt
+m-80 emAt/
+m-code emkOd
+m-codes emkOdz
+m. em
+m.'s emz
+m.s emz
+m1 emwun
+m2 emtU
+m3 emTrE
+m4 emf{r
+m5 emfIv
+ma mo
+ma'am mam
+maack mok
+maaco mAk]
+maag mog
+maahs moz
+maalox mAloks
+maam mum
+maas moz
+maass mos
+maassen mos~
+maastricht mostrikt
+mab mab
+mabe mAb
+mabee mab/
+mabel mAb@l
+mabelle m@bel
+maben mab~
+maberry mobcr/
+mabery mabP/
+mabey mAb/
+mabie mab/
+mabile mob@l
+mabin mabin
+mabis mabis
+mable mAb@l
+mabley mabl/
+mabon mAb~
+mabrey mabr/
+mabry mabP/
+mabus mab@s
+mac mak
+mac's maks
+macabre m@kobP
+macabre m@kobr@
+macadam m@kad}
+macadamia mak@dAm/@
+macallister m@kal@stP
+macalpine m@kalpIn
+macaluso mak@lUs]
+macandrews m@kandrUz
+macao m@k?
+macaques m@koks
+macari mok)r/
+macaroni makPOn/
+macarthur m@k)rTP
+macartney m@k)rtn/
+macau m@k?
+macaulay m@k{l/
+macauley m@k{l/
+macaw m@k{
+macaws m@k{z
+macbeth m@kbeT
+macbride m@kbrId
+maccabean mak@bE~
+maccabee mak@bE
+maccabees mak@bEz
+maccallum m@kal}
+maccaquano mak@kwon]
+maccarone makPOn
+maccarthy m@k)rT/
+macchi mak/
+macchia mak/@
+macchio mak/]
+macconnell m@kon@l
+maccormack m@k{rm@k
+macdermott m@kdVm@t
+macdiarmid m@kdirm@d
+macdill m@kdil
+macdill's m@kdilz
+macdonald m@kdon@ld
+macdonald's m@kdon@ldz
+macdonell m@kdon@l
+macdonnell m@kdon@l
+macdonough m@kdon@f
+macdougal m@kdUg@l
+macdougall m@kdUg@l
+macdowell m@kd?@l
+macduff m@kduf
+mace mAs
+maceachern m@kECPn
+maceda m@sAd@
+macedo m@sAd]
+macedonia mas@dOn/@
+macedonia mas@dOny@
+macedonia's mas@dOn/@z
+macedonia's mas@dOn/@z
+macedonian mas@dOn/~
+macedonian mas@dOny~
+macedonians mas@dOn/~z
+macedonians mas@dOny~z
+macek m6kek
+macera m@s,r@
+macewan m@CU~
+macewan mAswon
+macewen m@kU~
+macewen mAswon
+macey mAs/
+macfadden m@kfad~
+macfadyen m@kfad/~
+macfarland m@kf)rl~d
+macfarlane m@kf)rl~
+macgowan m@g?~
+macgraw m@gro
+macgregor m@gregP
+macgyver m@gIvP
+macgyver's m@gIvPz
+mach mok
+macha maC@
+machacek mak@s6k
+machado m@Cod]
+machain m@CAn
+machala m@Col@
+machamer mak}P
+mache maC
+machel maC@l
+machen mak~
+macher makP
+macheski m@Cesk/
+machete m@CetE
+machete m@SetE
+machetes m@CetEz
+machetes m@SetEz
+machi mok/
+machiavelli mok/@vel/
+machiavelli moky@vel/
+machiavelli's mok/@vel/z
+machiavelli's moky@vel/z
+machiavellian mok/@vel/~
+machiavellian moky@vel/~
+machida m@CEd@
+machin maC~
+machination maS~AS~
+machinations maS~AS~z
+machine m6SEn
+machine's m6SEnz
+machinea maS~E@
+machined m6SEnd
+machineries m6SEnP/z
+machineries m6SEnr/z
+machinery m6SEnP/
+machinery m6SEnr/
+machines m6SEnz
+machines' m6SEnz
+machining m6SEn6N
+machinist m6SEn@st
+machinists m6SEn@s
+machinists m6SEn@ss
+machinists m6SEn@sts
+machinists' m6SEn@s
+machinists' m6SEn@ss
+machinists' m6SEn@sts
+machismo m@Cizm]
+machismo m@kizm]
+machnik makn6k
+macho moC]
+machold m@hOld
+machowski m@C{fsk/
+macht maCt
+machtley matCl/
+machuca m@CUk@
+machuga m@CUg@
+maciag m@kAg
+macias mosE@s
+maciejewski m@CUsk/
+maciejewski m@Cefsk/
+maciel m6kEl
+macik moC6k
+macinnes m@kin@s
+macinnis m@kin@s
+macintax mak~taks
+macintosh mak~t{S
+macintosh's mak~toS@z
+macintoshes mak~t{S@z
+macintyre mak~tIr
+macioce moCOC/
+maciolek m@C/Olck
+macisaac m@Cisak
+maciver mEk6vP
+mack mak
+mack's maks
+mackall mak@l
+mackay m@kA
+macke mak
+mackel mak@l
+mackellar m@kelP
+macken mak~
+mackenzie m@kenz/
+mackerel makP@l
+mackert makPt
+mackey mak/
+mackie mak/
+mackie's mak/z
+mackiewicz mak/@wits
+mackin makin
+mackinaw mak~{
+mackinley m@kinl/
+mackinney m@kin/
+mackinnon m@kin~
+mackintosh mak~toS
+macklem makl}
+mackler maklP
+mackley makl/
+macklin maklin
+macklin's maklinz
+macknay makn/
+macknight m@knIt
+macko mak]
+mackowiak m@sk?/ak
+mackowski m@sk{fsk/
+macks maks
+macktal makt@l
+maclachlan m@klakl~
+maclaine m@klAn
+maclaren m@kl,r~
+maclaughlin m@kl{klin
+maclay m@klA
+maclean m@klAn
+macleish m@klES
+maclellan m@klel~
+maclennan m@klen~
+macleod m@kl?d
+maclin makl~
+macmahon m@kman
+macmaster m@kmastP
+macmillan m@kmil~
+macmillan's m@kmil~z
+macmullen m@kmul~
+macmurray m@kmV/
+macnab m@knab
+macnair m@kn,r
+macnamara makn}er@
+macnaughton m@kn{t~
+macneal m@knEl
+macneil m@knEl
+macneill m@knEl
+macomb mAk}
+macomber m@kombP
+macon mAk~
+macoute m@kUt
+macoutes m@kUts
+macphail m@kfAl
+macphee m@kfE
+macpherson m@kfirs~
+macquarrie m@k,r/
+macqueen m@kwEn
+macrae m@krA
+macrame makr}A
+macri makr/
+macro makr]
+macrodantin makr]dant~
+macroeconomic makr]/k~om6k
+macroeconomic makr]ck~om6k
+macroeconomics makr]/k~om6ks
+macroeconomics makr]ck~om6ks
+macromedia makr]mEd/@
+macrophage makr]fAj
+macrophages makr]fAj@z
+macrovision makr]viZ~
+macs maks
+macsharry m@kS,r/
+mactaggart m@ktagPt
+mactan m@ktan
+mactavish m@ktav6S
+macumber m@kumbP
+macumolo m@kUm]l]
+macumolo's m@kUm]l]z
+macvicar m@kvikP
+macvicar's m@kvikPz
+macvie makv/
+macwilliams m@kwily}z
+macworld makwVld
+macy mAs/
+macy's mAs/z
+maczko moCk]
+mad mad
+mada mod@
+madagascar mad@gaskP
+madalena mad@lAn@
+madam mad}
+madame m@dam
+madame mad}
+madan mAd~
+madar madP
+madara mod)r@
+madaras mod)roz
+madaris madPis
+maday modA
+madcap madkap
+madd mad
+maddalena modolen@
+maddamma m@dom@
+madden mad~
+maddening madn6N
+maddening mad~6N
+maddeningly madn6Nl/
+maddeningly mad~6Nl/
+madder madP
+maddie mad/
+madding mad6N
+maddison mad@s~
+maddock mad@k
+maddocks mad@ks
+maddox mad@ks
+maddux mad@ks
+maddy mad/
+made mAd
+madeira m@dir@
+madej mad6j
+madel mad@l
+madelaine mad@lAn
+madeleine mad@len
+madelena modclen@
+madelene mad@lEn
+madelin mad@l~
+madeline mad@lin
+madella m@del@
+madelle m@del
+madelon modAl{n
+madelyn mad@lin
+madelyn madlin
+mademoiselle mad}@zel
+maden mAd~
+mader mAdP
+madera mod,r@
+madere madP
+madero mod,r]
+madewell mAdwcl
+madey mAd/
+madge maj
+madhouse madh?s
+madhusudan modhUsUd~
+madia mod/@
+madigan mad6g~
+madill modEl
+madis mad@s
+madison mad@s~
+madison's mad@s~z
+madkins madkinz
+madl mad@l
+madlen mad@l~
+madlin madlin
+madlock madlok
+madly madl/
+madman madman
+madmen madm~
+madness madn@s
+madoc mad@k
+madock mad@k
+madoff mad{f
+madog mad@g
+madole m@dOl
+madonia modOn/@
+madonna m@don@
+madonna's m@don@z
+madora m@d{r@
+madore m@d{rA
+madra modr@
+madras madr@s
+madre modrA
+madres modrAz
+madrid m@drid
+madrids m@dridz
+madrigal madr@g@l
+madrigals madr@g@lz
+madril madril
+madron madr~
+madruga madrUg@
+madry madr/
+madsen mads~
+madson mads~
+madstones madstOnz
+mady mAd/
+madyun mad/~
+madyun mady~
+mae mA
+mae's mAz
+maeda mAEd@
+maeder medP
+maekawa mo6kow@
+maelstrom mAlstr}
+maenza moenz@
+maersk m,rsk
+maertens m,rt~z
+maertz m,rts
+maerz m,rz
+maes mAz
+maese mEs
+maestas mest@z
+maestri moestr/
+maestro mIstr]
+maez mIez
+maffei mafI
+maffeo mof/]
+maffett mafct
+maffia maf/@
+maffucci mofUC/
+mafia mof/@
+mafia's mof/@z
+mafias mof/@z
+mag mag
+magadan mag@dan
+magallanes mag@lAnz
+magallon mag@lon
+magan mAg~
+magana mogan@
+magar magP
+magarian m@g,r/~
+magaw mag{
+magazine mag@zEn
+magazine's mag@zEnz
+magaziner mag@zEnP
+magaziner's mag@zEnPz
+magazines mag@zEnz
+magazines' mag@zEnz
+magby magb/
+magda magd@
+magdala mogdol@
+magdalen magd@l~
+magdalena magd@lEn@
+magdalene magd@lEn
+magdaleno mogdolAn]
+magee m@gE
+magel mag@l
+magellan m@jel~
+magellan's m@jel~z
+magellanic maj@lan6k
+magenta m@jent@
+mager mAgP
+mager magP
+magerman magPm~
+magers magPz
+mages mAj@z
+maggard magPd
+maggart magPt
+maggi maj/
+maggie mag/
+maggio moj/]
+maggot mag@t
+maggots mag@ts
+maggs magz
+magi mAjI
+magic maj6k
+magic's maj6ks
+magical maj6k@l
+magically maj6k@l/
+magically maj6kl/
+magician m@jiS~
+magicians m@jiS~z
+magid maj@d
+magie mAj/
+magiera mojir@
+magill maj@l
+magin majin
+maginn majin
+maginnis m@gin@s
+maginot maj~@t
+maginot maj~o
+magistad maj@stad
+magisterial maj@stEr/@l
+magistrate maj@strAt
+magistrates maj@strAts
+magistro mojEstr]
+maglaj maglI
+maglaj moglI
+maglaj's maglIz
+maglaj's moglIz
+maglev maglev
+magley magl/
+magli magl/
+magliano mogl/on]
+maglica magl6k@
+maglio magl/]
+magliocco mogl/Ok]
+maglione mogl/On/
+maglis magl/z
+magma magm@
+magma's magm@z
+magna magn@
+magna's magn@z
+magnan magn~
+magnani mognon/
+magnanimous magnan}@s
+magnano mognon]
+magnant magn~t
+magnate magn@t
+magnate magnAt
+magnates magnAts
+magnavox magn@voks
+magner magnP
+magnesia magnEZ@
+magnesite magn@sIt
+magnesium magnEz/}
+magness m@gnEs
+magnet magn@t
+magnet's magn@ts
+magnetek magnctek
+magneti magnet/
+magnetic magnet6k
+magnetically magnet6k@l/
+magnetically magnet6kl/
+magnetics magnet6ks
+magnetism magn@tiz}
+magnetite magn@tIt
+magnetization magn@t@zAS~
+magnetized magn@tIzd
+magnetometer magn@tom@tP
+magnetometers magn@tom@tPz
+magnetron magn@tron
+magnets magn@ts
+magnification magn@f@kAS~
+magnifications magn@f@kAS~z
+magnificent magnif@s~t
+magnificently magnif@s~tl/
+magnified magn@fId
+magnifier magn@fIP
+magnifiers magn@fIPz
+magnifies magn@fIz
+magnify magn@fI
+magnifying magn@fI6N
+magnin magnin
+magnitogorsk magnit@g{rsk
+magnitude magn@tUd
+magnitudes magn@tUdz
+magno magn]
+magnolia magnOly@
+magnolias magnOly@z
+magnone mognOn/
+magnum magn}
+magnus magn@s
+magnuson magn@s~
+magnussen magn@s~
+magnusson magn@s~
+magoon m@gUn
+magouirk m@gwVk
+magowan mogOwon
+magpie magpI
+magpies magpIz
+magrane magrAn
+magrath m@graT
+magri magr/
+magrini mogrEn/
+magro magr]
+magruder m@grUdP
+mags magz
+magten magten
+maguire m@gwIr
+magwood magwqd
+magyar magyor
+magyars magyorz
+mah mo
+mahabharata mohobPot@
+mahady m@hod/
+mahaffey m@haf/
+mahaffy mah@f/
+mahal m@hol
+mahala mah@l@
+mahalah mah@l@
+mahalia m@hal/@
+mahamud m@homqd
+mahan mA~
+mahaney m@hAn/
+mahannah m@han@
+mahany mah~/
+mahar mahP
+maharaja mohPoZu
+maharaja's mohPoZuz
+maharajahs mohPoj@z
+maharashtra mohPoStru
+mahariv moh)r/v
+maharive moh@rEv
+mahathir m@haTir
+mahathir m@hoTir
+mahathir mah@TP
+mahatma m@hotm@
+mahayana moh@yon@
+mahdi mod/
+mahe mAh/
+mahen mAhen
+mahen mA~
+maher m)r
+mahesh m@heS
+maheu mahyU
+mahfouz mofUz
+mahfouz's mofUz@z
+mahila m@hil@
+mahin mahin
+mahindra m@hindr@
+mahl mol
+mahle mAh@l
+mahler molP
+mahler's molPz
+mahlman molm~
+mahlmann molm~
+mahlstedt molstct
+mahlum mol}
+mahmood mamUd
+mahmood momUd
+mahmoud mamUd
+mahmoud momUd
+mahmud mamUd
+mahmud momUd
+mahn man
+mahnke maNk
+mahnken moNk~
+mahogany m@hog~/
+mahon mA~
+mahone mah~
+mahoney m@hOn/
+mahony mah~/
+mahood mohqd
+mahowald mah?{ld
+mahr m)r
+mahrt m)rt
+mahtan moton
+mahtar motP
+mahurin mahyPin
+mahvi mov/
+mahwah mow@
+mai mI
+maia mI@
+maid mAd
+maid's mAdz
+maida mAd@
+maidel mAd@l
+maiden mAd~
+maidenform mAd~f{rm
+maidens mAd~z
+maidie mAd/
+maids mAdz
+maiello mIel]
+maier mAP
+maiers mAPz
+maietta mIet@
+mail mAl
+mail's mAlz
+mailbag mAlbag
+mailbox mAlboks
+mailboxes mAlboks@z
+maile mAl
+mailed mAld
+mailer mAlP
+mailer's mAlPz
+mailers mAlPz
+mailey mAl/
+mailgram mAlgram
+mailgrams mAlgramz
+mailhot mIlh@t
+mailing mAl6N
+mailings mAl6Nz
+maillard mcl)rd
+maille mAl
+maillet mclet
+mailloux mclU
+mailman mAlman
+mailroom mAlrUm
+mails mAlz
+mailson mAls~
+maim mAm
+maimed mAmd
+maiming mAm6N
+maimone mAmOn
+maims mAmz
+main mAn
+maina mAn@
+mainard mAnPd
+maine mAn
+maine's mAnz
+mainer mAnP
+maines mAnz
+mainframe mAnfrAm
+mainframes mAnfrAmz
+mainichi mo~EC/
+mainland mAnland
+mainland mAnl~d
+mainlander mAnlandP
+mainlanders mAnlandPz
+mainline mAnlIn
+mainly mAnl/
+maino mAn]
+mainor mAnP
+mainord mcn{rd
+mains mAnz
+mainstay mAnstA
+mainstays mAnstAz
+mainstream mAnstrEm
+mainstreaming mAnstrEm6N
+mainstreet mAnstrEt
+maintain mAntAn
+maintained mAntAnd
+maintaining mAntAn6N
+maintains mAntAnz
+maintenance mAntn~s
+maintenance mAnt~~s
+mainville mAnvil
+mainwaring mAnwer6N
+mainz mAnz
+maio mA]
+maiolo mI]l]
+maione mI]n/
+maiorana mI{ran@
+maiorano mI{ron]
+maiorino mI{rEn]
+mair m,r
+maire m,r
+mairs m,rz
+mais mAz
+maisano m@son]
+maisch mIS
+maisel mIs@l
+maish mo@S
+maisie mAz/
+maison mAz~
+maisonet mes~ct
+maitland mAtl~d
+maitre mAtr@
+maize mAz
+maize's mAz@z
+maiziere mAzir
+maj maj
+majcher majkP
+majchrzak mIrz@k
+majer mAjP
+majerus majP@s
+majeske mIesk/
+majeski mIesk/
+majesta moyAst@
+majestic m@jest6k
+majestically m@jest6k@l/
+majestically m@jest6kl/
+majesty maj@st/
+majesty's maj@st/z
+majette m@Zet
+majeure m@jUr
+majewski mIefsk/
+majid m@jid
+majik maj6k
+majka mIk@
+majkowski mIk{fsk/
+majnoon majnUn
+major mAjP
+major's mAjPz
+majored mAjPd
+majoring mAjP6N
+majoritarian majP@t,r/~
+majorities m@j{r@t/z
+majority m@j{r@t/
+majority's m@j{r@t/z
+majoros moy{r]z
+majors mAjPz
+majrooh majrU
+majure moyqrA
+mak mak
+mak-kwan makkwon
+makar makP
+makara mok)r@
+makarewicz m@k)r6v6C
+make mAk
+makefield mAkf/ld
+makegood mAkgqd
+makegoods mAkgqdz
+makela mak@l@
+makeover mAkOvP
+makepeace makp/s
+maker mAkP
+maker's mAkPz
+makers mAkPz
+makers' mAkPz
+makes mAks
+makeshift mAkSift
+makeup mAkup
+makhoul m@kUl
+maki mok/
+makin makin
+makin' mAk~
+makinen makin~
+making mAk6N
+makings mAk6Nz
+makinson mak~s~
+makita m@kEt@
+mako mok]
+makos mAk]z
+makoto m@kOt]
+makowski m@k{fsk/
+makowsky m@k?sk/
+makris makris
+makro makr]
+maksoud maksUd
+maksymuk maks/mqk
+maktoum maktUm
+maktoums maktUmz
+makuch mak@k
+mal mal
+mal's malz
+mala mol@
+malabre mal@br@
+malacanang m@lak~aN
+malacca m@lak@
+malachowski m@l@h{fsk/
+maladich mal@d6C
+maladich mal@d6k
+maladies mal@d/z
+maladjusted mal@just@d
+maladroit mal@dr<t
+malady mal@d/
+malaga mal@g@
+malagasy mal@gas/
+malahide mal@hId
+malaise malAz
+malak mal@k
+malamud mal}@d
+malamugi mal}yUj/
+malamute mal}yUt
+malan mAl~
+maland mal~d
+malaney m@lAn/
+malanga moloNg@
+malanowski m@l~{fsk/
+malaprop mal@prop
+malara mol)r@
+malaria m@l,r/@
+malarial m@l,r/@l
+malarkey m@l)rk/
+malary mal@r/
+malaspina molospEn@
+malatesta molotest@
+malathion m@laT/{n
+malathion m@laT/~
+malave molov/
+malawi m@low/
+malawi's m@low/z
+malay mAlA
+malayan m@lA~
+malays m@lAz
+malaysia m@lAZ@
+malaysia's m@lAZ@z
+malaysian m@lAZ~
+malaysians m@lAZ~z
+malbon malb~
+malbrough malbr?
+malburg malbPg
+malchow molh?
+malcolm malk}
+malcolm's malk}z
+malcolmson malk}s~
+malcom malk}
+malcomb malk}
+malcomson malk}s~
+malcontent malk~tent
+malcontents malk~tents
+malczewski m@lCefsk/
+malden m{ld~
+maldives m{ldIvz
+maldonado mald~od]
+maldutis moldUt@s
+male mAl
+male's mAlz
+malec mol6k
+malecha m@leC@
+malecki m@lek/
+malefactor mal@faktP
+malefactors mal@faktPz
+malek molck
+malena mal~@
+malenfant molAnf~t
+maler mAlP
+malerba mol,rb@
+males mAlz
+maleski m@lesk/
+malesky m@lesk/
+malevolent m@lev@l~t
+maley mAl/
+malfeasance malfEz~s
+malfitano malf@ton]
+malformation malf{rmAS~
+malformations malf{rmAS~z
+malformed malf{rmd
+malfunction malfuNkS~
+malfunctioned malfuNkS~d
+malfunctioning malfuNkS~6N
+malfunctions malfuNkS~z
+malhotra malhotr@
+mali mol/
+malia mol/@
+malibu mal@bU
+malice mal@s
+malicious m@liS@s
+maliciously m@liS@sl/
+malick mal6k
+malicki m@lik/
+malicoat mal6kOt
+malign m@lIn
+malignancies m@lign~s/z
+malignancy m@lign~s/
+malignant m@lign~t
+maligned m@lInd
+malik mal6k
+malin mAlin
+malin malin
+malina molEn@
+malinak mal~ak
+malinda molEnd@
+malinde malind
+maline molEn/
+malinoski m@l~?sk/
+malinowski m@l~{fsk/
+malinski m@linsk/
+malis mol/z
+maliszewski m@l6Sefsk/
+malizia m@liz/@
+malkiel m{lk/@l
+malkiewicz molk@v6C
+malkin malkin
+malkovich m{lk@v6C
+malkowski m@lk{fsk/
+mall m{l
+mall's m{lz
+mallard malPd
+mallards malPdz
+malle mal
+malleability mal/@bil@t/
+malleable mal/@b@l
+mallek mal6k
+mallen m{l~
+maller m{lP
+mallery malP/
+mallet mal@t
+malleton mal@t~
+malleton's mal@t~z
+mallett mal@t
+mallette m@let
+malley mal/
+mallia mol/@
+mallick mal6k
+mallicoat mal6k]t
+mallie m{l/
+mallightco malItk]
+mallin malin
+mallinckrodt mal6Nkrot
+mallinger m{l6NP
+mallinson malins~
+mallis malis
+mallison mal@s~
+mallo mol]
+malloch mal@k
+mallon mal~
+mallonee mal~E
+mallory malP/
+mallow mal]
+mallows mal]z
+malloy m@l<
+mallozzi maloz/
+mallrat m{lrat
+mallrats m{lrats
+malls m{lz
+mally mal/
+malm mom
+malmberg molmbPg
+malmgren malmgrcn
+malmquist malmkwist
+malmstrom malmstr}
+malnar malnP
+malnourish malnViS
+malnourished malnViSt
+malnutrition malnUtriS~
+malo mol]
+malon mal~
+malone m@lOn
+malone's m@lOnz
+maloney m@lOn/
+maloof m@lUf
+malosovich m@l{s@viC
+malott m@lot
+malouf mal]f
+maloy mal<
+malpass malp@s
+malphrus malfr@s
+malpractice malprakt@s
+malrite malrIt
+malrite's malrIts
+malsom mals}
+malson mals~
+malstrom malstr}
+malt m{lt
+malta m{lt@
+maltais m@ltA
+maltase m{ltAs
+maltbie maltb/
+maltby maltb/
+malted m{lt@d
+malter m{ltP
+maltese m{ltEz
+malting m{lt6N
+maltose m{lt]s
+maltreated maltrEt@d
+maltreatment maltrEtm~t
+malts m{lts
+maltz malts
+malueg malqg
+maluken malUk~
+maluso m@lUs]
+malva molv@
+malval molvol
+malveaux malvO
+malvern malvPn
+malvie m{lv/
+malvin malvin
+malvina molvEn@
+malvinas m{lvEn@s
+maly mAl/
+malzahn malz~
+mam emAem
+mam mom
+mama mom@
+mama's mom@z
+mamaroneck m},r~ck
+mamas mom@z
+mamba momb@
+mambas momb@z
+mambo momb]
+mame mAm
+mameluke mam@lUk
+mamet mam@t
+mamet's mam@ts
+mamie mAm/
+mamis mamis
+mamma mom@
+mammal mam@l
+mammalian m}Al/~
+mammalian m}Aly~
+mammallike mam@llIk
+mammals mam@lz
+mammary mamP/
+mammen mam~
+mammogram mam]gram
+mammograms mam]gramz
+mammography m}ogr@f/
+mammoth mam@T
+mammoths mam@Ts
+mamone m}On
+mamsted mamstcd
+mamula mamyUl@
+man man
+man's manz
+mana mon@
+manac manak
+manafort man@f{rt
+manage man@j
+manageable man6j@b@l
+managed man@jd
+management man@jm~t
+management's man6jm~ts
+managements man6jm~ts
+managements' man6jm~ts
+manager man@jP
+manager's man6jPz
+managerial man6jir/@l
+managers man@jPz
+managers' man@jPz
+manages man6j@z
+managing man@j6N
+managua m~ogw@
+managua's m~ogw@z
+manahan man@han
+manak man@k
+manalo monol]
+manama man}@
+manard manPd
+manas mon@z
+manasco monosk]
+manasion man6S~
+manasion's man6S~z
+manassas m~os@s
+manatee man@tE
+manatees man@tEz
+manatt man@t
+manbeck manbek
+mance mans
+mancebo monCeb]
+mancera mans,r@
+mancha monk@
+manchester manCestP
+manchu manCU
+manchuria manCqr/@
+mancil mansil
+mancilla mansil@
+mancillas m~sil@z
+mancinelli monC/nel/
+mancini monCEn/
+mancino monCEn]
+manco maNk]
+mancusi monkUs/
+mancuso maNkyUs]
+manda mand@
+mandalay mand@lA
+mandalit mand@lit
+mandalite mand@lIt
+mandamus mandAm@s
+mandarin mandP~
+mandarino mondorEn]
+mandarins mandP~z
+mandate mandAt
+mandated mandAt@d
+mandates mandAts
+mandating mandAt6N
+mandato mondot]
+mandatory mand@t{r/
+mandel mand@l
+mandela mandel@
+mandela's mandel@z
+mandelbaum mand@lb?m
+mandell mand@l
+mandella mandel@
+mander mandP
+manders mandPz
+manderscheid mandPSId
+manderson mandPs~
+mandeville mand@vil
+mandible mand@b@l
+mandich mand6k
+mandie mand/
+mandigo mondEg]
+mandl mand@l
+mandle mand@l
+mandler mandlP
+mandolin mand@lin
+mandracchia mandrak/@
+mandrake mandrAk
+mandrell mandr@l
+mandresh mandreS
+mandrill mandril
+mandt mant
+mandujano mondUyon]
+mandy mand/
+mane mAn
+maned mAnd
+manella m~el@
+maner mAnP
+maners mAnPz
+manes mAnz
+maness mon@s
+manet manA
+manet monA
+manette m~et
+maneuver m~UvP
+maneuverability m~UvP@bil@t/
+maneuverable m~UvP@b@l
+maneuvered m~UvPd
+maneuvering m~UvP6N
+maneuverings m~UvP6Nz
+maneuvers m~UvPz
+maneval monAval
+maney mAn/
+manford manfPd
+manfra manfr@
+manfre manfP
+manfred manfr@d
+manfredi monfred/
+manfredo monfrAd]
+manfully manf@l/
+mang maN
+manga maNg@
+mangan maNg~
+manganaro moNgon)r]
+manganello moNgonel]
+manganese maNg~Ez
+manganiello moNgon/el]
+mangano moNgon]
+mangas maNg@z
+mange mAnj
+mangel mANg@l
+mangels mANg@lz
+mangement mAnjm~t
+mangen maN~
+manger mAnjP
+manges mAnj@z
+mangham maNg}
+mangiapane manj/@pAn
+mangiaracina monjPoC/n@
+mangieri moNgir/
+mangin maNgin
+mangine moNgEn/
+mangini moNgEn/
+mangino moNgEn]
+mangione monjOn/
+manglapus maNl@p@s
+mangle maNg@l
+mangled maNg@ld
+mangling maNg@l6N
+mangling maNgl6N
+mango maNg]
+mangoes maNg]z
+mangold mangOld
+mangone moNgOn/
+mangope maNgOpA
+mangosteen maNg]stEn
+mangosteens maNg]stEnz
+mangosuthu maNg@suTU
+mangrove maNgrOv
+mangrove mangrOv
+mangrum maNgr}
+mangual mang@l
+mangum maNg}
+mangus maNg@s
+mangy mAnj/
+manhandle manhand@l
+manhandled manhand@ld
+manhart manhort
+manhasset manhasct
+manhattan manhat~
+manhattan's manhat~z
+manheim manhIm
+manhole manhOl
+manhood manhqd
+manhunt manhunt
+mani mon/
+mania mAn/@
+maniac mAn/ak
+maniacal m~I@k@l
+maniaci mon/oC/
+maniacs mAn/aks
+maniatis man/ot@s
+manic man6k
+manicure man6kyP
+manicured man6kyPd
+manicurist man6kyV@st
+manier men/P
+manifest man@fest
+manifestation man@fcstAS~
+manifestations man@fcstAS~z
+manifested man@fest@d
+manifesting man@fest6N
+manifestly man@fcstl/
+manifesto man@festO
+manifests man@fes
+manifests man@fess
+manifests man@fests
+manifold man@fOld
+manigat man6gat
+manigault man6g{lt
+manigo monEg]
+manila m~il@
+manila's m~il@z
+manilla m~il@
+manilow man@l]
+manioc man/ok
+manion mony{n
+maniples man@p@lz
+manipulate m~ipy@lAt
+manipulated m~ipy@lAt@d
+manipulates m~ipy@lAts
+manipulating m~ipy@lAt6N
+manipulation m~ipy@lAS~
+manipulations m~ipy@lAS~z
+manipulative m~ipy@lAt6v
+manipulator m~ipy@lAtP
+manipulators m~ipy@lAtPz
+manis manis
+maniscalco mon/skolk]
+manischewitz man6Sevits
+manish man6S
+manitoba man@tOb@
+manitowoc man@t@wok
+manjaca monjok@
+manjarrez mony)rcz
+mank maNk
+manka maNk@
+mankato mankot]
+manke maNk
+manker maNkP
+mankey mankE
+mankiewicz maNk@wits
+mankiller mankilP
+mankin maNkin
+mankind mankInd
+mankind's mankIndz
+mankinds mankIndz
+mankins maNkinz
+manko maNk]
+mankowski m@Nk{fsk/
+manley manl/
+manlove manluv
+manly manl/
+manmade manmAd
+mann man
+mann's manz
+manna man@
+mannarino manP/n]
+manne man
+manned mand
+mannella monel@
+mannen man~
+mannequin man@kin
+mannequins man@kinz
+manner manP
+mannered manPd
+mannering manP6N
+mannerism manPiz}
+mannerisms manPiz}z
+mannerist manP@st
+manners manPz
+mannes manz
+mannesmann man@sm~
+manney man/
+mannheim manhIm
+manni man/
+mannie man/
+mannina man~@
+manninen man~~
+manning man6N
+manning's man6Nz
+mannino man/n]
+mannion many~
+mannis manis
+mannix man6ks
+manno man]
+mannon man~
+manns manz
+manny man/
+manny's man/z
+mano mon]
+manocchio monOk/]
+manoff man{f
+manolis man@lis
+manon mon{n
+manoogian m~Uj/~
+manor manP
+manors manPz
+manos mAn]z
+manpower manp?P
+manpower's manp?Pz
+manring manriN
+manrique m~rEk
+manriquez monrEkwcz
+manry manr/
+mans manz
+manseau m~sO
+mansel mans@l
+mansell mans@l
+manser mansP
+mansfield manzfEld
+manship manSip
+mansion manS~
+mansions manC~z
+manske mansk
+mansker manskP
+manslaughter mansl{tP
+manso mans]
+manson mans~
+manson's mans~z
+mansour mansP
+mansueto manswAt]
+mansur mansP
+manta mant@
+manteer mantEr
+mantei mantI
+mantel mant@l
+mantell mantel
+manter mantP
+manternach mantPn@k
+manteufel mant<f@l
+mantey mant/
+manthe manT
+manthei manTI
+manthey manT/
+mantia monS@
+mantilla mantil@
+mantione mont/On/
+mantis mantis
+mantle mant@l
+mantle's mant@lz
+mantles mant@lz
+manton mant~
+mantooth mantUT
+mantra mantr@
+mantua manCU@
+mantz mants
+manu monU
+manual manyU@l
+manually manyU@l/
+manuals manyU@lz
+manucher manUkP
+manuel monwel
+manuela manwAl@
+manuele manql
+manufacture many@fakCP
+manufactured many@fakCPd
+manufacturer many@fakCPP
+manufacturer's many@fakCPPz
+manufacturers many@fakCPPz
+manufacturers' man@fakCPPz
+manufactures many@fakCPz
+manufacturing many@fakCP6N
+manufacturing's many@fakCP6Nz
+manure m~qr
+manus mAn@s
+manuscript many@skript
+manuscripts many@skripts
+manvel manv@l
+manvil manvil
+manville manvil
+manville's manvilz
+manwaring manwer6N
+manwarren m~w{r~
+manweb manweb
+manwell manwel
+manwiller manwilP
+manx maNks
+many men/
+manz manz
+manza monz@
+manzanares monzon)rcs
+manzanilla manz~il@
+manzano monzon]
+manzella manzel@
+manzer manzP
+manzi manz/
+manzi's manz/z
+manzione monz/On/
+manzo manz]
+mao m?
+mao's m?z
+maoist m?ist
+maoists m?is
+maoists m?iss
+maoists m?ists
+maori m?r/
+maoris m?r/z
+maoris mAPis
+map map
+mapco mapk]
+mapel map@l
+mapes mAps
+mapi map/
+mapi's map/z
+maple mAp@l
+maples mAp@lz
+maplewood mAp@lwqd
+mapp map
+mapped mapt
+mapping map6N
+mapplethorpe map@lT{rp
+maps maps
+maputo m@pUt]
+maputo's m@pUt]z
+maquila m@kwEl@
+maquiladora makEl@d{r@
+maquiladora makw@ladP@
+maquiladoras makEy@d{r@s
+maquiladoras makw@ladP@s
+maquilas makw@l@s
+mar m)r
+mara m)r@
+marabella mar@bel@
+marable m,r@b@l
+marabou m,r@bU
+maracle m)r@k@l
+maradona mor@dOnu
+maradona's mor@dOnuz
+maradonna mor@dOnu
+maradonna's mor@dOnuz
+marafat m,r@fat
+marais merA
+marak mar@k
+maralina morolEn@
+maraline morolEn/
+maran moron
+maranda mPand@
+marando mPand]
+maraniss mPanis
+marano moron]
+maranon m,r~on
+marantette m,r~tet
+maranto mPant]
+marantz mar~ts
+maranville moronvil
+maras m)r@z
+maraschino mar@skEn]
+marasco morosk]
+marasek mPosck
+marash m)r6S
+marash' m)r6S
+marash's m)r6S@z
+marathi m@rot/
+marathon m,r@Ton
+marathons m,r@Tonz
+maraud mP{d
+marauder mP{dP
+marauders mP{dPz
+marauding mP{d6N
+maravilla morovil@
+marbach m)rbok
+marbella morbel@
+marberry m)rber/
+marbil m)rbil
+marble m)rb@l
+marble's m)rb@lz
+marbled m)rb@ld
+marblehead m)rb@lhed
+marbles m)rb@lz
+marbod m)rbod
+marbry m)rbr/
+marburger m)rbPgP
+marbury m)rber/
+marbut m)rb@t
+marc m)rk
+marcade m)rkAd
+marcano morkon]
+marcantel morkontel
+marcantonio mork~tOn/]
+marceau morsO
+marceaux morsO
+marceca morsek@
+marcel morsel
+marcela morCel@
+marcelia morCel/@
+marcelino morCclEn]
+marcell morsAl
+marcella morsel@
+marcelle morsel
+marcelli morCel/
+marcellina morCclEn@
+marcelline morCclEn/
+marcellino morCclEn]
+marcello morsel]
+marcellus morsel@s
+marcelo morCel]
+marcessa morses@
+marcessa's morses@z
+march m)rC
+march's m)rC@z
+marchak m)rC@k
+marchal m)rC@l
+marchand morCand
+marchand morkhand
+marchant m)rC~t
+marchbank m)rCbaNk
+marchbanks m)rCbaNks
+marche m)rS
+marched m)rCt
+marchenko morCenk]
+marcher m)rCP
+marchers m)rCPz
+marches m)rC@z
+marchesani morkcson/
+marchesano morkcson]
+marcheschi morCeS/
+marchese morkEz/
+marchesi morkes/
+marchessault m)rS@s]
+marchetta morket@
+marchetti morket/
+marchewka mPCyUk@
+marchi m)rk/
+marching m)rC6N
+marchini morkEn/
+marchinko morCENk]
+marchio m)rk/]
+marchione mork/On/
+marchita morkEt@
+marchitto morkEt]
+marchman m)rkm~
+marci m)rs/
+marcia m)rS@
+marcia's m)rS@z
+marcial mors/ol
+marciano morC/on]
+marciante m)rC~t/
+marcie m)rk/
+marcil m)rsil
+marcile m)rC@l
+marcilio morsEl/]
+marcille m)rsil
+marcin morsEn
+marcinek mPCinck
+marciniak mPCin/ak
+marcinko morsiNk]
+marcinkowski mPC6Nk{fsk/
+marcinkus morsiNk@s
+marcissa morsis@
+marckesano morkeson]
+marcks m)rks
+marcmann m)rkm~
+marco m)rk]
+marco's m)rkOz
+marcoe m)rk]
+marcom m)rk}
+marcon m)rk~
+marcone morkOn/
+marconi morkOn/
+marcor m)rk{r
+marcos m)rk]s
+marcos' m)rk]s
+marcos' m)rk]s@z
+marcos's m)rk@s@z
+marcoses morkOs@z
+marcoses' morkOs@z
+marcott morkot
+marcotte mork{t
+marcou morkU
+marcoux morkU
+marcrum m)rkr}
+marcucci morkUC/
+marcum m)rk}
+marcus m)rk@s
+marcus's m)rk@s@z
+marcussen m)rk@s~
+marcy m)rs/
+marczak m)rCak
+marden m)rd~
+marder m)rdP
+mardi m)rd/
+mardis m)rd/s
+mardon m)rd~
+mare m,r
+mare's m,rz
+maready mPed/
+marean morEn
+marek m)rck
+marelda moreld@
+marella mPel@
+marelli mcrel/
+mareno moren]
+mares m,rz
+maresca moresk@
+maresco moresk]
+maresh mar@S
+maret m)rAt
+marett marct
+maretta moret@
+marette mPet
+marez morez
+marfa m)rf@
+marga m)rg@
+margalo morgol]
+margalov mog@l{v
+margaret m)rgP@t
+margaret m)rgr@t
+margaret's m)rgP@ts
+margaret's m)rgr@ts
+margareta morgoret@
+margarete m)rgPEt
+margarethe morgoreT/
+margaretten morgPet~
+margarine m)rjP~
+margarita morgPEt@
+margaritas morgcrEt@s
+margaux morgO
+marge m)rj
+margeotes m)rj/Ot/z
+margerum m)rgP}
+margery m)rjP/
+margeson m)rg@s~
+marget m)rgct
+margette morZet
+margie m)rj/
+margin m)rj~
+marginal m)rj~@l
+marginalization morj~@l@zAS~
+marginalize m)rj~@lIz
+marginalized m)rj~@lIzd
+marginalizes m)rj~@lIz@z
+marginalizing m)rj~@lIz6N
+marginally m)rj~@l/
+margined m)rj~d
+margining m)rj~6N
+margins m)rj~z
+margiotta morjOt@
+margittai m)rj@tI
+margo m)rg]
+margolick morgOl6k
+margolies morgOl/z
+margolin m)rg@lin
+margolin morgOl~
+margolis morgOl@s
+margory mPgV/
+margoshes morg{S@z
+margot m)rg]
+margraf m)rgr@f
+margrave m)rgrAv
+margret m)rgrct
+margret's m)rgrcts
+marguerite morgPEt
+margulies m)rgUl/z
+margulis m)rg@lis
+margus m)rg@s
+margy m)rj/
+marhefka mPhefk@
+mari m)r/
+maria mPE@
+maria's mPE@z
+mariachi mor/oC/
+mariah mPI@
+mariam m,r/am
+marian m,r/~
+marian's m,r/~z
+mariana mer/an@
+marianas mer/an@s
+mariani mor/an/
+mariani mor/on/
+marianna mor/on@
+marianne mer/an
+mariano mer/on]
+maribel mar@bcl
+marice m)ris
+marich mar6k
+maricle mar6k@l
+maricopa mer6kOp@
+marie mPE
+marie's mPEz
+mariel m,r/@l
+marielito mcrEclEt]
+marielitos mcrEclEt]s
+marien m,r/n
+marienbonn m,r/nb{n
+marienbonn's m,r/nb{nz
+marier m,r/P
+marietta mer/et@
+marietta's mer/et@z
+mariette mer/et
+marigold m,r@gOld
+marigolds m,r@gOldz
+marijuana mer@won@
+marik mar6k
+marilda morEld@
+marilin mar@l~
+marilla moril@
+marilu m,r/lU
+marilyn m,r@l~
+marilyn's m,r@l~z
+marilynn m,r@l~
+marimba mPimb@
+marin m,rin
+marina mPEn@
+marinaccio mor~oC/]
+marinaro mor~)r]
+marinas mPEn@z
+marinate m,r~At
+marinated m,r~At@d
+marine mPEn
+marine's mPEnz
+marineau m,r~]
+marineland mPEnl~d
+marinelli mor~el/
+marinello mor~el]
+mariner m,r~P
+mariners m,r~Pz
+marines mPEnz
+marines' mPEnz
+marinez morEncz
+maring m,r6N
+marini morEn/
+marinkovich mPiNk@v6C
+marino mPEn]
+marino's mPEn]z
+marinoff mar~{f
+marinos mPEn]z
+marinucci mor/nUC/
+marinvest mPinv@st
+mario m)r/]
+mario's m)r/]z
+marion m,r/~
+marion's m,r/~z
+mariotta mer/ot@
+mariotti mor/Ot/
+maris m,ris
+marisa m@ris@
+mariscal m)r@sk@l
+marish m,r6S
+marissa m@ris@
+marital m,r@t@l
+maritime m,r@tIm
+maritz m,rits
+mariucci mer/UC/
+marius m,r/@s
+marjai m)rjA
+marje m)rj
+marjie m)rj/
+marjorie m)rjP/
+marjory m)rjP/
+marjy m)rj/
+mark m)rk
+mark's m)rks
+markair m)rker
+markair's m)rkerz
+markan m)rk~
+markarian mork,r/~
+markdown m)rkd?n
+markdowns m)rkd?nz
+marke m)rk
+marked m)rkt
+markedly m)rk@dl/
+markee m)rkE
+markel m)rk@l
+markel morkel
+markell m)rk@l
+marken m)rk~
+marker m)rkP
+markers m)rkPz
+markert m)rkPt
+markese morkEs
+market m)rk@t
+market's m)rk@ts
+marketability mork@t@bil@t/
+marketable m)rk@t@b@l
+marketamerica mork@t},r6k@
+marketed m)rk@t@d
+marketeer mork@tir
+marketeers mork@tirz
+marketer m)rk@tP
+marketer's m)rk@tPz
+marketers mork@tPz
+marketers' m)rk@tPz
+marketing m)rk@t6N
+marketing's m)rk@t6Nz
+marketings m)rk@t6Nz
+marketmaker m)rk@tmAkP
+marketmakers m)rk@tmAkPz
+marketplace m)rk@tplAs
+marketplace's m)rk@tplAs@z
+marketplaces m)rk@tplAs@z
+markets m)rk@ts
+markets' m)rk@ts
+marketscope m)rk@tskOp
+marketwide m)rk@twId
+markey m)rkE
+markey's m)rkEz
+markgraf m)rkgr@f
+markham m)rk}
+markie m)rk/
+markiewicz m)rk@v6C
+markin m)rkin
+marking m)rk6N
+markings m)rk6Nz
+markka m)rk@
+markkaa morko
+markkas m)rk@s
+markland m)rkl~d
+markle m)rk@l
+markley m)rkl/
+markman m)rkm~
+marko m)rk]
+markoff m)rk{f
+markos m)rk]z
+markovic m)rk@v6k
+markovich m)rk@viC
+markovitz m)rk@vits
+markow m)rk]
+markowicz m)rk@viC
+markowitz m)rk@wits
+markowski mPk{fsk/
+marks m)rks
+marks's m)rks@z
+marksberry m)rksber/
+marksman m)rksm~
+marksmanship m)rksm~Sip
+marksmen m)rksmcn
+markson m)rks~
+markum m)rk}
+markunas m)rkUn@z
+markup m)rkup
+markups m)rkups
+markus m)rk@s
+markuson m)rk@s~
+markwardt m)rkw{rt
+markwell m)rkwel
+markwood m)rkwqd
+marky m)rk/
+marla m)rl@
+marland m)rl~d
+marlar m)rlP
+marlatt m)rl@t
+marlboro m)rlbP]
+marlboro's m)rlbPr]z
+marlboros m)rlbPr]z
+marlborough m)rlbP]
+marleen morlEn
+marleene morlEn
+marlen m)rl~
+marlena morlAn@
+marlene m)rlEn
+marlens m)rl~z
+marler m)rlP
+marlett m)rlct
+marlette morlet
+marley m)rl/
+marliave morl/ev
+marlin m)rl~
+marling m)rl6N
+marlins m)rl~z
+marlo m)rl]
+marlon m)rl~
+marlow m)rl]
+marlowe m)rlO
+marlton m)rlt~
+marlys m)rl/z
+marmaduke m)rm@dUk
+marmalade m)rm@lAd
+marmara morm)r@
+marmer m)rmP
+marmion m)rm/~
+marmo m)rm]
+marmolejo morm]lAy]
+marmon m)rm~
+marmor m)rmP
+marmoset m)rm@zet
+marnell m)rn@l
+marner m)rnP
+marney m)rn/
+maro m)r]
+maroc mor{k
+marogen m,r]g~
+marohl mar]l
+marohn m)r~
+marois mPwo
+marold mar]ld
+marolf mar]lf
+marolt mar]lt
+maron mor{n
+marone mPOn
+maroney mPOn/
+maroni morOn/
+maronite m,r~It
+maroon mPUn
+marooned mPUnd
+marooney mPUn/
+marose mPOs
+marotta mPot@
+marotte mP{t
+marotto morOt]
+marotz mar@ts
+marous m,r@s
+marovich m)r@v6C
+marplan m)rplan
+marple m)rp@l
+marquai morkA
+marquai morkwA
+marquand m)rkw~d
+marquard morkw)rd
+marquardt m)rkwort
+marquart m)rkwort
+marque m)rk
+marquee morkE
+marquerite m)rgrct
+marquerite morgPEt
+marques m)rks
+marquess m)rkw@s
+marquest m)rkwest
+marquette morket
+marquez morkez
+marquis morkE
+marquiss m)rkw/s
+marquita morkwEt@
+marr m)r
+marra m)r@
+marrakech mar@keS
+marrazzo moroz]
+marred m)rd
+marren m)r~
+marrero mor,r]
+marrett m,rct
+marriage m,r6j
+marriages m,r6j@z
+married m,r/d
+marries m,r/z
+marrin marin
+marriner m,r~P
+marring m)r6N
+marriott m,r/@t
+marriott's m,r/@ts
+marris maris
+marro m)r]
+marrocco morOk]
+marron m,r~
+marrone morOn/
+marroquin mor]kwEn
+marrou m@rU
+marrow m,r]
+marrs m)rz
+marrufo morUf]
+marrujo morUy]
+marry m,r/
+marrying m,r/6N
+mars m)rz
+mars' m)rz
+mars's m)rz@z
+marsal m)rs@l
+marsal morsol
+marsala morsol@
+marsalis m)rs@lis
+marsalis morsolis
+marsam m)rsam
+marsch m)rS
+marschalk m)rS{k
+marschall m)rS@l
+marschke m)rSk
+marschner m)rSnP
+marsden m)rsd~
+marsdon m)rsd~
+marse m)rs
+marseca morsek@
+marseca's morsek@z
+marsee m)rsE
+marseille morsIl
+marseilles morsIl@s
+marseilles morsIz
+marseka morsek@
+marsella morsel@
+marsh m)rS
+marsh's m)rS@z
+marsha m)rS@
+marshak m)rS@k
+marshal m)rS@l
+marshal's m)rS@lz
+marshaled m)rS@ld
+marshaling m)rS@l6N
+marshall m)rS@l
+marshall's m)rS@lz
+marshalled m)rS@ld
+marshalls m)rS{lz
+marshalltown m)rS@lt?n
+marshals m)rS@lz
+marshburn m)rSbVn
+marshes m)rS@z
+marshfield m)rSfEld
+marshland m)rSland
+marshlands m)rSlandz
+marshmallow m)rSmel]
+marshmallows m)rSmel]z
+marshman m)rSm~
+marshy m)rS/
+marsicano mors/kon]
+marsico morsEk]
+marsiglia morsigl/@
+marsili morsEl/
+marsisa morsis@
+marsisa's morsis@z
+marsland m)rsl~d
+marso m)rs]
+marsolek m)rs@lck
+marson m)rs~
+marsteller m)rztelP
+marsters m)rstPz
+marston m)rst~
+marsupial morsUp/@l
+marszalek mPSolck
+mart m)rt
+mart's m)rts
+marta m)rt@
+marte m)rt
+martech m)rtek
+martek m)rtek
+martel m)rtel
+martell m)rtel
+martella mortel@
+martelle mortel
+martelli mortel/
+martellini mortelEn/
+martello mortel]
+marten m)rt~
+marteney m)rt~/
+martens m)rt~z
+martens's m)rt~z@z
+martensen m)rt~s~
+martenson m)rt~s~
+marter m)rtP
+marth m)rT
+martha m)rT@
+martha's m)rT@z
+marthaler m)rT@lP
+marthe m)rT
+marthena m)rTcn@
+marti m)rt/
+martial m)rS@l
+martialed m)rS@ld
+martials m)rS@lz
+martian m)rS~
+martians m)rS~z
+martie m)rt/
+martin m)rt~
+martina mortEn@
+martindale m)rt~dAl
+martine mortEn
+martineau m)rt~O
+martinec m)rt~ck
+martinek m)rt~6k
+martines mortEnz
+martinez mortEncz
+martinez's mortEnez@z
+marting m)rt6N
+martingale m)rt6NAl
+martini mortEn/
+martinique mort~Ek
+martinis mortEn/z
+martinka mortiNk@
+martinko mortiNk]
+martino mortEn]
+martinovich mortin@v6C
+martins m)rtinz
+martins's m)rt~z
+martinsen mortins~
+martinson m)rt~s~
+martinsville m)rt~zvil
+martiny mortEn/
+martion m)rSy~
+martire mortir/
+martirosov mortir@sov
+martis m)rtis
+martita mortEt@
+martocci mortOC/
+marton m)rt~
+martone mortOn/
+martorana mort{ran@
+martorano mort{ron]
+martorelli mort{rel/
+marts m)rts
+martucci mortUC/
+marturano mortqron]
+martus m)rt@s
+marty m)rt/
+marty's m)rt/z
+martyn m)rtin
+martyr m)rtP
+martyrdom m)rtPd}
+martyre mortIr
+martyred m)rtPd
+martyrs m)rtPz
+martz m)rts
+martz's m)rts@z
+marubeni morUbEn/
+maruca mPUk@
+marucci morUC/
+marui mPU/
+marukin mPUk~
+marulanda marUland@
+marullo morUl]
+maruska mPusk@
+maruti mPUt/
+maruyama morUyom@
+maruyu m,rUyU
+marv m)rv
+marva m)rv@
+marvel m)rv@l
+marvel's m)rv@lz
+marvela morvAl@
+marveled m)rv@ld
+marvell morvel
+marvella morvel@
+marvelle morvel
+marvelous m)rv@l@s
+marvelously m)rv@l@sl/
+marvels m)rv@lz
+marver m)rvP
+marvin m)rvin
+marvin's m)rvinz
+marwick m)rwik
+marwick's m)rwiks
+marwin m)rwin
+marwood m)rwqd
+marx m)rks
+marxen m)rks~
+marxism m)rksiz}
+marxist m)rks@st
+marxists m)rks@s
+marxists m)rks@ss
+marxists m)rks@sts
+mary m,r/
+mary's m,r/z
+marya m)ry@
+maryann mcr/an
+maryanne mcr/an
+marybeth m,r/beT
+maryland m,r@l~d
+maryland's m,r@l~dz
+marylin mar@l~
+marylou mar/lU
+marymount m,r/m?nt
+marymount's m,r/m?nts
+maryruth mar6rUT
+maryse morEs
+marysville m,r/zvil
+maryville m,r/vil
+marz m)rz
+marzan m)rz~
+marzano morzon]
+marzec m)rz6k
+marzette morzet
+marzilli morzEl/
+marzo m)rz]
+marzolf m)rzOlf
+marzotto morzot]
+marzullo morzUl]
+mas moz
+masa mos@
+masaaki mosook/
+masahiko mosohEk]
+masahiro mosohir]
+masai moso/
+masakazu mosokozU
+masaki mosok/
+masako m@sok]
+masami mosom/
+masamilla mos}il@
+masao moso]
+masaru mos)rU
+masaya mosoy@
+masayoshi mosoyOS/
+masayuki mosoyUk/
+mascara mask,r@
+mascarena mak@rEn@
+mascarena maskP~@
+mascarenas mak@rEn@z
+mascarenas maskPin@z
+mascari mosk)r/
+mascaro mosk)r]
+masch maS
+maschino moskEn]
+maschke maSk
+masci mas/
+mascia mosC@
+masciarelli mosCPel/
+mascio mas/]
+mascioli mosCOl/
+masco mask]
+mascola moskOl@
+mascolo moskOl]
+mascorro mosk{r]
+mascot maskot
+mascots maskots
+masculine masky@l~
+masculinity masky@lin@t/
+masden masd~
+mase mAz
+masefield mAzfEld
+masek mosck
+masella m@sel@
+maselli m@sel/
+maseng mas6N
+maser mAzP
+maserati mascrot/
+maseri m@s,r/
+mash maS
+mashalu m@SalU
+mashantucket maS~tuk@t
+mashaw maS{
+mashburn maSbVn
+mashed maSt
+mashek maS6k
+masi mos/
+masiello mos/el]
+masin mosin
+masini mosEn/
+masino mosEn]
+masius mas/@s
+mask mask
+maske mAsk
+masked maskt
+maskell mask@l
+masker maskP
+masking mask6N
+masks masks
+maslanka m@slaNk@
+maslen mas@l~
+masley masl/
+maslin mazlin
+maslow mosl]
+maslowski m@sl{fsk/
+maslyukov maslyUkov
+masochism mas@kiz}
+masochist mas@k@st
+masochistic mas@kist6k
+mason mAs~
+mason's mAs~z
+masone m@sOn
+masoner mAs~P
+masonic m@son6k
+masonite mas~It
+masonry mAs~r/
+masons mAs~z
+masood m@sUd
+masoud m@sUd
+masquerade maskPAd
+masquerading maskPAd6N
+masri mosr/
+mass mas
+mass. mas
+mass. mas@CUs@ts
+massa mas@
+massachusetts mas@CUs@ts
+massachusetts' mas@CUs@ts
+massachussetts mas@CUs@ts
+massacre mas@kP
+massacred mas@kPd
+massacres mas6kPz
+massacring mas@kP6N
+massad mas@d
+massage m@soZ
+massaged m@soZd
+massager m@soZP
+massages m@soZ@z
+massaging m@soZ6N
+massar masP
+massari mos)r/
+massaro m@s)r]
+massbauch masbok
+masse mas
+massed mast
+massenburg mas~bPg
+massenet mas~et
+massenet's mas~ets
+massengale mas~gAl
+massengill mas~gil
+masser masP
+masses mas@z
+massett masct
+massey mas/
+massi mas/
+massicotte mas6k{t
+massie mas/
+massieu mas/U
+massif mas@f
+massif masEf
+massimino mos/mEn]
+massimino's mas}En]z
+massimo mas}O
+massing mas6N
+massingale mos6Ngol/
+massingill mas6Ng@l
+massive mas6v
+massively mas6vl/
+massman masm~
+massmann masm~
+massmutual masmyUCU@l
+masso mas]
+masson mas~
+massoni mosOn/
+massoth mas@T
+massport masp{rt
+massucci mosUC/
+mast mast
+mastandrea mostondr/@
+mastectomies mastekt}/z
+mastectomy mastekt}/
+masted mast@d
+mastel mAst@l
+masteller mAst@lP
+masten mast~
+master mastP
+master's mastPz
+mastercard mastPkord
+mastercard's mastPkordz
+mastercards mastPkordz
+mastered mastPd
+masterful mastPf@l
+masterfully mastPf@l/
+mastergate mastPgAt
+mastering mastP6N
+masterly mastPl/
+masterman mastPm~
+mastermind mastPmInd
+masterminded mastPmInd@d
+masterminding mastPmInd6N
+masterminds mastPmIndz
+masterpiece mastPpEs
+masterpieces mastPpEs@z
+masters mastPz
+masters' mastPz
+masterson mastPs~
+masterstroke mastPstrOk
+masterwork mastPwVk
+masterworks mastPwVks
+mastery mastP/
+masthead masthed
+mastif mast@f
+mastif's mast@fs
+mastiff mast@f
+mastifs mast@fs
+mastin mastin
+mastodon mast@d{n
+mastoiditis mast<dIt@s
+maston mast~
+mastrangelo mostroNgel]
+mastrianni mostr/on/
+mastriano mostr/on]
+mastrich mastr6C
+mastrich mostr6k
+mastrich's mastr6C@z
+mastrich's mostr6ks
+mastro mastr]
+mastrocola mastr]kOl@
+mastrogiovanni mastr]j]von/
+mastroianni mastr]yon/
+mastronardi mastr]n)rd/
+mastropietro mastr]pEtr]
+masts mass
+masts masts
+masturbate mastPbAt
+masturbated mastPbAt@d
+masturbates mastPbAts
+masturbating mastPbAt6N
+masturbation mastPbAS~
+masucci mosUC/
+masuda m@sUd@
+masullo mosUl]
+masur masP
+mat mat
+mata mot@
+matabane mat@bAn
+matador mat@d{r
+matagorda mat@g{rd@
+mataksas m@taks@s
+matala m@tol@
+matala's m@tol@z
+matalin mat@lin
+matalin matlin
+matalon motol{n
+matamoros motom{r]s
+matarazzo motoroz]
+matarese motorAz/
+matas mot@z
+matassa motos@
+mataya motoy@
+match maC
+match's maC@z
+matchbook maCbqk
+matchbox maCboks
+matched maCt
+matches maC@z
+matchett maCct
+matching maC6N
+matchlock maClok
+matchlocks maCloks
+matchmaker maCmAkP
+matchmakers maCmAkPz
+matchmaking maCmAk6N
+matchup maC@p
+matchups maC@ps
+mate mAt
+matecki m@tek/
+mated mAt@d
+mateer m@tir
+mateja motAy@
+matejka m@tAk@
+matell m@tel
+matelski m@telsk/
+mateo motA]
+mater mAtP
+mater matP
+mater motP
+matera mot,r@
+material m@tir/@l
+materialism m@tir/@liz}
+materialist m@tir/@l@st
+materialistic m@tir/@list6k
+materiality m@tir/al@t/
+materialize m@tir/@lIz
+materialized m@tir/@lIzd
+materializes m@tir/@lIz@z
+materializing m@tir/@lIz6N
+materially m@tir/@l/
+materials m@tir/@lz
+materials' m@tir/@lz
+materiel m@tir/el
+materiels m@tir/elz
+matern matPn
+materna mot,rn@
+maternal m@tVn@l
+maternity m@tVn@t/
+mates mAts
+matewan mAtwon
+matewan matUon
+matey mAt/
+math maT
+mathai moTo/
+mathan mAT~
+mathe mAT
+mathea maT/@
+matheis maTIz
+mathematic maT}at6k
+mathematical maT}at6k@l
+mathematically maT}at6k@l/
+mathematically maT}at6kl/
+mathematician maT}@tiS~
+mathematicians maT}@tiS~z
+mathematics maT}at6ks
+mathena maT~@
+matheney maT~/
+matheny maT~/
+mather maTP
+matherly maTPl/
+mathern maTPn
+matherne maTPn
+mathers maTPz
+matherson maTPs~
+mathes maT@s
+matheson maT@s~
+matheson's maT@s~z
+matheus maT<z
+mathew maTyU
+mathews maTyUz
+mathewson maTyUs~
+mathey maT/
+mathia moT/@
+mathias m@TI@s
+mathiasen m@TI@s~
+mathiason m@TI@s~
+mathie maT/
+mathies maT/z
+mathiesen maT/s~
+mathieson m@TEz~
+mathieu maTyU
+mathilda m@tild@
+mathilde maTild
+mathis maTis
+mathisen maTIz~
+mathison maTis~
+mathur maTP
+mathwig maTw6g
+mathy maT/
+mathys mAT/z
+matias moS@z
+matic mat6k
+matif motEf
+matilda m@tild@
+matinee mat~A
+mating mAt6N
+mation mAS~
+mation maty~
+matis motis
+matisse m@tEs
+matisse's m@tEs@z
+matkin matkin
+matkins matkinz
+matkovich motk@v6C
+matlack matlak
+matlick matl6k
+matlin matlin
+matlock matlok
+matney matn/
+mato mot]
+matola m@tOl@
+matos mot]z
+matott mat@t
+matousek m@tUsck
+matra matr@
+matra's matr@z
+matranga motroNg@
+matriarch mAtr/ork
+matriarchal mAtr/)rk@l
+matriarchy mAtr/ork/
+matrilineal matr@lin/@l
+matrimonial matr}On/@l
+matrimony matr}On/
+matrix mAtr6ks
+matrix's mAtr6ks@z
+matron mAtr~
+matronly mAtr~l/
+matrons mAtr~z
+mats mats
+matsapa matsop@
+matsch maC
+matsen mots~
+matsko motsk]
+matson mots~
+matsu-ya matsUy@
+matsubara motsUb)r@
+matsuda motsUd@
+matsui motsU/
+matsukawa motsUkow@
+matsumoto motsUmOt]
+matsumura motsUmqr@
+matsunaga motsUnog@
+matsuo motsU]
+matsuoka motsUOk@
+matsushita motsUS/t@
+matsushita motsUSEt@
+matsushita's motsUS/t@z
+matsushita's motsUSEt@z
+matsuura motsUqr@
+matt mat
+matt's matz
+matta mat@
+matte mat
+mattea maS@
+mattei matI
+matteis m@tIs
+mattel m@tel
+mattel's m@telz
+matteo motA]
+matter matP
+matter's matPz
+mattera mot,r@
+matterease m@trEz/
+matterease matPEz
+mattered matPd
+mattern matPn
+matters matPz
+mattes mats
+matteson mat@s~
+matteucci motUC/
+matthau math?
+matthausen math?z~
+matthea matT/@
+mattheis matTIz
+matthes mat@z
+matthew maTyU
+matthew's maTyUz
+matthews maTyUz
+matthews's maTyUz@z
+matthewson maTyUs~
+matthey matT/
+matthia motT/@
+matthias m@TI@s
+matthies maT/z
+matthiesen maT/s~
+matthis maTis
+matthys maT/z
+mattias maS@z
+mattice motis
+mattick mat6k
+mattie mat/
+mattikalli matikol/
+mattila motEl@
+mattina motEn@
+matting mat6N
+mattingley mat6Ngl/
+mattingly mat6Nl/
+mattioli mot/Ol/
+mattis matis
+mattison mat@s~
+mattke matk/
+mattocks mat@ks
+matton mat~
+mattoon m@tUn
+mattos mat]z
+mattox mat@ks
+mattox matoks
+mattress matr@s
+mattress's matr@s@z
+mattresses matr@s@z
+matts mats
+mattson mats~
+mattucci motUC/
+matty mat/
+matula motUl@
+matulich m@tyUlih
+matulis mat@l@s
+maturation maCPAS~
+maturation maCqrAS~
+mature m@Cqr
+mature m@tyqr
+matured m@tyqrd
+matures m@Cqrz
+matures m@tyqrz
+maturing m@Cqr6N
+maturing m@tyqr6N
+maturities m@Cqr@t/z
+maturity m@Cqr@t/
+maturity m@tyqr@t/
+maturo motqr]
+matus mat@s
+matuschka m@tuSk@
+matusek m@tUsck
+matusi m@tUs/
+matusiak m@tus/ak
+matusik m@tUs6k
+matuska m@tusk@
+matussi m@tUs/
+matuszak m@tuS@k
+matuszewski m@tuSefsk/
+matyas maty@s
+matz mats
+matza motz@
+matzek matz6k
+matzen matz~
+matzinger mAtz6NP
+matzke matsk/
+matzner matsnP
+matzu matzU
+mau m?
+mau mO
+mauceri m{C,r/
+mauch m{C
+maucher m?CP
+maucher mokP
+mauck m{k
+maud m{d
+maude m{d
+maudlin m{dlin
+maue m?/
+mauer m?P
+mauger m{gP
+maugeri m{j,r/
+maughan m{g~
+maui m?/
+mauk m{k
+maul m{l
+maulden m?ld~
+mauldin m?ld~
+maulding m{ld6N
+maule m{l
+mauled m{ld
+mauler m{lP
+maull m{l
+maulsby m{lsb/
+mault m{lt
+maultasch m{ltaS
+maultsby m{ltsb/
+maumee m?m/
+mauna m{n@
+maund m{nd
+maundering m{ndP6N
+maunderings m{ndP6Nz
+maune m{n
+mauney m{n/
+maung m{N
+maupin m]pan
+maura m{r@
+maura's m{r@z
+maureen m{rEn
+maurer m{rP
+mauri m{r/
+maurice m{r@s
+maurice m{rEs
+maurice's m{r@s@z
+maurice's m{rEs@z
+mauricio m?rEs/]
+maurie m{r/
+mauriello m{r/el]
+maurin m{rin
+maurine m{rEn/
+maurita m{rEt@
+mauritania m{r@tAn/@
+mauritania m{r@tAny@
+mauritius m{rit/@s
+mauritz m{rits
+maurizio m{riz/]
+mauro m{r]
+maurus m{r@s
+maury m{r/
+maus m{z
+mauser m?sP
+mausoleum m{s@lE}
+mausolf m?s]lf
+mauss m{s
+mausser m?sP
+maust m{st
+maute m{t
+mauthe m{T
+mautner m{tnP
+mautz m{ts
+mauve m{v
+mauzey m{z/
+mauzy m{z/
+mavarach m@v)r@C
+mave mAv
+maven mAv~
+maven's mAv~z
+mavens mAv~z
+maverick mavP6k
+maverick mavr6k
+maverick's mavP6ks
+maverick's mavr6ks
+mavericks mavP6ks
+mavericks mavr6ks
+maverix mavP6ks
+maves mAvz
+mavis mAvis
+mavrodi mavrOd/
+mavroules mavrUlz
+maw m{
+mawhinney mawin/
+mawkish m{k6S
+mawr m)r
+mawr m{P
+mawson m{s~
+mawyer m{/P
+max maks
+max's maks@z
+maxa maks@
+maxam maks}
+maxcy maks/
+maxed makst
+maxell maksel
+maxey maks/
+maxfield maksf/ld
+maxham maks}
+maxi maks/
+maxicare maks/k,r
+maxie maks/
+maxilla maksil@
+maxim maks}
+maxima maks}@
+maximal maks}@l
+maxime maksEm
+maximilian maks}il/~
+maximization maks}@zAS~
+maximize maks}Iz
+maximized maks}Izd
+maximizes maks}Iz@z
+maximizing maks}Iz6N
+maxims maks}z
+maximum maks}}
+maxine maksEn
+maxion maks/on
+maxis maks/z
+maxon maks~
+maxpharma maksf)rm@
+maxsaver maksAvP
+maxsavers maksAvPz
+maxson maks~
+maxton makst~
+maxtor makstP
+maxus maks@s
+maxus's maks@s@z
+maxwell makswel
+maxwell's makswelz
+maxx maks
+maxxam maks}
+maxxim maksim
+maxy maks/
+maxzide maksEt@
+may mA
+may's mAz
+maya mI@
+mayall mA{l
+mayan mI~
+mayans mI~z
+maybe mAb/
+maybee mAbE
+maybelle mAbel
+maybelline mAb@lEn
+mayben mAb~
+mayberry mAber/
+maybin mAbin
+maybury mAber/
+maycock mAkok
+mayda mAd@
+mayday mAdA
+mayde mAd
+mayden mAd~
+maydena mAd~@
+maye mA
+mayeaux mA]
+mayeda mIEd@
+mayer mAP
+mayer's mAPz
+mayernik mAVn6k
+mayers mAPz
+mayerson mAPs~
+mayes mAz
+mayeux mAO
+mayfair mAfer
+mayfield mAfEld
+mayflower mAfl?P
+mayhall mAh{l
+mayhan mA~
+mayhem mAhem
+mayher mAP
+mayhew mAhyU
+mayhue mAhyU
+mayhugh mAh@
+mayland mAl~d
+mayle mAl
+mayle mAl/
+mayme mAm
+maynard mAnPd
+maynard's mAnPdz
+mayne mAn
+mayner mAnP
+maynes mAnz
+maynor mAnP
+mayo mA]
+mayon mA{n
+mayonnaise mA~Az
+mayor mAP
+mayor's mAPz
+mayoral mAP@l
+mayoralty mAP@lt/
+mayorga mA{rg@
+mayors mAPz
+mayotte mA{t
+mayr mAr
+mays mAz
+mays' mAz
+mayse mAz
+mayson mAz~
+maytag mAtag
+mayton mAt~
+mayville mAvil
+mayweather mAweTP
+maz moz
+maza moz@
+mazaitis m@zIt@s
+mazanec m@zan6k
+mazankowski maz@Nk?sk/
+mazda mazd@
+mazda mozd@
+mazda's mazd@z
+mazda's mozd@z
+maze mAz
+mazeika m@zIk@
+mazeltov moz@ltof
+mazer mAzP
+mazes mAz@z
+maziarz m@zEPz
+mazie mAz/
+mazo moz]
+mazola m@zOl@
+mazon moz{n
+mazor moz{r
+mazowiecki m@zO/ek/
+mazur mazP
+mazurek m@zyUrck
+mazurkas m@zVk@z
+mazurkiewicz m@zVk@v6C
+mazurowski m@zP{fsk/
+mazyck maz6k
+mazza maz@
+mazzaferro maz@f,r]
+mazzanti motsont/
+mazzara mots)r@
+mazzarella motsorel@
+mazzei motsA/
+mazzella motsel@
+mazzeo maz/]
+mazzetti motset/
+mazzie maz/
+mazziotti mots/Ot/
+mazzo maz]
+mazzocchi motsOk/
+mazzocco motsOk]
+mazzola motsOl@
+mazzola's motsOl@z
+mazzoli m@zOl/
+mazzolla m@zOl@
+mazzone motsOn/
+mazzoni motsOn/
+mazzorana mazPon@
+mazzotta motsOt@
+mazzuca motsUk@
+mazzucco motsUk]
+mbank embaNk
+mbeki cmbek/
+mbeki mbek/
+mbeki }bek/
+mc emsE
+mc m6k
+mcabee m@kab/
+mcabee mak@b/
+mcadam m@kad}
+mcadams m@kad}z
+mcadoo mak@dU
+mcadory m@kadP/
+mcadow m@kad]
+mcafee m@kafE
+mcafee mak@fE
+mcaffee m@kafE
+mcaffee mak@f/
+mcafferty m@kafPt/
+mcaleer mak@l6r
+mcaleese mak@l/z
+mcalexander m@kal6gzandP
+mcalinden m@klind~
+mcalister m@kal@stP
+mcallen m@k{l~
+mcallister m@kal@stP
+mcaloon mak@lUn
+mcalpin m@kalp~
+mcalpine m@kalpIn
+mcamis m@kam@s
+mcan m@kan
+mcanally mak~al/
+mcanany m@kan~/
+mcandrew m@kandrU
+mcandrews m@kandrUz
+mcanelly mak~al/
+mcaninch m@kaninC
+mcannally mak~al/
+mcanulty mak~@lt/
+mcardle m@k)rd@l
+mcarthur m@k)rTP
+mcartor m@k)rtP
+mcatee m@kat/
+mcateer mak@tir
+mcaulay m@k{lA
+mcauley m@k{l/
+mcauliff m@k{l@f
+mcauliffe m@k{l@f
+mcavity m@kav@t/
+mcavoy mak@v<
+mcbain m@kbAn
+mcbane m@kbAn
+mcbay m@kbA
+mcbean m@kbEn
+mcbeath m@kbeT
+mcbee m@kbE
+mcbeth m@kbeT
+mcbirney m@kbVn/
+mcbrayer m@kbrAP
+mcbrearty m@kbrirt/
+mcbreen m@kbrEn
+mcbride m@kbrId
+mcbridge m@kbrij
+mcbrien m@kbrI~
+mcbroom m@kbrUm
+mcbryar m@kbrIP
+mcbryde m@kbrId
+mcburnett m@kbVn@t
+mcburney m@kbVn/
+mccaa m@ko
+mccabe m@kAb
+mccabe mak@b/
+mccadden m@kad~
+mccade m@kAd
+mccafferty m@kafPt/
+mccaffery m@kafr/
+mccaffrey m@kafr/
+mccaghren m@kagr~
+mccague m@kAg
+mccahan m@kan
+mccahill m@kohil
+mccaig m@kAg
+mccain m@kAn
+mccain's m@kAnz
+mccaleb m@kAl@b
+mccalip m@kalip
+mccalister m@kal@stP
+mccall m@k{l
+mccall's m@k{lz
+mccalla m@kal@
+mccallen m@k{l~
+mccalley m@kal/
+mccallie m@k{l/
+mccallion m@kaly~
+mccallister m@kal@stP
+mccallon m@kal~
+mccallum m@kal}
+mccalmont m@kalm~t
+mccamant m@kam~t
+mccambridge m@kAmbrij
+mccambridge m@kambrij
+mccamey m@kam/
+mccamish m@kam6S
+mccammon m@kam~
+mccampbell m@kampb@l
+mccamy m@kAm/
+mccan m@kan
+mccance m@kans
+mccandless m@kandl@s
+mccandlish m@kandl6S
+mccane m@kAn
+mccanless m@kanl@s
+mccann m@kan
+mccann's m@kanz
+mccanna m@kan@
+mccannon m@kan~
+mccants m@kants
+mccard m@k)rd
+mccardell m@k)rd@l
+mccardle m@k)rd@l
+mccarey m@kar/
+mccargar m@k)rgP
+mccargo m@k)rg]
+mccarl m@k)rl
+mccarley m@k)rl/
+mccarn m@k)rn
+mccarney m@k)rn/
+mccarran m@k,r~
+mccarrell m@kar@l
+mccarren m@k,r~
+mccarrick m@kar6k
+mccarroll m@kar@l
+mccarron m@kar~
+mccarry m@kar/
+mccarson m@k)rs~
+mccart m@k)rt
+mccartan m@k)rt~
+mccarten m@k)rt~
+mccarter m@k)rtP
+mccartha m@k)rT@
+mccarthy m@k)rT/
+mccarthy's m@k)rT/z
+mccarthyism m@k)rT/iz}
+mccarthyite m@k)rT/It
+mccartin m@k)rt~
+mccartney m@k)rtn/
+mccartt m@k)rt
+mccarty m@k)rt/
+mccarver m@k)rvP
+mccarville m@korv@l
+mccary mEkcr/
+mccaskey m@kask/
+mccaskill m@kask@l
+mccasland m@kazl~d
+mccaslin m@kazl~
+mccaughan m@k{n
+mccaughey m@k{/
+mccaul m@k{l
+mccauley m@k{l/
+mccaulley m@k{l/
+mccausland m@k{zl~d
+mccauslin m@k{zl~
+mccauthy m@k?T/
+mccaw m@k{
+mccaw's m@k{z
+mccawley m@k{l/
+mccay m@kA
+mcchesney m@kCezn/
+mcchristian m@krisC~
+mcclafferty m@klafPt/
+mcclaflin m@klafl~
+mcclain m@klAn
+mcclaine m@klAn
+mcclam m@klam
+mcclanahan m@klan@han
+mcclane m@klAn
+mcclaran m@klar~
+mcclard mEklPd
+mcclaren m@kl,r~
+mcclarnon m@kl)rn~
+mcclarty m@kl)rt/
+mcclary m@kl,r/
+mcclaskey m@klask/
+mcclatchey m@klaC/
+mcclatchy m@klaC/
+mcclaugherty m@klafPt/
+mcclave m@klAv
+mcclay m@klA
+mccleaf m@klEf
+mcclean m@klEn
+mccleary m@klir/
+mccleary's m@klir/z
+mccleave m@klEv
+mccleery m@klir/
+mcclees m@klEz
+mccleese m@klEs
+mcclellan m@klel~
+mcclelland m@klel~d
+mcclellen m@klel~
+mcclements m@klem~ts
+mcclenaghan m@klen@g~
+mcclenahan m@klen@han
+mcclenathan m@klen@T~
+mcclendon m@klAnd~
+mcclenny m@klen/
+mccleskey m@klesk/
+mcclimans m@klIm~z
+mcclimans m@klim~z
+mcclintic m@klint6k
+mcclintick m@klint6k
+mcclintock m@glintok
+mcclinton m@klint~
+mcclish m@kliS
+mcclory m@kl{r/
+mccloskey m@kl{sk/
+mcclosky m@kl{sk/
+mccloud m@kl?d
+mccloy m@kl<
+mccluer m@klUr
+mcclune m@klUn
+mccluney m@klUn/
+mcclung m@kluN
+mcclure m@klUr
+mcclurg m@klVg
+mcclurkin m@klVk~
+mccluskey m@klusk/
+mccoig m@k<g
+mccoin m@k<n
+mccole m@kOl
+mccolgan m@kOlg~
+mccoll m@kOl
+mccollam m@kol}
+mccolley m@kol/
+mccollister m@kol@stP
+mccolloch m@kol@k
+mccollom m@kol}
+mccollough m@kol?
+mccollough m@kol@
+mccollum m@k{l}
+mccolm m@kOm
+mccomas m@kOm@s
+mccomb m@kOm
+mccomber m@kOmP
+mccomber m@kOmbP
+mccombie m@kOm/
+mccombie m@kOmb/
+mccombs m@komz
+mccommon m@kom~
+mccommons m@kom~z
+mccomsey m@koms/
+mcconaghy m@kon@g/
+mcconaha m@kon@ho
+mcconahay m@kon@hA
+mcconahy m@kon@h/
+mcconathy m@kon@T/
+mcconathy mak~aT/
+mcconaughey m@kon@gA
+mcconaughy m@kon@g/
+mccone m@kOn
+mcconico m@kon@k]
+mcconkey m@koNk/
+mcconn m@kon
+mcconnaughey m@kon@gA
+mcconnel m@kon@l
+mcconnel's m@kon@lz
+mcconnell m@kon@l
+mcconnon m@kon~
+mcconville m@konvil
+mccooey m@kU/
+mccook m@kqk
+mccool m@kUl
+mccord m@k{rd
+mccorkel m@k{rk@l
+mccorkell m@k{rk@l
+mccorkindale m@k{rk~dAl
+mccorkle m@k{rk@l
+mccormac m@k{rm@k
+mccormack m@k{rm@k
+mccormick m@k{rm6k
+mccormick's m@k{rm6ks
+mccorquodale m@k{rk@dAl
+mccorry m@k{r/
+mccort m@k{rt
+mccorvey m@k{rv/
+mccosh m@koS
+mccoskey m@kosk/
+mccotter m@kotP
+mccoun m@k?n
+mccourt m@k{rt
+mccowan m@k?~
+mccowen m@k?~
+mccowin m@k?in
+mccown m@k?n
+mccoy m@k<
+mccoys m@k<z
+mccracken m@krak~
+mccrackin m@krak~
+mccrady m@krAd/
+mccrae m@krA
+mccraney m@kran/
+mccranie m@krAn/
+mccrary m@kr,r/
+mccravy m@krAv/
+mccraw m@kr{
+mccray m@krA
+mccrea m@krA
+mccreadie m@krEd/
+mccready m@krEd/
+mccreary m@krir/
+mccredie m@krEd/
+mccree m@krE
+mccreedy m@krEd/
+mccreery m@krir/
+mccreight m@krAt
+mccreless m@krEl@s
+mccrickard m@krikPd
+mccright m@krIt
+mccrillis m@kril@s
+mccrimmon m@krim~
+mccrocklin m@krokl~
+mccrone m@krOn
+mccrorey m@kr{r/
+mccrory m@kr{r/
+mccroskey m@krosk/
+mccrossen m@kr{s~
+mccrudden m@krud~
+mccrum m@krum
+mccrumb m@krum
+mccrystal m@krist@l
+mccuan m@kU~
+mccubbin m@kub~
+mccubbins m@kub~z
+mccue m@kyU
+mccuen m@kyUn
+mccuin m@kU~
+mccuistion m@kwiS~
+mccuiston m@kwist~
+mcculla m@kul@
+mccullagh m@kul@g
+mccullah m@kul@
+mccullar m@kulP
+mccullars m@kulPz
+mccullen m@kul~
+mcculler m@kulP
+mccullers m@kulPz
+mcculley m@kul/
+mcculloch m@kul@k
+mcculloh m@kul@
+mccullough m@kul@
+mccullum m@kul}
+mccully m@kul/
+mccumber m@kumbP
+mccune m@kyUn
+mccur m@kV
+mccurdy m@kVd/
+mccurley m@kVl/
+mccurry m@kV/
+mccusker m@kuskP
+mccutchan m@kuC~
+mccutchen m@kuC~
+mccutcheon m@kuC~
+mccuvey m@kuv/
+mcdade m@kdAd
+mcdade's m@kdAdz
+mcdaid m@kdAd
+mcdanel m@kdan@l
+mcdaniel m@kdany@l
+mcdaniels m@kdany@lz
+mcdannel m@kdan@l
+mcdaris m@kdar@s
+mcdavid m@kdAv@d
+mcdavitt m@kdav@t
+mcdeal m@kdEl
+mcdearmon m@kdVm~
+mcdermid m@kdVm@d
+mcdermitt m@kdVm@t
+mcdermot m@kdVm@t
+mcdermott m@kdVm@t
+mcdermott's m@kdVm@ts
+mcdevitt m@kdev@t
+mcdiarmid m@kd,rm@d
+mcdill m@kdil
+mcdivett m@div@t
+mcdivitt m@kdiv@t
+mcdole m@kdOl
+mcdonagh m@kdun@
+mcdonald m@kdon@ld
+mcdonald's m@kdon@ldz
+mcdonalds m@kdon@ldz
+mcdonell m@kdon@l
+mcdonnel m@kdon@l
+mcdonnel's m@kdon@lz
+mcdonnell m@kdon@l
+mcdonough m@kdun@
+mcdorman m@kd{rm~
+mcdougal m@kdUg@l
+mcdougal's m@kdUg@lz
+mcdougald m@kdUg@ld
+mcdougall m@kdUg@l
+mcdougals m@kdUg@lz
+mcdougals' m@kdUg@lz
+mcdougle m@kdUg@l
+mcdow m@kd?
+mcdowall m@kd?@l
+mcdowell m@kd?@l
+mcduff m@kduf
+mcduffee m@kduf/
+mcduffie m@kduf/
+mcduffy m@kduf/
+mcdugal m@kdUg@l
+mcdurman m@kdVm~
+mceachern m@kECPn
+mceachin m@kEC~
+mcelderry mak@ldir/
+mceldowney mak@ld?n/
+mcelfresh mak@lfreS
+mcelhaney mak@lhAn/
+mcelhannon mak@lhan~
+mcelhany mak@lhAn/
+mcelheney mak@lhAn/
+mcelheny mak@lhEn/
+mcelhiney mak@lhin/
+mcelhinney mak@lhin/
+mcelhinny mak@lhin/
+mcelhone mak@lhOn
+mcelligott m@kel@g@t
+mcelmurray mak@lmV/
+mcelmurry mak@lmVr/
+mcelrath m@kelraT
+mcelrath mak@lraT
+mcelravy mak@lrAv/
+mcelreath mak@lraT
+mcelroy mak@lr<
+mcelvain mak@lvAn
+mcelvaine mak@lvAn
+mcelveen mak@lvEn
+mcelwain mak@lwAn
+mcelwaine mak@lwAn
+mcelwee mak@lw/
+mcelyea mak@lyA
+mcenaney mak~An/
+mcenany mak~An/
+mcendree m@kendrE
+mcenerney mak~crn/
+mcenery m@kenP/
+mcenroe mak~r]
+mcentee m@kent/
+mcentee mak~t/
+mcentire mak~tIr
+mcentyre mak~tIr
+mcerlean m@kVl/n
+mceuen m@kyU~
+mcever m@kevP
+mcevers m@kevPz
+mcevilly m@kev@l/
+mcevoy mak@v<
+mcewan makUan
+mcewen m@kyU~
+mcfadden m@kfad~
+mcfadden's m@kfad~z
+mcfaddin m@kfad~
+mcfadin m@kfad~
+mcfadyen m@kfad/~
+mcfall m@kf{l
+mcfalland m@kfal~d
+mcfalls m@kf{lz
+mcfann m@kfan
+mcfarlan m@kf)rl~
+mcfarland m@kf)rl~d
+mcfarlane m@kf)rl~
+mcfarlane's m@kf)rl~z
+mcfarlin m@kf)rl~
+mcfarling m@kf)rl6N
+mcfarren m@kf,r~
+mcfate m@kfAt
+mcfatridge m@kfatr6j
+mcfatter m@kfatP
+mcfaul m@kf{l
+mcfayden m@kfAd~
+mcfee m@kfE
+mcfeely m@kfEl/
+mcfeeters m@kfEtPz
+mcferran m@kf,r~
+mcferren m@kf,r~
+mcferrin m@kf,r~
+mcferron m@kf,r~
+mcfetridge m@kfetr6j
+mcfly m@kflI
+mcfly's m@kflIz
+mcfun m@kfun
+mcfun's m@kfunz
+mcgaffey m@gaf/
+mcgagh m@g{
+mcgaha m@goh@
+mcgahan m@gah~
+mcgahee m@gah/
+mcgahey m@gah/
+mcgalley m@gal/
+mcgalley's m@gal/z
+mcgalliard m@gal/ord
+mcgalliard m@galyord
+mcgann m@gan
+mcgannon m@gan~
+mcgarity m@gar@t/
+mcgarr m@g)r
+mcgarrah m@gar@
+mcgarrigle m@gar@g@l
+mcgarrity m@gar@t/
+mcgarry m@g,r/
+mcgarvey m@gorvA
+mcgary m@g,r/
+mcgath m@gaT
+mcgaugh m@g{
+mcgaughey m@g{/
+mcgaughy m@g{/
+mcgauley m@g{l/
+mcgavin m@gav~
+mcgavock m@gav@k
+mcgaw m@g{
+mcgeachy m@gEC/
+mcgeary m@gir/
+mcgee m@gE
+mcgee's m@gEz
+mcgeean m@gE~
+mcgeean's m@gE~z
+mcgeehan m@gEh~
+mcgeever m@gEvP
+mcgegan m@geg~
+mcgeorge m@kj{rj
+mcgeough m@guf
+mcgettigan m@get@g~
+mcghee m@gE
+mcghie m@gE
+mcgibbon m@gib~
+mcgill m@gil
+mcgillen m@gil~
+mcgillicuddy m@gil@k@d/
+mcgillis m@gil@s
+mcgillivray m@gil@vrA
+mcgilton m@gilt~
+mcgilvery m@gilvP/
+mcgilvray m@gilvr/
+mcginess m@gin@s
+mcginley m@ginl/
+mcginn m@gin
+mcginnes m@ginz
+mcginness m@gin@s
+mcginnis m@gin@s
+mcginniss m@gin@s
+mcginnity m@gin@t/
+mcginty m@gint/
+mcgirr m@gV
+mcgirt m@gVt
+mcgivern m@givPn
+mcgivney m@givn/
+mcglade m@glAd
+mcglamery m@glamP/
+mcglashan m@glaS~
+mcglasson m@glas~
+mcglaughlin m@gl{fl~
+mcglaun m@gl{n
+mcglinchey m@glinC/
+mcglinn m@glin
+mcglocklin m@glokl~
+mcgloin m@gl<n
+mcglone m@glOn
+mcglory m@gl{r/
+mcglothen m@gloT~
+mcglothin m@gloT~
+mcglothlin m@gloTl~
+mcglynn m@glin
+mcgoey m@go/
+mcgoff m@g{f
+mcgoldrick m@gOldr@k
+mcgols m@kgolz
+mcgonagle m@gon@g@l
+mcgonigal m@gon@g@l
+mcgonigle m@gon@g@l
+mcgough m@g?
+mcgough m@guf
+mcgourty m@gqrt/
+mcgovern m@guvPn
+mcgovern's m@guvPnz
+mcgowan m@g?~
+mcgowan's m@g?~z
+mcgowen m@g?~
+mcgowin m@kg?~
+mcgown m@g?n
+mcgrady m@grAd/
+mcgrail m@grAl
+mcgrain m@grAn
+mcgranahan m@gran@han
+mcgrane m@grAn
+mcgrath m@graT
+mcgraw m@gr{
+mcgray m@grA
+mcgreal m@grEl
+mcgreevey m@grEv/
+mcgreevy m@grEv/
+mcgregor m@gregP
+mcgregory m@gregP/
+mcgrevin m@grev~
+mcgrew m@grU
+mcgriff m@grif
+mcgroarty m@gr{rt/
+mcgrogan m@grOg~
+mcgrory m@gr{r/
+mcgruder m@grUdP
+mcguane m@gwAn
+mcguckin m@guk~
+mcgue m@gyU
+mcguffee m@guf/
+mcguffey m@guf/
+mcguffie m@guf/
+mcguffin m@guf~
+mcguigan m@gig~
+mcguiness m@gin@s
+mcguinn m@gin
+mcguinness m@gin@s
+mcguire m@gwIr
+mcguirk m@gVk
+mcguirt m@gVt
+mcgurk m@gVk
+mcgurn m@gVn
+mcguyer m@gIP
+mcgwire m@gwIr
+mchaffie m@kaf/
+mchale m@kAl
+mcham m@kam
+mchan m@kan
+mchaney m@kan/
+mchargue m@k)rg
+mchargue m@k)rgyU
+mchatton m@kat~
+mchenry m@kenr/
+mchone m@kOn
+mchugh m@kyU
+mcilhenny makilhen/
+mcilrath m@kilraT
+mcilrath mak@lraT
+mcilroy m@kilr<
+mcilroy mak@lr<
+mcilvain m@kilvAn
+mcilvain makilvAn
+mcilvaine m@kilvAn
+mcilvaine makilvAn
+mcilveen m@kilvEn
+mcilveen makilvEn
+mcilwain m@kilwAn
+mcilwain makilwAn
+mcinerney mak~crn/
+mcinerny m@kinPn/
+mcingvale mak6NvAl
+mcinnes m@gin@s
+mcinnis m@gin@s
+mcinroy makinr<
+mcintee makintE
+mcintire makintIr
+mcintosh mak~t{S
+mcinturf makintVf
+mcinturff makintVf
+mcintyre makintIr
+mcinvale makinvAl
+mcisaac m@kIz@k
+mciver m@kivP
+mcivor m@kivP
+mcjunkin m@kjuNk~
+mcjunkins m@kjuNk~z
+mckaig m@kAg
+mckain m@kAn
+mckamey m@kam/
+mckane m@kAn
+mckanna m@kan@
+mckay m@kA
+mckeag m@kEg
+mckeague m@kEg
+mckean m@kEn
+mckeand m@kEnd
+mckechnie m@kekn/
+mckee m@kE
+mckee's m@kEz
+mckeegan m@kEg~
+mckeehan m@kEh~
+mckeel m@kEl
+mckeeman m@kEm~
+mckeen m@kEn
+mckeesport m@kEsp{rt
+mckeever m@kEvP
+mckeithan m@kET~
+mckeithen m@kET~
+mckell m@kel
+mckellan m@kel~
+mckellar m@kelP
+mckeller m@kelP
+mckellips m@kel@ps
+mckelvey mak@lvA
+mckelvie mak@lvE
+mckelvy mak@lvE
+mckemie m@kem/
+mckendree m@kendr/
+mckendrick m@kendr6k
+mckendry m@kendr/
+mckenna m@ken@
+mckenney m@ken/
+mckennon m@ken~
+mckenny m@ken/
+mckenrick m@kenr6k
+mckenzie m@kenz/
+mckeon m@kE~
+mckeone m@kE~
+mckeough m@kE]
+mckeown m@kyU~
+mckercher m@kVCP
+mckern m@kVn
+mckernan m@kVn~
+mckesson m@kes~
+mckesson's m@kes~z
+mckethan m@keT~
+mckevitt m@kev@t
+mckey m@kE
+mckibben m@kib~
+mckibbin m@kib~
+mckibbon m@kib~
+mckids m@kidz
+mckie m@kE
+mckiernan m@kirn~
+mckillip m@kil@p
+mckillop m@kil@p
+mckim m@kim
+mckimmey m@kim/
+mckimmy m@kim/
+mckiness m@kin@s
+mckinlay m@kinl/
+mckinley m@kinl/
+mckinney m@kin/
+mckinney's m@kin/z
+mckinnie m@kin/
+mckinnis m@kin@s
+mckinnon m@kin~
+mckinny m@kin/
+mckinny's m@kin/z
+mckinsey m@kinz/
+mckinstry m@kinstr/
+mckinzie m@kinz/
+mckissack m@kis@k
+mckissic m@kis6k
+mckissick m@kis6k
+mckitrick m@kitr6k
+mckittrick m@kitr6k
+mcklatchy m@klaC/
+mckneely m@knEl/
+mcknew m@knU
+mcknight m@knIt
+mckone m@kOn
+mckowen m@k?~
+mckown m@kOn
+mckoy m@k<
+mckree m@kr/
+mckune m@kyUn
+mclachlan m@klokl~
+mclafferty m@klafPt/
+mclain m@klAn
+mclamb m@klam
+mclanahan m@klan@han
+mclane m@klAn
+mclaren m@kl,r~
+mclarney m@kl)rn/
+mclarty m@kl)rt/
+mclarty's m@kl)rt/z
+mclauchlin m@kl{kl~
+mclaughlin m@glokl~
+mclaurin m@kl{r~
+mclaury m@kl{r/
+mclawhorn m@kl?h{rn
+mclawhorn m@klawPn
+mclay m@klA
+mclean m@klAn
+mclean m@klEn
+mclean's m@klAnz
+mclean's m@klEnz
+mclear m@klir
+mcleary m@klir/
+mclees m@klEz
+mcleish m@klES
+mcleland m@klel~d
+mclellan m@klel~
+mclelland m@klel~d
+mclendon m@klend~
+mclennan m@klen~
+mcleod m@kl?d
+mcleroy m@klEr<
+mclerran m@kl,r~
+mclester m@klestP
+mclin m@klin
+mclinden m@klind~
+mclinn m@klin
+mclish m@kliS
+mcloud m@kl?d
+mclouth m@kl?T
+mclucas m@klUk@z
+mcluckie m@kluk/
+mclure m@klUr
+mcmackin m@kmak~
+mcmahan m@kmAh~
+mcmahen m@kmAh~
+mcmahill m@kmAhil
+mcmahon m@kmA~
+mcmahon m@kman
+mcmains m@kmAnz
+mcmaken m@kmAk~
+mcmakin m@kmak~
+mcmanama m@kman}@
+mcmanaman m@kman}~
+mcmanamon m@kman}~
+mcmanaway m@kman@wA
+mcmanigal m@kman@g@l
+mcmanis m@kman@s
+mcmann m@kman
+mcmannis m@kman@s
+mcmanus m@kman@s
+mcmartin m@km)rt~
+mcmaster m@kmastP
+mcmasters m@kmastPz
+mcmath m@kmaT
+mcmeans m@kmEnz
+mcmeekin m@kmEk~
+mcmeen m@kmEn
+mcmenamin m@kmen}~
+mcmenamy m@kmen}/
+mcmenemy m@kmen}/
+mcmennamin m@kmen}~
+mcmichael m@kmIk@l
+mcmichen m@kmiC~
+mcmickle m@kmik@l
+mcmillan m@kmil~
+mcmillen m@kmil~
+mcmiller m@kmilP
+mcmillian m@kmily~
+mcmillian m@kmil~
+mcmillin m@kmil~
+mcmillion m@kmily~
+mcmillon m@kmil~
+mcminn m@kmin
+mcmonagle m@kmon@g@l
+mcmonigle m@kmon@g@l
+mcmoran m@km{r~
+mcmorran m@km{r~
+mcmorris m@km{r@s
+mcmorrow m@km{r]
+mcmuffin m@kmuf~
+mcmullan m@kmul~
+mcmullen m@kul~
+mcmullin m@kmul~
+mcmunn m@kmun
+mcmurdo m@kmVd]
+mcmurphy m@kmVf/
+mcmurray m@kmVA
+mcmurrey m@kmV/
+mcmurry m@kmV/
+mcmurtrey m@kmVtr/
+mcmurtrie m@kmVtP/
+mcmurtry m@kmVtr/
+mcnab m@knab
+mcnabb m@knab
+mcnair m@kn,r
+mcnairy m@kn,r/
+mcnall m@kn{l
+mcnalley m@knal/
+mcnally m@knal/
+mcnamara makn}er@
+mcnamara's makn}er@z
+mcnamee makn}/
+mcnamer m@knAmP
+mcnaney m@knan/
+mcnary m@kn,r/
+mcnatt m@knat
+mcnaught m@kn{t
+mcnaughton m@kn{t~
+mcnay m@knA
+mcneal m@knEl
+mcnealy m@knEl/
+mcnear m@knir
+mcneary m@knir/
+mcnease m@knEz
+mcnee m@knE
+mcneece m@knEs
+mcneel m@knEl
+mcneeley m@knEl/
+mcneely m@knEl/
+mcneer m@knir
+mcnees m@knEz
+mcneese m@knEs
+mcneff m@knef
+mcneice m@knEs
+mcneil m@knEl
+mcneill m@knEl
+mcneilly m@knEl/
+mcneish m@knES
+mcnelis m@knel@s
+mcnellis m@knel@s
+mcnelly m@knel/
+mcnemar makn}or
+mcnerney m@knVn/
+mcnett m@knet
+mcnevin m@knev~
+mcnew m@knU
+mcnichol m@knik@l
+mcnicholas m@knil@l@s
+mcnichols m@knik@lz
+mcnickle m@knik@l
+mcnicol m@knik{l
+mcniel m@knEl
+mcniff m@knif
+mcninch m@kninC
+mcnish m@kniS
+mcnitt m@knit
+mcnorton m@kn{rt~
+mcnuggets m@knug@ts
+mcnulty m@knult/
+mcnutt m@knut
+mcomber m@kombP
+mcorp emk{rp
+mcorp's emk{rps
+mcpaper m@kpApP
+mcparland m@kp)rl~d
+mcpartland m@kp)rtl~d
+mcpartlin m@kp)rtl~
+mcpeak m@kpEk
+mcpeake m@kpEk
+mcpeck m@kpek
+mcpeek m@kpEk
+mcpeters m@kpEtPz
+mcphail m@kfAl
+mcphatter m@kfatP
+mcphaul m@kf{l
+mcphearson m@kfVs~
+mcphearson m@kfirs~
+mcphee m@kfE
+mcpheeters m@kfEtPz
+mcpheron m@kf,r~
+mcpherson m@kfVs~
+mcphie m@kfE
+mcphillips m@kfil@ps
+mcpike m@kpIk
+mcquade m@kwAd
+mcquaid m@kwAd
+mcquaide m@kwAd
+mcquaig m@kwAg
+mcquain m@kwAn
+mcquarrie m@kw{r/
+mcquary mEkwcr/
+mcquay m@kA
+mcqueary m@kwir/
+mcqueen m@kwEn
+mcqueeney m@kwEn/
+mcquerry m@kw,r/
+mcquethy m@kweT/
+mcquethy's m@kweT/z
+mcquigg m@kwig
+mcquilkin m@kwilk~
+mcquillan m@kwil~
+mcquillen m@kwil~
+mcquillin m@kwil~
+mcquinn m@kwin
+mcquire m@kwIr
+mcquiston m@kwist~
+mcquitty m@kwit/
+mcquown m@kw?n
+mcrae m@krA
+mcrainey m@kran/
+mcraney m@kran/
+mcray m@krA
+mcree m@krE
+mcreynolds m@krAn@ldz
+mcright m@krIt
+mcroberts m@krobPts
+mcrorie m@kr{r/
+mcroy m@kr<
+mcshan m@kSan
+mcshane m@kSAn
+mcshea m@kSA
+mcsherry m@kS,r/
+mcsleep m@kslEp
+mcsorley m@ks{rl/
+mcspadden m@kspad~
+mcstay m@kstA
+mcswain m@kswAn
+mcsween m@kswEn
+mcsweeney m@kswEn/
+mctaggart m@ktagPt
+mctague m@ktAg
+mctavish m@ktAv6S
+mctavish m@ktav6S
+mcteer m@ktir
+mcternan m@ktVn~
+mctier m@ktIP
+mctier m@ktir
+mctiernan m@ktIrn~
+mctiernan m@ktirn~
+mctighe m@ktIg
+mctigue m@ktEg
+mcvay m@kvA
+mcvea m@kvE
+mcveigh m@kvA
+mcveigh's m@kvAz
+mcvey m@kvA
+mcvicar m@kvikP
+mcvicker m@kvikP
+mcvoy m@kv<
+mcwain m@kwAn
+mcwaters m@kw{tPz
+mcwatters m@kw{tPz
+mcweeney m@kwEn/
+mcwethy m@kweT/
+mcwherter m@kwVtP
+mcwhinney m@kwin/
+mcwhirt m@kwVt
+mcwhirter m@kwVtP
+mcwhite m@kwIt
+mcwhorter m@kw{rtP
+mcwilliam m@kwily}
+mcwilliams m@kwily}z
+mcwright m@krIt
+mczeal m@kzEl
+me mE
+mea mE
+meacham mEC}
+meachum mEC}
+mead mEd
+mead's mEdz
+meade mEd
+meader mEdP
+meaders mEdPz
+meador mEdP
+meadors mEdPz
+meadow medO
+meadowland med]land
+meadowlands med]landz
+meadowlark med]lork
+meadows medOz
+meads mEdz
+meager mEgP
+meagher m)r
+meaker mEkP
+meakin mEk~
+meal mEl
+meal's mElz
+mealer mElP
+mealey mEl/
+mealing mEl6N
+mealor mElP
+meals mElz
+mealtime mEltIm
+mealy mEl/
+mealynose mEl/nOz
+mealynosed mEl/nOzd
+mean mEn
+meander m/andP
+meandered m/andPd
+meandering m/andP6N
+meanders m/andPz
+meaner mEnP
+meanest mEn@st
+meaney mEn/
+meaning mEn6N
+meaningful mEn6Nf@l
+meaningfully mEn6Nf@l/
+meaningless mEn6Nl@s
+meanings mEn6Nz
+meanness mEnn@s
+meanor mEnP
+means mEnz
+means' mEnz
+meant ment
+meantime mEntIm
+meanwhile mEnwIl
+meany mEn/
+mear mir
+meara mEr@
+meares mErz
+mearns mVnz
+mears mirz
+mease mEz
+measel mEz@l
+measles mEz@lz
+measly mEzl/
+measurable meZP@b@l
+measurably meZP@bl/
+measure meZP
+measure's meZPz
+measured meZPd
+measurement meZPm~t
+measurements meZPm~ts
+measures meZPz
+measurex mezP@ks
+measuring meZP6N
+meat mEt
+meat-eating mEtEt6N
+meatball mEtb{l
+meatballs mEtb{lz
+meath mET
+meatier mEt/P
+meatless mEtl@s
+meatloaf mEtl]f
+meatpacker mEtpakP
+meatpackers mEtpakPz
+meatpacking mEtpak6N
+meats mEts
+meaty mEt/
+meaux mO
+meave mEv
+mebane meb~
+meca mek@
+mecca mek@
+mecca's mek@z
+mech mek
+mecham meC}
+mecham's meC}z
+mechanic m@kan6k
+mechanical m@kan6k@l
+mechanically m@kan6kl/
+mechanics m@kan6ks
+mechanics' m@kan6ks
+mechanicsburg m@kan6ksbPg
+mechanism mek~iz}
+mechanisms mek~iz}z
+mechanistic mek~ist6k
+mechanization mek~@zAS~
+mechanize mek~Iz
+mechanized mek~Izd
+meche meC
+mechem meC}
+mechem mekim
+mechler meklP
+mechling mekl6N
+meciar mes/or
+meck mek
+meckel mek@l
+meckes meks
+mecklenburg mekl~bPg
+meckler meklP
+meckley mekl/
+meckstroth mekstr{T
+mecum mek}
+med med
+meda mAd@
+medaglia mcdogl/@
+medal med@l
+medalist med@l@st
+medalist's med@l@sts
+medalists med@l@s
+medalists med@l@ss
+medalists med@l@sts
+medallion m@daly~
+medallions m@daly~z
+medals med@lz
+medaphis med@fis
+medar medP
+medarex medPeks
+medaris mAd)ris
+medcalf medkalf
+medchem medkem
+medchem's medkemz
+medco medk]
+medco's medk]z
+meddaugh med{
+medders medPz
+meddle med@l
+meddlesome med@ls}
+meddling med@l6N
+meddling medl6N
+medea m@dE@
+medearis medPis
+medeiros mAdir]z
+medel med@l
+medellin m@delin
+medema mcdem@
+medendorp medcnd{rp
+meder mEdP
+mederos medP]z
+medes mEdz
+medeva medev@
+medex med@ks
+medfact medfakt
+medfacts medfakts
+medfirst medfVst
+medfly medfl/
+medford medfPd
+medgar medgP
+medgar's medgPz
+medi med/
+media mEd/@
+media's mEd/@z
+medial mEd/@l
+medial mEdy@l
+mediamark mEd/})rk
+median mEd/~
+medianews mEd/@yUz
+mediaset mEd/@set
+mediate mEd/At
+mediated mEd/At@d
+mediating mEd/At6N
+mediation mEd/AS~
+mediator mEd/AtP
+mediators mEd/AtPz
+medic med6k
+medic's med6ks
+medicaid med@kAd
+medical med@k@l
+medical's med@k@lz
+medically med6k@l/
+medically med@kl/
+medicare med@ker
+medicare's med@kerz
+medicate med6kAt
+medicated med6kAt@d
+medication med@kAS~
+medications med@kAS~z
+medici mcdEs/
+medicinal m@dis~@l
+medicinally m@dis~@l/
+medicine med@s~
+medicine's med@s~z
+medicines med@s~z
+medico med6kO
+medics med6ks
+medicus med6k@s
+medieval m/dEv@l
+medieval m@dEv@l
+medigap med6gap
+medimmune med}yUn
+medin mAdEn
+medina m@dEn@
+medina m@dIn@
+medinger mEd6NP
+medio mEd/]
+medio med/]
+mediobanca m@dE]baNk@
+mediocre mEd/OkP
+mediocrity mEd/okr@t/
+mediplex med@pleks
+mediq mcdEk
+mediscare med@skAr
+medisgroup med@sgrUp
+medisgroups med@sgrUps
+meditate med@tAt
+meditating med@tAt6N
+meditation med@tAS~
+meditations med@tAS~z
+meditative med@tAt6v
+mediterranean med@tPAn/~
+meditrust med@trust
+meditz medits
+medium mEd/}
+mediums mEd/}z
+medivac med6vak
+medland medl~d
+medlar medlP
+medlen med@l~
+medler medlP
+medley medl/
+medlin medlin
+medlock medl@k
+mednick medn6k
+medoff med{f
+medora mAd{r@
+medrano mcdron]
+medserv medsPv
+medsker medskP
+medstone medstOn
+medtronic mcdtron6k
+medulla m@dul@
+medusa m@dUs@
+medusas m@dUs@z
+medved medv@d
+medvedev medv@dev
+medwin medwin
+mee mE
+meece mEs
+meech mEC
+meecham mEC}
+meeder mEdP
+meegan mEg~
+meehan mE~
+meehans mE~z
+meehl mEl
+meek mEk
+meeker mEkP
+meekins mEkinz
+meekly mEkl/
+meeks mEks
+meeler mElP
+meenaghan mEn@han
+meenan mEn~
+meents mEnts
+meer mEP
+meers mEPz
+mees mEz
+meese mEs
+meese's mEs@z
+meester mEstP
+meet mEt
+meeting mEt6N
+meeting's mEt6Nz
+meetings mEt6Nz
+meets mEts
+meetze mEtz
+meeuwsen mEUs~
+mefferd mefPd
+meffert mefPt
+mefford mefPd
+meg meg
+mega meg@
+megabit meg@bit
+megabuck meg@buk
+megabucks meg@buks
+megabyte meg@bIt
+megabytes meg@bIts
+megacarrier meg@karyP
+megacarriers meg@karyPz
+megace mEg@s
+megadeal meg@dEl
+megadeals meg@dElz
+megadeath meg@deT
+megafood meg@fUd
+megafoods meg@fUdz
+megahertz meg@hPts
+megahouse meg@h?s
+megahouses meg@h?s@z
+megalomania meg@l]mAn/@
+megalomaniac meg@l]mAn/ak
+megalopolis meg@lop@l@s
+megamerger meg}VjP
+megamergers meg}VjPz
+megan mAg~
+megan's mAg~z
+megaphone meg@fOn
+megaphones meg@fOnz
+megaplex meg@pleks
+megaquest meg@kwest
+megaquest's meg@kwests
+megarry megP/
+megastore meg@st{r
+megastores meg@st{rz
+megatons meg@tunz
+megawatt meg@wot
+megawatts meg@wots
+megee mej/
+meger megP
+megginson meg~s~
+meggison meg@s~
+meggs megz
+meghan meg~
+meghdar megdor
+megill mej@l
+megna megn@
+megner megnP
+mehaffey m@haf/
+mehaffey meh@f/
+mehalkoff mchalk{f
+mehall m@h{l
+mehan mAhan
+mehanovitch m@han@v@C
+meharg mAh)rg
+meharry mAhar/
+mehdi med/
+mehetabel m@het@b@l
+mehitabel mehit@b@l
+mehitabelle mehit@b@l
+mehl mel
+mehlberg melbPg
+mehle meh@l
+mehlenbacher mel~bokP
+mehler melP
+mehlhaff melh@f
+mehlhoff melh{f
+mehlhorn melhPn
+mehling mel6N
+mehlman melm~
+mehmet mem@t
+mehner menP
+mehnert menPt
+mehr m,r
+mehrabian mVAb/~
+mehrabian merAb/~
+mehran m,r~
+mehrens m,r~z
+mehrer m,rP
+mehring m,r6N
+mehringer m,r6NP
+mehrtens m,rt~z
+mehta met@
+mehta's met@z
+mehul mehql
+mei mA
+mei mI
+mei-ling mAliN
+meidinger mId6NP
+meidl mEd@l
+meier mIP
+meier's mIPz
+meierfeld mIrfeld
+meighan mAgh~
+meigher mAgP
+meiji mAjE
+meikle mEk@l
+mein mEn
+meincke mINk
+meinders mIndPz
+meindl mInd@l
+meine mEn
+meinecke mIn6k
+meineke mIn6k
+meinen mIn~
+meiner mInP
+meiners mInPz
+meinert mInPt
+meinertzhagen mInPtshog~
+meinhardt mInhort
+meinhart mInhort
+meinhold mInhOld
+meininger mIn6NP
+meinke mENk
+meints mInts
+meinzer mInzP
+meiosis mIOs@s
+meir mir
+meiring mIr6N
+meis mEz
+meisch mIS
+meise mEs
+meisel mIs@l
+meisels mIs@lz
+meisenheimer mIs~hImP
+meiser mIsP
+meishan mIS~
+meisinger mIs~jP
+meisler mIs@lP
+meisner mIsnP
+meiss mIs
+meissner mIsnP
+meister mIstP
+meisters mIstPz
+meitz mEts
+meitzler mItslP
+meixner mEksnP
+meiyuh mAyU
+mejia mAy/@
+mejias mAyE@z
+mekeel mek/l
+mekong mAkoN
+mel mel
+mel's melz
+melador mel@d{r
+melamed mel}cd
+melamine mel}En
+melanby mel~b/
+melancholic mel~kol6k
+melancholy mel~kol/
+melancon m@lank~
+meland mel~d
+melander mel~dP
+melanesian mel~EZ~
+melanesians mel~EZ~z
+melange melaN
+melanie mel~/
+melanin mel~in
+melanoma mel~Om@
+melanson mel~s~
+melantha m@lanT@
+melany mel~/
+melaragno mclorogn]
+melatonin mel@tOn~
+melatonin's mel@tOn~z
+melba melb@
+melberg melbPg
+melbourne melbPn
+melburn melbPn
+melby melb/
+melcher melCP
+melchert melCPt
+melching melC6N
+melchior mAlCEP
+melchiorre mclk/{rA
+melchor melCP
+meld meld
+melded meld@d
+melder meldP
+melding meld6N
+meldon meld~
+meldons meld~z
+meldrum meldr}
+mele mEl
+melear melP
+melee mAlA
+meleis m@lA@s
+melendez m@lendcz
+melendrez mAlAndrcz
+melendy mclend/
+melero mAl,r]
+meleski m@lesk/
+melessa mcles@
+melfi melf/
+melgaard melgord
+melgar mAlg)r
+melgoza mclgOz@
+melhem mel}
+melhorn melhPn
+meli mel/
+melia mel/@
+melican mel6k~
+melicent mel@s~t
+melichar mel@kP
+melick mel6k
+melikian mclik/~
+melillo mclil]
+melin melin
+melina mclEn@
+melinda m@lind@
+meline melIn
+meling mel6N
+melisent mel@s~t
+melissa m@lis@
+melissa's m@lis@z
+melisse melis
+melita mclEt@
+melito mclEt]
+melitta mclEt@
+melius mEl/@s
+melka melk@
+melkar melkor
+melkar's melkorz
+melkonian melkOn/~
+mell mel
+mella mel@
+melland mel~d
+mellaril melP@l
+melle mel
+mellem melim
+mellema mclem@
+mellen mel~
+meller melP
+mellett melct
+melley mel/
+mellgren melgrcn
+melli mel/
+mellicent mAlEs~t
+mellick mel6k
+mellie mel/
+mellin melin
+melling mel6N
+mellinger mel6NP
+mellis melis
+mellish mel6S
+mellman melm~
+mello mel]
+melloan mclOn
+melloan's mclOnz
+mellon mel~
+mellon's mel~z
+mellonby mel~b/
+mellons mel~z
+mellor melP
+mellott mel@t
+mellow mel]
+mellowed mel]d
+mellowing mel]6N
+melly mel/
+melman melm~
+melnick meln6k
+melnik meln6k
+melnor melnP
+melnyk meln6k
+melo mel]
+meloche mclOk/
+melodic m@lod6k
+melodies mel@d/z
+melodious m@lOd/@s
+melodrama mel@drom@
+melodramas mel@drom@z
+melodramatic mel@dr}at6k
+melody mel@d/
+melon mel~
+melone mclOn/
+meloni mclOn/
+melons mel~z
+melor m@l{r
+melor mel{r
+meloy mel<
+melquist melkwist
+melridge melrij
+melridge's melrij@z
+melrod melrod
+melrose melrOz
+melroy melr<
+melson mels~
+melt melt
+meltdown meltd?n
+melted melt@d
+melting melt6N
+melton melt~
+melts melts
+meltwater meltwotP
+meltz melts
+meltzer meltsP
+melucci mclUC/
+melugin mel@gin
+melva melv@
+melvie melv/
+melville melvil
+melvin melv~
+melvina mclvEn@
+melvine melvIn
+melvyn melvin
+melzer melzP
+member membP
+member's membPz
+membered membPd
+members membPz
+members' membPz
+membership membPSip
+memberships membPSips
+membrane membrAn
+membranes membrAnz
+membranous membr~@s
+memel mem@l
+memento m}ent]
+mementos m}ent]z
+memmer memP
+memmott mem@t
+memnon memnon
+memo memO
+memo's mem]z
+memoir memwor
+memoirs memworz
+memoli mcmOl/
+memorabilia memP@bEly@
+memorable memP@b@l
+memorably memP@bl/
+memoranda memPand@
+memorandum memPand}
+memorandums memPand}z
+memorex mem{reks
+memorial m}{r/@l
+memorialize m}{r/@lIz
+memorialized m}{r/@lIzd
+memorials m}{r/@lz
+memories memP/z
+memories' memPEz
+memorize memPIz
+memorized memPIzd
+memorizing memPIz6N
+memory memP/
+memos mem]z
+memotec mem]tek
+memphis memf@s
+memphis mempf@s
+memtec memtek
+memtec's memteks
+men men
+men's menz
+mena mEn@
+menace men@s
+menachem men@hcm
+menachem m~oh}
+menacing men@s6N
+menacingly men@s6Nl/
+menagerie m~ajP/
+menahem m~oh}
+menaker men@kP
+menapace mcnopoC/
+menard m~)rd
+menasco mcnosk]
+menasion mcnas/~
+menasion's mcnas/~z
+menatep men@tep
+mencer mensP
+mench menC
+menchaca mcnkok@
+mencher menCP
+mencken meNk~
+menconi mcnkOn/
+mend mend
+mendacity mcndas@t/
+mendan mend~
+mende mend
+mended mend@d
+mendel mend@l
+mendel's mend@lz
+mendell mendel
+mendelsohn mend@ls~
+mendelson mend@ls~
+mendelssohn mend@ls~
+mendenhall mend~h{l
+mendes mAndcs
+mendez mcndez
+mendez mendcz
+mendicino mcnd/CEn]
+mendieta mcndEt@
+mendillo mendil]
+mending mend6N
+mendiola mend/Ol@
+mendivil mAnd/vEl
+mendlowitz mendl@wits
+mendocino mend@sEn]
+mendola mcndOl@
+mendolia mcndOl/@
+mendonca mcndOnk@
+mendonsa mendons@
+mendosa mcndOs@
+mendota mcndOt@
+mendota mcndot@
+mendoza mcndOz@
+mendyk mend6k
+menear m~ir
+meneely m~El/
+menees menEz
+menefee men@f/
+menem men}
+menem's men}z
+menendez mcnendcz
+meneses mAnAscs
+menezes mAnAzcs
+meng meN
+menge menj
+mengel meNg@l
+mengele meNg@l@
+menger menjP
+mengers meNgPz
+menges menj@z
+menghini mcngEn/
+mengistu meNgEstU
+menhaden mcnhAd~
+menial mEn/@l
+menifee men@fE
+menil mcnEl
+meningitis men~jIt@s
+menino m~En]
+menjivar mAny/v)r
+menk meNk
+menka meNk@
+menke meNk
+menken meNk~
+menkes meNks
+menlo menl]
+menn men
+menna men@
+mennan men~
+mennan's men~z
+menne men
+mennella menel@
+mennen men~
+mennenga m~eNg@
+menning men6N
+menninger men6NP
+mennini mcnEn/
+mennonite men~It
+mennonites men~Its
+meno mAn]
+menon mAn{n
+menopausal men@p?z@l
+menopause men@p?s
+menor menP
+menorah m~{r@
+menorah's m~{r@z
+menorahs m~{r@z
+menotomy m~ot}/
+mens menz
+mensah mens@
+mensch menS
+menschville menSvil
+menser mensP
+mensik mens6k
+mensing mens6N
+mensinger mens~jP
+menstrual menstrU@l
+menstruation menstrUAS~
+menswear menzwAr
+mental ment@l
+mentality mcntal@t/
+mentally men@l/
+mentally ment@l/
+mente ment
+mentel mAntel
+menter mentP
+menthol menT{l
+mentholatum menT@lAt}
+mentink ment6Nk
+mention menS~
+mentioned menS~d
+mentioning menS~6N
+mentions menS~z
+mento ment]
+menton ment~
+mentor mentP
+mentor ment{r
+mentor's ment{rz
+mentored mentPd
+mentoring mentP6N
+mentors mentPz
+mentors ment{rz
+mentz ments
+mentzel mentz@l
+mentzer mentzP
+menu menyU
+menuhin mcnyU~
+menuhin m~Uhin
+menus menyUz
+menz menz
+menze menz
+menzel menz@l
+menzer menzP
+menzie menz/
+menzies menz/z
+menzione mcnz/On/
+menzione mcnzyOn/
+meo mE]
+meola m/ol@
+meow m/?
+mequon mekw~
+mer m,r
+mer mV
+merabank m,r@baNk
+meranda mPond@
+meraz m,roz
+merc m)rk
+merc mVk
+merc's m)rks
+merc's mVks
+mercadante mPkodont/
+mercado mPkod]
+mercantil mPkantil
+mercantile mVk~tIl
+mercantile's mVk~tElz
+mercantilism mPkant@liz}
+mercantilist mPkant@l@st
+mercator mPkAtP
+merce mVs
+mercedes mPsAd/z
+mercedes's mPsAd/z
+mercedes's mPsAd/z@z
+mercedeses mVsAdEz
+mercedeses mVsAdEz@z
+mercenaries mVs~er/z
+mercenary mVs~er/
+mercer mVsP
+merchandise mVC~dIz
+merchandiser mVC~dIzP
+merchandisers mVC~dIzPz
+merchandising mVC~dIz6N
+merchant mVC~t
+merchant's mVC~ts
+merchantmen mVC~tmcn
+merchants mVC~ts
+merchants' mVC~ts
+merchantsbank mVC~tsbaNk
+mercier mVs/P
+mercies mVs/z
+merciful mVs@f@l
+mercifully mVs@f@l/
+merciless mVs@l@s
+mercilessly mVs@l@sl/
+merck mVk
+merck's mVks
+mercland mVkland
+mercosur mVkOsV
+mercure mPkqr/
+mercuri mPkqr/
+mercurial mPkyqr/@l
+mercuric mPkyqr6k
+mercurio mPkqr/]
+mercury mVkyP/
+mercury's mVkyP/z
+mercy mVs/
+merdyce mVdIs
+mere mir
+meredith m,r@diT
+merely mirl/
+merenda mcrAnd@
+merendino mPcndEn]
+merest m,r@st
+meretz m,rcts
+merfeld mVfcld
+merge mVj
+merged mVjd
+mergen mVg~
+merger mVjP
+merger's mVjPz
+mergers mVjPz
+merges mVj@z
+merging mVj6N
+merhige mPhEj
+meriam mir/}
+merica m,r6k@
+mericantante mcrEk~tontA
+mericle m,r6k@l
+mericopa m,r@kOp@
+merida mPEd@
+meriden m,r@d~
+merideth m,r@diT
+meridian mPid/~
+meridian's mPid/~z
+meridien mPid/~
+meridionale mPid/~ol/
+meridith m,r@diT
+meridor m,r@d{r
+meriel mir/l
+merieux m,r/U
+merillat m,r@lat
+merino mPEn]
+merion m,r/~
+meris m,r@s
+merisel m,r@sel
+merit m,r@t
+merited m,r@t@d
+merithew mPiTyU
+meritless m,r@tl@s
+meritocracy mcr@t{kr@s/
+meritor m,r@tP
+meritor m,r@t{r
+meritorious mer@t{r/@s
+merits m,r@ts
+meritt m,rit
+meriweather m,r@weTP
+meriwether m,r@weTP
+merk mVk
+merkel mVk@l
+merker mVkP
+merkey mVk/
+merkin mVkin
+merklan mVkl~
+merkle mVk@l
+merkley mVkl/
+merklin mVklin
+merksamer mVks}P
+merkt mVkt
+merkur mVkP
+merl mVl
+merle mVl
+merlin mVlin
+merlina mPlEn@
+merline mVlIn
+merlino mPlEn]
+merlins mVlinz
+merlis mVl/z
+merlo m,rl]
+merlot mVl@t
+mermaid mVmAd
+mermaids mVmAdz
+merman mVman
+mermelstein mVm@lst/n
+mermelstein mVm@lstIn
+merna m,rn@
+merner mVnP
+mernick mVn6k
+mero m,r]
+merola mPOl@
+merolla mPOl@
+meroney m,r~/
+merow m,r]
+merrell m,r@l
+merrett m,rct
+merriam m,r/}
+merrick m,r6k
+merricks m,r6ks
+merrie m,r/
+merrier m,r/P
+merrifield m,r@fEld
+merrigan m,r@g~
+merrihew mPihyU
+merrill m,r@l
+merrill's m,r@lz
+merrily m,r@l/
+merrimac m,r}ak
+merrimack m,r}ak
+merriman m,r}~
+merrin m,rin
+merriott m,r/@t
+merrit m,rct
+merritt m,rct
+merritts m,rcts
+merriweather mcr@weTP
+merriwether m,r@wcTP
+merrow m,r]
+merry m,r/
+merry-go-round m,r/g]r?nd
+merryfield m,r/fEld
+merryman m,r/m~
+mers mVz
+mersch mVS
+mersereau mVsP]
+mershon mVS~
+mersman mVsm~
+merson mVs~
+merta m,rt@
+merten mVt~
+mertens mVt~z
+mertes m,rtcs
+mertice m,rt@s
+mertins mVtinz
+mertle mVt@l
+merton mVt~
+mertz mVts
+merv mVv
+mervin mVvin
+mervine mVvIn
+mervis mVvis
+mervyn mVvin
+mervyn's mVvinz
+merwe mVw/
+merwin mVwin
+merwyn mVwin
+meryl m,r@l
+meryll m,r@l
+merz mVz
+mesa mAs@
+mesa's mAs@z
+mesaba mcsob@
+mesaros mAs)r]z
+mesbic mesb6k
+mesbics mesb6ks
+mescalero mesk@l,r]
+mescaline mesk@lEn
+mesch meS
+mesched meScd
+mescher meSP
+meschke meSk
+meselsohn mez@ls~
+meselson mez@ls~
+mesenbrink mes~br6Nk
+mesenteric mes~t,r6k
+meserole mcsPOl/
+meserve mesPv
+meservey mczPvA
+mesh meS
+meshed meSt
+meshell meS@l
+meshes meS@z
+meshing meS6N
+meshulam meSUlam
+mesick mes6k
+mesirow mes6r]
+meske mesk
+mesker meskP
+meskill meskil
+meskimen mesk/mcn
+mesko mesk]
+mesler mes@lP
+mesmer mezmP
+mesmerism mesmPiz}
+mesmerize mezmPIz
+mesmerized mezmPIzd
+mesmerizing mezmPIz6N
+mesner mesnP
+mesodermal mez@dVm@l
+mesolithic mez@liT6k
+meson mAzon
+mesons mEzonz
+mesopotamia mes@p@tAm/@
+mesopotamian mes@p@tAm/~
+mesopotamians mes@p@tAm/~z
+mesothelioma mes@TEl/Om@
+mesothorax mez@T{raks
+mesozoic mes@zO6k
+mesquite meskEt
+mess mes
+messa mes@
+message mes@j
+messagepad mes@jpad
+messages mes@j@z
+messaging mes6j6N
+messamore mcsom{r
+messana mcsan@
+messed mest
+messel mes@l
+messenger mes~jP
+messengers mes~jPz
+messer mesP
+messerli mesPl/
+messerly mesPl/
+messerschmidt mesPSmit
+messerschmitt mesPSmit
+messersmith mesPsmiT
+messes mes@z
+messiaen mes/An
+messiaen's mes/Anz
+messiah m@sI@
+messiahs m@sI@z
+messianic mes/an6k
+messick mes6k
+messier mes/P
+messimer mes}P
+messina m@sEn@
+messineo mesin/]
+messing mes6N
+messinger mes6NP
+messler meslP
+messman mesm~
+messmer mesmP
+messmore mesm{r
+messner mesnP
+messrs mesPz
+messrs. m@sUrz
+messrs. mesPz
+messy mes/
+mest mest
+mesta mest@
+mestas mest@z
+mestek mestek
+mester mestP
+mestizo mcstEz]
+meston mest~
+mestrallet mestr@let
+mestre mestP
+mestrovic mestr]v6k
+meszaros m@S)r]z
+met met
+met's mets
+meta mEt@
+metabolic met@bol6k
+metabolism m@tab@liz}
+metabolisms m@tab@liz}z
+metabolize m@tab@lIz
+metacarpal met@k)rp@l
+metacarpals met@k)rp@lz
+metagogue met@g{g
+metagogued met@g{gd
+metairie m@t,r/
+metal met@l
+metal's met@lz
+metall met{l
+metallatz metal@ts
+metallgesellschaft met@lges@lSaft
+metallgesellschaft's met@lges@lSafts
+metallic m@tal6k
+metallic's m@tal6ks
+metallica m@tal6k@
+metallica's m@tal6k@z
+metallo mctol]
+metallurgical met@lVj6k@l
+metallurgy met@lPj/
+metals met@lz
+metals' met@lz
+metalwork met@lwVk
+metalworker met@lwVkP
+metalworkers met@lwVkPz
+metalworking met@lwVk6N
+metamorphic met}{rf6k
+metamorphose met}{rf]z
+metamorphosis met}{rf@s@s
+metamucil met}yUs@l
+metamucil's met}yUs@lz
+metaphor met@f{r
+metaphorical met@f{r6k@l
+metaphorically met@f{r6kl/
+metaphors met@f{rz
+metaphysical met@fiz6k@l
+metaphysics met@fiz6ks
+metastasize m@tast@sIz
+metastasized m@tast@sIzd
+metathorax met@T{raks
+metavsky m@tavsk/
+metaxas m@taks@s
+metcalf metkaf
+metcalfe metk@lf
+metcom metkom
+mete mEt
+meted mEt@d
+meteor mEt/P
+meteoric mEt/{r6k
+meteorite mEt/{rIt
+meteorological mEt/{r@loj@k@l
+meteorologist mEt/Pol@j@st
+meteorologists mEt/Pol@j@s
+meteorologists mEt/Pol@j@ss
+meteorologists mEt/Pol@j@sts
+meteorology mEt/Pol@j/
+meteors mEt/Pz
+meter mEtP
+metered mEtPd
+metering mEtP6N
+meters mEtPz
+metex meteks
+meth meT
+methadone meT@dOn
+methamphetamine meTamfet}/n
+methamphetamine meTamfet}In
+methane meTAn
+methanex meT~eks
+methanol meT~ol
+methazine meT@zEn
+metheney meT~/
+metheny meT~/
+methner meTnP
+method meT@d
+methode m@TOd
+methodical m@Tod@k@l
+methodically m@Tod6k@l/
+methodically m@Tod6kl/
+methodism meT@diz}
+methodisms meT@diz}z
+methodist meT@d@st
+methodological meT@d@loj6k@l
+methodologies meT]dol@j/z
+methodology meT@dol@j/
+methods meT@dz
+methot meT@t
+methotrexate meT]treksAt
+methuselah m@TyUz@l@
+methvin meTvin
+methyl meT@l
+methylene meT@lEn
+metics met6ks
+meticulous m@tiky@l@s
+meticulously m@tiky@l@sl/
+metier metyP
+metis metis
+metivier met6v/P
+metlife metlIf
+metolachlor m@tOl@klP
+metonomy m@t{n}/
+metoyer met<P
+metpath metpaT
+metra metr@
+metrahealth metr@helT
+metric metr6k
+metrical metr6k@l
+metrically metr6k@l/
+metrick metr6k
+metrics metr6ks
+metro metrO
+metro's metr]z
+metrobanc metr]baNk
+metrobank metr]baNk
+metrocall metrOk{l
+metrocolor metr]kulP
+metrocorp metr]k{rp
+metrodade metr]dAd
+metrodome metr@dOm
+metrodome metr]dOm
+metromail metr]mAl
+metromedia metr]mEd/@
+metroplex metr]pleks
+metropol metr@pOl
+metropol's metr@pOlz
+metropolis m@trop@l@s
+metropolitain metr@p{l@t~
+metropolitan metr@pol@t~
+metropolitan's metr@pol@t~z
+metropolitans metr@pol@t~z
+mets mets
+mets' mets
+metsker metskP
+mette met
+metter metP
+metternich metPn6C
+mettle met@l
+mettlen metl~
+mettler metlP
+metts mets
+mettur metP
+metz mets
+metze metz
+metzenbaum mets~b?m
+metzenbaum's mets~b?mz
+metzer metsP
+metzgar metsgP
+metzger metsgP
+metzger's metsgPz
+metzinger metz6NP
+metzker metskP
+metzler metslP
+metzner metsnP
+meunier m<n/P
+meurer mVP
+meuse myUz
+meuser m<sP
+meuth myUT
+mevacor mev@k{r
+mevarach m@v)r@C
+mevarach's m@v)r@C@z
+mevarachs m@v)r@C@z
+mew myU
+mewas mEw@s
+mewas myU@s
+mewborn myUbPn
+mewes myUz
+mex meks
+mexicali meks6kol/
+mexican meks@k~
+mexicana meks6kan@
+mexicano meks6kon]
+mexicanos meks6kon]z
+mexicans meks6k~z
+mexico meks@kO
+mexico's meks@kOz
+mey mA
+meyer mIP
+meyer's mIPz
+meyerbeer mIPbir
+meyerhoff mIPh{f
+meyering mAP6N
+meyerman mIPm~
+meyerowitz mIP@wits
+meyers mIPz
+meyerson mIPs~
+meyn mAn
+meyo mA]
+meyohas mAOhos
+meza mez@
+mezera mAz,r@
+mezey mez/
+mezger mezjP
+mezo mez]
+mezvinsky mezvinsk/
+mezvinsky's mezvinsk/z
+mezzaluna mets@lUn@
+mezzaluna mez@lUn@
+mezzanine mez~En
+mezzo mez]
+mfume emfUmA
+mgm emgEem
+mh emAC
+mhm }h}
+mhoon mhUn
+mi mE
+mi-vami m/vam/
+mia mE@
+miami mIam/
+miami's mIam/z
+miano m/on]
+miara mI)r@
+miasma m/azm@
+miasma mIazm@
+miata m/ot@
+miazga m/ozg@
+mib mib
+mic mik
+mica mIk@
+micaela m/kAl@
+micah mIk@
+micale m/kol/
+micallef mik@lcf
+micanopy m6kan@p/
+micatin mIk@tin
+micciche m/CEk/
+miccio mEC/]
+mice mIs
+micek miCck
+miceli m/Cel/
+mich miC
+michael mIk@l
+michael's mIk@lz
+michaela mIkel@
+michaelina mIk@lEn@
+michaeline mIk@l/n
+michaeline mIk@lIn
+michaelis mIkelis
+michaella mIkel@
+michaels mIk@lz
+michaelsen mIk@ls~
+michaelson mIk@ls~
+michal miC@l
+michalak miC@lak
+michalec m@hol6k
+michalek m@holck
+michalik mik@l6k
+michalowski miC@l{fsk/
+michals miC@lz
+michalski miColsk/
+michalsky miColsk/
+michaud miSO
+michaux miSO
+michcon miSkon
+michcon's miSkonz
+micheal mIk@l
+micheaux miSO
+micheaux's miSOz
+michel mIk@l
+michel miC@l
+michel miSel
+michel's mIk@lz
+michel's miC@lz
+michel's miSelz
+michela m6kAl@
+michela's m6kAl@z
+michelangelo mIk@lanj@lO
+michelangelo mik@lanj@lO
+michelangelo's mIk@lanj@lOz
+michelangelo's mik@lanj@lOz
+michele miSel
+micheletti m6k@let/
+micheli m6kel/
+michelin miS@l~
+michelin miSl~
+michelina m6k@lEn@
+micheline miS@l~
+michelini m6k@lEn/
+michell miC@l
+michelle m6Sel
+michelle's m6Selz
+michelli m6Cel/
+michelman mIk@lm~
+michelob mik@l]b
+michelotti m6k@lOt/
+michels m6Selz
+michelsen mIk@ls~
+michelson mIk@ls~
+michener miCnP
+michener's miCnPz
+michie miC/
+michiels mIk@lz
+michiels miC/lz
+michigan miS6g~
+michigan's miS6g~z
+michihiro miC/hEr]
+michio miC/]
+michl miC@l
+michler miClP
+michna miCn@
+michoacan m6COk~
+michon miC~
+mick mik
+micka mik@
+micke mik
+mickel mik@l
+mickelberry mik@lber/
+mickels mik@lz
+mickelsen mik@ls~
+mickelson mik@ls~
+mickens mik~z
+mickey mik/
+mickey's mik/z
+micki mik/
+mickie mik/
+mickiewicz mik@v6C
+mickish mik6S
+mickle mik@l
+mickler miklP
+mickles mik@lz
+mickley mikl/
+mickus mik@s
+micky mik/
+micoin m6k<n
+micom mIkom
+micosukee mik@sUk/
+micro mIkrO
+micro's mIkr]z
+microage mIkr]Aj
+microaire mIkr]er
+microamerica mIkr]}er6k@
+microbe mIkrOb
+microbes mIkrObz
+microbial mIkrOb/@l
+microbilt mIkr]bilt
+microbiologist mIkr]b/ol@j@st
+microbiology mIkr@bIol@j/
+microbiology mIkr]bIol@j/
+microbreweries mIkrObrUP/z
+microbrewery mIkrObrUP/
+microcentrifuge mIkr]sentr@fyUj
+microchip mIkrOCip
+microchips mIkrOCips
+microcircuit mIkr]sVk@t
+microcircuits mIkr]sVk@ts
+microclimate mIkr]klIm@t
+microclimates mIkr]klIm@ts
+microcode mIkr]kOd
+microcom mIkr]kom
+microcomputer mIkrOk}pyUtP
+microcomputers mIkrOk}pyUtPz
+microcosm mIkr@koz}
+microdyne mIkr]dIn
+microeconomic mIkr]ek~om6k
+microeconomics mIkr]ek~om6ks
+microelectronic mIkr]@lcktron6k
+microelectronics mIkr]@lcktron6ks
+microelettronica mIkr]@lctron6k@
+microfiche mIkr]fEC
+microfilm mIkr@film
+microfossil mIkrOfos@l
+microfossils mIkrOfos@lz
+microgenesys mIkr]jen@s@s
+micrografx mIkr]grafcks
+microgram mIkr]gram
+micrograms mIkr]gramz
+micrographic mIkr]graf6k
+micrographics mIkr]graf6ks
+microliter mIkr]l/tP
+microliters mIkr]l/tPz
+micromanage mIkr]man6j
+micromanagement mIkr]man6jm~t
+micromanaging mIkr]man6j6N
+micrometer mIkrom@tP
+micron mIkron
+micron's mIkronz
+micronesia mIkr]nEZ@
+micronic mIkr{nik
+micronics mIkr{niks
+microns mIkronz
+microorganism mIkr]{rg~iz}
+microorganisms mIkr]{rg~iz}z
+micropaleontology mIkr]pAl/~tol@j/
+microphone mIkr@fOn
+microphones mIkr]fOnz
+micropolis mIkr{p@lis
+micropro mIkr]prO
+microprocessor mIkr]proscsP
+microprocessors mIkr]proscsPz
+microprose mIkr]prOz
+micros mIkr]z
+microscope mIkr@skOp
+microscopes mIkr@skOps
+microscopic mIkr@skop6k
+microscopically mIkr@skop6kl/
+microscopy mIkrusk@p/
+microsemi mIkr]sem/
+microsoft mIkrOs{ft
+microsoft's mIkrOs{fs
+microsoft's mIkrOs{fts
+microsystems mIkrOsist}z
+microsystems' mIkr]sist}z
+microtel mIkr]tel
+microtubules mIkrOtUbyUlz
+microvax mIkr]vaks
+microware mIkrOw,r
+microwavable mIkr]wAv@b@l
+microwave mIkr@wAv
+microwaved mIkr]wAvd
+microwaves mIkr]wAvz
+microx mikr@ks
+micucci m/kUC/
+mid mid
+midafternoon midaftPnUn
+midair mid,r
+midamerica mid},r6k@
+midas mId@s
+midcap midkap
+midcentury m@dsenCP/
+midcon midkon
+midcontinent m@dkont~~t
+midcourse midk{rs
+middaugh mid{
+midday middA
+middendorf mid~d{rf
+middenstandsbank m@denstandzbaNk
+middle mid@l
+middle-class mid@lklas
+middlebrook mid@lbrqk
+middlebrooks mid@lbrqks
+middleburg mid@lbPg
+middlebury mid@lber/
+middlekauff mid@lk]f
+middleman mid@lman
+middlemen mid@lmen
+middlemiss mid@lmis
+middlesex mid@lseks
+middlesworth mid@lzwVT
+middleton mid@lt~
+middletown mid@lt?n
+middleweight mid@lwAt
+middling mid@l6N
+middling midl6N
+mideast midEst
+mideastern midEstPn
+midflight midflIt
+midge mij
+midge's mij@z
+midges mij@z
+midget mij@t
+midgetman mij@tman
+midgets mij@ts
+midgett mij@t
+midgett's mij@ts
+midgette m6jet
+midgley mijl/
+midi mEd/
+midi's mEd/z
+midkiff midkif
+midland midland
+midland's midlandz
+midlands midlandz
+midlantic m@dlan6k
+midlantic m@dlant6k
+midler midlP
+midlevel midl@v@l
+midlife midlIf
+midline midlIn
+midmorning midm{rn6N
+midnight midnIt
+midpac midpak
+midpac's midpaks
+midpoint midp<nt
+midprice midprIs
+midpriced midprIst
+midrange midrAnj
+midrib midrib
+midseason midsEz~
+midsection midsekS~
+midsession midseS~
+midshipman midSipm~
+midshipman's midSipm~z
+midshipmen midSipmcn
+midshipmen's midSipmcnz
+midsize midsIz
+midsized midsIzd
+midst midst
+midst mist
+midstream midstrEm
+midsummer midsumP
+midterm midtVm
+midterms midtVmz
+midthun midT~
+midtown midt?n
+midura m/dqr@
+midway midwA
+midway's midwAz
+midweek midwEk
+midwest midwest
+midwest's midwests
+midwestern m@dwestPn
+midwesterner midwestPnP
+midwesterners m@dwestPnPz
+midwife midwIf
+midwifery midwIfP/
+midwinter midwintP
+midwinter's midwintPz
+midwives midwIvz
+midyear midyir
+midyett midyet
+midyette midyet
+miears m/irz
+mieczkowski m/Ck{fsk/
+mieczyslaw mEC@sl{
+miedema m/dem@
+mielcarek m/lk)rck
+miele mEl
+mielke mElk/
+mien mEn
+mieno mEn]
+mier mIP
+miera mEr@
+mieras m6roz
+miers mIPz
+miert mIPt
+mierzejewski m6rzAefsk/
+mierzwa mErzw@
+mies mIz
+mieske mIsk/
+miesner mEznP
+miesse mEs
+miffed mift
+mifflin miflin
+mifsud mifs@d
+mig mig
+migdal migd@l
+migent mij~t
+miggins miginz
+might mIt
+might've mIt6v
+might-have-been mIt@vbin
+might-have-beens mIt@vbinz
+mightier mIt/P
+mightiest mIt/@st
+mightily mIt@l/
+mightn't mIt~t
+mighty mIt/
+migliaccio m/gl/oC/]
+migliore m/gl/{r/
+mignanelli m6gn~el/
+mignano m/gnon]
+migneault m6gnO
+mignogna m/gnOgn@
+mignon mign~
+mignone m/gnOn/
+mignons mign~z
+migra migr@
+migraine mIgrAn
+migraines mIgrAnz
+migrant mIgr~t
+migrants mIgr~ts
+migrate mIgrAt
+migrated mIgrAt@d
+migrating mIgrAt6N
+migration mIgrAS~
+migrations mIgrAS~z
+migratory mIgr@t{r/
+migs migz
+miguel m6gel
+migues mEgcs
+miguez m/gez
+mihai mEhI
+mihai's mEhIz
+mihal mIh@l
+mihalek mih@lck
+mihalic m@hal6k
+mihalik mih@l6k
+mihalko m@halk]
+mihaly mih@l/
+mihelich mihcl6k
+mihm mim
+mihn min
+mihn's minz
+mihok mih@k
+mijares m/y)rcs
+mika mEk@
+mikado m6kod]
+mikael m@kAl
+mikaela m/kAl@
+mikako m/kok]
+mikal mEk@l
+mike mIk
+mike's mIks
+mikel mik@l
+mikell mik@l
+mikels mik@lz
+mikelson mikcls~
+mikes mIks
+mikesell mik@s@l
+mikesh mik6S
+mikeska m6kesk@
+mikey mIk/
+mikhail m6kAl
+mikhail m6kIl
+mikidu m6kEdU
+mikita m6kEt@
+mikkelsen m6kels~
+mikkelson mikcls~
+mikkola m6kOl@
+miklas mIkl@z
+mikles mIk@lz
+miklos mEkl]s
+miko mIk]
+mikol mik{l
+mikolajczak m6kolICak
+mikolajczyk m6kolIC6k
+mikos mIk]z
+mikrut mikr@t
+miksch mikS
+mikula m6kUl@
+mikulak m6kUl@k
+mikulec m6kUl6k
+mikulic m6kUl6k
+mikulich m6kyUlih
+mikulski m6kulsk/
+mikus mIk@s
+mikva mikv@
+mil mil
+milacron mil@kron
+milacron's mil@kronz
+miladic m@lod6k
+milagro m@lagr]
+milam mil}
+milan m@lon
+milan mIlan
+milan's milonz
+milani m/lon/
+milano m/lon]
+milanowski mil~{fsk/
+milardo m/l)rd]
+milas mIl@z
+milazzo m/loz]
+milbank milbaNk
+milbauer milb?P
+milberg milbPg
+milberger milbPgP
+milbourn milbqrn
+milbourne milbqrn
+milbrandt milbr~t
+milbrath milbr@T
+milburn milbVn
+milby milb/
+milch milC
+milco milk]
+mild mIld
+mildenberger mIld~bPgP
+milder mIldP
+mildest mIld@st
+mildew mildU
+mildews mildUz
+mildly mIldl/
+mildred mildr@d
+mildrid mildP@d
+mile mIl
+mileage mIl@j
+mileham mil@ham
+milem mil}
+miler mIlP
+miles mI@lz
+miles mIlz
+mileski m@lesk/
+milestone mIlstOn
+milestones mIlstOnz
+miletich mil@t6k
+milewski m@lefsk/
+miley mIl/
+milford milfPd
+milgram milgram
+milham milh}
+milhoan milh]n
+milholland milh@l~d
+milhollin milhol~
+milhorn milhPn
+milhous milh?s
+milhouse milh?s
+milian mil/~
+milicent mil@s~t
+milich mil6k
+milici m/lEC/
+milieu milyq
+mililiter mil@lEtP
+milissent mil@s~t
+militancy mil@t~s/
+militant mil@t~t
+militantly mil@t~tl/
+militants mil@t~ts
+militaries mil@ter/z
+militarily mil@t,r@l/
+militarism mil@tPiz}
+militaristic mil@tPist6k
+militarists mil@tP@s
+militarists mil@tP@ss
+militarists mil@tP@sts
+militarize mil@tPIz
+militarized mil@tPIzd
+military mil@ter/
+military's mil@ter/z
+militate mil@tAt
+militello m/l/tel]
+militia m@liS@
+militia's m@liS@z
+militiamen m@liS}cn
+militias m@liS@z
+milito m/lEt]
+milius mIl/@s
+milk milk
+milke milk
+milked milkt
+milken milk~
+milken's milk~z
+milkens milk~z
+milkens' milk~z
+milking milk6N
+milkman milkman
+milko milk]
+milkovich milk@v6C
+milkowski m@lk{fsk/
+milks milks
+milkshake milkSAk
+milkweed milkwEd
+milky milk/
+mill mil
+mill's milz
+millage mil6j
+millan mil~
+millar milP
+millard milPd
+millard's milPdz
+millau mil?
+millay milA
+millbank milbaNk
+millburn milbPn
+mille mil
+milled mild
+milledge mil6j
+millen mil~
+millender milcndP
+millennia m@len/@
+millennial m@len/@l
+millennium m@len/}
+millenniums m@len/}z
+miller milP
+miller's milPz
+millerbrook milPbrqk
+millerick milP6k
+millers milPz
+milleson mil@s~
+millet mil@t
+millets mil@ts
+millett milct
+millette milet
+milley mil/
+millhouse milh?s
+milli mil/
+millibar mil@bor
+millican mil6k~
+millicent mil@s~t
+millicom mil6kom
+millicom's mil6komz
+millie mil/
+milliet mil/et
+milligal mil6g@l
+milligan mil6g~
+milligauss mil/g?s
+milligram mil@gram
+milligrams mil@gramz
+millikan mil@k~
+milliken mil6k~
+millikin mil6kin
+milliliter mil@lEtP
+milliliters mil@lEtPz
+milliman mil}~
+millimeter mil}EtP
+millimeters mil}EtPz
+millin mil~
+milliner mil~P
+milling mil6N
+millington mil6Nt~
+million mily~
+millionaire mily~,r
+millionaire's mily~,rz
+millionaires mily~,rz
+millions mily~z
+millionth mily~T
+millionths mily~tTs
+millipore mil@p{r
+milliron milP~
+millirons milP]nz
+millis milis
+millisecond milisek~d
+milliseconds milisek~dz
+millisent mil@s~t
+millman milm~
+milln miln
+millner milnP
+millon mil~
+milloy mil<
+mills milz
+mills' milz
+mills's milz@z
+millsap milsap
+millsaps milsaps
+millspaugh milsp{
+millstein milstEn
+millstein milstIn
+millstone milstOn
+millward milwPd
+millwood milwqd
+milly mil/
+milman milm~
+milne miln
+milner milnP
+milnes milnz
+milo mIl]
+milodic milOd6k
+milonas m/lOnoz
+milone milOn
+milos mEl]z
+milosevic milOs@v6C
+milosevic milOs@v6k
+milosevic's milOs@v6C@z
+milosevic's milOs@v6ks
+milosevich milos6v6C
+milosh mil{S
+milot mil@t
+milpitas milpEt@s
+milroy milr<
+mils milz
+milsap milsap
+milson mils~
+milstead milsted
+milstein milstEn
+milstein milstIn
+milt milt
+miltenberger milt~bPgP
+miltie mit/
+miltner miltnP
+milton milt~
+miltonic milton6k
+milum mil}
+milunovich m@lUn@v6C
+milward milwPd
+milwaukee milw{k/
+milwaukee's milw{k/z
+milz milz
+mim mim
+mimbs mimz
+mime mIm
+mimeograph mim/@graf
+mimi mEm/
+mimi's mEm/z
+mimic mim6k
+mimicked mim6kt
+mimicking mim6k6N
+mimicry mim6kr/
+mimics mim6ks
+mimis mEm/z
+mimms mimz
+mimnaugh mimn?
+mimosa m}Os@
+mims mimz
+min min
+mina mEn@
+mina min@
+minahan min@han
+minami m/nom/
+minamide min}EdA
+minar mInP
+minard min)rd
+minardos min)rd]s
+minaret minPet
+minarets minPets
+minarik minP6k
+minas mEn@s
+minasian minaZ~
+minassian minasZ~
+minatome min@tOm
+minc miNk
+mince mins
+minced minst
+mincemeat minsmEt
+mincer minsP
+mincey mins/
+minch minC
+mincher minCP
+minchew minCyU
+minchey minC/
+minchin minCin
+mincing mins6N
+minckler miNklP
+mincks miNks
+mincy mins/
+mind mInd
+mind's mIndz
+minda mind@
+mindanao mind~?
+mindanao mind~A]
+mindboggling mIndb{gl6N
+minded mInd@d
+mindedly mInd@dl/
+mindedness mInd@dn@s
+mindel mind@l
+minden mInd~
+minder mIndP
+mindful mIndf@l
+minding mInd6N
+mindless mIndl@s
+mindlessly mIndl@sl/
+mindlin mindlin
+minds mIndz
+mindset mIndset
+mindy mind/
+mine mIn
+mine's mInz
+minea minE@
+minear minir
+mineau minO
+minebea min@bE@
+mined mInd
+mineer mInP
+minefield mInfEld
+minefields mInfEldz
+minehan min@han
+minehart mInhort
+minella minel@
+minelli minel/
+mineo min/]
+mineola min/Ol@
+mineowner mInOnP
+mineowners mInOnPz
+miner mInP
+miner's mInPz
+minera min,r@
+mineral minP@l
+mineral minr@l
+mineral's minP@lz
+mineral's minr@lz
+mineralization minP@l@zAS~
+mineralize minP@lIz
+mineralogically minP@loj6k@l/
+mineralogically minP@loj6kl/
+mineralogist minPal@j@st
+mineralogy minPol@j/
+minerals minP@lz
+minerals minr@lz
+minerals' minP@lz
+minerals' minr@lz
+minerd minPd
+miners mInPz
+miners' mInPz
+minerva minVv@
+minervini mEnPvEn/
+mines mInz
+mines' mInz
+minesweeper mInswEpP
+minesweepers mInswEpPz
+minet mIn@t
+minet minct
+mineta minAt@
+minette minet
+mineworker mInwVkP
+mineworkers mInwVkPz
+ming miN
+ming-jen miNjen
+minge minj
+minger miNP
+minges minj@z
+mingle miNg@l
+mingled miNg@ld
+mingles miNg@lz
+mingling miNg@l6N
+mingling miNgl6N
+mingo mENg]
+mings miNz
+mingus miNg@s
+minh min
+mini min/
+mini-cost min/k{st
+miniard minyPd
+miniature min/@Cqr
+miniature min6Cqr
+miniatures min/@CPz
+miniatures min6CPz
+miniaturization min/@CP@zAS~
+miniaturize min6CPIz
+miniaturized min6CPIzd
+minibus min/bus
+minibuses min/bus@z
+minicar min/kor
+minicars min/k)rz
+minich min6C
+minichiello m/n/k/el]
+minick min6k
+minicomputer min/k}pyUtP
+minicomputers min/k}pyUtPz
+minicucci m/n/kUC/
+minidisc min/disk
+minier min/P
+minihan min@han
+minilab min/lab
+minilabs min/labz
+minimal min}@l
+minimalism min}@liz}
+minimalist min}@list
+minimally min}@l/
+minimill min/mol
+minimills min/milz
+minimize min}Iz
+minimized min}Izd
+minimizes min}Iz@z
+minimizing min}Iz6N
+minimum min}}
+minimums min}}z
+mining mIn6N
+mining's mIn6Nz
+mininger mIn6NP
+minion miny~
+minions miny~z
+minis min/z
+miniscribe min/skrIb
+miniscule min@skyUl
+miniseries min/sEr/z
+minish min6S
+miniskirt min/skVt
+miniskirts min/skVts
+minister min@stP
+minister's min@stPz
+ministerial min@stEr/@l
+ministering min@str6N
+ministers min@stPz
+ministers' min@stPz
+ministership min@stPSip
+ministration min@strAS~
+ministrations min@strAS~z
+ministries min@str/z
+ministry min@str/
+ministry's min@str/z
+minisupercomputer min/sUpPkumpyUtP
+minisupercomputers min/sUpPkumpyUtPz
+minit minit
+minitel min@tel
+minium min/}
+minivan min/van
+minivans min/vanz
+minix min6ks
+minjares m/ny)rcs
+minjarez m/ny)rcz
+mink miNk
+minke miNk
+minkel miNk@l
+minkin miNkin
+minkler miNklP
+minkoff miNk{f
+minkow miNk?
+minks miNks
+minna min@
+minnaar min)r
+minneapolis min/ap@l@s
+minneapolis's min/ap@l@s@z
+minnelli minel/
+minner minP
+minnesota min@sOt@
+minnesota's min@sOt@z
+minnesotan min@sOt~
+minnesotans min@sOt~z
+minnetonka min@t{Nk@
+minney min/
+minnich min6C
+minnick min6k
+minnie min/
+minnie's min/z
+minniear min/ir
+minnifield min@fEld
+minnig min6g
+minnis minis
+minniti m/nEt/
+minnix min6ks
+minnow min]
+minnows min]z
+minns minz
+minntech mintek
+minny min/
+mino mEn]
+minoan m~O~
+minogue mEn{g
+minogue m~Og/
+minoli minOl/
+minolta minOlt@
+minolta minoltu
+minor mInP
+minorca m~{rk@
+minorco min{rk]
+minorco's min{rk@z
+minored mInPd
+minoring mInP6N
+minorite minPIt
+minorities mIn{r@t/z
+minorities m~{r@t/z
+minority mIn{r@t/
+minority m~{r@t/
+minors mInPz
+minoru min{rU
+minot min@t
+minott min@t
+minotti min{t/
+minow min]
+minoxidil m~oks@d@l
+minpeco minpek]
+minshall minS@l
+minshew minSU
+minsk minsk
+minskoff minsk{f
+minsky minsk/
+minson mins~
+minstar minstor
+minstar's minstorz
+minster minstP
+minstrel minstr@l
+minstrels minstr@lz
+mint mint
+mint's mints
+minta mint@
+mintage mint@j
+minted mint@d
+minteer mintir
+minter mintP
+mintha minT@
+mintier mint/P
+minting mint6N
+minto mint]
+minton mint~
+mints mints
+minturn mintVn
+mintz mints
+mintzer mintzP
+minuet miny@wet
+minus mIn@s
+minuscule min@skyUl
+minuses mIn@s@z
+minute mInUt
+minute mInyUt
+minute min@t
+minute's min@ts
+minutely min@tl/
+minuteman min@tman
+minutemen min@tmen
+minutes min@ts
+minutes' min@ts
+minutia m~US/@
+minutiae m~US/@
+minyard minyord
+miocene mI@sEn
+mion mI~
+mione mIOn
+miot mI@t
+miotke mIotk/
+miotke myotk/
+mips mips
+mir mir
+mira mir@
+mirabal mir@b@l
+mirabel m6robel
+mirabella m6robel@
+mirabelle m{r@b@l
+mirabelli m6robel/
+mirabile m6rob@l
+mirabito m6robEt]
+miracid miras@d
+miracid's miras@dz
+miracle mir@k@l
+miracles mir@k@lz
+miraculous mPaky@l@s
+miraculously mPaky@l@sl/
+mirad m@rad
+mirada m6rod@
+mirage mPoZ
+mirages mPoZ@z
+miraglia m6ragl/@
+mirak mirak
+miramar mir}or
+miramax mir}aks
+miramax's mir}aks@z
+miramontes m6romOntcs
+miranda mPand@
+miranda's mPand@z
+mirando m6rand]
+miratec mir@tek
+mire mIP
+mire mIr
+mired mIrd
+mireles m6rAlcs
+mirelez m6rAlcz
+mirell m6rel
+mirella m6rel@
+mirelle mPel
+mirenda m6rend@
+mires mIrz
+miriam mir/}
+mirick mir6k
+mirilla m6ril@
+mirkin mVkin
+mirna mVn@
+miro m6rO
+miro mir]
+miro's m6rOz
+miro's mir]z
+miron m6r{n
+mironenko mir]neNk]
+miroslav mir@slov
+mirra mir@
+mirren mir~
+mirror mirP
+mirror's mirPz
+mirrored mirPd
+mirroring mirP6N
+mirrors mirPz
+mirsad mirsad
+mirsky mVsk/
+mirth mVT
+mirti mVt/
+mirti mVtE
+mirtle mVt@l
+mirto mirt]
+mirv mVv
+mirza mVz@
+mis mis
+misa mEz@
+misa's mEz@z
+misadventure mis@dvenCP
+misadventures mis@dvenCPz
+misallocate misal@kAt
+misallocated misal@kAt@d
+misallocation misal@kAS~
+misanthrope mis~TrOp
+misapplication misapl@kAS~
+misapplied mis@plId
+misapply mis@plI
+misapplying mis@plI6N
+misapprehension misapr/henS~
+misappropriate mis@prOpr/At
+misappropriated mis@prOpr/At@d
+misappropriating mis@prOpr/At6N
+misappropriation mis@prOpr/AS~
+misater misAtP
+misawa misow@
+misbegotten misb@got~
+misbehave misb/hAv
+misbehave misb@hAv
+misbehaved misb/hAvd
+misbehaved misb@hAvd
+misbehaving misb/hAv6N
+misbehaving misb@hAv6N
+misbehavior misb/hAvyP
+misbehavior misb@hAvyP
+misbrener misbrenP
+miscalculate miskalky@lAt
+miscalculated miskalky@lAt@d
+miscalculation miskalky@lAS~
+miscalculations miskalky@lAS~z
+miscarriage misk,r@j
+miscarriages misk,r6j@z
+miscast miskast
+miscavige miskavij
+miscayuna miskIyUn@
+miscayuna's miskIyUn@z
+miscellaneous mis@lAn/@s
+miscellany mis@lAn/
+misch miS
+mischa miS@
+mischaracterization miskar@ktP@zAS~
+mischaracterize miskar@ktPIz
+mischaracterized miskar@ktPIzd
+mischarge misC)rj
+mischarged misC)rjd
+mischarges misC)rj@z
+mischarging misC)rj6N
+mischel miS@l
+mischer miSP
+mischief misC@f
+mischievous misC@v@s
+mischke miSk
+mischler miS@lP
+miscibility mis@bil@t/
+miscible mis@b@l
+miscommunication misk}yUn@kAS~
+misconceive misk~sEv
+misconceived misk~sEvd
+misconception misk~sepS~
+misconceptions misk~sepS~z
+misconduct miskond@kt
+misconstrue misk~strU
+misconstrued misk~strUd
+miscount misk?nt
+miscreant miskr/~t
+miscreants miskr/~ts
+miscreation miskr/AS~
+miscreations miskr/AS~z
+miscue miskyU
+miscues miskyUz
+misdeed misdEd
+misdeeds misdEdz
+misdemeanor misd}EnP
+misdemeanors misd}EnPz
+misdiagnose misdI6gnOs
+misdiagnosed misdI6gnOst
+misdiagnoses misdI6gnOs/z
+misdiagnosis misdI6gnOs@s
+misdirect misd6rekt
+misdirected misd6rekt@d
+misek misck
+misener mis/nP
+misenheimer mis~hImP
+miser mIzP
+miserable mizP@b@l
+miserable mizr@b@l
+miserables mizP@b@lz
+miserables mizPob
+miserables mizr@b@lz
+miserably mizP@bl/
+miserably mizr@bl/
+miseration mizPAS~
+miseries mizP/z
+miserly mIzPl/
+misery mizP/
+mises mIz@z
+misfeldt misfclt
+misfire misfIP
+misfit misfit
+misfits misfits
+misfortune misf{rC~
+misfortunes misf{rC~z
+misgive misgiv
+misgiving misgiv6N
+misgivings misgiv6Nz
+misgovernment misguvPnm~t
+misguide misgId
+misguided misgId@d
+mish miS
+misha miS@
+mishandle mishand@l
+mishandled mishand@ld
+mishandling mishandl6N
+mishap mishap
+mishaps mishaps
+mishawaka miS@w{k@
+mishawaum miS@wom
+mishawum miS@wum
+mishear mishEr
+misheard mishVd
+mishkin mESk/n
+mishler miSlP
+mishmash miSmaS
+mishoe mESU
+mishra miSr@
+misiak mis/ak
+misiaszek mis/oSck
+misidentification misIden@f6kAS~
+misidentification misIdent@f6kAS~
+misidentified misIden@fId
+misidentified misIdent@fId
+misidentify misIden@fI
+misidentify misIdent@fI
+misiewicz mis@v6C
+misimpression misimpreS~
+misinform misinf{rm
+misinformation misinfPmAS~
+misinformed misinf{rmd
+misinforming misinf{rm6N
+misinterpret misintVprct
+misinterpretation misintVpr@tAS~
+misinterpreted misintVpr@t@d
+misinterpreting misintVpr@t6N
+misjudge misjuj
+misjudged misjujd
+misjudges misjuj@z
+misjudgment misjujm~t
+misjudgments misjujm~ts
+miska misk@
+miske misk
+miskell misk@l
+miskito miskEt]
+miskitos miskEt]s
+misko misk]
+mislabel mislAb@l
+mislabeled mislAb@ld
+mislabeling mislAb@l6N
+mislabeling mislAbl6N
+mislaid mislAd
+mislead mislEd
+misleading mislEd6N
+misleadingly mislEd6Nl/
+misleads mislEdz
+misled misled
+mismanage misman6j
+mismanaged misman6jd
+mismanagement misman6jm~t
+mismanages misman6j@z
+mismanaging misman6j6N
+mismatch mismaC
+mismatch mismaC
+mismatched mismaCt
+mismatches mismaC@z
+misner miznP
+misnomer misnOmP
+misogyne miz@j~
+misogynist miz@j~@st
+misogyny miz@j~/
+misperceive mispPsEv
+misperceives mispPsEvz
+misperception mispPsepS~
+misperceptions mispPsepS~z
+misplace misplAs
+misplaced misplAst
+misprice misprIs
+mispriced misprIst
+misprint misprint
+misprision mispriZ~
+mispronounce mispr~?ns
+mispronounced mispr~?nst
+misquote miskwOt
+misquoted miskwOt@d
+misread misrEd
+misreading misrEd6N
+misremember misr/membP
+misremembered misr/membPd
+misreport misr@p{rt
+misreported misr@p{rt@d
+misrepresent misrepr@zent
+misrepresentation misrepr@zcntAS~
+misrepresentations misrepr@zcntAS~z
+misrepresented misrcpr@zen@d
+misrepresented misrcpr@zent@d
+misrepresenting misrepr@zen6N
+misrepresenting misrepr@zent6N
+misrepresents misrepr@zens
+misrepresents misrepr@zents
+misrule misrUl
+miss mis
+missal mis@l
+missed mist
+missel mis@l
+misses mis@z
+missett mis@t
+missey mis/
+misshapen misSAp~
+misshapen mishap~
+missie mis/
+missildine mis/ldEn/
+missildine mis@ldIn
+missile mis@l
+missile's mis@lz
+missiles mis@lz
+missiles' mis@lz
+missimer mis}P
+missing mis6N
+mission miS~
+mission's miS~z
+missionaries miS~er/z
+missionary miS~er/
+missions miS~z
+mississauga mis@s{g@
+mississippi mis@sip/
+mississippi's mis@sip/z
+mississippian mis@sip/~
+mississippians mis@sip/~z
+mississippis mis@sip/z
+missive mis6v
+missler mislP
+missoula mizUl@
+missouri m@zV@
+missouri m@zqr/
+missouri's m@zV@z
+missouri's m@zqr/z
+misspeak mispEk
+misspeak misspEk
+misspell mispel
+misspell misspel
+misspelled mispeld
+misspelled misspeld
+misspelling mispel6N
+misspelling misspel6N
+misspend mispend
+misspend misspend
+misspending mispend6N
+misspending misspend6N
+misspent mispent
+misspent misspent
+misspoke mispOk
+misspoke misspOk
+misspoken mispOk~
+misspoken misspOk~
+misstate misstAt
+misstate mistAt
+misstated misstAt@d
+misstated mistAt@d
+misstatement mistAtm~t
+misstatements mistAtm~s
+misstatements mistAtm~ts
+misstates misstAts
+misstates mistAts
+misstating misstAt6N
+misstating mistAt6N
+misstep misstep
+misstep mistep
+missteps missteps
+missteps misteps
+missus mis@z
+missy mis/
+missy's mis/z
+mist mist
+mistake mistAk
+mistaken mistAk~
+mistakenly mistAk~l/
+mistakes mistAks
+mistaking mistAk6N
+mister mistP
+misters mistPz
+mistic mist6k
+mistler mistlP
+mistletoe mis@ltO
+mistook mistqk
+mistral mistr@l
+mistreat mistrEt
+mistreated mistrEt@d
+mistreating mistrEt6N
+mistreatment mistrEtm~t
+mistreats mistrEts
+mistress mistr@s
+mistresses mistr@s@z
+mistretta mistret@
+mistrial m6strI@l
+mistrial mistrI@l
+mistrials mistrI@lz
+mistrials mistrI@lz
+mistrust mistrust
+mistrusted mistrust@d
+mistrustful mistrusf@l
+mistrustful mistrustf@l
+mistry mistr/
+mistry mistrI
+mists mists
+misty mist/
+misunderstand mis~dPstand
+misunderstanding mis~dPstand6N
+misunderstandings mis~dPstand6Nz
+misunderstands mis~dPstandz
+misunderstood mis~dPstqd
+misuraca misqrok@
+misuse misyUs
+misuse misyUz
+misused misyUzd
+misuses misyUs@z
+misuses misyUz@z
+misusing misyUz6N
+mit emItE
+mit mit
+mita mEt@
+mitamura mEt}qr@
+mitch miC
+mitcham miC}
+mitchel miC@l
+mitchell miC@l
+mitchell's miC@lz
+mitchelson miC@ls~
+mitcheltree m6C@ltrE
+mitchem miC}
+mitchener miC/nP
+mitchner miCnP
+mitchum miC}
+mite mIt
+mitek mItek
+mitel mItel
+miter mItP
+mitering mItP6N
+mites mIts
+mithcell miTs@l
+mithridate miTr@dAt
+mithridates miTr@dAts
+mithun miT~
+miti mEt/
+miti mEtE
+miti mitE
+mitigate mit@gAt
+mitigated mit@gAt@d
+mitigates mit@gAts
+mitigating mit@gAt6N
+mitigation mit6gAS~
+mitman mitm~
+mitnick mitn6k
+mitofsky m@t{fsk/
+mitra mitr@
+mitral mItr@l
+mitrano m/tron]
+mitre mItP
+mitre mitr/
+mitro mitr]
+mitrovich mitr@v6C
+mitsch miC
+mitschke miCk
+mitsotakis mits]tokis
+mitsuba m/tsUb@
+mitsubishi mitsUbES/
+mitsubishi's mitsUbES/z
+mitsui m/tsU/
+mitsui mitsU/
+mitsui's m/tsU/z
+mitsukoshi mEtsUkOS/
+mitsuru m/tsUrU
+mitt mit
+mittag mit@g
+mittal mitol
+mittan mit~
+mitteleuropa mitelUrOp@
+mittelman mit@lm~
+mittelstadt mit@lStat
+mittelstaedt mit@lstct
+mittelsteadt mit@lstct
+mitten mit~
+mittendorf mit~d{rf
+mittens mit~z
+mitterand mEtPand
+mitterand mEtP{nd
+mitterand's mEtPandz
+mitterand's mEtP{ndz
+mitterrand mEtPand
+mitterrand mEtP{nd
+mitterrand's mEtPandz
+mittleman mit@lm~
+mittler mitlP
+mittman mitm~
+mitton mit~
+mitts mits
+mityunov mityUnov
+mitzel mitz@l
+mitzi mits/
+mitzner mitsnP
+mitzvah mitsv@
+miura m/qr@
+mix miks
+mixed mikst
+mixer miksP
+mixers miksPz
+mixes miks@z
+mixing miks6N
+mixner miksnP
+mixon miks~
+mixson miks~
+mixte mikst
+mixter mikstP
+mixture miksCP
+mixtures miksCPz
+mixup miks@p
+miyagawa mEogow@
+miyahara mEyoh)r@
+miyake m/yokA
+miyako mEukO
+miyamori mEom{r/
+miyamoto m/yomOt]
+miyasaki mEyosok/
+miyasato m/yosot]
+miyashiro m/yoSir]
+miyazaki mEyozok/
+miyazawa mEy@zow@
+miyazawa's mE@zow@z
+mizar mIzor
+mizar's mIzorz
+mize mIz
+mize's mIz@z
+mizel mIz@l
+mizel mIzel
+mizell miz@l
+mizelle mizel
+mizen mIz~
+mizer mIzP
+mizner miznP
+mizrahi m/zroh/
+mizuno mizUn]
+mizzell miz@l
+mj's emjAz
+mkhatshwa m@kaCw@
+mladenic mloden6C
+mladic mlod6C
+mladic's mlod6C@z
+mlecko m@lek]
+mlecko mlek]
+mlotok m@lotok
+mlotok mlOtok
+mmabatho m@boT]
+mme ememE
+mme m@dam
+mme mad}
+mmmm mm
+mnemonic n/mon6k
+mnemonic n}on6k
+mnemonics n/mon6ks
+mnemonics n}on6ks
+mnookin mnqk~
+mnookin m~qk~
+mo mO
+moab mOab
+moacq mOk
+moad mOd
+moak mOk
+moakley mOkl/
+moami mOm/
+moammar mO}or
+moan mOn
+moaned mOnd
+moaning mOn6N
+moans mOnz
+moat mOt
+moates mOAts
+moats mOts
+mob mob
+mob's mobz
+mobay m]bA
+mobbed mobd
+mobbs mobz
+mobe mOb
+moberg mObPg
+moberly mObPl/
+mobil mOb@l
+mobil's mOb@lz
+mobile mOb@l
+mobile's mOb@lz
+mobiles mOb@lz
+mobilia m]bEl/@
+mobiliare mOb@ler
+mobility m]bil@t/
+mobilization mOb@l@zAS~
+mobilizations mOb@l@zAS~z
+mobilize mOb@lIz
+mobilized mOb@lIzd
+mobilizer mOb@lIzP
+mobilizers mOb@lIzPz
+mobilizing mOb@lIz6N
+mobius mOb/@s
+mobley mObl/
+mobs mobz
+mobster mobstP
+mobster's mobstPz
+mobsters mobstPz
+mobutu m@yUtU
+mobutu m]byUtU
+mobutu's m@bUtUz
+mobutu's m]byUtUz
+moby mOb/
+moca mOk@
+mocarski m@k)rsk/
+mocatta m@kot@
+moccasin mok@sin
+moccasins mok@sinz
+moccia mOC@
+moccio mOC/]
+moceri m]C,r/
+moch mok
+mocha mOk@
+mochel mok@l
+mochida m@CEd@
+mochizuki m]C/zUk/
+mock mok
+mock-heroically mokhPO6kl/
+mocked mokt
+mockery mokP/
+mocking mok6N
+mockingbird mok6NbVd
+mockler moklP
+mocks moks
+moczygemba m@C6gemb@
+mod m{d
+modal mOd@l
+modalities m@dal@t/z
+modality m@dal@t/
+modarressi m]dores/
+mode mOd
+moded mOd@d
+model mod@l
+model's mod@lz
+modeled mod@ld
+modeling mod@l6N
+modeling modl6N
+modell m]dAl
+modelo m]del]
+models mod@lz
+models' mod@lz
+modem mOd}
+modems mOd}z
+moden mOd~
+modena m]den@
+moder mOdP
+moderate modP@t
+moderate modPAt
+moderated modPAt@d
+moderately modP@tl/
+moderates modP@ts
+moderates modPAts
+moderating modPAt6N
+moderation modPAS~
+moderator modPAtP
+moderators modPAtPz
+modern modPn
+modernism modPniz}
+modernist modPn@st
+modernists modPn@s
+modernists modPn@ss
+modernists modPn@sts
+modernity modVn@t/
+modernization modPn@zAS~
+modernization modPnIzAS@
+modernize modPnIz
+modernized modPnIzd
+modernizing modPnIz6N
+moderns modPnz
+modes mOdz
+modesitt mod@sit
+modest mod@st
+modesta m]dest@
+modestia m]desty@
+modestine m]dcstEn/
+modestly mod@stl/
+modesto m]dest]
+modesty mod@st/
+modglin mojlin
+modi mOd/
+modic mod6k
+modica m]dEk@
+modicum mod6k}
+modification mod@f@kAS~
+modifications mod@f@kAS~z
+modified mod@fId
+modifies mod@fIz
+modify mod@fI
+modifying mod@fI6N
+modigliani m]digl/an/
+modigliani m]digl/on/
+modiliani m]dil/an/
+modine m]dEn
+modisette mod@sct
+modjeski m@jesk/
+modlin modlin
+modrak modr@k
+modrow modr]
+modugno m]dUgn]
+modulaire m{jUler
+modular moj@lP
+modulate m{jUlAt
+modulate m{jyUlAt
+modulated m{jUlAt@d
+modulated m{jyUlAt@d
+modulation moj@lAS~
+modulator moj@lAtP
+module mojUl
+modules mojUlz
+modus mOd@s
+mody mOd/
+modzelewski m@j@lefsk/
+moe mO
+moebius mOb/@s
+moeckel mOk@l
+moede mOd
+moehle mOh@l
+moehlman mOlm~
+moehring m{r6N
+moeller mOlP
+moellering mOlP6N
+moen mOn
+moench mONk
+moening mo~6N
+moerbe m{rb
+moerke m{rk
+moerman mOPm~
+moers mOPz
+moertel m{rtel
+moes mOz
+moesch mOS
+moeser mOzP
+moessner mOsnP
+moet mOct
+mof mof
+moffa mof@
+moffat mof@t
+moffatt mof@t
+moffet mofct
+moffett mofct
+moffit mofit
+moffitt mofit
+mofford m{fPd
+mofield mOfEld
+moga mOg@
+mogadishu mOg@dESU
+mogadishu's mOg@dESUz
+mogan mOg~
+mogavaro m]g@v)r]
+mogavero m]gov,r]
+mogayon m]goy~
+mogayon's m]goy~z
+mogel mOg@l
+mogensen mog~s~
+moger mOgP
+mogg mog
+mogle mOg@l
+moglia mogl/@
+mogopa m]gOp@
+mogul mOg@l
+moguls mOg@lz
+mohair mOher
+mohamad m@hom@d
+mohamed m]homcd
+mohammad m]homcd
+mohammed m]ham@d
+mohan mOhon
+mohar mOhP
+mohasco m]hask]
+mohawk mOh{k
+mohawks mOh{ks
+moher mohP
+mohican mOhEk~
+mohicans mOhEk~z
+mohl mOl
+mohler mOlP
+mohlman mOlm~
+mohn mon
+mohney mon/
+mohnke monk
+mohnke monk/
+mohnkern monkPn
+mohon mOh~
+mohr m{r
+mohring m{r6N
+mohrman m{rm~
+mohrmann m{rm~
+mohs mos
+mohtashemi mOt@SAm/
+moi mwo
+moilanen m<l~~
+moina m<n@
+moines m<n
+moines m<nz
+moir m<r
+moira m<r@
+moisan m<zan
+moise m<z
+moises m<z@z
+moishe m<S6
+moishe mOSc
+moisi m<s/
+moist m<st
+moisten m<s~
+moistened m<s~d
+moisture m<sCP
+moisturizer m<sCPIzP
+mojave m]hov/
+mojica m]yEk@
+mojo mOj]
+mok mok
+moka mOk@
+mokes mOks
+mokhiber mokh@bP
+mokoena m@kOn@
+mokry mokr/
+mol m{l
+mola mOl@
+molaison m@lAz~
+moland mol~d
+molander mol~dP
+molano m]lon]
+molasses m@las@z
+molchan mOlC~
+mold mOld
+moldable mOld@b@l
+moldavia mOldAv/@
+moldavia mOldov/@
+moldavian mOldAv/~
+moldavian mOldov/~
+molded mOld@d
+molden mOld~
+moldenhauer mOld~h?P
+molder mOldP
+molders mOldPz
+molding mOld6N
+moldings mOld6Nz
+moldova mOldOv@
+moldovan mOld]von
+molds mOldz
+moldy mOld/
+mole mOl
+molecular m@leky@lP
+molecule mol@kyUl
+molecules mol@kyUlz
+moleculon m]lekyUlon
+molehill mOlhil
+molelike mOllIk
+molen mOl~
+molenaar mol~or
+molenda m]lend@
+moler mOlP
+moles mOlz
+moleski m@lesk/
+molesky m@lesk/
+molest m@lest
+molestation mOlcstAS~
+molested m@lest@d
+molester m@lestP
+molesters m@lestPz
+molesting m@lest6N
+molests m@les
+molests m@less
+molests m@lests
+molesworth mOlzwVT
+molex mOl@ks
+moliere m]ly,r
+moliere's m]ly,rz
+molin mOlin
+molina m@lEn@
+molinar mol~P
+molinari m{l~)r/
+molinaro m]l/n)r]
+moline m]lEn
+molineaux m{l~O
+molinelli m]l/nel/
+molino m]lEn]
+molitor m]lEtP
+moll mol
+molle mol
+mollen molin
+mollenhauer mol~h?P
+mollenkopf mol~k{f
+mollenkopf mol~k{pf
+moller molP
+mollering molP6N
+mollet molct
+mollett molct
+molley mol/
+mollica mol6k@
+mollie mol/
+mollified mol@fId
+mollify mol@fI
+mollison mol@s~
+mollner molnP
+mollo mol]
+mollohan mol@han
+molloy mol<
+mollusk mol@sk
+mollusks mol@sks
+molly mol/
+molly's mol/z
+mollycoddle mol/kod@l
+molnar mOlnP
+molnar mOlnor
+molner mOlnP
+molock mol@k
+molokai mol@kI
+moloney m@lOn/
+molonicks m@l{n6ks
+molony m@l{n/
+molotov m{l@tof
+molpus m{lp@s
+molpus' m{lp@s
+molpus's m{lp@s@z
+molson mOls~
+molstad mOlst@d
+molt mOlt
+molten mOlt~
+molter mOltP
+molting mOlt6N
+molton mOlt~
+moltz mOlts
+moly mOl/
+molybdenum m@libdcn}
+molyneaux mol~]
+molzahn mOlz~
+mom mom
+mom's momz
+moma mOm@
+moma's mOm@z
+moman mOm~
+momayez m]mAcz
+mombasa mombos@
+moment mOm~t
+moment's mOm~ts
+momentarily mOm~t,r@l/
+momentary mOm~ter/
+momentous m]ment@s
+moments mOm~ts
+momentum m]ment}
+momigliano m]migl/on]
+momma mom@
+mommens mom~z
+mommies mom/z
+mommy mom/
+mommy's mom/z
+momokawa mOm]kow@
+momokawa's mOm]kow@z
+moms momz
+mon mOn
+mon mon
+mona mOn@
+mona's mOn@z
+monacelli m]noCel/
+monachino m]nokEn]
+monaco mon@kO
+monad mOnad
+monadnock monadnok
+monagene mon@jEn
+monaghan mon@han
+monahan mon@han
+monarch monork
+monarch's monorks
+monarchies monork/z
+monarchist monorkist
+monarchists monorkis
+monarchists monorkiss
+monarchists monorkists
+monarchs monorks
+monarchy monork/
+monarrez m]n)rcz
+monash monaS
+monasteries mon@ster/z
+monastery mon@ster/
+monastic m~ast6k
+monasticism m~ast@siz}
+monatomic mon@tom6k
+monca mOnk@
+moncada m]nkod@
+moncayo m]nkA]
+monceaux m~sO
+moncrief monkr/f
+moncur monkP
+moncure m]nkqr/
+moncus monk@s
+monda mond@
+mondadori mond@d{r/
+mondale mondAl
+mondale's mondAlz
+mondallo mondal]
+mondavi mondov/
+monday mund/
+monday mundA
+monday's mund/z
+monday's mundAz
+mondays mund/z
+mondays mundAz
+monde mond
+mondelli m]ndel/
+mondello mondel]
+mondeo mondA]
+mondex mondcks
+mondo mond]
+mondor mondP
+mondragon m]ndrog{n
+mondrian mondr/an
+mondrian mondr/~
+mondry mondr/
+monds mondz
+mondschein mondSIn
+mondy mond/
+mone mOn
+monell mon@l
+mones mOnz
+monessen mOn@s~
+monessen m~es~
+monet m]nA
+monet's m]nAz
+monetarily mon@tV@l/
+monetarism mon@tPiz}
+monetarist mon@tPist
+monetarists mon@tPis
+monetarists mon@tPiss
+monetarists mon@tPists
+monetary mon@ter/
+monett monct
+monette m~et
+money mun/
+money's mun/z
+moneycard mun/kord
+moneycenter mun/sentP
+moneyed mun/d
+moneyless mun/l@s
+moneyline mun/lIn
+moneyline's mun/lInz
+moneymaker mun/mAkP
+moneymakers mun/mAkPz
+moneymaking mun/mAk6N
+moneypenny mun/pen/
+moneys mun/z
+moneywatch mun/woC
+moneyweek mun/wEk
+moneyweek's mun/wEks
+monfils monfilz
+monfort monfPt
+monforte m]nf{rt/
+mong m{N
+mongan moNg~
+monge monj
+mongeau m@NgO
+mongelli m]Ngel/
+mongeon monjin
+monger muNgP
+mongering muNgP6N
+mongers muNgPz
+mongiello m]njel]
+mongillo m]Ngil]
+mongol moNg@l
+mongold mongOld
+mongolia moNgOl/@
+mongolia moNgOly@
+mongolian moNgOl/~
+mongolian moNgOly~
+mongoloid moNg@l<d
+mongols moNg@lz
+mongoose moNgUs
+mongooses moNgUs@z
+mongosutu moNg]sUtU
+mongosutu's moNg]sUtUz
+mongstad m{Nstad
+monhollen monh@l~
+monica mon6k@
+monica's mon6k@z
+monical mon6k@l
+monico m]nEk]
+monied mun/d
+monier mOn/P
+monies mun/z
+monieson mOn/s~
+monieson's mOn/s~z
+monigold mon6gOld
+moniker mon6kP
+monikers mon6kPz
+moninger mOn6NP
+monique mOnEk
+monism moniz}
+monisms moniz}z
+monitor mon@tP
+monitored mon@tPd
+monitoring mon@tP6N
+monitors mon@tPz
+moniz moniz
+monje monj
+monk muNk
+monk's muNks
+monkee moNk/
+monkees moNk/z
+monkey muNk/
+monkeying muNk/6N
+monkeylike muNk/lIk
+monkeys muNk/z
+monks muNks
+monmouth monm@T
+monmouth's monm@Ts
+monn mon
+monnett monct
+monnier mon/P
+monnig mon6g
+monnin monin
+mono mOn]
+monocarpic mon@k)rp6k
+monochromatic mon@kr]mat6k
+monochrome mon@krOm
+monoclate mon@klAt
+monocle mon@k@l
+monoclinic mon@klin6k
+monoclonal mon@klOn@l
+monogamous m~og}@s
+monogamy m~og}/
+monogram mon@gram
+monogrammed mon@gramd
+monograph mon@graf
+monohull mon@h@l
+monolingual mon@liNgw@l
+monolith mon@liT
+monolithic mon@liT6k
+monoliths mon@liTs
+monologue mon@l{g
+monologues mon@l{gz
+monomer mon}P
+monomers mon}Pz
+monongahela m~{Ng@hAl@
+mononuclear mon~Ukl/P
+monophonic mon@fon6k
+monoplane mon@plAn
+monoplanes mon@plAnz
+monopole mon@pOl
+monopoles mon@pOlz
+monopolies m~op@l/z
+monopolist m~op@l@st
+monopolistic m~op@list6k
+monopolization m~op@l@zAS~
+monopolize m~op@lIz
+monopolized m~op@lIzd
+monopolizes m~op@lIz@z
+monopolizing m~op@lIz6N
+monopoly m~op@l/
+monorail monPAl
+monorails monPAlz
+monosaccharide mon@sakPId
+monoszon mon@zon
+monotheism mon@T/iz}
+monotone mon@tOn
+monotonous m~ot~@s
+monotony m~ot~/
+monotype mon@tIp
+monovalent mon@vAl~t
+monoxide m~oksId
+monreal monr@l
+monro monr]
+monroe m~rO
+monroe's m~rOz
+monroeville monrOvil
+monroeville m~rOvil
+monrovia monrOv/@
+monroy monr<
+monsanto monsant]
+monsanto's monsant]z
+monsees monsEz
+monsen mons~
+monsey monz/
+monsieur m@syV
+monsieurs m@syVz
+monsignor monsEnyP
+monsignors monsEnyPz
+monsky monsk/
+monsod monsod
+monson mons~
+monsoon monsUn
+monsoonal monsUn@l
+monsoons monsUnz
+monsour monsP
+monster monstP
+monsters monstPz
+monstrosity monstros@t/
+monstrous monstr@s
+mont mont
+montag m~tag
+montage montoZ
+montagna m]ntogn@
+montagne m~tAny
+montagnier montanyP
+montagnino m]ntognEn]
+montagu mont@gyU
+montagu's mont@gyUz
+montague mont@gyU
+montalban montalb~
+montalbano m]ntolbon]
+montalbo montalb]
+montalto m]ntolt]
+montalvo m]ntolv]
+montana montan@
+montana's montan@z
+montanan montan~
+montanans montan~z
+montanans m{ntan~z
+montanari m]nton)r/
+montanaro m]nton)r]
+montand mont~d
+montanez m]ntoncz
+montante m]ntont/
+montanye m]ntonyA
+montavon m]ntov{n
+montazeri mont@z,r/
+montblanc m]ntbloNk
+montblanc montblaNk
+montclair montkl,r
+monte mont/
+monte's mont/z
+monteagudo m]nt@gUd]
+montebello mont@bel]
+montecalvo m]ntckolv]
+montedison monted@s~
+montedison's monted@s@z
+montee mont/
+montefiore mont@f/{r/
+montefiore mont@fy{r
+monteforte m]ntcf{rt/
+montefusco m]ntcfUsk]
+montego m{ntEg]
+monteil montIl
+monteiro mont,r]
+montejano montAon]
+montel montel
+montel's montelz
+monteleone montAlAOn/
+montella montel@
+montello montel]
+montelongo montclONg]
+montemarano montcmoron]
+montemayor montAmA{r
+montemurro montcmqr]
+montenay mont~A
+montenegran mont~Agr~
+montenegro mont~Agr]
+montenegro's mont~Agr]z
+monter montP
+monterey monPA
+monterey montPA
+montero mont,r]
+monterosso m]ntPOs]
+monterrey monPA
+monterrey monPrA
+monterrey montPA
+monterrey montPrA
+montes mont/z
+montesano m]ntcson]
+montesdeoca m]ntcsd/ok@
+montesi m]ntes/
+montesino m]ntcsEn]
+montessori mont@s{r/
+monteverde m]ntcv,rd/
+montevideo mont@vid/O
+montez m]ntez
+montezuma mont@zUm@
+montford m~tf{rd
+montfort montfPt
+montgomery montgumr/
+montgomery's montgumr/z
+montgoris montg{r@s
+month munT
+month's munTs
+monthlong munTl{N
+monthly munTl/
+months munTs
+months' monTs
+monti mont/
+monticciolo montEC/Ol]
+monticello mont@sel]
+montie mont/
+montiel m]nt/el
+montien montEcn
+montieth mont/@T
+montijo m]ntEy]
+montini m]ntEn/
+montjoy montj<
+montminy montmin/
+montone m]ntOn/
+montooth montUT
+montoya mont<@
+montpelier montpEl/P
+montpelier's montpEl/Pz
+montreal muntr/{l
+montreal's montr/olz
+montrone montrOn
+montrose montrOz
+montross mOntr]s
+montroy montr<
+monts monts
+montuori m]ntw{r/
+montvale montvAl
+montville mOntvil
+monty m{nt/
+montz monts
+monument monyUm~t
+monument mony}~t
+monumental monyUment@l
+monumental mony}en@l
+monumental mony}ent@l
+monumentally monyUmen@l/
+monumentally monyUment@l/
+monumentally mony}en@l/
+monumentally mony}ent@l/
+monuments monyUm~ts
+monuments mony}~ts
+monus mOn@s
+mony mOn/
+monzert monzPt
+monzingo m]nzENg]
+monzo monz]
+monzon m]nz{n
+monzonite monz~It
+mooberry mUber/
+mood mUd
+moodie mUd/
+moods mUdz
+moody mUd/
+moody's mUd/z
+mooers mUPz
+moog mUg
+mook mqk
+moomaw mUm{
+moomey mUm/
+moon mUn
+moon's mUnz
+moonbeam mUnbEm
+moondreamer mUndrEmP
+moondreamers mUndrEmPz
+moone mUn
+mooney mUn/
+mooneyham mUn/h}
+mooneyhan mUn/h~
+moonie mUn/
+moonies mUn/z
+moonlight mUnlIt
+moonlighting mUnlIt6N
+moonlike mUnlIk
+moonlit mUnlit
+moons mUnz
+moonshine mUnSIn
+moonstone mUnstOn
+moonstruck mUnstruk
+moonves mUnvcz
+moor mqr
+mooradian mqrAd/~
+moorco mqrk]
+moorco m{rk]
+moore mqr
+moore m{r
+moore's mqrz
+moore's m{rz
+moored mqrd
+moorefield mqr@f/ld
+moorefield mqrf/ld
+moorehead mqrhed
+moorehouse mqrh?s
+moorer mqrP
+moores mqrz
+moorestown m{rzt?n
+moorhead mqrhed
+moorhouse mqrh?s
+mooring mqr6N
+moorings mUr6Nz
+moorings m{r6Nz
+moorish mqr6S
+moorland mqrland
+moorland's mqrlandz
+moorlands mqrlandz
+moorman mqrm~
+moormann mqrm~
+moors mqrz
+moos mUz
+moosa mUs@
+moose mUs
+moosehead mUshed
+moosman mUsm~
+moot mUt
+moothart mUTort
+moots mUts
+mooty mUt/
+mootz mUts
+mop mop
+mopboard mopb{rd
+mope mOp
+moping mOp6N
+mopped mopt
+moppes mops
+mopping mop6N
+mops mops
+mopus mOp@s
+moquin m]kwEn
+mor m{r
+mor's m{rz
+mora m{r@
+morabito m{robEt]
+morace m{roC/
+morachov m{r@C{v
+morad m{r@d
+morado m{rod]
+moraga m{rog@
+moragne mPAny
+morahan m{r@han
+morain mPAn
+morainal mPAn@l
+moraine mPAn
+morais mPA
+moraitis m{rItis
+moral m{r@l
+morale mPal
+morales mPalz
+morales m{ralcs
+moralez m{rolcz
+moralism m{r@liz}
+moralist m{r@list
+moralistic m{r@list6k
+moralists m{r@l@s
+moralists m{r@l@ss
+moralists m{r@l@sts
+morality mPal@t/
+moralize m{r@lIz
+moralizing m{r@lIz6N
+morally m{r@l/
+morals m{r@lz
+moran mPan
+morand m{r~d
+morandan m@rand~
+morandi m{rond/
+morando m{rond]
+morang m{r@N
+morano m{ron]
+morant m{r~t
+morante m{ront/
+morash m{ruS
+moraski mPosk/
+morass mPas
+morasses mPas@z
+morath m{r@T
+moratoria m{r@t{r/@
+moratorium m{r@t{r/}
+moratoriums m{r@t{r/}z
+moravec mPov6k
+moravek m{r@v6k
+moravian mPAv/~
+morawski mPofsk/
+moray mPA
+moray m{rA
+morays mPAz
+morays m{rAz
+morbid m{rb@d
+morbidity m{rbid@t/
+morby m{rb/
+morcom m{rk}
+mord m{rd
+mordant m{rd~t
+mordecai m{rd@kI
+mordechai m{rd@kI
+morden m{rd~
+more m{r
+morea m{r/@
+moreau mPO
+moredock m{r@dok
+moree mPE
+moreen m{rEn
+morefield m{r@fEld
+morefield m{rfEld
+morehart m{rhort
+morehead m{rhcd
+morehouse m{rh?s
+moreira m{r,r@
+morejon m{r6jon
+morel mPel
+moreland m{rl~d
+morell m{r@l
+morella m{rel@
+morelli m{rel/
+morello mPel]
+morelock m{r@lok
+moreman m{rm~
+moren m{r~
+morena m{rAn@
+morency m{r{ns/
+moreno m{rAn]
+moreno m{rEn]
+moreover m{rOvP
+morera m{r,r@
+mores m{rAz
+mores m{rEz
+moresco m{resk]
+moreso m{res]
+moret m{rct
+moreton m{r@ton
+moretti m{ret/
+moretto m{ret]
+moretz m{rcts
+morever m{rvP
+morey m{r/
+morfin m{rfin
+morford m{rfPd
+morga m{rg@
+morgado m{rgod]
+morgan m{rg~
+morgan's m{rg~z
+morgana m{rgan@
+morgans m{rg~z
+morganstern m{rg~stPn
+morgante m{rgont/
+morganti m{rgont/
+morgantown m{rg~t?n
+morgart m{rgort
+morgen m{rg~
+morgenroth m{rg~r{T
+morgenstern m{rg~stPn
+morgenthaler m{rg~T@lP
+morgenthau m{rg~T?
+morgue m{rg
+morgues m{rgz
+morgun m{rg~
+mori m{r/
+moria m{r/@
+morial m{r/@l
+moriarity m{r/)r@t/
+moriarty m{r/)rt/
+moribund m{r@b~d
+moric m{r6k
+morice m{ris
+morici m{rEC/
+morihiro m{r/hir]
+morihiro's m{r/hir]z
+morikawa m{r/kow@
+morillo m{ril]
+morillom m{r@l{n
+morillono m{ril~]
+morimoto m{r/mOt]
+morin m{rin
+morine m{rEn/
+moring m{r6N
+morini m{rEn/
+morino m{rEn]
+morioka m{r/Ok@
+moris m{ris
+morisette m{r@sct
+morishita m{r/SEt@
+morison m{r@s~
+morissette m{r@sct
+morita m{rEt@
+moritz m{rits
+moriya m{rE@
+morjera m{rj,r@
+mork m{rk
+morken m{rk~
+morlan m{rl~
+morland m{rl~d
+morley m{rl/
+morlock m{rl@k
+morman m{rm~
+mormile m{rmIl
+mormino m{rmEn]
+mormon m{rm~
+mormonism m{rm~iz}
+mormons m{rm~z
+morna m{rn@
+morneau mPnO
+morneault mPnO
+morning m{rn6N
+morning's m{rn6Nz
+mornings m{rn6Nz
+morningstar m{rn6Nstor
+morningstar's m{rn6Nstorz
+moro m{rO
+moroccan mPok~
+moroccans mPok~z
+morocco mPok]
+moron m{ron
+morones m{rOncs
+moroney mPOn/
+moroni mPOn/
+moros m{r]z
+morose mPOs
+morosky m{r{sk/
+morovcic m{rovC6k
+morovcic's m{rovC6ks
+morowick m{r@wik
+moroz m{r]z
+morph m{rf
+morphew m{rfyU
+morphin m{rf~
+morphine m{rf/n
+morphing m{rf6N
+morphis m{rfis
+morphogenesis m{rf@jen@s@s
+morphological m{rf@loj6k@l
+morphology m{rfol@j/
+morphonios m{rf{n/@s
+morphonios m{rf{n/]s
+morphs m{rfs
+morr m{r
+morra m{r@
+morrall m{rol
+morreale m{rEl/
+morrell m{rel
+morren m{r~
+morrical m{r6k@l
+morrie m{r/
+morrill m{rEl
+morrin m{rin
+morris m{r@s
+morris' m{r@s
+morris's m{ris@z
+morrisett m{r@set
+morrisette m{risct
+morrisey m{ris/
+morrish m{riS
+morrison m{ris~
+morrison's m{ris~z
+morriss m{ris@z
+morrissette m{risct
+morrissey m{ris/
+morristown m{r@st?n
+morrisville m{r@svil
+morrisville's m{r@svilz
+morro m{r]
+morrone m{rOn/
+morrow m)r]
+morry m{r/
+morsch m{rS
+morse m{rs
+morsel m{rs@l
+morsels m{rs@lz
+morson m{rs~
+morss m{rs
+mort m{rt
+mortal m{rt@l
+mortality m{rtal@t/
+mortally m{rt@l/
+mortals m{rt@lz
+mortar m{rtP
+mortara m{rt)r@
+mortars m{rtPz
+morteki m{rtek/
+mortell m{rtAl
+mortellaro m{rtcl)r]
+mortem m{rt}
+mortems m{rt}z
+morten m{rt~
+mortensen m{rt~s~
+mortenson m{rt~s~
+morter m{rtP
+mortgage m{rg6j
+mortgage's m{rg6j@z
+mortgaged m{rg6jd
+mortgagepower m{rg6jp?r
+mortgages m{rg@j@z
+mortgaging m{rg6j6N
+mortician m{rtiS~
+mortie m{rt/
+mortier m{rt/P
+mortified m{rt@fId
+mortify m{rt@fI
+mortimer m{rt}P
+mortimore m{rtEm{r
+mortis m{rtis
+mortland m{rtl~d
+mortner m{rtnP
+morton m{rt~
+morton's m{rt~z
+mortuary m{rCUer/
+morty m{rt/
+moruhiro m{rUhir]
+moruhiro's m{rUhir]z
+morvant m{rv~t
+morven m{rv~
+morvillo m{rvil]
+mory m{r/
+morze m{rz
+mosaic m]zA6k
+mosaical m]zA6k@l
+mosaics m]zA6ks
+mosbacher mosbokP
+mosbrucker mosbr@kP
+mosca mOsk@
+moscato m]skot]
+moschella m]skel@
+moschetti m]sket/
+mosco mOsk]
+moscom m{sk}
+moscoso m]skOs]
+moscow moskO
+moscow m{sk?
+moscow's moskOz
+moscow's m{sk?z
+moscowane mosk]wAn
+mose mOz
+mosel mOs@l
+moseley mOzl/
+moseley-braun mOzl/bron
+moselle m]zel
+mosely mOzl/
+moseman mOsm~
+moser mOzP
+moses mOz@s
+mosey mOz/
+mosh m{S
+moshe mOS@
+moshe m]Se
+moshe's mOS@z
+moshe's m]Sez
+mosher mOZP
+moshier moS/P
+moshood moshqd
+moshus mOS@s
+moshus mUS@s
+mosie mos/
+mosier mOZP
+mosier mOz/P
+mosiman mOs/m~
+mosk m{sk
+moskal mosk@l
+moskatel's m{sk@telz
+mosko mOsk]
+moskolenko m{sk]leNk]
+moskovitz mosk@vits
+moskow mosk]
+moskowitz m{sk@wits
+moskwa moskv@
+mosle mOs@l
+moslem mozl}
+moslems mozl}z
+mosler mos@lP
+mosley mOzl/
+mosman mosm~
+mosque mosk
+mosqueda m]skwAd@
+mosquera m]skw,r@
+mosques mosks
+mosquito m@skEt]
+mosquitoes m@skEt]z
+mosquitos m@skEt]z
+moss m{s
+mossad m]sad
+mossad m]sod
+mossbacher mosbokP
+mossbarger mosborgP
+mossberg m{sbPg
+mossburg m{sbPg
+mosser m{sP
+mosses m{s@z
+mossey mos/
+mossholder m{shOldP
+mosslike m{slIk
+mossman m{sm~
+mosso mOs]
+most mOs
+most mOst
+mostar mOstor
+mostar's mOstorz
+mostek most6k
+mosteller most@lP
+moster mOstP
+mostly mOsl/
+mostly mOstl/
+mostoller most]lP
+mostow most?
+mostrom mostr}
+mostyn mostin
+mosul mOs@l
+mosur mOsqr
+moszkowski mosk?sk/
+mota mOt@
+mote mOt
+motel m]tel
+motels m]telz
+moten mOt~
+motes mOts
+moteurs m]tUrz
+moth m{T
+mothball m{Tb{l
+mothballed m{Tb{ld
+mothballing m{Tb{l6N
+mothballs m{Tb{lz
+mother muTP
+mother's muTPz
+mothercare muTPker
+motherhood muTPhqd
+mothering muTP6N
+motherland muTPland
+motherless muTPl@s
+motherly muTPl/
+mothers muTPz
+mothers' muTPz
+mothers-in-law muTPzinl{
+mothershead muTPzhed
+mothershed muTPSed
+mothon moT~
+moths m{Ts
+motif m]tEf
+motifs m]tEfs
+motile mOt@l
+motility m]til@t/
+motion mOS~
+motioned mOS~d
+motioning mOS~6N
+motionless mOS~l@s
+motions mOS~z
+motivate mOt@vAt
+motivated mOt@vAt@d
+motivates mOt@vAts
+motivating mOt@vAt6N
+motivation mOt@vAS~
+motivational mOt@vAS~@l
+motivations mOt@vAS~z
+motivator mOt@vAtP
+motive mOt6v
+motives mOt6vz
+motl mot@l
+motley motl/
+moto mOt]
+moto mot]
+motohashi mOt]hoS/
+motola m]tOl@
+moton mOt]n
+motonori mOt]n{r/
+motor mOtP
+motor's mOtPz
+motorbike mOtPbIk
+motorbikes mOtPbIks
+motorboat mOtPbOt
+motorcade mOtPkAd
+motorcades mOtPkAdz
+motorcar mOtPkor
+motorcars mOtPkorz
+motorcycle mOtPsIk@l
+motorcycles mOtPsIk@lz
+motorcyclist mOtPsIk@l@st
+motorcyclists mOtPsIk@l@s
+motorcyclists mOtPsIk@l@ss
+motorcyclists mOtPsIk@l@sts
+motoren mOtP~
+motoring mOtP6N
+motorist mOtP@st
+motorists mOtP@s
+motorists mOtP@ss
+motorists mOtP@sts
+motorize mOtPIz
+motorized mOtPIzd
+motorola mOtPOl@
+motorola's mOtPOl@z
+motors mOtPz
+motors' mOtPz
+motown mOt?n
+motown's mOt?nz
+motrin motrin
+mots mots
+motsinger mots~jP
+motsoaledi mots]lAd/
+mott mot
+mott's mots
+motte mot
+motter motP
+mottern motPn
+mottl mot@l
+mottled mot@ld
+mottley motl/
+mottling mot@l6N
+motto mot]
+mottola m]tOl@
+mottos mot]z
+mottram motr}
+motts mots
+mottus mot@s
+motyka motIk@
+motyl mOt@l
+motz mots
+motzer mOtzP
+motzko motsk]
+moua m?@
+moudry mOdr/
+moudy m?d/
+moueix mUwIks
+moul m?l
+mould mOld
+moulden mOld~
+moulder mOldP
+moulding mOld6N
+mouldings mOld6Nz
+moulds mOldz
+mouldy mOld/
+moulin mUlan
+moulinex mUl~cks
+moulthrop m?lTr@p
+moulton mOlt~
+moultrie mOltr/
+mounce m?ns
+mound m?nd
+mounds m?ndz
+mounger m?NP
+mounsey m?ns/
+mount m?nt
+mountain m?nt~
+mountain's m?nt~z
+mountaineer m?nt~ir
+mountainous m?nt~@s
+mountains m?nt~z
+mountainside m?nt~sId
+mountainsides m?nt~sIdz
+mountaintop m?nt~top
+mountaintops m?nt~tops
+mountcastle m?ntkas@l
+mounted m?n@d
+mounted m?nt@d
+mountford mUntf{rd
+mounties m?n/z
+mounties m?nt/z
+mounting m?nt6N
+mountjoy m?ntj<
+mountleigh m?ntlE
+mountleigh's m?ntlEz
+mounts m?nts
+mountz m?nts
+moura mqr@
+mourad mUrad
+mouradian m{rAd/~
+mourer m{rP
+mourn m{rn
+mourned m{rnd
+mourner m{rnP
+mourners m{rnPz
+mournful m{rnf@l
+mourning m{rn6N
+mourns m{rnz
+mouse m?s
+mousehole m?shOl
+mousel mUsel
+mouser m?zP
+mousers m?zPz
+mousetrap m?strap
+mousley m?sl/
+moussa m?s@
+mousse mUs
+mousseau mUsO
+moustache mustaS
+mouth m?T
+mouthed m?Td
+mouthful m?Tfql
+mouthing m?T6N
+mouthpart m?Tport
+mouthparts m?Tports
+mouthpiece m?TpEs
+mouthpieces m?TpEs@z
+mouths m?Tz
+mouthwash m?TwoS
+mouthy m?T/
+moutray mUtrA
+moutse mUts/
+mouw m?w
+mouzon mUz{n
+movable mUv@b@l
+move mUv
+moved mUvd
+movement mUvm~t
+movement's mUvm~ts
+movements mUvm~ts
+mover mUvP
+movers mUvPz
+moves mUvz
+movida mUvEd@
+movie mUv/
+movie's mUv/z
+moviegoer mUvEgOP
+moviegoers mUvEgOPz
+moviegoing mUvEgO6N
+movielab mUv/lab
+moviemaker mUvEmAkP
+moviemakers mUvEmAkPz
+moviemaking mUvEmAk6N
+movies mUv/z
+movietime mUv/tIm
+moving mUv6N
+movingly mUv6Nl/
+mow mO
+mowat mO@t
+mowatt mO@t
+mowbray mObrA
+mowdy mOd/
+mowed mOd
+mowell mowcl
+mowen mO~
+mower mOP
+mowers mOPz
+mowery m?P/
+mowing m?6N
+mowrer m{rP
+mowrey m{r/
+mowry m{r/
+mows m?z
+moxie moks/
+moxley moksl/
+moxon moks~
+moy m<
+moya m<@
+moye m<
+moyer m<P
+moyer's m<Pz
+moyers m<Pz
+moyes m<z
+moyl m<l
+moylan m<l~
+moyle m<l
+moyna m<n@
+moynahan m<n@han
+moynihan m<n@han
+moynihan's m<n@hanz
+moyse m<s
+mozambican mOzamb/k~
+mozambicans mOzamb/k~z
+mozambique mOzambEk
+mozambique mOz}bEk
+mozart mOtsort
+mozart mOzort
+mozart's mOtsorts
+mozart's mOzorts
+mozartean mOtz)rt/~
+mozartean mOz)rt/~
+mozee moz/
+mozelle m@zel
+mozena m@zEn@
+mozer mOzP
+mozer's mOzPz
+mozingo m]zENg]
+mozley mozl/
+mpeg empeg
+mpg empEjE
+mpg mIlzpPgal~
+mph empEAC
+mph mIlzpP?P
+mr mistP
+mr. mistP
+mraz mraz
+mrazek mrozck
+mrazik mroz6k
+mroczek mroCck
+mroczka mroCk@
+mroczkowski mr@Ck{fsk/
+mrotek mrOtek
+mroz mroz
+mrozek mrOzck
+mrozinski mr@zinsk/
+mrs mis@z
+mrs. mis@z
+mruk mruk
+ms miz
+ms. miz
+msgr monsEnyP
+mssrs mesPz
+mssrs. mesPz
+mt emtE
+mt m?nt
+mtel emtel
+mu mU
+muammar mUamP
+muavenet mU@ven@t
+mubarak mUb)r6k
+mubarak myUb)r6k
+mubarak's mUb)r6ks
+mubarak's myUb)r6ks
+mucci mUC/
+muccio mUC/]
+much muC
+mucha muC@
+muchmore mukm{r
+muchnick mukn6k
+muchow muC]
+muck muk
+muckenfuss muk~fus
+muckey muk/
+mucking muk6N
+muckle muk@l
+muckleroy muklP<
+muckrake mukrAk
+muckraker mukrAkP
+muckraking mukrAk6N
+mucky muk/
+mucosa myUkOs@
+mucosal myUkOs@l
+mucous myUk@s
+mucus myUk@s
+mud mud
+mudd mud
+muddied mud/d
+muddier mud/P
+muddle mud@l
+muddled mud@ld
+muddleheaded mud@lhed@d
+muddles mud@lz
+muddling mud@l6N
+muddling mudl6N
+muddy mud/
+muddying mud/6N
+mudge muj
+mudgett muj@t
+mudra mudr@
+mudrick mudr6k
+mudry mudr/
+muds mudz
+mudslide mudslId
+mudslides mudslIdz
+mudslinging mudsliN6N
+mudwagon mudwag~
+muecke mUk
+muegge mUg
+muehl myUl
+muehlbauer myUlb?P
+muehlebach myUlbok
+mueller myUlP
+muellner myUlnP
+muench myUNk
+muenchen myUnC~
+muenchow mUnC?
+muenster myUnstP
+muetzel myUtz@l
+muff muf
+muffin muf~
+muffins muf~z
+muffle muf@l
+muffled muf@ld
+muffler muflP
+mufflers muflPz
+muffley mufl/
+muffoletto mUf]let]
+muffs mufs
+muffy muf/
+mug mug
+mugabe mUgobA
+mugabe's mUgobAz
+mugar myUgP
+mugavero mUgov,r]
+mugford mugfPd
+mugged mugd
+mugger mugP
+muggeridge mugPij
+muggers mugPz
+mugging mug6N
+muggings mug6Nz
+muggsy mugs/
+muggy mug/
+mughniyeh mugn@y@
+mugniyah mugn@y@
+mugs mugz
+mugu mUgU
+muha myUh@
+muhabara mUh@b)r@
+muhamed mqhomcd
+muhamed's mqhomcdz
+muhammad mqhom@d
+muhammad's mqhom@dz
+muhammed mqhomcd
+muhammed's mqhomcdz
+muharram m@har}
+muhl mul
+muhlbauer mUlb?P
+muhlenkamp mUl~kamp
+muhr mqr
+muhs mus
+mui mU6
+muilenburg mUl~bPg
+muir myqr
+muirfield myqrf/ld
+muirhead myqrhed
+muise mUz
+mujahadeen myUjah@dEn
+mujahedeen mUj@hcdEn
+mujahideen mUj@hcdEn
+mujica myUj6k@
+mujzel mujz@l
+mukai mUko/
+mukasey myUk@s/
+mukherjee m@khVj/
+mukhopadhyay mUk]podyI
+mukluk mukl@k
+mul's mqlz
+mula myUl@
+mulanaphy myUl~af/
+mulanax myUl~aks
+mulatto m@lot]
+mulberry mulber/
+mulcahey mulk@h/
+mulcahy m@lkAh/
+mulcare mulkP
+mulch mulC
+mulched mulCt
+mulches mulC@z
+mulching mulC6N
+mulder muldP
+muldoon m@ldUn
+muldorfer muld{fP
+muldowney muld?n/
+muldrew muldrU
+muldrow muldr?
+mule myUl
+mules myUlz
+mulford mulfPd
+mulgrew mulgrU
+mulhall mulh@l
+mulhearn mulhPn
+mulheren m@lh,r~
+mulheren's m@lh,r~z
+mulherin mulhPin
+mulhern mulhPn
+mulholland mulhol~d
+mulhouse mulh?s
+mulkern mulkPn
+mulkey mulk/
+mulkins mulkinz
+mull mul
+mullady mul@d/
+mullah mul@
+mullahs mul@z
+mullally mul@l/
+mullaly mul@l/
+mullan mul~
+mullane mul~
+mullaney mul~/
+mullany mul~/
+mullarkey m@l)rk/
+mulldorfer muld{rfP
+mulled muld
+mullen mul~
+mullenax mul~aks
+mullendore mUlend{r
+mullenix mUl~6ks
+mullenix mul~6ks
+mullens mul~z
+muller mulP
+muller's mulPz
+mullet mul@t
+mullett mUlct
+mullican mul6k~
+mulligan mul6g~
+mulliken mul6k~
+mullikin mul6kin
+mullin mulin
+mullinax mul~aks
+mullineaux mul~O
+mulling mul6N
+mullings mul6Nz
+mullinix mulin6ks
+mullins mulinz
+mullis mulis
+mulloy mul<
+mulls mulz
+mulnix muln6ks
+mulqueen m@lkwEn
+mulroney m@lrOn/
+mulroney's m@lrOn/z
+mulrooney mulrUn/
+mulroy mulr<
+mulry mulr/
+multer multP
+multi mult/
+multibank mult/baNk
+multibillion multEbily~
+multibillion multIbily~
+multicandidate mult/kand@d@t
+multicandidate mult/kand@dAt
+multicenter mult/sentP
+multicolor mult/kulP
+multicolored mult/kulPd
+multicultural mult/kulCP@l
+multiculturalism mult/kulCP@liz}
+multiemployer mult/}pl<P
+multiethnic mult/eTn6k
+multifacet mult/fas@t
+multifaceted mult/fas@t@d
+multifamily mult/faml/
+multifamily multIfam@l/
+multifoods mult/fUdz
+multifoods' mult/fUdz
+multilateral mult/latP@l
+multilateral mult@latP@l
+multilateralism mult@latP@liz}
+multilaterally mult/latP@l/
+multilaterally mult@latP@l/
+multilayer mult/lAP
+multilayered mult/lAPd
+multilevel mult/lev@l
+multilevel multIlev@l
+multiline mult/lIn
+multilingual mult/liNw@l
+multilingual multIliNw@l
+multimarket mult/m)rk@t
+multimate mult/mAt
+multimedia mult/mEd/@
+multimedia multImEd/@
+multimedia's mult/mEd/@z
+multimedia's multImEd/@z
+multimillion multEmily~
+multimillion multImily~
+multimillionaire mult/mily~,r
+multimillionaire multImily~,r
+multimillionaires mult/mily~,rz
+multimillionaires multImily~,rz
+multinational multEnaS~@l
+multinational multInaS~@l
+multinationals multEnaS~@lz
+multinationals multInaS~@lz
+multipart mult/port
+multiparty mult/port/
+multiplayer mult/plAP
+multiple mult@p@l
+multiples mult@p@lz
+multiplex mult/pleks
+multiplexer mult/pleksP
+multiplexers mult/pleksPz
+multiplication mult@pl@kAS~
+multiplicity mult@plis@t/
+multiplied mult@plId
+multiplier mult@plIP
+multiplies mult@plIz
+multiply mult@plI
+multiplying mult@plI6N
+multiprocessor mult/prosesP
+multipurpose mult/pVp@s
+multiracial multIrAS@l
+multistate mult/stAt
+multistory mult/st{r/
+multitask mult/task
+multitasking mult/task6N
+multitude mult@tUd
+multitude mult@tyUd
+multitudes mult@tyUdz
+multiuser mult/yUzP
+multivalve mult/valv
+multivision mult/viZ~
+multiyear mult/yEr
+multnomah mulnOm@
+mulvaney mulvAn/
+mulvany mulvAn/
+mulvehill mulv@hil
+mulvehill mulvhil
+mulvey m@lvA
+mulvihill mulv/hil
+mum mum
+muma myUm@
+mumaw mUm{
+mumble mumb@l
+mumbled mumb@ld
+mumbles mumb@lz
+mumbling mumb@l6N
+mumbling mumbl6N
+mumbo mumb]
+mumby mumb/
+mumford mumfPd
+mumia m}Ey@
+mumm mum
+mumma mum@
+mumme mum
+mummert mumPt
+mummey mum/
+mummies mum/z
+mummification mum@f6kAS~
+mummified mum@fId
+mummify mum@fI
+mummifying mum@fI6N
+mummy mum/
+mummy's mum/z
+mumper mumpP
+mumphrey mumfr/
+mumpower mump]P
+mumps mumps
+mums mumz
+mun mun
+munafo mUnof]
+munce muns
+muncee muns/
+muncey muns/
+munch munC
+munchausen munC?z~
+munched munCt
+munchies munCEz
+munching munC6N
+muncie muns/
+muncy muns/
+mund mund
+mundane m~dAn
+munday mundA
+mundell mund@l
+munden mund~
+mundi mund/
+mundie mund/
+mundinger mund6NP
+mundis mundis
+mundo mund]
+mundorf mund{rf
+mundorff mund{rf
+mundt munt
+mundy mund/
+munford munfPd
+munford's munfPdz
+munger muNP
+mungia mUnj@
+mungin muNgin
+mungle muNg@l
+mungo muNg]
+munguia mUngw/@
+muni myUn/
+munich myUn6k
+munich's myUn6ks
+municipal myUnis@p@l
+municipalities myUnis@pal@t/z
+municipality myUnis@pal@t/
+municipally myUnis@p@l/
+municipally myUnis@pl/
+municipals myUnis@p@lz
+munier myUn/P
+munis myUnis
+munition myUniS~
+munitions myUniS~z
+muniz myUniz
+munk muNk
+munkres muNkPz
+munley munl/
+munn mun
+munnell mun@l
+munnerlyn m~Vlin
+munni mun/
+munni myUn/
+munns munz
+munos mUn]z
+munoz mUny]z
+munro m~rO
+munroe munr]
+muns munz
+munsch munS
+munsell muns@l
+munsey munz/
+munsingwear muns6Nwer
+munson muns~
+munster munstP
+munsterman munstPm~
+munt munt
+muntean m~tEn
+munter muntP
+muntz munts
+munyan muny~
+munyon muny~
+munz munz
+munzer munzP
+muoio mwO/]
+muolo mwOl]
+muppet mup@t
+muppets mup@ts
+mura mqr@
+murad myqrad
+murai myPI
+murakami mqrokom/
+mural myqr@l
+murali mPol/
+murals myqr@lz
+muramatsu mUromotsU
+muramoto mqromOt]
+muranaga mPr~og@
+murano mqron]
+muraoka mqroOk@
+murase myVAz
+muraski mPosk/
+murasky mPask/
+murata mqrot@
+muratore mqrot{rA
+muravich mV@viC
+murawski mPofsk/
+murayama mVIom@
+murayama's mVIom@z
+murch mVk
+murchie mVC/
+murchinson mVC~s~
+murchison mVC@s~
+murdaugh mVd{
+murden mVd~
+murder mVdP
+murdered mVdPd
+murderer mVdPP
+murderer's mVdPPz
+murderers mVdPPz
+murdering mVdP6N
+murderous mVdP@s
+murders mVdPz
+murdick mVd6k
+murdoch mVdok
+murdoch's mVdoks
+murdock mVdok
+murdock's mVdoks
+murdocks mVdoks
+murdy mVd/
+murff mVf
+murfin mVfin
+murguia mqrgw/@
+muri mqr/
+murial myqr/@l
+murias myqr/@s
+muriel myqr/@l
+murihuro mqr/hqr]
+murihuro's mqr/hqr]z
+murillo m@ril]
+murin myqrin
+murine myqrEn
+murjani mPjon/
+murk mVk
+murkier mVk/P
+murkowski mPk?sk/
+murky mVk/
+murley mVl/
+murmansk mPmansk
+murmur mVmP
+murmured mVmPd
+murmuring mVmP6N
+murmurs mVmPz
+murnan mVn~
+murnane mVn~
+murnian mVn/~
+muro mqr]
+murph mVf
+murphey mVf/
+murphree mPfrE
+murphrey mVfr/
+murphy mVf/
+murphy's mVf/z
+murphys mVf/z
+murr mV
+murrah mPro
+murray mV/
+murray mur/
+murray's mV/z
+murree mV/
+murrelet mVlct
+murrell m{r@l
+murren mV~
+murrey mV/
+murrie mV/
+murrieta mqrEt@
+murrill m{r@l
+murrin m{rin
+murrow mur]
+murry mV/
+murtagh mVt@g
+murtaugh mVt{
+murtha mVT@
+murthy mVT/
+murto mVtO
+murton mVt~
+murty mVt/
+murveit mPvEt
+murzyn mVzin
+musa myUs@
+musacchio myUsak/]
+musalo m@sol]
+musante mUsont/
+musarra mUs)r@
+musavi myUsov/
+musburger musbPgP
+muscarella mUskorel@
+muscarello mUskorel]
+muscat muskat
+muscatine musk@tEn
+muscato mUskot]
+musch muS
+muscle mus@l
+muscled mus@ld
+muscles mus@lz
+muscling mus@l6N
+muscling musl6N
+musco mUsk]
+muscocho m@skoC]
+muscovite musk@vIt
+muscovites musk@vIts
+muscular musky@lP
+musculature musky@l@CP
+muse myUz
+mused myUzd
+musee myUzE
+muses myUz@z
+museum myUz/}
+museum myUzE}
+museum's myUzE}z
+museums myUz/}z
+museums myUzE}z
+musgrave musgr@v
+musgrave musgrAv
+musgrave's musgr@vz
+musgrave's musgrAvz
+musgrove musgr@v
+mush muS
+musha mUS@
+musha myUS@
+musher muSP
+mushers muSPz
+mushroom muSrUm
+mushroomed muSrqmd
+mushrooming muSrqm6N
+mushrooms muSrUmz
+mushrush muSruS
+mushtaq muStak
+mushy muS/
+musial myUz/@l
+music myUz6k
+music's myUz6ks
+musica myUz6k@
+musica's myUz6k@z
+musical myUz6k@l
+musicality myUz6kal@t/
+musically myUz6kl/
+musicals myUz6k@lz
+musich myUs6k
+musician myUziS~
+musician's myUziS~z
+musicians myUziS~z
+musicians' myUziS~z
+musicianship myUziS~Sip
+musick myUs6k
+musicland myUz6kland
+musicologist myUz6kol@j@st
+musidora mUs/d{r@
+musil mUz@l
+musing myUz6N
+musings myUz6Nz
+musk musk
+muska musk@
+muske musk
+muskegon m@skEg~
+musket musk@t
+musketeer musk@tEr
+musketeers musk@tErz
+muskie musk/
+muskie's musk/z
+muskmelon muskmel~
+muskogee m@skOg/
+muskopf musk{f
+muskopf musk{pf
+muskrat muskrat
+muskrats muskratz
+musky musk/
+muslim muzl}
+muslims muzl}z
+muslin muzl~
+musman musm~
+musolf myUsOlf
+musolino mUs]lEn]
+musschenbroek m@sCenbr]k
+mussel mus@l
+mussell mus@l
+musselman mus@lm~
+mussels mus@lz
+musselwhite mus@lwIt
+musser musP
+mussman musm~
+musso mUs]
+mussolini mUs]lEn/
+mussolini's mUs]lEn/z
+musson mus~
+must must
+must've must6v
+mustache mustaS
+mustached mustaSt
+mustaches mustaS@z
+mustachio m@staS/O
+mustachioed m@staS/Od
+mustafa mUstof@
+mustain m@stAn
+mustang mustaN
+mustangs mustaNz
+mustard mustPd
+mustards mustPdz
+muster mustP
+mustered mustPd
+mustering mustP6N
+musters mustPz
+mustin mustin
+mustn't mus~t
+musto must]
+mustoe must]
+muston must~
+musty must/
+musumeci mUsUmeC/
+muszynski m@Sinsk/
+mutagen myUt@jcn
+mutagens myUt@jcnz
+mutant myUt~t
+mutants myUt~ts
+mutate myUtAt
+mutated myUtAt@d
+mutating myUtAt6N
+mutation myUtAS~
+mutations myUtAS~z
+mutch muC
+mutchler muClP
+mute myUt
+muted myUt@d
+mutert myUtPt
+muth mUT
+muti mUtE
+muti myUt/
+mutilate myUt@lAt
+mutilated myUt@lAt@d
+mutilating myUt@lAt6N
+mutilation myUt@lAS~
+mutilations myUt@lAS~z
+mutineer myUt~ir
+mutineers myUt~irz
+muting myUt6N
+mutinied myUt~/d
+mutinies myUt~/z
+mutinous myUt~@s
+mutiny myUt~/
+mutlangen m@tlaNg~
+mutsch muC
+mutschler muClP
+mutt mut
+mutter mutP
+muttered mutPd
+muttering mutP6N
+mutterings mutP6Nz
+mutters mutPz
+mutton mut~
+mutts muts
+mutual myUC@w@l
+mutual's myUC@w@lz
+mutualism myUC@w@liz}
+mutuality myUC@wal@t/
+mutually myUCU@l/
+mutz muts
+mutzich myUts@C
+mutzman mutsm~
+mutzman's mutsm~z
+muzak myUzak
+muzik myUz6k
+muzio myUz/]
+muzyka myUzik@
+muzzey muz/
+muzzle muz@l
+muzzled muz@ld
+muzzles muz@lz
+muzzy muz/
+mwanza mwonz@
+my mI
+myanmar myonm)r
+myanmar's myonm)rz
+myatt mI@t
+mycenaean mIs~E~
+mycogen mIk]g~
+mycology mIkol@j/
+myelin mI@lin
+myer mIP
+myers mIPz
+myers's mIPz@z
+myerson mIrs~
+myette mIet
+myhand mIhand
+myhre mir
+myhren mir~
+myklebust mikl@b@st
+mylan mIl~
+mylar mIlor
+myler mIlP
+myles mIlz
+mylod mIlod
+myna mIn@
+mynatt mIn@t
+mynatt min@t
+mynhier minh/P
+myocardial mI@k)rd/@l
+myocardium mI@k)rd/}
+myojin myOjin
+myopia mIOp/@
+myopic mIop6k
+myoscint my{sint
+myosin mI@s~
+myotrophin mI]trOfin
+myra mIr@
+myre mIr
+myren mIr~
+myreon mIr/~
+myres mIrz
+myriad mir/@d
+myriam mir/}
+myrick mIr6k
+myrilla m6ril@
+myrlene m6rlEn
+myrlie mirl/
+myrmidon mVm@d~
+myrmidons mVm@d~z
+myrna mVn@
+myron mIr~
+myrrh mV
+myrta mVt@
+myrtia mVS@
+myrtice mirtis
+myrtis mirtis
+myrtle mVt@l
+myrtles mVt@lz
+myself mIself
+myslinski mislinsk/
+mysliwiec misliv/k
+mystere mistir
+mysteries mistP/z
+mysterious mistir/@s
+mysteriously mistir/@sl/
+mysteriously mistiry@sl/
+mysterium mistEr/}
+mystery mistP/
+mystic mist6k
+mystical mist6k@l
+mysticism mist@siz}
+mystics mist6ks
+mystified mist@fId
+mystifies mist@fIz
+mystify mist@fI
+mystifying mist@fI6N
+mystique mistEk
+myszka miSk@
+myth miT
+mythic miT6k
+mythical miT@k@l
+mythological miT@loj6k@l
+mythology m@Tol@j/
+myths miTs
+myung myuN
+n en
+n'djamena ndy}En@
+n'dour nd?r
+n's enz
+n. en
+n.'s enz
+n.s enz
+n92762 ennIntUsev~sikstU
+na no
+naab nob
+naas noz
+nab nab
+nabb nab
+nabbed nabd
+nabbing nab6N
+naber nAbP
+nabers nAbPz
+nabi nAb/
+nabi nob/
+nabil nobE
+nabisco n@bisk]
+nabisco's n@bisk]z
+nablus nabl@s
+nabob nabob
+nabobs nabobz
+nabokov nab@kov
+nabokov's nab@kovz
+nabors nAbPz
+nabozny n@bozn/
+naccarato nokPot]
+nacchio nak/]
+nacco nak]
+nace nAs
+nachbar nakbP
+nachman nakm~
+nachmany nakm~/
+nacho naC]
+nacho noC]
+nachos naC]z
+nachos noC]z
+nachreiner nakrInP
+nachtigal naCt6g@l
+nacional nAsE~@l
+nack nak
+nacke nak
+naclerio nokl,r/]
+nacobre nak@br@
+nacogdoches n@kogd@C@z
+nad nad
+nada nod@
+nadal nodAal
+nadeau n@dO
+nadein n@dIn
+nadel nodel
+nadell nodAl
+nader nAdP
+nader's nAdPz
+naderite nAdPIt
+naderites nAdPIts
+nadgwick najwik
+nadia nady@
+nadia nody@
+nadine n@dEn
+nading nAd6N
+nadir nAdP
+nadja nady@
+nadler nAd@lP
+nadolny n@dOln/
+nadolski n@dOlsk/
+naef nEf
+naegele neg@l
+naegeli neg@l/
+naeger negP
+naeve nEv
+nafco nafk]
+naff naf
+naffziger nafz6gP
+nafta naft@
+nafta's naft@z
+naftalis naftol@s
+nafziger nafz6gP
+nag nag
+nagai nogo/
+nagano nogon]
+nagao nogo]
+nagasaki nogosok/
+nagata nogot@
+nagel nAg@l
+nagele nag@l
+nagengast nag6Ng@st
+nager nAgP
+nagged nagd
+nagging nag6N
+nagi nog/
+nagin nAg~
+nagle nAg@l
+nagler nAglP
+nagorno n@g{rn]
+nagorski n@g{rsk/
+nagoya n@g<@
+nags nagz
+nagy nAg/
+nagymaros naj})r]s
+nah no
+nahas noh@z
+nahm nam
+nahm nom
+nahmias nom/@z
+nahum nah}
+naidoo nAdU
+naify nAfI
+naik nAk
+nail nAl
+nailed nAld
+nailing nAl6N
+naill nAl
+nailor nAlP
+nails nAlz
+naim nI}
+naiman nAm~
+nair n,r
+naira n,r@
+nairn n,rn
+nairne n,rn
+nairobi nIrOb/
+naisbitt nAsbit
+naish no@S
+naismith nAzmiT
+naito nAt]
+naive nIEv
+naively noEvl/
+naivete noEv@tA
+najar noy)r
+najarian n@j,r/~
+najera noj,r@
+najib n@jEb
+najib's n@jEbz
+najibullah naj@bql@
+najibullah's naj@bql@z
+najjar noy)r
+nakagawa nokogow@
+nakahara nokoh)r@
+nakai noko/
+nakajima nokojEm@
+nakama nokom@
+nakamoto nokomOt]
+nakamura nokomqr@
+nakanishi nokonES/
+nakano nokon]
+nakao noko]
+nakashima nokoSEm@
+nakasone nok@sOn/
+nakasone's nok@sOn/z
+nakata nokot@
+nakatani nokoton/
+nakayama nokoyom@
+naked nAk@d
+nakhamkin nakamkin
+nalbandian nalband/~
+nalbone nalbOn
+nalcap nalkap
+nalco nalk]
+naldo nold]
+nale nAl
+nalepa n@lEp@
+nall n{l
+nalley nal/
+nalls n{lz
+nally nal/
+nam nam
+namara n})r@
+nambi namb/
+nambla nambl@
+name nAm
+name's nAmz
+named nAmd
+nameless nAml@s
+namely nAml/
+nameplate nAmplAt
+nameplates nAmplAts
+namer nAmP
+names nAmz
+namesake nAmsAk
+namibia n}ib/@
+namibia's n}ib/@z
+namibian n}ib/~
+naming nAm6N
+namis nam@s
+namphy namf/
+nan nan
+nan's nanz
+nana nan@
+nancarrow naNkar]
+nance nans
+nanchang nanCaN
+nancy nans/
+nancy's nans/z
+nandaime nandAm
+nandi nond/
+nandita nondEt@
+nando nand]
+nandonet nand]nct
+nanette n~et
+nanez nonez
+nang naN
+nangaku naNgokU
+nangle naNg@l
+nania non/@
+nanjing nanj6N
+nankai naNkI
+nankervis naNkPv@s
+nanking naNk6N
+nanna nan@
+nanney nan/
+nanni nan/
+nannies nan/z
+nanninga nonENg@
+nannini nonEn/
+nanny nan/
+nano nan]
+nano non]
+nanobaby nan]bAb/
+nanogram nan]gram
+nanograms nan]gramz
+nanos nan]z
+nanos non]z
+nanosecond nan]sek~d
+nanoseconds nan]sek~dz
+nantes nants
+nantucket nantuk@t
+nantucket's nantuk@ts
+nantz nants
+naoki nAOk/
+naoma noOm@
+naomi nAOm/
+nap nap
+napa nap@
+napalm nApom
+napco napk]
+napea nop/@
+naperville nApPvil
+naphtha nafT@
+naphthalene nafT@lEn
+napier nAp/P
+napierala nop6rol@
+napkin napkin
+napkins napkinz
+naples nAp@lz
+napoleon n@pOl/~
+napoleon n@pOly~
+napoleon's n@pOl/~z
+napoleonic n@pOl/on6k
+napoles nap@lz
+napoletano nop]lcton]
+napoli nap@l/
+napolitan nop]l/ton
+napolitano nop]l/ton]
+napora nop{r@
+napp nap
+nappa nap@
+napped napt
+napper napP
+nappi nap/
+nappier nap/P
+napping nap6N
+nappo nap]
+naprosyn napr@sin
+naps naps
+naquin nakwin
+naqvi nakv/
+naqvi nokv/
+nara n)r@
+naral n)rol
+naramore norom{r
+naranja norony@
+naranjo norony]
+narasimha nor@simho
+narasimhan nor@simhon
+narayan noroyon
+narayanan norIon~
+narazaki norozok/
+narc n)rk
+narciso norCEs]
+narcisse n)rsis
+narcissism n)rs@siz}
+narcissistic nors@sist6k
+narcissus norsis@s
+narco n)rk]
+narcolepsy n)rk@leps/
+narcos n)rk]s
+narcotic norkot6k
+narcotics norkot6ks
+nard n)rd
+narda n)rd@
+nardella nordel@
+nardelli nordel/
+nardi n)rd/
+nardiello nord/el]
+nardini nordEn/
+nardo n)rd]
+nardone nordOn/
+nardozzi nordOts/
+narducci nordUC/
+nares narz
+narita ncrEt@
+narjes n)ry@s
+narlikar n)rl6kor
+narlock n)rl@k
+narly n)rl/
+naro n)r]
+narodny nPodn/
+naron nor{n
+narragansett ner@gans@t
+narramore norom{r
+narrate n,rAt
+narrated n,rAt@d
+narrates n,rAts
+narrates ncrAts
+narration ncrAS~
+narrative n,r@t6v
+narratives n,r@t6vz
+narrator n,rAtP
+narrators n,rAtPz
+narron nar~
+narrow n,r]
+narrowed n,r]d
+narrower n,r]P
+narrowest n,r]@st
+narrowing n,r]6N
+narrowly n,r]l/
+narrowness n,r]n@s
+narrows n,r]z
+nars n)rz
+naruhito norUhEt]
+narum nPum
+narvaez norvocz
+narveson n)rv@s~
+nary n,r/
+nasa nas@
+nasa's nas@z
+nasal nAz@l
+nasally nAz@l/
+nasby nasb/
+nasca nosk@
+nascar naskor
+nascent nAs~t
+nascimento nas}ent]
+nasco nask]
+nasdaq nazdak
+nasdaq's nazdaks
+nase nAz
+naser nAzP
+nash naS
+nash's naS@z
+nashashibi naS6SEb/
+nashburg naSbPg
+nashburg's naSbPgz
+nashnamie naSn}/
+nashua naSU@
+nashua's naSU@z
+nashville naSvil
+nashville's naSvilz
+nasional nas/~al
+naslund nasl~d
+naso nos]
+nason nas~
+nasons nas~z
+nasopharynx n@sofP6Nks
+nasr nosP
+nass nas
+nassar nasP
+nassau nas{
+nasser nasP
+nassif nasif
+nast nast
+nast's nasts
+nasta nast@
+nastasi nostos/
+nastier nast/P
+nastiest nast/@st
+nastiness nast/n@s
+nasty nast/
+nasworthy naswPT/
+nat nat
+nata not@
+natal n@tol
+natal nAt@l
+natala notol@
+natale notol/
+natali notol/
+natalia n@toly@
+natalie nat@l/
+natalle n@tolA
+natalle's n@tolAz
+natan nAt~
+natasha n@taS@
+natasha n@toS@
+natasha's n@taS@z
+natasha's n@toS@z
+natcher naCP
+natchez naCez
+natchez' naCez
+natchez's naCez@z
+nate nAt
+natec's nAteks
+nath naT
+nathalia n@Tal/@
+nathalie nat@l/
+nathan nAT~
+nathan's nAT~z
+nathanael naT~Al
+nathania n@Tan/@
+nathaniel n@Tany@l
+nathanson naT~s~
+nathe nAT
+nathene n@TEn
+natick nAt6k
+nation nAS~
+nation's nAS~z
+nationair nAS~,r
+national naSn@l
+national naS~@l
+national's naSn@lz
+national's naS~@lz
+nationale naS~@l
+nationale naS~alA
+nationales naS~olcs
+nationalism naS~@liz}
+nationalist naSn@l@st
+nationalist naS~@l@st
+nationalistic naSn@list6k
+nationalistic naS~@list6k
+nationalists naSn@l@sts
+nationalists naS~@l@sts
+nationalities naS~al@t/z
+nationality naS~al@t/
+nationalization naSn@l@zAS~
+nationalization naS~@l@zAS~
+nationalizations naSn@l@zAS~z
+nationalizations naS~@l@zAS~z
+nationalize naSn@lIz
+nationalize naS~@lIz
+nationalized naSn@lIzd
+nationalized naS~@lIzd
+nationalizing naSn@lIz6N
+nationalizing naS~@lIz6N
+nationally naSn@l/
+nationally naS~@l/
+nationals naSn@lz
+nationals naS~@lz
+nationhood nAS~hqd
+nations nAS~z
+nations' nAS~z
+nationsbanc nAS~zbaNk
+nationsbanc nAS~zboNk
+nationsbanc's nAS~zbaNk
+nationsbanc's nAS~zboNk
+nationsbank nAS~zbaNk
+nationsbank's nAS~zbaNks
+nationwide nAS~wId
+nationwide's nAS~wIdz
+native nAt6v
+natives nAt6vz
+natividad n@t6v@dod
+nativism nAt6viz}
+nativist nAt6vist
+nativity n@tiv@t/
+nato nAt]
+nato's nAt]z
+natoli notOl/
+natomas nAtOm@z
+nats nats
+natsios nats/]s
+natter natP
+nattering natP6N
+nattie nat/
+nattily nat@l/
+natty nat/
+natuna n@tUn@
+natural naCP@l
+natural naCr@l
+natural's naCP@lz
+natural's naCr@lz
+naturalism naCP@liz}
+naturalism naCr@liz}
+naturalist naCP@l@st
+naturalist naCr@l@st
+naturalistic naCP@list6k
+naturalistic naCr@list6k
+naturalists naCP@l@s
+naturalists naCP@l@ss
+naturalists naCP@l@sts
+naturalists naCr@l@s
+naturalists naCr@l@ss
+naturalists naCr@l@sts
+naturalization naCP@l@zAS~
+naturalization naCr@l@zAS~
+naturalize naCP@lIz
+naturalize naCr@lIz
+naturalized naCP@lIzd
+naturalized naCr@lIzd
+naturally naCP@l/
+naturally naCr@l/
+nature nACP
+nature's nACPz
+natured nACPd
+naturedly nACPdl/
+natures nACPz
+natwest natwest
+natwest's natwests
+natzke natsk/
+nau nO
+nauer n?P
+nauert n?Pt
+naugatuck n{g@tuk
+naught n{t
+naughton n{t~
+naughty n{t/
+naugle n{g@l
+naugles n{g@lz
+nault n{lt
+nauman n?m~
+naumann n?m~
+naus n{z
+nausea n{z/@
+nauseam n?zEm
+nauseate n{z/At
+nauseated n{z/At@d
+nauseating n{Z/At6N
+nauseous n{S@s
+nauss n{s
+nauta noUt@
+nautical n{t@k@l
+nautilus n{t@l@s
+nautilus's n{t@l@s@z
+nav nav
+nava nov@
+navajo nav@hO
+navajo nov@hO
+navajos nav@hOz
+navajos nov@hOz
+naval nAv@l
+navar nov)r
+navarette navPet
+navarra nov)r@
+navarre nov)r
+navarrete navPEt
+navarrette navPet
+navarro n@v)r]
+navas nov@s
+navcom navkom
+nave nAv
+navel nAv@l
+navellier n@velyP
+navickas novEkoz
+navies nAv/z
+navigable nav@g@b@l
+navigate nav@gAt
+navigated nav@gAt@d
+navigating nav@gAt6N
+navigation nav@gAS~
+navigation nav@gAS~
+navigational nav@gAS~@l
+navigator nav@gAtP
+navigators nav@gAtPz
+navin novEn
+navin-chandr novinCondP
+navin-chandra novinCondr@
+navis novis
+navistar nav@stor
+navlab navlab
+navratilova navrat@lOv@
+navratilova's navrat@lOv@z
+navstar navstor
+navy nAv/
+navy's nAv/z
+naw no
+nawrocki novrOtsk/
+nawrot n{r@t
+nay nA
+nayden nAd~
+naylor nAlP
+nays nAz
+naysayer nAsAP
+naysayers nAsAPz
+nayyar nAy)r
+nazar noz)r
+nazarbayev noz@rbIycv
+nazareth naz@r@T
+nazarian n@z,r/~
+nazario noz)r/]
+nazer nAzP
+nazer's nAzPz
+nazi nots/
+nazi's nots/z
+nazionale nots/]nol/
+nazis nots/z
+nazism noziz}
+nazzaro nots)r]
+ndau cnd?
+ne enE
+ne nA
+ne nE
+ne n{rTEst
+ne'er n,r
+neace nEs
+nead nEd
+neagle nEg@l
+neal nEl
+neal's nElz
+neala nEl@
+neale nEl
+nealey nEl/
+nealis nElis
+neall nEl
+nealon nEl~
+nealson nEls~
+nealy nEl/
+neanderthal n/andPT{l
+neanderthals n/andPT{lz
+neapolitan nE@pol@t~
+near nir
+nearby nirbI
+neared nird
+nearer nirP
+nearest nir@st
+nearhood nirhqd
+nearing nir6N
+nearly nirl/
+nears nirz
+nearsighted nErsIt@d
+nearsightedness nErsIt@dn@s
+neary nir/
+neas nEz
+nease nEz
+neat nEt
+neater nEtP
+neatest nEt@st
+neathery neTP/
+neatly nEtl/
+neatness nEtn@s
+neault nO
+neave nEv
+neaves nEvz
+nebeker neb6kP
+nebel neb@l
+nebergall nEbPg@l
+neblett neblit
+nebraska n@brask@
+nebraska's n@brask@z
+nebraskan n@brask~
+nebraskans n@brask~z
+nebula neby@l@
+nebulous neby@l@s
+nec nek
+necaise nekIs
+necci neC/
+necessarily nes@s,r@l/
+necessary nes@ser/
+necessitate n@ses@tAt
+necessitated n@ses@tAt@d
+necessitates n@ses@tAts
+necessitating n@ses@tAt6N
+necessities n@ses@t/z
+necessity n@ses@t/
+nechayev neCIcv
+nechyba neCEb@
+neck nek
+necked nekt
+necker nekP
+necklace nekl@s
+necklaces nekl@s@z
+necklacing nekl@s6N
+necks neks
+necktie nektI
+neckties nektIz
+neckwear nekwer
+neco nEk]
+neco's nEk]z
+necromancy nekr}ans/
+necropolis n@krop@l@s
+necrosis n@krOs@s
+nectar nektP
+necula nekyUl@
+ned ned
+ned's nedz
+neda nAd@
+nedd ned
+nedda ned@
+neddick ned6k
+neddo ned]
+nedeau n@dO
+nederland nedPl~d
+nederlanden nedPland~
+nederlander nedPlandP
+nederlandsche nedPlandS/
+nederlandse nedPlands/
+nedlloyd ned@l<d
+nedlloyd nedl<d
+nedrow nedr]
+nedved nedv@d
+nedved nedved
+nee nE
+neeb nEb
+neece nEs
+neeco nEk]
+need nEd
+needed nEd@d
+needelman nEd@lm~
+needful nEdf@l
+needham nEd}
+needham's nEd}z
+neediest nEd/@st
+needing nEd6N
+needle nEd@l
+needled nEd@ld
+needlefish nEd@lfiS
+needlelike nEd@llIk
+needleman nEd@lm~
+needlepoint nEd@lp<nt
+needler nEd@lP
+needles nEd@lz
+needless nEdl@s
+needlessly nEdl@sl/
+needlework nEd@lwVk
+needling nEdl6N
+needn't nEd~t
+needs nEdz
+needy nEd/
+neef nEf
+neel nEl
+neeld nEld
+neeley nEl/
+neels nElz
+neely nEl/
+neeman nEm~
+neenan nEn~
+neeper nEpP
+neer nir
+nees nEz
+neese nEz
+neeson nEs~
+neet nEt
+nefarious n@f,r/@s
+neff nef
+neft neft
+neftegorsk neft6g{rsk
+neg neg
+negara ncg)r@
+negate n6gAt
+negated n@gAt@d
+negates n@gAts
+negating n@gAt6N
+negation n@gAS~
+negative neg@t6v
+negatively neg@t6vl/
+negatives neg@t6vz
+negativism neg@t6viz}
+negativity neg@tiv@t/
+negatron neg@tron
+negatrons neg@tronz
+negent neg~t
+negent nej~t
+negev negev
+neglect n@glekt
+neglected n@glekt@d
+neglectful n6glektf@l
+neglecting n6glekt6N
+neglects n6glekts
+negley negl/
+neglia negl/@
+negligence negl@j~s
+negligent negl@j~t
+negligently negl6j~tl/
+negligible negl@j@b@l
+negotiable n@gOS@b@l
+negotiate n@gOS/At
+negotiated n@gOS/At@d
+negotiates n6gOS/Ats
+negotiating n@gOS/At6N
+negotiation n@gOS/AS~
+negotiations n@gOS/AS~z
+negotiator n@gOS/AtP
+negotiator's n@gOS/AtPz
+negotiators n@gOS/AtPz
+negotiators' n@gOS/AtPz
+negrete negrEt
+negri negr/
+negrin negrin
+negro nEgr]
+negroes nEgr]z
+negroid nEgr<d
+negron negr~
+negroni negrOn/
+negros nEgr]z
+negs negz
+negus nEg@s
+nehemiah nE}I@
+neher nAP
+nehls nelz
+nehring n,r6N
+nehru nArU
+neibauer nIb?P
+neibert nEbPt
+neice nEs
+neider nEdP
+neidhardt nIdhort
+neidhart nIdhort
+neidigh nEdI
+neidl nEd@l
+neidlinger nId@l6NP
+neier nIP
+neifert nEfPt
+neiger nIgP
+neighbor nAbP
+neighbor's nAbPz
+neighborhood nAbPhqd
+neighborhood's nAbPhqdz
+neighborhoods nAbPhqdz
+neighboring nAbP6N
+neighborly nAbPl/
+neighbors nAbPz
+neighbors' nAbPz
+neighmond nAm~d
+neighmond's nAm~dz
+neikirk nEkPk
+neil nEl
+neil's nElz
+neilan nEl~
+neild nEld
+neile nEl
+neill nEl
+neils nElz
+neilsen nIls~
+neilson nEls~
+neiman nEm~
+neimeyer nImIP
+nein nEn
+neira n,r@
+neis nEz
+neisen nIs~
+neises nEziz
+neisler nIs@lP
+neiss nEs
+neiswender nIswcndP
+neither nETP
+neither nITP
+neitz nEts
+neitzel nItz@l
+neitzke nItsk/
+nej nA
+nejamatin ncj}at~
+nekoosa n6kUs@
+nekton nekt~
+nel nel
+nela nel@
+nelda neld@
+nelia nel/@
+nelina nclEn@
+nelita nclEt@
+nell nel
+nella nel@
+nellcor nelk{r
+nelle nel
+neller nelP
+nelles nelz
+nellette nelet
+nelli nel/
+nelliana nel/an@
+nellie nel/
+nelligan nel6g~
+nellis nelis
+nellwyn nelwin
+nelly nel/
+nelms nelmz
+neloms nel}z
+nelon nel~
+nels nelz
+nelsen nels~
+nelson nels~
+nelson's nels~z
+nematode nem@tOd
+nematodes nem@tOdz
+nemean nEm/~
+nemec nem6k
+nemecek nem@s6k
+nemer nEmP
+nemeroff nemP{f
+nemes nEmz
+nemesis nem@s@s
+nemeth nAmcT
+nemetz nemcts
+nemir numP
+nemitz nemcts
+nemmers nemPz
+nemo nem]
+nemos nEm]z
+nemours n}{rz
+nendick nend6k
+nene nEn
+neni nen/
+neni's nen/s
+nenninger nen6NP
+neo nE]
+neoax nE]aks
+neoclassic nE]klas6k
+neoclassical nE]klas6k@l
+neoconservative nE]k~sVv@t6v
+neoconservatives nE]k~sVv@t6vz
+neola n/ol@
+neoliberal nE]libP@l
+neoliberals nE]libP@lz
+neoma nAOm@
+neon nEon
+neonatal nE]nAt@l
+neons nEonz
+neophyte nE@fIt
+neophytes nE@fIts
+neoplasm nE@plaz}
+neoplatonic nE]pl@ton6k
+neoplatonist nE]plAt~@st
+neoprene nE@prEn
+neoprene nE]prEn
+neoprobe nE]prOb
+neorx nE]reks
+neotenic nE@tEn6k
+neoteny n/ot~/
+nepa nEp@
+nepal n@p{l
+nepalese nep@lEz
+nepali n@p{l/
+nephew nefyU
+nephew's nefyUz
+nephews nefyUz
+nephridium n@frid/}
+nephrite nefrIt
+nephron nefron
+nephrosis n@frOs@s
+nepl enEpEel
+nepl nep@l
+neponset n@pons@t
+nepool n@pUl
+nepotism nep@tiz}
+neptune neptUn
+neptunium ncptUn/}
+nerco nVk]
+nerd nVd
+nerds nVdz
+nerdy nVd/
+nerenberg nir~bPg
+neri n,r/
+nerice n,ris
+nerine n,r/n
+nerio n,r/]
+neritic nPit6k
+nerlich nVl6k
+nerney nVn/
+nero nir]
+nero's nir]z
+nerone n,r~
+nerren n,r~
+neruda n@rUd@
+nervana nPvan@
+nerve nVv
+nerves nVvz
+nervosa nPvOs@
+nervous nVv@s
+nervously nVv@sl/
+nervousness nVv@sn@s
+nervy nVv/
+nes nes
+nesbit nesbit
+nesbitt nezbit
+nesby nesb/
+nesci nes/
+nesheim neshIm
+nesi nes/
+nesler nes@lP
+nesler neslP
+nesler's nes@lPz
+nesler's neslPz
+nesmith nezmiT
+ness nes
+nessa nes@
+nessel nes@l
+nessen nEs~
+nesser nesP
+nesseth nesiT
+nessi nes/
+nessie nes/
+nessler neslP
+nest nest
+nesta nest@
+neste nest
+nestea nest/@
+nested nest@d
+nester nestP
+nesters nestPz
+nesting nest6N
+nestle nes@l
+nestle neslE
+nestle's nes@lz
+nestle's neslEz
+nestled nes@ld
+nestler nes@lP
+nestler nes@lP
+nestles nes@lz
+nestling nestl6N
+nestlings nestl6Nz
+nestor nestP
+nestorian ncst{r/~
+nestorianism ncst{r/~iz}
+nests nests
+net net
+netan net~
+netanyahu net~yohU
+netanyahu's net~yohUz
+netback netbak
+netcom netkom
+neth neT
+nether neTP
+nethercutt neTPk@t
+netherland neTPl~d
+netherlandic neTPland6k
+netherlands neTPl~dz
+netherlands' neTPlandz
+nethers neTPz
+netherton neTPt~
+netherworld neTPwVld
+nethery neTP/
+nethuva neTUv@
+nethuva's neTUv@z
+netlike netlIk
+neto net]
+nets nets
+netscape netskAp
+netscape's netskAps
+nett net
+netta net@
+netted net@d
+netter netP
+netterville netPvil
+nettesheim net@sSIm
+nettie net/
+netting net6N
+nettle net@l
+nettled net@ld
+nettles net@lz
+nettlesome net@ls}
+nettleton net@lt~
+nettleton's net@lt~z
+netto net]
+netty net/
+netview netvyU
+netware netwer
+network netwVk
+network's netwVks
+networked netwVkt
+networking netwVk6N
+networks netwVks
+networks' netwVks
+networth netwVT
+netz nets
+netzel netz@l
+netzer netzP
+netzley netsl/
+neu n<
+neubauer nUb?P
+neubecker nUbekP
+neuber nUbP
+neuberger nUbPgP
+neubert nUbPt
+neuburg nUbPg
+neuburger nUbPgP
+neudecker nUd6kP
+neue nU/
+neuendorf nU~d{rf
+neuendorffer nUnd{rfP
+neuenfeldt nU~fclt
+neuenschwander nU~Sw{ndP
+neuer n<P
+neufeld nUfeld
+neufeld's nUfeldz
+neugebauer nUg@b?P
+neugent nUj~t
+neuhart nUhort
+neuharth nUhorT
+neuhaus nUh?s
+neuhauser nUh?zP
+neuhoff nUh{f
+neukam nUk}
+neukirchen nUkPC~
+neukirchen nUkirC~
+neukom nUkom
+neumaier nUmIP
+neuman nUm~
+neumann nUm~
+neumayer nUmAP
+neumeier nUmIP
+neumeister nUmIstP
+neumeyer nUmIP
+neumiller nUm@lP
+neuner nUnP
+neupert nUpPt
+neupogen nUp]jen
+neural nqr@l
+neural nyqr@l
+neurasthenia nqrasTEn/@
+neuro nqrO
+neurofibromatosis nqr]fIbrOm@tOs@s
+neurohr nqr{r
+neurologic nqr@loj6k
+neurological nqr@loj6k@l
+neurologist nqrol@j@st
+neurologists nqrol@j@s
+neurologists nqrol@j@ss
+neurologists nqrol@j@sts
+neurology nqrol@j/
+neurons nqronz
+neuropathy nqr]paT/
+neuropathy nqr{p@T/
+neuropathy nyqr]paT/
+neuroscience nyqr]sI~s
+neuroscientist nyqr]sI~@st
+neuroscientist nyqr]sI~t@st
+neuroses nqrOs/z
+neurosis nqrOs@s
+neurosurgeon nqr]sVj~
+neurosurgeons nqr]sVj~z
+neurosurgery nqr]sVjP/
+neuroth nqr{T
+neurotic nqrot6k
+neuser nUsP
+neustadt nUStat
+neustine nUstIn
+neuter nUtP
+neutered nUtPd
+neutering nUtP6N
+neutral nUtr@l
+neutralism nUtr@liz}
+neutralist nUtr@l@st
+neutrality nUtral@t/
+neutralization nUtr@l@zAS~
+neutralize nUtr@lIz
+neutralized nUtr@lIzd
+neutralizes nUtr@lIz@z
+neutralizing nUtr@lIz6N
+neutrals nUtr@lz
+neutrino nUtrEn]
+neutrinos nUtrEn]z
+neutrogena nUtr@jEn@
+neutron nUtron
+neutrons nUtronz
+neuville nUvil
+neuwirth nUwPT
+neuzil nUz@l
+neva nAv@
+nevada n@vad@
+nevada n@vod@
+nevada's n@vad@z
+nevada's n@vod@z
+nevadan n@vad~
+nevadans n@vad~z
+nevala nAvol@
+nevarach n@v)r@C
+nevarach's n@v)r@C@z
+nevarez nAv)rcz
+neve nEv
+neveau n6vO
+nevel nAvel
+nevels nev@lz
+never nevP
+neverland nevPland
+neverland nevPl~d
+nevermind nevPmInd
+nevermore nevPm{r
+nevers nevPz
+nevertheless nevPT@les
+neves nEvz
+neveu n6vU
+nevil nAvEl
+nevile nAvIl
+nevill nevil
+neville nevil
+nevills nevilz
+nevils nev@lz
+nevin nev~
+nevin's nev~z
+nevins nev~z
+nevis nev@s
+nevitt nevit
+nevius nEv/@s
+new nU
+new nyU
+new-caledonia nUkal@dOn/@
+new-hampshire nUhampSP
+new-hampshire's nUhampSPz
+new-hampshirite nUhampSPIt
+new-hampshirites nUhampSPIts
+new-jersey nUjVz/
+new-jersey's nUjVz/z
+new-mexican nUmeks6k~
+new-mexicans nUmeks6k~z
+new-mexico nUmeks@kO
+new-mexico's nUmeks@kOz
+new-york nUy{rk
+new-york's nUy{rks
+new-yorker nUy{rkP
+new-yorkers nUy{rkPz
+new-zealand nUzEl~d
+newall nU{l
+newark nUPk
+newark nyUPk
+newark's nyUPks
+newbauer nUb?P
+newberg nUbPg
+newberger nUbPgP
+newbern nUbPn
+newberry nUber/
+newbery nUber/
+newbill nUbil
+newbold nUbOld
+newborn nUb{rn
+newborns nUb{rnz
+newbraudwick nUbrodw6k
+newbridge nUbrij
+newbrough nUbr?
+newburg nUbPg
+newburger nUbPgP
+newburgh nUbPg
+newburn nUbVn
+newbury nUber/
+newbury's nUber/z
+newby nUb/
+newcastle nUkas@l
+newcastle's nUkas@lz
+newcom nUk}
+newcomb nUk}
+newcombe nUk}
+newcome nUk}
+newcomer nUkumP
+newcomers nUkumPz
+newcor nUk{r
+newedge nU@j
+newell nU@l
+newell's nU@lz
+newer nUP
+newest nU@st
+newey nU/
+newfangle nUfaNg@l
+newfangled nUfaNg@ld
+newfield nUfEld
+newfound nUf?nd
+newfoundland nUf~dl~d
+newgard nUgPd
+newgate nUgAt
+newgateway nUgAtwA
+newhall nUh{l
+newhall's nUh{lz
+newhard nUhord
+newhart nUhort
+newhouse nUh?s
+newill n/wil
+newingham nU6Nham
+newish nUiS
+newkirk nUkPk
+newlan nUl~
+newland nUl~d
+newley nUl/
+newlin nUlin
+newlon nUl~
+newlun nUl~
+newly nUl/
+newlyn nUlin
+newlywed nUl/wed
+newlyweds nUl/wedz
+newman nUm~
+newman's nUm~z
+newmann nUm~
+newmark nUmork
+newmarket nUmork@t
+newmeyer nUmIP
+newmont nUmont
+newmont's nUmonts
+newmyer nUm/P
+newnam nUn}
+newness nUn@s
+neworld nUVld
+neworld newVld
+newport nUp{rt
+newport's nUp{rts
+newquist nUkwist
+news nUz
+news nyUz
+news' nUz
+news's nUz@z
+newscast nUzkast
+newscaster nUzkastP
+newscasters nUzkastPz
+newscasts nUzkas
+newscasts nUzkass
+newscasts nUzkasts
+newscorp nUzk{rp
+newscorp's nUzk{rps
+newsday nUzdA
+newsday's nUzdAz
+newsgroup nUzgrUp
+newsgroups nUzgrUps
+newsham nUS}
+newshour nUz?r
+newsies nUz/z
+newsletter nUzletP
+newsletter's nUzletPz
+newsletters nUzletPz
+newslink nUzl6Nk
+newslink's nUzl6Nks
+newsmagazine nUzmag@zEn
+newsmaker nUzmAkP
+newsmakers nUzmAkPz
+newsman nUzman
+newsman nUzm~
+newsmen nUzmcn
+newsnight nUznIt
+newsom nUz}
+newsome nUs}
+newson nUs~
+newspaper nUzpApP
+newspaper's nUzpApPz
+newspaperman nUzpApPman
+newspapermen nUzpapPmcn
+newspapers nUzpApPz
+newspapers' nUzpApPz
+newspeak nUspEk
+newspeople nUzp/p@l
+newsperson nUzpPs~
+newspersons nUzpPs~z
+newsprint nUzprint
+newsreel nUzrEl
+newsreels nUzrElz
+newsroom nUzrUm
+newsroom's nUzrUmz
+newsrooms nUzrUmz
+newsstand nUzstand
+newsstands nUzstandz
+newstrom nUztr}
+newsum nUz}
+newswanger nUzw{NP
+newsweek nUzwEk
+newsweek's nUzwEks
+newsweekly nUzwEkl/
+newswire nUzwIr
+newswires nUzwIrz
+newswoman nUzwqm~
+newswomen nUzwim~
+newsworthy nUzwVT/
+newsy nUz/
+newt nUt
+newt's nUts
+newton nUt~
+newton's nUt~z
+newtonchik nUtonC6k
+newtonian nUtOn/~
+newtown nUt?n
+newtowne nUt?n
+newts nUts
+newvector nUvektP
+newville nUvil
+newwave nUwAv
+nexgen neksjen
+nexis neksis
+nexrad neksrad
+next neks
+next nekst
+next's neksts
+nextel nekstel
+nextel's nekstelz
+nextstep nekstep
+nextstep nekststep
+nexus neks@s
+ney nA
+neyens nInz
+neyer nAP
+neyhart nAhort
+neyland nAl~d
+neylon nAl~
+neyman nAm~
+neysa nAs@
+nez nez
+ng eN
+ng iN
+ngai cngI
+ngai gI
+ngema cnjemo
+nghi cngE
+nghi gE
+ngo gO
+ngo's gOz
+ngor eN{r
+ngor g{r
+ngos gOz
+nguyen nUyen
+niacin nI@sin
+niad nIad
+niagara nIagr@
+niagara's nIagr@z
+niaid nIAd
+nial nI@l
+niall nIl
+nib nib
+nibbe nib
+nibble nib@l
+nibbled nib@ld
+nibbles nib@lz
+nibbling nib@l6N
+nibbling nibl6N
+nibert nibPt
+niblack niblak
+niblett niblit
+niblock niblok
+nibs nibz
+nic enIsE
+nic nik
+nicandros n6kandr]s
+nicaragua nikPogw@
+nicaragua's nikPogw@z
+nicaraguan nikPogw~
+nicaraguans nikPogw~z
+nicastro n6kastr]
+niccoli n/kOl/
+niccolite nik@lIt
+niccum nik}
+nice nEs
+nice nIs
+nicely nIsl/
+nicen nIs~
+niceness nIsn@s
+nicer nIsP
+nicest nIsist
+niceties nIs@t/z
+niche niC
+nichelson niC@ls~
+niches niC@z
+nichol nik{l
+nichola nihOl@
+nicholas nik@l@s
+nicholas nikl@s
+nicholas' nik@l@s
+nicholas' nikl@s
+nicholas's nik@l@s@z
+nicholas's nikl@s@z
+nicholes nikh]lz
+nicholi nik@lI
+nicholl nik@l
+nicholls nik@lz
+nichols nik@lz
+nichols' nik@lz
+nichols's nik@lz@z
+nicholson nik@ls~
+nicholson's nik@ls~z
+nichter niktP
+nick nik
+nick's niks
+nicked nikt
+nickel nik@l
+nickel's nik@lz
+nickell nik@l
+nickelodeon nik@lOd/~
+nickels nik@lz
+nickelson nik@ls~
+nickens nik~z
+nickerson nikPs~
+nickeson nik@s~
+nickey nik/
+nicki nik/
+nicklas nikl@z
+nicklaus nikl@s
+nicklaus's nikl@s@z
+nickle nik@l
+nickleby nik@lb/
+nickles nik@lz
+nickless nikl@s
+nicklin niklin
+nicklow niklO
+nickname niknAm
+nicknamed niknAmd
+nicknames niknAmz
+nickol nik@l
+nickolas nik@l@z
+nickoloff nik@l{f
+nickols nik@lz
+nickolson nik]ls~
+nicks niks
+nickson niks~
+nickum nik}
+nicky nik/
+nicky's nik/z
+niclaneshia nikl~eS@
+niclaneshia's nikl~eS@z
+nicley nikl/
+nico nEk]
+nicodemo nEk]dAm]
+nicoderm nik@dVm
+nicol nik@l
+nicola n6kOl@
+nicolae nik]lI
+nicolai n/k]lo/
+nicolaides nik@lAdz
+nicolaisen nik@lIs~
+nicolas nik@l@s
+nicolau nik@l?
+nicolaus nik@l?z
+nicolay nik@lA
+nicole n6kOl
+nicole's n6kOlz
+nicolet nik@let
+nicoletta nik@let@
+nicolette nik@let
+nicoletti n/k]let/
+nicoletti nik@let/
+nicoli n/kOl/
+nicolin nik@lin
+nicolina nEk]lEn@
+nicoline n/k]lEn/
+nicolini nEk]lEn/
+nicoll nik@l
+nicolle n6kOl
+nicollier n6kOlyP
+nicolls nik@lz
+nicolo nik@l]
+nicoloff nik@l{f
+nicolosi n/k]lOs/
+nicols nik@lz
+nicolson nik]ls~
+nicor nIk{r
+nicorette nikPet
+nicosia n6k@sE@
+nicoski n6k{sk/
+nicoson nik@s~
+nicotera nEk]t,r@
+nicotine nik@tEn
+nicotine's nik@tEnz
+nicotra n6kotr@
+nida nEd@
+nidal n@dol
+nidal's n@dolz
+niday nIdA
+nidiffer nid@fP
+nie nE
+nie nI
+niebauer nEb?P
+niebling nEb@l6N
+niebuhr nEbqr
+niebur nEbP
+niece nEs
+niece's nEs@z
+nieces nEs@z
+nied nEd
+niedbala n/dbol@
+niedbalski n/dbolsk/
+nieder nEdP
+niederer nEdPP
+niederhauser nEdPh?zP
+niederman nIdPm~
+niedermeier nEdPmIP
+niedermeyer nEdPmIP
+niedzielski n/jElsk/
+niedzwiecki n/jvEtsk/
+niehaus nEh?s
+niehaus nIh?s
+niehoff nEh{f
+niekamp nEkamp
+niel nEl
+nieland nEl~d
+nield nEld
+nields nEldz
+niels nElz
+nielsen nEls~
+nielsen's nEls~z
+nielson nEls~
+nieman nEm~
+niemann nEm~
+niemczyk nEmC6k
+niemeier nEmIP
+niemela n/mel@
+niemeyer nEmIP
+niemi nEm/
+niemiec nEmEk
+niemoeller nIm{lP
+niemuth nEm@T
+nienaber nEn@bP
+nienhaus nEnh?s
+nienhuis nEnhU@z
+nienow nEn]
+nier nEP
+nierenberg nir~bPg
+nierman nirm~
+nies nIz
+niese nEz
+niesen nEs~
+niess nEs
+nieto nEt]
+nietzsche nEC/
+nieves n/evcs
+niezgoda n/zgOd@
+nifedipine n@fed@p/n
+nifedipine nIfed@p/n
+nifong nif{N
+nifty nift/
+nigel nIj@l
+niger nIjP
+nigeria nIjir/@
+nigeria's nIjir/@z
+nigerian nIjir/~
+nigerians nIjir/~z
+nigg nig
+niggardliness nigPdl/n@s
+niggardly nigPdl/
+nigger nigP
+nigger's nigPz
+niggers nigPz
+nigh nI
+nighswonger nIsw{NP
+night nIt
+night's nIts
+nightclub nItklub
+nightclubs nItklubz
+nightengale nIt6Ng@l
+nighter nItP
+nighters nItPz
+nightfall nItf{l
+nighthawk nIth{k
+nighthorse nIth{rs
+nightingale nIt6NgAl
+nightlife nItlIf
+nightline nItlIn
+nightline's nItlInz
+nightlines nItlInz
+nightly nItl/
+nightmare nItmer
+nightmares nItmerz
+nightmarish nItmer6S
+nights nIts
+nights' nIts
+nightshade nICAd
+nightshirt nICVt
+nightstage nItstAj
+nightstand nItstand
+nightstick nItstik
+nighttime nIttIm
+nighttimes nIttImz
+nigrelli n/grel/
+nigris nigris
+nigro nigr]
+niguel n6gel
+nihart nihort
+nihay nEhA
+nihay nIhA
+nihei nihA
+nihilism nI@liz}
+nihilists nI@l@s
+nihilists nI@l@ss
+nihilists nI@l@sts
+nihiser nihIzP
+nihon nihon
+niihau nEh?
+nik nik
+nike nIk/
+nike's nIk/z
+nikes nIk/z
+nikes nIks
+nikita n@kEt@
+nikita nikEt@
+nikk's niks
+nikkei n6kA
+nikkei nEkA
+nikkei nIkE
+nikkei's nEkAz
+nikkel nik@l
+nikkhah nikho
+nikki nik/
+nikko nEk]
+nikko's nEk]z
+niko nEk]
+niko's nEk]z
+nikolai nik]lI
+nikolaivich n6k]lIv6C
+nikolaus nik@l?z
+nikolic n6kol6k
+nikolich n6kolih
+nikon nIkon
+nikou nEkU
+nikovski n6kofsk/
+nil nil
+nila nEl@
+nilan n/lon
+niland nIl~d
+nile nIl
+niles nIlz
+nilges nilj@z
+nill nil
+nilles nIlz
+nilly nil/
+nils nilz
+nilsen nils~
+nilson nils~
+nilsson nils~
+nimble nimb@l
+nimbly nimbl/
+nimbus nimb@s
+nimby nimb/
+nimitz nimits
+nimmer nimP
+nimmo nim]
+nimmons nim~z
+nimoy nEm<
+nimrod nimrod
+nimrodi nimrOd/
+nims nimz
+nimtz nimts
+nina nEn@
+nina nIn@
+ninagawa nEnogow@
+nincompoop niNk}pUp
+nincompoops niNk}pUps
+nine nIn
+nine's nInz
+ninefold ninfOld
+niner nInP
+niners nInPz
+nines nInz
+nineteen nIntEn
+nineteenth nIntEnT
+nineties nInt/z
+nineties' nInt/z
+ninetieth nInt/@T
+ninette ninet
+ninety nInt/
+ninety's nInt/z
+nineveh nin@v@
+ning niN
+ninja ninj@
+ninjas ninj@z
+ninneman ninm~
+nino nEn]
+ninon nin~
+ninsu ninsU
+nintendo nintend]
+nintendo's nintend]z
+ninth nInT
+ninths nInTs
+niobite nI]bIt
+niobium nIOb/}
+nip nip
+nipon nipon
+nipp nip
+nipped nipt
+nipper nipP
+nippert nipPt
+nipping nip6N
+nipple nip@l
+nippon nipon
+nippondenso nipondens]
+nippy nip/
+nipsco nipsk]
+niquette n6ket
+nir nir
+nirenberg nIr~bPg
+niriko nir6k]
+niro nir]
+nirvana n6rvon@
+nirvana nPvon@
+nirvana's n6rvon@z
+nirvana's nPvon@z
+nisbet nizb@t
+nisbett nisbct
+nisei nisA
+nishi nES/
+nishida n/SEd@
+nishikawa n/S/kow@
+nishimo niSEm]
+nishimoto n/S/mOt]
+nishimura n/S/mqr@
+nishioka nES/Ok@
+nishiyama n/S/yom@
+nishizawa nES@zow@
+niskanen nisk~~
+nisley nizl/
+nissa nis@
+nissan nEson
+nissan's nEsonz
+nissans nEsonz
+nissei nisA
+nissen nis~
+nissenbaum nis~b?m
+nisshin niSin
+nissho niS]
+nissim nisim
+nissin nisin
+nissley nisl/
+nist nist
+nistler nistlP
+niswander nisw{ndP
+niswonger nisw{NP
+nit nit
+nita nEt@
+nite nIt
+nithuekan niTw@kon
+nithuekan's niTw@konz
+nitka nitk@
+nitpick nitpik
+nitpicking nitpik6N
+nitrate nItrAt
+nitrates nItrAts
+nitrating nItrAt6N
+nitration nItrAS~
+nitric nItr6k
+nitride nItrId
+nitriles nItr@lz
+nitro nitr]
+nitrocellulose nItr]sely@lOs
+nitrogen nItr@j~
+nitrogenous nItroj~@s
+nitroglycerin nICr@glisP~
+nitroglycerin nItr@glisP~
+nitroglycerin nItr]glisP~
+nitroglycerine nICr@glisP~
+nitroglycerine nItr@glisP~
+nitroglycerine nItr]glisP~
+nitrosamines n@tros}Enz
+nitrosomine n@tros}En
+nitrosomines n@tros}Enz
+nitrous nitr@s
+nitsa nits@
+nitsch niC
+nitsche niC
+nitschke niCk
+nitta nEt@
+nitta nit@
+nitto nit]
+nitty nit/
+nitz nits
+nitza nitz@
+nitza's nitz@z
+nitzberg nitsbPg
+nitze nits/
+nitzel nitz@l
+nitzsche nitS
+niven nIv~
+nivens nIv~z
+niver nIvP
+nivison niv@s~
+nix niks
+nixdorf niksd{rf
+nixdorf's niksd{rfs
+nixed nikst
+nixes niks@z
+nixie niks/
+nixon niks~
+nixon's niks~z
+nixons niks~z
+nizar nIzor
+nizhny niZn/
+niziolek niz/Olck
+niznik nizn6k
+njt enjAtE
+no nO
+no's nOz
+noa nO@
+noaa enOAA
+noaa nO@
+noack nOk
+noah nO@
+noah's nO@z
+noakes nOks
+noam nOm
+noami nOm/
+nobbe nob
+nobec n]bek
+nobec's n]beks
+nobel n]bel
+nobelium n]bel/}
+nobile nob@l
+nobility n]bil@t/
+nobis nObis
+noble nOb@l
+noble's nOb@lz
+nobleman nOb@lm~
+nobleman's nOb@lm~z
+nobles nOb@lz
+noblesse n]bles
+noblest nObl@st
+noblet nobl@t
+noblett noblct
+noblewoman nOb@lwqm~
+noblin noblin
+noblitt noblit
+nobly nobl/
+nobodies nOb@d/z
+nobodies nObodEz
+nobody nOb@d/
+nobody nObodE
+nobody'd nOb@d/d
+nobody'd nObodEd
+nobody's nOb@d/z
+nobody's nObodEz
+noboru n]b{rU
+nobrega nobr6g@
+nobriga nobr6g@
+nobuaki nObUok/
+nobuo n]bU]
+nobuto n]bUt]
+nobuyuki nObUyUk/
+noce nOs
+nocella n]Cel@
+nocera n]C,r@
+nock nok
+nockard nokPd
+nocturnal noktVn@l
+nod nod
+noda nOd@
+nodded nod@d
+nodding nod6N
+node nOd
+nodes nOdz
+nodine n]dEn/
+nods nodz
+nodular noj@lP
+nodule nojUl
+nodules nojUlz
+noe nO
+noecker nOkP
+noel n]el
+noel's n]elz
+noell nOl
+noelle n]el
+noes nOz
+noeth nOT
+noffke nofk
+noffsinger nofs~jP
+nofsinger nofs~jP
+noftsker n{ftskP
+nofziger n{fz6gP
+noga nOg@
+nogales n]golcs
+nogawa n]gow@
+noggle nog@l
+nogle nOg@l
+noguchi n]gUC/
+nogueira n]g,r@
+noguera n]g,r@
+noh nO
+nohl nOl
+nohr n{r
+noiman n<m~
+noir n<r
+noirs n<rz
+noise n<z
+noises n<z@z
+noisier n<z/P
+noisiest n<z/@st
+noisily n<z@l/
+noisy n<z/
+nokes nOks
+nokia nOk/@
+nokia's nOk/@z
+nokyo nOky]
+nola nOl@
+nolan nOl~
+nolana n]lan@
+noland nOl~d
+nolanda n@land@
+nolasco n]losk]
+nold nOld
+nolde nOld
+nolden nOld~
+nolder nOldP
+nole nOl
+nolen nol~
+noles nOlz
+nolet nOlct
+noleta n]let@
+nolette nOlet
+nolf nOlf
+nolie nol/
+nolin nOlin
+nolita n]lEt@
+noll nOl
+nolla nOl@
+nollan nol~
+noller nOlP
+nolley nol/
+nollie nOl/
+nolls nOlz
+nolo nOl]
+nolt nOlt
+nolte nOlt
+nolting nOlt6N
+nom nom
+nomad nOmad
+nomad's nOmadz
+nomadic n]mad6k
+nomads nOmadz
+nome nOm
+nome's nOmz
+nomenclatorial nOm~kl@t{r/@l
+nomenclatural n]m~klACP@l
+nomenclature nOm~klACP
+nomenklatura n]meNkl@Cqr@
+nomi nOm/
+nominal nom~@l
+nominally nom~@l/
+nominate nom~At
+nominated nom~At@d
+nominates nom~Ats
+nominating nom~At6N
+nomination nom~AS~
+nominations nom~AS~z
+nominee nom~E
+nominee's nom~Ez
+nominees nom~Ez
+nomo nOm]
+nomura n]mqr@
+nomura's nUmP@z
+nomura's n]mqr@z
+non non
+non-catholic nonkaTl6k
+non-catholics nonkaTl6ks
+non-nonsense nonnonsens
+non-supervisory nonsUpPvIzP/
+nona non@
+nonacademic nonak@dem6k
+nonaccrual non@krU@l
+nonaccruing non@krU6N
+nonaggression non@greS~
+nonagricultural nonagr6kulCP@l
+nonalcoholic nonalk@hol6k
+nonalign non@lIn
+nonaligned non@lInd
+nonautomotive non{t]mOt6v
+nonbank nonbaNk
+nonbanking nonbaNk6N
+nonbeliever nonb@lEvP
+nonbelievers nonb@lEvPz
+nonbinding nonbInd6N
+nonbiting nonbIt6N
+nonbuilding nonbild6N
+nonbusiness nonbizn@s
+noncallable nonk{l@b@l
+noncash nonkaS
+nonchalance nonS@lons
+nonchalant nonS@lont
+nonchalantly nonS@lontl/
+noncolor nonkulP
+noncombatant nonk}bat~t
+noncombatants nonk}bat~ts
+noncommercial nonk}VS@l
+noncommittal nonk}it@l
+noncommunist nonkomyUn@st
+noncompete nonk}pEt
+noncompetitive nonk}pet@t6v
+noncompliance nonk}plI~s
+nonconformist nonk~f{rm@st
+nonconformists nonk~f{rm@s
+nonconformists nonk~f{rm@ss
+nonconformists nonk~f{rm@sts
+nonconformity nonk~f{rm@t/
+noncontract nonkontrakt
+noncontroversial nonkontr@vVS@l
+nonconvertible nonk~vVt@b@l
+noncore nonk{r
+noncorporate nonk{rpr@t
+noncriminal nonkrim~@l
+noncumulative nonkyUmy@l@t6v
+nondeductible nond@dukt@b@l
+nondefense nond@fens
+nondescript nond@skript
+nondirect nondPekt
+nondiscriminate nondiskrim~@t
+nondiscrimination nondiskrim~AS~
+nondiscriminatory nondiskrim~@t{r/
+nondollar nondolP
+nondurable nondqr@b@l
+nondurables nondqr@b@lz
+none nun
+noneconomic nonek~om6k
+nonelectrical non@lektr6k@l
+nonemergency non}Vj~s/
+nonentity nonent@t/
+nonessential non@senC@l
+nonesuch nunsuC
+nonetheless nunT@les
+nonevent non6vent
+nonexclusive non6ksklUs6v
+nonexecutive non6gzeky@t6v
+nonexistent non@gzist~t
+nonfarm nonf)rm
+nonfat nonfat
+nonfatal nonfAt@l
+nonferrous nonf,r@s
+nonfiction nonfikS~
+nonfinancial nonfInanS@l
+nonfinancial nonf~anS@l
+nonfood nonfUd
+nongovernment nonguvPnm~t
+nongovernmental nonguvPnment@l
+nongreek nongrEk
+nonhuman nonhyUm~
+nonie non/
+noninflationary noninflAS~er/
+noninterest nonintr@st
+noninterference nonintPfir~s
+nonintervention nonintPvenC~
+nonjet nonjet
+nonjets nonjets
+nonlethal nonlET@l
+nonlinear nonlinEP
+nonliturgical nonl@tVj6k@l
+nonmanagement nonman6jm~t
+nonmanufacturing nonmany@fakCP6N
+nonmember nonmembP
+nonmembers nonmembPz
+nonmilitary nonmil@ter/
+nonnative nonAt6v
+nonnemacher non}@kP
+nonnuclear nonUklEP
+nonoperating non{pPAt6N
+nonpacifist nonpas@f@st
+nonpacifists nonpas@f@s
+nonpacifists nonpas@f@ss
+nonpacifists nonpas@f@sts
+nonpartisan nonp)rt@z~
+nonpaying nonpA6N
+nonpayment nonpAm~t
+nonperforming nonpPf{rm6N
+nonplanar nonplAnP
+nonpluss nonplus
+nonplussed nonplust
+nonpoisonous nonp<z~@s
+nonpolitical nonp@lit6k@l
+nonprescription nonpr@skripS~
+nonproductive nonpr@dukt6v
+nonprofessional nonpr@feS~@l
+nonprofessionals nonpr@feS~@lz
+nonprofit nonprof@t
+nonprofits nonprof@ts
+nonproliferation nonpr@lifPAS~
+nonpublic nonpubl6k
+nonqualified nonkwol@fId
+nonracial nonrAS@l
+nonrecurring nonr6kV6N
+nonrefundable nonr@fund@b@l
+nonregulated nonregy@lAt@d
+nonreligious nonr@lij@s
+nonrenewable nonr/nU@b@l
+nonresident nonrez@d~t
+nonresidential nonrez@denC@l
+nonresidential nonrez@denS@l
+nonresidents nonrez@d~ts
+nonresponsive nonr@spons6v
+nonroman nonrOm~
+nonruling nonrUl6N
+nonsectarian nonsckt,r/~
+nonsense nonscns
+nonsensical nonsens6k@l
+nonsmoker nonsmOkP
+nonsmokers nonsmOkPz
+nonsmokers' nonsmOkPz
+nonsmoking nonsmOk6N
+nonspecific nonsp@sif6k
+nonsporting nonsp{rt6N
+nonstandard nonstandPd
+nonstarter nonst)rtP
+nonstick nonstik
+nonstop nonstop
+nonstops nonstops
+nonstrategic nonstr@tEj6k
+nonsurgical nonsVj6k@l
+nontaxable nontaks@b@l
+nontechnical nontekn6k@l
+nontoxic nontoks6k
+nontraditional nontr@diS~@l
+nontransferable nontransfV@b@l
+nonturbo n{ntVb]
+nonturbos n{ntVb]z
+nonunion nonyUny~
+nonunionized nonyUny~Izd
+nonutility nonyUtil@t/
+nonverbal nonvVb@l
+nonviolence nonvI@l~s
+nonviolent nonvI@l~t
+nonvolatile nonvol@t@l
+nonvoting nonvOt6N
+nonwhite nonhwIt
+nonwhite nonwIt
+nonwhites nonhwIts
+nonwhites nonwIts
+nonwoven nonwOv~
+nonwovens nonwOv~z
+noodle nUd@l
+noodles nUd@lz
+nook nqk
+nooks nqks
+noon nUn
+noonan nUn~
+noone nUn
+nooney nUn/
+noons nUnz
+noontime nUntIm
+noorda nqrd@
+noose nUs
+nope nOp
+nor n{r
+nora n{r@
+nora's n{r@z
+norah n{r@
+noramco n{ramk]
+noranda n{rand@
+noranda's n{rand@z
+norbeck n{rbck
+norberg n{rbPg
+norbert n{rbPt
+norberta n{rb,rt@
+norberto n{rbVtO
+norbury n{rbcr/
+norby n{rb/
+norcen n{rs~
+norcen's n{rs~z
+norcia n{rC@
+norco n{rk]
+norcross n{rkr{s
+nord n{rd
+nordahl n{rdol
+nordan n{rd~
+nordbanken n{rdbaNk~
+nordberg n{rdbPg
+nordby n{rdb/
+nordeen nPdEn
+nordell n{rd@l
+norden n{rd~
+norder n{rdP
+nordgren n{rdgrcn
+nordic n{rd6k
+nordica n{rd6k@
+nordictrack n{rd6ktrak
+nordin n{rdin
+nordine n{rdEn/
+nordio n{rd/]
+nordisk n{rdisk
+nordling n{rd@l6N
+nordlund n{rdl~d
+nordman n{rdm~
+nordmann n{rdm~
+nordmeyer n{rdmIP
+nordquist n{rdkwist
+nordson n{rds~
+nordstrom n{rdstr}
+nordstrom's n{rdstr}z
+nordstroms n{rdstr}z
+nordyke n{rdIk
+noreco n{rek]
+nored n{rd
+noreen nPEn
+noreiga n{rAg@
+norelco nPelk]
+norell n{r@l
+norem n{rim
+noren n{r~
+norenberg n{r~bPg
+norenco n{r~k]
+norenko n@renk]
+norex n{r@ks
+norfleet n{rflEt
+norfolk n{rf@k
+norfolk's n{rf@ks
+norgaard n{rgord
+norgard n{rgPd
+norge n{rj
+norgren n{rgr~
+norick n{r6k
+noriega n{r/Ag@
+noriega's n{r/Ag@z
+noriegas n{r/Ag@s
+norilsk n{rilsk
+norimatsu n{r/motsU
+norinchukin n{r~CUk~
+norinko n{riNk]
+nork n{rk
+norkus n{rk@s
+norland n{rl~d
+norlander n{rl~dP
+norlin n{rlin
+norling n{rl6N
+norm n{rm
+norma n{rm@
+normal n{rm@l
+normalcy n{rm@ls/
+normality n{rmal@t/
+normalization n{rm@l@zAS~
+normalize n{rm@lIz
+normalized n{rm@lIzd
+normalizing n{rm@lIz6N
+normally n{rm@l/
+normally n{rml/
+norman n{rm~
+norman's n{rm~z
+normand n{rm~d
+normandie n{rm~d/
+normandin n{rm~din
+normandy n{rm~d/
+normative n{rm@t6v
+norment n{rm~t
+normick n{rm6k
+normie n{rm/
+normile n{rmIl
+norming n{rm6N
+normington n{rm6Nt~
+normoyle n{rm<l
+norms n{rmz
+normy n{rm/
+norna n{rn@
+norodom n{r@dum
+norodom n{r]dum
+norplant n{rplant
+norplant's n{rplants
+norquist n{rkwist
+norred n{rd
+norrell n{r@l
+norrie n{r/
+norrington n{r6Nt~
+norris n{ris
+norris's n{r@s@z
+norrod n{r@d
+norry n{r/
+norse n{rs
+norsemen n{rsmcn
+norsk n{rsk
+norske n{rsk/
+norstan n{rst~
+norstar n{rstor
+norstrom n{rstr}
+norsworthy n{rswPT/
+norte n{rt
+nortek n{rtek
+nortel n{rtcl
+north n{rT
+north's n{rTs
+northam n{rT}
+northampton n{rTampt~
+northbound n{rTb?nd
+northbrook n{rTbrqk
+northcliff n{rTklif
+northcott n{rTk@t
+northcraft n{rTkraft
+northcutt n{rTk@t
+northeast n{rTEst
+northeast's n{rTEsts
+northeasterly n{rTEstPl/
+northeastern n{rTEstPn
+northeasterner n{rTEstPnP
+northeasterners n{rTEstPnPz
+northeastward n{rTEstwPd
+norther n{rTP
+northerly n{rTPl/
+northern n{rTPn
+northern's n{rTPnz
+northerner n{rTPnP
+northerners n{rTPnPz
+northernmost n{rTPnmOst
+northey n{rT/
+northfield n{rTfEld
+northgate n{rTgAt
+northington n{rT6Nt~
+northland n{rTland
+northridge n{rTrij
+northrop n{rTr@p
+northrop's n{rTr@ps
+northrup n{rTr@p
+northrup's n{rTr@ps
+northstar n{rTstor
+northup n{rTup
+northvale n{rTvAl
+northview n{rTvyU
+northward n{rTwPd
+northway n{rTwA
+northwest n{rTwest
+northwest's n{rTwests
+northwesterly n{rTwestPl/
+northwestern n{rTwestPn
+northwestern's n{rTwestPnz
+northwood n{rTwqd
+norton n{rt~
+norton's n{rt~z
+norvel n{rv@l
+norvell n{rv@l
+norvil n{rv@l
+norville n{rvil
+norvin n{rvin
+norwalk n{rw{k
+norward n{rwPd
+norway n{rwA
+norway's n{rwAz
+norweb n{rweb
+norwegian n{rwEj~
+norwegians n{rwEj~z
+norwell n{rwcl
+norwest n{rwest
+norwest's n{rwests
+norwich n{rw6C
+norwin n{rwin
+norwitz n{rwits
+norwood n{rwqd
+norwyn n{rwin
+nosair nOsAr
+nosair nOzAr
+nosair's nOsArz
+nosair's nOzArz
+nosal nOz@l
+nose nOz
+nosebleed nOzblEd
+nosed nOzd
+nosedive nOzdIv
+nosedived nOzdIvd
+nosek nOsck
+noses nOz@z
+noseworthy nOzwVT/
+nosiness nOz/n@s
+nosing nOz6N
+noska nOsk@
+noss n{s
+nostalgia n{stalj@
+nostalgic n{stalj6k
+nostra n{str@
+nostradamus n{str@dam@s
+nostrand nostr~d
+nostril nostr@l
+nostrils nostr@lz
+nostrums nostr}z
+nosy nOz/
+not not
+notable nOt@b@l
+notables nOt@b@lz
+notably nOt@bl/
+notarianni n]tor/on/
+notaro n]t)r]
+notary nOtP/
+notation n]tAS~
+notations n]tAS~z
+notch noC
+notched noCt
+notches noC@z
+note nOt
+note's nOts
+notebaert nOt@bert
+notebook nOtbqk
+notebooks nOtbqks
+noteboom nUt@bUm
+noteboom not@bUm
+noted nOt@d
+noteholder nOthOldP
+noteholders nOthOldPz
+notes nOts
+notes' nOts
+notestine n]tcstEn/
+noteware nOtwer
+noteworthy nOtwVT/
+noth noT
+nothdurft noTdPft
+nother nuTP
+nothin nuT~
+nothin' nuT~
+nothing nuT6N
+nothing's nuT6Nz
+nothingness nuT6Nn@s
+nothings nuT6Nz
+nothnagel noTn@g@l
+nothstein noTstEn
+nothstein noTstIn
+notice nOt@s
+noticeable nOt@s@b@l
+noticeably nOt@s@bl/
+noticed nOt@st
+notices nOt@s@z
+noticing nOt@s6N
+notification nOt@f@kAS~
+notifications nOt@f@kAS~z
+notified nOt@fId
+notifies nOt@fIz
+notify nOt@fI
+notifying nOt@fI6N
+noting nOt6N
+notion nOS~
+notions nOS~z
+notis nOtis
+noto nOt]
+notochord nOt@k{rd
+notoriety nOtPI@t/
+notorious n]t{r/@s
+notoriously n]t{r/@sl/
+notre nOtP
+notre nOtr@
+nots nots
+nott not
+nottage not6j
+notte not
+notter notP
+nottingham not6Nham
+notwithstanding notwiTstand6N
+notz nots
+noun n?n
+nourish nV6S
+nourished nV6St
+nourishing nV6S6N
+nourishment nV6Sm~t
+nourse n{rs
+nouveau nUvO
+nouvel nUv@l
+nouvelle nUvel
+nov nOv
+nov n]vembP
+nova nOv@
+nova's nOv@z
+novacare nOv@ker
+novacek nov@Cck
+novack nov@k
+novacor nOv@k{r
+novak nOvak
+novak's nOvaks
+novakovich n@vok@v6C
+novakowski n@v@k{fsk/
+novametrix n]vam@tr6ks
+novas nOv@z
+novato n]vot]
+novel nov@l
+novel's nov@lz
+novelist nov@l@st
+novelistic nov@list6k
+novelists nov@l@s
+novelists nov@l@ss
+novelists nov@l@sts
+novell n]vel
+novell's n]velz
+novella n]vel@
+novelli n]vel/
+novello n]vel]
+novellus n]vel@s
+novelly nOv@l/
+novels nov@lz
+novelties nov@lt/z
+novelty nov@lt/
+november n]vembP
+november's n]vembPz
+noverco n]vVk]
+novey nOv/
+novgorod novgPod
+novi nOv/
+novi nOvI
+novia nOv/@
+novice nov@s
+novices nov@s@z
+novick nOv6k
+novick nov6k
+novicki n@vitsk/
+novinger nOv6NP
+novitski n@vitsk/
+novitsky n@vitsk/
+novo nOv]
+novo's nOv]z
+novoa n]vO@
+novogrod nOv]grad
+novopharm nOv]form
+novosad nov@sad
+novosel nov@scl
+novosibirsk n]v@sibVsk
+novosti n]v{st/
+novotney nov@tn/
+novotny n@vOtn/
+novum nOv}
+novy nOv/
+now n?
+now's n?z
+nowa n?@
+nowack n?@k
+nowacki n?otsk/
+nowaczyk n?@Cik
+nowaday n?@dA
+nowadays n?@dAz
+nowak nOvak
+nowakowski n?@k{fsk/
+nowell nO@l
+nowels n?@lz
+nowhere nOhwer
+nowhere nOwer
+nowicki n?itsk/
+nowinski n?insk/
+nowlan n?l~
+nowland n?l~d
+nowlin n?lin
+nowling n?l6N
+nowotny n?Otn/
+noxell noksel
+noxema noksEm@
+noxious nokS@s
+noxon noks~
+noxso noks]
+noyce n<s
+noyd n<d
+noyes n<z
+noyola n<Ol@
+nozzle noz@l
+nozzles noz@lz
+npr enpE)r
+npr's enpE)rz
+npr.org enpE)rdot{rg
+nth enT
+nu nU
+nuala nUol@
+nuance nUons
+nuanced nUonst
+nuances nUons@z
+nub nub
+nuber nUbP
+nubian nyUb/~
+nucci nUC/
+nuccio nUC/]
+nuckles nuk@lz
+nuckolls nuk@lz
+nuckols nuk@lz
+nuclear nUkl/P
+nucleation nUkl/AS~
+nuclei nUkl/I
+nucleic nUklA6k
+nucleonic nukl/on6k
+nucleonics nukl/on6ks
+nucleotide nUkl/@tId
+nucleus nUkl/@s
+nucor nUk{r
+nucor's nUk{rz
+nucorp nUk{rp
+nudd nud
+nude nUd
+nudelman nud@lm~
+nudes nUdz
+nudge nuj
+nudged nujd
+nudges nuj@z
+nudging nuj6N
+nudist nUdist
+nudity nUd@t/
+nudo nUd]
+nuevo nwAv]
+nuexco nwAksk]
+nueyung nUyuN
+nufer nUfP
+nuffer nufP
+nugan nUg~
+nugent nUj~t
+nugett nUj@t
+nugget nug@t
+nugget's nug@ts
+nuggets nug@ts
+nuhfer nUfP
+nuhn nun
+nuisance nUs~s
+nujoma nUjOm@
+nuke nUk
+nukem nUk}
+nukes nUks
+nuland nUland
+nuland nUl~d
+null nul
+nullification nul@f@kAS~
+nullified nul@fId
+nullifies nul@fIz
+nullify nul@fI
+nullifying nul@fI6N
+nulph nulf
+nulton nult~
+nulty nult/
+numac nUmak
+numb num
+numbed numd
+number numbP
+number's numbPz
+numbered numbPd
+numbering numbP6N
+numbers numbPz
+numbing num6N
+numbingly num6Nl/
+numbness numn@s
+numed nUmed
+numeiri nUmAr/
+numeral nUmP@l
+numerals nUmP@lz
+numeric nUm,r6k
+numerica nUm,r6k@
+numerical nUm,r@k@l
+numerically nUm,r6kl/
+numerology nUmPol@j/
+numerous nUmP@s
+numia nUmy@
+numidia nUmid/@
+numismatic nUmismat6k
+numismatics nUmismat6ks
+numismatists nUmism@tis
+numismatists nUmism@tiss
+numismatists nUmism@tists
+nummi nUm/
+nun nun
+nun's nunz
+nunamaker nUnomAkP
+nunan nUnon
+nuncio nuns/]
+nunemaker nUnmAkP
+nunes nUnz
+nunez nUncz
+nungesser nuNg@sP
+nunley nunl/
+nunn nun
+nunn's nunz
+nunnally nun@l/
+nunnelley nun@l/
+nunnelly nun@l/
+nunnery nunP/
+nuno nUn]
+nuns nunz
+nuns' nunz
+nunsense nunsens
+nunziata nUnz/ot@
+nunziato nUnz/ot]
+nunzio nunz/]
+nuova nwOv@
+nuovo nwOv]
+nupeng nyUpcN
+nuptial nupC@l
+nuremberg nqr}bPg
+nureyev nPI@v
+nurmi nqrm/
+nurnberger nVnbPgP
+nurock nUrok
+nurre nV
+nurse nVs
+nurse's nVs@z
+nursed nVst
+nurseries nVsP/z
+nursery nVsP/
+nurseryman nVsP/man
+nurserymen nVsP/m~
+nurses nVs@z
+nurses' nVs@z
+nursing nVs6N
+nurture nVCP
+nurtured nVCPd
+nurturer nVtPP
+nurtures nVCPz
+nurturing nVCP6N
+nusbaum n@sb?m
+nusbaum n@sbom
+nusen nUs~
+nuss nus
+nussbaum nusb?m
+nussbaum nusbom
+nussbaum's nusb?mz
+nussbaum's nusbomz
+nussbaumer nusb?mP
+nusser nusP
+nussle nus@l
+nusz nuS
+nut nut
+nut's nuts
+nutcracker nutkrakP
+nute nyUt
+nutlets nutl@ts
+nutley nutl/
+nutmeg nutmeg
+nutone nUtOn
+nutrasweet nUtr@swEt
+nutri nUtr/
+nutri nUtr6
+nutria nUtr/@
+nutriclean nUtr6klEn
+nutrient nUtr/~t
+nutrients nUtr/~ts
+nutrition nUtriS~
+nutritional nUtriS~@l
+nutritionally nUtriSn@l/
+nutritionally nUtriS~@l/
+nutritionist nUtriS~@st
+nutritionists nUtriS~@s
+nutritionists nUtriS~@ss
+nutritionists nUtriS~@sts
+nutritious nUtriS@s
+nutritive nUtr@t6v
+nuts nuts
+nutshell nuCel
+nutt nut
+nuttall nut@l
+nutter nutP
+nutting nut6N
+nuttle nut@l
+nutty nut/
+nuveen nUvEn
+nuxoll nuks@l
+nuys nIz
+nuzum nUz}
+nuzzi nUts/
+nuzzle nuz@l
+nuzzo nUz]
+nvhome envEh]m
+nvhomes envEh]mz
+nvryan cnvrI~
+nyack nIak
+nyberg nIbPg
+nyborg nib{rg
+nyce nIs
+nycor nIk{r
+nycum nIk}
+nycum nik}
+nycz niC
+nydam nid}
+nydegger nid6gP
+nydia nid/@
+nye nI
+nyenhuis nI~hUs
+nyerere nIPir
+nyeri nIP/
+nyers nIrz
+nyet enwIEtE
+nyet nyet
+nygaard nigord
+nygard nigPd
+nygren nigrcn
+nyhan nIhan
+nyholm nih]lm
+nyhus nih@s
+nyina nI/n@
+nyland nil~d
+nylander nil~dP
+nylen nil~
+nylex nIl@ks
+nylon nIlon
+nylons nIlonz
+nylund nil~d
+nyman nIm~
+nymex nImeks
+nymph nimf
+nymphomaniac nimf]mAn/ak
+nymphomaniac nimf}An/ak
+nymphomaniacs nimf]mAn/aks
+nymphomaniacs nimf}An/aks
+nymphs nimfs
+nynex nIneks
+nynex's nIneks@z
+nyquist nikwist
+nyssa nis@
+nystrom nIstr}
+nyx niks
+o O
+o' O
+o'beirne ]bVn
+o'boyle ]b<l
+o'brian ]brI~
+o'brien ]brI~
+o'brien's ]brI~z
+o'callahan ]kal@han
+o'clock @klok
+o'connell ]kon@l
+o'conner ]konP
+o'conner's ]konPz
+o'connor ]konP
+o'connor's ]konPz
+o'dea ]dA
+o'deli ]del/
+o'dell ]del
+o'donnell ]don@l
+o'donnell's ]don@lz
+o'donoghue Odon@gyU
+o'donoghue Odon@hyU
+o'dwyer ]dwIr
+o'glove ]gluv
+o'gorman ]g{rm~
+o'grady ]grAd/
+o'grady's ]grAd/z
+o'hallaron ]halP~
+o'hanlon Ohanl~
+o'hara ]h,r@
+o'hara's ]h,r@z
+o'hare ]h,r
+o'keefe ]kEf
+o'keeffe ]kEf
+o'keeffe's ]kEfs
+o'kicki ]kik/
+o'leary ]lir/
+o'leary's ]lir/z
+o'malley ]mal/
+o'mara ]m)r@
+o'melveny ]melv~/
+o'neal ]nEl
+o'neil ]nEl
+o'neill ]nEl
+o'neill's ]nElz
+o'nuts ]nuts
+o'nuts ~uts
+o'quinn ]kwin
+o'reilly ]rIl/
+o'rourke ]r{rk
+o's Oz
+o'shaughnessy OSon@s/
+o'shea OSA
+o'smarty Osm)rt/
+o'steen ]stEn
+o'sullivan ]sul@v~
+o'toole ]tUl
+o. O
+o.'s Oz
+o.s Oz
+o.s' Oz
+oad OAdE
+oahu OohU
+oak Ok
+oak's Oks
+oakar Okor
+oakbrook Okbrqk
+oakdale OkdAl
+oakes Oks
+oakey Ok/
+oakite OkIt
+oakland Okl~d
+oakland's Okl~dz
+oakleaf OklEf
+oakley Okl/
+oakley's Okl/z
+oakman Okm~
+oakmark Okmork
+oakmont Okmont
+oakridge Okrij
+oaks Oks
+oaks' Oks
+oakville Okvil
+oakwood Okwqd
+oana On@
+oanh On
+oar {r
+oared {rd
+oarlock {rlok
+oars {rz
+oarsman {rzm~
+oas OAes
+oases ]As/z
+oasis ]Asis
+oat Ot
+oates Ots
+oath OT
+oathout OT?t
+oaths OTs
+oaths OTz
+oatis Otis
+oatley Otl/
+oatman Otm~
+oatmeal OtmEl
+oats Ots
+oaxaca Oks@k@
+oba Ob@
+obadiah Ob@dI@
+obando ]band]
+obanion ]bony{n
+obannon ob~on
+obar @b)r
+obara ]b)r@
+obarr ]b)r
+obediance ]bEd/~s
+obedience ]bEd/~s
+obedient ]bEd/~t
+obediently ]bEd/~tl/
+obediently ]bEdy~tl/
+obeid ]bId
+obeirne obIrn
+obelia ]bel/@
+obenchain obcnkIn
+obenshain obcnSIn
+ober ObP
+oberbeck obPbck
+oberdorf obPd{rf
+oberg ObPg
+oberhaus obPh?s
+oberhausen ObPh?z~
+oberhelman obPh@lm~
+oberholtzer obPh]ltzP
+oberlander obPl~dP
+oberle obP@l
+oberlin ObPl~
+oberly ObPl/
+obermaier ObPmIr
+oberman obPm~
+obermeier obPmIP
+obermeyer obPmIP
+obermiller obPm@lP
+oberon ObPon
+oberry Obcr/
+oberst obPst
+oberstar ObPstor
+obert obPt
+oberweis ObPwIs
+obese ]bEs
+obesity ]bEs@t/
+obey ]bA
+obeyed ]bAd
+obeying ]bA6N
+obeys ]bAz
+obfuscate obf@skAt
+obfuscation obf@skAS~
+obie Ob/
+obispo ]bisp]
+obit Ob@t
+obit ]bit
+obits ]bits
+obits obits
+obituaries ]biCUer/z
+obituary ]biCUer/
+object @bjekt
+object objckt
+objected @bjekt@d
+objecting @bjekt6N
+objection @bjekS~
+objection's @bjekS~z
+objectionable @bjekS~@b@l
+objections @bjekS~z
+objective @bjekt6v
+objectively objekt6vl/
+objectives @bjekt6vz
+objectivity objcktiv@t/
+objector @bjektP
+objectors @bjektPz
+objects @bjeks
+objects @bjekts
+objects objcks
+objects objckts
+oblak obl@k
+oblander obl~dP
+oblast oblast
+oblate oblAt
+oblate oblAt
+obligate obl@gAt
+obligated obl@gAt@d
+obligates obl@gAts
+obligation obl@gAS~
+obligations obl@gAS~z
+obligatory @blig@t{r/
+oblige @blIj
+obliged @blIjd
+obliges @blIj@z
+obliging @blIj6N
+obligingly @blIj6Nl/
+oblinger Ob@l6NP
+oblique @blEk
+obliquely ]blEkl/
+obliterate @blitPAt
+obliterated @blitPAt@d
+obliterating @blitPAt6N
+oblivion @bliv/~
+oblivious @bliv/@s
+oblong obl{N
+obnoxious obnokS@s
+oboe Ob]
+oboist Ob]@st
+obon Ob~
+oboyle ob<l
+obradovich @brod@v6C
+obrecht obr6kt
+obregon obr6g~
+obremski @bremsk/
+obrenovich @bren@v6C
+obrian obr/~
+obriant ]brE~t
+obrien ]brI~
+obringer obr6NP
+obrinsky ]brinsk/
+obryan ]brI~
+obryant ]brI~t
+obscene @bsEn
+obscene obsEn
+obscenely obsEnl/
+obscenities obsen@t/z
+obscenity @bsen@t/
+obscure @bskyqr
+obscured @bskyqrd
+obscures @bskyqrz
+obscuring @bskyqr6N
+obscurity @bskyqr@t/
+obsequious @bsEkw/@s
+observable @bzVv@b@l
+observables @bzVv@b@lz
+observance @bzVv~s
+observances @bzVv~s@z
+observant @bzVv~t
+observateur obzVv@tqr
+observation obzPvAS~
+observations obzPvAS~z
+observatories @bzVv@t{r/z
+observatory @bzVv@t{r/
+observatory's @bzVv@t{r/z
+observe @bzVv
+observed @bzVvd
+observer @bzVvP
+observers @bzVvPz
+observes @bzVvz
+observing @bzVv6N
+obsess @bses
+obsessed @bsest
+obsessing @bses6N
+obsession @bseS~
+obsessional @bseS~@l
+obsessions @bseS~z
+obsessive @bses6v
+obsessively obses6vl/
+obsidian @bsid/~
+obsolescence obs@les~s
+obsolescent obs@les~t
+obsolete obs@lEt
+obst obst
+obstacle obst@k@l
+obstacles obst@k@lz
+obstetric @bstetr6k
+obstetrician obst@triS~
+obstetricians obst@triS~z
+obstetrics @bstetr6ks
+obstfeld obstfeld
+obstinacy obst~@s/
+obstinate obst~@t
+obstruct @bstrukt
+obstructed @bstrukt@d
+obstructing @bstrukt6N
+obstruction @bstrukS~
+obstructionism @bstrukS~iz}
+obstructionist @bstrukS~@st
+obstructionists @bstrukS~@s
+obstructionists @bstrukS~@ss
+obstructionists @bstrukS~@sts
+obstructions @bstrukS~z
+obstructive @bstrukt6v
+obtain @btAn
+obtainable @btAn@b@l
+obtained @btAnd
+obtaining @btAn6N
+obtains @btAnz
+obtrude @btrUd
+obtrudes @btrUdz
+obtrusive @btrUs6v
+obtuse obtUs
+obuchowski @b@h{fsk/
+obuchowski ]byUk?sk/
+obverse @bvVs
+obviate obv/At
+obviating obv/At6N
+obvious obv/@s
+obviously obv/@sl/
+obyrne obVn
+ocain ]koEn
+ocala ]kal@
+ocallaghan ]kal@g~
+ocallahan ]kal@han
+ocampo ]kamp]
+ocana ]kan@
+ocanas ]kan@z
+ocarroll ]k,r@l
+ocarroll ]kar@l
+ocasio ]kos/]
+ocaw ]k{
+ocaw's ]k{z
+occasion @kAZ~
+occasional @kAZ~@l
+occasionally @kAZn@l/
+occasionally @kAZ~@l/
+occasionally @kAZ~l/
+occasioned @kAZ~d
+occasions @kAZ~z
+occhino OkEn]
+occhipinti ]k/pEnt/
+occhoa OCO@
+occhoa's OCO@z
+occident oks@dent
+occidental oks@den@l
+occidental oks@dent@l
+occidental's oks@den@lz
+occidental's oks@dent@lz
+occidentale oks@dent@l
+occidentale's oks@dent@lz
+occipital oksip@t@l
+occlusion @klUZ~
+occult @kult
+occupancy oky@p~s/
+occupant oky@p~t
+occupants oky@p~ts
+occupation oky@pAS~
+occupational oky@pAS~@l
+occupations oky@pAS~z
+occupied oky@pId
+occupier oky@pIP
+occupiers oky@pIPz
+occupies oky@pIz
+occupy oky@pI
+occupying oky@pI6N
+occur @kV
+occured @kVd
+occuring @kV6N
+occurred @kVd
+occurrence @kV~s
+occurrences @kV~s@z
+occurring @kV6N
+occurs @kVz
+ocean OS~
+ocean's OS~z
+oceaneering OS~ir6N
+oceanfront OS~frunt
+oceangoing OS~gO6N
+oceanic OS/an6k
+oceanographer OS~ogr@fP
+oceanographic OS~@graf6k
+oceanography OS~ogr@f/
+oceans OS~z
+oceanside OS~sId
+oceanview OS~vyU
+ocelot os@lot
+ocelot's os@lots
+och ok
+ocheltree oC@ltrE
+ochoa OCO@
+ochoa oCO@
+ochra okr@
+ochre OkP
+ochs Oks
+ochs oks
+ochsenschlager oks~SlogP
+ochsner oksnP
+ocilla ]sil@
+ocker okP
+ockerbloom okPblUm
+ockerman okPm~
+oclair oklP
+ocon @kon
+oconnell ]kon@l
+oconner ]konP
+oconner ok~P
+oconnor ]konP
+oct {kt
+oct {ktObP
+oct. {kt
+oct. {ktObP
+octagon okt@gon
+octagonal oktag~@l
+octahedral okt@hEdr@l
+octahedron okt@hEdr~
+octane oktAn
+octave okt6v
+octaves okt6vz
+octavia oktAv/@
+octavio oktAv/]
+octavius oktAv/@s
+octavus okt@vUs
+octel oktel
+octet oktet
+octillion oktily~
+october oktObP
+october's oktObPz
+octogenarian okt@j~,r/~
+octopi okt@pI
+octopus okt@pqs
+oda Od@
+odaiko ]dAk]
+odaniel od~/l
+oday OdA
+odd od
+oddball odb{l
+oddballs odb{lz
+odden od~
+odder odP
+oddest od@st
+oddi Od/
+oddi od/
+oddities od@t/z
+oddity od@t/
+oddler odlP
+oddler's odlPz
+oddly odl/
+odds odz
+odds-on odzon
+oddsmaker odzmAkP
+oddsmakers odzmAkPz
+oddy od/
+ode Od
+odea od/@
+oded Odcd
+odegaard od6gord
+odegard od6gPd
+odekirk od6kPk
+odele ]del/
+odelet od@l@t
+odelette od@lct
+odelia ]del/@
+odelinda ]dclEnd@
+odell ]del
+odella ]del@
+odem Odcm
+oden Od~
+odenthal odcnT@l
+odeon Od/~
+oder OdP
+odes Odz
+odessa ]des@
+odetics ]det6ks
+odette Odet
+odgers ojPz
+odiaum Od/}
+odiaun Od/~
+odier Od/P
+odilia ]dEl/@
+odin Od~
+odiorne ]d/{rn/
+odious Od/@s
+odland odl~d
+odle Od@l
+odneal odn@l
+odoherty od@hPt/
+odolf od]lf
+odom Od}
+odometer Odom@tP
+odometers Odom@tPz
+odoms Od}z
+odonald od~{ld
+odonnel od~cl
+odonnell ]don@l
+odonoghue od~oghU
+odonohue od~ohyU
+odonovan od~Ov~
+odor OdP
+odorant OdP~t
+odorless OdPl@s
+odorous OdP@s
+odors OdPz
+odowd od?d
+odp OdEpE
+odriscoll ]driskol
+odriscoll odriskol
+odum Od}
+odwyer odw/P
+odysseus ]dis/@s
+odyssey od@s/
+odyssey's od@s/z
+oedipal ed@p@l
+oedipus ]dEp@s
+oehler OlP
+oehlert OlPt
+oehlke Olk
+oehme Om
+oehmen Om~
+oehmens Om~z
+oehrlein {rlIn
+oeien O/~
+oelke Olk
+oelkers OlkPz
+oelman Olm~
+oelrich Olr6k
+oelschlager OlSlAgP
+oerlikon {rl6kon
+oertel {rt@l
+oesch OS
+oeser OzP
+oest O@st
+oesterle OstP@l
+oesterling OstPl6N
+oesterreich OstPIk
+oesterreichische OstPIk6S/
+oestreich OstrIk
+oestreicher OstrIkP
+oetken Otk~
+oetting Ot6N
+oettinger Ot6NP
+oettinger Ot~jP
+oeuvre Uvr@
+oeuvre Vv
+of @v
+of uv
+ofallon of@lon
+ofarrell ofPcl
+ofc OefsE
+ofelia ]fAl/@
+ofer OfP
+off {f
+off's {fs
+offbeat {fbEt
+offen {f~
+offend @fend
+offended @fend@d
+offender @fendP
+offenders @fendPz
+offending @fend6N
+offends @fendz
+offense @fens
+offenses @fens@z
+offensive @fens6v
+offensively @fens6vl/
+offensives @fens6vz
+offer {fP
+offer's {fPz
+offerdahl ofPdol
+offered {fPd
+offerer {fPP
+offering {fP6N
+offering {fr6N
+offering's {fP6Nz
+offering's {fr6Nz
+offerings {fP6Nz
+offerings {fr6Nz
+offerman {fPm~
+offermann {fPm~
+offers {fPz
+offhand {fhand
+offical @f6S@l
+officals {f6k@lz
+office {f@s
+office's {f@s@z
+officeholder {f@shOldP
+officeholders {f@shOldPz
+officemax {f@smaks
+officer {f@sP
+officer's {fisPz
+officers {f@sPz
+officers' {fisPz
+offices {f@s@z
+official @fiS@l
+official's @fiS@lz
+officialdom @fiS@ld}
+officially @fiS@l/
+officials @fiS@lz
+officials' @fiS@lz
+officiate @fiS/At
+officiated @fiS/At@d
+officiating @fiS/At6N
+officio @fis/]
+offield ofEld
+offill {fil
+offing {f6N
+offner ofnP
+offord ofPd
+offs {fs
+offset {fset
+offset {fset
+offsets {fsets
+offsetting {fset6N
+offsetting {fset6N
+offshoot {fSUt
+offshoots {fSUts
+offshore {fS{r
+offspring {fspriN
+offstage {fstAj
+offutt of@t
+ofilia ]fEl/@
+oflaherty ofl@hPt/
+oflynn oflin
+oft {ft
+oftedahl oft@dol
+oftel oftel
+often {ft~
+often {f~
+oftener {ft~P
+oftener {f~P
+oftentimes {ft~tImz
+oftentimes {f~tImz
+og og
+ogan Og~
+ogara ]g)r@
+ogata ]got@
+ogawa ]gow@
+ogborn ogbPn
+ogburn ogbPn
+ogden ogd~
+ogg og
+ogier Og/P
+ogilvie Ogilv/
+ogilvie ojilv/
+ogilvy Og@lv/
+ogilvy's Og@lv/z
+oglala ]glol@
+ogle Og@l
+oglebay Og@lbA
+ogled Og@ld
+ogles Og@lz
+oglesbee Og@lzbE
+oglesby og@lsb/
+oglethorpe Og@lT{rp
+ogletree Og@ltrE
+ognibene ]gn/ben@
+ogoni ]gOn/
+ogonyok ]gOnyok
+ogorman ogPm~
+ogrady @grod/
+ogre OgP
+ogren ogrcn
+ogress Ogr@s
+oguin ]gU/n
+oguinn ogin
+oh O
+oh's Oz
+ohagan ]hogon
+ohair ohP
+ohalloran oh@l{r~
+ohanesian oh~eZ~
+ohanian @hAn/~
+ohanlon @hanl~
+ohare ]h)rA
+oharra ohP@
+ohashi ]hoS/
+ohaver oh@vP
+ohba Ob@
+ohbayashi OboyoS/
+ohearn ohPn
+ohern ohPn
+oherron ohPon
+ohio ]hI]
+ohio's ]hI]z
+ohioan OhIO~
+ohioans OhIO~z
+ohkawara Okow)r@
+ohl Ol
+ohland Ol~d
+ohlendorf Ol~d{rf
+ohler OlP
+ohlin Olin
+ohlinger Ol6NP
+ohlman Olm~
+ohlmann Olm~
+ohlmeyer OlmIr
+ohlrich Olr6k
+ohlsen Ols~
+ohlson Ols~
+ohlsson Ols~
+ohm Om
+ohm's Omz
+ohmae OmA
+ohman Om~
+ohmann Om~
+ohmer OmP
+ohms Omz
+ohmura ]mUr@
+ohnemus On}is
+ohnstad Onst@d
+ohr {r
+ohrt {rt
+ohs Oz
+oi <
+oie <
+oien o/n
+oil <l
+oil's <lz
+oiled <ld
+oiler <lP
+oilers <lPz
+oilfield <lfEld
+oilfields <lfEldz
+oiling <l6N
+oilman <lman
+oilmen <lmen
+oils <lz
+oilseed <lsEd
+oilseeds <lsEdz
+oilwell <lwel
+oily <l/
+ointment <ntm~t
+oishi ]ES/
+oj OjA
+oja Oy@
+ojala ]yol@
+ojeda ]yAd@
+oji Oj/
+ojibwa ]jibw@
+ok OkA
+oka Ok@
+okabe ]kobA
+okada ]kod@
+okaloosa Ok@lUs@
+okaloosa {k@lUs@
+okamoto Ok}Ot]
+okamura Ok}qr@
+okane ]konA
+okano ]kon]
+okasaki Ok@sok/
+okasan ]kAz~
+okay OkA
+okayed OkAd
+okays OkAz
+okaz ]koz
+okazaki ]kozok/
+okdo {kdO
+okeechobee ]kECOb/
+okeefe ok/f
+okeeffe ok/f
+okelley okcl/
+okelly ok@l/
+oken ]kA~
+okerlund okPl~d
+okeson ok@s~
+okey Ok/
+oki Ok/
+okie Ok/
+okimoto ]k/mOt]
+okin Okin
+okinawa Ok/now@
+okinawa Okinow@
+okinawans OkEnow~z
+okinawans Okinow~z
+oklahoma Okl@hOm@
+oklahoma's Okl@hOm@z
+oklahoman Okl@hOm~
+oklahomans Okl@hOm~z
+okon Ok]n
+okoniewski Ok~Usk/
+okoniewski ]kon/efsk/
+okonski @konsk/
+okpo okp]
+okra Okr@
+okray okrA
+oksana oksan@
+oksana's oksan@z
+oksenberg oks~bPg
+okubo ]kUb]
+okuda ]kUd@
+okuma ]kyUmP
+okumura ]kUmqr@
+okun OkUn
+okuno ]kyUn]
+okura ]kUr@
+okurowski ]kPOsk/
+okwu {kwU
+ol' Ol
+ola Ol@
+olack Olak
+olaf Olof
+olafson ol@fs~
+olague Olog
+olah @lo
+olah Ol@
+olajuwon @lIjUon
+olajuwon's @lIjUonz
+oland ol~d
+olander ol~dP
+olano @lon]
+olasky ]lask/
+olathe ]laT/
+olaughlin @l{kl~
+olay ]lA
+olayan ]lI~
+olberding OlbPd6N
+olbrich Olbr6k
+olcott Olk@t
+olczak OlCak
+old Old
+old's Oldz
+old-timer OldtImP
+old-timers OldtImPz
+oldaker Old@kP
+oldani ]ldon/
+olde Old
+olden Old~
+oldenburg Old~bPg
+oldenkamp Old~kamp
+older OldP
+oldest Old@st
+oldfashioned OldfaS~d
+oldfather OldfoTP
+oldfield OldfEld
+oldham Old}
+oldie Old/
+oldies Old/z
+oldman Oldm~
+oldroyd Oldr<d
+olds Oldz
+oldsmar Oldzmor
+oldsmobile Oldzm]bEl
+oldsmobile's Oldzm]bElz
+oldsmobile's Olzm]bElz
+oldsmobiles Oldzm]bElz
+oldster OldstP
+oldsters OldstPz
+oldt Olt
+ole Ol
+ole OlA
+olea ol/@
+olean ]lEn
+oleander Ol/andP
+oleandrin ]l/andrin
+olear olP
+oleary olP/
+oleaster Ol/astP
+olefin Ol@fin
+olefins Ol@finz
+oleg Ol@g
+olejniczak @lAn6Cak
+olejnik @lAn6k
+oleksiak @leks/ak
+oleksy @leks/
+olen ol~
+olender olcndP
+olenick olcn6k
+olenik olcn6k
+oleo Ol/O
+oleoyl Ol/<l
+oleoyls Ol/<lz
+oler OlP
+oles OlAz
+oles Olz
+olesen ol/z~
+oleske Ol@sk/
+olesky @lesk/
+oleson ol@s~
+olestra ]lestr@
+olexa @lEks@
+oley Ol/
+olfactory ]lfaktP/
+olga Olg@
+olguin Olgin
+olick Ol6k
+oliff olif
+oligarch Ol6gork
+oligarchs Ol6gorkz
+oligarchy ol@gork/
+oliger ol6gP
+oligocene ol@g]sEn
+oligopolistic ]lig@p]list6k
+oligopoly ol6gop@l/
+olin Olin
+olin's Olinz
+olinda ]lEnd@
+olinde olind
+olinger ol6NP
+oliphant ol@f~t
+oliva ]lEv@
+olivares ]l/v)rcs
+olivarez ]l/v)rcz
+olivas ]lEvoz
+olive ol@v
+oliveira ol6vAr@
+oliver ol@vP
+oliver's ol6vPz
+olivera ]l/v,r@
+oliveras ]l/v,roz
+oliveri ]l/v,r/
+oliveria ol6vEr/@
+oliverio ol6vEr/]
+olivero ]l/v,r]
+oliveros ]l/v,r]z
+olives ol6vz
+oliveto ]l/vAt]
+olivette ol6vet
+olivetti ol6vet/
+olivetti's ol6vet/z
+olivia ]liv/@
+olivier OlivEA
+olivieri ]l/vir/
+olivine ol@vEn
+olivo {lEv]
+olk Ok
+olkowski ]lk{fsk/
+ollar olP
+oller olP
+olley ol/
+ollie Ol/
+ollie ol/
+olliff olif
+ollila ol@l@
+ollinger ol6NP
+ollis {l/z
+ollison olis~
+olly ol/
+olmeda ]lmAd@
+olmedo ]lmAd]
+olmert ]lmPt
+olmo Olm]
+olmos Olm]z
+olmstead Olmsted
+olney Oln/
+olof Ol{f
+olofson ol@fs~
+olokuei Ol]kU/
+olokuei's Ol]kU/z
+oloughlin @l?kl~
+olovo @l{v]
+olsen Ols~
+olshan OlS~
+olshansky OlS~sk/
+olshefski ]lSefsk/
+olsher OlSP
+olson Ols~
+olson's Ols~z
+olsson Ols~
+olstad Olst@d
+olsten Olst~
+olszewski ]lSefsk/
+olt Olt
+olthoff Olth{f
+oltman Oltm~
+oltmann Oltm~
+oltmanns Oltm~z
+olund ol~d
+olva Olv@
+olver OlvP
+olvera ]lv,r@
+olvey Olv/
+olympia ]limp/@
+olympia's ]limp/@z
+olympiad ]limp/ad
+olympian ]limp/~
+olympians ]limp/~z
+olympias ]limp/@s
+olympic ]limp6k
+olympic's ]limp6ks
+olympics ]limp6ks
+olympus ]limp@s
+oma Om@
+omaar Omor
+omaha Om@ho
+omaha's Om@hoz
+omahoney om@hon/
+omahony om@h~/
+omalley om@l/
+oman ]mon
+omani ]mon/
+omans ]monz
+omar Omor
+omara ]m)r@
+omarska ]m)rsk@
+omary },r/
+ombudsman omb@dzm~
+omdahl omdol
+omead ]mEd
+omeara OmEr@
+omega ]mAg@
+omega ]meg@
+omelet oml@t
+omelets oml@ts
+omelia ]mel/@
+omen Om~
+omens Om~z
+omer OmP
+ominous om~@s
+ominously om~@sl/
+omission ]miS~
+omissions ]miS~z
+omit ]mit
+omits ]mits
+omitted ]mit@d
+omitting ]mit6N
+omlor omlP
+ommen Om~
+ommen om~
+omni omn/
+omnibank omn@baNk
+omnibook omn@bqk
+omnibus omn@b@s
+omnibuses omn@b@s@z
+omnicare omn6ker
+omnicom omn6kom
+omnicom's omn6komz
+omnipotence omnip@t~s
+omnipotent omnip@t~t
+omnipresence omn@prez~s
+omnipresent omn@prez~t
+omniscient omniS~t
+omnivorous omnivP@s
+omohundro ]m]hUndr]
+omonia Om]ny@
+omonia }On/@
+omori ]m{r/
+omron omr~
+on on
+ona ~o
+onagers on@jPz
+onan On~
+onassis ]nasis
+onassis' ]nasis
+onassis's ]nasis@z
+onate OnAt
+onawa ]now@
+onboard onb{rd
+oncale ]nkol/
+once wuns
+oncogen oNk]g~
+oncogene oNk]jEn
+oncogenes oNkojen/s
+oncologist oNkol@j@st
+oncologists oNkol@j@s
+oncologists oNkol@j@ss
+oncologists oNkol@j@sts
+oncology oNkol@j/
+oncoming {nkum6N
+oncor onk{r
+ondaatje ondoty@
+onder ondP
+onderdonk ondPd@Nk
+ondo {nd]
+ondracek ondr@sck
+one hwun
+one wun
+one's wunz
+one-up-manship w~upm~Sip
+one-upmanship w~upm~Sip
+oneal ]nEl
+oneall on@l
+onecomm wunkom
+oneida ]nId@
+oneil ]nEl
+oneill ]nEl
+oneness wun@s
+oneness wunn@s
+oneok On/ok
+onerous OnP@s
+ones wunz
+ones' wunz
+oneself wunself
+onetime wuntIm
+onex wuneks
+onex's wuneks@z
+oney On/
+oneyear wunyir
+ong {N
+ongoing ongO6N
+ongpin {Npin
+onion uny~
+onions uny~z
+onishi ]nES/
+onken oNk~
+onley onl/
+online {nlIn
+online's {nlInz
+onlooker {nlqkP
+onlookers {nlqkPz
+only Onl/
+onnen on~
+onni on/
+onno on]
+ono On]
+onoda ]nOdP
+onofre ]n{fr/
+onofrio ]nOfr/]
+onomastic on}ast6k
+onomastics on}ast6ks
+onondaga on~d{g@
+onorato ]n{rot]
+onrushing onruS6N
+ons onz
+onscreen onskrEn
+onset onset
+onshore onS{r
+onsite onsIt
+onslaught {nsl{t
+onslow onsl]
+onstad onst@d
+onstage onstAj
+onstott onst@t
+ontario ont,r/]
+ontario's ont,r/]z
+ontiveros ]nt/v,r]z
+ontko ontk]
+onto ontU
+ontogeny ontoj~/
+ontological ont@loj6k@l
+ontology ontol@j/
+onus On@s
+onward {nwPd
+onwards onwPdz
+onyx on6ks
+oodle Ud@l
+oodles Ud@lz
+ooh U
+oohs Uz
+ooley Ul/
+oolong Ul{N
+oomph Umf
+oona Un@
+oooh U
+ooohs Oz
+ooohs Uz
+oops Ups
+ooten ]]tA~
+ooze Uz
+oozed Uzd
+oozes Uz@z
+oozing Uz6N
+op op
+op's ops
+opacity ]pas@t/
+opal Op@l
+opal's Op@lz
+opalina ]polEn@
+opaline Op@lEn
+opalines Op@lEnz
+opalka @polk@
+opaque ]pAk
+opax Opaks
+opcom opkom
+opdahl opdol
+opdyke opdIk
+opec Opek
+opec's Opeks
+opel Op@l
+opel's Op@lz
+open Op~
+opened Op~d
+opener Op~P
+openers Op~Pz
+opening Op~6N
+openings Op~6Nz
+openly Op~l/
+openness Op~@s
+openness Op~n@s
+opens Op~z
+openshaw Op~S{
+openwork Op~wVk
+opera opr@
+opera's opr@z
+operable opP@b@l
+operandi opPand/
+operandi opPandI
+operandi opPendI
+operant opP~t
+operas opr@z
+operate opPAt
+operated opPAt@d
+operates opPAts
+operatic opPat6k
+operating opPAt6N
+operation opPAS~
+operation's opPAS~z
+operational opPAS~@l
+operationally opPASn@l/
+operationally opPAS~@l/
+operations opPAS~z
+operations' opPAS~z
+operative opP@t6v
+operatives opP@t6vz
+operator opPAtP
+operator's opPAtPz
+operators opPAtPz
+operators' opPAtPz
+opere ]p,r
+operetta opPet@
+operettas opPet@z
+opfer opfP
+opheim ophIm
+ophelia @fEly@
+ophthalmic ofTalm6k
+ophthalmologist opT}ol@j@st
+ophthalmologists opT}ol@j@s
+ophthalmologists opT}ol@j@ss
+ophthalmologists opT}ol@j@sts
+ophthalmology opT}ol@j/
+ophthalmoscope ofTalm@skOp
+ophuls Of@lz
+opiate Op/@t
+opiates Op/@ts
+opic op6k
+opic's op6ks
+opie Op/
+opiela OpEl@
+opine ]pIn
+opined ]pInd
+opines ]pInz
+opining ]pIn6N
+opinion @piny~
+opinionate @piny~At
+opinionated @piny~At@d
+opinions @piny~z
+opitz opits
+opium Op/}
+opland opl~d
+ople Op@l
+oplinger Op@l6NP
+opossum ]pos}
+opp op
+oppedisano ]pcd/son]
+oppel op@l
+oppelt opclt
+oppenheim op~hIm
+oppenheimer op~hImP
+oppenheimer's op~hImPz
+oppenheimers op~hImPz
+oppens op~z
+opper opP
+opperman opPm~
+oppermann opPm~
+oppler {plP
+oppliger opl6gP
+opponent @pOn~t
+opponent's @pOn~ts
+opponents @pOn~ts
+opponents' @pOn~ts
+opportune opPtUn
+opportunism opPtUniz}
+opportunist opPtUn@st
+opportunistic opPtUnist6k
+opportunists opPtUn@s
+opportunists opPtUn@ss
+opportunists opPtUn@sts
+opportunities opPtUn@t/z
+opportunity opPtUn@t/
+oppose @pOz
+opposed @pOzd
+opposes @pOz@z
+opposing @pOz6N
+opposite op@z@t
+opposite opz@t
+opposites op@z@ts
+opposition op@ziS~
+opposition's op@ziS~z
+oppress @pres
+oppressed @prest
+oppressing @pres6N
+oppression @preS~
+oppressions @preS~z
+oppressive @pres6v
+oppressor @presP
+oppressors @presPz
+opprobrium @prObr/}
+oprah Opr@
+oprah's Opr@z
+opry opr/
+opryland opr/l~d
+ops ops
+opsahl opsol
+opsal ops@l
+opt opt
+optation optAS~
+opted opt@d
+optek optek
+optic opt6k
+optica opt6k@
+optical opt6k@l
+optical's opt6k@lz
+optically opt6kl/
+optician optiS~
+opticians optiS~z
+optics opt6ks
+optima opt}@
+optimal opt}@l
+optimism opt}iz}
+optimist opt}ist
+optimistic opt}ist6k
+optimistically opt}ist6k@l/
+optimistically opt}ist6kl/
+optimists opt}is
+optimists opt}iss
+optimists opt}ists
+optimization opt}@zAS~
+optimize opt}Iz
+optimum opt}}
+opting opt6N
+option opS~
+option's opS~z
+optional opS~@l
+optioned opS~d
+options opS~z
+options' opS~z
+opto opt]
+optometric opt]metr6k
+optometrist optom@trist
+optometrists optom@tris
+optometrists optom@triss
+optometrists optom@trists
+optometry optom@tr/
+opts opts
+optus opt@s
+opulence opy@l~s
+opulent opy@l~t
+opus Op@s
+oquendo ]kwend]
+oquin ]kwEn
+oquinn ]kwEn
+or P
+or {r
+ora {r@
+orabel {robel
+orabelle {r@b@l
+oracle {r@k@l
+oracle's {r@k@lz
+oracles {r@k@lz
+oradour {r@d{r
+oraflex {r@fleks
+orahood {r@hqd
+oral {r@l
+oralia {rol/@
+oralie {r@l/
+orally {r@l/
+oram {r}
+oran {ron
+orand {r~d
+orange {r~j
+orangeburg {r~jbPg
+oranges {r~j@z
+orangina {ranjEn@
+orangina {ranjEnP
+orangutan {raN@tan
+orangutan {raN@ton
+orangutan's {raN@tanz
+orangutan's {raN@tonz
+orangutans {raN@tanz
+orangutans {raN@tonz
+orasure {ruSqr
+oration {rAS~
+orations {rAS~z
+orator {r@tP
+oratorical {r@t{r@k@l
+oratorio or@t{r/]
+orators {r@tPz
+oratory {r@t{r/
+oravec {rov6k
+oravetz {r@vits
+orb {rb
+orbach {rbok
+orban {rb~
+orbanco {rbaNk]
+orben {rb~
+orbin {rbin
+orbis {rbis
+orbit {rb@t
+orbital {rb@t@l
+orbited {rb@t@d
+orbiter {rb@tP
+orbiters {rb@tPz
+orbiting {rb@t6N
+orbits {rb@ts
+orca {rk@
+orcas {rk@s
+orchard {rCPd
+orchards {rCPdz
+orchestra {rk@str@
+orchestra's {rk@str@z
+orchestral {rkestr@l
+orchestrally {rkestr@l/
+orchestras {rk@str@z
+orchestrate {rk@strAt
+orchestrated {rk@strAt@d
+orchestrates {rk@strAts
+orchestrating {rk@strAt6N
+orchestration {rk@strAS~
+orchestrations {rk@strAS~z
+orchid {rk@d
+orchids {rk@dz
+orcutt {rk@t
+ord {rd
+ordain {rdAn
+ordained {rdAnd
+ordaining {rdAn6N
+ordaz {rdoz
+ordeal {rdEl
+ordeals {rdElz
+ordella {rdel@
+order {rdP
+order's {rdPz
+ordered {rdPd
+ordering {rdP6N
+orderliness {rdPl/n@s
+orderly {rdPl/
+orders {rdPz
+ordinance {rd~~s
+ordinances {rd~~s@z
+ordinaries {rd~er/z
+ordinarily {rd~,r@l/
+ordinary {rd~er/
+ordination {rd~AS~
+ordiway {rd/wA
+ordnance {rdn~s
+ordnance's {rdn~s@z
+ordonez {rdOncz
+ordoyne {rd<n
+ordway {rdwA
+ore {r
+orea PE@
+orear Pir
+orebaugh {reb{
+oreffice {ref@s
+orefice {refIs
+oregan {reg~
+oregano Peg~O
+oregano {reg~O
+oregon {r@gon
+oregon {r@g~
+oregon's {r@gonz
+oregon's {r@g~z
+oregonian {r@gOn/~
+oregonians {r@gOn/~z
+oreilly {r@l/
+orel {r@l
+orela {rel@
+orelia {rel/@
+orellana {rclan@
+orem {rcm
+oren {r~
+orenda {rend@
+orendorff {r~d{rf
+orens {r~z
+orenstein {r~st/n
+orenstein {r~stIn
+orenthal {r~Tol
+oreo {r/]
+ores {rz
+oreskovich {resk@v6C
+orestes {rest/z
+orf {rf
+orfield {rf/ld
+orford {rfPd
+org {rg
+organ {rg~
+organelles {rg~elz
+organic {rgan6k
+organically {rgan6kl/
+organisation {rg~@zAS~
+organism {rg~iz}
+organism's {rg~iz}z
+organismic {rg~izm6k
+organisms {rg~iz}z
+organist {rg~@st
+organization {rg~@zAS~
+organization's {rg~@zAS~z
+organizational {rg~@zAS~@l
+organizations {rg~@zAS~z
+organize {rg~Iz
+organized {rg~Izd
+organizer {rg~IzP
+organizers {rg~IzPz
+organizes {rg~Iz@z
+organizing {rg~Iz6N
+organogenesis {rg~]jen@s@s
+organs {rg~z
+organum {rg~}
+orgasm {rgaz}
+orgasms {rgaz}z
+orgel {rg@l
+orgeron {rgP~
+orgies {rj/z
+orgill {rj@l
+orgotein {rg]tIn
+orgy {rj/
+ori {r/
+oriana {r/an@
+orick {r6k
+orielda {rEld@
+orielle {r/cl
+orient {r/ent
+oriental {r/en@l
+oriental {r/ent@l
+orientals {r/en@lz
+orientals {r/ent@lz
+orientated {r/~tAt@d
+orientation {r/cntAS~
+orientations {r/cntAS~z
+oriented {r/ent@d
+orifice {r@f@s@
+orifices {r@f@s@z
+origin {r@j~
+original Pij~@l
+originality Pij~al@t/
+originally Pijn@l/
+originally Pij~@l/
+originals Pij~@lz
+originate Pij~At
+originated {rij~At@d
+originates Pij~Ats
+originating Pij~At6N
+origination Pij~AS~
+originations Pij~AS~z
+originator Pij~AtP
+originators Pij~AtPz
+origins {r@jinz
+oriley {rIl/
+orilla {ril@
+orin {rin
+orinda Pind@
+orinoco {r~Ok]
+oriola {r/Ol@
+oriole {r/Ol
+orioles {r/Olz
+orioles' {r/Olz
+orion ]rI~
+orion {rI~
+orion's ]rI~z
+orion's {rI~z
+oriordan ]rird~
+oriordan {rird~
+oritz {rits
+orix {r6ks
+orkem {rk}
+orkin {rk~
+orkney {rkn/
+orky {rk/
+orlan {rl~
+orland {rl~d
+orlanda {rlond@
+orlandi {rlond/
+orlando {rland]
+orlando's {rland]z
+orlean {rl/~
+orlean's {rl/nz
+orlean's {rl/~z
+orleanian {rl/un/~
+orleanians {rl/un/~z
+orleans {rl/nz
+orleans {rl/~z
+orlena {rlcn@
+orlene {rlEn
+orlich {rl6k
+orlick {rl6k
+orloff {rl{f
+orloski {rl?sk/
+orlosky {rlOsk/
+orlowski {rl{fsk/
+orly {rl/
+orman {rm~
+ormand {rm~d
+orme {rm
+ormerod {rmP@d
+ormes {rmz
+ormiston {rm@ston
+ormond {rm~d
+ormonde {rm~d
+ormsbee {rmzb/
+ormsby {rmzb/
+orn {rn
+orna {rn@
+ornament {rn}~t
+ornamental {rn}ent@l
+ornamentation {rn}cntAS~
+ornamented {rn}ent@d
+ornaments {rn}~ts
+ornate {rnAt
+ornda {rnd@
+orndoff {rnd{f
+orndorff {rnd{rf
+orne {rn
+ornelas {rn@l@z
+ornellas {rnel@z
+orner {rnP
+ornery {rnP/
+ornette {rnet
+ornish {rniS
+ornithological {rn@T@l{j6k@l
+ornithology {rn@Tol@j/
+ornstein {rnst/n
+ornstein {rnstIn
+oro {r]
+oroark {r{rk
+orogenic {r@jen6k
+orogil {r]gil
+orographic {r@graf6k
+orona {rOn@
+oropeza {r]pez@
+oros {r]z
+orosco {rOsk]
+orosz {ruS
+orourke Pqrk
+orozco {rOzk]
+orpah {rpo
+orphan {rf~
+orphanage {rf~@j
+orphanages {rf~6j@z
+orphaned {rf~d
+orphaning {rf~6N
+orphans {rf~z
+orphee {rf/
+orpheum {rf/Um
+orpheus {rf/@s
+orphic {rf6k
+orpiment {rp}~t
+orr {r
+orran {ron
+orrell {rAl
+orren {r~
+orrery {rP/
+orrick {r6k
+orrico {rEk]
+orrin {rin
+orris {ris
+orrison {ris~
+orsa {rs@
+orsak {rs@k
+orsay {rsA
+orsborn {rsbPn
+orsburn {rsbPn
+orser {rsP
+orsi {rs/
+orsini {rsEn/
+orsino {rsEn]
+orso {rs]
+orsola {rsOl@
+orson {rs~
+ort {rt
+orta {rt@
+ortega {rtAg@
+ortega's {rtAg@z
+ortegas {rtAg@s
+ortego {rtAg]
+ortegon {rtAg{n
+orten {rt~
+ortenzio {rtenz/]
+ortez {rtez
+orth {rT
+ortho {rTO
+orthoclase {rT@klAs
+orthodontia {rT@donC/@
+orthodontic {rT@dont6k
+orthodontics {rT@dont6ks
+orthodontist {rT@dont@st
+orthodontist's {rT@dont@sts
+orthodontists {rT@dont@s
+orthodontists {rT@dont@ss
+orthodontists {rT@dont@sts
+orthodox {rT@doks
+orthodoxy {rT@doks/
+orthography {rTogr@f/
+orthopedic {rT@pEd6k
+orthopedist {rT@pEd@st
+orthopedists {rT@pEd@s
+orthopedists {rT@pEd@ss
+orthopedists {rT@pEd@sts
+ortis {rtis
+ortiz {rtEz
+ortlieb {rtlEb
+ortloff {rtl{f
+ortman {rtm~
+ortmann {rtm~
+ortner {rtnP
+ortolano {rt]lon]
+orton {rt~
+ortwein {rtwIn
+ortwin {rtwin
+orum {r}
+orva {rv@
+orval {rv@l
+orville {rvil
+orvin {rvin
+orvis {rvis
+orwell {rwel
+orwell's {rwelz
+orwellian {rwel/~
+orwick {rw6k
+orwig {rw6g
+ory {r/
+oryx {r6ks
+orzech {rzch
+orzechowski {rz@h{fsk/
+orzel {rz@l
+os os
+osage ]sAj
+osages ]sAj@z
+osaka ]sok@
+osake ]sok/
+osaki ]sok/
+osakowa Os@kO@
+osakowa's Os@kO@z
+osama ]som@
+osamu ]somU
+osberg osbPg
+osbert osbPt
+osbon osb~
+osborn {zb{rn
+osborne {zb{rn
+osborne's {zb{rnz
+osbourn osbPn
+osbourne osbPn
+osbun osb~
+osburn osbVn
+osby osb/
+oscalus {sk@l@s
+oscar {skP
+oscar's {skPz
+oscars {skPz
+oscarson oskors~
+osceola {s/Ol@
+osceola {sk/Ol@
+oscillate os@lAt
+oscillates os@lAts
+oscillating os@lAt6N
+oscillation os@lAS~
+oscillations os@lAS~z
+oscillator os@lAtP
+oscillators os@lAtPz
+oscillatory os@l@t{r/
+oscilloscope {sil@skOp
+oscilloscopes {sil@skOps
+osco osk]
+ose Oz
+oseguera ]sAg,r@
+oser OsP
+osgood osgqd
+osh oS
+osha OS@
+osha's OS@z
+oshaf OSof
+oshatz ]Sats
+oshaughnessy OSon@s/
+oshawa {Sow@
+oshea oS/@
+oshel oS@l
+oshell oS@l
+osher oSP
+oshields oS/ldz
+oshima ]SEm@
+oshiro ]Sir]
+oshita ]SEt@
+oshkosh {Sk{S
+oshman {Sm~
+oshman's {Sm~z
+osiecki @sEtsk/
+osika @sIk@
+osinski @sinsk/
+oskar {skP
+osland osl~d
+osler ozlP
+osley osl/
+oslin oslin
+oslo ozl]
+oslund osl~d
+osman osm~
+osmar osmP
+osmena {zmEn@
+osment osm~t
+osmer os}P
+osmium ozm/}
+osmon osm~
+osmond osm~d
+osmonds {zm~dz
+osmosis {zmOsis
+osmotic ozmot@k
+osmun ozm~
+osmund osm~d
+osmundson ozm~ds~
+osorio ]s{r/]
+osowski @s{fsk/
+ospina ]spEn@
+osprey {spr/
+osred osPd
+osric ozr6k
+oss {s
+ossa os@
+ossetia osESy@
+ossetia oseSy@
+ossetian osESy~
+ossetian oseSy~
+ossetians osESy~z
+ossetians oseSy~z
+ossicles os@k@lz
+ossification os@f@kAS~
+ossified os@fId
+ossify os@fI
+ossman osm~
+osso Os]
+osswald osw@ld
+ost Ost
+ostankino ost~kin]
+ostberg ostbPg
+ostby ostb/
+osteen ostEn
+osten os~
+ostendorf ost~d{rf
+ostensible ostens@b@l
+ostensibly ostens@bl/
+ostenson ost~s~
+ostentation {stcntAS~
+ostentatious ost~tAS@s
+ostentatiously ost~tAS@sl/
+osteoarthritis ost/OorTrIt@s
+osteopathic ost/@paT6k
+osteoporosis {st/opPOsis
+oster ostP
+osterberg ostPbPg
+ostergaard ostPgord
+ostergard ostPgPd
+ostergren ostPgrcn
+osterhaus ostPh?s
+osterhoff OstPh{f
+osterholt ostPh]lt
+osterhoudt ostPh?t
+osterhout ostPh?t
+osterkamp ostPkamp
+osterling ostPl6N
+osterloh ]st,rl]
+osterlund ostPl~d
+osterman ostPm~
+ostermann ostPm~
+ostermeier ostPmIP
+ostermeyer ostVmIP
+ostermiller ostPm@lP
+osterreichische {stPrIk6S/
+ostertag ostPt@g
+osthoff osth{f
+ostia ost/@
+ostin ost~
+ostinato ost~otO
+osting ost6N
+ostling os@l6N
+ostlund ostl~d
+ostman ostm~
+ostpolitik OstpOl@tik
+ostracism {str@siz}
+ostracize {str@sIz
+ostracized {str@sIzd
+ostrand ostr~d
+ostrander ostr~dP
+ostrem ostrcm
+ostrich {str6C
+ostriches ostr6C@z
+ostroff {str{f
+ostrogoth ostr@goT
+ostrogoths ostr@goTs
+ostrom ostr}
+ostroski @str?sk/
+ostrosky @strOsk/
+ostrow ostr?
+ostrow ostr]
+ostrowski @str{fsk/
+ostrowsky @str?sk/
+ostrum ostr}
+ostwald ostw@ld
+osuch os@k
+osullivan os@liv~
+osuna ]sUn@
+oswald {zw{ld
+oswald's {zw{ldz
+oswalt osw@lt
+oswego oswEg]
+oswell oswel
+ot OtE
+ot {t
+ota Ot@
+otaiba ]tAb@
+otani ]ton/
+otello ]tel]
+oteri ]t,r/
+otero ]t,r]
+otey Ot/
+otha @To
+othello @Tel]
+other uTP
+other's uTPz
+otherness uTPn@s
+others uTPz
+others' uTPz
+otherwise uTPwIz
+otherworldly uTPwVldl/
+othilia ]TEl/@
+othman oTm~
+otis Otis
+otmar otmor
+otology ]tol@j/
+otomobil ]tOm]b@l
+otoole otUl
+otremba ]tremb@
+otsego otsAg]
+otsuka ]tsUk@
+ott ot
+ottaviani ]tov/on/
+ottaviano ]tov/on]
+ottawa ot@wo
+ottawa's ot@w@z
+ottaway ot@wA
+otte ot
+otten ot~
+ottens ot~z
+otter otP
+otterbein otPbIn
+otterloo otPlU
+otters otPz
+otterson otPs~
+ottesen ot/z~
+otteson ot@s~
+ottilie ot@l/
+otting ot6N
+ottley otl/
+ottman otm~
+otto otO
+otto's otOz
+ottoman ot}~
+ottosen ot]s~
+ottoson ot@s~
+otts ots
+ottum ot}
+otwell otwel
+ou U
+oubre UbP
+ouch ?C
+ouderkirk ?dPkPk
+ouelette oUlct
+ouellet oUlct
+ouellette oUlct
+ought {t
+oughta {t@
+oughtn't {t~t
+oui UwE
+oui wE
+ouimet w/met
+ouimette w/met
+ounce ?ns
+ounces ?ns@z
+ounsted ?nsted
+our )r
+our ?P
+our ?r
+ourada ]qrod@
+ours )rz
+ours ?Pz
+ourself ?Pself
+ourself orself
+ourselves ?Pselvz
+ourselves orselvz
+ourso Vs]
+ousley ?sl/
+oust ?st
+ousted ?st@d
+ouster ?stP
+ousting ?st6N
+out ?t
+out's ?ts
+out-mode ?tmOd
+out-moded ?tmOd@d
+outage ?t@j
+outages ?t6j@z
+outback ?tbak
+outbid ?tbid
+outbidding ?tbid6N
+outboard ?tb{rd
+outboard's ?tb{rdz
+outbound ?tb?nd
+outbreak ?tbrAk
+outbreaks ?tbrAks
+outburst ?tbVst
+outbursts ?tbVs
+outbursts ?tbVss
+outbursts ?tbVsts
+outcalt ?tk@lt
+outcast ?tkast
+outcasts ?tkas
+outcasts ?tkass
+outcasts ?tkasts
+outclass ?tklas
+outcome ?tkum
+outcomes ?tkumz
+outcries ?tkrIz
+outcry ?tkrI
+outdate ?tdAt
+outdated ?tdAt@d
+outdid ?tdid
+outdistancing ?tdist~s6N
+outdo ?tdU
+outdone ?tdun
+outdoor ?td{r
+outdoors ?td{rz
+outed ?t@d
+outen ?t~
+outer ?tP
+outermost ?tPmOst
+outerwear ?tPwer
+outfield ?tfEld
+outfielder ?tfEldP
+outfielders ?tfEldPz
+outfit ?tfit
+outfits ?tfits
+outfitted ?tfit@d
+outfitter ?tfitP
+outfitting ?tfit6N
+outflank ?tflaNk
+outflanked ?tflaNkt
+outflow ?tflO
+outflows ?tflOz
+outfox ?tfoks
+outfoxed ?tfokst
+outgain ?tgAn
+outgained ?tgAnd
+outgo ?tgO
+outgoing ?tgO6N
+outgrew ?tgrU
+outgrow ?tgrO
+outgrowing ?tgrO6N
+outgrown ?tgrOn
+outgrowth ?tgrOT
+outguess ?tges
+outgun ?tgun
+outgunned ?tgund
+outhouse ?th?s
+outhouses ?th?s@z
+outing ?t6N
+outings ?t6Nz
+outland ?tland
+outland ?tl~d
+outlandish ?tland6S
+outlast ?tlast
+outlasted ?tlast@d
+outlaw ?tl{
+outlawed ?tl{d
+outlawing ?tl{6N
+outlawry ?tl{r/
+outlaws ?tl{z
+outlay ?tlA
+outlays ?tlAz
+outler ?t@lP
+outlet ?tlet
+outlet's ?tlets
+outlets ?tlets
+outley ?tl/
+outlier ?tlIP
+outline ?tlIn
+outlined ?tlInd
+outlines ?tlInz
+outlining ?tlIn6N
+outlive ?tliv
+outlived ?tlivd
+outlook ?tlqk
+outlooks ?tlqks
+outlying ?tlI6N
+outman ?tman
+outman ?tm~
+outmaneuver ?tm~UvP
+outmaneuvered ?tm~UvPd
+outmanned ?tmand
+outmode ?tmOd
+outmoded ?tmOd@d
+outnumber ?tnumbP
+outnumbered ?tnumbPd
+outnumbering ?tnumbP6N
+outnumbers ?tnumbPz
+outokumpu Ut@kumpU
+outpace ?tpAs
+outpaced ?tpAst
+outpaces ?tpAs@z
+outpacing ?tpAs6N
+outpatient ?tpAS~t
+outperform ?tpPf{rm
+outperformance ?tpPf{rm~s
+outperformed ?tpPf{rmd
+outperformer ?tpPf{rmP
+outperforming ?tpPf{rm6N
+outperforms ?tpPf{rmz
+outplacement ?tplAsm~t
+outpost ?tpOst
+outposts ?tpOs
+outposts ?tpOss
+outposts ?tpOsts
+outpouching ?tp?C6N
+outpour ?tp{r
+outpouring ?tp{r6N
+output ?tpqt
+outputs ?tpqts
+outrage ?trAj
+outraged ?trAjd
+outrageous ?trAj@s
+outrageously ?trAj@sl/
+outrageousness ?trAj@sn@s
+outrages ?trAj@z
+outraging ?trAj6N
+outreach ?trEC
+outrider ?trIdP
+outriders ?trIdPz
+outrigger ?trigP
+outright ?trIt
+outrun ?trun
+outs ?ts
+outscore ?tsk{r
+outscored ?tsk{rd
+outsell ?tsel
+outselling ?tsel6N
+outsells ?tselz
+outset ?tset
+outshine ?CIn
+outshone ?tSOn
+outside ?tsId
+outsider ?tsIdP
+outsider's ?tsIdPz
+outsiders ?tsIdPz
+outsiders' ?tsIdPz
+outsides ?tsIdz
+outsize ?tsIz
+outsized ?tsIzd
+outskirt ?tskVt
+outskirts ?tskVts
+outsmart ?tsmort
+outsold ?tsOld
+outsource ?ts{rs
+outsourcing ?ts{rs6N
+outspend ?tspend
+outspending ?tspend6N
+outspent ?tspent
+outspoken ?tspOk~
+outspokenness ?tspOk~@s
+outstanding ?tstand6N
+outstretch ?tstreC
+outstretched ?tstreCt
+outstrip ?tstrip
+outstripped ?tstript
+outstripping ?tstrip6N
+outstrips ?tstrips
+outta ?t@
+outta Ut@
+outtake ?tAk
+outtake ?ttAk
+outtakes ?tAks
+outtakes ?ttAks
+outten ?t~
+outvote ?tvOt
+outvoted ?tvOt@d
+outward ?twPd
+outwardly ?twPdl/
+outwards ?twPdz
+outweigh ?twA
+outweighed ?twAd
+outweighing ?twA6N
+outweighs ?twAz
+outwit ?twit
+outwitting ?twit6N
+ouzts ?sts
+oval Ov@l
+ovalle ovAl
+ovarian ]v,r/~
+ovaries OvP/z
+ovary OvP/
+ovate OvAt
+ovation ]vAS~
+ovations ]vAS~z
+oven uv~
+ovens uv~z
+over OvP
+overabundance OvP@bund~s
+overacker OvP@kP
+overact OvPakt
+overacted OvPakt@d
+overactive OvPakt6v
+overall OvP{l
+overallotment OvP@lotm~t
+overallotments OvP@lotm~ts
+overalls OvP{lz
+overambitious OvPambiS@s
+overarching OvPorC6N
+overbaugh ]vVb{
+overbay OvPbA
+overbearing OvPb,r6N
+overbeck OvPbek
+overbey OvPb/
+overbilling OvPbil6N
+overblown OvPblOn
+overboard OvPb{rd
+overbook OvPbqk
+overbooked OvPbqkt
+overbooking OvPbqk6N
+overbought OvPb{t
+overbuilding OvPbild6N
+overbuilt OvPbilt
+overburden OvPbVd~
+overburdened OvPbVd~d
+overbuy OvPbI
+overby OvPb/
+overcame OvPkAm
+overcapacity OvPk@pas@t/
+overcash OvPkaS
+overcast OvPkast
+overcharge OvPCorj
+overcharged OvPC)rjd
+overcharges OvPCorj@z
+overcharging OvPC)rj6N
+overcoat OvPkOt
+overcoats OvPkOts
+overcome OvPkum
+overcomes OvPkumz
+overcoming OvPkum6N
+overconfidence OvPkonf@d~s
+overconfident OvPkonf@d~t
+overconsumption OvPk~sumpS~
+overcook OvPkqk
+overcooked OvPkqkt
+overcrowd OvPkr?d
+overcrowded OvPkr?d@d
+overcrowding OvPkr?d6N
+overdamping OvPdamp6N
+overdependence OvPd@pend~s
+overdid OvPdid
+overdo OvPdU
+overdoing OvPdU6N
+overdone OvPdun
+overdorf OvPd{rf
+overdose OvPdOs
+overdosed OvPdOst
+overdoses OvPdOs@z
+overdraft OvPdraft
+overdrafting OvPdraft6N
+overdrafts OvPdrafts
+overdraw OvPdr{
+overdrawn OvPdr{n
+overdress OvPdres
+overdrew OvPdrU
+overdrive OvPdrIv
+overdue OvPdU
+overeager OvPEgP
+overeat OvPEt
+overeating OvPEt6N
+overemphasize OvPemf@sIz
+overestimate OvPest}At
+overestimated OvPest}At@d
+overestimates OvPest}Ats
+overestimating OvPest}At6N
+overexcite OvPcksIt
+overexcited OvPcksIt@d
+overexpansion OvP6kspanS~
+overexpose OvP6kspOz
+overexposed OvP6kspOzd
+overexposure OvP6kspOZP
+overextend OvP6kstend
+overextended OvP6kstend@d
+overextending OvP6kstend6N
+overfed OvPfed
+overfeed OvPfEd
+overfelt OvPfelt
+overfield OvPfEld
+overfill OvPfil
+overfishing OvPfiS6N
+overflight OvPflIt
+overflights OvPflIts
+overflow OvPflO
+overflow OvPflO
+overflowed OvPflOd
+overflowing OvPflO6N
+overflows OvPflOz
+overfly OvPflI
+overflying OvPflI6N
+overfund OvPfund
+overfunded OvPfund@d
+overfunding OvPfund6N
+overgaard OvPgord
+overgenerous OvPjenP@s
+overgrazing OvPgrAz6N
+overgrown OvPgrOn
+overhang OvPhaN
+overhanging OvPhaN6N
+overhangs OvPhaNz
+overhaul OvPh{l
+overhauled OvPh{ld
+overhauling OvPh{l6N
+overhauls OvPh{lz
+overhead OvPhed
+overheads OvPhedz
+overhear OvPhir
+overheard OvPhVd
+overhearing OvPhir6N
+overheat OvPhEt
+overheated OvPhEt@d
+overheating OvPhEt6N
+overholser OvPhOlsP
+overholt OvPh]lt
+overholtzer OvPh]ltzP
+overjoyed OvPj<d
+overkill OvPkil
+overkilling OvPkil6N
+overlaid OvPlAd
+overlain OvPlAn
+overland OvPland
+overland OvPl~d
+overlap OvPlap
+overlapped OvPlapt
+overlapping OvPlap6N
+overlaps OvPlaps
+overlay OvPlA
+overlays OvPlAz
+overleverage OvPlevr6j
+overleveraged OvPlevr6jd
+overley OvPl/
+overload OvPlOd
+overloaded OvPlOd@d
+overloading OvPlOd6N
+overloads OvPlOdz
+overlock OvPlok
+overlook OvPlqk
+overlooked OvPlqkt
+overlooking OvPlqk6N
+overlooks OvPlqks
+overlord OvPl{rd
+overlords OvPl{rdz
+overly OvPl/
+overlying OvPlI6N
+overman OvPm~
+overmatch OvPmaC
+overmatched OvPmaCt
+overmyer OvPm/P
+overnight OvPnIt
+overnighter OvPnItP
+overnighters OvPnItPz
+overnite OvPnIt
+overoptimism OvPopt}iz}
+overpaid OvPpAd
+overpass OvPpas
+overpasses OvPpas@z
+overpay OvPpA
+overpaying OvPpA6N
+overpayment OvPpAm~t
+overpayments OvPpAm~ts
+overpeck OvPpek
+overplay OvPplA
+overplayed OvPplAd
+overplaying OvPplA6N
+overpopulate OvPpopy@lAt
+overpopulated OvPpopy@lAt@d
+overpopulation OvPpopy@lAS~
+overpower OvPp?P
+overpowered OvPp?Pd
+overpowering OvPp?r6N
+overprice OvPprIs
+overpriced OvPprIst
+overproduce OvPpr@dUs
+overproduced OvPpr@dUst
+overproducer OvPpr@dUsP
+overproducers OvPpr@dUsPz
+overproducing OvPpr@dyUs6N
+overproduction OvPpr@dukS~
+overprotect OvPpr@tekt
+overprotection OvPpr@tekS~
+overprotective OvPpr@tekt@v
+overqualified OvPkwol@fId
+overqualify OvPkwol@fI
+overran OvPran
+overrate OvPrAt
+overrated OvPrAt@d
+overreach OvPrEC
+overreached OvPrECt
+overreaches OvPrEC@z
+overreaching OvPrEC6N
+overreact OvPr/akt
+overreacted OvPr/akt@d
+overreacting OvPr/akt6N
+overreaction OvPr/akS~
+overregulate OvPregy@lAt
+overregulated OvPregy@lAt@d
+overregulation OvPregy@lAS~
+overreliance OvPr@lI~s
+overrepresent OvPrepr@zent
+overrepresented OvPrepr@zent@d
+overridden OvPrid~
+override OvPrId
+overrides OvPrIdz
+overriding OvPrId6N
+overripe OvPrIp
+overrode OvPrOd
+overrule OvPrUl
+overruled OvPrUld
+overruling OvPrUl6N
+overrun OvPrun
+overrunning OvPrun6N
+overruns OvPrunz
+overs OvPz
+oversaw OvPs{
+oversea OvPsE
+overseas OvPsEz
+oversee OvPsE
+overseeing OvPsE6N
+overseen OvPsEn
+overseer OvPsEP
+overseers OvPsEPz
+oversees OvPsEz
+oversell OvPsel
+overselling OvPsel6N
+oversensitive OvPsens@t@v
+oversensitivity OvPscns@tiv@t/
+overshadow OvPSad]
+overshadowed OvPSad]d
+overshadowing OvPSad]6N
+overshadows OvPSad]z
+overshoot OvPSUt
+overshooting OvPSUt6N
+overshot OvPSot
+oversight OvPsIt
+oversimplification ]vPsimpl@f@kAS~
+oversimplified ]vPsimpl@fId
+oversimplify ]vPsimpl@fI
+oversimplifying ]vPsimpl@fI6N
+oversize OvPsIz
+oversized OvPsIzd
+oversizes OvPsIz@z
+overslept OvPslept
+oversold OvPsOld
+overson OvPs~
+overspend OvPspend
+overspending OvPspend6N
+overspends OvPspendz
+overspent OvPspent
+overstaff OvPstaf
+overstaffed OvPstaft
+overstate OvPstAt
+overstated OvPstAt@d
+overstatement OvPstAtm~t
+overstatements OvPstAtm~ts
+overstates OvPstAts
+overstating OvPstAt6N
+overstay OvPstA
+overstayed OvPstAd
+overstep OvPstep
+overstepped OvPstept
+overstepping OvPstep6N
+overstock OvPstok
+overstocked OvPstokt
+overstreet OvPstrEt
+overstrom OvPstrom
+overstuff OvPstuf
+overstuffed OvPstuft
+oversubscribe OvPs@bskrIb
+oversubscribed OvPs@bskrIbd
+oversupplied OvPs@plId
+oversupply OvPs@plI
+overt OvPt
+overt ]vVt
+overtake OvPtAk
+overtaken OvPtAk~
+overtaking OvPtAk6N
+overtax OvPtaks
+overtaxed OvPtakst
+overthrew OvPTrU
+overthrow OvPTrO
+overthrowing OvPTrO6N
+overthrown OvPTrOn
+overtime OvPtIm
+overtly ]vVtl/
+overton OvPt~
+overtone OvPtOn
+overtones OvPtOnz
+overtook OvPtqk
+overtrain ]vPtrAn
+overtraining ]vPtrAn6N
+overture OvPCP
+overtures OvPCqrz
+overturf OvPtVf
+overturn OvPtVn
+overturned OvPtVnd
+overturning OvPtVn6N
+overturns OvPtVnz
+overuse OvPyUz
+overused OvPyUzd
+overusing OvPyUz6N
+overvaluation OvPvalyUAS~
+overvalue OvPvalyU
+overvalued OvPvalyUd
+overview OvPvyU
+overweight OvPwAt
+overweighted OvPwAt@d
+overwhelm OvPhwelm
+overwhelm OvPwelm
+overwhelmed OvPhwelmd
+overwhelmed OvPwelmd
+overwhelming OvPhwelm6N
+overwhelming OvPwelm6N
+overwhelmingly OvPhwelm6Ngl/
+overwhelmingly OvPhwelm6Nl/
+overwhelmingly OvPwelm6Ngl/
+overwhelmingly OvPwelm6Nl/
+overwhelms OvPhwelmz
+overwhelms OvPwelmz
+overwinter OvPwintP
+overwork OvPwVk
+overworked OvPwVkt
+overwrite OvPrIt
+overwritten OvPrit~
+overwrought OvPr{t
+overy OvP/
+overzealous OvPzel@s
+oveson ov@s~
+ovett Ovet
+ovett's Ovets
+ovex Ovcks
+oviatt Ov/ot
+oviedo ]v/Ad]
+oviparous ]vipP@s
+ovitt Ovit
+ovitz ]vits
+ovitz's ]vits@z
+ovoid Ov<d
+ovonic ]von6k
+ovoviviparous OvOvIvipP@s
+ovshinsky ovSinsk/
+ovulation Ovy@lAS~
+ovule OvyUl
+ovum Ov}
+ow ?
+ow O
+owada ]od@
+owades ]odz
+owczarzak ?C)rz@k
+owe O
+owed Od
+owen O~
+owen's O~z
+owenby ?~b/
+owens O~z
+owens's O~z@z
+owensboro O~zbP]
+owensby ?~sb/
+owes Oz
+owing O6N
+owings O6Nz
+owl ?l
+owls ?lz
+own On
+ownbey ?nb/
+ownby ?nb/
+owned Ond
+owner OnP
+owner's OnPz
+owners OnPz
+owners' OnPz
+ownership OnPSip
+owning On6N
+owns Onz
+owosso ]{s]
+owsley ?sl/
+owyhee O/h/
+ox oks
+oxalates oks@lAts
+oxalis oks@l@s
+oxbow oksbO
+oxbridge oksbrij
+oxcart okskort
+oxdon oksdon
+oxen oks~
+oxendine oks~dIn
+oxfam oksfam
+oxfam's oksfamz
+oxford oksfPd
+oxford's oksfPdz
+oxfords oksfPdz
+oxidant oks@d~t
+oxidants oks@d~ts
+oxidation oks@dAS~
+oxide oksId
+oxides oksIdz
+oxidize oks@dIz
+oxidized oks@dIzd
+oxidizer oks@dIzP
+oxidizing oks@dIz6N
+oxidyne oks@dIn
+oxley oksl/
+oxman oksm~
+oxnard oksnPd
+oxner oksnP
+oxoco oksOk]
+oxton okst~
+oxy oks/
+oxygen oks@j~
+oxygenate oks@j~At
+oxygenated oks@j~At@d
+oxymoron oks/m{ron
+oxytocin oks@tOs~
+oy <
+oyama ]yom@
+oye <
+oyen <~
+oyer <P
+oyler <lP
+oyola <Ol@
+oyster <stP
+oysters <stPz
+oz oz
+ozaki ]zok/
+ozal Oz@l
+ozal's ]zolz
+ozanich @zanih
+ozanne Ozan
+ozark Ozork
+ozarks Ozorks
+ozawa ]zow@
+ozbun ozb~
+ozburn ozbPn
+ozelle @zel
+ozga Ozg@
+ozick Oz6k
+ozick's Oz6ks
+ozier Oz/P
+ozimek @zimck
+ozment ozm~t
+ozmun ozm~
+ozolins ]zOl/nz
+ozols Oz]lz
+ozone OzOn
+ozora @z{r@
+ozuna ]zUn@
+ozzie oz/
+p pE
+p's pEz
+p. pE
+p.'s pEz
+p.m pEem
+p.s pEz
+pa po
+paap pop
+paape pop
+paar p)r
+paasch poS
+paavola povOl@
+pablo pobl]
+pablum pabl}
+pabon pob{n
+pabst pabst
+pac pak
+pac's paks
+paca pak@
+paca pok@
+paccar p@k)r
+paccione pokCOn/
+pace pAs
+pace's pAs@z
+paced pAst
+pacella p@sel@
+pacelli p@sel/
+pacemaker pAsmAkP
+pacemakers pAsmAkPz
+pacer pAsP
+pacers pAsPz
+paces pAs@z
+pacesetter pAsetP
+paceway pAswA
+pacey pAs/
+pacheco p@Cek]
+pachinko p@CiNk]
+pacholder paC@ldP
+pacholski p@hOlsk/
+pachter paktP
+pachysandra paC@sandr@
+paci poC/
+pacific p@sif6k
+pacific's p@sif6ks
+pacifica p@sif6k@
+pacificare p@sif6ker
+pacification pas@f@kAS~
+pacifico poC/fEk]
+pacificorp p@sif6k{rp
+pacified pas@fId
+pacifier pas@fIP
+pacifiers pas@fIPz
+pacifism pas@fiz}
+pacifist pas@f@st
+pacifists pas@f@s
+pacifists pas@f@ss
+pacifists pas@f@sts
+pacify pas@fI
+pacing pAs6N
+pacini poCEn/
+pacino p@sEn]
+pack pak
+package pak6j
+package's pak6j@z
+packaged pak6jd
+packager pak6jP
+packagers pak6jPz
+packages pak@j@z
+packaging pak6j6N
+packard pakPd
+packard's pakPdz
+packed pakt
+packer pakP
+packers pakPz
+packet pak@t
+packets pak@ts
+packett pak@t
+packham pakh}
+packing pak6N
+packinghouse pak6Nh?s
+packman pakm~
+packs paks
+packwood pakwqd
+packwood's pakwqdz
+pacman pakm~
+paco pAk]
+pacs paks
+pact pakt
+pact's pakts
+pactel paktel
+pactel's paktelz
+pacto pakt]
+pacts paks
+pacts pakts
+pacyna p@sEn@
+pacyna pok/n@
+paczkowski p@Ck{fsk/
+pad pad
+paddack pad@k
+padded pad@d
+padden pad~
+paddies pad/z
+padding pad6N
+paddington pad6Nt~
+paddle pad@l
+paddled pad@ld
+paddles pad@lz
+paddling pad@l6N
+paddling padl6N
+paddock pad@k
+paddy pad/
+paddy's pad/z
+paden pAd~
+paderewski podPUsk/
+padfield padfEld
+padget paj@t
+padgett paj@t
+padgitt paj@t
+padilla p@dil@
+padley padl/
+padlock padlok
+padlocked padlokt
+padlocks padloks
+padmanabhan padman@ban
+padmanabhan podm~ob~
+padovano pod]von]
+padre padrA
+padres padrAz
+padrick padr6k
+padro podr]
+padron padr~
+pads padz
+padua padyU@
+paduano podUon]
+paducah p@dUk@
+padula podUl@
+pae pI
+paean pE~
+paeans pE~z
+paek pEk
+paeth pET
+paetz pEts
+paez pIez
+paff paf
+pafford pafPd
+pagan pAg~
+paganelli pogonel/
+pagani pogon/
+paganini pag~En/
+paganism pAg~iz}
+pagano pogon]
+pagar pagP
+page pAj
+page's pAj@z
+pageant paj~t
+pageantry paj~tr/
+pageants paj~ts
+paged pAjd
+pagel pag@l
+pagels pag@lz
+pagemaker pAjmAkP
+pagenkopf pag~k{f
+pagenkopf pag~k{pf
+pager pAjP
+pagers pAjPz
+pages pAj@z
+paget paj@t
+pagett paj@t
+pagette pajet
+pagey pAj/
+pagezy pajez/
+pagination paj~AS~
+paging pAj6N
+paglia pagl/@
+pagliaro pagl/)r]
+pagliarulo pagl/PUl]
+pagliuca pagl/Uk@
+pagliuca's pagl/Uk@z
+pagni pagn/
+pagnotta pognOt@
+pagoda p@gOd@
+pagurian p@gyqr/~
+pah pa
+pahl pol
+pahnos pon]s
+pai po/
+paid pAd
+paige pAj
+paighton pAt~
+paign pAn
+paik pAk
+pail pAl
+paille pAl
+pails pAlz
+pain pAn
+paine pAn
+pained pAnd
+painesville pAnzvil
+painewebber pAnwebP
+painewebber's pAnwebP
+painful pAnf@l
+painfully pAnf@l/
+painkiller pAnkilP
+painkillers pAnkilPz
+painless pAnl@s
+painlessly pAnl@sl/
+paino pAn]
+pains pAnz
+painstaking pAnstAk6N
+painstakingly pAnstAk6Nl/
+paint pAnt
+paintball pAntbol
+paintbrush pAntbruS
+paintbrushes pAntbruS@z
+painted pAn@d
+painted pAnt@d
+painter pAnP
+painter pAntP
+painter's pAnPz
+painter's pAntPz
+painterly pAnPl/
+painterly pAntPl/
+painters pAnPz
+painters pAntPz
+painting pAn6N
+painting pAnt6N
+paintings pAn6Nz
+paintings pAnt6Nz
+paints pAnts
+pair p,r
+paired p,rd
+pairing p,r6N
+pairs p,rz
+pais pAz
+paisley pAzl/
+paisley's pAzl/z
+pait pAt
+paiute pIyUt
+paiva pAv@
+paiz pAz
+pajak pI@k
+pajama p@jam@
+pajama p@jom@
+pajamas p@jam@z
+pajamas p@jom@z
+pajole p@jOl
+pajoli p@jOl/
+pak pak
+pak's paks
+pake pAk
+pakeha p@kAho
+pakistan pak@stan
+pakistan's pak@stanz
+pakistani pak@stan/
+pakistanian pak@stan/~
+pakistanis pak@stan/z
+pakula p@kUl@
+pakulski p@kulsk/
+pal pal
+pal's palz
+palace pal@s
+palaces pal@s@z
+palacio p@lAs/]
+palacios polosE]z
+paladino polodEn]
+palafox pal@foks
+palais p@lA
+palance pal~s
+palansky p@lansk/
+palardy p@l)rd/
+palash p@laS
+palatability pal@t@bil@t/
+palatable pal@t@b@l
+palate pal@t
+palates pal@ts
+palatial p@lAS@l
+palatine pal@tIn
+palau pal?
+palau's p@l?Uz
+palauans p@l?~z
+palay pAlA
+palazzi polots/
+palazzo p@loz]
+palazzola polotsOl@
+palazzolo polotsOl]
+palca palk@
+palca's palk@z
+palco palk]
+paldon pold~
+pale pAl
+palecek pol6Cck
+paled pAld
+palen pal~
+paleobotany pAl/]bot~/
+paleocene pAl/@sEn
+paleontologist pAl/~tol@j@st
+paleontologists pAl/~tol@j@s
+paleontologists pAl/~tol@j@ss
+paleontologists pAl/~tol@j@sts
+paleontology pAl/~tol@j/
+paleozoic pAl/@zO6k
+palermo p@l,rm]
+pales pAlz
+palese polAz/
+palest pAl@st
+palestine pal@stIn
+palestinian pal@stin/~
+palestinian's pal@stin/~z
+palestinians pal@stin/~z
+palestinians' pal@stin/~z
+palette pal@t
+paley pAl/
+palfrey palfr/
+palimony pal}On/
+palin palin
+palinkas pal6Nk@z
+palisade pal@sAd
+palisades pal@sAdz
+palka palk@
+palkar palkor
+palko palk]
+palkovic p@lkov6k
+pall pol
+palla pal@
+palladino polodEn]
+palladium p@lAd/}
+pallante polont/
+pallas pal@s
+paller palP
+palleschi polesk/
+pallet pal@t
+pallets pal@ts
+pallett pal@t
+palliative pal/@t6v
+palliatives pal/@t6vz
+pallid pal@d
+pallidotomy pal@d{t}/
+pallo pal]
+pallone polOn/
+palm polm
+palm pom
+palma polm@
+palma's polm@z
+palmateer palm@t6r
+palmatier palm@t/P
+palmdale pomdAl
+palmdale's pomdAlz
+palme polm
+palme pom
+palmer polmP
+palmer pomP
+palmer's polmPz
+palmer's pomPz
+palmeri polm,r/
+palmerino p{lmcrEn]
+palmero polm,r]
+palmerton pomPt~
+palmertree pomPtrE
+palmetto palmet]
+palmetto polmet]
+palmgren palmgrcn
+palmieri p{lm/,r/
+palminteri p{lm~t,r/
+palmira polmir@
+palmisano polm/son]
+palmistry pom@str/
+palmiter palmItP
+palmitic palmit6k
+palmolive polmol6v
+palmore palm{r
+palmquist palmkwist
+palms polmz
+palms pomz
+palmstierna p{lmst/,rn@
+palo pal]
+paloma polOm@
+palomar pal}or
+palomares pol]m)rcs
+palomba polOmb@
+palombi p@lomb/
+palombo p@lomb]
+palometa pol]met@
+palomino pal}En]
+palomita pol]mEt@
+palomo polOm]
+palone p@lOn
+palonius p@lOn/@s
+palos pol]z
+palpable palp@b@l
+palpably palp@bl/
+palpitation palp@tAS~
+palpitations palp@tAS~z
+pals palz
+palsy p{lz/
+paltry p{ltr/
+paltz p{lts
+paluch pal@k
+paluck pal@k
+palumbo p@lumb]
+paluzzi polUts/
+pam pam
+pam's pamz
+pamby pamb/
+pamela pam@l@
+pamela's pam@l@z
+pamelina pomclEn@
+pamella p}el@
+pamer pAmP
+pammy pam/
+pamour pam{r
+pampas pamp@z
+pampel pamp@l
+pamper pampP
+pampered pampPd
+pamperin pampPin
+pampering pampP6N
+pampers pampPz
+pamphlet pamfl@t
+pamphleteer pamfl@tir
+pamphlets pamfl@ts
+pamplin pamplin
+pamplona pamplOn@
+pan pan
+pan's panz
+panacea pan@sE@
+panache p~oS
+panaco pan@k]
+panagopoulos pan@gop@l@s
+panagos ponog]z
+panam panam
+panama pan}o
+panama's pan}oz
+panamanian pan}An/~
+panamanians pan}An/~z
+panamsat panamsat
+panamsat p~amsat
+panaro pon)r]
+panas pan@z
+panasonic pan@son6k
+pancake pankAk
+pancaked pankAkt
+pancakes pankAks
+pancanadian paNk~Ad/~
+pancer pansP
+pancho panC]
+panciera ponCir@
+pancoast pankOst
+pancontinental pankont~ent@l
+pancreas pankr/@s
+pancreatic pankr/at6k
+panda pand@
+pandanus pandAn@s
+pandas pand@z
+pandemic pandem6k
+pandemonium pand}On/}
+pander pandP
+pandered pandPd
+pandering pandP6N
+pandey pondA
+pandick pandik
+pandit pund@t
+pando pond]
+pandolfi pondOlf/
+pandolfo pondOlf]
+pandora pand{r@
+pandora's pand{r@z
+pandya pondy@
+pane pAn
+panebianco poncb/onk]
+panek pan6k
+panel pan@l
+panel's pan@lz
+paneled pan@ld
+paneling pan@l6N
+panelist pan@l@st
+panelists pan@l@s
+panelists pan@l@ss
+panelists pan@l@sts
+panelization pan@l@zAS~
+panelize pan@lIz
+panelized pan@lIzd
+panella p~el@
+panels pan@lz
+panels' pan@lz
+panem pAn}
+panepinto poncpEnt]
+panes pAnz
+panetta p~et@
+panetta's p~et@z
+panfida panfEd@
+panfil panfil
+panfile panfIl
+panful panf@l
+panfuls panf@lz
+pang paN
+pangallo poNgol]
+pangborn paNb{rn
+pangburn paNbVn
+pangels paNgelz
+pangle paNg@l
+pangloss paNglos
+pangloss panglos
+pangs paNz
+panhandle panhand@l
+panhandle's panhand@lz
+panhandler panhandlP
+panhandlers panhandlPz
+panhandling panhandl6N
+paniagua pon/og@
+panic pan6k
+panic's pan6ks
+paniccia ponEC@
+panicked pan6kt
+panicking pan6k6N
+panicky pan6k/
+panico ponEk]
+panics pan6ks
+panik pan6k
+pankau paNk?
+pankey pankE
+pankki paNk/
+panko paNk]
+pankonin paNk~in
+pankow paNk]
+pankratz paNkr@ts
+panky paNk/
+panmunjom panmUnj{m
+panmure panmqr
+panned pand
+pannell pan@l
+pannier pan/P
+pannill panil
+pannill's panilz
+panning pan6N
+pannone ponOn/
+pannu ponU
+pannullo ponUl]
+panny pan/
+panoply panopl/
+panopolys p~op@l/z
+panora p~{r@
+panorama panPam@
+panoramic panPam6k
+panos pon]s
+panoz panoz
+panozzo p~oz]
+panphila panfil@
+pans panz
+pansies panz/z
+pansophic pans@f6k
+pansy panz/
+pant pant
+pantaleo pontol/]
+pantalone pant@lOn
+pantaloon pant@lUn
+pantaloons pant@lUnz
+pantano ponton]
+panted pant@d
+pantel pontel
+panter pantP
+pantera's pont,r@z
+pantex pantcks
+panthea panT/@
+pantheistic panT/ist6k
+pantheon panT/on
+panther panTP
+panther's panTPz
+panthers panTPz
+panthers' panTPz
+panties pant/z
+panting pant6N
+pantle pant@l
+pantoja pontOy@
+pantomime pant}Im
+panton pant~
+pantry pantr/
+pants pants
+pantsuit pansUt
+pantsuit pantsUt
+pantsuits pansUts
+pantsuits pantsUts
+pantuso pontUs]
+panty pant/
+pantyhose pant/hOz
+panza panz@
+panzarella ponzorel@
+panzer panzP
+panzhihua panz@hyU@
+panzica panz6k@
+pao p?
+pao's p?z
+paolella po]lel@
+paoletti po]let/
+paoli p?l/
+paoli pAOl/
+paolillo po]lil]
+paolini po]lEn/
+paolino po]lEn]
+paolo p?l]
+paolucci po]lUC/
+paone pAOn
+paonessa po]nes@
+pap pap
+papa pop@
+papacy pAp@s/
+papadakis popodokis
+papadopoulos pap@dop@l@s
+papadopoulos pop@dop@l@s
+papageorge pap@j{rj
+papageorge pop@j{rj
+papago pop@gO
+papal pAp@l
+papale popol/
+papaleo popAlE@
+papalia popol/@
+papandrea popondr/@
+papandreou p@pandr/U
+papania popon/@
+paparazzi popor{z/
+paparella poporel@
+papas pop@z
+papaw p{p{
+papay papA
+papaya p@pI@
+papayas p@pI@z
+papazian p@pAz/~
+pape pAp
+papenfuss pap~fus
+paper pApP
+paper's pApPz
+paperback pApPbak
+paperbacks pApPbaks
+paperboard pApPb{rd
+paperboy pApPb{y
+paperboy's pApPb{yz
+paperboys pApPb{yz
+papered pApPd
+papering pApP6N
+paperless pApPl@s
+papermaking papPmAk6N
+papermate pApPmAt
+papernick pApPnik
+papers pApPz
+papers' pApPz
+paperweight pApPwAt
+paperwork pApPwVk
+paperworker pApPwVkP
+paperworkers pApPwVkPz
+papery pApP/
+papesh pap6S
+papier pApyP
+papilloma pap@lOm@
+papin popEn
+papineau pap~O
+papini popEn/
+papke pApk
+papo papO
+papp pap
+pappa pap@
+pappadio p@pAd/]
+pappalardo popol)rd]
+pappas pap@s
+pappert papPt
+paprika p@prEk@
+paprika paprEk@
+paprocki p@prOtsk/
+papson paps~
+papua papyU@
+paque pak
+paquet pokAt
+paquette p@ket
+paquin pakwin
+par p)r
+par's p)rz
+para p,r@
+parable p,r@b@l
+parables p,r@b@lz
+parabola pPab@l@
+parabolic per@bol6k
+parachute p,r6SUt
+parachuted p,r6SUt@d
+parachutes p,r6SUts
+parachuting p,r6SUt6N
+parada pPad@
+parade pPAd
+paraded pPAd@d
+paradee p,r@d/
+parades pPAdz
+paradigm p,r@dIm
+paradigms p,r@dImz
+parading pPAd6N
+paradis pPadis
+paradise p,r@dIs
+paradiso pP@dEs]
+parador p,r@d{r
+paradowski pP@d{fsk/
+paradox p,r@doks
+paradoxes p,r@doks@z
+paradoxical per@doks6k@l
+paradoxically per@doks@k@l/
+paradoxically per@doks@kl/
+parady pPad/
+paradyne p,r@dIn
+paradyne's p,r@dInz
+paraffin p,r@f~
+parag pPog
+paragon p,r@gon
+paragraph p,r@graf
+paragraphs p,r@grafs
+paraguay p,r@gwA
+paraguayan per@gwI~
+parakeet p,r@kEt
+parakeets p,r@kEts
+paralegal per@lEg@l
+paralegals per@lEg@lz
+parallax p,r@laks
+parallel p,r@lel
+paralleled p,r@leld
+paralleling p,r@lel6N
+parallelism p,r@leliz}
+parallels p,r@lelz
+paralympic per@limp6k
+paralysis pPal@sis
+paralytic per@lit6k
+paralyze p,r@lIz
+paralyzed p,r@lIzd
+paralyzes p,r@lIz@z
+paralyzing p,r@lIz6N
+paramagnetic par}agnet6k
+paramax p,r}aks
+paramecium per}Es/}
+paramedic p,r}ed6k
+paramedics p,r}ed6ks
+parameter pPam@tP
+parameters pPam@tPz
+parametric per}etr6k
+paramilitaries per}il@ter/z
+paramilitary per}il@ter/
+paramo pPam]
+paramonova per}~Ov@
+paramore pe}{r
+paramount p,r}?nt
+paramount's p,r}?nts
+paramus pPam@s
+parana pPon@
+paranoia per~<@
+paranoiac per~<ak
+paranoid p,r~<d
+paranormal pcr~{rm@l
+paraphernalia per@f~Aly@
+paraphrase p,r@frAz
+paraphrasing p,r@frAz6N
+paraplegia per@plEj/@
+paraplegic per@plEj6k
+parasite p,r@sIt
+parasites p,r@sIts
+parasitic per@sit6k
+parasympathetic per@simp@Tet6k
+paratore pP@t{r/
+paratroop p,r@trUp
+paratrooper p,r@trUpP
+paratroopers p,r@trUpPz
+paratroops p,r@trUps
+parazoa per@zO@
+parboil p)rb<l
+parboiling p)rb<l6N
+parc p)rk
+parcel p)rs@l
+parceled p)rs@ld
+parceling p)rs@l6N
+parcell porsAl
+parcells p)rs@lz
+parcels p)rs@lz
+parch p)rC
+parched p)rCt
+parcher p)rCP
+parchman p)rkm~
+parchment p)rCm~t
+parchmentlike p)rCm~tlIk
+parcplace p)rkplAs
+parde p)rd
+pardee p)rd/
+parden p)rd~
+pardi p)rd/
+pardini pordEn/
+pardo p)rd]
+pardoe p)rdO
+pardon p)rd~
+pardoned p)rd~d
+pardoning p)rd~6N
+pardons p)rd~z
+pardue p)rdU
+pardus p)rd@s
+pardy p)rd/
+pare p,r
+pared p,rd
+paredes porAdcs
+paredez porAdcz
+paredis p,r@dis
+parekh p)r6k
+parella porel@
+parent p,r~t
+parent's p,r~ts
+parentage p,r~t@j
+parental pPent@l
+parente porent/
+parenteau porent]
+parentheses pPenT@sEz
+parenthesis pPenT@sis
+parenthetically pPcnTet6k@l/
+parenthetically pPcnTet6kl/
+parenthood p,r~thqd
+parenti porent/
+parenting p,r~t6N
+parents p,r~ts
+parents' p,r~ts
+pares p,rz
+pareti peret/
+paretti peret/
+parfitt p)rfit
+parfums pPfyUmz
+parfums porfyUmz
+parga p)rg@
+pargesa porjes@
+parham p)rh}
+pariagua por/ogw@
+pariah pPI@
+pariahs pPI@z
+paribas pcrEb@s
+paribas's pcrEb@s@z
+parietal pPI@t@l
+parikh par6k
+parillo poril]
+parimutuel per}yUCU@l
+paring p,r6N
+paris paris
+paris' paris
+paris's paris@z
+parise p)rIz
+pariseau paris]
+parish par6S
+parishes par6S@z
+parishioner pPiS~P
+parishioners pPiS~Pz
+parisi porEs/
+parisian pPiZ~
+parisians pPis/~z
+parisienne pPis/en
+parities p,r@t/z
+parity p,r@t/
+parizeau p,r@zO
+parizek pPizck
+parizo porEz]
+park p)rk
+park's p)rks
+parka p)rk@
+parkas p)rk@z
+parke p)rk
+parked p)rkt
+parker p)rkP
+parker's p)rkPz
+parkers p)rkPz
+parkersburg p)rkPzbPg
+parkerson p)rkPs~
+parkes p)rks
+parkey p)rkE
+parkfield p)rkf/ld
+parkhill p)rkhil
+parkhurst p)rkhPst
+parkin p)rkin
+parking p)rk6N
+parkins p)rkinz
+parkinson p)rk~s~
+parkinson's p)rk~s~z
+parkinsonism p)rk~s~iz}
+parkison p)rkis~
+parkland p)rkland
+parkman p)rkm~
+parks p)rks
+parks' p)rks
+parkside p)rksId
+parkway p)rkwA
+parlance p)rl~s
+parlato porlot]
+parlay p)rlA
+parlayed p)rlAd
+parlaying p)rlA6N
+parlee p)rlE
+parler p)rlP
+parlett p)rlct
+parlette porlet
+parley p)rl/
+parliament p)rl}~t
+parliament's p)rl}~ts
+parliamentarian porl}~t,r/~
+parliamentarianism porl}~t,r/~iz}
+parliamentarians porl}cnt,r/~z
+parliamentary porl}enP/
+parliamentary porl}entP/
+parliaments p)rl}~ts
+parlier p)rl/P
+parlin p)rlin
+parlodel p)rlOdel
+parlor p)rlP
+parlors p)rlPz
+parlour p)rlP
+parlow p)rlO
+parma p)rm@
+parmalat p)rm@lat
+parman p)rm~
+parmar p)rmor
+parmele pormel/
+parmelee p)rm@l/
+parmenter p)rm~tP
+parmentier p)rm~t/P
+parmer p)rmP
+parmesan p)rm@zon
+parmeter p)rmitP
+parmley p)rml/
+parnassus pornas@s
+parnell p)rn@l
+parnella pornel@
+parnes p)rnz
+parness p)rn@s
+paro p)r]
+parochial pPOk/@l
+parochialism pPOk/@liz}
+parodi porOd/
+parodied p,r@d/d
+parodies p,r@d/z
+parodist par@dist
+parody p,r@d/
+parole pPOl
+paroled pPOld
+parolee pPOlE
+parolees pPOlEz
+paroles pPOlz
+paroling pPOl6N
+parpart p)rport
+parquet porkA
+parr p)r
+parra p)r@
+parrack par@k
+parramore porom{r
+parras p,r@z
+parrella porel@
+parrent p)r~t
+parrett par@t
+parretti pPet/
+parretti's pPet/s
+parried p,r/d
+parrill par@l
+parrilla poril@
+parrillo poril]
+parrinello por/nel]
+parrino porEn]
+parriott par/@t
+parris p,ris
+parrish p,r6S
+parrishes p,r6S@z
+parrot p,r@t
+parrots p,r@ts
+parrott p,r@t
+parrotta porOt@
+parrow par]
+parry p,r/
+pars p)rz
+parse p)rs
+parsec p)rsek
+parsefal p)rs@f@l
+parsell p)rs@l
+parser p)rsP
+parshall p)rS@l
+parshley p)rSl/
+parsifal p)rs@f@l
+parsifal p)rz@fol
+parsimony p)rs}On/
+parsing p)rs6N
+parsippany porsip~/
+parsky p)rsk/
+parsley p)rsl/
+parslow p)rslO
+parson p)rs~
+parsonage p)rs~6j
+parsons p)rs~z
+parsow p)rs]
+part p)rt
+part's p)rts
+part-time p)rttIm
+partain portAn
+partake portAk
+partch p)rC
+parte p)rt
+parte p)rtA
+partecipazioni portes@paz/On/
+parted p)rt@d
+partee p)rtE
+parten p)rt~
+partenope p)rt~Op
+parthenia porTen/@
+parthenogenetic porT~]j~et6k
+parthenon p)rT~on
+parthian p)rT/~
+parti p)rt/
+partial p)rS@l
+partiality porS/al@t/
+partially p)rS@l/
+partially p)rSl/
+participant portis@p~t
+participants portis@p~ts
+participants' portis@p~ts
+participate portis@pAt
+participated portis@pAt@d
+participates portis@pAts
+participating portis@pAt6N
+participation portis@pAS~
+participations portis@pAS~z
+participative portis@p@t6v
+participatory portis@p@t{r/
+particle p)rt@k@l
+particles p)rt@k@lz
+particular pPtiky@lP
+particular potiky@lP
+particularity pPtiky@lar@t/
+particularly pPtiky@lPl/
+particularly portiky@lPl/
+particulars pPtiky@lPz
+particulate pPtiky@l@t
+particulates portiky@l@ts
+partida portEd@
+partido portEd]
+partied p)rt/d
+parties p)rt/z
+parties' p)rt/z
+parties' p)rtEz
+partin p)rtin
+parting p)rt6N
+partington p)rt6Nt~
+partisan p)rt@z~
+partisaned p)rt@z~d
+partisans p)rt@z~z
+partisanship p)rt@z~Sip
+partition portiS~
+partitioned portiS~d
+partitioning portiS~6N
+partitions portiS~z
+partlow p)rtlO
+partly p)rtl/
+partner p)rtnP
+partner's p)rtnPz
+partnering p)rtnP6N
+partners p)rtnPz
+partners' p)rtnPz
+partnership p)rtnPSip
+partnership's p)rtnPSips
+partnerships p)rtnPSips
+partnerships' p)rtnPSips
+partney p)rtn/
+parton p)rt~
+partridge p)rtr6j
+partridges p)rtr6j@z
+parts p)rts
+parts' p)rts
+parttime p)rttIm
+partum p)rt}
+party p)rt/
+party's p)rt/z
+partying p)rt/6N
+partyka pPtik@
+parvin p)rvin
+pary p)r/
+parziale porz/ol/
+parzych p)rzih
+pas poz
+pas-de-deux pod@dU
+pasadena pas@dEnP
+pascagoula pask@gUl@
+pascal paskal
+pascale paskal
+pascarella poskorel@
+pascarelli poskorel/
+pasch pask
+paschal paS@l
+paschall paS@l
+paschen paS~
+paschke paSk
+pasco posk]
+pascoe pask]
+pascua poskU@
+pascual paskU@l
+pascucci poskUC/
+pascutto p@skyUt]
+pascuzzi poskUts/
+pasek posck
+paseo posAO
+pash paS
+pasha poSo
+pashley paSl/
+pasillas posil@z
+pasing pAs6N
+pasion poZEn
+pask pask
+paske pAsk
+paskey pask/
+pasko posk]
+paslay paslA
+pasley pasl/
+pasman pasm~
+paso pas]
+paso's pas]z
+pasok pas{k
+pasok pozok
+pasqua poskw@
+pasquale poskwolA
+pasquarella poskworel@
+pasquarelli poskworel/
+pasquarello poskworel]
+pasquariello poskwor/el]
+pasque pask
+pasquinelli poskw/nel/
+pasquini poskwEn/
+pass pas
+passable pas@b@l
+passably pas@bl/
+passafiume posofEUm
+passage pas@j
+passages pas@j@z
+passageway pas@jwA
+passaic p@sA6k
+passalacqua pas@lakw@
+passanisi posonEs/
+passante posont/
+passantino posontEn]
+passarella posorel@
+passarelli posorel/
+passaretti posoret/
+passaro pos)r]
+passat pasat
+passbook pasbqk
+passe pasA
+passed past
+passel pas@l
+passenger pas~jP
+passenger's pas~jPz
+passengers pas~jPz
+passengers' pas~jPz
+passer pasP
+passerby pasPb/
+passero pos,r]
+passers pasPz
+passersby pasPzb/
+passes pas@z
+passey pas/
+passim pasEm
+passing pas6N
+passino posEn]
+passion paS~
+passionate paS~@t
+passionately paS~@tl/
+passions paS~z
+passive pas6v
+passively pas6vl/
+passivity p@siv@t/
+passman pasm~
+passmore posm{r
+passon pas~
+passover pasOvP
+passow pas]
+passport pasp{rt
+passports pasp{rts
+password paswVd
+passwords paswVdz
+past past
+pasta post@
+pastas post@z
+paste pAst
+pasted pAst@d
+pastel pastel
+pastels pastelz
+paster pastP
+pasternack pastPnak
+pasternak pastPnak
+pasternak's pastPnaks
+pastes pAsts
+pasteur p@stUr
+pasteurization pasCP@zAS~
+pasteurize pasCPIz
+pasteurized pasCPIzd
+pastiche pastES
+pastime pastIm
+pastimes pastImz
+pasting pAst6N
+pastor pastP
+pastor's pastPz
+pastora past{r@
+pastoral pastP@l
+pastoralism pastP@liz}
+pastore past{r
+pastorino post{rEn]
+pastorius past{r/@s
+pastors pastPz
+pastrami p@strom/
+pastrana postran@
+pastries pAstr/z
+pastry pAstr/
+pasts pas
+pasts pass
+pasts pasts
+pastula postUl@
+pasture pasCP
+pastures pasCPz
+paszek poSck
+paszkiewicz poSk@v6C
+pasztor pastP
+pat pat
+pat's pats
+patagonia pat@gOn/@
+patagonian pat@gOn/~
+patak pat@k
+pataki p@tok/
+pataki's p@tok/z
+pataky pat@k/
+patalano potolon]
+patane pat~
+patch paC
+patched paCt
+patchell paC@l
+patchen paC~
+patches paC@z
+patchett paC@t
+patchin paCin
+patching paC6N
+patchwork paCwVk
+patchworks paCwVks
+patchy paC/
+patco patk]
+pate pAt
+patek potck
+patel p@tel
+patella p@tel@
+patenaude pat~]d
+patent pat~t
+patentable pat~t@b@l
+patented pat~t@d
+patenting pat~t6N
+patently pat~tl/
+patents pat~ts
+pater pAtP
+patera pot,r@
+paternal p@tVn@l
+paternalism p@tVn@liz}
+paternalistic p@tVn@list6k
+paternity p@tVn@t/
+paterno pot,rn]
+paternostro potPnOstr]
+paterson patPs~
+pates pAts
+patese p@tEs
+patese p@tEs/
+patey pAt/
+path paT
+pathak p@Tok
+pathak p@tok
+pathan paT~
+pathans paT~z
+pathe paT
+pathet-lao paT@tl?
+pathetic p@Tet6k
+pathetically p@Tet6k@l/
+pathetically p@Tet6kl/
+pathfinder paTfIndP
+pathmark paTmork
+pathmark's paTmorks
+pathogen paT@j~
+pathogenic paT@jen6k
+pathogens paT@j~z
+pathological paT@loj6k@l
+pathologically paT@loj6kl/
+pathologies p@Tol@j/z
+pathologist p@Tol@j@st
+pathologists p@Tol@j@s
+pathologists p@Tol@j@ss
+pathologists p@Tol@j@sts
+pathology p@Tol@j/
+pathos pATos
+paths paTs
+paths paTz
+pathway paTwA
+pathways paTwAz
+patience pAS~s
+patient pAS~t
+patient's pAS~ts
+patiently pAS~tl/
+patients pAS~ts
+patients pAS~z
+patients' pAS~ts
+patillo p@til]
+patin patin
+patina p@tEn@
+patinkin p@tiNk~
+patino potEn]
+patio pat/O
+patios pat/Oz
+patlan patl~
+patlex patlcks
+patlex's patlcks@z
+patman patm~
+patmore patm{r
+patnaude potn{d/
+patnode patnOd
+paton pat~
+patons pat~z
+patriarca potr/)rk@
+patriarch pAtr/ork
+patriarch's pAtr/orks
+patriarchal pAtr/)rk@l
+patriarchate pAtr/ork@t
+patriarchs pAtr/orks
+patriarchy pAtr/ork/
+patrice p@trEs
+patricelli potr/Cel/
+patricia p@triS@
+patrician p@triS~
+patricians p@triS~z
+patricio p@tris/]
+patrick patr6k
+patrick's patr6ks
+patricks patr6ks
+patricof patr6k{f
+patridge patrij
+patrie patP/
+patrilineal patr@lin/@l
+patrimonial patr}On/@l
+patrimonial patr}Ony@l
+patrimony patr}On/
+patriot pAtr/@t
+patriot's pAtr/@ts
+patriotic pAtr/ot6k
+patriotism pAtr/@tiz}
+patriots pAtr/@ts
+patristic p@trist6k
+patrizio potrEz/]
+patrol p@trOl
+patrol's p@trOlz
+patrolled p@trOld
+patrolling p@trOl6N
+patrolman p@trOlman
+patrolmen p@tr]lmen
+patrols p@trOlz
+patron pAtr~
+patronage pAtr~@j
+patronage patr~6j
+patrone potrOn/
+patronize pAtr~Iz
+patronized pAtr~Izd
+patronizing pAtr~Iz6N
+patrons pAtr~z
+patronym patr~im
+patronymic patr~im6k
+patry patr/
+pats pats
+patsies pats/z
+patsy pats/
+patt pat
+patted pat@d
+pattee patE
+patten pat~
+patten's pat~z
+patter patP
+pattered patPd
+pattern patPn
+patterned patPnd
+patterns patPnz
+patterson patPs~
+patterson's patPs~z
+patteson pat@s~
+patti pat/
+pattie pat/
+patties pat/z
+pattillo potil]
+pattin patin
+patting pat6N
+pattinson pat~s~
+pattis patis
+pattison patis~
+pattiz patiz
+patton pat~
+patton's pat~z
+patty pat/
+patty's pat/z
+paty pAt/
+patz pats
+patzer pAtzP
+patzke patsk/
+paucity p{s@t/
+paugh p{
+paul p{l
+paul's p{lz
+paula p{l@
+paulding p{ld6N
+paule p{l
+paules p{lz
+pauletta polet@
+paulette p{let
+pauley p{l/
+paulhamus p{lhAm@s
+paulhus p?lh@s
+pauli p{l/
+paulick p{l6k
+paulik p{l6k
+paulin p{lin
+paulina p{lEn@
+pauline p{lEn
+pauling p{l6N
+paulino p{lEn]
+paulita p{lEt@
+paulk p{lk
+paull p{l
+paullin p{lin
+paulo p{l]
+paulos p?l]z
+pauls p{lz
+paulsen p?ls~
+paulson p{ls~
+paulus p{l@s
+pauly p{l/
+paunchy p{nC/
+paup p{p
+pauper p{pP
+paupers p{pPz
+pause p{z
+paused p{zd
+pauses p{z@z
+pausing p{z6N
+paustian p{zC~
+pautler p?t@lP
+pautsch p?C
+pautz p{ts
+pauwels p?w@lz
+pavao pov?
+pavarotti pavPot/
+pave pAv
+paved pAvd
+pavek pav6k
+pavel pav@l
+pavelic p@vel6k
+pavelic pavl6k
+pavelka p@velk@
+pavelko p@velk]
+pavement pAvm~t
+pavements pAvm~ts
+paver pAvP
+paves pAvz
+pavese povAz/
+pavey pAv/
+pavia pAv/@
+pavich pav6C
+pavilion p@vily~
+pavilions p@vily~z
+pavillion p@vily~
+paving pAv6N
+pavlak povl@k
+pavlic pavl6k
+pavlica pavl6k@
+pavlicek povl6Cck
+pavlich povlih
+pavlick pavl6k
+pavlik pavl6k
+pavlis pavlis
+pavlock pavl@k
+pavlov pavlov
+pavlovian pavlOv/~
+pavlovic p@vlov6k
+pavlovich pavl@v6C
+pavo pov]
+pavon pov~
+pavone p@vOn
+paw p{
+pawelek povelck
+pawelski povelsk/
+pawelsky povelsk/
+pawlak p{l@k
+pawley p{l/
+pawlicki povlitsk/
+pawlik p{l6k
+pawlikowski povl6k{fsk/
+pawling p{l6N
+pawloski povl?sk/
+pawlowicz povl@v6C
+pawlowski povl{fsk/
+pawluk povl@k
+pawn p{n
+pawned p{nd
+pawnee p{nE
+pawnees p{nEz
+pawns p{nz
+pawnshop p{nSop
+pawnshops p{nSops
+paws p{z
+pawson p{s~
+pawtucket p{tuk@t
+pawtuxet p{tuks@t
+pax paks
+paxar paksP
+paxman paksm~
+paxon paks~
+paxson paks~
+paxton pakst~
+pay pA
+pay'n pA~
+payable pA@b@l
+payables pA@b@lz
+payan pA~
+payback pAbak
+paycheck pACek
+paychecks pACeks
+paychex pACeks
+payco pAk]
+payday pAdA
+paye pA
+payer pAP
+payer's pAPz
+payers pAPz
+payers' pAPz
+payette pAet
+payeur pAV
+payin' pA~
+paying pA6N
+payless pAles
+payload pAlOd
+payload's pAlOdz
+payloads pAlOdz
+paylor pAlP
+payment pAm~t
+payments pAm~ts
+paymer pAmP
+payna pAn@
+payne pAn
+paynter pAntP
+payoff pA{f
+payoffs pA{fs
+payola pAOl@
+payout pA?t
+payouts pA?ts
+payroll pArOl
+payrolls pArOlz
+pays pAz
+paysinger pAs6NgP
+paysinger pAz6NgP
+payson pAz~
+paysop pAsop
+paysops pAsops
+payton pAt~
+paz poz
+pazner poznP
+pazos poz]z
+pea pE
+peabody pEbod/
+peabody's pEbod/z
+peace pEs
+peaceable pEs@b@l
+peaceably pEs@bl/
+peaceful pEsf@l
+peacefully pEsf@l/
+peacefulness pEsf@ln@s
+peacekeeper pEskEpP
+peacekeepers pEskEpPz
+peacekeeping pEskEp6N
+peacemaker pEsmAkP
+peacemaker's pEsmAkPz
+peacemakers pEsmAkPz
+peacemaking pEsmAk6N
+peacetime pEstIm
+peach pEC
+peacher pECP
+peaches pEC@z
+peachey pEC/
+peachtree pECtrE
+peachy pEC/
+peacock pEkok
+peacocks pEkoks
+peaden ped~
+peafowl pEf?l
+peagler pEglP
+peak pEk
+peake pEk
+peaked pEkt
+peakes pEks
+peakes' pEks
+peaking pEk6N
+peaks pEks
+peaks' pEks
+peal pEl
+peale pEl
+pealer pElP
+peanut pEn@t
+peanut pEnut
+peanuts pEn@ts
+peanuts pEnuts
+peapack pEpak
+peapod pEp{d
+pear p,r
+pearce pirs
+pearcy pVk/
+pearl pVl
+pearl-harbor pVlh)rbP
+pearle pVl
+pearline pVlIn
+pearling pVl6N
+pearlman pVlman
+pearls pVlz
+pearlstein pVlstEn
+pearlstein pVlstIn
+pearlstine pVlstIn
+pearly pVl/
+pearman p,rm~
+pears p,rz
+pearse pVs
+pearson pirs~
+pearson's pirs~z
+peart pVt
+peary pEr/
+peas pEz
+peasant pez~t
+peasantry pez~tr/
+peasants pez~ts
+peasants' pez~ts
+pease pEs
+pease pEz
+peasey pEz/
+peasey's pEz/z
+peaslee pEzlE
+peasley pEzl/
+peat pEt
+peat's pEts
+peatross pEtr@s
+peaudouce pOdUs
+peavey pEv/
+peavler pEvlP
+peavy pEv/
+peay pE
+pebble peb@l
+pebbles peb@lz
+pebereau pebPO
+pebereau's pebPOz
+pebley pebl/
+pecan p6kan
+pecan pEkon
+pecans p6kanz
+pecans pEkonz
+pecci peC/
+pech pek
+pecha peC@
+pechacek pek@s6k
+pechin peCin
+pechiney peC~/
+pechman pekm~
+pechora p@k{r@
+pechora pekP@
+pecht pekt
+pecina pcCEn@
+peck pek
+peck's peks
+pecka pek@
+peckenpaugh p6kenp{
+peckham pek}
+pecking pek6N
+peckinpaugh p6kinp{
+peckman pekm~
+peco pAk]
+peco's pAk]z
+pecor pekP
+pecora pck{r@
+pecoraro pck{r)r]
+pecore pck{r/
+pecot pek@t
+pectic pekt6k
+pectin pektin
+pectoral pektP@l
+pectoris pekt@r@s
+peculiar p@kyUlyP
+peculiarities p6kyUl/,r@t/z
+peculiarity p6kyUl/,r@t/
+peculiarly p6kyUlyPl/
+pecuniary pckyUn/er/
+pedagogical ped@goj6k@l
+pedagogy ped@gOj/
+pedal ped@l
+pedaled ped@ld
+pedaling ped@l6N
+pedalled ped@ld
+pedals ped@lz
+pedantic p@dant6k
+pedantry ped~tr/
+peddicord ped6k{rd
+peddie ped/
+peddle ped@l
+peddled ped@ld
+peddler pedlP
+peddlers pedlPz
+peddles ped@lz
+peddling ped@l6N
+peddling pedl6N
+peddy ped/
+peden ped~
+pedersen pedPs~
+pederson pedPs~
+pedestal ped@st@l
+pedestals ped@st@lz
+pedestrian p@destr/~
+pedestrians p@destr/~z
+pediatric pEd/atr6k
+pediatrician pEd/@triS~
+pediatricians pEd/@triS~z
+pediatrics pEd/atr6ks
+pedicure ped6kyP
+pedigo pcdEg]
+pedigree ped@gr/
+pedley pedl/
+pedone pAdOnA
+pedophile ped@fil
+pedophile ped]fIl
+pedophiles ped@filz
+pedophiles ped]fIlz
+pedophilia ped@fily@
+pedophiliac ped@filyak
+pedophiliacs ped@filyaks
+pedophilic pcd]fil6k
+pedowitz p@d?its
+pedowitz ped]its
+pedraza pAdroz@
+pedretti pcdret/
+pedrick pedr6k
+pedro pAdr]
+pedroli pedrOl/
+pedros pAdr]z
+pedrosa pAdrOs@
+pedroso pAdrOs]
+pedrotti pcdrOt/
+pedroza pAdrOz@
+pee pE
+peebler pEblP
+peebles pEb@lz
+peed pEd
+peedin pEdin
+peek pEk
+peeked pEkt
+peeking pEk6N
+peeks pEks
+peel pEl
+peele pEl
+peeled pEld
+peeler pElP
+peeling pEl6N
+peels pElz
+peens pEnz
+peep pEp
+peeping pEp6N
+peeples pEp@lz
+peeps pEps
+peer pir
+peerage pir@j
+peered pird
+peering pEr6N
+peerless pirl@s
+peers pirz
+peerson pirs~
+peery pEr/
+peet pEt
+peet's pEts
+peete pEt
+peeters pEtPz
+peets pEts
+peetz pEts
+peeve pEv
+peeved pEvd
+peeves pEvz
+peevey pEv/
+peevish pEv6S
+peevy pEv/
+peewee pEwE
+peffer pefP
+peffley pefl/
+peg peg
+pegasus peg@s@s
+pegboard pegb{rd
+pegboards pegb{rdz
+pegg peg
+pegged pegd
+peggie peg/
+pegging peg6N
+peggs pegz
+peggy peg/
+peglow peglO
+pegmatite pegm@tIt
+pegram pegram
+pegs pegz
+peguero pAg,r]
+pegues pAgcs
+pehl pel
+pehrson p,rs~
+pei pA
+pei's pAz
+peifer pIfP
+peiffer pIfP
+peil pEl
+peinado pA/nod]
+peine pEn
+peipu pApU
+peirce pErs
+peirce pirs
+peirson pErs~
+peiser pIsP
+peitz pEts
+peixoto p@ksOt]
+pejorative p@j{r@t6v
+pekala p6kol@
+pekar pekP
+pekarek pekP6k
+pekin pEk~
+peking pEkiN
+peko pEk]
+pekrul pekr@l
+peladeau pel@dO
+pelaez pAlocz
+pelagia pcloj@
+pelagian p@lAj/~
+pelagians p@lAj/~z
+pelagic p@laj6k
+pelagreeny pcl@grEn/
+pelayo pAlA]
+pelc pelk
+pelchat pelC@t
+pelczar pelCP
+pele pelA
+pelekunu pel@kUnU
+pelekunu's pel@kUnUz
+pelerin pelP~
+pelfrey pelfr/
+pelham pel}
+pelican pel@k~
+pelican's pel6k~z
+pelicans pel6k~z
+pelikan pel6kan
+pelino pclEn]
+pelissier pel@s/P
+pelka pelk@
+pelkey pelk/
+pelky pelk/
+pell pel
+pell's pelz
+pella pel@
+pellagra p@lagr@
+pelland pel~d
+pelle pel
+pellecchia pelek/@
+pellegrin pel6grin
+pellegrini pelcgrEn/
+pellegrino pelcgrEn]
+peller pelP
+pellerin pelPin
+pellerito pclPEt]
+pellet pel@t
+pelleted pel@t@d
+pelletier pcl@tir
+pellets pel@ts
+pellett pel@t
+pelleu pelU
+pelley pel/
+pellicane pel6kAn
+pellicano pcl/kon]
+pellman pelm~
+pellow pel]
+pellum pel}
+pelon pel~
+peloponnesian pel@p~EZ~
+peloquin pAl]kwEn
+pelosi pclOs/
+peloso pclOs]
+pelot pel@t
+pelphrey pelfr/
+pels pelz
+pelster pelstP
+pelt pelt
+pelted pelt@d
+peltier pelt/P
+pelto pelt]
+pelton pelt~
+pelts pelts
+peltz pelts
+peltzer peltzP
+peluso pclUs]
+pelvic pelv6k
+pelvis pelv@s
+pelz pelz
+pelzel pelz@l
+pelzer pelzP
+pember pembP
+pemberton pembPt~
+pembina pembin@
+pemble pemb@l
+pembleton pemb@lton
+pembridge pembrij
+pembroke pembrOk
+pembroke pembrqk
+pemex pemeks
+pemrich pemriC
+pen pen
+pen's penz
+pena pAny@
+pena pen@
+pena's pAny@z
+pena's pen@z
+penal pEn@l
+penalize pEn@lIz
+penalize pen@lIz
+penalized pEn@lIzd
+penalizes pEn@lIz@z
+penalizes pen@lIz@z
+penalizing pEn@lIz6N
+penaloza pcnolOz@
+penalties pen@lt/z
+penalty pen@lt/
+penance pen~s
+penang penaN
+penans pen~z
+penberthy pcnbVT/
+pence pens
+penchant penC~t
+pencil pens@l
+penciled pens@ld
+pencils pens@lz
+pendant pend~t
+pendarvis pendorv@s
+pendell pend@l
+pendelton pcndelt~
+pender pendP
+pendergast pendPgast
+pendergraft pendPgr@ft
+pendergraph pendPgraf
+pendergrass pendPgr@s
+pendergrast pendPgr@st
+penders pendPz
+pending pend6N
+pendleton pend@lt~
+pendley pendl/
+pendola pcndOl@
+pendril pendril
+pendril's pendrilz
+pendry pendr/
+pendulous penj@l@s
+pendulum penj@l}
+pendyala pedyol@
+penelope p~el@p/
+penetrate pen@trAt
+penetrated pen@trAt@d
+penetrates pen@trAts
+penetrating pen@trAt6N
+penetration pen@trAS~
+penfield penfEld
+penfil penfil
+penfold penfOld
+peng peN
+pengassan peNgas~
+pengelly peNg@l/
+pengo peNg]
+penguin peNgw~
+penguins peNgw~z
+penh pen
+penh's penz
+penicillin pen@sil~
+penicillins pen@sil~z
+penick pen6k
+penikese pen6kEz
+penile pEnIl
+peninger pen6NP
+peninsula p~ins@l@
+peninsular p~ins@lP
+penis pEn@s
+penises pEn@s@z
+peniston pen@ston
+penitent pen@t~t
+penitentiaries pen@tenCP/z
+penitentiary pen@tenCP/
+penix pen6ks
+penja penj@
+penja's penj@z
+penkala p6Nkol@
+penkava pcNkov@
+penland penl~d
+penley penl/
+penman penm~
+penn pen
+penn's penz
+penna pen@
+penna pens@lvAny@
+pennacchio pcnok/]
+pennant pen~t
+pennants pen~ts
+pennbancorp penbank{rp
+penncorp penk{rp
+pennebaker pen@bAkP
+penned pend
+pennel pen@l
+pennell pen@l
+pennella penel@
+penner penP
+pennex pen@ks
+penney pen/
+penney's pen/z
+pennick pen6k
+pennie pen/
+pennies pen/z
+penniless pen/l@s
+penniman pen}~
+penning pen6N
+penninger pen6NP
+pennings pen6Nz
+pennington pen6Nt~
+pennino pcnEn]
+pennisi pcnEs/
+pennix pen6ks
+pennock pen@k
+penns penz
+pennsauken pens{k~
+pennsylvania pens@lvAny@
+pennsylvania's pens@lvAny@z
+pennsylvanian pens@lvAn/~
+pennsylvanians pens@lvAn/~z
+pennwalt penw{lt
+penny pen/
+penny's pen/z
+pennypacker pen/pakP
+pennywell pen/wel
+pennzoil penz<l
+pennzoil's penz<lz
+penobscot p~obskot
+penology p/nol@j/
+penoyer pen<P
+penril penril
+penrod penrod
+penrod's penrodz
+penrose penrOz
+penry penr/
+pens penz
+pensacola pens@kOl@
+pense pens
+pensinger pens~jP
+pension penS~
+pensioner penS~P
+pensioners penS~Pz
+pensions penS~z
+pensive pens6v
+penske pensk/
+penson pens~
+pensyl pensil
+pent pent
+penta pent@
+pentagon pen6gon
+pentagon pent6gon
+pentagon's pen6gonz
+pentagon's pent6gonz
+pentagons pen6gonz
+pentagons pent6gonz
+pentair pent,r
+pentamidine pentam@dEn
+pentane pentAn
+pentathlon pcntaTl~
+pentax pentaks
+pentech pentek
+pentecost pent@k{st
+pentecostal pent@k{st@l
+penthea penT/@
+penthouse penth?s
+pentimento pent}ent]
+pentium pent/}
+pentiums pent/}z
+pentland pentl~d
+penton pent~
+pentothal pent@Tol
+pentron pentr~
+pentrust pentrust
+pentz pents
+penuel penql
+penumbra p~umbr@
+penurious penyUr/@s
+penury penyP/
+penwell penwel
+penwest penwest
+penza penz@
+penzer penzP
+peon pE~
+peonies pE~/z
+peons pE~z
+peony pE~/
+people pEp@l
+people's pEp@lz
+peopled pEp@ld
+peoples pEp@lz
+peoples' pEp@lz
+peoria p/{r/@
+peoria's p/{r/@z
+pep pep
+pepcid peps@d
+pepe pep/
+pepenadores pepen@d{rcz
+peper pepP
+pepi pep/
+pepin pepin
+pepita pcpEt@
+pepitone pep@tOn
+peplinski pcplinsk/
+peplow peplO
+peppard pepPd
+peppel pep@l
+pepper pepP
+pepper's pepPz
+pepperdine pepPdIn
+peppered pepPd
+pepperell pepP@l
+pepperidge pepPij
+peppering pepP6N
+pepperman pepPm~
+peppermint pepPmint
+pepperoni pepPOn/
+peppers pepPz
+peppi pep/
+peppin pepin
+pepple pep@l
+peppler peplP
+peppy pep/
+pepsi peps/
+pepsi's peps/z
+pepsico peps6k]
+pepsico's peps6k]z
+peptic pept6k
+peptide peptId
+peptides peptIdz
+pequeno pAkwAn]
+pequignot p6kwign@t
+per pV
+per-se pVsA
+pera pV@
+peragine pPojEn/
+peraino pPoEn]
+perala pPol@
+perales pPolcs
+peralez pPolcz
+peralta pPolt@
+peras p,r@s
+peratis pPatis
+peratis pPotis
+peratis' pPatis
+peratis' pPotis
+peraza pPoz@
+perazzo pPoz]
+perc pVk
+perce pVs
+perceive pPsEv
+perceived pPsEvd
+perceives pPsEvz
+perceiving pPsEv6N
+percell pPsel
+percent pPsent
+percentage pPsen6j
+percentage pPsent6j
+percentages pPsen6j@z
+percentages pPsent6j@z
+percentile pPsentIl
+percentiles pPsentIlz
+percents pPsents
+perceptible pPsept@b@l
+perception pPsepS~
+perceptions pPsepS~z
+perceptive pPsept6v
+perceptual pPsepC@w@l
+perceval pPsAval
+perch pVC
+perched pVCt
+perches pVC@z
+perchlorate pPkl{rAt
+perchloric pPkl{r6k
+percifield pVs@f/ld
+percipient pPsip/~t
+percipient pPsipy~t
+percival pVs6v@l
+percle pVk@l
+percolate pVk@lAt
+percolating pVk@lAt6N
+percolator pVk@lAtP
+percs pVks
+percussion pPkuS~
+percussionist pPkuS~ist
+percussive pPkus@v
+percutaneous pPkyUtAn/@s
+percy pVs/
+percy's pVs/z
+perdew pVdU
+perdita pPdEt@
+perdomo pPdOm]
+perdue pPdU
+pere pV
+perea pPE@
+pereda pPAd@
+peregoy pV6g<
+peregrine p,r@grEn
+peregrines p,r@grEnz
+pereira pP,r@
+perella pPel@
+perelman p,r@lm~
+perelman's p,r@lm~z
+peremptory pPemptP/
+perennial pPen/@l
+perennially pPen/@l/
+perennials pPen/@lz
+perera pP,r@
+peres p,rcz
+peres' p,rcz
+peres's p,rcz@z
+perestroika per@str<k@
+peretti pPet/
+peretz pVcts
+pereyra pP,r@
+perez p,rcz
+perfect pPfekt
+perfect pVfikt
+perfecta pPfekt@
+perfected pPfekt@d
+perfecting pPfekt6N
+perfection pPfekS~
+perfectionism pPfekS~iz}
+perfectionist pPfekS~ist
+perfectly pVf@kl/
+perfectly pVf@ktl/
+perfetti pPfet/
+perfetto pPfet]
+perfidy pVf@d/
+perforate pVfPAt
+perforated pVfPAt@d
+perforation pVfPAS~
+perforations pVfPAS~z
+perforce pPf{rs
+perform pPf{rm
+performa pPf{rm@
+performance pPf{rm~s
+performances pPf{rm~s@z
+performed pPf{rmd
+performer pPf{rmP
+performers pPf{rmPz
+performers' pPf{rmPz
+performing pPf{rm6N
+performs pPf{rmz
+perfume pPfyUm
+perfumed pPfyUmd
+perfumes pPfyUmz
+perfunctory pPfuNktP/
+pergamon pVg}~
+pergande pVg~d
+pergola pPgOl@
+perham pVh}
+perhaps pPhaps
+peria p,r/@
+peria's p,r/@z
+perich pV6k
+perignon pPinyon
+perignon per6gnon
+perigo pPEg]
+peril p,r@l
+perillo pPil]
+perilous p,r@l@s
+perilously p,r@l@sl/
+perils p,r@lz
+periman pV/m~
+perimeter pPim@tP
+perimeters pPim@tPz
+perin pVin
+perine pPEn/
+perini pPEn/
+perino pPEn]
+period pir/@d
+period's pir/@dz
+periodic pir/od6k
+periodical pir/od6k@l
+periodically pEr/od6k@l/
+periodically pEr/od6kl/
+periodicals pir/od6k@lz
+periodontal per/@don@l
+periodontal per/@dont@l
+periods pir/@dz
+peripatetic per@p@tet6k
+peripheral pPifP@l
+peripheral pPifr@l
+peripherally pPifP@l/
+peripherally pPifr@l/
+peripherals pPifP@lz
+peripherals pPifr@lz
+periphery pPifP/
+periscope p,r@skOp
+perish p,r6S
+perishable p,r6S@b@l
+perished p,r6St
+peristyle p,r@stIl
+perito perEt]
+perjure pVjP
+perjured pVjPd
+perjurer pVjPP
+perjuring pVjP6N
+perjury pVjP/
+perk pVk
+perked pVkt
+perkey pVk/
+perkin pVkin
+perking pVk6N
+perkins pVk~z
+perkins' pVk~z
+perkins's pVkinz@z
+perkinson pVkins~
+perko pVk]
+perkovic pVk@v6C
+perkovich pVk@v6C
+perkowski pPk{fsk/
+perks pVks
+perky pVk/
+perl pVl
+perla pVl@
+perlberg pVlbPg
+perle pVl
+perley pVl/
+perlin pVlin
+perlis pVlis
+perlite pVlIt
+perlman pVlm~
+perlmutter pVlmutP
+perlow pVl]
+perls pVlz
+perlstein pVlst/n
+perlstein pVlstIn
+perma pVm@
+perman pVm~
+permanence pVm~~s
+permanent pVm~~t
+permanente pVm~entA
+permanently pVm~~tl/
+permeability pPm/@bil@t/
+permeable pVm/@b@l
+permeate pVm/At
+permeated pVm/At@d
+permeates pVm/Ats
+permeating pVm/At6N
+permenter pVm~tP
+permiam pPmI}
+permiam pVm/}
+permian pVm/~
+permissible pPmis@b@l
+permission pPmiS~
+permissions pPmiS~z
+permissive pPmis6v
+permissiveness pPmis6vn@s
+permit pPmit
+permit pVmit
+permits pPmits
+permits pVmits
+permitted pPmit@d
+permitting pPmit6N
+permount pVm?nt
+permut pVm@t
+permutation pVmyUtAS~
+permutations pVmyUtAS~z
+permute pVmyUt
+perna pVn@
+pernell pVn@l
+pernella pPnel@
+pernice pVnis
+perniciaro pPnECP]
+pernicious pPniS@s
+perno pVn]
+pernod pPnod
+pernod pcrnO
+pernod's pPnodz
+pero pV]
+peron pP{n
+perona pPOn@
+perone pPOn
+peroni pPOn/
+peronism p,r~iz}
+peronist p,r~ist
+peronists p,r~is
+peronists p,r~iss
+peronists p,r~ists
+perot pPO
+perot's pPOz
+perots pPOz
+perotti pPOt/
+peroutka pPUtk@
+perovich pV@v6C
+peroxide pPoksId
+perpendicular pVp~diky@lP
+perpetrate pVp@trAt
+perpetrated pVp@trAt@d
+perpetrating pVp@trAt6N
+perpetrator pVp@trAtP
+perpetrator's pVp@trAtPz
+perpetrators pVp@trAtPz
+perpetual pPpeCU@l
+perpetually pPpeCU@l/
+perpetuals pPpeCU@lz
+perpetuate pPpeC@wAt
+perpetuated pPpeC@wAt@d
+perpetuates pPpeC@wAts
+perpetuating pPpeC@wAt6N
+perpetuation pPpeC@wAS~
+perpetuity pVp@tyU@t/
+perpich pVp6k
+perplex pPpleks
+perplexed pPplekst
+perplexes pPpleks@z
+perplexing pPpleks6N
+perplexity pPpleks@t/
+perquisite pVkw@z@t
+perquisites pVkw@z@ts
+perra pVr@
+perras pVr@z
+perrault p,r{lt
+perrault pP{lt
+perreault pPrO
+perreira pPr,r@
+perrell pPrAl
+perrella pPrel@
+perrelli pPrel/
+perren pVr~
+perret pVrct
+perrett pVrct
+perretta pPret@
+perretti pPret/
+perri pVr/
+perricone pPr/kOn/
+perriello pPr/el]
+perrier p,r/P
+perrier per/A
+perrigo pPrEg]
+perrin p,rin
+perrine pPrEn/
+perrino pPrEn]
+perrins p,rinz
+perritt pVr@t
+perro pVr]
+perrodin pVr@din
+perron p,r~
+perrone pPrOn/
+perrot pVr@t
+perrott pProt
+perrotta pPrOt@
+perrotti pPrOt/
+perrotto pPrOt]
+perrow pVr]
+perry p,r/
+perry's p,r/z
+perryman pVr/m~
+perryn pVrin
+pers pVs
+persall pVs@l
+persaud pVs{d
+perschbacher pVSbokP
+perse pVs
+persecute pVs@kyUt
+persecuted pVs@kyUt@d
+persecuting pVs6kyUt6N
+persecution pVs@kyUS~
+persecutions pVs@kyUS~s
+persecutor pVs@kyUtP
+persecutors pVs@kyUtPz
+persepolis pPsep@l@s
+perses pVs@z
+perset pVsct
+perseus pVs/@s
+perseverance pVs@vir~s
+persevere pPs@vir
+persevered pVs@vird
+pershall pVS@l
+pershare pPS,r
+pershing pVS6N
+pershing's pVS6Nz
+pershings pVS6Nz
+persia pVZ@
+persian pVZ~
+persians pVZ~z
+persico pPsEk]
+persing pVs6N
+persinger pVs~jP
+persis pVsis
+persist pPsist
+persisted pPsist@d
+persistence pPsist~s
+persistent pPsist~t
+persistently pPsist~tl/
+persisting pPsist6N
+persists pPsis
+persists pPsiss
+persists pPsists
+persky pVsk/
+persley pVsl/
+person pVs~
+person's pVs~z
+persona pPsOn@
+personable pVs~@b@l
+personably pVs~@bl/
+personae pPsOnA
+personal pVs~@l
+personalink pVs~@liNk
+personalities pVs~al@t/z
+personality pVs~al@t/
+personalization pVs~@l@zAS~
+personalize pVs~@lIz
+personalized pVs~@lIzd
+personalizes pVs~@lIz@z
+personalizing pVs~@lIz6N
+personally pVsn@l/
+personally pVs~@l/
+personally pVs~l/
+personals pVs~@lz
+personic pPson6k
+personics pPson6ks
+personification pPson@f@kAS~
+personified pPson@fId
+personifies pPson@fIz
+personify pPson@fI
+personnel pVs~el
+persons pVs~z
+perspective pPspekt6v
+perspectives pPspekt6vz
+perspiration pVspPAS~
+perspire pPspIr
+perspiring pPspIr6N
+persson pVs~
+persuadable pPswAd@b@l
+persuade pPswAd
+persuaded pPswAd@d
+persuades pPswAdz
+persuading pPswAd6N
+persuasion pPswAZ~
+persuasions pPswAZ~z
+persuasive pPswAs6v
+persuasively pPswAs6vl/
+persuasiveness pPswAs6vn@s
+persyn pVsin
+pert pVt
+pertain pPtAn
+pertained pPtAnd
+pertaining pPtAn6N
+pertains pPtAnz
+pertamina pPt}En@
+perth pVT
+pertinent pVt~~t
+pertschuk pVtC@k
+pertuit pVtU@t
+perturb pPtVb
+perturbation pVtPbAS~
+perturbations pVtPbAS~z
+perturbed pPtVbd
+perturbs pPtVbz
+pertussis pPtusis
+peru pPU
+peru's pPUz
+perugina perUjEn@
+perugini pPUjEn/
+perulac p,rUlak
+perusal pPUz@l
+peruse pPUz
+perused pPUzd
+perusing pPUz6N
+perusse pPUs/
+peruvian pPUv/~
+peruvians pPUv/~z
+peruzzi pPUts/
+pervade pPvAd
+pervaded pPvAd@d
+pervades pPvAdz
+pervading pPvAd6N
+pervasive pPvAs6v
+pervasiveness pPvAs6vn@s
+perverse pPvVs
+perversely pPvVsl/
+perversion pPvVZ~
+perversity pPvVs@t/
+pervert pPvVt
+pervert pVvPt
+perverted pPvVt@d
+perverting pPvVt6N
+perverts pPvVts
+perverts pVvPts
+pervomaiskaya pPv]mAskI@
+perz pVz
+pesatori pes@t{r/
+pesavento pes@vent]
+pescatore pcskot{r/
+pesce pes
+pesch peS
+peschel peS@l
+peschke peSk
+pesci pesk/
+pesek pesck
+peseta p@sAt@
+pesetas p@sAt@z
+pesh peS
+peshawar peS@w{r
+peshek peSck
+pesina pcsEn@
+peskin peskin
+pesky pesk/
+pesnell pcsnel
+peso pAs]
+peso's pAs]z
+pesola pcsOl@
+pesos pAs]z
+pessimism pes}iz}
+pessimist pes}@st
+pessimistic pes}ist6k
+pessimists pes}is
+pessimists pes}iss
+pessimists pes}ists
+pessin pesin
+pest pest
+pesta pest@
+pestana pcstan@
+pester pestP
+pestered pestPd
+pestering pestP6N
+pesticide pest@sId
+pesticides pest@sIdz
+pestilence pest@l~s
+pestillo pestE]
+pestillo pestil]
+pestka pestk@
+pests pests
+pet pet
+pet's pets
+peta pEt@
+peta's pEt@z
+petak pet@k
+petal pet@l
+petals pet@lz
+petaluma pet@lUm@
+petard p@tod
+petard petPd
+pete pEt
+pete's pEts
+peter pEtP
+peter's pEtPz
+peterbilt pEtPbilt
+peterborough pEtPbP]
+petered pEtPd
+petering pEtP6N
+peterka pctVk@
+peterkin p@tVk~
+peterman pEtPm~
+petermann pEtPm~
+peterpaul pEtPp{l
+peters pEtPz
+petersburg pEtPzbPg
+petersen pEtPs~
+petersen's pEtPs~z
+peterson pEtPs~
+peterson's pEtPs~z
+petery pEtP/
+petey pEt/
+peth peT
+pethel peT@l
+pethtel peT@l
+petie pet/
+petillo pctil]
+petino pctEn]
+petipa petEp@
+petipa's pctEp@z
+petit pet/
+petite p@tEt
+petites petEts
+petition p@tiS~
+petitioned p@tiS~d
+petitioner p@tiS~P
+petitioners p@tiS~Pz
+petitioning p@tiS~6N
+petitions p@tiS~z
+petitjean pititj~
+petito pctEt]
+petitt petit
+petitti pctEt/
+petitto pctEt]
+petko petk]
+petkovsek petkovsck
+petkus petk@s
+peto pEt]
+petra petr@
+petracca pctrok@
+petraglia pctrogl/@
+petraitis pctrItis
+petrak petr@k
+petrakis petr@kis
+petralia pctrol/@
+petrarca petr)rk@
+petras petr@z
+petrasek p@trosck
+petrash petruS
+petrauskas petr?sk@z
+petre petP
+petrea petr/@
+petree petrE
+petrella petrel@
+petrelli pctrel/
+petrels petr@lz
+petrey petr/
+petri pEtr/
+petri petr/
+petrich petr6k
+petricioli petr@s/Ol/
+petrick petr6k
+petrides petrIdz
+petrie petr/
+petrie's petr/z
+petrified petr@fId
+petrify petr@fI
+petrik petr6k
+petrilla petril@
+petrilli pctrEl/
+petrillo petril]
+petrin petrin
+petrina pctrEn@
+petrini pctrEn/
+petrino pctrEn]
+petrizzo pctrEz]
+petro petr]
+petrobras petrobr@s
+petrocelli pctr]Cel/
+petrochemical petr]kem6k@l
+petrochemicals petr]kem6k@lz
+petrocorp petr]k{rp
+petrodollar petr]dolP
+petrodollars petr]dolPz
+petroff petr{f
+petrofina petr@fEn@
+petrofina petr]fEn@
+petrol petrOl
+petrolane petr]lAn
+petrolear petr]lir
+petroleos p@trOl/]s
+petroles petrOlz
+petroleum p@trOl/}
+petroleum's p@trOl/}z
+petrolia p@trOl/@
+petrology p@trol@j/
+petromin petr}in
+petromineral petr]minP@l
+petrominerals petr]minP@lz
+petronas petrOn@s
+petrone pctrOn/
+petronella petr]nel@
+petroni pctrOn/
+petronia pctrOn/@
+petronilla petr~il@
+petronio petrOn/]
+petropoulos p@trop@l@s
+petros petr]z
+petrosa pctrOz@
+petrosino pctr]sEn]
+petroski p@tr?sk/
+petrosky p@trOsk/
+petrossian p@tr{z~
+petrossian pctrOs/~
+petrosynthese p@trOsinTEs
+petrovic p@trov6k
+petrovich petr@v6C
+petrovietnam petr]vEctnom
+petrow petrO
+petrowski p@tr{fsk/
+petrowsky p@tr?sk/
+petru petrU
+petruccelli petrUCel/
+petrucci pctrUC/
+petrucelli pctrUCel/
+petrus petr@s
+petruska pctrusk@
+petruzzelli pctrUtsel/
+petruzzi pctrUts/
+petry petr/
+pets pets
+petsch peC
+petsche peC
+petsmart petsmort
+petstuff petstuf
+pett pet
+petta pet@
+pettaway pet@wA
+petted pet@d
+pettee petE
+pettengill pet6Ng@l
+petter petP
+pettersen petPs~
+petterson petPs~
+pettersson pEtPs~
+pettersson petPs~
+pettet petct
+petteway petwA
+pettey pet/
+petteys pet/z
+petti pet/
+petticoat pet/kOt
+petticoats pet/kOts
+pettie pet/
+petties pet/z
+pettigrew pet6grU
+pettijohn pet6jon
+pettinato pct/not]
+pettine pctEn/
+pettiness pet/n@s
+petting pet6N
+pettinger pet6NP
+pettingill pctiNg@l
+pettis petis
+pettit petit
+pettitt petit
+pettry petr/
+pettus pet@s
+pettway petwA
+petty pet/
+petulance peC@l~s
+petulant peC@l~t
+petunia p@tUn/@
+petunia p@tUny@
+petunias p@tUn/@z
+petunias p@tUny@z
+petway petwA
+petz pets
+petzel petz@l
+petzinger petsiNP
+petzold petz]ld
+petzoldt petz]lt
+peugeot pyUZO
+peugh pyU
+pevehouse pEvh?s
+peveler pev@lP
+peverell pevPel
+peveto pcvet]
+pevey p6vA
+pew pyU
+pewabic pyUob6k
+pewex peweks
+pewitt pyUit
+pews pyUz
+pewter pyUtP
+peyman pAm~
+peyrelevade perel@vAd
+peyser pAzP
+peyton pAt~
+pez pez
+pezeshkan p@zeSk~
+pezim pezEm
+pezim's pezEmz
+pezza pez@
+pezzella pctsel@
+pezzullo pctsUl]
+pfaff faf
+pfahl fol
+pfahler folP
+pfalzgraf falzgraf
+pfannenstiel fan~st/l
+pfarr f)r
+pfau f?
+pfeffer fefP
+pfefferkorn fefPk{rn
+pfefferle fefP@l
+pfeifer fIfP
+pfeiff fIf
+pfeiffer fIfP
+pfeifle fIf@l
+pfeil fIl
+pfennig fen6g
+pfennigs fen6gz
+pfenning fen6N
+pfenninger fen6NP
+pfeuffer fyUfP
+pfiester fIstP
+pfiffner fifnP
+pfingsten fiNst~
+pfister fistP
+pfisterer fistPP
+pfizer fIzP
+pfizer's fIzPz
+pflaum fl?m
+pfleger flEgP
+pfleiderer flIdPP
+pflieger flEgP
+pflueger flUgP
+pflug flUg
+pfluger flUgP
+pflum flum
+pfohl fOl
+pforzheimer f{rzhImP
+pfost fost
+pfund fund
+pfundstein fundstEn
+pfundstein fundstIn
+pgm pEjEem
+ph pEAC
+phagan fAg~
+phagocyte fag@sIt
+phagocytes fag@sIts
+phair f,r
+phalange f@lanj
+phalanges f@lAnj@z
+phalanges f@lanj/z
+phalanx fAlaNks
+phalen fal~
+phallic fal6k
+pham fam
+phan fan
+phaneuf fanUf
+phantasm fantaz}
+phantasmagoria fantazm@g{r/@
+phantom fant}
+phantom fan}
+phantoms fant}z
+phantoms fan}z
+phar f)r
+pharaoh f,r]
+pharaoh fAr]
+pharaohs f,r]z
+pharaohs fAr]z
+pharaon f,r]n
+pharaonic fer@on6k
+phares f,rz
+pharis far@s
+pharisaism far@sAiz}
+phariss fPis
+pharma f)rm@
+pharmaceutical form@sUt6k@l
+pharmaceuticals form@sUt6k@lz
+pharmacia formAs/@
+pharmacies f)rm@s/z
+pharmacist f)rm@s@st
+pharmacists f)rm@s@s
+pharmacists f)rm@s@ss
+pharmacists f)rm@s@sts
+pharmacological form@k@loj6k@l
+pharmacologist form@kol@jist
+pharmacology form@kol@j/
+pharmacy f)rm@s/
+pharmakinetic form@k~et6k
+pharmakinetics form@k~et6ks
+pharo f)r]
+pharoah f,r]
+pharoah fAr]
+pharoahs f,r]z
+pharoahs fAr]z
+pharos f,rOz
+pharr f)r
+pharris faris
+pharynx f,r6Nks
+phase fAz
+phased fAzd
+phaseout fAz?t
+phases fAz@z
+phasing fAz6N
+pheasant fez~t
+pheasants fez~ts
+phebe fEb/
+phebus fEb@s
+phedra fedr@
+phegley fegl/
+phelan fel~
+phelps felps
+phelps's felps@z
+phenicie fen@k/
+phenix fen6ks
+phenol fEnol
+phenol fen@l
+phenolic f~ol6k
+phenolphthalein fEnolfTAl~
+phenolphthalein fenolfTAl~
+phenom fen}
+phenomena f~om~@
+phenomenal f~om~@l
+phenomenally f~om~@l/
+phenomenon f~om~on
+phenotype fEn@tIp
+phenotypes fEn@tIps
+phenotypic fEn@tip6k
+phenylthaline fEn@lTAl/n
+pherigo fcrEg]
+pheromone f,r}On
+pheromones f,r}Onz
+pherson fVs~
+phetteplace fetplAs
+phew fyU
+phi fI
+phibbs fibz
+phibro fibr]
+phifer fIfP
+phil fil
+phil's filz
+philadelphia fil@delf/@
+philadelphia's fil@delf/@z
+philadelphian fil@delf/~
+philadelphians fil@delf/~z
+philana f@lan@
+philandering f@landP6N
+philandering fIlandP6N
+philantha f@lanT@
+philanthropic fil~Trop6k
+philanthropies f@lanTr@p/z
+philanthropist f@lanTr@p@st
+philanthropists f@lanTr@p@s
+philanthropists f@lanTr@p@ss
+philanthropists f@lanTr@p@sts
+philanthropy f@lanTr@p/
+philbeck filbek
+philbert filbPt
+philberta filbVt@
+philbin filbin
+philbrick filbr6k
+philbrook filbrqk
+philby filb/
+philene f@lEn
+phileo fil/]
+philharmonia filhormOn/@
+philharmonic filhormon6k
+philharmonic's filhormon6ks
+philhower fil?P
+philibert fil@bPt
+philibosian fil@bOz/~
+philida f@lEd@
+philina f@lEn@
+philip fil@p
+philip's fil@ps
+philipp fil@p
+philippa filip@
+philippe filEpA
+philippi filip/
+philippic filip6k
+philippine fil@stEn
+philistines fil@stEnz
+phillabaum fil@b?m
+philley fil/
+phillie fil/
+phillies fil/z
+phillip fil@p
+phillip's fil@ps
+phillipe f@lEp
+phillipine fil@pEn
+phillipine fil@pEn
+phillipines fil@pEnz
+phillipines fil@pEnz
+phillipp fil@p
+phillippe fil@p
+phillippi f@lEp/
+phillipps fil@ps
+phillips fil@ps
+phillips' fil@ps
+phillips's fil@ps@z
+phillipson fil@ps~
+phillis fil@s
+phillis filis
+philly fil/
+philo fEl]
+philodendron fil@dendr~
+philomela fil}El@
+philomena fil}En@
+philon fil~
+philosopher f@los@fP
+philosophers f@los@fPz
+philosophic fil@sof6k
+philosophical fil@sof6k@l
+philosophically fil@sof6k@l/
+philosophically fil@sof6kl/
+philosophies f@los@f/z
+philosophy f@los@f/
+philp filp
+philpot filp@t
+philpott filp@t
+philson fils~
+philyaw filyo
+phineas fin/@s
+phinney fin/
+phippen fip~
+phipps fips
+phlcorp pEACelk{rp
+phlebitis fl@bItis
+phlogopite flog@pIt
+phnom fnom
+phnom p~om
+phobia fOb/@
+phobias fOb/@z
+phobic fOb6k
+phobos fOb]s
+phoebe fEb/
+phoebus fEb@s
+phoenicia f~ES@
+phoenician f~ES~
+phoenicians f~ES~z
+phoenix fEn6ks
+phoenix's fEn6ks@z
+phone fOn
+phone's fOnz
+phoned fOnd
+phonemate fOnmAt
+phones fOnz
+phonetic f~et6k
+phonetically f~et6kl/
+phonetics f~et6ks
+phoney fOn/
+phonic fon6k
+phonics fon6ks
+phoning fOn6N
+phonograph fOn@graf
+phonological fOn@loj6k@l
+phony fOn/
+phosphate fosfAt
+phosphates fosfAts
+phosphatic fosfat6k
+phosphor fosf{r
+phosphorescence fosfPes~s
+phosphoric fosfP6k
+phosphorite fosfPIt
+phosphorites fosfPIts
+phosphorous fosfP@s
+phosphors fosf{rz
+phosphorus fosfP@s
+photo fOtO
+photo's fOtOz
+photocall fOtOkol
+photochemical fOt]kem@k@l
+photoconductive fOt]k~dukt6v
+photocopied fOt]kop/d
+photocopier fOt]kop/P
+photocopiers fOt]kop/Pz
+photocopies fOt]kop/z
+photocopy fOt]kop/
+photocopying fOt]kop/6N
+photodynamic fOt]dInam6k
+photoelectric fOt]@lektr6k
+photofinisher fOt]finiSP
+photofinishers fOt]finiSPz
+photofinishing fOt]fin6S6N
+photogenic fOt@jen6k
+photograph fOt@graf
+photographed fOt@graft
+photographer f@togr@fP
+photographer's f@togr@fPz
+photographers f@togr@fPz
+photographic fOt@graf6k
+photographing fOt@graf6N
+photographs fOt@grafs
+photography f@togr@f/
+photojournalist fOt]jVn@l@st
+photometer f@tom@tP
+photon fOton
+photons fOtonz
+photophoresis fOt]fPEs@s
+photorefractive fOt]r@frakt6v
+photos fOtOz
+photosynthesis fOt]sinT@s@s
+phototaxis fOt@taks@s
+phototron fOt@tron
+photovoltaic fOt@vOltA6k
+photovoltaics fOt]v]ltA6ks
+photronic fOtron6k
+photronics fOtron6ks
+phrase frAz
+phrased frAzd
+phraseology frAz/{l{j/
+phrases frAz@z
+phrasing frAz6N
+phrygian frij/~
+phu fU
+phua fyU@
+phung fuN
+phuong fU{N
+phut fut
+phy fI
+phyla fIl@
+phyle fIl
+phylis fIl@s
+phyllis filis
+phyllys fil/z
+phylogeny fIloj~/
+phylum fIl}
+physical fiz6k@l
+physically fiz6k@l/
+physically fiz6kl/
+physicals fiz6k@lz
+physician f@ziS~
+physician's f@ziS~z
+physicians f@ziS~z
+physicians' f@ziS~z
+physicist fiz@sist
+physicists fiz@sis
+physicists fiz@siss
+physicists fiz@sists
+physics fiz6ks
+physics' fis6ks
+physio fiz/]
+physiological fiz/@loj6k@l
+physiologically fiz/@loj6kl/
+physiologist fiz/ol@j@st
+physiology fiz/ol@j/
+physique f@zEk
+phytogeography fIt]j/ogr@f/
+phytoplankton fIt]plaNt~
+pi pI
+pi-meson pImAzon
+pia pE@
+piacente p/oCent/
+piacentini p/oCcntEn/
+piaget pE@ZA
+piana p/an@
+pianist p/an@st
+pianist p/on@st
+pianist pE~@st
+pianist's p/an@sts
+pianist's pE~@sts
+pianists p/an@s
+pianists p/an@ss
+pianists p/an@sts
+pianists pE~@s
+pianists pE~@ss
+pianists pE~@sts
+pianka p/oNk@
+piano p/an@
+piano p/an]
+piano's p/an@z
+piano's p/an]z
+pianos p/an@z
+pianos p/an]z
+piascik pE@sC6k
+piasecki p/@setsk/
+piasio p/as/]
+piatek p/otck
+piatkowski p/@tk{fsk/
+piatt pI@t
+piazza p/az@
+piazzolla pE@zol@
+pic pik
+pic-a-pasta pik@post@
+pica pIk@
+picante p/kontA
+picard p6k)rd
+picariello p/kor/el]
+picaro pEkorO
+picas pIk@z
+picasso p6kos]
+picasso's p6kos]z
+picassos p6kos]s
+picayune pik/yUn
+picazo p/koz]
+piccadilly pik@dil/
+picchi pik/
+picciano pEC/on]
+piccinini p/C/nEn/
+piccione p/kCOn/
+piccirilli p/C6rEl/
+piccirillo p/C6ril]
+picco pik]
+piccola p/kOl@
+piccoli p/kOl/
+piccolo pik@lO
+piccone p/kOn/
+picha piC@
+piche piC
+picheny p@CAn/
+picher piCP
+pichette piSet
+pichler pik@lP
+pichon piC~
+picht pikt
+picinich pisin6C
+pick pik
+pickands pik~dz
+pickar p6k)r
+pickard p6k)rd
+pickart pikort
+picked pikt
+pickel pik@l
+pickell pik@l
+pickelsimer pik@lsimP
+picken pik~
+pickens pik~z
+pickens' pik~z
+pickens's pik~z@z
+picker pikP
+pickeral pikP@l
+pickerel pikP@l
+pickerell pikP@l
+pickerill pikPil
+pickering pikP6N
+pickers pikPz
+pickert pikPt
+picket pik@t
+picketed pik@t@d
+picketer pik@tP
+picketers pik@tPz
+picketing pik@t6N
+pickets pik@ts
+pickett pikct
+pickett's pikcts
+pickford pikfPd
+pickier pik/P
+picking pik6N
+pickings pik6Nz
+pickins pikinz
+pickle pik@l
+pickled pik@ld
+pickler pik@lP
+pickles pik@lz
+picklesimer pik@lsimP
+pickling pikl6N
+pickney pikn/
+pickpocket pikpok@t
+pickpockets pikpok@ts
+pickrel pikr@l
+pickrell pikr@l
+pickren pikP~
+pickron pikr~
+picks piks
+pickup pikup
+pickups pikups
+pickus pik@s
+pickwick pikwik
+pickworth pikwVT
+picky pik/
+picnic piknik
+picnics pikniks
+pico pEk]
+picon pik~
+picone p6kOn
+picop pikop
+picotte p6k{t
+picou pEkU
+picoult p6kOlt
+picower pik?r
+pictet piktct
+picton pikt~
+pictorial p6kt{r/@l
+picts pikts
+picture pikCP
+picture's pikCPz
+pictured pikCPd
+pictures pikCPz
+pictures' pikCPz
+picturesque pikCPcsk
+picturetel pikCVtel
+picturing pikCP6N
+pidcock pidk@k
+piddle pid@l
+piddles pid@lz
+piddling pid@l6N
+piddling pidl6N
+piddock pid@k
+pidgeon pidjin
+pie pI
+piebald pIb{ld
+piece pEs
+pieced pEst
+piecemeal pEsmEl
+pieces pEs@z
+piecework pEswVk
+piech pEC
+piech's pEC@z
+piechocki p/hOtsk/
+piechota p/hOt@
+piechowski p/h{fsk/
+piecing pEs6N
+piecuch pEk@k
+pieczynski p/Cinsk/
+pied pId
+piedboeuf pEdbuf
+piedmont pEdmont
+piedmont's pEdmonts
+piedra pEdr@
+piehl pEl
+piekarski p/k)rsk/
+piel pEl
+piela pEl@
+pienta pEnt@
+pieper pEpP
+piepgras pEpgras
+piepho pEf]
+pier pir
+pieraccini pir@CEn/
+pieratt pEr@t
+pierce pirs
+pierce's pirs@z
+pierceall p6rsEl
+pierced pirst
+piercey p6rsE
+piercing pirs6N
+piercy pirk/
+pierette p6ret
+pieri pEr/
+pierie p/,r/
+pierie's p/,r/z
+pierini p6rEn/
+pierman pirm~
+piero pEr]
+pieroni p6rOn/
+pierotti p6rOt/
+pierpoint p6rp<nt
+pierpont pirpont
+pierre p/,r
+pierre's p/,rz
+pierrelouis pir@lw/z
+pierrelouis py,rlU/
+pierrepont p6rAp]nt
+pierro pir]
+pierron p6r{n
+piers pirz
+piersall pirs@l
+piersol pirs{l
+pierson pirs~
+pies pIz
+pies's pIz@z
+piet pEt
+piet pI@t
+piet pyet
+pieter pEtP
+pietermaritzburg pEtPm,r@tsbPg
+pieters pEtPz
+pieties pI@t/z
+pietila p/tEl@
+pietism pEtiz}
+pietrangelo p/troNgel]
+pietras pEtr@z
+pietro p/etr]
+pietrowski p/tr{fsk/
+pietruski pEctrusk/
+pietruszka p/truSk@
+pietrzak pEtPzak
+pietrzyk pEtPz6k
+pietsch pEC
+piette pEt
+piety pI@t/
+pietz pEts
+pifer pIfP
+pig pig
+pig's pigz
+pigeon pij~
+pigeon's pij~z
+pigeonhole pij~hOl
+pigeonholed pij~hOld
+pigeons pij~z
+pigford pigfPd
+pigg pig
+piggee pigE
+piggly pigl/
+piggott pig@t
+piggy pig/
+piggyback pig/bak
+piggybacked pig/bakt
+piggybacking pig/bak6N
+piglet pigl@t
+piglets pigl@ts
+pigman pigm~
+pigment pigm~t
+pigmentation pigm~tAS~
+pigments pigm~ts
+pigmied pigm/d
+pigmy pigm/
+pignataro p/gnot)r]
+pignatelli p/gnotel/
+pignato p/gnot]
+pignone p/gnOn/
+pigott pig@t
+pigs pigz
+pigskin pigskin
+pigue pEg
+pih pEIAC
+pih pi
+pihl pil
+pik pik
+pike pIk
+piker pIkP
+pikes pIks
+pikul pik@l
+pikula p6kUl@
+pikus pIk@s
+pil pil
+piland pil~d
+pilant pEl~t
+pilar pIlP
+pilarski p@l)rsk/
+pilaster p@lastP
+pilasters p@lastPz
+pilat pElot
+pilato p/lot]
+pilatus p/lAt@s
+pilch pilC
+pilcher pilCP
+pile pIl
+pilecki p@lek/
+piled pIld
+pileggi p@lej/
+piles pIlz
+pileup pIlup
+pilevsky p@levsk/
+pilferage pilfP6j
+pilfering pilfP6N
+pilger pilgP
+pilgram pilgr}
+pilgreen pilgrEn
+pilgrim pilgr}
+pilgrim's pilgr}z
+pilgrimage pilgr}@j
+pilgrimages pilgr}6j@z
+pilgrims pilgr}z
+piling pIl6N
+pilings pIl6Nz
+pilkenton pilkent~
+pilkerton pilkVt~
+pilkington pilk6Nt~
+pilkinton pilk~t~
+pill pil
+pill's pilz
+pilla pil@
+pillage pil6j
+pillaged pil6jd
+pillager pil6jP
+pillager's pil6jPz
+pillagers pil6jPz
+pillages pil6j@z
+pillaging pil6j6N
+pillar pilP
+pillard pilPd
+pillared pilPd
+pillars pilPz
+pille pil
+piller pilP
+pilley pil/
+pilling pil6N
+pillion pily~
+pilloried pilP/d
+pillory pilP/
+pillow pil]
+pillows pil]z
+pillowtex pil]teks
+pills pilz
+pillsbury pilzber/
+pillsbury's pilzber/z
+pilnak pilnak
+pilon p/l{n
+pilot pIl@t
+pilot's pIl@ts
+piloted pIl@t@d
+piloting pIl@t6N
+pilotless pIl@tl@s
+pilots pIl@ts
+pilots' pIl@ts
+pilotte pil{t
+pilson pils~
+piltdown piltd?n
+piltz pilts
+pilz pilz
+pima pEm@
+pimco pimk]
+pimental p}ent@l
+pimentel pim~t@l
+pimm pim
+pimm's pimz
+pimp pimp
+pimping pimp6N
+pimplapure pimpl@pyqr
+pimple pimp@l
+pimples pimp@lz
+pimps pimps
+pin pin
+pina pEn@
+pinard pinPd
+pinatubo pin@tUb]
+pinault pin{lt
+pinball pinb{l
+pincavage piNk@v6j
+pincerlike pinsPlIk
+pincers pinsPz
+pinch pinC
+pinched pinCt
+pincher pinCP
+pinchers pinCPz
+pinching pinC6N
+pinckard piNkPd
+pinckney piNkn/
+pincus piNk@s
+pindaric pindar6k
+pindell pind@l
+pinder pIndP
+pindling pindl6N
+pine pIn
+pineal pInE@l
+pineapple pInap@l
+pineapples pInap@lz
+pineau pinO
+pineda p/ned@
+pinedo p/nAd]
+pinegar pin6gP
+pineiro p/n,r]
+pinellas pinel@s
+pinelli pinel/
+pineo pin/]
+piner pInP
+pinero pin,r]
+pines pInz
+pinetta p~et@
+pinetta's p~et@z
+pinette pinet
+ping piN
+pingel piNg@l
+pingitore p6Ng/t{r/
+pingleton piNg@lton
+pingley piNgl/
+pingpong piNp{N
+pingree p6NgrE
+pinheiro p/nh,r]
+pinho pinh]
+pinhole pinhOl
+pinholes pinhOlz
+pini pEn/
+pining pIn6N
+pinion piny~
+pink piNk
+pinkard piNkPd
+pinkelman piNk@lm~
+pinker piNkP
+pinkerman piNkPm~
+pinkerton piNkPt~
+pinkerton's piNkPt~z
+pinkest piNkist
+pinkett piNkct
+pinkham piNkh}
+pinkie piNk/
+pinkish piNk6S
+pinkley piNkl/
+pinkney piNkn/
+pinkos piNk]z
+pinkowski p6Nk{fsk/
+pinks piNks
+pinkstaff piNkstaf
+pinkston piNkst~
+pinkus piNk@s
+pinkwater piNkw{tP
+pinkwater's piNkw{tPz
+pinky piNk/
+pinn pin
+pinnacle pin@k@l
+pinnacle's pin6k@lz
+pinned pind
+pinnell pin@l
+pinneo pin/]
+pinner pinP
+pinney pin/
+pinnick pin6k
+pinning pin6N
+pinnix pin6ks
+pinnock pin@k
+pinnow pin]
+pino pEn]
+pino's pEn]z
+pinocchio p~Ok/]
+pinochet pEn]SA
+pinochet pEn{Cet
+pinochet pin6SA
+pinochet's pEn]SAz
+pinochet's pEn{Cets
+pinochet's pin6SAz
+pinola p~Ol@
+pinot pin@t
+pinpoint pinp<nt
+pinpointed pinp<nt@d
+pinpointing pinp<nt6N
+pinpoints pinp<nts
+pinprick pinpr6k
+pinquater pinkwotP
+pins pinz
+pinsker pinskP
+pinsky pinsk/
+pinson pins~
+pinsoneault pins~O
+pinsoneault pins~{lt
+pinstripe pinstrIp
+pinstriped pinstrIpt
+pinstripes pinstrIps
+pint pInt
+pint-size pIntsIz
+pint-sized pIntsIzd
+pinta pint@
+pintar p/nt)r
+pinter pIntP
+pinto pintO
+pints pInts
+piny pIn/
+pinyan piny~
+pinzon pinz{n
+pio pI]
+pion pIon
+pioneer pI~ir
+pioneer's pI~irz
+pioneered pI~ird
+pioneering pI~ir6N
+pioneers pI~irz
+piontek p/Ontck
+piontkowski p/]ntk{fsk/
+piorkowski p/{rk{fsk/
+piotrowski p/]tr{fsk/
+piotter p/otP
+pious pI@s
+piously pI@sl/
+pip pip
+pipe pIp
+piped pIpt
+pipefish pIpfiS
+pipefishes pIpfiS@z
+pipeline pIplIn
+pipeline's pIplInz
+pipelines pIplInz
+pipelines' pIplInz
+piper pIpP
+pipers pIpPz
+pipes pIps
+pipetec pIptek
+pipette pIpet
+pipetter pIpetP
+pipetters pIpetPz
+pipettes pIpets
+pipher pifP
+piping pIp6N
+pipitone pip@tOn
+pipkin pipk~
+pipkins pipk~z
+pipp pip
+pippen pip~
+pippenger pip~jP
+pippert pipPt
+pippin pipin
+pippins pipinz
+pips pips
+piquant pEk~t
+pique pEk
+piqued pEkt
+piquette p6ket
+piracy pIr@s/
+piraino p6rAn]
+pirandello pir~del]
+piranha p6ranh@
+pirate pIr@t
+pirate's pIr@ts
+pirated pIr@t@d
+pirates pIr@ts
+pirating pIr@t6N
+pirelli p6rel/
+pirelli's p6rel/z
+pires pIrz
+pirestani pircston/
+pirie pir/
+pirkey pVk/
+pirkl pVk@l
+pirkle pVk@l
+pirko pVk]
+piro pir]
+pirog pPog
+pirone p6rOn
+pirouette pirUet
+pirouettes pirUets
+pirozzi p6roz/
+pirrello p6rel]
+pirro pir]
+pirrone p6rOn/
+pirtle pVt@l
+pisa pEs@
+pisani p/son/
+pisano p/son]
+pisarek pisPck
+pisarski pis)rsk/
+pisca pisk@
+piscataway piskat@wA
+pisces pIs/z
+pischel piS@l
+pischke piSk
+pisciotta p/sCOt@
+piscitelli p/sC/tel/
+piscitello pis@tel]
+piscopo p/skOp]
+pisello pisel]
+pisoni pisOn/
+piss pis
+pissed pist
+pistachio p@staS/O
+pistachios p@staS/Oz
+pistil pist@l
+pistilli p/stEl/
+pistol pist@l
+pistole pistOl
+pistols pist@lz
+piston pist~
+pistone pEst]n
+pistons pist~z
+pistor pistP
+pistorio pist{r/]
+pit pit
+pita pEt@
+pitblado pitblod]
+pitch piC
+pitchblende piCblend
+pitched piCt
+pitcher piCP
+pitchers piCPz
+pitches piC@z
+pitchford piCfPd
+pitchfork piCf{rk
+pitchforks piCf{rks
+pitching piC6N
+pitchman piCm~
+pitchmen piCmen
+pitcock pitkok
+pitfall pitf{l
+pitfalls pitf{lz
+pith piT
+pithy piT/
+pitiable pit/@b@l
+pitied pitEd
+pitiful pit@f@l
+pitifully pit@f@l/
+pitifully pit@fl/
+pitiless pit/l@s
+pitino p@tEn]
+pitkin pitkin
+pitman pitm~
+pitner pitnP
+pitney pitn/
+pitofsky p@tofsk/
+pitre pItP
+pits pits
+pitsch piC
+pitsenbarger pits~borgP
+pitstick pitstik
+pitt pit
+pitt's pits
+pittance pit~s
+pittard pitPd
+pitted pit@d
+pittencrieff pit~krEf
+pittenger pit~jP
+pitting pit6N
+pittinger pit6NP
+pittle pit@l
+pittman pitm~
+pittner pitnP
+pitts pits
+pitts's pits@z
+pittsboro pitsbP]
+pittsburg pitsbPg
+pittsburgh pitsbPg
+pittsburgh's pitsbPgz
+pittsburgher pitsbPgP
+pittsburghers pitsbPgPz
+pittsfield pitsf/ld
+pittsford pitsfPd
+pittsley pitsl/
+pittston pitst~
+pituitary p@tU@ter/
+pity pit/
+pitying pit/6N
+pitz pits
+pitzen pitz~
+pitzer pitzP
+pius pI@s
+piver pIvP
+pivonka p6voNk@
+pivot piv@t
+pivotal piv@t@l
+pivoted piv@t@d
+pix piks
+pixar piksor
+pixel piks@l
+pixels piks@lz
+pixie piks/
+pixler pikslP
+pixley piksl/
+pizana p/zan@
+pizano p/zon]
+pizarro p@z)r]
+pizazz p@zaz
+pizer pIzP
+pizza pEts@
+pizza's pEts@z
+pizzano p/tson]
+pizzas pEts@z
+pizzazz pizaz
+pizzeria pEtsPE@
+pizzerias pEtsPE@z
+pizzi piz/
+pizzimenti p/ts/ment/
+pizzino p/tsEn]
+pizzitola p/ts/tOl@
+pizzo piz]
+pizzolato p/ts]lot]
+pizzuti p/tsUt/
+pizzuto p/tsUt]
+pj's pEjAz
+pla plo
+placard plakPd
+placards plakPdz
+placate plAkAt
+placating plAkAt6N
+place plAs
+place's plAs@z
+placebo pl@sEb]
+placebos pl@sEb]z
+placed plAst
+placek ploCek
+placement plAsm~t
+placements plAsm~ts
+placencia ploCenC@
+placenta pl@sent@
+placentia pl@senS@
+placer plAsP
+placer plasP
+places plAs@z
+placeway plAswA
+placid plas@d
+placid's plas@dz
+placida ploCEd@
+placidly plas@dl/
+placido ploC@d]
+placing plAs6N
+plack plak
+plack's plaks
+placke plak
+placko plak]
+placoid plak<d
+placzek ploCck
+plagens plag~z
+plagge plag
+plagiarism plAjPiz}
+plagiarize plAj/PIz
+plagiarized plAj/PIzd
+plagioclase plAj/@klAs
+plague plAg
+plagued plAgd
+plagues plAgz
+plaguing plAg6N
+plaia ploy@
+plaid plad
+plain plAn
+plainclothes plAnklOz
+plainer plAnP
+plaines plAnz
+plainfield plAnfEld
+plainly plAnl/
+plaino plAn]
+plains plAnz
+plainsong plAns{N
+plaintiff plAn@f
+plaintiff plAnt@f
+plaintiff's plAn@fs
+plaintiff's plAnt@fs
+plaintiffs plAn@fs
+plaintiffs plAnt@fs
+plaintiffs' plAn@fs
+plaintiffs' plAnt@fs
+plaintive plAn6v
+plaintive plAnt6v
+plaintively plAnIvl/
+plaintively plAntIvl/
+plainview plAnvyU
+plair pl,r
+plaisance plAs~s
+plaisted plAst@d
+plaisted plo@st@d
+plake plAk
+plam plam
+plamann plom~
+plambeck plambek
+plamondon plom]nd{n
+plan plan
+plan's planz
+planar plAnP
+planarian pl~,r/~
+planas plan@z
+planck plaNk
+plane plAn
+plane's plAnz
+planecon plan@kon
+planecon plankon
+planed plAnd
+planeload plAnlOd
+planeloads plAnlOdz
+planer plAnP
+planers plAnPz
+planes plAnz
+planes' plAnz
+planet plan@t
+planet's plan@ts
+planetarium plan@t,r/}
+planetary plan@ter/
+planets plan@ts
+planitzer plan@tsP
+plank plaNk
+planking plaNk6N
+planks plaNks
+plankton plaNkt~
+planktonic plaNkton6k
+planned pland
+planner planP
+planner's planPz
+planners planPz
+planners' planPz
+planning plan6N
+plano plAn]
+plans planz
+plans' planz
+plant plant
+plant's plants
+plantain plant~
+plantains plant~z
+plantation plantAS~
+plantations plantAS~z
+plante plant
+planted plan@d
+planted plant@d
+planter plantP
+planters plantPz
+plantiffs plant@fs
+planting plant6N
+plantings plant6Nz
+plantlike plantlIk
+plantronic plantron6k
+plantronics plantron6ks
+plants plants
+plants' plants
+plantz plants
+plaque plak
+plaques plaks
+plas plas
+plascencia plosCenC@
+plasencia plosenC@
+plaskett plask@t
+plasma plazm@
+plasminogen plazmin@j~
+plasmodia plazmOd/@
+plasmodium plazmOd/}
+plass plas
+plassard plasPd
+plasse plas
+plaster plastP
+plasterboard plastPb{rd
+plastered plastPd
+plasterer plastPP
+plastering plastP6N
+plasters plastPz
+plasterwork plastPwVk
+plastic plast6k
+plasticine plast@sEn
+plasticizer plast@sIzP
+plastics plast6ks
+plata plot@
+plate plAt
+plateau platO
+plateaued platOd
+plateauing pl@tO6N
+plated plAt@d
+platek plotck
+platelet plAtl@t
+platelets plAtl@ts
+platelike plAtlIk
+platen plat~
+plater plAtP
+plates plAts
+platform platf{rm
+platform's platf{rmz
+platforms platf{rmz
+plath plaT
+plating plAt6N
+platinum platn}
+platinum plat~}
+platinum's platn}z
+platinum's plat~}z
+platitude plat@tUd
+platitudes plat@tUdz
+platner platnP
+plato plAt]
+plato's plAt]z
+platona plotOn@
+platonic pl@ton6k
+platonist plAt~@st
+platonists plAt~@s
+platonists plAt~@ss
+platonists plAt~@sts
+platoon pl@tUn
+platoons pl@tUnz
+platt plat
+platte plat
+platten plat~
+platter platP
+platters platPz
+plattner platnP
+platts plats
+platy plAt/
+platypus plat@pqs
+platz plats
+platzer plAtzP
+plauche pl{C
+plaudit pl{d@t
+plaudits pl{d@ts
+plaugher pl{P
+plausibility pl{z@bil@t/
+plausible pl{z@b@l
+plausibly pl{z@bl/
+plaut pl{t
+plautz pl{ts
+plax plaks
+play plA
+play's plAz
+playa plI@
+playback plAbak
+playbook plAbqk
+playboy plAb<
+playboy's plAb<z
+playcount plAk?nt
+played plAd
+player plAP
+player's plAPz
+players plAPz
+players' plAPz
+playford plAfPd
+playful plAf@l
+playfully plAf@l/
+playfulness plAf@ln@s
+playground plAgr?n
+playground plAgr?nd
+playgrounds plAgr?ndz
+playgrounds plAgr?nz
+playhouse plAh?s
+playin' plA~
+playing plA6N
+playmate plAmAt
+playmates plAmAts
+playoff plA{f
+playoffs plA{fs
+playpen plApen
+playroom plArUm
+plays plAz
+playstation plAstAS~
+playtex plAteks
+plaything plATiN
+playthings plATiNz
+playwright plArIt
+playwright's plArIts
+playwrights plArIts
+plaza plaz@
+plaza ploz@
+plaza's plaz@z
+plaza's ploz@z
+plazas plaz@z
+plazas ploz@z
+plazic plAz6k
+plea plE
+plead plEd
+pleaded plEd@d
+pleading plEd6N
+pleadings plEd6Nz
+pleads plEdz
+pleas plEz
+pleasant plez~t
+pleasantly plez~tl/
+pleasanton plez~t~
+pleasantries plez~tr/z
+pleasantry plez~tr/
+pleasants plez~ts
+pleasantville plez~tvil
+please plEz
+pleased plEzd
+pleaser plEzP
+pleases plEz@z
+pleasing plEz6N
+pleasing plEz6Nt~
+pleasingly plEz6Nl/
+pleasurable pleZP@b@l
+pleasurama pleZqram@
+pleasure pleZP
+pleasures pleZPz
+pleat plEt
+pleats plEts
+plebeian pl@bE~
+plebeians pl@bE~z
+plebiscite plEb@sIt
+plebiscite pleb@sIt
+pled pled
+pledge plej
+pledged plejd
+pledger plejP
+pledges plej@z
+pledging plej6N
+pleiad plE@d
+pleiades plE@dEz
+pleiads plE@dz
+plein plEn
+pleistocene plIst@sEn
+plemmons plem~z
+plemons plem~z
+plenary plEnP/
+plenary plenP/
+plenmeer plcnmir
+plentiful plen@f@l
+plentiful plent@f@l
+plenty plen/
+plenty plent/
+plenum plen}
+plenum's plen}z
+plescia plAs/@
+plese plEz
+pleshar pleSor
+pleskow plesk?
+pless ples
+plessey ples/
+plessey's ples/z
+plessinger ples6NP
+plessis plesis
+plessy ples/
+pletcher pleCP
+plethora pl@T{r@
+plethora pleTP@
+pletscher pleCP
+plett plet
+pletz plets
+pleurisy plqr@s/
+pleva plAv@
+plew plU
+plewa plU@
+plex pleks
+plexiglas pleks/glas
+plexiglas pleks6glas
+plexiglass pleks/glas
+plexiglass pleks6glas
+plexus pleks@s
+pliable plI@b@l
+pliant plI~t
+plichta pliCt@
+plied plId
+plier plIP
+pliers plIPz
+plies plIz
+plight plIt
+pliler plIlP
+plimpton plimpt~
+plinius plin/@s
+plink pliNk
+plinking pliNk6N
+plinth plinT
+pliny plin/
+pliocene plI@sEn
+plisetskaya plis@tskI@
+pliska plisk@
+plitt plit
+plocar plOkor
+plocek plOCek
+ploch plok
+plocher plokP
+plock plok
+plod plod
+plodded plod@d
+plodding plod6N
+ploeger plOgP
+ploetz plOts
+plog plog
+plohn plOn
+plonka plONk@
+plonski plonsk/
+ploof plUf
+plop plop
+plopped plopt
+ploss pl{s
+plot plot
+plotkin plotkin
+plotner plotnP
+plotnick plotn6k
+plots plots
+plott plot
+plotted plot@d
+plotter plotP
+plotters plotPz
+plotting plot6N
+plotts plots
+plotz plots
+plouff plOf
+plouffe plOf
+plough pl?
+plough plO
+ploughed pl?d
+plourde pl{rd
+plovers pluvPz
+plow pl?
+plowden pl?d~
+plowed pl?d
+plowing pl?6N
+plowman pl?m~
+plowman's pl?m~z
+plowright pl?rIt
+plows pl?z
+plowshare pl?SAr
+plowshares pl?SArz
+ploy pl<
+ploys pl<z
+plucinski pl@Cinsk/
+pluck pluk
+pluck's pluks
+plucked plukt
+plucker plukP
+plucking pluk6N
+plucks pluks
+plucky pluk/
+plude plUd
+plue plU
+pluff pluf
+plug plug
+plugged plugd
+plugging plug6N
+plugs plugz
+plum plum
+plum's plumz
+plumage plUm@j
+plumages plUm@j@z
+plumb plum
+plumbed plumd
+plumber plumP
+plumbers plumPz
+plumbing plum6N
+plume plUm
+plumer plUmP
+plumeri plUm,r/
+plumes plUmz
+plumlee plumlE
+plumley pluml/
+plummer plumP
+plummet plum@t
+plummeted plum@t@d
+plummeting plum@t6N
+plummets plum@ts
+plump plump
+plumped plumpt
+plums plumz
+plunder plundP
+plundered plundPd
+plundering plundP6N
+plunge plunj
+plunged plunjd
+plunger plunjP
+plunger's plunjPz
+plunges plunj@z
+plunging plunj6N
+plunk pluNk
+plunked pluNkt
+plunker pluNkP
+plunkers pluNkPz
+plunkett pluNkct
+plunking pluNk6N
+plunkitt pluNkit
+plural plqr@l
+pluralism plqr@liz}
+pluralistic plqr@list6k
+plurality plPal@t/
+pluribus plqr@b@s
+plus plus
+plus's plus@z
+pluses plus@z
+plush pluS
+pluta plUt@
+pluth plUT
+pluto plUt]
+pluto's plUt]z
+plutocrat plUt@krat
+plutocrats plUt@krats
+plutonian plUtOn/~
+plutonic plUton6k
+plutonium plUtOn/}
+pluvial plUv/@l
+ply plI
+plybon plib~
+plying plI6N
+plyler plIlP
+plymale plImAl
+plymouth plim@T
+plymouth's plim@Ts
+plympton plimpt~
+plywood plIwqd
+pm pEem
+pneumatic nUmat6k
+pneumatics nqmat6ks
+pneumo nUm]
+pneumocystis nUmOsist@s
+pneumonia nUmOny@
+pneumonia n}Ony@
+pneumonic nUmon6k
+po pO
+po-jen pOjen
+poach pOC
+poached pOCt
+poacher pOCP
+poachers pOCPz
+poaching pOC6N
+poag pOg
+poage pO6j
+poarch p{rh
+pobanz pObonz
+pobla pObl@
+poblano p]blon]
+pobst pobst
+pocahontas pOk@hon@s
+pocahontas pOk@hont@s
+poch pok
+poche poC
+pochiluk p@CElUk
+pociask p@CE@sk
+pocius pOs/@s
+pock pok
+pocked pokt
+pocket pok@t
+pocketbook pok@tbqk
+pocketbooks pok@tbqks
+pocketed pok@t@d
+pocketful pok@tfql
+pocketing pok@t6N
+pockets pok@ts
+pocklington pokl6Nt~
+pockmark pokmork
+pockmarked pokmorkt
+pocks poks
+poclain pokl~
+poco pOk]
+pocock pok@k
+pocono pOk~O
+poconos pOk~]z
+pocus pOk@s
+pod pod
+pod's podz
+podany p@d{n/
+podell p]dAl
+podesta p]dest@
+podge poj
+podgorski poj{rsk/
+podgurski pojVsk/
+podhoretz podhPcts
+podhoretz podh{rcts
+podiatrist p@dI@trist
+podium pOd/}
+podiums pOd/}z
+podleska podlesk@
+podnar podnor
+podolak p@dOl@k
+podoll pod@l
+podolski p@dOlsk/
+podolsky p@dOlsk/
+podrasky p@drask/
+podraza p]droz@
+pods podz
+podunk pOt@Nk
+poduska p]dusk@
+poe pO
+poe's pOz
+poehl pOl
+poehl's pOlz
+poehl's p{lz
+poehler pOlP
+poehlman pOlm~
+poel pO@l
+poelman pOlm~
+poem pO}
+poems pO}z
+poer pOP
+poeschel pOS@l
+poeschl pOsk@l
+poet pO@t
+poet's pO@ts
+poetic p]et6k
+poetically p]et6kl/
+poetry pO@tr/
+poets pO@ts
+pofahl pofol
+poff p{f
+poffenbarger pof~borgP
+poffenberger p{f~bPgP
+pog pog
+poggi poj/
+poggioli pOjOl/
+pogo pOgO
+pogorzelski p@gPzelsk/
+pogrom p@grom
+pogrom pOgr}
+pogroms p@gromz
+pogroms pOgr}z
+pogs pogz
+pogue pOg
+poh pO
+pohang pOhaN
+pohjola pOjOl@
+pohl pOl
+pohl's pOlz
+pohlad pOlad
+pohle pOh@l
+pohlman pOlm~
+pohlmann pOlm~
+pohnpei pOnpA
+poignancy p<ny~s/
+poignant p<ny~t
+poignantly p<ny~tl/
+poindexter p<ndekstP
+poindexter's p<ndekstPz
+poinot p<not
+poinsett p<nsct
+poinsettia p<nset/@
+poinsettia p<nset@
+poinsettias p<nset/@z
+poinsettias p<nset@z
+point p<nt
+point's p<nts
+pointe p<nt
+pointed p<n@d
+pointed p<nt@d
+pointedly p<n@dl/
+pointedly p<nt@dl/
+pointer p<ntP
+pointers p<ntPz
+pointing p<nt6N
+pointless p<ntl@s
+points p<nts
+pointy p<nt/
+poirier p<r/P
+poirrier p<r/P
+poise p<z
+poised p<zd
+poison p<z~
+poisoned p<z~d
+poisoning p<z~6N
+poisonings p<z~6Nz
+poisonous p<z~@s
+poisons p<z~z
+poissant p<zs{nt
+poisson p<zs~
+poitier p<tyP
+poitier pwotyA
+poitra p<tr@
+poitras p<troz
+pokazukha pok@zUkh@
+poke pOk
+poked pOkt
+poker pOkP
+pokes pOks
+pokeweed pOkwEd
+pokey pOk/
+poking pOk6N
+pokorney pokPn/
+pokorny p@k{rn/
+pokorski p@k{rsk/
+poky pOk/
+pol p{l
+polacek pol@Cck
+polachek pol@k6k
+polack pOlak
+polak pOl@k
+polakoff pol@k{f
+polakowski p@l@k{fsk/
+polan pOl~
+polanco p]lonk]
+poland pOl~d
+poland's pOl~dz
+polanski p@lansk/
+polansky p@lansk/
+polar pOlP
+polarimeter pOlPim@tP
+polaris p]l,r@s
+polariscope p]l,r@skOp
+polarity p]l,r@t/
+polarization pOlP@zAS~
+polarize pOlPIz
+polarized pOlPIzd
+polarizer pOlPIzP
+polarizes pOlPIz@z
+polarizing pOlPIz6N
+polarography pOlPogr@f/
+polaroid pOlP<d
+polaroid's pOlP<dz
+polaroids pOlP<dz
+polasek p@losck
+polaski p@losk/
+polasky p@losk/
+polce pOls
+polcyn pOlsin
+polder pOldP
+pole pOl
+polecat pOlkat
+polecats pOlkats
+polek pOlck
+polemic p@lem6k
+polemical p@lem@k@l
+polemicist p@lem@s@st
+polemics p]lem6ks
+polen pOl~
+poles pOlz
+poletti p]let/
+polevanov p@lev~ov
+polevoi pOl@v<
+poleward pOlwPd
+poley pOl/
+polgar pOlgP
+polhamus pOlh}@s
+polhemus pOlhcm@s
+polhill pOlhil
+poli pOl/
+poli pOlI
+policastro p]l/kastr]
+police p@lEs
+police's p@lEs@z
+policed p@lEst
+policeman p@lEsm~
+policeman's p@lEsm~z
+policemen p@lEsmcn
+polices p@lEs@z
+policewoman p@lEswqm~
+policewomen p@lEswimcn
+polich pol6k
+policies pol@s/z
+policing p@lEs6N
+policy pol@s/
+policy's pol@s/z
+policyholder pol@s/hOldP
+policyholder's pol@s/hOldPz
+policyholders pol@s/hOldPz
+policyholders' pol@s/hOldPz
+policymaker pol@s/mAkP
+policymakers pol@s/mAkPz
+policymaking pol@s/mAk6N
+polidori p]l/d{r/
+polidoro p]l/d{r]
+polifroni pol@frOn/
+polimeni p]l/men/
+polin pOlin
+poling pOl6N
+polino p]lEn]
+polinski p@linsk/
+polinsky p@linsk/
+polio pOl/O
+poliquin p]l/kwEn
+polis pOl@s
+polis pOlIz
+polisario pOl@s,r/]
+polish pOl6S
+polish pol6S
+polished pol6St
+polishing pol6S6N
+politano p]l/ton]
+politburo pol@tbyqr]
+politburo's pol@tbyqr]z
+polite p@lIt
+politely p@lItl/
+politeness p@lItn@s
+polites p@lIts
+politi p]lEt/
+politic pol@tik
+political p@lit@k@l
+politically p@lit6k@l/
+politically plit6kl/
+politician pol@tiS~
+politician's pol@tiS~z
+politicians pol@tiS~z
+politicians' pol@tiS~z
+politicization p@lit@s@zAS~
+politicize p@lit@sIz
+politicized p@lit@sIzd
+politicizing p@lit@sIz6N
+politicking pol@tik6N
+politico p@lit6kO
+politicos p@lit6kOz
+politics pol@tiks
+politics' pol@tiks
+politis polItis
+polito p]lEt]
+politte p@lit
+polity pol@t/
+politz polits
+polivka p]lEvk@
+polizzi p]lEts/
+polje pOlj/
+polk pOk
+polk pOlk
+polk's pOks
+polk's pOlks
+polka pOk@
+polka pOlk@
+polkas pOk@z
+polkas pOlk@z
+polkinghorn pOlk6Nh{rn
+poll pOl
+poll's pOlz
+pollack pol@k
+pollack's pol@ks
+pollak pol@k
+pollan pol~
+polland pol~d
+pollard polPd
+pollard's polPdz
+polled pOld
+pollen pol~
+pollens pol~z
+pollet polct
+pollett polct
+polley pol/
+pollick pol6k
+pollina p]lEn@
+pollinate pol~At
+pollinated pol~At@d
+pollinates pol~Ats
+pollination pol~AS~
+polling pOl6N
+pollinger pOl6NP
+pollini p@lEn/
+pollinia polin/@
+pollino p]lEn]
+pollio pol/]
+pollitt polit
+pollman pOlm~
+pollner pOlnP
+pollo pol]
+pollock pol@k
+polloi pol<
+pollok pol@k
+polls pOlz
+pollster pOlstP
+pollsters pOlstPz
+pollutant p@lUt~t
+pollutants p@lUt~ts
+pollute p@lUt
+polluted p@lUt@d
+polluter p@lUtP
+polluters p@lUtPz
+pollutes p@lUts
+polluting p@lUt6N
+pollution p@lUS~
+pollux pol@ks
+polly pol/
+polly's pol/z
+pollyanna pol/an@
+polo pOl]
+polo's pOl]z
+polonaise pol~Az
+polonium p@lOn/}
+polonsky p@lonsk/
+pols pOlz
+polsby pOlzb/
+polsinelli p]ls/nel/
+polskin pOlskin
+polskin polskin
+polsky pOlsk/
+polson pOls~
+polster pOlstP
+polston pOlst~
+poltergeist pOltPgIst
+poltergeists pOltPgIs
+poltergeists pOltPgIss
+poltergeists pOltPgIsts
+poltrack pOltrak
+polus pOl@s
+poly pol/
+poly's pol/z
+polyacetylene pol/@set@lEn
+polyak pol/ak
+polyamide pol/amId
+polyandrous pol/andr@s
+polyandry pol/andr/
+polybutylene pol/byUt@lEn
+polycarpic pol/k)rp6k
+polycarpic pol6k)rp6k
+polycast pol/kast
+polychlorinate pol/kl{r~At
+polychlorinated pol/kl{r~At@d
+polychrome pol/krOm
+polychrome pol6krOm
+polyconomics pol6k~om6ks
+polyester pol/estP
+polyesters pol/estPz
+polyethylene pol/eT@lEn
+polygamous p@lig}@s
+polygamy p@lig}/
+polyglot pol/glot
+polygon pol/gon
+polygon pol6gon
+polygonal p@lig~@l
+polygram pol/gram
+polygram's pol6gramz
+polygraph pol6graf
+polygraphs pol/grafs
+polygynous p@lij~@s
+polygyny p@lij~/
+polyhedron pol/hEdr~
+polyhedrons pol/hEdr~z
+polyhemoglobin pol/hEm@glOb~
+polymarker pol/m)rkP
+polymarkers pol/m)rkPz
+polymer pol}P
+polymerase pol}PAs
+polymerize pol}PIz
+polymerized pol}PIzd
+polymerizes pol}PIz@z
+polymers pol}Pz
+polymorph pol/m{rf
+polymorphic pol/m{rf6k
+polymorphism pol/m{rfiz}
+polynesia pol~EZ@
+polynesian pol~EZ~
+polynomial pol~Om/@l
+polyp pol@p
+polyphase pol@fAz
+polyphonic pol@fon6k
+polyphony p@lif~/
+polypropylene pol/prOp@lEn
+polyps pol@ps
+polysaccharide pol@sakPId
+polysaccharides pol@sakPIdz
+polysar pol@sor
+polysar's pol@sorz
+polysilicon pol/sil6kon
+polystyrene pol/stIrEn
+polystyrene pol@stIrEn
+polytech pol@tek
+polytechnic pol/tekn6k
+polytechnologies pol/tcknol@j/z
+polytechnology pol/tcknol@j/
+polytheism pol@T/iz}
+polytheistic pol@T/ist6k
+polyurethane pol/qr@TAn
+polyvinyl pol/vIn@l
+polzer pOlzP
+polzin pOlzin
+pom p{m
+poma pOm@
+pombo pomb]
+pomerance pomPans
+pomerania pomPAn/@
+pomeranian pomPAn/~
+pomerantz pomPants
+pomeranz pomPans
+pomerleau pomPl]
+pomeroy pomP<
+pomicino pOmisEn]
+pommel pom@l
+pommer pomP
+pommier pom/P
+pomodoro pom@d{r]
+pomology p]mol@j/
+pomona p]mOn@
+pomp pomp
+pompa pomp@
+pompadur pomp@dP
+pompano pomp~O
+pompeo pOmp/]
+pomper pompP
+pompey pomp/
+pompidou pomp@dU
+pompilio p]mpEl/]
+pomplun pompl~
+pompon pompon
+pomponio p]mpOn/]
+pompons pomponz
+pomposity pompos@t/
+pompous pomp@s
+pompousness pomp@sn@s
+pomrenze pomr~z
+pomroy pomr<
+pon pon
+ponce pOnsA
+ponce pons
+poncet pons@t
+ponchan ponC~
+poncho ponC]
+ponchos ponC]z
+pond pond
+pond's pondz
+ponder pondP
+pondered pondPd
+pondering pondP6N
+ponderosa pondPOs@
+ponderosa's pondPOs@z
+ponderous pondP@s
+ponders pondPz
+ponds pondz
+pong p{N
+pongratz poNgr@ts
+poniatowski p~/@t{fsk/
+ponied pOn/d
+ponies pOn/z
+pons ponz
+ponsolle pons]l
+pont pont
+pont's ponts
+pontarelli p]ntorel/
+pontbriand pontbr/~d
+ponte pont
+pontes pOntcs
+ponti pont/
+pontiac pon/ak
+pontiac pont/ak
+pontiac's pon/aks
+pontiac's pont/aks
+pontiacs pon/aks
+pontiacs pont/aks
+pontiff pont@f
+pontiff's pont@fs
+pontifical pontif@k@l
+pontificate pontif@kAt
+pontificated pontif@kAt@d
+pontificater pontif@kAtP
+pontificaters pontif@kAtPz
+pontificates pontif@kAts
+pontificating pontif@kAt6N
+pontification pontif@kAS~
+pontifications pontif@kAS~z
+pontikes pontEkez
+pontillo p]ntil]
+pontious pOnS@s
+pontius pont/@s
+ponto pont]
+ponton pont~
+pontoon pontUn
+pontoons pontUnz
+ponts ponts
+pony pOn/
+ponytail pOn/tAl
+ponzetti ponzet/
+ponzi ponz/
+ponzio ponz/]
+ponzo ponz]
+poo pU
+pooch pUC
+pooches pUC@z
+poodle pUd@l
+poodles pUd@lz
+poof pUf
+pooh pU
+poohed pUd
+pool pUl
+pool's pUlz
+pool-side pUlsId
+poole pUl
+pooled pUld
+pooler pUlP
+pooley pUl/
+pooling pUl6N
+pools pUlz
+poolside pUlsId
+poon pUn
+poop pUp
+pooped pUpt
+pooper pUpP
+poopers pUpPz
+poops pUps
+poor pqr
+poor's pqrz
+poor-spirited pqrspir@t@d
+poor-spiritedness pqrspir@t@dn@s
+poorbaugh pqrb{
+poore pqr
+poorer pqrP
+poorest pqr@st
+poorhouse pqrh?s
+poorly pqrl/
+poorman pqrm~
+poors pqrz
+poors p{rz
+pooser pUzP
+poovey pUv/
+pop pop
+pop's pops
+popa pOp@
+popcorn popk{rn
+pope pOp
+pope's pOps
+popeil pOpEl
+popejoy pOpj<
+popejoy's pOpj<z
+popek pOp6k
+popelka p@pelk@
+popes pOpz
+popeye popI
+popeye's popIz
+popeyes p{pIz
+popham pof}
+popick pop6k
+popiel pop/l
+popieluszko p]pEclusk]
+popik pOp6k
+popken popk~
+popkin popkin
+popko pOpk]
+poplar poplP
+poplawski p@plofsk/
+poplin poplin
+popoff pop{f
+popolare pop]l)r/
+popov pOp@v
+popovic pop@v6k
+popovich pop@v6C
+popowski p@p{fsk/
+popp pop
+poppa pop@
+poppe pop
+poppea pop/@
+popped popt
+poppell pop@l
+poppen pop~
+popper popP
+poppers popPz
+poppies pop/z
+popping pop6N
+poppins popinz
+popple pop@l
+poppleton pop@lton
+popplewell pop@lwcl
+poppy pop/
+poppy's pop/z
+poppycock pop/k{k
+pops pops
+popsicle pops6k@l
+populace popy@l@s
+popular popy@lP
+popularity popy@l,r@t/
+popularization popy@lP@zAS~
+popularize popy@lPIz
+popularized popy@lPIzd
+popularizer popy@lPIzP
+popularizing popy@lPIz6N
+popularly popy@lPl/
+populate popy@lAt
+populated popy@lAt@d
+populating popy@lAt6N
+population popy@lAS~
+populations popy@lAS~z
+populism popy@liz}
+populist popy@l@st
+populists popy@l@s
+populists popy@l@ss
+populists popy@l@sts
+populous popy@l@s
+popwell popwel
+poquette p@ket
+por p{r
+porada p{rod@
+porath p{r@T
+porcaro p{rk)r]
+porcelain p{rs@l~
+porcelains p{rs@l~z
+porcella p{rCel@
+porcelli p{rCel/
+porcello p{rCel]
+porch p{rC
+porcher p{rCP
+porcher p{rSA
+porches p{rC@z
+porchia p{rk/@
+porco p{rk]
+porcupine p{rky@pIn
+porcupines p{rky@pInz
+pordy p{rd/
+pore p{r
+pored p{rd
+poremba p{remb@
+pores p{rz
+porges p{rj@z
+porgy p{rg/
+poring p{r6N
+pork p{rk
+porky p{rk/
+porn p{rn
+porno p{rn]
+pornographer p{rnogr@fP
+pornographers p{rnogr@fPz
+pornographic p{rn@graf6k
+pornography p{rnogr@f/
+porous p{r@s
+porphyritic p{rfPit6k
+porphyry p{rfP/
+porpoise p{rp@s
+porpoises p{rp@s@z
+porr p{r
+porras p{roz
+porrazzo p{roz]
+porreca p{rek@
+porretta p{ret@
+porridge p{r@j
+porritt p{rit
+porro p{r]
+porsche p{rS
+porsche p{rS@
+porsche's p{rS@z
+porsches p{rS@z
+port p{rt
+port's p{rts
+port-victoria p{rtv6kt{r/@
+porta p{rt@
+portability p{rt@bil@t/
+portable p{rt@b@l
+portables p{rt@b@lz
+portage p{rt@j
+portal p{rt@l
+portales p{rtolcs
+portals p{rt@lz
+portanova p{rtonOv@
+porte p{rt
+portec p{rtek
+portec's p{rteks
+ported p{rt@d
+portee p{rtE
+portela p{rtel@
+portell p{rtAl
+portelli p{rtel/
+portend p{rtend
+portending p{rtend6N
+portends p{rtendz
+portent p{rtcnt
+portentous p{rtent@s
+portents p{rtents
+porteous p{rt/@s
+porter p{rtP
+porter's p{rtPz
+portera p{rt,r@
+porterages p{rtP6j@z
+porterfield p{rtPfEld
+porters p{rtPz
+portfolio p{rtfOl/O
+portfolio's p{rtfOl/Oz
+portfolios p{rtfOl/Oz
+porth p{rT
+portia p{rS@
+portico p{rt@kO
+portier p{rt/P
+portilla p{rtil@
+portillo p{rtil]
+porting p{rt6N
+portion p{rS~
+portions p{rS~z
+portis p{rtis
+portland p{rtl~d
+portland's p{rtl~dz
+portlock p{rtlok
+portly p{rtl/
+portman p{rtm~
+portner p{rtnP
+portney p{rtn/
+portnoy p{rtn<
+porto p{rt]
+portrait p{rtr@t
+portraits p{rtr@ts
+portray p{rtrA
+portrayal p{rtrA@l
+portrayals p{rtrA@lz
+portrayed p{rtrAd
+portraying p{rtrA6N
+portrays p{rtrAz
+ports p{rts
+portsmouth p{rtsm@T
+portugal p{rC@g@l
+portugal's p{rC@g@lz
+portugalia p{rCUgAl/@
+portuguese p{rC@gEz
+portwood p{rtwqd
+portz p{rts
+porzio p{rz/]
+pos pEOes
+pos pos
+posa pOs@
+posada p]sod@
+posavina p]s@vEn@
+posavina p{s@vEn@
+posch p{S
+posco p{sk]
+pose pOz
+posed pOzd
+poseidon p@sId~
+poseidon's p@sId~z
+posen pOz~
+poser pOzP
+poses pOz@z
+posey pOz/
+posh poS
+poshard poSPd
+posing pOz6N
+posit poz@t
+posited poz@t@d
+position p@ziS~
+positioned p@ziS~d
+positioning p@ziS~6N
+positions p@ziS~z
+positive poz@t6v
+positively poz@t6vl/
+positives poz@t6vz
+positivism poz@t6viz}
+positron poz@tron
+positrons poz@tronz
+posits poz@ts
+posluns p{zl~z
+posluszny p@sluSn/
+posner pOznP
+posner p{znP
+posner's pOznPz
+posner's p{znPz
+posners pOznPz
+posners p{znPz
+posnick p{sn6k
+pospisil p]sp/sEl
+poss p{s
+posse pos/
+possehl pos@l
+posses pos/z
+possess p@zes
+possessed p@zest
+possesses p@zes@z
+possessing p@zes6N
+possession p@zeS~
+possessions p@zeS~z
+possessive p@zes6v
+possessiveness p@zes6vn@s
+possessor p@zesP
+possibilities pos@bil@t/z
+possibility pos@bil@t/
+possible pos@b@l
+possibly pos@bl/
+possum pos}
+possums pos}z
+post pOst
+post's pOsts
+post-attack pOst@tak
+postage pOst@j
+postal pOst@l
+postal's pOst@lz
+postcard pOskord
+postcard pOstkord
+postcards pOskordz
+postcards pOstkordz
+postcrash pOstkraS
+postdate pOstdAt
+postdoctoral pOstdoktP@l
+posted pOst@d
+postel post@l
+postell post@l
+postema postem@
+posten pOst~
+poster pOstP
+posteraro p{stcr)r]
+posterior p{stir/cr
+posterity post,r@t/
+posters pOstPz
+postgame pOstgAm
+posthole pOsthOl
+postholes pOsthOlz
+posthumous posCqm@s
+posthumously posCqm@sl/
+posting pOst6N
+postings pOst6Nz
+postino p{stEn]
+postipankki p{st@paNk/
+postle pos@l
+postlethwait pOst@lTwAt
+postlewait pOstlUAt
+postlewait post@lwAt
+postlewaite post@lwAt
+postma pOstm@
+postman pOsm~
+postman pOstm~
+postmark pOstmork
+postmarked pOsmorkt
+postmarked pOstmorkt
+postmaster pOsmastP
+postmaster pOstmastP
+postmasters pOsmastPz
+postmasters pOstmastPz
+postmodern p]stmodPn
+postmortem p]stm{rtcm
+postnatal pOstnAt@l
+poston pOst~
+postpone p]spOn
+postpone p]stpOn
+postponed p]spOnd
+postponed p]stpOnd
+postponement p]spOnm~t
+postponement p]stpOnm~t
+postponements p]spOnm~ts
+postponements p]stpOnm~ts
+postpones p]spOnz
+postpones p]stpOnz
+postponing p]spOn6N
+postponing p]stpOn6N
+postrel p{strcl
+postrelle pOstrel
+postretirement pOstr/tIPm~t
+posts pOs
+posts pOss
+posts pOsts
+postscript pOskript
+postscript pOstskript
+postscripts pOskripts
+postscripts pOstskrips
+postscripts pOstskripts
+posttraumatic pOstr{mat6k
+posttraumatic pOsttr{mat6k
+postulate posC@l@t
+postulate posC@lAt
+postulates posC@l@ts
+postulates posC@lAts
+posture posCP
+postures posCPz
+posturing posCP6N
+posturings posCP6Nz
+postwar pOstw{r
+pot pot
+potable pOt@b@l
+potamkin p]tamk~
+potapov pot@pov
+potash potaS
+potassium p@tas/}
+potato p@tAtO
+potatoes p@tAt]z
+pote pOt
+poteat p]tEt
+poteet pot/t
+poteete pot/t
+potemkin p@temkin
+potempa p]temp@
+potency pOt~s/
+potent pOt~t
+potentate pOt~tAt
+potentates pOt~tAts
+potential p@tenC@l
+potential p@tenS@l
+potentially p@tenC@l/
+potentially p@tenS@l/
+potentials p@tenC@lz
+potentials p@tenS@lz
+potenza p]tenz@
+poth poT
+pothier pOT/P
+pothitos p@TEt]s
+pothole pothOl
+potholed pothOld
+potholes pothOlz
+potier pOt/P
+potiker pOt6kP
+potion pOS~
+potions pOS~z
+potlatch potlaC
+potluck potluk
+potocki p@tOtsk/
+potomac p@tOm@k
+potpie potpI
+potpourri pOpqrE
+potratz potr@ts
+pots pots
+potsdam potsdam
+potshot poCot
+potshots poCots
+pott pot
+pottebaum potb?m
+potted pot@d
+potteiger potIgP
+pottenger pot~jP
+potter potP
+potter's potPz
+potters potPz
+pottery potP/
+potthast poT@st
+potthoff poth{f
+potthurst pothPst
+pottinger pot6NP
+pottle pot@l
+pottorff potPf
+potts pots
+potty pot/
+potucek pot@Cck
+potvin potvin
+pou pU
+pouch p?C
+poucher p?CP
+pouches p?C@z
+poudrier p?dP/P
+pough p?
+poughkeepsie p@kips/
+poughkeepsie's p@kips/z
+poul pUl
+poulenc pUl@Nk
+poulenc's pUl@Nks
+poulin pUlan
+pouliot pUl/]
+poulos p@lEs
+poulsen p?ls~
+poulson p?ls~
+poulter pOltP
+poultice pOlt@s
+poultices pOlt@s@z
+poulton p?lt~
+poultry pOltr/
+pounce p?ns
+pounced p?nst
+pouncey p?ns/
+pouncing p?ns6N
+pouncy pUNkE
+pound p?nd
+pound's p?ndz
+pound's p?nz
+poundage p?nd6j
+pounded p?nd@d
+pounder p?ndP
+pounders p?ndPz
+pounding p?nd6N
+pounds p?ndz
+pounds p?nz
+poundstone p?ndstOn
+poupard pUpPd
+pour p{r
+pourciau p{rs/]
+poured p{rd
+pouring p{r6N
+pours p{rz
+poussaint pUsont
+poussant pUs~t
+poussin pUs~
+pousson pUson
+poust p?st
+pout p?t
+pouted p?t@d
+pouter p?tP
+pouting p?t6N
+poutre p?tP
+pouts p?ts
+pouty p?t/
+poveromo pOvcrOm]
+poverty povPt/
+povich pOv6C
+povich's pOv6C@z
+pow p?
+powalsky p]alsk/
+powder p?dP
+powdered p?dPd
+powdering p?dP6N
+powderly p?dPl/
+powders p?dPz
+powdery p?dP/
+powe p?
+powell p?@l
+powell's pO@lz
+powelson p?@ls~
+power p?P
+power's p?Pz
+powerball p?Pb{l
+powerboat p?PbOt
+powerbook p?Pbqk
+powercise p?rsIz
+powered p?Pd
+powerful p?Pf@l
+powerfully p?Pfl/
+powergen p?Pjen
+powerhouse p?Ph?s
+powerhouses p?Ph?s@z
+powering p?P6N
+powerless p?Pl@s
+powerlessness p?Pl@sn@s
+powerpc p?PpEsE
+powerpcs p?PpEsEz
+powerpcs' p?PpEsEz
+powers p?Pz
+powers' p?Pz
+powersoft p?Psoft
+powertrain p?rtrAn
+powis p?is
+powles p?@lz
+powless p?l@s
+powley p?l/
+pownall p?n@l
+pows pOz
+powter p?tP
+powwow p?w?
+pox poks
+poyer p<P
+poyner p<nP
+poynor p<nP
+poynter p<ntP
+poynton p<ntun
+poyser p<sP
+poythress p<Tr@s
+poznan pozn~
+poznanski p@znansk/
+pozner poznP
+pozniak pozn/ak
+poznikov pozn6kov
+pozo pOz]
+pozos pOz]s
+pozzi poz/
+ppm pEpEem
+prab prab
+pracht prakt
+practicable prakt@k@b@l
+practical prakt@k@l
+practicality prakt6kal@t/
+practically prakt@k@l/
+practically prakt@kl/
+practice praktis
+practiced praktist
+practices praktis@z
+practicing praktis6N
+practitioner praktiSnP
+practitioner praktiS~P
+practitioners praktiSnPz
+practitioners praktiS~Pz
+prada prod@
+pradesh pr@deS
+pradetto pr@det]
+prado prod]
+praetor prEtP
+praetorian pr/t{r/~
+prager prAgP
+pragmatic pragmat6k
+pragmatically pragmat6k@l/
+pragmatically pragmat6kl/
+pragmatism pragm@tiz}
+pragmatist pragm@tist
+pragmatists pragm@tis
+pragmatists pragm@tiss
+pragmatists pragm@tists
+prague prog
+prague's progz
+prahl prol
+prairie pr,r/
+prairie's pr,r/z
+prairies prAr/z
+praise prAz
+praised prAzd
+praises prAz@z
+praiseworthy prAzwVT/
+praising prAz6N
+prakash prokoS
+prall pr{l
+pralle prAl
+pran pran
+pran pron
+prance prans
+prances prans@z
+prancing prans6N
+prange prAnj
+pranger prAnjP
+prank praNk
+pranks praNks
+prankster praNkstP
+prapas prop@s
+prasad pras@d
+prasek prosck
+prashant proSont
+prater prAtP
+pratfall pratf{l
+pratfalls pratf{lz
+prather praTP
+prato prot]
+prats prats
+pratt prat
+pratt's prats
+pratte prat
+prattle prat@l
+prattville pratvil
+praun pr{n
+prause pr{z
+pravda pravd@
+pravda's pravd@z
+prawn pr{n
+prawns pr{nz
+praxair praks,r
+praxis praksis
+pray prA
+prayed prAd
+prayer pr,r
+prayer prAP
+prayerful pr,rf@l
+prayerful prAPf@l
+prayers pr,rz
+prayers prAPz
+praying prA6N
+prays prAz
+praytor prAtP
+prazak proz@k
+prchal pPSal
+pre prE
+preach prEC
+preached prECt
+preacher prECP
+preacher's prECPz
+preachers prECPz
+preaches prEC@z
+preaching prEC6N
+preachy prEC/
+preadolescence prEad@les@s
+preadolescent prEad@les~t
+preakness prEkn@s
+preamble pr/amb@l
+prearrange prEPAnj
+prearranged prEPAnjd
+preas prEz
+prebble preb@l
+prebe prEb
+preble preb@l
+prebon prEbon
+precambrian pr/kambr/~
+precancerous pr/kansP@s
+precarious pr/k,r/@s
+precariously pr6k,r/@sl/
+precast pr/kast
+precaution pr/k{S~
+precautionary pr6k{S~cr/
+precautions pr/k{S~z
+precede pr@sEd
+preceded pr/sEd@d
+preceded pr@sEd@d
+precedence pres@d~s
+precedent pres@d~t
+precedents pres@dents
+precedents pres@d~ts
+precedes pr@sEdz
+preceding pr/sEd6N
+preceeding pr@sEd6N
+precept prEsept
+precepts prEsepts
+precession pr/seS~
+precht prekt
+prechter prektP
+prechtl prekt@l
+preciado prcCod]
+precinct prEsiNk
+precinct prEsiNkt
+precincts prEsiNks
+precincts prEsiNkts
+precious preS@s
+precipice pres@p@s
+precipitate pr@sip@tAt
+precipitated pr@sip@tAt@d
+precipitating pr@sip@tAt6N
+precipitation pr@sip@tAS~
+precipitous pr@sip@t@s
+precipitously prEsip@t@sl/
+precis prAsE
+precise pr/sIs
+precise pr@sIs
+precisely pr/sIsl/
+precisely pr@sIsl/
+precision pr/siZ~
+preclinical pr/klin6k@l
+preclude pr/klUd
+preclude pr6klUd
+precluded pr/klUd@d
+precluded pr6klUd@d
+precludes pr/klUdz
+precludes pr6klUdz
+precluding pr6klUd6N
+preclusion pr/klUZ~
+preclusion pr6klUZ~
+precocious pr/kOS@s
+precocious pr6kOS@s
+preconceive prEk~sEv
+preconceived prEk~sEvd
+preconception pr/k~sepS~
+preconceptions pr/k~sepS~z
+precondition prEk~diS~
+preconditions prEk~diS~z
+precook prEkqk
+precooked pr/kqkt
+precourt pr6k{rt
+precrash pr/kraS
+precursor pr/kVsP
+precursors pr/kVsPz
+predaceous pr/dAS@s
+predate pr/dAt
+predate prEdAt
+predated pr/dAt@d
+predated prEdAt@d
+predates prEdAts
+predator pred@tP
+predators pred@tPz
+predatory pred@t{r/
+predawn pr/d{n
+preddy pred/
+predecessor pred@sesP
+predecessor's pred@sesPz
+predecessors pred@sesPz
+predecessors' pred@sesPz
+predestination prEdest~AS~
+predestine prEdest~
+predestined prEdest~d
+predetermine prEd/tVm~
+predetermined prEd/tVm~d
+predicament pr/dik}~t
+predicament pr@dik}~t
+predicaments pr@dik}~ts
+predicate pred@k@t
+predicate pred@kAt
+predicated pred@kAt@d
+predicates pred@k@ts
+predicates pred@kAts
+predict pr/dikt
+predict pr@dikt
+predictability pr@dikt@bil@t/
+predictable pr/dikt@b@l
+predictable pr@dikt@b@l
+predictably pr@dikt@bl/
+predicted pr/dikt@d
+predicted pr@dikt@d
+predicting pr/dikt6N
+predicting pr@dikt6N
+prediction pr/dikS~
+predictions pr/dikS~z
+predictive pr/dikt6v
+predictive pr@dikt6v
+predictor pr@diktP
+predictors pr/diktPz
+predictors pr@diktPz
+predicts pr/diks
+predicts pr/dikts
+predicts pr@diks
+predicts pr@dikts
+predilection pred@lekS~
+predilections pred@lekS~z
+predispose prEdispOz
+predisposed prEdispOzd
+predisposing prEdispOz6N
+predisposition prEdisp@ziS~
+predispositions prEdisp@ziS~z
+predmore predm{r
+predominance pr@dom~~s
+predominant pr@dom~~t
+predominantly pr@dom~~tl/
+predominate pr@dom~@t
+predominate pr@dom~At
+predominated pr@dom~At@d
+predominates pr@dom~Ats
+predominating pr@dom~At6N
+pree prE
+preece prEs
+preelection pr/@lekS~
+preeminence pr/em~~s
+preeminent pr/em~~t
+preempt prEempt
+preempted pr/empt@d
+preempting pr/empt6N
+preemption prEempS~
+preemptive pr/empt6v
+preemptively pr/empt6vl/
+preen prEn
+preened prEnd
+preening prEn6N
+preexist prE6gzist
+preexisted prE6gzist@d
+preexisting prE6gzist6N
+preexists prE6gzis
+preexists prE6gziss
+preexists prE6gzists
+prefab prEfab
+prefabricate pr/fabr6kAt
+prefabricated pr/fabr6kAt@d
+prefabrication prEfabr@kAS~
+prefabs prEfabz
+preface pref@s
+prefaced pref@st
+prefect prEfekt
+prefectural pr/fekCP@l
+prefecture prEfekCP
+prefer pr/fV
+prefer pr@fV
+preferable prefP@b@l
+preferable prefr@b@l
+preferably prefP@bl/
+preferably prefr@bl/
+prefered pr@fVd
+preference prefP~s
+preference prefr~s
+preferenced prefP~st
+preferenced prefr~st
+preferences prefP~s@z
+preferential prefPenC@l
+preferential prefPenS@l
+preferentially prefPenC@l/
+preferentially prefPenS@l/
+preferred pr/fVd
+preferred pr@fVd
+preferreds pr/fV@dz
+preferring pr@fV6N
+prefers pr/fVz
+prefers pr@fVz
+prefix prEf6ks
+prefrontal pr/frunt@l
+pregler preglP
+pregnancies pregn~s/z
+pregnancy pregn~s/
+pregnant pregn~t
+prego prAg]
+preheim prehIm
+prehistoric prEhist{r6k
+prehn pren
+preholiday prEh{l@dA
+preignition prE@gniS~
+preis prEz
+preiser prIsP
+preisig prIz6g
+preisler prIs@lP
+preiss prIs
+prejean prEjEn
+prejudge pr/juj
+prejudged pr/jujd
+prejudgment pr/jujm~t
+prejudice prej@d@s
+prejudiced prej@d@st
+prejudices prej@d@s@z
+prejudicial prej@duS@l
+prejudicing prej@d@s6N
+prekindergarten pr/kindPgod~
+prelate prElAt
+prelate prel@t
+prelates prel@ts
+prelim pr/lim
+prelim pr@lim
+preliminaries pr/lim~er/z
+preliminaries pr@lim~er/z
+preliminarily pr@lim~,r@l/
+preliminary pr/lim~er/
+preliminary pr@lim~er/
+prelims prElimz
+prell prel
+prellwitz prelwits
+prelude prAlUd
+preludes prAlUdz
+prem prem
+premadasa prEm@dos@
+premarin premPin
+premarital pr/m,r@t@l
+premark pr/m)rk
+premarket prEm)rk@t
+premature prEm@Cqr
+prematurely prEm@Cqrl/
+premeditate pr/med@tAt
+premeditated pr/med@tAt@d
+premeditation pr/med@tAS~
+premier pr/mir
+premier prcmir
+premier's pr/mirz
+premier's prcmirz
+premiere prcmir
+premiered prcmird
+premieres prcmirz
+premiering prcmir6N
+premiers prcmirz
+premiership prcmirSip
+premise prem@s
+premised prem@st
+premises prem@s@z
+premium prEm/}
+premiums prEm/}z
+premo prem]
+premodern pr/m{dPn
+premonition prcm~iS~
+premonitory pr}un@tP/
+prenatal pr/nAt@l
+prendergast prendPgast
+prenger prenjP
+prenn pren
+prensa prens@
+prentice prentis
+prentiss prentis
+prentnieks prentn/eks
+prenuptial pr/nupS@l
+preoccupation pr/oky@pAS~
+preoccupations pr/oky@pAS~z
+preoccupied pr/oky@pId
+preoccupies pr/oky@pIz
+preoccupy pr/oky@pI
+preordain prE{rdAn
+preordained prE{rdAnd
+prep prep
+prepackage pr/pak@j
+prepackaged pr/pak@jd
+prepaid pr/pAd
+preparation prepPAS~
+preparations prepPAS~z
+preparatory prcp,r@t{r/
+prepare pr/p,r
+prepared pr/p,rd
+preparedness pr/p,r@dn@s
+preparer pr/p,rP
+preparers pr/p,rPz
+prepares pPp,rz
+prepares pr/p,rz
+preparing pPp,r6N
+preparing pr/p,r6N
+prepay pr/pA
+prepaying pr/pA6N
+prepayment pr/pAm~t
+prepayments pr/pAm~ts
+preplanning pr/plan6N
+preponderance pr/pondr~s
+preposterous pr@postP@s
+preposterous pr@postr@s
+prepped prept
+preppie prep/
+prepping prep6N
+preppy prep/
+prerecord prEr/k{rd
+prerecorded prEr/k{rd@d
+prerequisite pr/rekw@z@t
+prerequisites pr/rekw@z@ts
+prerogative pVog@t6v
+prerogative pr6rog@t6v
+prerogatives pVog@t6vz
+prerogatives pr6rog@t6vz
+pres prez
+presage pres6j
+presaged pres6jd
+presages pres6j@z
+presaging pres6j6N
+presale prEsAl
+presario pr@s)r/O
+presby presb/
+presby prezb/
+presbyterian presb@tir/~
+presbyterian prezb@tir/~
+presbyterians presb@tir/~z
+presbyterians prezb@tir/~z
+preschel preS@l
+prescher preSP
+preschool pr/skUl
+preschool prEskUl
+preschooler prEskUlP
+preschoolers prEskUlPz
+preschools pr/skUlz
+preschools prEskUlz
+prescience prES/~s
+prescient pres/~t
+prescot presk@t
+prescott preskot
+prescribe pr/skrIb
+prescribe pr@skrIb
+prescribed pr/skrIbd
+prescriber pr/skrIbP
+prescribers pr/skrIbPz
+prescribes pr/skrIbz
+prescribing pr/skrIb6N
+prescription pr@skripS~
+prescriptions pr@skripS~z
+presence prez~s
+presences prez~s@z
+present pPzent
+present pr/zent
+present prez~t
+presentable pr@zent@b@l
+presentation prez~tAS~
+presentations prez~tAS~z
+presented pPzen@d
+presented pPzent@d
+presented pr/zen@d
+presented pr/zent@d
+presenter pr/zentP
+presenter prez~tP
+presenters pr/zentPz
+presenters prez~tPz
+presenting pr/zent6N
+presenting pr@zent6N
+presently prez~tl/
+presentment pr/zentm~t
+presents pr/zents
+presents prez~ts
+preservation prezPvAS~
+preservationist prezPvAS~@st
+preservationists prezPvAS~@s
+preservationists prezPvAS~@ss
+preservationists prezPvAS~@sts
+preservative pr/zVv@t6v
+preservatives pr@zVv@t6vz
+preserve pr/zVv
+preserve pr@zVv
+preserved pr/zVvd
+preserved pr@zVvd
+preserver pr/zVvP
+preserver pr@zVvP
+preservers pr/zVvPz
+preservers pr@zVvPz
+preserves pr/zVvz
+preserves pr@zVvz
+preserving pr/zVv6N
+preserving pr@zVv6N
+preset pr/set
+preside pr/zId
+preside pr@zId
+presided pr/zId@d
+presided pr@zId@d
+presidencies prez@d~s/z
+presidency prez@d~s/
+presidency's prez@d~s/z
+president prez@dent
+president prez@d~t
+president's prez@d~ts
+presidential prez@denC@l
+presidential prez@denS@l
+presidential's prez@denC@lz
+presidential's prez@denS@lz
+presidentialist prez@denC@l@st
+presidentialist prez@denS@l@st
+presidentially pres@denC@l/
+presidentially pres@denS@l/
+presidents prez@dents
+presidents prez@d~s
+presidents prez@d~ts
+presidents' prez@d~ts
+presides pr/zIdz
+presides pr@zIdz
+presiding pr/zId6N
+presiding pr@zId6N
+presidio pr@sid/O
+presidium pr@sid/}
+preslar prcsl)r
+presler pres@lP
+presley presl/
+presley's presl/z
+presnall presn@l
+presnell presn@l
+presplit prEsplit
+press pres
+press' pres
+press's pres@z
+pressboard presb{rd
+pressburger presbPgP
+presse pres
+pressed prest
+pressel pres@l
+presser presP
+presser's presPz
+presses pres@z
+pressey pres/
+pressing pres6N
+pressler preslP
+pressley presl/
+pressly presl/
+pressman presm~
+pressnell presn@l
+presson pres~
+presstek prestek
+pressure preSP
+pressure's preSPz
+pressured preSPd
+pressures preSPz
+pressuring preSP6N
+pressurization preSP@zAS~
+pressurize preSPIz
+pressurized preSPIzd
+pressurizes preSPIz@z
+presswood preswqd
+prest prest
+presta prest@
+prestage prest6j
+prestech prcstek
+presti prest/
+prestia presty@
+prestidge prest6j
+prestige prcstEZ
+prestigiacomo prcstEj@k]m]
+prestigious pPstEj@s
+prestigious prcstij@s
+presto prestO
+preston prest~
+preston's prest~z
+prestowitz prest@wits
+prestridge prestr6j
+prestwich prestw6C
+prestwood prestwqd
+presumably pr/zUm@bl/
+presumably pr@zUm@bl/
+presume pr@zUm
+presumed pr/zUmd
+presumed pr@zUmd
+presumes pr/zUmz
+presumes pr@zUmz
+presuming pr/zUm6N
+presuming pr@zUm6N
+presumption pr/zumpS~
+presumption pr@zumpS~
+presumptions pr/zumpS~z
+presumptions pr@zumpS~z
+presumptive pr/zumpt6v
+presumptuous pr@zumpC@w@s
+presuppose prEs@pOz
+presupposes prEs@pOz@z
+presupposition prEs@p@ziS~
+presutti prcsUt/
+preszler preslP
+pret pret
+pretax prEtaks
+prete prEt
+preteen prEtEn
+preteens prEtEnz
+pretend pr/tend
+pretended pr/tend@d
+pretender pr/tendP
+pretenders pr/tendPz
+pretending pr/tend6N
+pretends pr/tendz
+pretense pr/tens
+pretenses pr/tens@z
+pretension pr/tenS~
+pretensions pr@tenS~z
+pretentious pr/tenS@s
+preterm prEtPm
+pretext prEtekst
+pretoria pr/t{r/@
+pretoria's pr/t{r/@z
+pretrial pr/trI@l
+pretti pret/
+prettier prit/P
+pretties prit/z
+prettiest prit/@st
+pretty prit/
+prettyman pret/m~
+pretzel pretz@l
+pretzels pretz@lz
+pretzer pretzP
+preuss prUs
+preussag prUsag
+preusser pr<sP
+prevail pr/vAl
+prevail pr6vAl
+prevailed pr/vAld
+prevailed pr6vAld
+prevailing pr/vAl6N
+prevailing pr6vAl6N
+prevails pr/vAlz
+prevails pr6vAlz
+preval prEval
+prevalence prev@l~s
+prevalent prev@l~t
+prevatt pr6vat
+prevatte pr6vat
+prevent pr/vent
+prevent pr6vent
+preventable pr/vent@b@l
+preventable pr6vent@b@l
+preventative pr/vent@t6v
+preventatives pr/vent@t6vz
+prevented pr/ven@d
+prevented pr/vent@d
+prevented pr6ven@d
+prevented pr6vent@d
+preventing pr/ven6N
+preventing pr/vent6N
+preventing pr6ven6N
+preventing pr6vent6N
+prevention pr/venS~
+preventive pr/ven6v
+preventive pr/vent6v
+preventive pr6ven6v
+preventive pr6vent6v
+prevents pr/vents
+prevents pr6vents
+prevette pr6vet
+preview prEvyU
+previewed prEvyUd
+previewing prEvyU6N
+previews prEvyUz
+previn prev~
+previous prEv/@s
+previously prEv/@sl/
+previte prevIt
+previti prcvEt/
+prevo prev]
+prevost prAv]st
+prew prU
+prewar pr/w{r
+preway prEwA
+prewett prUct
+prewitt prUit
+prey prA
+preyed prAd
+preyer prAP
+preying prA6N
+preyista prAist@
+preyistas prAist@z
+preys prAz
+preziosi prcz/Os/
+prezioso prcz/Os]
+prezzano prczon]
+pri prE
+pri prI
+priam prIam
+priam prI}
+priam's prIamz
+priam's prI}z
+pribble prib@l
+pribula pr/bUl@
+pribyl prib@l
+price prIs
+price's prIs@z
+priced prIst
+priceless prIsl@s
+pricer prIsP
+prices prIs@z
+pricey prIs/
+prichard priCPd
+prichett priCct
+pricier prIs/P
+priciest prIs/@st
+pricing prIs6N
+pricings prIs6Nz
+prick prik
+pricked prikt
+prickett prikct
+prickleback prik@lbak
+pricklebacks prik@lbaks
+prickly prikl/
+pricks priks
+pricor prIk{r
+priddy prid/
+pride prId
+prideaux prid]
+prided prId@d
+pridemore prIdm{r
+prides prIdz
+pridgen prij~
+pridgeon pridjin
+pridmore pridm{r
+priebe prEb
+priebke prEbk/
+pried prId
+priem prEm
+prien prEn
+prier prIP
+pries prIz
+priess prEs
+priest prEst
+priest's prEsts
+priester prEstP
+priestess prEst@s
+priesthood prEsthqd
+priestley prEstl/
+priestly prEstl/
+priests prEs
+priests prEss
+priests prEsts
+prieta prEAt@
+prieta prEt@
+prieto prEt]
+prieur prEP
+prig prig
+prigge prig
+prigmore prigm{r
+prihoda pr/hOd@
+prijedor pr6jedP
+prill pril
+prillaman pril}~
+prim prim
+prima prEm@
+primack prim@k
+primacy prIm@s/
+primakov prEm@kof
+primakov prEm@kov
+primal prIm@l
+primaries prImP/z
+primaries prImer/z
+primarily prIm,r@l/
+primark primork
+primary prImer/
+primate prImAt
+primates prImAts
+primavera pr/mov,r@
+prime prIm
+prime's prImz
+primeau primO
+primeaux primO
+primebank prImbaNk
+primeco prImkO
+primed prImd
+primenews prImnUz
+primer prImP
+primerica prim,r6k@
+primerica's prim,r6k@z
+primers prImPz
+primes prImz
+primestar prImstor
+primetime prImtIm
+primeval prImEv@l
+primiano prEm/on]
+priming prIm6N
+primitive prim@t6v
+primitivistic prim@t6vist6k
+primly priml/
+primm prim
+primmer primP
+primo prEmO
+primo's prEmOz
+primordial prim{rd/@l
+primp primp
+primrose primrOz
+primroses primrOz@z
+primus prIm@s
+prince prins
+prince's prins@z
+princely prinsl/
+princes prins@z
+princess prinscs
+princess's prinscs@z
+princesses prinscs@z
+princeton prinst~
+princeton's prinst~z
+princeville prinsvil
+principal prins@p@l
+principal's prins@p@lz
+principalities prins@pal@t/z
+principality prins@pal@t/
+principally prins@pl/
+principals prins@p@lz
+principato pr/nC/pot]
+principe pr/nCEp/
+principia pr~sip/@
+principle prins@p@l
+principled prins@p@ld
+principles prins@p@lz
+prindiville pr/ndEvil
+prindl prind@l
+prindle prind@l
+prine prIn
+pring priN
+pringle priNg@l
+prinkey priNk/
+prinos prEn]s
+prins prinz
+prinsen prins~
+print print
+printable print@b@l
+printed prin@d
+printed print@d
+printemps printcmps
+printer prinP
+printer printP
+printer's prinPz
+printer's printPz
+printers prinPz
+printers printPz
+printing prin6N
+printing print6N
+printing's prin6Nz
+printing's print6Nz
+printings prin6Nz
+printings print6Nz
+printmaker printmAkP
+printmakers printmAkPz
+printon print~
+printout print?t
+printouts print?ts
+prints prints
+printup printup
+printy print/
+printz prints
+prinz prinz
+priola pr/Ol@
+prioleau pr/Ol]
+priolo pr/Ol]
+prior prIP
+priore pr/{r/
+priore prI{rI
+priorities prI{r@t/z
+prioritize prI{r@tIz
+prioritized prI{r@tIzd
+prioritizes prI{r@tIz@z
+prioritizing prI{r@tIz6N
+priority prI{r@t/
+priors prIPz
+priory prIP/
+pris pris
+prisburg prisbPg
+priscilla pr@sil@
+prisco prEsk]
+prisk prisk
+prism priz}
+prismatic prizmat6k
+prison priz~
+prison's priz~z
+prisoned priz~d
+prisoner priznP
+prisoner priz~P
+prisoner's priznPz
+prisoner's priz~Pz
+prisoners priznPz
+prisoners priz~Pz
+prisoners' priznPz
+prisoners' priz~Pz
+prisons priz~z
+prissie pris/
+prissy pris/
+pristine prist/n
+pritchard priCPd
+pritchett priCct
+prithvi priTv/
+pritt prit
+pritts prits
+pritz prits
+pritzker pritskP
+pritzkers pritskPz
+pritzl pritz@l
+privacies prIv@s/z
+privacy prIv@s/
+private prIv@t
+private-eye prIv@tI
+privately prIv@tl/
+privates prIv@ts
+privation prIvAS~
+privations prIvAS~z
+privatisation prIv@t@zAS~
+privatization prIv@t@zAS~
+privatizations prIv@t@zAS~z
+privatize priv@tIz
+privatized prIv@tIzd
+privatizing prIv@tIz6N
+privett priv@t
+privette pr6vet
+privilege priv@l@j
+privilege privl@j
+privileged priv@l@jd
+privileged privl@jd
+privileges priv@l@j@z
+privileges privl@j@z
+privitera pr/v/t,r@
+privott priv@t
+privy priv/
+prix prE
+priyam prE}
+prizant prEzont
+prize prIz
+prized prIzd
+prizes prIz@z
+prizm priz}
+pro prO
+pro's prOz
+proactive prOakt6v
+proactively prOakt6vl/
+prob prOb
+prob prob
+probabilities prob@bil@t/z
+probability prob@bil@t/
+probable prob@b@l
+probably prob@bl/
+probably probl/
+probasco pr]bosk]
+probate prObAt
+probation pr]bAS~
+probationary pr]bAS~er/
+probationer pr]bAS~P
+probationers pr]bAS~Pz
+probative pr]bAt6v
+probe prOb
+probe's prObz
+probed prObd
+probenecid proben@s@d
+probert probPt
+probes prObz
+probing prOb6N
+probity prOb@t/
+problem probl}
+problem's probl}z
+problematic probl}at6k
+problematical probl}at6k@l
+problems probl}z
+proboscis pr]bos@s
+probst probst
+probursa prObVs@
+probus prOb@s
+procaccini pr]koCEn/
+procaine prOkAn
+procardia pr]k)rd/@
+procassini prok@sEn/
+procedural pr@sEjP@l
+procedurally pr@sEjP@l/
+procedurally pr@sEjr@l/
+procedure pr@sEjP
+procedure pr]sEjP
+procedures pr@sEjPz
+procedures pr]sEjPz
+proceed pPsEd
+proceed pr@sEd
+proceed pr]sEd
+proceeded pr@sEd@d
+proceeded pr]sEd@d
+proceeding pr@sEd6N
+proceeding pr]sEd6N
+proceedings pr@sEd6Nz
+proceedings pr]sEd6Nz
+proceeds pr@sEdz
+proceeds pr]sEdz
+procell pr]sel
+proceso prOses]
+process proses
+processed proscst
+processes proscs@z
+processing proscs6N
+procession pr@seS~
+procession pr]seS~
+processional pr@seS~@l
+processional pr]seS~@l
+processions pr]seS~z
+processor prosesP
+processor's prosesPz
+processors prosesPz
+proch prok
+prochaska pr@hosk@
+prochazka pr@hozk@
+prochnow pron?
+procida pr]CEd@
+prock prok
+prockter proktP
+proclaim pr]klAm
+proclaimed pr]klAmd
+proclaiming pr]klAm6N
+proclaims pr]klAmz
+proclamation prokl}AS~
+proclamations prokl}AS~z
+proclivities pr]kliv@t/z
+proclivity pr]kliv@t/
+proconsul pr]kons@l
+procopio pr]kOp/]
+procordia prok{rd/@
+procrastinate pr@krast~At
+procrastinating pr@krast~At6N
+procrastination pr@krast~AS~
+procreate prOkr/At
+procreates prOkr/Ats
+procreation prOkr/AS~
+procter proktP
+proctor proktP
+proctor's proktPz
+proctors proktPz
+proctorsilex pr{ktPsIlcks
+procure pr]kyqr
+procured pr]kyqrd
+procurement pr]kyqrm~t
+procurements pr]kyqrm~ts
+procurer pr]kyqrP
+procuring pr]kyqr6N
+procyte prOsIt
+prod prod
+prodded prod@d
+prodding prod6N
+prodi prOd/
+prodigal prod6g@l
+prodigies prod@j/z
+prodigious pr@dij@s
+prodigiously pr]dij@sl/
+prodigy prod@j/
+prodigy's prod@j/z
+prods prodz
+produce pr@dUs
+produce prOdUs
+produced pr@dUst
+producer pr@dUsP
+producer's pr@dUsPz
+producers pr@dUsPz
+producers' pr@dUsPz
+produces pr@dUs@z
+producing pr@dUs6N
+product prod@kt
+product's prod@ks
+product's prod@kts
+production pPdukS~
+production pr@dukS~
+production pr]dukS~
+production's pPdukS~z
+production's pr@dukS~z
+production's pr]dukS~z
+productions pPdukS~z
+productions pr@dukS~z
+productions pr]dukS~z
+productions' pPdukS~z
+productions' pr@dukS~z
+productions' pr]dukS~z
+productive pPdukt6v
+productive pr@dukt6v
+productive pr]dukt6v
+productively pPdukt6vl/
+productively pr@dukt6vl/
+productively pr]dukt6vl/
+productivity prOd@ktiv@t/
+products prod@ks
+products prod@kts
+products' prod@ks
+products' prod@kts
+prody pOd/
+proehl prOl
+prof. pr@fesP
+prof. pr{f
+profanation pr{f~AS~
+profane pr]fAn
+profanity pr]fan@t/
+profess pr@fes
+professed pr@fest
+professes pr@fes@z
+professing pr@fes6N
+profession pr@feS~
+profession's pr@feS~z
+professional pr@feS~@l
+professionalism pr@feS~@liz}
+professionalize pr@feS~@lIz
+professionalized pr@feS~@lIzd
+professionally pr@feSn@l/
+professionally pr@feS~@l/
+professionals pr@feS~@lz
+professionals' pr@feS~@lz
+professions pr@feS~z
+professor pr@fesP
+professor's pr@fesPz
+professorial prOf@s{r/@l
+professors pr@fesPz
+professors' pr@fesPz
+professorship pr@fesPSip
+profeta pr]fet@
+proffer profP
+proffered profPd
+proffering profP6N
+proffit profit
+proffitt profit
+proficiency pr@fiS~s/
+proficient profiS~t
+profile prOfIl
+profiled prOfIld
+profiles prOfIlz
+profiling prOfIl6N
+profit prof@t
+profitability prof@t@bil@t/
+profitable prof@t@b@l
+profitablity prof@t@bil@t/
+profitably prof@t@bl/
+profited prof@t@d
+profiteer prof@tir
+profiteering prof@tir6N
+profiteers prof@tirz
+profiting prof@t6N
+profits prof@ts
+profitt prof@t
+profittaking prof@ttAk6N
+profligacy pr{fl6gas/
+profligate pr{fl6gAt
+profound pr]f?nd
+profoundly pr]f?ndl/
+profs profs
+profuse pr@fyUs
+profusely pr@fyUsl/
+profusion pr@fyUZ~
+progenitor pr]jen@tP
+progeny proj~/
+progesterone pr]jestPOn
+progestin pr]jestin
+proglacial pr]glAS@l
+prognoses prognOs/z
+prognosis prognOs@s
+prognosticate prognost@kAt
+prognosticated prognost@kAt@d
+prognosticater prognost@kAtP
+prognosticates prognost@kAts
+prognosticating prognost@kAt6N
+prognostication prognost@kAS~
+prognostications prognost@kAS~z
+prognosticative prognost@kAt6v
+program prOgram
+program's prOgramz
+programing prOgram6N
+programmable prOgram@b@l
+programmatic progr}at6k
+programme prOgram
+programmed prOgramd
+programmer prOgramP
+programmers prOgramPz
+programming prOgram6N
+programs prOgramz
+programs' prOgramz
+progress pr@gres
+progress pr]gres
+progress progres
+progressed pr@grest
+progresses pr]gres@z
+progresses progres@z
+progressing pr@gres6N
+progression pr@greS~
+progressive pr@gres6v
+progressively progres6vl/
+progressives progres6vz
+progressivity progrcsiv@t/
+prohaska pr@hosk@
+prohibit pr]hib@t
+prohibited pr]hib@t@d
+prohibiting pr]hib@t6N
+prohibition prO@biS~
+prohibition's prO@biS~z
+prohibitions prO@biS~z
+prohibitive pr]hib@t6v
+prohibitively pr]hib@t6vl/
+prohibitory pr]hib@t{r/
+prohibits pr]hib@ts
+proia prOy@
+proietti pr<et/
+project pr@jekt
+project projckt
+project's projcks
+project's projckts
+projected pr@jekt@d
+projectile pr@jekt@l
+projectile pr@jektIl
+projectiles pr@jekt@lz
+projectiles pr@jektIlz
+projecting pr@jekt6N
+projection pr@jekS~
+projections pr@jekS~z
+projective pr@jekt6v
+projector pr@jektP
+projectors pr@jektPz
+projects pr@jeks
+projects pr@jekts
+projects projcks
+projects projckts
+projects' pr{jcks
+projects' pr{jckts
+prokofiev prok]fEv
+prokop prOk@p
+prolactin pr]lakt~
+proler prOlP
+proletarian prOl@t,r/~
+proletariat prOl@t,r/@t
+proleukin prOlUkin
+proliferate pr]lifPAt
+proliferated pr@lifPAt@d
+proliferating pr]lifPAt6N
+proliferation prOlifPAS~
+prolific pr]lif6k
+prolifically pr]lif6kl/
+prolinea prOlin/@
+prolog pr]log
+prologue prOlog
+prolong pr@l{N
+prolonged pr@l{Nd
+prolonging pr]l{N6N
+prolongs pr@l{Nz
+prom prom
+promenade prom~Ad
+promethium pr}ET/}
+promilacidic pr]m@l@sEd6k
+prominence prom~~s
+prominences prom~~s@z
+prominent prom~~t
+prominently prom~~tl/
+promiscuity prOm@skyU@t/
+promiscuous prOm@skw@s
+promise prom@s
+promised prom@st
+promises prom@s@z
+promising prom@s6N
+promissory prom@s{r/
+promo prOmO
+promos prOmOz
+promote pr}Ot
+promoted pr}Ot@d
+promoter pr}OtP
+promoters pr}OtPz
+promotes pr}Ots
+promoting pr}Ot6N
+promotion pPmOS~
+promotion pr}OS~
+promotional pPmOS~@l
+promotional pr}OS~@l
+promotions pPmOS~z
+promotions pr}OS~z
+prompt prompt
+prompted prompt@d
+prompting prompt6N
+promptly prompl/
+promptly promptl/
+prompts promps
+prompts prompts
+proms promz
+promster promstP
+promsters promstPz
+promulgate pr]mulgAt
+promulgated prom@lgAt@d
+promulgating prom@lgAt6N
+promus prOm@s
+prone prOn
+prong pr{N
+pronged pr{Nd
+pronghorn pr{Nh{rn
+prongs pr{Nz
+pronoun prOn?n
+pronounce pr~?ns
+pronounced pr~?nst
+pronouncement pr~?nsm~t
+pronouncements pr~?nsm~ts
+pronounces pr~?ns@z
+pronouncing pr~?ns6N
+pronouns prOn?nz
+pronovost pr]nOv]st
+pronto pront]
+pronunciation pr]nuns/AS~
+pronunciation pr~uns/AS~
+pronunciations pr]nuns/AS~z
+pronunciations pr~uns/AS~z
+proof prUf
+proofed prUft
+proofing prUf6N
+proofread prUfrEd
+proofreading prUfrEd6N
+proofs prUfs
+prop prop
+propaganda prop@gand@
+propagandist prop@gand@st
+propagandistic prop@g~dist6k
+propagandists prop@gand@s
+propagandists prop@gand@ss
+propagandists prop@gand@sts
+propagandize prop@gandIz
+propagate prop@gAt
+propagated prop@gAt@d
+propagating prop@gAt6N
+propagation prop@gAS~
+propane prOpAn
+propel pr@pel
+propellant pr@pel~t
+propellants pr]pel~ts
+propelled pr@peld
+propeller pr@pelP
+propellers pr@pelPz
+propelling pr@pel6N
+propels pr@pelz
+propensities pr@pens@t/z
+propensity pr@pens@t/
+proper propP
+properly propPl/
+properties propPt/z
+properties' prOpPt/z
+property propPt/
+property's propPt/z
+propes prOps
+propfan propfan
+prophecies prof@s/z
+prophecy prof@s/
+prophesied prof@sEd
+prophesied prof@sId
+prophesies prof@sIz
+prophet prof@t
+prophetess prof@t@s
+prophetic pr@fet6k
+prophets prof@ts
+prophylactic prOf@lakt6k
+prophylactic prof@lakt6k
+propionic prOp/on6k
+propitious pr@piS@s
+proponent pr@pOn~t
+proponents pr@pOn~ts
+proportion pr@p{rS~
+proportional pr@p{rS~@l
+proportionality pr@p{rS~al@t/
+proportionally pr@p{rSn@l/
+proportionally pr@p{rS~@l/
+proportionate pr@p{rS~@t
+proportionately pr@p{rS~@tl/
+proportioned pr@p{rS~d
+proportions pr@p{rS~z
+proposal pr@pOz@l
+proposal's pr@pOz@lz
+proposals pr@pOz@lz
+propose pr@pOz
+proposed pr@pOzd
+proposes pr@pOz@z
+proposing pr@pOz6N
+proposition prop@ziS~
+propositioned prop@ziS~d
+propositions prop@ziS~z
+propound pr@p?nd
+propounded pr@p?nd@d
+propp prop
+propped propt
+propper propP
+propping prop6N
+propps props
+proprietaries pr@prI@ter/z
+proprietary pr@prI@ter/
+proprietor pr@prI@tP
+proprietor's pr@prI@tPz
+proprietors pr@prI@tPz
+proprietorship pr@prI@tPSip
+proprietorships pr@prI@tPSips
+propriety pr@prI@t/
+props props
+propst propst
+propulsion pr@pulS~
+propylene pr]p@lEn
+prorate prOrAt
+prorated prOrAt@d
+proration prOrAS~
+prorok pr{r@k
+pros prOz
+pros' prOz
+prosaic pr]zA6k
+proscar pr{skor
+prosch pr{S
+proscia prOsC@
+proscribe pr]skrIb
+proscribed pr]skrIbd
+proscribes pr]skrIbz
+proscription pr]skripS~
+prose prOz
+prosecutable pros6kyUt@b@l
+prosecute pros@kyUt
+prosecuted pros6kyUt@d
+prosecutes pros6kyUts
+prosecuting pros6kyUt6N
+prosecution pros@kyUS~
+prosecution's pros@kyUS~z
+prosecutions pros@kyUS~z
+prosecutor pros6kyUtP
+prosecutor's pros6kyUtPz
+prosecutorial pros6kyUt{r/@l
+prosecutors pros6kyUtPz
+prosecutors' pros@kyUtPz
+prosek prOsck
+proselytize pros@l@tIz
+proselytized pros@l@tIzd
+proselytizing pros@l@tIz6N
+proserpina pr]sVp~@
+proserv prOsVv
+proshare prOSer
+prosise prOsIz
+proskauer pr{sk?r
+proske prOsk
+prosody pros@d/
+prosorba pros{rb@
+prospect prospckt
+prospecting pr{spekt6N
+prospective pr@spekt6v
+prospectively pr@spekt6vl/
+prospector pr{spektP
+prospectors pr{spektPz
+prospects prospcks
+prospects prospckts
+prospectus pr@spekt@s
+prospectuses pr@spekt@s@z
+prospekt prospckt
+prosper prospP
+prospera pr]sp,r@
+prospered prospPd
+prosperi pr]sp,r/
+prospering prospP6N
+prosperity prosp,r@t/
+prosperous prospP@s
+prospers prospPz
+pross pr{s
+prosser pr{sP
+prost prost
+prostaglandin pr]stagland~
+prostaglandins pr]stagland~z
+prostate prostAt
+prostatectomy prostAtekt}/
+prostatic pr]stat6k
+prostheses prosTEs/z
+prosthesis pr{sTEs@s
+prosthesis pr{sTes@s
+prosthetic prosTet6k
+prosthetics prosTet6ks
+prostitute prost@tUt
+prostitutes prost@tUts
+prostitution prost@tUS~
+prostrate prostrAt
+prostration prostrAS~
+protagonist pr]tag~@st
+protagonists pr]tag~@s
+protagonists pr]tag~@ss
+protagonists pr]tag~@sts
+protean prOt/~
+protean pr]tE~
+protease prOt/Az
+protect pPtekt
+protect pr@tekt
+protected pPtekt@d
+protected pr@tekt@d
+protecting pPtekt6N
+protecting pr@tekt6N
+protection pPtekS~
+protection pr@tekS~
+protectionism pPtekS~iz}
+protectionism pr@tekS~iz}
+protectionist pPtekS~@st
+protectionist pr@tekS~@st
+protectionists pPtekS~@s
+protectionists pPtekS~@ss
+protectionists pPtekS~@sts
+protectionists pr@tekS~@s
+protectionists pr@tekS~@ss
+protectionists pr@tekS~@sts
+protections pPtekS~z
+protections pr@tekS~z
+protective pPtekt6v
+protective pr@tekt6v
+protectively pPtekt6vl/
+protectively pr@tekt6vl/
+protector pr@tektP
+protectorate pr@tektP@t
+protectors pr@tektPz
+protects pr@tekts
+protege prOt@ZA
+proteges prOt@ZAz
+protein prOtEn
+proteins prOtEnz
+protest pr@test
+protest prOtest
+protestant prot@st~t
+protestantism prot@st~tiz}
+protestants prot@st~ts
+protestation prOtestAS~
+protestations prOtestAS~z
+protested pr@test@d
+protested prOtest@d
+protester prOtestP
+protesters prOtestPz
+protesters' prOtestPz
+protesting pr@test6N
+protesting prOtest6N
+protestors prOtestPz
+protests pr@tes
+protests pr@tess
+protests pr@tests
+protests prOtes
+protests prOtess
+protests prOtests
+prothallus prOTal@s
+prothero proTPO
+prothorax pr]T{raks
+prothro prOTr]
+protigal prot6g@l
+protium prOt/}
+proto prOt@
+proto-stirrup prOtOstV@p
+protocol prOt@kol
+protocols prOt@kolz
+protohistory prOt]histP/
+proton prOton
+proton's prOtonz
+protons prOtonz
+prototype prOt@tIp
+prototypes prOt@tIps
+prototypical prOt@tip6k@l
+protozoa prOt@zO@
+protozoan prOt@zO~
+protozoans prOt@zO~z
+protract pr]trakt
+protracted pr]trakt@d
+protropin protr@p~
+protrude pr]trUd
+protruding pr]trUd6N
+protuberance pr@tUbP~s
+protuberance pr]tUbP~s
+protuberances pr@tUbP~s@z
+protuberances pr]tUbP~s@z
+protz prots
+protzman protsm~
+proud pr?d
+prouder pr?dP
+proudest pr?d@st
+proudfit pr?dfit
+proudfoot pr?dfqt
+proudfoot's pr?dfqts
+proudly pr?dl/
+prough pr?
+proulx pr?lks
+prouse pr?s
+proust pr?st
+proust prUst
+prout pr?t
+prouty pr?t/
+provable prUv@b@l
+provance prOv~s
+provant prOv~t
+prove prUv
+proved prUvd
+proven prUv~
+provenance prov~~s
+provence prOv~s
+provencher prov~CP
+provencio prOvens/]
+proventus prOvent@s
+provenza prOvenz@
+provenzano prOvcnzon]
+provera prOv,r@
+proverb provPb
+proverbial pr@vVb/@l
+proverbs provPbz
+proves prUvz
+provide pr@vId
+provided pr@vId@d
+providence prov@d~s
+providence's prov@d~s@z
+provideniya prOv@den@y@
+provident prov@d~t
+providential prov@denC@l
+provider pr@vIdP
+providers pr@vIdPz
+provides pr@vIdz
+providian prOvid/~
+providing pr@vId6N
+provigo prOvig]
+provigo's pr]vEg]z
+province prov~s
+province's prov~s@z
+provinces prov~s@z
+provincetown prov~st?n
+provincial pr@vinS@l
+provincialism pr@vinC@liz}
+provincially pr@vinS@l/
+provine pr]vEn/
+proving prUv6N
+provision pr@viZ~
+provisional pr@viZ~@l
+provisionally pr@viZn@l/
+provisionally pr@viZ~@l/
+provisioning pr@viZ~6N
+provisions pr@viZ~z
+proviso pr@vIz]
+provo prOv]
+provocation prov@kAS~
+provocations prov@kAS~z
+provocative pr]vok@t6v
+provocatively pr]vok@t6vl/
+provoke pr@vOk
+provoked pr@vOkt
+provokes pr@vOks
+provoking pr@vOk6N
+provost prOv]st
+provosts prOv]s
+provosts prOv]ss
+provosts prOv]sts
+provus prOv@s
+prow pr?
+prowant pr?~t
+prowell prowcl
+prowess pr?@s
+prowl pr?l
+prowler pr?lP
+prowling pr?l6N
+prows pr?z
+prowse pr?z
+proxies proks/z
+proximal proks}@l
+proximate proks}@t
+proximity proksim@t/
+proxmire proksmIr
+proxy proks/
+prozac prOzak
+pru prU
+pru's prUz
+prucapital prUkap@t@l
+prucha pruC@
+prude prUd
+pruden prUd~
+prudence prUd~s
+prudency prUd~s/
+prudent prUd~t
+prudente prud~t
+prudential prUdenC@l
+prudential prUdenS@l
+prudential's prUdenC@lz
+prudentialbache prUdenS@lbaC
+prudently prUd~tl/
+prudentrust prUd~trust
+prudery prUdP/
+prudhoe prudhO
+prudhomme prudh}
+prudish prUd6S
+prudit prUdit
+prue prU
+pruer prUP
+pruess prUs
+prueter prqtP
+pruett prUt
+pruette prUet
+prugh prU
+pruiett prU@t
+pruitt prUit
+prune prUn
+pruneau pr~O
+pruned prUnd
+pruneda prUned@
+prunedale prUndAl
+prunella prUnel@
+pruner prUnP
+prunes prUnz
+prunier prUn/P
+pruning prUn6N
+prunskiene prUnskEn
+prunty prunt/
+prurient prqr/~t
+prus prus
+prusak prUs@k
+prusha pruS@
+prusinski pr@sinsk/
+pruski prusk/
+pruss prus
+prussak prus@k
+prussia pruS@
+prussian pruS~
+prust prust
+prutzman prutsm~
+pruyn prIn
+pry prI
+pryce prIs
+pryde prId
+pryer prIP
+prying prI6N
+prynne prin
+pryor prIP
+pryor's prIPz
+przybocki pr@zbok/
+przybyl pPzib@l
+przybyla pVz@bil@
+przybylski pVz@bilsk/
+przybysz pPzib6S
+przywara pPz@v)r@
+psalm solm
+psalm som
+psalms solmz
+psalms somz
+psalter s{ltP
+psalters s{ltPz
+psarouthakis serUTokis
+psencik sens6k
+pseudo sUd]
+pseudomonas sUd}On@z
+pseudonym sUd~im
+pseudonyms sUd~imz
+pseudopodial sUd@pOd/@l
+pseudoscience sUd]sI~s
+pseudoscientific sUd]sI~tif6k
+psi sI
+psilocybin sIl@sIb~
+psoriasis sPI@s@s
+psych sIk
+psyche sIk/
+psyched sIkt
+psychedelic sIk@del6k
+psyches sIk/z
+psychiatric sIk/atr6k
+psychiatrist s@kI@tr@st
+psychiatrist's s@kI@tr@sts
+psychiatrists s@kI@tr@s
+psychiatrists s@kI@tr@ss
+psychiatrists s@kI@tr@sts
+psychiatry s6kI@tr/
+psychiatry sIkI@tr/
+psychic sIk6k
+psychical sIk6k@l
+psychics sIk6ks
+psycho sIk]
+psychoanalysis sIk]~al@s@s
+psychoanalyst sIk]an@l@st
+psychoanalytic sIk]an@lit6k
+psychobabble sIk]bab@l
+psychodynamic sIk]dInam6k
+psychogenic sIk]jen6k
+psychokinesis sIk]k~Es@s
+psychological sIk@loj6k@l
+psychologically sIk@loj6kl/
+psychologist sIkol@j@st
+psychologists sIkol@j@s
+psychologists sIkol@j@ss
+psychologists sIkol@j@sts
+psychology sIkol@j/
+psychopath sIk]paT
+psychopathic sIk@paT6k
+psychopaths sIk]paTs
+psychopathy sIkop@T/
+psychosis sIkOs@s
+psychosomatic sIkOs}at6k
+psychotherapeutic sIk]Ter@pyUt6k
+psychotherapist sIk@T,r@p@st
+psychotherapists sIk@T,r@p@s
+psychotherapists sIk@T,r@p@ss
+psychotherapists sIk@T,r@p@sts
+psychotherapy sIk]T,r@p/
+psychotic sIkot6k
+psyllium sil/}
+ptacek toCek
+ptak tak
+ptolemaic tol}A6k
+ptolemy tol}/
+ptomaine tOmAn
+ptomaines tOmAnz
+ptovsky p@t{vsk/
+pty tI
+ptyon tI{n
+pu pU
+puat pyUat
+pub pub
+pubco pubk]
+puberty pyUbPt/
+pubic pyUb6k
+public publ6k
+public's publ6ks
+public-spirit publ6kspir@t
+public-spirited publ6kspir@t@d
+public-spiritedness publ6kspir@t@dn@s
+publically publ6kl/
+publication publ6kAS~
+publication's publ6kAS~z
+publications publ6kAS~z
+publications' publ6kAS~z
+publicis p@blEsis
+publicist publ@sist
+publicists publ@sis
+publicists publ@siss
+publicists publ@sists
+publicity p@blis@t/
+publicize publ@sIz
+publicized publ@sIzd
+publicizing publ@sIz6N
+publicker publ6kP
+publicly publ6kl/
+publics publ6ks
+publish publ6S
+published publ6St
+publisher publ6SP
+publisher's publ6SPz
+publishers publ6SPz
+publishers' publ6SPz
+publishes publ6S@z
+publishing publ6S6N
+publishing's publ6S6Nz
+publishings publ6S6Nz
+publitech publitek
+publix publ6ks
+pubs pubz
+pucci pUC/
+pucciarelli pUCPel/
+puccinelli pUC/nel/
+puccini pUCEn/
+puccio pUC/]
+puchalski p@holsk/
+puche pUC
+pucillo pUCil]
+puck puk
+pucker pukP
+puckett pukct
+puckish puk6S
+pudding pqd6N
+puddings pqd6Nz
+puddle pud@l
+puddles pud@lz
+puder pyUdP
+pudgie puj/
+pudgie's puj/z
+pudgies puj/z
+pudgy puj/
+pudlo pudl]
+pudong pUd{N
+pudong pyUd{N
+pudwill p@dwil
+puebla pwAbl@
+pueblo pwebl]
+puente pUnt
+puentes pwentcs
+puerile pyUrEl
+puerto pw,rtO
+puerto p{rt@
+puerto p{rtP
+puerto-rico pw,rtOrEk]
+puerto-rico p{rt@rEk]
+puerto-rico p{rtPrEk]
+puerto_rican pw,rtOrEk~
+puerto_rican p{rt@rEk~
+puerto_rican p{rtPrEk~
+puerto_ricans pw,rtOrEk~z
+puerto_ricans p{rt@rEk~z
+puerto_ricans p{rtPrEk~z
+puett pUt
+puetz pUts
+pufahl pyUfol
+puff puf
+puffed puft
+puffenbarger puf~borgP
+puffer pufP
+puffer's pufPz
+puffery pufP/
+puffin pufin
+puffing puf6N
+puffins pufinz
+puffs pufs
+puffy puf/
+puga pyUg@
+puget pyUj@t
+puget-1 pyUj@twun
+pugh pyU
+pughs pyUz
+puglia pugl/@
+pugliese pUgl/Az/
+puglisi pUglEs/
+pugmire pugmIr
+pugnacious p@gnaS@s
+pugsley pugsl/
+pugwash pugwoS
+puhl pul
+puig pUg
+puipoe pU/pO
+puipoe pwEp]
+pujol pyUj@l
+puke pyUk
+pukes pyUks
+pulaski pyUlask/
+pulcini pUlCEn/
+puleo pUl/]
+pulford pqlfPd
+pulice pUlis
+pulido pUlEd]
+pulitzer pql@tsP
+pulkrabek pulkr@b6k
+pull pql
+pullam pql}
+pullan pql~
+pullano pUlon]
+pullara pUl)r@
+pullback pqlbak
+pullbacks pqlbaks
+pulled pqld
+pullen pql~
+puller pqlP
+pulley pql/
+pulleys pql/z
+pulliam pql/}
+pullin pqlin
+pulling pql6N
+pullins pqlinz
+pullman pqlm~
+pullman's pqlm~z
+pullout pql?t
+pullouts pql?ts
+pulls pqlz
+pullum pql}
+pulmazyme pqlm@zIm
+pulmazyme's pqlm@zImz
+pulmonary pqlm~er/
+pulmozyme pqlm]zIm
+pulos pUl]z
+pulp pulp
+pulping pulp6N
+pulpit pqlpit
+pulpits pqlpits
+pulpwood pulpwqd
+puls pqlz
+pulsar pqlsP
+pulsar's pqlsPz
+pulsating pulsAt6N
+pulse puls
+pulses puls@z
+pulsifer puls@fP
+pulsing puls6N
+pulsipher pqls@fP
+pulte pqlt/
+pultz pqlts
+pulver pqlvP
+pulverize pulvPIz
+pulverized pulvPIzd
+pulvermacher pulvPm@kP
+puma pUm@
+puma's pyUm@z
+pumice pum@s
+pumilia pUmEl/@
+puming pUm6N
+pummel pum@l
+pummeled pum@ld
+pummeling pum@l6N
+pummill pumil
+pump pump
+pumped pumpt
+pumpernickel pumpPnik@l
+pumphrey pumfr/
+pumping pump6N
+pumpkin pumpk~
+pumpkins pumpk~z
+pumps pumps
+pumsie pumz/
+pun pun
+punch punC
+punched punCt
+punches punC@z
+punching punC6N
+punchline punClIn
+punchy punC/
+punctate punktAt
+punctilious p@Nktil/@s
+punctuality puNkCUal@t/
+punctuate puNkCUAt
+punctuated puNkCUAt@d
+punctuating puNkCUAd6N
+punctuation puNkCUAS~
+puncture puNkCP
+puncture puNkSP
+punctured puNkCPd
+punctured puNkSPd
+punctures puNkCPz
+punctures puNkSPz
+puncturing puNkCP6N
+puncturing puNkSP6N
+pundit pund@t
+punditry pund@tr/
+pundits pundits
+pundt punt
+puneet pUnEt
+pung puN
+pungent punj~t
+pungently punj~tl/
+punic pyUn6k
+punish pun6S
+punishable pun6S@b@l
+punished pun6St
+punishes pun6S@z
+punishing pun6S6N
+punishment pun6Sm~t
+punishments pun6Sm~ts
+punitive pyUn@t6v
+punjab punjab
+punjab p~job
+punjab's punjabz
+punjab's p~jobz
+punk puNk
+punkin puNkin
+punks puNks
+punky puNk/
+puns punz
+punt punt
+punta pqntP
+punter puntP
+punto pUntO
+punts punts
+punxatauney puNks@ton/
+puny pyUn/
+puopolo pw]pOl]
+pup pup
+pupa pyUp@
+pupil pyUp@l
+pupils pyUp@lz
+pupo pUp]
+puppet pup@t
+puppeteer p@p@tEr
+puppeteers p@p@tErz
+puppetry pup@tr/
+puppets pup@ts
+puppies pup/z
+puppy pup/
+pups pups
+pur pV
+pura pqr@
+pura pyqr@
+purcell pPsel
+purchase pVC@s
+purchased pVC@st
+purchaser pVC@sP
+purchaser's pVC@sPz
+purchasers pVC@sPz
+purchasers' pVC@sPz
+purchases pVC@s@z
+purdham pVd}
+purdie pVd/
+purdin pVd6n
+purdom pVd}
+purdon pVd~
+purdue pPdU
+purdum pVd}
+purdy pVd/
+pure pyqr
+purebred pyqrbred
+purebreds pyqrbredz
+puree pyqrA
+purely pyqrl/
+purer pyqrP
+purest pyqr@st
+purex pyqrcks
+purgason pVg@s~
+purgatory pVg@t{r/
+purge pVj
+purged pVjd
+purges pVj@z
+purging pVj6N
+puri pqr/
+puricelli pqr/Cel/
+purification pyqr@f@kAS~
+purified pyqr@fId
+purifier pyqr@fIP
+purifiers pyqr@fIPz
+purifoy pyUr@f<
+purify pyqr@fI
+purifying pyqr@fI6N
+purim pqr/m
+purim pqr}
+purina pPEn@
+purina pyqrEn@
+purina pyqrin@
+purington pyqr6Nt~
+purinton pyUr~t~
+puris pyqr@s
+purist pyqrist
+puristic pyqrist6k
+purists pyqr@s
+purists pyqr@ss
+purists pyqr@sts
+puritan pyqr@t~
+puritanical pyqr@tan6k@l
+puritanism pyqr@t~iz}
+puritanisms pyqr@t~iz}z
+puritans pyqr@t~z
+purity pyqr@t/
+purk pVk
+purkey pVk/
+purloin pPl<n
+purloined pPl<nd
+purnell pVn@l
+purolator pyqr@lAtP
+purolator's pyqr@lAtPz
+purpa pVp@
+purple pVp@l
+purples pVp@lz
+purplish pVpl6S
+purport pPp{rt
+purport pVp{rt
+purported pPp{rt@d
+purportedly pPp{rt@dl/
+purporting pPp{rt6N
+purports pPp{rts
+purports pVp{rts
+purpose pVp@s
+purposeful pVp@sf@l
+purposefully pVp@sf@l/
+purposeless pVp@sl@s
+purposely pVp@sl/
+purposes pVp@s@z
+purr pV
+purring pV6N
+purrington pV6Nt~
+purrs pVz
+purse pVs
+pursed pVst
+pursel pVs@l
+pursell pVs@l
+purser pVsP
+purses pVs@z
+pursifull pVs@f@l
+pursley pVsl/
+pursuant pPsU~t
+pursue pPsU
+pursued pPsUd
+pursuer pPsUP
+pursuers pPsUPz
+pursues pPsUz
+pursuing pPsU6N
+pursuit pPsUt
+pursuits pPsUts
+purt pVt
+purtee pVt/
+purtell pVt@l
+purtle pVt@l
+purves pVvz
+purvey pPvA
+purveyor pPvAP
+purveyors pPvAPz
+purviance pqrvE~s
+purview pVvyU
+purvin pVvin
+purvis pVvis
+puryear pVyir
+pus pus
+pusan pUson
+pusant pyUsont
+pusateri pUsot,r/
+pusch puS
+pusey pyUz/
+push pqS
+push-up pqSup
+push-ups pqSups
+pushed pqSt
+pusher pqSP
+pushers pqSPz
+pushes pqS@z
+pushing pqS6N
+pushkin pqSkin
+pushover pqSOvP
+pushup pqSup
+pushups pqSups
+pushy pqS/
+puskar puskP
+puskarich puskP6k
+puskas pusk@z
+puss pqs
+pusses pqs@z
+pusses pus@z
+pussy pqs/
+pussycat pqs/kat
+pustejovsky p@stAovsk/
+put pqt
+put-on pqton
+put-ons pqtonz
+putative pyUt@t6v
+putco pqtk]
+putco putk]
+putdown pqtd?n
+puterbaugh pyUtVb{
+puth pUT
+puthoff puth{f
+putman putm~
+putnam putn}
+putnam's putn}z
+putney putn/
+putrid pyUtr@d
+puts pqts
+putsch pqC
+putt put
+puttable put@b@l
+putted put@d
+puttenbay put~bA
+putter putP
+putterer putPP
+puttering putP6N
+putterman putPm~
+putters putPz
+putting pqt6N
+putting put6N
+puttnam putn}
+puttnam's putn}z
+putts puts
+putty put/
+putz puts
+putzier putz/P
+puusepp pUz@p
+puza pUz@
+puzio pUz/]
+puzo pUz]
+puzzle puz@l
+puzzled puz@ld
+puzzlemaster puz@lmastP
+puzzlement puz@lm~t
+puzzler puzlP
+puzzles puz@lz
+puzzling puz@l6N
+puzzling puzl6N
+puzzo pUz]
+pyatt pI@t
+pyburn pibPn
+pye pI
+pyeatt pI@t
+pygmalion pigmAly~
+pygmies pigm/z
+pygmy pigm/
+pyka pik@
+pyke pIk
+pyland pIl~d
+pylant p/l{nt
+pyle pIl
+pyles pIlz
+pylon pIlon
+pylons pIlonz
+pylori pIl{r/
+pylos pIl]s
+pymm pim
+pyne pIn
+pynes pInz
+pyongyang py{NyaN
+pyongyang's py{NyaNz
+pyper pIpP
+pyramid pir}@d
+pyramidal pPam@d@l
+pyramids pir}@dz
+pyrena p6rEn@
+pyrenees pir@/z
+pyrenees' pir@/z
+pyrite pIrIt
+pyro pIr]
+pyron pir~
+pyrotechnic pIr]tekn6k
+pyrotechnics pIr]tekn6ks
+pyroxene pIroks/n
+pyroxene pIroksEn
+pyrrhic pir6k
+pysher piSP
+pytel pit@l
+pythia piT/@
+python pITon
+python's pITonz
+pyxis piksis
+q kyU
+q's kyUz
+q. kyU
+q.'s kyUz
+q.s kyUz
+qana kon@
+qantas kont@s
+qasr kAzP
+qasr kyUAes)r
+qatar kut)r
+qawi kow/
+qi kE
+qian jin
+qian kEon
+qiao k/?
+qiaotou C?tU
+qichen kiCin
+qin kin
+qing kiN
+qingdao CiNd?
+qingming kiNmiN
+qintex kinteks
+qiryat k6ryot
+qmax kyUmaks
+qom kom
+qu kU
+qua kwo
+quach kwoC
+quack kwak
+quackenbush kwak~bqS
+quackery kwakP/
+quacks kwaks
+quad kwod
+quade kwAd
+quadra kwadr@
+quadrant kwodr~t
+quadrennial kwodren/@l
+quadrex kwodrcks
+quadriceps kwodr@seps
+quadriplegic kwodr@plEj6k
+quadruple kwodrUp@l
+quadrupled kwodrUp@ld
+quadrupling kwodrUp@l6N
+quadrupling kwodrUpl6N
+quads kwodz
+quaglia kwagl/@
+quagmire kwagmIP
+quai kA
+quai kE
+quaid kwAd
+quail kwAl
+quails kwAlz
+quain kwAn
+quaint kwAnt
+quaintance kwAnt~s
+quaintly kwAntl/
+quake kwAk
+quake's kwAks
+quakenbush kwak~bqS
+quaker kwAkP
+quaker's kwAkPz
+quakers kwAkPz
+quakes kwAks
+quaking kwAk6N
+qual kwol
+qualcast kwolkast
+qualcomm kwolkom
+qualcomm's kwolkomz
+quale kwAl
+qualex kwolcks
+qualey kwAl/
+qualification kwol@f@kAS~
+qualifications kwol@f@kAS~z
+qualified kwol@fId
+qualifier kwol@fIP
+qualifiers kwol@fIPz
+qualifies kwol@fIz
+qualify kwol@fI
+qualifying kwol@fI6N
+qualitative kwol@tAt6v
+qualitatively kwol@tAt6vl/
+qualities kwol@t/z
+quality kwol@t/
+qualley kw{l/
+qualls kwAlz
+qualls kwolz
+qualms kwolmz
+qualms kwomz
+quam kwom
+quamme kwam
+quan kw{n
+quandaries kwondP/z
+quandary kwondP/
+quandt kw{ndt
+quanex kwoncks
+quang kw{N
+quant kwant
+quantico kwont6k]
+quantifiable kwon@fI@bcl
+quantifiable kwont@fI@bcl
+quantification kwont@f@kAS~
+quantified kwon@fId
+quantified kwont@fId
+quantify kwon@fI
+quantify kwont@fI
+quantifying kwon@fI6N
+quantifying kwont@fI6N
+quantitative kwon@tAt6v
+quantitative kwont@tAt6v
+quantitatively kwon@tAt@vl/
+quantitatively kwont@tAt@vl/
+quantities kwon@t/z
+quantities kwont@t/z
+quantity kwon@t/
+quantity kwont@t/
+quantum kwont}
+quantum kwon}
+quantum's kwont}z
+quantum's kwon}z
+quaquil kwakwil
+quaranta kwPant@
+quarante kwPontA
+quarantine kw{r~tEn
+quarantined kw{r~tEnd
+quarantined kw{r~tInd
+quarantines kw{r~tEnz
+quarantines kw{r~tInz
+quarantining kw{r~tEn6N
+quarantining kw{r~tIn6N
+quark kw)rk
+quarks kw)rks
+quarles kw{rlz
+quarnstrom kw{rnstr}
+quarre kw)r
+quarrel kw{r@l
+quarreled kw{r@ld
+quarreling kw)r@l6N
+quarrels kw{r@lz
+quarrelsome kw{r@ls}
+quarries kw{r/z
+quarry kw{r/
+quarrying kw{r/6N
+quart kw{rt
+quartararo kwortor)r]
+quarter kw{rtP
+quarter k{rtP
+quarter's kw{rtPz
+quarter's k{rtPz
+quarterback kw{rtPbak
+quarterback k{rtPbak
+quarterbacking kw{rtPbak6N
+quarterbacking k{rtPbak6N
+quarterbacks kw{rtPbaks
+quarterbacks k{rtPbaks
+quarterdeck kw{rtPdek
+quarterdeck k{rtPdek
+quarterly kw{rtPl/
+quarterly k{rtPl/
+quarterman kw{rtPm~
+quarterman k{rtPm~
+quartermaster kw{rtPmastP
+quartermaster k{rtPmastP
+quarters kw{rtPz
+quarters' kw)rtPz
+quarters's kw{rtPz
+quarters's k{rtPz
+quartet kw{rtet
+quartet's kw{rtets
+quartets kw{rtets
+quartile kw{rtil
+quarto kw{rt]
+quarts kw{rts
+quartz kw{rts
+quasar kwAzor
+quash kw{S
+quashed kw{St
+quashing kw{S6N
+quasi kwos/
+quasimodo kaz/mOd]
+quassia kwoS/@
+quast kwost
+quaternary kwotPner/
+quattlebaum kw{t@lb?m
+quattro kw{tr]
+quattrocchi kwotrOk/
+quattrochi kwotrOk/
+quattrone kwotrOn/
+quave kwAv
+quay kA
+quay kE
+quaye kA
+quaye kwA
+quayle kwAl
+quayle's kwAlz
+quayles kwAlz
+quazulu kwozUlU
+quazulu's kwozUlUz
+qubilah kUb@l@
+qubilah kwub@l@
+quddus kUdUs
+que kyU
+quealy kwEl/
+queasiness kwEz/n@s
+queasy kwEz/
+queau kwO
+quebec kw@bek
+quebec's kw@beks
+quebecker kw@bekP
+quebeckers kw@bekPz
+quebecois kwebckwo
+quebecoise kebckwo
+quebecor kwebck{r
+quebedeaux kweb@d]
+quechee kweC/
+queen kwEn
+queen's kwEnz
+queena kwEn@
+queenan kwEn~
+queener kwEnP
+queenfish kwEnfiS
+queenfish's kwEnfiS@z
+queenie kwEn/
+queens kwEnz
+queensberry kwEnzber/
+queensland kwEnzland
+queensway kwEnzwA
+queer kwir
+queerer kwirP
+queers kwirz
+quek kwek
+quell kwel
+quelled kweld
+quellette kwclet
+quelling kwel6N
+quello kwel]
+quemoy kwEm<
+quemoy kw}<
+quenby kwenb/
+quench kwenC
+quencher kwenCP
+quenchers kwenCPz
+quenching kwenC6N
+quennel kwen@l
+quenneville kwAnAvil
+quentin kwentin
+quenzer kwenzP
+querida kwcrEd@
+queried kwir/d
+queries kwir/z
+querns kwVnz
+querry kw,r/
+querulous kw,r@l@s
+query kwEr/
+ques kwes
+ques kyUz
+quesada kwAsod@
+quesenberry kwEz~bcr/
+quesinberry kwes~bcr/
+quesnel kwAsnel
+quesnell kwAsnAl
+quest kwest
+questar kwestP
+questech kwestek
+question kweS~
+question kwesC~
+question's kweS~z
+question's kwesC~z
+question-mark kwesC~m)rk
+questionable kwesC~@b@l
+questioned kwesC~d
+questioner kwesC~P
+questioners kwesC~Pz
+questioning kwesC~6N
+questionings kwesC~6Nz
+questionnaire kwesC~,r
+questionnaires kwesC~,rz
+questions kwesC~z
+questions' kwesC~z
+questran kwestran
+questrom kwestr}
+quests kwests
+queue kyU
+queues kyUz
+queuing kyU6N
+quevedo kwAvAd]
+quezada kwAzod@
+qui kwE
+quibble kwib@l
+quibbles kwib@lz
+quibbling kwib@l6N
+quibbling kwibl6N
+quiche kES
+quick kwik
+quickel kwik@l
+quicken kwik~
+quickened kwik~d
+quickening kwik~6N
+quickens kwik~z
+quicker kwikP
+quickest kwik@st
+quickie kwik/
+quickly kwikl/
+quickness kwikn@s
+quicksand kwiksand
+quicksands kwiksandz
+quicksilver kwiksilvP
+quicktime kwiktIm
+quid kwid
+quiescent kwIes~t
+quiet kwI@t
+quieted kwI@t@d
+quieter kwI@tP
+quietest kwI@t@st
+quieting kwI@t6N
+quietist kwI@t@st
+quietly kwI@tl/
+quietness kwI@tn@s
+quiets kwI@ts
+quiett kwEt
+quievoni kw6v{n/
+quigg kwig
+quiggle kwig@l
+quigley kwigl/
+quijada kw/yod@
+quijano kw/yon]
+quik kwik
+quiksilver kwiksilvP
+quilali kwilol/
+quiles kwElcs
+quilici kw/lEC/
+quill kwil
+quillan kwil~
+quillen kwil~
+quillian kwily~
+quillin kwilin
+quilling kwil6N
+quillman kw/lman
+quillon kwil~
+quilmes kwilmz
+quilt kwilt
+quilted kwilt@d
+quilter kwiltP
+quilters kwiltPz
+quilting kwilt6N
+quilts kwilts
+quilty kwilt/
+quimby kwimb/
+quin kwin
+quina kwEn@
+quina's kwEn@z
+quinby kwinb/
+quince kwins
+quincey kwins/
+quincy kwins/
+quincy's kwins/z
+quindlen kwindl~
+quindlin kwindl~
+quine kwIn
+quinine kwInIn
+quinlan kwinl~
+quinley kwinl/
+quinlin kwinlin
+quinlivan kwinl6v~
+quinn kwin
+quinn's kwinz
+quinnell kwin@l
+quinney kwin/
+quinobequin kwinOb6kwin
+quinoco kw~Ok]
+quinon kwin~
+quinones kw~Onz
+quinonez kw/nOncz
+quint kwint
+quinta kwint@
+quintal kwint@l
+quintana kw/ntan@
+quintanar kwint~P
+quintanilla kwint~il@
+quintela kw/ntAl@
+quinter kwintP
+quintero kw/nt,r]
+quinteros kw/nt,r]z
+quintessence kwintes~s
+quintessential kwint@senC@l
+quintessential kwint@senS@l
+quintessentially kwint@senC@l/
+quintessentially kwint@senS@l/
+quintet kwintet
+quintile kwintIl
+quintile kwintil
+quintin kwintin
+quintina kw/ntEn@
+quinto kwint]
+quinton kwint{n
+quints kwints
+quintuple kwintUp@l
+quintuple kwintup@l
+quintupled kwintup@ld
+quintupled kwintyUp@ld
+quintuplet kwintupl@t
+quintuplets kwintupl@ts
+quip kwip
+quipp kwip
+quipped kwipt
+quips kwips
+quiram kw{r}
+quire kwIr
+quirin kwirin
+quiring kwIr6N
+quirion kwir/~
+quirk kwVk
+quirke kwVk
+quirks kwVks
+quirky kwVk/
+quiroga kw6rOg@
+quiros kwir]z
+quiroz kwir]z
+quisenberry kwIz~bcr/
+quisling kwizl6N
+quist kwist
+quist's kwists
+quit kwit
+quite kwIt
+quito kEtO
+quito kEt]
+quito kwEt]
+quito's kEtOz
+quito's kEt]z
+quito's kwEt]z
+quits kwits
+quitter kwitP
+quitters kwitPz
+quitting kwit6N
+quiver kwivP
+quivering kwivP6N
+quixote k/hOt/
+quixotic kw6ksot6k
+quiz kwiz
+quizard kwizPd
+quizzed kwizd
+quizzes kwiz@z
+quizzical kwiz@k@l
+quizzing kwiz6N
+quo kwO
+quon kwon
+quorum kw{r}
+quorums kw{r}z
+quota kwOt@
+quotable kwOt@b@l
+quotas kwOt@z
+quotation kw]tAS~
+quotations kw]tAS~z
+quote kwOt
+quoted kwOt@d
+quotes kwOts
+quotient kwOS~t
+quoting kwOt6N
+quotron kwotr~
+quotron's kwotr~z
+qureshey kqrASA
+qureshi kqrAS/
+r )r
+r's )rz
+r. )r
+r.'s )rz
+r.s )rz
+ra ro
+raab rob
+raab's robz
+raabe rob
+raad rod
+raap rop
+raasch roS
+raatz rots
+rab rab
+rabago robog]
+rabalais rab@lA
+rabb rab
+rabbani r@ban/
+rabbani r@bon/
+rabbi rabI
+rabbinical r@bin6k@l
+rabbis rabIz
+rabbit rabit
+rabbitlike rab@tlIk
+rabbits rabits
+rabbitt rabit
+rabble rab@l
+rabe rAb
+rabel rab@l
+raben rab~
+rabenold rab~Old
+raber rAbP
+rabey rAb/
+rabi rob/
+rabid rab@d
+rabideau rab@dO
+rabies rAb/z
+rabin robEn
+rabin's robEnz
+rabine r@bEn
+rabiner r@bEnP
+rabinovich r@bin@viC
+rabinovitz r@bin@vits
+rabinowitz r@bin@wits
+rabkin rabkin
+rabobank rob]baNk
+raboin r@b<n
+rabold rab]ld
+rabon rob{n
+raborn rabPn
+rabourn r@bqrn
+raboy rab<
+rabuck rab@k
+rabuka r@bUk@
+rabun rab~
+raburn rabPn
+raby rAb/
+racal rak@l
+racamier r@kAmyP
+racamier rak}Ir
+racanelli rokonel/
+racca rak@
+raccoon rakUn
+raccoons rakUnz
+race rAs
+race's rAs@z
+raced rAst
+racehorse rAsh{rs
+racehorses rAsh{rs@z
+racemes rAsEmz
+racer rAsP
+racers rAsPz
+races rAs@z
+racetrack rAstrak
+racetracks rAstraks
+racette r@set
+raceway rAswA
+racey rAs/
+rach raC
+rachad ruSod
+rachal rak@l
+rachel rAC@l
+rachel's rAC@lz
+rachelle r@Sel
+rachels rAC@lz
+rachelvolt r@Selv{lt
+rachford raCfPd
+rachi ruS/
+rachlin raklin
+rachmaninoff rakman~{f
+racial rAS@l
+racialism rAS@liz}
+racially rAS@l/
+racicot ras6kot
+racine r@sEn
+raciness rAs/n@s
+racing rAs6N
+racing's rAs6Nz
+racioppi roCOp/
+racism rAsiz}
+racist rAs@st
+racists rAs@s
+racists rAs@ss
+racists rAs@sts
+rack rak
+racked rakt
+racker rakP
+rackers rakPz
+racket rak@t
+racketeer rak@tir
+racketeering rak@tir6N
+racketeers rak@tirz
+rackets rak@ts
+racking rak6N
+rackley rakl/
+rackliff raklif
+rackliffe raklif
+rackmil rakmil
+rackow rosk]
+racks raks
+raconteur rakontUr
+racquet rak@t
+racquetball rak@tb{l
+racquets rak@ts
+racy rAs/
+racz roC
+raczka roCk@
+raczkowski r@Ck{fsk/
+raczynski r@Cinsk/
+rad rad
+rada rod@
+radabaugh rad@b{
+radakovich r@dak@v6C
+radant rod~t
+radar rAdor
+radars rAdorz
+radatz rad@ts
+radavan rod@v~
+radbert radbPt
+radborne r@db{rn
+radbourn r@dbqrn
+radbourne r@dbqrn
+radburn radbPn
+radcliff radklif
+radcliffe radklif
+raddatz rad@ts
+radde rad
+radder radP
+radditz radits
+radebaugh rad@b{
+radecki r@dek/
+radel rad@l
+radell rodAl
+radella r@del@
+rademacher rad}@kP
+rademaker rAdmAkP
+raden rAd~
+rader rAdP
+radermacher radPm@kP
+radford radfPd
+radha rod@
+radi rod/
+radial rAd/@l
+radially rAd/@l/
+radials rAd/@lz
+radiance rAd/~s
+radiance rAdy~s
+radiant rAd/~t
+radiant rAdy~t
+radiate rAd/At
+radiated rAd/At@d
+radiates rAd/Ats
+radiating rAd/At6N
+radiation rAd/AS~
+radiation's rAd/AS~z
+radiator rAd/AtP
+radiators rAd/AtPz
+radical rad@k@l
+radicalism rad6k@liz}
+radicalization rad6k@l@zAS~
+radicalize rad@k@lIz
+radicalized rad@k@lIzd
+radically rad6kl/
+radicals rad@k@lz
+radice radis
+radich rad6k
+radick rad6k
+radin radin
+radinka r@diNk@
+radio rAd/O
+radio's rAd/Oz
+radioactive rAd/]akt6v
+radioactivity rAd/]aktiv@t/
+radioactivity rAd/]aktiv@t/
+radioed rAd/Od
+radiography rAd/ogr@f/
+radiological rAd/@loj6k@l
+radiologist rAd/ol@j@st
+radiologists rAd/ol@j@s
+radiologists rAd/ol@j@ss
+radiologists rAd/ol@j@sts
+radiology rAd/ol@j/
+radioman rAd/]man
+radios rAd/Oz
+radish rad6S
+radishes rad6S@z
+radisson rad@s~
+raditz rAdits
+radium rAd/}
+radius rAd/@s
+radke rAdk/
+radke radk/
+radko radk]
+radle rAd@l
+radler rAd@lP
+radler radlP
+radley radl/
+radliff radlif
+radloff radl{f
+radman radm~
+radmilla radmil@
+radmund radm~d
+radner radnP
+radney radn/
+radnor radnP
+rado rod]
+radolf rad]lf
+radomski r@domsk/
+radon rAdon
+rados rod]z
+radosevich r@dos6v6C
+radosh r@d{S
+radovan rodOvon
+radowski r@dOsk/
+radowski's r@dOsk/z
+radtke radk/
+radu rodU
+radwan radw~
+rady rAd/
+radziewicz roj@v6C
+radzik radz6k
+rae rA
+raeburn rAbPn
+raeder redP
+raedler redlP
+rael rAl
+raether reTP
+raetz rEts
+raf raf
+rafael rofIel
+rafale r@fAl
+rafalski r@folsk/
+rafe rAf
+rafelghem r@felg}
+raff raf
+raffa raf@
+raffaele rofIelA
+raffaelli rofoel/
+raffel raf@l
+raffensperger raf~spPgP
+rafferty rafPt/
+raffetto rofet]
+raffety raft/
+raffi raf/
+raffi's raf/z
+raffield rafEld
+raffish raf6S
+raffle raf@l
+raffles raf@lz
+raffo raf]
+rafi raf/
+rafi rof/
+rafik raf6k
+rafsanjani rafs~jon/
+raft raft
+rafted raft@d
+rafter raftP
+rafters raftPz
+raftery raftP/
+rafting raft6N
+rafts rafts
+rafuse rofUs/
+rag rag
+ragain rag~
+ragan rAg~
+ragas rog@z
+ragavan rog@von
+ragavan's rog@vonz
+rage rAj
+raged rAjd
+ragel rAg@l
+ragen rag~
+rager rAgP
+rages rAj@z
+ragged rag@d
+raggedy rag@d/
+raggio roj/]
+raghida r@gEd@
+ragin rajin
+raging rAj6N
+ragland ragl~d
+ragle rAg@l
+raglin raglin
+ragmen ragm~
+rago rog]
+ragon rog{n
+ragona rogOn@
+ragone rogOn/
+ragonese rog]nAz/
+rags ragz
+ragsdale ragzdAl
+ragtag ragtag
+ragtime ragtIm
+ragu ragU
+ragucci rogUC/
+ragunathan rogUn@Ton
+ragusa rogUs@
+ragweed ragwEd
+rah ro
+rahal r@hol
+rahe rAh/
+raheem r@hEm
+rahill rohil
+rahilly rah@l/
+rahim r@hEm
+rahl rol
+rahm ram
+rahm rom
+rahman rom~
+rahman's rom~z
+rahming rom6N
+rahn ran
+rahrig rar6g
+rahul r@hUl
+rahway rowA
+rai ro/
+raia roy@
+raible rAb@l
+raiche rAC
+raid rAd
+raided rAd@d
+raider rAdP
+raider's rAdPz
+raiders rAdPz
+raiders' rAdPz
+raiding rAd6N
+raids rAdz
+raiff rAf
+raiford rAfPd
+raikes rAks
+raiko rAk]
+rail rAl
+rail's rAlz
+railbike rAlbIk
+railbiker rAlb6kP
+railbikers rAlb6kPz
+railcar rAlkor
+railcars rAlkorz
+raile rAl
+railed rAld
+railey rAl/
+railing rAl6N
+railings rAl6Nz
+railroad rAlrOd
+railroad's rAlrOdz
+railroaded rAlrOd@d
+railroading rAlrOd6N
+railroads rAlrOdz
+railroads' rAlrOdz
+rails rAlz
+railsback rAlzbak
+railtex rAlteks
+railway rAlwA
+railway's rAlwAz
+railways rAlwAz
+raimer rAmP
+raimo rAm]
+raimond rAm~d
+raimondi r}Ond/
+raimondo rAmond]
+rain rAn
+raina rAn@
+rainbolt rAnbOlt
+rainbow rAnbO
+rainbows rAnbOz
+raincoat rAnkOt
+raincoat's rAnkOts
+raincoats rAnkOts
+raindancer rAndansP
+raindrop rAndrop
+raindrops rAndrops
+raine rAn
+rained rAnd
+rainer rAnP
+raineri r~,r/
+raines rAnz
+rainey rAn/
+rainfall rAnf{l
+rainfalls rAnf{lz
+rainford rInfPd
+rainforest rInf{r@st
+rainforests rInf{r@s
+rainforests rInf{r@ss
+rainforests rInf{r@sts
+rainger ro6NP
+rainie rAn/
+rainier rAnir
+rainiest rAn/@st
+raining rAn6N
+rainley rAnl/
+rainley's rAnl/z
+rainmaker rAnmAkP
+rainman rAnm~
+rainone rAnOn
+rains rAnz
+rainstorm rAnst{rm
+rainstorms rAnst{rmz
+rainville rAnvil
+rainwater rAnw{tP
+rainy rAn/
+raisa rAs@
+raisa roEs@
+raisanen rIs~~
+raisbeck rAzbek
+raisch rIS
+raise rAz
+raised rAzd
+raiser rAzP
+raisers rAzPz
+raises rAz@z
+raisin rAzin
+raising rAz6N
+raisins rAzinz
+raisler rAzlP
+raison rAson
+raisor rAzP
+raissa rAs@
+rait rAt
+raith rAT
+raithel rAT@l
+raitt rAt
+raj roZ
+raj roj
+rajala rojol@
+rajala royol@
+rajaratnam rojPotnom
+rajewski rIefsk/
+rajiv roZEv
+rajiv rojEv
+rajko roZk]
+rajkumar roZkUm)r
+rajneesh rojnES
+raju royU
+rak rak
+rake rAk
+raked rAkt
+raker rAkP
+rakers rAkPz
+rakes rAks
+rakestraw rAkstr{
+rakich rak6C
+raking rAk6N
+rakish rAk6S
+rakiya r@kE@
+rakocy r@kOC/
+rakoff rak{f
+rakolta r@kolt@
+rakovica r@kOv6k@
+rakow rak?
+rakowski r@k?sk/
+raleigh r{l/
+raleigh's r{l/z
+rales rAlz
+rales' rAlz
+rales's rAlz@z
+raleses r@lEs@z
+raley ral/
+ralf rolf
+rall r{l
+rallied ral/d
+rallies ral/z
+rallis ralis
+rallo ral]
+ralls r{lz
+rally ral/
+rally's ral/z
+rallying ral/6N
+ralph ralf
+ralph's ralfs
+ralphs ralfs
+ralston r{lst~
+ralston's rolst~z
+ram ram
+rama rom@
+ramada r}od@
+ramada's r}od@z
+ramadan ram@d~
+ramadan rom@don
+ramage ram6j
+ramaker romAkP
+ramala r}ol@
+ramallah r}al@
+ramallah r}ol@
+raman rAm~
+raman rom~
+ramaphosa ram@fOs@
+ramaswami rom@swom/
+ramat ramat
+ramat rom@t
+rambeau rambO
+rambeau r}bO
+ramberg rambPg
+rambert rambPt
+rambin rambin
+ramble ramb@l
+rambled ramb@ld
+rambler ramblP
+ramblers ramblPz
+rambling ramb@l6N
+rambling rambl6N
+rambo ramb]
+rambow ramb]
+rambunctious rambuNkS@s
+ramel ram@l
+ramella r}el@
+ramer rAmP
+rameriz rom,r/z
+rameses ram@sEz
+ramesh romeS
+ramesses ram@s@z
+ramesses ramsEz
+ramey ram/
+rami rom/
+ramification ram@f@kAS~
+ramifications ram@f@kAS~z
+ramify ram@fI
+ramires romircs
+ramirez r}ircz
+ramiro r}ir]
+ramlawi raml?/
+ramler ramlP
+ramlow ramlO
+ramm ram
+rammed ramd
+rammel ram@l
+rammer ramP
+ramming ram6N
+ramo rAm]
+ramon r}On
+ramona r}On@
+ramonda r}ond@
+ramone r}On
+ramos rAm]s
+ramos rom]s
+ramp ramp
+rampage rampAj
+rampaged rampAjd
+rampages rampAj@z
+rampaging ramp@j6N
+rampaging rampAj6N
+rampant ramp~t
+ramparts ramports
+rampell rampel
+rampey ramp/
+ramping ramp6N
+rampley rampl/
+ramps ramps
+rampy ramp/
+ramqvist ramkvist
+ramqvist ramkwist
+ramrod ramrod
+rams ramz
+ramsay ramsA
+ramsay ramz/
+ramsburg ramsbPg
+ramsdell ramsd@l
+ramsden ramsd~
+ramser ramzP
+ramses ramsEz
+ramseur r}sV
+ramsey ramz/
+ramsey's ramz/z
+ramseyer ramz/P
+ramshackle ramSak@l
+ramstad ramst@d
+ramstein ramstEn
+ramstein ramstIn
+ramtek ramtek
+ramtha ramT@
+ramthun ramT~
+ramu romU
+ramune ramyUn
+ramus rAm@s
+ramzi ramz/
+ran ran
+rana ran@
+ranalli r~al/
+ranallo r~al]
+rance rans
+rance's rans@z
+ranch ranC
+ranch's ranC@z
+rancher ranCP
+ranchers ranCPz
+ranches ranC@z
+ranching ranC6N
+ranchland ranCl~d
+rancho ranC]
+rancid rans@d
+ranck raNk
+ranco raNk]
+rancor raNkP
+rancorous raNkP@s
+rancorousness raNkP@sn@s
+rancourt r~k{rt
+rand rand
+rand's randz
+randa rond@
+randa's rond@z
+randal rand@l
+randall rand@l
+randazzo rondoz]
+randel rand@l
+randell randel
+rander randP
+randi rand/
+randle rand@l
+randleman rand@lm~
+randles rand@lz
+randlett randlct
+rando rond]
+randol rand@l
+randolf randOlf
+randolph randolf
+random rand}
+randomize rand}Iz
+randomized rand}Izd
+randomly rand}l/
+randomness rand}n@s
+rands randz
+randy rand/
+randy's rand/z
+ranee ranE
+raneri ron,r/
+ranes rAnz
+raney rAn/
+ranft ranft
+rang raN
+range rAnj
+ranged rAnjd
+rangel ranjel
+ranger rAnjP
+ranger's rAnjPz
+rangers rAnjPz
+rangers' rAnjPz
+ranges rAnj@z
+ranging rAnj6N
+rangoon raNgUn
+rangoon's raNgUnz
+rangy rAnj/
+ranh ran
+rani ron/
+rania ron/@
+ranieri ran/,r/
+ranieri r~/,r/
+rank raNk
+ranke raNk
+ranked raNkt
+ranker raNkP
+rankers raNkPz
+rankin raNkin
+rankine raNkIn
+ranking raNk6N
+rankings raNk6Nz
+rankins raNkinz
+rankle raNk@l
+rankled raNk@ld
+rankles raNk@lz
+rankling raNkl6N
+ranks raNks
+ranley ranl/
+rann ran
+ranney ran/
+rannow ran]
+rans ranz
+ransack ransak
+ransacked ransakt
+ransacking ransak6N
+ransbottom ransb@tom
+ransburg ranzbPg
+ransburg's ranzbPgz
+ransdell ranzdel
+ransford ransfPd
+ransier rans/P
+ransley ransl/
+ransom rans}
+ransom's rans}z
+ransome rans}
+ransoms rans}z
+ranson rans~
+ransone rans~
+rant rant
+ranta rant@
+rantala rontol@
+ranted ran@d
+ranted rant@d
+ranting rant6N
+rantoul rantUl
+rantz rants
+ranum ran}
+ranz ranz
+rao r?
+rao's r?z
+raoul roUl
+rap rap
+rapacious r@paS@s
+rapacz rop@C
+rapanelli rap~el/
+rapaport rap@p{rt
+rape rAp
+raped rApt
+raper rApP
+rapers rApPz
+rapes rAps
+rapeseed rApsEd
+raphael rofIel
+raphaela rafAl@
+raphalian r@fAl/~
+raphel raf@l
+rapid rap@d
+rapidity r@pid@t/
+rapidly rap@dl/
+rapids rap@dz
+rapier rAp/P
+raping rAp6N
+rapist rAp@st
+rapist's rAp@sts
+rapists rAp@s
+rapists rAp@ss
+rapists rAp@sts
+rapkin rapkin
+rapley rapl/
+rapoca r@pOkP
+rapoport rapop{rt
+raposa ropOs@
+raposo ropOs]
+rapoza ropOz@
+rapozo ropOz]
+rapp rap
+rappa rap@
+rappahannock rap@han@k
+rappaport rap@p{rt
+rappe rap
+rapped rapt
+rappelling r@pel6N
+rapper rapP
+rappers rapPz
+rapping rap6N
+rappold rapOld
+rappoport rap@p{rt
+rapport rap{r
+rapprochement raprOSmon
+raps raps
+rapson raps~
+rapt rapt
+raptis r@ptEs
+raptly raptl/
+raptopoulos raptop]l@s
+raptor raptP
+raptorial rapt{r/@l
+raptors raptPz
+rapture rapCP
+rapturous rapCP@s
+rapuano ropUon]
+raquel r@kel
+rara r)r@
+rardon r)rd~
+rare r,r
+rarefied r,r@fId
+rarefy r,r@fI
+rarely r,rl/
+rareness r,rn@s
+rarer r,rP
+rarest r,r@st
+rarick rar6k
+raritan r,r@t~
+rarities r,r@t/z
+rarity r,r@t/
+ras ras
+rasbury rasbcr/
+rascal rask@l
+rascals rask@lz
+rasch raS
+rasche raS
+raschke raSk
+rasco rosk]
+rascoe rask]
+rascon rask~
+rase rAz
+raser rAzP
+rasey ras/
+rash raS
+rashad ruSod
+rasheed ruSEd
+rashes raS@z
+rashid roSEd
+rashid ruSEd
+rasia ros/@
+rask rask
+raska rosk@
+raske rAsk
+raskin rask~
+raskyn rask~
+rasmin rasm~
+rasmus razm@s
+rasmuson razm@s~
+rasmussen rasm@s~
+rasmusson razm@s~
+rasnake rasn@k
+rasner rasnP
+rasnick rasn6k
+raso ros]
+rasor rAzP
+rasorite rasPIt
+rasp rasp
+raspberries razber/z
+raspberry razber/
+rasped raspt
+rasps rasps
+rasputin r@spyUt~
+rasputin's raspyUt~z
+raspy rasp/
+rast rast
+raster rastP
+rasterop rastPop
+rasterops rastPops
+rastetter rAstctP
+rastus rast@s
+rat rat
+rat-a-tat rat@tat
+rata rat@
+ratajczak rat@Cck
+ratatisement rat@tIzm~t
+ratatisements rat@tIzm~ts
+ratay ratA
+ratchet raC@t
+ratchet ratC@t
+ratcheted raC@t@d
+ratcheted ratC@t@d
+ratcheting raC@t6N
+ratchford raCfPd
+ratcliff ratklif
+ratcliffe ratklif
+rate rAt
+rate's rAts
+rated rAt@d
+rateliff ratlif
+ratepayer rAtpAP
+ratepayers rAtpAPz
+ratepayers' rAtpAPz
+rater rAtP
+raters rAtPz
+rates rAts
+rath raT
+rathbone raTbOn
+rathbun raTb~
+rathburn raTbPn
+rathburne raTbPn
+rathburne's raTbPnz
+rathe rAT
+rathel raT@l
+rather raTP
+rather ruTP
+rather's raTPz
+rathert raTPt
+rathgeber raTgebP
+rathje raTj
+rathjen raTj~
+rathke raTk
+rathman raTm~
+rathmann raTm~
+rathskeller raTskelP
+ratican rat6k~
+ratieni r@tEn/
+ratier rAtyP
+ratification rat@f@kAS~
+ratified rat@fId
+ratifies rat@fIz
+ratify rat@fI
+ratifying rat@fI6N
+rating rAt6N
+ratings rAt6Nz
+ratio rAS/O
+ration rAS~
+ration raS~
+rational raSn@l
+rational raS~@l
+rationale raS~al
+rationales raS~alz
+rationality raS~al@t/
+rationalization raS~@l@zAS~
+rationalizations raS~@l@zAS~z
+rationalize raS~@lIz
+rationalized raS~@lIzd
+rationalizing raS~@lIz6N
+rationally raSn@l/
+rationally raS~@l/
+rationed rAS~d
+rationed raS~d
+rationing rAS~6N
+rationing raSn6N
+rationing raS~6N
+rations raS~z
+ratios rAS/Oz
+ratko ratk]
+ratkovich rotk@v6C
+ratkowski r@tk{fsk/
+ratledge ratl6j
+ratley ratl/
+ratliff ratlif
+ratliffe ratlif
+ratliffe's ratlifs
+ratner ratnP
+ratners ratnPz
+raton r@tOn
+rats rats
+rattan ratan
+rattatouille rat@tU/
+ratte rat
+ratterman ratPm~
+ratterree ratPE
+rattigan rat6g~
+rattigan's rat6g~z
+rattle rat@l
+rattled rat@ld
+rattler rat@lP
+rattles rat@lz
+rattlesnake rat@lsnAk
+rattlesnakes rat@lsnAks
+rattling rat@l6N
+rattling ratl6N
+rattner ratnP
+rattray ratrA
+ratts rats
+ratty rat/
+ratu rotU
+ratz rats
+ratzinger ratsiNP
+ratzlaff ratzl@f
+rau r?
+raub r{b
+rauber r?bP
+raucci r{C/
+rauch r{C
+raucher r{CP
+raucher's r{CPz
+raucous r{k@s
+raudabaugh r{d@b{
+raudenbush r?d~bqS
+rauen r?~
+rauer r?P
+rauh r{
+raul r?l
+raul roUl
+raul r{l
+raulerson r{lPs~
+rauls roUlz
+raulston r{lst~
+raum r{m
+raun r{n
+raunchy r{nC/
+raup r{p
+raupp r{p
+rausch r?S
+rauschenberg r?S~bPg
+rauscher r?SP
+rauser r?sP
+rautenberg r?t~bPg
+rauth r{T
+rautio r?t/]
+ravage rav6j
+ravaged rav6jd
+ravages rav6j@z
+ravaging rav6j6N
+ravan rAv~
+rave rAv
+raved rAvd
+ravel r@vel
+ravel rav@l
+ravel's r@velz
+raveled rav@ld
+raveling rav@l6N
+ravelo rovel]
+raven rAv~
+ravenel rav~cl
+ravenell rav~cl
+ravenna r@ven@
+ravenous rav~@s
+ravens rAv~z
+ravenscraft rAv~zkraft
+ravenscroft rAv~zkr{ft
+ravenswood rAv~zwqd
+raver rAvP
+raves rAvz
+ravi rovE
+ravi's rovEs
+ravin ravin
+ravindran rovindr~
+ravine r@vEn
+ravines r@vEnz
+raving rAv6N
+ravioli rav/Ol/
+ravishankar rov/SoNkor
+ravishing raviS6N
+ravitch rav6C
+ravitz ravits
+raw ro
+rawalpindi raw{lpind/
+rawding r{d6N
+rawdon r{d~
+rawe r{
+rawhide r{hId
+rawl r{l
+rawles r{lz
+rawley r{l/
+rawling r{l6N
+rawlings r{l6Nz
+rawlins r{linz
+rawlinson r{lins~
+rawls r{lz
+rawness r{n@s
+rawski r{skE
+rawson r{s~
+rax raks
+raxter rakstP
+ray rA
+ray's rAz
+raya rA@
+raybon rAb~
+rayborn rAbPn
+raybould rAbOld
+raybourn rAbqrn
+raybuck rAbuk
+rayburn rAbPn
+rayburn's rAbVnz
+raychem rAkem
+raycon rAk~
+raycraft rAkraft
+raye rA
+rayed rAd
+rayfield rAfEld
+rayford rAfPd
+raygoza rAgOz@
+rayl rAl
+rayle rAl
+rayman rAm~
+raymark rAmork
+raymark's rAmorks
+rayment rAm~t
+raymer rAmP
+raymo rAm]
+raymond rAm~d
+raymonda rAmond@
+raymund rAm~d
+raymundo rAmund]
+raynard rAnPd
+rayne rAn
+rayner rAnP
+raynes rAnz
+raynet rAnet
+rayno rAn]
+raynor rAnP
+rayon rA~
+rayonier rA]nir
+rayos rA]z
+rayovac rA@vak
+rayrock rArok
+rays rAz
+rayson rAz~
+raysor rAsP
+raytech rAtek
+raytheon rAT/on
+raytheon's rAT/onz
+raz raz
+raza raz@
+razaleigh raz@lE
+raze rAz
+razed rAzd
+razing rAz6N
+razo roz]
+razor rAzP
+razor's rAzPz
+razorback rAzPbak
+razorback's rAzPbaks
+razorbacks rAzPbaks
+razors rAzPz
+razzano rotson]
+razzle raz@l
+razzmatazz razm@taz
+rb )rbE
+re rA
+re rE
+re's rAz
+rea rE
+reabsorb rE@bz{rb
+reabsorbed rE@bz{rbd
+reach rEC
+reachable rEC@b@l
+reached rECt
+reaches rEC@z
+reaching rEC6N
+reacquire r/@kwIr
+reacquired r/@kwIrd
+react r/akt
+reacted r/akt@d
+reacting r/akt6N
+reaction r/akS~
+reactionaries r/akS~er/z
+reactionary r/akS~er/
+reactions r/akS~z
+reactivate rEakt@vAt
+reactivated rEakt@vAt@d
+reactivating rEakt6vAt6N
+reactive r/akt6v
+reactivity rEaktiv@t/
+reactor r/aktP
+reactor's r/aktPz
+reactors r/aktPz
+reacts r/akts
+read rEd
+read red
+read's rEdz
+readability rEd@bil@t/
+readable rEd@b@l
+reade red
+reader rEdP
+reader's rEdPz
+readerman rEdPm~
+readers rEdPz
+readers' rEdPz
+readership rEdPSip
+readied red/d
+readier red/P
+readies red/z
+readily red@l/
+readiness red/n@s
+reading rEd6N
+reading red6N
+readinger red6NP
+readings rEd6Nz
+readings red6Nz
+readjust rE@just
+readjusted rE@just@d
+readjusting rE@just6N
+readjustment r/@justm~t
+readjustments r/@justm~ts
+readmit rE@dmit
+readmitted rE@dmit@d
+readout rEd?t
+reads rEdz
+readus red@s
+ready red/
+readying red/6N
+reaffiliation r/@fil/AS~
+reaffirm rE@fVm
+reaffirmation rEafPmAS~
+reaffirmed rE@fVmd
+reaffirming rE@fVm6N
+reaffirms rE@fVmz
+reagan rAg~
+reagan rEg~
+reagan's rAg~z
+reagan's rEg~z
+reaganesque rAg~esk
+reaganesque rEg~esk
+reaganism rAg~iz}
+reaganism rEg~iz}
+reaganite rAg~It
+reaganite rEg~It
+reaganites rAg~Its
+reaganomics rAg~om6ks
+reagans rAg~z
+reagans' rAg~z
+reagans' rEg~z
+reagen rEg~
+reagent r/Aj~t
+reagents r/Aj~ts
+reagle rEg@l
+reagor rEgP
+real rEl
+realamerica rEl},r6k@
+realcap rElkap
+reale rEl
+realestate rEl@stAt
+reali rEl/
+realign r/@lIn
+realigned r/@lInd
+realigning r/@lIn6N
+realignment r/@lInm~t
+realignments r/@lInm~ts
+realism rEliz}
+realist rElist
+realistic rE@list6k
+realistically rE@list6kl/
+realists rEl@s
+realists rEl@ss
+realists rEl@sts
+realities r/al@t/z
+reality r/al@t/
+realizable rE@lIz@b@l
+realization rEl@zAS~
+realizations rEl@zAS~z
+realize rE@lIz
+realize rElIz
+realized rE@lIzd
+realized rElIzd
+realizes rE@lIz@z
+realizes rElIz@z
+realizing rE@lIz6N
+realizing rElIz6N
+reallocate r/al@kAt
+reallocated rEal@kAt@d
+reallocating r/al@kAt6N
+reallocation r/al@kAS~
+reallowance rE@l?~s
+really rEl/
+really ril/
+realm relm
+realms relmz
+realmuto r@lmUt]
+realpolitik rElp{l@tik
+realtor rE@ltP
+realtor rEltP
+realtor's rE@ltPz
+realtor's rEltPz
+realtors rE@ltPz
+realtors rEltPz
+realty rE@lt/
+realty rElt/
+realty ril@tE
+realty's rE@lt/z
+realty's rElt/z
+ream rEm
+reamer rEmP
+reamer's rEmPz
+reamers rEmPz
+reames rEmz
+reams rEmz
+reamy rEm/
+reanalyse r/an@lIz
+reanalysed r/an@lIzd
+reanalyses r/an@lIz@z
+reanalysing r/an@lIz6N
+reaney rEn/
+reap rEp
+reaped rEpt
+reaper rEpP
+reaping rEp6N
+reappear rE@pir
+reappearance rE@pir~s
+reappeared rE@pird
+reappears rE@pirz
+reapply rE@pl/
+reappoint rE@p<nt
+reappointed rE@p<nt@d
+reappointment rE@p<ntm~t
+reapportionment rE@p{rS~m~t
+reappraisal rE@prAz@l
+reappraise rE@prAz
+reappraised r/@prAzd
+reaps rEps
+rear rir
+rearden rird~
+reardon rird~
+reared rird
+rearick rir6k
+rearing rir6N
+rearm rE)rm
+rearmament r/)rm}~t
+rearming rE)rm6N
+rearrange rEPAnj
+rearranged rEPAnjd
+rearrangement r/PAnjm~t
+rearranging rEPAnj6N
+rearrest r/Pest
+rearrested r/Pest@d
+rears rirz
+rearview rErvyU
+rearview rirvyU
+reas rEz
+rease rEs
+reaser rEsP
+reasner rEsnP
+reason rEz~
+reasonable rEzn@b@l
+reasonable rEz~@b@l
+reasonableness rEzn@buln@s
+reasonableness rEz~@buln@s
+reasonably rEz~@bl/
+reasoned rEz~d
+reasoner rEz~P
+reasoner's rEz~Pz
+reasoning rEz~6N
+reasonover rEz~OvP
+reasons rEz~z
+reasor rEsP
+reassemble rE@semb@l
+reassembled rE@semb@ld
+reassembly rE@sembl/
+reassert rE@sVt
+reasserted rE@sVt@d
+reasserting rE@sVt6N
+reassertion rE@sVS~
+reasserts rE@sVts
+reassess r/@ses
+reassessed r/@sest
+reassessing r/@ses6N
+reassessment rE@sesm~t
+reassign rE@sIn
+reassigned rE@sInd
+reassigning rE@sIn6N
+reassignment r/@sInm~t
+reassignments rE@sInm~ts
+reassume r/@sUm
+reassumed r/@sUmd
+reassurance rE@Sqr~s
+reassurances rE@Sqr~s@z
+reassure rE@Sqr
+reassured rE@Sqrd
+reassures rE@Sqrz
+reassuring rE@Sqr6N
+reassuringly r/@Sqr6Nl/
+reatta rEot@
+reattach rE@taC
+reattached rE@taCt
+reaume rUm
+reauthorization r/{TP@zAS~
+reauthorize r/{TPIz
+reauthorized r/{TPIzd
+reauthorizing r/{TPIz6N
+reaux rO
+reave rEv
+reaver rEvP
+reaver's rEvPz
+reaves rEvz
+reavis rEvis
+reawaken rE@wAk~
+reawakened rE@wAk~d
+reawakening rE@wAk~6N
+reay rA
+reba rEb@
+reback rEbak
+rebalancing r/bal~s6N
+rebar rEbor
+rebate rEbAt
+rebated rEbAt@d
+rebates rEbAts
+rebbe rEb@
+rebbe's rEb@z
+rebecca r@bek@
+rebecca's r@bek@z
+rebeck rEbck
+rebeka r@bEk@
+rebekka r@bek@
+rebel r@bel
+rebel reb@l
+rebel's reb@lz
+rebelled r@beld
+rebelling r@bel6N
+rebellion r@bely~
+rebellion's r@bely~z
+rebellions r@bely~z
+rebellious r@bely@s
+rebelliousness r@bel/@sn@s
+rebello rcbel]
+rebelo rcbel]
+rebels r@belz
+rebels reb@lz
+rebels' reb@lz
+reber rebP
+rebert rebPt
+rebholz rebh]lz
+rebid r/bid
+rebirth r/bVT
+rebirths r/bVTs
+rebman rebm~
+rebmann rebm~
+rebo rEb]
+reboard r/b{rd
+rebook r/bqk
+rebooked r/bqkt
+reborn rEb{rn
+rebound r/b?nd
+rebounded r/b?nd@d
+rebounding r/b?nd6N
+rebounds rEb?ndz
+rebroadcast r/br{dkast
+rebstock rebstok
+rebuck reb@k
+rebuff r/buf
+rebuff r@buf
+rebuffed r/buft
+rebuffed r@buft
+rebuffing r/buf6N
+rebuffs r/bufs
+rebuild r/bild
+rebuilder r/bildP
+rebuilders r/bildPz
+rebuilding r/bild6N
+rebuilds r/bildz
+rebuilt r/bilt
+rebuke r/byUk
+rebuke r@byUk
+rebuked r/byUkt
+rebuked r@byUkt
+rebukes r/byUks
+rebuking r/byUk6N
+rebus rEb@s
+rebut r/but
+rebut r@but
+rebuttal r/but@l
+rebuttal r@but@l
+rebuttals r@but@lz
+rebutted r@but@d
+rebutting r/but6N
+rebutting r@but6N
+rec rek
+recadi r6kad/
+recalcitrance r6kals@tr~s
+recalcitrant r6kals@tr~t
+recalculate r/kalky@lAt
+recalculated r/kalky@lAt@d
+recalculating r/kalky@lAt6N
+recalculation r/kalky@lAS~
+recall r6k{l
+recall rEk{l
+recalled r6k{ld
+recalling r6k{l6N
+recalls r6k{lz
+recalls rEk{lz
+recant r/kant
+recantation r/kantAS~
+recantation rek~tAS~
+recanted r/kant@d
+recanting r@kant6N
+recap r6kap
+recap rEkap
+recapitalization rEkap@t@l@zAS~
+recapitalizations r/kap@t@l@zAS~z
+recapitalize rEkap@t@lIz
+recapitalized rEkap@t@lIzd
+recapitalizing rEkap@t@lIz6N
+recapitulate rEk@piC@lAt
+recapitulates rEk@piC@lAts
+recapped r/kapt
+recapping r/kap6N
+recaps rEkaps
+recapture r/kapCP
+recaptured r/kapCPd
+recapturing r/kapCP6N
+recarey r/k,r/
+recast r/kast
+recasting r/kast6N
+recchia rek/@
+recede r@sEd
+receded r/sEd@d
+receded r@sEd@d
+recedes r/sEdz
+receding r/sEd6N
+receding r@sEd6N
+receipt r/sEt
+receipt r@sEt
+receipts r/sEts
+receipts r@sEts
+receivable r@sEv@b@l
+receivables r@sEv@b@lz
+receive r/sEv
+receive r@sEv
+received r/sEvd
+received r@sEvd
+receiver r/sEvP
+receiver r@sEvP
+receivers r/sEvPz
+receivers r@sEvPz
+receivership r/sEvPSip
+receivership r@sEvPSip
+receiverships r@sEvPSips
+receives r/sEvz
+receives r@sEvz
+receiving r/sEv6N
+receiving r@sEv6N
+recent rEs~t
+recently rEs~l/
+recently rEs~tl/
+receptacle r@sept@k@l
+receptacles r@sept6k@lz
+receptech rEseptek
+reception r/sepS~
+reception r@sepS~
+receptionist r/sepS~@st
+receptionist r@sepS~@st
+receptionists r/sepS~@s
+receptionists r/sepS~@ss
+receptionists r/sepS~@sts
+receptionists r@sepS~@s
+receptionists r@sepS~@ss
+receptionists r@sepS~@sts
+receptions r@sepS~z
+receptive r/sept6v
+receptive r@sept6v
+receptivity rEseptiv@t/
+receptor r/septP
+receptors r@septPz
+recertification rEsPt@f@kAS~
+recertified r/sVt@fId
+recertify r/sVt@fI
+recertifying r/sVt@fI6N
+recess r@ses
+recess rEscs
+recessed r@sest
+recessed rEsest
+recesses rEscs@z
+recessing rEses6N
+recession r@seS~
+recession rEseS~
+recession's rEseS~z
+recessionary r/seS~er/
+recessions r@seS~z
+recessive r@ses6v
+rech rek
+recharge r/C)rj
+rechargeable r/C)rj@b@l
+recharged r/C)rjd
+recharging r/C)rj6N
+recheck rECek
+rechecked r/Cekt
+rechristen rEkris~
+rechristened rEkris~d
+recht rekt
+recidivism r@sid6viz}
+recidivist r@sid6vist
+recidivists r@sid6vis
+recidivists r@sid6viss
+recidivists r@sid6vists
+recine rcCEn/
+recio reC/]
+recipe res@p/
+recipe's res@p/z
+recipes res@p/z
+recipient r@sip/~t
+recipient's r@sip/~ts
+recipients r@sip/~ts
+recipients' r@sip/~ts
+reciprocal r@sipr@k@l
+reciprocant r/sipr@k~t
+reciprocants r/sipr@k~ts
+reciprocate r@sipr@kAt
+reciprocated r@sipr@kAt@d
+reciprocating r@sipr@kAt6N
+reciprocity res@pros@t/
+recision r@siZ~
+recisions r@siZ~z
+recission r@siS~
+recital r@sIt@l
+recitals r@sIt@lz
+recitation res@tAS~
+recitations res@tAS~z
+recitatives res@t@tEvz
+recite r@sIt
+recited r@sIt@d
+recites r/sIts
+reciting r/sIt6N
+reck rek
+reckard rekPd
+recker rekP
+reckitt rek@t
+reckless rekl@s
+recklessly rekl@sl/
+recklessness rekl@sn@s
+reckner reknP
+reckon rek~
+reckoned rek~d
+reckoning rekn6N
+reckoning rek~6N
+reckons rek~z
+recktenwald r6ktenw@ld
+reclaim r/klAm
+reclaimed r/klAmd
+reclaimer r/klAmP
+reclaimer's r/klAmPz
+reclaiming r/klAm6N
+reclamation rekl}AS~
+reclassification r/klas@f@kAS~
+reclassified r/klas@fId
+reclassify r/klas@fI
+reclassifying r/klas@fI6N
+recliner r6klInP
+reclining r/klIn6N
+reclining r6klIn6N
+recluse r6klUs
+reclusive r/klUs6v
+reclusive r6klUs6v
+reco rEk]
+reco rek]
+recognition rek@gniS~
+recognition's rek6gniS~z
+recognizable rek@gnIz@b@l
+recognizably rek@gnIz@bl/
+recognizance r6kon@z~s
+recognize rek@gnIz
+recognized rek@gnIzd
+recognizes rek@gnIz@z
+recognizing rek@gnIz6N
+recoil r/k<l
+recoiled r/k<ld
+recoils r/k<lz
+recollect rEk@lekt
+recollect rek@lekt
+recollected rEk@lekt@d
+recollected rek@lekt@d
+recollecting rEk@lekt6N
+recollecting rek@lekt6N
+recollection rek@lekS~
+recollections rek@lekS~z
+recollects rEk@lekts
+recollects rek@lekts
+recombinant r6komb~~t
+recombine rEk}bIn
+recommend rek}end
+recommendation rek}~dAS~
+recommendations rek}~dAS~z
+recommended rek}end@d
+recommending rek}end6N
+recommends rek}endz
+recommit r6komit
+recommit rEk}it
+recommited r6komit@d
+recommited rEk}it@d
+recompense rek}pens
+recon rEk{n
+reconcile rek~sIl
+reconciled rek~sIld
+reconciles rek~sIlz
+reconciliation rek~sil/AS~
+reconciliations rek~sil/AS~z
+reconciling rek~sIl6N
+recondite rek~dIt
+recondition rEk~diS~
+reconditioned rEk~diS~d
+reconditioning rEk~diSn6N
+reconditioning rEk~diS~6N
+reconfiguration r/k~figyPAS~
+reconfigure r/k~figyP
+reconfigured r/k~figyPd
+reconfirm rEk~fVm
+reconfirmation rEkonfPmAS~
+reconfirmed rEk~fVmd
+reconnaissance r/kon@s~s
+reconnect r/k~ekt
+reconnected r/k~ekt@d
+reconnecting r/k~ekt6N
+reconnects r/k~ekts
+reconquer r/k{NkP
+reconquered r/k{NkPd
+reconsider rEk~sidP
+reconsideration r/k~sidPAS~
+reconsidered rEk~sidPd
+reconsidering rEk~sidP6N
+reconstitute r/konst@tUt
+reconstituted r/konst@tUt@d
+reconstituting r/konst@tUt6N
+reconstruct rEk~strukt
+reconstructed rEk~strukt@d
+reconstructing rEk~strukt6N
+reconstruction rEk~strukS~
+reconstructions rEk~strukS~z
+reconstructive rEk~strukt6v
+reconvene r/k~vEn
+reconvened r/k~vEnd
+reconvenes r/k~vEnz
+record r@k{rd
+record rekPd
+record's rekPdz
+recordable r6k{rd@b@l
+recorded r@k{rd@d
+recorder r/k{rdP
+recorder r6k{rdP
+recorders r/k{rdPz
+recorders r6k{rdPz
+recording r@k{rd6N
+recordings r6k{rd6Nz
+recordkeeping rekPdkEp6N
+records r@k{rdz
+records rekPdz
+records' rekPdz
+recore rck{r/
+recoton r6k{t~
+recount r6k?nt
+recount rEk?nt
+recounted r6k?n@d
+recounted r6k?nt@d
+recounted rEk?n@d
+recounted rEk?nt@d
+recounting r6k?n6N
+recounting r6k?nt6N
+recounting rEk?n6N
+recounting rEk?nt6N
+recounts r6k?nts
+recounts rEk?nts
+recoup r6kUp
+recouped r6kUpt
+recouping r6kUp6N
+recoups r6kUps
+recourse rEk{rs
+recover r6kuvP
+recoverable r6kuvP@b@l
+recovered r@kuvPd
+recoveries r6kuvP/z
+recovering r@kuvP6N
+recovering r@kuvr6N
+recovers r6kuvPz
+recovery r6kuvP/
+recovery r6kuvr/
+recovery's r6kuvP/z
+recovery's r6kuvr/z
+recreate rekr/At
+recreated rekr/At@d
+recreates rekr/Ats
+recreating rekr/At6N
+recreation rekr/AS~
+recreational rekr/AS~@l
+recriminate r6krim~At
+recrimination r6krim~AS~
+recriminations r6krim~AS~z
+recross r/kr{s
+recruit r/krUt
+recruit r@krUt
+recruit's r/krUts
+recruited r/krUt@d
+recruited r6krUt@d
+recruiter r6krUtP
+recruiters r6krUtPz
+recruiting r/krUt6N
+recruiting r@krUt6N
+recruitment r/krUtm~t
+recruitment r@krUtm~t
+recruits r/krUts
+recruits r@krUts
+rectal rekt@l
+rectangle rektaNg@l
+rectangles rektaNg@lz
+rectangular rcktaNgy@lP
+rectenwald rekt~w{ld
+rectification rekt@f@kAS~
+rectified rekt@fId
+rectifier rekt@fIP
+rectifiers rekt@fIPz
+rectify rekt@fI
+rectifying rekt@fI6N
+rectitude rekt@tUd
+rector rektP
+rectory rektP/
+rectum rekt}
+recuperate r6kUpPAt
+recuperating r/kUpPAt6N
+recuperating r6kUpPAt6N
+recuperation r6kUpPAS~
+recuperative r6kUpP@t6v
+recupero rAkUp,r]
+recur r/kV
+recur r6kV
+recurred r/kVd
+recurrence r/kV~s
+recurrence r6kV~s
+recurrent r/kV~t
+recurrent r6kV~t
+recurring r/kV6N
+recurring r6kV6N
+recusal r6kyUz@l
+recuse rikyUz
+recused r6kyUzd
+recusing rikyUz6N
+recyclable r/sIkl@b@l
+recyclables r/sIkl@b@lz
+recycle r/sIk@l
+recycled r/sIk@ld
+recycler r/sIklP
+recyclers r/sIklPz
+recycles r/sIk@lz
+recycling r/sIk@l6N
+recycling r/sIkl6N
+reczek reCck
+red red
+red-handed redhand@d
+reda rAd@
+redact r@dakt
+redacted r@dakt@d
+redactes r@dakts
+redacting r@dakt6N
+redbird redbVd
+redbook redbqk
+redbud redbud
+redburn redbVn
+redcay redkA
+redco redk]
+redcoat redkOt
+redcoats redkOts
+redd red
+reddell red@l
+redden red~
+redder redP
+reddest red@st
+reddick red6k
+reddig red6g
+reddin redin
+redding red6N
+reddinger red6NP
+reddington red6Nt~
+reddish red6S
+redditt redit
+reddoch red@k
+reddy red/
+redecorate r/dekPAt
+redecorated r/dekPAt@d
+redecorating r/dekPAt6N
+redecoration rEdckPAS~
+rededicate rEded@kAt
+rededication r/ded@kAS~
+redeem r@dEm
+redeemable r@dEm@b@l
+redeemed r@dEmd
+redeeming r@dEm6N
+redeems r@dEmz
+redefine r/d@fIn
+redefined r/d@fInd
+redefines r/d@fInz
+redefining r/d@fIn6N
+redefinition r/def~iS~
+redeker red6kP
+redel red@l
+redell red@l
+redemption r@demS~
+redemption r@dempS~
+redemptions r@demS~z
+redemptions r@dempS~z
+redemptive r@dempt6v
+redemptive r@demt6v
+redenbaugh red~b?
+redenius red/n/@s
+redeploy rEd@pl<
+redeployed rEd@pl<d
+redeploying rEd@pl<6N
+redeployment rEd@pl<m~t
+redeployments rEd@pl<m~ts
+redeposition r/dep@ziS~
+reder redP
+redesign rEd@zIn
+redesigned rEd@zInd
+redesigning rEd@zIn6N
+redevelop r/d6vel@p
+redevelopment rEd6vel@pm~t
+redfearn redfPn
+redfern redfVn
+redfield redfEld
+redfish redfiS
+redford redfPd
+redford's redfPdz
+redgrave redgrAv
+redhanded redhand@d
+redhead redhed
+redheaded redhed@d
+redheads redhedz
+redi red/
+redial r/dI@l
+redic red6k
+redick red6k
+redicker r/dikP
+redid r/did
+redifer r/d@fV
+redifer red@fP
+rediffusion r/d@fyUZ~
+rediger red6gP
+rediker red6kP
+reding rEd6N
+redinger red6NP
+redington red6Nt~
+redirect rEdPekt
+redirected rEdPekt@d
+redirecting rEdPekt6N
+redirection rEdPekS~
+rediscover r/d@skuvP
+rediscovered r/d@skuvPd
+rediscovering r/d@skuvP6N
+rediscovery r/d@skuvr/
+redish red6S
+redisplay r/d@splA
+redistribute rEd@stribyUt
+redistributed rEd@striby@t@d
+redistributed rEd@stribyUt@d
+redistributing rEd@striby@t6N
+redistributing rEd@stribyUt6N
+redistribution rEd@str@byUS~
+redistributive r/d@striby@t6v
+redistributive r/d@stribyUt6v
+redistricting r/distr6kt6N
+redken redk~
+redland redl~d
+redler redlP
+redley redl/
+redlich redl6k
+redlin redlin
+redlinger red@l6NP
+redlining redlIn6N
+redman redman
+redmann redm~
+redmon redm~
+redmond redm~d
+redmund redm~d
+redneck rednek
+rednecks redneks
+redner rednP
+redness redn@s
+rednour rcdnqr
+redo r/dU
+redoglia r@dogl/@
+redoing r/dU6N
+redondo r@dond]
+redone r/dun
+redouble r/dub@l
+redoubled r/dub@ld
+redoubling r/dub@l6N
+redoubling r/dubl6N
+redoubt r@d?t
+redoubtable r@d?t@b@l
+redound r@d?nd
+redpath redpaT
+redpoll redpOl
+redpolls redpOlz
+redraft r/draft
+redrafted r/draft@d
+redraw r/dr{
+redrawing r/dr{6N
+redrawn r/dr{n
+redress r@dres
+redress rEdrcs
+redressing r/dres6N
+reds redz
+reds' redz
+redshaw redS{
+redskin redskin
+redskins redskinz
+redskins' redskinz
+redstone redstOn
+redstone's redstOnz
+reduce r/dUs
+reduce r@dUs
+reduced r/dUst
+reduced r@dUst
+reduces r/dUs@z
+reduces r@dUs@z
+reducible r@dUs@b@l
+reducing r/dUs6N
+reducing r@dUs6N
+reduction r/dukS~
+reduction r@dukS~
+reductions r/dukS~z
+redundancies r@dund~s/z
+redundancy r@dund~s/
+redundant r@dund~t
+redus rEd@s
+redwald redw@ld
+redwine redwIn
+redwood redwqd
+redwoods redwqdz
+ree rE
+reeb rEb
+reeb's rEbz
+reebok rEbok
+reebok's rEboks
+reeboks rEboks
+reebs rEbz
+reebs' rEbz
+reece rEs
+reeche rEC
+reeck rEk
+reed rEd
+reed's rEdz
+reeder rEdP
+reeders rEdPz
+reeds rEdz
+reeducate r/ej@kAt
+reeducation r/edy@kAS~
+reeducation r/ej@kAS~
+reedy rEd/
+reef rEf
+reefs rEfs
+reeg rEg
+reeh rE
+reek rEk
+reeking rEk6N
+reeks rEks
+reel rEl
+reelect r/@lekt
+reelected r/@lekt@d
+reelecting r/@lekt6N
+reelection r/@lekS~
+reeled rEld
+reeling rEl6N
+reels rElz
+reemerge r/}Vj
+reemerged r/}Vjd
+reemergence r/}Vj~s
+reemphasize r/emf@sIz
+reemployment r/}pl<m~t
+reen rEn
+reenact r/~akt
+reenacted r/~akt@d
+reenactment r/~aktm~t
+reenactments r/~aktm~ts
+reenacts r/~akts
+reengineer r/enj~ir
+reengineering r/enj~ir6N
+reenter r/intP
+reentered r/intPd
+reentering r/intP6N
+reentry r/intr/
+reents rEnts
+reep rEp
+rees rEz
+reese rEs
+reese's rEs@z
+reeser rEsP
+reesman rEsm~
+reesor rEsP
+reestablish r/@stabl6S
+reestablished rE@stabl6St
+reestablishing r/@stabl6S6N
+reetz rEts
+reevaluate rE@valUAt
+reevaluated r/@valyUAt@d
+reevaluating r/@valyUAt6N
+reevaluation r/@valyUAS~
+reeve rEv
+reever rEvP
+reeves rEvz
+reeves' rEvz
+reeves's rEvz@z
+reexamination r/6gzam~AS~
+reexamine r/cgzam~
+reexamined r/6gzam~d
+reexamining r/6gzam~6N
+reexport r/eksp{rt
+reexports r/eksp{rts
+ref ref
+refaat r@fot
+refah r@fo
+refco refk]
+refcorp refk{rp
+refenes r@fEnz
+refenes ref~es
+refer r@fV
+referee refPE
+referee's refPEz
+referees refPEz
+reference refP~s
+reference refr~s
+referenced refP~st
+referenced refr~st
+references refP~s@z
+references refr~s@z
+referencing refP~s6N
+referencing refr~s6N
+referenda refPend@
+referendum refPend}
+referendums refPend}z
+refering r@fV6N
+referral r@fV@l
+referrals r@fV@lz
+referred r@fVd
+referring r@fV6N
+refers r@fVz
+reff ref
+reffett refct
+reffitt refit
+reffner refnP
+refile r/fIl
+refiled r/fIld
+refill r/fil
+refill rEf6l
+refilled r/fild
+refills rEfilz
+refinance rEfInans
+refinance rEf~ans
+refinanced rEfInanst
+refinanced rEf~anst
+refinances rEfInans@z
+refinances rEf~ans@z
+refinancing rEfInans6N
+refinancing rEf~ans6N
+refinancings rEfInans6Nz
+refinancings rEf~ans6Nz
+refine r@fIn
+refined r@fInd
+refinement r@fInm~t
+refinements r@fInm~ts
+refiner r@fInP
+refiner's r@fInPz
+refineries r@fInP/z
+refiners r@fInPz
+refiners' r@fInPz
+refinery r@fInP/
+refinery's r@fInP/z
+refines r@fInz
+refining r@fIn6N
+refinish r/fin6S
+refinished r/fin6St
+refinishing r/fin6S6N
+refit r/fit
+refitted r/fit@d
+refitting r/fit6N
+reflag r/flag
+reflagged r/flagd
+reflagging r/flag6N
+reflate r/flAt
+reflation r/flAS~
+reflect r@flekt
+reflected r@flekt@d
+reflecting r@flekt6N
+reflection r@flekS~
+reflections r@flekS~z
+reflective r@flekt6v
+reflectone r/flektOn
+reflectone's r/flektOnz
+reflects r@fleks
+reflects r@flekts
+reflex rEflcks
+reflexes rEflcks@z
+reflexive r@fleks6v
+reflexively r/fleks6vl/
+reflexivity rEfleksiv@t/
+refocus r/fOk@s
+refocused r/fOk@st
+refocuses r/fOk@s@z
+refocusing r/fOk@s6N
+reforest r/f{r@st
+reforestation rEf{r@stAS~
+reform r@f{rm
+reforma r@f{rm@
+reformation refPmAS~
+reformatories r@f{rm@t{r/z
+reformatory r@f{rm@t{r/
+reformed r@f{rmd
+reformer r@f{rmP
+reformers r@f{rmPz
+reformers' r@f{rmPz
+reforming r@f{rm6N
+reformist r@f{rmist
+reformists r@f{rmis
+reformists r@f{rmiss
+reformists r@f{rmists
+reforms r@f{rmz
+reformulate r/f{rmy@lAt
+reformulated r/f{rmy@lAt@d
+refractive r@frakt6v
+refractor r@fraktP
+refractories r@fraktP/z
+refractors r@fraktPz
+refractory r@fraktP/
+refrain r@frAn
+refrained r@frAnd
+refraining r@frAn6N
+refrains r@frAnz
+refresh r@freS
+refreshed r/freSt
+refresher r@freSP
+refreshes r@freS@z
+refreshing r@freS6N
+refreshingly r/freS6Nl/
+refreshment r@freSm~t
+refreshments r@freSm~ts
+refrigerant r@frijP~t
+refrigerants r@frijP~ts
+refrigerate r@frijPAt
+refrigerated r@frijPAt@d
+refrigeration r@frijPAS~
+refrigerator r@frijPAtP
+refrigerators r@frijPAtPz
+refsnes refsn/z
+refuel r/fyU@l
+refueled r/fyU@ld
+refueling r/fyU@l6N
+refueling r/fyUl6N
+refuge refyUj
+refuge's refyUj@z
+refugee refyUj/
+refugees refyUj/z
+refugees' refyUj/z
+refuges refyUj@z
+refund r@fund
+refund rEfund
+refundable r@fund@b@l
+refunded r@fund@d
+refunding r@fund6N
+refundings rEfund6Nz
+refunds r@fundz
+refunds rEfundz
+refurbish r/fVb6S
+refurbished r/fVb6St
+refurbishing r/fVb6S6N
+refurbishment r/fVb6Sm~t
+refusal r@fyUz@l
+refusals r@fyUz@lz
+refuse r@fyUz
+refuse refyUz
+refused r@fyUzd
+refusenik r@fyUzn6k
+refuseniks r@fyUzn6ks
+refuses r@fyUz@z
+refusing r@fyUz6N
+refutation refyUtAS~
+refute r@fyUt
+refuted r@fyUt@d
+refutes r@fyUts
+refuting r@fyUt6N
+reg reg
+rega rEg@
+regain r@gAn
+regained r/gAnd
+regaining r@gAn6N
+regains r/gAnz
+regal rEg@l
+regalado rAgolod]
+regaled r6gAld
+regalia r6gAly@
+regaling r6gAl6N
+regally rEg@l/
+regan rEg~
+regan's rEg~z
+regard r@g)rd
+regarded r@g)rd@d
+regarding r@g)rd6N
+regardless r@g)rdl@s
+regards r6g)rdz
+regas rEg@z
+regatta r6got@
+regattas r@got@z
+regehr reg6r
+regel reg@l
+regen reg~
+regency rEj~s/
+regency's rEj~s/z
+regenerate r/jenPAt
+regenerated r/jenPAt@d
+regenerating r/jenPAt6N
+regeneration r/jenPAS~
+regeneron r/jenP{n
+regensburg rEg~zbPg
+regensteiner reg~stInP
+regent rEj~t
+regents rEj~ts
+reger rEgP
+regester rej@stP
+reggae regA
+reggie rej/
+reggio rej/]
+reggy reg/
+regie reg/
+regier rEg/P
+regime r@ZEm
+regime rAZEm
+regime's rAZEmz
+regimen rej}~
+regimens rej}~z
+regiment rej}~t
+regimental rej}ent@l
+regimentation rej}cntAS~
+regimented rej}ent@d
+regiments rej}~ts
+regimes r@ZEmz
+regimes rAZEmz
+regina r6jEn@
+reginald rej~@ld
+reginald's rej~@ldz
+region rEj~
+region's rEj~z
+regional rEj~@l
+regionalize rEj~@lIz
+regionalized rEj~@lIzd
+regionally rEj~@l/
+regionals rEj~@lz
+regions rEj~z
+regis rEjis
+register rej@stP
+register's rej@stPz
+registered rej@stPd
+registering rej@stP6N
+registering rej@str6N
+registers rej@stPz
+registrant rej@str~t
+registrants rej@str~ts
+registrar rej@stror
+registrars rej@strorz
+registration rej@strAS~
+registrations rej@strAS~z
+registries rej@str/z
+registry rej@str/
+regner regnP
+regnery regnP/
+regnier regn/P
+rego reg]
+regress r6gres
+regress rEgrcs
+regression r@greS~
+regressions r@greS~z
+regressive r@gres6v
+regret r6gret
+regretful r6gretf@l
+regretfully r6gretf@l/
+regrets r6grets
+regrettable r6gret@b@l
+regrettably r6gret@bl/
+regretted r6gret@d
+regretting r6gret6N
+regroup r/grUp
+regrouped r/grUpt
+regrouping r/grUp6N
+regs regz
+regula rcgUl@
+regular rAgy@lP
+regular regy@lP
+regularity regy@l,r@t/
+regularly regy@lPl/
+regulars regy@lPz
+regulate regy@lAt
+regulated regy@lAt@d
+regulates regy@lAts
+regulating regy@lAt6N
+regulation regy@lAS~
+regulations regy@lAS~z
+regulative regy@lAt6v
+regulator regy@lAtP
+regulator's regy@lAtPz
+regulators regy@lAtPz
+regulators' regy@lAtPz
+regulatory regy@l@t{r/
+regwan regwon
+reh re
+reha rEh@
+rehab r/hab
+rehabilitate rE@bil@tAt
+rehabilitate rEh@bil@tAt
+rehabilitated rE@bil@tAt@d
+rehabilitated rEh@bil@tAt@d
+rehabilitating rE@bil@tAt6N
+rehabilitating rEh@bil@tAt6N
+rehabilitation rE@bil@tAS~
+rehabilitation rEh@bil@tAS~
+rehabilitations rE@bil@tAS~z
+rehabilitations rEh@bil@tAS~z
+rehabilitative rE@bil@tAt6v
+rehabilitative rEh@bil@tAt6v
+rehabilitator rEh@bil@tAtP
+rehabilitators rEh@bil@tAtPz
+rehability rE@bil@t/
+rehability rEh@bil@t/
+rehak reh@k
+rehash r/haS
+rehashing r/haS6N
+rehbein reb/n
+rehbein rebIn
+rehberg rebPg
+rehberger rebPgP
+rehder redP
+rehear r/hir
+rehearing r/hir6N
+rehearings r/hir6Nz
+rehearsal r/hVs@l
+rehearsal r@hVs@l
+rehearsals r@hVs@lz
+rehearse r/hVs
+rehearsed r/hVst
+rehearses r/hVs@z
+rehearsing r@hVs6N
+reher r,r
+rehfeld refeld
+rehfeldt refelt
+rehg rej
+rehire r/hIr
+rehired r/hIPd
+rehiring r/hIr6N
+rehkopf rek{f
+rehkopf rek{pf
+rehling rel6N
+rehm rem
+rehman rem~
+rehmann rem~
+rehmer remP
+rehn ren
+rehnquist renkwist
+rehor rehP
+rehrig r,r6g
+rehydrate r/hIdrAt
+rehydration rEhIdrAS~
+reibel rIb@l
+reiber rIbP
+reich rIk
+reich's rIks
+reichard rIkPd
+reichardt rIkort
+reichart rE6khort
+reiche rIk
+reichel rIk@l
+reichelderfer rIk@ldPfP
+reichelt rIkclt
+reichenbach rIk~bok
+reichenberg rIk~bPg
+reichenberger rIk~bPgP
+reicher rIkP
+reichert rIkPt
+reichhold rIkOld
+reichhold rIkhOld
+reichhold's rIkOldz
+reichhold's rIkhOldz
+reichl rIk@l
+reichle rIk@l
+reichler rIklP
+reichley rIkl/
+reichlin rIklin
+reichling rIk@l6N
+reichman rIkm~
+reichmann rIkm~
+reichmanns rIkm~z
+reichmuth rIkmUT
+reichow rIk]
+reichstuhl rIkstUl
+reichwein rIkwIn
+reick rEk
+reicks rIks
+reid rEd
+reid's rEdz
+reid-miller rEdmilP
+reidel rId@l
+reidenbach rId~bok
+reider rEdP
+reiders rEdPz
+reiders' rEdPz
+reidinger rId6NP
+reidt rEdt
+reidy rEd/
+reier rAP
+reierson rIPs~
+reif rEf
+reifel rIf@l
+reiff rEf
+reifschneider rIfSnIdP
+reifsnyder rIfsnIdP
+reifsteck rIfst6k
+reigel rIg@l
+reiger rIgP
+reighard rIghPd
+reigle rEg@l
+reign rAn
+reigned rAnd
+reigning rAn6N
+reignite r/6gnIt
+reignited r/6gnIt@d
+reigniting r/6gnIt6N
+reigns rAnz
+reiher rIhP
+reihl rIl
+reiki rAk/
+reil rAl
+reiland rIl~d
+reiley rAl/
+reiling rIl6N
+reilley rAl/
+reilly rIl/
+reilly's rIl/z
+reily rEl/
+reim rEm
+reiman rIm~
+reimann rIm~
+reimburse rE}bVs
+reimbursed rE}bVst
+reimbursement rE}bVsm~t
+reimbursements rE}bVsm~ts
+reimburses rE}bVs@z
+reimbursing rE}bVs6N
+reimer rImP
+reimers rImPz
+reimpose r/}pOz
+reimposed r/}pOzd
+reimposing r/}pOz6N
+reimposition r/imp@ziS~
+rein rAn
+reina rAEn@
+reinaldo rAnold]
+reinard rInPd
+reinbold rInbOld
+reinbolt rInbOlt
+reincarnate rEink)rnAt
+reincarnated rEink)rnAt@d
+reincarnation r/inkornAS~
+reincke rINk
+reincorporate r/ink{rpPAt
+reincorporating r/ink{rpPAt6N
+reincorporation r/ink{rpPAS~
+reindeer rAndir
+reindel rInd@l
+reinders rIndPz
+reindl rInd@l
+reindustrialize r/industr/olIz
+reine rAn
+reineck rInck
+reinecke rIn6k
+reined rAnd
+reineke rIn6k
+reiner rInP
+reiner's rInPz
+reiners rInPz
+reinert rInPt
+reinertsen rInPts~
+reinertson rInPts~
+reines rAnz
+reiney rAn/
+reinforce rEinf{rs
+reinforced rEinf{rst
+reinforcement rE~f{rsm~t
+reinforcements rE~f{rsm~ts
+reinforces rEinf{rs@z
+reinforcing rEinf{rs6N
+reingold rINg]ld
+reinhard rInhord
+reinhardt rInhort
+reinhart rInhort
+reinhart's rInhorts
+reinheimer rInhImP
+reinhold rInh]lt
+reinholz rInh]lz
+reinig rIn6g
+reining rAn6N
+reininger rIn6NP
+reinitz rInits
+reinke rANk
+reinking rINk6N
+reinoehl rIn]l
+reins rAnz
+reinsch rInS
+reinsdorf rInzd{rf
+reinsel rIns@l
+reinspect r/inspekt
+reinspection r/inspekS~
+reinspections r/inspekS~s
+reinstall rEinstol
+reinstalled rEinstold
+reinstalls rEinstolz
+reinstate rEinstAt
+reinstated rEinstAt@d
+reinstatement rEinstAtm~t
+reinstating rEinstAt6N
+reinstein rInstIn
+reinstitute r/inst@tUt
+reinstituted r/inst@tUt@d
+reinstituting r/inst@tUt6N
+reinsurance rEinSqr~s
+reinsure rEinSqr
+reinsured rEinSqrd
+reinsurer rEinSqrP
+reinsurers rEinSqrPz
+reintegrate r/int@grAt
+reintegrated r/int@grAt@d
+reintegration r/int@grAS~
+reinterpret rEintVpr@t
+reinterpretation r/intVpr@tAS~
+reinterpreted r/intVpr@t@d
+reinterpreting r/intVpr@t6N
+reintroduce r/intr@dUs
+reintroduced r/intr@dUst
+reintroduces r/intr@dUs@z
+reintroducing r/intr@dUs6N
+reintroduction r/intr@dukS~
+reints rInts
+reinvent r/invent
+reinvented r/invent@d
+reinventing r/invent6N
+reinvention r/invenS~
+reinvest rEinvest
+reinvested rEinvest@d
+reinvesting rEinvest6N
+reinvestment rEinvesm~t
+reinvestment rEinvestm~t
+reinvests rEinves
+reinvests rEinvess
+reinvests rEinvests
+reinvigorate rEinvigPAt
+reinvigorated rEinvigPAt@d
+reinvigorating rEinvigPAt6N
+reinvigoration r/invigPAS~
+reinvite rE~vIt
+reinvited rE~vIt@d
+reinwald rInw{ld
+reis rEz
+reisch rIS
+reischauer rIS?r
+reischman rISm~
+reisdorf rIsd{rf
+reise rEs
+reisen rIs~
+reisenauer rIs~?P
+reiser rIsP
+reisert rIsPt
+reish rE6S
+reisig rIs6g
+reising rIs6N
+reisinger rIs~jP
+reisman rIsm~
+reisner rIsnP
+reiss rIs
+reissig rIs6g
+reissman rIsm~
+reissue r/iSU
+reissued r/iSUd
+reissuing r/iSU6N
+reist rE@st
+reister rE@stP
+reiswig rIsw6g
+reisz rIS
+reit rIt
+reitan rIt~
+reitano rA/ton]
+reiten rIt~
+reiter rItP
+reiterate r/itPAt
+reiterated r/itPAt@d
+reiterates r/itPAs
+reiterating r/itPAt6N
+reiteration r/itPAS~
+reith rET
+reither rITP
+reitman rItm~
+reitmeier rItmIP
+reitmeyer rItmIP
+reits rIts
+reitsma rItsm@
+reitter rItP
+reitz rIts
+reitzel rIts@l
+reitzes rIts@z
+reitzfeld rEtsfcld
+reitzfeld rItsfcld
+reject r6jekt
+reject rEjckt
+rejected r/jekt@d
+rejected r6jekt@d
+rejecting r/jekt6N
+rejecting r6jekt6N
+rejection r/jekS~
+rejection r6jekS~
+rejectionist r/jekS~@st
+rejectionist r6jekS~@st
+rejectionists r/jekS~@sts
+rejectionists r6jekS~@sts
+rejections r/jekS~z
+rejections r6jekS~z
+rejects r6jeks
+rejects r6jekts
+rejects rEjcks
+rejects rEjckts
+rejiggering r/jigP6N
+rejoice r6j<s
+rejoiced r6j<st
+rejoicing r6j<s6N
+rejoin r/j<n
+rejoinder r/j<ndP
+rejoinder r6j<ndP
+rejoined r/j<nd
+rejoining r/j<n6N
+rejoins r/j<nz
+rejuvenate r6jUv~At
+rejuvenated r6jUv~At@d
+rejuvenates r6jUv~Ats
+rejuvenating r/jUv~At6N
+rejuvenation r6jUv~AS~
+rekenthaler rek~TolP
+rekenthaler rek~tolP
+reker rEkP
+rekindle r/kind@l
+rekindled r/kind@ld
+rekindling r/kindl6N
+relabel r/lAb@l
+relapse r/laps
+relapsed r/lapst
+relapses r/laps@z
+relapses r@laps@z
+relapsing r@laps6N
+relate r/lAt
+relate r@lAt
+related r/lAt@d
+related r/lAt@d
+related r@lAt@d
+relates r/lAts
+relates r@lAts
+relating r/lAt6N
+relating r@lAt6N
+relation r/lAS~
+relational r/lAS~@l
+relations r/lAS~z
+relationship r/lAS~Sip
+relationships r/lAS~Sips
+relative rel@t6v
+relative's rel@t6vz
+relatively rel@t6vl/
+relatives rel@t6vz
+relativism rel@t6viz}
+relativistic rel@t6vist6k
+relativity rel@tiv@t/
+relaunch r/l{nC
+relaunched r/l{nCt
+relax r/laks
+relax r@laks
+relaxation rElaksAS~
+relaxed r/lakst
+relaxed r@lakst
+relaxes r@laks@z
+relaxing r/laks6N
+relaxing r@laks6N
+relay rElA
+relayed rElAd
+relaying rElA6N
+relays rElAz
+relearn r/l,rn
+relearning r/l,rn6N
+release r/lEs
+released r/lEst
+releases r@lEs@z
+releasing r/lEs6N
+releford rel@fPd
+relegate rel@gAt
+relegated rel@gAt@d
+relegating rel@gAt6N
+relend r/lend
+relending r/lend6N
+relent r@lent
+relented r/len@d
+relented r/lent@d
+relented r@len@d
+relented r@lent@d
+relenting r@lent6N
+relentless r@lentl@s
+relentlessly r@lentl@sl/
+relevance rel@v~s
+relevancy rel@v~s/
+relevant rel@v~t
+relf relf
+relford relfPd
+reliability r/lI@bil@t/
+reliable r/lI@b@l
+reliable r@lI@b@l
+reliably r/lI@bl/
+reliably r@lI@bl/
+reliance r/lI~s
+reliance r@lI~s
+reliance's r/lI~s@z
+reliance's r@lI~s@z
+reliant r/lI~t
+reliant r@lI~t
+relic rel6k
+relics rel6ks
+relied r/lId
+relied r@lId
+relief r/lEf
+relief r@lEf
+reliefs r/lEfs
+relies r/lIz
+relies r@lIz
+relieve r/lEv
+relieve r@lEv
+relieved r/lEvd
+relieved r@lEvd
+reliever r/lEvP
+relievers r/lEvPz
+relieves r/lEvz
+relieving r/lEv6N
+relieving r@lEv6N
+reliford rel@f{rd
+religion r/lij~
+religion r@lij~
+religion's r@lij~z
+religione r@lij/On/
+religionist r/lij~ist
+religions r/lij~z
+religiosity r@lij/os@t/
+religious r/lij@s
+religious r@lij@s
+religiously r@lij@sl/
+relinquish r/liNkw6S
+relinquish r@liNkw6S
+relinquished r/liNkw6St
+relinquished r@liNkw6St
+relinquishes r@liNkw6S@z
+relinquishing r/liNkw6S6N
+relish rel6S
+relished rel6St
+relishes rel6S@z
+relishing rel6S6N
+relive r/liv
+relived r/livd
+reliving r/liv6N
+rella rel@
+reller relP
+relman relm~
+reload r/lOd
+reloadable r/lOd@b@l
+reloaded r/lOd@d
+reloads r/lOdz
+relocate r/lOkAt
+relocated r/lOkAt@d
+relocating r/lOkAt6N
+relocation r/lOkAS~
+relocations r/lOkAS~z
+relondo r@l{nd]
+reloral r/l{r@l
+relph relf
+reluctance r/lukt~s
+reluctance r@lukt~s
+reluctant r/lukt~t
+reluctant r@lukt~t
+reluctantly r@lukt~tl/
+rely r/lI
+rely r@lI
+relyea relyA
+relying r/lI6N
+rem rem
+remade r/mAd
+remain r/mAn
+remain r}An
+remainder r/mAndP
+remainder r}AndP
+remained r/mAnd
+remained r}And
+remaining r/mAn6N
+remaining r}An6N
+remains r/mAnz
+remains r}Anz
+remake rEmAk
+remakes rEmAks
+remaking rEmAk6N
+remaley rem@l/
+remaly rEm@l/
+remand rimand
+remanded rimand@d
+remanufacture rEmany@fakCP
+remanufacture rEmanyUfakCP
+remanufactured rEmany@fakCPd
+remanufactured rEmanyUfakCPd
+remark r/m)rk
+remark r})rk
+remarkable r/m)rk@b@l
+remarkable r})rk@b@l
+remarkably r/m)rk@bl/
+remarkably r})rk@bl/
+remarked r/m)rkt
+remarked r})rkt
+remarket r/m)rk@t
+remarketed r/m)rk@t@d
+remarketing r/m)rk@t6N
+remarking r})rk6N
+remarks r/m)rks
+remarks r})rks
+remarriage r/m,r6j
+remarried r/m,r/d
+remarry r/m,r/
+remarrying r/m,r/6N
+rematch rEmaC
+rembert rembPt
+rembold rembOld
+rembrandt rembrant
+rembrandt's rembrants
+rembrandts rembrants
+remco remk]
+remedial r}Ed/@l
+remediate r/mEd/@t
+remediate r/mEd/At
+remediation r}Ed/AS~
+remedied rem@d/d
+remedies rem@d/z
+remedy rem@d/
+remedying rem@d/6N
+remember r/membP
+remember r}embP
+remembered r/membPd
+remembered r}embPd
+remembering r/membP6N
+remembering r/membr6N
+remembering r}embP6N
+remembering r}embr6N
+remembers r/membPz
+remembers r}embPz
+remembrance r/membr~s
+remembrances r}embr~s@z
+remer rEmP
+remerchandise r/mVC~dIz
+remerchandised r/mVC~dIzd
+remi rem/
+remic rem6k
+remick rem6k
+remics rem6ks
+remigio rcmij/]
+remillard rem@lPd
+remind r/mInd
+reminded r/mInd@d
+reminder r/mIndP
+reminders r/mIndPz
+reminding r/mInd6N
+reminds r/mIndz
+remington rem6Nt~
+remingtons rem6Nt~z
+reminisce rem~is
+reminisced rem~ist
+reminiscence rem~is~s
+reminiscences rem~is~s@z
+reminiscent rem~is~t
+reminisces rem~is@z
+reminiscing rem~is6N
+remis rAm/z
+remiss r/mis
+remisses r/mis@z
+remission r/miS~
+remissions r/miS~z
+remit r/mit
+remittance r/mit~s
+remittances r/mit~s@z
+remitted r/mit@d
+remley reml/
+remlinger rem@l6NP
+remme rem
+remmel rem@l
+remmers remPz
+remmert remPt
+remmington rem6Nt~
+remnant remn~t
+remnants remn~ts
+remnick remn6k
+remo rem]
+remodel r/mod@l
+remodeled r/mod@ld
+remodeling r}od@l6N
+remold r/mOld
+remolded r/mOld@d
+remorse r}{rs
+remorseful r}{rsf@l
+remorseless r}{rsl@s
+remote r/mOt
+remote r}Ot
+remotely r/mOtl/
+remoteness r/mOtn@s
+remotest r}Ot@st
+remoulded r/mOld@d
+removable r}Uv@b@l
+removal r}Uv@l
+removals r}Uv@lz
+remove r/mUv
+removed r/mUvd
+remover r}UvP
+removes r/mUvz
+removing r/mUv6N
+rempac rempak
+rempe remp
+rempel remp@l
+rempfer rempfP
+remsberg remsbPg
+remsburg remsbPg
+remsen rems~
+remson rems~
+remunerate r}yUnPAt
+remuneration r}yUnPAS~
+remunerative r/myUnP@t6v
+remus rEm@s
+remy rem/
+ren ren
+rena rEn@
+renaissance ren@sons
+renaissance's ren@sons@z
+renal rEn@l
+renaldo rcnold]
+rename r/nAm
+renamed r/nAmd
+renaming r/nAm6N
+renamo rcnom]
+renard r~)rd
+renata r~ot@
+renate r~ot@
+renationalization r/naS~@l@zAS~
+renationalize r/naS~@lIz
+renato rcnot]
+renaud r~O
+renault r~O
+renault r~{lt
+renault's r~Oz
+renault's r~{lts
+renbarger renborgP
+rencen rens~
+rench renC
+rencher renCP
+renco renk]
+renda rend@
+rendall rend@l
+rende rend
+rendell rend@l
+rendell's rend@lz
+render rendP
+rendered rendPd
+rendering rendP6N
+renderings rendP6Nz
+renders rendPz
+rendezvous rond6vU
+rendina rcndEn@
+rending rend6N
+rendition rcndiS~
+renditions rcndiS~z
+rendleman rend@lm~
+rendon rend]n
+rene r~A
+reneau rcnO
+renee r~A
+renegade ren@gAd
+renegades ren@gAdz
+renegar ren6gP
+renege r~ig
+reneged r~igd
+reneging r~ig6N
+renegotiate rEn6gOS/At
+renegotiated rEn6gOS/At@d
+renegotiating rEn6gOS/At6N
+renegotiation rEn6gOS/AS~
+renegotiations rEn6gOS/AS~z
+renehan ren@han
+renew r~U
+renewable r/nU@b@l
+renewal r~U@l
+renewals r~U@lz
+renewed r/nUd
+renewed r~Ud
+renewing r~U6N
+renews r~Uz
+renfred renfPd
+renfrew renfrU
+renfro renfr]
+renfroe renfr]
+renfrow renfr?
+rengel reNg@l
+rengo reNg]
+rengo's reNg]z
+renick ren6k
+renier rEn/P
+renin rEn~
+renison ren@s~
+renita rcnEt@
+renk reNk
+renken reNk~
+renko reNk]
+renminbi rcnminb/
+renn ren
+renna ren@
+rennard rcn)rd
+renne ren
+rennels ren@lz
+renner renP
+rennert renPt
+rennet ren@t
+rennick ren6k
+rennie ren/
+renninger ren6NP
+renno ren]
+renny ren/
+reno rEn]
+reno's rEn]z
+renoir rcnw)r
+renoirs rcnw)rz
+renominate r/n{m~At
+renominated r/nom~At@d
+renomination rEnom~AS~
+renouf r~Uf
+renounce rin?ns
+renounced rin?nst
+renounces rin?ns@z
+renouncing rin?ns6N
+renovatable ren@vAt@b@l
+renovate ren@vAt
+renovated ren@vAt@d
+renovating ren@vAt6N
+renovation ren@vAS~
+renovations ren@vAS~z
+renovator ren@vAtP
+renovators ren@vAtPz
+renown r~?n
+renowned r~?nd
+renquist renkwist
+rens renz
+rensberger rensbPgP
+rensch renS
+renschler renS@lP
+renshaw renS{
+rensing rens6N
+rensselaer rens@lir
+renstrom renstr}
+rent rent
+renta rent@
+rentable rent@b@l
+rental rent@l
+rentals rent@lz
+rentas rent@z
+rented rent@d
+renter rentP
+renteria rcnt,r/@
+renters rentPz
+rentfro rentfr]
+rentfrow rentfr?
+renting rent6N
+rentmeester rentmEstP
+renton rent~
+rents rents
+rentsch renC
+rentschler renClP
+rentz rents
+renunciate r~uns/At
+renunciation r~uns/AS~
+renuzit r/nUz@t
+renwick renw6k
+reny rEn/
+renz renz
+renzi renz/
+renzulli rcnzUl/
+reo rE]
+reoccupy r/{kyUpI
+reoccur r/@kV
+reoffend r/{fend
+reoffended r/{fend@d
+reoffer r/{fP
+reoffered r/{fPd
+reoffering r/{fP6N
+reopen r/Op~
+reopened r/Op~d
+reopening r/Op~6N
+reopens r/Op~z
+reorder r/{rdP
+reordering r/{rdP6N
+reorganization rE{rg~@zAS~
+reorganizations r/{rg~@zAS~z
+reorganize r/{rg~Iz
+reorganized r/{rg~Izd
+reorganizes r/{rg~Iz@z
+reorganizing r/{rg~Iz6N
+reorient r/{r/cnt
+rep rcpr/zet@t6v
+rep rep
+rep's reps
+rep. rcpr/zet@t6v
+rep. rep
+repack r/pak
+repackage rEpak6j
+repackaged rEpak6jd
+repackages rEpak6j@z
+repackaging rEpak6j6N
+repacked r/pakt
+repaid r/pAd
+repaint r/pAnt
+repainted r/pAnt@d
+repainting r/pAnt6N
+repair r@p,r
+repairable r@p,r@b@l
+repaired r/p,rd
+repaired r@p,rd
+repairing r/p,r6N
+repairing r@p,r6N
+repairman r/p,rman
+repairman r@p,rman
+repairmen r@p,rmen
+repairs r/p,rz
+repairs r@p,rz
+repap rEpap
+reparation repPAS~
+reparations repPAS~z
+repartee repPtE
+repasky r@posk/
+repass r/pas
+repatriate r/pAtr/At
+repatriated r/pAtr/At@d
+repatriating r/pAtr/At6N
+repatriation r/pAtr/AS~
+repay r/pA
+repayable r/pA@b@l
+repaying r/pA6N
+repayment r/pAm~t
+repayments r/pAm~ts
+repays rEpAz
+repeal r/pEl
+repeal r@pEl
+repealed r/pEld
+repealed r@pEld
+repealing r/pEl6N
+repeals r/pElz
+repeat r/pEt
+repeat r@pEt
+repeatable r@pEt@b@l
+repeated r/pEt@d
+repeated r@pEt@d
+repeatedly r@pEt@dl/
+repeater r@pEtP
+repeaters r@pEtPz
+repeating r/pEt6N
+repeating r@pEt6N
+repeats r/pEts
+repeats r@pEts
+repel r@pel
+repelled r@peld
+repellent r@pel~t
+repelling r@pel6N
+repels r@pelz
+repent r@pent
+repentance r@pent~s
+repentant r@pent~t
+repented r@pent@d
+repercussion rEpPkuS~
+repercussion rEpr@kuS~
+repercussions rEpPkuS~z
+repercussions rEpr@kuS~z
+reperfusion repPfyUZ~
+repertoire repPtwor
+repertory repPt{r/
+repetition rep@tiS~
+repetitions rep@tiS~z
+repetitious rep@tiS@s
+repetitive r@pet@t6v
+repetti rcpet/
+repetto rcpet]
+reph ref
+rephrase r/frAz
+repinski r@pinsk/
+repka repk@
+repko repk]
+replace PplAs
+replace rEplAs
+replaceable rEplAs@b@l
+replaced rEplAst
+replacement r@plAsm~t
+replacements r/plAsm~ts
+replaces r@plAs@z
+replacing r@plAs6N
+replant r/plant
+replanted r/plant@d
+replanting r/plant6N
+replay r/plA
+replayed r/plAd
+replaying r/plA6N
+replays r/plAz
+replenish r/plen6S
+replenished r/plen6St
+replenishing r/plen6S6N
+replenishment r@plen6Sm~t
+replete r/plEt
+replica repl6k@
+replicas repl@k@z
+replicase repl6kAz
+replicate repl@kAt
+replicated repl6kAt@d
+replicates repl6kAts
+replicating repl6kAt6N
+replication repl@kAS~
+replied r/plId
+replied r@plId
+replies r/plIz
+replies r@plIz
+repligen riplIj~
+repligen's riplIj~z
+replogle repl]g@l
+reply r/plI
+reply r@plI
+replying r/plI6N
+replying r@plI6N
+repo rEp]
+reponse r@pons
+report r/p{rt
+report r@p{rt
+report's r/p{rts
+report's r@p{rts
+reportable r@p{rt@b@l
+reportage r@p{rt6j
+reported r@p{rt@d
+reported rEp{rt@d
+reportedly r/p{rt@dl/
+reportedly r@p{rt@dl/
+reporter r@p{rtP
+reporter's r@p{rtPz
+reporters r@p{rtPz
+reporters' r@p{rtPz
+reporting r/p{rt6N
+reporting r@p{rt6N
+reportorial repPt{r/@l
+reports r/p{rts
+reports r@p{rts
+reports' r/p{rts
+reports' r@p{rts
+repos rEpOz
+reposa rcpOs@
+repose r/pOz
+reposition rEp@ziS~
+repositioned rEp@ziS~d
+repositioning rEp@ziS~6N
+repositories r/poz@t{r/z
+repository r/poz@t{r/
+repossess rEp@zes
+repossessed rEp@zest
+repossession rEp@zeS~
+repossessions rEp@zeS~z
+repp rep
+reppert repPt
+reppond rep~d
+reppucci rcpUC/
+reprehensible repr@hens@b@l
+represent repr@zent
+representation repr@zcntAS~
+representational repr@z~tAS~@l
+representations repr@z~tAS~z
+representative repr@zen@t6v
+representative repr@zent@t6v
+representative's repr@zen@t6vz
+representative's repr@zent@t6vz
+representatives repr@zen@t6vz
+representatives repr@zent@t6vz
+representatives' repr@sen@t6vz
+representatives' repr@sent@t6vz
+represented repr@zen@d
+represented repr@zent@d
+representing repr@zen6N
+representing repr@zent6N
+represents repr@zents
+repress r/pres
+repressed r/prest
+repressing r/pres6N
+repression r/preS~
+repressions r/preS~z
+repressive r/pres6v
+reprice r/prIs
+repriced r/prIst
+repricing r/prIs6N
+reprieve r/prEv
+reprimand repr}and
+reprimanded repr}and@d
+reprimands repr}andz
+reprint r/print
+reprinted r/print@d
+reprinting r/print6N
+reprints r/prints
+reprisal r/prIz@l
+reprisals r/prIz@lz
+reprisals r@prIz@lz
+reprise r@prEz
+reprise r@prIz
+reproach r/prOC
+reprobate repr{bAt
+reprocess r/pr{scs
+reprocessed r/pr{scst
+reprocessing r/pr{scs6N
+reproduce rEpr@dUs
+reproduced rEpr@dUst
+reproduces rEpr@dUs@z
+reproducing rEpr@dUs6N
+reproduction rEpr@dukS~
+reproductions rEpr@dukS~z
+reproductive rEpr@dukt6v
+reprogram r/prOgram
+reprogrammed r/prOgramd
+reprogramming r/prOgram6N
+reprograms r/prOgramz
+reprograph repr]graf
+reprographic repr]graf6k
+reprographics repr]graf6ks
+reps reps
+repsher repSP
+repsol repsol
+reptile reptIl
+reptiles reptIlz
+republic r/publ@k
+republic's r/publ6ks
+republican r/publ@k~
+republican r@publ6k~
+republican's r/publ6k~z
+republicanism r@publ6k~iz}
+republicans r/publ@k~z
+republicans r@publ6k~z
+republicans' r/publ6k~z
+republicans' r@publ6k~z
+republicbank r/publ6kbaNk
+republicbank's r/publ6kbaNks
+republics r/publ6ks
+repudiate r/pyUd/At
+repudiated r/pyUd/At@d
+repudiates r/pyUd/Ats
+repudiating r/pyUd/At6N
+repudiation r@pyUd/AS~
+repugnant r/pugn~t
+repugnant r@pugn~t
+repulse r/puls
+repulsed r/pulst
+repulsing r/puls6N
+repulsive r/puls6v
+repurchase r/pVC@s
+repurchased r/pVC@st
+repurchases r/pVC@s@z
+repurchasing r/pVC@s6N
+reputable repy@t@b@l
+reputation repy@tAS~
+reputations repy@tAS~z
+repute r/pyUt
+reputed r/pyUt@d
+reputed r@pyUt@d
+reputedly r@pyUt@dl/
+requa rAkw@
+requalify rEkwol@fI
+request r/kwest
+request r6kwest
+requested r/kwest@d
+requested r6kwest@d
+requester r6kwestP
+requesting r/kwest6N
+requesting r6kwest6N
+requests r/kwes
+requests r/kwess
+requests r/kwests
+requests r6kwes
+requests r6kwess
+requests r6kwests
+requiem rekw/}
+require r/kwIr
+require r6kwIP
+require rEkwIP
+required r/kwIPd
+required r/kwIrd
+requirement r6kwIrm~t
+requirements r6kwIrm~ts
+requires r/kwIPz
+requires r/kwIrz
+requiring r/kwIP6N
+requiring r/kwIr6N
+requisite rekw@z@t
+requisites rekw@z@ts
+requisition rekw@ziS~
+requisitioned rekw@ziS~d
+reread rErEd
+rereading rErEd6N
+reregulate r/regy@lAt
+reregulation r/rcgy@lAS~
+reroute r/r?t
+reroute r/rUt
+rerouted r/r?t@d
+rerouted r/rUt@d
+rerouting r/r?t6N
+rerouting r/rUt6N
+rerun rErun
+rerunning rErun6N
+reruns rErunz
+res rAz
+resale rEsAl
+resales rEsAlz
+resch reS
+reschedule r/skejUl
+rescheduled r/skejUld
+rescheduling r/skejUl6N
+reschedulings r/SkejUl6Nz
+reschke reSk
+rescigno rcsCEgn]
+rescind r/sind
+rescind r@sind
+rescinded r/sind@d
+rescinded r@sind@d
+rescinding r@sind6N
+rescission r@siZ~
+rescissions r@siZ~z
+rescue reskyU
+rescued reskyUd
+rescuer reskyUP
+rescuers reskyUPz
+rescues reskyUz
+rescuing reskyU6N
+resdel rezdel
+reseachers r/sECPz
+reseal r/sEl
+resealable r/sEl@b@l
+resealed r/sEld
+reseals r/sElz
+research r/sVC
+research rEsPC
+research's r/sVC@z
+researched r/sVCt
+researcher rEsPCP
+researchers rEsPCPz
+researchers' rEsPCPz
+researches r/sVC@z
+researching r/sVC6N
+reseda rcsAd@
+reseed r/sEd
+resell r/sel
+reseller r/selP
+resellers r/selPz
+reselling r/sel6N
+resells r/selz
+resemblance r/zembl~s
+resemblance r@zembl~s
+resemblances r/zembl~s@z
+resemble r/zemb@l
+resemble r@zemb@l
+resembled r/zemb@ld
+resembled r@zemb@ld
+resembles r/zemb@lz
+resembles r@zemb@lz
+resembling r/zemb@l6N
+resembling r/zembl6N
+resembling r@zemb@l6N
+resende risendA
+resendes rescndz
+resendez rAsAndcz
+resendiz risendiz
+resent r/zent
+resent r@zent
+resented r/zen@d
+resented r/zent@d
+resentful r@zentf@l
+resenting r/zen6N
+resenting r/zent6N
+resenting r@zen6N
+resenting r@zent6N
+resentment r@zenm~t
+resentment r@zentm~t
+resentments r@zenm~ts
+resentments r@zentm~ts
+resents r@zents
+reser rEzP
+reservation rezPvAS~
+reservationist rezPvAS~@st
+reservationists rezPvAS~@s
+reservationists rezPvAS~@ss
+reservationists rezPvAS~@sts
+reservations rezPvAS~z
+reserve r/zVv
+reserve r@zVv
+reserve's r/zVvz
+reserve's r@zVvz
+reserved r/zVvd
+reserved r@zVvd
+reserveese rezPvEs
+reserves r/zVvz
+reserves r@zVvz
+reserving r/zVv6N
+reserving r@zVv6N
+reservist r@zVv@st
+reservists r@zVv@s
+reservists r@zVv@ss
+reservists r@zVv@sts
+reservoir rez@vwor
+reservoir rezPvwor
+reservoirs rezPvworz
+reset r/set
+reset rEsct
+resetar res@tP
+reseting r/set6N
+reseting rEsct6N
+resets r/sets
+resets rEscts
+resettable r/set@b@l
+resettle r/set@l
+resettled r/set@ld
+resettlement r/set@lm~t
+resh reS
+reshape r/SAp
+reshaped r/SApt
+reshaping r/SAp6N
+reshot r/S{t
+reshuffle r/Suf@l
+reshuffled r/Suf@ld
+reshuffling r/Suf@l6N
+reshuffling r/Sufl6N
+reside r/zId
+reside r@zId
+resided r@zId@d
+residence rez@d~s
+residences rez@d~s@z
+residencies res@dens/z
+residency rez@d~s/
+resident rez@d~t
+resident's rez@d~ts
+residential rez@denC@l
+residents rez@d~ts
+residents' rez@d~ts
+resides r/zIdz
+resides r@zIdz
+residing r/zId6N
+residing r@zId6N
+residual r@zijU@l
+residuals r@zijU@lz
+residue rez@dU
+residues rez@dUz
+resign r/sIn
+resign r/zIn
+resign r@zIn
+resignation rez@gnAS~
+resignations rez@gnAS~z
+resigned r/sInd
+resigned r/zInd
+resigned r@zInd
+resignee rez6gnE
+resignees rez6gnEz
+resigning r/sIn6N
+resigning r/zIn6N
+resigning r@zIn6N
+resigns r/sInz
+resigns r/zInz
+resigns r@zInz
+resilience r@zil/~s
+resilience r@zily~s
+resiliency r@zily~s/
+resilient r@zily~t
+resin rezin
+resins rezinz
+resist r/zist
+resist r@zist
+resistance r/zist~s
+resistance r@zist~s
+resistant r/zist~t
+resistant r@zist~t
+resisted r/zist@d
+resisted r@zist@d
+resistence r@zist~s
+resisting r/zist6N
+resisting r@zist6N
+resistiveness rizistivn@s
+resistors r@zistPz
+resists r/zis
+resists r/ziss
+resists r/zists
+resists r@zis
+resists r@ziss
+resists r@zists
+reske resk
+resler rezlP
+resnais rcsnA
+resner resnP
+resnick rezn6k
+resnick's rezn6ks
+resnik resn6k
+reso rEs]
+reso rEz]
+reso ris]
+reso riz]
+reso's rEs]z
+reso's rEz]z
+reso's ris]z
+reso's riz]z
+resold r/sOld
+resolute rez@lUt
+resolutely rez@lUtl/
+resolution rez@lUS~
+resolution's rez@lUS~z
+resolutions rez@lUS~z
+resolve r/zolv
+resolved r/zolvd
+resolves r/zolvz
+resolving r/zolv6N
+resonance rez~~s
+resonant rez~~t
+resonate rez~At
+resonated rez~At@d
+resonates rez~Ats
+resonating rez~At6N
+resort r/s{rt
+resort r/z{rt
+resort r@z{rt
+resort's r@z{rts
+resorted r/s{rt@d
+resorted r/z{rt@d
+resorted r@z{rt@d
+resorting r/s{rt6N
+resorting r/z{rt6N
+resorting r@z{rt6N
+resorts r/s{rts
+resorts r/z{rts
+resorts r@z{rts
+resorts' r@z{rts
+resound rEs?nd
+resound rEz?nd
+resounding r/s?nd6N
+resoundingly r@z?nd6Nl/
+resource rEs{rs
+resourceful r/s{rsf@l
+resourcefulness r/s{rsf@ln@s
+resources rEs{rs@z
+resources' rEs{rs@z
+respeak r/spEk
+respect r/spekt
+respect r@spekt
+respectability r/spekt@bil@t/
+respectable r/spekt@b@l
+respectable r@spekt@b@l
+respectably r/spekt@bl/
+respected r/spekt@d
+respected r@spekt@d
+respectful r@spektf@l
+respectfully r@spektf@l/
+respecting r/spekt6N
+respective r/spekt6v
+respective r@spekt6v
+respectively r@spekt6vl/
+respects r/speks
+respects r/spekts
+respects r@speks
+respects r@spekts
+respess rAspcs
+respiration respPAS~
+respirator respPAtP
+respirators respPAtPz
+respiratory respP@t{r/
+respironic resPon6k
+respironics resPon6ks
+respite respit
+resplendent r/splend~t
+respond r/spond
+respond r@spond
+responded r/spond@d
+responded r@spond@d
+respondent r@spond~t
+respondents r@spond~ts
+respondents' r@spond~ts
+responder r@spondP
+responders r@spondPz
+responding r/spond6N
+responding r@spond6N
+responds r/spondz
+responds r@spondz
+response r/spons
+response r@spons
+responses r/spons@z
+responses r@spons@z
+responsibilities r/spons@bil@t/z
+responsibility r/spons@bil@t/
+responsible r/spons@b@l
+responsibly r@spons@bl/
+responsive r@spons6v
+responsiveness r@spons6vn@s
+respress resprcs
+ress res
+ressa res@
+ressa's res@z
+resseguie res6gw/
+ressel res@l
+ressler reslP
+rest rest
+restage r/stAj
+restaged r/stAjd
+restaino rcstoEn]
+restart r/st)rt
+restarted r/st)rt@d
+restarting r/st)rt6N
+restate r/stAt
+restated r/stAt@d
+restatement r/stAtm~t
+restatements r/stAtm~ts
+restates r/stAts
+restating r/stAt6N
+restaurant restPont
+restaurant restront
+restaurant's restPonts
+restaurant's restronts
+restaurants restPonts
+restaurants restronts
+restaurants' restPonts
+restaurants' restronts
+restaurateur restP@tV
+restaurateur restr@tV
+restaurateurs restP@tVz
+restaurateurs restr@tVz
+rested rest@d
+rester restP
+restful restf@l
+resting rest6N
+restitute rest@tUt
+restitution rest@tUS~
+restive rest6v
+restiveness rest6vn@s
+restivo rcstEv]
+restless restl@s
+restlessly restl@sl/
+restlessness restl@sn@s
+resto rest]
+restock r/stok
+restocked r/stokt
+restocking r/stok6N
+reston rest~
+restoration restPAS~
+restorations restPAS~z
+restorative r@st{r@t6v
+restore r@st{r
+restored r@st{rd
+restorer r@st{rP
+restores r@st{rz
+restoring r@st{r6N
+restrain r/strAn
+restrained r/strAnd
+restraining r/strAn6N
+restrains r/strAnz
+restraint r/strAnt
+restraint r@strAnt
+restraints r/strAnts
+restraints r@strAnts
+restrepo rcstrep]
+restrict r/strikt
+restricted r/strikt@d
+restricting r/strikt6N
+restriction r/strikS~
+restrictions r/strikS~z
+restrictive r/strikt6v
+restrictiveness r@strikt6vn@s
+restricts r/strikts
+restroom restrUm
+restrooms restrUmz
+restructure r/strukCP
+restructured r/strukCPd
+restructures r/strukCPz
+restructuring r/strukCP6N
+restructurings r/strukCP6Nz
+rests rests
+restyle r/stIl
+restyled r/stIld
+resubmit rEs@bmit
+resubmitted rEs@bmit@d
+resubmitting rEs@bmit6N
+result r/zult
+result r@zult
+resultant r/zult~t
+resulted r/zult@d
+resulted r@zult@d
+resulting r/zult6N
+resulting r@zult6N
+results r/zults
+results r@zults
+resume r/zUm
+resume r@zUm
+resume rez}A
+resumed r/zUmd
+resumed r@zUmd
+resumes r/zUmz
+resumes r@zUmz
+resumes rez}Az
+resuming r/zUm6N
+resuming r@zUm6N
+resumption r/zumS~
+resumption r/zumpS~
+resumption r@zumS~
+resumption r@zumpS~
+resupply r/s@plI
+resurface r/sVf@s
+resurfaced r/sVf@st
+resurfacing r/sVf@s6N
+resurgence r/sVj~s
+resurgency r/sVj~s/
+resurgency r@sVj~s/
+resurgent r/sVj~t
+resurgent r@sVj~t
+resurging r/sVj6N
+resurrect rezPekt
+resurrected rezPekt@d
+resurrecting rezPekt6N
+resurrection rezPekS~
+resuscitate r/sus@tAt
+resuscitate r@sus@tAt
+resuscitated r@sus@tAt@d
+resuscitating r@sus@tAt6N
+resuscitation r@sus@tAS~
+ret ret
+reta ret@
+retablos r/tabl]s
+retail rEtAl
+retailed rEtAld
+retailer rEtAlP
+retailer's rEtAlPz
+retailers rEtAlPz
+retailers' rEtAlPz
+retailing rEtAl6N
+retailing's rEtAl6Nz
+retails rEtAlz
+retain r/tAn
+retain r@tAn
+retained r/tAnd
+retained r@tAnd
+retainer r/tAnP
+retainer r@tAnP
+retainers r@tAnPz
+retaining r/tAn6N
+retaining r@tAn6N
+retains r/tAnz
+retains r@tAnz
+retake r/tAk
+retake rEtAk
+retaken r/tAk~
+retaking r/tAk6N
+retaliate r/tal/At
+retaliate r@tal/At
+retaliated r/tal/At@d
+retaliated r@tal/At@d
+retaliating r@tal/At6N
+retaliation r/tal/AS~
+retaliatory r/taly@t{r/
+retana rctan@
+retard r/t)rd
+retard r@t)rd
+retardant r/t)rd~t
+retardation r/tordAS~
+retarded r/t)rd@d
+retarded r@t)rd@d
+retarding r/t)rd6N
+retarding r@t)rd6N
+retards r/t)rdz
+retards r@t)rdz
+retell r/tel
+retelling r/tel6N
+retemeyer ret}Ir
+retention r/tenS~
+retest rEtest
+retested r/test@d
+retesting r/test6N
+retests rEtes
+retests rEtess
+retests rEtests
+retherford reTPfPd
+rethink r/TiNk
+rethinking r/TiNk6N
+rethought r/T{t
+reticence ret@s~s
+reticent ret@s~t
+retin retin
+retina ret~@
+retinal ret~@l
+retinoblastoma ret~OblastOm@
+retinoid ret~<d
+retinoids ret~<dz
+retinue ret~U
+retinyl ret~il
+retire r/tIr
+retire r@tIr
+retire rEtIP
+retired r/tIPd
+retired r/tIrd
+retired r@tIrd
+retiree r/tIrE
+retiree's r@tIrEz
+retirees r/tIrEz
+retirees' r@tIrEz
+retirement r/tIPm~t
+retirement r@tIPm~t
+retirements r/tIrm~ts
+retirements r@tIrm~ts
+retires r/tIPz
+retires r/tIrz
+retires r@tIrz
+retiring r/tIP6N
+retiring r/tIr6N
+retiring r@tIr6N
+retlin retlin
+reto rEtU
+retook r/tqk
+retool r/tUl
+retooled r/tUld
+retooling r/tUl6N
+retort rEt{rt
+retorted r/t{rt@d
+retorts r/t{rts
+retorts r@t{rts
+retouching r/tuC6N
+retrace r/trAs
+retraced r/trAst
+retracement r/trAsm~t
+retracing r/trAs6N
+retract r/trakt
+retractable r/trakt@b@l
+retracted r/trakt@d
+retracting r/trakt6N
+retraction r/trakS~
+retracts r/trakts
+retrain r/trAn
+retrained r/trAnd
+retraining r/trAn6N
+retransmission rEtranzmiS~
+retread r/tred
+retreading r/tred6N
+retreads r/tredz
+retreat r/trEt
+retreated r/trEt@d
+retreating r/trEt6N
+retreats r/trEts
+retrench r/trenC
+retrenched r/trenCt
+retrenching r/trenC6N
+retrenchment r/trenCm~t
+retrenchments r/trenCm~ts
+retrial r/trI@l
+retribution retr@byUS~
+retried r/trId
+retrieval r/trEv@l
+retrieval r@trEv@l
+retrieve r/trEv
+retrieve r@trEv
+retrieved r/trEvd
+retriever r/trEvP
+retrievers r/trEvPz
+retrieves r/trEvz
+retrieves r@trEvz
+retrieving r/trEv6N
+retro retr]
+retroactive retr]akt6v
+retroactively retr]akt6vl/
+retroactivity retr]aktiv@t/
+retrofit retr]fit
+retrofits retr]fits
+retrofitted retrOfit@d
+retrofitter retrOfitP
+retrofitting retr]fit6N
+retrograde retr@grAd
+retrospect retr@spekt
+retrospective retr@spekt6v
+retrospectively retr]spekt6vl/
+retrovir retr]vir
+retrovirus retr]vIr@s
+retroviruses retr]vIr@s@z
+retry r/trI
+retrying r/trI6N
+rettberg retbPg
+retter retP
+rettew reCU
+rettig ret6g
+rettinger ret6NP
+rettinger ret~jP
+rettke retk/
+retton ret~
+return r/tVn
+return r@tVn
+returnable r/tVn@b@l
+returned r/tVnd
+returned r@tVnd
+returnee r@tPnE
+returnees r@tPnEz
+returning r/tVn6N
+returning r@tVn6N
+returns r/tVnz
+returns r@tVnz
+returns' r/tVnz
+returns' r@tVnz
+retz rets
+retzer retzP
+retzlaff retzl@f
+retzloff retzl{f
+reuben rUb~
+reuber r<bP
+reul rUl
+reuland r<l~d
+reule rUl
+reum rE}
+reunification r/Un@f@kAS~
+reunified r/Un@fId
+reunify r/Un@fI
+reunion r/Uny~
+reunions r/Uny~z
+reunite rEUnIt
+reunited rEUnIt@d
+reunites rEUnIts
+reuniting rEUnIt6N
+reusable r/Uz@b@l
+reusch r<S
+reuse r/yUs
+reuse r/yUz
+reused r/Uzd
+reusing r/yUz6N
+reuss rUs
+reusser r<sP
+reust rUst
+reuter r<tP
+reuter's r<tPz
+reuters r<tPz
+reuters' r<tPz
+reuters's r<tPz
+reuters's r<tPz@z
+reutgers r<tgPz
+reuther r<TP
+reutter r<tP
+reutzel r<tz@l
+rev rev
+reva rAv@
+revak rev@k
+revaluation r/valyUAS~
+revaluations r/6valyUAS~z
+revalue r/valyU
+revalued r/valyUd
+revaluing r/valyU6N
+revamp r/vamp
+revamped r/vampt
+revamping r/vamp6N
+revamps r/vamps
+revard r6v)rd
+revco revk]
+revco's revk]z
+reveal r/vEl
+reveal r6vEl
+revealed r/vEld
+revealed r6vEld
+revealing r/vEl6N
+revealing r6vEl6N
+reveals r/vElz
+reveals r6vElz
+revel rev@l
+revelation rev@lAS~
+revelations rev@lAS~z
+revelatory r6vel@t{r/
+reveled rev@ld
+reveler rev@lP
+revelers rev@lPz
+reveles rAvAlcs
+reveling rev@l6N
+revell rAvAl
+revelle r6vel
+revello rcvel]
+revelry rev@lr/
+revels rev@lz
+revenge r/venj
+revenue rev~U
+revenue rev~yU
+revenues rev~Uz
+revenues rev~yUz
+reverb r/vVb
+reverbed r/vVbd
+reverberate r6vVbPAt
+reverberated r/vVbPAt@d
+reverberated r6vVbPAt@d
+reverberates r6vVbPAts
+reverberating r/vVbPAt6N
+reverberating r6vVbPAt6N
+reverberation r/vVbPAS~
+reverberations r6vVbPAS~z
+revercomb revPk}
+revere r6vir
+revered r6vird
+reverence revP~s
+reverend revP~d
+reverend revr~d
+reverent revP~t
+reverential revPenC@l
+reverential revPenS@l
+reverently revP~tl/
+reverie revP/
+reveries revP/z
+reveron revPon
+reveron's revPonz
+reversal r/vVs@l
+reversal r6vVs@l
+reversals r/vVs@lz
+reversals r6vVs@lz
+reverse r/vVs
+reverse r6vVs
+reversed r/vVst
+reversed r6vVst
+reverser r6vVsP
+reversers r6vVsPz
+reverses r/vVs@z
+reverses r/vVs@z
+reverses r6vVs@z
+reversible r/vVs@b@l
+reversible r6vVs@b@l
+reversing r/vVs6N
+reversing r6vVs6N
+reversion r6vVZ~
+revert r/vVt
+revert r6vVt
+reverted r/vVt@d
+reverted r6vVt@d
+reverting r6vVt6N
+reverts r6vVts
+reves rEvz
+revette r6vet
+revier rEv/P
+review rEvyU
+review's r/vyUz
+reviewed r/vyUd
+reviewer r/vyUP
+reviewer's r/vyUPz
+reviewers r/vyUPz
+reviewing r/vyU6N
+reviews r/vyUz
+reviews r@vyUz
+reviglio r@vigl/]
+revile r/vIl
+reviled r/vIld
+revilla rcvil@
+reville revil
+revis revis
+revise r/vIz
+revise r6vIz
+revised r/vIzd
+revised r6vIzd
+revises r/vIz@z
+revises r6vIz@z
+revising r/vIz6N
+revising r6vIz6N
+revision r/viZ~
+revisionism r/viZ~iz}
+revisionist r/viZ~ist
+revisionists r/viZ~is
+revisionists r/viZ~iss
+revisionists r/viZ~ists
+revisions r/viZ~z
+revisit r/viz@t
+revisited r/viz@t@d
+revisiting r/viz@t6N
+revisits r/viz@ts
+revitalization rEvIt@l@zAS~
+revitalize r/vIt@lIz
+revitalized r/vIt@lIzd
+revitalizing r/vIt@lIz6N
+revival r/vIv@l
+revival r6vIv@l
+revivalist r/vIv@list
+revivals r/vIv@lz
+revive r/vIv
+revive r6vIv
+revived r/vIvd
+revived r6vIvd
+revives r/vIvz
+reviving r/vIv6N
+reviving r6vIv6N
+revlon revlon
+revlon's revlonz
+revocable rev@k@b@l
+revocation rev@kAS~
+revocations rev@kAS~z
+revoir r6vw)r
+revoke r/vOk
+revoke r6vOk
+revoked r/vOkt
+revoked r6vOkt
+revoking r/vOk6N
+revoking r6vOk6N
+revolt r/vOlt
+revolt r6vOlt
+revolted r/vOlt@d
+revolted r6vOlt@d
+revolting r/vOlt6N
+revolts r/vOlts
+revolucionario rev]lUs/~,r/]
+revolution rev@lUS~
+revolution's rev@lUS~z
+revolutionaries rev@lUS~er/z
+revolutionary rev@lUS~er/
+revolutionist rev@lUS~@st
+revolutionists rev@lUS~@s
+revolutionists rev@lUS~@ss
+revolutionists rev@lUS~@sts
+revolutionize rev@lUS~Iz
+revolutionized rev@lUS~Izd
+revolutionizing rev@lUS~Iz6N
+revolutions rev@lUS~z
+revolve r/volv
+revolved r/volvd
+revolver r6volvP
+revolvers r6volvPz
+revolves r/volvz
+revolving r/volv6N
+revord r6v{rd
+revs revz
+revson revs~
+revue r6vyU
+revuelta r@vwelt@
+revues r6vyUz
+revulsion r/vulS~
+revulsion r6vulS~
+revved revd
+revving rev6N
+revzin revzin
+rew rU
+reward r/w{rd
+reward r@w{rd
+rewarded r/w{rd@d
+rewarded r@w{rd@d
+rewarding r/w{rd6N
+rewarding r@w{rd6N
+rewards r/w{rdz
+rewards r@w{rdz
+rewatching r/woC6N
+rewerts rUPts
+rewey rU/
+rewind rEwInd
+rewire r/wIP
+rewired r/wIPd
+rewiring r/wIP6N
+rewis rUis
+reword r/wVd
+rework r/wVk
+reworked r/wVkt
+reworking r/wVk6N
+rewrite r/rIt
+rewrite rErIt
+rewrites r/rIts
+rewriting r/rIt6N
+rewritten r/rit~
+rewrote r/rOt
+rex reks
+rexall reks{l
+rexana r6gzan@
+rexene reks/n
+rexford reksfPd
+rexham reks}
+rexnord reksn{rd
+rexon reks~
+rexroad reksrOd
+rexroat reksr]t
+rexrode reksr]d
+rexrodt reksr]d
+rexroth reksroT
+rey rA
+reyburn rAbPn
+reycraft rAkraft
+reyer rAP
+reyes rAis
+reykjavik rAk@v6k
+reykjavik reky@v6k
+reyman rAm~
+reyna rAn@
+reynaga r/nog@
+reynaldo rAnold]
+reynard rAnPd
+reynaud rAn{d
+reynold ren@ld
+reynolds ren@ldz
+reynolds' ren@ldz
+reynolds's ren@ldz@z
+reynoldson rAn]lds~
+reynosa r/nOs@
+reynoso r/nOs]
+reza rez@
+rezabek rczobck
+rezac rez@k
+rezek rezck
+rezendes rAzAndcs
+reznicek rezn6Cek
+reznick rezn6k
+reznik rezn6k
+rezoning r/zOn6N
+rha ro
+rhame rAm
+rhames rAmz
+rhapsodic rapsod6k
+rhapsodize raps@dIz
+rhapsodizes raps@dIz@z
+rhapsody raps@d/
+rhea rE@
+rheault rO
+rheaume rUm
+rhee rE
+rheem rEm
+rhein rIn
+rheingold rIngOld
+rheinisch rIn6S
+rheinstein rInstIn
+rhem rem
+rhesus rEs@s
+rheta rEt@
+rhetoric retP6k
+rhetorical r@t{r6k@l
+rhetorically r@t{r6kl/
+rhetorician retPiS~
+rhetoricians retPiS~z
+rhett ret
+rheumatic rUmat6k
+rheumatism rUm@tiz}
+rheumatoid rUm@t<d
+rheumatologist rUm@tol@j@st
+rheumatology rUm@tol@j/
+rhew rU
+rhin rin
+rhine rIn
+rhinehardt rInhort
+rhinehart rInhort
+rhineland rInland
+rhineman rInm~
+rhineman's rInm~z
+rhines rInz
+rhinesmith rInsmiT
+rhinestone rInstOn
+rhinestones rInstOnz
+rhino rInO
+rhinoceros rInosP@s
+rhinos rInOz
+rhizoid rIz<d
+rhizoidal rIz<d@l
+rhizome rIzOm
+rhizomes rIzOmz
+rho rO
+rhoad rOd
+rhoades rOdz
+rhoads rOdz
+rhoda rOd@
+rhodanthe rOdanT
+rhode rOd
+rhode-island rOdIl~d
+rhode-island's rOdIl~dz
+rhode-islander rOdIl~dP
+rhode-islanders rOdIl~dPz
+rhoden rOd~
+rhodes rOdz
+rhodesia r]dEZ@
+rhodesian r]dEZ~
+rhodia rOd/@
+rhodies rOd/z
+rhodium rOd/}
+rhododendron rOd@dendr~
+rhodopsin r]dops~
+rhodus rOd@s
+rhody rOd/
+rhome rOm
+rhonda rond@
+rhone rOn
+rhoney rOn/
+rhorer r{rP
+rhoten rOt~
+rhoto rOt]
+rhoton rOt~
+rhubarb rUborb
+rhude rUd
+rhudy rUd/
+rhue rU
+rhule rUl
+rhyme rIm
+rhymed rImd
+rhymer rImP
+rhymes rImz
+rhyming rIm6N
+rhyne rIn
+rhyner rInP
+rhynes rInz
+rhythm riT}
+rhythmic riTm6k
+rhythmically riTm6kl/
+rhythms riT}z
+ria rE@
+riad r/od
+riady r/od/
+riadys r/od/z
+rial rI@l
+rials rIlz
+rib rib
+riba rEb@
+ribald rIbold
+ribaldry rIboldr/
+ribar rib)r
+ribas rIb@z
+ribaudo r/b{d]
+ribavirin r@bavPin
+ribbed ribd
+ribbing rib6N
+ribbit rib@t
+ribble rib@l
+ribbon rib~
+ribbons rib~z
+ribeiro r/b,r]
+ribera r/b,r@
+ribi rEb/
+ribicoff rib6k{f
+ribka ribk@
+ribs ribz
+ric rik
+rica rEk@
+rica's rEk@z
+ricadonna r/kodOn@
+rican rEk~
+ricans rik~z
+ricard r6k)rd
+ricardo r6k)rd]
+ricaurte r@k)rtA
+ricca rEk@
+riccardi r/k)rd/
+riccardo r6k)rd]
+ricci rEC/
+ricciardelli r/CPdel/
+ricciardi r/C)rd/
+riccio rEC/]
+riccitelli r/C/tel/
+ricciuti r/kCUt/
+ricco rik]
+riccobono r/k]bOn]
+rice rIs
+rice's rIs@z
+riceville rIsvil
+rich riC
+rich's riC@z
+richa riC@
+richard riCPd
+richard's riCPdz
+richards riCPdz
+richards' riCPdz
+richards's riCPdz@z
+richardson riCPds~
+richardson's riCPds~z
+richardsonsmith riCPds~smiT
+richardt rikort
+richarson riCors~
+richart rikhort
+richaud r6SOd
+richbourg riCb{rg
+richburg riCbPg
+richco rik]
+richcreek riCkrEk
+riche riC
+richelieu riS@lU
+richelson riC@ls~
+richemont riC}ont
+richenthal rik~T{l
+richer riCP
+richerd riCPd
+richerson riCPs~
+richert rikPt
+riches riC@z
+richesin rik@sin
+richeson rik@s~
+richest riC@st
+richey riC/
+richfield riCfEld
+richfield's riCfEldz
+richford riCfPd
+richie riC/
+richins rikinz
+richison riC@s~
+richland riClan
+richland riCl~d
+richly riCl/
+richman riCman
+richmond riCm~d
+richmond's riCm~dz
+richner riknP
+richness riCn@s
+richoux r6SU
+richstone riCstOn
+richter riktP
+richton riCt~
+richts rikts
+richwhite riCwIt
+richwine riCwIn
+ricigliano risigl/on]
+rick rik
+rick's riks
+rickabaugh rik@b{
+rickard rikPd
+rickards rikPdz
+ricke rik
+rickel rik@l
+rickels rik@lz
+ricken rik~
+rickenbach rik~bok
+rickenbaker rik~b@kP
+ricker rikP
+rickers rikPz
+rickerson rikPs~
+rickert rikPt
+rickets rik@ts
+ricketson rik@ts~
+rickett rik@t
+ricketts rik@ts
+rickety rik@t/
+rickey rik/
+ricki rik/
+rickie rik/
+ricklefs riklcfs
+rickles rik@lz
+rickman rikm~
+rickner riknP
+ricks riks
+rickson riks~
+rickward rikwPd
+rickwood rikwqd
+ricky rik/
+rico rEk]
+rico's rEk]z
+ricochet rik@SA
+ricocheted rik@SAd
+ricocheting rik@SA6N
+ricoh rEk]
+ricoh's rEk]z
+ricostruzione r/k]strUz/On/
+rid rid
+ridable rId@b@l
+riddance rid~s
+riddell rid@l
+ridden rid~
+ridder ridP
+ridder's ridPz
+riddick rid6k
+ridding rid6N
+riddle rid@l
+riddled rid@ld
+riddler ridlP
+riddles rid@lz
+riddock rid@k
+ride rId
+rideau r@dO
+rideaux r@dO
+riden rId~
+ridener rid/nP
+ridenhour rid~?r
+ridenour rid~qr
+rideout rId?t
+rider rIdP
+rider's rIdPz
+riders rIdPz
+ridership rIdPSip
+rides rIdz
+ridge rij
+ridge's rij@s
+ridgecrest rijkrest
+ridged rijd
+ridgefield rijfEld
+ridgell rij@l
+ridgely rijl/
+ridges rij@z
+ridgeway rijwA
+ridgewood rijwqd
+ridgley rijl/
+ridgway rijwA
+ridicule rid@kyUl
+ridiculed rid@kyUld
+ridicules rid@kyUlz
+ridiculing rid@kyUl6N
+ridiculous r@diky@l@s
+ridiculously r@diky@l@sl/
+riding rId6N
+ridinger rId6NP
+ridings rId6Nz
+ridley ridl/
+ridling ridl6N
+ridlon ridl~
+ridner ridnP
+ridolfi r/dOlf/
+ridout rid?t
+ridpath ridpaT
+rids ridz
+riebe rEb
+riebel rEb@l
+rieben rEb~
+rieber rEbP
+riebman rEbm~
+riechers rEkPz
+rieck rEk
+riecke rEk
+ried rEd
+riede rEd
+riedel rEd@l
+rieder rEdP
+riederer rEdPP
+rieders rEdPz
+rieders' rEdPz
+riedesel rEd@s@l
+riedl rEd@l
+riedlinger rEd@l6NP
+riedy rEd/
+rief rEf
+rieg rEg
+riege rEj
+riegel rEg@l
+rieger rEgP
+riegert rEgPt
+riegle rEg@l
+riegler rEglP
+riehl rEl
+riehle rEh@l
+riehm rEm
+riek rEk
+rieke rEk
+rieken rEk~
+rieker rEkP
+riel rEl
+rielly rEl/
+riely rEl/
+rieman rEm~
+riemann rEm~
+riemenschneider rEm~SnIdP
+riemer rEmP
+riemersma r/m,rsm@
+riendeau r~dO
+rienstra rEnstr@
+riepe rEp
+riera rEr@
+rierson rErs~
+ries rIz
+riesberg rEsbPg
+riese rEz
+riesen rEs~
+riesenberg rEs~bPg
+rieser rEsP
+riesh rES
+riesh rIS
+riesling rEzl6N
+riess rEs
+riester rI@stP
+riesterer rEstPP
+rieth rI@T
+rietveld rEtvcld
+rietz rEts
+rieves rEvz
+rife rIf
+rifenburgh rif~bPg
+riff rif
+riffe rif
+riffel rif@l
+riffey rif/
+riffle rif@l
+riffraff rifraf
+riffs rifs
+rifkin rifkin
+rifkin's rifkinz
+rifkind rifkind
+rifle rIf@l
+rifled rIf@ld
+rifleman rIf@lm~
+riflery rIf@lr/
+rifles rIf@lz
+rifling rIfl6N
+rift rift
+rifts rifts
+rig rig
+riga rEg@
+rigas rIg@z
+rigatoni r6g@tOn/
+rigby rigb/
+rigdon rigd~
+rigel rIj@l
+rigg rig
+riggan rig~
+rigged rigd
+riggen rig~
+riggenbach rig~bok
+riggi rij/
+riggin rigin
+rigging rig6N
+riggings rig6Nz
+riggins riginz
+riggio rEj/]
+riggle rig@l
+riggleman rig@lm~
+riggs rigz
+riggsbee rigzb/
+righetti r/get/
+righi rEg/
+right rIt
+right's rIts
+right-brace rItbrAs
+right-winger rItwiNP
+right-wingers rItwiNPz
+righted rIt@d
+righteous rIC@s
+righteously rIC@sl/
+righteousness rIC@sn@s
+righter rItP
+rightful rItf@l
+rightfully rItf@l/
+righthand rIthand
+righthanded rIthand@d
+rightish rItiS
+rightist rIt@st
+rightists rIt@sts
+rightly rItl/
+rightmire rItmIr
+rightmyer rItm/P
+rightness rItn@s
+rights rIts
+rights' rIts
+rightward rItwPd
+rightwing rItwiN
+righty rIt/
+rigid rij@d
+rigidities r6jid@t/z
+rigidity r6jid@t/
+rigidly rij@dl/
+rigler rIg@lP
+rigney rign/
+rigo rEg]
+rigoletto rig@let]
+rigoni r/gOn/
+rigor rigP
+rigorous rigP@s
+rigorously rigP@sl/
+rigors rigPz
+rigs rigz
+rigsbee rigzbE
+rigsby rigzb/
+rigueur r6gyUr
+rigueur rigP
+riha rIh@
+rihn rin
+rijn rE~
+rikard rikPd
+rike rIk
+rikeld rIkcld
+rikeld rikcld
+riker rIkP
+riker's rIkPz
+rikers rIkPz
+rikki rik/
+riklis riklis
+riksbank riksbaNk
+riksdag riksdag
+rile rIl
+riled rIld
+riles rIlz
+riley rIl/
+riley's rIl/z
+rill ril
+rill's rilz
+rilla ril@
+rillette r@let
+rilling ril6N
+rilwanu rilwonU
+rim rim
+rima rEm@
+rimbey rimb/
+rimel rim@l
+rimer rImP
+rimes rImz
+rimkus rimk@s
+rimmed rimd
+rimmer rimP
+rimpochet rimpOC@t
+rimpochet ripOC@t
+rimpochets rimpOC@ts
+rimpochets ripOC@ts
+rims rimz
+rimson rims~
+rina rEn@
+rinaldi r/nold/
+rinaldo r~old]
+rinard rinPd
+rinas rIn@z
+rinaudo r/n{d]
+rinck riNk
+rincon riNk~
+rind rInd
+rindahl rindol
+rinderer rindPP
+rinderknecht rindPkn6kt
+rindfleisch rindflIS
+rinds rIndz
+rindt rint
+rine rIn
+rineer rin6r
+rinehardt rInhort
+rinehart rInhort
+rinehimer rInhImP
+rinella rinel@
+riner rInP
+rines rInz
+riney rIn/
+ring riN
+ring's riNz
+ring-around-the-rosy riNP?nTPOz/
+ringberg riNbPg
+ringdahl riNdol
+ringe riN
+ringed riNd
+ringeisen riNgIs~
+ringel riNg@l
+ringen riN~
+ringenberg riN~bPg
+ringer riNP
+ringers riNPz
+ringgenberg riNg~bPg
+ringgit riN@t
+ringgold riNgOld
+ringing riN6N
+ringland riNgl~d
+ringle riNg@l
+ringleader riNlEdP
+ringleaders riNlEdPz
+ringler riNg@lP
+ringler riNglP
+ringley riNgl/
+ringling riNl6N
+ringmaster riNmastP
+ringneck riNnek
+ringo rENg]
+ringold riNg]ld
+ringquist riNkwist
+rings riNz
+ringside riNsId
+ringstad riNst@d
+ringuette r6Net
+ringwald riNw{ld
+ringwood riNwqd
+rini rEn/
+rininger rin6NP
+rink riNk
+rinke riNk
+rinkenberger riNk~bPgP
+rinker riNkP
+rinko riNk]
+rinks riNks
+rinn rin
+rinne rin
+rinse rins
+rinsing rins6N
+rintala r/ntol@
+rintel rintel
+rintel's rintelz
+rintels rintelz
+rintels' rintelz
+rio rE]
+rio's rE]z
+rio-de-janeiro rE]d/j~,rO
+riojas r/Oyoz
+riolo r/Ol]
+rion rI~
+riopel r/@pel
+riopelle r/@pel/
+riordan rird~
+riordan's rird~z
+rios rE]s
+riot rI@t
+rioted rI@t@d
+rioter rI@tP
+rioters rI@tPz
+rioting rI@t6N
+riotous rI@t@s
+riots rI@ts
+riots' rI@ts
+rioux rU
+rip rip
+ripa rEp@
+ripe rIp
+ripen rIp~
+ripened rIp~d
+ripening rIpn6N
+ripening rIp~6N
+riphagen ripog~
+ripka rEpk@
+ripke ripk
+ripken ripk~
+ripken's ripk~z
+ripkin ripkin
+ripley ripl/
+ripoff rip{f
+ripoffs rip{fs
+riposte r@pOst
+ripostes r@p{sts
+ripp rip
+rippe rip
+ripped ript
+rippee ripE
+rippel rip@l
+rippeon rip/~
+ripper ripP
+ripperger ripPgP
+rippetoe rip@t]
+rippey rip/
+ripping rip6N
+ripple rip@l
+rippled rip@ld
+ripples rip@lz
+rippling rip@l6N
+rippling ripl6N
+ripplinger rip@l6NP
+rippon rip~
+rippy rip/
+rips rips
+risa rEs@
+risberg risbPg
+risc risk
+risch riS
+risden risd~
+risdon risd~
+rise rIz
+risen riz~
+risenhoover ris~hUvP
+riser rIzP
+rises rIz@z
+rish riS
+rishel riS@l
+rishell riS@l
+risher riSP
+risi rEs/
+risin rIzin
+rising rIz6N
+risinger rIz6NP
+risk risk
+riske risk
+riske's risks
+risked riskt
+riskier risk/P
+riskiest risk/@st
+riskin riskin
+riskiness risk/n@s
+risking risk6N
+riskless riskl@s
+risko risk]
+risks risks
+risky risk/
+risley rizl/
+risner risnP
+riso rEs]
+rison ris~
+rispoli r/spOl/
+risque riskA
+riss ris
+risse ris
+risser risP
+rissler rislP
+rissman rism~
+rissmiller rism@lP
+risso ris]
+rissoli r@sOl/
+rist rist
+ristau rist?
+rister ristP
+riston rist~
+ristorante ristPontA
+ristow rist]
+rita rEt@
+rita's rEt@z
+ritacco r/tok]
+ritalin rit@lin
+ritcey rits/
+ritcey's rits/z
+ritch riC
+ritchey riC/
+ritchie riC/
+rite rIt
+rite's rIts
+ritenour rIt~?r
+ritenour rit~?r
+riter rItP
+rites rIts
+ritesh riteS
+ritger ritgP
+ritner ritnP
+ritsema ritsEm@
+ritson rits~
+ritt rit
+rittenberg rit~bPg
+rittenberry rit~bcr/
+rittenhouse rit~h?s
+rittenour rit~?r
+ritter ritP
+ritterbusch ritPbqS
+rittereiser ritPIzP
+rittereiser's ritPIzPz
+rittgers ritgPz
+ritthaler riT@lP
+rittle rit@l
+rittman ritm~
+rittner ritnP
+ritts rits
+ritual riCU@l
+ritualistic riCU@list6k
+ritualistically riCU@list6k@l/
+ritualistically riCU@list6kl/
+rituals riCU@lz
+ritz rits
+ritzel ritz@l
+ritzenthaler ritz~T@lP
+ritzenthaler ritz~TolP
+ritzer ritzP
+ritzert ritzPt
+ritziest rits/@st
+ritzman ritsm~
+ritzy rits/
+riunite r/UnIt
+riunite r/UnIt/
+riva rEv@
+rival rIv@l
+rival's rIv@lz
+rivaled rIv@ld
+rivaling rIv@l6N
+rivaling rIvl6N
+rivalries rIv@lr/z
+rivalry rIv@lr/
+rivals rIv@lz
+rivals' rIv@lz
+rivard rivPd
+rivas rEvoz
+riven riv~
+rivenbark riv~bork
+rivenburg riv~bPg
+rivenburgh riv~bPg
+river rivP
+river's rivPz
+rivera r6v,r@
+riverbank rivPbaNk
+riverbed rivPbed
+riverbend rivPbend
+riverboat rivPbOt
+riverboat's rivPbOts
+riverboats rivPbOts
+riverdale rivPdAl
+riverfront rivPfrunt
+riverhead rivPhed
+rivero r/v,r]
+rivers rivPz
+riverside rivPsId
+riverso rivPs]
+riverway rivPwA
+riverwood rivPwqd
+rives rIvz
+rivest rivist
+rivet riv@t
+riveted riv@t@d
+riveting riv@t6N
+rivets riv@ts
+rivett riv@t
+rivette r6vet
+riviello rEv/el]
+riviera riv/,r@
+riviere riv/cr
+rivieres r6vyircz
+rivkin rivkin
+rivkind rivkind
+rivlin rivlin
+rix riks
+riyad r/ad
+riyad r/od
+riyadh r/ad
+riyadh r/od
+riyals r/yolz
+riz riz
+rizer rIzP
+rizk rizk
+rizo rEz]
+rizor rIzP
+rizza riz@
+rizzi riz/
+rizzo riz]
+rizzoli rizOl/
+rizzolo r/tsOl]
+rizzuti r/tsUt/
+rizzuto r/tsUt]
+ro rO
+roa rO@
+roach rOC
+roache rOC
+roaches rOC@z
+road rOd
+road's rOdz
+roadblock rOdblok
+roadblocks rOdbloks
+roadcap rOdkap
+roades rOdz
+roadhouse rOdh?s
+roadie rOd/
+roadmaster rOdmastP
+roadrailer rOdrAlP
+roadrunner rOdrunP
+roads rOdz
+roadshow rOdSO
+roadside rOdsId
+roadsides rOdsIdz
+roadster rOdstP
+roadway rOdwA
+roadways rOdwAz
+roadwork rOdwVk
+roady rOd/
+roald rOld
+roam rOm
+roamed rOmd
+roaming rOm6N
+roams rOmz
+roan rOn
+roane rOn
+roanna rOn@
+roanoke rO~Ok
+roar r{r
+roared r{rd
+roaring r{r6N
+roark r{rk
+roarke r{rk
+roars r{rz
+roarty r{rt/
+roast rOst
+roasted rOst@d
+roaster rOstP
+roasters rOstPz
+roasting rOst6N
+roasts rOsts
+roat rOt
+roath rOT
+rob rob
+rob's robz
+roback rObak
+robaina r]bAn@
+robak rOb@k
+robar r@b)r
+robards robPdz
+robare r]b)rA
+robarge roborg
+robart robort
+robarts roborts
+robb rob
+robb's robz
+robbe rob
+robbed robd
+robben rob~
+robber robP
+robberies robP/z
+robbers robPz
+robberson robPs~
+robbery robP/
+robbie rob/
+robbie's rob/z
+robbin robin
+robbing rob6N
+robbins robinz
+robbs robz
+robby rob/
+robby's rob/z
+robe rOb
+robeck rObek
+robed rObd
+robel rOb@l
+robello r]bel]
+robelo robel]
+rober rObP
+roberds robPdz
+roberg rObPg
+roberge robPj
+robers rObPz
+roberson robPs~
+robert robPt
+robert's robPts
+roberta r@bVt@
+roberti r@bVt/
+roberto r@b,rt]
+roberto r]b,rt]
+roberts robPts
+roberts' robPts
+roberts's robPts@z
+robertshaw robPtS{
+robertson robPts~
+robertson's robPts~z
+robes rObz
+robeson rOb@s~
+robey rOb/
+robia rOb/@
+robichaud rob6SO
+robichaux rob6SO
+robicheaux rob6SO
+robideau rob@dO
+robidoux rob@dU
+robie rOb/
+robillard rob@lPd
+robin rob~
+robin's rob~z
+robina r@bEn@
+robinett rob~ct
+robinette rob~et
+robinhood rob~hqd
+robinia r]bEn/@
+robins rob~z
+robins' rob~z
+robins's rob~z@z
+robinson rob~s~
+robinson's rob~s~z
+robinsons rob~s~z
+robinsons' rob~s~z
+robishaw rob6S{
+robison rob@s~
+robitaille rob@tAl
+robitussin rob@tus~
+robl rob@l
+roble rOb@l
+robledo r]blAd]
+roblee roblE
+robles rOb@lz
+robley robl/
+roblin roblin
+robling rOb@l6N
+robnett robnct
+robocop rOb]kop
+robot rObot
+robot rObut
+robot's rObots
+robot's rObuts
+robotic rObot6k
+robotics rObot6ks
+robots rObots
+robots rObuts
+robs robz
+robson robs~
+robuck rob@k
+robust r]bust
+robusta robust@
+robustas robust@s
+robustelli rOb@stel/
+robustelli's rOb@stel/z
+robustly rObustl/
+robustness r]bustn@s
+roby rOb/
+robyn robin
+roc rok
+roca rOk@
+rocap rOkap
+rocard r@k)rd
+rocard rOS)rd
+rocard rOkPd
+rocard rOkord
+rocca rok@
+roccaforte r]k@f{rt/
+roccas rok@s
+rocchi rOk/
+rocchio rOk/]
+rocco rok]
+rocco's rok]z
+roch rok
+rocha rOk@
+rochat roC@t
+rochberg rOCbPg
+roche rOC
+roche rOS
+roche's rOS@z
+rochefort roSfPt
+rochefort rok@fPt
+rocheleau roS@l]
+rochella r@Cel@
+rochelle r]Sel
+rochelle ruSel
+rochelle's r]Selz
+rochelle's ruSelz
+rocher rOCP
+rocher rOSP
+rochester roCestP
+rochester's roCestPz
+rochette ruSet
+rochford roCfPd
+rochlin roklin
+rochon roC~
+rock rok
+rock'n'roll rok~rOl
+rock's roks
+rock-and-roll rokandrOl
+rock-and-roll rok~rOl
+rockabilly rok@bil/
+rockafellow rok@fel]
+rockaway rok@wA
+rocke rok
+rocked rokt
+rockefeller rok@felP
+rockefeller's rok@felPz
+rockefellers rok@felPz
+rockel rok@l
+rockenbach rok~bok
+rocker rokP
+rockers rokPz
+rocket rok@t
+rocket's rok@ts
+rocketdyne rok@tdIn
+rocketed rok@t@d
+rocketing rok@t6N
+rocketry rok@tr/
+rockets rok@ts
+rockett rok@t
+rockette roket
+rockettes rokets
+rockey rok/
+rockford rokfPd
+rockhill rokhil
+rockhold rokhOld
+rockholt rokhOlt
+rockies rok/z
+rockin' rok~
+rocking rok6N
+rockingham rok6Nham
+rockland rokl~d
+rockley rokl/
+rocklin roklin
+rockman rokm~
+rockmore rokm{r
+rockne rokn/
+rockoff rok{f
+rockow rosk]
+rockport rokp{rt
+rockresort rokr@z{rt
+rockresorts rokr@z{rts
+rockrose rokrOz
+rocks roks
+rockville rokvil
+rockwell rokwel
+rockwell's rokwelz
+rockwood rokwqd
+rocky rok/
+rococo r@kOkO
+rocque rok
+rod rod
+roda rOd@
+rodabaugh rod@b{
+rodak rOd@k
+rodale rOdAl
+rodarte rodort
+rodas rOd@z
+rodd rod
+rodden rod~
+roddenberry rod~bcr/
+roddey rod/
+roddick rodik
+roddie rod/
+rodding rod6N
+roddy rod/
+rode rOd
+rodebaugh rod@b{
+rodefer rod@fP
+rodeffer rod@fP
+rodeheaver rod@h/vP
+rodela r]del@
+rodell rod@l
+roden rOd~
+rodenbaugh rod~b?
+rodenbeck rOd~bck
+rodenberg rOd~bPg
+rodenberger rOd~bPgP
+rodenburg rOd~bPg
+rodent rOd~t
+rodents rOd~ts
+rodeo rOd/O
+rodeos rOd/Oz
+roder rOdP
+roderica r]dPEk@
+roderick rodr6k
+roderick's rodr6ks
+rodes rOdz
+rodewald rodU{ld
+rodeway rOdwA
+rodge roj
+rodger rojP
+rodgers rojPz
+rodgin roj~
+rodham r{d}
+rodi rOd/
+rodick rod6k
+rodier rOd/P
+rodime r]dEm
+rodin rOdan
+rodin rOdin
+rodine r]dEn/
+rodino r]dEn]
+rodkey rodkE
+rodman rodm~
+rodman's rodm~z
+rodmond rodm~d
+rodmund rodm~d
+rodney rodn/
+rodocker rod@kP
+rodolf rod]lf
+rodolfo r]dolf]
+rodolph rOdolf
+rodrick rodr6k
+rodrigeuz r]drEjUz
+rodrigo r@drEg]
+rodrigue rOdr/g
+rodrigues rodrEg@s
+rodriguez rodrEgcz
+rodriguez's rodrEgcz@z
+rodriques rodrEgcs
+rodriquez rodrEkcz
+rods rodz
+rodwell rodwel
+rody rOd/
+roe rO
+roeber rObP
+roebke rObk
+roebling rObl6N
+roebuck rObuk
+roebuck's rObuks
+roecker rOkP
+roed rOd
+roedel rOd@l
+roeder rOdP
+roederer rOdPP
+roediger rOd6gP
+roedl rOd@l
+roegner rOgnP
+roehi rO/
+roehl rOl
+roehling rOl6N
+roehm rOm
+roehr r{r
+roehrich r{r6k
+roehrig r{r6g
+roehrs r{rz
+roeland rOl~d
+roelke rOlk
+roell rOl
+roelle rOl
+roeller rOlP
+roelofs rOl@fs
+roemer rOmP
+roemmich rOm6k
+roen rOn
+roeper rOpP
+roepke rOpk
+roes rOz
+roesch rOS
+roese rOs
+roesel rOs@l
+roeser rOzP
+roeske rOsk
+roesler rOs@lP
+roesner rOsnP
+roessler rOs@lP
+roessner rOsnP
+roether rOTP
+roethler rOT@lP
+roettger rOtgP
+roever rocvP
+roff r{f
+roffe rof
+roffman r{fm~
+rofin rOf~
+rog rog
+rogachev rOg@C@v
+rogacki r@gotsk/
+rogaine r]gAn
+rogal rOg@l
+rogala r]gol@
+rogalla r]gol@
+rogalski r@golsk/
+rogan rOg~
+rogel rOg@l
+rogelio r]gEl/]
+roger rojP
+roger's rojPz
+rogernomics rOgPnom6ks
+rogers rojPz
+rogers' rojPz
+rogers's rojPz@z
+rogerson rogPs~
+rogge rog
+roggenbuck rog~b@k
+roggenkamp rog~kamp
+roggio roz/]
+roggow rog]
+rogier rOg/P
+rogin rOgin
+roginski r@ginsk/
+rogness rogn@s
+rogoff rog{f
+rogowski r@g{fsk/
+rogozinski r@g@zinsk/
+rogstad rogst@d
+rogue rOg
+rogues rOgz
+rogus rOg@s
+roh rO
+roh's rOz
+rohan rO~
+rohana r@han@
+rohatyn r]hat~
+rohatyn roh@t~
+rohatyn's r]hat~z
+rohatyn's roh@t~z
+rohde rOd
+rohde rOd@
+rohe rO
+roher rOP
+rohl rOl
+rohland rOl~d
+rohleder rOl@dP
+rohlf rOlf
+rohlfing rOlf6N
+rohlfs rOlfs
+rohlicek rol@Cck
+rohling rOl6N
+rohlman rOlm~
+rohloff rOl{f
+rohm rOm
+rohman rOm~
+rohmer rOmP
+rohn ron
+rohner rOnP
+rohr r{r
+rohrbach r{rbok
+rohrbacher r{rbokP
+rohrback r{rbak
+rohrbaugh r{rb?
+rohrbough r{rb?
+rohrer r{rP
+rohrich r{r6k
+rohrig r{r6g
+rohrman r{rm~
+rohrs r{rz
+rohs rOz
+rohstoff rOst{f
+rohwedder rOw@dP
+rohweder rOw@dP
+rohwer rOwP
+rohypnol rOhIpn{l
+roi r<
+roig r<g
+roil r<l
+roiled r<ld
+roiling r<l6N
+roister r<stP
+roister's r<stPz
+rojas rOhos
+rojek rOyck
+rojo rOj]
+roka rOk@
+rokahr rOkor
+rokar rOkor
+rokicki r@kik/
+rokos rOk]z
+rokosz rok6S
+rol rOl
+rolan rOl~
+roland rOl~d
+rolanda r]lond@
+rolando r]lond]
+roldan rOld~
+role rOl
+rolemodel rOlmod@l
+rolemodels rOlmod@lz
+rolen rOl~
+roleplaying rOlplA6N
+roles rOlz
+rolette r]let
+rolex rOlcks
+roley rOl/
+rolf rOlf
+rolfe rOlf
+rolfes rOlfs
+rolfs rOlfs
+rolfson rOlfs~
+rolin rOlin
+roling rOl6N
+rolison rol@s~
+roll rOl
+roll's rOlz
+rolla rol@
+rolland rol~d
+rolland's rOl~dz
+rollback rOlbak
+rollbacks rOlbaks
+rolle rOl
+rolled rOld
+rollen r{l~
+roller rOlP
+rollerblade rOlPblAd
+rollerblades rOlPblAdz
+rollerblading rOlPblAd6N
+rollercoaster rOlPkOstP
+rollers rOlPz
+rollet r]let
+rolley rol/
+rolli rol/
+rollicking rol6k6N
+rollie rOl/
+rollie r{l/
+rollin rolin
+rollin' rOl~
+rolling rOl6N
+rollinger rOl6NP
+rollings rOl6Nz
+rollins rolinz
+rollins' rolinz
+rollins's rolinz@z
+rollinson rolins~
+rollison rolis~
+rollman rOlm~
+rollo rol]
+rollout rOl?t
+rollover rOlOvP
+rollovers rOlOvPz
+rolls rOlz
+rolls's rOlz@z
+rolltop rOltop
+rollwagen rOlwag~
+rolly rOl/
+rollyson rol@s~
+rolm rOm
+rolnick rOln6k
+rolodex rOl@deks
+roloff rol{f
+rolon rOl~
+rolph rOlf
+rolston rOlst~
+rolt rOlt
+rom rom
+rom's romz
+roma rOm@
+romack rom@k
+romagnoli r]mognOl/
+romagnolo rOmonyOl]
+romain r]mAn
+romaine r]mAn
+roman rOm~
+roman's rOm~z
+romance rOmans
+romance r]mans
+romances r]mans@z
+romancing r]mans6N
+romanek rom~6k
+romanelli r]monel/
+romanello r]monel]
+romanesque rOm~esk
+romani r]mon/
+romania r]mAn/@
+romania's r]mAn/@z
+romanian r]mAn/~
+romanians r]mAn/~z
+romaniello r]mon/el]
+romanik r}an6k
+romann rOm~
+romano r]monO
+romano's r]monOz
+romanoff rOm~{f
+romanone r]monOn
+romanones r]monOnz
+romanoski r}~?sk/
+romanov rOm~{f
+romanov rOm~{v
+romanow r}an]
+romanowski r}~{fsk/
+romans rOm~z
+romanski r}ansk/
+romantic r]mant6k
+romantically r]mant6k@l/
+romantically r]mant6kl/
+romanticism r]mant@siz}
+romanticize r]mant@sIz
+romanticized r]mant@sIzd
+romanticizing r]mant@sIz6N
+romantics r]mant6ks
+romany rOm~/
+romany rom~/
+romas rOm@z
+rombach rombok
+romberg rombPg
+romberger rombPgP
+rome rOm
+rome's rOmz
+romella r]mel@
+romelle r}el
+romeo rOm/O
+romer rOmP
+romero r]m,r]
+romesburg rOmzbPg
+romey rOm/
+romick rom6k
+romig rOm6g
+romilda r}Eld@
+romina r}En@
+romine romin
+romine r}En/
+romines rominz
+romines r}En/z
+rominger rOm6NP
+romito r]mEt]
+romley roml/
+romm rom
+rommel rom@l
+romney romn/
+romney's romn/z
+romo rOm]
+romola rom@l@
+romp romp
+romping romp6N
+roms romz
+romulus romy@l@s
+ron ron
+ron's ronz
+rona rOn@
+ronald ron@ld
+ronalda r]nold@
+ronan rOn~
+ronan's rOn~z
+ronayne ronAn
+ronca rOnk@
+ronco rOnk]
+ronda rond@
+rondeau rondO
+rondinelli r]nd/nel/
+rondon rond~
+rondonia rondOn/@
+rone rOn
+ronen rOn~
+roney rOn/
+rong r{N
+rongji r{Nj/
+roni rOn/
+ronin rOnin
+ronk roNk
+ronko roNk]
+ronna ron@
+ronne ron
+ronnie ron/
+ronning ron6N
+ronny ron/
+ronquillo r]nkwil]
+ronson rons~
+ronstadt ronstat
+rood rUd
+roode rUd
+roof rUf
+roofed rUft
+roofer rUfP
+roofers rUfPz
+roofing rUf6N
+roofs rUfs
+rooftop rUftop
+rooftops rUftops
+rooftree rUftrE
+rook rqk
+rookard rqkPd
+rooke rqk
+rooker rqkP
+rookie rqk/
+rookies rqk/z
+rooks rqks
+rookstool rqkstUl
+room rUm
+room's rUmz
+roome rUm
+roomful rUmfql
+roomier rUm/P
+roominess rUm/n@s
+rooming rUm6N
+roommate rUmAt
+roommates rUmAts
+rooms rUmz
+roomy rUm/
+roone rUn
+rooney rUn/
+rooney's rUn/z
+roop rUp
+roope rUp
+roorda rqrd@
+roos rUz
+roosa rUs@
+roose rUz
+roosevelt rOz@velt
+roosevelt rUz@velt
+roosevelt's rOz@velts
+roosevelt's rUz@velts
+roosevelts rOz@velts
+roosevelts rUz@velts
+roost rUst
+roosted rUst@d
+rooster rUstP
+roosters rUstPz
+root rUt
+rooted rUt@d
+rooter rUtP
+rooters rUtPz
+rooting rUt6N
+rootless rUtl@s
+roots rUts
+rootstein rUtstIn
+ropak rOpak
+rope rOp
+roped rOpt
+roper rOpP
+roper's rOpPz
+ropers rOpPz
+ropes rOps
+roping rOp6N
+ropp rop
+roppolo r]pOl]
+rops rops
+roque rOk
+roquemore r]km{r
+rorabaugh r{r@b{
+rorer r{rP
+rorer's r{rPz
+rorex r{rcks
+rorick r{r6k
+rorie r{r/
+rork r{rk
+rorke r{rk
+rorrer r{Pr
+rorschach r{rSo
+rory r{r/
+ros r{s
+rosa rOz@
+rosa's rOz@z
+rosabel rOz@bel
+rosabelle ros@b@l
+rosado r@sod]
+rosalee rOs@lE
+rosales rOsAlz
+rosalez r]solcz
+rosalia r]z@lE@
+rosalie rOz@l/
+rosalind roz@l~d
+rosalinda r]solEnd@
+rosalyn roz@l~
+rosalyn's roz@l~z
+rosalynd roz@l~d
+rosalynn rOz@lin
+rosamilia r]zomEl/@
+rosamond rOz}~d
+rosamund r]z}qnd
+rosan rOz~
+rosander r]zandP
+rosanna r]zan@
+rosanne r]zan
+rosano r]zon]
+rosaria r]z)r/@
+rosaria's r]z)r/@z
+rosaries rOzP/z
+rosario r]z)r/]
+rosary rOzP/
+rosas rOz@z
+rosasco r]zosk]
+rosati r]zot/
+rosato r]zot]
+rosberg rosbPg
+rosborough rosbP]
+rosch r{S
+roscher r{SP
+roscoe rosk]
+rose rOz
+rose's rOz@z
+roseanne rOzan
+roseanne's rOzanz
+roseberry rOzber/
+roseboom rOzbUm
+roseboro r]zbV]
+roseborough rOzbV]
+rosebrock rOzbr@k
+rosebrook rOzbrqk
+rosebrough rOzbr?
+rosebud rOzb@d
+rosebush rOzbqS
+rosecrans rOzkranz
+rosekrans rOzkr~z
+rosel rOz@l
+roseland rOzl~d
+roselawn rOzl{n
+roselawn's rOzl{nz
+roseline rOzlIn
+rosell rOz@l
+rosella r]zel@
+rosellen rOz@l~
+roselli r]sel/
+rosello r]sel]
+roseman rOzm~
+rosemarie rOzmPE
+rosemary rOzmer/
+rosemead rOzmEd
+rosemeyer rOzmIP
+rosemond rOzm~d
+rosemont rOzmont
+rosen rOz~
+rosen's rOz~z
+rosenau rOzn?
+rosenbach rOz~bok
+rosenbalm rOz~bom
+rosenbaum rOz~b?m
+rosenbeck rOz~bek
+rosenberg rOz~bPg
+rosenberg's rOz~bPgz
+rosenberger rOz~bPgP
+rosenbergs rOz~bPgz
+rosenberry rOz~ber/
+rosenblatt rOz~blat
+rosenbloom rOz~blUm
+rosenblum rOz~blUm
+rosenbluth rOz~blUT
+rosenboom rOz~bUm
+rosenburg rOz~bPg
+rosencrans rOz~kranz
+rosendahl rOz~dol
+rosendale rOz~dAl
+rosene ros/n
+rosener rOz~P
+rosenfeld rOz~feld
+rosenfield rOz~fEld
+rosengarten rOz~gort~
+rosengrant rOz~grant
+rosengren rOz~grcn
+rosenhaus rOz~h?s
+rosenkrans rOz~kranz
+rosenkrantz rOz~krants
+rosenkranz rOz~krants
+rosenlund rOz~l~d
+rosenman rOz~m~
+rosenow rOz~?
+rosenquist rOz~kwist
+rosenshine rOz~SIn
+rosensteel rOz~stEl
+rosenstein rOz~stEn
+rosenstein rOz~stIn
+rosenstock rOz~stok
+rosensweig rOz~swIg
+rosenthal rOz~T{l
+rosentreter rOz~tretP
+rosenwald rOz~w{ld
+rosenwasser rOz~w{sP
+rosenzweig rOz~zwIg
+roser rOzP
+roses rOz@z
+rosete ros/t
+rosett rOz@t
+rosetta r]zet@
+rosette r@set
+rosettes rOzets
+rosetti r]set/
+rosevear r]zvir
+roseville rOzvil
+rosewicz rOzwits
+rosewood rOzwqd
+rosewood's rOzwqdz
+rosey rOz/
+rosh r{S
+roshier rOSyP
+rosiak ros/ak
+rosie rOz/
+rosie's rOz/z
+rosier rOz/P
+rosin roz~
+rosina r]zEn@
+rosine r]sEn/
+rosing rOz6N
+rosinski r@sinsk/
+rosinsky r@sinsk/
+rosita r]zEt@
+roskam rosk}
+roske rOsk
+rosko rOsk]
+roskos rOsk]z
+roslin roslin
+roslund r{zl~d
+roslyn rozlin
+rosman rosm~
+rosmunda r]smUnd@
+rosneft rozncft
+rosner rosnP
+rosoff ros{f
+rosol rOs{l
+rospatch r{spaC
+ross ros
+ross' ros
+ross's ros@z
+rossa rOs@
+rossano r]son]
+rossbach rosbok
+rossborough r{sbP]
+rosse ros
+rosselin ros@l~
+rossell ros@l
+rosselli r]sel/
+rosselot ros@l@t
+rossen r{s~
+rosser r{sP
+rossetti r]set/
+rossetto r]set]
+rossi r{s/
+rossie r{s/
+rossignol ros6gn{l
+rossin rosin
+rossing r{s6N
+rossini r]sEn/
+rossiter r{s@tP
+rossiya r{s/@
+rossler ros@lP
+rosslyn roslin
+rossman r{sm~
+rossmann r{sm~
+rossmiller rosm@lP
+rossmore rosm{r
+rossner rosnP
+rosso rOs]
+rosson ros~
+rossow ros]
+rost rost
+rostad rost@d
+rosten ros~
+rostenkowski r{stcNk?sk/
+rostenkowski's r{stcNk?sk/z
+roster rostP
+rosters rostPz
+roston rost~
+rostov rostov
+rostron rostr~
+rostropovich r@strop6v6C
+rostropovich r{str@pOv6C
+rostrum rostr}
+rostuca r{stUk@
+rosty r{st/
+roswald rosw@ld
+roswell roswcl
+rosy rOz/
+roszak roS@k
+roszell roS@l
+roszkowski ruSk{fsk/
+rot rot
+rota rOt@
+rotan rOt~
+rotary rOtP/
+rotate rOtAt
+rotated rOtAt@d
+rotates rOtAts
+rotating rOtAt6N
+rotation r]tAS~
+rotational r]tAS~@l
+rotations r]tAS~z
+rotberg rotbPg
+rotblat rotblat
+rote rOt
+rotella r]tel@
+roten rOt~
+rotenberg rOt~bPg
+rotenberry rOt~ber/
+rotert rotPt
+roth r{T
+roth's roTs
+rothacker r{T@kP
+rothbard r{TbPd
+rothbart r{Tbort
+rothbauer r{Tb?P
+rothberg r{TbPg
+rothchild r{TCIld
+rothe rOT
+rothenberg r{T~bPg
+rothenberger r{T~bPgP
+rother r{TP
+rothermel roTPm@l
+rothert roTPt
+rothery roTP/
+rothfuss r{Tf@s
+rothgeb r{Tgcb
+rothkopf r{Tk{f
+rothkopf r{Tk{pf
+rothlisberger r{TlisbPgP
+rothman r{Tm~
+rothmans r{Tm~z
+rothmans's r{Tm~z@z
+rothmeier r{TmIr
+rothrock r{Tr@k
+roths r{Ts
+rothschild r{TsCIld
+rothschild's r{TCIldz
+rothschilds r{TCIldz
+rothstein r{Tst/n
+rothstein r{TstIn
+rothwax r{Twaks
+rothweiler r{TwIlP
+rothwell r{Twel
+rothwells r{Twelz
+roti rOt/
+rotisserie rOtisP/
+rotman rotm~
+roto rOt]
+rotolo r]tOl]
+rotondi r]tOnd/
+rotondo r]tOnd]
+rotor rOtP
+rotors rOtPz
+rototill rOt@til
+rototill rOt]til
+rototilled rOt@tild
+rototilled rOt]tild
+rototiller rOt@tilP
+rototiller rOt]tilP
+rototilles rOt@tilz
+rototilles rOt]tilz
+rototilling rOt@til6N
+rototilling rOt]til6N
+rotramel rotr}@l
+rotruck rotr@k
+rots rots
+rott rot
+rotted rot@d
+rotten rot~
+rottenberg rot~bPg
+rotter rotP
+rotterdam rotPdam
+rotting rot6N
+rottinghaus rot6Nh?s
+rottler rotlP
+rottman rotm~
+rottmann rotm~
+rotund r]tund
+rotunda r]tund@
+rotundo r]tUnd]
+rotunno r]tUn]
+rotz rots
+roubal rUbal
+rouble rUb@l
+rouch r?C
+roudabush r?d@bqS
+roudebush r?d@bqS
+rouge rUZ
+rougeau rUZO
+rough ruf
+rough's rufs
+roughed ruft
+rougher rufP
+roughest ruf@st
+roughing ruf6N
+roughly rufl/
+roughneck rufnek
+roughnecks rufneks
+roughness rufn@s
+roughshod rufSod
+rought r{t
+roughton ruft~
+rouillard rw/l)rd
+roukema rUkmo
+roukos rUk]s
+roulac rUlak
+rouleau rUlO
+roulette rUlet
+roulette's rUlets
+roulettes rUlets
+roulhac rUlh@k
+roulston r?lst~
+round r?nd
+round's r?ndz
+roundabout r?nd@b?t
+rounded r?nd@d
+rounder r?ndP
+roundhead r?ndhed
+roundhouse r?ndh?s
+rounding r?nd6N
+roundly r?ndl/
+rounds r?ndz
+rounds r?nz
+roundtable r?ndtAb@l
+roundtree r?ndtrE
+roundtrip r?ndtrip
+roundup r?ndup
+roundworm r?ndwPm
+roundworms r?ndwPmz
+roundy r?nd/
+rounsaville rUns@vil
+row rO
+row's rOz
+rowan rO~
+rowan's rO~z
+rowand rO~d
+rowboat rObOt
+rowbotham rOb@Tam
+rowden rOd~
+rowdies r?d/z
+rowdiness r?d/n@s
+rowdy r?d/
+rowe rO
+rowe's rOz
+rowed rOd
+rowell rO6l
+rowen rO~
+rowena r]En@
+rowenta rOent@
+rower rOP
+rowes rOz
+rowin rOin
+rowing rO6N
+rowinski r]insk/
+rowland rOl~d
+rowland's rOl~dz
+rowlands rOl~dz
+rowles rOlz
+rowlett rOlct
+rowlette rOlet
+rowley rOl/
+rowlie rOl/
+rowly rOl/
+rowney rOn/
+rowntree rOntrE
+rowntree's rOntrEz
+rowny rOn/
+rows rOz
+rowse rOs
+rowser rOzP
+rowsey rOs/
+rowson rOs~
+rowton rOt~
+rox roks
+rox's roks@z
+roxana roksan@
+roxani rokson/
+roxanna roksan@
+roxanne roksan
+roxborough roksb@r]
+roxbury roksber/
+roxie roks/
+roxine roksIn
+roxy roks/
+roy r<
+roy's r<z
+royal r<@l
+royal's r<@lz
+royale r<al
+royalist r<@list
+royall r<@l
+royally r<@l/
+royals r<@lz
+royals' r<@lz
+royalties r<@lt/z
+royalty r<@lt/
+roybal r<b@l
+royce r<s
+royce's r<s@z
+royces r<s@z
+roycroft r<kr@ft
+royd r<d
+royden r<d~
+roydon r<d~
+roye r<
+royer r<P
+royex r<cks
+royex's r<cks@z
+royko r<k]
+roylance r<l~s
+royle r<l
+roys r<z
+royse r<s
+royster r<stP
+royster's r<stPz
+royston r<st~
+roz roz
+roza rOz@
+rozak rOz@k
+rozanski r@zansk/
+rozar rOzP
+rozas rOzoz
+rozeboom roz@bUm
+rozek rOzck
+rozell roz@l
+rozella r]zel@
+rozelle r@zel
+rozema r@zEm@
+rozen roz~
+rozier rOz/P
+rozman rozm~
+roznowski r@zn{fsk/
+rozsa rOzs@
+rozycki r@zitsk/
+rozzell roz@l
+rozzi roz/
+rpf )rpEef
+rpm )rpEem
+rrrot )r)r)rOtE
+rrrot )rOtE
+rrrot rrot
+ru )ryU
+ru rU
+rua rU@
+ruam rU}
+ruane rUAn
+ruano rUon]
+ruark rUork
+rub rub
+ruback rUbak
+rubalcaba rUbolkob@
+rubalcava rUbolkov@
+rubano rUbon]
+rubbed rubd
+rubber rubP
+rubberize rubPIz
+rubberized rubPIzd
+rubbermaid rubPmAd
+rubbermaid's rubPmAdz
+rubbers rubPz
+rubbery rubP/
+rubbia rub/@
+rubbing rub6N
+rubbish rub6S
+rubble rub@l
+rubbo rUb]
+rube rUb
+rubeck rUbek
+rubel rUb@l
+rubell rUb@l
+rubella rUbel@
+ruben rUb~
+rubendall rub~d@l
+rubenfeld rub~fcld
+rubens rUb~z
+rubenstein rUb~st/n
+rubenstein rUb~stIn
+ruberg rUbPg
+rubert rUbPt
+ruberto rUb,rt]
+rubey rUb/
+rubi rUb/
+rubia rUb/@
+rubicam rUb6k}
+rubicam's rUb6k}z
+rubicon rUb6k{n
+rubie rUb/
+rubies rUb/z
+rubik rUb6k
+rubik's rUb6ks
+rubin rUbin
+rubin's rUbinz
+rubina rUbEn@
+rubino rUbEn]
+rubinson rub~s~
+rubinstein rUb~stEn
+rubinstein rUb~stIn
+rubio rUb/]
+rubios rUb/]z
+rubis rUb6s
+ruble rUb@l
+ruble's rUb@lz
+rubles rUb@lz
+rubley rubl/
+rubloff rubl{f
+rubottom rub@tom
+rubout rub?t
+rubric rUbr6k
+rubright rubrIt
+rubs rubz
+ruby rUb/
+ruby's rUb/z
+rucci rUC/
+ruch ruC
+ruchlamer rUkl}P
+ruchti rUkt/
+rucinski r@Cinsk/
+ruck ruk
+ruckel ruk@l
+ruckelshaus ruk@lzh?s
+rucker rukP
+ruckert rukPt
+rucki ruk/
+ruckle ruk@l
+ruckman rukm~
+rucks ruks
+ruckus ruk@s
+rud rud
+ruda rUd@
+rudani rUdon/
+rudasill rud@sil
+rudd rud
+ruddell rud@l
+rudden rud~
+rudder rudP
+rudderless rudPl@s
+ruddick rud6k
+ruddle rud@l
+ruddock rud@k
+ruddy rud/
+rude rUd
+rudeen rud/n
+rudel rUd@l
+rudell rud@l
+rudelle r@del
+rudely rUdl/
+ruden rUd~
+rudeness rUdn@s
+rudenstein rUd~st/n
+rudenstein rUd~stIn
+rudenstine rUd~ztIn
+ruder rUdP
+ruder's rUdPz
+ruderman rUdPm~
+rudesill rud@s@l
+rudest rUd@st
+rudge ruj
+rudi rUd/
+rudi's rUd/z
+rudich rUd6k
+rudich rud6k
+rudicker rud6kP
+rudie rUd/
+rudiger rud6gP
+rudiment rUd}~t
+rudimentary rUd}entP/
+rudiments rUd}~ts
+rudin rUdin
+ruding rUd6N
+rudis rUd/z
+rudisill rudisil
+rudkin rudkin
+rudloff rudl{f
+rudman rudm~
+rudman's rudm~z
+rudner rudnP
+rudnet rudnet
+rudnick rudn6k
+rudnicki r@dnik/
+rudnicky r@dnik/
+rudnik rudn6k
+rudolf rUdof
+rudolf rUdolf
+rudolph rUd{f
+rudolph rUd{lf
+rudow rUd]
+rudy rUd/
+rudy's rUd/z
+rudyard rudyPd
+rudzinski r@jinsk/
+rue rU
+rueb rUb
+ruebel rUb@l
+rueckert rUkPt
+rueda rUed@
+ruediger rUd6gP
+ruedlinger rUdl6NP
+ruedy rUd/
+ruef rUf
+rueff rUf
+rueful rUf@l
+ruefully rUf@l/
+rueger rqgP
+ruegg rUg
+ruegsegger rqgs6gP
+ruehl rql
+ruehle rUh@l
+ruel rUl
+ruelas rUl@z
+ruella rUel@
+ruelle rUel
+ruesch rUS
+ruess rUs
+ruest rUst
+rueter rUtP
+rueth rUT
+ruether rUTP
+ruetz rUts
+ruf ruf
+rufe rUf
+rufenacht rUf~okt
+rufener ruf/nP
+rufer rUfP
+ruff ruf
+ruffalo rUfol]
+ruffcorn rufkPn
+ruffer rufP
+ruffin rufin
+ruffing ruf6N
+ruffini rUfEn/
+ruffino rUfEn]
+ruffle ruf@l
+ruffled ruf@ld
+ruffles ruf@lz
+ruffling ruf@l6N
+ruffling rufl6N
+ruffner rufnP
+ruffo ruf]
+ruffolo rUfOl]
+rufford rufPd
+rufina rUfEn@
+rufo rUf]
+ruford rUfPd
+rufow rUf]
+rufty ruft/
+rufus rUf@s
+rug rug
+rugby rugb/
+ruge rUj
+rugen rug~
+ruger rUgP
+rugeroni rUjcrOn/
+rugg rug
+rugged rug@d
+ruggedly rug@dl/
+ruggeri rUj,r/
+ruggerio rUj,r/]
+ruggieri rUjir/
+ruggiero rUjir]
+ruggirello rUj6rel]
+ruggles rug@lz
+rugh ru
+rugs rugz
+ruh ru
+ruhe rUh
+ruhl rul
+ruhland rul~d
+ruhle rU@l
+ruhlman rUlm~
+ruhnau rUn?
+ruhnke ruNk
+ruhollah rUhol@
+ruhr rqr
+ruhrgas rqrg@s
+ruhul rUhUl
+ruin rU~
+ruined rU~d
+ruining rU~6N
+ruinous rU~@s
+ruins rU~z
+ruis rUiz
+ruiter rUtP
+ruiz rUwEz
+rujith rUjET
+rukavina r@k@vIn@
+rukeyser rUkAzP
+rula rUl@
+ruland rUl~d
+rule rUl
+rule's rUlz
+rulebook rUlbqk
+ruled rUld
+rulemaking rUlmAk6N
+ruler rUlP
+rulers rUlPz
+rules rUlz
+ruley rUl/
+ruling rUl6N
+ruling's rUl6Nz
+rulings rUl6Nz
+rulison rul@s~
+rulli rUl/
+rullman rulm~
+rullo rUl]
+rulon rUl~
+rum rum
+rumack rUmak
+rumage rum6j
+ruman rUm~
+rumania rUmAn/@
+rumanian rUmAn/~
+rumanian rUmAny~
+rumbaugh rumb{
+rumberger rumbPgP
+rumble rumb@l
+rumbled rumb@ld
+rumbles rumb@lz
+rumbley rumbl/
+rumbling rumb@l6N
+rumbling rumbl6N
+rumbling's rumb@l6Nz
+rumblings rumb@l6Nz
+rumblings rumbl6Nz
+rumbold rumbOld
+rumen rUm~
+rumer rUmP
+rumery rumP/
+rumfelt rumfelt
+rumford rumfPd
+rumina rUm~@
+ruminant rUm~~t
+ruminate rUm~At
+ruminated rUm~At@d
+rumination rUm~AS~
+ruminations rUm~AS~z
+ruminski r}insk/
+rumler rumlP
+rumley ruml/
+rummage rum6j
+rummaging rum6j6N
+rummel rum@l
+rummell rum@l
+rummy rum/
+rumney rumn/
+rumor rUmP
+rumore rUm{r
+rumored rUmPd
+rumors rUmPz
+rumour rUmP
+rumours rUmPz
+rump rump
+rumpel rump@l
+rumpf rumpf
+rumph rumf
+rumple rump@l
+rumpled rump@ld
+rumrill rumril
+rums rumz
+rumsey rumz/
+rumsfeld rumzfeld
+rumson rums~
+run run
+run's runz
+run-down rund?n
+run-on runon
+run-ons runonz
+runabout run@b?t
+runaround run@r?n
+runaround run@r?nd
+runaway run@wA
+runaways run@wAz
+runcie runs/
+runck ruNk
+runckel ruNk@l
+runco ruNk]
+rund rund
+rundall rund@l
+runde rund
+rundell rund@l
+rundle rund@l
+rundown rund?n
+rundquist rundkwist
+rung ruN
+runge runj
+rungs ruNz
+runion rUny~
+runions rUny~z
+runk ruNk
+runkel ruNk@l
+runkle ruNk@l
+runkles ruNk@lz
+runko runk]
+runnells run@lz
+runnels run@lz
+runner runP
+runner's runPz
+runners runPz
+runnin' run~
+running run6N
+runnings run6Nz
+runnion runy~
+runny run/
+runoff run{f
+runquist runkwist
+runs runz
+runte runt
+runup runup
+runups runups
+runway runwA
+runways runwAz
+runyan runy~
+runyon runy~
+runzheimer runzhImP
+ruocco rUOk]
+ruoff rU{f
+ruotolo rU]tOl]
+rupard rUpPd
+rupaul rUpol
+rupe rUp
+rupee rUpE
+rupees rUp/z
+rupees rUpEz
+rupert rUpPt
+ruperta rUp,rt@
+ruphy rUf/
+rupiah rUpI@
+ruple rUp@l
+rupley rupl/
+rupnow rupn]
+rupp rup
+ruppe rup
+ruppel rup@l
+ruppenthal rup~T@l
+ruppert rupPt
+rupprecht rUprekt
+ruprecht rupr6kt
+rupture rupCP
+ruptured rupCPd
+ruptures rupCPz
+rupturing rupCP6N
+rural rqr@l
+rurik rqr6k
+ruritania rqr@tAn/@
+rus rus
+rusalka rUsalk@
+rusch ruS
+rusche ruS
+ruscitti rUsCEt/
+rusconi rUskOn/
+ruse rUz
+rused rUzd
+ruseler rUs@lP
+ruses rUz@z
+rush ruS
+rush's ruS@z
+rushdie ruSd/
+rushdie's ruSd/z
+rushed ruSt
+rusher ruSP
+rushes ruS@z
+rushford ruSfPd
+rushin ruSin
+rushing ruS6N
+rushlow ruSlO
+rushmore ruSm{r
+rushton ruSt~
+rusin rUsin
+rusinko rUsiNk]
+rusk rusk
+rusk's rusks
+ruskin ruskin
+ruslan rusl~
+rusnak rusn@k
+rusnock rusn@k
+russ rus
+russa rUs@
+russak rus@k
+russe rus
+russe rus@z
+russel rus@l
+russel's rus@lz
+russell rus@l
+russell's rus@lz
+russellville rus@lvil
+russert rusPt
+russet rus@t
+russets rus@ts
+russett rus@t
+russey rus/
+russi rUs/
+russia ruS@
+russia's ruS@z
+russian ruS~
+russian's ruS~z
+russians ruS~z
+russians' ruS~z
+russification rUs@f@kAS~
+russification rus@f@kAS~
+russified rUs@fId
+russify rUs@fI
+russin rusin
+russler ruslP
+russman rusm~
+russo rUs]
+russolillo rUs]lE]
+russolillo rUs]lil]
+russom rus}
+russomanno rus}an]
+russow rus]
+russum rus}
+rust rust
+rust's rusts
+rustad rust@d
+rusted rust@d
+rustic rust6k
+rustigan rust6g~
+rustin rustin
+rusting rust6N
+rustle rus@l
+rustler ruslP
+rustlers ruslPz
+rustling rusl6N
+ruston rust~
+rustproof rustprUf
+rustproofing rustprUf6N
+rusts rus
+rusts russ
+rusts rusts
+rusty rust/
+ruszkowski ruSk{fsk/
+rut rut
+ruta rUt@
+rutan rUt~
+ruter rUtP
+rutgard rutgord
+rutger's rutgPz
+rutgers rutgPz
+ruth rUT
+ruth's rUTs
+ruthann rUTan
+ruthenberg ruT~bPg
+ruther rUTP
+rutherford ruTPfPd
+ruthie rUT/
+ruthless rUTl@s
+ruthlessly rUTl@sl/
+ruthlessness rUTl@sn@s
+ruthven ruTv~
+rutigliano rUt/gl/on]
+rutile rUt/l
+rutkoski r@tk?sk/
+rutkowski r@tk{fsk/
+rutland rutl~d
+rutledge rutl6j
+rutley rutl/
+rutman rutm~
+ruts ruts
+rutskoi rUtsk<
+rutskoi's rUtsk<z
+rutstein rutstEn
+rutstein rutstIn
+rutt rut
+ruttan rut~
+rutted rut@d
+rutten rut~
+ruttenberg rut~bPg
+rutter rutP
+ruttles rut@lz
+rutts ruts
+rutz ruts
+rutzen rutz~
+ruud rUd
+ruvalcaba rUvolkob@
+ruvolo rUvOl]
+ruwe rUw
+rux ruks
+ruxpin rukspin
+ruybal rIb@l
+ruyle rIl
+ruzek rUzck
+ruzich ruzih
+ruzicka rUzik@
+ruzzo rUz]
+rwanda r@wond@
+rwanda rUond@
+rwanda's r@wond@z
+rwanda's rUond@z
+rwandan r@wond~
+rwandan rUond~
+rwandan's r@wond~z
+rwandan's rUond~z
+rwandans r@wond~z
+rwandans rUond~z
+rwandese r@wodEz
+rwandese rUodEz
+ryal r/ol
+ryall r/ol
+ryals r/olz
+ryan rI~
+ryan's rI~z
+ryanair rI~er
+ryans rI~z
+ryba rib@
+ryback rIbak
+rybacki ribok/
+rybacki ribotsk/
+rybak rib@k
+rybakov rIb@kov
+rybakov's rIb@kovz
+rybarczyk ribPC6k
+ryberg rIbPg
+rybicki r@bitsk/
+rybinski r@binsk/
+rybka ribk@
+rybolt rib]lt
+ryburn ribPn
+rychlik riCl6k
+rychlik rikl6k
+ryckman rikm~
+rycroft rikr@ft
+ryczek riCck
+rydberg ridbPg
+rydell rid@l
+ryden rId~
+ryder rIdP
+ryder's rIdPz
+rydman ridm~
+rydzewski r6jefsk/
+rye rI
+ryen rI~
+ryer rIP
+ryerson rIrs~
+rygiel rig/l
+ryka rIk@
+ryker rIkP
+rykiel rEkycl
+rykiel rikycl
+rykoff rIk{f
+rykowski r6k{fsk/
+rylan rIl~
+ryland ril~d
+rylander ril~dP
+ryle rIl
+rylee ril/
+ryles rIlz
+ryley rIl/
+ryman rIm~
+rymer rImP
+rynders rindPz
+rynearson rinPs~
+ryner rInP
+rynes rInz
+ryno rin]
+ryobi rIOb/
+ryohei rI]hA
+ryon rI~
+ryrie rIr/
+rys ris
+rysavy risov/
+ryser rIsP
+ryskamp rIskamp
+ryther riTP
+ryton rit~
+ryutaro ryUt)r]
+ryuzo rIUz]
+ryzhkov rIzkov
+rzasa Pzos@
+rzepka Pzepk@
+s es
+s's es@z
+s. es
+s.'s es@z
+sa so
+saab sob
+saab's sobz
+saad sod
+saal sol
+saam som
+saamstaan somston
+saar s)r
+saari s)r/
+saarinen s)r~~
+saarinen s@rEn~
+saatchi soC/
+saatchi's soC/z
+saathoff soth{f
+saavedra sovAdr@
+sab's sabz
+saba sob@
+sabah sob@
+sabala sobol@
+sabalan sab@l~
+saban sAb~
+sabat sobot
+sabatine sobotEn/
+sabatini sab@tEn/
+sabatino sobotEn]
+sabatista sob@tEst@
+sabatista's sob@tEst@z
+sabatistas sob@tEst@z
+sabatistas' sob@tEst@z
+sabatka sobotk@
+sabato sobot]
+sabaudia s@b{d/@
+sabb sab
+sabbagh sab@g
+sabbath sab@T
+sabbatical s@bat6k@l
+sabedra s@bedr@
+sabel sobel
+sabella s@bel@
+sabena s@bEn@
+saber sAbP
+saberbein sAbPbIn
+sabers sAbPz
+sabertech sAbPtek
+sabey sAb/
+sabia sob/@
+sabin sAbin
+sabina s@bEn@
+sabine s@bEn
+sabino sobEn]
+sabins sAbinz
+sablan sabl~
+sable sAb@l
+sables sAb@lz
+sabo sob]
+sabol sob{l
+sabortech sAbPtek
+sabotage sab@toZ
+sabotaged sab@toZd
+sabotaging sab@toZ6N
+saboteur sab@tV
+saboteurs sab@tVz
+saboteurs sab@t{rz
+sabourin sabqran
+sabra sobr@
+sabre sAbP
+sabres sAbPz
+sabretech sAbPtek
+sabrina s@brEn@
+sabry sobr/
+sabta sabt@
+sabunuma sabUn}@
+sac sak
+sacca sak@
+saccharin sakP~
+saccharine sakPIn
+sacco sak]
+sacco's sak]z
+saccoccio sokOC/]
+saccomanno sak}an]
+saccone sokOn/
+saccule sakyUl
+sacha saC@
+sachdev saCdev
+sacher sakP
+sachi saC/
+sachs saks
+sachs soks
+sachs' saks
+sachs's saks@z
+sachse saCs
+sacilor sas@lP
+sacirbey sokPb/
+sacirbey's sokPb/z
+sack sak
+sacked sakt
+sackett sakct
+sacking sak6N
+sackler saklP
+sackman sakm~
+sackmann sakm~
+sackrider sakrIdP
+sacks saks
+sacksteder sakstedP
+sackville sakvil
+saco sAk]
+sacra sakr@
+sacrament sakr}~t
+sacramento sakr}ent]
+sacramento's sakr}ent]z
+sacraments sakr}~ts
+sacred sAkr@d
+sacredness sAkr@dn@s
+sacrifice sakr@fIs
+sacrificed sakr@fIst
+sacrifices sakr@fIs@z
+sacrificial sakr@fiS@l
+sacrificing sakr@fIs6N
+sacrilege sakr@l6j
+sacrilegious sakr@lej@s
+sacrosanct sakr]saNkt
+sacs saks
+sad sad
+sada sod@
+sadaka s@dok@
+sadako sodok]
+sadao s@d?
+sadat s@dat
+sadat sodot
+sadat's s@dats
+sadat's sodots
+saddam s@dom
+saddam sod}
+saddam's s@domz
+saddam's sod}z
+sadden sad~
+saddened sad~d
+saddening sadn6N
+saddening sad~6N
+saddens sad~z
+sadder sadP
+saddest sad@st
+saddle sad@l
+saddlebag sad@lbag
+saddlebags sad@lbagz
+saddled sad@ld
+saddler sad@lP
+saddles sad@lz
+saddling sad@l6N
+saddling sadl6N
+saddoris sadPis
+sadeghi sodeg/
+sadeh sode
+sadeh-koniecpol sodekOn/ekp{l
+sadek sad6k
+sadella s@del@
+sader sAdP
+sadie sad/
+sadie's sAd/z
+sadira sodir@
+sadism sAdiz}
+sadist sAd@st
+sadistic s@dist6k
+sadler sadlP
+sadlier sadl/P
+sadlon sadl~
+sadlowski sadl?sk/
+sadly sadl/
+sadness sadn@s
+sado sAd]
+sadoff sad{f
+sadowski s@d{fsk/
+sadowsky s@d?sk/
+sadye sadI
+saechao sEC?
+saeed soEd
+saeger segP
+saehan sA~
+saelens sel~z
+saemaul sAm{l
+saenger senjP
+saens's sAnz@z
+saenz sEnz
+saez sEz
+safari s@f)r/
+safarik safP6k
+safaris s@f)r/z
+safdie safd/
+safe sAf
+safecard sAfkord
+safecard's sAfkordz
+safeco sAfk]
+safeguard sAfgord
+safeguarded sAfgord@d
+safeguarding sAfgord6N
+safeguards sAfgordz
+safehouse sAfh?s
+safekeeping sAfkEp6N
+safely sAfl/
+safer sAfP
+safes sAfs
+safest sAf@st
+safety sAft/
+safety's sAft/z
+safeway sAfwA
+safeway's sAfwAz
+saffell saf@l
+saffer safP
+safferstein safPstEn
+safferstein safPstIn
+saffle saf@l
+safflower safl?P
+saffold safOld
+safford safPd
+saffran safr~
+saffron safr~
+safian sAf/~
+safier s@fir
+safing sAf6N
+safir safP
+safire s@fIr
+safire's s@fIrz
+safko sofk]
+safley safl/
+safra safr@
+safra's safr@z
+safran safr~
+safranek safr~6k
+safrit safr@t
+sag sag
+saga sog@
+sagan sAg~
+sagansky s@gansk/
+sagar sog)r
+sagas sog@z
+sage sAj
+sage's sAj@z
+sagebrush sAjbruS
+sagen sag~
+sager sAgP
+sagers sAgPz
+sages sAj@z
+sagged sagd
+saggese sag/z
+sagging sag6N
+saginaw sag~{
+sago sAg]
+sagona sogOn@
+sagraves sogrovcs
+sags sagz
+saguaro s@gw{r]
+saha soh@
+sahagian s@hEj/~
+sahagun sah@g~
+sahara s@h,r@
+saharan sahP~
+sahgal sog@l
+sahl sol
+sahlen sol~
+sahli sol/
+sahlin solin
+sahlman solm~
+sahm sam
+sahr sar
+sai esAI
+sai sI
+saia soy@
+said sed
+saidan sAd~
+saidiner sAd~P
+saif sIf
+saif soEf
+saigon sIgon
+saiki sAk/
+sail sAl
+sailboat sAlbOt
+sailboats sAlbOts
+sailed sAld
+sailer sAlP
+sailfish sAlfiS
+sailing sAl6N
+sailor sAlP
+sailor's sAlPz
+sailors sAlPz
+sailors' sAlPz
+sails sAlz
+sain sAn
+sainato s~ot]
+saindon sAnd~
+saine sAn
+sainsbury sAnsbcr/
+saint sAnt
+saint's sAnts
+sainted sAnt@d
+sainthood sAnthqd
+saintly sAntl/
+saints sAnts
+saints' sAnts
+sainz sAnz
+saipan sAp~
+saipan's sAp~z
+sais sAz
+saison sAson
+saitama so@tom@
+saito sAtO
+saitta sAt@
+saiz sAz
+sajak sajak
+sajdak sId@k
+sak sak
+sakaguchi sokogUC/
+sakai soko/
+sakal sAk@l
+sakamoto sokomOt]
+sakata sokot@
+sakau sokoU
+sake sAk
+saker sAkP
+sakes sAks
+sakhalin sakh@l~
+sakharov sokPov
+saki sok/
+sakigake sok/gok/
+sakina s@kEn@
+sako sok]
+sakowitz sak@wits
+sakowski s@k{fsk/
+saks saks
+saks's saks@z
+saksa saks@
+saksida soksEd@
+sakuma sokUm@
+sakura sakqr@
+sakurai sokqro/
+sal sal
+sal's salz
+sala sol@
+salaam s@lom
+salable sAl@b@l
+salables sAl@b@lz
+salacious s@lAS@s
+salad sal@d
+salada s@lod@
+saladin sal@d~
+saladino solodEn]
+salads sal@dz
+salafia s@lAf/@
+salah sal@
+salak sal@k
+salam solom
+salama solom@
+salamanca sal}aNk@
+salamander sal}andP
+salamanders sal}andPz
+salameh solomc
+salameh's solomcz
+salami s@lom/
+salamis s@lom/z
+salamon sal}~
+salamone sal}On
+salant sal~t
+salaried salP/d
+salaries salP/z
+salary salP/
+salarymen salP/m~
+salas soloz
+salata solot@
+salatino solotEn]
+salay salA
+salaz soloz
+salazar sal@zor
+salberg salbPg
+salce sAls
+salcedo solCAd]
+salcido solCEd]
+saldana soldan@
+saldivar sold/v)r
+saldovar sold@v)r
+sale sAl
+sale's sAlz
+saleable sAl@b@l
+saleeby sal/b/
+saleem sal/m
+saleh solch
+salek solck
+salem sAl}
+salem's sAl}z
+salema s@lEm@
+salemi solem/
+salemme salcm
+salerno s@l,rn]
+sales sAlz
+sales' sAlz
+salesman sAlzm~
+salesman's sAlzm~z
+salesmanship sAlzm~Sip
+salesmen sAlzmcn
+salesmen's sAlzmcnz
+salespeople sAlzpEp@l
+salesperson sAlzpVs~
+saleswoman sAlzwqm~
+saleswomen sAlzwim~
+salgado solgod]
+salguero solg,r]
+salhany salhAn/
+saliba solEb@
+salick sal6k
+salient sAl/~t
+salient sAly~t
+saligman sal6gm~
+salim salim
+salim sol/m
+salin solEn
+salina s@lEn@
+salinas s@lEn@s
+salinas s@lEn@z
+salinas' s@lEn@s
+salinas' s@lEn@z
+salinas's s@lEn@s@z
+saline s@lEn
+saling sAl6N
+salinger sal6NP
+salinger sal~jP
+salinger's sal@NPz
+salinger's sal~jPz
+salingers sal@NPz
+salingers sal~jPz
+salinity s@lin@t/
+salis solis
+salisbury salzbP/
+saliva s@lIv@
+salivate sal@vAt
+salivated sal@vAt@d
+salivating sal@vAt6N
+salizzoni sal@zOn/
+salk s{k
+salk's s{ks
+salkeld salkcld
+salkin salk~
+sall s{l
+sallade salAd
+sallas soloz
+salle sAl
+sallee sal/
+salleh solc
+saller s{lP
+salles solcs
+salley sal/
+sallie sal/
+sallies sal/z
+salling s{l6N
+sallis salis
+salls s{lz
+sally sal/
+sally's sal/z
+salm som
+salman sam~
+salmans sam~z
+salmela solmAl@
+salmen salmen
+salmeron solmcr{n
+salmi solm/
+salminen salm~~
+salmon sam~
+salmond salm~d
+salmonella salm~el@
+salmons sam~z
+salmonson solmOns~
+salo sol]
+salois s@lwo
+saloma solOm@
+salome s@lOm/
+salomi solOm/
+salomon sal}~
+salomon's sal}~z
+salomone sol]mOn/
+salon s@lon
+salone s@lOn
+salonga s@l{Ng@
+salons s@lonz
+saloojee s@lUj/
+saloon s@lUn
+saloons s@lUnz
+salopek sal@p6k
+salow sal]
+salsa s{ls@
+salsberry s{lsbcr/
+salsbery salsbP/
+salsbury salzbP/
+salser sAlsP
+salsgiver salsg6vP
+salsman s{lsm~
+salt s{lt
+saltarelli s{ltorel/
+saltbox s{ltboks
+salted s{lt@d
+salter s{ltP
+salter's s{ltPz
+salters s{ltPz
+saltier s{lt/P
+salting s{lt6N
+saltlike s{ltlIk
+saltmarsh s{ltmorS
+salton s{lt~
+salts s{lts
+saltsman s{ltsm~
+saltwater s{ltwotP
+salty s{lt/
+saltz salts
+saltzburg s{ltsbPg
+saltzman s{ltsm~
+salus sal@s
+salutary saly@ter/
+salutatorian s@lUt@t{r/~
+salute s@lUt
+saluted s@lUt@d
+salutes s@lUts
+saluting s@lUt6N
+salva solv@
+salvador salv@d{r
+salvador's salv@d{rz
+salvadoran salv@d{r~
+salvadorans salv@d{r~z
+salvadore solvod{rA
+salvage salv@j
+salvageable salv6j@b@l
+salvaged salv6jd
+salvager salv6jP
+salvagers salv6jPz
+salvaggio solvoj/]
+salvaging salv6j6N
+salvas solvoz
+salvati solvot/
+salvatierra solvotir@
+salvation salvAS~
+salvato solvot]
+salvatore salv@d{r
+salvatore salv@t{r/
+salvatori solvot{r/
+salve sov
+salves sovz
+salvesen solvEz~
+salveson solvAs~
+salvetti solvet/
+salvi solv/
+salvi's solv/z
+salvia salv/@
+salvigsen salv6gs~
+salvigsten salv6gst~
+salvina solvEn@
+salvino salvEn]
+salvo salv]
+salvos salv]z
+salvucci solvUC/
+salway salwA
+salwen salw~
+salyard s{lyPd
+salyards salyordz
+salyer sol/P
+salyers sol/Pz
+salz s{lz
+salzano solzon]
+salzberg s{ltsbPg
+salzberg s{lzbPg
+salzburg s{ltsbPg
+salzburg s{lzbPg
+salzer sAlzP
+salzgitter s{ltsgitP
+salzhauer s{lts?r
+salzhauer s{ltsh?r
+salzman s{lzm~
+salzmann s{lzm~
+salzwedel salzw@d@l
+sam sam
+sam's samz
+sam-joo somjU
+sama som@
+samaha sam@h@
+samaniego somonEg]
+samano somon]
+samantha s}anT@
+samar samor
+samara samP@
+samaranch samPanC
+samaras samP@z
+samaria sAmPE@
+samarin som)r/n
+samaritan s},r@t~
+samaritans s},r@t~z
+samarkand samorkand
+samatar sam@tor
+samba somb@
+samberg sambPg
+sambo samb]
+samborski s}b{rsk/
+sambrano sombron]
+sambre sambr@
+sambuca sambyUk@
+samcor samk{r
+same sAm
+samedan sam@d~
+sameer somir
+samek sam6k
+samella s}el@
+samelle s}el
+samelson sam@ls~
+sameness sAmn@s
+samerol samP{l
+sames sAmz
+samet samct
+samford samfPd
+sami sam/
+sami's sam/z
+samina s}in@
+samir somir
+samir s}ir
+sammarco som)rk]
+sammartino somortEn]
+sammet sam@t
+sammie sam/
+sammis samis
+sammon sam~
+sammons sam~z
+samms samz
+sammut sam@t
+sammy sam/
+samoa s}O@
+samoan s}O~
+samojlik s}<l6k
+samons som]nz
+samora som{r@
+samos sAmos
+samoth sam@T
+samp samp
+sampan sampan
+sampans sampanz
+samper sampP
+samper's sampPz
+sampere sampEr
+sampey samp/
+sample samp@l
+sample's samp@lz
+sampled samp@ld
+sampler samplP
+samplers samplPz
+samples samp@lz
+sampley sampl/
+sampling sampl6N
+samplings sampl6Nz
+sampras sampr@s
+sampras' sampr@s
+sampras's sampr@s@z
+sampre sampP
+sampre sampr/
+sampsel samps@l
+sampsell samps@l
+sampson samps~
+samra samr@
+sams samz
+samsara s}s)r@
+samsel sams@l
+samsom sams}
+samson sams~
+samsonite sams~It
+samsung samsuN
+samsung's samsuNz
+samudio somUd/]
+samuel samyUl
+samuel's samyUlz
+samuela samyUel@
+samuelle samyUel
+samuels samyU@lz
+samuelsen samqls~
+samuelson samyU@ls~
+samurai samPI
+samurai's samPIz
+samurais samPIz
+san san
+san-andreas sanondrA@s
+san-diego sand/Ag]
+san-fran sanfran
+san-francisco sanfransisk]
+san-juan sanwon
+san-salvador sansalv@d{r
+sana son@
+sanaa s~o
+sanabria s~abr/@
+sanada sonod@
+sanborn sanb{rn
+sanches sonCcs
+sanchez sanCcz
+sanchez's sanCcz@z
+sancho sonk]
+sancia sonC@
+sanctification saNkt@f@kAS~
+sanctify saNkt@fI
+sanctimonious saNkt}On/@s
+sanctimony saNkt}On/
+sanction saNS~
+sanction saNkS~
+sanctioned saNS~d
+sanctioned saNkS~d
+sanctioning saNS~6N
+sanctioning saNkS~6N
+sanctions saNS~z
+sanctions saNkS~z
+sanctity saNkt@t/
+sanctuaries saNkCUer/z
+sanctuary saNkCUer/
+sanctum saNkt}
+sand sand
+sand's sandz
+sanda sand@
+sandage sand6j
+sandahl sandol
+sandal sand@l
+sandall sandol
+sandalo sandal]
+sandals sand@lz
+sandau sand?
+sandbag sandbag
+sandbagged sandbagd
+sandbagger sandbagP
+sandbaggers sandbagPz
+sandbagging sandbag6N
+sandbags sandbagz
+sandbar sandbor
+sandberg sandbPg
+sandblast sandblast
+sandblasted sandblast@d
+sandbox sandboks
+sandburg sandbPg
+sande sand
+sanded sand@d
+sandeen sand/n
+sandefer sand/fP
+sandefur sandcfP
+sandel sandcl
+sandell sandcl
+sanden sand~
+sander sandP
+sanderfer sandPfP
+sanderford sandPf{rd
+sanderlin sandPlin
+sanders sandPz
+sanders's sandPz@z
+sanderson sandPs~
+sandford sandfPd
+sandgren sandgrcn
+sandhill sandhil
+sandhog sandh{g
+sandhogs sandh{gz
+sandhu sandhU
+sandi sand/
+sandia sand/@
+sandidge sand6j
+sandie sand/
+sandifer sandIfP
+sandiford sand@fPd
+sandin sandin
+sanding sand6N
+sandinista sand~Est@
+sandinista sand~ist@
+sandinistas sand~Est@z
+sandinistas' sand~Est@z
+sandino sandEn]
+sandino's sandEn]z
+sandler sandlP
+sandlin sandlin
+sandling sadl6N
+sandman sandman
+sandmann sandm~
+sandmeyer sandmIP
+sandner sandnP
+sandness sandn@s
+sando sand]
+sandom sand}
+sandon sand{n
+sandor sandP
+sandos sand]s
+sandos sand]z
+sandose sand]z
+sandoval sandOv@l
+sandow sand]
+sandoz sand]z
+sandoz's sand@z@z
+sandpaper sandpApP
+sandpoint sandp<nt
+sandquist sandkwist
+sandra sandr@
+sandridge sandrij
+sandro sandr]
+sandrock sandrok
+sands sandz
+sandstone sandstOn
+sandstone sanstOn
+sandstorm sandst{rm
+sandstorms sandst{rmz
+sandstrom sandstr}
+sandt sant
+sandtown sandt?n
+sandtown sant?n
+sandusky sandusk/
+sandvig sandvig
+sandvik sandv6k
+sandwich samw6C
+sandwich sandw6C
+sandwich sanw6C
+sandwiched samwiCt
+sandwiched sandwiCt
+sandwiched sanwiCt
+sandwiches samw6C@z
+sandwiches sandw6C@z
+sandwiches sanw6C@z
+sandwick sandwik
+sandy sand/
+sandy's sand/z
+sane sAn
+saner sAnP
+sanfilippo sanf@lip]
+sanford sanfPd
+sanford's sanfPdz
+sang saN
+sang-gon soNg{n
+sanger saNP
+sangiovese sanjE]vEs
+sangster saNstP
+sanguine saNgwin
+sanguinetti soN/net/
+sangyo sanjy]
+sani san/
+sani san6
+sanitary san@ter/
+sanitation san@tAS~
+sanitize san@tIz
+sanitized san@tIzd
+sanitizing san@tIz6N
+sanity san@t/
+sanjay sanjA
+sanjiv sonjEv
+sanjuan sonyUon
+sank saNk
+sanka saNk@
+sankei saNk/
+sanker saNkP
+sankey saNk/
+sanko saNk]
+sanks saNks
+sankyo saNky]
+sanmark sanmork
+sanmartin sanmortin
+sanmiguel sonm/gel
+sanna san@
+sanner sanP
+sannes sanz
+sano son]
+sanofi s~Of/
+sanrio sanr/]
+sans sanz
+sansbury sansbcr/
+sanseverino sonscvPEn]
+sansing sans6N
+sanskrit sanskrit
+sanso sans]
+sansom sans}
+sanson sans~
+sansone sans~
+sansoucie sans]k/
+sansui sansU/
+sansui's sansU/z
+sant sant
+santa san@
+santa sant@
+santa's san@
+santa's sant@
+santa-croce san@krOC/
+santa-croce sant@krOC/
+santa-cruz san@krUz
+santa-cruz sant@krUz
+santa-fe san@fA
+santa-fe sant@fA
+santa-fe's san@fAz
+santa-fe's sant@fAz
+santa-maria sant}PE@
+santa-maria san}PE@
+santagata sontogot@
+santala santol@
+santana santan@
+santander santandP
+santangelo sontoNgel]
+santaniello sonton/el]
+santarelli sontorel/
+santarsiero sontorsir]
+santas sant@s
+santayana santIon@
+sante sant@
+santella sontel@
+santelli sontel/
+santer santP
+santeria sant,r/@
+santerre sant,r
+santi sant/
+santiago sant/og]
+santiesteban sant/stcb~
+santillan santil~
+santillanes sant@lAnz
+santilli sontEl/
+santillo santil]
+santin santin
+santini santEn/
+santino sontEn]
+santistevan sont/stAvon
+santo sant]
+santon sant~
+santone sontOn/
+santoni sontOn/
+santopietro sont]pEtr]
+santor santP
+santora sont{r@
+santore sont{r/
+santorelli sont{rel/
+santoro sant{r]
+santorum sant{r}
+santorum's sant{r}z
+santos sant]s
+santosh sontoS
+santosuosso sont]swOs]
+santow sant]
+santoyo sontOy]
+santry santr/
+santucci sontUC/
+santulli sontUl/
+santy sant/
+sanville sonvil
+sanwa sanw@
+sanwa's sanw@z
+sanyo sony]
+sanz sanz
+sanzo sanz]
+sanzone sonzOn/
+sao s?
+saone sAOn
+saouma s?yUm@
+sap sap
+sapanski s@pansk/
+saperstein sApPst/n
+saperstein sApPstIn
+saphira sofir@
+sapia sop/@
+sapien sap/n
+sapiens sAp/~z
+sapienza sopEnz@
+sapiro s@pir]
+sapling sapl6N
+saplings sapl6Nz
+sapoa s@pO@
+sapone sopOn/
+saponification s@pon@f@kAS~
+saporito sop{rEt]
+sapp sap
+sapped sapt
+sappenfield s@penf/ld
+sapper sapP
+sapphire safIP
+sapping sap6N
+sappington sap6Nt~
+sapporo s@p{r]
+saps saps
+saputo sopUt]
+sar s)r
+sara s,r@
+sara's s,r@z
+sarabia sPAb/@
+saracco sorok]
+saraceni soroCen/
+saraceno soroCen]
+saracens s,r@s~z
+saracino soroCEn]
+sarafian sPAf/~
+sarafin sar@fin
+sarafina sar@fEn@
+sarage sar@j
+sarage's sar@j@z
+sarah s,r@
+sarah's s,r@z
+sarajevan sor@yAv~
+sarajevan's sor@yAv~z
+sarajevans sor@yAv~z
+sarajevo sor@yAv]
+sarajevo's sor@yAv]z
+saran sPan
+sarandon s,r~d~
+sarandon serand~
+sarant sar~t
+sarasin s)r@s~
+sarasota ser@sOt@
+saratoga ser@tOg@
+saratov s,r@t{f
+saratov s,r@t{v
+saravia sPAv/@
+sarawak s,r@wok
+sarazen s,r@z~
+sarazin sorozEn
+sarbane s)rbAn
+sarbanes s)rbAnz
+sarber s)rbP
+sarcasm s)rkaz}
+sarcastic sorkast6k
+sarcastically sorkast6kl/
+sarchet sorSet
+sarcoma sorkOmP
+sarcophagus sorkof@g@s
+sardas s)rd@s
+sardella sordel@
+sardina sordEn@
+sardinas s)rdin@z
+sardine sordEn
+sardines sordEnz
+sardinha sordinh@
+sardinia sordEn/@
+sardo s)rd]
+sardonic sordon6k
+sardonically sordon6k@l/
+sardonically sordon6kl/
+sare s,r
+sarejevo sor@yAv]
+sarejevo's sor@yAv]z
+sarene sPEn
+sarette sPet
+sarff s)rf
+sargasso sorgas]
+sarge s)rj
+sargeant s)rj~t
+sargen s)rg~
+sargent s)rj~t
+sargis s)rgis
+sari s)r/
+sari's s)r/z
+sarich sar6k
+sarin sorin
+sarine sorEn/
+saris s)r/z
+sarisi s@rEs/
+sark s)rk
+sarka s)rk@
+sarkar s)rkor
+sarkis s)rkis
+sarkisian sorkiZ~
+sarkissian sorkisZ~
+sarles s)rlz
+sarli s)rl/
+sarlo s)rl]
+sarlos s)rl]s
+sarmatian sormAS~
+sarmento sorment]
+sarmiento sormEnt]
+sarna s)rn@
+sarney s)rn/
+sarney's s)rn/z
+sarni s)rn/
+sarno s)rn]
+sarnoff s)rn{f
+sarnowski sPn{fsk/
+sarofim ser@fEm
+sarokin s,r@kin
+sarong sP{N
+sarongs sP{Nz
+saros s)r]s
+sarra s)r@
+sarratt sPat
+sarrazin s)r@zin
+sarrett sarct
+sarris saris
+sarro s)r]
+sars s)rz
+sarsfield s)rsf/ld
+sartain sortAn
+sarti s)rt/
+sartin s)rtin
+sartor s)rtP
+sartori sort{r/
+sartorial sort{r/@l
+sartorius sort{r/@s
+sartrain s)rtrAn
+sartre s)rtr@
+sartwell s)rtwel
+sarum sar}
+sarver s)rvP
+sarvis s)rvis
+sas sas
+sasaki sosok/
+sasayama sas@yom@
+sasek sas6k
+sash saS
+sasha saS@
+sashes saS@z
+saskatchewan saskaC@w{n
+saskatoon sask@tUn
+saslow sasl]
+sasnett sasnct
+sass sas
+sassafras sas@fras
+sassafras's sas@fras@z
+sassaman sas}~
+sassano soson]
+sasse sas
+sasseen sas/n
+sasser sasP
+sasser's sasPz
+sassi sas/
+sassman sasm~
+sassnet sasnet
+sassnet's sasnets
+sassnets sasnets
+sasso sas]
+sasson sas~
+sassone sosOn/
+sassoon s@sUn
+sassulo s@sUl]
+sassy sas/
+sassy's sas/z
+sat sat
+satagaj sat@gI
+satan sAt~
+satanic s@tan6k
+satanism sAt~iz}
+satanist sAt~ist
+satchell saC@l
+satcher saCP
+sate sAt
+sated sAt@d
+satellite sat@lIt
+satellite's sat@lIts
+satellites sat@lIts
+sater satP
+sates sAts
+sather saTP
+sathre saTP
+sathyavagiswaran saTy@vog@swor~
+satin sat~
+satire satIP
+satires satIPz
+satiric s@tir6k
+satirical s@tir@k@l
+satirist satP@st
+satirists satP@s
+satirists satP@ss
+satirists satP@sts
+satirize satPIz
+satirizes satPIz@z
+satirizing satPIz6N
+satisfaction sat@sfakS~
+satisfactions sat@sfakS~z
+satisfactorily sat@sfaktr@l/
+satisfactory sat@sfaktP/
+satisfied sat@sfId
+satisfies sat@sfIz
+satisfy sat@sfI
+satisfying sat@sfI6N
+satloff satl{f
+sato sot]
+satoh sot]
+satoshi sotOS/
+satre sAtP
+satriani satr/on/
+satter satP
+satterfield satPfEld
+satterlee satPlE
+satterly satPl/
+satterwhite satPwIt
+sattler satlP
+saturate saCPAt
+saturated saCPAt@d
+saturating saCPAt6N
+saturation saCPAS~
+saturday satPd/
+saturday satidA
+saturday's satPd/z
+saturday's satPdAz
+saturdays satPd/z
+saturdays satPdAz
+saturn satPn
+saturn's satPnz
+saturns satPnz
+satya soty@
+satyandra sotyondr@
+satz sats
+sauber s{bP
+sauce s{s
+sauceda s?sAd@
+saucedo s?sAd]
+saucepan s{span
+saucer s{sP
+saucers s{sPz
+sauces s{s@z
+saucier s{s/P
+saucy s{s/
+saud s{d
+sauder s{dP
+saudi s?d/
+saudi s{d/
+saudia s?d/@
+saudia s{d/@
+saudis s?d/z
+saudis s{d/z
+saudis' s?d/z
+saudis' s{d/z
+sauer s?P
+sauerkraut s?Pkr?t
+sauers s?Pz
+sauerteig s?PtAg
+sauerwein s?PwIn
+sauey s{/
+saugerties s{gPt/z
+sauk s{k
+saul s{l
+saulnier s?ln/P
+sauls s{lz
+saulsberry s{lsber/
+saulsbury s{lsbcr/
+sault s{lt
+saulter s{ltP
+saulters s?ltPz
+saum s{m
+sauna s{n@
+saunas s{n@z
+saunders s{ndPz
+saunders' s{ndPz
+saunders's s{ndPz@z
+saunderson s{ndPs~
+saundra s{ndr@
+saundra's s{ndr@z
+saunier s{n/P
+saunter s{ntP
+saur s{r
+saurer s?Pr
+sauro s{r]
+saus s{z
+sausage s{s@j
+sausages s{s6j@z
+sausalito s{s@lEt]
+sause s{z
+sauseda s?sAd@
+sauser s?sP
+sausser s{sP
+saute s{tA
+sauteed s{tAd
+sauter s{tAP
+sauterne s]tVn
+sauternes s]tVnz
+sautter s{tP
+sauvage s{v6j
+sauvageau sOv@Z]
+sauve s{v
+sauvignon s{vinyon
+sava sov@
+savage sav6j
+savaged sav6jd
+savagely sav6jl/
+savagery sav6jer/
+savages sav@j@z
+savaging sav6j6N
+savaiko s@vAk]
+savala sovol@
+savalas s@vol@s
+savanna s@van@
+savannah s@van@
+savannas s@van@z
+savant s@vont
+savants sav~ts
+savard savPd
+savarese sovorAz/
+savarino sovorEn]
+savary savcr/
+savas sovoz
+savasta s@vast@
+savastano sovoston]
+save sAv
+save's sAvz
+saved sAvd
+savedra s@vedr@
+savel sovel
+savell sovAl
+savely sAvl/
+saver sAvP
+savers sAvPz
+savery sAvP/
+saves sAvz
+saviano sov/on]
+savich sav6C
+savickas sav6k@z
+savidge sav6j
+savier sAvyP
+savikas s@vEk@s
+savill sovEl
+saville sovil
+savimbi s@vimb/
+savin savin
+savin's savinz
+savina s@vEn@
+saving sAv6N
+savings sAv6Nz
+savings' sAv6Nz
+savings's sAv6Nz
+savings's sAv6Nz@z
+savini sovEn/
+savino sovEn]
+savio sov/]
+savion sav/{n
+savion savy{n
+savior sAvyP
+savior's sAvyPz
+saviors sAvyPz
+savir s@vEr
+savir sAvP
+savitch sav6C
+savitsky s@vitsk/
+savitt s@vit
+savitz savits
+savko savk]
+savo sov]
+savoca sovOk@
+savoia sovOy@
+savoie sovwo
+savon sAv{n
+savona sovOn@
+savor sAvP
+savored sAvPd
+savoring sAvP6N
+savors sAvPz
+savory sAvP/
+savoy s@v<
+savr sAvP
+savviest sav/@st
+savvy sav/
+saw s{
+sawa s{w@
+sawall s{w{l
+sawasdee s@wozd/
+sawatzky s@wotsk/
+sawaya s{woy@
+sawchuk s{C@k
+sawdey s{d/
+sawdon s{d~
+sawdust s{dust
+sawdy s{d/
+sawed s{d
+sawhill s{hil
+sawicki s{itsk/
+sawicz s?its
+sawin s{/n
+sawing s{6N
+sawka s{k@
+sawmill s{mil
+sawmills s{milz
+saws s{z
+sawshank s{Sank
+sawtell s{tel
+sawtelle s{tel
+sawyer s<P
+sawyer s{yP
+sawyer's s{yPz
+sawyers s{yPz
+sax saks
+saxby saksb/
+saxe saks
+saxena saks~@
+saxer saksP
+saxman saksm~
+saxon saks~
+saxon's saks~z
+saxona saks~@
+saxons saks~z
+saxony saks~/
+saxophone saks@fOn
+saxophones saks@fOnz
+saxophonist saks@fOnist
+saxton sakst~
+say sA
+sayad sIad
+sayad's sIadz
+saybrook sAbrqk
+saye sA
+sayed sAd
+sayed sAyid
+sayed soyed
+sayegh sA6g
+sayer sAP
+sayers sAPz
+sayin' sA~
+saying sA6N
+sayings sA6Nz
+sayito sIEt]
+sayle sAl
+sayler sAlP
+sayles sAlz
+saylor sAlP
+saylors sAlPz
+sayre s,r
+sayres s,rz
+says sez
+says siz
+sayyid sI@d
+sazama sozom@
+sbarro sb)r]
+sbf esbEef
+scab skab
+scabbard skabPd
+scabs skabz
+scaccia skoC@
+scad skad
+scadden skad~
+scads skadz
+scaduto skodUt]
+scaff skaf
+scaffidi skofEd/
+scaffold skaf@ld
+scaffolding skaf@ld6N
+scaffolds skaf@ldz
+scafidi skofEd/
+scaggs skagz
+scaglione skagl/On/
+scags skagz
+scahill skAhil
+scaife skAf
+scala skol@
+scalamandre skal}andP
+scalamandre skol}ondP
+scalar skAlP
+scald sk{ld
+scalded sk{ld@d
+scalding sk{ld6N
+scalds sk{ldz
+scale skAl
+scaleatron skAl/@tr{n
+scaled skAld
+scalera skol,r@
+scales skAlz
+scalese skolAz/
+scalf skalf
+scalfaro skalf)r]
+scali skAl/
+scali skol/
+scalia skol/@
+scalia skoly@
+scalia's skol/@z
+scalia's skoly@z
+scaling skAl6N
+scalise skolIz
+scalisi skolEs/
+scallan skal~
+scallion skaly~
+scallions skaly~z
+scallon skal~
+scallop skal@p
+scalloped skol@pt
+scallops skal@ps
+scally skal/
+scalp skalp
+scalped skalpt
+scalpel skalp@l
+scalpels skalp@lz
+scalper skalpP
+scalpers skalpPz
+scalping skalp6N
+scalps skalps
+scalzi skolz/
+scalzitti skolzEt/
+scalzo skolz]
+scam skam
+scammed skamd
+scammell skam@l
+scammer skamP
+scammers skamPz
+scammon skam~
+scamper skampP
+scampered skampPd
+scampering skampP6N
+scams skamz
+scan skan
+scandal skand@l
+scandal's skand@lz
+scandalize skand@lIz
+scandalized skand@lIzd
+scandalous skand@l@s
+scandals skand@lz
+scandia skand/@
+scandinavia skand~Av/@
+scandinavia's skand~Av/@z
+scandinavian skand~Av/~
+scandinavians skand~Av/~z
+scania skon/@
+scanlan skanl~
+scanland skanl~d
+scanlin skanlin
+scanlon skanl~
+scanlon's skanl~z
+scanned skand
+scannell skan@l
+scanner skanP
+scanners skanPz
+scanning skan6N
+scans skanz
+scant skant
+scantily skant@l/
+scantiness skant/n@s
+scantlin skantlin
+scanty skant/
+scapa skop@
+scape skAp
+scapegoat skApgOt
+scapegoated skApgOt@d
+scapegoating skApgOt6N
+scapegoats skApgOts
+scapula skapy@l@
+scar sk)r
+scaramouch skar}?C
+scarano skoron]
+scarberry sk)rber/
+scarborough sk)rbV]
+scarbro sk)rbr]
+scarbrough sk)rbr?
+scarce sk,rs
+scarcella skorsel@
+scarcely sk,rsl/
+scarcer sk,rsP
+scarcity sk,rs@t/
+scardina skordEn@
+scardino skordEn]
+scare sk,r
+scarecrow skarkr]
+scared sk,rd
+scares sk,rz
+scarf sk)rf
+scarface sk)rfAs
+scarff sk)rf
+scarfo sk)rf]
+scarfs sk)rfs
+scargill sk)rgil
+scarier sk,r/P
+scariest sk,r/@st
+scaring sk,r6N
+scarlata skorlot@
+scarlet sk)rl@t
+scarlett sk)rlct
+scarola skorOl@
+scarp sk)rp
+scarpa sk)rp@
+scarpati skorpot/
+scarpelli skorpel/
+scarpello skorpel]
+scarpinatto skorp~ot]
+scarpino skorpEn]
+scarpone skorpOn/
+scarpulla skorpql@
+scarred sk)rd
+scarring sk)r6N
+scarry skar/
+scars sk)rz
+scarsdale sk)rzdAl
+scarsella skorsel@
+scarves sk)rvz
+scary sk,r/
+scat skat
+scatena skoten@
+scates skAts
+scathing skAT6N
+scatter skatP
+scattered skatPd
+scattergood skatPgqd
+scattergories skatPg{r/z
+scattergory skatPg{r/
+scattering skatP6N
+scattershot skatPSot
+scaturro skotqr]
+scavenge skav~j
+scavenger skav~jP
+scavengers skav~jPz
+scavenging skav~j6N
+scavo skov]
+scavone sk@vOn
+scavuzzo skovUz]
+scearce sVs
+scenario s~,r/]
+scenarios s~,r/]z
+scene sEn
+sceneries sEnP/z
+scenery sEnP/
+scenes sEnz
+scenic sEn6k
+scent sent
+scented sent@d
+scents sents
+sceptre septP
+sceptre skeptP
+scerbo sk,rb]
+schaab Sob
+schaack Sok
+schaad Sod
+schaadt Sot
+schaaf Sof
+schaafsma Sofsm@
+schaal Sol
+schaap Sop
+schaar S)r
+schab Sab
+schabacker SobakP
+schabel Sab@l
+schaben Sab~
+schaber SAbP
+schaberg SobPg
+schabes SAbz
+schacher SakP
+schachner SaknP
+schacht Sakt
+schachter SaktP
+schack Sak
+schad Sad
+schade SAd
+schadel Sad@l
+schaden Sad~
+schader SAdP
+schadler SAd@lP
+schadt Sat
+schaecher SekP
+schaedel Sed@l
+schaedler Sed@lP
+schaefer SAfP
+schaefers SAfPz
+schaeffer SefP
+schaeffler SaflP
+schaer SoP
+schafer SAfP
+schaff Saf
+schaffer SAfP
+schaffert SafPt
+schaffler SaflP
+schaffner SafnP
+schaible skAb@l
+schairer SIPr
+schaja Soj@
+schake SAk
+schalk S{k
+schall S{l
+schaller S{lP
+schallock Sal@k
+schalow Sal]
+schama Som@
+schamber SambP
+schamberger SambPgP
+schamel Sam@l
+schamp Samp
+schanbacher SanbokP
+schanck SaNk
+schaner SAnP
+schank SaNk
+schantz Sants
+schanz Sans
+schaper SApP
+schapiro SapIr]
+schapp Sap
+schappell Sap@l
+schappert SapPt
+schar S)r
+schara skar@
+schardt S)rt
+scharenberg S,r~bPg
+scharer S,rP
+scharf S)rf
+scharfe sk)rf
+scharfenberg S)rf~bPg
+scharff S)rf
+scharffenberger S)rf~bPgP
+scharlau S)rl?
+scharnhorst S)rnh{rst
+scharp S)rp
+scharpf S)rpf
+scharr S)r
+scharrer S)rP
+schartz S)rts
+schattner SatnP
+schatz Sats
+schatzberg SatsbPg
+schatzel Satz@l
+schatzman Satsm~
+schau SO
+schaub S{b
+schauble SOb@l
+schauer S?P
+schauf S?f
+schaufler S?f@lP
+schaul SOl
+schaum SOm
+schaumberg SOmbPg
+schaumburg S?mbPg
+schaus skh?s
+schaut SOt
+schave SAv
+schear Sir
+schechter SektP
+schechtman Sektm~
+scheck Sek
+scheckel Sek@l
+schecter SektP
+schedler Sed@lP
+schedule skejUl
+schedule skejql
+scheduled skejUld
+scheduled skejqld
+scheduler skedjUlP
+scheduler skedjqlP
+schedulers skedjUlPz
+schedulers skedjqlPz
+schedules skejUlz
+schedules skejqlz
+scheduling skejUl6N
+scheduling skejql6N
+scheel SEl
+scheele SEl
+scheeler SElP
+scheer Sir
+scheerer SirP
+scheets SEts
+scheetz SEts
+scheff Sef
+scheffel Sef@l
+scheffer SefP
+scheffler Sef@lP
+scheffler SeflP
+schehr S,r
+scheib SIb
+scheibe SIb
+scheibel SIb@l
+scheiber SIbP
+scheible skIb@l
+scheibner SIbnP
+scheid SId
+scheidecker SId6kP
+scheidegger SId6gP
+scheidel SId@l
+scheider SIdP
+scheiderer SIdPP
+scheidler SId@lP
+scheidt SIt
+scheier SIP
+scheiman SIm~
+schein SIn
+scheinberg SInbPg
+scheiner SInP
+scheirer SIPr
+scheler SElP
+schelin Selin
+schell skel
+schellenberg Sel~bPg
+schellenberger Sel~bPgP
+schellenger Sel~jP
+scheller skelP
+schellhammer Selh}P
+schellhase Selh@s
+schellhorn SelhPn
+schelling skel6N
+schellinger Sel6NP
+schemata sk}at@
+schematic sk}at6k
+schembri Sembr/
+scheme skEm
+schemed skEmd
+schemel Sem@l
+schemer skEmP
+schemes skEmz
+scheming skEm6N
+schemm Sem
+schemmel Sem@l
+schempf Semf
+schempp Semp
+schena SEn@
+schenck SeNk
+schendel Send@l
+schenectady sk~ekt@d/
+schenectady's sk~ekt@d/z
+schenk SeNk
+schenkel SeNk@l
+schenken SeNk~
+schenker SeNkP
+schenley Senl/
+scheper SEpP
+schepers SEpPz
+schepis Sepis
+schepp Sep
+scher SV
+scherb SVb
+scherbarth SVborT
+scherer SirP
+scherer's S,rPz
+scherf SVf
+scherff SVf
+scherger SVgP
+schering S,r6N
+schering SV6N
+schering's S,r6Nz
+scherlis SVlis
+scherman SVm~
+schermer SVmP
+schermerhorn SVmPhPn
+scherr S,r
+scherrer S,rP
+schertz SVts
+schertzer SVtsP
+scherz SVz
+scherzer SVzP
+scherzinger SVz6NP
+schetter SetP
+schettino Set/n]
+schettler Set@lP
+scheu S<
+scheuer S<P
+scheuerman S<Pm~
+scheuermann S<Pm~
+scheufler S<f@lP
+scheunemann S<nm~
+scheurer SVP
+scheurich S<r6k
+scheuring SV6N
+scheve SEv
+schewe SyU
+schexnayder SeksnAdP
+schexnider SeksnIdP
+schey SA
+schiano sk/on]
+schiappa sk/op@
+schiavi sk/ov/
+schiavo sk/ov]
+schiavo's sk/ov]z
+schiavone sk/ovOn/
+schiavoni sk/ovOn/
+schick Sik
+schicker SikP
+schickler Sik@lP
+schickling Sik@l6N
+schiebel SEb@l
+schieber SEbP
+schiefelbein SEf@lbIn
+schiefer SEfP
+schieffelin SEf@lin
+schieffer SEfP
+schiel SEl
+schield SEld
+schiele SEl
+schielke SElk
+schiemann SEm~
+schier SIP
+schieren Sir~
+schierl Sirl
+schiess SEs
+schiesser SEsP
+schiewe SEw/
+schifano sk/fon]
+schiferon SifP{n
+schiferon Sifr{n
+schiferon's SifP{nz
+schiferon's Sifr{nz
+schiff Sif
+schiffbauer Sifb?P
+schiffer SifP
+schiffler Sif@lP
+schiffman Sifm~
+schiffner SifnP
+schild SIld
+schilder SIldP
+schildknecht SIldk~ekt
+schildt Silt
+schilke Silk
+schill Sil
+schillaci sk/loC/
+schiller SilP
+schiller's SilPz
+schilling Sil6N
+schilling's Sil6Nz
+schillinger Sil6NP
+schillings Sil6Nz
+schillo skil]
+schilt Silt
+schiltknecht Siltnekt
+schiltz Silts
+schilz Silz
+schimberni SimbVn/
+schimek Sim6k
+schimke skimk
+schimmel Sim@l
+schimmelbusch Sim@lbqS
+schimming Sim6N
+schimpf Simpf
+schindel Sind@l
+schindler SindlP
+schindler's SindlPz
+schinke skiNk
+schinkel SiNk@l
+schipani sk/pon/
+schipke Sipk/
+schipper SipP
+schippers SipPz
+schiraldi sk6rold/
+schirm SVm
+schirmer SVmP
+schiro skir]
+schirtzinger SVtz6NP
+schisler Sis@lP
+schism skiz}
+schisms skiz}z
+schissel Sis@l
+schissler Sis@lP
+schist Sist
+schists Sists
+schizophrenia skits@frEn/@
+schizophrenic Siz@fren6k
+schlabach Slabok
+schlachter SlaktP
+schlack Slak
+schlafer SlAfP
+schlafly Slafl/
+schlag Slag
+schlagel Slag@l
+schlager SlAgP
+schlageter Slag/tP
+schlake SlAk
+schlang SlaN
+schlangen SlaN~
+schlanger SlaNP
+schlarb Sl)rb
+schlater SlAtP
+schlatter SlatP
+schlauch Sl?k
+schlecht Slekt
+schlechter SlektP
+schlee SlE
+schleeter SlEtP
+schlegel SlAg@l
+schlegelmilch Sleg@lmilk
+schleich SlIk
+schleicher SlIkP
+schleif SlIf
+schleifer SlIfP
+schleiger SlIgP
+schleimer SlImP
+schlein SlIn
+schleis SlIz
+schlemmer SlemP
+schlender SlendP
+schlenker SleNkP
+schlepp Slep
+schlereth Sl,rcT
+schlesinger Sles~jP
+schlesser SlesP
+schlessinger Sles~jP
+schleswig Slesw6g
+schley SlA
+schleyer SlAP
+schlicher SlikP
+schlicht Slikt
+schlichter SliktP
+schlichting Slikt6N
+schlick Slik
+schlicker SlikP
+schlict Slikt
+schlie SlE
+schliep SlEp
+schlieper SlEpP
+schlink SliNk
+schlitt Slit
+schlitter SlitP
+schlitz Slits
+schlobohm Slob]m
+schlock Slok
+schloemer SlOmP
+schloesser Slo@sP
+schlosberg SlosbPg
+schloss Sl{s
+schlossberg Sl{sbPg
+schlosser Sl{sP
+schlossman Sl{sm~
+schlott Slot
+schlotter SlotP
+schlotterbeck SlotPbck
+schlottman Slotm~
+schlotzhauer Slotsh?P
+schlough Sl?
+schlueter SlqtP
+schlumberger SlumbPZA
+schlumberger SlumbPgP
+schlund Slund
+schlup Slup
+schluter SlUtP
+schmader SmAdP
+schmahl Smol
+schmal Smal
+schmale SmAl
+schmall Sm{l
+schmaltz Smolts
+schmalz Sm{lz
+schmancy Smans/
+schmaus Sm?z
+schmead SmEd
+schmechel Smek@l
+schmeck Smek
+schmehl Smel
+schmeichel SmIk@l
+schmeiser SmIsP
+schmeling Smel6N
+schmelter SmeltP
+schmeltz Smelts
+schmeltzer SmeltzP
+schmelz Smelz
+schmelzer SmelzP
+schmelzle Smelz@l
+schmergel SmVg@l
+schmertz SmVts
+schmetterer SmetPP
+schmick Smik
+schmid Smid
+schmiddy Smid/
+schmidgall Smij@l
+schmidl Smid@l
+schmidlin Smidlin
+schmidt Smit
+schmidt's Smits
+schmidtke Smitk/
+schmied SmId
+schmieder SmIdP
+schmieg SmEg
+schmierer SmIPP
+schmiesing SmEs6N
+schmit Smit
+schmitt Smit
+schmitter SmitP
+schmittou SmiCU
+schmitz Smits
+schmitzer SmitsP
+schmoke SmOk
+schmoker SmOkP
+schmoldt SmOlt
+schmoll Smol
+schmooze SmUz
+schmoozing SmUz6N
+schmotzer SmOtzP
+schmoyer Sm<P
+schmuck Smuk
+schmucker SmukP
+schmuckler SmuklP
+schmuhl Smul
+schmults Smults
+schmunk SmuNk
+schmutz Smuts
+schmutzler Smutz@lP
+schnabel Snab@l
+schnack Snak
+schnackenberg Snak~bPg
+schnake SnAk
+schnakenberg SnAk~bPg
+schnall Sn{l
+schnapp Snap
+schnapps Snaps
+schnarr Snar
+schnauzer Sn?zP
+schneberger SnEbPgP
+schnebly Snebl/
+schneck Snek
+schneckloth Snekl@T
+schnee SnE
+schneeberger SnEbPgP
+schneeman SnEm~
+schneerson Snirs~
+schneerson's Snirs~z
+schneid SnId
+schneider SnIdP
+schneider's SnIdPz
+schneiderman SnIdPm~
+schneiderman's SnIdPm~z
+schneiders SnIdPz
+schneiders' SnIdPz
+schneidewind SnId@wind
+schneidewind's SnId@windz
+schneier SnIP
+schneiter SnItP
+schnell Snel
+schnelle Snel
+schneller SnelP
+schnepf Snepf
+schnepp Snep
+schnettler Snet@lP
+schnetzer SnetzP
+schnick Snik
+schnider SnIdP
+schnieder SnIdP
+schnieders SnIdPz
+schnier SnIP
+schnitker SnitkP
+schnittke Snitk/
+schnitz Snits
+schnitzer SnitzP
+schnitzler SnitslP
+schnoebelen SnOb@l~
+schnook Snqk
+schnooks Snqks
+schnoor Snqr
+schnorr Sn{r
+schnur SnV
+schnurr SnV
+schnyder SnIdP
+schnyder's SnIdPz
+schobel SOb@l
+schober SObP
+schobert SobPt
+schoch Sok
+schock Sok
+schoeck SOk
+schoeffler SOf@lP
+schoeller SOlP
+schoellhorn SOlh{rn
+schoemaker SOmAkP
+schoen SOn
+schoenbaum SOnb?m
+schoenbeck SOnbek
+schoenberg SOnbPg
+schoenberger SOnbPgP
+schoenborn SOnbPn
+schoendorf SOnd{rf
+schoene So/n
+schoeneck SOnck
+schoenecker SOnckP
+schoeneman So/nm~
+schoenemann So/nm~
+schoener SOnP
+schoenfeld SOnfeld
+schoenfelder SOnfcldP
+schoenfeldt SOnfclt
+schoenhals SOnh@lz
+schoenherr SOnhP
+schoenhof SOnhof
+schoenhof's SOnhofs
+schoenholtz SOnhOlts
+schoenig SOn6g
+schoening So~6N
+schoenrock SOnr@k
+schoenthal SOnT{l
+schoenwald SOnw{ld
+schoepe SOp
+schoepf SOp
+schoepke SOpk/
+schoepp SOp
+schoeppner SOpnP
+schoettle SOt@l
+schoff S{f
+schoffstall S{fst@l
+schofield skOf/ld
+scholar skolP
+scholar's skolPz
+scholarly skolPl/
+scholars skolPz
+scholarship skolPSip
+scholarships skolPSips
+scholastic sk@last6k
+scholberg SOlbPg
+scholer SOlP
+scholes skOlz
+scholey SOl/
+scholfield skOlfEld
+scholl Sol
+scholle SOl
+scholler SolP
+schollmeyer SolmIP
+scholten SOlt~
+scholtes SOlts
+scholtz SOlts
+scholz SOlz
+scholze SOlz
+schomaker SOmAkP
+schomberg SombPg
+schomburg SombPg
+schomer SOmP
+schommer SomP
+schon Son
+schonberg SonbPg
+schonberger SonbPgP
+schone SOn
+schoneman SOnm~
+schonfeld Sonfeld
+schons Sonz
+schoo SU
+schoof Sqf
+schook Sqk
+school skUl
+school's skUlz
+schoolbook skUlbqk
+schoolbooks skUlbqks
+schoolboy skUlb<
+schoolboys skUlb<z
+schoolbus skUlbus
+schoolchild skUlCIld
+schoolchildren skUlCildr~
+schoolcraft skUlkraft
+schooled skUld
+schooler skUlP
+schoolers skUlPz
+schooley skUl/
+schoolfield skUlfEld
+schoolhouse skUlh?s
+schooling skUl6N
+schoolmaster skUlmastP
+schoolmate skUlmAt
+schoolmates skUlmAts
+schoolroom skUlrUm
+schools skUlz
+schools' skUlz
+schoolteacher skUltECP
+schoolteachers skUltECPz
+schooltime skUltIm
+schoolwork skUlwVk
+schoolyard skUlyord
+schoon skUn
+schooner skUnP
+schooners skUnPz
+schoonmaker SUnmAkP
+schoonover SUn@vP
+schopf Sopf
+schopfer SopfP
+schopp Sop
+schoppe Sop
+schor S{r
+schork S{rk
+schorn S{rn
+schorr S{r
+schorr's S{rz
+schorsch S{rS
+schott Sot
+schott's Sots
+schottenstein Sot~stEn
+schottenstein Sot~stIn
+schou SU
+schouten SoUt~
+schow S?
+schowalter S?@ltP
+schrack Srak
+schrade SrAd
+schrader SrAdP
+schraeder SredP
+schrag Srag
+schrage SrAj
+schrager SrAgP
+schram Sram
+schramm Sram
+schrandt Srant
+schrank SraNk
+schrantz Srants
+schranz Srans
+schraufnagel Sr?fn@g@l
+schrecengost Sres6Ng@st
+schreck Srek
+schreckengost Srek6Ng@st
+schrecongost Srek@Ng@st
+schreder SrEdP
+schreffler Sref@lP
+schreger SregP
+schreiber SrIbP
+schreibman SrIbm~
+schreier SrIP
+schreifels SrIf@lz
+schreiner SrInP
+schreiter SrItP
+schremp Sremp
+schrempf Srempf
+schrempp Sremp
+schrenk SreNk
+schreur SrV
+schreurs SrVz
+schreyer SrIr
+schriber SrIbP
+schrick Srik
+schricker SrikP
+schrieber SrEbP
+schriefer SrEfP
+schrier SrIP
+schriever SrEvP
+schrimpf Srimpf
+schrimsher SrimSP
+schriner SrInP
+schriver SrIvP
+schroader SrOdP
+schrock Srok
+schroder SrOdP
+schroders SrOdPz
+schrodt Srot
+schroeck SrOk
+schroeder SrOdP
+schroeder's SrOdPz
+schroedl SrOd@l
+schroepfer SrOpfP
+schroer SrOP
+schroeter SrOtP
+schroff Sr{f
+schroll SrOl
+schrom Srom
+schronce Srons
+schropp Srop
+schroth Sr{T
+schroyer Sr<P
+schrum Srum
+schrumpf Srumpf
+schrupp Srup
+schryer SrIP
+schryver SrIvP
+schtick Stik
+schubach Subok
+schubel SUb@l
+schubert SUbPt
+schubert's SUbPts
+schubring SubP6N
+schuch Suk
+schuchard SukPd
+schuchardt Sukort
+schuchart Sukhort
+schuchert skuCPt
+schuchman Sukm~
+schuchmann Sukm~
+schuck Suk
+schucker SukP
+schuckman Sukm~
+schue SU
+schuele SUl
+schueler SUlP
+schuelke SUlk
+schueller SUlP
+schueneman SUn}~
+schuenemann SUn}~
+schuerman SUPm~
+schuermann SUPm~
+schuessler SUslP
+schuett skUt
+schuette skUt
+schuetz SUts
+schuetze SUts
+schuff Suf
+schug Sug
+schuh SU
+schuhmacher SUmokP
+schuhmann SUm~
+schuitema SUtcm@
+schuknecht Sukn6kt
+schul Sql
+schuld Sqd
+schuldener SUld~P
+schuldener's SUld~Pz
+schulder SUldP
+schuldt Sqlt
+schulenberg SUl~bPg
+schulenburg SUl~bPg
+schuler SUlP
+schulhof SUlh{f
+schulke Sqlk/
+schull Sql
+schuller SUlP
+schulman SUlm~
+schulof SUl{f
+schult Sult
+schulte Sult
+schulten Sult~
+schultes Sults
+schultheis SulTIz
+schultheiss SulTIs
+schultz Sqlts
+schultze Sultz
+schulz Sqlts
+schulze Sqlts
+schum Sum
+schumacher SUmokP
+schumacker SUmokP
+schumaker SUmAkP
+schuman SUm~
+schumann SUm~
+schumann's SUm~z
+schumer SUmP
+schumer's SUmPz
+schumm Sum
+schumpert SumpPt
+schundler SundlP
+schuneman SUnm~
+schunk SuNk
+schupak SUpak
+schupbach Supbok
+schupp Sup
+schur SV
+schuring SV6N
+schurman SVm~
+schurr SV
+schurrenberg SV~bPg
+schussler SuslP
+schuster SUstP
+schut Sut
+schuth SUT
+schutt Sut
+schutte skut
+schutter SutP
+schuttler SutlP
+schutz Suts
+schutz's Suts@z
+schutzman Sutsm~
+schuur Sqr
+schuyler skIlP
+schuylkill skyUlkil
+schwab Swob
+schwab's Swobz
+schwabe Sw{b
+schwaderer Sw{dPP
+schwager SwAgP
+schwahn Sw{n
+schwaiger SwIgP
+schwake SwAk
+schwalb Sw{lb
+schwalbach Sw{lbok
+schwalbe Sw{lb
+schwall Sw{l
+schwaller Sw{lP
+schwalm Swolm
+schwam Sw{m
+schwan Sw{n
+schwandt Sw{nt
+schwanke Sw{Nk
+schwantes Sw{nts
+schwanz Sw{ns
+schwark Sw{rk
+schwarm Sw{rm
+schwartz Sw{rts
+schwartzberg Sw{rtsbPg
+schwartzberg's Sw{rtsbPgz
+schwartzchild Sw{rtsCIld
+schwartzkopf Sw{rtsk{f
+schwartzkopf Sw{rtsk{pf
+schwartzman Sw{rtsm~
+schwarz Sw{rts
+schwarze Sw{rts
+schwarzenegger Sw{rz~AgP
+schwarzenegger's Sw{rz~AgPz
+schwarzer Sw{rtsP
+schwarzkopf Sw{rtsk{f
+schwarzkopf Sw{rtsk{pf
+schwarzkopf's Sw{rtsk{fs
+schwarzkopf's Sw{rtsk{pfs
+schwarzman Sw{rtsm~
+schwebach Swebok
+schwebel Sweb@l
+schwebke Swebk
+schwed Swed
+schweda SwEd@
+schwede SwEd
+schweder SwEdP
+schweer Swir
+schweers Swirz
+schwegel Sweg@l
+schwegler Sweg@lP
+schwegman Swegm~
+schweich SwIk
+schweickert SwIkPt
+schweiger SwIgP
+schweigert SwIgPt
+schweighardt SwIghort
+schweikert SwIkPt
+schweinsberg SwInsbPg
+schweiss SwIs
+schweitzer SwItsP
+schweitzer's SwItsPz
+schweizer SwIzP
+schweizerische SwIzP6S
+schwemm Swem
+schwemmer SwemP
+schwendeman Swendm~
+schwenk SweNk
+schwenke SweNk
+schwenker SweNkP
+schwenn Swen
+schwent Swent
+schweppe Swep
+schweppes Sweps
+schwer SwV
+schwerdloff SwVdl{f
+schwerdt SwVt
+schwerdtfeger SwVtfAgP
+schwerin Sw,rin
+schwering Swir6N
+schwerner SwVnP
+schwerner's SwVnPz
+schwertfeger SwVtf6gP
+schwertner SwVtnP
+schwichtenberg Swikt~bPg
+schwieger SwEgP
+schwier SwIP
+schwiesow SwEs]
+schwieterman SwEtPm~
+schwimmer SwimP
+schwind Swind
+schwindt Swint
+schwing SwiN
+schwinger SwiNP
+schwinn Swin
+schwisow Swis]
+schwoerer SwOPP
+sci esEI
+sci essEI
+sci sE
+sciacca sk{ko
+scialabba sk{lob@
+scialdone S{ld]n/
+sciandra S{ndr@
+scianna S{n@
+sciara S)r@
+sciaroni sEPOn/
+sciarra s/)r@
+sciarrino SPEn]
+sciascia S{sC@
+scibelli s@bel/
+scibilia s@bEl/@
+scicchitano s6k@ton]
+sciclone siklOn/
+scicom sikom
+science sI~s
+science's sI~s@z
+sciences sI~s@z
+sciences' sI~s@z
+scientific sI~tif6k
+scientific's sI~tif6ks
+scientifically sI~tif6k@l/
+scientifically sI~tif6kl/
+scientifics sI~tif6ks
+scientist sI~t@st
+scientist's sI~t@sts
+scientists sInt@s
+scientists sInt@ss
+scientists sInt@sts
+scientists sI~t@s
+scientists sI~t@ss
+scientists sI~t@sts
+scientists' sI~t@sts
+scientologist sI~tol@j@st
+scientologists sI~tol@j@sts
+scientology sI~tol@j/
+scifres sIfPz
+scilla sil@
+scillas sil@z
+scimeca sImek@
+scimeca simek@
+scimed sImed
+scimone s}On
+scinta sint@
+scintilla sintil@
+scintilore sint@l{r/
+scinto sint]
+scioli s/Ol/
+scion sI~
+sciortino s/{rtEn]
+scios skI]s
+scipio sip/]
+scipione s@p/On/
+scire sIr
+scism skiz}
+scissor sizP
+scissors sizPz
+scitex sEteks
+sciulli s/Ul/
+sciullo s/Ul]
+sciuto s/Ut]
+sclafani sklofon/
+scleroderma sklir@dVm@
+sclerosis sklPOs@s
+scobee skob/
+scobey skOb/
+scobie skob/
+scoby skOb/
+scocozza skokoz@
+scoff sk{f
+scoffed sk{ft
+scoffield sk{fEld
+scofflaws skofl{z
+scoffs sk{fs
+scofield skOfEld
+scoggin skogin
+scoggins skoginz
+scogin skOgin
+scohier skOyP
+scola skOl@
+scolari sk]l)r/
+scolaro sk]l)r]
+scold skOld
+scolded skOld@d
+scolding skOld6N
+scolds skOldz
+scoles skOlz
+scolia skOly@
+scoma skOm@
+sconc skons
+sconce skons
+sconces skons@z
+scone skOn
+scones skOnz
+sconiers sk{n/Pz
+sconnix skon6ks
+sconyers sk{n/Pz
+scoop skUp
+scooped skUpt
+scooper skUpP
+scooping skUp6N
+scoops skUps
+scoot skUt
+scooter skUtP
+scooters skUtPz
+scoots skUts
+scope skOp
+scopes skOps
+scoping skOp6N
+scopolamine skOp@l}En
+scopolamine sk{p@l}En
+scor sk{r
+scorch sk{rC
+scorched sk{rCt
+scorcher sk{rCP
+scorching sk{rC6N
+score sk{r
+scoreboard sk{rb{rd
+scorecard sk{rkord
+scorecards sk{rkordz
+scored sk{rd
+scorekeeper sk{rkEpP
+scorekeepers sk{rkEpPz
+scorekeeping sk{rkEp6N
+scoreless sk{rl@s
+scorer sk{rP
+scorers sk{rPz
+scores sk{rz
+scoring sk{r6N
+scorn sk{rn
+scorned sk{rnd
+scornful sk{rnf@l
+scorns sk{rnz
+scorpio sk{rp/O
+scorpion sk{rp/~
+scorpions sk{rp/~z
+scorsese sk{rsAz/
+scorsese sk{rsEz
+scorsese's sk{rsAz/z
+scorsese's sk{rsEz@z
+scorsone sk{rs~
+scorza sk{rz@
+scot skot
+scotch skoC
+scotched skoCt
+scotches skoC@z
+scotchgard skoCgord
+scotia skOS@
+scotia's skOS@z
+scotland skotl~d
+scotland's skotl~dz
+scots skots
+scotsman skotsm~
+scott skot
+scott's skots
+scotten skot~
+scottie skot/
+scottish skot6S
+scotto skOt]
+scotto skot]
+scotton skot~
+scotts skots
+scottsbluff skotsbluf
+scottsdale skotsdAl
+scotty skot/
+scotty's skot/z
+scoundrel sk?ndr@l
+scoundrels sk?ndr@lz
+scour sk?P
+scour sk?r
+scoured sk?Pd
+scourge skVj
+scourges skVj@z
+scouring sk?P6N
+scours sk?Pz
+scout sk?t
+scout's sk?ts
+scouted sk?t@d
+scouten sk?t~
+scouter sk?tP
+scouters sk?tPz
+scouting sk?t6N
+scoutmaster sk?tmastP
+scouts sk?ts
+scovel skOv@l
+scovell skov@l
+scovil skOv@l
+scovill skov@l
+scoville skOvil
+scow sk?
+scowcroft skOkr{ft
+scowden sk?d~
+scowl sk?l
+scowled sk?ld
+scowling sk?l6N
+scozzafava sk]tsofov@
+scrabble skrab@l
+scragg skrag
+scraggle skrag@l
+scraggly skragl/
+scramble skramb@l
+scrambled skramb@ld
+scrambles skramb@lz
+scrambling skramb@l6N
+scrambling skrambl6N
+scranton skrant~
+scrap skrap
+scrapbook skrapbqk
+scrapbooks skrapbqks
+scrape skrAp
+scraped skrApt
+scraper skrApP
+scrapers skrApPz
+scrapes skrAps
+scraping skrAp6N
+scrapings skrAp6Nz
+scrapiron skrapIPn
+scrapped skrapt
+scrapping skrap6N
+scrappy skrap/
+scraps skraps
+scratch skraC
+scratched skraCt
+scratches skraC@z
+scratching skraC6N
+scratchy skraC/
+scrawl skr{l
+scrawled skr{ld
+scrawny skr{n/
+scream skrEm
+screamed skrEmd
+screamer skrEmP
+screamers skrEmPz
+screaming skrEm6N
+screamingly skrEm6Nl/
+screams skrEmz
+screech skrEC
+screeched skrECt
+screeches skrEC@z
+screeching skrEC6N
+screed skrEd
+screen skrEn
+screened skrEnd
+screener skrEnP
+screeners skrEnPz
+screening skrEn6N
+screenings skrEn6Nz
+screenplay skrEnplA
+screenplays skrEnplAz
+screens skrEnz
+screenwriter skrEnrItP
+screenwriters skrEnrItPz
+screenwriting skrEnrIt6N
+screw skrU
+screwball skrUb{l
+screwdriver skrUdrIvP
+screwdrivers skrUdrIvPz
+screwed skrUd
+screwing skrU6N
+screws skrUz
+screwy skrU/
+scribble skrib@l
+scribbled skrib@ld
+scribbler skriblP
+scribblers skriblPz
+scribbles skrib@lz
+scribbling skrib@l6N
+scribbling skribl6N
+scribe skrIb
+scriber skrIbP
+scribes skrIbz
+scribner skribnP
+scribner's skribnPz
+scribners skribnPz
+scrimgeour skrimg{r
+scrimmage skrim6j
+scrimp skrimp
+scrimping skrimp6N
+scrimshaw skrimS{
+scrip skrip
+scripp skrip
+scripp's skrips
+scripps skrips
+script skript
+scripted skript@d
+scripts skrips
+scripts skripts
+scriptural skripCP@l
+scripture skripCP
+scriptures skripCPz
+scriptwriter skriptrItP
+scriptwriters skriptrItPz
+scriptwriting skriptrIt6N
+scritchfield skriCf/ld
+scriven skrivin
+scrivener skrivnP
+scrivens skrIv~z
+scriver skrIvP
+scrivner skrivnP
+scrod skrod
+scroggin skrogin
+scroggins skroginz
+scroggs skrogz
+scrogham skrogh}
+scroll skrOl
+scrolls skrOlz
+scronce skrons
+scrooge skrUj
+scrotten skr{t~
+scrounge skr?nj
+scrounged skr?njd
+scrounging skr?nj6N
+scrub skrub
+scrubbed skrubd
+scrubber skrubP
+scrubbers skrubPz
+scrubbing skrub6N
+scrubby skrub/
+scruffy skruf/
+scruggs skrugz
+scrunch skrunC
+scrunched skrunCt
+scruple skrUp@l
+scruples skrUp@lz
+scrupulous skrUpy@l@s
+scrupulously skrUpy@l@sl/
+scrutinize skrUt~Iz
+scrutinized skrUt~Izd
+scrutinizes skrUt~Iz@z
+scrutinizing skrUt~Iz6N
+scrutiny skrUt~/
+scruton skrUt~
+scrutton skrut~
+scrutton's skrut~z
+scuba skUb@
+scud skud
+scudder skudP
+scudder's skudPz
+scuderi skUd,r/
+scuds skudz
+scuff skuf
+scuffed skuft
+scuffle skuf@l
+scuffled skuf@ld
+scuffles skuf@lz
+scull skul
+sculley skul/
+sculley's skul/z
+scullin skulin
+scullion skuly~
+scully skul/
+sculpt skulpt
+sculpted skulpt@d
+sculpting skulpt6N
+sculptor skulptP
+sculptors skulptPz
+sculpts skulpts
+sculptural skulpCP@l
+sculpture skulpCP
+sculptured skulpCPd
+sculptures skulpCPz
+sculpturing skulpCP6N
+sculpturing skulptP6N
+scum skum
+scupper skupP
+scurdall skVdol
+scurdell skPdel
+scurdell skVdcl
+scurlock skVl@k
+scurried skV/d
+scurrilous skV@l@s
+scurry skV/
+scurrying skV/6N
+scutt skut
+scuttle skut@l
+scuttlebutt skut@lbut
+scuttled skut@ld
+scuttling skut@l6N
+scuttling skutl6N
+scythian siT/~
+sczepanski s@pansk/
+sdn esdEen
+se esE
+se s?TEst
+se sA
+sea sE
+sea's sEz
+seabaugh sEb{
+seabeach sEbEC
+seabed sEbed
+seabee sEb/
+seabees sEb/z
+seaberg sEbPg
+seaberry sEber/
+seabert sEbPt
+seaboard sEb{rd
+seabold sEbOld
+seabolt sEbOlt
+seaborn sEbPn
+seaborne sEb{rn
+seabright sEbrIt
+seabrook sEbrqk
+seabrook's sEbrqks
+seabrooks sEbrqks
+seaburg sEbPg
+seabury sEber/
+seaco sEk]
+seacoast sEkOst
+seader sEdP
+seadrift sEdrift
+seafarer sEferP
+seafarers sEferPz
+seafirst sEfVst
+seafood sEfUd
+seafoods sEfUdz
+seaford sEfPd
+seafront sEfr~t
+seaga sEg@
+seagal s6gol
+seagate sEgAt
+seagate's sEgAts
+seager sEgP
+seagle sEg@l
+seago sEgO
+seagoing sEgO6N
+seagram sEgr}
+seagram's sEgr}z
+seagrams sEgr}z
+seagrams' sEgr}z
+seagrave sEgrAv
+seagraves sEgrAvz
+seagren sEgrcn
+seagrove sEgrOv
+seagroves sEgrOvz
+seagull sEgul
+seagull's sEgulz
+seagulls sEgulz
+seahawk sEh{k
+seahawks sEh{ks
+seaholm sEhOm
+seal sEl
+seal's sElz
+sealand sEland
+sealand's sElandz
+sealant sEl~t
+sealants sEl~ts
+seale sEl
+sealed sEld
+sealer sElP
+seales sElz
+sealey sEl/
+sealey's sEl/z
+sealift sElift
+sealing sEl6N
+sealock sElok
+seals sElz
+sealtest sEltest
+sealy sEl/
+seam sEm
+seaman sEm~
+seaman's sEm~z
+seamans sEm~z
+seamen sEm~
+seamen's sEm~z
+seamless sEml@s
+seamlessly sEml@sl/
+seamon sEm~
+seamons sEm~z
+seams sEmz
+seamster sEmstP
+seamstress sEmstr@s
+seamstresses sEmstr@s@z
+seamus SAm@s
+seamy sEm/
+sean S{n
+sean's S{nz
+seance sAons
+seanor sEnP
+seaport sEp{rt
+seaports sEp{rts
+seapower sEp?P
+seaq sEk
+seaquest sEkwest
+seaquist sEkwist
+sear sir
+search sVC
+searched sVCt
+searcher sVCP
+searchers sVCPz
+searches sVC@z
+searching sVC6N
+searchlight sVClIt
+searchlights sVClIts
+seared sird
+searfoss sVf@s
+searight sirIt
+searing sir6N
+searl sVl
+searle sVl
+searle's sVlz
+searles sVlz
+searls sVlz
+sears sirz
+sears' sirz
+sears's sirz
+sears's sirz@z
+searson sVs~
+seas sEz
+sease sEz
+seashell sESel
+seashells sESelz
+seashore sES{r
+seasick sEsik
+seaside sEsId
+season sEz~
+season's sEz~z
+seasonable sEz~@b@l
+seasonal sEz~@l
+seasonality sEz~al@t/
+seasonally sEzn@l/
+seasonally sEz~@l/
+seasoned sEz~d
+seasoning sEz~6N
+seasonings sEz~6Nz
+seasons sEz~z
+seastrand sEstrand
+seastrom sEstr}
+seat sEt
+seat's sEts
+seatbelt sEtbelt
+seatbelts sEtbelts
+seated sEt@d
+seater sEtP
+seating sEt6N
+seatings sEt6Nz
+seato sEt]
+seaton sEt~
+seatrain sEtrAn
+seats sEts
+seattle s/at@l
+seattle's s/at@lz
+seaver sEvP
+seavers sEvPz
+seavey sEv/
+seaward sEwPd
+seawater sEwotP
+seaway sEwA
+seaweed sEwEd
+seaweeds sEwEdz
+seawell sEwel
+seawolf sEwqlf
+seawolf's sEwqlfs
+seaworthy sEw{rT/
+seawright sErIt
+seay sA
+sebaceous s@bAS@s
+sebald sEb{ld
+sebastian s@basC~
+sebastian's s@basC~z
+sebastiana s@bast/on@
+sebastiane s@bast/en
+sebastiani s@bast/on/
+sebby seb/
+sebek seb6k
+seber sEbP
+sebert sebPt
+sebesta scbest@
+sebi seb/
+sebo seb]
+sebold seb]ld
+sebree s@brE
+sebring sEbr6N
+sec sek
+secada s@kod@
+secaucus s6k{k@s
+secchia sek/@
+secede s@sEd
+seceded s@sEd@d
+seceding s@sEd6N
+secession s@seS~
+secessionist s@seS~@st
+secessionists s@seS~@s
+secessionists s@seS~@ss
+secessionists s@seS~@sts
+sechler seklP
+sechrest sekPist
+sechrist sEkrist
+sechrist sekPist
+seck sek
+seckel sek@l
+seckinger sek6NP
+seckler seklP
+seckman sekm~
+seclude s6klUd
+secluded s6klUd@d
+seclusion s6klUZ~
+seco sek]
+secom sekom
+secomerica sek]m,r6k@
+second sek~
+second sek~d
+second's sek~dz
+secondaries sek~der/z
+secondarily sek~d,r@l/
+secondary sek~der/
+seconded sek~@d
+seconded sek~d@d
+secondhand sek~dhand
+secondhand sek~hand
+secondly sek~dl/
+secondly sek~l/
+seconds sek~dz
+seconds sek~z
+secor sekP
+secord sEk{rd
+secord's sEk{rdz
+secoy sek<
+secrecy sEkr@s/
+secrest sekPist
+secret sEkr@t
+secretarial sekr@t,r/@l
+secretariat sekr@t,r/@t
+secretaries sekr@ter/z
+secretaries' sekr@ter/z
+secretary sekr@ter/
+secretary's sekr@ter/z
+secrete s6krEt
+secreted s@krEt@d
+secretion s@krES~
+secretions s@krES~z
+secretive sEkr@t6v
+secretiveness sEkr@t6vn@s
+secretly sEkr@tl/
+secrets sEkr@ts
+secrist sekPist
+sect sekt
+sect's sekts
+sectarian sckt,r/~
+sectarianism sckt,r/~iz}
+secteur scktUr
+section sekS~
+section's sekS~z
+sectional sekS~@l
+sectioned sekS~d
+sectioning sekS~6N
+sections sekS~z
+sector sektP
+sector's sektPz
+sectoral sektP@l
+sectors sektPz
+sects sekts
+secular seky@lP
+secularism seky@lPiz}
+secularist seky@lP@st
+secularists seky@lP@s
+secularists seky@lP@ss
+secularists seky@lP@sts
+secularized seky@lPIzd
+seculow seky@l]
+secunda s6kund@
+secure s6kyqr
+secured s6kyqrd
+securely s6kyqrl/
+secures s6kyqrz
+securing s6kyqr6N
+securities s6kyqr@t/z
+securities' s6kyqr@t/z
+securitization s6kyqr@t@zAS~
+securitize s6kyqr@tIz
+securitized s6kyqr@tIzd
+securitizing s6kyqr@tIz6N
+security s6kyqr@t/
+security's s6kyqr@t/z
+seda sAd@
+sedam sed}
+sedan s@dan
+sedano sAdon]
+sedans s@danz
+sedate s@dAt
+sedated s@dAt@d
+sedating s@dAt6N
+sedation s@dAS~
+sedative sed@t6v
+sedberry sedber/
+sedco sedk]
+seddon sed~
+sedentary sed~ter/
+seder sAdP
+sedge sej
+sedgewick sejw6k
+sedgley sejl/
+sedgwick sejw6k
+sedillo scdil]
+sediment sed}~t
+sedimentary sed}entP/
+sedimentation sed}~tAS~
+sediments sed}~ts
+sedita scdEt@
+sedition s@diS~
+seditious s@diS@s
+sedivy sed6v/
+sedlacek sedl@s6k
+sedlack sedl@k
+sedlak sedl@k
+sedlar sedlP
+sedler sedlP
+sedlock sedl@k
+sedona s@dOn@
+sedor scd{r
+sedore scd{r/
+seduce s@dUs
+seduced s@dUst
+seducer s@dUsP
+seducing s@dUs6N
+seduction s@dukS~
+seductive s@dukt6v
+seductively s@dukt6vl/
+sedum sed}
+sedums sed}z
+sedwick sedw6k
+see sE
+see-kiong sEky{N
+seebach sEbok
+seebeck sEbek
+seeber sEbP
+seeberger sEbPgP
+seebold sEbOld
+seeburger sEbPgP
+seed sEd
+seedeater sEdEtP
+seedeaters sEdEtPz
+seeded sEd@d
+seeding sEd6N
+seedling sEdl6N
+seedlings sEdl6Nz
+seedorf sEd{rf
+seedpod sEdpod
+seeds sEdz
+seedsman sEdzm~
+seedy sEd/
+seefeld sEfeld
+seefeldt sEfclt
+seegars sEgPz
+seeger sEgP
+seegers sEgPz
+seegert sEgPt
+seegmiller sEgm@lP
+seehafer sEh@fP
+seehusen sEhUs~
+seeing sE6N
+seek sEk
+seekamp sEkamp
+seeker sEkP
+seeker's sEkPz
+seekers sEkPz
+seeking sEk6N
+seekins sEkinz
+seekonk sEkoNk
+seeks sEks
+seel sEl
+seelbach sElbok
+seelert sElPt
+seeley sEl/
+seelig sEl6g
+seelig's sEl6gz
+seeling sEl6N
+seelinger sEl6NP
+seelman sElm~
+seely sEl/
+seelye sElI
+seem sEm
+seema sEmo
+seemala sEm@l@
+seeman sEm~
+seemann sEm~
+seemed sEmd
+seeming sEm6N
+seemingly sEm6Nl/
+seems sEmz
+seen sEn
+seep sEp
+seepage sEp6j
+seeped sEpt
+seeping sEp6N
+seeps sEps
+seer sEr
+seers sErz
+seery sEr/
+sees sEz
+seesaw sEs{
+seesawed sEs{d
+seesawing sEs{6N
+seese sEz
+seethe sET
+seething sET6N
+seetin sEtin
+seeton sEt~
+seever sEvP
+seevers sEvPz
+seewald sEw{ld
+sefcik sefs6k
+seff sef
+sefton seft~
+sega sAg@
+sega sEg@
+sega's sAg@z
+segal sEg@l
+segalas seg@l@s
+segall sAgol
+segar sEgP
+segarra scg)r@
+segars segPz
+sege sej
+segel sEg@l
+seger sEgP
+segers sEgPz
+segerstrom segPstr}
+segler seglP
+segment segment
+segment segm~t
+segment's segm~ts
+segmentation segm~tAS~
+segmented segmen@d
+segmented segmen@d
+segmented segment@d
+segmented segment@d
+segments segments
+segments segm~ts
+segner segnP
+sego sEgO
+segovia scgOv/@
+segraves sAgrovcs
+segregate segr@gAt
+segregated segr@gAt@d
+segregating segr6gAt6N
+segregation segr@gAS~
+segregationist segr@gAS~@st
+segregationists segr@gAS~@sts
+segrest sEgrest
+segrest segPist
+segreto scgret]
+segue seg
+seguin s@gEn
+seguin sEg~
+segundo segqndO
+segur sAgqr
+segura sAgqr@
+seguros sAgyV]z
+seher sehP
+sehnert senPt
+sehorn sehPn
+sehr s,r
+seib sEb
+seibel sIb@l
+seiber sIbP
+seiberlich sIbPl6k
+seiberling sIbPl6N
+seibert sIbPt
+seibold sIbOld
+seibu sIbU
+seid sId
+seide sId
+seidel sId@l
+seidell sId@l
+seidelman sId@lm~
+seiden sId~
+seidenberg sId~bPg
+seider sIdP
+seiders sIdPz
+seidl sId@l
+seidler sIdlP
+seidman sIdm~
+seidman's sIdm~z
+seidner sIdnP
+seier sIP
+seif sEf
+seife sEf
+seifer sIfP
+seifert sIfPt
+seiffert sIfPt
+seifried sIfP/d
+seigal sEg@l
+seige sEj
+seigel sEg@l
+seigel sIg@l
+seiger sIgP
+seigle sEg@l
+seigler sEg@lP
+seigler sEglP
+seigler sIg@lP
+seigniorage sEgnEP6j
+seiji sAj/
+seiki sAk/
+seiko sAk]
+seil sIl
+seiler sIlP
+seils sIlz
+seim sIm
+sein sIn
+seine sAn/
+seinfeld sInfcld
+seinfeld's sInfcldz
+seip sEp
+seipel sIp@l
+seiple sEp@l
+seipp sEp
+seis sEs
+seiser sIsP
+seismic sIzm6k
+seismologist sIzmol@j@st
+seismologists sIzmol@j@s
+seismologists sIzmol@j@ss
+seismologists sIzmol@j@sts
+seismology sIzmol@j/
+seita sAt@
+seitel sEtel
+seiter sItP
+seith sET
+seither sITP
+seitman sEtm~
+seitter sItP
+seitz sIts
+seitzinger sItz6NP
+seivert sIvPt
+seiwert sIwPt
+seix sEks
+seixas sEks@s
+seiyaku sAyokU
+seiyu sEyU
+seize sEz
+seized sEzd
+seizes sEz@z
+seizing sEz6N
+seizure sEZP
+seizures sEZPz
+sejm sAm
+sekerak sekP@k
+seki sAk/
+sekisui sAk@sU/
+sekula s6kUl@
+sekulow sekUl]
+sela sel@
+selander sel~dP
+selas sel@s
+selassie s@las/
+selbe selb
+selberg selbPg
+selby selb/
+selchow selC?
+selda seld@
+seldane seldAn
+selden seld~
+selders seldPz
+seldin seldin
+seldom seld}
+seldon seld~
+select s@lekt
+selected s@lekt@d
+selecting s@lekt6N
+selection s@lekS~
+selections s@lekS~z
+selective s@lekt6v
+selectively s@lekt6vl/
+selectivity s@lektiv@t/
+selectnet s@lektnet
+selects s@lekts
+selena s@lEn@
+selena's s@lEn@z
+selene s@lEn
+selenite sel~It
+selenium s@lEn/}
+seles selcs
+seles' selcs
+seley sEl/
+self self
+self's selfs
+self-aggrandizement selfagr~dIzm~t
+self-aggrandizing self@grandIz6N
+self-confidence selfkonf@d~s
+self-confident selfkonf@d~t
+self-congratulation selfk~graC@lAS~
+self-consistent selfk~sist~t
+self-contained selfk~tAnd
+self-control selfk~trOl
+self-deceiving selfd/sEv6N
+self-deception selfd@sepS~
+self-deliverance selfd@livP~s
+self-deprecating selfdepr@kAt6N
+self-determination selfd@tVm~AS~
+self-dormant selfd{rm~t
+self-energizing selfenPjIz6N
+self-enrichment self~riCm~t
+self-fertilizing selffVt@lIz6N
+self-fruitful selffrUtf@l
+self-govern selfguvPn
+self-governing selfguvPn6N
+self-government selfguvPnm~t
+self-help selfhelp
+self-improvement selfimprUvm~t
+self-perpetuate selfpPpeCUAt
+self-perpetuating selfpPpeCUAt6N
+self-perpetuation selfpPpeCUAS~
+self-pollinate selfpol~At
+self-portrait selfp{rtr@t
+self-professed selfpr@fest
+self-subsistence selfs@bsist~s
+self-sufficiency selfs@fiS~s/
+self-sufficient selfs@fiS~t
+self-torment selft{rment
+self-torments selft{rments
+selfish selfiS
+selfishness selfiSn@s
+selfless selfl@s
+selflessness selfl@sn@s
+selfridge selfr6j
+selfs selfs
+selia sel/@
+selie sel/
+selies sel/z
+selies' sel/z
+selig sel6g
+seliga sel6g@
+seliger sel6gP
+seligman sel6gm~
+seligmann sel6gm~
+seligson sel6gs~
+selikoff sel6k{f
+selin selin
+selina s@lEn@
+selinas s@lEn@s
+selinas s@lEn@z
+selinas's s@lEn@s@z
+selinda sclEnd@
+selinger sel6NP
+selk selk
+selke selk
+selkin selkin
+selkirk selkPk
+selkirk's selkPks
+sell sel
+sella sel@
+selland sel~d
+sellards selPdz
+sellars selPz
+sellars's selPz@z
+selle sel
+selleck sel6k
+sellen sel~
+seller selP
+seller's selPz
+sellers selPz
+sellers' selPz
+selley sel/
+sellick sel6k
+sellier selyP
+sellin selin
+selling sel6N
+sellinger sel6NP
+sellings sel6Nz
+sellman selm~
+sellmeyer selmIP
+sellner selnP
+selloff sel{f
+selloffs sel{fs
+sellon sel~
+sellout sel?t
+sellouts sel?ts
+sells selz
+selma selm@
+selman selm~
+selmer selmP
+selmon selm~
+selner selnP
+selover sel@vP
+selowsky scl?sk/
+selph self
+selsor selsP
+seltz selts
+seltzer seltsP
+selva sAlv@
+selvage selv6j
+selvaggio sclvoj/]
+selves selvz
+selvey selv/
+selvidge selv6j
+selvig selv6g
+selway selwA
+selwin selwin
+selwitz selwits
+selwyn selwin
+selz selz
+selzer selzP
+selzer's selzPz
+sema sEm@
+seman sEm~
+semans sEm~z
+semantic s}ant6k
+semantics s}ant6ks
+sematech sem@tek
+sember sembP
+semblance sembl~s
+semegran sem@gr~
+semel sem@l
+semele sem@lE
+semen sEm~
+semenza scmenz@
+semerad semPad
+semester s}estP
+semesters s}estPz
+semi sem/
+semi semI
+semi-colon sem/kOl~
+semi-height sem/hIt
+semi-heights sem/hIts
+semiannual sem/any@w@l
+semiannual semIany@w@l
+semiannually sem/anU@l/
+semiannually sem/anUl/
+semiannually semIanU@l/
+semiannually semIanUl/
+semiautomatic sem/{t}at6k
+semiautomatic semI{t}at6k
+semicircular sem/sVky@lP
+semicircular semIsVky@lP
+semiclad sem/klad
+semiclad semIklad
+semiclassical sem/klas6k@l
+semicon sem6kon
+semiconductor sem/k~duktP
+semiconductor's sem/k~duktPz
+semiconductors sem/k~duktPz
+semicylindrical sem/s@lindr6k@l
+semidry sem/drI
+semidrying sem/drI6N
+semien sem/n
+semifinal sem/fIn@l
+semifinalist sem/fIn@l@st
+semifinalists sem/fIn@l@s
+semifinalists sem/fIn@l@ss
+semifinalists sem/fIn@l@sts
+semifinals sem/fIn@lz
+semifinish sem/fin6S
+semifinish semIfin6S
+semifinished sem/fin6St
+semifinished semIfin6St
+semigloss sem/glos
+semilegendary sem/lej~der/
+seminal sem~@l
+seminar sem~or
+seminara sem~)r@
+seminarian sem~,r/~
+seminarians sem~,r/~z
+seminaries sem~er/z
+seminario sem~,r/]
+seminars sem~orz
+seminary sem~er/
+seminole sem~Ol
+seminoles sem~Olz
+semionenkov sem/]neNkov
+semiotic sEm/ot6k
+semiotics sEm/ot6ks
+semipermanent sem/pVm~~t
+semiprecious sem/preS@s
+semira scmir@
+semireligious sem/r@lij@s
+semis semIz
+semisecrecy sem/sEkr@s/
+semite semIt
+semitic s}it6k
+semitism sem@tiz}
+semitrailer sem/trAlP
+semitropical sem/trop6k@l
+semler semlP
+semmel sem@l
+semmens sem~z
+semmes semz
+semmler semlP
+semon sem~
+semones sAmOncs
+semple semp@l
+semrad semr@d
+semrau semr?
+semrow semr]
+semtex semtcks
+sen sen
+sen sen@tP
+sena sen@
+senate sen@t
+senate's sen@ts
+senator sen@tP
+senator's sen@tPz
+senatore scnot{r/
+senatorial sen@t{r/@l
+senators sen@tPz
+senators' sen@tPz
+send send
+sendak sendak
+sendelbach send@lbok
+sender sendP
+sendero scnd,r]
+senders sendPz
+sending send6N
+sendo send]
+sends sendz
+seneca sen@k@
+senecal sen6k@l
+senechal sen6k@l
+seneff sen@f
+senegal sen@g{l
+seneker sen@kP
+senesac sen@sak
+senescence s~es~s
+senese sen/z
+seney sen/
+senf senf
+senff senf
+senft senft
+seng seN
+senger seNP
+sengers seNPz
+senile sEnIl
+senility s~il@t/
+senior sEnyP
+seniority s/ny{r@t/
+seniornet sEnyPnet
+seniors sEnyPz
+senk seNk
+senkbeil seNkbIl
+senko seNk]
+senn sen
+senna sen@
+senne sen
+senner senP
+sennet sen@t
+sennett senct
+sennott sen@t
+senor sEny{r
+senora sEny{r@
+sens senz
+sensabaugh sens@b{
+sensation scnsAS~
+sensational scnsAS~@l
+sensationalism scnsAS~@liz}
+sensationalist scnsAS~@list
+sensationalistic scnsAS~@list6k
+sensationalize scnsAS~@lIz
+sensationalized scnsAS~@lIzd
+sensationalizes scnsAS~@lIz@z
+sensationalizing scnsAS~@lIz6N
+sensations scnsAS~z
+sense sens
+sense-data sensdAt@
+sense-data sensdat@
+sense-datas sensdAt@z
+sense-datas sensdat@z
+sense-datum sensdAt}
+sense-datum sensdat}
+sensed senst
+senseless sensl@s
+sensenbrenner sens~brenP
+senseney sens~/
+sensenig sens~6g
+senses sens@z
+sensibilities sens@bil@t/z
+sensibility sens@bil@t/
+sensible sens@b@l
+sensibly sens@bl/
+sensing sens6N
+sensitive sens@t6v
+sensitively sens@t6vl/
+sensitiveness sens@t6vn@s
+sensitivities sens@tiv@t/z
+sensitivity sens@tiv@t/
+sensitize sens@tIz
+sensitized sens@tIzd
+senske sensk
+sensor sensP
+sensor's sensPz
+sensormatic sensPmat6k
+sensors sensPz
+sensory sensP/
+sensual senC@w@l
+sensuality senC@wal@t/
+sensuous senC@w@s
+sent sent
+sentell sent@l
+sentelle scntel
+sentence sent~s
+sentenced sent~st
+sentences sent~s@z
+sentencing sent~s6N
+senter sentP
+senters sentPz
+sentiment sent}~t
+sentiment sen}~t
+sentimental sent}en@l
+sentimental sent}ent@l
+sentimental sen}en@l
+sentimental sen}ent@l
+sentimentality sent}cntal@t/
+sentimentality sen}cntal@t/
+sentiments sent}~ts
+sentiments sen}~ts
+sentinel sent~@l
+sentinels sent~@lz
+sentman sentm~
+sentra sentr@
+sentras sentr@s
+sentries sentr/z
+sentry sentr/
+sentz sents
+senzaki sAnzok/
+seo sA]
+seo sE]
+seoul sOl
+seoul's sOlz
+seow sE?
+seow sE]
+seow's sEOz
+sep esEpE
+sep sep
+separate sepP@t
+separate sepPAt
+separate sepr@t
+separated sepPAt@d
+separately sepP@tl/
+separately sepr@tl/
+separateness sepP@tn@s
+separates sepP@ts
+separates sepPAts
+separating sepPAt6N
+separation sepPAS~
+separations sepPAS~z
+separatism sepP@tiz}
+separatist sepP@t@st
+separatists sepP@t@sts
+separatists sepr@t@s
+separatists sepr@t@ss
+separatists sepr@t@sts
+sepe sEp
+sepeda sApAd@
+sephardic s@f)rd6k
+sephardim scf)rdim
+sephardim scfPdEm
+sephlon sefl{n
+sephlon's sefl{nz
+sepia sEp/@
+sepich sep6C
+sepik sep6k
+sepp sep
+seppala scpol@
+seppi sep/
+sepsis sepsis
+sept sept
+septa sept@
+september scptembP
+september's scptembPz
+septer septP
+septic sept6k
+septima scptEm@
+septimus sept}@s
+septuagenarian scpCU@j~,r/~
+sepulvado sApUlvod]
+sepulveda sApUlvAd@
+sequa sekw@
+sequa's sekw@z
+sequeira sAkw,r@
+sequel sEkw@l
+sequels sEkw@lz
+sequence sEkw~s
+sequences sEkw~s@z
+sequencing sEkw~s6N
+sequent sEkw~t
+sequential s@kwenC@l
+sequentially s@kwenC@l/
+sequester s6kwestP
+sequestered s6kwestPd
+sequestering s6kwestP6N
+sequesters s6kwestPz
+sequestration sekw@strAS~
+sequin sEkwin
+sequined sEkwind
+sequins sEkwinz
+sequitur sekw@tP
+sequiturs sekw@tPz
+sequoia s6kw<@
+sequoias s6kw<@z
+sequoyah s@kw<@
+sera sir@
+serafin s,r@fin
+serafina sPofEn@
+serafine sPofEn/
+serafini sPofEn/
+serafino sPofEn]
+seragut s,r@gut
+seraphina sPofEn@
+seraphine sPofEn/
+seratonin sPotOnin
+seratti scrot/
+seraw sPo
+serb sVb
+serb's sVbz
+serbaine sPbAn
+serbia sVb/@
+serbia's sVb/@z
+serbian sVb/~
+serbian's sVb/~z
+serbians sVb/~z
+serbias sVb/@z
+serbin sVbin
+serbo-croatian sVb]krOAS~
+serbs sVbz
+serbs' sVbz
+serbska sVbsk@
+serco sVk]
+serda s,rd@
+sere sir
+serenade ser~Ad
+serenaded ser~Ad@d
+serenading ser~Ad6N
+serendipitous ser~dip@t@s
+serendipity ser~dip@t/
+serene sPEn
+serenely sPEn@l/
+serenely sPEnl/
+serengeti ser~get/
+serenity sPen@t/
+sereno scrAn]
+seres sErz
+serex s,r@ks
+serf sVf
+serfass sVfas
+serfin s,rfin
+serfin sVfin
+serfling sVfl6N
+serfs sVfs
+serge sVj
+sergeant s)rj~t
+sergeants s)rj~ts
+sergei s,rgA
+sergei sPgA
+sergent sVj~t
+sergey s,rgA
+sergey s,rj/
+sergi s,rj/
+sergio sVj/]
+sergius sVj/@s
+seria sEr/@
+serial sir/@l
+serialize sir/@lIz
+serialized sir/@lIzd
+serials sir/@lz
+series sir/z
+series' sir/z
+serilda sPEld@
+serino sPEn]
+serio sEr/]
+serious sir/@s
+seriously sir/@sl/
+seriousness sir/@sn@s
+serle s{r@l
+serlin sVlin
+serling sVl6N
+serlo s,rl]
+sermersheim sVmPshIm
+sermon sVm~
+sermons sVm~z
+serna s,rn@
+seroka scrOk@
+serological scr@l{j6k@l
+serologist scrol@j@st
+serology scrol@j/
+serono seron]
+serota sPOt@
+serotonin sP@tOnin
+serowski sP?sk/
+serpa s,rp@
+serpas sVp@z
+serpe sVp
+serpent sVp~t
+serpent's sVp~ts
+serpentine sVp~tIn
+serpents sVp~ts
+serpico sPpEk]
+serr s,r
+serra s,r@
+serra's s,r@z
+serrano sPan]
+serrano sPon]
+serrano's sPan]z
+serrano's sPon]z
+serranto sPont]
+serrao s,r?
+serrate s,rAt
+serrated s,rAt@d
+serrato sPot]
+serratore sPot{r/
+serres s,rcs
+serritella ser@tel@
+sertich sVt6k
+serum sir}
+serv sVv
+servaas sVvos
+servais sPvA
+servam sVv}
+servan sVv~
+servant sVv~t
+servants sVv~ts
+servants' sVv~ts
+serve sVv
+served sVvd
+servello sPvel]
+server sVvP
+servers sVvPz
+serves sVvz
+service sVv@s
+service's sVv@s@z
+serviceable sVv@s@b@l
+serviced sVv@st
+serviceman sVv@sman
+servicemaster sVv@smastP
+servicemen sVv@smcn
+servicemen's sVv@smcnz
+servicer sVv@sP
+services sVv@s@z
+services' sVv@s@z
+servicing sVv@s6N
+servico sVv@kO
+servidio sPvEd/]
+servile sVv@l
+servin sVvin
+serving sVv6N
+servings sVv6Nz
+serviou sVv/U
+servis sVvis
+serviss sVvis
+servitude sVv@tUd
+servo sVv]
+sesame ses}/
+sesdaq sesdak
+seshadri scSodr/
+sesit sezit
+seskar seskor
+seskar's seskorz
+sesler ses@lP
+sesno sesnO
+sesno's sesnOz
+sessa ses@
+session seS~
+session's seS~z
+sessions seS~z
+sessions' seS~z
+sessler seslP
+sessoms ses}z
+sessums ses}z
+sestak sest@k
+sestanovich scstan@v6C
+sestito scstEt]
+set set
+setaro sct)r]
+setback setbak
+setbacks setbaks
+seth seT
+seth's seTs
+sether seTP
+sethi seT/
+sethness seTn@s
+sethuraman seTPomon
+seti setE
+setliff setlif
+seto set]
+seton sEt~
+sets sets
+setser setsP
+settanni scton/
+sette set
+setter setP
+setterlund setPl~d
+setters setPz
+setting set6N
+settings set6Nz
+settle set@l
+settled set@ld
+settlement set@lm~t
+settlement's set@lm~ts
+settlements set@lm~ts
+settlemire set@lmIr
+settlemyre set@lmIr
+settler set@lP
+settler setlP
+settlers set@lPz
+settlers setlPz
+settlers' setlPz
+settles set@lz
+settling set@l6N
+settling setl6N
+settsu setsU
+setty set/
+setup setup
+setups setups
+setzer setzP
+setzler setslP
+seubert sUbPt
+seufert sUfPt
+seuss sUs
+sevareid sev@rId
+sevcik sevs6k
+seve sevA
+seven sev~
+seven's sev~z
+sevenfold sev~fOld
+sevens sev~z
+seventeen sev~tEn
+seventeens sev~tEnz
+seventeenth sev~tEnT
+seventh sev~T
+sevenths sev~Ts
+seventies sev~/z
+seventies sev~t/z
+seventieth sev~/@T
+seventieth sev~t/@T
+seventy sev~/
+seventy sev~t/
+seventy's sev~t/z
+sever sevP
+severa sAv,r@
+several sevP@l
+several sevr@l
+severally sevr@l/
+severance sevP~s
+severance sevr~s
+severe s@vir
+severed sevPd
+severely s@virl/
+severest s@vir@st
+severeville s@virvil
+severin sevPin
+severing sevP6N
+severini scvPEn/
+severino scvPEn]
+severity s6v,r@t/
+severn sevPn
+severns sevPnz
+severovic scvV]v6k
+severs sevPz
+severson sevPs~
+severt sevPt
+severtson sevPts~
+sevey s6vA
+sevick sev6k
+sevier sevyP
+sevigny s6vign/
+sevilla scvil@
+seville s@vil
+sevin sevin
+sevruga sevrUg@
+sevy sEv/
+sew sO
+sewage sU6j
+sewald sU@ld
+sewall sU@l
+seward sUPd
+sewed sOd
+sewell sU@l
+sewer sUP
+sewerage sUP6j
+sewers sUPz
+sewing sO6N
+sewn sOn
+sex seks
+sexauer seks?P
+sexed sekst
+sexes seks@z
+sexier seks/P
+sexiest seks/@st
+sexism seksiz}
+sexist seksist
+sexless seksl@s
+sexson seks~
+sextet sckstet
+sexton sekst~
+sextuplet sckstupl@t
+sextuplets sckstupl@ts
+sextus sekst@s
+sexual sekSU@l
+sexuality sekSUal@t/
+sexually sekSU@l/
+sexy seks/
+seybert sAbPt
+seybold sAbOld
+seydel sAd@l
+seydoux sAdU
+seyer sAP
+seyfarth sAforT
+seyfert sAfPt
+seyfried sAfP/d
+seyi sA/
+seyler sAlP
+seyller sAlP
+seymore sEm{r
+seymour sEm{r
+seymour's sEm{rz
+sfernice s@fVnis
+sfernice sfVnis
+sferra sf,r@
+sferrazza sfPots@
+sffed esefed
+sffed esefefEdE
+sffed sfed
+sforza sf{rz@
+sfuzzi sfUtz/
+sgambati skombot/
+sgro skrO
+sgroi skr<
+sh esAC
+sha So
+sha'ath SoT
+shaak Sok
+shaanxi SoNks/
+shaath SoT
+shaath's SoTs
+shabad S@bad
+shabazz Soboz
+shabby Sab/
+shaber SAbP
+shack Sak
+shackelford Sak@lfPd
+shackelton S@kelt~
+shackett Sak@t
+shackle Sak@l
+shackled Sak@ld
+shackleford Sakl@fPd
+shackles Sak@lz
+shackleton Sak@lt~
+shacklett Saklct
+shacks Saks
+shad Sad
+shad's Sadz
+shadbush SadbqS
+shadd Sad
+shadden Sad~
+shaddix Sad6ks
+shaddock Sad@k
+shadduck Sad@k
+shade SAd
+shaded SAd@d
+shadegg Sadcg
+shadel Sad@l
+shader SAdP
+shades SAdz
+shadid Sad@d
+shading SAd6N
+shadings SAd6Nz
+shadle SAd@l
+shadley Sadl/
+shadoan Sad]n
+shadow SadO
+shadowed Sad]d
+shadowens Sad]~z
+shadowing Sad]6N
+shadowland Sad]land
+shadowlands Sad]landz
+shadows SadOz
+shadowy Sad]/
+shadrick Sadr6k
+shadur SadP
+shadwell Sadwcl
+shadwick Sadw6k
+shady SAd/
+shaefer SAfP
+shaeffer SefP
+shaer SAP
+shafer SAfP
+shaff Saf
+shaffer SAfP
+shaffner SafnP
+shafran Safr~
+shaft Saft
+shafted Saft@d
+shafting Saft6N
+shafts Safts
+shag Sag
+shaggy Sag/
+shah So
+shah's Soz
+shahan Sah~
+shaheed S@hEd
+shaheen S@hEn
+shahian S@hE~
+shahin Sahin
+shahinian S@hin/~
+shahrokh S)rok
+shahrzad Sorzad
+shai SI
+shaik SAk
+shaiken SAk~
+shaikh SAk
+shain SAn
+shaine SAn
+shaka Sok@
+shake SAk
+shakedown SAkd?n
+shakedowns SAkd?nz
+shaken SAk~
+shakeout SAk?t
+shaker SAkP
+shakers SAkPz
+shakes SAks
+shakespeare SAkspEr
+shakespeare's SAkspErz
+shakespearean SAkspir/~
+shakeup SAkup
+shakeups SAkups
+shakier SAk/P
+shakiest SAk/@st
+shakiness SAk/n@s
+shaking SAk6N
+shakir Sak6r
+shaklee Sakl/
+shakunaga SokUnog@
+shakur SokP
+shaky SAk/
+shalala S@lAl@
+shalala's S@lAl@z
+shale SAl
+shaler SAlP
+shales SAlz
+shali Sal/
+shalikashvili Sal/koSvEl/
+shalikashvili's Sal/koSvEl/z
+shall Sal
+shallcross Salkros
+shallenberger S{l~bPgP
+shallow Sal]
+shallower Sal]P
+shallowness Sal]n@s
+shalnev Solncf
+shalnev Solncv
+shalom S@lOm
+shalt Salt
+sham Sam
+shaman SAm~
+shamans SAm~z
+shamas Sam@s
+shambaugh Samb{
+shamberger SambPgP
+shamble Samb@l
+shambles Samb@lz
+shambley Sambl/
+shamblin Samblin
+shambo Samb]
+shamburg SambPg
+shamburger SambPgP
+shame SAm
+shamed SAmd
+shameful SAmf@l
+shamel Sam@l
+shameless SAml@s
+shamelessly SAml@sl/
+shames SAmz
+shaming SAm6N
+shamir S}ir
+shamir's S}irz
+shamp Samp
+shampine SampIn
+shampoo SampU
+shampooed SampUd
+shampoos SampUz
+shamrock Samrok
+shamrock's Samroks
+shamu SomU
+shamus SAm@s
+shan San
+shana SAn@
+shana San@
+shanafelt San@felt
+shanahan San@han
+shanansky S~ansk/
+shand Sand
+shandling Sandl6N
+shandong SondON
+shands Sandz
+shandwick Sandwik
+shandwick's Sandwiks
+shandy Sand/
+shane SAn
+shaner SAnP
+shaneyfelt San/fclt
+shanghai SaNhI
+shanghai's SaNhIz
+shangkun SaNk~
+shangri SaNgr/
+shanholtz SanhOlts
+shanholtzer Sanh]ltzP
+shank SaNk
+shankel SaNk@l
+shanken SaNk~
+shanker SaNkP
+shankland SaNkl~d
+shankle SaNk@l
+shankles SaNk@lz
+shanklin SaNklin
+shankman SaNkm~
+shanks SaNks
+shanley Sanl/
+shannahan San@han
+shannon San~
+shannon's San~z
+shansev Sanscf
+shansev Sanscv
+shanti Sant/
+shanties Sant/z
+shanty Sant/
+shantytown Sant/t?n
+shantytowns Sant/t?nz
+shantz Sants
+shao S?
+shap Sap
+shape SAp
+shaped SApt
+shapeless SApl@s
+shapely SApl/
+shapero S@pir]
+shapes SAps
+shaping SAp6N
+shapira S@pir@
+shapiro S@pir]
+shapiro's S@pir]z
+shapiros S@pir]z
+shapley Sapl/
+shapp Sap
+shappell Sap@l
+shaq Sak
+shaquille S@kEl
+shara S)r@
+sharaa S)r@
+sharansky SPansk/
+sharar SP)r
+sharber S)rbP
+sharbono SorbOn]
+shard S)rd
+shards S)rdz
+share S,r
+share's S,rz
+sharecropper S,rkropP
+sharecroppers S,rkropPz
+shared S,rd
+shareholder S,rhOldP
+shareholder's S,rhOldPz
+shareholders S,rhOldPz
+shareholders' S,rhOldPz
+shareholding S,rhOld6N
+shareholdings S,rhOld6Nz
+sharell S@rel
+shareowner S,rOnP
+shareowners S,rOnPz
+sharer S,rP
+shares S,rz
+shares' S,rz
+shareware S,rwer
+sharf S)rf
+sharfman S)rfm~
+shari S)r/
+sharia S,r/@
+sharif SPEf
+sharing S,r6N
+shark S)rk
+sharkey S)rk/
+sharking S)rk6N
+sharklike S)rklIk
+sharks S)rks
+sharla S)rl@
+sharleen SorlEn
+sharlene S)rlEn
+sharline S)rlIn
+sharlow S)rl]
+sharm S)rm
+sharma S)rm@
+sharma's S)rm@z
+sharman S)rm~
+sharon S,r~
+sharon S@rOn
+sharon's S,r~z
+sharon's S@rOnz
+sharp S)rp
+sharp's S)rps
+sharp-sign S)rpsIn
+sharpe S)rp
+sharpen S)rp~
+sharpened S)rp~d
+sharpening S)rpn6N
+sharpening S)rp~6N
+sharpens S)rp~z
+sharper S)rpP
+sharpest S)rp@st
+sharpeville S)rp@vil
+sharpie S)rp/
+sharples S)rp@lz
+sharpless S)rpl@s
+sharpley S)rpl/
+sharply S)rpl/
+sharpnack S)rpn@k
+sharpness S)rpn@s
+sharps S)rps
+sharpshooter S)rpSUtP
+sharpshooter S)rpSUtP
+sharpshooters S)rpSUtPz
+sharpton S)rpt~
+sharpy S)rp/
+sharpy's S)rp/z
+sharrar SP)r
+sharrer S)rP
+sharrett Sarct
+sharrock Sar@k
+sharron Sar~
+sharrow Sar]
+sharry S)r/
+shartzer S)rtzP
+sharum SPum
+sharyl S,r@l
+shas Sus
+shashlik SaSl6k
+shashoua SuSU@
+shasta Sast@
+shasta's Sast@z
+shasteen S@stEn
+shatkin Satkin
+shatley Satl/
+shatner SatnP
+shatrov Satrov
+shatt Sat
+shatter SatP
+shattered SatPd
+shattering SatP6N
+shatterproof SatPprUf
+shatters SatPz
+shattuck Sat@k
+shatz Sats
+shatz Sots
+shatzer SAtzP
+shaub S{b
+shauger S?gP
+shaughnessy S{n@s/
+shaul S{l
+shaulis S?lis
+shaull S{l
+shaun S{n
+shauna S{n@
+shave SAv
+shaved SAvd
+shavelson SAv@ls~
+shavelson Sav@ls~
+shaven SAv~
+shaver SAvP
+shavers SAvPz
+shaves SAvz
+shaving SAv6N
+shavings SAv6Nz
+shavord S@v{rd
+shaw S{
+shaw's S{z
+shawcross S{kr{s
+shawgo S{gO
+shawhan Saw~
+shawinigan S@win6g~
+shawl S{l
+shawler S{lP
+shawley S{l/
+shawls S{lz
+shawmut S{m@t
+shawmut's S{m@ts
+shawn S{n
+shawn's S{nz
+shawna S{n@
+shawnee S{n/
+shawnut S{n@t
+shawshank S{Sank
+shawver S{vP
+shay SA
+shaykin SAkin
+shaykin's SAkinz
+shayne SAn
+shays SAz
+shcharansky SPansk/
+shchedrin Sedrin
+shcherbitsky SPbitsk/
+she SE
+she'd SEd
+she'll SEl
+she's SEz
+shea SA
+shea's SAz
+shead shed
+sheaf SEf
+sheaffer SEfP
+sheahan SE~
+shealey SEl/
+shealy SEl/
+shean SEn
+shear Sir
+shear's SErz
+sheard Sird
+sheared Sird
+shearer SirP
+shearin Sirin
+shearing Sir6N
+shearman SErm~
+shearn Sirn
+shearon Sir~
+shearouse Sir?s
+shears SErz
+shearson Sirs~
+shearson's Sirs~z
+sheath SET
+sheathbill SETbil
+sheathbills SETbilz
+sheathe SET
+sheathed SETd
+sheathing SET6N
+sheats SEts
+sheaves SEvz
+sheba SEb@
+sheboygan S@b<g~
+sheck Sek
+sheck's Seks
+sheckler SeklP
+shed Sed
+shedd Sed
+shedden Sed~
+shedding Sed6N
+shedlock Sedlok
+shedrick Sedr6k
+sheds Sedz
+sheeder SEdP
+sheedy SEd/
+sheehan SEh~
+sheehan SE~
+sheehan's SEh~z
+sheehan's SE~z
+sheehy SE/
+sheehy SEh/
+sheek SEk
+sheeks SEks
+sheela SEl@
+sheelah SEl@
+sheelen SEl~
+sheeler SElP
+sheeley SEl/
+sheely SEl/
+sheen SEn
+sheena SEn@
+sheep SEp
+sheep's SEps
+sheepish SEpiS
+sheepishly SEpiSl/
+sheeps SEps
+sheepskin SEpskin
+sheer Sir
+sheeran Sir~
+sheerer SErP
+sheerin Sirin
+sheesh SES
+sheesley SEzl/
+sheet SEt
+sheeting SEt6N
+sheets SEts
+sheetz SEts
+sheff Sef
+sheffer SefP
+sheffey Sef/
+sheffield Sef/ld
+sheffler SeflP
+sheftel Seftel
+sheftel's Seftelz
+shegog Segog
+shehan Seh~
+shehane Seh~
+shehorn SehPn
+sheik SEk
+sheik's SEks
+sheikdom SEkd}
+sheikdoms SEkd}z
+sheikh SEk
+sheiks SEks
+sheil SIl
+sheila SEl@
+sheila's SEl@z
+sheilah SEl@
+sheilds SIldz
+sheils SIlz
+shein SIn
+sheinberg SInbPg
+shek Sek
+shek's Seks
+shekel Sek@l
+shekels Sek@lz
+shelburne SelbPn
+shelby Selb/
+shelby's Selb/z
+shelbyville Selb/vil
+sheldahl Seldol
+shelden Seld~
+sheldon Seld~
+shelev Sel6v
+sheley SEl/
+shelf Self
+shelhamer Selh}P
+sheline SelIn
+shell Sel
+shell's Selz
+shellabarger Sel@borgP
+shelled Seld
+shellenbarger Sel~borgP
+shellenberger Sel~bPgP
+sheller SelP
+shelley Sel/
+shelley's Sel/z
+shellfish SelfiS
+shellhammer SelhamP
+shellhorn SelhPn
+shelling Sel6N
+shellings Sel6Nz
+shellito SAlEt]
+shellman Selm~
+shells Selz
+shellshock SelSok
+shellshocked SelSokt
+shelly Sel/
+shelman Selm~
+shelnutt Seln@t
+shelor SelP
+shelp Selp
+shelstad Selst@d
+shelter SeltP
+sheltered SeltPd
+sheltering SeltP6N
+shelters SeltPz
+shelton Selt~
+shelton's Selt~z
+shelve Selv
+shelved Selvd
+shelves Selvz
+shelving Selv6N
+shemanski S}ansk/
+shemona S}On@
+shemwell Semwel
+shen Sen
+shena SEn@
+shenandoah Sen~dO@
+shenanigan S~an6g~
+shenanigans S~an6g~z
+shenberger SenbPgP
+shenefield Sen@fEld
+sheneman SEnm~
+sheng SeN
+sheng-fen SeNfen
+shenice S~Es
+shenk SeNk
+shenker SeNkP
+shenkman SeNkm~
+shenton Sent~
+shenyang ScnyaN
+shenzhen SenZen
+shep Sep
+shepard SepPd
+shepard's SepPdz
+shepardson Sepords~
+sheperd SepPd
+shephard SefPd
+shepheard SefPd
+shepherd SepPd
+shepherd's SepPdz
+shepherded SepPd@d
+shepherding SepPd6N
+shepherds SepPdz
+shepler SeplP
+shepley Sepl/
+shepp Sep
+sheppard SepPd
+sheppards SepPdz
+shepper SepP
+shepperd SepPd
+shepperson SepPs~
+sheppy Sep/
+sher SV
+sherak S,rak
+sherard S,rPd
+sheraton S,r@t~
+sheraton's S,r@t~z
+sherbert SVbPt
+sherbet SVb@t
+sherbondy SPbond/
+sherborne SVbPn
+sherbourn SPbqrn
+sherbourne SPbqrn
+sherburn SVbPn
+sherburne SVbPn
+shere Sir
+sheree SPE
+sherer SirP
+sherfey SVf/
+sherfield SVf/ld
+sheri S,r/
+sherick S,r6k
+sheridan S,r@d~
+sheriff S,r@f
+sheriff's S,r@fs
+sheriffs S,r@fs
+sherin S,r~
+sherk SVk
+sherley SVl/
+sherlin SVl~
+sherlock SVlok
+sherlock's SVloks
+sherlund SVl~d
+sherman SVm~
+sherman's SVm~z
+shermer SVmP
+shernoff SVn{f
+sherod S,r@d
+sherr S,r
+sherr's S,rz
+sherrard S,rPd
+sherrell S,r@l
+sherrer S,rP
+sherrgold S,rgOld
+sherri S,r/
+sherri's S,r/z
+sherrick S,r@k
+sherrie S,r/
+sherriff S,r@f
+sherrill S,r@l
+sherrin S,r~
+sherrit S,r@t
+sherritt S,r@t
+sherrod S,r@d
+sherron S,r~
+sherrow S,r]
+sherry S,r/
+sherry's S,r/z
+shertzer SVtzP
+sherva SVv@
+sherwin SVw~
+sherwood SVwqd
+sherwood's SVwqdz
+sheryl S,r@l
+sheshunoff SeSUn{f
+sheth SeT
+shetland Setl~d
+shetler SetlP
+shetley Setl/
+shetter SetP
+shetterly SetPl/
+shevardnadze SevPdnodz/
+shevardnadze's SevPdnodz/z
+shevlin Sevl~
+shevtl SEvil
+shevtl Sevil
+shew SU
+sheward SUPd
+shewchuk SUC@k
+shewell Sewcl
+shewmake SUmAk
+shewmaker SUmAkP
+shh S
+shi SE
+shia SE@
+shias SE@z
+shibanna S@ban@
+shibata S/bot@
+shibboleth Sib@leT
+shibley Sibl/
+shick Sik
+shicoff Sik{f
+shideler Sid@lP
+shidler SId@lP
+shied SId
+shieh SE
+shiel SEl
+shiela SIl@
+shield SEld
+shield's SEldz
+shielded SEld@d
+shielding SEld6N
+shields SEldz
+shiels SElz
+shier SIP
+shies SIz
+shiff Sif
+shiffer SifP
+shiffler SiflP
+shifflet Sifl@t
+shifflett Siflct
+shiffman Sifm~
+shiflet Sifl@t
+shiflett Siflct
+shifrin Sifrin
+shift Sift
+shifted Sift@d
+shifter SiftP
+shifting Sift6N
+shiftless Siftl@s
+shifts Sifts
+shifty Sift/
+shigeki S6gAk/
+shigekuni SEg6kUn/
+shigeo S6gA]
+shigeru S6gArU
+shigley Sigl/
+shih SE
+shihan SEhon
+shiina SEn@
+shiite SEIt
+shiites SEIts
+shiley Sil/
+shill Sil
+shiller SilP
+shilling Sil6N
+shillingburg Sil6NbPg
+shillinger Sil~jP
+shillinglaw Sil6Nl{
+shillings Sil6Nz
+shillington Sil6Nt~
+shiloh SIl]
+shilts Silts
+shim Sim
+shima SEm@
+shimabukuro S/mobUkqr]
+shimada S/mod@
+shimbun SimbUn
+shimbun Simbun
+shimek Sim6k
+shimel Sim@l
+shimer SImP
+shimizu S}EzU
+shimko Simk]
+shimkus Simk@s
+shimmel Sim@l
+shimmer SimP
+shimmered SimPd
+shimmering SimP6N
+shimmerlik SimPl6k
+shimmers SimPz
+shimmin Simin
+shimmy Sim/
+shimoda S}Od@
+shimoga S}Og@
+shimokawa Sim]kow@
+shimon SEm]n
+shimon SEm~
+shimone SEm]n
+shimp Simp
+shin Sin
+shinall Sin@l
+shinault Sin?lt
+shinbein SinbIn
+shinbone SinbOn
+shindig Sind6g
+shindle Sind@l
+shindledecker Sindl@d6kP
+shindler SindlP
+shindler's SindlPz
+shindou SindO
+shine SIn
+shined SInd
+shiner SInP
+shines SInz
+shing SiN
+shingle SiNg@l
+shingledecker SiNg@ldckP
+shingler SiNlP
+shingles SiNg@lz
+shingleton SiNg@lt~
+shinichi SinEC/
+shining SIn6N
+shinkle SiNk@l
+shinko SiNk]
+shinn Sin
+shinners SinPz
+shinnick Sin6k
+shinri Sinr/
+shinrikyo SinrEky]
+shinsei SinsA
+shinsky Sinsk/
+shintaro S~t)r]
+shinto SintO
+shinwa Sinw@
+shinxiaku SinCyokU
+shiny SIn/
+shinyuka SinyUk@
+shionogi SE~Og/
+ship Sip
+ship's Sips
+shipboard Sipb{rd
+shipbuilder SipbildP
+shipbuilders SipbildPz
+shipbuilding Sipbild6N
+shipbuildings Sipbild6Nz
+shipe SIp
+shipes SIps
+shipholding SiphOld6N
+shiplett Siplct
+shipley Sipl/
+shipload SiplOd
+shiploads SiplOdz
+shipman Sipm~
+shipmate SipmAt
+shipmates SipmAts
+shipment Sipm~t
+shipments Sipm~ts
+shipowner SipOnP
+shipowners SipOnPz
+shipp Sip
+shipp's Sips
+shipped Sipt
+shippee SipE
+shipper SipP
+shipper's SipPz
+shippers SipPz
+shippey Sip/
+shipping Sip6N
+shippingport Sip6Np{rt
+shipps Sips
+shippy Sip/
+ships Sips
+ships' Sips
+shipshape SipSAp
+shipton Sipt~
+shipwash SipwoS
+shipwreck Siprck
+shipwright SiprIt
+shipwrights SiprIts
+shipyard Sipyord
+shipyard's Sipyordz
+shipyards Sipyordz
+shir SV
+shira Sir@
+shirah Sir@
+shiraishi S6roES/
+shirazi S6roz/
+shire SIr
+shirell S6rel
+shirelle S6rel
+shireman S6rAm~
+shiremanstown SIrm~zt?n
+shirer SIPr
+shires SIrz
+shirey SIr/
+shirin Sir~
+shirk SVk
+shirked SVkt
+shirkey SVk/
+shirking SVk6N
+shirl SVl
+shirlee SVl/
+shirleen SPlEn
+shirlene SVl/n
+shirley SVl/
+shirley's SVl/z
+shirlie SVl/
+shiroma S6rOm@
+shirone S6rOn
+shirr SV
+shirrell S{r@l
+shirt SVt
+shirts SVts
+shirtsleeve SVtslEv
+shiseido S@sAd]
+shishido S/SEd]
+shisler Sis@lP
+shissler SislP
+shit SEt
+shitila S@til@
+shiu SU
+shiva SEv@
+shive SIv
+shiveley Siv@l/
+shively SIvl/
+shiver SivP
+shiverdecker SivPd6kP
+shivered SivPd
+shivering SivP6N
+shivers SivPz
+shives SIvz
+shivley Sivl/
+shiyuan SEUon
+shizuka SizUk@
+shizuoka S/zwOk@
+shlaes SlAz
+shlenker SleNkP
+shlobidan Sl]bid~
+shoaf SOf
+shoaff SOf
+shoals SOlz
+shobana SObon@
+shobana's SObon@z
+shobanna SObon@
+shobanna's SObon@z
+shobe SOb
+shober SObP
+shoberg SObPg
+shobert SobPt
+shock Sok
+shocked Sokt
+shocker SokP
+shockey Sok/
+shocking Sok6N
+shockingly Sok6Nl/
+shockley Sokl/
+shocks Soks
+shockwave SokwAv
+shockwaves SokwAvz
+shod Sod
+shoddy Sod/
+shoe SU
+shoe's SUz
+shoebox SOboks
+shoehorn SUh{rn
+shoehorned SUh{rnd
+shoelace SUlAs
+shoelaces SUlAs@z
+shoemake SUmAk
+shoemaker SUmAkP
+shoemakers SUmAkPz
+shoemate SUmAt
+shoen SUn
+shoeprint SUprint
+shoeprints SUprints
+shoes SUz
+shoeshine SUSIn
+shoestring SUstriN
+shoff S{f
+shoffner S{fnP
+shofner SofnP
+shogren Sogrcn
+shogun SOg~
+shohat SOhat
+shoichi S]EC/
+shoichiro SO6Cir]
+shoji SOj/
+shokhin SOkin
+shoko SOk]
+sholar SOlP
+sholem SOl}
+sholes SOlz
+sholl Sol
+shollenberger Sol~bPgP
+sholly Sol/
+sholtis SOltis
+sholto SOlt]
+shomaker SOmAkP
+shomo SOm]
+shon Son
+shone SOn
+shoney SOn/
+shoney's SOn/z
+shonk SoNk
+shonka SoNk@
+shonkwiler SoNkwIlP
+shontz Sonts
+shoo SU
+shoob SUb
+shooed SUd
+shoofly SUflI
+shook Sqk
+shoop SUp
+shoopman SUpm~
+shooshan SUS~
+shoot SUt
+shootdown SUtd?n
+shooter SUtP
+shooters SUtPz
+shootin' SUt~
+shooting SUt6N
+shootings SUt6Nz
+shootout SUt?t
+shootouts SUt?ts
+shoots SUts
+shop Sop
+shop's Sops
+shope SOp
+shopkeeper SopkEpP
+shopkeepers SopkEpPz
+shopko Sopk]
+shopkorn Sopk{rn
+shoplift Soplift
+shoplifter SopliftP
+shoplifters SopliftPz
+shoplifting Soplift6N
+shoppe Sop
+shopped Sopt
+shopper SopP
+shopper's SopPz
+shoppers SopPz
+shoppers' SopPz
+shoppes Sops
+shopping Sop6N
+shopping's Sop6Nz
+shops Sops
+shoptaw Sopt{
+shopwell Sopwel
+shopworn Sopw{rn
+shor S/V
+shorb S{rb
+shore S{r
+shore's S{rz
+shorebird S{rbVd
+shored S{rd
+shoreham S{rham
+shoreham S{r}
+shoreline S{rlIn
+shorenstein S{r~st/n
+shorenstein S{r~stIn
+shores S{rz
+shoreward S{rwPd
+shorey S{r/
+shorin S{rin
+shoring S{r6N
+shorkey S{rk/
+shorn S{rn
+shorr S{r
+short S{rt
+short-winded S{rtwind@d
+shortage S{rt@j
+shortages S{rt@j@z
+shortall S{rt@l
+shortcake S{rtkAk
+shortchange S{rtCAnj
+shortchanged S{rtCAnjd
+shortchanging S{rtCAnj6N
+shortcoming S{rtkum6N
+shortcomings S{rtkum6Nz
+shortcut S{rtkut
+shortcuts S{rtkuts
+shorted S{rt@d
+shortell S{rtel
+shorten S{rt~
+shortened S{rt~d
+shortening S{rtn6N
+shortening S{rt~6N
+shortens S{rt~z
+shorter S{rtP
+shorter's S{rtPz
+shortest S{rt@st
+shortfall S{rtf{l
+shortfalls S{rtf{lz
+shortgrass S{rtgras
+shorthair S{rther
+shorthaired S{rtherd
+shorthand S{rthand
+shorting S{rt6N
+shortlived S{rtlIvd
+shortlived S{rtlivd
+shortly S{rtl/
+shortness S{rtn@s
+shortridge S{rtr6j
+shorts S{rts
+shorts' S{rts
+shortsighted S{rtsIt@d
+shortsightedness S{rtsIt@dn@s
+shortstop S{rtstop
+shortt S{rt
+shortterm S{rttVm
+shortwave S{rtwAv
+shorty S{rt/
+shortz S{rts
+shortz' S{rts
+shortz's S{rts@z
+shoshone S]SOn/
+shostak Sost@k
+shostakovich S{st@kOv6C
+shot Sot
+shotgun Sotgun
+shotguns Sotgunz
+shots Sots
+shott Sot
+shotts Sots
+shotwell Sotwel
+shougang S?goN
+shough S?
+should Sqd
+should've Sqd@v
+shoulder SOldP
+shouldered SOldPd
+shouldering SOldP6N
+shoulders SOldPz
+shouldn't Sqd~t
+shoults SOlts
+shoultz SOlts
+shoumaker SUmAkP
+shoun S?n
+shoup SUp
+shoupe SUp
+shouse sh?s
+shout S?t
+shouted S?t@d
+shouting S?t6N
+shouts S?ts
+shoval SOval
+shove Suv
+shoved Suvd
+shovel Suv@l
+shoveled Suv@ld
+shoveling Suvl6N
+shovels Suv@lz
+shover SuvP
+shoves Suvz
+shoving Suv6N
+shovlin Sovlin
+show SO
+show's SOz
+showa SO@
+showalter SO@ltP
+showbiz SObiz
+showboat SObOt
+showboat's SObOts
+showbuzz SObuz
+showcase SOkAs
+showcased SOkAst
+showcases SOkAs@z
+showcasing SOkAs6N
+showdown SOd?n
+showdowns SOd?nz
+showed SOd
+showell Sowcl
+shower S?P
+showered S?Pd
+showering S?P6N
+showers S?Pz
+showgirl SOgVl
+showgirls SOgVlz
+showiest SO/@st
+showing SO6N
+showings SO6Nz
+showman SOm~
+showmanship SOm~Sip
+shown SOn
+showpiece SOpEs
+showplace SOplAs
+showroom SOrUm
+showroom SOrqm
+showrooms SOrUmz
+shows SOz
+shows' SOz
+showscan SOskan
+showtime SOtIm
+showtime's SOtImz
+showy SO/
+shrader SrAdP
+shrake SrAk
+shramek Sram6k
+shrank SraNk
+shrapnel Srapn@l
+shreck Srek
+shred Sred
+shredded Sred@d
+shredder SredP
+shredders SredPz
+shredding Sred6N
+shreds Sredz
+shreeve SrEv
+shreffler SreflP
+shreiber SrIbP
+shreiner SrInP
+shreve SrEv
+shreveport SrEvp{rt
+shreves SrEvz
+shrewd SrUd
+shrewdest SrUd@st
+shrewdly SrUdl/
+shrewdness SrUdn@s
+shrewsberry SrUzber/
+shrewsbury SrUzber/
+shri SrE
+shriber SrIbP
+shribman Sribm~
+shrider SrIdP
+shriek SrEk
+shrieked SrEkt
+shrieking SrEk6N
+shrieks SrEks
+shrift Srift
+shrikant SrEkont
+shrikelike SrIklIk
+shrill Sril
+shrimp Srimp
+shrimper SrimpP
+shrimpers SrimpPz
+shrine SrIn
+shriner SrInP
+shriners SrInPz
+shrines SrInz
+shrink SriNk
+shrinkage SriNk6j
+shrinking SriNk6N
+shrinks SriNks
+shrivel Sriv@l
+shriveled Sriv@ld
+shriveling Sriv@l6N
+shriver SrIvP
+shrock Srok
+shrode SrOd
+shroff Sr{f
+shrontz Sronts
+shropshire SropSIr
+shroud Sr?d
+shrouded Sr?d@d
+shrouding Sr?d6N
+shrouds Sr?dz
+shrout Sr?t
+shroyer Sr<P
+shrub Srub
+shrubbery SrubP/
+shrubby Srub/
+shrublike SrublIk
+shrubs Srubz
+shrug Srug
+shrugged Srugd
+shrugging Srug6N
+shrugs Srugz
+shrum Srum
+shrunk SruNk
+shrunken SruNk~
+shryock SrIok
+shtick Stik
+shu SU
+shuart SUPt
+shubert SUbPt
+shubin SUbin
+shuchman Sukm~
+shuchman's Sukm~z
+shuck Suk
+shucked Sukt
+shucking Suk6N
+shucks Suks
+shuda SUd@
+shudder SudP
+shuddered SudPd
+shuddering SudP6N
+shudders SudPz
+shue SU
+shuey SU/
+shufelt SUfclt
+shuff Suf
+shuffield SufEld
+shuffle Suf@l
+shuffled Suf@ld
+shuffler Suf@lP
+shufflers Suf@lPz
+shuffles Suf@lz
+shuffling Sufl6N
+shuffling Sufql6N
+shuford SUfPd
+shufro Sufr]
+shugars SUgPz
+shugart Sugort
+shughart Sughort
+shugrue SugrU
+shui SU/
+shukla Sukl@
+shukri SUkr/
+shula SUl@
+shular SUlP
+shuler SUlP
+shull Sul
+shulman Sqlm~
+shultis Sultis
+shults Sults
+shultz Sqlts
+shultz's Sqltsiz
+shum Sum
+shumake SUmAk
+shumaker SUmAkP
+shuman SUm~
+shumard SUmPd
+shumate SUmAt
+shumeet SUmEt
+shumer SUmP
+shumpert SumpPt
+shumsky Sumsk/
+shumway SumwA
+shun Sun
+shunk SuNk
+shunned Sund
+shunning Sun6N
+shuns Sunz
+shunt Sunt
+shunted Sunt@d
+shunting Sunt6N
+shunto Sunt]
+shupe SUp
+shupert SUpPt
+shuping SUp6N
+shupp Sup
+shur SV
+shure Sqr
+shurgard Sqrgord
+shurley SVl/
+shurr SV
+shurtleff SVtlif
+shurtliff SVtlif
+shurtz SVts
+shuster SustP
+shusterman SustPm~
+shut Sut
+shutdown Sutd?n
+shutdowns Sutd?nz
+shute SUt
+shutes SUts
+shutout Sut?t
+shuts Suts
+shutt Sut
+shutter SutP
+shuttered SutPd
+shuttering SutP6N
+shutters SutPz
+shutting Sut6N
+shuttle Sut@l
+shuttle's Sut@lz
+shuttled Sut@ld
+shuttles Sut@lz
+shuttlesworth Sut@lzwVT
+shuttleworth Sut@lwVT
+shuttling Sut@l6N
+shuttling Sutl6N
+shutts Suts
+shuwa SUw@
+shuwa's SUw@z
+shy SI
+shying SI6N
+shyjan SIjan
+shylock SIlok
+shyly SIl/
+shymanski S}ansk/
+shyne SIn
+shyness SIn@s
+shyster SIstP
+shysters SIstPz
+si sE
+siad sIad
+siam sIam
+siam sIam
+siamese sI}Ez
+siang SaN
+siang syaN
+siano s/on]
+sias Z{z
+sib sib
+sibbie sib/
+sibby sib/
+sibelle sibel
+siberia sIbir/@
+siberian sIbir/~
+sibert sibPt
+sibil sib@l
+sibilia s/bEl/@
+sibilla sibil@
+sibille sib@l
+sible sIb@l
+sibley sibl/
+sibling sibl6N
+siblings sibl6Nz
+sibson sibs~
+sibyl sib@l
+sibyll sib@l
+sic sik
+sica sEk@
+sicard sikPd
+sichel sik@l
+sichuan siCwon
+sicilia sisily@
+sicilian sisil/~
+siciliano s/C/l/on]
+sicily sis@l/
+sick sik
+sickel sik@l
+sickels sik@lz
+sicken sik~
+sickened sik~d
+sickening sikn6N
+sickening sik~6N
+sicker sikP
+sickest sik@st
+sickinger sik6NP
+sickle sik@l
+sickler siklP
+sickles sik@lz
+sickly sikl/
+sickman sikm~
+sickness sikn@s
+siconolfi s/k]nOlf/
+sicotte s6k{t
+sid sid
+sid's sidz
+sidak sidak
+siddall sid@l
+siddeley sid@l/
+siddell sid@l
+sidden sid~
+siddens sid~z
+siddhartha s@d)rtu
+siddig sid6g
+siddiqi s/dEk/
+siddiqui s/dEkw/
+siddle sid@l
+siddons sid~z
+side sId
+side's sIdz
+sidearm sIdorm
+sidearms sIdormz
+sidebar sIdbor
+sidebars sIdborz
+sided sId@d
+sidek sIdek
+sidekick sIdkik
+sideline sIdlIn
+sidelined sIdlInd
+sidelines sIdlInz
+sidell sId@l
+sideman sIdman
+sidener sid/nP
+sider sIdP
+siderca s@dVk@
+sideris sidP@s
+siderographer sIdP{gr@fP
+siderographers sIdP{gr@fPz
+siders sIdPz
+siders' sIdPz
+sides sIdz
+sides' sIdz
+sideshow sIdSO
+sideshows sIdSOz
+sidestep sIdstep
+sidestepped sIdstept
+sidestepping sIdstep6N
+sidesteps sIdsteps
+sidestream sIdstrEm
+sidetrack sIdtrak
+sidetracked sIdtrakt
+sidewalk sIdw{k
+sidewalks sIdw{ks
+sidewater sIdw{tP
+sideways sIdwAz
+sidewinder sIdwIndP
+sidewise sIdwIz
+sidey sId/
+sidhu sidhU
+siding sId6N
+sidle sId@l
+sidler sId@lP
+sidley sidl/
+sidman sidm~
+sidney sidn/
+sidon sId~
+sidonia s/dOn/@
+sidor sidP
+sidoti s/dOt/
+sidra sidr@
+sids sidz
+sidwell sidwel
+sie esIE
+sie sE
+siebe sEb
+siebel sEb@l
+siebels sEb@lz
+sieben sEb~
+siebenaler sEb~@lP
+siebenaler sEb~olP
+sieber sEbP
+siebers sEbPz
+siebert sEbPt
+siebold sEbOld
+siebrecht sEbr6kt
+sieck sEk
+siecle sEk@l
+siedenburg sEd~bPg
+siedlecki s/dletsk/
+siedschlag sEdSl@g
+siefert sEfPt
+siefert's sEfPts
+siefken sEfk~
+siefker sEfkP
+sieg sEg
+siegal sEg@l
+siegan sEg~
+siegan's sEg~z
+siege sEj
+siegecraft sEjkraft
+siegel sEg@l
+siegel's sEg@lz
+siegell sEg@l
+siegelman sEg@lm~
+siegenthaler sEg~TolP
+sieger sEgP
+siegert sEgPt
+sieges sEj@z
+siegfried sEgfrEd
+siegle sEg@l
+siegler sEglP
+siegman sEgm~
+siegmann sEgm~
+siegmund sEgm~d
+siegrist sEgrist
+sieh sE
+sieja sA@
+sieja sAj@
+siek sEk
+siekierski s/kirsk/
+siekman sEkm~
+sielaff s/laf
+sieler sElP
+sieling sEl6N
+sieloff sEl{f
+sielski sElsk/
+siem sEm
+siemel sEm@l
+siemens sEm~z
+siemens's sEm~z
+siemens's sEm~z@z
+siemer sEmP
+siemers sEmPz
+sieminski s/minsk/
+siemon sEm~
+siems sEmz
+siemsen sEms~
+sienko s/eNk]
+sienna s/en@
+sienna's s/en@z
+sieracki s6rotsk/
+sierchio sErC/]
+sierra s/,r@
+sierra's s/,r@z
+sierracin s/,r@sin
+sierras s/,r@z
+siers sErz
+sies sEz
+siese s/es
+siess sEs
+sietsema s/tsEm@
+sieve siv
+siever sEvP
+sievers sEvPz
+sievert sEvPt
+sieves sivz
+sieving siv6N
+siew sU
+siewert sEwPt
+siewiorek s@w{r6k
+sifco sifk]
+sifers sIfPz
+sifford sifPd
+sift sift
+sifted sift@d
+sifting sift6N
+sifts sifts
+sifuentes s/fwentcs
+sig sig
+sigafoos sig@fUz
+sigal sIj@l
+sigala s/gol@
+sigel sig@l
+sigfreda s/gfred@
+sigg sig
+siggers sigPz
+siggins siginz
+sigh sI
+sighed sId
+sighing sI6N
+sighs sIz
+sight sIt
+sight-seer sItsEr
+sighted sIt@d
+sighting sIt6N
+sightings sIt6Nz
+sights sIts
+sightsee sItsE
+sightseeing sItsE6N
+sightseer sItsEP
+sightseer sItsEr
+sightseers sItsEPz
+sightseers sItsErz
+sigl sig@l
+sigle sIg@l
+sigler sIg@lP
+sigler siglP
+sigley sigl/
+siglin siglin
+sigma sigm@
+sigmaform sigm@f{rm
+sigman sigm~
+sigmon sigm~
+sigmund sigm~d
+sign sIn
+sign's sInz
+signa sign@
+signage sIn6j
+signal sign@l
+signal's sign@lz
+signaled sign@ld
+signaling sign@l6N
+signalled sign@ld
+signalling sign@l6N
+signals sign@lz
+signatories sign@t{r/z
+signatory sign@t{r/
+signature sign@CP
+signatures sign@CPz
+signed sInd
+signer sInP
+signers sInPz
+signet signct
+significance s6gnif6k~s
+significant s6gnif6k~t
+significantly s6gnif6k~tl/
+signified sign@fId
+signifies sign@fIz
+signify sign@fI
+signifying sign@fI6N
+signing sIn6N
+signings sIn6Nz
+signor sEny{r
+signore s/ny{rA
+signorelli s/gn{rel/
+signori s/ny{rE
+signori s6gn{r/
+signpost sInpOst
+signposts sInpOs
+signposts sInpOss
+signposts sInpOsts
+signs sInz
+sigoloff sig@l{f
+sigourney s6g{rn/
+sigrid sigr@d
+sigrist sigrist
+sigur sigP
+sigurd sigPd
+sigurdson sigPds~
+sigwald sigw@ld
+sihanouk sE~qk
+sikes sIks
+sikh sEk
+sikhs sEks
+sikkema s6kEm@
+sikora s6k{r@
+sikorski s6k{rsk/
+sikorsky s6k{rsk/
+sil sil
+silajdzic siloj6k
+silajdzic's siloj6ks
+silas sIl@s
+silbaugh silb{
+silber silbP
+silberberg silbPbPg
+silberg silbPg
+silbergeld silbPgeld
+silberman silbPm~
+silbernagel silbPn@g@l
+silberner silbVnP
+silberner's silbVnPz
+silberstein silbPstEn
+silberstein silbPstIn
+silbert silbPt
+silcott silk@t
+silcox silkoks
+silence sIl~s
+silenced sIl~st
+silences sIl~s@z
+silencing sIl~s6N
+silent sIl~t
+silently sIl~tl/
+sileo sil/]
+siler sIlP
+silesia s@lEz@
+silex sIlcks
+silex sil@ks
+silfies silf/z
+silga silg@
+silguero s/lg,r]
+silhouette sil@wet
+silhouetted sil@wet@d
+silhouettes sil@wets
+silica sil6k@
+silicate sil@k@t
+silicate sil@kAt
+silicates sil@k@ts
+silicates sil@kAts
+silicon sil@k~
+silicone sil@kOn
+silicones sil@kOnz
+siliconix sil6kon6ks
+silk silk
+silkey silk/
+silks silks
+silkwood silkwqd
+silkworm silkwPm
+silkworms silkwVmz
+silky silk/
+sill sil
+siller silP
+sillerman silPm~
+sillier sil/P
+silliest sil/@st
+silliman sil}~
+silliness sil/n@s
+sillman silm~
+sills silz
+silly sil/
+silman silm~
+silmon s/lm{n
+silo sIl]
+silos sIlOz
+silsby silsb/
+silt silt
+siltec siltek
+silva selv@
+silva silv@
+silva's silv@z
+silvadio silvod/]
+silvadio's silvod/]z
+silvana silvon@
+silvar silvor
+silvas silv@z
+silveira s/lv,r@
+silver silvP
+silver's silvPz
+silvera s/lv,r@
+silverado silvPod]
+silverberg silvPbPg
+silvercrest silvPkrest
+silverdome silvPdOm
+silveri s/lv,r/
+silveria s/lv,r/@
+silverio s/lv,r/]
+silverlake silvPlAk
+silverman silvPman
+silvernail silvPnAl
+silverplate silvPplAt
+silvers silvPz
+silvershoe silvPSU
+silverside silvPsId
+silversides silvPsIdz
+silverstein silvPstEn
+silverstein silvPstIn
+silverstone silvPstOn
+silverthorn silvPT{rn
+silverthorne silvPT{rn
+silverware silvPwer
+silvery silvP/
+silvester silvestP
+silvestre s/lvAstrA
+silvestri s/lvestr/
+silvestro s/lvAstr]
+silvey silv/
+silvi silv/
+silvia silv/@
+silvie silv/
+silvio silv/]
+silvis silvis
+silvius silv/@s
+sim sim
+sima sEm@
+simard simPd
+simas sIm@z
+simba simb@
+simba's simb@z
+simcha simh@
+simco simk]
+simcoe simkO
+simcox simkoks
+sime sIm
+simek sim6k
+simenson sim~s~
+simental siment@l
+simeon sim/~
+simeone sim/un
+simer sImP
+simerly sImPl/
+simerson simPs~
+simes sImz
+simex sImcks
+simex simcks
+simi sEm/
+simian sim/~
+simich sim6C
+simien sim/n
+similack sim@lak
+similar sim@lP
+similarities sim@l,r@t/z
+similarity sim@l,r@t/
+similarly sim@lPl/
+similiar similP
+simington sim6Nt~
+siminski siminsk/
+simion sim/on
+simione sEm/On/
+simison sim@s~
+simkin simkin
+simkins simkinz
+simko simk]
+simler sim@lP
+simm sim
+simmer simP
+simmered simPd
+simmering simP6N
+simmerman simPm~
+simmers simPz
+simmert simPt
+simmon sim~
+simmon's sim~z
+simmonds sim~dz
+simmons sim~z
+simmons' sim~z
+simmons's sim~z@z
+simms simz
+simo sEm]
+simoes sIm]z
+simon sIm~
+simon's sIm~z
+simona simOn@
+simonds sIm~dz
+simone simOn
+simoneau sim~]
+simoneaux sim~]
+simonelli sEm]nel/
+simonet sim~ct
+simonetta s/m~et@
+simonette sim~ct
+simonetti s/m]net/
+simoni s/mOn/
+simonian simOn/~
+simonich sim~6k
+simonin sim~in
+simonis sim~@s
+simons sIm~z
+simonsen sim~s~
+simonson sim~s~
+simonsson sIm~s~
+simonton sIm~t~
+simony sIm~/
+simper simpP
+simpkins simpkinz
+simple simp@l
+simpler simp@lP
+simplesse simples
+simplest simpl@st
+simplex simpleks
+simplicity simplis@t/
+simplification simpl@f6kAS~
+simplified simpl@fId
+simplifies simpl@fIz
+simplify simpl@fI
+simplifying simpl@fI6N
+simplistic simplist6k
+simplot simplot
+simply simpl/
+simpson simps~
+simpson's simps~z
+simpsons simps~z
+simpsons' simps~z
+sims simz
+sims' simz
+simsbury simzber/
+simson sims~
+simulac simy@lak
+simulate simy@lAt
+simulated simy@lAt@d
+simulates simy@lAts
+simulating simy@lAt6N
+simulation simy@lAS~
+simulations simy@lAS~z
+simulator simy@lAtP
+simulators simy@lAtPz
+simulcast sImy@lkast
+simultaneous sIm@ltAn/@s
+simultaneously sIm@ltAn/@sl/
+sin sin
+sinagra s~agr@
+sinai sInI
+sinar sInP
+sinatra s~otr@
+sinatra's s~otr@z
+sinay sinA
+sinbad sinbad
+sincavage s/nkov6j
+since sins
+sincere sinsir
+sincerely sinsirl/
+sincerity sins,r@t/
+sinclair sinkl,r
+sind sind
+sindelar sind@lP
+sindlinger sindliNP
+sindona sindOn@
+sindoni s/ndOn/
+sindt sint
+sine sIn
+sinead Sin/d
+sinead sinAad
+sineath sincT
+sinegal sin6g@l
+siner sInP
+sines sInz
+sinewy sinyU/
+sinfonia sinfOn/@
+sinful sinf@l
+sing siN
+singapore siN@p{r
+singapore's siN@p{rz
+singaporean s6Ng@p{r/~
+singaporeans s6Ng@p{r/~z
+singe sinj
+singed sinjd
+singel siNg@l
+singer siNP
+singer's siNPz
+singerman sinjVm~
+singers siNPz
+singh siN
+singh's siNz
+singin' siN~
+singing siN6N
+singlaub siNl?b
+single siNg@l
+single-handed siNg@lhand@d
+singled siNg@ld
+singlehandedly siNg@lhand@dl/
+singler siNg@lP
+singler siNglP
+singles siNg@lz
+singletary siNg@ltcr/
+singleterry siNg@ltcr/
+singleton siNg@lt~
+singleton's siNg@lt~z
+singley siNgl/
+singling siNg@l6N
+singling siNgl6N
+singly siNgl/
+sings siNz
+singular siNgy@lP
+singularization siNgy@lP@zAS~
+singularly siNgy@lPl/
+sinha sinh@
+sinhalese sin@lEz
+siniard sin/Pd
+sinibaldi sin@bold/
+siniscalchi sin@skolk/
+sinise sinEz
+sinisi sinEs/
+sinister sin@stP
+sink siNk
+sinker siNkP
+sinkfield siNkfEld
+sinkhole siNkhOl
+sinkhorn siNkhPn
+sinking siNk6N
+sinkler siNklP
+sinko siNk]
+sinks siNks
+sinn sin
+sinned sind
+sinner sinP
+sinners sinPz
+sinnett sinct
+sinning sin6N
+sinnott sin@t
+sino sIn]
+sinopec sIn]pek
+sinopoli s/n]pOl/
+sinopoli s/nop]l/
+sinor sInP
+sinquefield sinkw@f/ld
+sins sinz
+sinsabaugh sins@b{
+sinsel sins@l
+sinton sint~
+sinuous sinw@s
+sinus sIn@s
+sinuses sIn@s@z
+sinyard sinyord
+siobhan S?bon
+sioux sU
+sip sip
+sipe sIp
+sipelstein sip@lst/n
+sipelstein sip@lstIn
+sipes sIps
+siphon sIf~
+siphoned sIf~d
+siphoning sIf~6N
+siphons sIf~z
+siple sIp@l
+sipos sIp]z
+sipp sip
+sipped sipt
+sippel sip@l
+sippican sip6k~
+sipping sip6N
+sipple sip@l
+sips sips
+sir sV
+siracusa s6rokUs@
+siracuse s6rokUs/
+siragusa s6rogUs@
+siravo s6rov]
+sircy sVk/
+sire sIP
+sirek s{r6k
+siren sIr~
+sirena s6ren@
+sirens sIr~z
+sires sIrz
+sirhan sirhan
+sirhan sirhon
+siri sir/
+sirianni s6r/on/
+sirignano sir/nyon]
+siris sIris
+siris siris
+sirk sVk
+sirkin sVkin
+sirko sVk]
+sirles sVlz
+sirman sVm~
+sirmans sVm~z
+sirmon sVm~
+sirmons sVm~z
+sirna sVn@
+sirohi sPOh/
+sirois sIrwo
+siroky sir@k/
+siron s{r~
+sirota s6rOt@
+sirowitz sir@wits
+sirri sir/
+sirrine s6rEn/
+sis sis
+sisco sEsk]
+siscoe sisk]
+sisemore sIzm{r
+sisk sisk
+siska sEsk@
+siskel sisk@l
+siskel's sisk@lz
+siskin siskin
+siskind siskind
+sisko sisk]
+sisler sis@lP
+sisley sizl/
+sisneros sisnP]z
+sisney sizn/
+sison sis~
+sissel sis@l
+sissie sis/
+sissom sis}
+sisson sis~
+sissy sis/
+sistare s/st)r/
+sistek sist6k
+sister sistP
+sister's sistPz
+sisterhood sistPhqd
+sisters sistPz
+sisti sist/
+sistine sistEn
+sisto sist]
+sistrunk sistr@Nk
+sisulu sisUlU
+sit sit
+sitar sitP
+sitcom sitkom
+sitcoms sitkomz
+site sIt
+site's sIts
+sited sIt@d
+sitek sitck
+sites sIts
+sithe sIT
+siting sIt6N
+sitiveni sEt6vEn/
+sitka sitk@
+sitko sitk]
+sitler sIt@lP
+sitler sitlP
+sitmar sitmor
+sito sEt]
+sito's sEt]z
+sitrick sitr6k
+sits sits
+sitter sitP
+sitterly sitPl/
+sitters sitPz
+sittig sit6g
+sittin' sit~
+sitting sit6N
+sittler sitlP
+sittner sitnP
+sitton sit~
+sitts sits
+situate siCUAt
+situated siCUAt@d
+situation siCUAS~
+situation's siCUAS~z
+situational siCUAS~@l
+situations siCUAS~z
+situs sIt@s
+sitz sits
+sitze sitz
+sitzer sitzP
+sitzes sits@z
+sitzman sitsm~
+sitzmann sitsm~
+siu sEU
+siuda s/Ud@
+sivak siv@k
+siver sIvP
+siverling sivPl6N
+siverson sivPs~
+sivertsen sivPts~
+sivertson sivPts~
+sivils siv@lz
+sivley sivl/
+sivy siv/
+siwek siw6k
+six siks
+six's siks@z
+sixed sikst
+sixes siks@z
+sixfold siksfOld
+sixteen s6kstEn
+sixteen sikstEn
+sixteen's sikstEnz
+sixteens sikstEnz
+sixteenth s6kstEnT
+sixteenth sikstEnT
+sixteenths sikstEnTs
+sixth siksT
+sixths siksTs
+sixties sikst/z
+sixtieth sikst/@T
+sixty sikst/
+sixty's sikst/z
+sizable sIz@b@l
+size sIz
+sizeable sIz@b@l
+sized sIzd
+sizeler sIzlP
+sizelove sIzluv
+sizemore sIzm{r
+sizer sIzP
+sizes sIz@z
+sizing sIz6N
+sizzle siz@l
+sizzled siz@ld
+sizzler sizlP
+sizzlin sizlin
+sizzling siz@l6N
+sizzling sizl6N
+sjoberg SObPg
+sjoblom SOblom
+sjodin SOdin
+sjogren SOgr~
+sjolander SOlandP
+sjoquist SOkwist
+sjostrom SOstr}
+skaar sk)r
+skadden skadin
+skaff skaf
+skaggs skagz
+skains skAnz
+skala skol@
+skalicky sk@lik/
+skalla skal@
+skalski skolsk/
+skalsky skolsk/
+skandia skand/@
+skandia skandy@
+skandinaviska skand~@vis@
+skanska skansk@
+skarda sk)rd@
+skare sk,r
+skase skAz
+skate skAt
+skateboard skAtb{rd
+skateboarding skAtb{rd6N
+skated skAt@d
+skater skAtP
+skaters skAtPz
+skates skAts
+skating skAt6N
+skeat skEt
+skeel skEl
+skeels skElz
+skeen skEn
+skeens skEnz
+skees skEz
+skeet skEt
+skeete skEt
+skeeter skEtP
+skeeters skEtPz
+skeets skEts
+skeffington skef6Nt~
+skehan skA~
+skeletal skel@t@l
+skeleton skel@t~
+skeletons skel@t~z
+skellenger skel~jP
+skelley skel/
+skelly skel/
+skelter skeltP
+skelton skelt~
+skenandore sk~andP
+skender skendP
+skenderian skend,r/~
+skene skEn
+skeoch skEoC
+skeptic skept6k
+skeptical skept@k@l
+skeptically skept6k@l/
+skeptically skept6kl/
+skepticism skept@siz}
+skeptics skept6ks
+skerdal sk,rdol
+skerry sk,r/
+sketch skeC
+sketchbook skeCbqk
+sketchbooks skeCbqks
+sketched skeCt
+sketches skeC@z
+sketching skeC6N
+sketchy skeC/
+skew skyU
+skewed skyUd
+skewer skyUP
+skewered skyUPd
+skewers skyUPz
+skewes skyUz
+skewing skyU6N
+skews skyUz
+ski skE
+skiba skIb@
+skibbe skib
+skibicki sk@bik/
+skibinski sk@binsk/
+skibo skEb]
+skibo skIb]
+skid skid
+skidded skid@d
+skidding skid6N
+skidgel skij@l
+skidmore skidm{r
+skids skidz
+skied skEd
+skier skEP
+skiers skEPz
+skies skIz
+skiff skif
+skiffington skif6Nt~
+skiffs skifs
+skiing skE6N
+skiles skIlz
+skill skil
+skilled skild
+skillen skil~
+skillern skilPn
+skillet skil@t
+skillful skilf@l
+skillfully skilf@l/
+skillin skilin
+skilling skil6N
+skillings skil6Nz
+skillman skilm~
+skills skilz
+skilton skilt~
+skim skim
+skimmed skimd
+skimmer skimP
+skimmers skimPz
+skimming skim6N
+skimp skimp
+skimpier skimp/P
+skimpiest skimp/@st
+skimping skimp6N
+skimpy skimp/
+skin skin
+skin's skinz
+skinhead skinhed
+skinheads skinhedz
+skinks skiNks
+skinless skinl@s
+skinned skind
+skinner skinP
+skinner's skinPz
+skinnier skin/P
+skinniest skin/@st
+skinny skin/
+skins skinz
+skins' skinz
+skip skip
+skipjack skipjak
+skipjack's skipjaks
+skipjacks skipjaks
+skipp skip
+skippa skip@
+skippa's skip@z
+skipped skipt
+skipper skipP
+skipper's skipPz
+skippers skipPz
+skipping skip6N
+skippy skip/
+skips skips
+skipton skipt~
+skipwith skipwiT
+skipworth skipwVT
+skirdall skVdol
+skirmish skVm6S
+skirmishes skVm6S@z
+skirmishing skVm6S6N
+skirt skVt
+skirted skVt@d
+skirting skVt6N
+skirts skVts
+skirvin skVvin
+skis skEz
+skit skit
+skits skits
+skittish skit6S
+skittishness skit6Sn@s
+skittle skit@l
+skittles skit@lz
+skiver skIvP
+sklar skl)r
+sklenar sklenP
+skoal skOl
+skoczylas sk@Cil@z
+skoda skOd@
+skoff sk{f
+skog skog
+skogen skog~
+skoglund skogl~d
+skok skok
+skokie skOk/
+skoler skOlP
+skolnick skOln6k
+skolnik skOln6k
+skolniks skOln6ks
+skonieczny sk~ECn/
+skoog skUg
+skop skop
+skora sk{r@
+skorupa skPUp@
+skorupski skPupsk/
+skousen skUs~
+skov skov
+skow sk?
+skowhegan skOhEg~
+skowron sk?r~
+skowronek sk?rOnck
+skowronski sk?ronsk/
+skramstad skramstad
+skroch skrok
+skrocki skrok/
+skrzypek skPzipck
+skufca skufk@
+skulk skulk
+skull skul
+skulls skulz
+skunk skuNk
+skunks skuNks
+skura skqr@
+skurdal skVd@l
+skurka skVk@
+skutt skut
+sky skI
+sky's skIz
+skybox skIboks
+skyboxes skIboks@z
+skycap skIkap
+skydive skIdIv
+skydiving skIdIv6N
+skydome skIdOm
+skyhawk skIh{k
+skyhigh skIhI
+skylark skIlork
+skylawn skIl{n
+skyles skIlz
+skylight skIlIt
+skylights skIlIts
+skyline skIlIn
+skylite skIlIt
+skyrocket skIrok@t
+skyrocketed skIrok@t@d
+skyrocketing skIrok@t6N
+skyscraper skIskrApP
+skyscrapers skIskrApPz
+skytel skItel
+skyward skIwPd
+skywave skIwAv
+skyway skIwA
+skywest skIwest
+skywriter skIrItP
+skywriters skIrItPz
+skywriting skIrIt6N
+slab slab
+slabaugh slab{
+slabs slabz
+slaby slAb/
+slack slak
+slacked slakt
+slacken slak~
+slackened slak~d
+slackening slak~6N
+slackens slak~z
+slacker slakP
+slackers slakPz
+slackness slakn@s
+slacks slaks
+slade slAd
+sladek slad6k
+sladky sladk/
+slag slag
+slagel slag@l
+slager slAgP
+slaght slat
+slagle slAg@l
+slagter slagtP
+slain slAn
+slaine slAn
+slalom slol}
+slam slam
+slama slom@
+slammed slamd
+slammer slamP
+slamming slam6N
+slams slamz
+slander slandP
+slandered slandPd
+slanderous slandP@s
+slane slAn
+slaney slAn/
+slang slaN
+slanina slonEn@
+slankard slaNkPd
+slant slant
+slanted slan@d
+slanted slant@d
+slanting slant6N
+slap slap
+slapdash slapdaS
+slape slAp
+slapped slapt
+slappey slap/
+slapping slap6N
+slaps slaps
+slapstick slapstik
+slash slaS
+slashed slaSt
+slasher slaSP
+slashes slaS@z
+slashing slaS6N
+slat slat
+slate slAt
+slated slAt@d
+slaten slAt~
+slater slAtP
+slates slAts
+slatkin slatkin
+slaton slat~
+slats slats
+slatten slat~
+slatter slatP
+slattery slatP/
+slatton slat~
+slaugh sl{
+slaughter sl{tP
+slaughtered sl{tPd
+slaughterhouse sl{tPh?s
+slaughterhouses sl{tPh?s@z
+slaughtering sl{tP6N
+slaughterings sl{tP6Nz
+slaughters sl{tPz
+slauson sl?z~
+slav slov
+slave slAv
+slaven slAv~
+slavens slAv~z
+slavery slAvP/
+slaves slAvz
+slavic slov6k
+slavick slav6k
+slavik slov6k
+slavin slavin
+slavinski sl@vinsk/
+slavish slAv6S
+slavishly slav6Sl/
+slavonia sl@vOn/@
+slavonia sl@vOny@
+slavs slovz
+slaw sl{
+slawinski slovinsk/
+slawson sl{s~
+slay slA
+slayback slAbak
+slaybaugh slAb{
+slayden slAd~
+slaydon slAd~
+slayer slAP
+slaying slA6N
+slayings slA6Nz
+slaymaker slAmAkP
+slayter slAtP
+slayton slAt~
+sleasman slEzm~
+sleator slAtP
+sleaze slEz
+sleazy slEz/
+slechta sleCt@
+sled sled
+sledd sled
+sledding sled6N
+sledge slej
+sledgehammer slejhamP
+sleds sledz
+sledz sledz
+slee slE
+sleek slEk
+sleeker slEkP
+sleekest slEk@st
+sleekly slEkl/
+sleeman slEm~
+sleep slEp
+sleeper slEpP
+sleepers slEpPz
+sleepily slEp@l/
+sleepiness slEp/n@s
+sleeping slEp6N
+sleepless slEpl@s
+sleeps slEps
+sleepwalk slEpw{k
+sleepwalker slEpw{kP
+sleepwalkers slEpw{kPz
+sleepwalking slEpw{k6N
+sleepwear slEpwer
+sleepy slEp/
+sleet slEt
+sleeter slEtP
+sleeth slET
+sleeve slEv
+sleeved slEvd
+sleeveless slEvl@s
+sleeves slEvz
+sleigh slA
+sleight slIt
+sleipner slIpnP
+slemmer slemP
+slemp slemp
+slender slendP
+slentz slents
+slepian slEp/~
+slepian slEpy~
+slept slept
+slessenger slescngP
+sletten slet~
+sleuth slUT
+sleuthing slUT6N
+sleuths slUTs
+sleven slEv~
+slevin slevin
+slew slU
+slezak slez@k
+slice slIs
+sliced slIst
+slicer slIsP
+slices slIs@z
+slicing slIs6N
+slick slik
+slicked slikt
+slicker slikP
+slickers slikPz
+slickest slik@st
+slickly slikl/
+slicks sliks
+slid slid
+slide slId
+slider slIdP
+slides slIdz
+sliding slId6N
+slife slIf
+slifer slIfP
+slifka slifk@
+slifko slifk]
+sligar sligP
+sliger slIgP
+sligh slI
+slight slIt
+slighted slIt@d
+slightest slIt@st
+slighting slIt6N
+slightly slItl/
+slights slIts
+sliker slIkP
+slim slim
+slimak slim@k
+slime slIm
+slimmed slimd
+slimmer slimP
+slimmest slim@st
+slimming slim6N
+slimp slimp
+slims slimz
+slimy slIm/
+sliney slin/
+sling sliN
+slinger sliNP
+slingerland sliNgPl~d
+slinging sliN6N
+slings sliNz
+slingshot sliNSot
+slingshots sliNSots
+slinkard sliNkPd
+slinker sliNkP
+slinky sliNk/
+slip slip
+slip-on slipon
+slip-ons sliponz
+slippage slip6j
+slipped slipt
+slipper slipP
+slippers slipPz
+slippery slipP/
+slippery slipr/
+slipping slip6N
+slips slips
+slipshod slipSod
+slit slit
+sliter slEtP
+slither sliTP
+slithering sliTP6N
+slits slits
+slitting slit6N
+sliva slEv@
+sliver slivP
+slivers slivPz
+slivinski sl6vinsk/
+slivka slivk@
+slivovitz sliv@vits
+sliwa slIv@
+sliwinski sl6vinsk/
+sloan slOn
+sloan's slOnz
+sloane slOn
+sloat slOt
+sloate slOt
+slob slob
+slobber slobP
+slobbering slobP6N
+sloboda sl@bOd@
+slobodan slOb]don
+slobogin sl@bOg~
+slobogin's sl@bOg~z
+slobs slobz
+slocan slOk~
+slocan's slOk~z
+slocomb slOk}
+slocum slOk}
+slocumb slOk}
+sloe slO
+slog slog
+slogan slOg~
+slogans slOg~z
+slogged slogd
+slogging slog6N
+slokum slOk}
+sloma slOm@
+sloman slOm~
+slominski sl}insk/
+slomski slomsk/
+slonaker slon@kP
+slone slOn
+sloniker slon6kP
+sloop slUp
+slop slop
+slope slOp
+sloper slOpP
+slopes slOps
+sloping slOp6N
+sloppier slop/P
+sloppiest slop/@st
+sloppily slop@l/
+sloppiness slop/n@s
+sloppy slop/
+slorc sl{rk
+slosh sloS
+sloshing sloS6N
+sloss sl{s
+slot slot
+slota slOt@
+sloth slOT
+slothower sloT]P
+slotnick slotn6k
+slots slots
+slott slot
+slotted slot@d
+slotting slot6N
+slouch sl?C
+slouches sl?C@z
+slouching sl?C6N
+slough sluf
+sloughs slufs
+slovacek slov@Cck
+slovak slOvak
+slovak slOvok
+slovakia slOvok/@
+slovakia's sl]vak/@z
+slovakia's sl]vok/@z
+slovaks slOvaks
+slovaks slOvoks
+slovene slOvEn
+slovenes slOvEnz
+slovenia slOvEn/@
+slovenian slOvEn/~
+slovenliness sluv~l/n@s
+slovenly sluv~l/
+slover slOvP
+sloves slOvz
+slovo slOv]
+slovonia sl@vOn/@
+slovonia sl@vOny@
+slow slO
+slowdown slOd?n
+slowdowns slOd?nz
+slowed slOd
+slower slOP
+slowest slO@st
+slowey slO/
+slowik slO6k
+slowing slO6N
+slowinski sl]insk/
+slowly slOl/
+slowness slOn@s
+slowpoke slOpOk
+slows slOz
+sluder slUdP
+sludge sluj
+sludgy sluj/
+slug slug
+sluga slUg@
+slugfest slugfest
+slugged slugd
+slugger slugP
+sluggers slugPz
+slugging slug6N
+sluggish slug6S
+sluggishly slug6Sl/
+sluggishness slug6Sn@s
+slugs slugz
+sluice slUs
+sluicing slUs6N
+sluiter slUtP
+sluka slUk@
+slum slum
+slumber slumbP
+slumbering slumbP6N
+slump slump
+slumped slumpt
+slumping slump6N
+slumps slumps
+slums slumz
+slung sluN
+slur slV
+slurp slVp
+slurred slVd
+slurring slV6N
+slurry slV/
+slurs slVz
+slush sluS
+slusher sluSP
+sluss slus
+slusser slusP
+slut slut
+slutsky slutsk/
+slutz sluts
+slutzky slutsk/
+sluyter slItP
+sly slI
+slye slI
+slyly slIl/
+slyness slIn@s
+slyter slItP
+smaby smAb/
+smack smak
+smacked smakt
+smacking smak6N
+smacks smaks
+smail smAl
+smaldone smald~
+smale smAl
+small sm{l
+smallcap sm{lkap
+smallen sm{l~
+smaller sm{lP
+smallest sm{l@st
+smalley smol/
+smalling sm{l6N
+smallish sm{l6S
+smallman sm{lm~
+smallness sm{ln@s
+smallpox sm{lpoks
+smallridge sm{lrij
+smalls sm{lz
+smalltalk sm{lt{k
+smalltown sm{lt?n
+smallwood sm{lwqd
+smaltz smalts
+smarmy sm)rm/
+smarr smar
+smart sm)rt
+smartcard sm)rtkord
+smarter sm)rtP
+smartest sm)rt@st
+smarting sm)rt6N
+smartly sm)rtl/
+smartmoney sm)rtmun/
+smarts sm)rts
+smartt sm)rt
+smash smaS
+smashed smaSt
+smasher smaSP
+smashes smaS@z
+smashing smaS6N
+smather smaTP
+smathers smaTPz
+smatter smatP
+smattering smatP6N
+smay smA
+smead smEd
+smeal smEl
+smear smir
+smeared smird
+smearing smir6N
+smears smirz
+smeby smEb/
+smedberg smedbPg
+smedley smedl/
+smee smE
+smeeting smEt6N
+smejkal smejk@l
+smelcer smelsP
+smell smel
+smelled smeld
+smelley smel/
+smelling smel6N
+smells smelz
+smelly smel/
+smelser smelsP
+smelt smelt
+smelter smeltP
+smelter's smeltPz
+smelters smeltPz
+smelting smelt6N
+smeltz smelts
+smeltzer smeltzP
+smestad smest@d
+smet smet
+smetana smet~@
+smethers smeTPz
+smethurst smeTPst
+smetzer smetzP
+smick smik
+smid smid
+smiddy smid/
+smidgen smij~
+smidt smidt
+smigel smij@l
+smigelski sm6gelsk/
+smigiel smij/l
+smigielski sm6gElsk/
+smile smIl
+smiled smIld
+smiles smIlz
+smiley smIl/
+smilgis smilgiz
+smilgis smiljiz
+smilie smil/
+smiling smIl6N
+smilingly smIl6Nl/
+smillie smil/
+smilow smil]
+smink smiNk
+smirk smVk
+smirking smVk6N
+smirks smVks
+smirnoff smVn{f
+smirnov smVnof
+smirnova smVnOv@
+smisek smisck
+smit smit
+smith smiT
+smith's smiTs
+smithburg smiTbPg
+smithee smiTE
+smither smiTP
+smithereen smiTPEn
+smithereens smiTPEnz
+smitherman smiTPm~
+smithers smiTPz
+smithey smiT/
+smithfield smiTf/ld
+smithhart smiThort
+smithkline smiTklIn
+smithkline's smiTklInz
+smiths smiTs
+smithson smiTs~
+smithson's smiTs~z
+smithsonian smiTsOn/~
+smithsonian smisOn/~
+smithsonian's smiTsOn/~z
+smithsonian's smisOn/~z
+smithtown smiTt?n
+smithwick smiTwik
+smitley smitl/
+smits smits
+smitten smit~
+smittle smit@l
+smitty smit/
+smoak smOk
+smock smok
+smog smog
+smoggiest smog/@st
+smoggy sm{g/
+smoke smOk
+smoked smOkt
+smokejumper smOkjumpP
+smokejumpers smOkjumpPz
+smokeless smOkl@s
+smoker smOkP
+smoker's smOkPz
+smokers smOkPz
+smokers' smOkPz
+smokes smOks
+smokescreen smOkskrEn
+smokestack smOkstak
+smokestacks smOkstaks
+smokey smOk/
+smoking smOk6N
+smoking's smOk6Nz
+smoky smOk/
+smola smOl@
+smolak smOl@k
+smolder smOldP
+smoldering smOldP6N
+smolen smol~
+smolensk sm]lensk
+smolenski sm@lensk/
+smoley smOl/
+smolik smOl6k
+smolin smOlin
+smolinski sm@linsk/
+smolinsky sm@linsk/
+smolka smOlk@
+smoot smUt
+smooth smUT
+smoothed smUTd
+smoothen smUT~
+smoothens smUT~z
+smoother smUTP
+smoothest smUT@st
+smoothing smUT6N
+smoothly smUTl/
+smoothness smUTn@s
+smooths smUTz
+smoots smUts
+smorgasbord sm{rg@sb{rd
+smother smuTP
+smothered smuTPd
+smothering smuTP6N
+smotherman smuTPm~
+smothermon smoTPm]n
+smothers smuTPz
+smotrich smotr6k
+smouse sm?s
+smoyer sm<P
+smrekar smPekP
+smuck smuk
+smucker smukP
+smudge smuj
+smudged smujd
+smug smug
+smuggle smug@l
+smuggled smug@ld
+smuggler smug@lP
+smuggler smuglP
+smuggler's smuglPz
+smugglers smug@lPz
+smugglers smuglPz
+smugglers' smug@lPz
+smugglers' smuglPz
+smuggling smug@l6N
+smuggling smugl6N
+smugly smugl/
+smugness smugn@s
+smull smul
+smullen smul~
+smurf smVf
+smurfit smVfit
+smurfs smVfs
+smut smut
+smyers smIPz
+smylie smil/
+smyly smil/
+smyre smIr
+smyrna smVn@
+smyser smIsP
+smyth smIT
+smyth smiT
+smythe smIT
+snack snak
+snacks snaks
+snackwell snakwel
+snackwell's snakwelz
+snackwells snakwelz
+snader snAdP
+snafu snafU
+snafus snaf@s
+snag snag
+snagged snagd
+snagger snagP
+snaggers snagPz
+snagging snag6N
+snags snagz
+snail snAl
+snail's snAlz
+snails snAlz
+snake snAk
+snake's snAks
+snakebite snAkbIt
+snakebites snAkbIts
+snakelike snAklIk
+snakes snAks
+snaking snAk6N
+snap snap
+snapdragon snapdrag~
+snapdragons snapdrag~z
+snape snAp
+snapp snap
+snapped snapt
+snapper snapP
+snapping snap6N
+snapple snap@l
+snapple's snap@lz
+snapples snap@lz
+snappy snap/
+snaps snaps
+snapshot snapSot
+snapshots snapSots
+snare sn,r
+snared sn,rd
+snares sn,rz
+snaring sn,r6N
+snarl sn)rl
+snarled sn)r@ld
+snarling sn)rl6N
+snarls sn)rlz
+snarr snar
+snarski sn)rsk/
+snatch snaC
+snatched snaCt
+snatcher snaCP
+snatchers snaCPz
+snatches snaC@z
+snatching snaC6N
+snavely snAvl/
+snay snA
+snazzier snaz/P
+snazzy snaz/
+snead snEd
+sneak snEk
+sneaked snEkt
+sneaker snEkP
+sneakers snEkPz
+sneaking snEk6N
+sneaks snEks
+sneaky snEk/
+sneary snir/
+sneath sneT
+snecma snekmo
+snedaker sned@kP
+snedden sned~
+sneddon sned~
+snedegar sned6gP
+snedeker sned6kP
+snee snE
+sneed snEd
+sneer snir
+sneered snird
+sneering snir6N
+sneeringer snir~jP
+sneers snirz
+sneeze snEz
+sneezed snEzd
+sneezes snEz@z
+sneezing snEz6N
+sneh sne
+sneider snIdP
+snelgrove snelgrOv
+snell snel
+snellen snel~
+snellenberger snel~bPgP
+sneller snelP
+snellgrove snelgrOv
+snelling snel6N
+snellings snel6Nz
+snelson snels~
+snethen sneT~
+snia snE@
+snicker snikP
+snickered snikPd
+snickering snikP6N
+snickers snikPz
+snide snId
+snider snIdP
+snidow snid]
+sniegowski sn/g{fsk/
+sniff snif
+sniffed snift
+sniffen snif~
+sniffer snifP
+sniffing snif6N
+sniffs snifs
+sniffy snif/
+snip snip
+snipe snIp
+sniped snIpt
+sniper snIpP
+sniper's snIpPz
+snipers snIpPz
+snipers' snIpPz
+snipes snIps
+sniping snIp6N
+snippet snip@t
+snippets snip@ts
+snips snips
+snitch sniC
+snitching sniC6N
+snitker snitkP
+snitzer snitzP
+snively snIvl/
+snob snob
+snobbery snobP/
+snobbish snob6S
+snobby snob/
+snobs snobz
+snodderly snodPl/
+snoddy snod/
+snodgrass snodgras
+snohomish snoh}6S
+snoke snOk
+snook snqk
+snooker snqkP
+snookered snqkPd
+snooks snqks
+snoop snUp
+snooping snUp6N
+snoopy snUp/
+snooty snUt/
+snooze snUz
+snoozing snUz6N
+snore sn{r
+snoring sn{r6N
+snort sn{rt
+snorted sn{rt@d
+snorting sn{rt6N
+snorts sn{rts
+snot sn{t
+snouffer snOfP
+snout sn?t
+snover snOvP
+snow snO
+snowball snOb{l
+snowball's snOb{lz
+snowballed snOb{ld
+snowballing snOb{l6N
+snowballs snOb{lz
+snowberger snObPgP
+snowbird snObVd
+snowbirds snObVdz
+snowboard snOb{rd
+snowboarder snOb{rdP
+snowboarders snOb{rdPz
+snowboards snOb{rdz
+snowbound snOb?nd
+snowden snOd~
+snowdon snOd~
+snowe snO
+snowed snOd
+snowfall snOfol
+snowfalls snOfolz
+snowflake snOflAk
+snowflakes snOflAks
+snowing snO6N
+snowman snOman
+snowmobile snOm]bEl
+snowmobiles snOm]bElz
+snowplow snOpl?
+snowplows snOpl?z
+snows snOz
+snowshoe snOSU
+snowstorm snOst{rm
+snowstorms snOst{rmz
+snowy snO/
+snub snub
+snubbed snubd
+snubbing snub6N
+snuck snuk
+snuff snuf
+snuffed snuft
+snuffer snufP
+snuffing snuf6N
+snuffs snufs
+snug snug
+snugging snug6N
+snuggle snug@l
+snuggs snugz
+snugly snugl/
+snyder snIdP
+snyder's snIdPz
+snydergeneral snIdPjenP@l
+so sO
+so's sOz
+so-called sOk{ld
+so-so sOsO
+soady sOd/
+soak sOk
+soaked sOkt
+soaking sOk6N
+soaks sOks
+soap sOp
+soapbox sOpboks
+soaps sOps
+soapy sOp/
+soar s{r
+soard s{rd
+soared s{rd
+soares s{rcs
+soaring s{r6N
+soars s{rz
+soave sOv
+sob sob
+sobbed sobd
+sobbing sob6N
+sobbingly sob6Nl/
+sobczak sobCak
+sobczyk sobC6k
+sobeck sObek
+sobecki s@betsk/
+sobek sOb6k
+sobel sOb@l
+sobelman sOb@lm~
+sober sObP
+sobered sObPd
+sobering sObP6N
+soberly sObPl/
+sobers sObPz
+sobey sOb/
+sobibor s]bEb{r
+sobibor s]bib{r
+sobiech sob/h
+sobieski sOb/esk/
+sobin sObin
+sobkowiak s@bk?/ak
+soble sOb@l
+sobocinski s@b@Cinsk/
+sobol sOb@l
+soboleski s@b@lesk/
+sobolewski s@b@lefsk/
+sobolik s@bOl6k
+sobon s]b{n
+sobota s@bOt@
+sobotka s@bOtk@
+sobotta s]bOt@
+sobriety s@brI@t/
+sobriquet sObr@kA
+sobriquet subr@ket
+sobs sobz
+socalled sOkold
+socanav sok~ov
+socarras s]k)roz
+soccer sokP
+soccer's sokPz
+socci sOC/
+socha sOC@
+sochacki s@Cak/
+sochet s]SA
+sochi sOC/
+sochor sokP
+socia sOC@
+sociable sOS@b@l
+social sOS@l
+socialism sOS@liz}
+socialist sOS@l@st
+socialistic sOS@list6k
+socialists sOS@l@s
+socialists sOS@l@ss
+socialists sOS@l@sts
+socialists' sOsE@l@sts
+socialite sOS@lIt
+socialites sOS@lIts
+socialization sOS@l@zAS~
+socialize sOS@lIz
+socialized sOS@lIzd
+socializing sOS@lIz6N
+socially sOS@l/
+sociedad sOs/dad
+societa sOs/et@
+societal s@sI@t@l
+societe sOs/ctA
+societies s@sI@t/z
+society s@sI@t/
+society's s@sI@t/z
+socio sOs/]
+socioeconomic s]sEOek~om6k
+sociological sOs/@loj6k@l
+sociologist sOs/ol@j@st
+sociologists sOs/ol@j@s
+sociologists sOs/ol@j@ss
+sociologists sOs/ol@j@sts
+sociology sOs/ol@j/
+sociopath sOs/]paT
+sock sok
+socked sokt
+socket sok@t
+sockets sok@ts
+socking sok6N
+socks soks
+sockwell sokwel
+socol sOkol
+socrates sokr@tEz
+socratic s@krat6k
+sod sod
+soda sOd@
+soda's sOd@z
+sodano s]don]
+sodaro s]d)r]
+sodas sOd@z
+sodden sod~
+sodders sodPz
+sodecom sOd@kom
+soden sOd~
+soder sOdP
+soderberg sOdPbPg
+soderbergh sOdPbPg
+soderblom sOdPblom
+sodergren sodPgrcn
+soderholm sOdPh]lm
+soderlund sodPl~d
+soderman sOdPm~
+soderquist sodPkwist
+soderstrom sodPstr}
+soditic s]dit6k
+sodium sOd/}
+sodom sod}
+sodomize sud}Iz
+sodomized sud}Izd
+sodomy sod}/
+sodus sOd@s
+soeder sOdP
+soens sOnz
+soerensen s{r~s~
+sofa sOf@
+sofaer s]fAr
+sofamor sOf}{r
+sofas sOf@z
+sofer sOfP
+sofer's sOfPz
+soffel s{f@l
+soffer s{fP
+sofia s]fE@
+sofia's s]fE@z
+sofian s]fE~
+sofians s]fE~z
+sofie sof/
+sofranko s@fraNk]
+soft soft
+softball s{fb{l
+softball s{ftb{l
+softballs s{fb{lz
+softballs s{ftb{lz
+softbank s{ftbaNk
+softdrink s{ftdriNk
+softech s{ftek
+soften s{f~
+softened s{f~d
+softener s{f~P
+softening s{fn6N
+softening s{f~6N
+softens s{f~z
+softer softP
+softest s{ft@st
+softimage s{ftim6j
+softkey softkA
+softletter s{ftletP
+softly s{fl/
+softly s{ftl/
+softness s{fn@s
+softness s{ftn@s
+softsoap s{fsOp
+softsoap s{ftsOp
+softspoken s{fspOk~
+softspoken s{ftspOk~
+software s{ftwer
+software s{fwer
+software's s{ftwerz
+software's s{fwerz
+softwood s{ftwqd
+sogang sOgaN
+soggy sog/
+sogo sOg]
+sohio s]hI]
+sohl sOl
+sohm sOm
+sohmer sOmP
+sohn son
+sohns sonz
+soho sOh]
+soifer s<fP
+soiffer s<fP
+soil s<l
+soil's s<lz
+soileau s<lO
+soiled s<ld
+soils s<lz
+soir s<r
+soiree sworA
+soisson s<zs~
+soja sOj@
+sojka s<k@
+sojourn sOjPn
+sok sok
+sokaiya s@kIy@
+sokol sOk@l
+sokolik s@kOl6k
+sokolin sok@lin
+sokoloff sok@l{f
+sokoloski s@k@l?sk/
+sokolov sok@lov
+sokolow sok@l]
+sokolow's sok@lOz
+sokolowski s@k@l{fsk/
+sol sOl
+sol sol
+sola sOl@
+solace sOl@s
+solace sol@s
+solak sOl@k
+solaman sol}~
+solan sOl~
+solana s]lan@
+soland sol~d
+solangi s]lonj/
+solano s]lon]
+solar sOlP
+solares s]l)rcs
+solari s]l)r/
+solaris s]l,ris
+solarz sOlorz
+solazzo s]loz]
+solberg sOlbPg
+solchaga s]lCog@
+sold sOld
+soldan sOld~
+soldano s]ldon]
+solder sodP
+soldering sodP6N
+soldier sOljP
+soldier's sOljPz
+soldiering sOljP6N
+soldiers sOljPz
+soldiers' sOljPz
+soldner sOldnP
+soldo sOld]
+sole sOl
+solecki s@letsk/
+soledad sOldad
+soleil s]lIl
+solely sOll/
+solem sOlcm
+solemn sol}
+solemnity s@lemn@t/
+solemnly s{l}l/
+soler sOlP
+soleri s]l,r/
+soles sOlz
+solesbee sOlzbE
+soley sOl/
+solheim sOlhIm
+soli sOlE
+solicit s@lis@t
+solicitation s@lis@tAS~
+solicitations s@lis@tAS~z
+solicited s@lis@t@d
+soliciting s@lis@t6N
+solicitor s@lis@tP
+solicitors s@lis@tPz
+solicitous s@lis@t@s
+solicits s@lis@ts
+solicitude s@lis@tUd
+solid sol@d
+solid-state sol@dstAt
+solidarity sol@d,r@t/
+solidarity's sol@d,r@t/z
+soliday sOl/dA
+soliders sol@dPz
+solidified s@lid@fId
+solidifies s@lid@fIz
+solidify s@lid@fI
+solidifying s@lid@fI6N
+solidity s@lid@t/
+solidly sol@dl/
+solids sol@dz
+solie sOl/
+soliloquize s@lil@kwIz
+soliloquy sOl@lokw/
+soliman sol}~
+soliman's sol}~z
+solimine s]l/mEn/
+solimon sOl}~
+solin sOlin
+solingen sOl6Ngcn
+solingen sol6Ngcn
+solinger sOl6NP
+solis sOlis
+solita s]lEt@
+solitaire sol@t,r
+solitariness sol@t,r/n@s
+solitary sol@ter/
+solitec sol@tek
+solitron sOl@tron
+solitude sol@tUd
+soliz sOl/z
+soll sol
+sollars solPz
+sollenberger sol~bPgP
+soller solP
+sollers solPz
+solley sol/
+solliday sol/dA
+sollie sol/
+sollinger sol6NP
+sollish sol6S
+solloway sol]wA
+solly sol/
+solo sOlO
+solodar sol@dP
+soloff sol{f
+soloist sOlOist
+soloists sOlOis
+soloists sOlOiss
+soloists sOlOists
+soloman s]l]man
+solomon sol}~
+solomon's sol}~z
+solomos sol}]s
+solon sOl~
+solorio s]l{r/]
+solorzano s]l{rzon]
+solos sOl]z
+soloviev sol]vEv
+solow sol]
+soloway sOl]wA
+solstice s{lstis
+solstices s{lstis@z
+solt sOlt
+soltau sOlt?
+soltero s]lt,r]
+soltes sOlts
+soltesz sOlt6S
+solti sOlt/
+soltis sOltis
+soltys sOlt/z
+soltysiak s]ltis/ak
+soluble soly@b@l
+solum sOl}
+solution s@lUS~
+solutions s@lUS~z
+solvable solv@b@l
+solvay sOlvA
+solve solv
+solved solvd
+solvency s{lv~s/
+solvent solv~t
+solvents s{lv~ts
+solver solvP
+solvers solvPz
+solves solvz
+solvig sOlv6g
+solving solv6N
+solwin sOlwin
+solwin's sOlwinz
+solzhenitsyn sOlz~itsin
+som som
+soma sOm@
+somali s}ol/
+somalia s}ol/@
+somalia s}oly@
+somalia's s}ol/@z
+somalia's s}oly@z
+somalian s}oly~
+somalians s}oly~z
+somalias s}ol/@z
+somalias s}oly@z
+somaliland s}ol/land
+somalis s}ol/z
+somatogen sOmat@jcn
+somatotropin sOm@totr@p~
+somber sombP
+somberly sombPl/
+sombrero sombr,r]
+some sum
+somebody sumb@d/
+somebody sumbod/
+somebody's sumb@d/
+somebody's sumbod/
+someday sumdA
+somehow sumh?
+someone sumwun
+someone's sumwunz
+someplace sumplAs
+somer sumP
+somers sumPz
+somersault sumPs{lt
+somersaulting sumPs{lt6N
+somersaults sumPs{lts
+somerset sumPset
+somerton sumPt~
+somerville sumPvil
+somes sumz
+somesh sOmeS
+somethin' sumT~
+something sumT6N
+something's sumT6Nz
+somethings sumTiNz
+sometime sumtIm
+sometimes sumtImz
+sometimes s}tImz
+somewhat sumhwut
+somewhat sumwut
+somewhere sumhwer
+somewhere sumwer
+somewheres sumwerz
+somewheres sumwerz
+somma som@
+sommer sumP
+sommerfeld somPfcld
+sommerfeldt somPfclt
+sommerfield s}Vf/ld
+sommers sumPrz
+sommersby sumPrzb/
+sommerville somPvil
+somnolent somn@l~t
+somogyi s]mOgy/
+somoza s}Oz@
+son sun
+son's sunz
+sonar sOnor
+sonat son@t
+sonata s~ot@
+sonatas sonot@z
+sonatrach son@trak
+sonchez sonCcz
+sondag sond@g
+sonderman sondPm~
+sondgeroth sonjPoT
+sondheim sondhIm
+sondheim's sondhImz
+sondheimer sondhImP
+sondra sondr@
+sones sOnz
+sonesta s~est@
+sonet sOn@t
+sonex sOn@ks
+song s{N
+song's s{Nz
+songbird s{NbVd
+songbirds s{NbVdz
+songer s{NP
+songs s{Nz
+songwriter s{NrItP
+songwriters s{NrItPz
+songwriting s{NrIt6N
+songy sonj/
+soni sOn/
+sonia sOny@
+sonic son6k
+sonics son6ks
+sonier sOn/P
+sonja sOny@
+sonji s{nj/
+sonn son
+sonne son
+sonneborn son@b{rn
+sonnen son~
+sonnenberg son~bPg
+sonnenblick s~enbl6k
+sonnenburg son~bPg
+sonnenfeld son~fcld
+sonnenschein son~SIn
+sonner sonP
+sonnet sonct
+sonnets soncts
+sonnett son@t
+sonnier sun/P
+sonntag sont@g
+sonny sun/
+sonny's sun/z
+sonoco s~Ok]
+sonoda s]nOd@
+sonogram s{n@gram
+sonograms s{n@gramz
+sonoma s~Om@
+sonora s~{r@
+sonorous sonP@s
+sonrise sunrIz
+sons sunz
+sons' sonz
+sontag sontag
+sonum son}
+sony sOn/
+sony's sOn/z
+sonya sOny@
+soo sU
+sood sUd
+soohoo sUhU
+soon sUn
+sooner sUnP
+sooner's sUnPz
+sooners sUnPz
+soonest sUn@st
+soong sUN
+soos sUz
+soot sqt
+sooter sqtP
+soothe sUT
+soothed sUTd
+soothes sUTz
+soothing sUT6N
+soothingly sUT6Nl/
+soothsayer sUTsAP
+soothsayers sUTsAPz
+soots sqts
+sooty sUt/
+sooy sU/
+sop sop
+sope sOp
+soper sOpP
+sopher sofP
+sophia sOf/@
+sophia s]fE@
+sophie sOf/
+sophie's sOf/z
+sophisticate s@fist6k@t
+sophisticate s@fist6kAt
+sophisticated s@fist6kAt@d
+sophisticates s@fist6kAts
+sophisticates s@fist6kits
+sophistication s@fist6kAS~
+sophocles sof@kl/z
+sophomore sofm{r
+sophomores sofm{rz
+sophomoric sof]m)r6k
+sophronia s]frOn/@
+sophy sOf/
+sopko sOpk]
+sopp sop
+sopping sop6N
+soprano s@pran]
+soprano s@pron]
+sopranos s@pran]z
+sops sops
+soquip sOkwip
+sor s{r
+soranno s{ron]
+sorbello s{rbel]
+sorber s{rbP
+sorbet s{rbA
+sorbet s{rbct
+sorbo s{rb]
+sorbonne s{rbon
+sorbus s{rb@s
+sorce s{rs
+sorcerer s{rsPP
+sorcerers s{rsPPz
+sorcery s{rsP/
+sorcha s{rk@
+sorci s{rC/
+sordid s{rd@d
+sordoni s{rdOn/
+sore s{r
+sorel s{r@l
+sorell s{r@l
+sorely s{rl/
+sorensen s{r~s~
+sorenson s{r~s~
+sorento sPent]
+sorento's sPent]z
+sores s{rz
+sorey s{r/
+sorg s{rg
+sorge s{rj
+sorgen s{rg~
+sorghum s{rg}
+soria s{r/@
+soriano s{r/on]
+sorice s{ris
+sorkin s{rkin
+sorkow s{rk?
+sorlie s{rl/
+soroka s{rOk@
+sororities sP{r@t/z
+sorority sP{r@t/
+soros s{r]s
+soros's s{r]s@z
+sorovski s{r{vsk/
+sorovski's s{r{vsk/z
+sorpasso s{rpos]
+sorrel s{r@l
+sorrell s{r@l
+sorrell's s{r@lz
+sorrells s{r@lz
+sorrels s{r@lz
+sorrenti s{rent/
+sorrow s)r]
+sorrowful s)r]f@l
+sorrows s)r]z
+sorry s)r/
+sort s{rt
+sorted s{rt@d
+sorter s{rtP
+sorters s{rtPz
+sortie s{rt/
+sorties s{rt/z
+sorting s{rt6N
+sortino s{rtEn]
+sortor s{rtP
+sorts s{rts
+sorum s{r}
+sorus s{r@s
+sorvino s{rvEn]
+sosa sOs@
+sosebee sos@b/
+soshi sOS/
+sosin sOsin
+sosinski s@sinsk/
+soskin soskin
+sosna sOsn@
+sosnoff s{sn{f
+sosnoff's s{sn{fs
+sosnowski s@sn{fsk/
+soss s{s
+sossamon s]som{n
+sosuke s]sUkA
+sotak sOt@k
+sotello s]tel]
+sotelo s]tel]
+soter sOtP
+sotheby soT@b/
+sotheby's soT@b/z
+soto sOt]
+sotolongo s]t]lONg]
+sotomayor s]t]mA{r
+sotti sOt/
+sottile sOt@l
+souccar sUkor
+soucek sOs6k
+soucie sOk/
+soucy sOs/
+souder s?dP
+souders s?dPz
+souers s?Pz
+souffle sUflA
+sought s{t
+souk sUk
+soukup s?k@p
+soul sOl
+soule s?l
+soules sUlz
+soulful sOlf@l
+soulier sUl/P
+souljah sUlj@
+soulless sOll@s
+soulliere sUl/cr
+souls sOlz
+sound s?nd
+sound's s?ndz
+soundbite s?ndbIt
+soundbites s?ndbIts
+sounded s?nd@d
+sounder s?ndP
+soundest s?nd@st
+sounding s?nd6N
+soundings s?nd6Nz
+soundly s?ndl/
+soundness s?ndn@s
+sounds s?ndz
+sounds s?nz
+soundscan s?ndskan
+soundtrack s?ndtrak
+soundtrack s?ntrak
+soundtracks s?ndtraks
+soundtracks s?ntraks
+soundview s?ndvyU
+soup sUp
+soup's sUps
+souped sUpt
+soups sUps
+soupy sUp/
+sour s?P
+sour s?r
+sourby s?rb/
+source s{rs
+sourcebook s{rsbqk
+sources s{rs@z
+sources' s{rs@z
+sourcing s{rs6N
+soured s?Pd
+souring s?P6N
+souris sUris
+sourrouille s{rU/
+sours s?Pz
+sours s?rz
+sous sUz
+sousa sUz@
+sousa's sUz@z
+sousaphone sUz@fOn
+sousley s?sl/
+soutar sUt)r
+souter s?tP
+souter sUtP
+south s?T
+south's s?Ts
+southall s?T@l
+southam s?T}
+southampton s?Thampt~
+southard s?TPd
+southbound s?Tb?nd
+southdown s?Td?n
+southdown's s?Td?nz
+southeast s?TEst
+southeast's s?TEsts
+southeastern s?TEstPn
+southeastern's s?TEstPnz
+souther suTP
+southerland suTPl~d
+southerly suTPl/
+southern suTPn
+southern's suTPnz
+southerner suTPnP
+southerners suTPnPz
+southernmost suTPnmOst
+southernnet suTPnct
+southernnet's suTPncts
+southers suTPz
+southfield s?TfEld
+southgate s?TgAt
+southin s?Tin
+southland s?Tland
+southland's s?Tlandz
+southlife s?TlIf
+southmark s?Tmork
+southmark's s?Tmorks
+southold s?TOld
+southport s?Tp{rt
+souths s?Ts
+southside s?TsId
+southstate s?TstAt
+southwall s?Tw{l
+southward s?TwPd
+southway s?TwA
+southwell s?Twel
+southwest s?Twest
+southwest's s?Twests
+southwestern s?TwestPn
+southwick s?Tw6k
+southwood s?Twqd
+southworth s?TwPT
+souto sUt]
+souvenir sUv~ir
+souvenirs sUv~irz
+souveroff sUvP{f
+souza sUz@
+souzas sUz@z
+sova sOv@
+sovereign sovr~
+sovereigns sovr~z
+sovereignty sovr~t/
+sovetskaya sOvctskI@
+sovexportfilm sOveksp{rtfilm
+sovey sOv/
+soviet sOv/@t
+soviet sOv/et
+soviet's sOv/ets
+soviet-union sOv/etyUny~
+sovietologist sOv/@tol@jist
+sovietologists sOv/@tol@jis
+sovietologists sOv/@tol@jiss
+sovietologists sOv/@tol@jists
+soviets sOv/ets
+soviets' sOv/ets
+sovine sovIn
+sovran sovr~
+sovran's sovr~z
+sovrans sovr~z
+sow s?
+sow sO
+sowa sO@
+soward sOPd
+sowards sOPdz
+sowash sO@S
+sowata sOot@
+sowata's sOot@z
+sowden sOd~
+sowder sOdP
+sowders sOdPz
+sowed s?d
+sowed sOd
+sowell sowcl
+sower sOP
+sowers sOPz
+soweto s]At]
+sowing sO6N
+sowinski s]insk/
+sowle sOl
+sowles sOlz
+sown sOn
+sows sOz
+sox soks
+sox's soks@z
+soy s<
+soya s<@
+soyars s<Pz
+soybean s<bEn
+soybeans s<bEnz
+soyka s<k@
+soysauce s<s{s
+soyuz s<Uz
+soza sOz@
+sozio sOz/]
+spa spo
+space spAs
+spaceball spAsb{l
+spaceballs spAsb{lz
+spaceband spAsband
+spacebands spAsbandz
+spacecraft spAskraft
+spacecraft's spAskrafts
+spaced spAst
+spacehab spAshab
+spacek spoCck
+spacek sposck
+spacelink spAsliNk
+spacenet spAsnet
+spaceport spAsp{rt
+spacer spAsP
+spacers spAsPz
+spaces spAs@z
+spaceship spAsSip
+spaceships spAsSips
+spacesuit spAsUt
+spacesuits spAsUts
+spacewalk spAswok
+spacewalking spAswok6N
+spacewalks spAswoks
+spacey spAs/
+spacing spAs6N
+spacious spAS@s
+spack spak
+spackman spakm~
+spada spod@
+spadaccini spodoCEn/
+spadafora spodof{r@
+spadafore spod{f{r
+spadaro spod)r]
+spade spAd
+spader spAdP
+spades spAdz
+spadework spAdwVk
+spadoni spodOn/
+spady spAd/
+spaeth spET
+spafford spafPd
+spaghetti sp@get/
+spagna spagn@
+spagnola spognOl@
+spagnoli spognOl/
+spagnolo spognOl]
+spagnuolo spognyUOl]
+spago spAg]
+spahn spon
+spahr sp)r
+spaid spAd
+spain spAn
+spain's spAnz
+spainhour spIn?r
+spainhower spInh]P
+spak spak
+spake spAk
+spalding sp{ld6N
+spalink spAliNk
+spalink spoliNk
+spall sp{l
+spalla spal@
+spallone spalOn
+spalvins spalvinz
+spam spam
+spampinato spomp/not]
+span span
+span's spanz
+spanbauer spanb?P
+spandex spand@ks
+spang spaN
+spangenberg spaN~bPg
+spangle spaNg@l
+spangled spaNg@ld
+spangler spaNg@lP
+spaniard spanyPd
+spaniards spanyPdz
+spaniel spany@l
+spanier spanyP
+spaniol spany@l
+spanish spaniS
+spank spaNk
+spanked spaNkt
+spanking spaNk6N
+spanky spank/
+spann span
+spanned spand
+spanner spanP
+spanning span6N
+spanninger span6NP
+spano spon]
+spanos spAn]z
+spans spanz
+spanton spant~
+spar sp)r
+sparacino spP@CEn]
+sparacio spPAs/]
+sparaco spPak]
+sparano spPan]
+sparc sp)rk
+spare sp,r
+spared sp,rd
+spares sp,rz
+sparger sp)rjP
+spargo sp)rg]
+spargur sp)rgP
+sparing sp,r6N
+sparingly sp,r6Nl/
+spark sp)rk
+sparked sp)rkt
+sparkes sp)rks
+sparking sp)rk6N
+sparkle sp)rk@l
+sparkled sp)rk@ld
+sparkles sp)rk@lz
+sparkling sp)rk@l6N
+sparkling sp)rkl6N
+sparkly sp)rkl/
+sparkman sp)rkm~
+sparks sp)rks
+sparky sp)rk/
+sparlin sp)rlin
+sparling sp)rl6N
+sparr spar
+sparred sp)rd
+sparring sp)r6N
+sparrow sp,r]
+sparrows sp,r]z
+sparse sp)rs
+sparsely sp)rsl/
+sparta sp)rt@
+spartacus sp)rt@k@s
+spartan sp)rt~
+spartanburg sp)rt~bPg
+spartech sp)rtek
+spartz sp)rts
+spas spoz
+spasm spaz}
+spasms spaz}z
+spasso spas]
+spat spat
+spatafora spotof{r@
+spatafore spat@f{r
+spataro spot)r]
+spate spAt
+spates spAts
+spath spaT
+spatial spAS@l
+spatola spotOl@
+spats spats
+spatter spatP
+spattered spatPd
+spattering spatP6N
+spatters spatPz
+spatula spaCql@
+spatz spats
+spaugh sp{
+spaulding sp{ld6N
+spaur sp{r
+spavo spov]
+spaw sp{
+spawn spon
+spawned sp{nd
+spawning spon6N
+spawns sponz
+spayd spAd
+spayde spAd
+spaziani spoz/on/
+speagle spEg@l
+speak spEk
+speake spEk
+speaker spEkP
+speaker's spEkPz
+speakers spEkPz
+speakership spEkPSip
+speakes spEks
+speakes's spEks@z
+speaking spEk6N
+speakman spEkm~
+speaks spEks
+spear spir
+speare spEr
+spearhead spirhed
+spearheaded spirhed@d
+spearheading spirhed6N
+spearing spir6N
+spearman spirm~
+spears spirz
+speas spEz
+spease spEz
+spec spek
+specht spekt
+special speS@l
+special's speS@lz
+speciale speC@l/
+specialist speS@l@st
+specialists speS@l@s
+specialists speS@l@ss
+specialists speS@l@sts
+specialists' speS@l@sts
+specialities speS@lt/z
+speciality speS/al@t/
+specialization speS@l@zAS~
+specialize speS@lIz
+specialized speS@lIzd
+specializes speS@lIz@z
+specializing speS@lIz6N
+specially speS@l/
+specially speSl/
+specials speS@lz
+specialties speS@lt/z
+specialty spAS@lt/
+specialty speS@lt/
+species spES/z
+species' spES/z
+specific sp@sif6k
+specifically sp@sif6kl/
+specification spes@f6kAS~
+specifications spes@f6kAS~z
+specificity spes@fis@t/
+specifics sp@sif6ks
+specified spes@fId
+specifies spes@fIz
+specify spes@fI
+specifying spes@fI6N
+specimen spes}~
+specimens spes}~z
+specious spES@s
+speck spek
+specker spekP
+speckle spek@l
+speckled spek@ld
+speckman spekm~
+specks speks
+specs speks
+spectacle spekt@k@l
+spectacles spekt@k@lz
+spectacular spcktaky@lP
+spectacularly spcktaky@lPl/
+spectator spektAtP
+spectators spektAtPz
+specter spektP
+specter's spektPz
+specthrie spekTr/
+spector spektP
+spectra spektr@
+spectra's spektr@z
+spectradyne spektr@dIn
+spectramed spektr}ed
+spectran spektran
+spectravision spektr@viZ~
+spectre spektP
+spectrograph spektr@graf
+spectrometer spcktrom@tP
+spectrometry spcktrom@tr/
+spectroscopy spcktrosk@p/
+spectrum spektr}
+spectrum's spektr}z
+spectrums spektr}z
+speculate speky@lAt
+speculated speky@lAt@d
+speculates speky@lAts
+speculating speky@lAt6N
+speculation speky@lAS~
+speculations speky@lAS~z
+speculative speky@l@t6v
+speculator speky@lAtP
+speculators speky@lAtPz
+speculators' speky@lPtAz
+sped sped
+speece spEs
+speech spEC
+speeches spEC@z
+speechless spECl@s
+speechwriter spECrItP
+speechwriters spECrItPz
+speed spEd
+speedboat spEdbOt
+speedboats spEdbOts
+speeded spEd@d
+speeder spEdP
+speeders spEdPz
+speedier spEd/P
+speedily spEd@l/
+speeding spEd6N
+speedometer sp/dom@tP
+speedring spEdriN
+speeds spEdz
+speedskate spEdskAt
+speedskating spEdskAt6N
+speedup spEdup
+speedway spEdwA
+speedy spEd/
+speegle spEg@l
+speelman spElm~
+speer spir
+spees spEz
+spegal spEg@l
+spehar spehP
+speich spIk
+speicher spIkP
+speidel spId@l
+speier spIP
+speight spAt
+speights spAts
+speigner spIgnP
+speir spir
+speirs spirz
+speiser spIzP
+spell spel
+spellacy spel@s/
+spellbinding spelbInd6N
+spellbound spelb?nd
+spelled speld
+speller spelP
+spellers spelPz
+spelling spel6N
+spelling's spel6Nz
+spellings spel6Nz
+spellman spelm~
+spellmeyer spelmIP
+spells spelz
+spelman spelm~
+speltz spelts
+spence spens
+spencer spensP
+spencer's spensPz
+spend spend
+spendable spend@b@l
+spender spendP
+spenders spendPz
+spending spend6N
+spendley spendl/
+spendlove spendluv
+spends spendz
+spends spenz
+spendthrift spendTrift
+spengler speNlP
+spengler spiN@lP
+spenner spenP
+speno spen]
+spens spens
+spenser spensP
+spenser's spensPz
+spensers spensPz
+spent spent
+spera sp,r@
+speranza spPonz@
+sperbeck spVbck
+sperber spVbP
+sperduto spPdUt]
+sperl spVl
+sperle sp{r@l
+sperlich spVl6k
+sperling spVl6N
+sperm spVm
+sperms spVmz
+spero sp,r]
+speros sp,r]z
+sperrazza spPots@
+sperrfrist sp,rfrist
+sperry sp,r/
+spessard spesPd
+speth speT
+spethmann speTm~
+spetsnaz spetsnaz
+spevak spev@k
+spew spyU
+spewed spyUd
+spewing spyU6N
+spews spyUz
+spey spA
+speyer spAP
+speziale spcz/ol/
+spezzano spctson]
+sphar sf)r
+sphere sfir
+spheres sfirz
+spherical sf,r6k@l
+spheroid sfir<d
+sphinx sfiNks
+spic spik
+spice spIs
+spiced spIst
+spiceland spIsland
+spicer spIsP
+spices spIs@z
+spicey spIs/
+spicher spiCP
+spicing spIs6N
+spickard spikPd
+spickler spiklP
+spicuzza sp/kUts@
+spicy spIs/
+spidel spid@l
+spidell spid@l
+spider spIdP
+spiderman spIdPman
+spiders spIdPz
+spidle spId@l
+spie spE
+spied spId
+spiegel spEg@l
+spiegelberg spEg@lbPg
+spiegelman spEg@lm~
+spiegler spEglP
+spieker spEkP
+spiel spEl
+spielberg spElbPg
+spielberg's spElbPgz
+spielberger spElbPgP
+spieler spElP
+spielman spElm~
+spielmann spElm~
+spielvogel spElvOg@l
+spier spIP
+spiering spIP6N
+spiers spIPz
+spies spIz
+spiess spEz
+spieth spI@T
+spiewak spEwak
+spiffing spif6N
+spiffy spif/
+spight spIt
+spigner spIgnP
+spigot spig@t
+spigots spig@ts
+spike spIk
+spiked spIkt
+spiker spIkP
+spikes spIks
+spiking spIk6N
+spiky spIk/
+spilde spild
+spilker spilkP
+spill spil
+spill's spilz
+spillage spil6j
+spillane spil~
+spilled spild
+spiller spilP
+spillers spilPz
+spilling spil6N
+spillman spilm~
+spillover spilOvP
+spills spilz
+spillway spilwA
+spilman spilm~
+spilotro sp@lotr]
+spilt spilt
+spin spin
+spina spEn@
+spinach spin@C
+spinal spIn@l
+spinale sp/nol/
+spindel spind@l
+spindle spind@l
+spindler spind@lP
+spine spIn
+spineless spInl@s
+spinella sp~el@
+spinelli sp~el/
+spinello sp~el]
+spines spInz
+spinfizz spinfiz
+spink spiNk
+spinks spiNks
+spinks's spiNksiz
+spinner spinP
+spinner's spinPz
+spinners spinPz
+spinney spin/
+spinning spin6N
+spino spEn]
+spinoff spin{f
+spinoffs spin{fs
+spinola sp/nOl@
+spinosa sp/nOs@
+spinoza sp~Oz@
+spins spinz
+spinster spinstP
+spiny spIn/
+spira spir@
+spiral spIr@l
+spiraled spIr@ld
+spiraling spIr@l6N
+spiralling spIr@l6N
+spirals spIr@lz
+spire spIr
+spires spIrz
+spirit spir@t
+spirited spir@t@d
+spiritedness spir@t@dn@s
+spirito sp6rEt]
+spirits spir@ts
+spiritual spir6C@w@l
+spiritual spir6Cw@l
+spiritualism spir6C@w@lizm
+spiritualism spir6Cw@lizm
+spiritualist spir6C@w@l@st
+spiritualists spir6C@w@l@s
+spiritualists spir6C@w@l@ss
+spiritualists spir6C@w@l@sts
+spiritualists spir6Cw@l@s
+spiritualists spir6Cw@l@ss
+spirituality spir6C@wal@t/
+spiritually spir6C@w@l/
+spirituals spir6C@w@lz
+spirituals spir6Cw@lz
+spiro spir]
+spisak spis@k
+spit spit
+spitale sp/tol/
+spitball spitb{l
+spitball's spitb{lz
+spite spIt
+spiteful spItf@l
+spiteri sp/t,r/
+spitler spitlP
+spits spits
+spitting spit6N
+spittle spit@l
+spittler spitlP
+spitz spits
+spitzer spitzP
+spitzley spitsl/
+spitznagel spitsnAg@l
+spiva spEv@
+spivack spiv@k
+spivak spiv@k
+spivey spiv/
+spiwak spiv@k
+spizzirri sp/tsir/
+splain splAn
+splaine splAn
+splash splaS
+splashed splaSt
+splashes splaS@z
+splashing splaS6N
+splashy splaS/
+splat splat
+splatter splatP
+splattered splatPd
+splawn spl{n
+spleen splEn
+spleisson spAs~
+splendid splend@d
+splendidly splend@dl/
+splendor splendP
+splenic splEn6k
+splenic splen6k
+splice splIs
+spliced splIst
+splices splIs@z
+splichal spliC@l
+splicing splIs6N
+splint splint
+splinter splintP
+splintered splintPd
+splintering splintP6N
+splintery splintP/
+splints splints
+split split
+splits splits
+splitt split
+splitting split6N
+splurge splVj
+splurged splVjd
+splurging splVj6N
+spock spok
+spoden spOd~
+spoelstra spOlstr@
+spoerl sp{rl
+spofford spofPd
+spogli spogl/
+spohn spon
+spohr sp)r
+spoil sp<l
+spoilage sp<l@j
+spoiled sp<ld
+spoiler sp<lP
+spoilers sp<lPz
+spoiling sp<l6N
+spoils sp<lz
+spokane sp]kAn
+spokane sp]kan
+spoke spOk
+spoken spOk~
+spokes spOks
+spokesman spOksm~
+spokesmen spOksmcn
+spokespeople spOkspEp@l
+spokesperson spOkspPs~
+spokespersons spOkspPs~z
+spokeswoman spOkswqm~
+spokeswomen spOkswimcn
+spoleto sp]lAt]
+spoletto sp]lAt]
+spoletto's sp]lAt]z
+spomer spOmP
+sponaugle spon{g@l
+spong sp{N
+sponge spunj
+sponged spunjd
+spongeform spunjf{rm
+sponges spunj@z
+spongy spunj/
+sponsel spons@l
+sponseller spons@lP
+sponsler spons@lP
+sponsor sponsP
+sponsor's sponsPz
+sponsored sponsPd
+sponsoring sponsP6N
+sponsors sponsPz
+sponsorship sponsPSip
+sponsorships sponsPSips
+spontaneity spont~E@t/
+spontaneous spontAn/@s
+spontaneously spontAn/@sl/
+spoof spUf
+spoofed spUft
+spoofing spUf6N
+spoofs spUfs
+spook spUk
+spooked spUkt
+spooks spUks
+spooky spUk/
+spool spUl
+spoon spUn
+spoonemore spUnm{r
+spooner spUnP
+spoonful spUnfql
+spoons spUnz
+spoor spqr
+spoor's spqrz
+sporadic spPad6k
+sporadically spPad6kl/
+sporck sp{rk
+spore sp{r
+sporer sp{rP
+spores sp{rz
+sporkin sp{rkin
+sporkin's sp{rkinz
+sporleder sp{rl@dP
+sporn sp{rn
+sporophyte sp{rfIt
+sporophytes sp{rfIts
+sporrer sp{Pr
+sport sp{rt
+sport's sp{rts
+sported sp{rt@d
+sportier sp{rt/P
+sporting sp{rt6N
+sportingly sp{rt6Nl/
+sports sp{rts
+sports' sp{rts
+sportsbar sp{rtsbor
+sportscaster sp{rtskastP
+sportscasters sp{rtskastPz
+sportschannel sp{rtsCan@l
+sportsclub sp{rtsklub
+sportsman sp{rtsm~
+sportsmanship sp{rtsm~Sip
+sportsmen sp{rtsmcn
+sportster sp{rtstP
+sportswear sp{rtswer
+sportswriter sp{rtsrItP
+sportswriters sp{rtsrItPz
+sporty sp{rt/
+sposato sp]sot]
+sposito sp]sEt]
+spot spot
+spotless spotl@s
+spotlight spotlIt
+spotlighted spotlIt@d
+spotlighting spotlIt6N
+spotlights spotlIts
+spoto spOt]
+spots spots
+spotted spot@d
+spotter spotP
+spotters spotPz
+spotting spot6N
+spotts spots
+spotty spot/
+spousal sp?z@l
+spouse sp?s
+spouse's sp?s@z
+spouses sp?s@z
+spout sp?t
+spouted sp?t@d
+spouting sp?t6N
+spracklen sprak@l~
+spradley spradl/
+spradlin spradlin
+spradling spradl6N
+spragg sprag
+spraggins spraginz
+sprague sprAg
+sprague's sprAgz
+sprain sprAn
+sprained sprAnd
+sprains sprAnz
+spraker sprAkP
+sprang spraN
+spranger spraNP
+sprankle spraNk@l
+spratley spratl/
+spratlin spratlin
+spratling spratl6N
+spratt sprat
+sprawl spr{l
+sprawled spr{ld
+sprawling spr{l6N
+sprawls spr{lz
+spray sprA
+sprayberry sprAber/
+sprayed sprAd
+sprayer sprAP
+sprayers sprAPz
+spraying sprA6N
+sprays sprAz
+spread spred
+spreader spredP
+spreading spred6N
+spreads spredz
+spreadsheet spredSEt
+spreadsheets spredSEts
+sprecher sprekP
+spreckels sprek@lz
+spree sprE
+spreeman sprEm~
+spreen sprEn
+sprees sprEz
+sprehe sprEh
+spreitzer sprItzP
+spreng spreN
+sprenger sprenjP
+sprenkle spreNk@l
+sprick sprik
+sprigg sprig
+sprigged sprigd
+spriggs sprigz
+sprightly sprItl/
+spring spPiN
+spring spriN
+spring's spriNz
+springboard spriNb{rd
+springborn spriNgbPn
+springdale spriNdAl
+springer spriNP
+springerville spriNPvil
+springfield spriNfEld
+springfield's spriNfEldz
+springing spriN6N
+springman spriNm~
+springs spPiNz
+springs spriNz
+springstead spriNsted
+springsteen spriNstEn
+springsteen's spriNstEnz
+springston spriNst~
+springtime spriNtIm
+sprinkel spriNk@l
+sprinkle spriNk@l
+sprinkled spriNk@ld
+sprinkler spriNk@lP
+sprinkler spriNklP
+sprinklers spriNk@lPz
+sprinklers spriNklPz
+sprinkles spriNk@lz
+sprinkling spriNk@l6N
+sprinkling spriNkl6N
+sprint sprint
+sprint's sprints
+sprinted sprint@d
+sprinter sprintP
+sprinters sprintPz
+sprinting sprint6N
+sprints sprints
+sprite sprIt
+sprizzo spriz]
+sproat sprOt
+sprock sprok
+sprocket sprok@t
+sprogus sprOg@s
+sprogus's sprOg@s@z
+sproles sprOlz
+sprong spr{N
+sprott sprot
+sproul spr?l
+sproule sprUl
+sproull sprUl
+sprouls spr?lz
+sprouse spr?s
+sprout spr?t
+sprouted spr?t@d
+sprouting spr?t6N
+sprouts spr?ts
+sprow spr?
+sprowl spr?l
+sprowle spr?@l
+sprowls spr?lz
+spruce sprUs
+spruced sprUst
+sprucing sprUs6N
+spruell sprUl
+spruiell sprUl
+spruill sprUl
+sprung spruN
+sprunger spruNP
+spry sprI
+spud spud
+spud's spudz
+spuds spudz
+spuhler spUlP
+spun spun
+spunk spuNk
+spunky spuNk/
+spur spV
+spurdle spVd@l
+spurge spVj
+spurgeon spVj~
+spurgin spVjin
+spurious spV/@s
+spurious spyqr/@s
+spurlin spVlin
+spurling spVl6N
+spurlock spVlok
+spurn spVn
+spurned spVnd
+spurning spVn6N
+spurns spVnz
+spurr spV
+spurred spVd
+spurrier spV/P
+spurring spV6N
+spurs spVz
+spurt spVt
+spurted spVt@d
+spurting spVt6N
+spurts spVts
+sputnik sputn6k
+sputniks sputn6ks
+sputter sputP
+sputtered sputPd
+sputtering sputP6N
+sputters sputPz
+spy spI
+spycatcher spIkaCP
+spychalski sp@holsk/
+spyglass spIglas
+spying spI6N
+spyker spIkP
+squabble skwob@l
+squabbled skwob@ld
+squabbles skwob@lz
+squabbling skwob@l6N
+squabbling skwobl6N
+squad skwod
+squad's skwodz
+squadron skwodr~
+squadrons skwodr~z
+squads skwodz
+squalid skwol@d
+squall skw{l
+squalls skw{lz
+squalor skwolP
+squander skwondP
+squandered skwondPd
+squandering skwondP6N
+square skw,r
+squared skw,rd
+squarely skw,rl/
+squares skw,rz
+squaring skw,r6N
+squash skwoS
+squashed skwoSt
+squashing skwoS6N
+squashy skwoS/
+squat skwot
+squats skwots
+squatter skwotP
+squatters skwotPz
+squatting skwot6N
+squawk skw{k
+squawking skw{k6N
+squawks skw{ks
+squeak skwEk
+squeaked skwEkt
+squeaker skwEkP
+squeakers skwEkPz
+squeaking skwEk6N
+squeaks skwEks
+squeaky skwEk/
+squeal skwEl
+squealing skwEl6N
+squeals skwElz
+squeamish skwEm6S
+squeamishness skwEm6Sn@s
+squeegee skwEj/
+squeeze skwEz
+squeezed skwEzd
+squeezes skwEz@z
+squeezing skwEz6N
+squelch skwelC
+squelched skwelCt
+squelching skwelC6N
+squibb skwib
+squibb's skwibz
+squid skwid
+squier skwIP
+squiers skwIVz
+squiggle skwig@l
+squiggles skwig@lz
+squillace skwil@s
+squillante skw/lontA
+squint skwint
+squinting skwint6N
+squire skwIr
+squires skwIPz
+squirm skwVm
+squirming skwVm6N
+squirms skwVmz
+squirrel skwV@l
+squirreled skwV@ld
+squirrels skwV@lz
+squirt skwVt
+squirted skwVt@d
+squirting skwVt6N
+squirts skwVts
+squishy skwiS/
+squitieri skw/tir/
+squyres skwIrz
+sr sEnyP
+sr sistP
+srader SrAdP
+sram Sram
+sram esram
+sramek Sram6k
+srdan sVdan
+srebrenica SrAbr~Ets@
+srebrenica srAbrcnEts@
+srebrenica's SrAbr~Ets@z
+srebrenica's srAbrcnEts@z
+sremac srEmak
+sri SrE
+sri es)rI
+sri srE
+sri-lanka SrElaNk@
+sri-lanka srElaNk@
+srinagar SrEn@gor
+srinagar srEn@gor
+srinagarb SrEn@gorb
+srinagarb srEn@gorb
+srinivas srEn6vos
+srinivasan Sr/n/voson
+srinivasan sr/n/voson
+sriram SrErom
+sriram srErom
+srivastava Sr/vostov@
+srivastava sr/vostov@
+srock Srok
+sroge SrOg
+sroka SrOk@
+sroufe SrOf
+ssangyong saNy{N
+st sAnt
+st strEt
+st-james sAntjAmz
+st-johns sAntjonz
+st_charles sAntC)r@lz
+st_clair sAntkl,r
+st_claire sAntkl,r
+st_cyr sAntkir
+st_cyr sAntsir
+st_denis sAntdenis
+st_dennis sAntdenis
+st_george sAntj{rj
+st_germain sAntjVmAn
+st_germaine sAntjVmAn
+st_germaine sonZVmAn
+st_hilaire sAnthilAr
+st_jacques sAntjoks
+st_jacques sonZoks
+st_james sAntjAmz
+st_jean sAntjEn
+st_john sAntjon
+st_julien sAntjUl/~
+st_laurent sAntl{r~t
+st_laurent sonl{r{nt
+st_lawrence sAntl{r~s
+st_louis sAntlU/
+st_louis sAntlU@s
+st_lucia sAntlUS@
+st_lucia sAntlUsE@
+st_marie sAntmPE
+st_martin sAntm)rtin
+st_mary sAntm,r/
+st_peter sAntpEtP
+st_petersburg sAntpEtPzbPg
+st_pierre sAntp/,r
+st_thomas sAnttom@s
+sta estEA
+sta stu
+staab stob
+staack stok
+staal stol
+staar st)r
+staar's st)rz
+staas stoz
+staat stot
+staats stots
+stab stab
+stabbed stabd
+stabbing stab6N
+stabbings stab6Nz
+stabenow stab~]
+stabile stAb@l
+stability st@bil@t/
+stabilization stAb@l@zAS~
+stabilize stAb@lIz
+stabilized stAb@lIzd
+stabilizer stAb@lIzP
+stabilizers stAb@lIzPz
+stabilizes stAb@lIz@z
+stabilizing stAb@lIz6N
+stable stAb@l
+stabler stAb@lP
+stables stAb@lz
+stablest stAb@l@st
+stabley stabl/
+stabs stabz
+stac stak
+stac's staks
+staccato st@kotO
+stacey stAs/
+stach staC
+stachnik stakn6k
+stachowiak st@h?/ak
+stachowicz stoh@v6C
+stachowski st@h{fsk/
+stachura stokqr@
+stachurski st@hVsk/
+stacia stoC@
+stacie stak/
+stack stak
+stacked stakt
+stacker stakP
+stackhouse stakh?s
+stacking stak6N
+stackpole stakpOl
+stacks staks
+stacy stAs/
+stade stAd
+stadel stad@l
+stadelman stad@lm~
+stader stAdP
+stadia stAd/@
+stadium stAd/}
+stadium's stAd/}z
+stadiums stAd/}z
+stadler stadlP
+stadnik stadn6k
+stadt stadt
+stadtlander StatlandP
+stadtmiller StatmilP
+staebell stebcl
+staebler stAlP
+staehle stAl
+staff staf
+staff's stafs
+staffa stof@
+staffed staft
+staffer stafP
+staffers stafPz
+staffieri stofir/
+staffing staf6N
+stafford stafPd
+stafford's stafPdz
+staffordshire stafPdSIP
+staffordshire stafPdSP
+staffordshire's stafPdSIPz
+staffordshire's stafPdSPz
+staffs stafs
+stag stag
+stage stAj
+stagecoach stAjkOC
+stagecraft stAjkraft
+staged stAjd
+stagehand stAjhand
+stagehands stAjhandz
+stager stAjP
+stages stAj@z
+stagflate stagflAt
+stagflation stagflAS~
+stagg stag
+stagger stagP
+staggered stagPd
+staggering stagP6N
+staggers stagPz
+staggs stagz
+staging stAj6N
+stagliano stogl/on]
+stagnant stagn~t
+stagnaro stogn)r]
+stagnate stagnAt
+stagnated stagnAt@d
+stagnating stagnAt6N
+stagnation stagnAS~
+stagner stagnP
+stahl stol
+stahlberg stolbPg
+stahle stAh@l
+stahlecker stol6kP
+stahler stolP
+stahley stal/
+stahlhut stolh@t
+stahlman stolm~
+stahly stal/
+stahmer stomP
+stahnke staNk
+stahr star
+stai sto/
+staib stAb
+staid stAd
+staiger stIgP
+stailey stAl/
+stain stAn
+stainback stAnbak
+stainbrook stAnbrqk
+stained stAnd
+staines stAnz
+staining stAn6N
+stainless stAnl@s
+stainmaster stAnmastP
+stains stAnz
+stair st,r
+staircase st,rkAs
+staircases st,rkAs@z
+stairs st,rz
+stairway st,rwA
+stairways st,rwAz
+stairwell st,rwel
+stairwells st,rwelz
+stake stAk
+stake's stAks
+stake-out stAk?t
+staked stAkt
+stakeholder stAkhOldP
+stakeholders stAkhOldPz
+stakeout stAk?t
+stakeouts stAk?ts
+staker stAkP
+stakes stAks
+staking stAk6N
+stalcup st{lkup
+stalder st{ldP
+stale stAl
+stalemate stAlmAt
+stalemated stAlmAt@d
+staley stAl/
+staley's stAl/z
+stalin stol~
+stalin's stol~z
+stalingrad stol~grad
+stalinism stol~iz}
+stalinist stol~@st
+stalinistic stol~ist6k
+stalinists stol~@s
+stalinists stol~@ss
+stalinists stol~@sts
+stalinization stol~@zAS~
+stalinize stal~Iz
+stalk st{k
+stalked st{kt
+stalker st{kP
+stalkers st{kPz
+stalking st{k6N
+stalks st{ks
+stalky st{k/
+stall st{l
+stallard stalPd
+stallcup st{lkup
+stalled st{ld
+staller st{lP
+stallibrass stal@bras
+stalling st{l6N
+stallings st{l6Nz
+stallion staly~
+stallions staly~z
+stallkamp st{lkamp
+stallman st{lm~
+stallone st@lOn
+stallone's st@lOnz
+stalls st{lz
+stallsmith st{lsmiT
+stallworth st{lwVT
+stalnaker staln@kP
+staloff stal{f
+stalon stAl~
+stalowa st@lO@
+stalter st{ltP
+stalvey stalv/
+stalwart st{lwPt
+stalwarts st{lwPts
+stalzer stAlzP
+stam stam
+stamand stam~d
+stamant stam~t
+stamas stom@z
+stamaty stam@t/
+stambaugh stamb{
+stamberg stambPg
+stamenson stAm~s~
+stamer stAmP
+stamey stAm/
+stamford stamfPd
+stamina stam~@
+stamler stamlP
+stamm stam
+stammen stam~
+stammer stamP
+stamos stAm]z
+stamour st}qr
+stamp stamp
+stamped stampt
+stampede stampEd
+stampeded stampEd@d
+stampeding stampEd6N
+stamper stampP
+stampfli stampfl/
+stamping stamp6N
+stampings stamp6Nz
+stampley stampl/
+stamps stamps
+stan stan
+stan's stanz
+stanadyne stan@dIn
+stanaland stan@l~d
+stanard stanPd
+stanaway stan@wA
+stanback stanbak
+stanberry stanber/
+stanbery stanbP/
+stanbic stanb6k
+stanbrough stanbr?
+stanbury stanber/
+stance stans
+stances stans@z
+stanch stanC
+stanched stanCt
+stanchfield stanCf/ld
+stanching stanC6N
+stancik stans6k
+stancil stansil
+stancill stansil
+stancliff stanklif
+stanco staNk]
+stanczak stanCak
+stanczyk stanC6k
+stand stand
+standa stand@
+standard standPd
+standard's standPdz
+standard-bearer standPdb,rP
+standard-bearers standPdb,rPz
+standardization standPd@zAS~
+standardize standPdIz
+standardized standPdIzd
+standardizing standPdIz6N
+standards standPdz
+standby standbI
+standbys standbIz
+standefer stand@fP
+standen stand~
+stander standP
+standerfer standPfP
+standerford standPfPd
+standex stand@ks
+standfield standfEld
+standifer stand@fP
+standiford stand@fPd
+standin' stand~
+standing stand6N
+standings stand6Nz
+standish stand6S
+standlee standlE
+standley standl/
+standoff stand{f
+standoffs stand{fs
+standout stand?t
+standouts stand?ts
+standpoint standp<nt
+standpoints standp<nts
+standre standP
+standridge standr6j
+stands standz
+standstill standstil
+standup standup
+stanek stan6k
+stanfield stanfEld
+stanfill stanf@l
+stanford stanfPd
+stanford's stanfPdz
+stanforth stanfPT
+stang staN
+stanga stoNg@
+stange stanj
+stangel stANg@l
+stangeland stANg@l~d
+stangelo stoNgel]
+stanger staNP
+stangl staNg@l
+stangland staNgl~d
+stangle staNg@l
+stangler staNg@lP
+stangler staNglP
+stango stoNg]
+stanhope stan@p
+staniar stAn/or
+stanich stan6C
+stanifer stan@fP
+stanis stanis
+stanish stan6S
+stanislas st~isl@s
+stanislav stan@slov
+stanislaw stan@sl{
+stanislawski st~@slofsk/
+staniszewski st~6Sefsk/
+stank staNk
+stanke staNk
+stankevich staNk@viC
+stankey staNk/
+stankiewicz stank@v6C
+stanko staNk]
+stankovich staNk@v6C
+stankowski st@Nk{fsk/
+stankus staNk@s
+stanleigh stanl@
+stanley stanl/
+stanley's stanl/z
+stanleytown stanl/t?n
+stanline stanlIn
+stanly stanl/
+stanmore stanm{r
+stann stan
+stannard stanPd
+stannie stan/
+stano ston]
+stanphill stamphil
+stansberry stansber/
+stansbury stansbcr/
+stansel stans@l
+stansell stans@l
+stansfield stansf/ld
+stansky stansk/
+stant stant
+stanton stant~
+stanway stanwA
+stanwick stanw6k
+stanwood stanwqd
+stanza stanz@
+stanzas stanz@z
+stanzione stonz/On/
+stapel stap@l
+stapf stapf
+staple stAp@l
+stapled stAp@ld
+stapler stAp@lP
+staplers stAp@lPz
+staples stAp@lz
+stapleton stAp@lt~
+stapley stapl/
+stapling stAp@l6N
+stapling stApl6N
+stapp stap
+star st)r
+star's st)rz
+starace storoC/
+starbird st)rbVd
+starboard st)rbPd
+starboards st)rbPrdz
+starboards st)rb{rdz
+starbuck st)rbuk
+starbuck's st)rbuks
+starbucks st)rbuks
+starcevich st)rs6v6C
+starch st)rC
+starched st)rCt
+starcher st)rCP
+starches st)rC@z
+starchlike st)rClIk
+starchy st)rC/
+starck st)rk
+starckmann st)rkm~
+starcraft st)rkraft
+starcross st)rkr{s
+stardel st)rdel
+stardent st)rdent
+stardom st)rd}
+stardust st)rdust
+stare st,r
+stared st,rd
+starer st,rP
+stares st,rz
+starfish st)rfiS
+stargate st)rgAt
+stargates st)rgAts
+stargazer st)rgAzP
+stargazers st)rgAzPz
+starin starin
+staring st,r6N
+stark st)rk
+stark's st)rks
+starke st)rk
+starkel st)rk@l
+starker st)rkP
+starkes st)rks
+starkey st)rkE
+starkist st)rkist
+starkly st)rkl/
+starkman st)rkm~
+starkness st)rkn@s
+starkovich st)rk@v6C
+starks st)rks
+starkweather st)rkweTP
+starlet st)rl@t
+starlets st)rl@ts
+starlight st)rlIt
+starlike st)rlIk
+starlin st)rlin
+starling st)rl6N
+starliper st)rl@pP
+starlit st)rlit
+starman st)rm~
+starmer st)rmP
+starn st)rn
+starner st)rnP
+starnes st)rnz
+starns st)rnz
+starodubstev stor]dubstcv
+staron star~
+starplex st)rpleks
+starpointe st)rp<nt
+starr st)r
+starr's st)rz
+starred st)rd
+starrett starct
+starring st)r6N
+starrs st)rz
+starry st)r/
+stars st)rz
+stars' st)rz
+starship st)rSip
+starsight st)rsIt
+starstream st)rstrEm
+starstruck st)rstruk
+start st)rt
+start-up st)rtup
+start-ups st)rtups
+started st)rt@d
+starter st)rtP
+starters st)rtPz
+starting st)rt6N
+startle st)rt@l
+startled st)rt@ld
+startles st)rt@lz
+startling st)rtl6N
+startlingly st)rtl6Nl/
+starts st)rts
+startup st)rtup
+startups st)rtups
+starvation storvAS~
+starve st)rv
+starved st)rvd
+starving st)rv6N
+starwalt st)rw@lt
+starwave st)rwAv
+stary st,r/
+starzyk st)rz6k
+stash staS
+stashed staSt
+stashing staS6N
+stasi stos/
+stasiak stos/ak
+stasik stos6k
+stasio stos/]
+stasko stosk]
+stasney stasn/
+stasny stasn/
+stassen stas~
+stassi stas/
+stastny stastn/
+staszak stoS@k
+staszewski stuSefsk/
+stat stat
+state stAt
+state's stAts
+statecraft stAtkraft
+stated stAt@d
+statehood stAthqd
+statehouse stAth?s
+statehouses stAth?s@z
+stateless stAtl@s
+stately stAtl/
+statement stAtm~t
+statement's stAtm~ts
+statements stAtm~ts
+staten stat~
+stater stAtP
+stater's stAtPz
+staters stAtPz
+states stAts
+states' stAts
+statesborough stAtsb@r]
+stateside stAtsId
+statesman stAtsm~
+statesman's stAtsm~z
+statesmanlike st@tesm~lIk
+statesmanship stAtsm~Sip
+statesmen stAtsmcn
+stateswest stAtswest
+statewide stAtwId
+statham staT}
+stathis staTis
+stathopoulos st@Top@l@s
+static stat6k
+stating stAt6N
+station stAS~
+station's stAS~z
+stationary stAS~er/
+stationed stAS~d
+stationer stAS~P
+stationers stAS~Pz
+stationery stAS~er/
+stationing stAS~6N
+stations stAS~z
+stations' stAS~z
+statism stAtiz}
+statist stAtist
+statistic st@tist6k
+statistical st@tist6k@l
+statistically st@tist6k@l/
+statistically st@tist6kl/
+statistician stat@stiS~
+statisticians stat@stiS~z
+statistics st@tist6ks
+statistics' st@tist6ks
+statists stAtis
+statists stAtiss
+statists stAtists
+statler statlP
+statoil st@t<l
+staton stat~
+stats stats
+stattin statin
+statton stat~
+statuary staCUer/
+statue staCU
+statues staCUz
+statuesque staCUesk
+statuette staCUet
+statuettes staCUets
+statum stat}
+stature staCP
+status stAt@s
+status stat@s
+statute staCUt
+statute's staCUts
+statutes staCUts
+statutorily staC@t{r@l/
+statutorily staCyUt{r@l/
+statutory staC@t{r/
+statz stats
+statzer stAtzP
+statzer statzP
+staub st{b
+stauber st?bP
+staubin st?bin
+staubs st{bz
+stauch st{C
+staudacher st?d@kP
+staude st{d
+stauder st?dP
+staudinger st?d6NP
+staudt st{dt
+stauff st{f
+stauffacher st?f@kP
+stauffer st{fP
+stauffer's st{fPz
+staunch st{nC
+staunchest st{nC@st
+staunchly st{nCl/
+staunton st{nt~
+staup st{p
+stauss st{s
+stauter st?tP
+stave stAv
+staved stAvd
+stavely stAvl/
+staver stAvP
+staves stAvz
+staving stAv6N
+stavinoha stav~Oh@
+stavola stovOl@
+stavropoulos st@vrop@l@s
+stavros st@vrOz
+stawicki stovitsk/
+stawski stofsk/
+stay stA
+stayed stAd
+stayer stAP
+staying stA6N
+stayner stAnP
+stayover stAOvP
+stayovers stAOvPz
+stays stAz
+stayton stAt~
+stds estEdEes
+stds estEdEz
+stead sted
+steadfast stedfast
+steadfastly stedfastl/
+steadfastness stedfastn@s
+steadham stedh}
+steadied sted/d
+steadier sted/P
+steadily sted@l/
+steadiness sted/n@s
+steadman stedm~
+steady sted/
+steagall stEg@l
+steagle stEg@l
+steak stAk
+steakhouse stAkh?s
+steakhouses stAkh?s@z
+steakley stEkl/
+steaks stAks
+steal stEl
+stealer stElP
+stealey stEl/
+stealing stEl6N
+steals stElz
+stealth stelT
+stealthies stelT/z
+steam stEm
+steamboat stEmbOt
+steamboats stEmbOts
+steamed stEmd
+steamer stEmP
+steamers stEmPz
+steamily stEm@l/
+steaming stEm6N
+steamroller stEmrOlP
+steamrollered stEmrOlPd
+steams stEmz
+steamship stEmSip
+steamy stEm/
+stear stir
+stearic stEr6k
+stearman stirm~
+stearn stVn
+stearne stVn
+stearns stVnz
+stearns's stVnz@z
+stears stErz
+stebbins stebinz
+steber stEbP
+stebner stebnP
+stec stek
+stech stek
+stecher stekP
+stechler steklP
+stechschulte stekS@lt
+steck stek
+steckel stek@l
+steckelberg stek@lbPg
+stecker stekP
+stecklein steklIn
+steckler steklP
+steckley stekl/
+steckman stekm~
+stedman stedm~
+steeb stEb
+steeber stEbP
+steed stEd
+steed's stEdz
+steedley stEdl/
+steedman stEdm~
+steeg stEg
+steege stEj
+steego stEg]
+steel stEl
+steel's stElz
+steelcase stElkAs
+steele stEl
+steeler stElP
+steelers stElPz
+steeley stEl/
+steelhead stElhed
+steelmaker stElmAkP
+steelmaker's stElmAkPz
+steelmakers stElmAkPz
+steelmakers' stElm@kPz
+steelmaking stElmAk6N
+steelman stElm~
+steels stElz
+steelworker stElwVkP
+steelworkers stElwVkPz
+steelworkers' stElwPkPz
+steelworks stElwVks
+steely stEl/
+steen stEn
+steenbergen stEnbPg~
+steenburgen stEnbPg~
+steenkamp stEnkamp
+steenkiste stEnkist
+steenrod stEnr@d
+steensma stEnzm@
+steenson stEns~
+steep stEp
+steeped stEpt
+steepened stEp~d
+steeper stEpP
+steepest stEp@st
+steeple stEp@l
+steeplechase stEp@lCAs
+steeply stEpl/
+steepness stEpn@s
+steer stir
+steere stir
+steered stird
+steering stir6N
+steers stirz
+stees stEz
+steever stEvP
+steeves stEvz
+stefa stef@
+stefan stefon
+stefanelli stcfonel/
+stefani stef~/
+stefani's stef~/z
+stefaniak st@fan/ak
+stefanic st@fan6k
+stefanich stef~6C
+stefanick stef~6k
+stefanie stef~/
+stefanik st@fan6k
+stefanko st@faNk]
+stefano stef~]
+stefanopolis stef~{p@l@s
+stefanowicz st@fan@v6C
+stefanski st@fansk/
+steffan stef~
+steffanci stefons/
+steffe stef
+steffek stef6k
+steffel stef@l
+steffen stef~
+steffenhagen stef~h@g~
+steffens stef~z
+steffensen stef~s~
+steffensmeier stef~smIP
+steffenson stef~s~
+steffes stefs
+steffey stef/
+steffi stef/
+steffie stef/
+steffler steflP
+steffy stef/
+stefko stefk]
+stefl stef@l
+stegall steg@l
+stege stEj
+stegeman stEgm~
+stegemann stEgm~
+stegemeier stegmIr
+stegenga stcjeNg@
+steger stEgP
+stegmaier stegmIP
+stegman stegm~
+stegmann stegm~
+stegner stegnP
+stegosaurus steg@s{r@s
+stehle steh@l
+stehlik stel6k
+stehlin stelin
+stehling stel6N
+stehman stem~
+stehr st,r
+steib stEb
+steichen stIk~
+steidel stId@l
+steidinger stId6NP
+steidl stEd@l
+steidle stEd@l
+steidtmann stItm~
+steier stIP
+steig stEg
+steiger stIgP
+steigerwald stIgPw{ld
+steigerwalt stIgPw@lt
+steil stEl
+steiman stIm~
+steimel stIm@l
+steimer stImP
+steimle stEm@l
+stein stIn
+stein's stInz
+steinacker stInakP
+steinbach stInbok
+steinbacher stInbokP
+steinback stInbak
+steinbauer stInb?P
+steinbaugh stInb?
+steinbeck stInbek
+steinbeck's stInbeks
+steinberg stInbPg
+steinberg's stInbPgz
+steinbergen stInb@rg~
+steinberger stInbPgP
+steinbock stInbok
+steinborn stInb{rn
+steinbrecher stInbrekP
+steinbrenner stInbrenP
+steinbrink stInbriNk
+steinem stIn}
+steiner stInP
+steiner's stInPz
+steinert stInPt
+steines stInz
+steinfeld stInfeld
+steinfeldt stInfelt
+steingut stIngut
+steinhagen stInhag~
+steinhardt stInhort
+steinhardt's stInhorts
+steinhart stInhort
+steinhauer stInh?P
+steinhaus stInh?s
+steinhauser stInh?zP
+steinhilber stInhilbP
+steinhoff stInh{f
+steinhorst stInh{rst
+steininger stIn6NP
+steinkamp stINkamp
+steinke stINk
+steinkraus stINkr?z
+steinkrauss stInkr?s
+steinkuehler stInkyUlP
+steinle stIn@l
+steinman stInm~
+steinmann stInm~
+steinmetz stInmcts
+steinmeyer stInmIP
+steinmiller stInmilP
+steinroe stInrO
+steinway stInwA
+steinway's stInwAz
+steitz stEts
+stejskal stejsk@l
+steketee stek@t/
+stekly stekl/
+stelco stelk]
+stelian stEl/~
+stell stel
+stella stel@
+stella's stel@z
+stellar stelP
+stellarton stelPt~
+stellato stclot]
+stelle stel
+stellenbosch stel~b{S
+steller stelP
+stellhorn stelhPn
+stelling stel6N
+stelljes stAlycs
+stellmach stelm@k
+stellmacher stelm@kP
+stellman stelm~
+stello stel]
+stelly stel/
+stelmach stelm@k
+stelmack stelm@k
+steloff stel{f
+stelter steltP
+steltz stelts
+stelzer stelzP
+stelzner stelznP
+stem stem
+stemberg stembPg
+stembridge stembrij
+stemen stem~
+stemler stemlP
+stemlike stemlIk
+stemm stem
+stemmed stemd
+stemmer stemP
+stemming stem6N
+stemmler stemlP
+stempel stemp@l
+stempel's stemp@lz
+stemper stempP
+stempien stemp/n
+stemple stemp@l
+stempler stemplP
+stempler's stemplPz
+stemposts stempOs
+stemposts stempOss
+stemposts stempOsts
+stems stemz
+sten sten
+stena stAn@
+stena stEn@
+stena sten@
+stenberg stenbPg
+stencel stens@l
+stench stenC
+stencil stens@l
+stenciled stens@ld
+stenciling stens@l6N
+stenciling stensl6N
+stendal stend@l
+stender stendP
+stendig stend6g
+stene stEn
+stenerson stenPs~
+stengel steNg@l
+stenger stenjP
+stenglein stiNlIn
+stenholm stenhOlm
+stenhouse stenh?s
+stenner stenP
+stennett stenct
+stennis stenis
+steno sten]
+stenographer stcnugr@fP
+stenographic sten@graf6k
+stenquist stenkwist
+stenseth stenscT
+stensland stensl~d
+stenson stens~
+stensrud stensr@d
+stenstrom stenstr}
+stent stent
+stentor stentP
+stentors stentPz
+stentz stents
+steny sten/
+stenz stenz
+stenzel stenz@l
+step step
+stepan step~
+stepanakert st@pan@kPt
+stepanek step~6k
+stepanian st@pAn/~
+stepanian's st@pAn/~z
+stepanski st@pansk/
+stepchild stepCIld
+stepchildren stepCildr~
+stepdaughter stepd{tP
+stepdaughters stepd{tPz
+stepfather stepfoTP
+steph stef
+stepha stef@
+stephan stef~
+stephana stcfon@
+stephane stcfon
+stephani stef~/
+stephania st@fan/@
+stephanie stef~/
+stephanopoulos stef~op@l@s
+stephanopoulos' stef~op@l@s
+stephanopoulos's stef~op@l@s@z
+stephans stef~z
+stephany stef~/
+stephen stEv~
+stephen stef~
+stephen's stEv~z
+stephen's stef~z
+stephens stEv~z
+stephens stef~z
+stephens's stEv~z@z
+stephenson stEv~s~
+stephenville stEv~vil
+stepien step/~
+stepka stepk@
+stepladder stepladP
+stepladders stepladPz
+stepmother stepmuTP
+stepney stepn/
+stepp step
+steppe step
+stepped stept
+steppel step@l
+steppenwolf step~wqlf
+stepper stepP
+steppers stepPz
+steppes steps
+steppin' step~
+stepping step6N
+steppingstone step6NstOn
+steps steps
+stepsister stepsistP
+stepsisters stepsistPz
+stepson stepsun
+steptoe steptO
+sterba st,rb@
+sterbenz stVbcns
+sterchi st,rk/
+stereo st,r/O
+stereographic ster/@graf6k
+stereolab ste/]lab
+stereomicroscope ster/]mIkr@sk]p
+stereos st,r/Oz
+stereotype st,r/@tIp
+stereotype st,r/]tIp
+stereotyped st,r/@tIpt
+stereotyped st,r/]tIpt
+stereotypes st,r/@tIps
+stereotypes st,r/]tIps
+stereotypical ster/@tip6k@l
+stereotypical ster/]tip6k@l
+stereotyping st,r/@tIp6N
+stereotyping st,r/]tIp6N
+sterett st,rct
+sterett's st,r@ts
+sterile st,r@l
+sterility stPil@t/
+sterilization ster@l@zAS~
+sterilizations ster@l@zAS~z
+sterilize st,r@lIz
+sterilized st,r@lIzd
+sterilizer st,r@lIzP
+sterilizers st,r@lIzPz
+sterilizes st,r@lIz@z
+sterilizing st,r@lIz6N
+sterk stVk
+sterkel stVk@l
+sterle st{r@l
+sterling stVl6N
+sterling's stVl6Nz
+sterman stVm~
+stermer stVmP
+stern stVn
+stern's stVnz
+sternbach stVnbok
+sternberg stVnbPg
+sternberger stVnbPgP
+sterne stVn
+sternem stVncm
+sterner stVnP
+sternest stVn@st
+sternfeld stVnfcld
+sternhagen stVnh@g~
+sternly stVnl/
+sternness stVn@s
+sternness stVnn@s
+sternpost stVnpOst
+sternposts stVnpOs
+sternposts stVnpOss
+sternposts stVnpOsts
+sterns stVnz
+steroid stP<d
+steroids st,r<dz
+sterr st,r
+sterrett st,rct
+sterry st,r/
+stet stet
+stethem steT}
+stethem stet}
+stethoscope steT@skOp
+stethoscopes steT@skOps
+stetler stetlP
+stetson stets~
+stetter stetP
+stettler stetlP
+stettner stetnP
+stetz stets
+stetzel stetz@l
+stetzer stetzP
+steuart st<ort
+steuben styUb~
+steubenville stUb~vil
+steuber st<bP
+steuck stUk
+steuer st<P
+steuerwald st<Pw{ld
+steurer stVP
+steuver stUvP
+stevana st6van@
+steve stEv
+steve's stEvz
+stevedore stEv@d{r
+stevedoring stEv@d{r6N
+steven stEv~
+steven's stEv~z
+stevena stev~@
+stevens stEv~z
+stevens' stEv~z
+stevens's stEv~z@z
+stevenson stEv~s~
+stever stEvP
+steverson stevPs~
+steves stEvz
+steveson stev@s~
+stevick stev6k
+stevie stEv/
+stevison stev@s~
+stew stU
+stew's stUz
+steward stUPd
+stewardess stUPd@s
+stewardesses stUPd@s@z
+stewards stUPdz
+stewardship stUPdSip
+stewart stUPt
+stewart's stUPts
+stewed stUd
+stewing stU6N
+stews stUz
+steyer stAP
+stibel stib@l
+stice stIs
+stich stiC
+sticha stiC@
+stichnoth stiknoT
+sticht stikt
+stichter stiktP
+stick stik
+sticka stik@
+stickball stikb{l
+stickel stik@l
+stickels stik@lz
+sticker stikP
+stickers stikPz
+stickier stik/P
+stickiest stik/@st
+sticking stik6N
+stickland stikl~d
+stickle stik@l
+stickler stik@lP
+stickler stiklP
+stickles stik@lz
+stickley stikl/
+stickney stikn/
+sticks stiks
+sticktight stiktIt
+sticktights stiktIts
+sticky stik/
+stidd stid
+stidham stidh}
+stiebel stEb@l
+stieber stEbP
+stief stEf
+stiefel stEf@l
+stiefelhagen stEf@lhAg~
+stiefelhagen stIf@lhAg~
+stiefvater stEfv@tP
+stieg stEg
+stiegemeier stEj}Ir
+stiegler stEglP
+stieglitz stEglits
+stiehl stEl
+stiens stEnz
+stier stIP
+stiers stIPz
+stierwalt stirw@lt
+stieve stEv
+stifel stif@l
+stiff stif
+stiffed stift
+stiffel stif@l
+stiffen stif~
+stiffened stif~d
+stiffener stif~P
+stiffening stifn6N
+stiffening stif~6N
+stiffens stif~z
+stiffer stifP
+stiffest stif@st
+stiffler stiflP
+stiffly stifl/
+stiffness stifn@s
+stiffs stifs
+stifle stIf@l
+stifled stIf@ld
+stifles stIf@lz
+stifling stIf@l6N
+stifling stIfl6N
+stifter stiftP
+stig stig
+stigall stig@l
+stiger stIgP
+stigers stIgPz
+stigler stiglP
+stiglitz stiglits
+stigma stigm@
+stigmatism stigm@tiz}
+stigmatize stigm@tIz
+stigmatized stigm@tIzd
+stigmatizing stigm@tIz6N
+stihl stil
+stika stik@
+stikeleather stik@lcTP
+stikeleather stiklcTP
+stil stil
+stile stIl
+stiles stIlz
+stiletto st@let]
+stilettos st@let]z
+still stil
+stillborn stilb{rn
+stille stil
+stilled stild
+stiller stilP
+stiller's stilPz
+stilley stil/
+stillinger stil6NP
+stillings stil6Nz
+stillion stily~
+stillman stilm~
+stillness stiln@s
+stills stilz
+stillson stils~
+stillwagon stilwag~
+stillwater stilw{tP
+stillwell stilwel
+stillwell's stilwelz
+stilson stils~
+stilt stilt
+stilted stilt@d
+stiltner stiltnP
+stilts stilts
+stilwell stilwel
+stimac stim@k
+stimmel stim@l
+stimpert stimpPt
+stimpson stimps~
+stimpy stimp/
+stimson stims~
+stimulant stimy@l~t
+stimulants stimy@l~ts
+stimulate stimy@lAt
+stimulated stimy@lAt@d
+stimulates stimy@lAts
+stimulating stimy@lAt6N
+stimulation stimy@lAS~
+stimulative stimy@lAt6v
+stimulator stimy@lAtP
+stimulators stimy@lAtPz
+stimuli stimy@lI
+stimulus stimy@l@s
+stinar stInor
+stinchcomb stinCk}
+stinchfield stinCf/ld
+stine stIn
+stinebaugh stin@b{
+stinel stin@l
+stinel stinel
+stinel's stin@lz
+stinel's stinelz
+stineman stInm~
+stiner stInP
+stines stInz
+sting stiN
+sting's stiNz
+stinger stiNP
+stingers stiNPz
+stingier stinj/P
+stinginess stinj/n@s
+stinging stiN6N
+stingley stiNgl/
+stings stiNz
+stingy stinj/
+stink stiNk
+stinkbug stiNkb@g
+stinkbugs stiNkb@gz
+stinkers stiNkPz
+stinking stiNk6N
+stinks stiNks
+stinky stiNk/
+stinnett stinit
+stinnette stinet
+stinson stins~
+stint stint
+stints stints
+stipanovich st@pan@v6C
+stipe stIp
+stipend stIp~d
+stipends stIp~dz
+stipes stIps
+stipp stip
+stipulate stipy@lAt
+stipulated stipy@lAt@d
+stipulates stipy@lAts
+stipulating stipy@lAt6N
+stipulation stipy@lAS~
+stipulations stipy@lAS~z
+stir stV
+stires stIrz
+stirewalt st{rU@lt
+stirling stVl6N
+stirling's stVl6Nz
+stirn stVn
+stirred stVd
+stirring stV6N
+stirrings stV6Nz
+stirrup stV@p
+stirrups stV@ps
+stirs stVz
+stitch stiC
+stitched stiCt
+stitches stiC@z
+stitching stiC6N
+stiteler stItlP
+stitely stItl/
+stites stIts
+stith stiT
+stitt stit
+stitz stits
+stitzel stitz@l
+stitzer stitzP
+stiver stIvP
+stivers stIvPz
+stiverson stivPs~
+stivoric st6v{r6k
+stobaugh stob{
+stobbe stob
+stober stObP
+stobie stob/
+stock stok
+stock's stoks
+stockard stokPd
+stockbridge stokbr6j
+stockbroker stokbrOkP
+stockbroker's stokbrOkPz
+stockbrokerage stokbrOkP6j
+stockbrokerages stokbrOkP6j@z
+stockbrokers stokbrOkPz
+stockbrokers' stokbrOkPz
+stockbroking stokbrOk6N
+stockburger stokbPgP
+stockdale stokdAl
+stockdale's stokdAlz
+stocke stok
+stocked stokt
+stockel stok@l
+stocker stokP
+stockert stokPt
+stockett stokct
+stockford stokfPd
+stockham stokh}
+stockhausen stokh?z~
+stockholder stokhOldP
+stockholders stokhOldPz
+stockholders' stokhOldPz
+stockholding stokhOld6N
+stockholdings stokhOld6Nz
+stockholm stokhOlm
+stockholm's stokhOlmz
+stocking stok6N
+stockinger stok6NP
+stockings stok6Nz
+stockley stokl/
+stockman stokm~
+stockman's stokmanz
+stockmarket stokmork@t
+stockpile stokpIl
+stockpiled stokpIld
+stockpiles stokpIlz
+stockpiling stokpIl6N
+stockroom stokrUm
+stocks stoks
+stocks' stoks
+stocksdale stoksdAl
+stockslager stokslAgP
+stockstill stokstil
+stockton stokt~
+stockwell stokwel
+stocky stok/
+stockyard stokyord
+stockyards stokyordz
+stocum stOk}
+stoddard stodPd
+stoddard's stodPdz
+stodghill stojhil
+stodgy stoj/
+stodola st]dOl@
+stodolsky st@d{lsk/
+stoeber stObP
+stoeckel stOk@l
+stoecker stOkP
+stoeckle stOk@l
+stoecklein stOklIn
+stoeger stOgP
+stoehr st{r
+stoelting stOlt6N
+stoeltze stOlts
+stoermer st{rmP
+stoessel stOs@l
+stoever stocvP
+stofer stOfP
+stoff st{f
+stoffel stof@l
+stoffels stof@lz
+stoffer st{fP
+stoffers st{fPz
+stoffregen stofr6g~
+stofko stOfk]
+stoga stOg@
+stogdill stogdil
+stogner stognP
+stogsdill stogzdil
+stohl stOl
+stohler stOlP
+stohr st{r
+stoia stOy@
+stoiber st<bP
+stoic stO6k
+stoically stO6kl/
+stoicism stO@siz}
+stoics stO6ks
+stoke stOk
+stoked stOkt
+stokely stOkl/
+stoker stOkP
+stokes stOks
+stoking stOk6N
+stokke stok
+stokley stokl/
+stoklosa st@klOs@
+stol stOl
+stolar stOlP
+stolarski st@l)rsk/
+stolarz stOlorz
+stolberg stOlbPg
+stoldt stOlt
+stole stOl
+stolen stOl~
+stoler stOlP
+stolfi stOlf/
+stolichnaya stOl6knI@
+stolid stol@d
+stoll stOl
+stollar stolP
+stolle stol
+stollen stol~
+stoller stOlP
+stolley stol/
+stollings stOl6Nz
+stolp stOlp
+stolpe stOlp
+stolper stOlpP
+stolt stOlt
+stolte stOlt
+stoltenberg stOlt~bPg
+stoltman stOltm~
+stoltz stOlts
+stoltzfus stOltsf@s
+stoltzman stOltsm~
+stolz stOlz
+stolze stOlz
+stomach stum@k
+stomachs stum@ks
+stomata stOm@t@
+stombaugh stomb{
+stomp stomp
+stomped stompt
+stomping stomp6N
+stone stOn
+stone's stOnz
+stoneback stOnbak
+stoneberg stOnbPg
+stoneberger stOnbPgP
+stonebraker ston@br@kP
+stoneburner stOnbVnP
+stonecipher stOnsIfP
+stonecutter stOnkutP
+stonecutters stOnkutPz
+stonecypher stOnsIfP
+stonecypher ston@s@fP
+stoned stOnd
+stoneham stOn}
+stonehenge stOnhenj
+stonehill stOnhil
+stonehocker stOnhokP
+stonehouse stOnh?s
+stoneking stOnkiN
+stoneman stOnm~
+stoner stOnP
+stoneridge stOnrij
+stonerock stOnrok
+stones stOnz
+stones' stOnz
+stonesifer ston@s@fP
+stonestreet stOnstrEt
+stonewall stOnw{l
+stonewalled stOnw{ld
+stonewalling stOnw{l6N
+stoneware stOnwer
+stoney stOn/
+stong st{N
+stonge stonj
+stoning stOn6N
+stony stOn/
+stonyfield stOn/fEld
+stood stqd
+stooge stUj
+stooges stUj@z
+stookey stUk/
+stooksbury stUksbcr/
+stool stUl
+stools stUlz
+stoop stUp
+stooped stUpt
+stooping stUp6N
+stoops stUps
+stoots stUts
+stop stop
+stopa stOp@
+stopgap stopgap
+stopher stofP
+stopka stOpk@
+stoplight stoplIt
+stoplights stoplIts
+stopover stopOvP
+stopovers stopOvPz
+stoppage stop6j
+stoppages stop6j@z
+stopped stopt
+stoppel stop@l
+stopper stopP
+stoppers stopPz
+stopping stop6N
+stops stops
+stopwatch stopwoC
+stopwatches stopwoC@z
+stora st{r@
+stora's st{r@z
+storage st{r@j
+storagetek st{r@jtek
+storaska st{ras@
+storbeck st{rbck
+storch st{rk
+storck st{rk
+stordahl st{rdol
+store st{r
+store's st{rz
+stored st{rd
+storefront st{rfront
+storefronts st{rfronts
+storehouse st{rh?s
+storehouse's st{rh?s@z
+storehouses st{rh?z@z
+storekeeper st{rkEpP
+storekeepers st{rkEpPz
+storer st{rP
+storer's st{rPz
+storeroom st{rrUm
+stores st{rz
+stores' st{rz
+storey st{r/
+storfer st{rfP
+storie st{r/
+storied st{r/d
+stories st{r/z
+storing st{r6N
+stork st{rk
+storlie st{rl/
+storm st{rm
+storm's st{rmz
+stormed st{rmd
+storment st{rm~t
+stormer st{rmP
+stormes st{rmz
+stormiest st{rm/@st
+storming st{rm6N
+stormont st{rm]nt
+storms st{rmz
+stormy st{rm/
+storr st{r
+storrow st)r]
+storrs st{rz
+storti st{rt/
+storting st{rt6N
+storts st{rts
+stortz st{rts
+story st{r/
+story's st{r/z
+storyboard st{r/b{rd
+storybook st{r/bqk
+storybooks st{r/bqks
+storyline st{r/lIn
+storylines st{r/lInz
+storyteller st{r/telP
+storytellers st{r/telPz
+storytelling st{r/tel6N
+storz st{rz
+stossel stos@l
+stossel's stos@lz
+stotler stotlP
+stott stot
+stottlemyer stot@lmIP
+stotts stots
+stotz stots
+stoudemire stUd}Ir
+stoudenmire stUd~mIr
+stouder studP
+stoudt studt
+stouffer stOfP
+stouffer stufP
+stouffs stOfs
+stouffs stufs
+stough stuf
+stoughton stOt~
+stoup stUp
+stout st?t
+stoute st?t
+stoutenburg st?t~bPg
+stoutly st?tl/
+stoutness st?tn@s
+stovall stOvol
+stove stOv
+stover stOvP
+stoves stOvz
+stow stO
+stowe stO
+stowed stOd
+stowell stowcl
+stower stOP
+stowers stOPz
+stoy st<
+stoyer st<P
+stracener stras/nP
+strachan straC~
+strack strak
+stracke strak
+strada strod@
+straddle strad@l
+straddled strad@ld
+straddles strad@lz
+straddling stradl6N
+strader strAdP
+stradford stradfPd
+stradivarius strad6v,r/@s
+stradley stradl/
+stradling stradl6N
+strafe strAf
+strafing strAf6N
+straggle strag@l
+straggled strag@ld
+straggler straglP
+stragglers straglPz
+strahan strah~
+strahl strol
+strahle strAh@l
+strahler strolP
+strahm strom
+straight strAt
+straightaway strAt@wA
+straightedge strAtej
+straighten strAt~
+straightened strAt~d
+straightening strAtn6N
+straightening strAt~6N
+straightens strAt~z
+straighter strAtP
+straightforward strAtf{rwPd
+straightforwardly strAtf{rwPdl/
+straights strAts
+strain strAn
+strained strAnd
+straining strAn6N
+strains strAnz
+strait strAt
+straitjacket strAtjak@t
+straits strAts
+straka strok@
+straker strAkP
+straley stral/
+stram stram
+stranahan stran@han
+strand strand
+strandberg strandbPg
+strande strand
+stranded strand@d
+stranding strand6N
+strandline strandlIn
+strandline stranlIn
+strandlines strandlInz
+strandlines stranlInz
+strands strandz
+strang straN
+strange strAnj
+strangelove strAnjluv
+strangely strAnjl/
+strangeness strAnjn@s
+stranger strAnjP
+stranger's strAnjPz
+strangers strAnjPz
+strangest strAnj@st
+strangis stranjis
+strangle straNg@l
+strangled straNg@ld
+stranglehold straNg@lhOld
+strangler straNglP
+strangling straNg@l6N
+strangling straNgl6N
+strangulate straNgy@lAt
+strangulation straNgy@lAS~
+strangulations straNgy@lAS~z
+strangwayes straNwAz
+strano stron]
+stransky stransk/
+strap strap
+strapped strapt
+strapping strap6N
+straps straps
+strasberg strasbPg
+strasbourg strasb{rg
+strasburg strasbPg
+strasburger strasbPgP
+strassburg strasbPg
+strassburger strasbPgP
+strasser strasP
+strassman strasm~
+strassner strasnP
+straszheim strashIm
+strata strat@
+stratacom strat@kom
+stratagems strat@j}z
+stratas strat@z
+strate strAt
+strategem strat6jcm
+strategic str@tEj6k
+strategical str@tEj6k@l
+strategically str@tEj6kl/
+strategies strat@j/z
+strategist strat6j@st
+strategists strat6j@s
+strategists strat6j@ss
+strategists strat6j@sts
+strategize strat@jIz
+strategizing strat@jIz6N
+strategy strat@j/
+strategy's strat@j/z
+strater strAtP
+stratford stratfPd
+strathman straTm~
+stratified strat@fId
+stratify strat@fI
+stratigraphic strat@graf6k
+stratman stratm~
+stratmann stratm~
+stratocaster strat]kastP
+stratoflex strat]fleks
+stratosphere strat@sfir
+stratospheric strat@sfir6k
+stratton strat~
+stratum strat}
+stratus strat@s
+stratus's strat@s@z
+straub str?b
+straube str?b
+strauch str?k
+straughan str{~
+straughn str{n
+straughter str{tP
+straum str?m
+straum strom
+straus str?s
+strausbaugh str?sb?
+strause str?s
+strauser str?sP
+strauss str?s
+strauss's str?s@z
+strausser str?sP
+stravinsky str@vinsk/
+stravinsky's str@vinsk/z
+straw str{
+strawberries str{ber/z
+strawberry str{ber/
+strawbridge str{brij
+strawder str{dP
+strawderman str{dPm~
+strawn str{n
+straws str{z
+strawser str{zP
+stray strA
+strayed strAd
+strayer strAP
+strayhorn strAhPn
+straying strA6N
+strays strAz
+streak strEk
+streaked strEkt
+streaker strEkP
+streaking strEk6N
+streaks strEks
+stream strEm
+streamed strEmd
+streamer strEmP
+streamers strEmPz
+streaming strEm6N
+streamline strEmlIn
+streamlined strEmlInd
+streamlining strEmlIn6N
+streams strEmz
+streater strEtP
+streb streb
+strebe strEb
+strebeck strEbck
+strebel streb@l
+streck strek
+strecker strekP
+streed strEd
+streep strEp
+streeper strEpP
+street strEt
+street's strEts
+streetcar strEtkor
+streeter strEtP
+streeters strEtPz
+streetman strEtm~
+streets strEts
+streett strEt
+streetwise strEtwIz
+streety strEt/
+streff stref
+strege strEj
+strehl strel
+strehle strel
+strehlow strel]
+streib strIb
+streiber strIbP
+streich strIk
+streicher strIkP
+streiff strIf
+streight strAt
+streiker strIkP
+streisand strIsand
+streisand strIz~d
+streisand's strIsandz
+streisand's strIz~dz
+streit strIt
+streitmatter strItm@tP
+strelow strel]
+streng streN
+strenger streNgP
+strength streNT
+strength streNkT
+strengthen streNT~
+strengthened streNT~d
+strengthening streNT~6N
+strengthens streNT~z
+strengths streNTs
+strengths streNkTs
+strenio strEn/]
+strenuous strenyU@s
+strenuously strenyU@sl/
+strep strep
+streps streps
+streptococcus strept@k{k@s
+streptokinase strept@kInAs
+streptokinase strept]kInAz
+stress stres
+stressed strest
+stresses stres@z
+stressful stresf@l
+stressing stres6N
+stressor stresP
+stressors stresPz
+stretch streC
+stretched streCt
+stretcher streCP
+stretcher-bearer streCPb,rP
+stretcher-bearers streCPb,rPz
+stretchers streCPz
+stretches streC@z
+stretching streC6N
+stretto stretO
+strevig strev6g
+strew strU
+strewn strUn
+strey strA
+striar strIr
+stribling stV@b@l6N
+strick strik
+stricken strik~
+stricker strikP
+strickland strikl~d
+stricklen strik@l~
+strickler striklP
+stricklin striklin
+strickling strikl6N
+strict strikt
+stricter striktP
+strictest strikt@st
+strictly striktl/
+stricture strikCP
+strictures strikCPz
+stride strId
+stridency strId~s/
+strident strId~t
+stridently strId~tl/
+strider strIdP
+strides strIdz
+striding strId6N
+strieber strIbP
+striegel strEg@l
+strieker strEkP
+strieker's strEkPz
+strieter strEtP
+strife strIf
+strifes strIfs
+strike strIk
+strike's strIks
+strikebreaker strIkbrAkP
+strikebreakers strIkbrAkPz
+strikeout strIk?t
+strikeouts strIk?ts
+striker strIkP
+strikers strIkPz
+strikers' strIkPz
+strikes strIks
+strikes' strIks
+striking strIk6N
+strikingly strIk6Nl/
+strimple strimp@l
+strinden strind~
+strine strIn
+string striN
+stringed striNd
+stringency strinj~s/
+stringent strinj~t
+stringently strinj~tl/
+stringer striNP
+stringers striNPz
+stringfellow striNfel]
+stringfield striNfEld
+stringham striNham
+stringing striN6N
+strings striNz
+stringy striN/
+strip strip
+strip's strips
+stripe strIp
+striped strIpt
+striper strIpP
+stripers strIpPz
+stripes strIps
+striplin striplin
+stripling stripl6N
+stripped stript
+stripper stripP
+strippers stripPz
+stripping strip6N
+strips strips
+striptease striptEz
+strite strIt
+strittmatter stritm@tP
+strive strIv
+striven striv~
+strives strIvz
+striving strIv6N
+strivings strIv6Nz
+strnad stPnad
+strobe strOb
+strobel strOb@l
+strobel's strOb@lz
+strober strObP
+strobl strob@l
+stroble strOb@l
+strobridge strobr6j
+strock strok
+strode strOd
+stroder strOdP
+stroebel strOb@l
+stroessner strOsnP
+stroganoff strOg~{f
+stroh strO
+strohecker strO6kP
+strohl strOl
+strohm strOm
+strohmaier strOmIP
+strohman strOm~
+strohmeier strOmIP
+strohmeyer strOmIP
+stroik str<k
+strojny strOyn/
+stroke strOk
+stroked strOkt
+strokes strOks
+stroking strOk6N
+strole strOl
+stroll strOl
+strolled strOld
+stroller strOlP
+strollers strOlPz
+strolling strOl6N
+strollo strol]
+strolls strOlz
+strom strom
+stroma strOm@
+stromain stromIn
+stroman strOm~
+strombeck strombek
+stromberg strombPg
+stromboli strombOl/
+stromboli's strombOl/z
+strome strOm
+stromer strOmP
+stromgren stromgrcn
+stromme strom
+strommen strom~
+stromquist stromkwist
+stronach stron@k
+strong str{N
+stronger str{NP
+stronger str{NgP
+strongest str{Ng@st
+stronghold str{NhOld
+strongholds str{NhOldz
+strongly str{Nl/
+strongman str{Nman
+strontium stront/}
+stroock strqk
+stroop strUp
+stroope strUp
+stroot strUt
+strope strOp
+stroschein str{SIn
+strosnider strosnIdP
+strossen str{scn
+strossen str{s~
+strother stroTP
+strothers struTPz
+strothman stroTm~
+stroud str?d
+strough str?
+stroup strUp
+stroupe strUp
+strouse str?s
+strout str?t
+strouth str?T
+strove strOv
+strow strO
+strozier strOz/P
+strub strub
+strubbe strub
+strube strUb
+strubel strUb@l
+struble strUb@l
+struchen struk~
+struck struk
+struckman strukm~
+structural strukCP@l
+structurally strukCP@l/
+structure strukCP
+structure's strukCPz
+structured strukCPd
+structures strukCPz
+structuring strukCP6N
+struebing strqb6N
+struggle strug@l
+struggled strug@ld
+struggles strug@lz
+struggling strug@l6N
+struggling strugl6N
+strum strum
+strumming strum6N
+strums strumz
+strung struN
+strunk struNk
+strunk's struNks
+strupp strup
+struss strus
+strut strut
+struthers struTPz
+struts struts
+strutting strut6N
+strutton strut~
+strutz struts
+struve strUv
+strycharz strihPz
+strychnine striknIn
+stryker strIkP
+strzelecki stVz@letsk/
+strzelecki strez@letsk/
+stu stU
+stuard stUPd
+stuart stUPt
+stuart styUPt
+stuart st{rt
+stuart's stUPts
+stuart's styUPts
+stuart's st{rts
+stuarts stUPts
+stub stub
+stubbe stub
+stubbed stubd
+stubbins stubinz
+stubble stub@l
+stubblefield stub@lfEld
+stubborn stubPn
+stubbornly stubPnl/
+stubbornness stubPn@s
+stubbornness stubPnn@s
+stubbs stubz
+stubby stub/
+stuber stUbP
+stubs stubz
+stucco stuk]
+stuchell stuk@l
+stuck stuk
+stucke stuk
+stucker stukP
+stuckert stukPt
+stuckey stuk/
+stucki stuk/
+stuckman stukm~
+stucky stuk/
+stud stud
+studdard studPd
+studded stud@d
+studds studz
+stude stUd
+studebaker stUd@bAkP
+studeman stUdm~
+studeman stUd}~
+student stUd~t
+student's stUd~ts
+students stUd~ts
+students' stUd~ts
+studer stUdP
+studied stud/d
+studies stud/z
+studio stUd/O
+studio's stUd/Oz
+studios stUd/Oz
+studios' stUd/Oz
+studious stUd/@s
+studiously stUd/@sl/
+studley studl/
+studnicka st@dnisk@
+studs studz
+studstill studstil
+studt studt
+studtgard stutgord
+study stud/
+study's stud/z
+studying stud/6N
+studzinski st@jinsk/
+stuebe stUb
+stueber stqbP
+stueck stUk
+stueve stUv
+stuewe stU
+stuff stuf
+stuff's stufs
+stuff-it stufit
+stuff-it's stufits
+stuffed stuft
+stuffer stufP
+stuffing stuf6N
+stufflebeam stuf@lbEm
+stufflebean stuf@lbEn
+stuffs stufs
+stuffy stuf/
+stuhler stUlP
+stuhr stV
+stuhr stqr
+stuka stUk@
+stukel stUk@l
+stukes stUks
+stukey stuk/
+stull stul
+stuller stulP
+stultify stult@fI
+stultifying stult@fI6N
+stults stults
+stultz stults
+stum stum
+stumbaugh stumb{
+stumble stumb@l
+stumbled stumb@ld
+stumbles stumb@lz
+stumbling stumb@l6N
+stumbling stumbl6N
+stumbo stumb]
+stumm stum
+stump stump
+stumpage stump6j
+stumpe stump
+stumped stumpt
+stumpf stumpf
+stumpff stumpf
+stumph stumf
+stumping stump6N
+stumpo stump]
+stumpp stump
+stumps stumps
+stun stun
+stung stuN
+stunk stuNk
+stunned stund
+stunning stun6N
+stunningly stun6Nl/
+stunt stunt
+stunted stunt@d
+stunts stunts
+stuntz stunts
+stupa stUp@
+stupak stUp@k
+stupar stUpP
+stupay stUpA
+stupendous stUpend@s
+stupid stUp@d
+stupidest stUp@d@st
+stupidity stUpid@t/
+stupidly stUp@dl/
+stupka stupk@
+stupor stUpP
+stupp stup
+stupski stupsk/
+sturbridge stVbrij
+sturc stVk
+sturdevant stVd6v~t
+sturdhal stVdol
+sturdier stVd/P
+sturdiness stVd/n@s
+sturdivant stVd6v~t
+sturdy stVd/
+sturgell stVg@l
+sturgeon stVj~
+sturgeons stVj~z
+sturges stVj@z
+sturgess stVg@s
+sturgill stVg@l
+sturgis stVj@s
+sturkie stVk/
+sturm stVm
+sturman stVm~
+sturmans stVm~z
+sturmer stVmP
+sturn stVn
+sturrock st{r@k
+sturtevant stVt@v~t
+sturtz stVts
+sturza stVz@
+stutes stUts
+stutesman stUtsm~
+stuteville stUtvil
+stutheit stuTIt
+stutler stutlP
+stutner stutnP
+stutsman stutsm~
+stutter stutP
+stuttering stutP6N
+stutters stutPz
+stuttgart StUtgort
+stuttgart stUtgort
+stuttgart stutgPt
+stutts stuts
+stutz stuts
+stutzman stutsm~
+stuve stUv
+stuver stUvP
+stuyvesant stIv@s~t
+sty stI
+styer stIP
+styers stIPz
+style stIl
+styled stIld
+styles stIlz
+styling stIl6N
+stylish stIl6S
+stylishly stIl6Sl/
+stylist stIlist
+stylistic stIlist6k
+stylistically stIlist6kl/
+stylists stIlis
+stylists stIliss
+stylists stIlists
+stylites stilIts
+stylize stIlIz
+stylized stIlIzd
+stylus stIl@s
+stymie stIm/
+stymied stIm/d
+stymies stIm/z
+styne stIn
+styrene stIrEn
+styrofoam stIr@fOm
+styron stIr{n
+stys stis
+styx stiks
+su esyU
+su sU
+suard sUord
+suard sw)rd
+suarez sworez
+suasion swAZ~
+suata sUot@
+suata's sUot@z
+suave swov
+suazo swoz]
+sub sub
+sub's subz
+sub-way subwA
+suba sUb@
+subacute sub@kyUt
+subandrio s@bandr/]
+subaru sUbPU
+subassemblies sub@sembl/z
+subassembly sub@sembl/
+subatomic sub@tom6k
+subbed subd
+subbing sub6N
+subchapter subCaptP
+subcommander subk}andP
+subcommander's subk}andPz
+subcommanders subk}andPz
+subcommittee subk}it/
+subcommittee's subk}it/z
+subcommittees subk}it/z
+subcompact s@bkompakt
+subcompacts s@bkompakts
+subconscious s@bkonS@s
+subconsciously s@bkonS@sl/
+subcontinent s@bkont~~t
+subcontinents s@bkont~~ts
+subcontract s@bkontrakt
+subcontracted s@bkontrakt@d
+subcontracting subk~trakt6N
+subcontractor s@bkontraktP
+subcontractors s@bkontraktPz
+subcontracts s@bkontrakts
+subculture subkulCP
+subcultures subkulCPz
+subdivide subd@vId
+subdivided subd6vId@d
+subdivision subd6viZ~
+subdivisions subd6viZ~z
+subdue s@bdU
+subdued s@bdUd
+subduing s@bdU6N
+suber sUbP
+subfamilies subfam@l/z
+subfamily subfam@l/
+subgroup subgrUp
+subgroups subgrUps
+subhlok sublok
+subhuman subhyUm~
+subia sUbE@
+subic sUb6k
+subject s@bjekt
+subject subj6kt
+subject's subj6kts
+subjected s@bjekt@d
+subjecting s@bjekt6N
+subjective s@bjekt6v
+subjectivity s@bjcktiv@t/
+subjects s@bjekts
+subjects subj6ks
+subjects subj6kts
+subjects' subjcks
+subjects' subjckts
+subjugate subj@gAt
+subjugated subj@gAt@d
+subkingdom s@bkiNd}
+sublease sublEs
+subleasing s@blEs6N
+sublet sublet
+sublett sUblct
+sublime s@blIm
+subliminal s@blim~@l
+subliminally s@blim~@l/
+subluxation s@bl@ksAS~
+subluxations s@bl@ksAS~z
+submachine subm6SEn
+submarine submPEn
+submarine submPEn
+submarine's s@bmPEnz
+submarine's submPEnz
+submarines s@bmPEnz
+submarines submPEnz
+submarines's submPEnz@z
+submerge s@bmVj
+submerged s@bmVjd
+submergence s@bmVj~s
+submerse s@bmVs
+submersed s@bmVst
+submersible s@bmVs@b@l
+submersion s@bmVZ~
+subminimum s@bmin}}
+submission s@bmiS~
+submissions s@bmiS~z
+submissive s@bmis6v
+submit s@bmit
+submits submits
+submitted s@bmit@d
+submitting s@bmit6N
+subnotebook subnOtbqk
+subordinate s@b{rd~@t
+subordinate s@b{rd~At
+subordinated s@b{rd~At@d
+subordinates s@b{rd~@ts
+subordinates s@b{rd~Ats
+subordinating s@b{rd~At6N
+subordination s@b{rd~AS~
+subotnick s@botn6k
+subpar s@bp)r
+subplot subplot
+subplots subplots
+subpoena s@pEn@
+subpoenaed s@pEn@d
+subpoenaing s@pEn@6N
+subpoenas s@pEn@z
+subprincipal s@bprins@p@l
+subprincipals s@bprins@p@lz
+subramanian sUbr}on/~
+subroto sUbrOt]
+subs subz
+subs's subz@z
+subsaharan subs@h,r~
+subscribe s@bskrIb
+subscribed s@bskrIbd
+subscriber s@bskrIbP
+subscriber's s@bskrIbPz
+subscribers s@bskrIbPz
+subscribers' s@bskrIbPz
+subscribes s@bskrIbz
+subscribing s@bskrIb6N
+subscription s@bskripS~
+subscriptions s@bskripS~z
+subsection subsckS~
+subsequent subs@kw~t
+subsequently subs@kw~tl/
+subservience s@bsVv/~s
+subservient s@bsVv/~t
+subset subset
+subside s@bsId
+subsided s@bsId@d
+subsidence s@bsId~s
+subsides s@bsIdz
+subsidiaries s@bsid/er/z
+subsidiaries' subs@dEP/z
+subsidiary s@bsid/er/
+subsidiary's s@bsid/er/z
+subsidies subs@d/z
+subsiding s@bsId6N
+subsidization subs@d@zAS~
+subsidize subs@dIz
+subsidized subs@dIzd
+subsidizes subs@dIz@z
+subsidizing subs@dIz6N
+subsidy subs@d/
+subsist s@bsist
+subsistence s@bsist~s
+subsoil subs<l
+substance subst~s
+substances subst~s@z
+substandard s@bstandPd
+substantial s@bstanC@l
+substantial s@bstanS@l
+substantially s@bstanC@l/
+substantially s@bstanS@l/
+substantiate s@bstanC/At
+substantiate s@bstanS/At
+substantiated s@bstanC/At@d
+substantiated s@bstanS/At@d
+substantiates s@bstanC/Ats
+substantiates s@bstanS/Ats
+substantiation s@bstanC/AS~
+substantiation s@bstanS/AS~
+substantive subst~t6v
+substantively subst~t6vl/
+substation substAS~
+substitute subst@tUt
+substituted subst@tUt@d
+substitutes subst@tUts
+substituting subst@tUt6N
+substitution subst@tUS~
+substitutions subst@tUS~z
+substrate substrAt
+substrates substrAts
+subsurface subsVf@s
+subsystem subsist}
+subsystems subsist}z
+subterfuge subtPfyUj
+subterranean s@btPAn/~
+subtext subtekst
+subtitle subtIt@l
+subtitled subtIt@ld
+subtitles subtIt@lz
+subtle sut@l
+subtler sut@lP
+subtleties sut@lt/z
+subtlety sut@lt/
+subtly sut@l/
+subtract s@btrakt
+subtracted s@btrakt@d
+subtracting s@btrakt6N
+subtraction s@btrakS~
+subtype subtIp
+subtyping subtIp6N
+suburb subPb
+suburb's subPbz
+suburban s@bVb~
+suburbanite s@bVb~It
+suburbanites s@bVb~Its
+suburbanization s@bVb~@zAS~
+suburbanize s@bVb~Iz
+suburbans s@bVb~z
+suburbia s@bVb/@
+suburbs subPbz
+subversion s@bvVZ~
+subversive s@bvVs6v
+subversives s@bvVs6vz
+subvert s@bvVt
+subverted s@bvVt@d
+subverting s@bvVt6N
+subverts s@bvVts
+subvolcanic subvolkan6k
+subway subwA
+subways subwAz
+subzero subzEr]
+subzero subzir]
+succeed s@ksEd
+succeeded s@ksEd@d
+succeeding s@ksEd6N
+succeeds s@ksEdz
+success s@kses
+successes s@kses@z
+successful s@ksesf@l
+successfully s@ksesf@l/
+succession s@kseS~
+successive s@kses6v
+successively s@kses6vl/
+successor s@ksesP
+successors s@ksesPz
+succinct s@ksiNkt
+succinctly s@ksiNktl/
+succor sukP
+succulent suky@l~t
+succulents suky@l~ts
+succumb s@kum
+succumbed s@kumd
+succumbing s@kum6N
+succumbs s@kumz
+such suC
+suchan suC~
+suchanek suk~6k
+suchard sUS)rd
+sucharski s@k)rsk/
+suchecki s@kek/
+sucher suCP
+suchinda sUCind@
+suchocki s@kok/
+suchomel suk]mel
+suchy suC/
+suck suk
+sucked sukt
+sucker sukP
+suckered sukPd
+suckers sukPz
+sucking suk6N
+suckle suk@l
+suckling sukl6N
+suckow suk?
+suckrow sukr]
+sucks suks
+sucralose sUkr@lOs
+sucre sUkP
+sucrose sUkr]s
+suction sukS~
+suda sUd@
+sudafed sUd@fed
+sudan sUdan
+sudan's sUdanz
+sudanese sUd~Ez
+sudano sUdon]
+sudbeck sudbek
+sudberry sudber/
+sudbury sudber/
+sudbury's sudber/z
+sudd sud
+suddam sudom
+suddam's sudomz
+suddarth sudorT
+suddath sud@T
+sudden sud~
+suddenly sud~l/
+suddenness sud~n@s
+sudderth sudPT
+suddeth sudcT
+suddreth sudrcT
+sudduth sud@T
+suder sUdP
+suderman sUdPm~
+sudler sUd@lP
+sudol sUd@l
+suds sudz
+sue sU
+sued sUd
+suede swAd
+suedes swAdz
+sueker sUkP
+suen sUn
+sues sUz
+suess swis
+suey sU/
+suez sUcz
+suez's sUcz@z
+suffer sufP
+suffered sufPd
+sufferer sufPP
+sufferers sufPPz
+suffering sufP6N
+suffering sufr6N
+sufferings sufP6Nz
+suffern sufPn
+suffers sufPz
+suffice s@fIs
+sufficed s@fIst
+suffices s@fIs@z
+sufficiency s@fiS~s/
+sufficient s@fiS~t
+sufficiently s@fiS~tl/
+suffield suf/ld
+suffield's suf/ldz
+suffix suf6ks
+suffocate suf@kAt
+suffocated suf@kAt@d
+suffocating suf@kAt6N
+suffocation suf@kAS~
+suffolk suf@k
+suffrage sufr6j
+suffragette sufr@jet
+suffragettes sufr@jets
+suffragist sufr@jist
+suffragists sufr@jis
+suffragists sufr@jiss
+suffragists sufr@jists
+suffuse s@fyUz
+suffused s@fyUzd
+sugar SqgP
+sugar's SqgPz
+sugared SqgPd
+sugarman SqgPm~
+sugars SqgPz
+sugary SqgP/
+sugden sugd~
+sugerman sUgPm~
+sugg sug
+suggest s@gjest
+suggested s@gjest@d
+suggestible s@gjest@b@l
+suggesting s@gjest6N
+suggestion s@gjesC~
+suggestions s@gjesC~z
+suggestive s@gjest6v
+suggestiveness s@gjest6vn@s
+suggests s@gjes
+suggests s@gjess
+suggests s@gjests
+suggs sugz
+sugihara sUg/h)r@
+sugimoto sUg/mOt]
+sugiyama sUg/yom@
+sugrue sugrU
+suh su
+suharto sUh)rt]
+suharto's sUh)rt]z
+suhler sUlP
+suhm sUm
+suhr sqr
+suhre sqr
+suhua sUhwo
+suhud sUhqd
+sui sU/
+sui sw/
+suicidal sU@sId@l
+suicide sU@sId
+suicides sU@sIdz
+suing sU6N
+suire sqr
+suisse swEs
+suisse swis
+suisse's swEs@z
+suisse's swis@z
+suit sUt
+suit's sUts
+suitability sUt@bil@t/
+suitable sUt@b@l
+suitably sUt@bl/
+suitcase sUtkAs
+suitcases sUtkAs@z
+suite swEt
+suited sUt@d
+suiter sUtP
+suites swEts
+suitor sUtP
+suitor's sUtPz
+suitors sUtPz
+suits sUts
+suitt sUt
+suk suk
+sukarno sUk)rn]
+sukarno's sUk)rn]z
+sukey sUk/
+sukharev sukhP@v
+sukhumi sUkhUm/
+suki sUk/
+sukiyaki sUk/ok/
+sukru sUkrU
+sukru sqkrU
+sukthankar sUktoNkor
+sukup sUk@p
+sul sul
+sulak sUl@k
+sulawesi sUl@wes/
+sulcer sulsP
+sulek sUl6k
+suleski syUlesk/
+sulewski syUlefsk/
+suleyman sUl/m~
+sulfa sulf@
+sulfate sulfAt
+sulfide sulfId
+sulfite sulfIt
+sulfites sulfIts
+sulfur sulfP
+sulfuric s@lfyqr6k
+sulgrave sulgrAv
+sulik sUl6k
+sulk sulk
+sulked sulkt
+sulking sulk6N
+sulkowski s@lk{fsk/
+sullen sul~
+sullenberger sul~bPgP
+sullenger sUl~jP
+sullens sul~z
+sullie sul/
+sullied sul/d
+sullinger sul6NP
+sullins sulinz
+sullivan sul@v~
+sullivan's sul6v~z
+sullivans sul6v~z
+sullivant sul6v~t
+sullo sUl]
+sully sul/
+sulpetro sUlpetr]
+sulphate sulfAt
+sulphates sulfAts
+sulphur sulfP
+sulser sulsP
+sult sult
+sultan sult~
+sultan's sult~z
+sultanate sult~@t
+sultans sult~z
+sulton sult~
+sultry sultr/
+sulya sUly@
+sulzbach sulzbok
+sulzberger sultsbPgP
+sulzer sulzP
+sum sum
+suma sUm@
+sumac sUmak
+suman sUm~
+sumarlin sUm)rlin
+sumatoma sUm@tOm@
+sumatomo sUm@tOm]
+sumatra sUmotr@
+sumatran sUmotr~
+sumeria s}V/@
+sumerlin sumPlin
+sumgait s}gAt
+sumida sUmEd@
+suminski s}insk/
+sumita sUmEt@
+sumita's sUmEt@z
+sumitomo sUm@tOm]
+sumitomo's sUm@tOm]z
+sumler sumlP
+sumlin sumlin
+summa sUm@
+summagraphic sum@graf6k
+summagraphics sum@graf6ks
+summar sumP
+summaries sumP/z
+summarily s},r@l/
+summarize sumPIz
+summarized sumPIzd
+summarizes sumPIz@z
+summarizing sumPIz6N
+summary sumP/
+summation s}AS~
+summations s}AS~z
+summcorp sumk{rp
+summed sumd
+summer sumP
+summer's sumPz
+summerall sumP{l
+summerfield sumPfEld
+summerford sumPfPd
+summerhill sumPhil
+summerlin sumPlin
+summerour sumPP
+summers sumPz
+summers's sumPz@z
+summerson sumPs~
+summertime sumPtIm
+summerville sumPvil
+summey sum/
+summing sum6N
+summit sum@t
+summit's sum@ts
+summiteer sum@tir
+summiteers sum@tirz
+summitry sum@tr/
+summits sum@ts
+summitt sum@t
+summitville sum@tvil
+summon sum~
+summoned sum~d
+summoning sum~6N
+summons sum~z
+summonsed sum~zd
+summonses sum~z@z
+summor's sumPz
+summum sum}
+summy sum/
+sumner sumnP
+sumners sumnPz
+sumo sUm]
+sump sump
+sumpter sumptP
+sumptuous sumpCU@s
+sumptuous sumpCw@s
+sumrall sumr@l
+sumrell sUmrAl
+sumrow sumrO
+sums sumz
+sumter sumtP
+sun sun
+sun's sunz
+sunamerica sun},r@k@
+sunau sUn?
+sunbath sunbaT
+sunbathe sunbAT
+sunbathing sunbAT6N
+sunbeam sunbEm
+sunbeam's sunbEmz
+sunbelt sunbelt
+sunbelt's sunbelts
+sunbird sunbVd
+sunbirds sunbVdz
+sunburn sunbVn
+sunburned sunbVnd
+suncoast sunkOst
+suncook sunkqk
+suncor sunk{r
+sund sund
+sundae sundA
+sundae's sundAz
+sundahl sundol
+sundai s~dI
+sundance sundans
+sundar sUndor
+sundararajan sUndor@roj~
+sunday sundA
+sunday sundE
+sunday's sundAz
+sunday's sundEz
+sundays sundAz
+sundays sundEz
+sundberg sundbPg
+sundby sundb/
+sunde sund
+sundeen sund/n
+sundell sund@l
+sunder sundP
+sunderland sundPl~d
+sunderlin sundPlin
+sunderman sundPm~
+sundermeyer sundPmIP
+sundews sundUz
+sundheim sundhIm
+sundial sundIl
+sundin sund~
+sundlun sundl~
+sundown sund?n
+sundquist sundkwist
+sundry sundr/
+sundstrand sundstrand
+sundstrom sundstr}
+sundt sunt
+sundy sund/
+sunfire sunfIr
+sunfish sunfiS
+sunflower sunfl?P
+sunflowers sunfl?Pz
+sung suN
+sung's suNz
+sungard sungord
+sungard's sungordz
+sunglass sunglas
+sunglasses sunglas@z
+sungroup sungrUp
+sunia sUn/@
+suniga sUnEg@
+sunil sUnil
+sunk suNk
+sunken suNk~
+sunkist sunkist
+sunland sunland
+sunlight sunlIt
+sunlit sunlit
+sunlite sunlIt
+sunni sUn/
+sunning sun6N
+sunnis sqnEz
+sunny sun/
+sunnyside sun/sId
+sunnyvale sun/vAl
+sunobe sUnOb/
+sunobe's sUnOb/z
+sunoco s~Ok]
+sunpoint sunp<nt
+sunrise sunrIz
+sunrise's sunrIz@z
+sunroof sunrUf
+sunroom sunrUm
+suns sunz
+sunscreen s~skrEn
+sunscreens s~skrEnz
+sunseri s~s,r/
+sunset sunset
+sunsets sunsets
+sunshine sunSIn
+sunshine's sunSInz
+sunshiny sunSIn/
+sunspot sunspot
+sunspots sunspots
+sunstar sunstor
+sunstate sunstAt
+sunstates sunstAts
+sunsweet sunswEt
+sunsweet's sunswEts
+suntan suntan
+sunter suntP
+suntory sunt{r/
+suntrust suntrust
+suntrust's suntrusts
+sununu s~UnU
+sununu's s~UnUz
+sunup sun@p
+sunward sunwPd
+sunworld sunwVld
+sunworld's sunwVldz
+suny sUnE
+suon sU{n
+sup sup
+supak sUp@k
+supan sUp~
+super sUpP
+superabrasive sUpP@brAs6v
+superabrasives sUpP@brAs6vz
+superamerica sUpP},r6k@
+superb sqpVb
+superbar sUpPbor
+superbly sUpPbl/
+superbowl sUpPbOl
+superbowl's sUpPbOlz
+superbowls sUpPbOlz
+supercenter sUpPsentP
+supercenters sUpPsentPs
+supercharge sUpPC)rj
+supercharged sUpPC)rjd
+supercilious sUpPsil/@s
+supercollider sUpPk@lIdP
+supercomputer sUpPk}pyUtP
+supercomputers sUpPk}pyUtPz
+supercomputing sUpPk}pyUt6N
+superconducting sUpPk~dukt6N
+superconductive sUpPk~dukt6v
+superconductivity sUpPkonduktiv@t/
+superconductor sUpPk~duktP
+superconductors sUpPk~duktPz
+supercool sUpPkUl
+supercooled sUpPkUld
+supercut sUpPkut
+supercuts sUpPkuts
+superdelegate sUpPdel@g@t
+superdelegates sUpPdel@g@ts
+superdome sUpPdOm
+superdot sUpPdot
+superdrug sUpPdrug
+superfamily sUpPfaml/
+superfan sUpPfan
+superfast sUpPfast
+superficial sUpPfiS@l
+superficially sUpPfiS@l/
+superficially sUpPfiS@ll/
+superfluidity sUpPflUid@t/
+superfluous sUpPflwus
+superfon sUpPf~
+superfreighter sUpPfrAtP
+superfreighters sUpPfrAtPz
+superfund sUpPfund
+supergiant sUpPjI~t
+supergiants sUpPjI~ts
+superheated sUpPhEt@d
+superhero sUpPhEr]
+superheroes sUpPhEr]z
+superheterodyne sUpPhetP@dIn
+superhighway sUpPhIwA
+superhighways sUpPhIwAz
+superhuman sUpPhyUm~
+superimpose sUpP}pOz
+superimposed sUpP}pOzd
+superintendant sUpP~tend~t
+superintendent sUpP~tend~t
+superintendent's sUpP~tend~ts
+superintendents sUpP~tend~ts
+superior sUpir/P
+superior's sUpEr/Pz
+superiority sUp6r/{r@t/
+superiors sUpir/Pz
+superlative sqpVl@t6v
+superlatives sqpVl@t6vz
+supermac sUpPmak
+supermajority sUpPm@j{r@t/
+superman sUpPman
+superman's sUpPmanz
+supermarket sUpPmork6t
+supermarket's sUpPmork@ts
+supermarkets sUpPmork@ts
+superminicomputer sUpPmin/k}pyUtP
+superminicomputers sUpPmin/k}pyUtPz
+supermodel sUpPmod@l
+supermodels sUpPmod@lz
+supernatural sUpPnaCP@l
+supernaturalism sUpPnaCP@liz}
+supernova sUpPnOv@
+superoxide sUpPoksId
+superpower sUpPp?P
+superpowers sUpPp?Pz
+superpowers' sUpPp?rz
+superpremium sUpPprEm/}
+superpremium sUpPprEmy}
+superregional sUpPrEj~@l
+superregionals sUpPrEj~@lz
+superregionals' sUpPrEj~@lz
+supers sUpPz
+supersaver sUpPsAvP
+supersecret sUpPsEkr@t
+supersede sUpPsEd
+superseded sUpPsEd@d
+supersedes sUpPsEdz
+superseding sUpPsEd6N
+supersonic sUpPson6k
+superstar sUpPst)r
+superstars sUpPst)rz
+superstation sUpPstAS~
+superstition sUpPstiS~
+superstitions sUpPstiS~z
+superstitious sUpPstiS@s
+superstore sUpPst{r
+superstores sUpPst{rz
+superstructure sUpPstrukCP
+superstructures sUpPstrukCPz
+supertanker sUpPtaNkP
+supervalu sUpPvalyU
+supervise sUpPvIz
+supervised sUpPvIzd
+supervises sUpPvIz@z
+supervising sUpPvIz6N
+supervision sUpPviZ~
+supervisor sUpPvIzP
+supervisors sUpPvIzPz
+supervisors' sUpPvIzPz
+supervisory sUpPvIzP/
+supervoting sUpPvOt6N
+superwoman sUpPwqm~
+superwomen sUpPwimcn
+superx sUpPeks
+supine s@pIn
+supine sUpIn
+supinski s@pinsk/
+suppa sUp@
+supper supP
+suppers supPz
+suppes sups
+supplant s@plant
+supplanted s@plant@d
+supplanting s@plant6N
+supple sup@l
+supplee supl/
+supplement supl}ent
+supplement supl}~t
+supplemental supl}en@l
+supplemental supl}ent@l
+supplementary supl}enCr/
+supplementary supl}enP/
+supplementary supl}entP/
+supplementary supl}entr/
+supplemented supl}ent@d
+supplementing supl}ent6N
+supplementing supl}~t6N
+supplements supl}ents
+supplements supl}~ts
+supplicant supl@k~t
+supplied s@plId
+supplier s@plIP
+supplier's s@plIPz
+suppliers s@plIPz
+suppliers' s@plIPz
+supplies s@plIz
+supply s@plI
+supply's s@plIz
+supplying s@plI6N
+support s@p{rt
+supportable s@p{rt@b@l
+supported s@p{rt@d
+supporter s@p{rtP
+supporters s@p{rtPz
+supporting s@p{rt6N
+supportive s@p{rt6v
+supports s@p{rts
+suppose s@pOz
+supposed s@pOzd
+supposedly s@pOz@dl/
+supposes s@pOz@z
+supposing s@pOz6N
+supposition sup@ziS~
+suppositions sup@ziS~z
+suppress s@pres
+suppressant s@pres~t
+suppressed s@prest
+suppresses s@pres@z
+suppressing s@pres6N
+suppression s@preS~
+suppressor s@presP
+supra sUpr@
+supranational sUpr~aS~@l
+supremacist sUprem@s@st
+supremacists sUprem@s@s
+supremacists sUprem@s@ss
+supremacists sUprem@s@sts
+supremacy s@prem@s/
+supreme s@prEm
+supreme sPprEm
+supremely sUprEm@l/
+supremes sUprEmz
+suprenant sUprAn~t
+suprisingly sUprIz6Nl/
+suprisingly sVprIz6Nl/
+sur sV
+sura sqr@
+surace sqrosA
+surat sPot
+surat's sPots
+surbaugh sVb{
+surber sVbP
+surcharge sPC)rj
+surcharge sVCorj
+surcharges sVCorj@z
+sure Sqr
+surely Sqrl/
+suren sqr~
+surer SqrP
+sures Sqrz
+suresh sPeS
+surest Sqr@st
+surette sPet
+surety Sqr@t/
+surf sVf
+surf's sVfs
+surface sVf@s
+surfaced sVf@st
+surfaceness sVf@sn@s
+surfaces sVf@s@z
+surfacing sVf@s6N
+surfactant sPfakt~t
+surfboard sVfb{rd
+surfboards sVfb{rdz
+surfed sVft
+surfeit sVf@t
+surfer sVfP
+surfers sVfPz
+surfing sVf6N
+surge sVj
+surged sVjd
+surgeon sVj~
+surgeon's sVj~z
+surgeons sVj~z
+surgeons' sVj~z
+surgeries sVjP/z
+surgery sVjP/
+surges sVj@z
+surgical sVj6k@l
+surgical's sVj6k@lz
+surgically sVj6k@l/
+surgically sVj6kl/
+surging sVj6N
+suriano sqr/on]
+surinam sqr~om
+suriname sV~om
+surles s{r@lz
+surly sVl/
+surma sVm@
+surman sVm~
+surmise sPmIz
+surmised sPmIzd
+surmises sPmIz@z
+surmount sPm?nt
+surmounted sPm?nt@d
+surmounting sPm?nt6N
+surname sVnAm
+surnames sVnAmz
+surowiec sP?/k
+surpass sPpas
+surpassed sPpast
+surpasses sPpas@z
+surpassing sPpas6N
+surplus sVpl@s
+surpluses sVpl@s@z
+surprenant sVpr~~t
+surprise s@prIz
+surprise sPprIz
+surprised s@prIzd
+surprised sPprIzd
+surprises s@prIz@z
+surprises sPprIz@z
+surprising s@prIz6N
+surprising sPprIz6N
+surprisingly s@prIz6Nl/
+surprisingly sPprIz6Nl/
+surratt s{r@t
+surreal sPEl
+surrealism sPE@liz}
+surrealism sPEliz}
+surrealism's sPE@liz}z
+surrealism's sPEliz}z
+surrealisms sPE@liz}z
+surrealisms sPEliz}z
+surrealistic sPE@list6k
+surrealistic sPElist6k
+surrebuttal sV/b@t@l
+surrebuttal sV@b@t@l
+surrell s{r@l
+surrency s{r~s/
+surrender sPendP
+surrendered sPendPd
+surrendering sPendP6N
+surrenders sPendPz
+surreptitious sV@ptiS@s
+surreptitiously sV@ptiS@sl/
+surrett s{rct
+surrette sPet
+surrey sV/
+surrogacy sV@g@s/
+surrogate sV@g@t
+surrogate sV@gAt
+surrogates sV@g@ts
+surrogates sV@gAts
+surround sP?nd
+surrounded sP?nd@d
+surrounding sP?nd6N
+surroundings sP?nd6Nz
+surrounds sP?ndz
+surry sV/
+surtax sVtaks
+surtaxes sVtaks@z
+surveil sPvAl
+surveillance sPvAl~s
+surveilling sPvAl6N
+survey sPvA
+survey sVvA
+survey's sPvAz
+survey's sVvAz
+surveyed sPvAd
+surveyed sVvAd
+surveying sPvA6N
+surveying sVvA6N
+surveyor sPvAP
+surveyor sVvAP
+surveyors sPvAPz
+surveyors sVvAPz
+surveys sPvAz
+surveys sVvAz
+survivability sPvIv@bil@t/
+survivable sPvIv@b@l
+survival sPvIv@l
+survivalist sPvIv@l@st
+survivalists sPvIv@l@s
+survivalists sPvIv@l@ss
+survivalists sPvIv@l@sts
+survive sPvIv
+survived sPvIvd
+survives sPvIvz
+surviving sPvIv6N
+survivor sPvIvP
+survivor's sPvIvPz
+survivors sPvIvPz
+sus sus
+susa sUs@
+susan sUz~
+susan's sUz~z
+susana sUson@
+susann sUzan
+susanna sUzan@
+susannah sUsan@
+susanne sUzan
+susceptibility s@sept@bil@t/
+susceptible s@sept@b@l
+susette sUzet
+sushi sUS/
+susi sUs/
+susie sUz/
+susie's sUz/z
+suski susk/
+suskind suskind
+susko susk]
+susman susm~
+susong sus{N
+suspect s@spekt
+suspect suspekt
+suspect's s@spekts
+suspected s@spekt@d
+suspecting s@spekt6N
+suspects s@speks
+suspects s@spekts
+suspects suspeks
+suspects suspekts
+suspects' suspekts
+suspend s@spend
+suspended s@spend@d
+suspender s@spendP
+suspenders s@spendPz
+suspending s@spend6N
+suspends s@spendz
+suspense s@spens
+suspenseful s@spensf@l
+suspension s@spenS~
+suspensions s@spenS~z
+suspicion s@spiS~
+suspicions s@spiS~z
+suspicious s@spiS@s
+suspiciously s@spiS@sl/
+susquehanna sUskwchan@
+susquehanna's sUskwchan@z
+suss sus
+susser susP
+sussex sus6ks
+susskind suskind
+sussman susm~
+susswein suswEn
+susswein suswIn
+sustain s@stAn
+sustainability s@stAn@bil@t/
+sustainable s@stAn@b@l
+sustained s@stAnd
+sustaining s@stAn6N
+sustains s@stAnz
+sustaita sUstAt@
+sustenance sust~~s
+susteren s@st,r~
+susumu sUsUmU
+susy sUz/
+sutch suC
+sutcliff sutklif
+sutcliffe sutklif
+suter sUtP
+sutera sUt,r@
+sutfin sutfin
+suthard suTPd
+suther suTP
+sutherland suTPl~d
+sutherlin suTPlin
+suthers suTPz
+sutley sutl/
+sutliff sutlif
+sutner sutnP
+sutnick sutn6k
+suto sUt]
+sutor sUtP
+sutphen sutf~
+sutphin sutfin
+sutro sUtr]
+sutro's sUtr]z
+sutter sutP
+suttle sut@l
+suttles sut@lz
+suttmeier sutmIr
+sutton sut~
+sutton's sut~z
+suture sUCP
+sutures sUCPz
+suu esyUyU
+suu sU
+suva sUv@
+suydam sId}
+suzanna sUzan@
+suzanne sUzan
+suzette sUzet
+suzhou sUzhO
+suzie suz/
+suzman sUzm~
+suzuana sUzUon@
+suzuki s@zUk/
+suzy sUz/
+suzy's sUz/z
+svec svek
+svehla svel@
+svelte svelt
+sven sven
+svendsen svends~
+svenska svensk@
+svenson svens~
+svensson svens~
+sverdlovsk svVdlovsk
+sverige sv,r6j
+svetlana svetlon@
+svetlik svetl6k
+svitak svit@k
+svizzera sviz,r@
+svoboda sv]bOd@
+svoray sv{rA
+swab swob
+swabs swobz
+swaby swob/
+swackhamer sw{kamP
+swader swAdP
+swadley swodl/
+swafford swofPd
+swager swAgP
+swagerty swajPt/
+swaggart swagPt
+swagger swagP
+swaggering swagP6N
+swaggerty swagPt/
+swahili swohEl/
+swailes swAlz
+swails swAlz
+swaim swAm
+swain swAn
+swaine swAn
+swainston swAnst~
+swales swAlz
+swalley sw{l/
+swallow swol]
+swallowed swol]d
+swallowing swol]6N
+swallows swol]z
+swam swam
+swami swom/
+swaminathan swom~oT~
+swamp swomp
+swampbuster swompbustP
+swamped swompt
+swamper swompP
+swampers swompPz
+swamping swomp6N
+swamps swomps
+swampy swomp/
+swan swon
+swanberg swonbPg
+swanda swond@
+swander swondP
+swanee swonE
+swaner sw{nP
+swaney sw{n/
+swanger sw{NP
+swango swoNg]
+swanigan swon6g~
+swank swaNk
+swanke sw{Nk
+swanky swoNk/
+swann swon
+swann's swonz
+swanner swonP
+swans swonz
+swanson swons~
+swanstrom swonstr}
+swantek sw{nt6k
+swanton swont~
+swanzy swonz/
+swap swop
+swape swAp
+swapes swAps
+swapo swop]
+swapo's swop]z
+swapp swop
+swapped swopt
+swapping swop6N
+swaps swops
+sward sw)rd
+swaringen sw,r6N~
+swarm sw{rm
+swarmed sw{rmd
+swarming sw{rm6N
+swarms sw{rmz
+swarner sw{rnP
+swarovski sworovsk/
+swart sw{rt
+swarthmore sw{rTm{r
+swarthout sw{rT?t
+swarthy sw{rT/
+swarthy sw{rT/
+swartley sw{rtl/
+swartout sw{rt@t
+swarts sw{rts
+swartwood sw{rtwqd
+swartwout sw{rtw?t
+swartz Sw{rts
+swartz sw{rts
+swartzbaugh sw{rtsbo
+swartzendruber sw{rts~drUbP
+swartzentruber sw{rts~trUbP
+swartzlander sw{rtslandP
+swartzwelder sw{rtsweldP
+swasey swoz/
+swashbuckling swoSbukl6N
+swastika swost6k@
+swastikas swost6k@z
+swat swot
+swatch swoC
+swatched swoCt
+swatches swoC@z
+swatching swoC6N
+swatek sw{t6k
+swath swoT
+swathe swAT
+swathe swoT
+swathed swoTd
+swatow swotO
+swatted swot@d
+swatzell sw{tz@l
+swauger sw?gP
+swavely swAvl/
+sway swA
+swayed swAd
+swaying swA6N
+swayne swAn
+sways swAz
+swayze swAz
+swayze swAz/
+swazi swoz/
+swaziland swozil~d
+sweaney swEn/
+sweany swEn/
+swear sw,r
+swearengen swir6N~
+swearengin sw,r6N~
+swearing sw,r6N
+swearingen sw,r6N~
+swearingin sw,r6N~
+swears sw,rz
+sweat swet
+sweated swet@d
+sweater swetP
+sweaters swetPz
+sweatin' swet~
+sweating swet6N
+sweatman swEtm~
+sweatpants swetpants
+sweats swets
+sweatshirt swetSVt
+sweatshirts swetSVts
+sweatshop swetSop
+sweatshops swetSops
+sweatsuit swetsUt
+sweatt swEt
+sweaty swet/
+sweazy swEz/
+swecker swekP
+swed swed
+sweda swEd@
+swedberg swedbPg
+swede swEd
+sweden swEd~
+sweden's swEd~z
+swedes swEdz
+swedish swEdiS
+swedlund swedl~d
+sweeden swEd~
+sween swEn
+sweeney swEn/
+sweeny swEn/
+sweep swEp
+sweeper swEpP
+sweepers swEpPz
+sweeping swEp6N
+sweeps swEps
+sweepstake swEpstAk
+sweepstakes swEpstAks
+sweers swirz
+sweet swEt
+sweeten swEt~
+sweetened swEt~d
+sweetener swEtnP
+sweetener swEt~P
+sweeteners swEtnPz
+sweeteners swEt~Pz
+sweetening swEtn6N
+sweetening swEt~6N
+sweetens swEt~z
+sweeter swEtP
+sweetest swEt@st
+sweetheart swEthort
+sweethearts swEthorts
+sweetie swEt/
+sweeting swEt6N
+sweetland swEtl~d
+sweetly swEtl/
+sweetman swEtm~
+sweetness swEtn@s
+sweeton swEt~
+sweets swEts
+sweetser swEtsP
+sweetwater swEtwotP
+sweezey swEz/
+sweezy swEz/
+sweger swEgP
+swehla swel@
+sweig swIg
+sweigard swIgPd
+sweigart swEgort
+sweigert swIgPt
+sweitzer swItzP
+swell swel
+swelled sweld
+swelling swel6N
+swells swelz
+swelter sweltP
+sweltering sweltP6N
+swem swem
+swendsen swends~
+swenet swen@t
+sweney swen/
+swensen swens~
+swensen's swens~z
+swenson swens~
+swept swept
+swerdlow swVdl?
+swergold swVgOld
+swerling swVl6N
+swerve swVv
+swerved swVvd
+swete swEt
+swetland swetl~d
+swetnam swetn}
+swett swet
+swetz swets
+swezey swez/
+swiatek sv/otck
+swiatkowski sv/@tk{fsk/
+swicegood swis6gqd
+swick swik
+swickard swikPd
+swider swIdP
+swiderski sv@dVsk/
+swiderski sw@dVsk/
+swiech swEC
+swier swIP
+swift swift
+swift's swifts
+swifter swiftP
+swiftest swift@st
+swiftly swiftl/
+swiftness swiftn@s
+swifts swifts
+swig swig
+swigart swigort
+swiger swIgP
+swigert swigPt
+swiggum swig}
+swihart swihort
+swill swil
+swilley swil/
+swilling swil6N
+swillinger swil6NP
+swim swim
+swimmer swimP
+swimmers swimPz
+swimming swim6N
+swims swimz
+swimsuit swimsUt
+swimsuits swimsUts
+swimwear swimwer
+swinburne's swinbPnz
+swinburnes swinbPnz
+swindall swind@l
+swindell swind@l
+swindle swind@l
+swindled swind@ld
+swindlehurst swind@lhPst
+swindler swind@lP
+swindlers swindlPz
+swindles swind@lz
+swindling swindl6N
+swine swIn
+swineford swinfPd
+swinehart swInhort
+swiney swIn/
+swinford swinfPd
+swing swiN
+swinger swiNP
+swingers swiNPz
+swinging swiN6N
+swingle swiNg@l
+swingler swiNg@lP
+swingley swiNgl/
+swings swiNz
+swink swiNk
+swinney swin/
+swinson swins~
+swint swint
+swinton swint~
+swipe swIp
+swiped swIpt
+swipes swIps
+swiping swIp6N
+swire swIr
+swirl swVl
+swirled swVld
+swirling swVl6N
+swirls swVlz
+swirsky swVsk/
+swish swiS
+swished swiSt
+swisher swiSP
+swishes swiS@z
+swiss swis
+swissair swis,r
+swisshelm swiS@lm
+swisshelm swishclm
+swistak swist@k
+switaj switI
+switala sw@tol@
+switalski sw@tolsk/
+switch swiC
+switchblade swiCblAd
+switchblades swiCblAdz
+switchboard swiCb{rd
+switchboards swiCb{rdz
+switched swiCt
+switcher swiCP
+switchers swiCPz
+switches swiC@z
+switching swiC6N
+switzer switsP
+switzerland switsPl~d
+switzerland's switsPl~dz
+swivel swiv@l
+swiveling swiv@l6N
+swiveling swivl6N
+swivels swiv@lz
+swoboda sw]bOd@
+swofford swofPd
+swogger swogP
+swollen swOl~
+swonger sw{NP
+swoon swUn
+swooned swUnd
+swooning swUn6N
+swoop swUp
+swoope swUp
+swooped swUpt
+swooping swUp6N
+swoops swUps
+swoosh swUS
+swooshed swUSt
+swope swOp
+swopes swOps
+swor swV
+sword s{rd
+swordfish s{rdfiS
+swordfish's s{rdfiS@z
+swordlike s{rdlIk
+swordplay s{rdplA
+swordplays s{rdplAz
+swords s{rdz
+swore sw{r
+sworn sw{rn
+swoveland swOvl~d
+swoyer sw<P
+swum swum
+swung swuN
+swyers swIPz
+swygert swigPt
+sy sI
+sybase sIbAs
+sybase's sIbAs@z
+sybert sibPt
+sybil sib@l
+sybilla sibil@
+sybille sib@l
+sybron sibr~
+sycamore sik}{r
+sycara s6k)r@
+sycophantic sik@fant6k
+syd sid
+sydell sIdel
+syders sIdPz
+syders' sIdPz
+sydney sidn/
+sydney's sidn/z
+sydnor sidnP
+sydow sid]
+syed sId
+syers sIPz
+syfert sifPt
+sykes sIks
+sykora s6k{r@
+syler sIlP
+sylla sil@
+syllabic s@lab6k
+syllable sil@b@l
+syllables sil@b@lz
+syllabus sil@b@s
+sylmar silmor
+sylva silv@
+sylvain silvAn
+sylvan silv~
+sylvana silvan@
+sylvania silvAn/@
+sylvanus silv~@s
+sylvest silvA@st
+sylvester silvestP
+sylvestre silvestP
+sylvia silv/@
+sylvia's silv/@z
+sylvie silv/
+sylvio silv/]
+sylvio's silv/]z
+sylvite silvIt
+sym sim
+symanski s}ansk/
+symantec simantek
+symantec's simanteks
+symbion simb/~
+symbion's simb/~z
+symbiosis simbIOs@s
+symbiotic simb/ot6k
+symbol simb@l
+symbol's simb@lz
+symbolic simbol6k
+symbolically simbol6k@l/
+symbolically simbol6kl/
+symbolics simbol6ks
+symbolism simb@liz}
+symbolists simb@l@s
+symbolists simb@l@ss
+symbolists simb@l@sts
+symbolize simb@lIz
+symbolized simb@lIzd
+symbolizes simb@lIz@z
+symbolizing simb@lIz6N
+symbols simb@lz
+syme sIm
+symes sImz
+symington sim6Nt~
+symmes simz
+symmetrical s}etr6k@l
+symmetrically s}etr6kl/
+symmetry sim@tr/
+symmonds sim~dz
+symms simz
+symon sim~
+symonds sim~dz
+symons sim~z
+sympathetic simp@Tet6k
+sympathetically simp@Tet6k@l/
+sympathetically simp@Tet6kl/
+sympathies simp@T/z
+sympathize simp@TIz
+sympathized simp@TIzd
+sympathizer simp@TIzP
+sympathizers simp@TIzPz
+sympathizes simp@TIz@z
+sympathizing simp@TIz6N
+sympathy simp@T/
+symphonic simfon6k
+symphonies simf~/z
+symphony simf~/
+symphony's simf~/z
+symposium simpOz/}
+symposiums simpOz/}z
+sympson simps~
+symptom simpt}
+symptomatic simpt}at6k
+symptoms simpt}z
+syms simz
+symtron simtron
+syn sin
+syna sin@
+synagogue sin@g{g
+synagogues sin@g{gz
+synalloy sinal<
+synalloy's sinal<z
+synan sIn~
+synar sInor
+synar sinor
+synbiotics simb/ot6ks
+synbiotics sinb/ot6ks
+sync siNk
+synch sinC
+synchro siNkr]
+synchronic siNkron6k
+synchronize siNkr~Iz
+synchronized siNkr~Izd
+syncom siNkom
+syncopate siNk@pAt
+syncopated siNk@pAt@d
+syncopation siNk@pAS~
+syncor sink{r
+synder sindP
+syndicate sind6k@t
+syndicate sind@kAt
+syndicate's sind6k@ts
+syndicated sind6kAt@d
+syndicates sind6k@ts
+syndicates sind6kAts
+syndicating sind6kAt6N
+syndication sind6kAS~
+syndications sind6kAS~z
+syndicator sind6kAtP
+syndicators sind6kAtPz
+syndicats sind6kits
+syndrome sindrOm
+syndromes sindrOmz
+synergen sinPjen
+synergen's sinPjenz
+synergies sinPj/z
+synergism sinPjiz}
+synergistic sinPjist6k
+synergy sinPj/
+synergy's sinPj/z
+syngman siNm~
+synhorst sinh{rst
+synnott sin@t
+synod sin@d
+synod's sin@dz
+synonym sin~im
+synonymous s~on}@s
+synonymously s~on}@sl/
+synopsis s~ops@s
+synoptics s~opt6ks
+synovus sInOv@s
+synovus s~Ov@s
+syntax sintaks
+syntech sintek
+syntex sinteks
+syntex's sintcks@z
+synthesis sinT@s@s
+synthesize sinT@sIz
+synthesized sinT@sIzd
+synthesizer sinT@sIzP
+synthesizers sinT@sIzPz
+synthesizing sinT@sIz6N
+synthetic sinTet6k
+synthetically sinTet6kl/
+synthetics sinTet6ks
+syntrex sintr@ks
+syp eswIpE
+syp sIp
+sypher sifP
+syphers sifPz
+syphilis sif@l@s
+syphon sIf~
+sypniewski sipn/efsk/
+sypniewski sipnUsk/
+sypolt sip]lt
+syracuse sir@kyUz
+syrek sir6k
+syria sir/@
+syria's sir/@z
+syrian sir/~
+syrians sir/~z
+syring sIr6N
+syringe sPinj
+syringe sir~j
+syringes sPinj@z
+syron sIr~
+syrup sV@p
+syrup sir@p
+syrups sV@ps
+sysco sisk]
+syscon sIsk~
+syscon's sIsk~z
+system sist}
+system's sist}z
+systematic sist}at6k
+systematically sist}at6kl/
+systematics sist}at6ks
+systemhouse sist}h?s
+systemhouse's sist}h?s@z
+systemic sistem6k
+systemically s@stem6kl/
+systemix sistem6ks
+systemix sist}6ks
+systemone sist}On
+systems sist}z
+systems' sist}z
+systemwide sist}wId
+systran sIstran
+systran sistran
+sytsma sitsm@
+syverson sivPs~
+syvertsen sivPts~
+szabo Sob]
+szafran Sofr~
+szafranski S@fransk/
+szalay SolI
+szalkowski S@lk{fsk/
+szanto Sant]
+szarek S)rck
+szatkowski S@tk{fsk/
+szczech Sek
+szczepaniak S@pan/ak
+szczepanik S@pan6k
+szczepanski S@pansk/
+szczerba SVb@
+szczesniak Sezn/ak
+szczesny Sezn/
+szczygiel S6gEl
+sze SA
+sze SE
+sze-di SAdE
+szekely SEkl/
+szeliga S@lIg@
+szeto SEt]
+szewczyk SUC6k
+szilagyi S@log/
+szilard silPd
+szilard zilPd
+szoke SOk
+szostak Sost@k
+szostek Sostck
+szot Sot
+szott Sot
+szuba SUb@
+szuch SuC
+szucs Suks
+szumski Sumsk/
+szwed Sved
+szydlowski S@dl{fsk/
+szymanowski Sim~{fsk/
+szymanski Simansk/
+szymborski Simb{rsk/
+szymczak SimCak
+t tE
+t'ang taN
+t's tEz
+t-bone tEbOn
+t-lam tElam
+t. tE
+t.'s tEz
+t.s tEz
+t_a_c tEAsE
+t_a_c tak
+ta to
+taaffe tof
+tab tab
+tabacalera t@bak@l,r@
+tabachneck t@boCnek
+tabak t@bak
+tabak tabak
+tabaka tobok@
+tabar tob)r
+tabares tob)rcs
+tabasco t@bask]
+tabb tab
+tabbert tabPt
+tabbing tab6N
+tabby tab/
+taber tAbP
+tabernacle tabPnak@l
+tabitha tab@T@
+tablature tabl@CP
+table tAb@l
+table's tAb@lz
+tableau t@blO
+tableaux t@blO
+tablecloth tAb@lkl{T
+tablecloths tAb@lkl{Ts
+tabled tAb@ld
+tabler tAb@lP
+tables tAb@lz
+tablespoon tAb@lspUn
+tablespoons tAb@lspUnz
+tablet tabl@t
+tabletop tAb@ltop
+tablets tabl@ts
+tableware tAb@lwer
+tabling tAb@l6N
+tabling tAbl6N
+tabloid tabl<d
+tabloidization tabl<d@zAS~
+tabloids tabl<dz
+tabone tob]n
+taboo tabU
+taboos tabUz
+tabor tAbP
+tabor's tAbPz
+taborn tabPn
+tabron tabr~
+tabs tabz
+tabuchi tobUC/
+tabulate taby@lAt
+tabulated taby@lAt@d
+tabulating taby@lAt6N
+tabulation taby@lAS~
+tabulations taby@lAS~z
+tabulature taby@l@CP
+tac tak
+tacey tAs/
+tacit tas@t
+tacita toCEt@
+tacitly tas@tl/
+taciturn tas@tVn
+tack tak
+tacke tak
+tacked takt
+tacker takP
+tackett takct
+tacking tak6N
+tackitt takit
+tackle tak@l
+tackled tak@ld
+tackles tak@lz
+tackling tak@l6N
+tackling takl6N
+tacks taks
+tacky tak/
+taco tok]
+tacoma t@kOm@
+tacoma's t@kOm@z
+tacos tok]z
+tact takt
+tactful taktf@l
+tactfully taktf@l/
+tactic takt6k
+tactical takt6k@l
+tactically takt6k@l/
+tactician taktiS~
+tacticians taktiS~z
+tactics takt6ks
+tactile takt@l
+tactile taktIl
+tacy tAs/
+tad tad
+tada tod@
+tadashi todoS/
+tadd tad
+taddei tadI
+taddeo tod/]
+taddy tad/
+tadeusz tad/Uz
+tadic tad6k
+tadlock tadl@k
+tadpole tadpOl
+tadpoles tadpOlz
+tadros tAdr]z
+tadych todih
+tae tA
+tae tI
+taegu tAgU
+taekwondo tIkwond]
+taekwondo takwondO
+tafaro t@f)r]
+tafel taf@l
+taff taf
+taffe taf
+taffel taf@l
+taffeta taf@t@
+taffy taf/
+taflinger tAf@l6NP
+tafolla t@fol@
+tafoya tof<@
+taft taft
+taft's tafts
+tag tag
+tagalog tag@log
+tagamet tag}et
+taganka t@goNk@
+tager tAgP
+tagg tag
+taggart tagPt
+taggart's tagPts
+tagge tag
+tagged tagd
+taggert tagPt
+tagging tag6N
+tagle tAg@l
+tagliaferri toglyof,r/
+taglieri toglir/
+tagline taglIn
+tagout tag?t
+tags tagz
+tague tog
+taher tAP
+tahiti t@hEt/
+tahmassebi tom@sEb/
+tahoe tah]
+tai tI
+taibi tAb/
+taiko tAk]
+tail tAl
+tailed tAld
+tailgate tAlgAt
+tailhook tAlhqk
+tailing tAl6N
+tailings tAl6Nz
+taillon tAl~
+tailor tAlP
+tailored tAlPd
+tailoring tAlP6N
+tailors tAlPz
+tailpipe tAlpIp
+tails tAlz
+tailspin tAlspin
+taima tIm@
+tainer tAnP
+taing to6N
+taint tAnt
+tainted tAnt@d
+tainter tAntP
+tainting tAnt6N
+taints tAnts
+taipei tIpA
+taipei's tIpAz
+taira toir@
+taisei tAsA
+taisho tAS]
+tait tAt
+taite tAt
+taitt tAt
+taiwan tIwon
+taiwan's tIwonz
+taiwanese tIwonEz
+taiyo tIy]
+taj toZ
+tajik toj6k
+tajikistan tojEk@stan
+tajikistan's tojEk@stanz
+tajima tojEm@
+tak tak
+takach tak@k
+takacs tak@ks
+takagi tokog/
+takahashi tokohoS/
+takaki tokok/
+takako tokok]
+takanashi tokonoS/
+takao toko]
+takara tok)r@
+takasago tokosog]
+takashi tokoS/
+takashima tokoSEm@
+takashimaya tokoS}oy@
+takata tokot@
+takayama tokoyom@
+take tAk
+takecare tAk,r
+takeda tokAd@
+takei tokA
+takemoto tokAmOt]
+takemura tokAmqr@
+taken tAk~
+takeo tokA]
+takeoff tAk{f
+takeoffs tAk{fs
+takeout tAk?t
+takeover tAkOvP
+takeovers tAkOvPz
+taker tAkP
+takers tAkPz
+takes tAks
+takeshi t@keS/
+takeshima tak6SEm@
+takeshita tok6SEt@
+takeshita's tok6SEt@z
+taketa tokAt@
+taketh tAk@T
+taketomi tok@tOm/
+takeuchi tokAUC/
+taki tak/
+taki's tak/z
+takihyo t@kEy]
+takin' tAk~
+taking tAk6N
+takings tAk6Nz
+takla-makan takl}Ak~
+taku tokU
+takushoku tok@SOkU
+tal tol
+talaga tolog@
+talal t@lol
+talamantes tolomontcs
+talamantez tolomontcz
+talamo tolom]
+talarico tolorEk]
+talavera tolov,r@
+talbert talbPt
+talbot talb@t
+talbot's talb@ts
+talbots talb@ts
+talbott talb@t
+talbott's talb@ts
+talc talk
+talcott talk@t
+talcs talks
+talcum talk}
+tale tAl
+talent tal~t
+talented tal~t@d
+talents tal~ts
+talerico tolPEk]
+tales tAlz
+talese t@lEz
+talese t@lEz/
+talford talfPd
+taliban tal@ban
+taligent tal@jcnt
+talisman tal@sm~
+talitha tal@T@
+talk t{k
+talk's t{ks
+talkable t{k@b@l
+talkative t{k@t6v
+talkback t{kbak
+talked t{kt
+talker t{kP
+talkers t{kPz
+talkie t{k/
+talkies t{k/z
+talkin tok~
+talkin' t{k~
+talking t{k6N
+talkington t{k6Nt~
+talks t{ks
+talky t{k/
+tall t{l
+talladega tal@dAg@
+tallahassean tal@has/~
+tallahasseans tal@has/~z
+tallahassee tal@has/
+tallahassee's tal@has/z
+tallant tol~t
+tallarico tolorEk]
+tallent tol~t
+taller t{lP
+tallerico tolPEk]
+tallest t{l@st
+talley tal/
+tallgrass tolgras
+tallie t{l/
+tallied tal/d
+tallies tal/z
+tallil t@lil
+tallmadge talmaj
+tallman t{lm~
+tallo tal]
+tallon tal~
+tallow tal]
+tallula tolUl@
+tallulah talUl@
+tally tal/
+tallyho tal/hO
+tallying tal/6N
+talmadge talmaj
+talmage talm6j
+talman talm~
+talmor talm{r
+talmud talm@d
+talon tal~
+talons tal~z
+talsma tolsm@
+talton talt~
+taltos tolt]z
+talty t{lt/
+tam tam
+tama tom@
+tamales t}ol/z
+tamanaha tomonoh@
+tamara t})r@
+tamarac tamPak
+tamargo tom)rg]
+tamarin tamP~
+tamarins tamP~z
+tamarisk tamPisk
+tamarisks tamPisks
+tamas tom@z
+tamashiro tomoSir]
+tamayo tomoy]
+tamblyn tamblin
+tambo tamb]
+tambocor tamb]k{r
+tambourine tambPEn
+tambrands tambrandz
+tambs tamz
+tamburello tombqrel]
+tamburo tombqr]
+tamburri tombqr/
+tamburrino tombqrEn]
+tamburro tombqr]
+tame tAm
+tamed tAmd
+tamer tAmP
+tames tAmz
+tamez tomez
+tamiami tam/am/
+tamil tamil
+tamils tamilz
+taming tAm6N
+tamke tamk/
+tamm tam
+tammany tam~/
+tammaro tom)r]
+tammen tam~
+tammie tam/
+tamminga tomENg@
+tammo tam]
+tammy tam/
+tamoxifen tamoks@f~
+tamp tamp
+tampa tamp@
+tampa's tamp@z
+tampax tampaks
+tamper tampP
+tampered tampPd
+tampering tampP6N
+tamping tamp6N
+tamplin tamplin
+tampon tampon
+tampons tamponz
+tampopo tampOp]
+tamposi tampOs/
+tamps tamps
+tamura tomqr@
+tan tan
+tanabe tonobA
+tanaka tonok@
+tanartkit tan)rtkit
+tancredi tonkred/
+tancredo tankrAd]
+tandem tand}
+tandem's tand}z
+tandon tand~
+tandy tand/
+tandy's tand/z
+tandycraft tand/kraft
+tandycrafts tand/krafts
+taneja t~Ah@
+tanen tan~
+tanenbaum tan~b?m
+taney tAn/
+tang taN
+tang toN
+tange tanj
+tangeman tAnjm~
+tangen taN~
+tangent tanj~t
+tangential tanjenC@l
+tangentially tanjenC@l/
+tanger taNP
+tangerine tanjPEn
+tangerines tanjPEnz
+tangible tanj@b@l
+tangibles tanj@b@lz
+tangiers tanjirz
+tangle taNg@l
+tangled taNg@ld
+tangles taNg@lz
+tanglewood taNg@lwqd
+tangling taNgl6N
+tangney taNgn/
+tango taNg]
+tangos taNg]z
+tangqui taNkwE
+tangredi toNgred/
+tangs taNz
+tanguay tangA
+tanguma toNgUm@
+tani ton/
+tania tony@
+taniguchi ton6gUC/
+tanimoto ton/mOt]
+tanimura ton}Ur@
+tanis tanis
+tanjug tanjug
+tank taNk
+tank's taNks
+tankan taNk~
+tankard taNkPd
+tanke taNk
+tanked taNkt
+tanker taNkP
+tankers taNkPz
+tankersley taNkPsl/
+tanking taNk6N
+tanks taNks
+tanksley taNksl/
+tann tan
+tannahill tan@hil
+tanned tand
+tannehill tan@hil
+tannen tan~
+tannenbaum tan~b?m
+tanner tanP
+tannest tan@st
+tanney tan/
+tannhauser tanh?zP
+tanning tan6N
+tanqueray taNkwPA
+tans tanz
+tansey tanz/
+tanski tanskE
+tansy tanz/
+tant tant
+tantalize tan@lIz
+tantalize tant@lIz
+tantalized tan@lIzd
+tantalized tant@lIzd
+tantalizes tan@lIz@z
+tantalizes tant@lIz@z
+tantalizing tan@lIz6N
+tantalizing tant@lIz6N
+tantalizingly tan@lIz6Nl/
+tantalizingly tant@lIz6Nl/
+tantalum tant@l}
+tantalus tant@l@s
+tantamount tant}?nt
+tantillo tontil]
+tanton tant~
+tantric tantr6k
+tantrum tantr}
+tantrums tantr}z
+tanu tonU
+tanya tony@
+tanzania tanzAn/@
+tanzania tanz~E@
+tanzania's tanzAn/@z
+tanzania's tanz~E@z
+tanzanian tanzAn/~
+tanzanian tanzAny~
+tanzer tanzP
+tanzi tanz/
+tao d?
+tao t?
+taoism d?iz}
+taoist d?@st
+taoists d?@s
+taoists d?@ss
+taoists d?@sts
+taormina to{rmEn@
+taos t?z
+tap tap
+tapas tup@s
+tape tAp
+tape's tAps
+taped tApt
+tapeie tAp/A
+tapeie's tAp/Az
+taper tApP
+tapered tApPd
+tapering tApP6N
+tapers tApPz
+tapes tAps
+tapestries tap@str/z
+tapestry tap@str/
+tapia top/@
+tapias t@pE@s
+tapie tap/
+taping tAp6N
+tapings tAp6Nz
+tapley tapl/
+taplin taplin
+tapp tap
+tappan tap~
+tappe tap
+tapped tapt
+tappen tap~
+tapper tapP
+tappet tap@t
+tappin tapin
+tapping tap6N
+taps taps
+tapscott tapsk@t
+tar t)r
+tara t,r@
+tarahumara tor@hUmor@
+tarallo tPal]
+tarango toroNg]
+tarantino torontEn]
+taranto tPant]
+taranto's tPant]z
+tarantula t@ranC@l@
+tarantula t@ranCUl@
+tarantulas t@ranC@l@z
+tarantulas t@ranCUl@z
+taras t)r@z
+tarasoff t,r@s{f
+taravella tar@vel@
+tarbell t)rbel
+tarbert t)rbPt
+tarbet t)rbct
+tarbox t)rboks
+tarbutton t)rbut~
+tardif t)rdif
+tardiff t)rdif
+tardiness t)rd/n@s
+tarditi tordit/
+tardy t)rd/
+target t)rg@t
+target tVg@t
+target's t)rg@ts
+targeted t)rg@t@d
+targeting t)rg@t6N
+targets t)rg@ts
+tarheel t)rhEl
+tarheels t)rhElz
+tariff t,r@f
+tariffs t,r@fs
+tarin t)r/n
+tariq torEk
+tarkington t)rk6Nt~
+tarkowski tPk{fsk/
+tarleton t)rlt~
+tarlow t)rlO
+tarlton t)rlt~
+tarmac t)rmak
+tarmacs t)rmaks
+tarman t)rm~
+tarnish t)rniS
+tarnished t)rniSt
+tarnishing t)rniS6N
+tarnoff t)rn{f
+tarnoff's t)rn{fs
+tarnow t)rn]
+tarnower t)rn?P
+tarnowski tPn{fsk/
+taro t,r]
+tarom t,r}
+tarot tarO
+tarots tarOz
+tarp t)rp
+tarpey t)rp/
+tarpley t)rpl/
+tarpon t)rp~
+tarps t)rps
+tarpy t)rp/
+tarquinio torkwEn/]
+tarr t)r
+tarrance t)r~s
+tarrant t)r~t
+tarred t)rd
+tarring t)r6N
+tarry t,r/
+tarrytown t,r/t?n
+tarses t)rs@s
+tarsus t)rs@s
+tart t)rt
+tartaglia tortagl/@
+tartaglione tortagl/On/
+tartan t)rt~
+tartar t)rtP
+tartars t)rtPz
+tarte t)rt
+tarter t)rtP
+tartikoff t)rt6k{f
+tartness t)rtn@s
+tarts t)rts
+tartt t)rt
+tarver t)rvP
+tarvin t)rvin
+tarzan t)rzan
+tarzan t)rz~
+tarzan's t)rzanz
+tarzan's t)rz~z
+tasaday tas@dA
+tasca tosk@
+tasch taS
+taschner taSnP
+taser tAzP
+tash taS
+tashiro toSir]
+tashjian taSj/~
+tashkent taSkent
+task task
+tasked taskt
+tasker taskP
+taskforce taskf{rs
+tasking task6N
+taskmaster taskmastP
+tasks tasks
+tasm tas}
+tasman tazm~
+tasmania tazmAn/@
+tasmanian tazmAn/~
+tass tas
+tassel tas@l
+tasseled tas@ld
+tassi tas/
+tassin tasin
+tassinari tos/n)r/
+tasso tasO
+tassone tosOn/
+taste tAst
+tasted tAst@d
+tasteful tAstf@l
+tastefully tAstf@l/
+tasteless tAstl@s
+taster tAstP
+taster's tAstPz
+tasters tAstPz
+tastes tAsts
+tastier tAst/P
+tastiness tAst/n@s
+tasting tAst6N
+tastings tAst6Nz
+tasty tAst/
+tat tat
+tata tot@
+tatar tatP
+tatars tatPz
+tatarstan totPstan
+tatarstan totorstan
+tate tAt
+tate's tAts
+tateho t@tAh]
+tateho's t@tAh]z
+tatem tatim
+tatge tAtj
+tatham taT}
+tatiana tatEan@
+tatiana tatyan@
+tatlock tatlok
+tatman tatm~
+tatom tat}
+tatra tatr@
+tatro tatr]
+tatsch taC
+tatsukichi t@tsUkEC/
+tatsuno tatsUn]
+tatter tatP
+tattered tatPd
+tatters tatPz
+tattersall tatPs@l
+tattle tat@l
+tattled tat@ld
+tattler tatlP
+tattoo tatU
+tattooed tatUd
+tattooing tatU6N
+tattoos tatUz
+tatty tat/
+tatu totU
+tatum tAt}
+tatyana totyon@
+taub t?b
+taube t{b
+tauber t?bP
+taubert t?bPt
+taubes t?bz
+taubman t?bm~
+taucher t?kP
+tauer t?P
+taught t{t
+tauke t?k
+taul t{l
+taulbee t{lbE
+taunt t{nt
+taunted t{nt@d
+taunting t{nt6N
+taunton t{nt~
+taunts t{nts
+taurus t{r@s
+tauruses t{r@s@z
+tausch t?S
+tauscher t?SP
+taussig t?s6g
+taut t{t
+tauzin t?zin
+tavano tovon]
+tavares tov)rcs
+tavarez tov)rcz
+tavel tovel
+tavenner tav~P
+tavera tov,r@
+taveras tov,roz
+tavern tavPn
+taverna tov,rn@
+tavernier tavPn/P
+taverns tavPnz
+taves tAvz
+tavie tAv/
+tavis tovis
+tavish tAv6S
+tavist tav@st
+tavlin tavlin
+tavoulareas tovUl,r/@s
+tavy tAv/
+tawana towon@
+tawdry t{dr/
+tawes t{z
+tawil t{@l
+tawney t{n/
+tawny ton/
+tax taks
+tax's taks@z
+taxability taks@bil@t/
+taxable taks@b@l
+taxables taks@b@lz
+taxation taksAS~
+taxcut takskut
+taxed takst
+taxer taksP
+taxers taksPz
+taxes taks@z
+taxes' taks@z
+taxi taks/
+taxi's taks/z
+taxicab taks/kab
+taxicabs taks/kabz
+taxied taks/d
+taxiing taks/6N
+taxing taks6N
+taxis taks/z
+taxol taksol
+taxpayer takspAP
+taxpayer's takspAPz
+taxpayers takspAPz
+taxpayers' takspAPz
+taxpaying takspA6N
+tay tA
+tayler tAlP
+tayloe tAl]
+taylor tAlP
+taylor's tAlPz
+taylors tAlPz
+tayman tAm~
+tays tAz
+tb tEbE
+tbilisi t@bilEs/
+tbilisi t@blEs/
+tcas tEsEAes
+tchaikovsky CAkovsk/
+tchaikovsky CIkovsk/
+tchaikovsky's CAkovsk/z
+tchaikovsky's CIkovsk/z
+tchuruk Cqr6k
+te tE
+tea tE
+teac tEak
+teac tEk
+teach tEC
+teachable tEC@b@l
+teacher tECP
+teacher's tECPz
+teachers tECPz
+teachers' tECPz
+teaches tEC@z
+teachey tEC/
+teaching tEC6N
+teachings tEC6Nz
+teachout tEC?t
+teacup tEkup
+teaford tEfPd
+teaford tEf{rd
+teagarden tEgord~
+teagle tEg@l
+teague tEg
+teahan tE~
+teak tEk
+teakwood tEkwqd
+teal tEl
+teale tEl
+teall tEl
+team tEm
+team's tEmz
+teamed tEmd
+teamer tEmP
+teaming tEm6N
+teammate tEmAt
+teammates tEmmAts
+teams tEmz
+teams' tEmz
+teamster tEmstP
+teamster's tEmstPz
+teamsters tEmstPz
+teamsters' tEmstPz
+teamwork tEmwVk
+teaneck tEnek
+teaney tEn/
+teapot tEpot
+tear t,r
+tear tir
+teare tEr
+tearful tirf@l
+tearfully tirf@l/
+tearing t,r6N
+tearing tir6N
+tearle t{r@l
+tears t,rz
+tears tirz
+teary tir/
+teas tEz
+teasdale tEzdAl
+tease tEz
+teased tEzd
+teaser tEzP
+teases tEz@z
+teasing tEz6N
+teasley tEzl/
+teason tEs{n
+teaspoon tEspUn
+teaspoons tEspUnz
+teaster tEstP
+teat tEt
+teate tEAt
+teater tEtP
+teatro tEtr]
+teats tEts
+tebbe teb
+tebben teb~
+tebbetts tebcts
+tebbit tebit
+tebbs tebz
+tebeau t@bO
+tebelskis t@belsk/z
+tebo teb]
+tebuthiuron teb@TyUron
+tec tek
+tech tek
+tech's teks
+techie tek/
+techies tek/z
+techint teC~t
+techint tekint
+technic tekn6k
+technical tekn6k@l
+technical's tekn6k@lz
+technicalities tekn@kal@t/z
+technicality tekn@kal@t/
+technically tekn6k@l/
+technically tekn6kl/
+technicals tekn6k@lz
+technician tckniS~
+technician's tckniS~z
+technicians tckniS~z
+technicolor tekn6kulP
+technicon tekn6kon
+technics tekn6ks
+technique tcknEk
+techniques tcknEks
+technitrol tekn@trOl
+techno tekn]
+technocrat tekn@krat
+technocratic tekn@krat6k
+technocrats tekn@krats
+technodyne tekn]dIn
+technologic tekn@loj6k
+technological tekn@loj6k@l
+technologically tekn@loj6k@l/
+technologically tekn@loj6kl/
+technologies tcknol6j/z
+technologies' teknol6j/z
+technologist teknol6j@st
+technologists teknol6j@s
+technologists teknol6j@ss
+technologists teknol6j@sts
+technology tcknol6j/
+technology's tcknol6j/z
+technomic teknom6k
+technophobe tekn]fOb
+technophobe's tekn]fObz
+technophobes tekn]fObz
+techs teks
+techsystem teksist}
+techsystems teksist}z
+techy teC/
+teck tek
+teck's teks
+tecla tekl@
+teco tEk]
+tecogen tek]g~
+tecogen tek]jcn
+tecos tEk]s
+tectonic tckton6k
+tectonics tckton6ks
+tecumseh t@kums@
+ted ted
+ted's tedz
+tedder tedP
+teddie ted/
+teddy ted/
+teddy's ted/z
+tedeschi tcdesk/
+tedesco tcdesk]
+tedford tedfPd
+tedious tEd/@s
+tediously tEd/@sl/
+tedium tEd/}
+tedman tedm~
+tedmond tedm~d
+tedmund tedm~d
+tedrick tedr6k
+tedrow tedrO
+tee tE
+teed tEd
+teegarden tEgord~
+teegardin t/g)rdin
+teehan tE~
+teeing tE6N
+teel tEl
+teele tEl
+teeley tEl/
+teeling tEl6N
+teem tEm
+teeming tEm6N
+teems tEmz
+teen tEn
+teena tEn@
+teenage tEnAj
+teenaged tEnAjd
+teenager tEnAjP
+teenager's tEnAjPz
+teenagers tEnAjPz
+teenie tEn/
+teens tEnz
+teensy tEns/
+teeny tEn/
+teeple tEp@l
+teeples tEp@lz
+teer tir
+tees tEz
+teet tEt
+teeter tEtP
+teeter's tEtPz
+teetered tEtPd
+teetering tEtP6N
+teeters tEtPz
+teeth tET
+teethe tET
+teething tET6N
+teets tEts
+teffeteller tef@telP
+tefft teft
+teflon tefl~
+tefra tefr@
+tegeler teg@lP
+tegethoff teg@t{f
+tegge teg
+tegtmeier tetmIP
+tegtmeyer tetmIP
+tegucigalpa tcgUC/golp@
+tegucigalpa tcgUs/galp@
+tehan tA~
+teheran tehPon
+teheran's tehPonz
+teherani tehPon/
+teherani's tehPon/z
+teheranis tehPon/z
+teherans tehPonz
+tehran tAron
+tehran's tAronz
+tehrani tAron/
+tehrani's tAron/z
+tehranis tAron/z
+tehrans tAronz
+teich tIk
+teicher tIkP
+teichert tIkPt
+teichman tIkm~
+teichmann tIkm~
+teicholz tIkh{lts
+teig tEg
+teige tIj
+teigen tIg~
+teikoku tAkOkU
+teitel tIt@l
+teitelbaum tIt@lb?m
+teitell tItel
+teixeira t@ks,r@
+tejada tAyod@
+tejano tAyon]
+tejas tEj@s
+tejeda tAyAd@
+tejera tAir@
+tejon tejon
+tek tek
+teknowledge teknolcj
+tektronix tektron6ks
+tel tel
+tel-aviv telovEv
+telaction tclakS~
+telamon tel}~
+telander tElandP
+telander tilandP
+telco telk]
+tele tel/
+tele tel@
+telecable tel@kAb@l
+telecard tel@kord
+telecast tel@kast
+telecasts tel@kas
+telecasts tel@kass
+telecasts tel@kasts
+telecharge tel@C)rj
+telecheck tel@Cek
+telecom tel@kom
+telecom's tel@komz
+telecommunication tel@k}yUn6kAS~
+telecommunications tel@k}yUn@kAS~z
+telecommunications' tel@k}yUn@kAS~z
+telecommute tel@k}yUt
+telecommuter tel@k}yUtP
+telecommuter's tel@k}yUtPz
+telecommuters tel@k}yUtPz
+telecommuting tcl@k}yUt6N
+telecoms tel@komz
+teleconference tcl@konfr~s
+teleconferencing tel@konfr~s6N
+teleconnect tcl@k~ekt
+telecrafter tel@kraftP
+telecredit tel@kret@t
+telectron tel@ktron
+telectronic tel@ktron6k
+telectronics tel@ktron6ks
+teledesic tel@des6k
+teledyne tel@dIn
+teledyne's tel@dInz
+teleflex tel@fleks
+telefon tel@fon
+telefonica tel@fon6k@
+telefonos telcfOn]s
+telefunken tel@fuNk~
+telegenic tel@jen6k
+teleglobe tel@glOb
+telegram tel@gram
+telegrams tel@gramz
+telegraph tel@graf
+telegraph's tel@grafs
+telegraphed tel@graft
+telekom tel@kom
+telekom's tel@komz
+telemacho tel}oC]
+telemanagement tel}an6jm~t
+telemarket tel})rk@t
+telemarketer tel})rk@tP
+telemarketers tel})rk@tPz
+telemarketing tel})rk@t6N
+telematic tel}at6k
+telematics tel}at6ks
+telemecanique tel}@kan6k
+telemedia tel}Ed/@
+telemedicine tel}ed@s~
+telemetry t@lem@tr/
+telemundo tel}Und]
+telenet tel~et
+teleological tEl/@l{j6k@l
+telepathic tel@paT@k
+telepathy tel@paT/
+telephone tel@fOn
+telephone's tel@fOnz
+telephoned tel@fOnd
+telephones tel@fOnz
+telephonic tel@fon6k
+telephonics tel@fon6ks
+telephoning tel@fOn6N
+telephoniques tel@fonEks
+telephony tel@fOn/
+telephoto tel@fOt]
+telepicture tel@pikCP
+telepictures tel@pikCPz
+teleport tel@p{rt
+teleport's tel@p{rts
+teleprobe tel@prOb
+teleprompter tel@promptP
+telequest tel@kwest
+telerate telPAt
+telesat tel@sat
+telescience tel@sI~s
+telesciences tel@sI~s@z
+telesco tclesk]
+telescope tel@skOp
+telescope's tel@skOps
+telescopes tel@skOps
+telescopic tel@sk{p6k
+telescript tel@skript
+telesis tel@sis
+telesis' tel@sis
+telesis's tel@sis@z
+telesphere tel@sfir
+telestrator tel@strAtP
+telesystem tel@sist}
+teletext tel@tekst
+telethon tel@T{n
+teletron tel@tron
+telettra telctr@
+teletype tel@tIp
+teletypes tel@tIps
+televangelist tel@vanj@l@st
+televangelists tel@vanj@l@s
+televangelists tel@vanj@l@ss
+televangelists tel@vanj@l@sts
+televideo tel@vid/]
+televisa tel@vEz@
+televisa's tel@vEz@z
+televise tel@vIz
+televised tel@vIzd
+televising tel@vIz6N
+television tel@viZ~
+television's tel@viZ~z
+televisions tel@viZ~z
+televison tel6v6Z~
+telewest tel@west
+telex teleks
+telex's teleks@z
+telexed teleskt
+telexes teleks@s
+telfair telfIr
+telfer telfP
+telfor telfP
+telford telfPd
+telfour telfP
+telit telit
+tell tel
+tellabs telabz
+tellefsen tel@fs~
+tellep tel@p
+teller telP
+teller's telPz
+tellers telPz
+telles telz
+tellez tAlez
+tellier tel/P
+tellin' tel~
+telling tel6N
+tellingly tel6Nl/
+tellis telis
+tello tel]
+tells telz
+telltale teltAl
+telltales teltAlz
+telluride telyPId
+tellurides telyPIdz
+tellurium tclqr/}
+telly tel/
+telmex telmeks
+telmex's telmeks@z
+telos tel]s
+telsource tels{rs
+telstar telstor
+telstra telstr@
+teltschik telC6k
+telugu telqgU
+telxon telzon
+telxon's telz~z
+telzrow telzr]
+temblor temblP
+temblors temblPz
+temco temk]
+temecula t}eky@l@
+temerity t},r@t/
+temerlin temPlin
+temkin temkin
+temme tem
+temp temp
+tempe temp/
+tempel temp@l
+tempelsman temp@lzm~
+temper tempP
+tempera tempP@
+temperament tempPm~t
+temperament tempr}~t
+temperamental tempPment@l
+temperamental tempr}ent@l
+temperamentally tempPmen@l/
+temperamentally tempPment@l/
+temperamentally tempr}en@l/
+temperamentally tempr}ent@l/
+temperaments tempPm~ts
+temperaments tempr}~ts
+temperance tempP~s
+temperance tempr~s
+temperate tempP@t
+temperate tempr@t
+temperature tempP@CP
+temperature tempr@CP
+temperatures tempP@CPz
+temperatures tempr@CPz
+tempered tempPd
+tempering tempP6N
+tempers tempPz
+tempest temp@st
+tempesta tempest@
+tempestuous tempesCU@s
+templar templP
+templars templPz
+template templ@t
+template templAt
+temple temp@l
+temple's temp@lz
+templeman temp@lm~
+templer temp@lP
+temples temp@lz
+templet templ@t
+templeton temp@lt~
+templeton's temp@lt~z
+templin templin
+tempo tempO
+temporal tempP@l
+temporally tempP@l/
+temporaries tempPer/z
+temporarily tempP,r@l/
+temporary tempPer/
+tempore temp{r
+tempore temp{r/
+temporize tempPIz
+temporizing tempPIz6N
+tempos tempOz
+temps temps
+tempt tempt
+temptation tcmtAS~
+temptations tcmtAS~z
+tempted tempt@d
+tempting tempt6N
+temptress temptr@s
+tempts tempts
+ten ten
+ten's tenz
+tena ten@
+tenable ten@b@l
+tenacious t~AS@s
+tenaciously t~AS@sl/
+tenacity t~as@t/
+tenaglia tcnogl/@
+tenancy ten~s/
+tenant ten~t
+tenant's ten~ts
+tenants ten~ts
+tenants' ten~ts
+tenbrink tenbriNk
+tench tenC
+tencza tenC@
+tend tend
+tended tend@d
+tendencies tend~s/z
+tendency tend~s/
+tendentious tendenS@s
+tender tendP
+tendered tendPd
+tendering tendP6N
+tenderloin tendPl<n
+tenderly tendPl/
+tenderness tendPn@s
+tenders tendPz
+tending tend6N
+tendler tendlP
+tendon tend~
+tendons tend~z
+tends tendz
+tenement ten}~t
+tenements ten}~ts
+tenenbaum ten~b?m
+tener tenP
+tenera ten,r@
+tenet ten@t
+tenets ten@ts
+teneyck ten/k
+tenfold tenfOld
+teng teN
+teng-wen teNwen
+tengelmann teNg@lm~
+tengiz teNg@z
+tenglemann teNg@lm~
+tenn ten
+tenn ten@sE
+tennant ten~t
+tenncare tenker
+tenncare's tenkerz
+tenneco ten@k]
+tenneco's ten@k]z
+tennell ten@l
+tennenbaum ten~b?m
+tennent ten~t
+tenner tenP
+tennessean ten@sE~
+tennesseans ten@sE~z
+tennessee ten@sE
+tennessee's ten@sEz
+tenney ten/
+tennis tenis
+tennis's tenis@z
+tennison ten@s~
+tenny ten/
+tennyson ten@s~
+tenor tenP
+tenore ten{r
+tenorio tcn{r/]
+tenors tenPz
+tenpas tenp@z
+tenpenny tenpen/
+tenrecs tenreks
+tens tenz
+tense tens
+tensely tensl/
+tensile tens@l
+tensiometer tens/om@tP
+tension tenS~
+tensions tenC~z
+tent tent
+tentacle tent@k@l
+tentacles tent@k@lz
+tentative ten@t6v
+tentative tent@t6v
+tentatively tent@t6vl/
+tentatively tent@vl/
+tenth tenT
+tenths tenTs
+tenting tent6N
+tents tents
+tenuous teny@w@s
+tenure tenyP
+tenured tenyPd
+tenures tenyPz
+tenuta tcnUt@
+tenzer tenzP
+teo tA]
+teodoro tE]d{r]
+tepe tEp
+teper tEpP
+tepid tep@d
+teply tepl/
+tepoztlan t@p{stl~
+tepper tepP
+tepperman tepPm~
+tequila t@kEl@
+tequiliu t@kElyU
+ter tV
+terada tPod@
+teradata ter@dot@
+teradyne t,r@dIn
+teradyne's t,r@dInz
+teran t,r~
+terasawa ter@sow@
+terbush tVbqS
+tercel tVs@l
+tercero tPC,r]
+terence t,r~s
+terence's t,r~s@z
+terentia tPenS@
+teresa tPAs@
+teresa tPEs@
+teresa's tPAs@z
+teresa's tPEs@z
+terese t,r/z
+teresi tPes/
+teresita tPcsEt@
+teressa tPes@
+terex t,r@ks
+tereza tPAz@
+tereza's tPAz@z
+terhaar tVhor
+terhorst tVh{rst
+terhune tPhyUn
+teri t,r/
+teriyaki ter@yok/
+terkel tVk@l
+terkhorn tVk{rn
+terlecki tPletsk/
+terlizzi tPlEts/
+term tVm
+term's tVmz
+terman tVm~
+termed tVmd
+termeer tPmir
+termer tVmP
+termers tVmPz
+terminal tVm~@l
+terminally tVm~@l/
+terminals tVm~@lz
+terminate tVm~At
+terminated tVm~At@d
+terminates tVm~Ats
+terminating tVm~At6N
+termination tPm~AS~
+terminations tVm~AS~z
+terminator tVm~AtP
+termine tVmin
+terming tVm6N
+termini tVminI
+terminology tVm~ol@j/
+termite tVmIt
+termites tVmIts
+terms tVmz
+ternes tVnz
+terns tVnz
+terpening tVp~6N
+terpstra t,rpstr@
+terra t,r@
+terra's t,r@z
+terracciano tPoC/on]
+terrace t,r@s
+terraced t,r@st
+terraces t,r@s@z
+terrain tPAn
+terrains tPAnz
+terral t,r@l
+terrana tPan@
+terrance t,r~s
+terrano tPon]
+terranova tPonOv@
+terrasi tPos/
+terrazas tcrozoz
+terre t,r
+terre t,r@
+terre-haute t,r@hOt
+terre-haute t,r@hut
+terrebonne tPcbOn/
+terrebonne tPcbun
+terrel t,r@l
+terrell t,r@l
+terrence t,r~s
+terrestrial tPestr/@l
+terri t,r/
+terrible t,r@b@l
+terribly t,r@bl/
+terrie t,r/
+terrien t,r/~
+terrier t,r/P
+terriers t,r/Pz
+terrific tPif6k
+terrifically tPif6kl/
+terrified t,r@fId
+terrifies t,r@fIz
+terrify t,r@fI
+terrifying t,r@fI6N
+terrile terEl
+terrill t,r@l
+terrington t,r6Nt~
+terrio t,r/]
+terris t,ris
+territo tPEt]
+territorial ter@t{r/@l
+territorialism ter@t{r/@liz}
+territorially ter@t{r/@l/
+territories t,r@t{r/z
+territory t,r@t{r/
+territory's t,r@t{r/z
+terrizzi terits/
+terrones t,r~z
+terror t,rP
+terrorism t,rPiz}
+terrorist t,rPist
+terroristic terPist6k
+terrorists t,rPis
+terrorists t,rPiss
+terrorists t,rPists
+terrorists' t,rPis
+terrorists' t,rPiss
+terrorists' t,rPists
+terrorize t,rPIz
+terrorized t,rPIzd
+terrorizes t,rPIz@z
+terrorizing t,rPIz6N
+terrors t,rPz
+terry t,r/
+terry's t,r/z
+terse tVs
+tersely tVsl/
+tertia t,rS@
+tertiary tVS/er/
+tertiary tVSP/
+tertius tVt/@s
+teruko t,rUk]
+teruya tcrUy@
+tervo t,rv]
+terwilliger tVwil@gP
+terzian tVz/~
+tesar tcs)r
+tesch teS
+teschner teSnP
+tesco tesk]
+tese tEs
+tesh teS
+teska tesk@
+teske tesk
+tesla tesl@
+tesla tezl@
+tesler tes@lP
+teslik tesl6k
+tesmer tes}P
+tesobono tes@bOn]
+tesobonos tes@bOn]s
+tesobonos tes@bOn]z
+tesoriero tcs{rir]
+tesoro tcs{r]
+tesoro's tcs{r]z
+tess tes
+tessa tes@
+tesselate tes@lAt
+tesselated tes@lAt@d
+tessie tes/
+tessier tes/P
+tessitore tcs/t{r/
+tessler teslP
+tessman tesm~
+tessmer tesmP
+tessy tes/
+test test
+test's tests
+testa test@
+testament test}~t
+testamentary test}entP/
+tested test@d
+tester testP
+testerman testPm~
+testers test@z
+testers testPz
+testes testEz
+testes tests
+testicle test6k@l
+testicles test6k@lz
+testicular testiky@lP
+testified test@fId
+testifies test@fIz
+testify test@fI
+testifying test@fI6N
+testily test@l/
+testimonial test}On/@l
+testimonials test}On/@lz
+testimonies test}On/z
+testimony test}On/
+testing test6N
+teston test~
+testor testP
+testosterone testostPOn
+testrake testrAk
+tests tests
+tests' tests
+testuro testqr]
+testy test/
+tet tet
+teta tet@
+tetanus tet~@s
+tete tet
+teter tEtP
+teters tEtPz
+tether teTP
+tethered teTPd
+tethers teTPz
+teti tet/
+tetley tetl/
+tetlow tetl]
+teton tEt~
+tetra tetr@
+tetrads tetradz
+tetrahedral tetr@hEdr@l
+tetrahedron tetr@hEdr~
+tetramerous tetramP@s
+tetrault tetr?lt
+tetravalent tetr@vAl~t
+tetreault tctrO
+tetrick tetr6k
+tetro tetr]
+tetsuji tetsUj/
+tetsuo tetsU]
+tettamanti tet}ant/
+tetterton tetPt~
+tetzlaff tetzl@f
+tetzloff tetzl{f
+teuber t<bP
+teubner t<bnP
+teufel t<f@l
+teuscher t<SP
+teutsch t<C
+teva tAv@
+tevatron tev@tron
+teves tEvz
+tevis tevis
+tevlin tevlin
+tevye tev/
+tew CU
+tew tEEdub@lyU
+tew tU
+tewell tewcl
+tewes CUz
+tewksbury tUksbP/
+tews CUz
+tex teks
+texaco teks@k]
+texaco's teks@k]z
+texan teks~
+texan's teks~z
+texans teks~z
+texarkana teksorkan@
+texas teks@s
+texas' teks@s
+texas' teks@s@z
+texas's teks@s@z
+texasgulf teks@sgulf
+texeira tAks,r@
+texfi teksf/
+texpool tekspUl
+texscan tekskan
+texstar tekstor
+texstyrene tekstIrEn
+text tekst
+textbook tekstbqk
+textbooks tekstbqks
+texter tekstP
+textile tekstIl
+textiles tekstIlz
+textor tekstP
+textron tekstron
+textron's tekstronz
+texts teksts
+textual teksC@w@l
+texture teksCP
+textured teksCPd
+textures teksCPz
+tezak tez@k
+tezeno tAzAn]
+th tEAC
+thabo TAb]
+thach TaC
+thacher TakP
+thacker TakP
+thackeray TakP/
+thackery's TakP/z
+thackston Takst~
+thad Tad
+thada Tod@
+thadda Tad@
+thaddea Tad/@
+thaddeus Tad/@s
+thaden TAd~
+thagard TagPd
+thaggard TagPd
+thai tI
+thai's tIz
+thailand tIland
+thailand's tIlandz
+thain TAn
+thaine TAn
+thais tIz
+thakkar TakP
+thal Tal
+thalacker Tal@kP
+thalamus Tal}@s
+thalassa Tolos@
+thaler TAlP
+thalheimer TalhImP
+thalia TAly@
+thalia's TAly@z
+thalidomide T@lid}Id
+thall T{l
+thallium Tal/}
+thalman Talm~
+thalmann T{lm~
+tham Tam
+thames temz
+than Tan
+than T~
+thane TAn
+thanh Tan
+thank TaNk
+thank's TaNks
+thanked TaNkt
+thankful TaNkf@l
+thankfully TaNkf@l/
+thanking TaNk6N
+thankless TaNkl@s
+thanks TaNks
+thanksgiving TaNksgiv6N
+thano Ton]
+thanos Ton]s
+thao T?
+thar T)r
+tharp T)rp
+tharpe T)rp
+tharrington Tar6Nt~
+thassos Tas]s
+that T@t
+that Tat
+that'd Tat@d
+that'll Tat@l
+that's Tats
+that've Tat@v
+thatch TaC
+thatched TaCt
+thatcher TaCP
+thatcher's TaCPz
+thatcherism TaCPiz}
+thatcherite TaCPIt
+thatches TaC@z
+thau T?
+thaw T{
+thawed T{d
+thawing T{6N
+thaws T{z
+thaxter TakstP
+thaxton Takst~
+thayer TAP
+thayne TAn
+the T/
+the T@
+the Tu
+thea TE@
+theall TEl
+theano TEn]
+theater TE@tP
+theater's TE@tPz
+theatergoer TEtPg]P
+theatergoers TEtPg]Pz
+theaters TE@tPz
+theatre TE@tP
+theatre's TE@tPz
+theatres TE@tPz
+theatrical T/atr6k@l
+theatricality T/atr@kal@t/
+theatrically T/atr6k@l/
+theatrically T/atr6kl/
+theatrics TEtr6ks
+thebeau T@bO
+theberge TebPj
+thebes TEbz
+thecla Tekl@
+theda TEd@
+thede TEd
+thedford TedfPd
+thee TE
+theel TEl
+theft Teft
+thefts Tefts
+theil TIl
+theile TIl
+theilen TIl~
+theiler TIlP
+thein TIn
+their T,r
+theirs T,rz
+theirself Terself
+theis TIz
+theisen TIs~
+theism TEiz}
+theiss TIs
+theissen TIs~
+thekla Tekl@
+thelander Tel~dP
+thelen Tel~
+thelin Telin
+thelma Telm@
+thelma's Telm@z
+thelonius T@lOn/@s
+them Tem
+them T}
+thematic T/mat6k
+thematically T}at6kl/
+theme TEm
+themed TEmd
+themes TEmz
+themself Tcmself
+themself T}self
+themselves Tcmselvz
+themselves T}selvz
+then Ten
+thence Tens
+thenceforth Tensf{rT
+theo TE]
+theo's TE]z
+theobald TE@b@ld
+theocracy T/okr@s/
+theocratic TE@krat6k
+theodor TE@dP
+theodora TE@d{r@
+theodore TE@d{r
+theodorou TE@dPU
+theodric TE@dr6k
+theola TE@l@
+theologian TE@lOj/~
+theologians TE@lOj~z
+theological TE@loj6k@l
+theologically TE@loj6kl/
+theology T/ol@j/
+theon TE~
+theone TEon
+theophania T/@fan/@
+theophila TA@fEl@
+theora TEP@
+theorem Tir}
+theoretical TEPet6k@l
+theoretically TEPet6k@l/
+theoretically TEPet6kl/
+theoretician TEP@tiS~
+theoreticians TEP@tiS~z
+theories TEP/z
+theories Tir/z
+theorist TEP@st
+theorists TEP@s
+theorists TEP@ss
+theorists TEP@sts
+theorize TEPIz
+theorized TEPIzd
+theorizes TEPIz@z
+theorizing TEPIz6N
+theory TEP/
+theory Tir/
+theory's TEP/z
+theory's Tir/z
+thera T,r@
+therafectin Ter@fektin
+therani teron/
+therapeutic Ter@pyUt6k
+therapeutically Ter@pyUt6k@l/
+therapeutically Ter@pyUt6kl/
+therapeutics Ter@pyUt6ks
+therapies T,r@p/z
+therapist T,r@p@st
+therapist's T,r@p@sts
+therapists T,r@p@s
+therapists T,r@p@ss
+therapists T,r@p@sts
+therapists's T,r@p@s
+therapists's T,r@p@ss
+therapists's T,r@p@sts
+therapy T,r@p/
+there T,r
+there'd T,rd
+there'll T,r@l
+there're T,rP
+there's T,rz
+there've T,rv
+thereabouts Ter@b?ts
+thereafter TcraftP
+thereby T,rbI
+therefore T,rf{r
+therein Tcrin
+thereof Teruv
+theresa tPAs@
+theresa tPEs@
+therese T,r/s
+thereupon Ter@pon
+theriault Ter/O
+therien Tir/n
+theriot Tir/ot
+therm TVm
+thermae TVmE
+thermal TVm@l
+thermco TVmk]
+thermedics TPmed6ks
+thermits TVmits
+thermo TVm]
+thermometer TPmom@tP
+thermometers TPmom@tPz
+thermonuclear TVm]nUkl/P
+thermopatch TVm]paC
+thermoplastic TVm@plast6k
+thermoplastics TVm@plast6ks
+thermos TVm@s
+thermosetting TVm]set6N
+thermostat TVm@stat
+thermostats TVm@stats
+theron T,r~
+theroux TPU
+therrell T,r@l
+therriault T,r/O
+therrien T,r/n
+thesaurus T@s{r@s
+these TEz
+theses TEs/z
+thesing TEs6N
+thesing TEz6N
+thesis TEs@s
+thespian Tesp/~
+theta TAt@
+thetford TetfPd
+thetis TEt@s
+theurer TVP
+theus TyUz
+thew TU
+thewlis TyUlis
+they TA
+they'd TAd
+they'll TAl
+they're T,r
+they've TAv
+thi TE
+thiamin TI}~
+thibadeau tib@d]
+thibault T@bO
+thibeau T@bO
+thibeault tEb]
+thibeaux T@bO
+thibedeau Tib@d]
+thibert T@bVt
+thibodeau Tib@d]
+thibodeaux Tib@d]
+thick Tik
+thicken Tik~
+thickened Tik~d
+thickener Tik~P
+thickening Tikn6N
+thickening Tik~6N
+thickens Tik~z
+thicker TikP
+thickest Tik@st
+thicket Tik@t
+thickets Tik@ts
+thickhead Tikhed
+thickly Tikl/
+thickness Tikn@s
+thiebaud TEbO
+thiede TEd
+thief TEf
+thief's TEfs
+thiel TEl
+thiele TEl
+thielemann TElm~
+thielen TEl~
+thielke TElk
+thielman TElm~
+thielsch TElS
+thiem TEm
+thieman TEm~
+thiemann TEm~
+thieme TEm
+thien TEn
+thier TEP
+thierry T6rE
+thiery Tir/
+thies TEz
+thiesen TEs~
+thiessen TEs~
+thievery TEvP/
+thieves TEvz
+thieves' TEvz
+thieving TEv6N
+thigh TI
+thighs TIz
+thigpen Tigp~
+thill Til
+thima TEm@
+thimble Timb@l
+thin Tin
+thine TIn
+thing TiN
+thing's TiNz
+things TiNz
+things' TiNz
+thingy TiN/
+think TiNk
+think's TiNks
+thinker TiNkP
+thinkers TiNkPz
+thinkin TiNk~
+thinkin' TiNk~
+thinking TiNk@N
+thinkpad TiNkpad
+thinks TiNks
+thinly Tinl/
+thinned Tind
+thinner TinP
+thinnes Tin@z
+thinnes Tinz
+thinness Tin@s
+thinness Tinn@s
+thinnest Tin@st
+thinning Tin6N
+thins Tinz
+thiodiglycol TI]digl6kol
+thiodiglycol TI]diglIkol
+thiokol TI@k{l
+thiokol's TI@k{lz
+third TVd
+third's TVdz
+thirdly TVdl/
+thirdquarter TVdkw{rtP
+thirdquarter TVdk{rtP
+thirds TVdz
+thirst TVst
+thirsty TVst/
+thirteen TVtEn
+thirteen's TVtEnz
+thirteenth TVtEnT
+thirteenths TVtEnTs
+thirties TVt/z
+thirtieth TVt/@T
+thirty TVd/
+thirty TVtE
+thirty's TVd/z
+thirty's TVtEz
+thirtysomething TVt/sumT6N
+thiry Tir/
+thirza TVz@
+this T@s
+this Tis
+this' T@s
+this' Tis
+this'll T@s@l
+this'll Tis@l
+thissen Tis~
+thistle Tis@l
+thistles Tis@lz
+thivierge T6vErj
+tho TO
+thobe TOb
+thode TOd
+thoele TOl
+thoen TOn
+thoene To/n
+thoennes TOnz
+thole TOl
+tholen Tol~
+tholl Tol
+thom tom
+thoma TOm@
+thoman TOm~
+thomann TOm~
+thomas tom@s
+thomas' tom@s
+thomas' tom@s@z
+thomas's tom@s@z
+thomasas tom@s@s
+thomases tom@s@z
+thomasina T]mosEn@
+thomasine T]mosEn/
+thomason Tom@s~
+thomassen Tom@s~
+thomasson Tom@s~
+thomasville tom@svil
+thome TOm
+thomes TOmz
+thometz TOmcts
+thomison Tom@s~
+thomley Toml/
+thommen Tom~
+thomp Tomp
+thompkins Tompkinz
+thompsen Tomps~
+thompsen Toms~
+thompson tomps~
+thompson toms~
+thompson's tomps~z
+thompson's toms~z
+thompsons tomps~z
+thompsons toms~z
+thoms Tomz
+thomsen Toms~
+thomson toms~
+thomson's toms~z
+thomspon Tomsp~
+thomure TomyUr
+thon Ton
+thone TOn
+thong T{N
+thor T{r
+thora T{r@
+thoracic T{ras6k
+thorald T{r@ld
+thorax T{raks
+thorbert T{rbPt
+thorberta T{rb,rt@
+thorburn T{rbPn
+thordia T{rd/@
+thordis T{rdis
+thoreau TPO
+thorell T{r@l
+thoren T{r~
+thoresen T{r/z~
+thoreson T{r@s~
+thorington T{r6Nt~
+thorium T)r/}
+thorley T{rl/
+thorman T{rm~
+thormond T{rm~d
+thormund T{rm~d
+thorn T{rn
+thorn's T{rnz
+thornberg T{rnbPg
+thornberry T{rnber/
+thornburg T{rnbPg
+thornburgh T{rnbPg
+thornburgh's T{rnbPgz
+thornbury T{rnber/
+thorndike T{rnd6k
+thorndyke T{rndIk
+thorne T{rn
+thornell T{rn@l
+thorner T{rnP
+thornhill T{rnhil
+thorniest T{rn/@st
+thornley T{rnl/
+thornock T{rn@k
+thorns T{rnz
+thornsberry T{rnzbcr/
+thornsbury T{rnzbcr/
+thornton T{rnt~
+thorny T{rn/
+thorough TV]
+thoroughbred TV]bred
+thoroughbreds TV]bredz
+thoroughfare TV]fer
+thoroughfares TV]ferz
+thoroughly TV]l/
+thoroughness TV]n@s
+thorp T{rp
+thorpe T{rp
+thorsell T{rs@l
+thorsen T{rs~
+thorson T{rs~
+thorstad T{rst@d
+thorsten t{rst~
+thorstenson T{rst~s~
+thortec T{rtek
+thorton T{rt~
+thorton's T{rt~z
+thorup T{r@p
+thorvald T{rvold
+those TOz
+thou T?
+though TO
+thought T{t
+thoughtful T{tf@l
+thoughtfully T{tf@l/
+thoughtfulness T{tf@ln@s
+thoughtless T{tl@s
+thoughts T{ts
+thous T?z
+thousand T?z~
+thousand T?z~d
+thousands T?z~dz
+thousands T?z~z
+thousandth T?z~T
+thousandth T?z~dT
+thousandths T?z~Ts
+thousandths T?z~dTs
+thraco-illyrian TrAkO@lir/~
+thrailkill TrAlkil
+thrall Tr{l
+thrash TraS
+thrashed TraSt
+thrasher TraSP
+thrashes TraS@z
+thrashing TraS6N
+thread Tred
+threadbare Tredber
+threaded Tred@d
+threadfin Tredfin
+threadgill Tredgil
+threading Tred6N
+threads Tredz
+threat Tret
+threaten Tret~
+threatened Tret~d
+threatening Tretn6N
+threatening Tret~6N
+threateningly Tretn6Nl/
+threateningly Tret~6Nl/
+threatens Tret~z
+threats Trets
+threatt TrEt
+three TrE
+three's TrEz
+threefold TrEfOld
+threemonth TrEm~T
+threes TrEz
+threesome TrEs}
+threet TrEt
+threlkeld Trelkeld
+thresh TreS
+thresher TreSP
+threshold TreSOld
+thresholds TreShOldz
+threw TrU
+thrice TrIs
+thrift Trift
+thrift's Trifts
+thriftier Trift/P
+thrifts Trifs
+thrifts Trifts
+thrifts' Trifs
+thrifts' Trifts
+thrifty Trift/
+thrill Tril
+thrilled Trild
+thriller TrilP
+thrillers TrilPz
+thrilling Tril6N
+thrills Trilz
+thrips Trips
+thristing Trist6N
+thrive TrIv
+thrived TrIvd
+thrives TrIvz
+thriving TrIv6N
+throat TrOt
+throated TrOt@d
+throats TrOts
+throb Trob
+throbbing Trob6N
+throes TrOz
+throgmorton Tr@gm{rt~
+throm Trom
+thrombolysis TrombOl@s@s
+thrombolytic Tromb]lit6k
+thrombosis TrombOs@s
+throne TrOn
+throneberry TrOnber/
+throng Tr{N
+thronged Tr{Nd
+throngs Tr{Nz
+thronson Trons~
+throop TrUp
+throttle Trot@l
+throttled Trot@ld
+throttles Trot@lz
+throttling Trot@l6N
+throttling Trotl6N
+through TrU
+throughout TrU?t
+throughput TrUpqt
+throughs TrUz
+throughway TrUwA
+throve TrOv
+throw TrO
+throwaway TrO@wA
+throwback TrObak
+thrower TrOP
+throwers TrOPz
+throwing TrO6N
+thrown TrOn
+throws TrOz
+thru TrU
+thrun Trun
+thrush TruS
+thrushes TruS@z
+thrust Trust
+thruster TrustP
+thrusters TrustPz
+thrusting Trust6N
+thrusts Trus
+thrusts Truss
+thrusts Trusts
+thruway TrUwA
+ths Ts
+thud Tud
+thug Tug
+thuggery TugP/
+thugs Tugz
+thul Tul
+thulin TUlin
+thull Tul
+thum Tum
+thuma TUm@
+thuman TUm~
+thumann TUm~
+thumb Tum
+thumbed Tumd
+thumbing Tum6N
+thumbnail TumnAl
+thumbs Tumz
+thumm Tum
+thumma Tum@
+thump Tump
+thumped Tumpt
+thumper TumpP
+thumping Tump6N
+thumps Tumps
+thun Tun
+thunberg TunbPg
+thunder TundP
+thunderbird TundPbVd
+thunderbirds TundPbVdz
+thunderbolt TundPb{lt
+thundercat TundPkat
+thundercats TundPkats
+thundered TundPd
+thundering TundP6N
+thunderous TundP@s
+thunders TundPz
+thundershower TundPS?wP
+thundershowers TundPS?wPz
+thunderstorm TundPst{rm
+thunderstorms TundPst{rmz
+thunderstruck TundPstruk
+thune TUn
+thunk Tunk
+thuot T?t
+thuot TUt
+thur TV
+thurber TVbP
+thurgood TVgqd
+thurlow TVl]
+thurm TVm
+thurman TVm~
+thurmon TVm~
+thurmond TVm~d
+thurmond's TVm~dz
+thurn TVn
+thurnau TPnO
+thurner TVnP
+thurnher TVnP
+thurow Tqr]
+thursby TVsb/
+thursday TVzd/
+thursday TVzdA
+thursday's TVzd/z
+thursday's TVzdAz
+thursdays TVzd/z
+thursdays TVzdAz
+thurstan TVst~
+thurston TVst~
+thus Tus
+thusfar Tusfor
+thusly Tusl/
+thuy tU
+thwart Tw{rt
+thwarted Tw{rt@d
+thwarting Tw{rt6N
+thwarts Tw{rts
+thweatt TwEt
+thwing TwiN
+thy TI
+thygerson TIgPs~
+thyme TIm
+thymidine Tim@dEn
+thyra TIr@
+thyroid TIr<d
+thyssen tIs~
+thyssen's tIs~z
+ti tE
+tia tE@
+tiaacref tE@kref
+tiaacref's tE@krefs
+tian tyon
+tiananmen t/enanmen
+tianjin t/anjin
+tiano t/on]
+tiara t/)r@
+tibbals tib@lz
+tibbets tibits
+tibbett tibct
+tibbetts tibcts
+tibbie tib/
+tibbits tibits
+tibbitts tibits
+tibbs tibz
+tibby tib/
+tiber tIbP
+tiberi t/b,r/
+tiberia tibEr/@
+tiberio tibEr/]
+tibet t@bet
+tibetan t@bet~
+tibetans t@bet~z
+tibia tib/@
+tibidow tib/d]
+tic tik
+tice tIs
+ticer tIsP
+tichenor tik~P
+tichy tiC/
+ticinus tisEn@s
+tick tik
+ticked tikt
+ticker tikP
+ticket tik@t
+ticket's tik@ts
+ticketed tik@t@d
+ticketing tik@t6N
+ticketless tik@tl@s
+ticketmaster tik@tmastP
+ticketmaster's tik@tmastPz
+ticketron tik@tron
+tickets tik@ts
+ticking tik6N
+tickle tik@l
+tickled tik@ld
+tickles tik@lz
+ticklish tik@l6S
+tickner tiknP
+ticknor tiknP
+ticks tiks
+ticonderoga tIkondPOg@
+ticonderoga's tIkondPOg@z
+ticor tIk{r
+tics tiks
+tidal tId@l
+tidball tidb{l
+tidbit tidbit
+tidbits tidbits
+tidd tid
+tiddlywinks tidl/w6Nks
+tiddlywinks tidl@w6Nks
+tide tId
+tides tIdz
+tidewater tIdw{tP
+tiding tId6N
+tidings tId6Nz
+tidmore tidm{r
+tidrick tidr6k
+tidwell tidw@l
+tidy tId/
+tie tI
+tied tId
+tiede tEd
+tiedeman tEdm~
+tiedemann tEdm~
+tiedt tEdt
+tiegs tEgz
+tieing tI6N
+tieken tEk~
+tieless tIl@s
+tieman tEm~
+tiemann tEm~
+tiemeyer tEmIP
+tien tyen
+tien-fu tyenfU
+tienanmen tycn~men
+tier tEr
+tierce tErs
+tierco tErk]
+tiered tErd
+tiernan tirn~
+tierney tirn/
+tierno tirn]
+tiers tErz
+ties tIz
+tieszen tES~
+tietje tEtj
+tietjen tEtj~
+tietmeyer tEtmIr
+tietmeyer tItmIr
+tietz tEts
+tietze tEtz
+tietze tEtz/
+tieu t/U
+tiff tif
+tiffany tif~/
+tiffany's tif~/z
+tiffin tifin
+tifft tift
+tift tift
+tifton tift~
+tig tig
+tigar tIgP
+tigar tIgor
+tiger tIgP
+tiger's tIgPz
+tigera t6j,r@
+tigers tIgPz
+tigers' tIgPz
+tigert tIgPt
+tigges tigz
+tiggs tigz
+tighe tIg
+tight tIt
+tighten tIt~
+tightened tIt~d
+tightening tItn6N
+tightening tIt~6N
+tightenings tItn6Nz
+tightenings tIt~6Nz
+tightens tIt~z
+tighter tItP
+tightest tIt@st
+tightfisted tItfist@d
+tightly tItl/
+tightness tItn@s
+tightrope tItrOp
+tights tIts
+tightwad tItwod
+tigner tIgnP
+tignor tignP
+tigon tig~
+tigrean t6grEn
+tigris tIgr@s
+tigue tEg
+tijerina t/ycrEn@
+tijuana t/won@
+tike tIk
+tikes tIks
+til til
+tilbury tilber/
+tilda tild@
+tilden tild~
+tile tIl
+tiled tIld
+tiles tIlz
+tiley tIl/
+tilford tilfPd
+tilghman tilm~
+till til
+tiller tilP
+tillery tilP/
+tilles tIlz
+tillett til@t
+tilley til/
+tillie til/
+tilling til6N
+tillinghast til6Nhast
+tillis til6s
+tillison til@s~
+tillman tilm~
+tillmon tilm~
+tillotson til@ts~
+tillson tils~
+tilly til/
+tilman tilm~
+tilney tiln/
+tilson tils~
+tilt tilt
+tilted tilt@d
+tilth tilT
+tilting tilt6N
+tilton tilt~
+tilts tilts
+tim tim
+tim's timz
+timan tIm~
+timber timbP
+timberlake timbPlAk
+timberland timbPland
+timberlands timbPlandz
+timberline timbPlIn
+timberman timbPm~
+timbers timbPz
+timblin timblin
+timbre timbP
+timbrook timbrqk
+timbs timz
+timbuktu timb@ktU
+time tIm
+time's tImz
+timed tImd
+timeframe tImfrAm
+timeless tIml@s
+timeline tImlIn
+timelines tImlInz
+timeliness tIml/n@s
+timely tIml/
+timeout tIm?t
+timepiece tImpEs
+timeplex tImpleks
+timer tImP
+timers tImPz
+times tImz
+times' tImz
+times's tImz@z
+timeshare tImSer
+timetable tImtAb@l
+timetables tImtAb@lz
+timewise tImwIz
+timex tImcks
+timid tim@d
+timidity t}id@t/
+timidly tim@dl/
+timing tIm6N
+timisoara tim@s])r@
+timisoara tim@sw)r@
+timken timk~
+timko timk]
+timlen timl~
+timlin timlin
+timm tim
+timme tim
+timmeny tim~/
+timmer timP
+timmerman timPm~
+timmermann timPm~
+timmers timPz
+timmie tim/
+timmins timinz
+timmons tim~z
+timms timz
+timmy tim/
+timon tIm~
+timoney tim~/
+timor t/m{r
+timor's t/m{rz
+timorese tEm{rEz
+timorous timP@s
+timothea tim@TE@
+timothy tim@T/
+timpani timp~E
+timpe timp
+timpone t/mpOn/
+timpson timps~
+tims timz
+timson tims~
+tin tin
+tina tEn@
+tina's tEn@z
+tinajero t/noy,r]
+tinch tinC
+tincher tinCP
+tincture tiNkCP
+tinctures tiNkCPz
+tindal tind@l
+tindall tind@l
+tindel tind@l
+tindell tind@l
+tinder tindP
+tinderbox tindPboks
+tindle tind@l
+tindol tind@l
+tine tIn
+tiner tInP
+tines tInz
+ting tiN
+tinge tinj
+tinged tiNd
+tingen tiN~
+tingey tiNg/
+tingle tiNg@l
+tingler tiNg@lP
+tingley tiNgl/
+tingling tiNg@l6N
+tingling tiNgl6N
+tinier tIn/P
+tiniest tIn/@st
+tinker tiNkP
+tinker's tiNkPz
+tinkered tiNkPd
+tinkerer tiNkPP
+tinkerers tiNkPPz
+tinkering tiNkP6N
+tinkering tiNkr6N
+tinkey tinkE
+tinkham tiNk}
+tinkle tiNk@l
+tinkled tiNk@ld
+tinkler tiNk@lP
+tinkling tiNk@l6N
+tinkling tiNkl6N
+tinley tinl/
+tinman tinman
+tinnell tin@l
+tinney tin/
+tinnin tinin
+tinnon tin~
+tinny tin/
+tino tEn]
+tinoco t/nOk]
+tins tinz
+tinsel tins@l
+tinseltown tins@lt?n
+tinsley tinsl/
+tinsman tinsm~
+tint tint
+tinted tint@d
+tinto tint]
+tinton tint~
+tints tints
+tintype tintIp
+tiny tIn/
+tip tip
+tipa tip@
+tiphook tiphqk
+tipler tIp@lP
+tipo tEp]
+tipoff tip{f
+tipp tip
+tipped tipt
+tippen tip~
+tippens tip~z
+tipper tipP
+tipperary tipPer/
+tippers tipPz
+tippet tip@t
+tippets tipcts
+tippett tipct
+tippetts tipcts
+tippie tip/
+tippin tipin
+tipping tip6N
+tippins tipinz
+tippit tipit
+tippitt tipit
+tipple tip@l
+tipps tips
+tippy tip/
+tippy's tip/z
+tips tips
+tipster tipstP
+tipsword tips{rd
+tipsy tips/
+tiptoe tiptO
+tiptoed tiptOd
+tiptoeing tiptO6N
+tipton tipt~
+tirade tIrAd
+tirades tIrAdz
+tirado t6rod]
+tiramisu tir}isU
+tirana tiron@
+tirane t6rAn
+tire tIP
+tired tIPd
+tiredness tIPdn@s
+tireless tIPl@s
+tirelessly tIrl@sl/
+tirello t6rel]
+tiremaker tIrmAkP
+tires tIPz
+tiresome tIPs}
+tirey tIr/
+tiring tIr6N
+tirone t6rOn
+tiros tIr]z
+tirpak tVp@k
+tirrell t6rAl
+tis tiz
+tisch tiS
+tisch's tiS@z
+tischer tiSP
+tischler tiS@lP
+tisdale tisdAl
+tisdel tisd@l
+tisdell tisd@l
+tish tiS
+tish's tiS@z
+tisher tiSP
+tishler tiSlP
+tishman tiSm~
+tison tis~
+tissue tiSU
+tissue tisyU
+tissues tiSUz
+tissues tisyUz
+tit tit
+tit-for-tat titf{rtat
+tita tEt@
+titan tIt~
+titanate tIt~At
+titania t@tony@
+titanic tItan6k
+titanium tItAn/}
+titans tIt~z
+titcomb titk}
+tithe tIT
+tithing tIT6N
+titian tiS~
+titillate tit@lAt
+titillated tit@lAt@d
+titillating tit@lAt6N
+titillation tit@lAS~
+title tIt@l
+titled tIt@ld
+titleholder tIt@lhOldP
+titles tIt@lz
+titlow titlO
+titman titm~
+tito tEt]
+tito's tEt]z
+titone tit~
+titsworth titswVT
+tittel tit@l
+titter titP
+titterington titP6Nt~
+tittle tit@l
+tittsworth titswPT
+titular tiC@lP
+titus tIt@s
+titusville tIt@svil
+titzer titzP
+tivoli tiv@l/
+tizzy tiz/
+tjaden jAd~
+tjarks j)rks
+tkach kaC
+tkacz koC
+tlingit tlENg@t
+to t6
+to t@
+to tU
+toa tO@
+toad tOd
+toads tOdz
+toal tOl
+toalson tOls~
+toalster tOlstP
+toast tOst
+toasted tOst@d
+toaster tOstP
+toasters tOstPz
+toasting tOst6N
+toastmaster tOstmastP
+toasts tOs
+toasts tOss
+toasts tOsts
+tobacco t@bakO
+tobacco's t@bakOz
+tobaccos t@bakOz
+toback CUbak
+tobago t@bAg]
+tobar tObP
+tobe tOb
+toben tOb~
+tober tObP
+tobey tOb/
+tobia tOb/@
+tobias t@bI@s
+tobiason t@bI@s~
+tobie tOb/
+tobin tObin
+tobler tOb@lP
+toboggan t@bog~
+toboggans t@bog~z
+tobolski t@bOlsk/
+tobu t]bU
+toby tOb/
+tocci tOC/
+tocco tok]
+tock tok
+tocqueville tOkvil
+toczek toCck
+tod tod
+toda tOd@
+todaro t]d)r]
+today t@dA
+today tUdA
+today'll t@dAl
+today'll tUdAl
+today's t@dAz
+today's tUdAz
+todays t@dAz
+todays tUdAz
+todd tod
+todd's todz
+toddle tod@l
+toddler todlP
+toddlers todlPz
+toddling todl6N
+todhunter todhuntP
+todi's tOd/s
+todisco t]dEsk]
+todman todm~
+todoroff todP{f
+todt todt
+toe tO
+toed tOd
+toehold tOhOld
+toeing tO6N
+toelle tOl
+toenail tOnAl
+toenails tOnAlz
+toenjes tOnj@z
+toensing tOns6N
+toepfer tOpfP
+toes tOz
+toews toUz
+toffee tof/
+toffler t{flP
+toft toft
+tofte tOft
+tofu tOfU
+toga tOg@
+together t@geTP
+togetherness t@geTPn@s
+togethers t@geTPz
+toggle tog@l
+toggled tog@ld
+toggling togl6N
+tognino tognEn]
+togo tOg]
+togs togz
+toil t<l
+toiled t<ld
+toilet t<l@t
+toiletries t<l@tr/z
+toiletry t<l@tr/
+toilets t<l@ts
+toiling t<l6N
+toils t<lz
+toity t<t/
+toivonen t<v~~
+tokai t]kI
+tokar t]k)r
+tokarczyk tokPC6k
+tokars t]k)rz
+tokarski t@k)rsk/
+tokarz tOkorz
+token tOk~
+tokenism tOk~iz}
+tokens tOk~z
+tokio t]kE]
+tokkin tokin
+tokos tOk]s
+tokunaga t]kUnog@
+tokuo tokyU]
+tokuyama tOkUyom@
+tokyo tOk/O
+tokyo's tOk/Oz
+tokyu tOkyU
+tolan tOl~
+toland tOl~d
+tolanthe t]lonT/
+tolar tOlP
+tolbert tOlbPt
+told tOld
+toldrian tOldr/~
+tole tOl
+toledo t@lEd]
+tolen tOl~
+tolentino tOlcntEn]
+toler tOlP
+tolerable tolP@b@l
+tolerance tolP~s
+tolerances tolP~s@z
+tolerant tolP~t
+tolerate tolPAt
+tolerated tolPAt@d
+tolerates t{lPAts
+tolerating tolPAt6N
+toleration tolPAS~
+toles tOlz
+tolhurst tOlhPst
+tolin tOlin
+toliver tOl6vP
+toll tOl
+tolland tol~d
+tolland's tol~dz
+tollbooth tOlbUT
+tolle tol
+tolled tOld
+tollefsen tol@fs~
+tollefson tol@fs~
+toller tOlP
+tolles tOlz
+tolleson tol@s~
+tollett tol@t
+tolley tol/
+tolling tOl6N
+tollison tol@s~
+tolliver tOl6vP
+tolls tOlz
+tolly tOl/
+tolman tolm~
+tolsma tOlsm@
+tolson tOls~
+tolstoy tOlst<
+tolstoy's tOlst<z
+tom tom
+tom's tomz
+toma tOm@
+tomahawk tom@h{k
+tomahawks tom@h{ks
+tomaino t]moEn]
+tomako t]mok]
+tomako's t]mok]z
+toman tOm~
+tomanek tom~6k
+tomaro t]m)r]
+tomas t]mos
+tomasek t}osck
+tomaselli t]mosel/
+tomasello t]mosel]
+tomasetti t]moset/
+tomasi t]mos/
+tomasic t}os6k
+tomasik t}os6k
+tomasina t{m@sEn@
+tomasine t]mosEn/
+tomasini t]mosEn/
+tomasino t]mosEn]
+tomasko t}osk]
+tomaso t]mos]
+tomassetti t]moset/
+tomassi t]mos/
+tomasso t]mos]
+tomasulo t]mosUl]
+tomaszewski tom6Sefsk/
+tomato t}AtO
+tomato t}otO
+tomatoes t}At]z
+tomatoes t}ot]z
+tomatos t}AtOz
+tomatos t}otOz
+tomayko t}Ik]
+tomb tUm
+tomberlin tombPlin
+tomblike tUmlIk
+tomblin tomblin
+tomboy tomb<
+tombs tUmz
+tombstone tUmstOn
+tombstones tUmstOnz
+tomcat tomkat
+tomczak tomCak
+tomczyk tomC6k
+tome tOm
+tomei tomI
+tomek tOmck
+tomeo tOm/]
+tomer tOmP
+tomerlin tomPlin
+tomes tOmz
+tomey tOm/
+tomich tom6k
+tomiichi tOm/EC/
+tomilson tom@ls~
+tomita t]mEt@
+tomkiewicz tomk@v6C
+tomkin tomkin
+tomkins tomkinz
+tomkinson tomkins~
+tomko tomk]
+tomlin tomlin
+tomlinson toml~s~
+tommie tom/
+tommy tom/
+tommy's tom/z
+tomorrow tUm)rO
+tomorrow t})rO
+tomorrow's tUm)rOz
+tomorrow's t})rOz
+tomorrows tUm)rOz
+tomorrows t})rOz
+tompane tompAn
+tompkins tompkinz
+tompkinses tompkins@z
+tompson tomps~
+toms tomz
+tomsic toms6k
+tomson toms~
+ton tun
+tonal tOn@l
+tonalities t]nal@t/z
+tonality t]nal@t/
+tonawanda ton@wond@
+tonda tond@
+tondreau t~drO
+tone tOn
+toned tOnd
+tonegawa tOn6gow@
+tonelli t]nel/
+toner tOnP
+tones tOnz
+toney tOn/
+tong t{N
+tonge tonj
+tongs toNz
+tongue tuN
+tongued tuNd
+tongues tuNz
+toni tOn/
+tonia tOn/@
+tonic ton6k
+tonics ton6ks
+tonie tOn/
+toniest tOn/@st
+tonight tUnIt
+tonight t~It
+tonight's tUnIts
+tonight's t~Its
+toning tOn6N
+tonini t]nEn/
+tonite t~It
+tonjes tOnycs
+tonk t{Nk
+tonka toNk@
+tonka's toNk@z
+tonkin toNkin
+tonkovich toNk@v6C
+tonks toNks
+tonn ton
+tonnage tun@j
+tonnages tun@j@z
+tonne tun
+tonner tunP
+tonnes tunz
+tonnesen tuns~
+tons tunz
+tonsil tons@l
+tonsillectomies tons@lekt}/z
+tonsillectomy tons@lekt}/
+tonsils tons@lz
+tonti tont/
+tonton tont~
+tontons tont~z
+tony tOn/
+tony's tOn/z
+tonya tony@
+tonya's tony@z
+tonyes tOny@z
+tonys tOn/z
+too tU
+toobin tUb~
+toobin's tUb~z
+toogood tUgqd
+toohey tU/
+took tqk
+tooke tqk
+tooker tqkP
+tookes tqks
+tool tUl
+toolan tUl~
+toolbox tUlb{ks
+toole tUl
+tooled tUld
+tooley tUl/
+tooling tUl6N
+toolmaker tUlmAkP
+toolmakers tUlmAkPz
+toolroom tUlrUm
+tools tUlz
+toolworks tUlwVks
+tooman tUm~
+toombs tUmz
+toomer tUmP
+toomey tUm/
+toon tUn
+toone tUn
+toops tUps
+toot tUt
+tootal tUt@l
+toote tUt
+tooth tUT
+toothaker tUT@kP
+toothbrush tUTbruS
+toothbrushes tUTbruS@z
+toothed tUTd
+toothed tUTt
+toothless tUTl@s
+toothlike tUTlIk
+toothman tUTm~
+toothpaste tUTpAst
+toothpastes tUTpAsts
+toothpick tUTpik
+toothpicks tUTpiks
+toothy tUT/
+tootle tUt@l
+toots tUts
+toots tqts
+tootsie tUtsE
+top top
+topalian t@pAl/~
+topanga t@pang@
+topaz tOpaz
+tope tOp
+topeka t@pEk@
+topeka t]pEk@
+topeka's t@pEk@z
+topekan t@pEk~
+topekans t@pEk~z
+topel tOp@l
+topete top/t
+topham tof}
+topiary tOp/er/
+topic top6k
+topical top6k@l
+topics top6ks
+topix tOpiks
+topix topiks
+topkapi topkop/
+topknot topnot
+topless topl@s
+topliff toplif
+topographic top@graf6k
+topography t@pogr@f/
+topol tOpol
+topolski t@pOlsk/
+topor topP
+topp top
+topped topt
+topper topP
+toppers topPz
+toppin topin
+topping top6N
+toppings top6Nz
+toppins topinz
+topple top@l
+toppled top@ld
+topples top@lz
+toppling top@l6N
+toppling topl6N
+topps tops
+tops tops
+topsoil tops<l
+topsy tops/
+topsy-turvy tops/tVv/
+toquepala tokwcpol@
+tor t{r
+torah t{r@
+torain tPAn
+torald t{r@ld
+toran t{ron
+toray t{rA
+torbeck t{rbck
+torbert t{rbPt
+torbett t{rbct
+torch t{rC
+torched t{rCt
+torches t{rC@z
+torchia t{rk/@
+torching t{rC6N
+torchmark t{rCmork
+tordella t{rdel@
+tore t{r
+torell t{rel
+torelli t{rel/
+torello t{rel]
+toren t{r~
+torey t{r/
+torgersen t{rgPs~
+torgerson t{rgPs~
+torgeson t{rg@s~
+tori t{r/
+torian t{r/~
+toribio t{rEb/]
+torie t{r/
+tories t{r/z
+tories' t{r/z
+torino t{rEn]
+torkelson t{rk@ls~
+torley t{rl/
+torma t{rm@
+torme t{rm
+torme t{rmA
+torment t{rment
+torment t{rment
+tormenta t{rment@
+tormented t{rment@d
+tormenting t{rment6N
+tormentor t{rmentP
+tormentors t{rmentPz
+torments t{rments
+tormey t{rm/
+torn t{rn
+tornabene t{rnoben@
+tornadic t{rnAd6k
+tornado t{rnAdO
+tornado's t{rnAdOz
+tornadoes t{rnAd]z
+tornados t{rnAdOz
+tornatore t{rnot{r/
+torney t{rn/
+torno t{rn]
+tornow t{rn]
+tornquist t{rnkwist
+toro t{r]
+torok t{r@k
+toronado t{r~od]
+toronto tPont]
+toronto t{ront]
+toronto's tPont]z
+toronto's t{ront]z
+torosian tPoZ~
+torp t{rp
+torpedo t{rpEdO
+torpedoed t{rpEdOd
+torpedoes t{rpEd]z
+torpedoing t{rpEdO6N
+torpedos t{rpEdOz
+torpey t{rp/
+torpid t{rp@d
+torpor t{rpP
+torque t{rk
+torr t{r
+torrance t{r~s
+torras t{r@s
+torray t{rA
+torre t{r
+torregrossa t{rcgrOs@
+torrejon t{r@jon
+torrence t{r~s
+torrens t{r~z
+torrent t{r~t
+torrential t{renC@l
+torrential t{renS@l
+torrents t{r~ts
+torrenzano t{rcnzon]
+torreon t{r/~
+torres t{rez
+torrey t{r/
+torrez t{rez
+torricelli t{r@sel/
+torrid t{r@d
+torrijos t{rE]s
+torrington t{r6Nt~
+torrisi t{rEs/
+torry t{r/
+torsiello t{rs/el]
+torso t{rsO
+torsos t{rsOz
+torstar t{rstor
+torsten t{rst~
+tort t{rt
+torte t{rt
+torti t{rt/
+tortilla t{rtE@
+tortillas t{rtE@z
+tortoise t{rt@s
+tortoises t{rt@s@z
+tortora t{rt{r@
+tortorella t{rt{rel@
+tortorelli t{rt{rel/
+tortorello t{rt{rel]
+tortorice t{rt{ris
+tortorici t{rt{rEC/
+tortoriello t{rt{r/el]
+torts t{rts
+tortuous t{rC@w@s
+torture t{rCP
+tortured t{rCPd
+tortures t{rCPz
+torturing t{rCP6N
+torturous t{rCU@s
+toru t{rU
+torumi t{rUm/
+torumi's t{rUm/z
+tory t{r/
+tosca t{sk@
+toscanini t{sk~En/
+toscanini's tusk~En/z
+toscano t]skon]
+tosch t{S
+tosco t{sk]
+tosh toS
+toshiba t]SEb@
+toshiba's t]SEb@z
+toshiharu tOS@h)rU
+toshihiko tOS@hEk]
+toshiki t]SEk/
+toshimitsu t]S/mEtsU
+toshio t]SE]
+toshiyuki tOS@yUk/
+tosi tOs/
+toso tOs]
+toss t{s
+tossed t{st
+tosses t{s@z
+tossing t{s6N
+tostado t]stod]
+toste tOst
+tostenson tost~s~
+tosti t{st/
+tosto tOst]
+tot tot
+tota tOt@
+total tOt@l
+total's tOt@lz
+totaled tOt@ld
+totaling tOt@l6N
+totalitarian tOtal@t,r/~
+totalitarianism tOtal@t,r/~iz}
+totalitarians t]tal@t,r/~z
+totality t]tal@t/
+totalled tOt@ld
+totalling tOt@l6N
+totally tOt@l/
+totals tOt@lz
+totaro t]t)r]
+tote tOt
+toted tOt@d
+totem tOt}
+totems tOt}z
+totenberg tOt~bPg
+totes tOts
+toth toT
+totherow tuTP]
+toti tOt/
+toting tOt6N
+totino's t@tEn]z
+totman totm~
+toto tOt]
+tots tots
+totten tot~
+tottenberg tot~bPg
+totter totP
+tottering totP6N
+totton tot~
+totty tot/
+totzke totsk/
+touareg tUP@g
+touch tuC
+touchdown tuCd?n
+touchdowns tuCd?nz
+touche tUS
+touched tuCt
+touches tuC@z
+touchet tUSet
+touchette tUSet
+touching tuC6N
+touchstone tuCstOn
+touchton tuCt~
+touchy tuC/
+toufexis tUfeksis
+tougaloo tUg@lU
+tougas tug@z
+tough tuf
+toughed tuft
+toughen tuf~
+toughened tuf~d
+toughening tuf~6N
+toughens tuf~z
+tougher tufP
+toughest tuf@st
+toughness tufn@s
+toughs tufs
+touhey tuh/
+toulouse tUlUz
+toupee tUpA
+toupin tUpin
+toups tUps
+tour tqr
+tour's tqrz
+tourangeau tqrANg]
+toured tqrd
+tourette tPet
+tourette's tPets
+touretzky tPetsk/
+tourigny tqrIn/
+touring tqr6N
+tourism tqriz}
+tourist tqr@st
+tourists tqris
+tourists tqriss
+tourists tqrists
+tourmaline tqrm@lEn
+tournament tqrn}~t
+tournament's tqrn}~ts
+tournaments tVn}~ts
+tourney tVn/
+tourneys tUrn/z
+tourniquet tPn6k@t
+tournquist tUrnkw@st
+touro tUr]
+tours tqrz
+tours t{rz
+tourtelot tqrt@lO
+tourtelot tqrt@lot
+tourville tqrvil
+tousey tus/
+tousignant tUs6gn~t
+tousley tusl/
+toussaint tUsan
+toussaud tUsod
+toussaud's tUsodz
+toussie tUs/
+tout t?t
+toutant tUt{nt
+touted t?t@d
+touting t?t6N
+touts t?ts
+touvier tUv/A
+touvier's tUv/Az
+tovar t]v)r
+tovaz tOvoz
+tovey tOv/
+tovia tOv/@
+tovia tOvy@
+tow tO
+toward t@w{rd
+toward t{rd
+towards t@w{rdz
+towards t{rdz
+towbin tObin
+towboat tObOt
+towe tO
+towed tOd
+towel t?@l
+towel t?l
+toweling t?@l6N
+toweling t?l6N
+towell towcl
+towels t?@lz
+towels t?lz
+tower t?P
+tower's t?Pz
+towered t?Pd
+towering t?P6N
+towering t?r6N
+towers t?Pz
+towers' t?Pz
+towery t]V/
+towey tO/
+towing tO6N
+towle t?l
+towle's t?lz
+towler tOlP
+towles tO@lz
+town t?n
+town's t?nz
+towne t?n
+towner t?nP
+towners t?nPz
+townes t?nz
+townhouse t?nh?s
+townhouses t?nh?s@z
+townie t?n/
+townley t?nl/
+towns t?nz
+townsel t?ns@l
+townsell t?ns@l
+townsend t?nz~d
+townsend's t?nz~dz
+townsfolk t?nzfOk
+townshend t?nSend
+township t?nSip
+township's t?nSips
+townships t?nSips
+townsley t?nsl/
+townsman t?nzm~
+townson t?ns~
+townspeople t?nzpEp@l
+towry t{r/
+tows tOz
+towsley tOsl/
+towson tOs~
+toxic toks6k
+toxicity toksis@t/
+toxicological toks@k@loj6k@l
+toxicologist toks6kol@j@st
+toxicologists toks6kol@j@s
+toxicologists toks6kol@j@ss
+toxicologists toks6kol@j@sts
+toxicology toks6kol@j/
+toxics toks6ks
+toxin toks~
+toxins toks~z
+toy t<
+toy's t<z
+toya t<@
+toyama t]yom@
+toye t<
+toyed t<d
+toying t<6N
+toyko t<k]
+toymaker t<mAkP
+toymakers t<mAkPz
+toyo tOy]
+toyobo t]yOb]
+toyoda t]yOd@
+toyoo t<U
+toyota t]yOt@
+toyota's t]yOt@z
+toyotas t<Ot@z
+toys t<z
+toys' t<z
+toystore t<st{r
+toystores t<st{rz
+tozer tOzP
+tozier tOz/P
+tozzi toz/
+traber trAbP
+trabert trabPt
+trabucco trobUk]
+trabue trobwc
+trac trak
+trace trAs
+traceable trAs@b@l
+traced trAst
+tracer trAsP
+tracers trAsPz
+traces trAs@z
+tracey trAs/
+trachea trAk/@
+tracheal trAk/@l
+tracheophyte trAk/@fIt
+tracheophytes trAk/@fIts
+trachsel traks@l
+tracht trakt
+trachtenberg trakt~bPg
+tracie trAs/
+tracinda tr@sind@
+tracinda's tr@sind@z
+tracing trAs6N
+track trak
+track's traks
+trackage trak6j
+trackball trakb{l
+trackballs trakb{lz
+tracked trakt
+tracker trakP
+trackers trakPz
+tracking trak6N
+tracks traks
+tracor trAk{r
+tracor trAsP
+tracor trak{r
+tracor trekP
+tract trakt
+tractable trakt@b@l
+tractebel trakt@b@l
+traction trakS~
+tractor traktP
+tractors traktPz
+tracts trakts
+tracy trAs/
+tracy's trAs/z
+tracz troC
+traczyk troCik
+tradable trAd@b@l
+trade trAd
+trade's trAdz
+tradeable trAd@b@l
+traded trAd@d
+trademark trAdmork
+trademarked trAdmorkt
+trademarks trAdmorks
+tradeoff trAd{f
+tradeoffs trAd{fs
+trader trAdP
+trader's trAdPz
+traders trAdPz
+traders' trAdPz
+trades trAdz
+tradesmen trAdzm~
+trading trAd6N
+trading's trAd6Nz
+tradings trAd6Nz
+tradition tr@diS~
+traditional tr@diS~@l
+traditionalist tr@diS~@l@st
+traditionalists tr@diSn@l@sts
+traditionally tr@diSn@l/
+traditionally tr@diS~@l/
+traditions tr@diS~z
+traeger tregP
+traer tr,r
+trafalgar tr@falgP
+traffic traf6k
+traffic's traf6ks
+trafficker traf6kP
+traffickers traf6kPz
+trafficking traf6k6N
+trafford trafPd
+traficant traf6k~t
+traficante trof/kont/
+trafillio tr@fEl/]
+trafillio's tr@fEl/]z
+trafton traft~
+tragedies traj@d/z
+tragedy traj@d/
+trager trAgP
+trageser trag/zP
+tragic traj6k
+tragically traj6kl/
+tragicomic traj6kom6k
+tragos trag]z
+trahan trah~
+trahern trahPn
+trail trAl
+trailblazer trAlblAzP
+trailblazers trAlblAzPz
+trailed trAld
+trailer trAlP
+trailers trAlPz
+trailhead trAlhed
+trailing trAl6N
+trails trAlz
+trails' trAlz
+trailways trAlwAz
+trailways' trAlwAz
+train trAn
+train's trAnz
+traina trAn@
+trainable trAn@b@l
+trained trAnd
+trainee trAnE
+trainees trAnEz
+trainer trAnP
+trainers trAnPz
+training trAn6N
+trainmen trAnm~
+trainor trAnP
+trains trAnz
+traipse trAps
+traipsing trAps6N
+traister trAstP
+trait trAt
+traitor trAtP
+traitorous trAtP@s
+traitors trAtPz
+traits trAts
+trajan trAj~
+trajan's trAj~z
+trajectory tr@jektP/
+trak trak
+trakas trok@z
+tram tram
+tramble tramb@l
+tramco tramk]
+tramel tram@l
+tramell tromAl
+tramiel tram/@l
+trammel tram@l
+trammell tram@l
+tramontana trom]ntan@
+tramontano trom]nton]
+tramonte tromOnt/
+tramontin tr}ont~
+tramp tramp
+trampe tramp
+tramping tramp6N
+trample tramp@l
+trampled tramp@ld
+tramples tramp@lz
+trampling trampl6N
+trampoline tramp@lEn
+tramps trampz
+trams tramz
+tran tran
+tranberg tranbPg
+trance trans
+tranche tranC
+tranches tranCcz
+tranchina tronkEn@
+trane trAn
+trang traN
+trani tron/
+tranquil traNkw@l
+tranquility traNkwil@t/
+tranquilize traNkw@lIz
+tranquilizer traNkw@lIzP
+tranquilizers traNkw@lIzPz
+tranquilizing traNkw@lIz6N
+trans tranz
+transact tranzakt
+transacted transakt@d
+transaction tranzakS~
+transaction's tranzakS~z
+transactions tranzakS~z
+transafrica tranzafr6k@
+transalaska tranz@lask@
+transalta tranz{lt@
+transamerica trans},r6k@
+transamerica's tranz},r6k@z
+transamerican tranz},r6k~
+transamerican's tranz},r6k~z
+transatlantic tranz@tlan6k
+transatlantic tranz@tlant6k
+transcanada tranzkan@t@
+transcanada's tranzkan@d@z
+transcapital tranzkap@t@l
+transcend transend
+transcended transend@d
+transcendence transend~s
+transcendent transend~t
+transcendental trans~den@l
+transcendental trans~dent@l
+transcending transend6N
+transcends transendz
+transchannel trunsCan@l
+transchannel's trunsCan@lz
+transcisco transisk]
+transco transk]
+transcon tranzkon
+transcontinental tranzkont~en@l
+transcontinental tranzkont~ent@l
+transcontinental tranzkon~en@l
+transcontinental tranzkon~ent@l
+transcontinental's tranzkont~en@lz
+transcontinental's tranzkont~ent@lz
+transcontinental's tranzkon~en@lz
+transcontinental's tranzkon~ent@lz
+transcribe transkrIb
+transcribed transkrIbd
+transcriber transkrIbP
+transcribers transkrIbPz
+transcribes transkrIbz
+transcribing transkrIb6N
+transcript transkript
+transcription transkripS~
+transcriptions transkripS~z
+transcripts transkripts
+transducer transdUsP
+transducers transdUsPz
+transect transekt
+transected transekt@d
+transection transekS~
+transfer transfP
+transfer transfV
+transferability transfP@bil@t/
+transferable transfV@b@l
+transfered transfVd
+transference transfV~s
+transfering transfV6N
+transferrable transfV@b@l
+transferred transfPd
+transferred transfVd
+transferring transfV6N
+transfers transfPz
+transfers transfVz
+transfix transfiks
+transfixed transfikst
+transform transf{rm
+transform transf{rm
+transformation transfPmAS~
+transformational transfPmAS~@l
+transformations transfPmAS~z
+transformed transf{rmd
+transformer transf{rmP
+transformers transf{rmPz
+transforming transf{rm6N
+transforms transf{rmz
+transfuse transfyUz
+transfused transfyUzd
+transfusion transfyUZ~
+transfusions transfyUZ~z
+transgenic tranzjen6k
+transgress tranzgres
+transgressed tranzgrest
+transgression tranzgreS~
+transgressions tranzgreS~z
+transgressor tranzgresP
+transience tranz/~s
+transient tranZ~t
+transients tranz/~ts
+transillumination tranz@lUm~AS~
+transimage tranzim6j
+transistor tranzistP
+transistors tranzistPz
+transit tranz@t
+transition tranziS~
+transitional transiS~@l
+transitional tranziS~@l
+transitioning tranziS~6N
+transitions tranziS~z
+transitory tranz@t{r/
+transkei tranzkA
+translate translAt
+translate tranzlAt
+translated translAt@d
+translated tranzlAt@d
+translates translAts
+translates tranzlAts
+translating translAt6N
+translating tranzlAt6N
+translation tranzlAS~
+translations tranzlAS~z
+translator translAtP
+translator tranzlAtP
+translators translAtPz
+translators translAtPz
+translogic tranzloj6k
+translucent translUs~t
+transmark tranzmork
+transmedia tranzmEd/@
+transmission transmiS~
+transmission tranzmiS~
+transmissions tranzmiS~z
+transmit tranzmit
+transmits tranzmits
+transmittable tranzmit@b@l
+transmittal transmit@l
+transmitted transmit@d
+transmitter transmitP
+transmitters transmitPz
+transmitting transmit6N
+transnational transnaS~@l
+transoceanic tranz]S/an6k
+transohio tranz]hI]
+transom trans}
+transoms trans}z
+transou tranzU
+transpac tranzpak
+transpacific transp@sif6k
+transparencies transp,r~s/z
+transparency transp,r~s/
+transparent transp,r~t
+transparently transp,r~tl/
+transpark transp)rk
+transpire transpIP
+transpired transpIPd
+transpires transpIPz
+transpiring transpIP6N
+transplant transplant
+transplantation tranzplantAS~
+transplanted transplant@d
+transplanting transplant6N
+transplants transplants
+transponder transpondP
+transponders transpondPz
+transport transp{rt
+transport transp{rt
+transportable transp{rt@b@l
+transportation transpPtAS~
+transportation's transpPtAS~z
+transported transp{rt@d
+transporter transp{rtP
+transporters transp{rtPz
+transporting transp{rt6N
+transports transp{rts
+transports transp{rts
+transpose transpOz
+transposed transpOzd
+transracial tranzrAS@l
+transrapid tranzrap@d
+transsexual transekSyU@l
+transsexuals transekSyU@lz
+transtar transt)r
+transtechnology tranzt@knol@j/
+transtector tranztektP
+transue tranzU
+transvaal tranzvol
+transverse tranzvVs
+transvestite tranzvestIt
+transvestites tranzvestIts
+transway tranzwA
+transwestern tranzwestPn
+transworld transwVld
+transylvania trans@lvAny@
+transylvania tranz/lvAn/@
+trant trant
+tranter trantP
+trantham tranT}
+tranum tran}
+tranzonic tranzon6k
+trap trap
+trapani tropon/
+trapasso tropos]
+trapelo tr@pel]
+trapeze tr@pEz
+traphagen traf@g~
+trapnell trapn@l
+trapp trap
+trappe trap
+trapped trapt
+trappers trapPz
+trapping trap6N
+trappings trap6Nz
+trappist trapist
+traps traps
+trash traS
+trashed traSt
+trashes traS@z
+trashing traS6N
+trashy traS/
+trask trask
+traub tr{b
+traudt tr{dt
+trauger tr?gP
+traugh tr{
+traughber tr{bP
+traugott tr?g@t
+traum tr{m
+trauma tr{m@
+traumas tr{m@z
+traumatic tr{mat6k
+traumatize tr{m@tIz
+traumatized tr{m@tIzd
+trausch tr?S
+traut tr{t
+trauth tr{T
+trautman tr?tm~
+trautmann tr?tm~
+trautner tr?tnP
+trautwein tr?twIn
+travaglini trovoglEn/
+travail tr@vAl
+travails tr@vAlz
+travel trav@l
+travelday trav@ldA
+traveldays trav@ldAz
+traveled trav@ld
+traveler trav@lP
+traveler travlP
+traveler's trav@lPz
+travelers trav@lPz
+travelers travlPz
+travelers' trav@lPz
+travelgate trav@lgAt
+traveling trav@l6N
+traveling travl6N
+travelled trav@ld
+traveller trav@lP
+travellers trav@lPz
+travelling trav@l6N
+travelodge trav@loj
+travelogue trav@l{g
+travels trav@lz
+travelstead trav@lsted
+travenol trav~@l
+traver trAvP
+travers travPz
+traverse tr@vVs
+traverse travPs
+traversed tr@vVst
+traversing tr@vVs6N
+traverso trov,rs]
+travesties trav@st/z
+travesty trav@st/
+traviata trov/ot@
+travieso trovEs]
+travis travis
+travisano travison]
+travnik travn6k
+travolta tr@vOlt@
+travolta's tr@vOlt@z
+travoltas tr@vOlt@z
+traweek tr{Ek
+trawick tr{6k
+trawler tr{lP
+trawlers tr{lPz
+trax traks
+traxler trakslP
+tray trA
+trayer trAP
+traylor trAlP
+traynham trAnh}
+traynor trAnP
+trays trAz
+traywick trAwik
+trbovich tPbov6C
+treacherous treCP@s
+treachery treCP/
+treacy trAs/
+tread tred
+treadaway tred@wA
+treading tred6N
+treadmill tredmil
+treadmills tredmilz
+treads tredz
+treadway tredwA
+treadwell tredwel
+treadwheel tredwEl
+treanor trEnP
+trease trEz
+treason trEz~
+treaster trEstP
+treasure treZP
+treasured treZPd
+treasurer treZPP
+treasurer's treZPPz
+treasurers treZPPz
+treasures treZPz
+treasuries treZP/z
+treasury treZP/
+treasury's treZP/z
+treasurys treZP/z
+treat trEt
+treatable trEt@b@l
+treated trEt@d
+treater trEtP
+treaters trEtPz
+treaties trEt/z
+treating trEt6N
+treatise trEt@s
+treatises trEt@s@z
+treatment trEtm~t
+treatments trEtm~ts
+treats trEts
+treaty trEt/
+treaty's trEt/z
+trebilcock trcbilk6k
+treble treb@l
+trebled treb@ld
+treblinka trcbliNk@
+treblinka trcbliNkP
+trecker trekP
+treder trEdP
+tredway tredwA
+tree trE
+treece trEs
+treeless trEl@s
+treen trEn
+trees trEz
+treese trEz
+treesh trES
+treesweet trEswEt
+treetop trEt{p
+treetops trEt{ps
+trefethen tref@T~
+trefgarne trefgorn
+trefry trefr/
+trefz trefz
+treglia tregl/@
+trego treg]
+tregoning treg~6N
+tregre tregP
+tregurtha trcgVT@
+treharne trehorn
+treiber trIbP
+treichel trIk@l
+treichler trIk@lP
+treinen trIn~
+trejo trAy]
+trek trek
+trekked trekt
+trekking trek6N
+treks treks
+trela trel@
+trella trel@
+trelleborg trel@b{rg
+trelleborg's trel@b{rgz
+trellis trel@s
+treloar trel{r
+tremain tremIn
+tremaine tr}An
+tremayne tremAn
+trembath tremb@T
+tremblay tremblA
+tremble tremb@l
+trembled tremb@ld
+trembley trembl/
+trembling tremb@l6N
+trembling trembl6N
+trembly trembl/
+tremel trem@l
+tremendous tr}end@s
+tremendously tr}end@sl/
+tremens trem~z
+treml trem@l
+tremmel trem@l
+tremont trem~t
+tremor tremP
+tremors tremPz
+tremper trempP
+tremulous tremy@l@s
+tremulously tremy@l@sl/
+trenary trencr/
+trench trenC
+trenchant trenC~t
+trenchard treNkPd
+trencher trenCP
+trenches trenC@z
+trend trend
+trended trend@d
+trendier trend/P
+trendiest trcnd/@st
+trending trend6N
+trendless trendl@s
+trendline trendlIn
+trends trendz
+trends trenz
+trendsetter trendsetP
+trendy trend/
+trenholm trenhOlm
+trenkamp trenkamp
+trenkle treNk@l
+trent trent
+trent's trents
+trente-et-quarante trAntAkworentA
+trentham trenT}
+trentman trentm~
+trenton trent~
+trenton's trent~z
+treon trE~
+trepagnier trep@gn/P
+trepanier trep~/P
+trepidation trep@dAS~
+treppel trep@l
+treptow trept]
+tresch treS
+trescott tresk@t
+trespass tresp@s
+trespass trespas
+trespassing tresp@s6N
+trespassing trespas6N
+tress tres
+tressel tres@l
+tresses tres@z
+tressler treslP
+trest trest
+trester trestP
+trestle tres@l
+trethewey treTyU/
+tretinoin tret~<n
+trettel tret@l
+tretter tretP
+trettin tretin
+treu trU
+treuhand trUhand
+treuhandanstalt trUhand~stolt
+treurnicht trUrn6kt
+trevathan trev@T~
+trevelyan tr@vely~
+trevino tr@vEn]
+treviso trcvEs]
+trevizo trcvEz]
+trevor trevP
+trew trU
+trexler trekslP
+trey trA
+treybig trAb6g
+trezise trezIz
+trezza trez@
+tri trI
+tri-state trIstAt
+triad trIad
+triad's trIadz
+triads trIadz
+triage trI6j
+trial trI@l
+trial trIl
+trial's trI@lz
+trials trI@lz
+trials trIlz
+triana tr/an@
+triangle trIaNg@l
+triangle's trIaNg@lz
+triangles trIaNg@lz
+triangular trIaNgy@lP
+triangulation trIaNgyUlAS~
+triano tr/on]
+triarc trIork
+triathlon trIaTl~
+trib trib
+tribal trIb@l
+tribalism trIb@lizm
+tribalism trIb@liz}
+tribasa trIbas@
+tribbett tribct
+tribbey trib/
+tribble trib@l
+tribbles trib@lz
+tribby trib/
+tribe trIb
+tribe's trIbz
+tribeca tr@bek@
+tribes trIbz
+tribesman trIbzman
+tribesmen trIbzmcn
+trible trib@l
+triborough trIbP]
+tribulation triby@lAS~
+tribulations triby@lAS~z
+tribull trib@l
+tribunal tr@byUn@l
+tribunals trIbyUn@lz
+tribune tribyUn
+tribune's tribyUnz
+tributaries triby@ter/z
+tributary triby@ter/
+tribute tribyUt
+tributes tribyUts
+tricarico tr/korEk]
+trice trIs
+tricentrol trIsentrol
+tricentrol's trIsentrolz
+triceps trIseps
+triceratops trIs,r@t{ps
+triche triC
+trichet triCct
+tricia triS@
+tricia's triS@z
+tricil trisil
+trick trik
+tricked trikt
+trickel trik@l
+trickery trikP/
+trickett trikct
+trickey trik/
+trickier trik/P
+trickiest trik/@st
+tricking trik6N
+trickle trik@l
+trickled trik@ld
+trickles trik@lz
+trickling trikl6N
+tricks triks
+trickster trikstP
+tricksters trikstPz
+tricky trik/
+trico trEk]
+tricuspid trIkusp@d
+tricycle tris6k@l
+trident trId~t
+tridex trideks
+tried trId
+triennial trIen/@l
+trier trIP
+trierweiler trirwIlP
+tries trIz
+trieste trEst
+trieu trU
+trifari tr@f)r/
+trifle trIf@l
+trifles trIf@lz
+trifling trIfl6N
+trig trig
+trigg trig
+trigger trigP
+triggered trigPd
+triggering trigP6N
+triggers trigPz
+triggs trigz
+triglyceride trIglisPId
+triglycerides trIglisPIdz
+trigo trEg]
+trilateral trIlatP@l
+trilby trilb/
+trill tril
+trillin trilin
+trilling tril6N
+trillion trily~
+trillions trily~z
+trillo tril]
+trilogy tril@j/
+trilon tril~
+trim trim
+trimac trimak
+trimarchi tr/m)rk/
+trimarco tr})rk]
+trimas trEm@s
+trimble trimb@l
+trimboli tr/mbOl/
+trimedyne trImdIn
+trimester trImestP
+trimetrexate trimetr@ksAt
+trimm trim
+trimmed trimd
+trimmer trimP
+trimmers trimPz
+trimming trim6N
+trimmings trim6Nz
+trimpe trimp
+trims trimz
+trincomalee tr6NkOm@l/
+trine trIn
+tringali tr6Ngol/
+trinh trin
+trinidad trin@dad
+trinity trin@t/
+trinity's trin@t/z
+trinka triNk@
+trinket triNk@t
+trinkets triNk@ts
+trinkle triNk@l
+trinova trInOv@
+trintex trinteks
+trio trEO
+trio's trEOz
+triola tr/Ol@
+triolo tr/Ol]
+triomphe tr/Omf
+trip trip
+trip's trips
+tripartite trIp)rtIt
+tripe trIp
+tripi trEp/
+triple trip@l
+triplecast trip@lkast
+tripled trip@ld
+triples trip@lz
+triplet tripl@t
+triplets tripl@ts
+triplett triplct
+triplicate tripl6k@t
+tripling trip@l6N
+tripling tripl6N
+tripod trIpod
+tripodi tr/pOd/
+tripods trIpodz
+tripoli trip@l/
+tripoli's trip@l/z
+tripp trip
+trippe trip
+tripped tript
+trippel trip@l
+tripper tripP
+trippers tripPz
+trippett tripct
+tripping trip6N
+tripple trip@l
+trips trips
+triptych tript6k
+triremes trIrEmz
+trish triS
+trisha triS@
+trisha's triS@z
+triska trisk@
+trisler tris@lP
+trism triz}
+trista trist@
+tristan tristan
+tristar trIstor
+tristate trIstAt
+tristram tristr}
+tritch triC
+trite trIt
+trites trIts
+tritium trit/}
+triton trIt~
+triton's trIt~z
+tritsch triC
+tritschler triClP
+tritt trit
+tritz trits
+triumph trI}f
+triumphal tr/umf@l
+triumphant trIumf~t
+triumphantly trIumf~tl/
+triumphed trI}ft
+triumphs trI}fs
+triumvirate trIumvP@t
+trivedi tr/ved/
+trivest trivcst
+trivett trivit
+trivette tr6vet
+trivia triv/@
+trivial triv/@l
+triviality triv/al@t/
+trivialize triv/@lIz
+trivialize trivy@lIz
+trivialized triv/@lIzd
+trivialized trivy@lIzd
+trivializes triv/@lIz@z
+trivializes trivy@lIz@z
+trivializing triv/@lIz6N
+trivializing trivy@lIz6N
+trixie triks/
+trixy triks/
+trizec trizck
+trizec's trizcks
+trnka tr@Nko
+trnopolje tr~{p{l/
+trnopolje tr~{p{ly/
+trobaugh trob{
+troche troC
+trochmann troCman
+trochmann trokman
+trocki trok/
+trod trod
+troeger trOgP
+troendle trOnd@l
+troester trOstP
+trogdon trogd~
+troha trOh@
+troia trOy@
+troiani tr]yon/
+troiano tr]/on]
+troika tr<k@
+trois two
+troise tr<z
+troisi tr<s/
+trojan trOj~
+trojanowski tr@y~{fsk/
+trojans trOj~z
+trokel trOk@l
+trolinger trOl6NP
+troll trOl
+trolley trol/
+trolleys trol/z
+trolling trOl6N
+trollinger trOl6NP
+troma trOm@
+trombino tr]mbEn]
+trombley trombl/
+trombly trombl/
+trombone trombOn
+trombones trombOnz
+trombonist trombOnist
+tromp tromp
+trompeter tromp/tP
+tron tron
+troncoso tr]nkOs]
+trone trOn
+tronic tron6k
+troon trUn
+troop trUp
+troop's trUps
+trooped trUpt
+trooper trUpP
+trooper's trUpPz
+troopers trUpPz
+troopers' trUpPz
+trooping trUp6N
+troops trUps
+troops' trUps
+troost trUst
+tropea trOp/@
+tropeano trOpEn]
+trophies trOf/z
+trophy trOf/
+tropic trop6k
+tropical trop6k@l
+tropicana trop6kan@
+tropicana's trop6kan@z
+tropics trop6ks
+tropopause trop@p{z
+tropp trop
+tropworld tropwPld
+trosch troS
+trosclair tr@skl,r
+trosper trospP
+trost trost
+trostel trost@l
+trostle tros@l
+trot trot
+troth trOT
+troth tr{T
+trotman trotm~
+trots trots
+trotsky trotskE
+trott trot
+trotted trot@d
+trotten trot~
+trotter trotP
+trottier trot/P
+trotting trot6N
+troubadour trUb@d{r
+troubh trUb
+trouble trub@l
+troubled trub@ld
+troublefield trub@lfEld
+troublemaker trub@lmAkP
+troublemakers trub@lmAkPz
+troubles trub@lz
+troubleshooter trub@lSUtP
+troublesome trub@ls}
+troubling trub@l6N
+troubling trubl6N
+troudt tr?dt
+trough tr{f
+troughs tr{fs
+trounce tr?ns
+trounced tr?nst
+trouncing tr?ns6N
+troung tr?N
+troup trUp
+troupe trUp
+troupe's trUps
+troupes trUps
+trousdale tV@sdAl
+trouser tr?zP
+trousers tr?zPz
+trout tr?t
+trout's tr?ts
+troutman tr?tm~
+troutner tr?tnP
+troutt tr?t
+troutwine tr?twIn
+trovato tr]vot]
+trovatore trOv@t{r
+trove trOv
+trow trO
+trowbridge trObr6j
+trowel tr?wcl
+trowell trowcl
+trower tr?P
+troxel troks@l
+troxell troks@l
+troxler trokslP
+troy tr<
+troyan tr<~
+troyanos tr<on]s
+troyat tr<at
+troyer tr<P
+troyka tr<k@
+troyu tr<U
+truancy trU~s/
+truant trU~t
+truax trUaks
+trubey trUb/
+truby trUb/
+trucco trUk]
+truce trUs
+truchan truC~
+truck truk
+truck's truks
+trucked trukt
+truckee truk/
+trucker trukP
+truckers trukPz
+truckers' trukPz
+trucking truk6N
+truckload truklOd
+truckloads truklOdz
+trucks truks
+trucks' truks
+truculent truky@l~t
+truda trUd@
+trude trUd
+trudeau trUdO
+trudel trUd@l
+trudell trud@l
+trudge truj
+trudged trujd
+trudgen truj~
+trudges truj@z
+trudging truj6N
+trudia trUd/@
+trudie trUd/
+trudo trUd]
+trudy trUd/
+true trU
+true-view trUvyU
+trueblood trUblud
+truell trU@l
+truelove trUluv
+trueman trqm~
+truer trUP
+truesdale trUzdAl
+truesdell trUzdel
+truest trU@st
+truett trUt
+truex trUeks
+truffaut trUfO
+truffaut's trUfOz
+truffle truf@l
+truffles truf@lz
+truglio trugl/]
+truicko trUEk]
+truicko trUk]
+truism trUiz}
+truitt trUt
+trujillo trUhE]
+trull trul
+trullinger trul6NP
+trulock trul@k
+trulove trUlOv/
+trulson truls~
+truluck trul@k
+truly trUl/
+truman trUm~
+truman's trUm~z
+trumble trumb@l
+trumbo trumb]
+trumbull trumb@l
+trumka trumk@
+trump trump
+trump's trumps
+trumped trumpt
+trumpet trump@t
+trumpeted trump@t@d
+trumpeter trump@tP
+trumpeting trump@t6N
+trumpets trump@ts
+trumpower trumpOP
+trumps trumps
+truncate truNkAt
+truncated truNkAt@d
+truncheon trunC~
+truncheons trunC~z
+trundle trund@l
+trundled trund@ld
+trunk truNk
+trunkline truNklIn
+trunks truNks
+trunnell trun@l
+trunzo trunz]
+truong tr{N
+trupiano trUp/on]
+trupin trUpin
+trupin's trUpinz
+trupp trup
+truro trUr]
+trus trus
+truscott trusk@t
+truskowski tr@sk{fsk/
+trusler trus@lP
+truslow trusl]
+truss trus
+trussell trus@l
+trusses trus@z
+trust trust
+trust's trusts
+trustco trustk]
+trustcorp trustk{rp
+trusted trust@d
+trustee trustE
+trustee's trustEz
+trustees trustEz
+trustees' trustEz
+trusteeship trustESip
+trusthouse trusth?s
+trusting trust6N
+trusts trusts
+trusts' trusts
+trustworthiness trustwVT/n@s
+trustworthy trustwVT/
+trusty trust/
+truszkowski truSk{fsk/
+truth trUT
+truthful trUTf@l
+truthfully trUTf@l/
+truthfulness trUTf@ln@s
+truths trUTs
+truxal truks@l
+truxillo truksil]
+try trI
+try-on trIon
+try-ons trIonz
+tryart trIort
+tryba trib@
+trybus trib@s
+trygg trig
+trygstad trigst@d
+trygve trigv/
+tryin' trI~
+trying trI6N
+trying trIN
+tryon trI~
+tryout trI?t
+tryouts trI?ts
+tryphena trif~@
+tryst trIst
+trzaska tPzosk@
+trzcinski tPZinsk/
+trzeciak tPzeC/ak
+ts tEes
+tsai sI
+tsai tsI
+tsai's sIz
+tsai's tsIz
+tsakos tsok]s
+tsang saN
+tsang tsaN
+tsao s?
+tsao ts?
+tsar ts)r
+tsar z)r
+tschantz Cants
+tschetter CetP
+tschida CId@
+tschirhart CVhort
+tschopp Cop
+tschudy CUd/
+tschumi CUm/
+tse sE
+tse tsE
+tsemel tsem@l
+tseng seN
+tseng tseN
+tsetse tEts/
+tsetse tsEts/
+tsiang tsyaN
+tsingtao siNt?
+tsingtao tsiNd?
+tso sO
+tso tsO
+tsongas s{Ng@s
+tsongas ts{Ng@s
+tsongas' s{Ng@s
+tsongas' ts{Ng@s
+tsongas's s{Ng@s@z
+tsongas's ts{Ng@s@z
+tsuda sUd@
+tsuda tsUd@
+tsui sU/
+tsui tsU/
+tsuji sUj/
+tsuji tsUj/
+tsukamoto sUkomOt]
+tsukamoto tsUkomOt]
+tsukuba sUkyUb@
+tsukuba tsUkyUb@
+tsunami sUnom/
+tsunami tsUnom/
+tsuneo sUn/]
+tsuneo tsUn/]
+tsurumi sUrUm/
+tsurumi tsUrUm/
+tsutomu tsUtOmU
+tt's tEtEz
+tu tU
+tub tub
+tuba tUb@
+tubal tUb@l
+tubb tub
+tubbs tubz
+tubby tub/
+tube tUb
+tube tyUb
+tuberculosis t@bVky@lOs@s
+tuberculosis tUbVky@lOs@s
+tuberculosis tUbVkyUlOs@s
+tuberville tUbPvil
+tubes tUbz
+tubing tUb6N
+tubman tubm~
+tubs tubz
+tubular tUby@lP
+tubule tUbyUl
+tucci tUC/
+tucci's tUC/s
+tucciarone tUCPOn/
+tuccillo tUCil]
+tucek tUCek
+tuch tuC
+tuchman tukm~
+tucholski t@hOlsk/
+tuck tuk
+tucked tukt
+tucker tukP
+tucker's tukPz
+tuckerman tukPm~
+tuckett tukct
+tuckey tuk/
+tucking tuk6N
+tuckman tukm~
+tucks tuks
+tucson tUson
+tucuman tUkyUm~
+tudisco tUdEsk]
+tudjman tqjm~
+tudjman's tqjm~z
+tudor tUdP
+tudor tyUdP
+tudor's tyUdPz
+tue tU
+tuel tUl
+tuell tUl
+tuesday tUzd/
+tuesday tUzdA
+tuesday tyUzdA
+tuesday's tUzd/z
+tuesday's tUzdAz
+tuesday's tyUzdAz
+tuesdays tUzd/z
+tuesdays tUzdAz
+tuesdays tyUzdAz
+tufa tUf@
+tufano tUfon]
+tuff tuf
+tufnel Tufn@l
+tufo tUf]
+tuft tuft
+tufte tuft
+tufted tuft@d
+tuftlike tuftlIk
+tufts tufts
+tug tug
+tugboat tugbOt
+tugboats tugbOts
+tugged tugd
+tugging tug6N
+tuggle tug@l
+tugman tugm~
+tugs tugz
+tugwell tugwel
+tuhan tUh~
+tuinstra tUinstr@
+tuite tUt
+tuition tyUiS~
+tuitions tUiS~z
+tuk tUk
+tuks tuks
+tula tUl@
+tulane tUlAn
+tuley tyUl/
+tulip tUl@p
+tulips tUl@ps
+tull tul
+tullar tulP
+tuller tulP
+tulley tUl/
+tullia tul/@
+tullier tul/P
+tullio tUl/]
+tullis tulis
+tullius tul/@s
+tullo tUl]
+tulloch tul@k
+tullock tul@k
+tullos tul]z
+tully tul/
+tulsa tuls@
+tuma tUm@
+tumacoceri tUm@kOCP/
+tuman CUm~
+tumazos tUmoz]s
+tumble tumb@l
+tumbled tumb@ld
+tumbler tumblP
+tumbler's tumblPz
+tumblers tumblPz
+tumbles tumb@lz
+tumbleson tumb@ls~
+tumblin tumblin
+tumbling tumb@l6N
+tumbling tumbl6N
+tumescent tUmes~t
+tumey tum/
+tuminello tUm/nel]
+tumlin tumlin
+tumlinson tuml~s~
+tummies tum/z
+tumminello tUm/nel]
+tummond tum~d
+tummy tum/
+tumolo tUmOl]
+tumor tUmP
+tumors tUmPz
+tums tumz
+tums' tumz
+tumult tUm@lt
+tumultuous tUmulCU@s
+tumulty tUm@lt/
+tuna tUn@
+tuna tyUn@
+tunable tUn@b@l
+tunafish tUn@f6S
+tunas tUn@z
+tunde tund
+tundra tundr@
+tune tUn
+tuned tUnd
+tuneful tUnf@l
+tuner tUnP
+tunes tUnz
+tuneup tUnup
+tung tuN
+tung's tuNz
+tungate tUNAt
+tungsram tuNzram
+tungsrom tuNzr}
+tungsrom's tuNzr}z
+tungsten tuNst~
+tunic tUn6k
+tunica tUn6k@
+tunica's tUn6k@z
+tunicate tUn6k@t
+tunick tun6k
+tuning tUn6N
+tunis tUnEs
+tunis tUnis
+tunisia tUnEZ@
+tunisian tUnEZ~
+tunison tun@s~
+tunkelang tuNklaN
+tunks tuNks
+tunku tuNkU
+tunnel tun@l
+tunneling tun@l6N
+tunnell tun@l
+tunnels tun@lz
+tunney tun/
+tunny tun/
+tunstall tunst@l
+tuohey tUhA
+tuohy tU/
+tuomi twOm/
+tupa tUp@
+tupac tUp{k
+tupelo tUp@lO
+tupelo tyUp@lO
+tupelov tUp@lov
+tupper tupP
+tupperware tupPwer
+tupy tUp/
+turandot tPand@t
+turano tqron]
+turban tVb~
+turbans tVb~z
+turbas tVb@s
+turben tVb~
+turberville tVbPvil
+turbett tVbct
+turbeville tVbvil
+turbidity tPbid@t/
+turbin tVbin
+turbine tVbIn
+turbinen tVb~~
+turbines tVbInz
+turbo tVb]
+turbocharge tVb]Corj
+turbocharged tVb]Corjd
+turbocharges tVb]Corj@z
+turbocharging tVb]Corj6N
+turbofan tVb]fan
+turbojet tVb]jet
+turboprop tVb]prop
+turboprops tVb]props
+turbos tVb]z
+turbot tVbO
+turbot tVbut
+turbotax tVb]taks
+turbulence tVby@l~s
+turbulent tVby@l~t
+turbyfill tVb/fil
+turchi tqrk/
+turchin tVC~
+turchyn tVC~
+turck tVk
+turco tVk]
+turcott tVk@t
+turcotte tPk{t
+ture tqr
+turek tyUr6k
+turenne tyUrcn
+turf tVf
+turgeon tVjin
+turgid tVj@d
+turgut tVg@t
+turi tqr/
+turin tyqrin
+turing tqr6N
+turismo tqrism]
+turk tVk
+turkel tVk@l
+turkey tVk/
+turkey's tVk/z
+turkeys tVk/z
+turkic tVk6k
+turkington tVk6Nt~
+turkish tVk6S
+turkmen tVkmen
+turkmenistan tVkmen@stan
+turko tVk]
+turkovich tVk@v6C
+turks tVks
+turley tVl/
+turlington tVl6Nt~
+turman tVm~
+turmel tVm@l
+turmoil tVm<l
+turn tVn
+turnabout tVn@b?t
+turnage tVn6j
+turnaround tVnP?nd
+turnarounds tVnP?ndz
+turnbaugh tVnb{
+turnbo tqrnb]
+turnbough tVnb?
+turnbow tVnb]
+turnbridge tVnbrij
+turnbull tVnbql
+turncoat tVnkOt
+turndown tVnd?n
+turned tVnd
+turner tVnP
+turner's tVnPz
+turney tVn/
+turnham tVnh}
+turning tVn6N
+turnip tVn@p
+turnips tVn@ps
+turnipseed tPnips/d
+turnkey tVnkE
+turnley tVnl/
+turnmire tVnmIr
+turnoff tVn{f
+turnout tVn?t
+turnouts tVn?ts
+turnover tVnOvP
+turnovers tVnOvPz
+turnpike tVnpIk
+turnpikes tVnpIks
+turnquest tVnkwcst
+turnquist tVnkwist
+turns tVnz
+turnstile tVnstIl
+turnstiles tVnstIlz
+turntable tVntAb@l
+turntables tVntAb@lz
+turo tqr]
+turow tqr]
+turowski tP{fsk/
+turpen tVp~
+turpentine tVp~tIn
+turpin tVpin
+turpitude tVp@tUd
+turquoise tVkw<z
+turrell t{r@l
+turrentine tqrcntEn/
+turret tV@t
+turret tVt
+turrets tV@ts
+turri tqr/
+turrill t{r@l
+tursi tqrs/
+turski tVsk/
+turtle tVt@l
+turtle's tVt@lz
+turtleneck tVt@lnek
+turtlenecks tVt@lneks
+turtles tVt@lz
+turton tVt~
+turvey tPvA
+turville tVvil
+turvy tVv/
+tusa tUs@
+tuscaloosa tusk@lUs@
+tuscaloosa's tusk@lUs@z
+tuscan tusk~
+tuscany tusk~/
+tush tqS
+tushes tqS@z
+tusing tUs6N
+tusk tusk
+tuskegee t@skEgE
+tuskegee tusk@gE
+tusks tusks
+tusla tUzl@
+tussaud's t@sOz
+tussaud's tUsOz
+tussey tus/
+tussing tus6N
+tussle tus@l
+tussled tus@ld
+tussles tus@lz
+tustin tustin
+tut tut
+tutelage tyUt@l6j
+tuten tyUt~
+tuthill tuthil
+tutino tUtEn]
+tutko tutk]
+tutor tUtP
+tutored tUtPd
+tutorial tUt{r/@l
+tutorials tUt{r/@lz
+tutoring tUtP6N
+tutors tUtPz
+tutsi tUts/
+tutsi's tUts/z
+tutsis tUts/z
+tutt tut
+tutterow tutP]
+tutti tUt/
+tuttle tut@l
+tutton tut~
+tutu tUtU
+tutwiler tutwIlP
+tux tuks
+tuxedo tuksEd]
+tuxedos t@ksEdOz
+tuxford tuksfPd
+tuxhorn tukshPn
+tuyle tUl
+tuzla tUzl@
+tuzla's tUzl@z
+tuzzolino tUts]lEn]
+tv tEvE
+tv tel@viZ~
+tvedt tvedt
+tveit tvEt
+tvsat t@vsat
+twaddell twodel
+twaddle twod@l
+twain twAn
+twain's twAnz
+twang twoN
+twangy twonj/
+twardowski twPd?sk/
+twardy tw{rd/
+twarog tw{r{g
+twas twuz
+tweak twEk
+tweaked twEkt
+tweaking twEk6N
+tweaks twEks
+twedt twedt
+tweed twEd
+tweedie twEd/
+tweedle twEd@l
+tweedy twEd/
+tweet twEt
+tweezer twEzP
+tweezerman twEzPman
+tweezers twEzPz
+twelfth twelfT
+twelve twelv
+twelvth twelvT
+twenties twen/z
+twenties twent/z
+twentieth twen/@T
+twentieth twent/@T
+twenty twen/
+twenty twent/
+twenty's twen/z
+twenty's twent/z
+twentysomething twen/sumT6N
+twentysomething twent/sumT6N
+twentysomethings twen/sumT6Nz
+twentysomethings twent/sumT6Nz
+twersky twVsk/
+tweten twEt~
+twice twIs
+twichell twiC@l
+twiddle twid@l
+twiddling twidl6N
+twiddy twid/
+twiford twifPd
+twig twig
+twigg twig
+twigged twigd
+twiggs twigz
+twiggy twig/
+twigs twigz
+twilight twIlIt
+twill twil
+twilley twil/
+twin twin
+twine twIn
+twined twInd
+twinge twinj
+twining twIn6N
+twinjet twinjet
+twinjets twinjets
+twinkie twiNk/
+twinkies twiNk/z
+twinkle twiNk@l
+twinkles twiNk@lz
+twinkling twiNk@l6N
+twinkling twiNkl6N
+twins twinz
+twins' twinz
+twinsburg twinzbPg
+twirl twVl
+twirled twVld
+twirler twVlP
+twirling twVl6N
+twirls twVlz
+twiss twis
+twist twist
+twisted twist@d
+twister twistP
+twisters twistPz
+twisting twist6N
+twists twists
+twisty twist/
+twitch twiC
+twitched twiCt
+twitchell twiC@l
+twitches twiC@z
+twitching twiC6N
+twite twIt
+twitty twit/
+two tU
+two's tUz
+twofold tUfOld
+twohig twOh6g
+twombly twUmbl/
+twomey twom/
+twonshein twonSIn
+twonshein's twonSInz
+tworek twV6k
+twos tUz
+twosome tUs}
+twothirds tUTVdz
+twyford twIfPd
+twyla twIl@
+twyman twIm~
+ty tI
+tybalt tib@lt
+tyburski tIbVsk/
+tyce tIs
+tyco tIk]
+tyco's tIk]z
+tycoon tIkUn
+tycoon's tIkUnz
+tycoons tIkUnz
+tydings tId6Nz
+tye tI
+tyer tIP
+tygar tIgor
+tygart tIgort
+tyger tIgP
+tying tI6N
+tyke tIk
+tylan tIl~
+tylee tIl/
+tylenol tIl~{l
+tylenol's tIl~{lz
+tyler tIlP
+tyler's tIlPz
+tylka tilk@
+tyminski timinsk/
+tymnet tImnet
+tympanic timpan6k
+tympanum timp~}
+tynan tIn~
+tyndall tind@l
+tyne tIn
+tyner tInP
+tynes tInz
+tyo tEwIO
+tyo tI]
+type tIp
+typeable tIp@b@l
+typecast tIpkast
+typecasting tIpkast6N
+typed tIpt
+typeface tIpfAs
+typefaces tIpfAs@z
+types tIps
+typeset tIpset
+typesetting tIpset6N
+typewriter tIprItP
+typewriters tIprItPz
+typewriting tIprIt6N
+typewritten tIprit~
+typhoid tIf<d
+typhoon tIfUn
+typhoons tIfUnz
+typhus tIf@s
+typical tip@k@l
+typically tip@k@l/
+typically tip@kl/
+typified tip@fId
+typifies tip@fIz
+typify tip@fI
+typing tIp6N
+typings tIp6Nz
+typist tIpist
+typists tIpists
+typo tIp]
+typographical tIp@graf6k@l
+typography t@pogr@f/
+tyra tIr@
+tyrannical tPan6k@l
+tyrannies tir~/z
+tyrannosaurus t6ran@s{r@s
+tyranny tir~/
+tyrant tIr~t
+tyrants tIr~ts
+tyre tIr
+tyree tIrE
+tyrell tIr@l
+tyrone tIrOn
+tyrrell tIrel
+tyrrhenian tPEn/~
+tysinger tIs~jP
+tyson tIs~
+tyson's tIs~z
+tysons tIs~z
+tyus tyUs
+u yU
+u's yUz
+u. 6k
+u.'s yUz
+u.s yUz
+u_s_m_c yUesemsE
+uarco yU)rk]
+uart yUort
+ubben ub~
+uber yUbP
+ubiquitous yUbikw@t@s
+ubiquity yUbikw@t/
+uccel UC@l
+uccel's UC@lz
+ucci UC/
+uchida UkEd@
+uclaf uklaf
+uclaf yUklaf
+udagawa Udogow@
+udale yUdAl
+udall yUd@l
+uday UdA
+uddin udin
+ude Ud
+udell ud@l
+udelle @del
+uden Ud~
+udo UdO
+udolf ud]lf
+udvar udvor
+udverhye Udv,rh/
+udverhye yUdv,rh/
+udverhye's Udv,rh/z
+udverhye's yUdv,rh/z
+udy yUd/
+uebel qb@l
+ueberroth yUbPr{T
+uecker qkP
+ueckert qkPt
+ueda UAd@
+ueda wed@
+uehara UAh)r@
+uehling ql6N
+ueki yUek/
+ueland ql~d
+uelman qlm~
+uelmen qlmcn
+uelmen's qlmcnz
+uemura U}Ur@
+ueno UAn]
+ueno wen]
+uenohara UAn]h)r@
+uenohara wen]h)r@
+uffelman uf@lm~
+ugalde Ugold/
+uganda yUgand@
+uganda yUgond@
+uganda's yUgand@z
+ugandan yUgand~
+ugandan yUgond~
+ugarte Ug)rt/
+ugh ug
+ugity ug@t/
+uglier ugl/P
+ugliest ugl/@st
+ugliness ugl/n@s
+ugly ugl/
+ugolin yUg@lin
+ugolini Ug]lEn/
+ugric yUgr6k
+uh u
+uh-huh uhu
+uhde Ud@
+uhde ud
+uher UP
+uhh u
+uhl ul
+uhland Ul~d
+uhle U@l
+uhler UlP
+uhlich Ul6k
+uhlig Ul6g
+uhlir UlP
+uhlman Ulm~
+uhlmann Ulm~
+uhls Ulz
+uhr qr
+uhrich qr6k
+uhrig qr6g
+uhrin qrin
+ukase yUkAz
+ukman ukm~
+ukraine yUkrAn
+ukraine's yUkrAnz
+ukrainian yUkrAn/~
+ukrainian's yUkrAn/~z
+ukrainians yUkrAn/~z
+ukulele yUk@lAl/
+ul ul
+ul yUel
+ula yUl@
+ulam yUlam
+uland yUl~d
+ulatowski @l@t{fsk/
+ulbrich ulbr6k
+ulbricht ulbr6kt
+ulcer ulsP
+ulcers ulsPz
+ulch ulC
+ulery @lV/
+ulf ulf
+ulfred ulfPd
+ulger ulgP
+uli yUl/
+uliano Ul/on]
+ulibarri Ul/b)r/
+ulicny @likn/
+ulima UlEm@
+ulin yUlin
+ulitsa yUlits@
+ulland ul~d
+ullenberg yUl~bPg
+ullery UlP/
+ullman ulm~
+ullmann ulm~
+ullmer ulmP
+ulloa UlO@
+ullock ul@k
+ullom ul}
+ullrich qlr6k
+ullyses yUlis/z
+ulm ulm
+ulman ulm~
+ulmar ulmP
+ulmer ulmP
+ulmus ulm@s
+ulrey ulr/
+ulric ulr6k
+ulrica ulr6k@
+ulrich ulr6C
+ulrick ulr6k
+ulsan uls~
+ulsh ulS
+ulshafer ulS@fP
+ulster ulstP
+ulterior @ltir/P
+ultima ult}@
+ultimate ult}@t
+ultimately ult}@tl/
+ultimatum ult}At}
+ultimatums ult}At}z
+ultra ultr@
+ultra's ultr@z
+ultraconservative ultr@k~sVv@t6v
+ultrair ultrer
+ultramar ultr}or
+ultramodern ultr}odPn
+ultranationalist ultr~aS~@l@st
+ultranationalist's ultr~aS~@l@sts
+ultranationalists ultr~aS~@l@sts
+ultrasonic ultr@son6k
+ultrasound ultr@s?nd
+ultrasystem ultr@sist}
+ultrasystems ultr@sist}z
+ultraviolet ultr@vI@l@t
+ulundi yUlund/
+ulva Ulv@
+ulvert ulvPt
+ulysses yUlis/z
+um um
+uma yUm@
+umana Umon@
+umansky }ansk/
+umass yUmas
+umbach umbok
+umbarger umborgP
+umbaugh umb?
+umbel umb@l
+umberger umbPgP
+umberto }b,rtO
+umbilical }bil6k@l
+umble umb@l
+umbra umbr@
+umbrage umbr6j
+umbrella umbrel@
+umbrella }brel@
+umbrellas }brel@z
+umetsu yUmetsU
+umfleet umflEt
+umholtz umhOlts
+umland uml~d
+umlasi Umlos/
+umlauf uml?f
+umm um
+ummel um@l
+umphlett }flet
+umphress umfrcs
+umphrey umfr/
+umpire umpIP
+umpires umpIPz
+umpteen umptEn
+umpteenth umptEnT
+umscheid umSId
+umstead umsted
+un un
+un yUen
+una Un@
+unabashed un@baSt
+unabashedly un@baS@dl/
+unabated un@bAt@d
+unable ~Ab@l
+unabom yUn@b{m
+unabomb yUn@b{m
+unabomb's yUn@b{mz
+unabomber yUn@b{mP
+unabomber's yUn@b{mPz
+unabombers yUn@b{mPz
+unabombing yUn@b{m6N
+unabombings yUn@b{m6Nz
+unabridged un@brijd
+unacceptable unaksept@b@l
+unacceptably unaksept@bl/
+unaccompanied un@kump~/d
+unaccountable un@k?nt@b@l
+unaccountably un@k?nt@bl/
+unaccounted un@k?nt@d
+unaccredited un@kredit@d
+unaccustomed un@kust}d
+unaddressed un@drest
+unadjust un@just
+unadjusted un@just@d
+unadorn un@d{rn
+unadorned un@d{rnd
+unadulterated un@dultPAt@d
+unaffected un@fekt@d
+unaffiliate ~@fil/At
+unaffiliated ~@fil/At@d
+unaffordable ~@f{rd@b@l
+unafraid un@frAd
+unaided ~Ad@d
+unalienable ~Al/cn@b@l
+unalienable ~Alycn@b@l
+unallocate ~al@kAt
+unallocated ~al@kAt@d
+unallowable un@l?@b@l
+unalloyed ~al<d
+unalterable ~{ltP@b@l
+unalterably ~{ltP@bl/
+unaltered ~{ltPd
+unambiguous unambigy@w@s
+unambiguously ~ambigyU@sl/
+unamended ~}end@d
+unamerican ~},r6k~
+unamortized ~amPtIzd
+unangst {n@Nst
+unanimity yUn~im@t/
+unanimous yUnan}@s
+unanimously yUnan}@sl/
+unannounced un~?nst
+unanswerable unansP@b@l
+unanswered unansPd
+unanticipated unantis@pAt@d
+unapologetic un@pol@jet6k
+unappealing un@pEl6N
+unappetizing unap@tIz6N
+unappreciated un@prES/At@d
+unapproved un@prUvd
+unarm ~)rm
+unarmed ~)rmd
+unashamed un@SAmd
+unashamedly un@SAm@dl/
+unassailable un@sAl@b@l
+unassisted un@sist@d
+unassuming un@sUm6N
+unattach un@taC
+unattached un@taCt
+unattainable un@tAn@b@l
+unattended ~@tend@d
+unattractive un@trakt6v
+unaudited ~{d@t@d
+unauthentic un{Tent6k
+unauthorized ~{TPIzd
+unavailability ~@vAl@bil@t/
+unavailable un@vAl@b@l
+unavailing un@vAl6N
+unavoidable un@v<d@b@l
+unavoidably un@v<d@bl/
+unaware un@w,r
+unawares un@w,rz
+unbalance ~bal~s
+unbalanced ~bal~st
+unbearable ~b,r@b@l
+unbearably ~b,r@bl/
+unbeatable unbEt@b@l
+unbeaten ~bEt~
+unbecoming unb/kum6N
+unbecoming unb6kum6N
+unbeknown unb/nOn
+unbeknownst ~b/nOnst
+unbelievable unb@lEv@b@l
+unbelievably unb@lEv@bl/
+unbelieving unb@lEv6N
+unbend unbend
+unbending unbend6N
+unbiased unbI@st
+unblemished ~blemiSt
+unbolt unbOlt
+unbolted unbOlt@d
+unbook ~bqk
+unborn unb{rn
+unbound ~b?nd
+unbounded ~b?nd@d
+unbowed ~b?d
+unbowed ~bOd
+unbranded ~brand@d
+unbridled ~brId@ld
+unbroken ~brOk~
+unbuildable ~bild@b@l
+unbuilt unbilt
+unbundle ~bund@l
+unbundling ~bundl6N
+unburden ~bVd~
+unburdened ~bVd~d
+unburned ~bVnd
+unbutton ~but~
+unbuttoned ~but~d
+uncalled ~k{ld
+uncannily ~kan@l/
+uncanny ~kan/
+uncapher unk@fP
+uncapitalized ~kap@t@lIzd
+uncaring ~k,r6N
+unceasing ~sEs6N
+uncensored ~sensPd
+unceremonious unser}On/@s
+unceremoniously unser}On/@sl/
+uncertain ~sVt~
+uncertainly ~sVt~l/
+uncertainties ~sVt~t/z
+uncertainty ~sVt~t/
+unchallenged ~Cal~jd
+unchanged ~CAnjd
+unchanging ~CAnj6N
+uncharacteristic unker6ktPist6k
+uncharacteristically unker6ktPist6kl/
+uncharted ~C)rt@d
+unchartered ~C)rtPd
+unchecked ~Cekt
+uncivil ~siv@l
+uncivilized ~siv@lIzd
+unclaimed ~klAmd
+unclamp ~klamp
+unclamps ~klamps
+unclassified ~klas@fId
+unclassify ~klas@fI
+uncle uNk@l
+uncle's uNk@lz
+unclean ~klEn
+unclear ~klir
+uncles uNk@lz
+uncluttered ~klutPd
+uncoat ~kOt
+uncoated ~kOt@d
+uncoil unk<l
+uncoiled unk<ld
+uncollectable ~k@lekt@b@l
+uncollected ~k@lekt@d
+uncollectible ~k@lekt@b@l
+uncomfortable ~kumfPt@b@l
+uncomfortably ~kumft@bl/
+uncommitted unk}it@d
+uncommon ~kom~
+uncommonly unkom~l/
+uncompensate ~komp~sAt
+uncompensated ~komp~sAt@d
+uncompetitive ~k}pet@t6v
+uncomplete unk}plEt
+uncompleted unk}plEt@d
+uncomplicate ~kompl@kAt
+uncomplicated ~kompl@kAt@d
+uncompromising ~kompr}Iz6N
+unconcealed unk~sEld
+unconcern unk~sVn
+unconcerned unk~sVnd
+unconditional unk~diS~@l
+unconditionally unk~diSn@l/
+unconditionally unk~diS~@l/
+unconfined unk~fInd
+unconfirmed unk~fVmd
+unconnected unk~ekt@d
+unconscionable ~konS~@b@l
+unconscious unkonS@s
+unconsciously unkonS@sl/
+unconsciousness unkonS@sn@s
+unconsolidated ~k~sol@dAt@d
+unconstitutional unkonst@tUS~@l
+unconstitutionally unkonst@tUSn@l/
+unconstitutionally unkonst@tUS~@l/
+unconstrained unk~strAnd
+uncontaminated unk~tam~At@d
+uncontested unk~test@d
+uncontradicted unk{ntr@dikt@d
+uncontrollable unk~trOl@b@l
+uncontrollably unk~trOl@bl/
+uncontrolled unk~trOld
+uncontroversial unkontr@vVS@l
+unconventional unk~venS~@l
+unconverted unk~vVt@d
+unconvinced unk~vinst
+unconvincing unk~vins6N
+uncool unkUl
+uncooperative ~k]opP@t6v
+uncoordinated ~k]{rd~At@d
+uncork ~k{rk
+uncorked ~k{rkt
+uncorks ~k{rks
+uncorrected unkPekt@d
+uncorroborated unkPobPAt@d
+uncounted unk?nt@d
+uncouple ~kup@l
+uncouth unkUT
+uncover ~kuvP
+uncovered ~kuvPd
+uncovering ~kuvP6N
+uncovers unkuvPz
+uncritical ~krit6k@l
+uncritically ~krit6k@l/
+uncritically ~krit6kl/
+unctad unktad
+unctuous uNCw@s
+uncured unkyVd
+uncut unkut
+und und
+undamaged undam@jd
+undated undAt@d
+undaunted ~d{nt@d
+undecided und@sId@d
+undecideds und@sId@dz
+undeclared ~d@kl,rd
+undefeated und@fEt@d
+undefined und@fInd
+undelivered und@livPd
+undemocratic undcm@krat6k
+undeniable und~I@b@l
+undeniably und~I@bl/
+under undP
+under-age undPAj
+underachiever undP@CEvP
+underachievers undP@CEvPz
+underage undP6j
+underarm undP)rm
+underbelly undPbel/
+underberg undPbPg
+underbid undPbid
+underbrush undPbruS
+undercapitalize ~dPkap@t@lIz
+undercapitalized ~dPkap@t@lIzd
+undercarriage undPkar6j
+underclass undPklas
+underclassmen undPklasmcn
+undercoat undPkOt
+undercook ~dPkqk
+undercooked ~dPkqkt
+undercount undPk?nt
+undercounted undPk?nt@d
+undercover undPkuvP
+undercurrent undPkV~t
+undercurrents undPkV~ts
+undercut undPkut
+undercuts undPkuts
+undercutting undPkut6N
+underdahl undPdol
+underdevelop undPd6vel@p
+underdeveloped undPd6vel@pt
+underdevelopment ~dPd@vel@pm~t
+underdog undPd{g
+underdogs undPd{gz
+underdown undPd?n
+underemploy undP}pl<
+underemployed undP}pl<d
+underemployment ~dP}pl<m~t
+underestimate undPest}@t
+underestimate undPest}At
+underestimated undPest}At@d
+underestimates undPest}@ts
+underestimates undPest}Ats
+underestimating undPest}At6N
+underfinance ~dPf~ans
+underfinanced ~dPf~anst
+underfoot undPfqt
+underfund undPfund
+underfunded undPfund@d
+underfunding undPfund6N
+undergarment undPgorm~t
+undergarments undPgorm~ts
+undergo undPgO
+undergoes undPgOz
+undergoing undPgO6N
+undergone undPg{n
+undergrad undPgrad
+undergraduate undPgraj@w@t
+undergraduates undPgraj@w@ts
+underground undPgr?nd
+undergrowth undPgrOT
+underhanded undPhand@d
+underhill undPhil
+underinsure ~dPinS{r
+underinsured ~dPinS{rd
+underkoffler undPk@f@lP
+underlie undPlI
+underlies undPlIz
+underline undPlIn
+underlined undPlInd
+underlines undPlInz
+underling undPl6N
+underlings undPl6Nz
+underlining undPlIn6N
+underly undPlI
+underlying undPlI6N
+underman undPman
+undermanned undPmand
+undermine undPmIn
+undermined undPmInd
+undermines undPmInz
+undermining undPmIn6N
+underneath undPnET
+undernourish undPnViS
+undernourished undPnViSt
+underpaid undPpAd
+underpants undPpants
+underpass undPpas
+underpay undPpA
+underpaying undPpA6N
+underpayment undPpAm~t
+underpayments undPpAm~ts
+underperform undPpPf{rm
+underperformance ~dPpPf{rm~s
+underperformed undPpPf{rmd
+underperformer undPpPf{rmP
+underperforming undPpPf{rm6N
+underpin undPpin
+underpinned undPpind
+underpinning undPpin6N
+underpinnings undPpin6Nz
+underplay ~dPplA
+underplayed ~dPplAd
+underpower ~dPp?P
+underpowered ~dPp?Pd
+underprice undPprIs
+underpriced undPprIst
+underpricing undPprIs6N
+underpriviledged ~dPprivl6jd
+underrate ~dPrAt
+underrated ~dPrAt@d
+underreport ~dPr@p{rt
+underreported ~dPr@p{rt@d
+underreporting undPr@p{rt6N
+underrepresent ~dPrepr@zent
+underrepresented ~dPrepr@zent@d
+underscore undPsk{r
+underscored undPsk{rd
+underscores undPsk{rz
+underscoring undPsk{r6N
+undersea undPsE
+underseas ~dPsEz
+undersecretary undPsekr@ter/
+undersell undPsel
+underselling undPsel6N
+underserve ~dPsVv
+underserved ~dPsVvd
+undershirt undPSVt
+undershirts undPSVts
+underside undPsId
+undersized undPsIzd
+undersold ~dPsOld
+underspin undPspin
+understaff undPstaf
+understaffed undPstaft
+understand undPstand
+understandable undPstand@b@l
+understandably undPstand@bl/
+understanding undPstand6N
+understandings ~dPstand6Nz
+understands undPstandz
+understate undPstAt
+understated undPstAt@d
+understatement undPstAtm~t
+understates undPstAts
+understating undPstAt6N
+understood undPstqd
+understory undPst{r/
+understudy undPstud/
+undersubscribed ~dPs@bskrIbd
+undertake undPtAk
+undertaken undPtAk~
+undertaker undPtAkP
+undertakes undPtAks
+undertaking undPtAk6N
+undertakings undPtAk6Nz
+undertone undPtOn
+undertones undPtOnz
+undertook undPtqk
+undertow undPtO
+undertows undPtOz
+underuse undPyUz
+underused undPyUzd
+underutilize undPyUt@lIz
+underutilized undPyUt@lIzd
+undervaluation undPvalyUAS~
+undervalue undPvalyU
+undervalued undPvalyUd
+undervalues undPvalyUz
+undervaluing ~dPvalyU6N
+underwater undPw{tP
+underway undPwA
+underwear undPwer
+underweight undPwAt
+underweighted ~dPwAt@d
+underwent undPwent
+underwithheld undPwiTheld
+underwithhold undPwiThOld
+underwithholding undPwiThOld6N
+underwood undPwqd
+underwoods undPwqdz
+underworld undPwVld
+underwrite undPrIt
+underwriter undPrItP
+underwriter's undPrItPz
+underwriters undPrItPz
+underwriters' undPrItPz
+underwrites undPrIts
+underwriting undPrIt6N
+underwritings undPrIt6Nz
+underwritten undPrit~
+underwrote undPrOt
+undeserved und@zVvd
+undeserving und@zVv6N
+undesirable und@zIr@b@l
+undetectable ~d@tekt@b@l
+undetected und@tekt@d
+undetermined und/tVm~d
+undetermined und@tVm~d
+undetermining und/tVm~6N
+undetermining und@tVm~6N
+undeterred und@tVd
+undeveloped und@vel@pt
+undiagnosed ~dIagn]st
+undid ~did
+undifferentiated ~difPenS/At@d
+undignified ~dign@fId
+undilute und@lUt
+undiluted und@lUt@d
+undiminished und}in6St
+undine undEn
+undiplomatic ~dipl}at6k
+undiplomatically ~dipl}at6kl/
+undisciplined ~dis@plind
+undisclosed undisklOzd
+undiscovered undiskuvPd
+undisguised undisgIzd
+undisputed undispyUt@d
+undistinguished undistiNgw6St
+undistributed undistribyUt@d
+undisturbed undistVbd
+undiversified undivVs@fId
+undivided unduvId@d
+undo ~dU
+undock ~dok
+undocking ~dok6N
+undocumented ~doky}cn@d
+undocumented ~doky}cnt@d
+undoing ~dU6N
+undone ~dun
+undoubted ~d?t@d
+undoubtedly ~d?t@dl/
+undreamed ~drEmd
+undress ~dres
+undressed ~drest
+undue ~dU
+undulate unj@lAt
+undulating unj@lAt6N
+unduly ~dUl/
+undying ~dI6N
+unearned ~Vnd
+unearth ~VT
+unearthed ~VTt
+unearthing ~VT6N
+unearthly ~VTl/
+unease ~Ez
+uneasily ~Ez@l/
+uneasiness unEz/n@s
+uneasy ~Ez/
+uneconomic ~ek~om6k
+uneconomical ~ek~om6k@l
+unedited ~ed@t@d
+uneducated ~ejqkAt@d
+unelectable un@lekt@b@l
+unelected un@lekt@d
+unemotional un/mOS~@l
+unemotional un}OS~@l
+unemploy ~}pl<
+unemployable ~}pl<@b@l
+unemployed uncmpl<d
+unemployment un}pl<m~t
+unencumber uncnkumbP
+unencumbered uncnkumbPd
+unending ~end6N
+unenforceable uncnf{rs@b@l
+unenforced uncnf{rst
+unenlightened uncnlIt~d
+unenthusiastic ~~TUz/ast6k
+unenumerated ~~UmPAt@d
+unenviable ~envE@b@l
+unequal ~Ekw@l
+unequaled ~Ekwuld
+unequivocably ~6kwiv@k@bl/
+unequivocal un/kwiv@k@l
+unequivocal un6kwiv@k@l
+unequivocally un/kwiv@k@l/
+unequivocally un/kwiv@kl/
+unesco yUneskO
+unethical ~eT6k@l
+unethically ~eT6kl/
+uneven ~Ev~
+unevenly ~Ev~l/
+uneventful un/ventf@l
+unexciting ~6ksIt6N
+unexercised ~eksPsIzd
+unexpected un6kspekt@d
+unexpectedly un6kspekt@dl/
+unexpired un6kspIPd
+unexplainable un6ksplAn@b@l
+unexplained un6ksplAnd
+unexploded un6ksplOd@d
+unexploited ~6kspl<t@d
+unexplored un6kspl{rd
+unfailing ~fAl6N
+unfailingly ~fAl6Nl/
+unfair unf,r
+unfair {nf,r
+unfair ~f,r
+unfairly ~f,rl/
+unfairness ~f,rn@s
+unfaithful ~fATf@l
+unfamiliar unf}ilyP
+unfamiliarities unf}ily,r@t/z
+unfamiliarity unf}ily,r@t/
+unfashionable ~faS~@b@l
+unfathomable ~faT}@b@l
+unfavorable unfAvP@b@l
+unfavorably ~fAvP@bl/
+unfazed ~fAzd
+unfeasible ~fEz@b@l
+unfeeling ~fEl6N
+unfenced ~fenst
+unfettered ~fetPd
+unfilled ~fild
+unfiltered ~filtPd
+unfinished ~fin6St
+unfit ~fit
+unflagging ~flag6N
+unflappable ~flap@b@l
+unflattering ~flatP6N
+unflinching ~flinC6N
+unfocused ~fOk@st
+unfold ~fOld
+unfolded ~fOld@d
+unfolding ~fOld6N
+unfolds ~fOldz
+unforeseeable unf{rsE@b@l
+unforeseen unf{rsEn
+unforgettable unfPget@b@l
+unforgivable unf{rgiv@b@l
+unforgiven unf{rgiv~
+unforgiving ~fPgiv6N
+unformed ~f{rmd
+unfortunate ~f{rCUn@t
+unfortunate ~f{rC~@t
+unfortunately ~f{rCUn@tl/
+unfortunately ~f{rC~@tl/
+unfortunates ~f{rCUn@ts
+unfortunates ~f{rC~@ts
+unfounded ~f?nd@d
+unfriendly ~frendl/
+unfrozen ~frOz~
+unfulfilled unfqlfild
+unfunded ~fund@d
+unfunnily ~fun@l/
+unfurl ~fVl
+unfurled ~fVld
+unfurling ~fVl6N
+ung uN
+ungainly ~gAnl/
+ungar uNgP
+ungaro UNg)r]
+unger uNgP
+ungerer uNPP
+ungermann ~jVm~
+unglamorous ~glamP@s
+unglue ~glU
+unglued ~glUd
+ungo ~gO
+ungodly ~g{dl/
+ungovernable ~guvPn@b@l
+ungrateful ~grAtf@l
+unguarded ~g)rd@d
+unhampered ~hampPd
+unhappily ~hap@l/
+unhappiness ~hap/n@s
+unhappy ~hap/
+unharmed ~h)rmd
+unhealthful ~helTf@l
+unhealthy ~helT/
+unheard ~hVd
+unhedged ~hejd
+unheeded ~hEd@d
+unhelpful ~helpf@l
+unheralded ~h,r@ld@d
+unhesitatingly ~hez@tAt6Nl/
+unhindered ~hindPd
+unhinge ~hinj
+unhinged ~hinjd
+unhitch ~hiC
+unholy ~hOl/
+unhook ~hqk
+unhorsed ~h{rst
+unhurried ~hV/d
+unhurt ~hVt
+uni yUn/
+unibancorp yUn@bank{rp
+unicef yUn@sef
+unicellular yUnisely@lP
+unicenter yUnisentP
+unicom Un6k{m
+unicorn yUn6k{rn
+unicorp yUn6k{rp
+unicorp's yUn6k{rps
+unicycle yUn@sIk@l
+unicycles yUn@sIk@lz
+uniden yUn@den
+uniden's yUn@denz
+unidentified unIdent@fId
+unification yUn@f@kAS~
+unified yUn@fId
+unifil yUn@fil
+uniforce yUn@f{rs
+uniform yUn@f{rm
+uniformed yUn@f{rmd
+uniformity yUn@f{rm@t/
+uniformly yUn@f{rml/
+uniforms yUn@f{rmz
+unify yUn@fI
+unifying yUn@fI6N
+unigesco yUn6gesk]
+unikom yUn6k{m
+unilab yUn@lab
+unilateral yUn@latP@l
+unilateralism yUn@latP@liz}
+unilaterally yUn@latP@l/
+unilaterally yUn@latr@l/
+unilever yUn@lEvP
+unilever's yUn@lEvPz
+unimaginable un}aj~@b@l
+unimaginative ~}ajin@t6v
+unimagined un}aj~d
+unimate yUn}At
+unimation yUn}AS~
+unimedia yUn}Ed/@
+unimpaired unimp,rd
+unimpeachable unimpEC@b@l
+unimpeded unimpEd@d
+unimportant ~imp{rt~t
+unimpressed unimprest
+unimpressive unimpres6v
+unimproved unimprUvd
+unincorporated unink{rpPAt@d
+unindicted unindIt@d
+uninfected uninfekt@d
+uninformative ~inf{rm@t6v
+uninformed uninf{rmd
+uninhabitable uninhab@t@b@l
+uninhabited uninhab@t@d
+uninhibited uninhib@t@d
+uninitiated un/niS/At@d
+uninitiated uniniS/At@d
+uninjured ~injPd
+uninspired uninspIPd
+uninspiring ~inspIr6N
+uninsurable ~inSqr@b@l
+uninsured uninSqrd
+unintelligible unintel@j@b@l
+unintended unintend@d
+unintentional unintenS~@l
+unintentionally unintenSn@l/
+unintentionally unintenS~@l/
+uninterested ~intr@st@d
+uninteresting ~intr@st6N
+uninterrupted uninPupt@d
+uninterrupted unintPupt@d
+uninterruptible ~inPupt@b@l
+uninterruptible ~intPupt@b@l
+uninvited uninvIt@d
+uninviting uninvIt6N
+uninvolved ~inv{lvd
+union yUny~
+union's yUny~z
+uniondale yUny~dAl
+unionfed yUny~fed
+unionism yUny~iz}
+unionist yUny~@st
+unionists yUny~ists
+unionization yUny~@zAS~
+unionize yUny~Iz
+unionized yUny~Izd
+unionizing yUny~Iz6N
+unions yUny~z
+unions' yUny~z
+unique yUnEk
+uniquely yUnEkl/
+uniqueness yUnEkn@s
+uniroyal yUn6r<@l
+unisex yUniseks
+unisom yUn@som
+unison yUn@s~
+unisons yUn@s~z
+unisource yUnis{rs
+unissued ~iSUd
+unisys yUn@sis
+unisys' yUn@sis
+unisys's yUn@sis@z
+unit yUn@t
+unit's yUn@ts
+unita yUnEt@
+unitaf yUn@taf
+unitarian yUn@t,r/~
+unitary yUn@ter/
+unitas yUnIt@s
+unite yUnIt
+united yUnIt@d
+united's yUnIt@dz
+unitedbank yUnIt@dbaNk
+unitek yUn@tek
+unitel yUn@tel
+unites yUnIts
+unitholder yUn@thOldP
+unitholders yUn@thOldPz
+uniting yUnIt6N
+unitrin yUn@trin
+unitrin's yUn@trinz
+unitrode yUn@trOd
+unitrode's yUn@trOdz
+units yUn@ts
+units' yUn@ts
+unity yUn@t/
+univa yUn6v@
+univar yUn6vor
+univation yUn6vAS~
+universal yUn6vVs@l
+universal's yUn6vVs@lz
+universality yUn6vPsal@t/
+universally yUn6vVs@l/
+universe yUn6vVs
+universes yUn6vVs@z
+universities yUn6vVs@t/z
+universities' yUn6vVs@t/z
+university yUn6vVs@t/
+university's yUn6vVs@t/z
+univisa yUn6vEs@
+univision yUn6viZ~
+unix yUn6ks
+unjust ~just
+unjustifiable unjust@fI@b@l
+unjustifiably unjust@fI@bl/
+unjustified ~just@fId
+unjustly ~justl/
+unkefer uNkcfP
+unkempt ~kempt
+unkind ~kInd
+unkindest ~kInd@st
+unknowable ~nO@b@l
+unknowing ~nO6N
+unknowingly ~nO6Nl/
+unknown ~nOn
+unknowns ~Onz
+unlabeled ~lAb@ld
+unland unl~d
+unlawful ~l{f@l
+unlawfully ~l{f@l/
+unleaded ~led@d
+unleash ~lES
+unleashed ~lESt
+unleashes ~lES@z
+unleashing ~lES6N
+unless ~les
+unleveraged ~levr6jd
+unlicensed ~lIs~st
+unlike ~lIk
+unlikely ~lIkl/
+unlimited ~lim@t@d
+unlined ~lInd
+unlisted ~list@d
+unlivable ~liv@b@l
+unload ~lOd
+unloaded ~lOd@d
+unloading ~lOd6N
+unloads ~lOdz
+unlock ~lok
+unlocked ~lokt
+unlocking ~lok6N
+unloved ~luvd
+unlucky ~luk/
+unmade ~mAd
+unmanage ~man6j
+unmanageable ~man6j@b@l
+unmanaged ~man6jd
+unmanned ~mand
+unmarked ~m)rkt
+unmarried ~m,r/d
+unmask ~mask
+unmasked ~maskt
+unmatched ~maCt
+unmentionable ~menS~@b@l
+unmentioned ~menC~d
+unmet ~met
+unmistakable unmistAk@b@l
+unmistakably unmistAk@bl/
+unmitigated ~mit@gAt@d
+unmixed ~mikst
+unmolested unm@lest@d
+unmoved ~mUvd
+unnamed ~nAmd
+unnatural ~naCP@l
+unnaturally ~aCPl/
+unnaturally ~naCP@l/
+unnaturally ~naCPl/
+unnecessarily ~nes@ser@l/
+unnecessary ~nes@ser/
+unneeded ~nEd@d
+unnerve ~Vv
+unnerved ~nVvd
+unnerving ~Vv6N
+unnoticed ~nOt@st
+uno UnO
+uno ~O
+unobstructed un@bstrukt@d
+unobtainable un@btAn@b@l
+unobtrusive un@btrUs6v
+unocal yUn@kal
+unocal yUn@k{l
+unocal's yUn@kalz
+unocal's yUn@k{lz
+unoccupied ~oky@pId
+unofficial un@fiS@l
+unofficially ~@fiS@l/
+unopened ~Op~d
+unopposed un@pOzd
+unorganized ~{rg~Izd
+unorthodox ~{rT@doks
+unos Un]z
+unosom yUn]s{m
+unosom yUn]s}
+unpack ~pak
+unpacked ~pakt
+unpacking ~pak6N
+unpaid ~pAd
+unpainted ~pAnt@d
+unpalatable ~pal@t@b@l
+unparalleled ~p,r@leld
+unpatriotic ~pAtr/ot6k
+unpayable ~pA@b@l
+unperturbed unpPtVbd
+unplaced ~plAst
+unplanned ~pland
+unpleasant ~plez~t
+unpleasantly ~plez~tl/
+unpleasantness ~plez~tn@s
+unplug ~plug
+unplugged unplugd
+unplugged ~plugd
+unpopular unpopy@lP
+unpopularity ~popy@l,r@t/
+unprecedented ~pres@dent@d
+unprecedentedly ~pres@dent@dl/
+unpredictability unpr@dikt@bil@t/
+unpredictable unpr@dikt@b@l
+unpredictably unpr@dikt@bl/
+unprepared unpr/p,rd
+unpreserved ~pr/zVvd
+unpreserved ~pr@zVvd
+unpressurized ~preSPIzd
+unpretentious unpr/tenS@s
+unprincipled ~prins@p@ld
+unprintable ~print@b@l
+unprocessed ~pr{sest
+unproductive unpr@dukt6v
+unprofessional unpr@feS~@l
+unprofitability ~prof@t@bil@t/
+unprofitable ~prof@t@b@l
+unprofor upr]f{r
+unprofor's upr]f{rz
+unpromising ~pr{mis6N
+unprotected unpr@tekt@d
+unproved ~prUvd
+unproven ~prUv~
+unprovoked unpr@vOkt
+unpublicized ~publ@sIzd
+unpublished ~publ6St
+unpunished ~pun6St
+unqualified ~kwol@fId
+unquestionable ~kwesC~@b@l
+unquestionably ~kwesC~@bl/
+unquestioned ~kwesC~d
+unquestioning ~kwesC~6N
+unquote unkwOt
+unrated ~rAt@d
+unrath unr@T
+unratified ~rat@fId
+unravel ~rav@l
+unraveled ~rav@ld
+unraveling ~rav@l6N
+unraveling ~ravl6N
+unravels ~rav@lz
+unreachable ~rEC@b@l
+unread ~red
+unreadable unrEd@b@l
+unreadable ~rEd@b@l
+unreal ~rEl
+unrealistic ~rElist6k
+unrealistically ~rE@list6kl/
+unreality unr/al@t/
+unrealized ~rE@lIzd
+unreasonable ~rEzn@b@l
+unreasonably ~rEz~@bl/
+unreasoning ~rEzn6N
+unreceptive ~r@sept6v
+unrecognizable ~rek@gnIz@b@l
+unrecognized ~rek@gnIzd
+unreconciled ~rek~sIld
+unreconstructed unr/k~strukt@d
+unrecorded unr6k{rd@d
+unredeemed unr/dEmd
+unrefined unr/fInd
+unrefuted unr/fyUt@d
+unregistered ~rej@stPd
+unregulated ~regy@lAt@d
+unrehearsed ~r/hVst
+unreimbursed ~r/imbVst
+unrein {nrIn
+unrelated unr/lAt@d
+unrelated unr@lAt@d
+unreleased ~r@lEst
+unrelenting unr/lent6N
+unreliability unr/lI@bil@t/
+unreliable unr/lI@b@l
+unreliable unr@lI@b@l
+unrelieved unr/lEvd
+unremarkable ~r})rk@b@l
+unremarked ~r})rkt
+unremitted ~r}it@d
+unremitting unr/mit6N
+unremitting unr}it6N
+unrepentant unr/pent~t
+unrepentant unr@pent~t
+unreported unr/p{rt@d
+unrepresentative ~repr@zent@t6v
+unrepresented ~repr@zent@d
+unrequited unr/kwIt@d
+unresolved ~r@zolvd
+unresponsive unr/spons6v
+unrest ~rest
+unrestrained unr/strAnd
+unrestricted unr/strikt@d
+unrevised ~r/vIzd
+unring ~riN
+unrivaled ~rIv@ld
+unrue unrU
+unruffled ~ruf@ld
+unruh unrU
+unruly ~rUl/
+unsafe ~sAf
+unsaid ~sed
+unsalable ~sAl@b@l
+unsaleable ~sAl@b@l
+unsanctioned ~saNkS~d
+unsanitary ~san@ter/
+unsatisfactory uns@t@sfaktP/
+unsatisfied ~sat@sfId
+unsatisfying ~sat@sfI6N
+unsaturated ~saCPAt@d
+unsavory ~sAvP/
+unscathed ~skATd
+unscheduled ~skejUld
+unscientific ~sI~tif6k
+unscom unsk{m
+unscramble ~skramb@l
+unscripted ~skript@d
+unscrupulous ~skrUpy@l@s
+unseal ~sEl
+unsealed ~sEld
+unseasonably ~sEz~@bl/
+unseat ~sEt
+unseated ~sEt@d
+unseating ~sEt6N
+unsecured uns/kyqrd
+unsecured uns6kyqrd
+unseemly ~sEml/
+unseen ~sEn
+unsell {ns@l
+unsell ~sel
+unsentimental ~sent}ent@l
+unser unsP
+unserviceable unsVv@s@b@l
+unserviceable ~sVv@sub@l
+unset unset
+unset ~set
+unsettle ~set@l
+unsettled ~set@ld
+unsettling ~set@l6N
+unsettling ~setl6N
+unshackle ~Sak@l
+unshackled ~Sak@ld
+unshakable ~SAk@b@l
+unshakeable ~SAk@b@l
+unshaken ~SAk~
+unsharpened ~S)rp~d
+unshaven ~SAv~
+unsightly ~sItl/
+unsigned ~sInd
+unsinkable ~siNk@b@l
+unskilled ~skild
+unsmiling ~smIl6N
+unsold ~sOld
+unsolicited uns@lis@t@d
+unsolvable ~solv@b@l
+unsolved ~solvd
+unsophisticated uns@fist6kAt@d
+unsound ~s?nd
+unsparing ~sp,r6N
+unspeakable ~spEk@b@l
+unspecified ~spes@fId
+unspectacular unspcktaky@lP
+unspent ~spent
+unspoiled ~sp<ld
+unspoken ~spOk~
+unsportsmanlike ~sp{rtsm~lIk
+unstable ~stAb@l
+unstained ~stAnd
+unstated ~stAt@d
+unsteady ~sted/
+unstinting ~stint6N
+unstoppable ~stop@b@l
+unstructured ~strukSPd
+unstuck ~stuk
+unsubscribe ~s@bskrIb
+unsubscribed ~s@bskrIbd
+unsubsidized ~subs@dIzd
+unsubstantiated uns@bstanS/At@d
+unsubtle ~sut@l
+unsuccessful uns@ksesf@l
+unsuccessfully uns@ksesf@l/
+unsuitable ~sUt@b@l
+unsuited ~sUt@d
+unsullied ~sul/d
+unsung ~suN
+unsupervised ~sUpPvIzd
+unsupportable uns@p{rt@b@l
+unsupported ~s@p{rt@d
+unsure ~Sqr
+unsurpassed unsPpast
+unsurprising ~sPprIz6N
+unsurprisingly unsPprIz6Nl/
+unsuspected uns@spekt@d
+unsuspecting uns@spekt6N
+unsustainable uns@stAn@b@l
+unsustainably uns@stAn@bl/
+unswayed ~swAd
+unswerving ~swVv6N
+unsworth unswPT
+unsympathetic ~simp@Tet6k
+untainted ~tAnt@d
+untangle ~taNg@l
+untangling ~taNl6N
+untapped ~tapt
+untaxed ~takst
+unted ~ted
+untenable ~ten@b@l
+untendered ~tendPd
+unterberg untPbPg
+unterman untPm~
+untermeyer untPmIr
+unterreiner {ntPInP
+untested ~test@d
+unthinkable ~TiNk@b@l
+unthinking ~TiNk6N
+unthinkingly ~TiNk6Nl/
+untidy ~tId/
+untie ~tI
+untied ~tId
+untiedt {nt/t
+until ~til
+untimely ~tIml/
+unto untU
+untold ~tOld
+untouchable ~tuC@b@l
+untouchables ~tuC@b@lz
+untouched ~tuCt
+untoward ~t@w{rd
+untoward ~tU{rd
+untraceable ~trAs@b@l
+untraditional untr@diS~@l
+untrained ~trAnd
+untrammeled ~tram@ld
+untreatable ~trEt@b@l
+untreated ~trEt@d
+untried ~trId
+untroubled ~trub@ld
+untrue ~trU
+untrustworthy ~trustwVT/
+untruth ~trUT
+untruthful ~trUTf@l
+untruths ~trUTs
+untruths ~trUTs
+unturned ~tVnd
+untypical ~tip6k@l
+unum Un}
+unum yUn}
+unusable ~yUz@b@l
+unused ~yUzd
+unusual ~yUZ@w@l
+unusual ~yUZU@l
+unusual ~yUZw@l
+unusually ~yUZ@w@l/
+unusually ~yUZU@l/
+unusually ~yUZw@l/
+unvarnished ~v)rn6St
+unveil ~vAl
+unveiled ~vAld
+unveiling ~vAl6N
+unveils ~vAlz
+unverifiable ~ver@fI@b@l
+unverified ~v,r@fId
+unverzagt {nvPz{gt
+unwanted ~w{nt@d
+unwarranted ~w{r~t@d
+unwary ~w,r/
+unwashed ~woSt
+unwavering ~wAvP6N
+unwed ~wed
+unwelcome ~welk}
+unwelcomed ~welk}d
+unwieldiness ~wEld/n@s
+unwielding ~wEld6N
+unwieldy ~wEld/
+unwilling ~wil6N
+unwillingly ~wil6Nl/
+unwillingness ~wil6Nn@s
+unwin {nwin
+unwind ~wInd
+unwinding ~wInd6N
+unwinnable ~win@b@l
+unwise ~wIz
+unwisely ~wIzl/
+unwitting ~wit6N
+unwittingly ~wit6Nl/
+unworkable ~wVk@b@l
+unworried ~wV/d
+unworthy ~wVT/
+unwound ~w?nd
+unwrap ~rap
+unwrapped ~rapt
+unwrapping ~rap6N
+unwritten ~rit~
+unyielding ~yEld6N
+unz unz
+unzicker {nz6kP
+unzip ~zip
+unzipped ~zipt
+up up
+up's ups
+upbeat upbEt
+upbraid @pbrAd
+upbraided @pbrAd@d
+upbringing upbriN6N
+upchurch upCVC
+upcoming upkum6N
+update @pdAt
+update updAt
+updated @pdAt@d
+updated updAt@d
+updates @pdAts
+updates updAts
+updating @pdAt6N
+updating updAt6N
+updegraff upd6gr@f
+updegrove UpdcgrOv/
+updike updIk
+updraft updraft
+updrafts updrafts
+updyke updIk
+upfront upfrunt
+upgrade @pgrAd
+upgrade upgrAd
+upgraded upgrAd@d
+upgrader upgrAdP
+upgrades @pgrAdz
+upgrades upgrAdz
+upgrading @pgrAd6N
+upgrading upgrAd6N
+upham up}
+upheaval @phEv@l
+upheavals @phEv@lz
+upheld @pheld
+uphill uphil
+uphoff uph{f
+uphold @phOld
+upholding @phOld6N
+upholds @phOldz
+upholster @pOlstP
+upholstered @pOlstPd
+upholstery @pOlstP/
+upjohn upjon
+upjohn's upjonz
+upkeep upkEp
+upland upl~d
+uplands upl~dz
+uplift uplift
+uplifted uplift@d
+uplifting uplift6N
+uplinger Up@l6NP
+upmanship upm~Sip
+upmarket upmork@t
+upon @pon
+upp up
+upped upt
+upper upP
+upperclass upPklas
+upperman upPm~
+uppermost upPmOst
+uppers upPz
+upping up6N
+uppity up@t/
+upright @prIt
+upright uprIt
+uprights uprIts
+uprise uprIz
+uprising @prIz6N
+uprising uprIz6N
+uprisings uprIz6Nz
+upriver uprivP
+uproar upr{r
+uproot @prUt
+uprooted @prUt@d
+uprooting @prUt6N
+ups ups
+upscale upskAl
+upset @pset
+upset upset
+upsets @psets
+upsets upsets
+upsetting @pset6N
+upshaw upS{
+upshot upSot
+upshur upSP
+upside upsId
+upsize upsIz
+upsizing upsIz6N
+upson ups~
+upstage @pstAj
+upstaged upstAjd
+upstairs @pst,rz
+upstanding upstand6N
+upstart upstort
+upstarts @pst)rts
+upstate upstAt
+upstream upstrEm
+upsurge upsVj
+upswing @pswiN
+upswing upswiN
+upswings upswiNz
+uptain @ptAn
+uptake uptAk
+uptegrove upt6gr@v
+uptick uptik
+upticks uptiks
+uptight @ptIt
+upton upt~
+uptown upt?n
+uptrend uptrend
+upturn @ptVn
+upturn uptVn
+upturns uptVnz
+upward upwPd
+upwardly upwPdl/
+upwards upwPdz
+upwood upwqd
+ur V
+ur qr
+ural yqr@l
+urals yqr@lz
+uram yUr}
+uranga PoNg@
+uranium yPAn/}
+uranus yUr~@s
+uranus yV~@s
+urbach Vbok
+urbain PbAn
+urban Vb~
+urban's Vb~z
+urbana Pban@
+urbanchuk PbunC6k
+urbanczyk PbunC6k
+urbane PbAn
+urbanek Pbanck
+urbani Pbon/
+urbaniak Pban/ak
+urbanik Pban6k
+urbanism Vb~izm
+urbanite Vb~It
+urbanites Vb~Its
+urbanization Vb~@zAS~
+urbanize Vb~Iz
+urbanized Vb~Izd
+urbano Pbon]
+urbanowicz Pban@v6C
+urbanski Pbansk/
+urbas Vb@z
+urbaszewski Vb@sUsk/
+urbina PbEn@
+urchin VC~
+urchins VC~z
+urda Vd@
+urdiales Vd/Alz
+urdu PdU
+ure yUr
+urea yPE@
+uremia yPEm/@
+uren Pen
+urena PAn@
+uresti Pest/
+urethane yV@TAn
+urethra yVETr@
+urey yV/
+urfer VfP
+urge Vj
+urged Vjd
+urgen Vjen
+urgen's Vjenz
+urgency Vj~s/
+urgent Vj~t
+urgently Vj~tl/
+urges Vj@z
+urging Vj6N
+urgings Vj6Nz
+urgo Vg]
+uri yV/
+uri's yV/z
+urian yV/~
+uriarte yV/)rt/
+urias yPE@z
+uribe yPEb/
+uric yV6k
+urich yV6k
+urick yVr6k
+urie yV/
+uriegas yPEg@z
+urinalysis yV~al@s@s
+urinary yV~er/
+urinate yV~At
+urinating yV~At6N
+urine yV~
+urine yqr~
+urioste yP/Ost/
+urkel Vk@l
+urman Vm~
+urn Vn
+urness Vn@s
+urokinase yV@k~Az
+urologist yPol@j@st
+urologists yPol@j@sts
+urology yPol@j/
+urquhart Vkort
+urquidez PkwEdcz
+urquidi PkwEd/
+urquiza PkwEz@
+urrea PE@
+urrutia PUS@
+ursa Vs@
+urschel VS@l
+ursery VsP/
+ursie Vs/
+ursin Vsin
+ursini PsEn/
+urso Vs]
+ursola PsOl@
+urson Vs~
+urstadt Vstat
+ursula Vs@l@
+ursus Vs@s
+ursy Vs/
+urton Vt~
+uruguay yV@gwA
+uruguay yV@gwI
+uruguay's yV@gwAz
+uruguay's yV@gwIz
+uruguayan yV@gwA~
+uruguayan yV@gwI~
+urwin Vw~
+ury yUr/
+ury yV/
+us us
+us yUes
+usa yUesA
+usable yUz@b@l
+usafe yUsAf
+usage yUs@j
+usages yUs@j@z
+usaid yUesAd
+usair yUes,r
+usairways yUes,rwAz
+usameribancs yUes},r@banks
+usbancorp yUesbaNk{rp
+use yUs
+use yUz
+usec yUsck
+used yUzd
+useful yUsf@l
+useful's yUsf@lz
+usefully yUsf@l/
+usefulness yUsf@ln@s
+useless yUsl@s
+uselman yUs@lm~
+uselton yUs@lt~
+usenet yUznet
+user yUzP
+user's yUzPz
+users yUzPz
+users' yUzPz
+usery yUzP/
+uses yUs@z
+uses yUz@z
+usher uSP
+ushered uSPd
+ushering uSP6N
+ushers uSPz
+usines yUzEnz
+using yUz6N
+usinor yUs~P
+usrey usr/
+usry usr/
+uss yUeses
+ussery usP/
+ustinov Ust~ov
+ustinov yUstinov
+ustrust yUestrust
+usual yUZ@w@l
+usual yUZU@l
+usually yUZ@l/
+usually yUZ@w@l/
+usurp yUsVp
+usurpation yUsPpAS~
+usurped yUsVpt
+usurping yUsVp6N
+usurps yUsVps
+usury yUZP/
+usury yUzP/
+utah yUt{
+utah's yUtoz
+utamaro yUt})r]
+utech yUtek
+utecht yUtekt
+utensil yUtens@l
+utensils yUtens@lz
+uterine yUtP~
+utero yUtP]
+uterus yUtP@s
+utgoff utg{f
+uthe uT
+uthe uT
+uther uTP
+uther yUTP
+utica yUt/k@
+utica yUt@k@
+utilicorp yUtil@k{r
+utilicorp yUtil@k{rp
+utilitarian yUtil@t,r/~
+utilities yUtil@t/z
+utilities' yUtil@t/z
+utility yUtil@t/
+utility's yUtil@t/z
+utilization yUt@l@zAS~
+utilize yUt@lIz
+utilized yUt@lIzd
+utilizes yUt@lIz@z
+utilizing yUt@lIz6N
+utke utk/
+utley utl/
+utmost utmOst
+utopia yUtOp/@
+utopian yUtOp/~
+utopians yUtOp/~z
+utopias yUtOp/@z
+utsey uts/
+utsumi UtsUm/
+utt ut
+uttech utek
+utter utP
+utterance utP~s
+utterances utP~s@z
+uttered utPd
+uttering utP6N
+utterly utPl/
+utters utPz
+utz uts
+utzinger utz6NP
+uva yUv@
+uva yUvEA
+uwe yU
+uy U/
+uy yUwI
+uyeda IEd@
+uyehara UyAh)r@
+uyeno IAn]
+uys yU/z
+uys yUwIes
+uzbek Uzbck
+uzbekistan Uzbek@stan
+uzbeks Uzbcks
+uzelac @zel@k
+uzi Uz/
+uzis Uz/z
+uzmack Uzmak
+uzzell Uzel
+uzzle uz@l
+v vE
+v's vEz
+v. vE
+v.'s vEz
+v.s vEz
+vaal vol
+vaapenfabrikk vopenf@br6k
+vaapenfabrikk vop~fobr6k
+vaca vak@
+vacancies vAk~s/z
+vacancy vAk~s/
+vacant vAk~t
+vacanti v@kant/
+vacate vAkAt
+vacated vAkAt@d
+vacated vAkAt@d
+vacating vAkAt6N
+vacation vAkAS~
+vacationed vAkAS~d
+vacationer vAkAS~P
+vacationers vAkAS~Pz
+vacationers' vAkAS~Pz
+vacationing vAkASn6N
+vacationing vAkAS~6N
+vacations vAkAS~z
+vacaville vak@vil
+vacca vak@
+vaccarella vokPel@
+vaccaro v@k)r]
+vaccinate vaks~At
+vaccinated vaks~At@d
+vaccination vaks~AS~
+vaccinations vaks~AS~z
+vaccine vaksEn
+vaccine's vaksEnz
+vaccines vaksEnz
+vaccinia v@CEn/@
+vacco vak]
+vacek voCek
+vacha vaC@
+vachon vaC~
+vacillate vas@lAt
+vacillated vas@lAt@d
+vacillating vas@lAt6N
+vacillation vas@lAS~
+vaclav vaklov
+vaclav voklov
+vaclavik vakl@v6k
+vacuous vakyU@s
+vacutainer vakyUtAnP
+vacuum vakyUm
+vacuuming vakyUm6N
+vacuums vakyUmz
+vadala vodol@
+vadas vodoz
+vadehra v@dAr@
+vaden vAd~
+vader vAdP
+vadim vodEm
+vadnais v@dnA
+vadney vadn/
+vaeth vET
+vagabond vag@bond
+vagabonds vag@bondz
+vagaries vAgP/z
+vagary vAgP/
+vagelos v@jel]s
+vagina v@jIn@
+vaginal v@jIn@l
+vagrancy vAgr~s/
+vagrant vAgr~t
+vagrants vAgr~ts
+vague vAg
+vaguely vAgl/
+vagueness vAgn@s
+vaguer vAgP
+vaguest vAgist
+vaguine v@gwEn
+vahey vah/
+vahid vohEd
+vahl vol
+vahle vAh@l
+vail vAl
+vaile vAl
+vaillancourt vAl~k{rt
+vain vAn
+vainly vAnl/
+vajda vId@
+vajna vIn@
+vakuf vakuf
+val val
+vala vol@
+valable valy@b@l
+valade volodA
+valadez volodcz
+valasek v@losck
+valborga volb{rg@
+valcourt v@lk{rt
+valda vold@
+valdemar voldAm)r
+valderrama voldcrom@
+valdes valdez
+valdes-perez valdezpPez
+valdeshari valdcS)r/
+valdez valdez
+valdis valdis
+valdivia voldEv/@
+valdosta vald{st@
+valdovinos vold]vEn]z
+vale vAl
+valeda volAd@
+valedictorian val@dikt{r/~
+valedictory val@diktP/
+valek volck
+valence vAl~s
+valencia v@lens/@
+valencia's v@lens/@z
+valencienne v@lens/en
+valens val~z
+valensuela val~zwAl@
+valensuela's val~zwAl@z
+valent volA~t
+valenta v@lent@
+valente volent/
+valenti v@lent/
+valentia volenS@
+valentin volAntEn
+valentina val~tEn@
+valentine val~tIn
+valentine's val~tInz
+valentines val~tInz
+valentini val~tEn/
+valentino val~tEn]
+valentino's val~tEn]z
+valenza v@lenz@
+valenzano valcnzon]
+valenzuela volcnzUl@
+valeo val/]
+valera v@l,r@
+valeri vol,r/
+valeria v@lEr/@
+valerian v@lir/~
+valeriano volP/on]
+valerie valP/
+valerio v@lEr/]
+valero v@l,r]
+valery valP/
+vales vAlz
+valeska volAsk@
+valet valA
+valhalla valhal@
+valhi valh/
+valia valy@
+valiant valy~t
+valiantly valy~tl/
+valid val@d
+valida volEd@
+validate val@dAt
+validated val@dAt@d
+validates val@dAts
+validating val@dAt6N
+validation val@dAS~
+validity v@lid@t/
+validly val@dl/
+valiente volEnt/
+valin valin
+valiquette val6ket
+valis valis
+valium vAl/}
+valk v{k
+valko valk]
+valla val@
+valladares volod)rcs
+vallance val~s
+vallandingham valund6Nham
+vallario vol)r/]
+vallarta val)rt@
+vallas val@z
+valle vAl
+valleau v@lO
+vallee val/
+vallejo volAy]
+vallejos volAy]z
+vallely vAl/
+vallely val/
+vallery valP/
+valles vAlz
+vallette valet
+valley val/
+valley's val/z
+valleys val/z
+vallez volez
+valli val/
+valliant volE~t
+vallie v{l/
+vallier val/P
+valliere val/cr
+vallis valis
+vallo val]
+vallone volOn/
+vallot val@t
+valls v{lz
+valmeyer valmIP
+valmont v{lmont
+valois valwo
+valone v@lOn
+valonia v@lOny@
+valor valP
+valoree valPE
+valores v@l{rcz
+valparaiso valpPAs]
+valsella v{lsel@
+valspar valzpor
+valtek v{ltek
+valtierra voltir@
+valu valyU
+valuable valyUb@l
+valuables valy@b@lz
+valuables valyUb@lz
+valuation valyUAS~
+valuations valyUAS~z
+value valyU
+valued valyUd
+valueless valyUl@s
+valuepoint valyUp<nt
+values valyUz
+values' valyUz
+valuevision valyUviZ~
+valuing valyU6N
+valujet valyUjet
+valujet's valyUjets
+valukas v@lUk@s
+valvano volvon]
+valve valv
+valverde volv,rdA
+valves valvz
+valvo volv]
+valvoline valv@lEn
+vamos vom]z
+vamp vamp
+vampire vampIr
+vampire's vampIrz
+vampires vampIrz
+vampiric vampir6k
+van van
+van-gogh vangO
+vana van@
+vanacker vanakP
+vanacore vonok{r/
+vanadium v~Ad/}
+vanaken van@k~
+vanallen v~{l~
+vanalstine vanalst/n
+vanalstyne van@lstIn
+vanaman van{m~
+vanamburg vanambPg
+vanamburgh vanambPg
+vanantwerp v~antwPp
+vanarsdale vanPzdAl
+vanarsdall v~)rsd@l
+vanasse vanas
+vanatta vonot@
+vanatter vonatP
+vanauken van?k~
+vanausdall van?sd@l
+vanbebber vanbebP
+vanbeek vanbEk
+vanbenschoten vanbenS@t~
+vanbergen vanbVg~
+vanbibber vanbibP
+vanblarcom vanbl)rk}
+vanblaricom vanblar6k}
+vanbrocklin vanbrokl~
+vanbrunt vanbrunt
+vanburen vanbyUr~
+vanbuskirk vanbuskPk
+vancamp vankamp
+vancampen vankamp~
+vance vans
+vancil vans@l
+vancise vonCIs
+vancleave vankl@v
+vancleef vanklEf
+vancleve vanklEv
+vancomycin vank]mIs~
+vancott v~kot
+vancourt v~k{rt
+vancouver vankUvP
+vancouver's vankUvPz
+vancura vonkqr@
+vancuren vankyUr~
+vandaele vandel
+vandagriff vandagrif
+vandal vand@l
+vandalen vandal~
+vandalism vand@liz}
+vandalize vand@lIz
+vandalized vand@lIzd
+vandalizing vand@lIz6N
+vandall vand{l
+vandals vand@lz
+vandam vandam
+vandamme vandam
+vande vand
+vandeberg vand@bPg
+vandecar vand@kor
+vandegrift vand@grift
+vandehei vand@hI
+vandehey vand@h/
+vandella vandel@
+vandellas vandel@z
+vandeman vand}~
+vandemark vand}ork
+vanden vand~
+vandenberg vand~bPg
+vandenbergh vand~bPg
+vandenberghe vand~bPg
+vandenboom vand~bUm
+vandenbos vand~b]z
+vandenbosch vand~b{S
+vandenbrink vand~br6Nk
+vandenburg vand~bPg
+vandenburgh vand~bPg
+vandenheuvel vand~h<v@l
+vander vandP
+vanderbeck vandPbek
+vanderbeek vandPbEk
+vanderberg vandPbPg
+vanderbilt vandPbilt
+vanderburg vandPbPg
+vanderbush vandPbqS
+vandercook vandPkqk
+vanderford vandPfPd
+vandergriff vandPgrif
+vandergrift vandPgrift
+vandergrift's vandPgrifts
+vanderheide vandPhId
+vanderheiden vandPhId~
+vanderheyden vandPhAd~
+vanderhoef vandPhOf
+vanderhoff vandPh{f
+vanderhoof vandPhqf
+vanderhorst vandPh{rst
+vanderkolk vandPkOk
+vanderkooi vandPkU/
+vanderlaan vandPlon
+vanderleest vandP@lEst
+vanderlinde vandPlind
+vanderlinden vandPlind~
+vanderlip vandPlip
+vandermark vandPmork
+vandermeer vandPmir
+vandermeulen vandPm<l~
+vandermolen vandPmol~
+vanderploeg vandPplOg
+vanderpoel vandPpOl
+vanderpol vandPp{l
+vanderpool vandPpUl
+vanderschaaf vandPSof
+vanderslice vandPslIs
+vandersluis vandPslU@s
+vandersluis vandPslUs
+vanderveen vandPvEn
+vanderveer vandPvir
+vandervelde vandPveld
+vandervelden vandPveld~
+vandervliet vandPvlEt
+vandervoort vandPvqrt
+vandervort vandPv{rt
+vanderwal vandPwol
+vanderwall vandPwol
+vanderweele vandPwEl
+vanderweide vandPwId
+vanderwerf vandPwVf
+vanderwerff vandPwVf
+vanderwilt vandPwilt
+vanderwoude vandPw?d
+vanderzanden vandPzand~
+vanderzee vandPzE
+vandeusen vand<s~
+vandevander vand@vandP
+vandeveer vand@vir
+vandevelde vand@veld
+vandeven vand@v~
+vandevender vand@vendP
+vandeventer vand@v~tP
+vandever vandEvP
+vandevoorde vand@vqrd
+vandevoort vand@vqrt
+vandewalker vand@w{kP
+vandewalle vandUAl
+vandewater vand@w{tP
+vandezande vand@zind
+vandine vandIn
+vandiver vandIvP
+vandivier vandIv/P
+vandoren vand{r~
+vandorn vand{rn
+vandriel vandrEl
+vandross vandr{s
+vandunk vanduNk
+vandusen vandUs~
+vanduyn vandIn
+vanduyne vandIn
+vanduzer vandUzP
+vandyck vandik
+vandyk vand6k
+vandyke vandIk
+vandyken vandIk~
+vandyne vandIn
+vane vAn
+vaneaton van@ton
+vanecek vanes6k
+vaneck vonck
+vanegas vanEg@z
+vanek vanek
+vanella v~el@
+vanengen vaneN~
+vanepps vaneps
+vanes vAnz
+vaness van@s
+vanessa v~es@
+vanessen von@s~
+vanetten vanet~
+vanevery v~evr/
+vanfleet vanflEt
+vanfossan vanfos~
+vanfossen vanfos~
+vang vaN
+vangel vANg@l
+vangelder vANgcldP
+vangie vaN/
+vangieson vaNg/z~
+vangilder vaNgildP
+vangorden vaNgPd~
+vangorder vaNgPdP
+vangorp vaNgPp
+vanguard vangord
+vanguard's vangordz
+vanguilder vangIldP
+vangundy v@Ngund/
+vangy vanj/
+vanhall vanh{l
+vanhandel vanhand@l
+vanhecke vanhek
+vanheel vanhEl
+vanhise vanhIz
+vanhoesen vanhOs~
+vanhook vanhqk
+vanhoose vanhUs
+vanhooser vanhUzP
+vanhoozer vanhUzP
+vanhorn vanh{rn
+vanhorne vanh{rn
+vanhousen vanh?s~
+vanhouten vanhoUt~
+vanhove vanhuv
+vanhoy vanh<
+vanhuss vanhus
+vanhyning vanhIn6N
+vania von/@
+vanier vanEP
+vanik von6k
+vanilla v~il@
+vanilli v~il/
+vanillin v~il~
+vanish van6S
+vanished van6St
+vanishes van6S@z
+vanishing van6S6N
+vanities van@t/z
+vanity van@t/
+vankampen vankamp~
+vankeuren vaNk<r~
+vankirk vaNkPk
+vankleeck vaNklEk
+vankuren vaNkyUr~
+vanlandingham vanland6Nham
+vanlanen vanlan~
+vanlaningham vanlan6Nham
+vanleer vanlir
+vanleeuwen vanlU~
+vanleuven vanl<v~
+vanliere vanlir
+vanliew vanl/U
+vanloan vanlOn
+vanloo vanlU
+vanlue vanlU
+vanluven vanlUv~
+vanmaanen vanmon~
+vanmarter vanm)rtP
+vanmatre vanmAtP
+vanmeter vanmEtP
+vanmetre vanmEtP
+vann van
+vanna van@
+vanname van}
+vannater vanatP
+vannatta vonot@
+vannatter vanatP
+vannatter's vanatPz
+vannelli vonel/
+vanness vanEs
+vannest vanEst
+vannguyen vanUyen
+vannguyen vangE~
+vanni van/
+vannice vanis
+vannie van/
+vannorman van{rm~
+vannortwick v~{rtw6k
+vannostrand vanostr~d
+vannote vanOt
+vannoy van<
+vannucci vonUC/
+vanny van/
+vano von]
+vanora vanP@
+vanorden van{rd~
+vanorder van{rdP
+vanorman van{rm~
+vanornum van{rn}
+vanosdol vanosd@l
+vanoss vanos
+vanostrand vanostr~d
+vanous van@s
+vanover vanOvP
+vanpatten vanpat~
+vanpelt vanpelt
+vanputten vanput~
+vanquish vaNkw6S
+vanquished vaNkw6St
+vanriper vanrIpP
+vanroekel vanrOk@l
+vanrossum vanros}
+vanryn vanrin
+vans vanz
+vansandt vansant
+vansant vons~t
+vanschaick vanSIk
+vanschoick vanS<k
+vansciver vanskIvP
+vanscoy vansk<
+vanscoyoc vansk<ok
+vanscyoc vans/ok
+vanselow vans@l]
+vansickel vansik@l
+vansickle vansik@l
+vanskike vanskIk
+vanskiver vanskIvP
+vanslooten vanslUt~
+vanslyke vanslIk
+vanstone vanstOn
+vanstory vanst{r/
+vanstraten vanstrAt~
+vansyckle vansIk@l
+vantage van@j
+vantage vant@j
+vantage's vant6j@z
+vantages van@j@z
+vantages vant6j@z
+vantassel vantas@l
+vantassell vantas@l
+vantil vontEl
+vantilburg vantilbPg
+vantine vontEn/
+vantol vant{l
+vantran vantran
+vantrease v~trEs
+vantreese vantrEs
+vantuyl vantIl
+vanuaaku vanw@okU
+vanuatu vanUotU
+vanunu v~UnU
+vanvalkenburg vanv{k~bPg
+vanvalkenburgh vanvalk~bPg
+vanveen v~vEn
+vanvlack vanvlak
+vanvleck vanvlek
+vanvleet vanvlEt
+vanvliet vanvlEt
+vanvooren vanvqr~
+vanvoorhis vanvqrh@s
+vanvoorst vanvqrst
+vanvorst vanv{rst
+vanvranken vanvraNk~
+vanwagenen vanwag~~
+vanwagner vanwagnP
+vanwagoner vanwag~P
+vanwart vanw{rt
+vanwert vanwVt
+vanwey vanw/
+vanwhy vanw/
+vanwie vanw/
+vanwieren vanwir~
+vanwinkle vanwiNk@l
+vanwormer vanwVmP
+vanwyck vanwik
+vanwyhe vanwIh
+vanwyk vanwik
+vanya vony@
+vanya's vony@z
+vanyo vony]
+vanzandt vanzant
+vanzant vonz~t
+vanzanten vanzant~
+vanzee vonz/
+vanzile vonzIl
+vapid vap@d
+vapor vApP
+vaporization vApP@zAS~
+vaporize vApPIz
+vaporized vApPIzd
+vapors vApPz
+vaporware vApPwer
+vaquera vokw,r@
+vara v)r@
+varady vPod/
+varani vPon/
+varano voron]
+varble v)rb@l
+varco v)rk]
+vardeman v)rdm~
+varden v)rd~
+vardon vord{n
+varela vorAl@
+vares v)rcs
+vares vArz
+varga v)rg@
+vargas v)rg@s
+vargason v)rg@s~
+varghese v)rgh/z
+vargo v)rg]
+vari v)r/
+variability vcr/@bil@t/
+variable v,r/@b@l
+variables v,r/@b@lz
+varian v,r/~
+variance v,r/~s
+variances v,r/~s@z
+variant v,r/~t
+variants v,r/~ts
+variation ver/AS~
+variations ver/AS~z
+varick v,r6k
+varied v,r/d
+varies v,r/z
+varietal vPEt@l
+varietals vPI@t@lz
+varieties vPI@t/z
+variety vPI@t/
+varig v,r6g
+varin vorEn
+varina vorEn@
+various v,r/@s
+variously v,r/@sl/
+varisco vorEsk]
+varitronic ver@tron6k
+varity v,r@t/
+varity's v,r@t/z
+varityper v,r@tIpP
+varlam v)rlam
+varlen v)rl~
+varley v)rl/
+varma v)rm@
+varmint v)rmint
+varmus v)rm@s
+varn v)rn
+varnado vornod]
+varnadoe vornod]
+varnadore vornod{rA
+varnell v)rn@l
+varner v)rnP
+varnes v)rnz
+varney v)rn/
+varni v)rn/
+varnish v)rn6S
+varnished v)rn6St
+varnishes v)rn6S@z
+varnon vorn{n
+varnum v)rn}
+varo v)r]
+varo v,r]
+varon vor{n
+varona vorOn@
+varone vPOn
+varricchio vorEk/]
+varrone vorOnA
+vars v)rz
+varsity v)rs@t/
+vartanian vortAn/~
+varvaro vorv)r]
+varvel vorvel
+varves v)rvz
+vary v,r/
+varying v,r/6N
+varzi v)rz/
+vasbinder vasbindP
+vasco vask]
+vasconcellos vask~sel]z
+vasconcelos vosk]nsAl]z
+vascular vasky@lP
+vase vAs
+vase voz
+vasectomies vasekt}/z
+vasectomies vazekt}/z
+vasectomy vasekt}/
+vasectomy vazekt}/
+vasek vosck
+vaseline vas@lEn
+vases vAs@z
+vases voz@z
+vasey vas/
+vashti vaSt/
+vasicek vos6Cck
+vasil vosEl
+vasile vos@l
+vasily vas@l/
+vaske vAsk
+vaskevitch vask@v6C
+vasko vosk]
+vaslev vosl6v
+vaslov vaslov
+vaslov's vaslovz
+vasotec vAz]tek
+vasques voskwcs
+vasquez vaskez
+vass vas
+vassal vas@l
+vassallo vosol]
+vassals vas@lz
+vassar vasP
+vassel vas@l
+vasser vasP
+vasseur vasP
+vassey vas/
+vassilios v@sily@s
+vassiliou vasil/U
+vast vast
+vasta vast@
+vastine vostEn/
+vastly vastl/
+vastness vastn@s
+vastola vostOl@
+vat vat
+vater vAtP
+vath vaT
+vatican vat6k~
+vatican's vat6k~z
+vats vats
+vatted vat@d
+vatter vatP
+vaudeville vodvil
+vaudevillian vodvily~
+vaugh v{
+vaughan v{n
+vaughan's v{nz
+vaughn v{n
+vaughn's v{nz
+vaughns v{nz
+vaught v{t
+vault v{lt
+vaulted v{lt@d
+vaulting v{lt6N
+vaults v{lts
+vaunted v{nt@d
+vaupel v?pel
+vause v{s
+vaux v{ks
+vauxhall voksh{l
+vavra vavr@
+vavrek vovrck
+vawter v{tP
+vax vaks
+vaxes vaks@z
+vaxstation vakstAS~
+vayda vAd@
+vaz vaz
+vazquez vaskez
+ve vE
+ve vEE
+veach vEC
+veal vEl
+veale vEl
+veals vElz
+veasey vEz/
+veasley vEzl/
+veatch vEC
+veazey vEz/
+veazie vEz/
+veba vEb@
+vecchiarelli vck/orel/
+vecchio vek/]
+vecchione vek/On/
+vecci veC/
+vecellio vcCel/]
+vector vektP
+vectors vektPz
+vectra vektrP
+veda vAd@
+vedder vedP
+vedette v@det
+vedis vAdis
+vedula vedUl@
+vee vE
+veech vEC
+veeco vEk]
+veeder vEdP
+veegenan vEg~~
+veen vEn
+veenstra vEnstr@
+veep vEp
+veer vir
+veered vird
+veering vir6N
+veers virz
+vees vEz
+vega vAg@
+vegas vAg@s
+vegesna vcgesn@
+vegetable vejt@b@l
+vegetables vejt@b@lz
+vegetal vej@t@l
+vegetarian vej@t,r/~
+vegetarianism vej@t,r/~iz}
+vegetarians vej@t,r/~z
+vegetate vej@tAt
+vegetation vej@tAS~
+vegetative vej@tAt6v
+veggie vej/
+veggies vej/z
+vegh veg
+vegisnax v@gisnaks
+vehemence v@hEm~s
+vehemence vE}~s
+vehement v@hEm~t
+vehement vE}~t
+vehemently v@hEm~tl/
+vehemently vE}~tl/
+vehicle vE6k@l
+vehicle vEh6k@l
+vehicle's vEh6k@lz
+vehicles vE6k@lz
+vehicles vEh6k@lz
+vehicles' veh6k@lz
+vehicular v/hiky@lP
+veiga vAg@
+veigel vIg@l
+veil vAl
+veiled vAld
+veiling vAl6N
+veillette v@let
+veilleux v@lO
+veilleux vAl]
+veillon vAl~
+veils vAlz
+vein vAn
+veins vAnz
+veira vAr@
+veit vEt
+veitch vIC
+veith vET
+vela vel@
+velagrande vel@grondA
+velagrande's vel@grondAz
+velarde vcl)rd/
+velardi vcl)rd/
+velardo vAl)rd]
+velasco vclosk]
+velasquez vclaskcz
+velayati vclIot/
+velazco v@lask]
+velazquez vclaskcz
+velcro velkr]
+velda veld@
+veldhuizen veldh@z~
+veldman veldm~
+veley vel/
+velez vclez
+velie vel/
+velika vel6k@
+veliotis vcl/Ot@s
+veliz veliz
+vella vel@
+vellucci vclUC/
+velma velm@
+velo vel]
+velobind vel@bind
+velobind vel]bInd
+velociraptor v@l{sPaptP
+velocities v@los@t/z
+velocity v@los@t/
+veloso velOs]
+velotta vclOt@
+veloz vAl]z
+velsicol vels6kol
+velte velt
+velten velt~
+veltman veltm~
+veltre veltP
+veltri veltr/
+velveeta vclvEt@
+velvet velv@t
+velvety velv@t/
+vemich vem6C
+vempala vempol@
+vena vEn@
+venable ven@b@l
+venables ven@b@lz
+venal vEn@l
+venality v~al@t/
+venalum ven@l}
+venango vcnaNg]
+venard venPd
+vencill vensil
+vencor venk{r
+vendee vendE
+vendela vcndel@
+vendetta vcndet@
+vendetti vcndet/
+vending vend6N
+venditti vcndEt/
+vendo vend]
+vendome vcndOm
+vendome vondOm
+vendor vendP
+vendor's vendPz
+vendors vendPz
+vendors' vendPz
+veneer v~ir
+venegas ven6g@z
+venema ven}@
+venerable venP@b@l
+venerate venPAt
+venerated venPAt@d
+venereal v~ir/@l
+venetian v~ES~
+veney ven/
+venezia vcnez/@
+veneziano vcncz/on]
+venezuela ven@zwAl@
+venezuela's ven@zwAl@z
+venezuelan ven@zwAl~
+venezuelans ven@zwAl~z
+vengeance venj~s
+vengeful venjf@l
+venice venis
+venice's ven@s@z
+venier vEn/P
+venison ven@s~
+venita vcnEt@
+venkatesh venkoteS
+venn ven
+vennard venPd
+venne ven
+venneman venm~
+venner venP
+vennick ven6k
+venning ven6N
+veno vAn]
+venom ven}
+venomous ven}@s
+venous vEn@s
+vensel vens@l
+venson vens~
+vent vent
+ventech ventek
+vented vent@d
+venter ventP
+venters ventPz
+venti vent/
+ventilate ven@lAt
+ventilate vent@lAt
+ventilated ven@lAt@d
+ventilated vent@lAt@d
+ventilating ven@lAt6N
+ventilating vent@lAt6N
+ventilation ven@lAS~
+ventilation vent@lAS~
+ventilator ven@lAtP
+ventilator vent@lAtP
+ventimiglia ventimigl/@
+venting vent6N
+ventner ventnP
+vento vent]
+ventola vcntOl@
+ventral ventr@l
+ventre ventP
+ventrella ventrel@
+ventres ventPz
+ventresca vcntresk@
+ventress ventrcs
+ventricular vcntrikyUlP
+ventritex ventr@teks
+vents vents
+ventura vcnCV@
+ventura vcntqr@
+venture venCP
+venture's venCPz
+ventured venCPd
+venturella vcntqrel@
+ventures venCPz
+ventures' venCPz
+venturesome venCPs}
+venturi vcntqr/
+venturian vcntqr/~
+venturing venCP6N
+venturini vcntqrEn/
+venturino vcntqrEn]
+venue venyU
+venues venUz
+venus vEn@s
+venuti vcnUt/
+venuto vcnUt]
+venzke venzk
+vera v,r@
+veracity vPas@t/
+veranda vPand@
+verandas vPand@z
+veras v,r@z
+verb vVb
+verba v,rb@
+verbal vVb@l
+verbalize vVb@lIz
+verbalizing vVb@lIz6N
+verbally vPbal/
+verbatim vPbAt}
+verbeck vVbck
+verbeek vVb/k
+verbeke vVb6k
+verbena vPbEn@
+verbiage vVb/6j
+verble vVb@l
+verboon vPbUn
+verboons vPbUnz
+verboten vPbOt~
+verbrugge vVbr@g
+verbs vVbz
+verburg vVbPg
+vercammen vVkam~
+vercher vVkP
+verda v,rd@
+verdant vVd~t
+verde vVd/
+verderame vVdP}
+verderber vVdPbP
+verderosa vPdPOs@
+verdes vVd/
+verdi v,rd/
+verdi's vVd/z
+verdict vVd6kt
+verdicts vVd6kts
+verdier vVd/P
+verdin vVdin
+verdon vVd~
+verdon vcrd{n
+verdone vcrdOnA
+verdugo vPdUg]
+verduin vcrdUin
+verdun vVd~
+verduzco vPdUzk]
+vere vir
+vereb v,rcb
+vereen vir/n
+vereinsbank vPInzbaNk
+verena vPAn@
+verene v,r/n
+veres vErz
+verex v,r@ks
+verga v,rg@
+vergara vPg)r@
+verge vVj
+verges vVj/z
+verges vVj@z
+verges's vVj/z@z
+verges's vVj@z@z
+vergesh vVgeS
+vergesh's vVgeS@z
+vergil vVj@l
+verging vVj6N
+vergresh vVgreS
+vergresh's vVgreS@z
+verhage vVh6j
+verhagen vVh@g~
+verhey vVh/
+verhoef vVh]f
+verhoeven vVh]v~
+verhoff vVh{f
+verhofstadt vPh{fstat
+verhulst vVh@lst
+veribanc v,r@baNk
+verifiable v,r@fI@b@l
+verification ver@f@kAS~
+verified v,r@fId
+verifies v,r@fIz
+verify v,r@fI
+verifying v,r@fI6N
+verina vPEn@
+verine vPEn/
+verisimilitude ver@s}il@tUd
+verit v,rit
+veritable v,r@t@b@l
+verities v,r@t/z
+verity v,r@t/
+verity's v,r@t/z
+verkuilen vVk@l~
+verla v,rl@
+verlag vVlag
+verleger vVl@gP
+verley vVl/
+verma v,rm@
+vermeer vVm6r
+vermette vPmet
+vermeulen vPm<l~
+vermilion vPmily~
+vermillion vPmily~
+vermilya vPmEly@
+vermilyea vPmEly@
+vermin vVmin
+vermont vPmont
+vermont's vPmonts
+vermonter vPmontP
+vermonters vPmontPz
+vermouth vPmUT
+vern vVn
+verna vVn@
+vernacular vPnaky@lP
+vernal vVn@l
+verne vVn
+verner vVnP
+vernes vVnz
+verneta vPnet@
+verney vVn/
+vernick vVn6k
+vernier vVn/P
+vernis vVnis
+vernita vPnEt@
+vernitron vVn@tron
+verno v,rn]
+vernon vVn~
+vernon's vVn~z
+vernonia vPnOn/@
+vernor vVnP
+vero v,r]
+veroa vPO@
+veron v,r~
+verona vPOn@
+veronda vcrond@
+veronica vPon6k@
+veronique veronEk
+veronis vcrOnis
+verrall v,r@l
+verrastro verastr]
+verrell vcrAl
+verret v,rAt
+verrett v,rct
+verrette vPet
+verri v,r/
+verrier v,r/P
+verrill vcrEl
+verrilli vPEl/
+verry v,r/
+versa vVs@
+versace vPsoC/
+versace vPsoCA
+versailles vcrsAlz
+versailles vcrsI
+versatile vPs@tIl
+versatile vVs@t@l
+versatility vVs@til@t/
+verse vVs
+versed vVst
+verser vVsP
+verses vVs@z
+versicherung vPsiCP@N
+versicherungs vPsiCP@Nz
+version vVZ~
+versions vVZ~z
+versluis vVslU@z
+versteeg vVst/g
+verstraete vVstrct
+versus vVs@s
+versus vVs@z
+vert vVt
+vertebra vVt@br@
+vertebrae vVt@brA
+vertebral vVt@br@l
+vertebrate vVt@brAt
+vertebrates vVt@brAts
+vertel vVtel
+vertel's vVtelz
+vertex vVteks
+vertical vVt6k@l
+vertically vVt6kl/
+verticom vVt6kom
+vertigo vVt6gO
+vertol vVtol
+vertrees vPtrEz
+vertucci vPtUC/
+vertz vVts
+verve vVv
+verville vVvil
+verwey vVw/
+verwoerd vPw{rd
+very v,r/
+vescinoid ves~<d
+vescio ves/]
+vesco vesk]
+vesel ves@l
+veselka vAsAlk@
+vesely vEzl/
+vesey ves/
+vesmen vesm~
+vespa vAsp@
+vesper vespP
+vespera vAsp,r@
+vess ves
+vessel ves@l
+vessel's ves@lz
+vessell ves@l
+vessels ves@lz
+vessels's ves@lz@z
+vesser vesP
+vessey ves/
+vest vest
+vesta vest@
+vestal vest@l
+vestar vestP
+vested vest@d
+vester vestP
+vestibule vest@byUl
+vestige vest6j
+vestiges vest6j@z
+vestigial v@stij/@l
+vesting vest6N
+vestron vestr~
+vestron's vestr~z
+vests vests
+vesuvius v@sUv/@s
+vet vet
+veta vet@
+vetco vetk]
+veteran vetP~
+veteran vetr~
+veteran's vetP~z
+veterans vetP~z
+veterans vetr~z
+veterans' vetP~z
+veterans' vetr~z
+vetere vetP
+veterinarian vetP~,r/~
+veterinarian vetr~,r/~
+veterinarians vetP~,r/~z
+veterinarians vetr~,r/~z
+veterinary vetr~er/
+veteto vctet]
+veto vEtO
+veto vEt]
+vetoed vEt]d
+vetoes vEt]z
+vetoing vEt]6N
+vetos vEt]z
+vetrano vctron]
+vets vets
+vetsch veC
+vette vet
+vetted vet@d
+vetter vetP
+vetting vet6N
+veuve vyUv
+vevay vevA
+veverka vAv,rk@
+vevey vev/
+vevila vAvEl@
+vex veks
+vexatious vcksAS@s
+vexed vekst
+vexing veks6N
+vey vA
+veyne vAn
+vezina vczEn@
+vi vE
+vi vEI
+vi vI
+via vE@
+via vI@
+viability vI@bil@t/
+viable vI@b@l
+viacom vI@kom
+viacom's vI@komz
+viaduct vI@d@kt
+viaducts vI@d@kts
+viag vIag
+viag's vIagz
+viagene vI@jEn
+vial vI@l
+viall vI@l
+vialpando v/olpond]
+vials vI@lz
+vian vE~
+viana v/an@
+viani v/on/
+viano v/on]
+viar vIP
+viars vIPz
+viatical vIat6k@l
+viator vIAtP
+viau v/O
+vibbert vibPt
+vibe vIb
+vibes vIbz
+vibhu vEbU
+vibrancy vIbr~s/
+vibrant vIbr~t
+vibrate vIbrAt
+vibrates vIbrAts
+vibrating vIbrAt6N
+vibration vIbrAS~
+vibrations vIbrAS~z
+vibrato v/brot]
+vibrator vIbrAtP
+vic vik
+vic's viks
+vicar vikP
+vicari v/k)r/
+vicario v/k)r/]
+vicarious vIk,r/@s
+vicariously vIk,r/@sl/
+vicars vikPz
+vicary vikP/
+vice vIs
+vice-president vIsprez@d~t
+vice-presidential vIsprez@denC@l
+vice-presidential vIsprez@denS@l
+vice-presidents vIsprez@d~ts
+vicencio visens/]
+vicente v/Cent/
+vicenzi visenz/
+viceroy vIsr<
+vices vIs@z
+vichy vES/
+vicinity v@sin@t/
+vicino v/CEn]
+vicious viS@s
+viciously viS@sl/
+viciousness viS@sn@s
+vicissitude visis@tUd
+vicissitudes visis@tUdz
+vick vik
+vicker vikP
+vickerman vikPm~
+vickers vikPz
+vickery vikV/
+vickery viskV/
+vickey vik/
+vicki vik/
+vickie vik/
+vicknair viknP
+vickrey vikr/
+vickroy vikr<
+vicks viks
+vicksburg viksbPg
+vicky vik/
+vicky's vik/z
+vicomte v6komt
+vicomte v6komt/
+vicon vik~
+vicon's vik~z
+vicorp vIk{rp
+victim vikt}
+victim's vikt}z
+victimhood vikt}hqd
+victimization vikt}@zAS~
+victimize vikt}Iz
+victimized vikt}Izd
+victimizing vikt}Iz6N
+victimless vikt}l@s
+victims vikt}z
+victims' viktimz
+victoire v6ktw)r
+victor viktP
+victor's viktPz
+victoria v6kt{r/@
+victoria's v6kt{r/@z
+victorian v6kt{r/~
+victorians v6kt{r/~z
+victorias v6kt{r/@z
+victories viktP/z
+victories viktr/z
+victorine v/kt{rEn/
+victorino v/kt{rEn]
+victorious v6kt{r/@s
+victors viktPz
+victory viktP/
+victory viktr/
+vicuna v6kyUn@
+vida vId@
+vidal vIdal
+vidales v/dolcs
+vidalia v@dAly@
+vidalia vIdAly@
+vidaurri v@d{r/
+vide vId
+video vid/]
+video's vid/]z
+videocassette vid/]kaset
+videocassettes vid/]kasets
+videoconference vEd/]konfr~s
+videoconferencing vEd/]konfr~s6N
+videodisk vid/]disk
+videodisks vid/]disks
+videogame vid/]gAm
+videographer v@d/{gr@fP
+videophone vid/]fOn
+videos vid/]z
+videotape vid/]tAp
+videotaped vid/]tApt
+videotapes vid/]tAps
+videotaping vid/]tAp6N
+videotex vid/]teks
+videotext vid/]tekst
+videotron vid/]tron
+vidigo vid/gO
+vidmar vidmP
+vidonia v/dOn/@
+vidor vEd{r
+vidor vid{r
+vidrine v/drEn
+vie vI
+vieau v/O
+viebrock vEbr@k
+vied vId
+viedma vEdm@
+viegas vEg@z
+vieira v/,r@
+viejo v/ej]
+viel vEl
+viele vEl
+vielma vElm@
+vien vEn
+vienna v/en@
+vienna's v/en@z
+vienneau v~O
+viennese v/enEs
+vienot vEnot
+viens vEnz
+viera vEr@
+viereck vir6k
+vierling virl6N
+vierra vir@
+viers virz
+viertel virtcl
+viertel's virtclz
+viertels virtclz
+vies vIz
+viet v/et
+vietcong v/etk{N
+vietcong vyetk{N
+vieth vI@T
+vietnam v/etnom
+vietnam's v/etnomz
+vietnamese v/ctnomEs
+vietor vEtP
+viets vEts
+vietti v/et/
+view vyU
+viewed vyUd
+viewer vyUP
+viewer's vyUPz
+viewers vyUPz
+viewers' vyUPz
+viewership vyUPSip
+viewfinder vyUfIndP
+viewing vyU6N
+viewpoint vyUp<nt
+viewpoints vyUp<nts
+views vyUz
+vieyra v/,r@
+vig vig
+vigdor vigdP
+vigeant vij~t
+vigeland vIgl~d
+vigeland's vIgl~dz
+vigen vig~
+viger vIgP
+viger vigP
+viggiano v6j/on]
+vigil vij@l
+vigilance vij@l~s
+vigilant vij@l~t
+vigilante vij@lant/
+vigilantes vij@lant/z
+vigilantism vij@lantiz}
+vigilia v/jEl/@
+vigils vij@lz
+viglione v6gl/On/
+vigliotti v6gl/{t/
+viglund vigl~d
+viglund's vigl~dz
+vigna vign@
+vigneau v6gnO
+vigneault v6gnO
+vignette v/nyet
+vignette vinyet
+vignettes vinyets
+vignola v/gnOl@
+vigo vEg]
+vigor vigP
+vigorito v/g{rEt]
+vigorous vigP@s
+vigorously vigP@sl/
+vigue vEg
+viguerie vEg,r/
+viguerie vigP/
+vigus vIg@s
+vik vik
+viking vIk6N
+viking's vIk6Nz
+vikings vIk6Nz
+viktor viktP
+vila vEl@
+vilardo v/l)rd]
+vilas vEloz
+vile vIl
+viles vIlz
+vilhauer vilh?P
+vilification vil@f@kAS~
+vilified vil@fId
+vilify vil@fI
+villa vil@
+villa's vil@z
+villafana v/lofan@
+villafane v/lofonA
+villafranca vil@fraNk@
+villafuerte v/lofw,rtA
+village vil6j
+village's vil6j@z
+villager vil6jP
+villagers vil6jPz
+villages vil6j@z
+villagomez v/logOmcz
+villagran v/logron
+villagrana v/logran@
+villain vil~
+villainous vil~@s
+villains vil~z
+villalba v/lolb@
+villalobos v/lolOb]z
+villalon v/lol{n
+villalovos v/lolOv]z
+villalpando v/lolpond]
+villalva v/lolv@
+villamil v/lomEl
+villani v/lon/
+villano v/lon]
+villanova vil~Ov@
+villanovan vil~Ov~
+villanueva v/lonwev@
+villar vilP
+villard vilPd
+villareal vilP/ol
+villari v/l)r/
+villarreal v/lorEl
+villars vilPz
+villas vil@z
+villasana v/losan@
+villasenor v/losA~{r
+villaverde v/lov,rd/
+villavicencio vil@visens/]
+ville vil
+villegas vil6g@z
+villela vil@l@
+villella v/lel@
+villeneuve vil~Uv
+villers vilPz
+villette v@let
+villi vil/
+villiers vilyPz
+villines vilInz
+villwock vilw@k
+vilma vilm@
+vilnius viln/@s
+viloria v/l{r/@
+vim vim
+vin vin
+vina vEn@
+vinal vIn@l
+vinca viNk@
+vince vins
+vince's vins@s
+vincelette vins@lct
+vincennes vinsen@s
+vincent vins~t
+vincent's vins~ts
+vincente vinCent/
+vincenti v/nCent/
+vincentia v/nCenS@
+vincenzo vinsenz]
+vinci vinC/
+vinci vins/
+vinci's vinC/z
+vinci's vins/z
+vinciguerra v/nC/g,r@
+vindicate vind@kAt
+vindicated vind@kAt@d
+vindicates vind6kAts
+vindication vind@kAS~
+vindicator vind@kAtP
+vindictive vindikt6v
+vindictiveness vindikt6vn@s
+vine vIn
+vinegar vin@gP
+vinegars vin6gPz
+vineland vInl~d
+viner vInP
+vines vInz
+vinet vinct
+viney vIn/
+vineyard vinyPd
+vineyards vinyPdz
+vingmed viNmcd
+vingo viNg]
+vini vEn/
+vinicio vinis/]
+vinick vin6k
+vinick's vin6ks
+vinik vin6k
+vining vIn6N
+vining's vIn6Nz
+vinita v/nEt@
+vinje vinj
+vink viNk
+vinnick vin6k
+vinnick's vin6ks
+vinnie vin/
+vinny vin/
+vinocur vin@kP
+vinsant vEns~t
+vinso vins]
+vinson vins~
+vint vint
+vintage vint6j
+vintages vint6j@z
+vintner vintnP
+vintners vintnPz
+vinton vint~
+vinyard vinyPd
+vinyl vIn@l
+vinzant vinz~t
+viola v/Ol@
+viola vIOl@
+violante v/]lont/
+violas v/Ol@z
+violate vI@lAt
+violated vI@lAt@d
+violates vI@lAts
+violating vI@lAt6N
+violation vI@lAS~
+violations vI@lAS~z
+violator vI@lAtP
+violators vI@lAtPz
+viole vIOl
+violence vI@l~s
+violent vI@l~t
+violent vIl~t
+violently vI@l~tl/
+violently vIl~tl/
+violet vI@l@t
+violet vIl@t
+violeta vE]let@
+violeta vI]let@
+violets vI@l@ts
+violets vIl@ts
+violett vE]let
+violett vI@l@t
+violett vIl@t
+violetta v/]let@
+violette vE]let
+violin vI@lin
+violinist vI@lin@st
+violinists vI@lin@s
+violinists vI@lin@ss
+violinists vI@lin@sts
+violins vI@linz
+violist vEOl@st
+viper vIpP
+vipers vIpPz
+vipin vipin
+vipond vip~d
+vipont vipont
+vipont's viponts
+vipperman vipPm~
+vipul vEpUl
+virag v{r@g
+virago vir@g]
+viral vIr@l
+viramontes v6romOntcs
+viratek vir@tek
+viray vIrA
+virazole vIr@zOl
+virazole vir@zOl
+virco vVk]
+virden vVd~
+viren vir~
+vires vIrz
+virga vVg@
+virge vVj
+virgen vVj~
+virgie vVg/
+virgil vVj@l
+virgilio vPjil/]
+virgin vVj~
+virgin's vVj~z
+virginal vVj~@l
+virginia vPjiny@
+virginia's vPjiny@z
+virginian vPjiny~
+virginians vPjiny~z
+virginity vPjin@t/
+virgins vVj~z
+virgo vVg]
+virgy vVj/
+viridis v{r@dis
+virile vir@l
+virility vPil@t/
+virina v6rEn@
+virkler vVk@lP
+virna vVn@
+virnig vVn6g
+virological vIr@loj6k@l
+virologist v6rol@j@st
+virologists v6rol@j@s
+virologists v6rol@j@ss
+virologists v6rol@j@sts
+virology v6rol@j/
+viromune vIr]myUn
+virts vVts
+virtual vVCU@l
+virtually vVCU@l/
+virtually vVCUl/
+virtue vVCU
+virtues vVCUz
+virtuosity vPCUos@t/
+virtuoso vPCUOs]
+virtuous vVCU@s
+virulence vir@l~s
+virulent vir@l~t
+virulently vir@l~tl/
+virus vIr@s
+virus's vIr@s@z
+viruses vIr@s@z
+virzi virz/
+vis vis
+visa vEz@
+visa's vEz@z
+visage viz@j
+visas vEz@z
+viscardi v/sk)rd/
+visceral visP@l
+viscerally visP@l/
+visclosky viskl{sk/
+visco vEsk]
+viscomi v/skOm/
+visconti v/skOnt/
+viscosity viskos@t/
+viscous visk@s
+viscusi v/skUs/
+viscuso v/skUs]
+vise vIs
+visegrad vis@grad
+vishay viSA
+visibility viz@bil@t/
+visible viz@b@l
+visibly viz@bl/
+visicalc viz6kalk
+visigoth viz@goT
+visigoths viz@goTs
+vision viZ~
+vision's viZ~z
+visionaries viZ~cr/z
+visionary viZ~er/
+visions viZ~z
+visit viz@t
+visitation viz@tAS~
+visitations viz@tAS~z
+visited viz@t@d
+visiting viz@t6N
+visitor viz@tP
+visitor's viz@tPz
+visitors viz@tPz
+visitors' vis@tPz
+visits viz@ts
+visnic visn@C
+visor vIzP
+visor vizP
+visors vIzPz
+visors vizPz
+visscher viSP
+visser visP
+vista vist@
+vista's vist@z
+vistas vist@z
+viston vist~
+visual viZ@w@l
+visualization viZw@l@zAS~
+visualize viZw@lIz
+visualized viZw@lIzd
+visualizing viZw@lIz6N
+visually viZw@l/
+visuals viZw@lz
+visx viseks
+vita vIt@
+vitae vIt@
+vitagliano v/togl/on]
+vital vIt@l
+vitale v@tal/
+vitale vItal
+vitali v/tol/
+vitalink vIt@liNk
+vitality vItal@t/
+vitally vIt@l/
+vitaly v/tol/
+vitaly v@tal/
+vitamin vIt}~
+vitamins vIt}~z
+vitanza v@tanz@
+vitarine vitPEn
+vitarine's vitPEnz
+vitek vitck
+vitelli v@tel/
+vitello v@tel]
+vitez vItcz
+vitez vitcz
+viti vEt/
+vitia vES@
+vitiello v/t/el]
+vitiligo v/til6g]
+vitner vitnP
+vito vEt]
+vitolo v/tOl]
+vitramon vitr}on
+vitrano v/tron]
+vitreous vitr/@s
+vitric vitr6k
+vitriol vitr/@l
+vitriolic vitr/ol6k
+vitro vEtr]
+vitro vitr]
+vitronics vItron6ks
+vitruvius v@trUv/@s
+vitry vitr/
+vitt vit
+vittetoe vit@t]
+vittitow vit@t]
+vittle vit@l
+vittles vit@lz
+vittoria vit{r/@
+vittorio v/t{r/]
+vitucci v/tUC/
+vitulli v/tUl/
+vitullo v/tUl]
+vituperative v@tUpP@t6v
+vituperative vItUpP@t6v
+viv viv
+viva vEv@
+vivacious v@vAS@s
+vivaldi v6vold/
+vivas vEv@z
+vive vEv
+vive vIv
+viveiros v/vir]z
+vivendi v6vend/
+viverette vivPet
+viveros v/v,r]z
+vives vIvz
+vivian viv/~
+viviana v6v/an@
+viviani vEv/on/
+viviano vEv/on]
+vivid viv@d
+vividly viv@dl/
+vividness viv@dn@s
+vivie viv/
+vivien viv/~
+vivienne viv/~
+vivier vIv/P
+viviparous vIvipP@s
+vivisepulture viv/sep@lCP
+vivo vEv]
+vivona v/vOn@
+vivra vEvr@
+vivyan v/vyon
+vixen viksin
+viyella viyel@
+vizcaino v/zkoEn]
+vizcarra v/zk)r@
+vizcaya vizkI@
+vizzini v/tsEn/
+vlach vlaC
+vlachos vlAk]s
+vlad vlad
+vlad's vladz
+vladeck vladck
+vladimir vlad}6r
+vladislav vlad@slov
+vladivostok vlad6vOstok
+vladivostok vlad6v{stok
+vlahakis vluh{kis
+vlahos vloh]s
+vlasak vlos@k
+vlasic vlaz6k
+vlcek vles6k
+vliet vlEt
+vlok vlok
+vnesheconombank v~eS@kon}baNk
+vo vEO
+vo vO
+vobis vOb@s
+vocabulary v]kaby@ler/
+vocal vOk@l
+vocalist vOk@l@st
+vocally vOk@l/
+vocals vOk@lz
+vocaltec vOk@ltek
+vocation v]kAS~
+vocational v]kAS~@l
+vocations v]kAS~z
+vociferous v]sifP@s
+vociferously v@sifP@sl/
+vocke vok
+vocs voks
+vodafone vOd@fOn
+vodavi v]dov/
+vodicka vod6k@
+vodka vodk@
+vodkas vodk@z
+voegele vOg@l
+voegeli vOg@l/
+voelkel vOlk@l
+voelker vOlkP
+voell vOl
+voeller vOlP
+voeltz vOlts
+voelz vOlz
+voest vOst
+vogan vOg~
+voge vOj
+vogel vOg@l
+vogeler vOg@lP
+vogelgesang vog@lg@s@N
+vogelpohl vog@lp]l
+vogels vOg@lz
+vogelsang vog@ls@N
+vogelsong vog@ls{N
+vogelstein vOg@lstEn
+vogelstein vOg@lstIn
+voges vOj@z
+voght vot
+vogl vog@l
+vogler vOglP
+vogosca v@gOsk@
+vogosca v]gOsk@
+vogt vOt
+vogtle vogt@l
+vogue vOg
+vohs vos
+voice v<s
+voice's v<s@z
+voiced v<st
+voiceless v<sl@s
+voicemail v<smAl
+voiceover v<sOvP
+voices v<s@z
+voicework v<swVk
+voiceworks v<swVks
+voicing v<s6N
+void v<d
+voided v<d@d
+voiding v<d6N
+voids v<dz
+voight v<t
+voigt v<t
+voigts v<ts
+voila vwolo
+voiles v<lz
+voinovich v<n@v6C
+voir vw)r
+voisey v<sA
+voisey vwosA
+voisin v<zan
+voisine v<zEn
+voit v<t
+vojta v<t@
+vojta v<tu
+vokes vOks
+voland vol~d
+volante v]lontA
+volatile vol@t@l
+volatility vol@til@t/
+volberding vOlbPd6N
+volcanic volkan6k
+volcanically volkan6kl/
+volcano volkAn]
+volcano's volkAn]z
+volcanoes volkAn]z
+volcanos volkAn]z
+volcker vOlkP
+volcker's vOlkPz
+vold vOld
+volden vOld~
+volentine v]lcntEn/
+voles vOlz
+voleta v]let@
+volga volg@
+volgograd vOlg]grad
+volin vOlin
+volio vOl/]
+volition v]liS~
+volk vOlk
+volker vOlkP
+volkers vOlkPz
+volkert vOlkPt
+volkman vOlkm~
+volkmann vOlkm~
+volkmar vOlkmP
+volkmer vOlkmP
+volkogonov v]lk{g~{v
+volksbank vOlksbaNk
+volksfuersorge v]lksfyUrs{rj
+volkswagen vOlkswag~
+volkswagen's vOlkswag~z
+volkswagens vOlkswag~z
+voll vol
+volland vol~d
+vollbrecht volbr6kt
+volle vol
+vollenweider vol~wIdP
+voller volP
+volley vol/
+volleyball vol/b{l
+volleys vol/z
+vollman volm~
+vollmar volmP
+vollmer volmP
+vollrath volr@T
+volmer vOlmP
+volner vOlnP
+volney vOln/
+volokh volok
+volpe vOlp
+volpi vOlp/
+volpicella vOlp@sel@
+volt vOlt
+volta vOlt@
+voltage vOlt@j
+voltage's vOlt6j@z
+voltages vOlt@j@z
+voltaire v]lt,r
+voltaren vOltP~
+volts vOlts
+voltz vOlts
+voluble voly@b@l
+volume volyUm
+volume's voly}z
+volumes volyUmz
+voluminous v@lUm~@s
+voluntarily vol~t,r@l/
+voluntarism vol~tPiz}
+voluntary vol~tcr/
+volunteer vol~tir
+volunteered vol~tird
+volunteering v{l~tir6N
+volunteerism v{l~tiriz}
+volunteers vol~tirz
+voluptuous v@lupC@w@s
+volvo vOlv]
+volvo's vOlv]z
+volvos v{lv]z
+volvovitz vOlv@vits
+volvox volvoks
+volz vOlz
+vomit vom@t
+vomiting vom@t6N
+von v{n
+von-braun vonbr{n
+vona vOn@
+vonada v]nod@
+vonallmen von@lmcn
+vonarx v~)rks
+vonbargen vonb)rg~
+vonbehren vonbir~
+vonbergen vonbVg~
+voncannon vonkan~
+vonder vondP
+vonderhaar vondPhor
+vonderheide vondPhId
+vondra vondr@
+vondracek vondr@s6k
+vondrak vondr@k
+vondrasek v~drosck
+vonfeldt vonfclt
+vong v{N
+vongunten voNg~t~
+vonk voNk
+vonnegut von@g@t
+vonnie von/
+vonny von/
+vonruden vonrUd~
+vons vonz
+vons's vonz@z
+vonseggern vons6gPn
+vonstein vonst/n
+vonstein vonstIn
+vontobel vontOb@l
+voodoo vUdU
+voorhees vqrh/z
+voorheis vqrhIz
+voorhies vqrh/z
+voorhis vqrhis
+vora v{r@
+voracious v{rAS@s
+voracity vPas@t/
+voracity v{ras@t/
+vorce v{rs
+vore v{r
+vorhauer v{rh?r
+vorhees v{rh/z
+vorhies v{rh/z
+voris v{ris
+vornado v{rnAd]
+vornado v{rnod]
+vorndran v{rndr~
+vorontsov v{rontsov
+voros v{r]z
+vorpahl v{rpol
+vortec v{rtek
+vortex v{rtcks
+vorwald v{rw{ld
+vorwerk v{rwPk
+vos vos
+vosberg vosbPg
+vosburg vosbPg
+vosburgh vosbPg
+vose vOz
+voshell voS@l
+vosler vos@lP
+voss v{s
+vossen v{s~
+vossler vos@lP
+votava v]tov@
+votaw vOt{
+vote vOt
+vote's vOts
+voted vOt@d
+voter vOtP
+voter's vOtPz
+voters vOtPz
+voters' vOtPz
+votes vOts
+voth voT
+voting vOt6N
+votrax votraks
+votruba v@trUb@
+vouch v?C
+vouched v?Ct
+voucher v?CP
+vouchers v?CPz
+vouching v?C6N
+vought v{t
+voute vUt
+vow v?
+vowed v?d
+vowel v?@l
+vowell vowcl
+vowels v?@lz
+vowels v?lz
+vowing v?6N
+vowles v?@lz
+vows v?z
+vox voks
+voyage v<@j
+voyaged v<@jd
+voyager v<@jP
+voyager's v<6jPz
+voyagers v<6jPz
+voyages v<@j@z
+voyer v<P
+voyeur v<yUr
+voyeurism v<yUriz}
+voyeuristic v<y@rist6k
+voyles v<lz
+voynavich v<n@v6C
+voytek v<t6k
+voytko v<tk]
+vrabel vrab@l
+vradenburg vrAd~bPg
+vrain vrAn
+vrana vran@
+vranesevic vron@sev6C
+vranitzky vr~itskE
+vranos vron]s
+vrba vVbo
+vrdolyak vPdOl/ak
+vredenburg vrEd~bPg
+vreeland vrEl~d
+vremya vrem/@
+vries vrEz
+vroman vrOm~
+vroom vrUm
+vrooman vrUm~
+vs vEes
+vs vVs@z
+vsel vEsel
+vu vEyU
+vu vU
+vue vyU
+vuitton vUt~
+vukelich v@kelih
+vukovar vUk@vor
+vukovich vUk@v6C
+vukovich vyUk@v6C
+vulcan vulk~
+vulcan's vulk~z
+vulcans vulk~z
+vulgamore vulg}{r
+vulgar vulgP
+vulgarity v@lg,r@t/
+vulgarization vulgP@zAS~
+vullo vUl]
+vulnerabilities vulnP@bil@t/z
+vulnerability vulnP@bil@t/
+vulnerable vulnP@b@l
+vultaggio vUltoj/]
+vulture vulCP
+vultures vulCPz
+vuncannon vunk~on
+vuncannon v~kan~
+vuolo vUOl]
+vuong vU{N
+vy vI
+vyacheslav vyoC@slov
+vyas vI@s
+vyas vyos
+vying vI6N
+w dub@lyU
+w's dub@lyUz
+w. dub@lyU
+w.'s dub@lyUz
+w.s dub@lyUz
+wa wo
+waack wok
+waag wog
+waage wo6j
+waah wo
+waal wol
+waara w)r@
+waas woz
+wabash w{baS
+wabash's w{baS@z
+wace wAs
+wach w{C
+wacha woC@
+wachholz w{kh]lz
+wachner waknP
+wacho woC]
+wachob w{k@b
+wachovia woCOv/@
+wachowiak v@h?/ak
+wachowski v@h{fsk/
+wachs w{ks
+wachsman w{ksm~
+wachsmuth w{ksmqT
+wachtel w{C@l
+wachtell woktel
+wachter w{ktP
+wachtler waktlP
+wack wak
+wackenhut wok~hut
+wacker wakP
+wackerle wakP@l
+wacko wak]
+wackos wak]z
+wacks waks
+wacksman waksm~
+wacksman's waksm~z
+wacky wak/
+waco wAk]
+wactlar woktlP
+wad wod
+wada wod@
+wadas wod@z
+wadded wod@d
+waddell wodel
+waddie wod/
+waddill w{dil
+waddington wod6Nt~
+waddle wod@l
+waddy wod/
+wade wAd
+wade's wAdz
+waded wAd@d
+wadel wAd@l
+wader wAdP
+waders wAdPz
+wades wAdz
+wadford w{dfPd
+wadhams w{d}z
+wading wAd6N
+wadkins w{dkinz
+wadle w{d@l
+wadleigh w{dl/
+wadley wodl/
+wadlington wodl6Nt~
+wadlow wodlO
+wadman w{dm~
+wads wodz
+wadsworth wodzwPT
+wadsworth's wodzwPTs
+waechter wektP
+waeltermann valtPm~
+waeltermann woltPm~
+waertsilae w,rts@lA
+wafer wAfP
+wafers wAfPz
+waffenschmidt wof~Smit
+waffle wof@l
+waffled wof@ld
+waffles wof@lz
+waffling wofl6N
+wafford wofPd
+waft woft
+wafted woft@d
+wafting woft6N
+wag wag
+wag's wagz
+waga dub@lyUAjEA
+waga dub@yUAjEA
+waga wog@
+wagaman wagum~
+wagar wagP
+wage wAj
+waged wAjd
+wageman wAjm~
+wagenaar wag~or
+wagener wag~P
+wagenknecht wag~6kt
+wager wAjP
+wagered wAjPd
+wagering wAjP6N
+wagers wAjPz
+wages wAj@z
+wagg wag
+wagged wagd
+waggener wag~P
+wagging wag6N
+waggling wag@l6N
+waggling wagl6N
+waggoner wag~P
+waggy wag/
+waging wAj6N
+wagle wag@l
+wagler waglP
+wagley wagl/
+wagman wagm~
+wagner vognP
+wagner wagnP
+wagner's vagnPz
+wagner's wagnPz
+wagnerian vogn,r/~
+wagnerian wagn,r/~
+wagnon wagn~
+wagon wag~
+wagoneer wag~ir
+wagoneers wag~irz
+wagoner wag~P
+wagons wag~z
+wags wagz
+wagstaff wagstaf
+wagster wagstP
+waguespack wag@spak
+wagy wag/
+wah wo
+wah's woz
+wah-pei wopA
+wahid wohEd
+wahl wol
+wahlberg wolbPg
+wahle w{l
+wahlen wol~
+wahler wolP
+wahlers wolPz
+wahlert wolPt
+wahlgren wolgr~
+wahlquist wolkwist
+wahlstrom wolstr}
+wahoo w@hU
+wahoo wohU
+wai wI
+waibel wAb@l
+waibel wIb@l
+waid wAd
+waide wAd
+waidelich wIdl6k
+waif wAf
+waifer wAfP
+waigel wIg@l
+waikiki wIk/kE
+wail wAl
+wailed wAld
+wailes wAlz
+wailing wAl6N
+wails wAlz
+wain wAn
+wainer wAnP
+wainio wAn/]
+wainman wAnm~
+wainoco wAnOk]
+wainoco's wAnOk]z
+wainright wAnrIt
+wainscott wAnsk@t
+wainwright wAnrIt
+wais wAz
+waisanen wIs~~
+waisner wAznP
+waist wAst
+waistline wAstlIn
+waists wAsts
+wait wAt
+waite wAt
+waite's wAts
+waited wAt@d
+waiter wAtP
+waiter's wAtPz
+waiters wAtPz
+waites wAts
+waitin' wAt~
+waiting wAt6N
+waitkus wAtk@s
+waitman wItm~
+waitress wAtr@s
+waitresses wAtr@s@z
+waits wAts
+waitt wAt
+waitzkin wAtskin
+waive wAv
+waived wAvd
+waiver wAvP
+waivers wAvPz
+waives wAvz
+waiving wAv6N
+wajda vId@
+wakabayashi wokoboyoS/
+wake wAk
+wakefield wAkfEld
+wakeham wak}
+wakeland wAkl~d
+wakeley wakl/
+wakely wAkl/
+wakeman wAkm~
+waken wAk~
+wakes wAks
+wakeup wAkup
+wakid wAk@d
+waking wAk6N
+wakley wakl/
+wako wak]
+wal w{l
+wala w{l@
+wala's w{l@z
+walas w{l@z
+walberg w{lbPg
+walbert w{lbPt
+walborn w{lbPn
+walbridge w{lbr6j
+walbro w{lbr]
+walburn w{lbPn
+walby w{lb/
+walch w{lC
+walcher w{lCP
+walck w{lk
+walcot w{lkot
+walcott w{lkot
+walczak volCak
+walczyk volC6k
+wald w{ld
+walda vold@
+waldbaum w{ldb?m
+walde w{ld
+waldeck w{ldck
+waldecker w{ldekP
+waldegard w{ld@gord
+waldemar vold}or
+walden w{ld~
+waldenbooks w{ld~bqks
+waldenbooks' w{ld~bqks
+walder w{ldP
+waldheim v{ldhIm
+waldheim w{ldhIm
+waldheim's v{ldhImz
+waldheim's w{ldhImz
+waldholtz w{ldhOlts
+waldholtz's w{ldhOlts@z
+waldholz w{ldhOlts
+waldhorn w{ldh{rn
+waldie w{ld/
+walding w{ld6N
+waldinger w{ld6NP
+waldman woldm~
+waldmann w{ldm~
+waldner w{ldnP
+waldo wold]
+waldoch w{ldok
+waldock w{ldok
+waldon w{ld~
+waldorf w{ld{rf
+waldow w{ld]
+waldren w{ldr~
+waldrep w{ldr@p
+waldridge w{ldr6j
+waldrip w{ldr@p
+waldron w{ldr~
+waldroop w{ldrUp
+waldrop w{ldrop
+waldroup w{ldrUp
+waldrum w{ldr}
+waldrup w{ldr@p
+waldschmidt w{ldSmit
+waldvogel w{ldvOg@l
+wale wAl
+waleed wolEd
+walek volck
+walen wAl~
+walenta v@lent@
+walenta w@lent@
+wales wAlz
+walesa v@les@
+walesa w@les@
+walesa's v@les@z
+walesa's w@les@z
+waleson wAls~
+walford w{lfPd
+walfred w{lfrcd
+walgreen w{lgrEn
+walgren w{lgr~
+walicki w@lik/
+walid wolEd
+waligora w{l6g{r@
+walinsky w@linsk/
+walizer w{lIzP
+walk wok
+walk w{k
+walk-on w{kon
+walk-ons w{konz
+walke w{k
+walked w{kt
+walken w{k~
+walkenhorst w{k~h{rst
+walker w{kP
+walker's w{kPz
+walkers w{kPz
+walkie w{k/
+walkin' w{k~
+walking w{k6N
+walkington w{k6Nt~
+walkinshaw w{k~S{
+walkley w{kl/
+walkman w{kman
+walkman w{km~
+walkner w{knP
+walko w{k]
+walkout w{k?t
+walkouts w{k?ts
+walkowiak w{k?/ak
+walkowski w{k{fsk/
+walks w{ks
+walkup w{kup
+walkure w{kyP
+walkway w{kwA
+walkways w{kwAz
+wall w{l
+wall's w{lz
+wall-tex w{lteks
+walla w{l@
+wallace w{l@s
+wallace's w{l@s@z
+wallach w{l@k
+wallack w{l@k
+wallander w{l~dP
+wallar w{lP
+wallboard w{lb{rd
+walle w{l
+walled w{ld
+wallen w{l~
+wallenberg w{l~bPg
+wallenberg's w{l~bPgz
+wallenstein w{l~stEn
+wallenstein w{l~stIn
+waller w{lP
+wallerstein w{lPstEn
+wallerstein w{lPstIn
+walles w{lz
+wallet w{l@t
+wallets w{l@ts
+walley w{l/
+walleye w{lI
+wallflower w{lfl?P
+wallgren w{lgr~
+wallich w{l6k
+wallich's w{l6ks
+wallick w{l6k
+wallie w{l/
+wallin w{lin
+walling w{l6N
+wallingford w{l6NfPd
+wallington w{l6Nt~
+wallis w{lis
+wallison w{l@s~
+wallman w{lm~
+wallner w{lnP
+wallo wol]
+walloch w{l@k
+wallop wol@p
+walloping w{l@p6N
+wallops wol@ps
+wallow wol]
+wallowed wol]d
+wallowing wol]6N
+wallpaper w{lpApP
+wallpapered w{lpApPd
+wallpapering w{lpApP6N
+wallpapers w{lpApPz
+walls w{lz
+wallsend w{lsend
+wallstreet w{lstrEt
+wallwork w{lwVk
+wally wAl/
+wally w{l/
+wally's w{l/z
+walmart w{lmort
+walmer w{lmP
+walmond w{lm~d
+walmsley w{lmsl/
+waln w{ln
+walnut w{lnut
+walnuts w{lnuts
+walp walp
+walp w{lp
+walpole w{lpOl
+walrath w{lr@T
+walraven w{lrAv~
+walrod w{lrod
+walrus w{lr@s
+walruses wolr@s@z
+walser w{lzP
+walsh w{lS
+walsh's w{lS@z
+walski volsk/
+walstad w{lstad
+walston w{lst~
+walstrom w{lstr}
+walsworth w{lswPT
+walt w{lt
+walter w{ltP
+walter's w{ltPz
+waltermire w{ltPmIr
+walters w{ltPz
+walters' w{ltPz
+walth w{lT
+walthall w{lT@l
+waltham w{lT}
+walther w{lTP
+walthers w{lTPz
+walthose w{lthOz
+walthour w{lt?r
+waltman w{ltm~
+waltner w{ltnP
+walton w{lt~
+walton's w{lt~z
+waltons w{lt~z
+waltrip w{ltrip
+walts w{lts
+waltz w{ls
+waltz w{lts
+waltzer w{lsP
+waltzer w{ltsP
+waltzes w{ls@z
+waltzes w{lts@z
+waltzing w{ls6N
+waltzing w{lts6N
+walworth w{lwPT
+walwyn w{lwin
+walz w{lz
+walzer w{lzP
+wambach w{mbok
+wambaugh w{mbo
+wamble womb@l
+wambold wombOld
+wamboldt womb]lt
+wambolt wombOlt
+wampler womplP
+wampole wompOl
+wampum womp}
+wamser womzP
+wamsley womzl/
+wan won
+wanamaker won}AkP
+wanat wAn@t
+wand wond
+wanda wond@
+wandel wond@l
+wandell wond@l
+wander wondP
+wandered wondPd
+wanderer wondPP
+wanderers wondPPz
+wandering wondP6N
+wanderings wondP6Nz
+wanderlust wondPlust
+wanders wondPz
+wandersee wondPsE
+wandie wond/
+wandis wondis
+wandler wondlP
+wandling wondl6N
+wandrey wondr/
+wands wondz
+wane wAn
+waned wAnd
+wanek wAn6k
+waner wAnP
+wanes wAnz
+wang waN
+wang's waNz
+wangen waN~
+wanger waNP
+wangerin w{NgPin
+wangle waNg@l
+wangled waNg@ld
+wangler waNglP
+waning wAn6N
+wank woNk
+wanke woNk
+wanko woNk]
+wanless wonl@s
+wann won
+wanna won@
+wannabe won@bE
+wannabee won@bE
+wannabees won@bEz
+wannabes won@bEz
+wannamaker won}AkP
+wannemacher won}okP
+wanner wonP
+wanninger won6NP
+wanniski w~isk/
+wanser w{nzP
+wansley w{nzl/
+want wont
+wanta won@
+wanta wont@
+wantage wont6j
+wantages wont6j@z
+wanted w{n@d
+wanted w{nt@d
+wanting won6N
+wanting wont6N
+wantland wontl~d
+wanton wont~
+wantonly wont~l/
+wants wonts
+wantz wonts
+wanzer wonzP
+waples w{p@lz
+wapner wopnP
+wapping wop6N
+war w{r
+war's w{rz
+warbington w{rb6Nt~
+warbler w{rblP
+warblers w{rblPz
+warbling w{rb@l6N
+warbling w{rbl6N
+warburg w{rbPg
+warburg's w{rbPgz
+warburton w{rbPt~
+warchol w{rk{l
+ward w{rd
+ward's w{rdz
+warda w{rd@
+wardair w{rder
+warde w{rd
+warded w{rd@d
+wardell w{rdcl
+warden w{rd~
+warden's w{rd~z
+wardens w{rd~z
+wardens' w{rd~z
+warder w{rdP
+warding w{rd6N
+wardlaw w{rdl{
+wardle w{rd@l
+wardley w{rdl/
+wardlow w{rdlO
+wardrip w{rdrip
+wardrobe w{rdrOb
+wardrobes w{rdrObz
+wardrop w{rdrop
+wards w{rdz
+wardwell w{rdwel
+ware w,r
+warehime w,rhIm
+warehouse w,rh?s
+warehoused w,rh?zd
+warehouses w,rh?z@z
+warehousing w,rh?z6N
+wareing w,r6N
+waren w,r~
+wares w,rz
+warf w{rf
+warfare w{rfer
+warfel w{rf@l
+warfield w{rf/ld
+warford w{rfPd
+warga w{rg@
+wargo w{rgO
+warhead w{rhed
+warheads w{rhedz
+warhol w{rh{l
+warhol's w{hr{lz
+warhurst w{rhPst
+warily w,r@l/
+wariness w,r/n@s
+waring w,r6N
+wark w{rk
+warkentin w{rkentin
+warkentin w{rk~tin
+warley w{rl/
+warlick w{rl6k
+warlike w{rlIk
+warling w{rl6N
+warloeck w{rlok
+warlord w{rl{rd
+warlords w{rl{rdz
+warm w{rm
+warmack w{rmak
+warman w{rm~
+warmed w{rmd
+warmer w{rmP
+warmest w{rm@st
+warming w{rm6N
+warmington w{rm6Nt~
+warminster w{rminstP
+warmish w{rm6S
+warmly w{rml/
+warmond w{rm~d
+warmonger w{rmoNgP
+warmongering w{rmoNgP6N
+warmoth w{rm@T
+warms w{rmz
+warmth w{rmT
+warmup w{rmup
+warmus w{rm@s
+warmuth w{rmqT
+warn w{rn
+warnaco w{rn@kO
+warncke w{rNk/
+warne w{rn
+warnecke w{rn6k
+warned w{rnd
+warneke w{rn6k
+warnell w{rn@l
+warner w{rnP
+warner's w{rnPz
+warners w{rnPz
+warnes w{rnz
+warnick w{rn6k
+warnico w{rn6k]
+warning w{rn6N
+warningly w{rn6Nl/
+warnings w{rn6Nz
+warnke w{rNk/
+warnken w{rNk~
+warnock w{rnok
+warns w{rnz
+waronker w{roNkP
+warp w{rp
+warpath w{rpaT
+warped w{rpt
+warping w{rp6N
+warplane w{rplAn
+warplanes w{rplAnz
+warps w{rps
+warr w{r
+warrant w{r~t
+warranted w{r~t@d
+warranties w{r~t/z
+warrantless w{r~tl@s
+warrants w{r~ts
+warranty w{r~t/
+warrell w{rel
+warren w{r~
+warren's w{r~z
+warrens w{r~z
+warrick w{r6k
+warriner w{r~P
+warring w{r6N
+warrington w{r6Nt~
+warrior w{r/P
+warrior w{ryP
+warriors w{r/Pz
+warriors w{ryPz
+wars w{rz
+wars' w{rz
+warsaw w{rs{
+warsaw's w{rs{z
+warsaws w{rs{z
+warshauer w{rS?P
+warshaw w{rS{
+warshawsky w{rS@wsk/
+warship w{rSip
+warships w{rSips
+warstler w{rstlP
+wart w{rt
+wartenberg w{rt~bPg
+warth w{rT
+warthen w{rT~
+wartime w{rtIm
+wartimes w{rtImz
+wartman w{rtm~
+warton w{rt~
+warts w{rts
+wartzman w{rtsm~
+warwick w{rw6k
+warwick's w{rwiks
+wary w,r/
+warzecha w{rzeh@
+was w@z
+was woz
+was wuz
+wasatch wosaC
+wasch w{S
+wascher w{SP
+wasco w{sk]
+wascom w{skom
+wasden w{sd~
+waseda w@sEd@
+wasem w{scm
+wash woS
+washabaugh w{S@b{
+washable woS@b@l
+washam woS}
+washbasin woSbAs~
+washboard woSb{rd
+washburn woSbVn
+washburne w{SbVn
+washcloth woSkl{T
+washed woSt
+washer woSP
+washers woSPz
+washes woS@z
+washi's woS/z
+washing woS6N
+washington woS6Nt~
+washington's woS6Nt~z
+washingtonian woS6NtOn/~
+washingtonians woS6NtOn/~z
+washko voSk]
+washoe woSO
+washout woS?t
+washouts woS?ts
+washroom woSrUm
+washtub woStub
+washy woS/
+wasielewski v@s/lefsk/
+wasik vos6k
+wasil w{s@l
+wasilewski v@s@lefsk/
+wasinger w{s~jP
+waskiewicz vosk@v6C
+wasko vosk]
+waskow vosk]
+wasley w{sl/
+wasmer w{s}P
+wasmund w{zm~d
+wasmuth w{zmUT
+wasn't woz~t
+wasn't wuz~t
+wason wos~
+wasp wosp
+wasp's wosps
+wasps wosps
+wass wus
+wassel w{s@l
+wassell w{s@l
+wassenaar w{s~or
+wasser w{sP
+wasserman wosPm~
+wasserman's wosPm~z
+wasserstein wosPstEn
+wasserstein wosPstIn
+wassink w{s6Nk
+wassman w{sm~
+wassmer wosmP
+wassom wos}
+wasson w{s~
+wassum wos}
+waste wAst
+waste's wAsts
+wastebasket wAstbask@t
+wastebaskets wAstbask@ts
+wasted wAst@d
+wasteful wAstf@l
+wastefulness wAstf@ln@s
+wasteland wAstland
+wastepaper wAstpApP
+waster wAstP
+wasters wAstPz
+wastes wAsts
+wastewater wAstw{tP
+wasting wAst6N
+waszak voS@k
+waszkiewicz voSk@v6C
+wat w{t
+watanabe wotonobA
+watch woC
+watchdog woCd{g
+watchdogs woCd{gz
+watched woCt
+watcher woCP
+watchers woCPz
+watches woC@z
+watchful woCf@l
+watchin' woC~
+watching woC6N
+watchman woCm~
+watchorn w{CPn
+watchword woCwVd
+water w{tP
+water's w{tPz
+water-repellent w{tPr@pel~t
+waterbed w{tPbed
+waterbeds w{tPbedz
+waterborne w{tPb{rn
+waterbury w{tPber/
+watercolor w{tPkulP
+watercolors w{tPkulPz
+watercress w{tPkres
+watered w{tPd
+waterer w{tPP
+waterfall w{tPf{l
+waterfalls w{tPf{lz
+waterfield w{tPf/ld
+waterford w{tPfPd
+waterfowl w{tPf?l
+waterfront w{tPfrunt
+waterfronts w{tPfrunts
+watergate wotPgAt
+waterhouse w{tPh?s
+waterhouse's w{tPh?s@z
+watering w{tP6N
+waterishness w{tP6Sn@s
+waterlog w{tPlog
+waterlogged w{tPlogd
+waterloo w{tPlU
+waterman w{tPm~
+waterman's w{tPm~z
+watermark w{tPmork
+watermelon w{tPmel~
+watermelons w{tPmel~z
+watermen w{tPm~
+waterproof w{tPprUf
+waterproofing w{tPprUf6N
+waters w{tPz
+watershed wotPSed
+watersheds wotPSedz
+waterson w{tPs~
+waterstein w{tPst/n
+waterstein w{tPstIn
+waterston w{tPst~
+waterstone's w{tPstOnz
+watertight w{tPtIt
+watertown w{tPt?n
+waterville w{tPvil
+waterway w{tPwA
+waterways w{tPwAz
+waterwork w{tPwVk
+waterworks w{tPwVks
+waterworld w{tPwVld
+waterworth w{tPwPT
+watery w{tP/
+watford w{tfPd
+wathen w{T~
+watkin w{tkin
+watkins wotkinz
+watkins' wotkinz
+watkinson w{tkins~
+watland wotl~d
+watley wotl/
+watling w{t@l6N
+watlington w{t@l6Nt~
+watne w{tn
+watrous wotr@s
+watry wotr/
+watsco wotskO
+watson wots~
+watson's wots~z
+watsonville wots~vil
+watt wot
+watt's wots
+wattage wot@j
+wattenbarger w{t~borgP
+wattenberg wot~bPg
+wattenburg wot~bPg
+watters wotPz
+wattie wot/
+wattles wot@lz
+wattleton wot@lt~
+watton w{t~
+watts wots
+wattwil wotwil
+watwood w{twqd
+watz wots
+watzman wotsm~
+waugaman w{g}~
+waugh w{
+waugh's w{z
+waukegan w{kEg~
+waukesha w{kES@
+wausau w{s{
+wauters w?tPz
+wave wAv
+waved wAvd
+wavelength wAvleNT
+wavelengths wAvleNTs
+waver wAvP
+wavered wAvPd
+wavering wAvP6N
+waverley wAvPl/
+waverly wAvPl/
+waves wAvz
+wavetek wAvtek
+waving wAv6N
+wavra wovr@
+wavy wAv/
+wawrzyniak worzin/ak
+wax waks
+waxed wakst
+waxes waks@z
+waxing waks6N
+waxler wakslP
+waxman waksm~
+waxman's waksm~z
+waxy waks/
+way wA
+way's wAz
+wayans hwA~z
+wayans wA~z
+waybright wAbrIt
+waycaster wAkastP
+waye wA
+waylaid wAlAd
+wayland wAl~d
+waylay wAlA
+waylon wAlon
+wayman wAm~
+waymire wAmIr
+wayne wAn
+wayne's wAnz
+waynesboro wAnzbP]
+waynesville wAnzvil
+waynick wAn6k
+ways wAz
+wayside wAsId
+wayson wAz~
+wayt wAt
+wayward wAwPd
+wazir wozir
+wazir's wozirz
+we wE
+we'd wEd
+we'll wEl
+we'll wil
+we're wEr
+we're wV
+we're wir
+we've wEv
+weak wEk
+weaken wEk~
+weakened wEk~d
+weakening wEk~6N
+weakens wEk~z
+weaker wEkP
+weakest wEk@st
+weakland wEkl~d
+weakley wEkl/
+weakling wEkl6N
+weakly wEkl/
+weakness wEkn@s
+weaknesses wEkn@s@z
+weaks wEks
+wealth welT
+wealthier welT/P
+wealthiest welT/@st
+wealths welTs
+wealthy welT/
+wean wEn
+weaned wEnd
+weaning wEn6N
+weant wEnt
+weapon wep~
+weapon's wep~z
+weaponry wep~r/
+weapons wep~z
+weapons' wep~z
+wear w,r
+wearable w,r@b@l
+wearer w,rP
+wearers w,rPz
+wearever w,revP
+wearhouse w,rh?s
+wearied wir/d
+wearily w,r@l/
+weariness wir/n@s
+wearing w,r6N
+wearisome wir/s}
+wears w,rz
+weary wir/
+wearying wEr/6N
+wease wEz
+weasel wEz@l
+weasellike wEz@llIk
+weast wEst
+weather weTP
+weather's weTPz
+weatherall weTP{l
+weatherbee weTPbE
+weatherby weTPb/
+weathered weTPd
+weatherford weTPfPd
+weatherhead weTPhed
+weatherholt weTPhOlt
+weatherholtz weTPhOlts
+weathering weTP6N
+weatherington weTP6Nt~
+weatherly weTPl/
+weatherman weTPman
+weathermen weTPmen
+weatherperson weTPpVs~
+weatherproof weTPprUf
+weathers weTPz
+weathersbee weTPzbE
+weathersby weTPsb/
+weatherspoon weTPspUn
+weatherstone weTPstOn
+weatherwax weTPwaks
+weathington weT6Nt~
+weave wEv
+weaved wEvd
+weaver wEvP
+weaver's wEvPz
+weaverling wEvPl6N
+weavers wEvPz
+weaves wEvz
+weavil wEv@l
+weaving wEv6N
+weavings wEv6Nz
+web web
+webb web
+webb's webz
+webbed webd
+webber webP
+webber's webPz
+webbing web6N
+webbs webz
+weber webP
+weber's vAbPz
+weber's webPz
+weberg webPg
+webers webPz
+webley webl/
+webmaster webmastP
+webre webP
+webs webz
+website websIt
+webster webstP
+webster's webstPz
+wechsel weks@l
+wechsler weSlP
+wechsler wekslP
+wecht wekt
+wecht's wekts
+wechter wektP
+weck wek
+wecker wekP
+weckerly wekPl/
+weckesser wekcsP
+weckwerth wekwPT
+wed wed
+wedbush wedbqS
+wedd wed
+wedded wed@d
+weddell wed@l
+wedding wed6N
+weddings wed6Nz
+weddington wed6Nt~
+weddle wed@l
+wedekind wed6kind
+wedeking wed6k6N
+wedel wed@l
+wedell wed@l
+wedemeyer wed}IP
+wedge wej
+wedged wejd
+wedges wej@z
+wedgestone wejstOn
+wedgewood wejwqd
+wedgewood's wejwqdz
+wedgeworth wejwVT
+wedgwood wejwqd
+wedig wed6g
+wedin wedin
+wedlock wedlok
+wednesday wenzd/
+wednesday wenzdA
+wednesday's wenzd/z
+wednesday's wenzdAz
+wednesdays wenzd/z
+wednesdays wenzdAz
+wedowee wcd?wE
+wedowee's wcd?wEz
+wedtech wedtek
+wedtech's wedteks
+wee wE
+weeber wEbP
+weech wEC
+weed wEd
+weeded wEd@d
+weeden wEd~
+weeding wEd6N
+weedman wEdm~
+weedon wEd~
+weeds wEdz
+weedy wEd/
+weehawken wEh{k~
+week wEk
+week's wEks
+weekday wEkdA
+weekdays wEkdAz
+weekend wEkend
+weekend wEkind
+weekend's wEkendz
+weekender wEkendP
+weekends wEkendz
+weekes wEks
+weekley wEkl/
+weeklies wEkl/z
+weeklong wEkl{N
+weekly wEkl/
+weekly's wEkl/z
+weeks wEks
+weeks' wEks
+weems wEmz
+weeny wEn/
+weep wEp
+weeping wEp6N
+weeps wEps
+weepy wEp/
+weers wEPz
+weerts wirts
+weese wEz
+weesner wEznP
+weevil wEv@l
+weevils wEv@lz
+wegbreit wegbrIt
+wege wEj
+wegener weg/nP
+weger wEgP
+weglarz weglorz
+wegman wegm~
+wegmann wegm~
+wegner wegnP
+wegrzyn wegPzin
+wehde wed
+wehe wEh
+wehlan wel~
+wehle wel/
+wehler welP
+wehling wel6N
+wehman wem~
+wehmeier wemIP
+wehmeyer wemIP
+wehner wenP
+wehr w,r
+wehrenberg w,r~bPg
+wehrheim w,rhIm
+wehrle w,r@l
+wehrli w,rl/
+wehrly w,rl/
+wehrman w,rm~
+wehrmann w,rm~
+wehunt weh~t
+wei wA
+weiand wI~d
+weibel wIb@l
+weible wEb@l
+weich wIk
+weichel wIk@l
+weichert wIkPt
+weichman wIkm~
+weicht wIkt
+weick wEk
+weicker wIkP
+weicker's wIkPz
+weida vId@
+weide wId/
+weidel wId@l
+weideman wIdm~
+weidemann wIdm~
+weidenbach wId~bok
+weidenbaum wId~b?m
+weidenfeld wId~feld
+weider wIdP
+weiderman wIdPm~
+weidig wId6g
+weidinger wId6NP
+weidler wId@lP
+weidlich wIdl6k
+weidman wIdm~
+weidmann wIdm~
+weidner wIdnP
+weier wAP
+weigand wIg~d
+weigandt wIg~t
+weigel wIg@l
+weigelt wIgclt
+weigert wIgPt
+weigh wA
+weighed wAd
+weighing wA6N
+weighs wAz
+weight wAt
+weighted wAt@d
+weighting wAt6N
+weightings wAt6Nz
+weightless wAtl@s
+weightlessness wAtl@sn@s
+weightlifter wAtliftP
+weightlifters wAtliftPz
+weightlifting wAtlift6N
+weightman wItm~
+weights wAts
+weighty wAt/
+weighty wAtE
+weigl wEg@l
+weigle wEg@l
+weigold wIgOld
+weihe wEh
+weiher wIhP
+weik wEk
+weikel wIk@l
+weiker wIkP
+weikert wIkPt
+weikle wEk@l
+weil wEl
+weil wIl
+weil's wIlz
+weiland wIl~d
+weilbacher wIlbokP
+weild wEld
+weild wIld
+weiler wIlP
+weill wIl
+weill's wIlz
+weiman wIm~
+weimann wIm~
+weimar vImor
+weimer wImP
+weimeyer wImIP
+wein wEn
+weinand wIn~d
+weinbach wInbok
+weinbaum wInb?m
+weinberg wInbPg
+weinberger wInbPgP
+weinberger's wInbPgPz
+weindel wInd@l
+weinel wIn@l
+weiner wInP
+weinert wInPt
+weinfeld wInfeld
+weingart wINgort
+weingarten wIngort~
+weingartner wINgortnP
+weinger wIngP
+weinheimer wInhImP
+weinhold wInhOld
+weininger wIn6NP
+weinkauf wINk?f
+weinman wInm~
+weinmann wInm~
+weinreb wInrcb
+weinreich wInrIk
+weinrich wInr6k
+weinroth wInr{T
+weins wEnz
+weinstein wInstEn
+weinstein wInstIn
+weinstein's wInstEnz
+weinstein's wInstInz
+weinstock wInstok
+weintraub wIntr?b
+weintz wInts
+weintz' wInts
+weintz's wInts@z
+weinzierl wInz6rl
+weipert wIpPt
+weir wEr
+weir's wErz
+weirauch wIr?k
+weird wird
+weirder wirdP
+weirdest wird@st
+weirdly wirdl/
+weirdness wirdn@s
+weirdo wird]
+weirdos wird]z
+weirich wIr6k
+weirick wIr6k
+weirton wirt~
+weirton's wirt~z
+weis wIs
+weisbach wIsbok
+weisbecker wIsbekP
+weisberg wIsbPg
+weisberger wIsbPgP
+weisbrod wIsbrod
+weisbrot wIsbr@t
+weischedel wIS@d@l
+weise wEs
+weisel wIs@l
+weisel wIz@l
+weiseman wIs}~
+weisenbach wIs~bok
+weisenbach wIz~bok
+weisenberg wIs~bPg
+weisenberg wIz~bPg
+weisenberger wIs~bPgP
+weisenberger wIz~bPgP
+weisenborn wIs6nbPn
+weisenborn wIz6nbPn
+weisenburger wIs~bPgP
+weisenburger wIz~bPgP
+weisensel wIs~s@l
+weisensel wIz~s@l
+weisenthal wIs~Tol
+weisenthal wIz~Tol
+weiser wIsP
+weisfeld wIsfeld
+weisfield's wIsf/ldz
+weisgerber wIsgPbP
+weishaar wISor
+weishaupt wIS?pt
+weisheit wISIt
+weisinger wIs~jP
+weiskopf wIsk{f
+weisman wIsm~
+weismann wIsm~
+weisner wIsnP
+weiss wIs
+weiss's wIs@z
+weissberg wIsbPg
+weisse wIs
+weissenborn wIs~bPn
+weisser wIsP
+weissert wIsPt
+weissinger wIs~jP
+weissman wIsm~
+weissmann wIsm~
+weist wE@st
+weisz vIS
+weitek wAtek
+weith wET
+weitkamp wItkamp
+weitler wItlP
+weitman wItm~
+weitz wEts
+weitzel wItz@l
+weitzen wIts~
+weitzman wItsm~
+weitzman's wItsm~z
+weitzner wItsnP
+weizman wIzm~
+weizsaecker wIsakP
+weksel weks@l
+welbilt welbilt
+welbilt's welbilts
+welborn welbPn
+welborne welbPn
+welby welb/
+welch welC
+welch's welC@z
+welchel welC@l
+welcher welCP
+welcome welk}
+welcomed welk}d
+welcomes welk}z
+welcoming welk}6N
+weld weld
+welded weld@d
+welden weld~
+welder weldP
+welders weldPz
+weldin weldin
+welding weld6N
+weldon weld~
+weldon's weld~z
+welds weldz
+weldwood weldwqd
+weldy weld/
+welfare welfer
+welford welfPd
+welge welj
+welinder welindP
+welk welk
+welke welk
+welker welkP
+well wel
+well-doer weldUr
+welland wel~d
+wellbeing welbE6N
+wellborn welb{rn
+wellbrock welbr@k
+wellco welk]
+wellcome welkum
+wellcome's welkumz
+welle wel
+wellek welck
+wellen wel~
+wellendorf wel~d{rf
+wellens wel~z
+weller welP
+welles welz
+welles' welz
+wellesley welzl/
+wellfleet welflEt
+wellhead welhed
+welling wel6N
+wellington wel6Nt~
+wellington's wel6Nt~z
+welliver wel6vP
+wellman welm~
+wellner welnP
+wellness weln@s
+wellnitz welnits
+wellons wel~z
+wellpoint welp<nt
+wells welz
+wells's welz@z
+wellspring welspriN
+wellstone welsOn
+wellstone's welsOnz
+welltech weltek
+welna weln@
+welp welp
+welsch welS
+welser welsP
+welsh welC
+welsh welS
+welshans welS~z
+welt welt
+welte welt
+welter weltP
+welterweight weltPwAt
+weltman weltm~
+welton welt~
+welty welt/
+weltz welts
+welz welz
+wembley wembl/
+wemhoff wemh{f
+wemmer wemP
+wempe wemp
+wemple wemp@l
+wen wen
+wenatchee w~aC/
+wenberg wenbPg
+wenceslaus wens@sl{s
+wenches wenC@z
+wenchester wenCestP
+wenchester's wenCestPz
+wenck weNk
+wend wend
+wenda wend@
+wende wend
+wendel wend@l
+wendeline wend@lIn
+wendelken wend@lk~
+wendell wend@l
+wender wendP
+wenders wendPz
+wending wend6N
+wendland wendl~d
+wendlandt wendl~t
+wendler wendlP
+wendling wendl6N
+wendorf wend{rf
+wendorff wend{rf
+wends wendz
+wendt went
+wendy wend/
+wendy's wend/z
+wenfan wenfan
+weng weN
+wenge weN
+wenge wenj
+wenger weNP
+wengerd weNgPd
+wengert weNgPt
+wengler wiN@lP
+wengler wiNglP
+wenig wen6g
+weniger wen6gP
+weninger wen6NP
+wenk weNk
+wenke weNk
+wenker weNkP
+wennberg wenbPg
+wenner wenP
+wennerstrom wenPstr}
+wenning wen6N
+wenninger wen6NP
+wenona wen~@
+wenrich wenr6k
+wenrick wenr6k
+wensberg wenzbPg
+wensel wens@l
+wenstrom wenstr}
+went went
+wente went
+wentland wentl~d
+wentling wentl6N
+wentworth wentwVT
+wentz wents
+wentzel wentz@l
+wentzell wentz@l
+wentzville wentsvil
+wenz wenz
+wenzel wenz@l
+wenzhou wcnzU
+wenzl wenz@l
+wenzler wenzlP
+wenzlick wenzl6k
+weppler weplP
+wept wept
+werber wVbP
+werden wVd~
+werder wVdP
+werdesheim wVdzhIm
+were wP
+were wV
+wereldhave w,r@ldhovA
+weren't wVnt
+weren't wV~t
+werewolf w,rwqlf
+wergin wVgin
+werk wVk
+werke wVk
+werkheiser wVkhIsP
+werking wVk6N
+werkmeister wVkmIstP
+werle w{r@l
+werley wVl/
+werling wVl6N
+werman wVm~
+wermiel wPm/@l
+wermuth wPmUT
+werne wVn@
+wernecke wVn6k
+werner wVnP
+werner's wVnPz
+wernert wVnPt
+wernet wVnct
+wernette wPnet
+wernick wVn6k
+wernicke wVn6k
+wernimont wVn}~t
+werning wVn6N
+wernli wVnl/
+werntz wVnts
+werre w,r
+werry w,r/
+werst wVst
+wert wVt
+wertenberger wVt~bPgP
+werth wVT
+wertheim wVthIm
+wertheimer wVthImP
+werther wVTP
+wertman wVtm~
+werts wVts
+wertz wVts
+wery w,r/
+wes wes
+wesat wEsat
+wesat wesat
+wesch weS
+wesche weS
+wesco wesk]
+wescoat weskOt
+wescott weskot
+weseloh wAsAl]
+wesely wEzl/
+weseman wEzm~
+wesemann wEzm~
+wesenberg wEz~bPg
+wesker weskP
+wesker's weskPz
+wesler wes@lP
+wesley wesl/
+wesleyan wezl/~
+weslia hwesl/@
+weslia wesl/@
+wesner wesnP
+wesolek wes@l6k
+wesolowski vcs@l{fsk/
+wesp wesp
+wespac wespak
+wespercorp wespPk{rp
+wesray wesrA
+wess wes@z
+wessel wes@l
+wessell wes@l
+wessells wes@lz
+wesselman wes@lm~
+wessels wes@lz
+wessex wes@ks
+wessinger wes~jP
+wessler weslP
+wessling wes@l6N
+wessman wesm~
+wessner wesnP
+wesson wes~
+west west
+west's wests
+westair west,r
+westall west@l
+westall's west@lz
+westamerica west},r6k@
+westamerica's west},r6k@z
+westar westP
+westbay westbA
+westberg westbPg
+westberry westber/
+westboro westbP]
+westborough westbP]
+westbound westb?nd
+westbridge westbrij
+westbrook westbrqk
+westbrooks westbrqks
+westburne westbPn
+westbury westber/
+westby westb/
+westcap westkap
+westchester westCestP
+westchester's westCestPz
+westcoast westkOst
+westcoast's westkOsts
+westcorp westk{rp
+westcott westkot
+westdeutsche westd<C
+westech westck
+westen west~
+westenberger west~bPgP
+westendorf west~d{rf
+wester westP
+westerbeck westPbek
+westerberg westPbPg
+westerfeld westPfeld
+westerfield westPfEld
+westergaard westPgord
+westergard westPgPd
+westergren westPgrcn
+westerhoff westPh{f
+westerhold westPhOld
+westerlund westPl~d
+westerly westPl/
+westerman westPm~
+westermann westPm~
+westermeyer westPmIP
+western hwestPn
+western westPn
+western's westPnz
+westerner westPnP
+westerners westPnPz
+westernization westPn@zAS~
+westernize westPnIz
+westernized westPnIzd
+westernmost westPnmOst
+westerns westPnz
+westervelt westPvclt
+westfaelisches westfAl6S@z
+westfahl westfol
+westfall westf{l
+westfed westfed
+westfield westf/ld
+westford westfPd
+westgate westgAt
+westhampton westhampt~
+westheimer westhImP
+westhoff westh{f
+westin westin
+westinghouse west6Nh?s
+westinghouse's west6Nh?s@z
+westlake westlAk
+westland westl~d
+westleigh westlI
+westley westl/
+westling westl6N
+westlund westl~d
+westman westm~
+westmarc westmork
+westmark westmork
+westmark's westmorks
+westmin westmin
+westminster westminstP
+westmoreland wcstm{rl~d
+weston west~
+westover westOvP
+westpac westpak
+westpac's westpaks
+westphal westf@l
+westphalen westf@l~
+westphalia westfAl/@
+westphalia westfAly@
+westport westp{rt
+westpride westprId
+westra westr@
+westrich westr6k
+westrick westr6k
+westridge westrij
+westrom westr}
+westrum westr}
+westrup westr@p
+westside westsId
+westtech westek
+westtech's westeks
+westvaco westvak]
+westward westwPd
+westwards westwPdz
+westwood westwqd
+westwood's westwqdz
+westworld westwVld
+wesun wEsun
+wet wet
+wetherbee weTPbE
+wetherby weTPb/
+wetherell weTP@l
+wetherill weTP@l
+wetherington weTP6Nt~
+wetherly weTPl/
+wethington weT6Nt~
+wetland wetland
+wetlands wetlandz
+wetlands' wetlandz
+wetmore wetm{r
+wetness wetn@s
+wetsel wets@l
+wetstein wetstEn
+wetstein wetstIn
+wetsuit wetsUt
+wettengel wet6Ng@l
+wetter wetP
+wetterau wetP?
+wettergreen wetPgrEn
+wettest wet@st
+wetting hwet6N
+wetting wet6N
+wettlaufer wetl?fP
+wettstein wetst/n
+wettstein wetstIn
+wetz wets
+wetzel wetz@l
+wetzler wetslP
+wetzstein wetst/n
+wetzstein wetstIn
+wever wEvP
+wexler wekslP
+wexner weksnP
+wey wA
+weyand wA~d
+weyandt wA~t
+weyant wA~t
+weyenberg wInbPg
+weyer wAP
+weyerhaeuser w,rh?zP
+weyerhaeuser's werh?zPz
+weyers wAPz
+weyforth wAf{rT
+weygandt wAg~t
+weyhrauch wAr?k
+weyl wAl
+weyland wAl~d
+weylin wAlin
+weyman wAm~
+weymer wAmP
+weymouth wAm@T
+weyrauch w,r?k
+weyrich w,r6k
+weyrick wAr6k
+whack hwak
+whack wak
+whacked hwakt
+whacked wakt
+whacking hwak6N
+whacking wak6N
+whacko wak]
+whacks hwaks
+whacks waks
+whale hwAl
+whale wAl
+whale's hwAlz
+whale's wAlz
+whalen hwAl~
+whalen wAl~
+whaler hwAlP
+whaler wAlP
+whalers hwAlPz
+whalers wAlPz
+whales hwAlz
+whales wAlz
+whaley hwAl/
+whaley wAl/
+whalin walin
+whaling hwAl6N
+whaling wAl6N
+whalley wal/
+wham hwam
+wham wam
+whammy hwam/
+whammy wam/
+whampoa wampO@
+whan hwan
+whan wan
+whang hwaN
+whang waN
+wharf hw{rf
+wharf w{rf
+wharf's hw{rfs
+wharf's w{rfs
+wharff hw)rf
+wharff w)rf
+wharry hwar/
+wharry war/
+wharton w{rt~
+wharton's w{rt~z
+what hwut
+what wut
+what'd hwut@d
+what'd wut@d
+what'll hwut@l
+what'll wut@l
+what're hwutP
+what're wutP
+what's hwuts
+what's wuts
+whatever hwutevP
+whatever wutevP
+whatever's hwutevPz
+whatever's wutevPz
+whatley hwutl/
+whatley wutl/
+whatnot hwutnot
+whatnot wutnot
+whats hw@ts
+whats w@ts
+whatsoever hwuts]evP
+whatsoever wuts]evP
+whay-yu hwAyU
+whay-yu wAyU
+wheat hwEt
+wheat wEt
+wheaten hwEt~
+wheaten wEt~
+wheatie hwEt/
+wheatie wEt/
+wheaties hwEt/z
+wheaties wEt/z
+wheatley hwEtl/
+wheatley wEtl/
+wheatly hwEtl/
+wheatly wEtl/
+wheaton hwEt~
+wheaton wEt~
+whedbee hwedbE
+whedbee wedbE
+whedon hwed~
+whedon wed~
+wheel hwEl
+wheel wEl
+wheelabrator hwEl@brAtP
+wheelabrator wEl@brAtP
+wheelan hwEl~
+wheelan wEl~
+wheeland hwEl~d
+wheeland wEl~d
+wheelbarrow hwElber]
+wheelbarrow wElber]
+wheelbarrows hwElber]z
+wheelbarrows wElber]z
+wheelbase hwElbAs
+wheelbase wElbAs
+wheelchair hwElCer
+wheelchair wElCer
+wheelchairs hwElCerz
+wheelchairs wElCerz
+wheeldon hwEld~
+wheeldon wEld~
+wheeled hwEld
+wheeled wEld
+wheeler hwElP
+wheeler wElP
+wheeler's hwElPz
+wheeler's wElPz
+wheelers hwElPz
+wheelers wElPz
+wheeless hwEl@s
+wheeless wEl@s
+wheeling hwEl6N
+wheeling wEl6N
+wheeling's hwEl6Nz
+wheeling's wEl6Nz
+wheelis hwElis
+wheelis wElis
+wheelock hwElok
+wheelock wElok
+wheelon hwEl~
+wheelon wEl~
+wheels hwElz
+wheels wElz
+wheelus hwEl@s
+wheelus wEl@s
+wheelwright hwElrIt
+wheelwright wElrIt
+wheelwriter hwElrItP
+wheelwriter wElrItP
+wheeze hwEz
+wheeze wEz
+wheezes hwEz@z
+wheezes wEz@z
+wheezes wEz@z
+wheezing hwEz6N
+wheezing wEz6N
+whelan hwEl~
+whelan hwel~
+whelan wEl~
+whelan wel~
+whelchel hwelC@l
+whelchel welC@l
+wheless hwElis
+wheless wElis
+whelpley hwelpl/
+whelpley welpl/
+whelton hwelt~
+whelton welt~
+when hwen
+when hwin
+when wen
+when win
+when'll hwen@l
+when'll wen@l
+when's hwenz
+when's wenz
+whence hwens
+whence wens
+whenever hwcnevP
+whenever wcnevP
+where hw,r
+where w,r
+where'd hw,rd
+where'd w,rd
+where's hw,rz
+where's w,rz
+whereabouts hw,r@b?ts
+whereabouts w,r@b?ts
+whereas hwcraz
+whereas wcraz
+whereby hwcrbI
+whereby wcrbI
+wherein hwcrin
+wherein wcrin
+whereupon hw,r@pon
+whereupon w,r@pon
+wherever hwcrevP
+wherever wcrevP
+wherewithal hw,rw@T{l
+wherewithal w,rw@T{l
+wherley hwVl/
+wherley wVl/
+wherry hw,r/
+wherry w,r/
+whet hwet
+whet wet
+whether hweTP
+whether weTP
+whetsel hwets@l
+whetsel wets@l
+whetsell hwets@l
+whetsell wets@l
+whetstine hwetst/n
+whetstine wetst/n
+whetstone hwetstOn
+whetstone wetstOn
+whetted hwet@d
+whetted wet@d
+whetzel hwetz@l
+whetzel wetz@l
+whew hwU
+whew hyU
+whew wU
+whey hwA
+whey wA
+which hwiC
+which wiC
+which're hwiCP
+which're wiCP
+which's hwiC@z
+which's wiC@z
+whichard hwiCPd
+whichard wiCPd
+whichever hw6CevP
+whichever w6CevP
+whicker hwikP
+whicker wikP
+whidby hwidb/
+whidby widb/
+whidden hwid~
+whidden wid~
+whiddon hwid~
+whiddon wid~
+whiff hwif
+whiff wif
+whig hwig
+whig wig
+whigham hwig}
+whigham wig}
+whigs hwigz
+whigs wigz
+whilden hwIld~
+whilden wIld~
+while hwIl
+while wIl
+whiles hwIlz
+whiles wIlz
+whilst wIlst
+whim hwim
+whim wim
+whimper hwimpP
+whimper wimpP
+whimpering hwimpP6N
+whimpering wimpP6N
+whims hwimz
+whims wimz
+whimsical hwimz6k@l
+whimsical wimz6k@l
+whimsy hwims/
+whimsy wims/
+whine hwIn
+whine wIn
+whiner hwInP
+whiner wInP
+whiners hwInPz
+whiners wInPz
+whinery hwInP/
+whinery wInP/
+whines hwInz
+whines wInz
+whining hwIn6N
+whining wIn6N
+whinnery hwinP/
+whinnery winP/
+whinney hwin/
+whinney win/
+whiny hwIn/
+whiny wIn/
+whip hwip
+whip wip
+whipkey hwipkE
+whipkey wipkE
+whiplash hwiplaS
+whiplash wiplaS
+whiplashes hwiplaS@z
+whiplashes wiplaS@z
+whipp hwip
+whipp wip
+whippany hwip~/
+whippany wip~/
+whipped hwipt
+whipped wipt
+whipping hwip6N
+whipping wip6N
+whipple hwip@l
+whipple wip@l
+whipple's hwip@lz
+whipple's wip@lz
+whippoorwills hwipPwilz
+whippoorwills wipPwilz
+whipps hwips
+whipps wips
+whips hwips
+whips wips
+whipsaw hwips{
+whipsaw wips{
+whipsawed hwips{d
+whipsawed wips{d
+whipsawing hwips{6N
+whipsawing wips{6N
+whirl hwVl
+whirl wVl
+whirled hwVld
+whirled wVld
+whirley hwVl/
+whirley wVl/
+whirling hwVl6N
+whirling wVl6N
+whirlpool hwVlpUl
+whirlpool wVlpUl
+whirlpool's hwVlpUlz
+whirlpool's wVlpUlz
+whirlpools hwVlpUlz
+whirlpools wVlpUlz
+whirlwind hwVlwind
+whirlwind wVlwind
+whirring hwV6N
+whirring wV6N
+whisenand hwis~and
+whisenand wis~and
+whisenant hwis~~t
+whisenant wis6n~t
+whisenhunt hwIz~hunt
+whisenhunt wIz~hunt
+whisk hwisk
+whisk wisk
+whisked hwiskt
+whisked wiskt
+whisker hwiskP
+whisker wiskP
+whiskers hwiskPz
+whiskers wiskPz
+whiskey hwisk/
+whiskey wisk/
+whiskeys hwisk/z
+whiskeys wisk/z
+whisks hwisks
+whisks wisks
+whisky hwisk/
+whisky wisk/
+whisler hwislP
+whisler wislP
+whisman hwism~
+whisman wism~
+whisnant hwisn~t
+whisnant wisn~t
+whisner hwisnP
+whisner wisnP
+whisonant wis~~t
+whisper hwispP
+whisper wispP
+whispered hwispPd
+whispered wispPd
+whispering hwispP6N
+whispering wispP6N
+whispers hwispPz
+whispers wispPz
+whistle hwis@l
+whistle wis@l
+whistleblower hwis@lblOP
+whistleblower wis@lblOP
+whistleblowers hwis@lblOPz
+whistleblowers wis@lblOPz
+whistled hwis@ld
+whistled wis@ld
+whistler hwislP
+whistler wislP
+whistlers hwislPz
+whistlers wislPz
+whistles hwis@lz
+whistles wis@lz
+whistling hwisl6N
+whistling wisl6N
+whiston hwist~
+whiston wist~
+whit hwit
+whit wit
+whitacre hwit@kP
+whitacre wit@kP
+whitaker hwit@kP
+whitaker wit@kP
+whitbeck hwitbek
+whitbeck witbek
+whitbread hwitbred
+whitbread witbred
+whitby hwitb/
+whitby witb/
+whitcher hwiCP
+whitcher wiCP
+whitchurch hwitCVC
+whitchurch witCVC
+whitcomb hwitk}
+whitcomb witk}
+whitcraft hwitkraft
+whitcraft witkraft
+white hwIt
+white wIt
+white's hwIts
+white's wIts
+whiteaker hwit@kP
+whiteaker wit@kP
+whitebread hwItbred
+whitebread wItbred
+whitecotton hwItkot~
+whitecotton wItkot~
+whited hwIt@d
+whited wIt@d
+whitefield hwItfEld
+whitefield wItfEld
+whitefish hwItfiS
+whitefish wItfiS
+whiteford hwItf{rd
+whiteford wItf{rd
+whitehair hwIth,r
+whitehair wIth,r
+whitehall hwIth{l
+whitehall wIth{l
+whitehall's hwIth{lz
+whitehall's wIth{lz
+whitehead hwIthed
+whitehead wIthed
+whitehead's hwIthedz
+whitehead's wIthedz
+whitehill hwIthil
+whitehill wIthil
+whitehorn hwIth{rn
+whitehorn wIth{rn
+whitehorse hwIth{rs
+whitehorse wIth{rs
+whitehouse hwIth?s
+whitehouse wIth?s
+whitehurst hwIthVst
+whitehurst wIthVst
+whitehurst's hwIthVst
+whitehurst's wIthVst
+whitelaw hwItl{
+whitelaw wItl{
+whiteley hwItl/
+whiteley wItl/
+whitelock hwItlok
+whitelock wItlok
+whitely hwItl/
+whitely wItl/
+whiteman hwItm~
+whiteman wItm~
+whitemont hwItmont
+whitemont wItmont
+whiten hwIt~
+whiten wIt~
+whitenack hwItnak
+whitenack wItnak
+whiteneir hwItnir
+whiteneir wItnir
+whitener hwItnP
+whitener wItnP
+whiteness hwItn@s
+whiteness wItn@s
+whitenight hwItnIt
+whitenight wItnIt
+whitening hwItn6N
+whitening hwIt~6N
+whitening wItn6N
+whitening wIt~6N
+whiter hwItP
+whiter wItP
+whites hwIts
+whites wIts
+whitescarver hwItskorvP
+whitescarver wItskorvP
+whitesel hwItsel
+whitesel wItsel
+whitesell hwItsel
+whitesell wItsel
+whiteside hwItsId
+whiteside wItsId
+whitesides hwItsIdz
+whitesides wItsIdz
+whitest hwIt@st
+whitest wIt@st
+whitestone hwItstOn
+whitestone wItstOn
+whitetail hwItAl
+whitetail hwIttAl
+whitetail wIttAl
+whitewash hwItwoS
+whitewash wItwoS
+whitewashed hwItwoSt
+whitewashed wItwoSt
+whitewater hwItw{tP
+whitewater wItw{tP
+whitewater's hwItw{tPz
+whitewater's wItw{tPz
+whitey hwIt/
+whitey hwItE
+whitey wItE
+whitfield hwitf/ld
+whitfield witf/ld
+whitfill hwitfil
+whitfill witfil
+whitford hwitfPd
+whitford witfPd
+whitham hwiT}
+whitham hwit}
+whitham wiT}
+whither hwiTP
+whither wiTP
+whiting hwIt6N
+whiting wIt6N
+whitings hwIt6Nz
+whitings wIt6Nz
+whitis hwItis
+whitis wItis
+whitish hwIt6S
+whitish wIt6S
+whitlatch hwitlaC
+whitlatch witlaC
+whitledge hwitlej
+whitledge witlej
+whitley hwitl/
+whitley witl/
+whitling hwitl6N
+whitling witl6N
+whitlock hwitlok
+whitlock witlok
+whitlow hwitlO
+whitlow witlO
+whitly hwitl/
+whitly witl/
+whitman hwitm~
+whitman witm~
+whitman's hwitm~z
+whitman's witm~z
+whitmarsh hwitmorS
+whitmarsh witmorS
+whitmer hwitmP
+whitmer witmP
+whitmill hwitmil
+whitmill witmil
+whitmire hwitmIr
+whitmire witmIr
+whitmore hwitm{r
+whitmore witm{r
+whitmoyer hwitm<P
+whitmoyer witm<P
+whitmyer hwitmIP
+whitmyer witmIP
+whitner hwitnP
+whitner witnP
+whitney hwitn/
+whitney witn/
+whitney's hwitn/z
+whitney's witn/z
+whiton hwit~
+whiton wit~
+whitrow hwitrO
+whitrow witrO
+whitsel hwits@l
+whitsel wits@l
+whitsell hwits@l
+whitsell wits@l
+whitsett hwitsct
+whitsett witsct
+whitsitt hwitsct
+whitsitt witsct
+whitson hwits~
+whitson wits~
+whitt hwit
+whitt wit
+whittaker hwit@kP
+whittaker wit@kP
+whitted hwit@d
+whitted wit@d
+whittemore hwitm{r
+whittemore witm{r
+whitten hwit~
+whitten wit~
+whittenberg hwit~bPg
+whittenberg wit~bPg
+whittenburg hwit~bPg
+whittenburg wit~bPg
+whittet hwitct
+whittet witct
+whittier hwit/P
+whittier wit/P
+whitting hwit6N
+whitting wit6N
+whittingham hwit6Nham
+whittingham wit6Nham
+whittinghill hwit6Nhil
+whittinghill wit6Nhil
+whittington hwit6Nt~
+whittington wit6Nt~
+whittle hwit@l
+whittle wit@l
+whittle's hwit@lz
+whittle's wit@lz
+whittled hwit@ld
+whittled wit@ld
+whittlesey hwit@ls/
+whittlesey wit@ls/
+whittling hwitl6N
+whittling witl6N
+whitton hwit~
+whitton wit~
+whitty hwit/
+whitty wit/
+whitwam hwitwom
+whitwam witwom
+whitwell hwitwel
+whitwell witwel
+whitworth hwitwVT
+whitworth witwVT
+whiz hwiz
+whiz wiz
+whizzed hwizd
+whizzed wizd
+whizzer hwizP
+whizzer wizP
+whizzes hwiz@z
+whizzes wiz@z
+whizzing hwiz6N
+whizzing wiz6N
+who hU
+who'd hUd
+who'll hUl
+who're hUP
+who's hUz
+who've hUv
+whoa hO
+whoa hwO
+whoa wO
+whobrey wobr/
+whodunit hUdunit
+whodunits hUdunits
+whoever hUevP
+whoever's hUevPz
+whole hOl
+wholehearted hOlhort@d
+wholeheartedly hOlhort@dl/
+wholeness hOln@s
+wholes hOlz
+wholesale hOlsAl
+wholesaler hOlsAlP
+wholesaler's hOlsAlPz
+wholesalers hOlsAlPz
+wholesalers' hOlsAlPz
+wholesales hOlsAlz
+wholesaling hOlsAl6N
+wholesome hOls}
+wholesomeness hOls}n@s
+wholey hol/
+wholly hOl/
+whom hUm
+whomever hUmevP
+whomsoever hUms]evP
+whoop hwUp
+whoop wUp
+whooped hwUpt
+whooped wUpt
+whoopee hwUpE
+whoopee wUpE
+whoopi hwUp/
+whoopi wUp/
+whoopie hwUp/
+whoopie wUp/
+whooping hwUp6N
+whooping wUp6N
+whoops hwUps
+whoops wUps
+whoosh hwUS
+whoosh wUS
+whopper hwopP
+whopper wopP
+whoppers hwopPz
+whoppers wopPz
+whopping hwop6N
+whopping wop6N
+whore h{r
+whorehouse h{rh?s
+whores h{rz
+whorl hw{rl
+whorl wVl
+whorl w{rl
+whorley hw{rl/
+whorley h{rl/
+whorley w{rl/
+whorls hw{rlz
+whorls wVlz
+whorls w{rlz
+whorton h{rt~
+whose hUz
+whosoever hUs]evP
+why hwI
+why wI
+why'd hwId
+why'd wId
+why's hwIz
+why's wIz
+whys hwIz
+whys wIz
+whyte hwIt
+whyte wIt
+wiacek vI@Cck
+wian wI~
+wiant wI~t
+wiard wIord
+wiater wI@tP
+wiatrowski v/@tr{fsk/
+wiatt wI@t
+wibbelsman wib@lzm~
+wibbenmeyer wib~mIP
+wiberg wIbPg
+wible wIb@l
+wicat wikat
+wicca wik@
+wiccan wik~
+wice wIs
+wich wiC
+wichern wikPn
+wichert wiCPt
+wichita wiC@t{
+wichita's wiC@t{z
+wichman wiCm~
+wichmann wiCm~
+wick wik
+wickard wikPd
+wicke wik
+wicked wik@d
+wickedly wik@dl/
+wickedness wik@dn@s
+wickens wik~z
+wicker wikP
+wickerham wikPham
+wickersham wikPSam
+wickert wikPt
+wickes wiks
+wickes's wiks@z
+wicket hwik@t
+wicket wik@t
+wickets hwik@ts
+wickets wik@ts
+wickett wikct
+wickey wik/
+wickham wik}
+wickizer wikIzP
+wickland wikl~d
+wicklander wiklandP
+wickley wikl/
+wickliff wiklif
+wickliffe wiklif
+wickline wiklIn
+wicklund wikl~d
+wickman wikm~
+wicks wiks
+wickstrom wikstr}
+wickware wikwer
+wickwire viskvIr
+wicor wIk{r
+widder widP
+widdle wid@l
+widdled wid@ld
+widdows widOz
+widdowson wid?s~
+wide wId
+wide's wIdz
+widebody wIdbod/
+widell wid@l
+widely wIdl/
+wideman wIdm~
+widen wId~
+widened wId~d
+widener wid/nP
+widening wId~6N
+widens wId~z
+wider wIdP
+widespread wIdspred
+widest wId@st
+widger wijP
+widget wij@t
+widgets wij@ts
+widhalm widhom
+widick wid6k
+widing wId6N
+widmaier widmIP
+widman widm~
+widmann widm~
+widmar widmP
+widmayer widmAP
+widmer widmP
+widner widnP
+widow wid]
+widow's wid]z
+widowed wid]d
+widower wid]P
+widowers wid]Pz
+widows wid]z
+widrick widr6k
+widrig widr6g
+width widT
+widths widTs
+widuri w@dqr/
+wieand wE~d
+wiebe wEb
+wieber wEbP
+wieberg wEbPg
+wiebke wEbk/
+wiebold wEbOld
+wiebusch wEbqS
+wiech wEC
+wiechert wEkPt
+wiechman wEkm~
+wiechmann wEkm~
+wieck wEk
+wieczorek v/C{rck
+wied wEd
+wiedel wEd@l
+wiedeman wEdm~
+wiedemann wEdm~
+wieden wEd~
+wieder wEdP
+wiederaufbau wEdP{fb?
+wiederhold wEdPh]ld
+wiederholt wEdPh]lt
+wiederkehr wEdPk6r
+wiedman wEdm~
+wiedmann wEdm~
+wiedmeyer wEdmIP
+wiedner wEdnP
+wiedrich wEdr6k
+wiegand wEg~d
+wiegel wEg@l
+wiegers wEgPz
+wiegert wEgPt
+wiegman wEgm~
+wiegmann wEgm~
+wiehe wE
+wieland wEl~d
+wield wEld
+wielded wEld@d
+wielding wEld6N
+wields wEldz
+wielgus wElg@s
+wieman wEm~
+wiemann wEm~
+wiemer wEmP
+wiemers wEmPz
+wien wEn
+wiencek vEnCck
+wienecke wEn6k
+wieneke wEn6k
+wiener wEnP
+wiener wInP
+wieners wEnPz
+wienerschnitzel vEnPSnits@l
+wienerschnitzel wEnPSnits@l
+wienerschnitzel's vEnPSnits@lz
+wienerschnitzel's wEnPSnits@lz
+wienke wENk
+wiens wEnz
+wier wir
+wierdin wird~
+wierenga v6reNg@
+wierman wirm~
+wiers wErz
+wiersema v6rsEm@
+wiersma virsm@
+wierzba virzb@
+wierzbicki v6rzbitsk/
+wies wIz
+wiesbaden wEsbod~
+wiesbaden wIsbod~
+wiese wEz
+wiesel wEs@l
+wieseler wEs@lP
+wiesemann wEsm~
+wiesen wEs~
+wiesenthal wEs~Tol
+wiesenthal wEz~Tol
+wieser wEsP
+wiesman wEzm~
+wiesner wEznP
+wiess wEs
+wiessner wEsnP
+wiest wI@st
+wieting wEt6N
+wife wIf
+wife's wIfs
+wig wig
+wigal wig@l
+wigand wig~d
+wigand's wig~dz
+wigen wig~
+wigfall wigf{l
+wigfield wigfEld
+wigg wig
+wiggans wig~z
+wigger wigP
+wiggers wigPz
+wiggin wigin
+wiggington wig6Nt~
+wiggins wiginz
+wigginton wigint~
+wiggle wig@l
+wigglesworth wig@lzwVT
+wiggling wig@l6N
+wiggling wigl6N
+wiggly wig@l/
+wiggs wigz
+wight wIt
+wightman wItm~
+wigington wig6Nt~
+wiginton wijint~
+wigle wIg@l
+wigley wigl/
+wigmore wigm{r
+wignall wign@l
+wigs wigz
+wigton wigt~
+wigton's wigt~z
+wigwam wigwom
+wiitala v/tol@
+wik wik
+wike wIk
+wikel wik@l
+wiker wIkP
+wikle wIk@l
+wiklund wikl~d
+wikoff wik{f
+wikowsky w6k?sk/
+wikstrom wikstr}
+wil wil
+wil's wilz
+wiland wIl~d
+wilander wIl~dP
+wilbanks wilb@Nks
+wilber wilbP
+wilberforce wilbPf{rs
+wilberg wilbPg
+wilbert wilbPt
+wilbon wilb~
+wilborn wilbPn
+wilbourn wilbPn
+wilbourne wilbPn
+wilbur wilbP
+wilburn wilbPn
+wilcher wilCP
+wilcock wilkok
+wilcox wilkoks
+wilcoxen wilkoks~
+wilcoxon wilkoks~
+wilcoxson wilkoks~
+wilczak vilCak
+wilczek vilCck
+wilczewski vilCefsk/
+wilczynski vilCinsk/
+wild wIld
+wildasin wIld@sin
+wildavsky w@ldavsk/
+wildcard wIldkord
+wildcat wIldkat
+wildcats wIldkats
+wildcatter wIldkatP
+wildcatters wIldkatPz
+wildcatting wIldkat6N
+wilde wIld
+wildeman wIldm~
+wilden wIld~
+wilder wIldP
+wilder's wIldPz
+wilderman wIldPm~
+wildermuth wIldPmUT
+wilderness wildPn@s
+wildes wIldz
+wildest wIld@st
+wildey wild/
+wildfire wIldfIP
+wildfires wIldfIPz
+wildflower wIldfl?P
+wildflowers wIldfl?rz
+wilding wIld6N
+wildlife wIldlIf
+wildly wIldl/
+wildman wIldm~
+wildmon wIldm~
+wildness wIldn@s
+wildon wIld~
+wildrick wIldr6k
+wilds wIldz
+wildt wilt
+wildwood wIldwqd
+wildwoods wIldwqdz
+wile wIl
+wileen w@lEn
+wileman wIlm~
+wilemon wil}on
+wilen wIl~
+wilensky w@linsk/
+wiler wIlP
+wiles wIlz
+wiles's wIlz@z
+wiley wIl/
+wilfert wilfPt
+wilfong wilf{N
+wilford wilfPd
+wilfred wilfr@d
+wilfreda wilfr@d@
+wilfredo wilfAd]
+wilfrid wilfr@d
+wilfried wilfr/d
+wilfully wilf@l/
+wilgus wilg@s
+wilham wilh}
+wilhelm wilhelm
+wilhelma wilhelm@
+wilhelmi wilhelm/
+wilhelmina wilhclmEn@
+wilhelmine wilh@lmin
+wilhelms wilhelmz
+wilhelmsen wilhclms~
+wilhelmy wilhclm/
+wilhemina wilhcmEn@
+wilhide wilhId
+wilhite wilhIt
+wilhoit wilh<t
+wilhoite wilh<t
+wiliams wil/}z
+wiling wIl6N
+wilinski v@linsk/
+wilk wilk
+wilke wilk
+wilken wilk~
+wilkening wilk~6N
+wilkens wilk~z
+wilkenson wilk~s~
+wilker wilkP
+wilkerson wilkPs~
+wilkes wilks
+wilkesboro wilksbP]
+wilkey wilk/
+wilkie wilk/
+wilkin wilkin
+wilking wilk6N
+wilkins wilkinz
+wilkinson wilk~s~
+wilkinson's wilk~s~z
+wilkis wilkis
+wilkison wilk@s~
+wilkowski v@lk{fsk/
+wilks wilks
+will w@l
+will wil
+will's wilz
+willa wil@
+willabelle wil@bel
+willadsen w@lads~
+willaims wil}z
+willam wil}
+willamette w@lam@t
+willamette wil}et
+willamette's w@lam@ts
+willamette's wil}ets
+willamina wil}In@
+willapa w@lop@
+willapa's w@lop@z
+willard wilPd
+willbanks wilbaNks
+willcox wilkoks
+willcutt wilk@t
+willden wild~
+wille wil
+willed wild
+willeford wil@fPd
+willeford wilfPd
+willem wil}
+willems wil}z
+willemsen wilems~
+willemsen wil}s~
+willen wil~
+willenborg wil~b{rg
+willenbring wil~briN
+willens wil~z
+willer wilP
+willers wilPz
+willert wilPt
+willes wIlz
+willet wilct
+willets wilcts
+willett wilct
+willette w@let
+willetts wilcts
+willey wil/
+willford wilfPd
+willful wilf@l
+willfully wilf@l/
+willhelm wilhelm
+willhite wilhIt
+willhoit wilh<t
+willhoite wilh<t
+willi wil/
+william wily}
+william's wily}z
+williams wily}z
+williams' wily}z
+williams's wily}z@z
+williamsburg wily}zbPg
+williamsburgh wily}zbPg
+williamsen wily}s~
+williamson wily}s~
+williamson's wily}s~z
+williamsport wily}sp{rt
+williamstown wily}st?n
+williard wilyord
+willie wil/
+willie's wil/z
+williford wil@fPd
+willig wil6g
+willing wil6N
+willinger wil6NP
+willingham wil6Nham
+willingly wil6Nl/
+willingness wil6Nn@s
+willis wilis
+willis's wil@s@z
+willison wil@s~
+williston wil@ston
+willits wilits
+willke wilk/
+willkie wilk/
+willman wilm~
+willmann wilm~
+willmon wilm~
+willmore wilm{r
+willmott wilm@t
+willms wilmz
+willner wilnP
+willock wil@k
+willoughby wil@b/
+willow wilO
+willowbrook wil]brqk
+willowes wilOz
+willows wilOz
+willowy wil@w/
+willpower wilp?P
+wills wilz
+willse wils/
+willsey wils/
+willson wils~
+willwerth wilwPT
+willy wil/
+willyard wilyord
+wilma wilm@
+wilmar wilmP
+wilmarth wilmorT
+wilmer wilmP
+wilmes wilmz
+wilmet wilmct
+wilmeth wilmcT
+wilmette wilmet
+wilmington wilm6Nt~
+wilmore wilm{r
+wilmot wilm@t
+wilmoth wilm@T
+wilmott wilm@t
+wilmouth wilm?T
+wilms wilmz
+wilner wilnP
+wilpon wilpon
+wilsey wils/
+wilshire wilSIr
+wilshusen wilSUs~
+wilson wils~
+wilson's wils~z
+wilt wilt
+wilted wilt@d
+wiltel wiltel
+wiltfong wiltf{N
+wiltgen wiltg~
+wilthew wilTyU
+wilting wilt6N
+wilton wilt~
+wiltron wiltr~
+wiltrout wiltr?t
+wilts wilts
+wiltse wilts
+wiltsey wilts/
+wiltshire wilCIr
+wiltsie wilts/
+wiltz wilts
+wily wIl/
+wiman wIm~
+wimberley wimbPl/
+wimberly wimbPl/
+wimbish wimbiS
+wimbledon wimb@ld~
+wimbley wimbl/
+wimbush wimbqS
+wimer wImP
+wimmer wimP
+wimp wimp
+wimpee wimp/
+wimpiness wimp/n@s
+wimps wimps
+wimpy wimp/
+wims wimz
+wimsatt wims@t
+win win
+win's winz
+winamac win}ak
+winamac's win}aks
+winans win~z
+winans's win~z@z
+winant wIn~t
+winberg winbPg
+winberry winber/
+winborn winbPn
+winborne winbPn
+winburn winbVn
+winbush winbqS
+wince wins
+winced winst
+wincek wins6k
+winch winC
+winchel wink@l
+winchell winC@l
+winchell's winC@lz
+winchester winCestP
+wincing wins6N
+winckler wiNklP
+wind wInd
+wind wind
+wind's windz
+windchill windCil
+windchime windCIm
+windchimes windCImz
+windecker windekP
+winded wInd@d
+winded wind@d
+windell wind@l
+windels wind@lz
+winder wIndP
+winder windP
+winders wIndPz
+winders windPz
+windes wIndz
+windes windz
+windfall windf{l
+windfalls windf{lz
+windham wind}
+windheim windhIm
+windhoek windhOk
+windholz windhOlz
+windhorst windh{rst
+winding wInd6N
+windisch windiS
+windish windiS
+windlass windl@s
+windle wind@l
+windler windlP
+windley windl/
+windmere windmir
+windmere's windmirz
+windmill windmil
+windmiller windmilP
+windmills windmilz
+windom wind}
+windon wind~
+window wind]
+windowed wind]d
+windowless wind]l@s
+windowpane wind]pAn
+windowpanes wind]pAnz
+windows wind]z
+winds wIndz
+winds windz
+windshield windSEld
+windshields windSEldz
+windsor winzP
+windsor's winzPz
+windspeed windspEd
+windstar windstor
+windstar's windstorz
+windstorm windst{rm
+windswept winswept
+windt wint
+windup wIndup
+windward windwPd
+windy wInd/
+windy wind/
+wine wIn
+wine's wInz
+winebarger win@borgP
+wineberg wInbPg
+winebrenner win@brcnP
+winecoff win6k{f
+wined wInd
+winegar win6gP
+winegarden wIngord~
+winegardner win6gordnP
+wineheim wInhIm
+wineinger wIn6NP
+wineland wInl~d
+wineland win@l~d
+winema win}@
+wineman wInm~
+winemiller wInmilP
+winer wInP
+wineries wInP/z
+winery wInP/
+winery's wInP/z
+wines wInz
+winey wIn/
+winfield winfEld
+winford winfPd
+winfred winfr@d
+winfree winfrE
+winfrey winfr/
+winfrid winfr@d
+wing wiN
+wing's wiNz
+wingard wiNgPd
+wingate wingAt
+wingback wiNbak
+winge winj
+winged wiNd
+winger wiNP
+wingers wiNPz
+wingert wiNgPt
+wingerter wiNgPtP
+winget wiNgct
+wingett wiNgct
+wingfield wiNfEld
+winging wiN6N
+wingler wiNg@lP
+winglike wiNlIk
+wingman wiNm~
+wingo wENg]
+wingrove wingrOv
+wings wiNz
+wingspan wiNspan
+winiarski v~/)rsk/
+winick win6k
+winiecki v~Etsk/
+winifred win@fr@d
+winik win6k
+wining wIn6N
+wininger wIn6NP
+winings wIn6Nz
+wink wiNk
+winked wiNkt
+winkel wiNk@l
+winkelman wiNk@lm~
+winkelmann wiNk@lm~
+winkels wiNk@lz
+winker wiNkP
+winkfield wiNkfEld
+winking wiNk6N
+winkle wiNk@l
+winkleman wiNk@lm~
+winkler wiNklP
+winkles wiNk@lz
+winkley wiNkl/
+winkowski v6Nk{fsk/
+winks wiNks
+winland winl~d
+winn win
+winnable win@b@l
+winne win
+winnebago win@bAg]
+winnebago's win@bAg]z
+winner winP
+winner's winPz
+winners winPz
+winners' winPz
+winnetka winetk@
+winnett winct
+winney win/
+winnick win6k
+winnicki vinitsk/
+winnie win/
+winning win6N
+winningest win6N@st
+winningham win6Nham
+winnings win6Nz
+winnipeg win@p@g
+winnow winO
+winnowed winOd
+winnowing winO6N
+winny win/
+wino wEn]
+winograd win@grad
+winokur win@kP
+winola vinOl@
+winona win~@
+winonah win~@
+winooski winUsk/
+winos wEn]s
+winquist winkwist
+wins winz
+winsett winsct
+winship winSip
+winski winskE
+winslett winslct
+winslow winzl]
+winsome wins}
+winson wins~
+winsor winzP
+winstanley winst~l/
+winstead winsted
+winston winst~
+wint wint
+winter wintP
+winter's wintPz
+winterberg wintPbPg
+winterbourne wintPb{rn
+wintered wintPd
+winterhalter wintPh{ltP
+winterize wintPIz
+winterized wintPIzd
+wintermute wintPmyUt
+winterrowd wintP?d
+winters wintPz
+wintershall wintPSal
+wintersteen wintPstEn
+winterstein wintPstEn
+winterstein wintPstIn
+winterthur wintPTP
+wintertime wintPtIm
+winterton wintPt~
+winther winTP
+winthrop winTr@p
+winthrop's winTr@ps
+wintle wint@l
+wintom wint}
+winton wint~
+wintour wintqr
+wintry wintr/
+wintz wints
+wintzer wintsP
+winward winwPd
+winwood winwqd
+winwood's winwqdz
+winword winwPd
+winzeler winz@lP
+winzer winzP
+wion wI~
+wipe wIp
+wiped wIpt
+wipeout wIp?t
+wiper wIpP
+wipers wIpPz
+wipes wIps
+wipf wipf
+wiping wIp6N
+wipperfurth wipPfPT
+wire wIP
+wire wIr
+wired wIPd
+wired wIrd
+wireless wIrl@s
+wireless's wIPl@s@z
+wireline wIrlIn
+wireman wIrm~
+wires wIPz
+wires wIrz
+wiretap wIPtap
+wiretapped wIPtapt
+wiretapping wIPtap6N
+wiretaps wIrtaps
+wirick wir6k
+wiring wIr6N
+wirkkala vPkol@
+wirkus wVk@s
+wirsing wVs6N
+wirt wVt
+wirtanen wVt~~
+wirth wVT
+wirthlin wVTlin
+wirtz wVts
+wiry wir/
+wirz wVz
+wis wis
+wisby wisb/
+wisch wiS
+wischmeyer wiSmIP
+wisconsin wiskons~
+wisconsin's wiskons~z
+wisdom wizd}
+wise wIz
+wisecarver wIzkorvP
+wisecrack wIzkrak
+wisecracking wIzkrak6N
+wisecracks wIzkraks
+wisecup wIzkup
+wised wIzd
+wiseguy wIzgI
+wisehart wIzhort
+wisel wIz@l
+wiseley wIzl/
+wiseley wis@l/
+wisely wIzl/
+wiseman wIzm~
+wisenbaker wIz~bAkP
+wisener wis/nP
+wiser wIzP
+wisest wIz@st
+wish wiS
+wisham wiS}
+wishard wiSPd
+wishart wiSort
+wishbone wiSbOn
+wished wiSt
+wisher wiSP
+wishers wiSPz
+wishes wiS@z
+wishful wiSf@l
+wishfully wiSf@l/
+wishing wiS6N
+wishner wiSnP
+wishnick wiSn6k
+wishon wiS~
+wishy wiS/
+wisinski visinsk/
+wisler wis@lP
+wisley wizl/
+wisman wizm~
+wismer wiz}P
+wisner wisnP
+wisneski visnesk/
+wisnewski visnefsk/
+wisnieski visnEsk/
+wisniewski wizn/efsk/
+wisor wIzP
+wisp wisp
+wispy wisp/
+wiss wis
+wissa wis@
+wissel wis@l
+wisser wisP
+wissing wis6N
+wissinger wis6NP
+wissink wis6Nk
+wissler wislP
+wissman wism~
+wissmann wism~
+wissner wisnP
+wist wist
+wistful wistf@l
+wistfully wistf@l/
+wistfulness wistf@ln@s
+wiswell wiswcl
+wisz viS
+wit wit
+wit's wits
+witbeck witbek
+witbrock witbr{k
+witch wiC
+witch's wiC@z
+witchcraft wiCkraft
+witcher wiCP
+witches wiC@z
+witchey wiC/
+witchhunt wiChunt
+witching wiC6N
+witchy wiC/
+witco witk]
+witczak vitCak
+witek vitck
+with w@T
+with wiT
+with wiT
+witham wiT}
+withdraw w@Tdr{
+withdraw wiTdr{
+withdrawal w@Tdr{@l
+withdrawal wiTdr{@l
+withdrawals w@Tdr{@lz
+withdrawals wiTdr{@lz
+withdrawing w@Tdr{6N
+withdrawing wiTdr{6N
+withdrawn w@Tdr{n
+withdrawn wiTdr{n
+withdraws w@Tdr{z
+withdraws wiTdr{z
+withdrew w@TdrU
+withdrew wiTdrU
+withee wiTE
+withem wiT}
+wither wiTP
+withered wiTPd
+witherell wiTP@l
+withering wiTP6N
+witherington wiTP6Nt~
+witherow wiTP]
+withers wiTPz
+witherspoon wiTPspUn
+withey wiT/
+withheld wiTheld
+withhold wiThOld
+withholding wiThOld6N
+withholds wiThOldz
+within w@Tin
+within wiTin
+withington wiT6Nt~
+withnail wiTnAl
+without wiT?t
+without wiT?t
+withrow wiTrO
+withstand wiTstand
+withstanding wiTstand6N
+withstands wiTstandz
+withstood wiTstqd
+witkin witkin
+witkop witk@p
+witkowski vitk{fsk/
+witless witl@s
+witman witm~
+witmer witmP
+witness witn@s
+witness' witn@s
+witness's witn@s@z
+witnessed witn@st
+witnesses witn@s@z
+witnesses' witn@s@z
+witnessing witn@s6N
+witowski vit{fsk/
+wits wits
+witt wit
+witte wit
+witted wit@d
+wittekind wit6kind
+witteman witm~
+witten wit~
+wittenauer wit~?P
+wittenberg wit~bPg
+wittenborn wit~bPn
+wittenburg wit~bPg
+wittenmyer wit~m/P
+witter witP
+witter's witPz
+witters witPz
+witthuhn wiT~
+wittig wit6g
+wittily wit@l/
+witting wit6N
+wittingly wit6Nl/
+wittke witk/
+wittkopp witk@p
+wittler witlP
+wittman witm~
+wittmann witm~
+wittmer witmP
+wittmeyer witmIP
+wittner witnP
+witton wit~
+wittrock witr@k
+witts wits
+wittwer witwP
+witty wit/
+witucki wituk/
+witwatersrand witw{tPsrand
+witwer witwP
+witz wits
+witzel witz@l
+witzig witz6g
+witzke witsk/
+wives wIvz
+wives' wIvz
+wix wiks
+wixom wiks}
+wixon wiks~
+wixson wiks~
+wixted wikst@d
+wiz hwiz
+wiz wiz
+wizard wizPd
+wizardry wizPdr/
+wizards wizPdz
+wizen wIz~
+wizened wIz~d
+wlodarczyk w@lodPC6k
+wlodarski w@l@d)rsk/
+wm dub@yUem
+wm wily}
+wnek wnek
+wnuk wnuk
+wo hwO
+wo wO
+wobbe wob
+wobble wob@l
+wobbled wob@ld
+wobbling wob@l6N
+wobbling wobl6N
+wobbly wob@l/
+wobegon wOb@gon
+wobig wOb6g
+wobst wobst
+woburn wUbPn
+woe wO
+woebegone wOb6g{n
+woeful wOf@l
+woefully wOf@l/
+woehl wOl
+woehler wOlP
+woehr w{r
+woehrle w{r@l
+woelfel wOlf@l
+woelfle wOlf@l
+woerner w{rnP
+woes wOz
+woessner wOsnP
+woeste wOst
+wofford wofPd
+wofford's wofPdz
+wogan wOg~
+wogoman wOg]m~
+wohl wOl
+wohler wOlP
+wohlers wOlPz
+wohlfarth wOlforT
+wohlfeil wOlfIl
+wohlford wOlfPd
+wohlgemuth wOlg}UT
+wohlstetter wOlstetP
+wohlwend wOlwcnd
+woitschatzke w<CatskE
+wojahn wOhon
+wojciak w<C/ak
+wojcicki w<Citsk/
+wojciech v<Cck
+wojciech w<Cck
+wojciechowski w<C@h{fsk/
+wojcik w<C6k
+wojdyla w<dil@
+wojick w<C6k
+wojnar w<nP
+wojnarowski w<nP?sk/
+wojnilower w<n@lOP
+wojnowski w<n?sk/
+wojtas w<t@s
+wojtaszek w<toSck
+wojtkiewicz w<tk@v6C
+wojtkowski w<tk?sk/
+wojtowicz w<t@v6C
+wok wok
+woke wOk
+woken wOk~
+wola wOl@
+wolak wOl@k
+wolanin wol~in
+wolanski v@lansk/
+wolaver wol@vP
+wolber wOlbP
+wolbert wOlbPt
+wolcott wOlk@t
+wold wOld
+wolden wOld~
+woldt wOlt
+wolenzac wOl~zak
+wolenzac's wOl~zaks
+wolf wqlf
+wolf's wqlfs
+wolfarth wqlforT
+wolfe wqlf
+wolfe's wqlfs
+wolfenbarger wqlf~borgP
+wolfenden wqlfend~
+wolfenschmidt wqlf~Smit
+wolfensohn wqlf~s~
+wolfer wqlfP
+wolfert wqlfPt
+wolff wqlf
+wolfgang wqlfgaN
+wolfgram wqlfgram
+wolfinbarger wqlf~borgP
+wolfinger wqlf6NP
+wolfley wqlfl/
+wolfman wqlfm~
+wolford wOlfPd
+wolfram wqlfram
+wolfrey wqlfr/
+wolfrom wqlfr}
+wolfrum wqlfr}
+wolfsburg wqlfsbPg
+wolfson wqlfs~
+wolgamott wOlg}ot
+wolgast wOlg@st
+wolgemuth wOlg}UT
+wolin wOlin
+wolinski v@linsk/
+wolinsky v@linsk/
+wolitarsky wOl@t)rsk/
+wolk wOk
+wolke wOlk
+wolken wOk~
+wolken w{lk~
+wolkoff wOlk{f
+woll wol
+wollack wol@k
+wollaeger w@lAgP
+wollam wol}
+wollard wolPd
+wolle wol
+wollen wol~
+wollenberg wol~bPg
+wollenweber wol~wcbP
+woller wolP
+wollin wolin
+wollman wolm~
+wollner wolnP
+wollschlager wolSlAgP
+wolman wolm~
+wolohan wol@han
+woloszyn v@loS~
+wolpe wOlp/
+wolper wOlpP
+wolpert wOlpPt
+wolrath wOlraT
+wolsey wOls/
+wolsfeld wOlzfeld
+wolske wOlsk
+wolski vOlsk/
+wolsky vOlsk/
+wolstenholme wOlst~h]lm
+wolter wOltP
+wolters wOltPz
+woltman wOltm~
+woltz wOlts
+wolven wqlv~
+wolverine wqlvPEn
+wolverine's wqlvPEnz
+wolverton wqlvVt~
+wolves wqlvz
+wolz wOlz
+womac wOm@k
+womack wOmak
+woman wqm~
+woman's wqm~z
+womanhood wqm~hqd
+womanize wqm~Iz
+womanizer wqm~IzP
+womanizing wqm~Iz6N
+womb wUm
+wombacher wombokP
+wombat wombat
+wombats wombats
+womble womb@l
+wombles womb@lz
+women wim~
+women's wim~z
+womens' wim~z
+womer wOmP
+wometco w]metk]
+wommack wom@k
+won won
+won wun
+won't wOnt
+wonda wond@
+wonder wundP
+wonder's wundPz
+wondered wundPd
+wonderful wundPf@l
+wonderfully wundPf@l/
+wonderfully wundPfl/
+wonderfulness wundPf@ln@s
+wondering wundP6N
+wonderland wundPland
+wonderly wundPl/
+wonderment wundPm~t
+wonders wundPz
+wondra wondr@
+wondrous wundr@s
+wong w{N
+wong's w{Nz
+wonk wonk
+wonks wonks
+wonksahachee wonks@haC/
+wonnacott wun@kot
+wont wOnt
+woo wU
+woo's wUz
+wood wqd
+wood's wqdz
+woodall wqd{l
+woodard wqdPd
+woodbeck wqdbek
+woodberry wqdber/
+woodbridge wqdbrij
+woodburn wqdbVn
+woodbury wqdber/
+woodby wqdb/
+woodcarver wqdkorvP
+woodcarvers wqdkorvPz
+woodchip wqdCip
+woodchips wqdCips
+woodchuck wqdCuk
+woodcliff wqdklif
+woodcock wqdkok
+woodcox wqdkoks
+wooddell wqd@l
+wooded wqd@d
+woodell wqd@l
+wooden wqd~
+woodfield wqdfEld
+woodfill wqdfil
+woodfin wqdfin
+woodford wqdfPd
+woodfork wqdfPk
+woodhall wqdh{l
+woodham wqdh}
+woodhams wqdh}z
+woodhead wqdhed
+woodhouse wqdh?s
+woodhull wqdhul
+woodie wqd/
+woodin wqdin
+wooding wqd6N
+woodington wqd6Nt~
+woodis wqdis
+woodke wqdk/
+woodland wqdland
+woodland wqdl~d
+woodlands wqdlandz
+woodlands wqdl~dz
+woodle wqd@l
+woodlee wqdlE
+woodley wqdl/
+woodlief wqdlEf
+woodliff wqdlif
+woodling wqdl6N
+woodlock wqdlok
+woodlot wqdlot
+woodmac wqdmak
+woodman wqdm~
+woodmansee wqdm~sE
+woodpecker wqdpekP
+woodpeckers wqdpekPz
+woodrich wqdriC
+woodrick wqdr6k
+woodring wqdriN
+woodrome wqdr}
+woodroof wqdrUf
+woodrow wqdrO
+woodruff wqdr@f
+woodrum wqdr}
+woods wqdz
+woodshed wqdSed
+woodside wqdsId
+woodsmall wqdsm{l
+woodsman wqdzman
+woodsmen wqdzm~
+woodsmen's wqdzm~z
+woodson wqds~
+woodstock wqdstok
+woodstream wqdstrEm
+woodward wqdwPd
+woodward wqdw{rd
+woodward's wqdwPdz
+woodwind wqdwind
+woodwinds wqdwindz
+woodwork wqdwVk
+woodworker wqdwVkP
+woodworkers wqdwVkPz
+woodworking wqdwVk6N
+woodworth wqdwVT
+woody wqd/
+woody's wqd/z
+woodyard wqdyord
+wooed wUd
+woof wUf
+woofter wUftP
+woogie wUg/
+wooing wU6N
+wool wql
+woolard wqlPd
+woolbright wqlbrIt
+woolco wqlkO
+woolcock wqlkok
+wooldridge wqldr6j
+woolen wql~
+woolens wql~z
+woolery wqlP/
+woolever wqlevP
+wooley wql/
+woolf wqlf
+woolfolk wqlfOk
+woolford wqlfPd
+woolfork wqlf{rk
+woollard wqlPd
+woollcott wqlkot
+woollen wql~
+woolley wql/
+woolly wql/
+woolman wqlm~
+woolridge wqlrij
+wools wqlz
+woolsey wqlz/
+woolsey's wqlz/z
+woolson wqls~
+woolston wqlst~
+woolum wql}
+woolums wql}z
+woolverton wqlvPt~
+woolwine wqlwIn
+woolworth wqlwVT
+woolworth's wqlwVTs
+wooly wql/
+woomer wUmP
+woong wUN
+woos wUz
+woosley wUzl/
+wooster wUstP
+wootan wUt~
+wooten wUt~
+wooters wUtPz
+wooton wUt~
+wootten wUt~
+wootton wUt~
+woozy wUz/
+wop wop
+wops wops
+wor dub@yUO)r
+wor dubclyUO)r
+wor w{r
+worcester wqstP
+word wVd
+word's wVdz
+worded wVd@d
+wordell wVd@l
+worden wVd~
+wording wVd6N
+wordless wVdl@s
+wordperfect wVdpVfckt
+words wVdz
+wordsmith wVdsmiT
+wordstar wVdstor
+wordsworth wVdzwPT
+wordy wVd/
+wore w{r
+work wVk
+work's wVks
+workable wVk@b@l
+workaday wVk@dA
+workaholic wVk@hol6k
+workaholics wVk@hol6ks
+workbench wVkbenC
+workday wVkdA
+workdays wVkdAz
+worked wVkt
+worker wVkP
+worker's wVkPz
+workers wVkPz
+workers' wVkPz
+workfare wVkfer
+workforce wVkf{rs
+workgroup wVkgrUp
+workgroups wVkgrUps
+workhorse wVkh{rs
+workhorses wVkh{rs@z
+workin' wVk~
+working wVk6N
+workinger wVk6NP
+workings wVk6Nz
+workload wVklOd
+workloads wVklOdz
+workman wVkm~
+workman's wVkm~z
+workmanlike wVkmanlIk
+workmanship wVkm~Sip
+workmen wVkmcn
+workmen's wVkm~z
+workout wVk?t
+workouts wVk?ts
+workplace wVkplAs
+workplaces wVkplAs@z
+workroom wVkrUm
+works wVks
+works' wVks
+worksheet wVkSEt
+worksheets wVkSEts
+workshop wVkSop
+workshops wVkSops
+workstation wVkstAS~
+workstations wVkstAS~z
+workweek wVkwEk
+workweeks wVkwEks
+worland wVl~d
+worlco wVlk]
+world wVld
+world's wVldz
+worldcom wVldkom
+worldcorp wVldk{rp
+worlder wVldP
+worlders wVldPz
+worldliness wVldl/n@s
+worldly wVldl/
+worldnews wVldnUz
+worldpass wVldpas
+worlds wVldz
+worldscope wVldskOp
+worldspan wVldspan
+worldvision wVldviZ~
+worldwide wVldwId
+worldwide's wVldwIdz
+worley wVl/
+worm wVm
+worm's wVmz
+worman wVm~
+wormington wVm6Nt~
+wormley wVml/
+wormlike wVmlIk
+worms wVmz
+wormser wVmzP
+wormuth wVmUT
+wormwood wVmwqd
+worn w{rn
+worner w{rnP
+woronoff w{r~{f
+worrall wVr@l
+worrel wVr@l
+worrell wVr@l
+worried wV/d
+worrier wV/P
+worriers wV/Pz
+worries wV/z
+worrisome wV/s}
+worry wV/
+worrying wV/6N
+worse wVs
+worseck wVsck
+worseck w{rsck
+worsen wVs~
+worsened wVs~d
+worsening wVsn6N
+worsening wVs~6N
+worsens wVs~z
+worsham wVS}
+worship wVS@p
+worshiped wVS@pt
+worshiper wVS@pP
+worshipers wVS@pPz
+worshipful wVS@pf@l
+worshipped wVS@pt
+worshipping wVS@p6N
+worships wVS@ps
+worsley wVsl/
+worst wVst
+worsted wVst@d
+worstell wVst@l
+worster wVstP
+worth wVT
+worth's wVTs
+wortham wVT}
+worthen wVT~
+worthen's wVT~z
+worthey wVT/
+worthier wVT/P
+worthies wVT/z
+worthiest wVT/@st
+worthiness wVT/n@s
+worthing wVT6N
+worthington wVT6Nt~
+worthless wVTl@s
+worthley wVTl/
+worthman wVTm~
+worths wVTs
+worthwhile wVTwIl
+worthy wVT/
+wortley wVtl/
+wortman wVtm~
+wortmann wVtm~
+worton wVt~
+worts wVts
+wotan wOt~
+wotherspoon w@TPspUn
+wotring wotP6N
+wotton wot~
+wouk wOk
+wouk wUk
+would wqd
+would've wqd@v
+wouldn't wqd~t
+woulfe w?lf
+wound w?nd
+wound wUnd
+wounded wUnd@d
+wounding wUnd6N
+wounds wUndz
+wouters w?tPz
+wove wOv
+woven wOv~
+wow w?
+wow's w?z
+wowed w?d
+wowie w?/
+wowing w?6N
+wows w?z
+woy w<
+wozniak vozn/ak
+woznick wozn6k
+woznicki v@znitsk/
+wozny wozn/
+wrack rak
+wracked rakt
+wracking rak6N
+wrage rAj
+wragg rag
+wrangell raNg@l
+wrangle raNg@l
+wrangled raNg@ld
+wrangler raNg@lP
+wranglers raNg@lPz
+wrangles raNg@lz
+wrangling raNg@l6N
+wrangling raNgl6N
+wrap rap
+wrapped rapt
+wrapper rapP
+wrappers rapPz
+wrapping rap6N
+wraps raps
+wrapup rap@p
+wrath raT
+wrather raTP
+wray rA
+wreak rEk
+wreaked rEkt
+wreaking rEk6N
+wreaks rEks
+wreath rET
+wreaths rETs
+wreaths rETz
+wreck rek
+wreckage rek@j
+wrecked rekt
+wrecker rekP
+wrecking rek6N
+wrecks reks
+wrede rEd
+wren ren
+wrench renC
+wrenched renCt
+wrenches renC@z
+wrenching renC6N
+wrenn ren
+wrest rest
+wrested rest@d
+wresting rest6N
+wrestle res@l
+wrestled res@ld
+wrestler res@lP
+wrestler reslP
+wrestlers res@lPz
+wrestlers reslPz
+wrestles res@lz
+wrestling res@l6N
+wrestling resl6N
+wretched reC@d
+wretchedly reC@dl/
+wrice rIs
+wriggle rig@l
+wright rIt
+wright's rIts
+wrights rIts
+wrightsman rItsm~
+wrightson rIts~
+wrigley rigl/
+wrigley's rigl/z
+wring riN
+wringer riNP
+wringing riN6N
+wrinkle riNk@l
+wrinkled riNk@ld
+wrinkles riNk@lz
+wrinkling riNk@l6N
+wrinkling riNkl6N
+wrisley rizl/
+wrist rist
+wriston rist~
+wrists rists
+wristwatch ristwoC
+wristwatches ristwoC@z
+writ rit
+write rIt
+writedown rItd?n
+writedowns rItd?nz
+writeoff rIt{f
+writeoffs rIt{fs
+writer rItP
+writer's rItPz
+writers rItPz
+writers' rItPz
+writes rIts
+writhe riT
+writhing rIT6N
+writhing riT6N
+writing rIt6N
+writings rIt6Nz
+writs rits
+written rit~
+wrobel rOb@l
+wrobleski r@blesk/
+wroblewski r@blUfsk/
+wroclaw rokl{
+wroe rO
+wrona rOn@
+wrong r{N
+wrongdoer r{NdUP
+wrongdoers r{NdUPz
+wrongdoing r{NdU6N
+wrongdoings r{NdU6Nz
+wronged r{Nd
+wrongful r{Nf@l
+wrongfully r{Nf@l/
+wrongheaded r{Nhed@d
+wrongly r{Nl/
+wrongs r{Nz
+wronski ronsk/
+wrote rOt
+wroten rOt~
+wrought r{t
+wrubel rUb@l
+wruck ruk
+wrung ruN
+wry rI
+wrye rI
+wryly rIl/
+wryness rIn@s
+wrzesinski r@z@sinsk/
+ws dub@lyUes
+ws duby@es
+wu dub@lyUyU
+wu duby@yU
+wu wU
+wu's wUz
+wubben wub~
+wuellner wqlnP
+wuensch wqnS
+wuerth wqrT
+wuerttemberg wVt}bPg
+wuertz wqrts
+wuest wU@st
+wuhan wU~
+wujcik wujs6k
+wulf wqlf
+wulff wqlf
+wuli wUl/
+wuliger wUl6gP
+wunder wundP
+wunderkind wundPkInd
+wunderkind wundPkind
+wunderle wundPl/
+wunderlich wundPl6k
+wunderlin wundPlin
+wunsch wunS
+wunschel wunS@l
+wurdeman wVdm~
+wurl wVl
+wurlitzer wVl@tsP
+wurm wVm
+wurst wVst
+wurster wVstP
+wursthaus wVsth?s
+wurth wVT
+wurtman wVtm~
+wurtz wVts
+wurtzel wVtz@l
+wurz wVz
+wurzel wVz@l
+wurzer wVzP
+wuss wus
+wussler wuslP
+wussow wus]
+wuthering wuTP6N
+wuthrich wuTr6k
+wuttke wutk/
+wuxi wuks/
+wuyda w<d@
+wy dub@lyUwI
+wy wA
+wyand wI~d
+wyant wI~t
+wyatt wI@t
+wyatt's wI@ts
+wyble wIb@l
+wyborn vibPn
+wyche wIC
+wyckoff wik{f
+wycliff wiklif
+wycoff wik{f
+wyden wId
+wyden wId~
+wydra wIdr@
+wye wI
+wyer wIP
+wyers wIPz
+wyeth wIcT
+wyffels wif@lz
+wygal wIg@l
+wygant wIg~t
+wygod wIgod
+wyk wik
+wyka vik@
+wyke wIk
+wykes wIks
+wykle wIk@l
+wykoff wik{f
+wyland wIl~d
+wylde wIld
+wyle wIl
+wyler wIlP
+wyles wIlz
+wylie wIl/
+wyllie wil/
+wylma wIlm@
+wyly wIl/
+wyman wIm~
+wymer wImP
+wymore wIm{r
+wyndham wind}
+wyne wIn
+wyner wInP
+wynes wInz
+wynette hwinet
+wynette winet
+wyngaarden wingord~
+wynia win/@
+wynkoop wiNkUp
+wynn win
+wynn's winz
+wynne win
+wynns winz
+wynona hwInOn@
+wynona wInOn@
+wynter wintP
+wynton wint~
+wynyard winyPd
+wyoming wIOm6N
+wyoming's wIOm6Nz
+wyre wIr
+wyrick wir6k
+wyse wIz
+wyse's wIz@z
+wyser wIzP
+wysocki visOtsk/
+wysong wis{N
+wyss wis
+wyszynski viSinsk/
+wythe wIT
+x eks
+x's eks@z
+x-ray eksrA
+x-rays eksrAz
+x. aks
+x. eks
+x.'s eks@z
+x.ers eksPz
+x.s eks@z
+xanax zanaks
+xanthe zanT
+xantippe zantip
+xaver zAvP
+xavier zAvyP
+xaviera 6gzAvy,r@
+xebec zeb@k
+xena zEn@
+xene zEn
+xenia zEn/@
+xenon zEnon
+xenophobia zen@fOb/@
+xenophobic zen@fob6k
+xenophon zen@f~
+xenos zEn]z
+xeriscape z,r@skAp
+xerox ziroks
+xerox's ziroks@z
+xeroxed zirokst
+xeroxes ziroks@z
+xeroxing ziroks6N
+xers eksE)rcs
+xers ekscrz
+xers ks,rz
+xerxes zVks/z
+xi SE
+xiamen z/Am~
+xian zyon
+xiao Z?
+xiaogang Z?gaN
+xiaoping Z?piN
+xiaoping's Z?piNz
+xiaoyun S?yUn
+xicor zIk{r
+xidex zid@ks
+xie zE
+xilinx zIliNks
+xing SiN
+xinhua zinhyU@
+xinjiang zinj/aN
+xiong Z{N
+xoma 6gzOm@
+xoma cksOm@
+xoma zOm@
+xoma's 6gzOm@z
+xoma's cksOm@z
+xoma's zOm@z
+xscribe ckskrIb
+xtra ekstr@
+xu zU
+xuan Zwon
+xudong ZwAd{N
+xudong zUd{N
+xue zU
+xuedong zUd{N
+xuemei zUmI
+xus zus
+xylia zIl/@
+xylina zIlin@
+xylogic zIloj6k
+xylogics zIloj6ks
+xylon zIl~
+xylona zIl~@
+xylophone zIl@fOn
+xyvision zIviZ~
+y wI
+y'all y{l
+y's wIz
+y. wI
+y.'s wIz
+ya yo
+ya'll yol
+yaacov yokOv
+yabba yab@
+yablon yabl~
+yablonski y@blonsk/
+yablonsky y@blonsk/
+yacht yot
+yachter yotP
+yachters yotPz
+yachting yot6N
+yachting's yot6Nz
+yachts yots
+yachtsman yotsm~
+yack yak
+yackel yak@l
+yackley yakl/
+yacko yak]
+yacktman yaktm~
+yacono yak~]
+yacos yok]s
+yacoub yak?b
+yaden yAd~
+yadon yad~
+yaeger yEjP
+yaffe yaf
+yager yAjP
+yagi yog/
+yagoda y@gOd@
+yah yo
+yahi yoh/
+yahn yan
+yahnke yaNk
+yahoo yohU
+yahoos yohUz
+yahr y)r
+yahweh yowe
+yahya yuy@
+yak yak
+yake yAk
+yakel yak@l
+yakima yak}@
+yaklin yaklin
+yakov yok{v
+yakovlev y@kovl@v
+yakovlev yok@vlcv
+yakusa y@kUz@
+yakutakay y@hUt@kA
+yale yAl
+yale's yAlz
+yalin yolin
+yalta y{lt@
+yam yam
+yamada y}od@
+yamagata yomogot@
+yamaguchi yomogUC/
+yamaha yomoho
+yamaichi yomoEC/
+yamaichi's yomoEC/z
+yamamoto yomomOt]
+yamanaka yomonok@
+yamane yomonA
+yamane y}on/
+yamani yomon/
+yamanouchi yomonUC/
+yamasaki yomosok/
+yamashiro yomoSir]
+yamashita yomoSEt@
+yamatake yomotokA
+yamato yomot]
+yamauchi yomoUC/
+yamauchi's yomoUC/z
+yamazaki yomozok/
+yamin yamin
+yams yamz
+yan yan
+yan-bin yonbin
+yanbu yanbU
+yancey yans/
+yancy yans/
+yanda yand@
+yandell yand@l
+yandle yand@l
+yandow yand]
+yanes yAnz
+yaney yAn/
+yanez yancz
+yang yaN
+yangsheng yoNSeN
+yangtze yaNktsE
+yani yon/
+yanick yan6k
+yanik yan6k
+yanis yan@s
+yanish yan6S
+yank yaNk
+yankass yaNkas
+yanke yaNk
+yanked yaNkt
+yankee yaNk/
+yankee's yaNk/z
+yankees yaNk/z
+yankees' yaNk/z
+yankelovich yaNkel@v6C
+yankey yaNk/
+yanking yaNk6N
+yanko yaNk]
+yankovich yaNk@v6C
+yankowski y@Nk{fsk/
+yanks yaNks
+yanni yan/
+yannick yan6k
+yannone yan~
+yannuzzi yonUts/
+yano yon]
+yanofsky y~ofsk/
+yanomami yan]mam/
+yanomami yon]mom/
+yant yant
+yantis yantis
+yantz yants
+yao y?
+yaobang y?baN
+yaohan y?hon
+yap yap
+yaple yAp@l
+yapp yap
+yaps yaps
+yarber y)rbP
+yarberry y)rber/
+yarboro y)rbP]
+yarborough y)rbV]
+yarbough y)rb?
+yarbro y)rbr]
+yarbrough y)rbP]
+yarchoan yorCOn
+yard y)rd
+yard's y)rdz
+yardage y)rd6j
+yarde y)rd
+yardeni yordEn/
+yarder y)rdP
+yardley y)rdl/
+yards y)rdz
+yardstick y)rdstik
+yardsticks y)rdstiks
+yarger y)rjP
+yarling y)rl6N
+yarmulke y)rm@k@
+yarmulke y)rmulk@
+yarmulkes y)rm@k@s
+yarmulkes y)rmulk@s
+yarn y)rn
+yarnall y)rn@l
+yarnell y)rn@l
+yarns y)rnz
+yaron y,r~
+yaros y,r]z
+yarosh yaruS
+yarrington yar6Nt~
+yarrow y)r]
+yarrow y,r]
+yarwood y)rwqd
+yasin yasin
+yasir yosP
+yasir yosir
+yasmin yazmin
+yasmine yazmin
+yass yas
+yasser yasP
+yasser yosP
+yasser's yasPz
+yasser's yosPz
+yassin yasin
+yassir yas6r
+yassir yos6r
+yassir's yas6rz
+yassir's yos6rz
+yasso yos]
+yassukovich y@sUk@v6C
+yastrow yastr]
+yasuda yosUd@
+yasuhiko yosUhEk]
+yasuhiro yosUhEr]
+yasunori yosUn{r/
+yasuo yosU]
+yasushi yosUS/
+yasutaka yosUtok@
+yasuyoshi yosUyOS/
+yater yAtP
+yates yAts
+yatsko yotsk]
+yau yO
+yauch y{C
+yauger y{jP
+yaun y{n
+yaupon y{p~
+yaupons y{p~z
+yavlinsky yavlinsk/
+yaw y{
+yawn y{n
+yawned y{nd
+yawner y{nP
+yawning y{n6N
+yawns y{nz
+yaworski y@wVsk/
+yax yaks
+yay yA
+yazov yazov
+yazov yoz{v
+yazzie yaz/
+ybanez /bancz
+ybarbo /b)rb]
+ybarra /b)r@
+ydstie idst/
+ydstie yidst/
+ydstie's idst/z
+ydstie's yidst/z
+ye yE
+ye ye
+ye-yi yAyE
+yea yA
+yeadon yed~
+yeager yAgP
+yeagle yEg@l
+yeagley yEgl/
+yeah ya
+yeakel yEk@l
+yeakey yEk/
+yeakle yEk@l
+yeakley yEkl/
+yeaman yEm~
+yeamans yEm~z
+year yir
+year's yirz
+yearago yir@g]
+yearbook yirbqk
+yearbooks yirbqks
+yearby yVb/
+yearearlier yirVlyP
+yearend yirend
+yeargain yigAn
+yeargan yVg~
+yeargin yVjin
+yearick yir6k
+yearling yil6N
+yearlings yil6Nz
+yearlong yirl{N
+yearly yirl/
+yearn yVn
+yearned yVnd
+yearning yVn6N
+yearnings yVn6Nz
+yearns yVnz
+yearout yir?t
+years yPz
+years yirz
+years' yirz
+yearsley yVsl/
+yearwood yirwqd
+yeary yir/
+yeas yAz
+yeas yEs
+yeas yEz
+yeast yEst
+yeasts yEsts
+yeater yEtP
+yeates yEAts
+yeatman yEtm~
+yeaton yEt~
+yeats yAts
+yeatts yEts
+yeazel yEz@l
+yeck yek
+yeckley yekl/
+yedda yed@
+yedinak yed~ak
+yediyat yed@yat
+yee yE
+yegor yAgP
+yeh ye
+yehiya y@hE@
+yehle yeh@l
+yehuda y@hUd@
+yehudi yAhUd/
+yeiri y,r/
+yeiser yEsP
+yeisley yEsl/
+yekaterinburg yckatPEnb@rg
+yeldell yeld@l
+yelena yelin@
+yell yel
+yelland yel~d
+yelle yel
+yelled yeld
+yellen yel~
+yellin yelin
+yellin' yel~
+yelling yel6N
+yellow yel]
+yellower yel]P
+yellowest yel]@st
+yellowing yel]6N
+yellowish yel]6S
+yellowknife yel]nIf
+yellows yel]z
+yellowstone yel]stOn
+yellowstone's yel]stOnz
+yells yelz
+yelton yelt~
+yeltsin yelts~
+yeltsin's yelts~z
+yelverton yelvPt~
+yelvington yelv6Nt~
+yemen yem~
+yemen's yem~z
+yemeni ycmEn/
+yemeni yem~/
+yemenidjian yem~ij/~
+yen yen
+yen's yenz
+yenching yenCiN
+yender yendP
+yenlu yenlU
+yentl yent@l
+yeo yE]
+yeoman yOm~
+yeomans yOm~z
+yeosock y]s{k
+yep yep
+yepez yepcz
+yepsen yepscn
+yerby yVb/
+yerdon yVd~
+yerena y,rcn@
+yerevan y,r@v~
+yerger yVjP
+yergin yVg~
+yerian yEr/~
+yerke yVk
+yerkes yVk/z
+yerkey yVk/
+yerman yVm~
+yerxa yVks@
+yes yes
+yeses yes@z
+yeshiva y6SEv@
+yeske yesk
+yessuey yesU/
+yesterday yestPd/
+yesterday yestPdA
+yesterday's yestPd/z
+yesterday's yestPdAz
+yesterdays yestPd/z
+yesterdays yestPdAz
+yesteryear yestPyir
+yet yet
+yetman yetm~
+yetnikoff yetn6k{f
+yett yet
+yetta yet@
+yetter yetP
+yeung yUN
+yeutter yUtP
+yevette y6vet
+yevgeny yevgen/
+yevlinsky ycvlinsk/
+yevlinsky's ycvlinsk/z
+yevtushenko yevt6SeNk]
+yew yU
+yew's yUz
+yglesias /glAs/@s
+yi yE
+yiddish yid6S
+yie yE
+yie yI
+yield yEld
+yielded yEld@d
+yielding yEld6N
+yields yEldz
+yigal y/gol
+yigal y6gal
+yigal y6gol
+yilin yilin
+yim yim
+yin yin
+ying yiN
+yinger yiNP
+yingling yiNg@l6N
+yingst yiNkst
+yip yip
+yippee yipE
+yirng-an yirNon
+yitzhak yitsak
+yitzhak yitsok
+ylvisaker yilv@sokP
+ynez ynez
+yniguez /nEgcz
+ynjiun yinj/Un
+ynjiun yinjin
+yo yO
+yoak yOk
+yoakam yOk}
+yoakum yOk}
+yoast yOst
+yocam yOk}
+yocham yoC}
+yochelson yOCcls~
+yochelson yOkcls~
+yochim yoC}
+yochum yoC}
+yochum yok}
+yockey yok/
+yocom yOk}
+yocum yOk}
+yodel yOd@l
+yodeling yOd@l6N
+yoder yOdP
+yodice yOd@s
+yoe yO
+yoes yOz
+yoest yest
+yoest y{st
+yoffie y{f/
+yoga yOg@
+yogi yOg/
+yogiism yOgiz}
+yogiisms yOgiz}z
+yogurt yOgPt
+yoh yO
+yohe yOhA
+yohei yOhA
+yohn yon
+yoho yOh]
+yoichi y]EC/
+yokado y@kod]
+yoke yOk
+yoked yOkt
+yokel yOkcl
+yokelson yOkcls~
+yokes yOks
+yokich yOk6C
+yokley yokl/
+yoko yOk]
+yokohama yOk@hom@
+yokokohji yOk]kOj/
+yokota y]kOt@
+yokoyama yOk]yom@
+yokum yOk}
+yola yOl@
+yolanda y]lond@
+yolande yOl~d
+yolk yOk
+yolks yOks
+yom yOm
+yom yom
+yom's yomz
+yomiuri yOmEP/
+yon yon
+yona yOn@
+yonan yOn~
+yonce yons
+yonder yondP
+yoneyama yOn/om@
+yong y{N
+yongbyon y{Nby{n
+yongbyon's y{Nby{nz
+yongue yoNg
+yonhap yonhap
+yonke yoNk
+yonker yoNkP
+yonkers yoNkPz
+yonsei yunsA
+yonts yonts
+yontz yonts
+yoo yU
+yoon yUn
+yoor yUr
+yoor's yUrz
+yoos yUz
+yopp yop
+yoram y{r}
+yorba y{rb@
+yordy y{rd/
+yore y{r
+yorich y{r6C
+yorio y{ry]
+york y{rk
+york's y{rks
+yorkbased y{rkbAst
+yorke y{rk
+yorker y{rkP
+yorker's y{rkPz
+yorkers y{rkPz
+yorks y{rks
+yorkshire y{rkSP
+yorktown y{rkt?n
+yorktown's y{rkt?nz
+yorrick y{r6k
+yosef yOs@f
+yosemite y]sem@t/
+yoshi yOS/
+yoshiaki yOS/ok/
+yoshida y]SEd@
+yoshihara yOS@h)r@
+yoshihashi yOS@hoS/
+yoshihiro yOS@hErO
+yoshihiro's yOS@hErOz
+yoshihisa yOS@hEs@
+yoshikawa y]S/kow@
+yoshikazu yOS@kozU
+yoshimoto y]S/mOt]
+yoshimura yOS}Ur@
+yoshino y]SEn]
+yoshio y]SE]
+yoshioka yOS/Ok@
+yoshiro y]Sir]
+yoss y{s
+yossi yOs/
+yost yOst
+yother yuTP
+yott yot
+you yU
+you'd yUd
+you'd yqd
+you'll yUl
+you're yUr
+you're yqr
+you've yUv
+youell yoUl
+youghal yO@l
+youker y?kP
+youman yUm~
+youmans yUm~z
+youn yun
+younan yun~
+younce y?ns
+younes yunz
+young yuN
+young's yuNz
+youngberg yuNbPg
+youngblood yuNblud
+youngblut yuNbl@t
+youngdahl yuNdol
+younge yunj
+younger yuNgP
+youngerman yuNPm~
+youngers yuNgPz
+youngest yuNg@st
+younglove yuNluv
+youngman yuNman
+youngquist yuNkwist
+youngren yungrcn
+youngs yuNz
+youngster yuNstP
+youngster's yuNstPz
+youngsters yuNstPz
+youngsters' yuNstPz
+youngstown yuNzt?n
+youngstrom yuNstr}
+younis yunis
+younker yuNkP
+younkers yuNkPz
+younkers' yuNkPz
+younkin yuNkin
+younkins yuNkinz
+yount y?nt
+younts y?nts
+your yqr
+your y{r
+youree y{rE
+yours yPz
+yours yqrz
+yours y{rz
+yourself yPself
+yourself yqrself
+yourself y{rsclf
+yourselfer y{rselfP
+yourselfers y{rselfPz
+yourselves yqrselvz
+yourselves y{rsclvz
+youse y?s
+yousef yUscf
+yousef's yUscfs
+yousif y?sif
+youssef yUscf
+youth yUT
+youth's yUTs
+youthful yUTf@l
+youths yUTs
+youths yUTz
+youtsey y?ts/
+youtz y?ts
+youville yUvil
+yow y?
+yowell yowcl
+yoy y<
+yoyo yOy]
+yoyos yOy]z
+ypsilanti ips@lant/
+yquem Ekw}
+ysleta /slAt@
+yttrium itr/}
+yu yU
+yu's yUz
+yuan yUon
+yuan's yUonz
+yuba yUb@
+yucaipa yUkIp@
+yucatan yUk@tan
+yucca yuk@
+yuck yuk
+yucky yuk/
+yue yU
+yuen yUen
+yuen ywen
+yugo yUg]
+yugo's yUg]z
+yugos yUg]s
+yugoslav yUg]slov
+yugoslavia yUg]slov/@
+yugoslavia's yUg]slov/@z
+yugoslavian yUg]slov/~
+yugoslavs yUg]slavz
+yuhas yUh@z
+yuhasz yuhuS
+yuichi yUCE
+yuichi yUECE
+yuill yUl
+yuille yUl
+yuk yuk
+yukio yUkE]
+yuko yUk]
+yukon yUkon
+yuks yuks
+yul yul
+yule yUl
+yuletide yUltId
+yuli yUl/
+yum yum
+yuma yUm@
+yummies yum/z
+yummy yum/
+yun yun
+yunde yUndA
+yundt yundt
+yung yuN
+yunich yUn6C
+yunis yUnis
+yunk yuNk
+yunker yuNkP
+yup yup
+yuppie yup/
+yuppies yup/z
+yuppified yup@fId
+yuppify yup@fI
+yurachek yPaCck
+yurchak yV@k
+yurchak yVC@k
+yurchenko yPCeNk]
+yurek yqrck
+yuri yqr/
+yurick yqr6k
+yurko yVk]
+yurkovich yVk@v6C
+yurt yqrt
+yury yqr/
+yusef yUscf
+yusef's yUscfs
+yusen yUs~
+yusko yusk]
+yust yust
+yustef yUstcf
+yutaka yUtok@
+yutzy yutz/
+yuval yUv@l
+yuzong yUz{N
+yves Ev
+yvette 6vet
+yvonne 6von
+yvonne's 6vonz
+yzaguirre /z@gwIP
+z zE
+z's zEz
+z. zE
+z.'s zEz
+zabala zobol@
+zabar's zaborz
+zabawa zobow@
+zabel zAb@l
+zabielski z@bElsk/
+zabinski z@binsk/
+zablocki z@blOtsk/
+zaborowski z@bP{fsk/
+zabows zAb]z
+zabowski z@b?sk/
+zabriskie zabrisk/
+zacarias zokorE@z
+zaccagnini zok@gnEn/
+zaccagnino zok@gnEn]
+zaccardi zok)rd/
+zaccaria zok)r/@
+zaccaro zok)r]
+zaccheus zak<z
+zaccone zokOn/
+zacek zoCek
+zach zak
+zachar z@k)r
+zachariah zakPI@
+zacharias zakPI@s
+zachary zakP/
+zacher zakP
+zachery zakP/
+zachi zoC/
+zachi zok/
+zachman zakm~
+zachmann zokm~
+zachow zok]
+zachry zokr/
+zack zak
+zack's zaks
+zackery zakP/
+zacks zaks
+zada zod@
+zadar z@d)r
+zadar zAdor
+zadeh zode
+zadillo z@dil]
+zadoc zod@k
+zadok zod@k
+zadora z@d{r@
+zadrozny z@drOzn/
+zaentz zants
+zaffino zofEn]
+zaffuto z@fUt]
+zaftig zaft6g
+zaftig's zaft6gz
+zag zag
+zagar zog)r
+zagat zag@t
+zagel zAg@l
+zager zAgP
+zagged zagd
+zagha zog@
+zagladin zagl@d~
+zagorski z@g{rsk/
+zagreb zogreb
+zagreb's zogrebz
+zags zagz
+zagury zagyP/
+zaher zAP
+zahir z@hir
+zahler zolP
+zahm zam
+zahn zan
+zahner zonP
+zahniser zonIzP
+zahnow zon]
+zahradnik zPadn6k
+zaibatsu zAbatsU
+zaid zAd
+zaino zAn]
+zaire zIir
+zaire's zIirz
+zairean zIir~
+zairean's zIir~z
+zaireans zIir~z
+zairian zIir/~
+zairian's zIir/~z
+zairians zIir/~z
+zaiser zIsP
+zaitech zAtek
+zaitsev zAtscv
+zaitsev's zAtscvz
+zaitz zAts
+zajac zI@k
+zajdel zajd@l
+zajic zaj6k
+zajicek zI6Cck
+zajkowski zIk{fsk/
+zak zak
+zakarian z@k,r/~
+zakharov zakPov
+zaki zok/
+zakrajsek z@krIsck
+zakrzewski zokPzUsk/
+zalar zol)r
+zalay z@lA
+zaldivar zold/v)r
+zale zAl
+zale's zAlz
+zalenski z@lensk/
+zaleski z@lesk/
+zalesky z@lesk/
+zalewski z@lefsk/
+zaley zAl/
+zaley's zAl/z
+zalm zom
+zalman zolm~
+zaloudek zal?d6k
+zalygin zal@g~
+zaman zAm~
+zamarello zamPel]
+zamarripa zomorEp@
+zamarron zomor{n
+zambelli zombel/
+zambia zamb/@
+zambia's zamb/@z
+zambian zamb/~
+zambito zombEt]
+zambo zamb]
+zamboanga zambONg@
+zambrana zombran@
+zambrano zambran]
+zambrano zombron]
+zamfir zamfir
+zammit zamit
+zamora z}{r@
+zamorano zom{ron]
+zampedri zompedr/
+zampino zompEn]
+zamudio zomUd/]
+zamzow zamz]
+zanca zaNk@
+zander zandP
+zanders zandPz
+zandi zand/
+zandi zond/
+zandra zandr@
+zandstra zandstr@
+zandt zant
+zandy zand/
+zandy's zand/z
+zane zAn
+zanella z~el@
+zaneta zonet@
+zang zaN
+zangara zoNg)r@
+zangari zoNg)r/
+zanger zaNP
+zanghi zong/
+zani zon/
+zaniest zAn/@st
+zaniewski zan/efsk/
+zaniewski z~Ufsk/
+zank zaNk
+zanni zan/
+zanoni zonOn/
+zanoyan z~<~
+zant zant
+zantac zantak
+zanu zonU
+zanuck zan@k
+zanussi z~Us/
+zany zAn/
+zanzibar zanz@bor
+zap zap
+zapalac z@pol@k
+zapata zopot@
+zapatista zop@tEst@
+zapatista's zop@tEst@z
+zapatistas zop@tEst@z
+zapf zapf
+zapien zap/n
+zapmail zapmAl
+zapp zap
+zappa zap@
+zappa's zap@z
+zappala zopol@
+zapped zapt
+zappia zap/@
+zapping zap6N
+zappone zopOn/
+zappulla zopUl@
+zapruder z@prUdP
+zaps zaps
+zara zar@
+zaragoza zorogOz@
+zarah zar@
+zarate z)rAt
+zarb z)rb
+zarcone zorkOn/
+zared z,rd
+zarek z)rck
+zarella z@rel@
+zaremba zoremb@
+zaremski zPesk/
+zaretsky zPetsk/
+zarett z,r@t
+zaria z)r/@
+zaring z,r6N
+zarlengo zorlANg]
+zarling z)rl6N
+zaro zar]
+zarr zar
+zarrella zorel@
+zarro z)r]
+zarroli zPOl/
+zarroli's zPOl/z
+zartman z)rtm~
+zaruba zPUb@
+zary z)r/
+zarzecki zorzek/
+zarzycki zPzitsk/
+zasada zosod@
+zaske zAsk
+zaslavskaya zasl@vskI@
+zaslow zosl]
+zastrow zastr]
+zaucha z?h@
+zaugg z{g
+zaun z{n
+zauner z{nP
+zavada zovod@
+zavadil zovodEl
+zavala zovol@
+zavery zAvP/
+zavodnik z@vodn6k
+zavodny z@vodn/
+zawacki zovotsk/
+zawada zowod@
+zawadzki zovojk/
+zawislak zovisl@k
+zawistowski zov@st{fsk/
+zayac zI@k
+zayas zAoz
+zayed zA@d
+zayre zAr
+zayre's zAPz
+zazueta zozwet@
+zbig zbig
+zbigniew zbignU
+zbikowski zb6k?sk/
+zbinden zbInd~
+zdrojewski zdr<Usk/
+ze zE
+zea zE
+zeagler zEglP
+zeal zEl
+zealand zEl~d
+zealand's zEl~dz
+zealander zEl~dP
+zealanders zEl~dPz
+zealot zel@t
+zealotry zel@tr/
+zealots zel@ts
+zealous zel@s
+zealously zEl@sl/
+zealously zel@sl/
+zebell zEbcl
+zebley zebl/
+zebra zEbr@
+zebras zEbr@z
+zebrowski z@br{fsk/
+zebulon zEb@l~
+zecca zek@
+zech zek
+zecher zekP
+zechman zekm~
+zeck zek
+zeckendorf zek~d{rf
+zed zed
+zedekiah zed@kI@
+zedillo zAdE]
+zedillo zedil]
+zedillo's zAdE]z
+zedillo's zedil]z
+zedong zAd{N
+zedong zEduN
+zee zE
+zeeb zEb
+zeeble zEb@l
+zeebrugge zEbrUg/
+zeek zEk
+zeeland zEl~d
+zeeman zEm~
+zeese zEs
+zeese zEz
+zeff zef
+zeffirelli zef@rel/
+zegeer z6gir
+zeger zEgP
+zegers zEgPz
+zeglin zeglin
+zeh ze
+zehnder zendP
+zehner zenP
+zehntel zentel
+zehr z,r
+zehren z,r~
+zehring z,r6N
+zeibel zIb@l
+zeibel's zIb@lz
+zeichner zIknP
+zeiders zIdPz
+zeidler zId@lP
+zeidman zIdm~
+zeien zI~
+zeiger zIgP
+zeigler zEglP
+zeigler zIg@lP
+zeiler zIlP
+zeilinger zIl6NP
+zeimet zImct
+zeinab zInab
+zeiner zInP
+zeis zEz
+zeiser zIsP
+zeisler zIs@lP
+zeiss zIs
+zeit zIt
+zeiter zItP
+zeitgeist tsItgIst
+zeitler zIt@lP
+zeitler zItlP
+zeitlin zItlin
+zeitung zIt@N
+zeitz zEts
+zekauskas z@k?sk@s
+zeke zEk
+zel zel
+zelasko z@losk]
+zelaya zAlI@
+zelazny z@lozn/
+zelda zeld@
+zeldin zeldin
+zele zEl
+zelek zel6k
+zelem zel}
+zelenak zel~@k
+zelenka z@leNk@
+zeleny z@lEn/
+zelesnik z@lesn6k
+zeleznik z@lezn6k
+zelia zel/@
+zelie zel/
+zeliff zelif
+zelina zclEn@
+zelinka z@liNk@
+zelinski z@linsk/
+zelinsky z@linsk/
+zelko zelk]
+zell zel
+zellars zelPz
+zelle zel
+zeller zelP
+zellerbach zelPbok
+zellers zelPz
+zellman zelm~
+zellmer zelmP
+zellner zelnP
+zelma zelm@
+zelman zelm~
+zelnick zeln6k
+zelos zEl]z
+zelotes zel@ts
+zeltner zeltnP
+zeltzer zeltsP
+zelvin zelvin
+zemaitis zemIt@s
+zeman zEm~
+zemanek zem~6k
+zemba zemb@
+zembower zemb?P
+zembriski zcmbrisk/
+zemecki z}ek/
+zemeckis z}ek/z
+zemel zem@l
+zemin zEmin
+zemke zemk
+zempel zemp@l
+zen zen
+zena zEn@
+zenaida z~Ad@
+zenas zEn@z
+zenchu zenCU
+zenda zend@
+zendejas zEnd6j@z
+zender zendP
+zeneca zen@k@
+zeneca's zen@k@z
+zeng zeN
+zenger zEnjP
+zenia zAn/@
+zenica zen6k@
+zenina zcnEn@
+zenith zEn@T
+zenith's zEn@Ts
+zenk zeNk
+zenker zeNkP
+zenna zen@
+zenner zenP
+zeno zAn]
+zenobia z~Ob/@
+zenon zEn~
+zenor zenP
+zens zenz
+zent zent
+zentec zentek
+zentner zentnP
+zentralsparkasse zentr@lsporkoz@
+zentz zents
+zenz zenz
+zeoli z/ol/
+zeos zEOs
+zepa zEEpEA
+zepa zEp@
+zepa zep@
+zepeda zApAd@
+zepp zep
+zeppelin zep@l~
+zeppenfeld zep@feld
+zera z,r@
+zerbe zirb
+zerbe zirb/
+zerby zirb/
+zerilli zPEl/
+zeringue z,r6N
+zerkle zirk@l
+zerlina zPlEn@
+zerlinda zPlEnd@
+zermeno zPmen]
+zern zirn
+zero zEr]
+zero zir]
+zero's zEr]z
+zero's zir]z
+zeroed zEr]d
+zeroed zir]d
+zeroes zEr]z
+zeroes zir]z
+zeroing zEr]6N
+zeroli z@rOl/
+zeros zir]z
+zerr zir
+zertuche zirt@k
+zervas zirv@z
+zervos zVv]s
+zervos zirv]z
+zerwhale zVwAl
+zest zest
+zestful zestf@l
+zeta zAt@
+zettel zet@l
+zettle zet@l
+zettlemoyer zet@lm<P
+zettler zetlP
+zeus zUs
+zev zev
+zeva zAv@
+zewe zEwE
+zewe zewA
+zeyno zAn]
+zhan zon
+zhang ZaN
+zhang ZoN
+zhao Z?
+zhao j?
+zhejiang ZEjoN
+zheng zeN
+zhenyu ZenyU
+zhirinovsky Zirnofsk/
+zhirinovsky Zir~ofsk/
+zhirinovsky's Zirnofsk/z
+zhirinovsky's Zir~ofsk/z
+zhivago Z6vog]
+zhivkov Zivkov
+zhou zU
+zhu zU
+zhuhai zUhI
+zia zE@
+zia's zE@z
+ziad zEIAdE
+ziad zEad
+ziad zIad
+ziahe zEo
+ziahe zEoh/
+ziashivaney zEoS6vAn/
+zibell zIbcl
+ziccardi z/k)rd/
+zich ziC
+zick zik
+zickefoose zik@fUs
+zico zEk]
+zidek zid6k
+zieba zEb@
+ziebarth zEborT
+ziebell zEbcl
+zieg zEg
+ziegenbein zEg~bIn
+ziegenfuss zEg~f@s
+ziegenhorn zEg~hPn
+zieger zEgP
+ziegler zEglP
+ziehl zEl
+ziehm zEm
+ziel zEl
+zielinski z/linsk/
+zielke zElk
+zieman zEm~
+ziemann zEm~
+ziemba zEmb@
+ziemer zEmP
+ziemian zEm/~
+ziemke zEmk
+zientek zEnt6k
+zier zir
+zierke zErk
+ziesemer zEs/mP
+zieske zEsk
+ziesmer zEs}P
+zietlow zEtl]
+zietz zEts
+ziff zif
+ziff's zifs
+zifferero zifP,r]
+zig zig
+zig-zag zigzag
+zig-zagged zigzagd
+ziggurat zigPat
+ziggurats zigPats
+ziglar ziglP
+zigler zIg@lP
+zigman zigm~
+zigzag zigzag
+zigzagged zigzagd
+zigzagging zigzag6N
+zigzags zigzagz
+zika zik@
+zike zIk
+zil zil
+zilber zilbP
+zilch zilC
+zile zIl
+zilka zilk@
+zilkha zilkh@
+zill zil
+zilla zil@
+zillah zil@
+ziller zilP
+zillion zily~
+zillionaire zily~er
+zillions zily~z
+zillmer zilmP
+zilmer zilmP
+zilvia zilv/@
+zim zim
+zima zEm@
+zimbabwe zimbobwA
+zimbabwe's zimbobwAz
+zimbabwean zimbobw/~
+zimbalist zimb@list
+zimbelman zimb@lm~
+zimdars zimdPz
+zimerman zImPm~
+zimmer zimP
+zimmerer zimPP
+zimmerle zimP@l
+zimmerly zimPl/
+zimmerman zimPm~
+zimmermann zimPm~
+zimmers zimPz
+zimny zimn/
+zimpfer zimpfP
+zinc ziNk
+zinck ziNk
+zinda zind@
+zinder zindP
+zine zIn
+zines zInz
+zinfandel zinf~del
+zing ziN
+zinga ziN@
+zingale z6Ngol/
+zingaro z6Ng)r]
+zinger ziNP
+zingg ziNg
+zingler ziNg@lP
+zingler ziNglP
+zinia zEn/@
+zink ziNk
+zinke ziNk
+zinman zinm~
+zinn zin
+zinner zinP
+zinni zin/
+zinnia zin/@
+zinnias zin/@z
+zinno zin]
+zins zinz
+zinser zinsP
+zinsmeister zinsmIstP
+zinter zintP
+ziobro z/Obr]
+ziolkowski z/]lk{fsk/
+ziomek z/Omck
+zion zI~
+zionism zI~iz}
+zionist zI~ist
+zionists zI~ists
+zions zI~z
+zip zip
+zipf zipf
+zipfel zipf@l
+zipkin zipkin
+zipless zipl@s
+zipp zip
+zipped zipt
+zipper zipP
+zippered zipPd
+zipperer zipPP
+zippering zipP6N
+zippers zipPz
+zipping zip6N
+zippo zip]
+zippora z/p{r@
+zippy zip/
+zips zips
+zirbel zVb@l
+zirbes zVbz
+zircon zVk~
+zirconium zPkOn/}
+zirconiums zPkOn/}z
+zircons zVkonz
+zirella z@rel@
+zirk zVk
+zirkel zVk@l
+zirkelbach zVk@lbok
+zirkle zVk@l
+zisa zIs@
+zises zIz@z
+zisk zisk
+ziska zisk@
+zisson zis~
+zita zEt@
+zitek zit6k
+zither ziTP
+zithers ziTPz
+zito zEt]
+zito's zEt]z
+zittel zit@l
+ziv ziv
+ziwei zEwA
+ziyad zEad
+ziyang Z/aN
+ziyang Z/oN
+zizzo ziz]
+zlata zlot@
+zlata zlotu
+zlata's zlot@z
+zlata's zlotuz
+zlin zlin
+zlobin zl{bin
+zlogar zlOgP
+zlomsowitch zloms]6C
+zlotnick zlotn6k
+zloty zl{t/
+zlotys zl{t/z
+zmijewski zm/Usk/
+zobel zOb@l
+zobrist zobrist
+zoch zok
+zocor zOkP
+zocor zOk{r
+zodiac zOd/ak
+zody zOd/
+zoe zO/
+zoeller zOlP
+zoellick zOl6k
+zoellner zOlnP
+zoete zOt/
+zofagart zOf@gort
+zofran zOfran
+zogby z{gb/
+zogg zog
+zoghby zOb/
+zoh zO
+zola zOl@
+zoll zol
+zollars zolPz
+zoller zolP
+zollinger zol6NP
+zollman zolm~
+zollner zolnP
+zollo zol]
+zolman zolm~
+zoloft zOloft
+zoloft zoloft
+zolp zOlp
+zoltan zOlt~
+zombie zomb/
+zombies zomb/z
+zon z{n
+zona zOn@
+zondervan zondPvan
+zone zOn
+zoned zOnd
+zones zOnz
+zoning zOn6N
+zoo zU
+zoo's zUz
+zook zqk
+zoological zUloj6k@l
+zoologist z]ol@j@st
+zoology z]ol@j/
+zoom zUm
+zoomed zUmd
+zooming zUm6N
+zooms zUmz
+zoos zUz
+zopfi zOpf/
+zora z{r@
+zorah z{r@
+zoran z{r~
+zorana z{ran@
+zorich z{r6k
+zorina z{rEn@
+zorine z{rEn/
+zorinsky z{rinsk/
+zorkin z{rk~
+zorn z{rn
+zornes z{rnz
+zornow z{rn?
+zorro z{rO
+zortman z{rtm~
+zorz z{rz
+zorzi z{rz/
+zosen zOz~
+zoss z{s
+zoster zostP
+zotos zOt]z
+zotter zotP
+zoucha zUh@
+zovirax zOv6raks
+zsa Zo
+zsa-zsa ZoZo
+zsazsa ZoZo
+zschau Z?
+zuba zUb@
+zube zUb
+zuber zUbP
+zubia zUb/@
+zubillaga zUb@log@
+zubin zUbin
+zuboff zUb{f
+zubrod zubr@d
+zuccarelli zUkPel/
+zuccaro zUk)r]
+zucchini zUkEn/
+zucco zUk]
+zuch zuC
+zuchowski z@h{fsk/
+zuchowski zUk{fsk/
+zuck zuk
+zucker zUkP
+zucker zukP
+zucker's zUkPz
+zucker's zukPz
+zuckerman zUkPm~
+zuckerman zukPm~
+zuckerman's zUkPm~z
+zuckerman's zukPm~z
+zue zU
+zue's zUz
+zuege zUj
+zuehlke zqlk
+zuelke zUlk
+zuercher zqrkP
+zufall zUf@l
+zufelt zufclt
+zug zug
+zug's zugz
+zuganov zUg~{f
+zuganov zUg~{v
+zuganov's zUg~{fs
+zuganov's zUg~{vs
+zuhlke zUlk
+zuidema zU@dem@
+zuk zuk
+zukas zUk@z
+zuker zUkP
+zukerman zUkPm~
+zukin zUkin
+zukowski z@k{fsk/
+zulauf zUl?f
+zuleger zUl6gP
+zulfikar zulf6k)r
+zulli zUl/
+zullo zUl]
+zulu zUlU
+zuluaga zUlUog@
+zulus zUlUz
+zumbro zumbr]
+zumbrun zumbr~
+zumel zUmel
+zummo zUm]
+zumpano zUmpon]
+zumstein zumstEn
+zumstein zumstIn
+zumwalt zumw@lt
+zundel zund@l
+zungu zuNU
+zuni zUnE
+zuniga zUnEg@
+zunino zUnEn]
+zunker zuNkP
+zupan zUp~
+zupancic z@paNk6k
+zupanja z@panj@
+zupko zupk]
+zurawski zPofsk/
+zurcher zVkP
+zurek zqrck
+zurfluh zVflU
+zuri zqr/
+zurich zqr6k
+zurich's zqr6ks
+zurita zPIt@
+zurkuhlen zPkyUl~
+zurn zVn
+zurowski zP{fsk/
+zuver zUvP
+zuzana zUzon@
+zvornik zv{rn6k
+zwack zw{k
+zwahlen zwol~
+zwart zw{rt
+zweber zwEbP
+zweibel zwIb@l
+zweifel zwIf@l
+zweig zwIg
+zwerdling zwVdl6N
+zwerdling's zwVdl6Nz
+zwetchkenbaum zweCk~bom
+zwick zwik
+zwicker zwikP
+zwicky zwik/
+zwiebel zwEb@l
+zwiefelhofer zwEf@lhofP
+zwieg zwEg
+zwilling zwil6N
+zwolinski zv@linsk/
+zycad zikad
+zych zIC
+zycher zikP
+zydeco zId@kO
+zydeco zIdekO
+zydeco zid@kO
+zygmunt zigm~t
+zygote zIg]t
+zyla zil@
+zylka zilk@
+zylstra zilstr@
+zyman zIm~
+zynda zind@
+zysk zIsk
+zyskowski zisk{fsk/
+zyuganov zUgonof
+zyuganov zUgonov
+zyuganov zyUgonof
+zyuganov zyUgonov
+zyuganov's zUgonofs
+zyuganov's zUgonovz
+zyuganov's zyUgonofs
+zyuganov's zyUgonovz
+zywicki z@wik/
+zzzz z/z
+zzzz zz
diff --git a/config/en.us/dictionary/cmu2nuance.cpp b/config/en.us/dictionary/cmu2nuance.cpp
new file mode 100644
index 0000000..6e900e6
--- /dev/null
+++ b/config/en.us/dictionary/cmu2nuance.cpp
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+
+//
+// This converts the data found at http://www.speech.cs.cmu.edu/cgi-bin/cmudict
+// into the *.ok format used by Nuance.
+// We use the file c0.6, which corresponds to (v. 0.6).
+//
+// to run: make cmu2nuance && ./cmu2nuance <c0.6 >c0.6.ok
+//
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+
+static const char* xlate(const char* phone, const char* cmu, const char* nuance) {
+  int ncmu = strlen(cmu);
+  if (strncmp(phone, cmu, ncmu) || !isspace(phone[ncmu])) return NULL;
+  fputs(nuance, stdout);
+  return phone + strlen(cmu);
+}
+
+
+int main(int argc, const char* argv[]) {
+  char line[200];
+
+  fputs("#LANG=EN-US\n", stdout);
+  
+  for (int lineno = 1; NULL != fgets(line, sizeof(line), stdin); lineno++)
+  {
+    if (line[0] == '#') continue;
+    if (line[0] == 0) continue;
+    if (!isalnum(line[0])) {
+      fprintf(stderr, "warning: ignoring line %d\n", lineno);
+      continue;
+    }
+    
+    const char* p = line;
+    
+    // parse name, echoing in lower case and skipping (2) suffix
+    while (!isspace(*p)) {
+      if (*p == 0) {
+        fprintf(stderr, "can't read name at line %d\n", lineno);
+        break;
+      }
+      if (p[0] == '(' && isdigit(p[1]) && p[2] == ')' && isspace(p[3])) {
+        p += 3;
+        break;
+      }
+      fputc(tolower(*p), stdout);
+      p++;
+    }
+    fputc(' ', stdout);
+    
+    // loop over whitespace delimited phonemes
+    while (1) {
+      // skip leading whitespace
+      while (isspace(*p)) p++;
+      if (*p == 0) break;
+      
+      const char* next = 0;
+      if (
+        (next=xlate(p, "AA1 R", ")r")) ||   // odd     AA D
+        (next=xlate(p, "AA0", "o")) ||   // odd     AA D
+        (next=xlate(p, "AA1", "o")) ||   // odd     AA D
+        (next=xlate(p, "AA2", "o")) ||   // odd     AA D
+
+        (next=xlate(p, "AE0", "a")) ||   // at      AE T
+        (next=xlate(p, "AE1", "a")) ||   // at      AE T
+        (next=xlate(p, "AE2", "a")) ||   // at      AE T
+
+        (next=xlate(p, "AH0 N", "~")) ||   // hut     HH AH T - from jean
+        (next=xlate(p, "AH0 M", "}")) ||   // hut     HH AH T - from jean
+        (next=xlate(p, "AH0", "@")) ||   // hut     HH AH T - from jean
+        (next=xlate(p, "AH1", "u")) ||   // hut     HH AH T
+        (next=xlate(p, "AH2", "u")) ||   // hut     HH AH T
+
+        (next=xlate(p, "AO0", "{")) ||   // ought   AO T
+        (next=xlate(p, "AO1", "{")) ||   // ought   AO T
+        (next=xlate(p, "AO2", "{")) ||   // ought   AO T
+
+        (next=xlate(p, "AW0", "?")) ||   // cow     K AW
+        (next=xlate(p, "AW1", "?")) ||   // cow     K AW
+        (next=xlate(p, "AW2", "?")) ||   // cow     K AW
+
+        (next=xlate(p, "AY0", "I")) ||   // hide    HH AY D
+        (next=xlate(p, "AY1", "I")) ||   // hide    HH AY D
+        (next=xlate(p, "AY2", "I")) ||   // hide    HH AY D
+
+        (next=xlate(p, "B"  , "b")) ||   // be      B IY
+        (next=xlate(p, "CH" , "C")) ||   // cheese  CH IY Z
+        (next=xlate(p, "D"  , "d")) ||   // dee     D IY
+        (next=xlate(p, "DH" , "T")) ||   // thee    DH IY
+
+        (next=xlate(p, "EH1 R", ",r")) ||   // Ed      EH D
+        (next=xlate(p, "EH0", "c")) ||   // Ed      EH D - from jean
+        (next=xlate(p, "EH1", "e")) ||   // Ed      EH D
+        (next=xlate(p, "EH2", "e")) ||   // Ed      EH D
+
+        (next=xlate(p, "ER0", "P")) ||   // hurt    HH ER T
+        (next=xlate(p, "ER1", "V")) ||   // hurt    HH ER T
+        (next=xlate(p, "ER2", "V")) ||   // hurt    HH ER T
+
+        (next=xlate(p, "EY0", "A")) ||   // ate     EY T
+        (next=xlate(p, "EY1", "A")) ||   // ate     EY T
+        (next=xlate(p, "EY2", "A")) ||   // ate     EY T
+
+        (next=xlate(p, "F"  , "f")) ||   // fee     F IY
+        (next=xlate(p, "G"  , "g")) ||   // green   G R IY N
+        (next=xlate(p, "HH" , "h")) ||   // he      HH IY
+
+        (next=xlate(p, "IH0", "6")) ||   // it      IH T
+        (next=xlate(p, "IH1", "i")) ||   // it      IH T
+        (next=xlate(p, "IH2", "i")) ||   // it      IH T
+
+        (next=xlate(p, "IY0", "/")) ||   // eat     IY T - from jean
+        (next=xlate(p, "IY1", "E")) ||   // eat     IY T
+        (next=xlate(p, "IY2", "E")) ||   // eat     IY T
+
+        (next=xlate(p, "JH" , "j")) ||   // gee     JH IY
+        (next=xlate(p, "K"  , "k")) ||   // key     K IY
+        (next=xlate(p, "L"  , "l")) ||   // lee     L IY
+        (next=xlate(p, "M"  , "m")) ||   // me      M IY
+        (next=xlate(p, "N"  , "n")) ||   // knee    N IY
+        (next=xlate(p, "NG" , "N")) ||   // ping    P IH NG
+
+        (next=xlate(p, "OW0", "]")) ||   // oat     OW T
+        (next=xlate(p, "OW1", "O")) ||   // oat     OW T
+        (next=xlate(p, "OW2", "O")) ||   // oat     OW T
+
+        (next=xlate(p, "OY0", "<")) ||   // toy     T OY
+        (next=xlate(p, "OY1", "<")) ||   // toy     T OY
+        (next=xlate(p, "OY2", "<")) ||   // toy     T OY
+
+        (next=xlate(p, "P"  , "p")) ||   // pee     P IY
+        (next=xlate(p, "R"  , "r")) ||   // read    R IY D
+        (next=xlate(p, "S"  , "s")) ||   // sea     S IY
+        (next=xlate(p, "SH" , "S")) ||   // she     SH IY
+        (next=xlate(p, "T"  , "t")) ||   // tea     T IY
+        (next=xlate(p, "TH" , "T")) ||   // theta   TH EY T AH
+
+        (next=xlate(p, "UH0", "q")) ||   // hood    HH UH D
+        (next=xlate(p, "UH1", "q")) ||   // hood    HH UH D
+        (next=xlate(p, "UH2", "q")) ||   // hood    HH UH D
+
+        (next=xlate(p, "UW0", "U")) ||   // two     T UW
+        (next=xlate(p, "UW1", "U")) ||   // two     T UW
+        (next=xlate(p, "UW2", "U")) ||   // two     T UW
+
+        (next=xlate(p, "V"  , "v")) ||   // vee     V IY
+        (next=xlate(p, "W"  , "w")) ||   // we      W IY
+        (next=xlate(p, "Y"  , "y")) ||   // yield   Y IY L D
+        (next=xlate(p, "Z"  , "z")) ||   // zee     Z IY
+        (next=xlate(p, "ZH" , "Z")) ||   // seizure S IY ZH ER
+        0) {
+        p = next;
+      }
+      else {
+        fprintf(stderr, "can't pronounce line %d: %s", lineno, p);
+        break;
+      }
+      
+    }
+      
+    fputc('\n', stdout);
+        
+  }
+}
diff --git a/config/en.us/dictionary/cmu6plus.ok.zip b/config/en.us/dictionary/cmu6plus.ok.zip
new file mode 100644
index 0000000..11961b8
--- /dev/null
+++ b/config/en.us/dictionary/cmu6plus.ok.zip
Binary files differ
diff --git a/config/en.us/dictionary/enroll.ok b/config/en.us/dictionary/enroll.ok
new file mode 100644
index 0000000..949728a
--- /dev/null
+++ b/config/en.us/dictionary/enroll.ok
@@ -0,0 +1,53 @@
+#LANG=EN-US
+-pau- #
+-pau2- #
+ph_AA a
+ph_AE ,
+ph_AH )
+ph_AW o
+ph_AWH {
+ph_AY I
+ph_EE1 E
+ph_EH1 e
+ph_EY A
+ph_IH1 i
+ph_OH1 O
+ph_OO q
+ph_OOH U
+ph_OW ?
+ph_OY <
+ph_UH1 u
+ph_UR1 V
+ph_b b
+ph_ch C
+ph_d d
+ph_dh D
+ph_ee /
+ph_eh c
+ph_f f
+ph_g g
+ph_h h
+ph_ih 6
+ph_j j
+ph_k k
+ph_l l
+ph_m m
+ph_n n
+ph_ng N
+ph_oh ]
+ph_p p
+ph_r r
+ph_s s
+ph_sh S
+ph_t t
+ph_th T
+ph_uh @
+ph_ul L
+ph_um }
+ph_un ~
+ph_ur P
+ph_v v
+ph_w w
+ph_y y
+ph_z z
+ph_zh Z
diff --git a/config/en.us/dictionary/fixit.ok b/config/en.us/dictionary/fixit.ok
new file mode 100644
index 0000000..c2a55f3
--- /dev/null
+++ b/config/en.us/dictionary/fixit.ok
@@ -0,0 +1,193 @@
+#LANG=EN-US
+abdoolcarim @bdUlk@rEm
+adiddam adEdam
+adiddam adidam
+aidymar adimP
+alfonso alfonsO
+alifia alifE@
+amalapurapu amal@pUrapU
+amin amEn
+amin amin
+amit @mit
+amod @mod
+ana an@
+andrada androd@
+angana aNgon@
+archana )rCan@
+archana )rkan@
+ardan )rdan
+asif asif
+ayzenshtat Iz6nStat
+ayzenshtat az6nStat
+baptiste batEst
+baptiste batEst@
+ben bin
+bigio bigEO
+biswal bizw{l
+biyearly bIyPl/
+bornstein b{rnstEn
+broadman br{dm6n
+cannings kan6Nz
+cary karE
+chabot Cabut
+charo C)rO
+charro C)rO
+chetal Cetol
+chung CuN
+claudia kl{dE@
+cleron kl,r6n
+colijn k6lA6n
+colijn kOlE6n
+corinne k{r6n
+corinne k{rEn
+dana dAn@
+daryl dar6l
+daryl darL
+davi dAvE
+dr doktP
+dubach dUbak
+ducrohet dUkrOhA
+erick ar6k
+erick er6k
+fadden fad6n
+ficus fIk@s
+genqing gunCEN
+genqing jeNkEN
+gentile jentIl
+ghosh ghOS
+gianno jIanO
+gurivireddy g@r6v6redE
+gurivireddy gUr6v6redE
+gustafsson gustafs@n
+haberlach habPlak
+helena helAn@
+hima hEm@
+hima hIm@
+hiroshi hirOSE
+hjonnevag honivag
+hua hU@
+hua w)
+huang hUaN
+husain hUsAn
+iliyan ilEy6n
+irani iranE
+jakobsson jAkubs6n
+jarek jarek
+jennings jenENz
+jiang jEaN
+jiang jEuN
+johansson jOhans6n
+joshi yOSE
+kanaan kAn6n
+kanojiya kanOjEy@
+karve k)rv6
+ki kE
+ki kI
+konrad konrad
+kulikov kUl6kov
+lajos lAhOs
+lajos lIhOs
+lajos lajos
+lamiraux lam6rA
+lamiraux lam6rO
+leland lAl6nd
+limo limO
+lockheimer lokhImP
+lockwood lokwqd
+malchev malCev
+mama mom@
+mario m)rEO
+mario m,rEO
+mathias matE@z
+mathias matI@z
+megha meg@
+mehat mehat
+mihai mEhI
+millar mil)r
+moll mol
+morrissey m)r6sE
+nagy nAg/
+nagy nAj/
+najmuddin najmud6n
+nelissen nEls6n
+nidigallu nid6galU
+ninetieth nInd/6T
+ny en&wI
+ochayon OCAyon
+olivestedt ol6vstet
+onorato )n@rotO
+oregon {rigon
+otter otP
+padmanabha padmanabh@
+parekh p@rek
+parekh p@rek@
+pedro pAdrO
+pedro pedrO
+peisun pAsun
+phd pE&AC&dE
+pogoda p@gOd@
+ponnusamy ponUsamE
+potiuk potE@k
+potiuk potEUk
+pramod pramOd
+pramod pramod
+preda pred@
+pregibon preg6bon
+priyanka pr6yank@
+qian CEin
+qian kEan
+quang CUaN
+quang kwaN
+queru kw,rU
+quintana kwintan@
+rajeev r6jEv
+rajeswaran rajesw)ran
+raman raman
+rebecca r@bek@
+rebuttal rEbutL
+rechis rAC6s
+rechis rIkis
+robison rOb6s6n
+rohan rOhan
+romain rOmAn
+rosaen rOs6n
+rothfuss roTfus
+schnall Sn{l
+scroggins skrog6nz
+sedem sed@m
+shiela SEl@
+shirin Sir6n
+siddiqui sid6kwU
+sigelman sEg@lm6n
+sivaram siv@ram
+sonia sOny@
+sonia sony@
+sridhar sridh)r
+srinivas sriniv@z
+sriram srEram
+stadler stadlP
+studer stUdP
+subha sUbh@
+suresh sUreS
+tanya tany@
+thorsander T{rsandP
+tobias tObI@z
+tseng CEN
+tseng tseN
+veaux vO
+vennard ven)rd
+vitaliy vitalE
+ward w)rd
+won won
+yaron y)rOn
+y E
+ye yA
+ye yE
+yves Ev
+yves Evz
+zahir z@hir
+zh dr
+zhang draN
+zhong dr{N
+zhou dr?
+zongker zoNkP
diff --git a/config/en.us/dictionary/large.ok b/config/en.us/dictionary/large.ok
new file mode 100644
index 0000000..1a694aa
--- /dev/null
+++ b/config/en.us/dictionary/large.ok
@@ -0,0 +1,32917 @@
+#LANG=EN-US
+-pau- #
+-pau2- #
+0 =Y07
+00 hundr6d
+1 5F|
+10 2x|
+100 uhundr6d
+100 wunhundr6d
+1000 wunT?z~d
+11 6lev~
+12 twelv
+13 BW2Y|
+14 RX02Y|
+15 R.R2Y|
+16 1.\12Y|
+17 1x3M2Y|
+18 H2Y|
+19 +>|2Y|
+2 2K
+20 25x|2[
+20 25x|[
+3 B0Y
+30 BW2[
+4 RX0
+40 RX02[
+5 R>3
+50 R.R2[
+6 1.\1
+60 1.\12[
+7 1x3M
+70 1x3M2[
+70 1x3M[
+8 H2
+80 H2[
+9 +>|
+90 +>|2[
+90 +>|[
+a @
+a A
+a u
+aalborg {lb{rg
+aarhus )rh@s
+aarhus {rhUs
+aaron ar~
+aaronsburg ,r~zbVg
+aaronsburg ar~zbVg
+abad @bad
+abandonment @band~m~t
+abbed @bed
+abbreviate @brEv/At
+abbreviation @brEv/AS~
+abbruzzese abrUzes
+abdelwahed abd@lw)hed
+abdication abd6kAS~
+abdomen abd@m~
+abdominal @bdom~L
+abdoolcarim @bdUlk@rEm
+abductions @bdukS~z
+abdul abdUl
+abe Ab
+abel Ab@l
+abels Ab@lz
+aber AbP
+abercrombie abPkromb/
+aberdare abPd,r
+aberdare abPdP
+aberdeen abPdEn
+abernathy abPnaTE
+abernethy abPneTE
+aberson AbPs@n
+abhorrence @bh{r~s
+abhorrently @bh{r~tl/
+abides @bIdz
+abilene ab6lEn
+abilities @bil6d/z
+ability @bil6d/
+abita @bEd@
+abita @bEt@
+abjectly abjektl/
+able AbL
+ables Ab@lz
+ably Abl/
+abnormalcy abnPmals/
+abnormality abnPmal6d/
+abolish @bol6S
+abolishing @bol6S6N
+aborigine ab@rij~/
+abort @b{rt
+about @b?t
+above @buv
+aboveboard @buvb{rd
+abraham Abr@ham
+abrahams Abr@hamz
+abram Abr@m
+abrams Abr}z
+abramson Abr@ms@n
+abrasion @brAZ~
+abrasions @brAZ~z
+abroad @br{d
+abruptly @bruptl/
+abruptness @bruptn6s
+absences abs~s6z
+absent abs~t
+absently abs~tl/
+absolute abs@lUt
+absolutely abs@lUtl/
+absoluteness abs@lUtn6s
+absolution abs@lUS~
+absolved @bzolvd
+absolving @bzolv6N
+absorbance @bz{rb~s
+absorbed @bz{rbd
+absorbent @bz{rb~t
+absorbs @bz{rbz
+abstaining @bstAn6N
+abstract abstrakt
+abstracted abstrakt6d
+abstraction @bstrakS~
+abstruse @bstrUs
+absurd @bsVd
+absurdity @bsVd6d/
+absurdly @bsVdl/
+abu )bU
+abu @bU
+abu obU
+abundant @bund~t
+abuse @byUz
+abusing @byUz6N
+abusive @byUs6v
+abyss @bis
+ac AsE
+academic ak@dem6k
+academics ak@dem6ks
+academy @kad6m/
+academy's @kad6m/z
+academys @kad6m/z
+acapulco )k@pqlk]
+acapulco ak@pulk]
+accelerating aksel@rAd6N
+accelerometer aksel@rom6dP
+accent aksent
+accents aksents
+accentuation aksenCUAS~
+accept aksept
+acceptable aksept@bL
+acceptance aksept~s
+accepted aksept6d
+access akses
+accessible akses@bl
+accessorize aksesPIz
+accident aks6d~t
+accidentally aks6dent6l/
+acclaim @klAm
+acclimation akl6mAS~
+accomack ak@mak
+accommodate @kom@dAt
+accommodation @kom@dAS~
+accompanied @kump~/d
+accompany @kump~/
+accompanying @kump~/6N
+accompanyist @kump~/6st
+accomplish @kompl6S
+accomplished @kompl6St
+accomplishments @kompl6Sm~ts
+accord @k{rd
+according @k{rd6N
+accordingly @k{rd6Nl/
+account @k?nt
+accounts @k?nts
+accreditation @kred6tAS~
+accumulated @kyUmy6lAd6d
+accumulates @kyUmy6lAts
+accumulation @kyUmy6lAS~
+accuracy aky@r@s/
+accurate aky@r6t
+accurateness aky@r6tn6s
+accusations aky6zAS~z
+accusative @kyUz@d6v
+accuse @kyUz
+accusingly @kyUz6Nl/
+ace As
+aced Ast
+aceldama @seld@m@
+aceldama asLdom@
+aceldana asLdon@
+acevedo as6vAdO
+acey AsE
+ache Ak
+achenbach Ak6nb)k
+achenbach ok6nb)k
+aches Aks
+acheson Aks@n
+achievable @CEv@bL
+achieve @CEv
+achieved @CEvd
+achievement @CEvm~t
+achieving @CEv6N
+achille @kilE
+achilles @kilEz
+achinsk @Cinsk
+achor AkP
+achord @k{rd
+achzet akzet
+achziger akzIgP
+acid as6d
+acids as6dz
+acker akP
+ackerman akPm~
+ackermann akPm~
+ackles ak@lz
+acknowledge 6knol6j
+acknowledged 6knol6jd
+acme akm/
+acne akn/
+acord @k{rd
+acorn Ak{rn
+acorns Ak{rnz
+acoustic @kUst6k
+acoustically @kUst6kl/
+acoustics @kUst6ks
+acquaintance @kwAnt~s
+acquaintances @kwAnt~s6z
+acquiescence akw/es~s
+acquire @kwIr
+acquired @kwIrd
+acquirement @kwIrm~t
+acquiring @kwIr6N
+acquisitions akw6ziS~z
+acquisitive @kwiz6d6v
+acre AkP
+acres AkPz
+acropolis @kropL6s
+across @kr{s
+acrylic @kril6k
+act akt
+acting akt6N
+action akS~
+actions akS~z
+activate akt6vAt
+activated akt6vAd6d
+active akt6v
+actively akt6vl/
+activist akt6v6st
+activities aktiv6d/z
+activity aktiv6d/
+acton akt~
+actor aktP
+actors aktPz
+actress aktr6s
+acts akts
+actual akCwL
+actuality akCUal6d/
+actually akCU6l/
+actuarial akCU,r/L
+acupuncture aky6puNkCP
+acura @kqr@
+acushent ak6S~t
+acushnet @kqSnet
+acushnet @kuSn6t
+ad ad
+ada Ad@
+adah ad)
+adair @d,r
+adairville @d,rvil
+adairville ad,rvil
+adalia )d@l/)
+adalia @d)l/@
+adalusia ad@lUZ@
+adam ad}
+adame @d)mA
+adams ad}z
+adamsburg ad@mzbVg
+adamsburg ad}zbVg
+adamson ad@ms@n
+adamstown ad@mzt?n
+adamstown ad}zt?n
+adamsville ad@mzvil
+adan adan
+adaptation ad@ptAS~
+adaption @dapS~
+adaptive @dapt6v
+adapts @dapts
+add ad
+added ad6d
+addict adikt
+addiction @dikS~
+adding ad6N
+addis ad6s
+addition @diS~
+additional @diS~L
+additions @diS~z
+additives ad6d6vz
+address @dres
+address adres
+addressed @drest
+addresses @dres6z
+adduci @dUCE
+addyston ad/zt~
+addyston ad6st~
+adena @dEn@
+adequate ad6kw6t
+adequately ad6kw6tl/
+adherence adh/r~s
+adhesion adh/Z~
+adhesive adh/s6v
+adiddam adEdam
+adiddam adidam
+adirondack ad@rondak
+adjacent @jAs~t
+adjective aj6kt6v
+adjectives aj6kt6vz
+adjoining @j<n6N
+adjoins @j<nz
+adjourn @jVn
+adjourned @jVnd
+adjourns @jVnz
+adjudicated @jUd6kAd6d
+adjunctly ajuNktl/
+adjust @just
+adjusted @just6d
+adjustments @justm~ts
+adleman ad@lm6n
+administration admin6strAS~
+administrative admin6strAd6v
+admiration adm@rAS~
+admire admIr
+admired admIrd
+admiring admIr6N
+admissible admis@bl
+admission admiS~
+admit admit
+admitted admid6d
+admitting admid6N
+adolph Ad{lf
+adopted @dopt6d
+adoptions @dopS~z
+adopts @dopts
+adored @d{rd
+adorned @d{rnd
+adrian Adr/~
+adriana AdrE)n@
+adriane AdrEan
+adrianna AdrEan@
+adrianne AdrEan
+adrien AdrE6n
+adriene AdrE@n
+adrienne Adr/en
+adroit @dr<t
+ads adz
+adule adyUl
+adult @dult
+adulteration @dult@rAS~
+adulterers @dultPPz
+adultery @dultP/
+adulthood @dulthqd
+adults @dults
+advance advans
+advanced advanst
+advances advans6z
+advantage advant6j
+advantages advant6j6z
+adventure advenCP
+adventurous advenC@r@s
+adverb advPb
+adversely advPsl/
+adverseness advPsn6s
+advertising advPtIz6N
+advice advIs
+advisable advIz@bL
+advise advIz
+advised advIzd
+advisory advIz@r/
+ae ,
+aegerter AgPtP
+aerial ,r/L
+aerobatics ar]bad6ks
+aerobically @rOb6kl/
+aerobics @rOb6ks
+aeronautic ar]n{d6k
+aeronautical ar]n{d6kL
+aerospace ar]spAs
+aesthetic @sTed6k
+afee @fE
+afee AfE
+afee af/
+affairs @f,rz
+affect @fekt
+affected @fekt6d
+affectionate @fekS~6t
+affinity @fin6d/
+affirm @fVm
+affirmative @fVm@d6v
+affluence aflU~s
+afford @f{rd
+afloat @flOt
+afoot @fqt
+afraid @frAd
+africa afr6k@
+africas afr6k@z
+after aftP
+aftereffect aftP6fekt
+afterlife aftPlIf
+aftermath aftPmaT
+afternoon aftPnUn
+aftertaste aftPtAst
+afterthought aftPT{t
+afterwards aftPwPdz
+afula @fUl@
+again @gen
+against @genst
+agatha ag@T@
+agawam ag@w)m
+agawam ag@w}
+age Aj
+agee agE
+ageless Ajl6s
+agelessness Ajl6sn6s
+agencies Aj~s/z
+agency Aj~s/
+agenda @jend@
+agent Aj~t
+agents Aj~ts
+agerton agPt@n
+ages Aj6z
+aggressive @gres6v
+agility @jil6d/
+agin Ag6n
+agins Ag6nz
+agitated aj6tAd6d
+agitation aj6tAS~
+aglow @glO
+agnes agn@s
+agnew agnyU
+ago @gO
+agonies ag~/z
+agony ag~/
+agoura @g?r@
+agoura @g{r@
+agra @gro
+agree @grE
+agreed @grEd
+agricultural agr6kulC@rL
+agriculturalist agr6kulC@rL6st
+aguana @gwon@
+aguanga @gwaNg@
+aguayo @gwIO
+aguilar agEl)r
+aguirre @gEr
+ah )
+ah o
+ahah @ho
+ahead @hed
+ahearn AhPn
+ahern AhPn
+ahlstedt {lsted
+ahmad @m)d
+ahmadabad )m@d@b)d
+ahmadabad @mad@b6d
+ahmed )med
+ahoy @h<
+ahwahnee )w)n/
+ahwahnee ow@nE
+aid Ad
+aide Ad@
+aids Adz
+aidymar adimP
+aigner AgnP
+aileen AlEn
+aileen IlEn
+aim Am
+aimed Amd
+aimlessly Aml6sl/
+aims Amz
+aimwell Amwcl
+aimwell Amwel
+ain't Ant
+ainslie Ansl/
+aint Ant
+air ,r
+airbags ,rbagz
+airborne ,rb{rn
+aircon ,rkon
+aircraft ,rkraft
+airdrop ,rdrop
+airdrops ,rdrops
+airedale ,rdAl
+airfields ,rfEldz
+airflow ,rflO
+airfoil ,rf<l
+airfoils ,rf<lz
+airframe ,rfrAm
+airline ,rlIn
+airlines ,rlInz
+airmont ,rmont
+airplane ,rplAn
+airplanes ,rplAnz
+airport ,rp{rt
+airports ,rp{rts
+airships ,rSips
+airsickness ,rsikn6s
+airspeed ,rspEd
+airtight ,rtIt
+airville ,rvil
+airway ,rwA
+aisha IS@
+aisle Il
+aisles Ilz
+aitken Atk~
+aitkin Atk~
+ajar @j)r
+ajax Ajaks
+ajose @jOsE
+akiereisen akE@rIs@n
+akiko @kEkO
+akilah @kEl@
+akimseu akims@
+akin Ak6n
+akron akr~
+al al
+alabama al@bam@
+alabaster al@bastP
+alachua @laCU@
+aladdin @lad~
+alamitos al@mEd]z
+alamo al@m]
+alamosa al@mOs@
+alan al~
+alanis al~6s
+alanson al~s~
+alapaha al@p)h)
+alarm @l)rm
+alarmist @l)rm6st
+alarms @l)rmz
+alaska @lask@
+alaskans al@sk~z
+alatorre al@t{rE
+albacete alb@sAt/
+albacete alb@sEt
+albans {lb~z
+albany {lb@n/
+albany {lb~/
+albatrosses alb@tr{s6z
+albemarle alb6mPl
+albert albPt
+alberta albVd@
+alberthal albPt@l
+alberton albPt~
+albertville albPtvil
+albia alb/@
+albrecht )lbr6kt
+albright {lbrIt
+album alb}
+albums alb}z
+albuquerque alb@kPk/
+albuquerque alb@kVk/
+alburnett albPnet
+alcalde {lk)ldA
+alcatraz alk@traz
+alcee alsE
+alcoa alk]@
+alcohol alk@h{l
+alcoholic alk@hol6k
+alcoholics alk@hol6ks
+alcosiba alk)sibO
+alcoves alkOvz
+alder {ldP
+alderman {ldPm~
+aldie ald/
+aldie {ld/
+aldred aldred
+aldrege {ldrej
+alea @lE@
+alec alek
+aleisha @lES@
+alejandra )l6h)ndr@
+alejandre )l@h)ndrA
+alejandrina )l6h)ndrEn@
+alejandro aleh)ndrO
+alejos @lAhOs
+aleman Alm6n
+aleman Alm~
+alert @lVt
+alertly @lVtl/
+alertness @lVtn6s
+alesha @lES@
+aleshire AlSIr
+alessandra al@sandr@
+alester @lestP
+alester alestP
+aleta @lEt@
+aletha @lET@
+alewife AlwIf
+alex al6ks
+alex alcks
+alexa @leks@
+alexander al6gzandP
+alexander alcksandP
+alexanders al6gzandPz
+alexandra al6gzandr@
+alexandra al6ksandr@
+alexandra alcksandr@
+alexandre al6ksandP
+alexandria al6ksandr/@
+alexandrian al6ksandr/~
+alexandrite al6ksandrIt
+alexia @leksE@
+alexis @leks6s
+alexnder al6ksandP
+alexy @leksE
+alfalfa alfalf@
+alfaro alf)rO
+alfonso alfonsO
+alfred alfr6d
+alfredo alfrAtO
+alfredson alfr6ds~
+algae alj/
+algebraic alj6brA6k
+algebraically alj6brA6kl/
+alghamdi alg)mdE
+algoma algOm@
+algona algOn@
+algonac alg@nak
+algonac alg~ak
+algonquin algoNkw~
+algood {lgqd
+algorithms alg@riD}z
+alhambra alhambr@
+alia @lE@
+alibi al6bI
+alicante )l6k)nt/
+alicante al6kontA
+alice al6s
+alice's al6s6z
+alices al6s6z
+alicia @liS@
+alien Al/~
+alienate Al/6nAt
+alienated Al/6nAd6d
+alienation @lI6nAS~
+alifia alifE@
+aligarh )l6g{r
+aligarh al6g)r
+aligned @lInd
+aligning @lIn6N
+alike @lIk
+alimonies al6mOn/z
+alimony al6mOn/
+aliquippa al@kwip@
+alisa @lEs@
+alise @lEs
+alisea @lis/@
+alistair al@stP
+alive @lIv
+all {l
+allaire @l,r
+allaire al,r
+allaire {l,r
+allan al~
+allardt al)rt
+allardt alPt
+allaying @lA6N
+allbright {lbrIt
+allegan al6g~
+allegan al@g~
+allegedly @lej6dl/
+allegheny al6gen/
+allen al~
+allenport al~p{rt
+allensworth al~zwVT
+allentown al~t?n
+allergic @lVj6k
+allergies alPj/z
+allergist alPj6st
+allerton {lPt~
+alleviate @lEv/At
+alleviating @lEv/Ad6N
+alleviation @lEv/AS~
+alleviatory al6vI@t{r/
+alley al/
+alleyne alAn
+allgeyer {lgIP
+allgood {lgqd
+allhands {lhandz
+alliance @lI~s
+allied's @lIdz
+allieds @lIdz
+allies alIz
+alligators al6gAdPz
+alline @lEn
+allison al6s~
+allnutt {lnut
+allons alonz
+allons al~z
+allons {lonz
+allot @lot
+allow @l?
+allowable @l?@bL
+allowableness @l?@bLn6s
+allowables @l?@bLz
+allowance @l?~s
+allowed @l?d
+allowing @l?6N
+allows @l?z
+allred alrd
+allred {lred
+allsbrook {lzbrqk
+allshouse {lzh?s
+allspice alsp6s
+allstate {lstAt
+allstate's {lstAts
+allstates {lstAts
+alludes @lUdz
+allure @lUr
+alluring @lUr6N
+alluringly @lUr6Nl/
+allusion @lUZ~
+allusive @lUs6v
+allwood {lwqd
+allyn al6n
+allyson al6s~
+allyson al@s6n
+almeida almAd@
+almeida olmAd@
+almeidia almEd/@
+almena almEn@
+almena {lmEn@
+almighty {lmId/
+almira almEr@
+almond om~d
+almond {lm6nd
+almonds om~dz
+almont almont
+almost {lmOst
+aloft @l{ft
+aloha @lOh@
+alone @lOn
+aloneness @lOnn6s
+along @l{N
+aloofness @lUfn6s
+aloud @l?d
+alp alp
+alpena alpEn@
+alper alpP
+alper alppP
+alphabet alf@bct
+alphabetize alf@betIz
+alpharetta alf@red@
+alpharetta alf@ret@
+alpine alpIn
+alquisira alk6sEr@
+already {lred/
+alred alr6d
+alright {lrIt
+alsea alsE@
+alsea {ls/@
+alsen als~
+alsheimer alSImP
+also {ls]
+alsobrook {lsObrqk
+alspach {lspak
+alston {lst6n
+alstyne {lstEn
+alstyne {lstIn
+altamirano {lt@m@r)nO
+altamont alt@mont
+altamonte {lt@mont
+altaville alt@vil
+altaville {lt@vil
+altavista alt@vEst@
+altavista alt@vist@
+altavista {lt@vist@
+alter {ltP
+altercation {ltPkAS~
+altered {ltPd
+alternate {ltPn6t
+alternate {ltPnAt
+alternation {ltPnAS~
+alternative {ltVn@d6v
+alternatives {ltVn@d6vz
+altha alT@
+altha {lT@
+althauser {lth?zP
+althea {lTE@
+altheimer {ltImP
+although {lDO
+althouse {lth?s
+altitudes alt6tUdz
+alto alt]
+altogether {lt@geDP
+alton alt~
+altoona {ltUn@
+altos alt]z
+altruist {ltrU6st
+altruistic {ltrUist6k
+altschuler altSUlP
+alturas altqr@s
+alturas {ltUr@z
+altus {lt@s
+altwies {ltwIs
+aluminum @lUm~}
+alumni @lumnI
+alvarado alv@rod]
+alvaton alv@t~
+alvaton alvAt~
+alverest alv@rest
+alvernaz alvernaz
+alvin alv~
+alvine alvIn
+alvorez alvOrez
+always {lw6z
+alycia @lES@
+alyse @lEs
+alyson al@s6n
+am Aem
+am am
+amacher am@kP
+amador am@dP
+amal @m)l
+amalapurapu amal@pUrapU
+amalgamate @malg@mAt
+amalgamates @malg@mAts
+aman @man
+amanda @mand@
+amanda's @mand@z
+amandas @mand@z
+amara @mor@
+amara am@r@
+amaro @m)rO
+amateur am@CP
+amateurish am@CP6S
+amateurs am@CPz
+amawalk am@w{k
+amaze @mAz
+amazed @mAzd
+amazement @mAzm~t
+amazing @mAz6N
+amazon am@zon
+amazon's am@zonz
+amazons am@zonz
+ambassador ambas@dP
+ambassador's ambas@dPz
+ambassadorial ambas@d{r/L
+ambassadors ambas@dPz
+ambassadorship ambas@dPSip
+ambato )mb)t]
+ambatom amb@d}
+amber ambP
+ambidextrous amb/dekstr@s
+ambiguity amb6gyU6d/
+ambiguous ambigyU@s
+ambiguously ambigyU@sl/
+ambition ambiS~
+ambitions ambiS~z
+ambitious ambiS@s
+ambled ambLd
+ambon ambon
+ambrosia ambrOZ@
+ambulance amby6l~s
+ambulances amby6l~s6z
+ambush ambqS
+ambushing ambqS6N
+amee AmE
+ameigh @mE
+amend @mend
+amended @mend6d
+amendments @mendm~ts
+amenia @mEn/@
+amenia @mEny@
+america @mar6k@
+american @mar6k~
+americanization @mar6k~6zAS~
+americans @mar6k~z
+americus @mar6k@s
+ameritech @mar6d6k
+amersfoort @mVsfUrt
+amersfoort amPzf{rt
+amerson AmPs@n
+ames Amz
+amesville Amzvil
+amethyst am6T6st
+amex ameks
+amey AmE
+amherst amPst
+amherst amhPst
+amherst amhVst
+ami AmE
+amici @mECE
+amick Amik
+amid @mid
+amidei amidI
+amie AmE
+amiee AmE
+amiens )m/)n
+amiens @mEnz
+amiens am/cnz
+amigo @mig]
+amin amEn
+amin amin
+amissville @misvil
+amissville am6svil
+amistad am6sted
+amit @mit
+amity am6d/
+amityville am6d/vil
+ammo am]
+ammonia @mOn/@
+amoco am@k]
+amod @mod
+amodei am@dI
+amoebas @mEb@z
+among @muN
+amongst @muNst
+amore @m{rA
+amorist @m{r6st
+amorita am@rEd@
+amount @m?nt
+amounts @m?nts
+amphibian amfib/~
+amphipolis amfip@l6s
+amphipolis amfipL6s
+amphitheatre amf6TE@dP
+ample ampL
+amplifications ampl6f6kAS~z
+amplifiers ampl6fIPz
+amputate ampy6tAt
+amputation ampy6tAS~
+amravati )mr)v@t/
+amravati amr@vod/
+amritsar amritsP
+ams Aemes
+amsbaugh amzb{
+amstad amst6d
+amsterdam amstPdam
+amsterdam's amstPdamz
+amsterdams amstPdamz
+amtrak amtrak
+amusement @myUzm~t
+amusements @myUzm~ts
+amway amwA
+amy Am/
+an an
+ana an@
+ana on@
+anabel an@bel
+anaconda an@kond@
+anacortes an@kPts
+anacortes an@k{rtAs
+anacortes an@k{rtez
+anadarko an@d)rk]
+anaesthesia an6sTEZ@
+anaheim an@hIm
+anahuac @nahyUak
+anahuac an@wak
+anaklato an@klod]
+analysis @nal6s6s
+analysts anL6sts
+analyticity @nal6tis6d/
+analyze an@lIz
+anamaria an@m@rE@
+anamoose an@m6s
+anamoose an@mUs
+anarchy anPk/
+anatomical an@tom6kL
+anatomy @nad@m/
+ancestrally ansestr6l/
+ancestry ans6str/
+anchor aNkP
+anchorage aNkP6j
+anchors aNkPz
+anchovy anCOv/
+ancient AnC~t
+and and
+and ~
+and ~d
+andale andAl
+andalusia and@lUZ@
+anderson andPs~
+andersson andPs@n
+anderton andPt@n
+andes andEz
+andover andOvP
+andrada androd@
+andre )ndrA
+andrea andr/@
+andrew andrU
+andrews andrUz
+andries andrEz
+andros andr]z
+andrzejewski andr6jUskE
+andujar andUh)r
+andy and/
+anecdotal an6kdOdL
+anerton anPt@n
+anesthesia an6sTEZ@
+anesthesiology @nesT6SL@j/
+anesthetic an6sTed6k
+angana aNgon@
+angel Anj@l
+angela anj6l@
+angela anj@l@
+angelbeck Anj@lbek
+angele anj@lE
+angeles anjL@s
+angelica anjel6k@
+angelika anjel@k@
+angell anjel
+angella anj@l@
+angelo anj6l]
+angelo's anj6l]z
+angelos anj6l]z
+angels AnjLz
+angelus anj6l@s
+anger aNgP
+angerer aNgPP
+angerman aNgPm@n
+angers )nZA
+angers aNgPz
+angers anjPz
+angert aNgPt
+angie anj/
+angis aNgis
+angle aNgL
+angleberger aNg@lbPgP
+angled aNgLd
+angles aNg@lz
+angleton aNg@lt@n
+anglia aNgl/@
+anglo aNgl]
+angora aNg{r@
+angostura aNg@stUr@
+angrily aNgr6l/
+angry aNgr/
+angus aNg@s
+angwin aNwin
+anh )n
+anika an@k@
+animal an6mL
+animals an6mLz
+animas an/m@s
+animated an6mAd6d
+animosity an6mos6d/
+aniseed on/sEd
+anitra @nEtr@
+anja )ny@
+anjelica anjel6k@
+ankeny aNk~/
+ankle aNkL
+anklebone aNkLbOn
+ann an
+ann_arbor an)rbP
+anna an@
+annabell an@bel
+annabella an@bel@
+annamae an@mA
+annamaria an@m@rE@
+annapolis @napL6s
+annawan an@won
+annawan an@w~
+anne an
+annemarie anm@rE
+annenberg an~bVg
+annette @net
+annexation an6ksAS~
+annexe an6ks
+annexed @nekst
+annie an/
+annihilation @nI@lAS~
+annihilator @nI@lAdP
+annisquam an6skw{m
+annisquam an6skw}
+anniversary an6vVs@r/
+annmarie anm@rE
+annona @nOn@
+annona anOn@
+announced @n?nst
+announcement @n?nsm~t
+announcer @n?nsP
+announcing @n?ns6N
+annoy @n<
+annoyance @n<~s
+annoyances @n<~s6z
+annoying @n<6N
+annoys @n<z
+annual anywL
+annuities @nU6d/z
+annuity @nU6d/
+anoint @n<nt
+anonymity an@nim6d/
+anonymous @non6m@s
+anonymously @non6m@sl/
+another @nuDP
+another's @nuDPz
+anothers @nuDPz
+ansbacher anzbakP
+anselm ansLm
+anselmo anselm]
+ansett ans6t
+ansgar anzg)r
+ansgar anzgP
+anshan )nS)n
+anshan anS~
+answer ansP
+answered ansPd
+answering ansP6N
+answers ansPz
+ant ant
+antagonistic antag@nist6k
+antarctic ant)rkt6k
+antarctica ant)rkt6k@
+anteater antEdP
+antelope ant6lOp
+antenna anten@
+antennae anten/
+anthems anT}z
+anthologies anTol@j/z
+anthology anTol@j/
+anthon anT~
+anthony anT@n/
+anthony anT~/
+anthony's anT~/z
+anthonys anT~/z
+anthracite anTr@sIt
+anthrax anTraks
+anthropologist anTr@pol@j6st
+anti ant/
+antibody ant/bod/
+anticipated antis6pAd6d
+antique antEk
+antiques antEks
+antiquity antikw6d/
+antithesis antiT6s6s
+antler antlP
+antoine antw)n
+antoinette antw@net
+anton anton
+antonich ant@nik
+antonio antOny]
+antonito ant@nEd]
+antonito ant]nEt]
+antonsen ant@ns6n
+ants ants
+anxiety aNzI6d/
+anxious aNkS@s
+any en/
+anya )ny@
+anybody en/bud/
+anyhow en/h?
+anymore en/m{r
+anyone en/wun
+anyone's en/wunz
+anyones en/wunz
+anything en/T6N
+anything's en/T6Nz
+anythings en/T6Nz
+anyway en/wA
+apache @paC/
+aparicio @p@risEO
+apart @p)rt
+apartment @p)rtm~t
+apex Apeks
+aplington @pliNt~
+apocryphal @pokr6fL
+apollo @pol]
+apology @pol@j/
+apostrophe @postr@f/
+appalachia ap@lAC@
+appalachia ap@lAS@
+appalachia ap@laC/@
+appalachian ap@lAC~
+appalling @p{l6N
+appallingly @p{l6Nl/
+apparatus ap@rad@s
+apparent @par~t
+apparently @par~tl/
+appealing @pEl6N
+appear @pEr
+appearance @pEr~s
+appearances @pEr~s6z
+appeared @pErd
+appears @pErz
+append @pend
+appetite ap6tIt
+appetizers ap6tIzPz
+applauds @pl{dz
+applause @pl{z
+apple apL
+applebaum ap@lb{m
+applebee ap@lbE
+applebee's apLbEz
+applebees apLbEz
+appleberry ap@lberE
+applebury ap@lberE
+appleby ap@lbE
+applecart apLk)rt
+applegarth ap@lg)rT
+applegate ap@lgAt
+applejack apLjak
+appleman ap@lm6n
+apples apLz
+applesauce apLs{s
+appleseed apLsEd
+appleton apLt~
+applewhaite ap@lwIt
+applewhite apLwIt
+appleyard apLy)rd
+appliances @plI~s6z
+applicability apl6k@bil6d/
+applicable apl6k@bL
+applicants apl6k~ts
+application apl6kAS~
+applications apl6kAS~z
+applied @plId
+applies @plIz
+apply @plI
+appointed @p<nt6d
+appointment @p<ntm~t
+appointments @p<ntm~ts
+appoints @p<nts
+appraisal @prAzL
+appreciate @prES/At
+appreciated @prES/Ad6d
+appreciation @prES/AS~
+appreciatively @prES@d6vl/
+appreciativeness @prES@d6vn6s
+apprehended apr6hend6d
+apprehensible apr6hens@bl
+apprehensively apr6hens6vl/
+apprenticeship @prent6sSip
+approach @prOC
+approached @prOCt
+approaches @prOC6z
+appropriate @prOpr/6t
+appropriateness @prOpr/6tn6s
+approval @prUvL
+approvals @prUvLz
+approve @prUv
+approved @prUvd
+approvingly @prUv6Nl/
+approximate @proks6m6t
+approximated @proks6mAd6d
+approximately @proks6m6tl/
+approximating @proks6mAd6N
+approximation @proks6mAS~
+apricots apr6kots
+april Apr6l
+april AprL
+aprons Apr~z
+apruzzese aprUzesE
+apryl Apr6l
+aptitude apt6tUd
+apulia @pyUl/@
+apuzzo apUtzO
+aquamarine okwom@rEn
+aquarium @kw,r/}
+aquarius @kw,r/@s
+aquatic @kwod6k
+aqueducts akw6dukts
+aquil @kEl
+aquilar )kEl)r
+aquilera akElAr@
+aquino @kEnO
+arabic ar@b6k
+aracaju ar@k@ZU
+aracaju ar@kajU
+aracely Ar@selE
+arachnid @rakn6d
+aragon )r@g)n
+aran @ran
+aranjo @r)nhO
+arapaho @rap@h]
+arbitrary )rb6trer/
+arbitrate )rb6trAt
+arbor )rbP
+arboreal )rb{r/L
+arbuthnot orbyUTn6t
+arc )rk
+arcade )rkAd
+arcade orkAd
+arcadia )rkAd/@
+arcangel )rkAnj@l
+arcanum )rk~}
+arcata )rkod@
+arch )rC
+archaeological )rkE@loj6kL
+archaeologists )rk/ol@j6sts
+archana )rCan@
+archana )rkan@
+archangel )rkAnj@l
+archbald )rCb{ld
+archbishop )rCbiS@p
+archdeacon )rCdEk~
+arched )rCt
+archenemy )rCen6m/
+archeological )rkE@loj6kL
+archer )rCP
+archerfish )rCPfiS
+archie )rC/
+architect )rk6tekt
+architects )rk6tekts
+architectural )rk6tekC@rL
+architecture )rk6tekCP
+archive )rkIv
+archway )rCwA
+arcola )rkOl@
+arcola orkOl@
+arcoraci )rk@r)CE
+ardan )rdan
+arden )rd~
+ardmore )rdm{r
+ardsley )rdzl/
+are )r
+area ,r/@
+areaquipia ar6kwip/@
+areas ,r/@z
+arecibo )r@sEb]
+arecibo ar6sib]
+arehart Arh)rt
+arellanes )r@y)n@s
+aren't )rnt
+arena's @rEn@z
+arenas @rEn@z
+arent )rnt
+arequipa ar@kEp@
+aretha @reT@
+arevalo Ar@v)lO
+arey ArE
+argenbright )rg6nbrIt
+argentina orj~tEn@
+argentinians orj~tin/~z
+argo )rg]
+argon )rgon
+arguably )rgyU@bl/
+argue )rgyU
+argued )rgyUd
+arguing )rgyU6N
+argument )rgy6m~t
+argumentation )rgy6m~tAS~
+argumentative )rgy6ment@d6v
+arguments )rgy6m~ts
+argus )rg@s
+argusville )rg@svil
+argyl )rgL
+argyl orjL
+argyle )rgIl
+arica @rEk@
+arica ar6k@
+arico ArikO
+arie )rE
+aries ,r/z
+aries ArEz
+arise @rIz
+aristocratic @rist@krad6k
+arithmetic @riTm6tik
+ariton ar6t~
+arizona ar6zOn@
+arizona's ar6zOn@z
+arizonas ar6zOn@z
+ark )rk
+arkadelphia )rk@delf/@
+arkady )rkAd/
+arkansas )rkanz@s
+arkansas )rk~s{
+arkdale )rkdAl
+arkhangelsk )rkangelsk
+arkhangelsk )rkanjLsk
+arkla )rkl@
+arkoma )rkOm@
+arkville )rkvil
+arlean )rlEn
+arline )rlEn
+arlinghaus )rliNh?s
+arlington )rl6Nt~
+arlington )rliNt~
+arlmont )rlmont
+arlo )rl]
+arlyne )rlEn
+arm )rm
+armacost )rm@k6st
+armavir )rm@vP
+armavir )rm@vir
+armchair )rmC,r
+armchairs )rmC,rz
+armed )rmd
+armer )rmP
+armhole )rmhOl
+armijos )rmEhOs
+armington )rmiNt~
+armitage )rm6d6j
+armload )rmlOd
+armonk )rm6Nk
+armonk )rm~k
+armpad )rmp6d
+armpit )rmpit
+armrest )rmrest
+arms )rmz
+armstrong )rmstr{N
+armstrong's )rmstr{Nz
+armstrongs )rmstr{Nz
+armuchee )rm6CE
+armuchee )rm@CE
+armuchee )rmqC/
+army )rm/
+arnaud )rn)d
+arne )rnA
+arnegard )rn6g)rd
+arnegard )rn6gPd
+arnett )rn6t
+arnold )rnLd
+arnoldsburg )rnLdzbVg
+arnoldson )rnLds~
+aron Ar@n
+aronson Ar6ns@n
+arose @rOz
+around @r?nd
+arousing @r?z6N
+arrange @rAnj
+arranged @rAnjd
+arrangement @rAnjm~t
+arrangements @rAnjm~ts
+arrest @rest
+arrested @rest6d
+arrests @rests
+arrival @rIvL
+arrivals @rIvLz
+arrive @rIv
+arrived @rIvd
+arriving @rIv6N
+arrojo @rOhO
+arrow ar]
+arrowhead ar]hed
+arrowheads ar]hedz
+arrowood ArOwqd
+arrowroot ar]rUt
+arrowsmith ar]smiT
+arrowwood ar]wqd
+arsenault )rs@nO
+arsenic )rs~6k
+art )rt
+artale )rtalA
+arterial )rtEr/L
+artesia )rtEZ@
+arthur )rTP
+arthurdale )rTPdAl
+artichokes )rd6COks
+article )rd6kL
+articulate )rtiky@lAt
+articulating )rtiky@lAd6N
+articulation )rtiky6lAS~
+artifacts )rd6fakts
+artificial )rd6fiSL
+artist )rd6st
+artistic )rtist6k
+artists )rd6sts
+arts )rts
+artwork )rtwVk
+arvada )rvod@
+arvin )rv~
+arwood )rwqd
+arzate )rz)tE
+as az
+asberry azbArE
+asbury_park azbr/p)rk
+ascending @send6N
+ascent @sent
+ascheman aSm6n
+aschenbrenner aS~brenP
+ascot ask6t
+ashamed @SAmd
+ashanti @S)ntE
+ashbrook aSbrqk
+ashburn aSbVn
+ashburnham aSbPnham
+ashburnham aSbVn}
+ashby aSb/
+ashcraft aSkraft
+ashcroft aSkr{ft
+ashdown aSd?n
+ashe aS
+asheboro @SEbV]
+asheboro aSbur]
+ashenberg aS~bVg
+asherton aSPt~
+ashes aS6z
+asheville aSvil
+ashland aSland
+ashland aSl~d
+ashland's aSlandz
+ashlands aSlandz
+ashlee aSlE
+ashleigh aSlE
+ashley aSl/
+ashlin aSl~
+ashmore aSm{r
+ashore @S{r
+ashtabula @Staby6l@
+ashton aSt~
+ashtray aStrA
+ashwaubenon @Sw{b~~
+ashwell aSwel
+asia AZ@
+asia's AZ@z
+asian AZ~
+asias AZ@z
+aside @sId
+asiedu @sEdU
+asif asif
+ask ask
+asked askt
+askew @skyU
+asking ask6N
+asks asks
+asleep @slEp
+asmara @smor@
+asmara azm)r@
+asotin AsOt~
+asp asp
+aspect aspekt
+aspects aspekts
+aspen asp~
+aspermont aspPmont
+aspermount aspPm?nt
+aspersion @spVZ~
+aspinwall asp6nw{l
+aspinwall asp~w{l
+aspirin's aspr~z
+aspirins aspr~z
+asquith @skwiT
+ass as
+assailants @sAl~ts
+assassin @sas~
+assassins @sas~z
+assemblage @sembl6j
+assembled @sembLd
+assembling @sembl6N
+assemblymen @sembl/m~
+assess @ses
+assessed @sest
+assesses @ses6z
+assessment @sesm~t
+asset aset
+assets asets
+assign @sIn
+assignment @sInm~t
+assignments @sInm~ts
+assimilate @sim6lAt
+assist @sist
+assistance @sist~s
+assistant @sist~t
+assistants @sist~ts
+assistantship @sist~tSip
+assisted @sist6d
+assiut asI@t
+associated @sOS/Ad6d
+associates @sOS/Ats
+association @sOS/AS~
+associations @sOS/AS~z
+assonet as]net
+assonet as~6t
+assortment @s{rtm~t
+assume @sUm
+assumes @sUmz
+assumption @sumpS~
+assumptionist @sumpS~6st
+assumptions @sumpS~z
+assumptive @sumpt6v
+assumptively @sumpt6vl/
+assurance @SUr~s
+assure @SUr
+assured @SUrd
+assuredly @SUr6dl/
+assures @SUrz
+assuring @SUr6N
+astaire @st,r
+astatula @staty@l@
+astatula ast@tUl@
+aster astP
+asteria @stEr/@
+asterisk astPisk
+asterisks ast@r6sks
+asteroid ast@r<d
+asthma azm@
+asthmatic azmad6k
+astin ast~
+astle as@l
+astonishing @ston6S6N
+astonishingly @ston6S6Nl/
+astrology @strol@j/
+astronaut astr@n{t
+astronauts astr@n{ts
+astronomer @stron}P
+astronomical astr@nom6kL
+astronomically astr@nom6kl/
+astronomy @stron@m/
+astrophysics astr]fiz6ks
+astula asC6l@
+asuncion @sqns/On
+asuncion @sunS~
+asymptote @simpt6t
+asymptotic as@mptod6k
+at at
+atalanta at@lant@
+atascadero ad@sk@dar]
+atchley aClE
+ate At
+atglen atgl~
+atheist AT/6st
+atheists AT/6sts
+athelstane aTLstAn
+athena @TEn@
+athens aT~z
+atherton aDPt@n
+athlete aTlEt
+athlete's aTlEts
+athletes aTlEts
+athletic aTled6k
+athletics aTled6ks
+athlone @TlOn
+athyn @TIn
+atilano at6l)nO
+atkin atk~
+atkins atk~z
+atkinson atk~s~
+atlanta @tlant@
+atlanta atlant@
+atlantic @tlant6k
+atlantis @tlant6s
+atm AtEem
+atmore atmP
+atmosphere atm6sfEr
+atmospheric atm6sfar6k
+atmospherics atm6sfar6ks
+atoka @tOk@
+atomic @tom6k
+atomics @tom6ks
+atoms ad}z
+atop @top
+attach @taC
+attached @taCt
+attachment @taCm~t
+attack @tak
+attacked @takt
+attacks @taks
+attained @tAnd
+attapulgus ad@pulg@s
+attapulgus at@pqlg@s
+attempt @tempt
+attempted @tempt6d
+attempts @tempts
+attenborough ad~bV]
+attend @tend
+attendance @tend~s
+attendant @tend~t
+attention @tenS~
+attenuation @tenyUAS~
+attic ad6k
+attired @tIrd
+attitude ad6tUd
+attleboro adLbV]
+attleboro atLbur]
+attleson at@ls@n
+attract @trakt
+attracted @trakt6d
+attracting @trakt6N
+attraction @trakS~
+attractions @trakS~z
+attractive @trakt6v
+attributed @triby6d6d
+attribution atr6byUS~
+atwell atwL
+atwood atwqd
+atypical Atip6kL
+aubrey {br/
+auburn {bPn
+auburndale {bPndAl
+auburntown {bPnt?n
+auch ?C
+auch ?S
+auch {k
+auckland {kl~d
+auction {kS~
+auctioneer {kS@nEr
+auctions {kS~z
+audacious {dAS@s
+audaciously {dAS@sl/
+audacity {das6d/
+audience {d/~s
+audio {d/]
+audiogram {d/]gram
+audiolamps {d/]lamps
+audiolocks {d/]loks
+audition {diS~
+auditorium {d6t{r/}
+auditors {d6dPz
+auditory {d6t{r/
+audits {d6ts
+audo {d]
+audrey {dr/
+audubon {j6b~
+auer ?P
+auerbach ?Pb)k
+augenstein {g@nstIn
+augmentation {gm~tAS~
+augmented {gment6d
+augsburg {gzbPg
+augsburg {gzbVg
+august {gust
+augusta @gust@
+augustine {g6stEn
+augustus @gust@s
+auila ?El@
+aukamp Okamp
+aulander {l~dP
+ault {lt
+aunt ant
+aurora @r{r@
+aurore @r{r@
+auspice {sp6s
+auspiciously {spiS@sl/
+austere {stEr
+austin {st~
+austinville {st~vil
+australia {strAl/@
+australian {strAl/~
+australians {strAl/~z
+austrian {str/~
+austwell {stwel
+autaugaville {t{g@vil
+authentic {Tent6k
+author {TP
+author's {TPz
+authoring {TP6N
+authoritarian @T{r6t,r/~
+authoritatively @T{r6tAd6vl/
+authorities @T{r6d/z
+authority @T{r6d/
+authorization {TP6zAS~
+authorized {TPIzd
+authorizing {TPIz6N
+authors {TPz
+authorship {TPSip
+autistic {tist6k
+auto {tO
+auto {t]
+auto {to
+autocorrelation {d]k{r6lAS~
+autofluorescence {d]fl@res~s
+autographs {d@grafs
+autolamp {tOlamp
+autolamp {t]lamp
+autolamp {tolamp
+autolamps {tOlamps
+autolamps {t]lamps
+autolamps {tolamps
+autolane {d]lAn
+autolock {tOlok
+autolock {t]lok
+autolock {tolok
+autolocks {tOloks
+autolocks {t]loks
+autolocks {tol]ks
+autolocks {toloks
+automacize {d]masIz
+automakers {d]mAkPz
+automated {d@mAd6d
+automatic {t@mat6k
+automatic {t]mat6k
+automatically {d@mad6kl/
+automobile {d@m@bEl
+automobiles {d@m@bElz
+automotive {d@mOd6v
+autonomy {ton@m/
+autopc {t@pEsE
+autopilot {d]pIl6t
+autopsy {tops/
+autoset {t@set
+autostore {tOst{r
+autostore {t]st{r
+autostore {tost{r
+autryville {tr/vil
+autumn {d}
+auxiliary {gzily@r/
+ava ov@
+availability @vAl@bil6d/
+available @vAl@bL
+avalanche av@lanC
+avalos @v)lOs
+avant )v)nt
+ave )vA
+avenal av~L
+avendale Av~dAl
+avenged @venjd
+avenue av6nU
+average avP6j
+average avr6j
+averages avr6j6z
+averell av@rel
+avero @var]
+aversely @vVsl/
+aversion @vVZ~
+aversions @vVZ~z
+averted @vVd6d
+avery AvPE
+avery's Av@r/z
+averys Av@r/z
+aviation Av/AS~
+aviles )v6l6s
+avis Av6s
+avner avnP
+avocado av@kod]
+avocados av@kod]z
+avoid @v<d
+avoidance @v<d~s
+avoided @v<d6d
+avoiding @v<d6N
+avoids @v<dz
+avon Avon
+avon Av~
+avon's Avonz
+avondale AvondAl
+avons Avonz
+avoset av@s6t
+avowed @v?d
+aw o
+awaited @wAd6d
+awake @wAk
+awakened @wAk~d
+awarded @w{rd6d
+awards @w{rdz
+aware @w,r
+awareness @w,rn6s
+away @wA
+awe {
+awendaw {end{
+awesomeness {s@mn6s
+awful {fL
+awh {
+awkward {kwPd
+awning {n6N
+awoke @wOk
+axe aks
+axis aks6s
+axle aksL
+ay I
+aydelott Idl)t
+ayden Ad~
+ayden Id~
+aye I
+ayesha IES@
+ayres Arz
+ayscue AskyU
+ayzenshtat Iz6nStat
+ayzenshtat az6nStat
+azalee @zAlE
+aziz @zEz
+azle AzL
+azure aZP
+azurite az@rIt
+azusa @zUs@
+b b
+b bE
+babbitt bab6t
+babbled babLd
+babe bAb
+babes bAbz
+babione babEOnE
+baboon babUn
+baby bAb/
+babyish bAb/6S
+babylon bab6lon
+babylon bab@lon
+bach b)k
+bache b)k
+bachelder b)keldP
+bachelor baC6lP
+bachelors baC6lPz
+bacher b)kP
+bachert b)kPt
+bachhuber b)khyUbP
+bachman b)km6n
+bachmann b)km@n
+bachmeier b)kmIP
+bachner b)knP
+bachtell b)ktel
+bachus b)k6s
+back bak
+backaches bakAks
+backbone bakbOn
+backbreaking bakbrAk6N
+backcourt bakk{rt
+backdrop bakdrop
+backed bakt
+backenstose bak~stOs
+backfire bakfIr
+backfires bakfIrz
+backgammon bakgam~
+background bakgr?nd
+backhoe bakhO
+backlogged bakl{gd
+backpack bakpak
+backrest bakrest
+backs baks
+backslapping bakslap6N
+backsliding bakslId6N
+backstreet bakstrEt
+backstretch bakstreC
+backstroke bakstrOk
+backtracked baktrakt
+backues bakUz
+backup bakup
+backups bak@ps
+backward bakwPd
+backwards bakwPdz
+backwoods bakwqdz
+backyard baky)rd
+backyards baky)rdz
+bacliff bakl6f
+bacon bAk~
+baconton bAk~t~
+bacteria baktEr/@
+bacterial baktEr/L
+bad bad
+badalona b)d@lOn@
+bader bAdP
+badge baj
+badger bajP
+badgerly bajPl/
+badin bad~
+badly badl/
+badmintons badmit~z
+badness badn6s
+baez bIez
+baeza bAz@
+baffle bafL
+baffled bafLd
+bag bag
+bagaoisan bag?6s@n
+bagels bAgLz
+bagen bag@n
+baggerly bagPl/
+baggs bagz
+baghdad b)gd)d
+baghdad bagdad
+baginski b@ginskE
+bagnell bagnel
+bagner bagnP
+bagpipes bagpIps
+bags bagz
+bagshaw bagS{
+bagwell bagwel
+bah b)
+bahama b@hom@
+bahamonde b)h@m)ndE
+bahar b@h)r
+bahia b@hE@
+bahia bAh/@
+bahr b)r
+bail bAl
+baileyville bAl/vil
+baillargeon bAl)rjy6n
+baily bAl/
+bainbridge bAnbrij
+bainbridge's bAnbrij6z
+bainbridges bAnbrij6z
+bainville bAnvil
+baird bard
+baires bArz
+baj b)Z
+bajorek bajOrek
+bake bAk
+baked bAkt
+bakeley bAklE
+bakemeier bAkmIP
+baker bAkP
+bakers bAkPz
+bakersfield bAkPzfEld
+bakerstown bAkPzt?n
+bakerton bAkPt~
+bakery bAkP/
+bakeware bAkw,r
+bal bal
+balance bal~s
+balanced bal~st
+balancing bal~s6N
+balazs b)l@z
+balbuena b)lbwAn@
+balch balC
+balckburn b{kbPn
+balconies balk~/z
+balcony balk~/
+bald b{ld
+baldassarre b{ld@s)r
+baldly b{ldl/
+baldwin b{ldwin
+baldwin's b{ldwinz
+baldwins b{ldwinz
+bale bAl
+balfour balfP
+balked b{kt
+ball b{l
+ballagh bal{
+ballarat bal@r6t
+ballarat bal@rat
+ballardvale balPdvAl
+balle balE
+ballengee bal6njE
+ballet balA
+ballets balAz
+ballintyn balintIn
+ballistic b@list6k
+balloon b@lUn
+balloonfish b@lUnfiS
+ballooning b@lUn6N
+balloons b@lUnz
+ballot bal6t
+balloting bal@d6N
+ballparks b{lp)rks
+ballplayer b{lplAP
+ballreich balrIk
+ballroom b{lrUm
+ballrooms b{lrUmz
+balls b{lz
+ballston balst~
+ballston b{lst~
+ballwin b{lwin
+ballyhoo bal6hU
+balmes b{lmz
+balmoral b)m{rL
+balmoral balmrL
+balmoral bom{rL
+balogh balO
+balsa b{ls@
+balsam b{ls}
+balsiger b{ls6gP
+baltic b{lt6k
+baltimore b{lt6mP
+baltimore b{lt6m{r
+baltimore's b{lt6m{rz
+baltimores b{lt6m{rz
+bamberger bambVgP
+bamboo bambU
+ban ban
+banana b@nan@
+bananas b@nan@z
+bancroft bankr{ft
+bancroft's bankr{fts
+bancrofts bankr{fts
+band band
+banda b)nd@
+banda band@
+bandage band6j
+bandaged band6jd
+bandages band6j6z
+bandanna bandan@
+bandbox bandboks
+banded band6d
+bandleader bandlEdP
+bandmaster bandmastP
+bandon bandon
+bandon band~
+bands bandz
+bandwagon bandwag~
+bandwidth bandwidT
+banfield banfEld
+bangalore baNg@l{r
+bangalore baNgLP
+bangert baNPt
+bangkok baNgkok
+bangkok baNkok
+banister ban6stP
+banjo banj]
+banjul b)njUl
+banjul banjL
+bank baNk
+bankbook baNkbqk
+bankcroft's baNkkr{fts
+bankcrofts baNkkr{fts
+banked baNkt
+bankers baNkPz
+bankhead baNkhed
+banking baNk6N
+banknote baNknOt
+bankrolls baNkrOlz
+bankrupt baNkr@pt
+bankruptcies baNkrupts/z
+bankrupting baNkr@pt6N
+banks baNks
+bankshares baNkS,rz
+bankside baNksId
+bankson baNks~
+bankston baNkst~
+banned band
+banquets baNkw6ts
+bantam bant}
+baptism baptiz}
+baptismally baptizm6l/
+baptisms baptiz}z
+baptiste baptEst
+baptiste batEst
+baptiste batEst@
+baptize baptIz
+baptized baptIzd
+bar b)r
+bar_harbor b)rh)rbP
+barabara b)r@b)r@
+baracaldo b)r@k)ld]
+baracaldo bar@kald]
+barb b)rb
+barb's b)rbz
+barbados b)rbAd]s
+barbara b)rbr@
+barbarianism b)rb,r/@niz}
+barbaric b)rbar6k
+barbe b)rbE
+barbecue b)rb6kyU
+barbed b)rbd
+barbells b)rbelz
+barbeque b)rbek
+barbershop b)rbPSop
+barberton b)rbPt~
+barbourmeade b)rbPmEd
+barbs b)rbz
+barbur b)rbP
+barcelona's b)rs6lOn@z
+barcelonas b)rs6lOn@z
+barcroft b)rkr{ft
+bardsley b)rdzl/
+bare b,r
+bareback b,rbak
+barefaced b,rfAst
+barefield b,rfEld
+barefoot b,rfqt
+barely b,rl/
+barenaked bar~6kt
+barfield b)rfEld
+barfoot b)rfqt
+bargains b)rg~z
+barge borj
+baring b,r6N
+bark b)rk
+barkeyville b)rk/vil
+barkley b)rkl/
+barksdale b)rksdAl
+barley b)rl/
+barleycorn b)rl/k{rn
+barlow b)rl]
+barlowe b)rlO
+barn b)rn
+barncastle b)rnkas@l
+barnes b)rnz
+barnesboro b)rnzbP]
+barnesboro b)rnzbV]
+barneston b)rn6st~
+barnesville b)rnzvil
+barneveld b)rn6vLd
+barneveld b)rn@veld
+barney b)rn/
+barnhouse b)rnh?s
+barns b)rnz
+barnstable b)rnst@bL
+barnum b)rn}
+barnyard b)rny)rd
+barometer b@rom6dP
+barometric bar@metr6k
+barone b@rOn
+barrack bar6k
+barrackville bar6kvil
+barracuda bar@kyUd@
+barrage bPoZ
+barraged bPoZd
+barre b)r
+barred b)rd
+barrel barL
+barrens bar~z
+barretta b@red@
+barricades bar6kAdz
+barriers b,r/Pz
+barrington bariNt~
+barrins bar~z
+barron bar~
+barrow bar]
+barryville b,r/vil
+barryville bar/vil
+bars b)rz
+barstool b)rstUl
+bart b)rt
+barthel b)rTL
+bartholomew b)rT)l@myU
+bartles b)rt@lz
+bartleson b)rt6ls6n
+bartlesville b)rdLzvil
+bartlett b)rtl6t
+bartley b)rtl/
+bartoldus b)rtOldus
+bartolomei b)rt{lOmI
+barton b)rd~
+bartonville b)rd~vil
+bartonville b)rt~vil
+bartylla b)rtil@
+baruch b@rUk
+bary ber/
+basalt bas{lt
+basco bask]
+base bAs
+baseball bAsb{l
+baseball's bAsb{lz
+baseballs bAsb{lz
+based bAst
+baseline bAslIn
+basemen bAsm~
+basemore bAsm{r
+baseplate bAsplAt
+bashaw b@S)
+bashford baSfPd
+bashfully baSfL/
+basic bAs6k
+basich bAs6k
+basildon bAzLd~
+basildon basLd~
+basildon bazLd~
+basinger bAsiNP
+basis bAs6s
+baskerville baskPvil
+basket bask6t
+basketball bask6tb{l
+basketwork bask6twVk
+bass bAs
+bass bas
+bastrop bastr@p
+bat bat
+bataan b@t)n
+batches baC6z
+batchtown baCt?n
+bateman bAtm6n
+batesburg bAtsbVg
+batesland bAtsland
+batesman bAtsm~
+batesville bAtsvil
+batey bAtE
+bath baT
+bathe bAD
+bathgate baTgAt
+bathhouse baTh?s
+bathing bAD6N
+bathrobe baTr@b
+bathroom baTrUm
+baths baTs
+bathtub baTtub
+bathtubs baTtubz
+batiste b@tEst
+baton b@ton
+batons b@tonz
+bats bats
+batsman batsm~
+batsmen batsm~
+batter badP
+batteries badP/z
+battersea badPsE
+battersea batPsE
+battery batP/
+battin bad~
+batting bad6N
+battle badL
+battleboro batLbP]
+battlefront badLfrunt
+battleground badLgr?nd
+battleplane badLplAn
+battles badLz
+battleship badLSip
+battletown badLt?n
+battletown batLt?n
+baud b{d
+baudette b)det
+baudette b?dct
+baudette b?det
+baudette b{det
+baugess b{gis
+baughan b)n
+baugher b?P
+baughey b?E
+baughman b?m6n
+baughn b{n
+bauman b?m~
+baumgardner b?mg)rdnP
+baumgartner b?mg)rtnP
+bausch b{S
+bauxite b{ksIt
+bavaria b@v,r/@
+bawty b{d/
+baxter bakstP
+bay bA
+bayamo b@y)m]
+bayboro bAbP]
+bayboro bAbV]
+bayers bAPz
+bayes bAz
+bayless bAl6s
+bayless bAles
+bayonne bAOn
+bayou bIyU
+bayport bAp{rt
+bayshore bAS{r
+bayside bAsId
+baytown bAt?n
+bayuk bIy@k
+bayville bAvil
+baywood bAwqd
+bazaar b@z)r
+bazarte b@z)rtA
+bazemore bAzm{r
+bazine bazEn
+bazooka b@zUk@
+be bE
+beabout bE@b?t
+beach bEC
+beachers bECPz
+beachfront bECfrunt
+beachheads bEChedz
+beachler bEClP
+beachwear bECw,r
+beacon bEk~
+beaconfield bEk~fEld
+beaconsfield bEk~zfEld
+beadles bEd@lz
+beads bEdz
+beadwork bEdwVk
+beagle bEgL
+beak bEk
+beale bEl
+beam bEm
+beames bEmz
+beamesderfer bEmzdPfP
+beams bEmz
+beanenstock bEn~stok
+beanfest bEnf6st
+beans bEnz
+beanshooter bEnSUdP
+beanstalk bEnst{k
+beantown bEnt?n
+bear b,r
+bear_lake b,rlAk
+bearcat b,rkat
+bearcreek b,rkrEk
+beard bErd
+beardless bErdl6s
+beardmore bErdm{r
+beards bErdz
+beardsley bErdzl/
+bearpaw bErp{
+bears b,rz
+bearskin b,rskin
+bearsville b,rzvil
+bearwood b,rwqd
+beasley bEzl/
+beat bEt
+beathe bET
+beatles bEdLz
+beatniks bEtn6ks
+beatrice bE@tr6s
+beatriz bE@tr6z
+beatty bEd/
+beauchamp bOS)mp
+beaudreault bOdrO
+beaulah byUl@
+beaumont bOmont
+beaupre bOprE
+beauregard b{r6gPd
+beautician b/tiS~
+beautification byUd6f6kAS~
+beautiful byUd6fL
+beautifully byUd6fl/
+beauty byUd/
+beaver bEvP
+beaverboard bEvPb{rd
+beavercreek bEvPkrEk
+beaverdam bEvPdam
+beaverdam bEvPd}
+beaverton bEvPt~
+beaverville bEvPvil
+bebe bEbE
+becalmed b/komd
+became b/kAm
+because b/kuz
+beccue bekyU
+bech bek
+becherer bek@rP
+bechman bekm@n
+bechtel bektel
+bechtelsville beCtLzvil
+bechthold bekthOld
+bechtol bektOl
+bechtold bekt@ld
+beck bek
+becker bekP
+beckerdite bekPdIt
+beckles bek@lz
+beckley bekl/
+beckman bekm~
+beckons bek~z
+beckstead beksted
+becky bek/
+become b/kum
+becomes b/kumz
+becoming b/kum6N
+bed bed
+bedbug bedbug
+bedbugs bedbugz
+bedclothes bedkl@Dz
+bedcover bedkOvP
+bedford bedfPd
+bedframe bedfr}
+bedgood bedgqd
+bedias b6dI@s
+bedlam bedl}
+bedminster bedm~stP
+bedroom bedrUm
+bedrooms bedrUmz
+beds bedz
+bedside bedsId
+bedspread bedspred
+bedspring bedspriN
+bedsprings bedspriNz
+bedtime bedtIm
+bedwarmer bedwPmP
+bee bE
+beebe bEbE
+beech bEC
+beechcraft bECkraft
+beechgrove bECgrOv
+beechler bEClP
+beechnut bECnut
+beef bEf
+beefburger bEfbVgP
+beefcake bEfkAk
+beefsteak bEfstAk
+beefwood bEfwqd
+beehive bEhIv
+beeline bElIn
+been bin
+beep bEp
+beeper bEpP
+beepers bEpPz
+beer b,r
+beer bEr
+beerhouse bErh?s
+beersheba bPSEb@
+beeswax bEzwaks
+beethoven's bAtOv~z
+beethovens bAtOv~z
+beetle bEdL
+beetles bEdLz
+beeville bEvil
+before b@f{r
+beg beg
+began b/gan
+begaye b@gA
+beggar begP
+begged begd
+begging beg6N
+begin b/gin
+begin b6gin
+beginning b/gin6N
+beginning b6gin6N
+beginnings b/gin6Nz
+begins b/ginz
+begun b/gun
+behalf b/haf
+behave b/hAv
+behaved b/hAvd
+behaving b/hAv6N
+behavior b/hAvyP
+behaviors b/hAvyPz
+behind b/hInd
+beidleman bEd@lm@n
+beige bAZ
+beijing bAZiN
+being bEiN
+beings bE6Nz
+beirut bArUt
+beirut's bArUts
+beiruts bArUts
+bejar b@h)r
+bejou bejU
+bekerman bekPm@n
+bel bel
+belarus bel@rUs
+belched belCt
+belching belC6N
+belding beld6N
+belem b@lem
+belfair belf,r
+belfast bclfast
+belfast belfast
+belgaum bclg?m
+belgaum belg{m
+belgium belj}
+belgium's belj}z
+belgiums belj}z
+belgrade belgrAd
+believe b/lEv
+believed b/lEvd
+believer b/lEvP
+believes b/lEvz
+belington bel6Nt~
+belington beliNt~
+belisle belIl
+belittle b/lidL
+belknap belnap
+bell bel
+bellafiore bel@fE{rA
+bellboy belb<
+bellbrook belbrqk
+belle bel
+bellefontaine b/lef~tAn
+bellerose bel@rOz
+belleville belvil
+bellevue bel6vU
+bellhop bel@p
+bellhops bel@ps
+bellingham beliNham
+bellisle belIl
+bellmawr belmP
+bellmore belm{r
+bellows bel]z
+bells belz
+bellsouth bels?T
+bellvue belvyU
+bellwood belwqd
+belmond belm~d
+belmont belmont
+beloit b@l<t
+beloit bel<t
+belong b/l{N
+belonging b/l{N6N
+belongs b/l{Nz
+beloved b@luv6d
+below b/lO
+belsano bLson]
+belsano bcls)n]
+belsheim belSIm
+belt belt
+beltline beltlIn
+beltman beltm~
+belton belt~
+beltre beltr@
+belts belts
+beltsville beltsvil
+beltway beltwA
+belview belvyU
+belvue belvyU
+belyea belE@
+bemidji b@mij/
+bemis bEm6s
+bemis bem6s
+ben ben
+ben bin
+ben_hill benhil
+bena bEn@
+benabides ben@bEdes
+benadryl ben@drL
+benavides ben@vEd6s
+benavidez ben@vEtez
+benbrook benbrqk
+bench benC
+benches benC6z
+benchley benCl/
+benchmarks benCm)rks
+benchwarmer benCwPmP
+bend bend
+bendel bendL
+bender bendP
+bendix bendiks
+bene benA
+beneath b/nET
+benedek ben6dek
+beneficiaries ben6fiS/,r/z
+benefield ben6fEld
+benefit ben6f6t
+benefits ben6f6ts
+bengals beNgLz
+benge beN
+benguela b6Ngel@
+benguela bcNgwel@
+benguela bcngwel@
+benicia b/niS@
+benitez b@nEtez
+benjamin benj@m~
+benjamin's benj@m~z
+benjamins benj@m~z
+benmont benmont
+bennett ben6t
+bennigan ben6g~
+bennington beniNt~
+benoit ben<t
+bensenville bens~vil
+benson bens~
+bensonhurst bens~hVst
+bent bent
+bentley bentl/
+benton bent~
+bentonia bcntOny@
+bentonville bent~vil
+bentree bentrE
+bentsen bents~
+benwood benwqd
+benzie benz/
+bequests b/kwests
+berea b,r/@
+berea b@rE@
+bereft b/reft
+berenschot ber@nS)t
+berenson bEr~s~
+berg bVg
+bergamo bPgom]
+bergamo bVg@m]
+bergeman bPgm@n
+bergemann bPgm@n
+bergen bVj~
+bergenfield bVj~fEld
+berger bVgP
+bergey bPgE
+berglund bVgl~d
+bergner bPgnP
+bergs bVgz
+berkeley bVkl/
+berkley bVkl/
+berkovitz bVk@v6ts
+berkowitz bVk]6ts
+berkshire bVkSP
+berland bVland
+berlin bPlin
+berlin bVl6n
+berlin's bPlinz
+berlins bPlinz
+berman's bVm~z
+bermans bVm~z
+bermuda bPmyUd@
+bermudes bPmyUd6s
+bern bVn
+bernabe bPn@bE
+bernadette bVn@det
+bernard bPn)rd
+bernardino bVnPdEn]
+bernardo bPn)rd]
+bernd bVnd
+berneice bPnEs
+bernhard bVnPd
+bernice bPnEs
+bernie bVn/
+berniece bPnEs
+bernstadt bVnstat
+bernstadt bernSt)t
+berrien b,r/~
+berringer bar~jP
+berry ber/
+berryhill b,r/hil
+berryhill ber/hil
+berrylike b,r/lIk
+berryman bArEm6n
+berrysburg ber/zbVg
+berryville b,r/vil
+berryville ber/vil
+berthold bPtOld
+bertholf bPthOlf
+berthoud bVT6d
+berths bVTs
+berton bVd~
+bertoncini bPt@nsEnE
+bertram bVtr}
+berube b@rUbA
+berwick bVwik
+berwyn bVw~
+beryl bAr6l
+besancon bes@ns@n
+beside b/sId
+bess bes
+bessemer besEmP
+bessie bes/
+best best
+best's bests
+bests bests
+bestsellers bestselPz
+bet bet
+betances bet6ns6s
+betancourt bet@nk{rt
+betenson bet@ns@n
+betesh beteS
+beth beT
+bethanie beT@nE
+bethany beT~/
+bethel beTL
+bethel beTel
+bethlehem beTl6h}
+bethlehem beTl@hem
+bethpage beTp6j
+bethpage beTpAj
+betide betId
+betrayed b/trAd
+betsy bets/
+bettendorf bed~d{rf
+better bedP
+betterton betPt6n
+betty bed/
+betty bet/
+bettyann betEan
+between b/twEn
+beulaville byUl@vil
+beutler byUtlP
+beverage bevr6j
+beverages bevr6j6z
+beverlee bevPlE
+beverly bevPl/
+beverly bevPl/
+beverly's bevPl/z
+beverlys bevPl/z
+bevill bevil
+bevington beviNt~
+beyoglu bAogl@
+beyoglu bAoglU
+beyond b/yond
+bhatia batE@
+bhola bOl@
+bianchi bE)nkE
+biannually bIanyU6l/
+biarritz bE@rits
+biarritz bEP6ts
+biarritz bIr6ts
+bibb bib
+bibi bEbE
+bible bIb@l
+bibles bIbLz
+biblical bibl6kL
+bibliographic b6blI@graf6k
+bibliographies bibl/ogr@f/z
+bibulous biby6l@s
+bicentennially bIsenten/6l/
+biceps bIseps
+bichel bik@l
+bichsel biksel
+bickering bikP6N
+bickerton bikPt@n
+bickford bikfPd
+bicklein biklIn
+bickleman bik@lm@n
+bicycle bIs6kL
+bicycling bIs6kl6N
+bid bid
+biddeford bid@fPd
+biddeford bidfPd
+bidding bid6N
+biddle bidL
+bidgood bidgqd
+bidirectional bid@rekS~L
+biff bif
+bifocals bIfOkLz
+bifunctional b/fuNkS~L
+big big
+big_stone bigstOn
+bigamy big@m/
+bigelow big@lO
+bigfoot bigfqt
+bigford bigfPd
+bigfork bigf{rk
+bigger bigP
+biggers bigPz
+biggest big6st
+biggio bigEO
+biggs bigz
+bigham big@m
+bighorn bigh{rn
+bighorns bigh{rnz
+bighorse bigh{rs
+bigio bigEO
+biglerville bIglPvil
+biglerville biglPvil
+bike bIk
+biked bIkt
+bikes bIks
+bikinis bik~6s
+bilateralness bIlad@rLn6s
+bilbao b6lb)]
+bilbao b6lb?
+bilboa bilb]@
+bilcik bilCik
+biles bIlz
+bilingual bIliNgwL
+bilingually bIliNgw6l/
+bilked bilkt
+bill bil
+billafuerte bil@fwArtA
+billing bil6N
+billings bil6Nz
+billingsgate bil6NgsgAt
+billingsley biliNzl/
+billion bily~
+billionaires bily6n,rz
+billions bily~z
+billionth bily~T
+billowed bil]d
+billowy bil]/
+bills bilz
+billy bil/
+biloxi b/loks/
+biloxi b6luks/
+bimbo bimb]
+bimonthly bImunTl/
+binary bIner/
+bind bInd
+binder bIndP
+binds bIndz
+binger binjP
+bingham biN}
+binghamton biN@mt~
+bingley biNlE
+bingo biNg]
+binns binz
+binomial bInOm/L
+bio bI]
+biocentric bI]sentr6k
+biochemical bI]kem6kL
+biodegradable bI]d6grAd@bL
+bioelectric bI]6lektr6k
+biographers bIogr@fPz
+biological bI@loj6kL
+biologist bIol@j6st
+biologists bIol@j6sts
+biology bIol@j/
+biometrics bI]metr6ks
+bionics bIon6ks
+biophysics bI]fiz6ks
+bioplasm bI]plaz}
+biopsy bIops/
+biorkman byOrkm@n
+biotechnology bI]teknol@j/
+biplane bIplAn
+biquarterly bikwPdPl/
+biracial bIrASL
+birch bVC
+birches bVC6z
+birchfield bVCfEld
+birchler bPClP
+bird bVd
+birdbath bVdbaT
+birdbrain bVdbrAn
+birdcage bVdkAj
+birdfinder bVdfIndP
+birdhouse bVdh?s
+birdie bVd/
+birdman bVdm~
+birds bVdz
+birdsboro bVdzbV]
+birdsboro bVdzbur]
+birdseed bVdsEd
+birdsnest bVdznest
+birdsong bVds{N
+birdwell bVdwel
+birdwoman bVdwqm~
+bires bIrz
+birkeland bPkland
+birkenhead bVk~hed
+birmingham bVm6Nham
+birmingham bVm6N}
+birmingham bVmiNham
+birnamwood bVn@mwqd
+birnamwood bVn}wqd
+birney bVn/
+birth bVT
+birthday bVTdA
+birthmark bVTm)rk
+birthmarks bVTm)rks
+birthnight bVTnIt
+birthplace bVTplAs
+birthrate bVTrAt
+birthright bVTrIt
+birthstone bVTstOn
+birthstool bVTstUl
+biscayne biskAn
+biscuit bisk6t
+biscuits bisk6ts
+bishop biS@p
+bisignano bisiny)nO
+bismarck bizm)rk
+bissau b/s?
+bissau b6s?
+bistro bEstr]
+biswal bizw{l
+bit bit
+bite bIt
+bites bIts
+biting bId6N
+bits bits
+bitter bidP
+bitterroot bidPrUt
+bitzer bitsP
+bivens biv6nz
+bivouac biv?ak
+biwabik biw@b6k
+biweekly bIwEkl/
+bixby biksb/
+biyearly bIyPl/
+bizarre b/z)r
+bizarreness b/z)rn6s
+bjorgen by{rg6n
+blab blab
+black blak
+blackbeard blakbErd
+blackberry blakber/
+blackbird blakbVd
+blackboards blakb{rdz
+blackburn blakbVn
+blackcourt blakk{rt
+blackened blak~d
+blackfoot blakfqt
+blackfriars blakfrIPz
+blackgoat blakgOt
+blackguard blagPd
+blackhawk blakh{k
+blackjack blakjak
+blacklick blaklik
+blackmailing blakmAl6N
+blackout blak?t
+blackpool blakpUl
+blacksburg blaksbVg
+blackshear blakSEr
+blacksmith blaksmiT
+blackstar blakst)r
+blackstock blakstok
+blackstone blakstOn
+blackthorn blakT{rn
+blacktop blaktop
+blackwood blakwqd
+bladenboro blAd~bV]
+blades blAdz
+blaine blAn
+blair bl,r
+blairsburg bl,rzbPg
+blairsburg bl,rzbVg
+blairsden bl,rzd~
+blairstown bl,rzt?n
+blake blAk
+blakeley blAklE
+blakelock blAkl)k
+blakely blAkl/
+blakeney blAknE
+blakes blAks
+blakesburg blAksbPg
+blakesburg blAksbVg
+blakeslee blAkslE
+blakesley blAkslE
+blakeway blAkwA
+blakey blAk/
+blakley blAklE
+blame blAm
+blamed blAmd
+blameless blAml6s
+blanc bloNk
+blanchard blanCPd
+blanched blanCt
+blanchester blanCestP
+blanching blanC6N
+blandford blandfPd
+blank blaNk
+blankenbaker blaNk6nbAkP
+blankenship blaNk~Sip
+blankets blaNk6ts
+blares bl,rz
+blarney bl)rn/
+blasingim blAsiNim
+blasphemous blasf6m@s
+blassingame blasiNgAm
+blastdown blastd?n
+blathering blADP6N
+blawnox bl{noks
+blaze blAz
+blazing blAz6N
+bleached blECt
+bleachers blECPz
+bleak blEk
+bleasdale blEzdAl
+bleattler blEtlP
+blechinger blekiNgP
+blencoe bleNk]
+blend blend
+blends blendz
+bless bles
+blessed blest
+blessing bles6N
+blessinger blesiNP
+bleu blU
+blevins blev~z
+blew blU
+blind blInd
+blindfolded blIndfOld6d
+blindness blIndn6s
+blinker bliNkP
+blissfield blisfEld
+blissful blisfL
+blistered blistPd
+blithely blIDl/
+blitz blits
+bloat blOt
+block blok
+blockade blokAd
+blockbuster blokbustP
+blockbuster's blokbustPz
+blockbusters blokbustPz
+blocked blokt
+blocks bloks
+bloke blOk
+blonde blond
+blondness blondn6s
+blood blud
+bloodbath bludbaT
+bloodcurdling bludkVdL6N
+blooded blud6d
+bloodhound bludh?nd
+bloodletting bludl6d6N
+bloodshot bludSot
+bloodstain bludstAn
+bloodstream bludstrEm
+bloodsucker bludsukP
+bloodsworth bludzwVT
+bloodthirsty bludTVst/
+bloodworth bludwPT
+bloom blUm
+bloomberg's blUmbVgz
+bloombergs blUmbVgz
+bloomburg blUmbVg
+bloomfield blUmfEld
+bloomingdale's blUmiNdAlz
+bloomingdales blUmiNdAlz
+bloomington blUm6Nt~
+bloomington blUmiNt~
+blooms blUmz
+bloomsberg blUmzbVg
+bloomsburg blUmzbVg
+bloomsbury blUmzbP/
+bloomsbury blUmzber/
+bloomsdale blUmzdAl
+bloomville blUmvil
+blossburg blosbPg
+blossburg bl{sbVg
+blossomed blos@md
+blossoms blos}z
+blossvale blosvAl
+blossvale bl{svAl
+blotter blodP
+blough bl?
+blountstown bl?ntst?n
+blountstown blUntst?n
+blouses bl?s6z
+blow blO
+blower blOP
+blowers blOPz
+blowgun blOgun
+blowing blO6N
+blown blOn
+blowout blO?t
+blowouts blO?ts
+blows blOz
+blowtorch blOdPC
+blowup blOup
+bludge bluj
+blue blU
+blue_earth blUVT
+bluebell blUbel
+bluebird blUbVd
+bluebonnet blUbon6t
+bluefield blUfEld
+bluegrass blUgras
+bluejay blUjA
+bluemont blUmont
+blueprint blUprint
+blues blUz
+bluestein blUstIn
+bluey blU/
+bluff bluf
+bluffs blufs
+bluffton bluft~
+bluhm blUm
+bluish blU6S
+blum blUm
+blumenau blUm@n?
+blumenau blUm~?
+blumenfeld blUm~feld
+blumenthal blUm~T{l
+blunt blunt
+bluntly bluntl/
+bluntness bluntn6s
+blur blV
+blurs blVz
+blushed bluSt
+bly blI
+blystone blIstOn
+blythe blID
+blythedale blIDdAl
+blytheville blIDvil
+boa bO@
+boar b{r
+board b{rd
+boarded b{rd6d
+boarding b{rd6N
+boardinghouse b{rdiNh?s
+boardinghouses b{rdiNh?z6z
+boardman b{rdm~
+boardmen b{rdm~
+boardrooms b{rdrUmz
+boards b{rdz
+boardwalk b{rdw{k
+boarish b{r6S
+boars b{rz
+boas bO@s
+boastful bOstfL
+boat bOt
+boat's bOts
+boating bOd6N
+boatloads bOtlOdz
+boatman bOtm~
+boats bOts
+boatsloads bOtslOdz
+boatsman bOtsm~
+boatyard bOty)rd
+bob bob
+bobby bob/
+bobbysocks bob6soks
+bobcat bobkat
+bobe bObE
+bobo bOb]
+bobruisk b{brU6sk
+bobsled bobsled
+bobsleigh bobslA
+bobtail bobtAl
+bobtown bobt?n
+bocanegra bOk@negr@
+boccella b@Cel@
+bochum bOk}
+bodcaw bodk{
+boddeker b)d@kP
+bodega b@dAg@
+bodega b]dAg@
+bodied bod/d
+bodies bod/z
+bodily bod6l/
+body bod/
+bodyguard bod/g)rd
+boedeker bOd@kP
+boeing bO6N
+boey bOE
+bog bog
+bogalusa bog@lUs@
+bogard bOg)rd
+bogart bOg)rt
+bogel bOg@l
+bogen bOg@n
+bogenschneide bOg@nSnId
+bogert bOgPt
+bogged bogd
+boggess b)j6s
+boggiano b)jE)nO
+bogie bOg/
+bogle bOgL
+bogner b)gnP
+bogus bOg@s
+bohannan bOhan@n
+bohannon bOhan@n
+bohart bOh)rt
+bohemia b]hEm/@
+boil b<l
+boiled b<ld
+boiler b<lP
+boilerplate b<lPplAt
+boilerplates b<lPplAts
+boiles b<lz
+boiling b<l6N
+boise b<z/
+boissoneault b<s@nO
+boisterous b<st@r@s
+boisterousness b<st@r@sn6s
+boland bOl6nd
+bolanos b@l)nOs
+bold bOld
+bolderas bLdar@z
+boldery bOld@rE
+boldface bOldfAs
+boldly bOldl/
+boldness bOldn6s
+boles bOlz
+boleware bOlwAr
+boleyn bOlAn
+bolieu bOly@
+boligee bOl6jE
+boliginbrook bOl6j~brqk
+bolingbrook bOl6Nbrqk
+bolingbrook bOliNbrqk
+bolinger bOl6njP
+bolivar b@lIvP
+bolivia b@liv/@
+bollard bolPd
+bolles bOlz
+bolliger b{l6gP
+bologna b@lOn/
+bologna b@lOny@
+bolsa bOls@
+bolt bOlt
+bolted bOlt6d
+bolthouse bOlth?s
+bolts bOlts
+bolzano bLzon]
+bolzano b]lz)n]
+bomb bom
+bombardment bomb)rdm~t
+bombay bombA
+bombed bomd
+bombich b)mb6k
+bombs bomz
+bombshell bomSel
+bombshells bomSelz
+bomont bOmont
+bomont bomont
+bonanza b@nanz@
+bonaventure b)n@venCP
+bonaventure bon@venCP
+bonbon bonb~
+bond bond
+bondholder bondhOldP
+bonds bondz
+bondsman bondzm~
+bonduel bondUL
+bonduel bonjUL
+bondville bondvil
+bone bOn
+bonebrake bon6br6k
+bonebright bOnbrIt
+bonecrusher bon6kr6SP
+bonefield bOnfEld
+bones bOnz
+bonesteel bon6stEl
+bonfire bonfIr
+bong b{N
+bonge b)N
+bongers b)NPs
+bongos boNg]z
+bonham bon}
+bonner bonP
+bonnett bon6t
+bonnyman bon/m~
+bonsai bonsI
+bonsignore b)nsiny{r
+bonzo bonz]
+booe bUE
+boogie bqg/
+booher bUP
+booing bU6N
+book bqk
+bookbindery bqkbIndP/
+bookcase bqkkAs
+bookcraft bqkkraft
+bookends bqkendz
+booker bqkP
+bookhaven bqkhAv~
+booking bqk6N
+bookishly bqk6Sl/
+bookkeepers bqkkEpPz
+booklet bqkl6t
+booklets bqkl6ts
+bookmark bqkm)rk
+bookmarker bqkm)rkP
+bookplate bqkplAt
+bookrack bqkrak
+books bqks
+bookshelf bqkSelf
+bookstall bqkst{l
+bookstand bqkstand
+bookstore bqkst{r
+bookwalter bqkw{ltP
+boom bUm
+boomerang bUm@raN
+boomeranged bUmr~jd
+boomers bUmPz
+boomershine bUmPSIn
+booms bUmz
+boones bUnz
+booneville bUnvil
+boonsboro bUnzbP]
+boonsboro bUnzbV]
+boorish bUr6S
+boors bUrz
+boost bUst
+boosts bUsts
+boot bUt
+bootblack bUtblak
+booth bUT
+boothbay bUTbA
+boothman bUTm~
+bootlace bUtlAs
+bootleggers bUtlegPz
+boots bUts
+bootstraps bUtstraps
+booze bUz
+boppers bopPz
+boras bUrOs
+boras b{r@z
+borcuk bOrCuk
+bordentown b{rd~t?n
+border b{rdP
+bordered b{rdPd
+borders b{rdPz
+bordwell b{rdwel
+bore b{r
+bored b{rd
+boredom b{rd}
+boreman b{rm@n
+bores b{rz
+borgelt bOrgelt
+borgeson b{rj6s~
+borgmann b{rgm~
+boring b{r6N
+bork's b{rks
+borks b{rks
+born b{rn
+borneman bOrnm@n
+bornhouse b{rnh?s
+bornstein b{rnstEn
+boron b{ron
+boroughs bVOz
+borrow bor]
+borrows bor]z
+bosefski bOsefskE
+bosnia bozn/@
+boss b{s
+bosses b{s6z
+bossy b{s/
+bostic bost6k
+boston bost~
+boston b{st~
+botched boCt
+both bOT
+bothell boTel
+bother boDP
+bothered boDPd
+bothers boDPz
+bothof bOT)f
+bottle bodL
+bottlenose botl~6s
+bottles bodLz
+bottling bodL6N
+bottom bot}
+bottomless bod@ml6s
+bouckville b?kvil
+boudinot b?t6nO
+boudjouk bUdjUk
+boudreau bUdrO
+bouer b?P
+bough b?
+bought b{t
+boughton b?t~
+bougie bqgE
+bouie bUE
+bouillion bUly@n
+bouknight bOnIt
+boulais bUlAz
+boulder bOldP
+boulevard bql@v)rd
+boulevards bql@v)rdz
+boulogne bUlOn
+boumthavee bUmT@vE
+bounce b?ns
+bounces b?ns6z
+bouncing b?ns6N
+bouncy b?ns/
+bound b?nd
+boundaries b?ndr/z
+boundary b?ndr/
+bounded b?nd6d
+boundlessly b?ndl6sl/
+bounds b?ndz
+bountiful b?nt6fL
+bouquet bUkA
+bourbon bVb~
+bourg b{rg
+bourgeois bPZw)
+bourne b{rn
+bournemouth bqrnm@T
+bournemouth b{rnm@T
+bourque b{rk
+bourquin b{rk6n
+boursiquot b{rs@kwO
+bout b?t
+boutilier bUtlEr
+boutiques bUtEks
+bouvier bUvEA
+bouy bUE
+bow bO
+bowdon bOdon
+bowed b?d
+bowen bO~
+bower b?P
+bowers b?Pz
+bowerston b?Pst~
+bowerston b?Pzt~
+bowery's b?P/z
+bowerys b?P/z
+bowes bOz
+bowl bOl
+bowle bOl
+bowled bOld
+bowler bOlP
+bowlers bOlPz
+bowles bOlz
+bowling bOl6N
+bowls bOlz
+bowron b?r6n
+bowser b?zP
+box boks
+box boks
+box_elder bokseldP
+boxball boksb{l
+boxberger boksbVgP
+boxboard boksb{rd
+boxboro boksbP]
+boxboro boksbV]
+boxcars boksk)rz
+boxed bokst
+boxes boks6z
+boxholm boksh]lm
+boxing boks6N
+boxx b)ks
+boy b<
+boy's b<z
+boyceville b<svil
+boycotts b<kots
+boydton b<dt~
+boyens b<y@nz
+boyes b<z
+boyett b<y6t
+boyhood b<hqd
+boyish b<6S
+boylan b<l~
+boyle b<l
+boyles b<lz
+boyne b<n
+boynton b<nt~
+boys b<z
+boyte b<t
+bozarth bOz)rT
+bozeman bOzm~
+bracelet brAsl6t
+braceville brAsvil
+bracewell brAswel
+brach br)k
+bracknell braknel
+brad brad
+bradberry bradber/
+braddock brad@k
+brademas br@dEm@z
+bradenton brad~t~
+bradfield bradfEld
+bradford bradfPd
+bradfords bradfPdz
+bradley bradl/
+bradleys bradl/z
+bradstreet's bradstrEts
+bradstreets bradstrEts
+brady brAd/
+bradyville brAd/vil
+braget braget
+braham bram
+braid brAd
+braiding brAd6N
+braille brAl
+brailsford brAlzfPd
+brain brAn
+brainbridge brAnbrij
+brainchild brAnCIld
+brainerd brAnVd
+brainpower brAnp?P
+brains brAnz
+brainstorming brAnst{rm6N
+braintree brAntrE
+brainwashing brAnwoS6N
+brainwaves brAnwAvz
+braithwaite brATwAt
+brake brAk
+brakebill brAkbil
+braked brAkt
+brakes brAks
+braking brAk6N
+bram bram
+braman brom~
+brambleton brambLt~
+brampton brampt~
+bramwell bramwel
+branch branC
+branchdale branCdAl
+branched branCt
+branches branC6z
+branchland branCland
+brand brand
+branded brand6d
+brandee brandE
+brandenburg brand~bVg
+brandi brand/
+brandname brandnAm
+brando brand]
+brandon brand~
+brands brandz
+branson brans~
+brasfield brasfEld
+brashear braS/P
+brasher braSP
+brashly braSl/
+brasil br@zil
+brasov br)S{v
+brasov brasov
+brass bras
+brasseux bras@
+brassfield brasfEld
+braue br{
+brave brAv
+bravest brAv6st
+bravo brov]
+brawer br{P
+bray brA
+brazil br@zil
+brazil's br@zilz
+brazils br@zilz
+brea brA@
+bread bred
+breadfruit bredfrUt
+break brAk
+breakdown brAkd?n
+breaker brAkP
+breakers brAkPz
+breakfast brekf6st
+breakfasts brekf6sts
+breaking brAk6N
+breakneck brAknek
+breakpoint brAkp<nt
+breakthrough brAkTrU
+breakwater brAkw{dP
+breana brEan@
+breann brEan
+breanna brEan@
+breanne brEan
+breast brest
+breastbone brestbOn
+breastpin brestpin
+breastplate brestplAt
+breaststroke breststrOk
+breath breT
+breathe brED
+breathed brEDd
+breathes brEDz
+breathlessly breTl6sl/
+breathtaking breTtAk6N
+breathy breT/
+breaux brO
+breazeale brEzEl
+brechtel brektel
+breckenridge brek~rij
+brecksville breksvil
+bred bred
+bredesen bred@s6n
+breeches brEC6z
+breed brEd
+breedlove brEdluv
+breeds brEdz
+breen brEn
+breesport brEzp{rt
+breeze brEz
+breger brEgP
+breithaupt brEth{pt
+breland brEl@nd
+bremen brEm~
+bremer brEmP
+bremerhaven brAmPh)f~
+bremerhaven brEmPhAv~
+bremerhaven bremPh)v~
+bremerhaven bremPhAv~
+bremond brem~d
+brenchley brenClE
+brenda brend@
+brenham bren}
+brenner brenP
+brenton brent~
+brentwood brentwqd
+breshears breS/Pz
+breske breskE
+brew brU
+breweries brUP/z
+brewers brUPz
+brewery brUP/
+brewhouse brUh?s
+brewton brUd~
+breyten brAd~
+breyten brAt~
+brian brI~
+briar brIP
+briarcliff brIPklif
+briars brIPz
+bribes brIbz
+brice brIs
+briceville brIsvil
+brick brik
+bricklaying briklA6N
+bricks briks
+brickwork brikwVk
+bride brId
+bride's brIdz
+bridegroom brIdgrUm
+bridenbaker brIt~bAkP
+brides brIdz
+bridesmaids brIdzmAdz
+bridge brij
+bridgeboro brijbV]
+bridgeboro brijbur]
+bridgeford brijfPd
+bridgeforth brijf{rT
+bridgehead brijhed
+bridgeman brijm~
+bridgeport brijp{rt
+bridgers brijPz
+bridges brij6z
+bridgestone's brijstOnz
+bridgestones brijstOnz
+bridgeton brijt~
+bridgetower brijt?P
+bridgetown brijt?n
+bridgeville brijvil
+bridgewater brijw{dP
+bridgewater brijw{tP
+bridgton brijt~
+brief brEf
+briefed brEft
+briefly brEfl/
+brierfield brIPfEld
+briese brEs
+brigette brij6t
+briggsville brigzvil
+brigham brI}
+brigham brig}
+brighenti br@gentE
+bright brIt
+brightened brId~d
+brightharp brIth)rp
+brightly brItl/
+brightman brItm~
+brightness brItn6s
+brighton brId~
+brigitte brij6t
+brigner brignP
+brignoni br6nyOnE
+brihon brEh)n
+briles brIlz
+brill bril
+brilliant brily~t
+brilliantly brily~tl/
+brim brim
+brimmer brimP
+brimson brims~
+brimstone brimstOn
+brincefield brinsfEld
+brindisi br6ndEz/
+brindisi br~dis/
+bring briN
+bringer briNP
+bringing briN6N
+brings briNz
+brink briNk
+brinker briNkP
+brinkerhoff briNkPh{f
+brinnon brin~
+briny brIn/
+briones brEOnz
+brisk brisk
+briskly briskl/
+bristle bris@l
+bristles brisLz
+bristol_bay bristLbA
+brit brit
+britain brid~
+britany britnE
+britches briC6z
+british brid6S
+britt brit
+brittain brit~
+brittani britnE
+brittania br6tAn/@
+brittanie britnE
+brittany britnE
+britteny britnE
+broad br{d
+broadbeach br{dbEC
+broadbent br{dbent
+broadcast br{dkast
+broadcasting br{dkast6N
+broadcasts br{dkasts
+broadcloth br{dkl{T
+broaden br{d~
+broadhead br{dhed
+broadhurst br{dhVst
+broadloom br{dlUm
+broadman br{dm6n
+broadnax br{dnaks
+broadstone br{dstOn
+broadstreet br{dstrEt
+broadsword br{ds{rd
+broadview br{dvyU
+broadwater br{dw{tP
+broadway br{dwA
+broas brO@s
+broccoli brokL/
+brochure br]SUr
+brochures br]SUrz
+brock brok
+brockbank brokbaNk
+brocket brok6t
+brocklehurst br)k@lhPst
+brocklesby br)k@lzbE
+brockport brokp{rt
+brockton brokt~
+brocton brokt~
+broderick brod@r6k
+broderson brOtPs@n
+brodfuehrer br)dfyUrP
+brodhead brodhed
+brody brOd/
+brogna br)ny@
+broil br<l
+broiling br<l6N
+broke brOk
+broken brOk~
+bromide brOmId
+bromine brOmEn
+bronc broNk
+bronchitis broNkId6s
+bronco broNk]
+broncos broNk]z
+bronson brons~
+bronwood bronwqd
+bronx broNks
+bronxville broNksvil
+bronze bronz
+bronzed bronzd
+brood brUd
+brook brqk
+brookeland brqkEland
+brookeland brqkland
+brookeville brqkvil
+brookfield brqkfEld
+brookhart brqkh)rt
+brookhaven brqkhAv~
+brookhollow brqkhol]
+brooking brqk6N
+brookings brqk6Nz
+brookland brqkland
+brookland brqkl~d
+brooklawn brqkl{n
+brookline brqklIn
+brooklyn brqkl~
+brookneal brqkn/L
+brookneal brqknEl
+brookover brqkOvP
+brooks brqks
+brookston brqkst~
+brooksville brqksvil
+brookwood brqkwqd
+broomes brUmz
+broomfield brUmfEld
+broomstick brUmstik
+brother bruDP
+brother's bruDPz
+brotherhood bruDPhqd
+brothers bruDPz
+brotherton bruDPt@n
+broths br{Ts
+brought br{t
+brouillette brUlet
+brown br?n
+browndell br?ndel
+brownfield br?nfEld
+brownout br?n?t
+brownsboro br?nzbur]
+brownsburg br?nzbVg
+brownsdale br?nzdAl
+brownstown br?nzt?n
+brownsville br?nzvil
+brows br?z
+browse br?z
+browser br?zP
+broyles br<lz
+bruce brUs
+bruceton brUst~
+bruceville brUsvil
+bruchman brukm6n
+bruckmeier brukmIP
+bruechert brUkPt
+bruges brUZ
+bruges brUj6z
+brugge brqg@
+brugh brU
+bruises brUz6z
+bruising brUz6N
+brule brUl
+brumley bruml/
+brundidge brund6j
+brunette brUnet
+brunettes brUnets
+bruno's brUn]z
+brunos brUn]z
+brunswick brunzwik
+brunswick's brunzwiks
+brunswicks brunzwiks
+brusett brUs6t
+brusett brus6t
+brush bruS
+brushes bruS6z
+brushton bruSt~
+brushwork bruSwVk
+brushy bruS/
+brusly brUsl/
+brusly brusl/
+brussels brusLz
+brutalities brUtal6d/z
+brutger brutgP
+brutish brUd6S
+bryan brI~
+bryansk br/)nsk
+bryansk brI~sk
+bryant brI~t
+bryantville brI~tvil
+bryceland brIsland
+bryden brId~
+bryson brIs~
+brzezinski br@zinskE
+brzozowski br@z?skE
+bubble bubL
+bubbles bubLz
+bubbling bubl6N
+buccellato bUs@l)tO
+buch byUk
+buchalter buk)ltP
+buchanan byUkan~
+buchann byUkan
+buchannan byUkan@n
+buchannon byUkan@n
+buchanon byUkan@n
+buchbinder bukbIndP
+buchheit bukhIt
+buchholtz bukhOltz
+buchholz bukhOlts
+buchite byUkIt
+buchmeier bukmIP
+buchmiller bukmilP
+bucholtz bukhOltz
+bucholz bukhOlts
+buchtel buktel
+buchwalter bukw)ltP
+bucio byUCEO
+buck buk
+buckaroo buk@rU
+bucket buk6t
+bucketful buk6tfL
+buckets buk6ts
+buckeye bukI
+buckhorn bukh{rn
+buckingham bukiNham
+buckland bukland
+buckle bukL
+buckleful bukLfL
+buckles buk@ls
+buckley bukl/
+buckman bukm~
+buckner buknP
+buckshot bukSot
+buckskin bukskin
+bucktail buktAl
+bucktooth buktUT
+bucyrus byUs6r@s
+bucyrus byUs@r@s
+bud bud
+budapest bUd@pest
+buday b@dA
+buddy bud/
+budget buj6t
+budgetary buj6ter/
+buds budz
+buechel byUC@l
+buechele byUCelE
+buechner byUknP
+bueler byUlP
+buell byUL
+buellton byULt~
+buelow byUlO
+buena bwAn@
+buenaventura bwAn@v~tUr@
+bueno bwenO
+buenrostro bwAnr)strO
+buentello bwentelO
+buerger byPgP
+buescher byUSP
+buetow byUtO
+buettner byUtnP
+buffalo bufL]
+buffet b@fA
+buffett buf6t
+buffoonery b/fUnP/
+buford bUfPd
+bugaboo byUg@bU
+bugeyed byUj/d
+bugged bugd
+bugle byUgL
+buglione buglEOnE
+bugni byUnE
+buick byU6k
+buies bIz
+buies bwEs
+build bild
+builders bildPz
+building bild6N
+buildings bild6Nz
+builds bildz
+buildups bildups
+built bilt
+buisson bwEs@n
+bukhta bukt@
+bulb bulb
+bulbs bulbz
+bulge bulj
+bulged buljd
+bulging bulj6N
+bulkeley bulklE
+bulkhead bulkhed
+bulldog bqld{g
+bulldozed bqldOzd
+bullet bql6t
+bulletin bql6t~
+bulletproof bql6tprUf
+bullets bql6ts
+bullfighter bqlfIdP
+bullfinch bqlfinC
+bullfrog bqlfr{g
+bullhead bqlhed
+bullheads bqlhedz
+bullies bql/z
+bullishness bql6Sn6s
+bulloch bql@k
+bullock bql@k
+bullpen bqlpen
+bulls bqlz
+bulpitt bqlp6t
+bulpitt bulp6t
+bulverde bqlverdA
+bulverde bulvPd
+bumble bumbL
+bumblebee bumbLbE
+bump bump
+bumper bumpP
+bumping bump6N
+bumps bumps
+bumstead bumsted
+bun bun
+bunbury bunbP/
+bunbury bunber/
+bunceton bunst~
+bunch bunC
+bundaberg bund@bVg
+bunde bundE
+bungalow buNgL]
+bungee bunjE
+bunion byUny~
+bunker buNkP
+bunkerville buNkPvil
+bunkhouse buNkh?s
+bunkley buNkl/
+bunkmate buNkmAt
+bunks buNks
+buns bunz
+bunton bunt~
+buonassisi bU)n@sEsE
+buonocore bw)n@k{r
+buoy bUE
+buoyant b<~t
+burbank bVbaNk
+burbank's bVbaNks
+burbanks bVbaNks
+burbridge bVbrij
+burden bVd~
+burdensome bVd~s}
+bureau byUrO
+bureaucracy byPokr6s/
+bureaucracy's byPokr6s/z
+bureaucracys byPokr6s/z
+bureaucratic byV@krad6k
+bureaus byUrOz
+buren byUr~
+burge bVj
+burger bVgP
+burgers bVgPz
+burgert bPgPt
+burgerville bVgPvil
+burgeson bPgs@n
+burgess bVj6s
+burglar bVglP
+burglarize bVglPIz
+burgueno bPgwenO
+burgundy bVg~d/
+burgundy's bVg~d/z
+burgundys bVg~d/z
+burholme bVhLm
+burholme bVhOm
+burial b,r/L
+burien byUr/~
+burkburnett bVkbPn6t
+burkburnett bVkbVnct
+burke bVk
+burkes bVks
+burkesville bVksvil
+burkeville bVkvil
+burkhalter bVk{ltP
+burkholder bVkhOldP
+burlapped bVlapt
+burleigh bPlA
+burleson bVl6s~
+burley bVl/
+burlingame bPliNg}
+burlington bVl6Nt~
+burlington bVliNt~
+burmont bVmont
+burn bVn
+burned bVnd
+burner bVnP
+burnett bPnet
+burning bVn6N
+burnout bVn?t
+burns bVnz
+burnsed bPns@d
+burnside bVnsId
+burnside's bVnsIdz
+burnsides bVnsIdz
+burnstein bVnstEn
+burnt bVnt
+burnworth bVnwVT
+burows b@rOz
+burping bVp6N
+burrell bVel
+burrow bV]
+burrowes bPOz
+burrton bVd~
+burrton bVt~
+burst bVst
+bursting bVst6N
+burton bVd~
+bury ber/
+bus bus
+busboys busb<z
+buscemi byUSemE
+busch bqS
+buseman byUsm@n
+buses bus6z
+bush bqS
+bushed bqSt
+bushel bqSL
+bushels bqSLz
+bushes bqS6z
+bushey bqSE
+bushfire bqSfIr
+bushman bqSm~
+bushnell bqSnel
+bushorn bushOrn
+bushton bqSt~
+bushwood bqSwqd
+bushy bqS/
+business bizn6s
+businessmen bizn6smen
+buske buskE
+busload buslOd
+busscher buSP
+busse byUs
+busses bus6z
+busy biz/
+busywork biz/wVk
+but but
+butala byUtal@
+butanda byUtand@
+butcher bqCP
+butchers bqCPz
+butera bUter@
+butera byUtar@
+buterbaugh byUtPb{
+butler butlP
+butte byUt
+butter budP
+butterbaugh budPb{
+butterfingers budPfinjPz
+butterflies budPflIz
+butterfly budPflI
+buttermilk budPmilk
+butternut budPnut
+butterscotch budPskoC
+butterworth budPwVT
+buttitta byUtit@
+buttner butnP
+button bud~
+buttoned bud~d
+buttonhole bud~hOl
+buttonholes bud~hOlz
+buttonhook bud~hqk
+buttons bud~z
+buttonwood bud~wqd
+buxton bukst~
+buy bI
+buyer bIP
+buyers bIPz
+buying bI6N
+buyout bI?t
+buys bIz
+buzz buz
+buzzards buzPdz
+buzzed buzd
+buzzing buz6N
+by bI
+byers bIPz
+byes bIz
+bygones bIg{nz
+byington bIiNt6n
+byland bIl~d
+byles bIlz
+bynum bIn}
+byous byUz
+bypass bIpas
+bypassed bIpast
+byrd bPd
+byrd bVd
+byromville bIr@mvil
+byron bIr~
+bywaters bIw)tPz
+byword bIwPd
+byzantine biz~tEn
+byzantium b/zant/}
+byzantium b6zant/}
+c sE
+cab kab
+cabbagehead kab6jhed
+cabbageheaded kab6jhed6d
+cabbages kab6j6z
+cabbagestalk kab6jst{k
+cabdrivers kabdr6vPz
+cabebe k@bEbE
+cabin kab~
+cabinet kab~6t
+cabinet's kab~6ts
+cabinetmaking kab~6tmAk6N
+cabinets kab~6ts
+cabins kab~z
+cable kAbL
+cablegram kAbLgram
+cablesystems k@bles6st}z
+cablevision kAbLviZ~
+cabot kab6t
+cabotaje k)b@t)jE
+cabral k@br)l
+cabrales k@br)l6s
+cabstand kabstand
+cacace k)k@sA
+cacciatore kaC@t{rE
+cacciatori kaC@t{rE
+caceres k@sAr6s
+cacey kAs/
+cache kaS
+cacioppo kaCEOpO
+cackling kakl6N
+caddo kad]
+cadieux k@dyU
+cadillac kad6lak
+cadwell's kadwelz
+cadwells kadwelz
+cadyville kAd/vil
+caen k)n
+caen kEn
+caesar sEzP
+cafe kafA
+cafeteria kaf6tEr/@
+caffeine kafEn
+cagle kAg@l
+caguas k)gw)s
+caguas kagw@z
+cahall kA@l
+cahill kAhil
+cahn kon
+cairnbrook k,rnbrqk
+cairnbrook karnbrqk
+cairo kIr]
+cajon kAj~
+cake kAk
+cakes kAks
+calabasas kal@bas@s
+calabasas kol@bos6s
+calabash kal@baS
+calabrese kalabres
+calais k@lA
+calais kal@s
+calais kalA
+calame kalAm
+calcium kals/}
+calculate kalky@lAt
+calculated kalky6lAd6d
+calculates kalky6lAts
+calculations kalky6lAS~z
+calcutta kalkud@
+calder k{ldP
+calderon k)ldP6n
+caldwell k{ldwel
+caldwell's k{ldwelz
+caldwells k{ldwelz
+caleb kAl@b
+caledonian kal6dOn/~
+calendar kal~dP
+calendars kal~dPz
+calender kal6ndP
+calera k@lar@
+calera k@ler@
+calera kalP@
+calexico k@leks6k]
+calf kaf
+calf's kafs
+calfee kalfE
+calfs kafs
+calfskin kafskin
+calgary kalg@r/
+calhan kalh~
+calhoon kalhUn
+calhoun kalhUn
+cali k)l/
+cali kol/
+calicexico kal6seks6k]
+calico kal6k]
+california kal6f{rny@
+california's kal6f{rny@z
+californian kal6f{rn/~
+californians kal6f{rn/~z
+californias kal6f{rny@z
+caliman kal6m@n
+calipatria kal/patr/@
+calipatria kal6patr/@
+calisthenics kal6sTen6ks
+calistoga kal6stOg@
+calkins k{k6nz
+call k{l
+callaghan kal@han
+callagher kal@gP
+callands kalandz
+callands kal~dz
+callar k)l)r
+callaway k{l@wA
+callback k{lbak
+called k{ld
+callejas k)yAh)s
+caller k)lP
+callie kal/
+callimont kal/mont
+calling k{l6N
+callisburg kal6sbVg
+calls k{lz
+calm kom
+calma kalm@
+calmar kalmP
+calmes k{mz
+calmly koml/
+caloric k@l{r6k
+calories kal@r/z
+calorific kal@rif6k
+calumet kaly6m6t
+calumet kaly@met
+calvary kalv@r/
+calvert kalvPt
+calverton kalvPt~
+calverton kavPt~
+calvery kalv@rE
+calves kavz
+calvin kalv~
+calypso k@lips]
+cambell kamb@l
+cambria kambr/@
+cambridge kAmbrij
+camden kamd~
+camden's kamd~z
+camdens kamd~z
+came kAm
+camelhair kamLh,r
+camellia k@mel/@
+camelot kam6l6t
+cameo kam/]
+camera kamr@
+camera's kamr@z
+cameraman kamr@m~
+camerar kam@rP
+cameras kamr@z
+cameron kamr~
+cami kamE
+camie kamE
+camilla k@mil@
+camillus k@mil@s
+cammack kam@k
+camouflage kam@floZ
+camouflages kam@floZ6z
+camouflaging kam@floZ6N
+camp kamp
+campagna k@mp)ny@
+campaign kampAn
+campaigner kampAnP
+campaigning kampAn6N
+campaigns kampAnz
+campbell kambL
+campbellsburg kambLzbVg
+campbellton kambLt~
+campble kamb@l
+campfield kampfEld
+campfires kampfIrz
+campgrounds kampgr?ndz
+camping kamp6N
+campo kamp]
+campoverde kamp@verdA
+camps kamps
+campsite kampsIt
+campton kampt~
+campus kamp@s
+camus kamyU
+can kan
+can k~
+can't kant
+canada kan@d@
+canadian k@nAd/~
+canadians k@nAd/~z
+canajoharie k@naj@her/
+canajoharie kan@j]h)r/
+canal k@nal
+canale k@n)lE
+canales k@n)l6s
+canalou kan@lU
+canals k@nalz
+canaseraga k@nas@rog@
+canastota kan@stOd@
+canastota kan@stOt@
+canberra kanbP@
+canberra kanber@
+canberra kanbr@
+canby kanb/
+cancel kansL
+canceled kansLd
+cancellation kans6lAS~
+cancer kansP
+candace kand6s
+candelaria kand6l,r/@
+candelaria kand@lar/@
+candidate kand6dAt
+candidates kand6dAts
+candies kand/z
+candle kandL
+candleholder kandLhOldP
+candlelight kand@lIt
+candlemaker kandLmAkP
+candlepin kandLpin
+candles kandLz
+candlish kandL6S
+candy kand/
+candyce kand@s
+cane kAn
+caneadea k@nAdA
+caneadea k@nEd/
+caneadea k@nEd/@
+canete k@netE
+caneyville kAn/vil
+canine kAnIn
+canion kAny~
+canisteo kAn6stA]
+canisteo kan6stA]
+canistota kan6stOd@
+canistota kan6stOt@
+canned kand
+cannelton kanLt~
+cannings kan6Nz
+cannizzaro kan@zArO
+cannon kan~
+cannonball kan~b{l
+cannot k@not
+canoe k@nU
+canoed kAn]d
+canoes k@nUz
+canon kan@n
+canon kan~
+canossa k@nos@
+canossa kanos@
+cans kanz
+cant kant
+cantadore kant@d{rE
+cantaloupe kant@lUp
+cantatore kant@t{rE
+canteen kantEn
+canter kantP
+canton kant~
+cantonesa kant@nEs@
+cantore kant{rE
+cantril kantrL
+cantwell kantwel
+canuck kan6k
+canvas kanv6s
+canyon kany~
+canyons kany~z
+canyonville kany~vil
+cap kap
+cap'n kapn
+capable kAp@bL
+capac k@pak
+capac kapak
+capacity k@pas6d/
+cape kAp
+cape_may kApmA
+capece k@pEsE
+capehart kAph)rt
+caperton kApPt6n
+capita kap6d@
+capital kap6dL
+capitalism kap6d@liz}
+capitalists kap6dL6sts
+capitalize kap6d@lIz
+capitalizes kap6d@lIz6z
+capitol kap6dL
+capitola kap6tOl@
+capitulation k@piC6lAS~
+caples kAp@lz
+caplin kapl~
+capn kapn
+capone k@pOn
+caporiccio kap@rECEO
+cappiello kapEelO
+capricorn kapr6k{rn
+caps kaps
+capsule kapsL
+capsules kapsLz
+captain kapt~
+captains kapt~z
+captioning kapS~6N
+captiva kapt6v@
+captiva kaptEv@
+captiva kaptiv@
+captivated kapt6vAd6d
+capture kapCP
+captured kapCPd
+capulin kapy6l~
+capulin kapy@l6n
+car k)r
+car's k)rz
+caravan kar@van
+caravans kar@vanz
+caraway kar@wA
+carber k)rbP
+carbery k)rb@rE
+carbohydrate k)rb]hIdrAt
+carbohydrates k)rb]hIdrAts
+carbon k)rb~
+carbondale k)rb~dAl
+carbone k)rbOn
+card k)rd
+cardboard k)rdb{rd
+cardenas k)rdAn)s
+cardenas k)rdEn@z
+cardholder k)rdhOldP
+cardin k)rd~
+cardinale k)rt6n)lA
+cardinals k)rd~Lz
+cardiograph k)rd/]graf
+cardplayer k)rdplAP
+cards k)rdz
+cardwell k)rdwel
+care k,r
+cared kard
+career k@rEr
+careers k@rErz
+carefree k,rfrE
+careful k,rfL
+carefully k,rfL/
+carefulness k,rfLn6s
+carelessly k,rl6sl/
+carfagno k)rf)nyO
+carfare k)rf,r
+cargill k)rgil
+carhop k)rh@p
+cari kor/
+caribbean k@rib/~
+caridad k)r6tad
+caring k,r6N
+carinthia k@rinT/@
+carinthia kar6nTE@
+cark k)rk
+carl k)rl
+carl's k)rlz
+carla k)rl@
+carles k)rlz
+carleton k)rlt6n
+carlile k)rlIl
+carlin k)rl~
+carlinville k)rl~vil
+carlise k)rlEz
+carlisle k)rlIl
+carlos k)rlOs
+carls k)rlz
+carlsbad k)rlzb6d
+carlson k)rls~
+carlstrom k)rlstr}
+carlton's k)rlt~z
+carltons k)rlt~z
+carlyle k)rlIl
+carlyle korlIl
+carlyn k)rl@n
+carmarthen k@m)rD~
+carmel k)rmL
+carmichael k)rmIk@l
+carmicheal k)rmIk@l
+carmine k)rmIn
+carnegia k)rnegE@
+carnegie k)rn6g/
+carnegie k)rn6gE
+carnesville k)rnzvil
+carnival k)rn6vL
+carnivals k)rn6vLz
+carnivore k)rn6vP
+carnivores k)rn6vPz
+carnivorous k)rniv@r@s
+carol karL
+carolann kAr@lan
+carolina kar@lIn@
+caroline kar@lIn
+carolyn karL~
+carondelet kar~dl6t
+carothers k@ruDPz
+caroyln kAr@lin
+carpenters k)rp~tPz
+carpentersville k)rp~tPzvil
+carpentry k)rp~tr/
+carper k)rpP
+carpet k)rp6t
+carpetbag k)rp6tbag
+carpetbagger k)rp6tbagP
+carpeted k)rp6d6d
+carpio k)rp/]
+carrabelle kar@bel
+carragher kAr@gP
+carrales karAlz
+carrasquillo kAr@skEyO
+carrboro k)rbP]
+carrboro k)rbV]
+carrel karL
+carrere k@rAr@
+carriage kar6j
+carrick kar6k
+carrico k@rEkO
+carried k,r/d
+carries k,r/z
+carrington kariNt~
+carrithers kariDPz
+carrizales kAr6z)l6s
+carrollton karLt~
+carrolltown karLt?n
+carrousal kar@sel
+carruth k@rUT
+carry ker/
+carryall k,ryL
+carrying k,r/6N
+cars k)rz
+carson k)rs~
+carson_city k)rs~sit/
+carsonville k)rs~vil
+carswell k)rzwel
+cart k)rt
+cartagena k)rt@hAn@
+carter k)rdP
+carter k)rdP
+carter k)rtP
+carteret k)rd@r6t
+cartersville k)rdPzvil
+carthage k)rT6j
+cartilage k)rd6l6j
+cartography k)rtogr@f/
+cartoon k)rtUn
+cartooning k)rtUn6N
+cartoons k)rtUnz
+cartridge k)rtr6j
+cartridges k)rtrij6z
+cartwheel k)rtwEl
+cartwheeling k)rtwEl6N
+cartwheels k)rtwElz
+cartwright k)rtrIt
+caruaru k)rw@rU
+caruaru karUarU
+caruso k@rUs]
+carusso k@rUs]
+carvalho k)rvalO
+carved k)rvd
+carver k)rvP
+cary karE
+caryl kar6l
+carylon kAr@l@n
+caryn kAr6n
+casa kos@
+casablanca k)s@bl)Nk@
+casablanca kas@blaNk@
+casablanca kos@bloNk@
+casanova kas@nOv@
+casar kAsP
+casavant kas@vant
+cascade kaskAd
+cascading kaskAd6N
+casciato kasE)tO
+case kAs
+casebolt kAsbOlt
+casebook kAsbqk
+casement kAsment
+cases kAs6z
+caseville kAsvil
+casewell kAswel
+casey kAs/
+cash kaS
+cashbook kaSbqk
+cashbox kaSboks
+cashdrawer kaSdr{P
+cashews kaSUz
+cashflow kaSfl]
+cashiered kaSErd
+cashless kaSl6s
+cashmere kaSmEr
+cashton kaSt~
+cashways kaSwAz
+casino k@sEn]
+casio kas/]
+casnovia kaznOv/@
+caspar kaspP
+casper kaspP
+caspian kasp/~
+cass kas
+cassadaga kas@dag@
+cassadaga kas@dog@
+cassagne kasaN
+cassandra k@sandr@
+cassatt kas6t
+cassaundra k@s)ndr@
+casselberry kasLber/
+cassell kasL
+casselton kasLt~
+cassette k@set
+cassiano kasEanO
+cassitty kas6t/
+cassopolis k@sopL6s
+cassopolis kasop@l6s
+casstown kast?n
+cassville kasvil
+cast kast
+castagna k@st)ny@
+castalia k@stAl/@
+castalia kast@lE@
+castana k@ston@
+castanea k@stan/@
+castanea kast~E@
+castaneda kast@nAt@
+castanon kast@n@n
+castellanos kast6l)nOs
+castellucci kast@lUkE
+caster kastP
+castiglione kastiglEOnE
+castle kasL
+castleberry kasLber/
+castleman kas@lm6n
+castles kasLz
+castlewood kasLwqd
+castoffs kast{fs
+castor kastP
+castorbeans kastPbEnz
+castorena kast@rEn@
+castorland kastPland
+castorland kastPl~d
+castparts kastpPts
+castricone kastr@kOnE
+castries k)str/s
+castries kastr/z
+castries kastrE
+castro kastr]
+castroville kastr]vil
+casual kaZ@wL
+casual kaZwL
+casually kaZU6l/
+casualties kaZULt/z
+casualty kaZULt/
+cat kat
+cat's kats
+catalan kat@l)n
+catalog kad@l{g
+catalogued kad@l{gd
+catalogues kad@l{gz
+catamaran kad@m@ran
+cataract kad@rakt
+catasauqua kad@s{kw@
+catasauqua kat@s{kw@
+catastrophic kad@strof6k
+catcall katk{l
+catch kaC
+catchall kaCL
+catches kaC6z
+catching kaC6N
+categories kad6g{r/z
+categorizes kad6gPIz6z
+category kad6g{r/
+caterer kAdPP
+caterpillar kadPpilP
+caterpillar's kadPpilPz
+caterpillars kadPpilPz
+caters kAdPz
+catharine kaTr6n
+cathay kaTA
+cathedral k@TEdrL
+catherin kaT@rin
+catherine kaT@r~
+catherine's kaT@r~z
+catherines kaT@r~z
+cathlamet kaTl@m6t
+cathlamet kaTl@met
+cathleen kaTlEn
+catholic kaTl6k
+catholicism k@Tol6siz}
+catholics kaTl6ks
+cathy kaT/
+catkins katk~z
+catlettsburg katl6tsbVg
+catlin katl~
+catnap katnap
+catnip katnip
+cato kAd]
+catoire katw)r
+catonsville kAd~zvil
+catonsville kAt~zvil
+catoosa k@tUs@
+catron katron
+cats kats
+catskill katskil
+catskills katskilz
+cattanach kat@nak
+catterton katPt6n
+cattle kadL
+cattleship kadLSip
+caucus k{k@s
+caughell k)g@l
+caughey k{fE
+caughron k)fr@n
+caught k{t
+cauldron k{ldr~
+cause k{z
+caused k{zd
+causes k{z6z
+causeway k{zwA
+causing k{z6N
+cauterize k{dPIz
+caution k{S~
+cautions k{S~z
+cautious k{S@s
+cautiousness k{S@sn6s
+cava kov@
+cavagna k@v)ny@
+cavaliers kav@lErz
+cavalry kavLr/
+cavalryman kavLr/m~
+cavanagh kav~@
+cavazos k@v)zOs
+cave kAv
+caveman kAvman
+cavender kav6ndP
+cavernously kavPn@sl/
+caves kAvz
+cavetown kAvt?n
+caviar kav/)r
+caviness kavines
+cavities kav6d/z
+cavity kav6d/
+cawon k)w@n
+cawthorn k{T{rn
+cayce kAs
+cayea kIyA
+caysville kAzvil
+cazenovia kaz6nOv/@
+cazenovia kaz~Ov/@
+cd sEdE
+cddj sEdEdEjA
+cease sEs
+ceaseless sEsl6s
+ceases sEs6z
+cecil sEsL
+cecilton sEsLt~
+cedar sEdP
+cedarcreek sEdPkrEk
+cedarhurst sEdPhVst
+cee sE
+ceiling sEl6N
+celebrally sel6br6l/
+celebrate sel6brAt
+celebrates sel6brAts
+celebration sel6brAS~
+celebrities s6lebr6d/z
+celebrity s6lebr6d/
+celeste s@lest
+celina s6lEn@
+celine s@lEn
+celine sel~
+cell sel
+cellar selP
+cellblock selblok
+cellophane sel@fAn
+cells selz
+cellular sely@lP
+celsius sels/@s
+cement s6ment
+cemetery sem6ter/
+censored sensPd
+censoring sensP6N
+censorship sensPSip
+censure senSP
+census sens@s
+cent sent
+center sentP
+center_city sentPsit/
+centerburg sentPbVg
+centereach sent@r6C
+centereach sentPEC
+centered sentPd
+centerpoint sentPp<nt
+centers sentPz
+centertown sentPt?n
+centerview sentPvyU
+centerville sentPvil
+centigrade sent6grAd
+centipede sent6pEd
+central sentrL
+centralia scntr)l/@
+centralia sentrAl/@
+centre sentP
+centreville sentPvil
+centrifuge sentr6fyUj
+cents sents
+centuria sentUr/@
+centuries senC@r/z
+century senC@r/
+ceramic s@ram6k
+cerar sAr)r
+cereal sEr/L
+cerebral s@rEbrL
+cerebrally s@rEbr6l/
+ceredo sPAd]
+cerqueira sPkEr@
+cerrito s@rEd]
+certain sVd~
+certainly sVd~l/
+certainty sVd~t/
+certificates sPtif6k6ts
+certification sVd6f6kAS~
+cervantes sPv)ntAs
+cervantez sPv)ntAs
+cervix sVviks
+cespedes sesp@d6s
+cessation sesAS~
+ceylon silon
+cha C)
+chabot Cabut
+chacon C@kOn
+chad Cad
+chadbourn CadbPn
+chadderton CatPt@n
+chadron Cadr~
+chadwick Cadwik
+chae CA
+chafes CAfs
+chafin CAf6n
+chain CAn
+chained CAnd
+chainsaws CAns{z
+chainstitch CAnst6C
+chair C,r
+chaires CArz
+chairlift C,rlift
+chairman C,rm~
+chairs C,rz
+chalk C{k
+chalkboard C{kb{rd
+chalker C{kP
+chalkhill C{kh6l
+chalkhill C{khil
+challenge Cal~j
+challenged Cal~jd
+challenging Cal~j6N
+challengingly Cal~j6Nl/
+chalmers ComPz
+chalmette Calmct
+chalmette Calmet
+chalmette Colmct
+chama Com@
+chamber CAmbP
+chamberlain CAmbPl6n
+chamberland CAmbPl@nd
+chamberlayne CambPlAn
+chamberlin CAmbPl6n
+chambers CAmbPz
+chambersburg CAmbPzbVg
+champagne SampAn
+champion Camp/~
+championed Camp/~d
+championing Camp/~6N
+champions Camp/~z
+championship Camp/~Sip
+championships Camp/~Sips
+champlain SamplAn
+champlin Campl~
+chan Can
+chance Cans
+chancefulness CansfLn6s
+chancel CansL
+chanco CansO
+chandler CandlP
+chang CaN
+change CAnj
+changeable CAnj@bL
+changed CAnjd
+changeless CAnjl6s
+changeling CAnjl6N
+changemaker CAnjmAkP
+changeover CAnjOvP
+changepocket CaNgep@k6t
+changer CAnjP
+changes CAnj6z
+changing CAnj6N
+channahon Can@hon
+channahon Can@h~
+channel CanL
+channels CanLz
+channelview CanLvyU
+chantal S)nt)l
+chantel Santel
+chantilly Cant6l/
+chantilly Cant6l/
+chantilly Santil/
+chaos kAos
+chap Cap
+chaparral C@parL
+chapel CapL
+chapel_hill CapLhil
+chaperone Sap@rOn
+chapin CApin
+chapin Copin
+chaplin Capl~
+chapman Capm~
+chapman's Capm~z
+chapmans Capm~z
+chapter CaptP
+char C)r
+character kar6ktP
+characteristic kar6ktPist6k
+characteristics kar6ktPist6ks
+characterize kar6ktPIz
+characterized kar6ktPIzd
+characters kar6ktPz
+charades S@rAdz
+charbonnet S)rb@nA
+charcoal C)rkOl
+charcoals C)rkOlz
+chardin C)rd~
+chardon C)rd~
+charenton C)rent~
+charenton Car~t~
+charge C)rj
+charged C)rjd
+charger CorjP
+charges Corj6z
+charing C,r6N
+charise S@rEs
+charismatic kar6zmad6k
+charisse C@rEs
+charlack C)rlak
+charlene CorlEn
+charleroi C)rl@r<
+charles C)rlz
+charles_mix C)rlzmiks
+charleston C)rlzt~
+charlesworth C)rlzwVT
+charley C)rl/
+charlie C)rl/
+charlie's C)rl/z
+charlies C)rl/z
+charline S)rlEn
+charlotte S)rl@t
+charlottesville S)rl@tsvil
+charlottetown S)rl@tt?n
+charm C)rm
+charmed C)rmd
+charmer C)rmP
+charming C)rm6N
+charo C)rO
+charolette Car@let
+charred C)rd
+charro C)rO
+charron Car~
+chart C)rt
+charter C)rdP
+charterhouse C)rdPh?s
+chartley C)rtl/
+charts C)rts
+chas Caz
+chase CAs
+chased CAst
+chases CAs6z
+chasing CAs6N
+chaska Cask@
+chastise CastIz
+chastised CastIzd
+chastity Cast6d/
+chat Cat
+chateau SatO
+chatham Cad}
+chatom Cad}
+chatswood Catswqd
+chatsworth CatswVT
+chattanooga Cad~nUg@
+chatted Cad6d
+chatterbox CadPboks
+chatterton CatPt6n
+chatting Cad6N
+chauncey C{ns/
+chauvinism SOv6niz}
+chaves C)vez
+che CA
+cheap CEp
+cheapskate CEpskAt
+cheat CEt
+cheating CEd6N
+chebanse C@bans
+chebanse Ceb~s
+check Cek
+checkbooks Cekbqks
+checked Cekt
+checker CekP
+checkerboard CekPb{rd
+checking Cek6N
+checkings Cek6Nz
+checkmate CekmAt
+checkoff Cek{f
+checkouts Cek?ts
+checkpoint Cekp<nt
+checkpoints Cekp<nts
+checks Ceks
+checkup Cekup
+checkups Cekups
+checotah C6kod@
+cheddars CedPz
+cheech CEC
+cheek CEk
+cheekbone CEkbOn
+cheeks CEks
+cheerfully CErfL/
+cheering CEr6N
+cheerlessly CErl6sl/
+cheese CEz
+cheeseboro CEzb@rO
+cheesebrough CEzbrO
+cheeseburger CEzbVgP
+cheesecake CEzkAk
+cheesecloth CEzkl{T
+cheeseman CEzm6n
+cheetal CEdL
+chef Sef
+chefs Sefs
+chehalis CehL6s
+cheju CAjU
+chelan CEl~
+chelmsford CelmzfPd
+chelsea Cels/
+cheltenham Celt~}
+chemical kem6kL
+chemicals kem6kLz
+chenango C6naNg]
+chenango CcnaNg]
+chenequa C6nekw@
+cheney CAnE
+cheneyville CAn/vil
+chepachet C@paC6t
+chepachet Cep@SA
+cher SAr
+cheramie Cer@mE
+cheraw C@r)
+cheraw CAr{
+cherie SArE
+cherise C@rEz
+cherish Car6S
+cheriton Car6t~
+cheriton SerEt~
+cherries C,r/z
+cherry Cer/
+cherry_hill Cer/hil
+cherrystone C,r/stOn
+cherryville C,r/vil
+cherryville Cer/vil
+cheryl SarL
+cheryle SAr@l
+chesaning CesAn6N
+chesaning Ces~6N
+chesapeake Ces@pEk
+chesebro CEzbrO
+cheshire CeSP
+cheshire CeSV
+chesley Cesl/
+chesnee Cesn/
+chesnee CeznE
+chessworld CeswVld
+chest Cest
+chester CestP
+chesterhill CestPhil
+chestnut Cestnut
+chests Cests
+chetal Cetol
+cheung CEuN
+cheuvront S@vr)nt
+chevak Cevak
+cheverton CevPt@n
+cheviot CEv/6t
+chevrolet Sevr@lA
+chevrolets Sevr@lAz
+chevron Sevron
+chevy's Sev/z
+chevys Sev/z
+chew CU
+chewing CU6N
+chewy CU/
+cheyenne SIan
+cheyenne SIen
+chhoun CUn
+chiappone CE@pOnE
+chiaramonte kE)r@m)ntA
+chiaravalle CE)r@valE
+chicago S6k)g]
+chicago S6kog]
+chichester CICestP
+chichester CiCestP
+chick Cik
+chicken Cik~
+chickpea CikpE
+chicks Ciks
+chiclayo C6klA]
+chiclayo C6klI]
+chicles Cik@lz
+chicopee Cik@pE
+chide CId
+chided CId6d
+chidester Cid6stP
+chief CEf
+chiefdom CEfd}
+chiefland CEfland
+chiefland CEfl~d
+chiefly CEfl/
+child CIld
+childbearing CIldb,r6N
+childbirth CIldbVT
+childcraft CIldkraft
+childe Cild
+childers CIldPz
+childersburg CIldPzbVg
+childhood CIldhqd
+childishness CIld6Sn6s
+childlike CIldlIk
+children Cildr~
+children$$$'s Cildr~z
+children$$$s Cildr~z
+children$$'s Cildr~z
+children$$s Cildr~z
+children$'s Cildr~z
+children$s Cildr~z
+children's Cildr~z
+childrens Cildr~z
+childress CIldr6s
+childress Cildr6s
+childs CIldz
+chiles CIlz
+chili Cil/
+chill Cil
+chillan C/y)n
+chilled Cild
+chillicothe Cil@kOT
+chillicothe Cil@koT/
+chills Cilz
+chimayo kImA]
+chimed CImd
+chimes CImz
+chimney Cimn/
+chimpanzee Cimp~zE
+chimpanzees Cimp~zEz
+chimps Cimps
+china CIn@
+chinatown CIn@t?n
+chinault SinO
+chinese CInEz
+chink CiNk
+chinnici C6nECE
+chino CEn]
+chip Cip
+chipmunk CipmuNk
+chipper CipP
+chippewa C6pEw@
+chiquita C6kEd@
+chiropractor kIr]praktP
+chiropractor's kIr]praktPz
+chiropractors kIr]praktPz
+chirp CVp
+chirps CVps
+chisholm Cis@m
+chisley CizlE
+chism Ciz6m
+chisom Ciz@m
+chitchat CiC6t
+chittagong Cid@g{N
+chittagong Cit@goN
+chitwood Citwqd
+chivalrous SivLr@s
+chivalry SivLr/
+chive CIv
+chiverton CivPt@n
+chives CIvz
+chloe klOE
+chloride kl{rId
+chlorine kl{rEn
+chocolate C{kl6t
+choctaw Cokt{
+choi C<
+choice C<s
+choices C<s6z
+choicest C<s6st
+choir kwIr
+choirboy kwIrb<
+choirgirl kwIrgVl
+choke COk
+chokio COk/]
+cholesterol k@lest@r{l
+chomping Comp6N
+chong C{N
+choose CUz
+choosing CUz6N
+chop Cop
+chopped Copt
+choprah Copr@
+chopsticks Copstiks
+chopsuey CopsU/
+choral k{rL
+choral's k{rLz
+chorals k{rLz
+chore C{r
+choreographer k{r/ogr@fP
+choreographer's k{r/ogr@fPz
+choreographers k{r/ogr@fPz
+choristers C{r6stPz
+chortled C{rdLd
+chorus k{r@s
+chorused k{r@st
+chose COz
+chosen COz~
+chou C?
+choules CUlz
+chow C?
+chowder C?dP
+chowhound C?h?nd
+chows C?z
+chris kris
+chrisman krism~
+chrissy krisE
+christ krIst
+christ's krIsts
+christal krIstL
+christchurch krIstCVC
+christi krist/
+christian krisC~
+christiane kristEan
+christianity krisC/an6d/
+christianized krisC@nIzd
+christians krisC~z
+christiansburg krisC~zbVg
+christiansen krisC6ns6n
+christiansens krisC~s~z
+christianson krisC6ns@n
+christie krist/
+christine kristEn
+christmas krism@s
+christmasberry krism@sber/
+christo krist]
+christophe krist)f
+christopher krist@fP
+christs krIsts
+christy krIst/
+chrome krOm
+chromosome krOm@sOm
+chromosomes krOm@sOmz
+chroniclers kron6klPz
+chronicles kron6kLz
+chronister kr)n6stP
+chronological kron@loj6kL
+chronologically kron@loj6kl/
+chronologies kr@nol@j/z
+chrysler krIslP
+chrystal krist@l
+chrzan kPz6n
+chubb Cub
+chubby Cub/
+chuck Cuk
+chugging Cug6N
+chula CUl@
+chummy Cum/
+chung CuN
+chunky CuNk/
+church CVC
+churches CVC6z
+churchgoer CVCgOP
+churchgoers CVCgOPz
+churchton CVCt~
+churchyard CVCy)rd
+churubusco CV@bqsk]
+chute SUt
+chy CI
+ciampi CEampE
+cianciolo CyanCyOlO
+cicchetti siCetE
+cicciarelli CiCE@relE
+ciccone CikOn
+cicely sis@lE
+cicero sis@rO
+cider sIdP
+cienfuegos sEenfwAgOs
+cigar s6g)r
+cigarette sig@ret
+cigarettes sig@rets
+cigars s6g)rz
+cinch sinC
+cincinatti sins6nad/
+cincinnati sins6nad/
+cinco CiNkO
+cinderella sind@rel@
+cindy sind/
+cinema sin6m@
+cinemas sin6m@z
+cinematic sin6mad6k
+cinque sinkA
+cinthia sinTE@
+cipolla C6pOl@
+circle sVkL
+circled sVkLd
+circles sVkLz
+circular sVky6lP
+circulation sVky6lAS~
+circumference sPkumfr~s
+circumflex sVk}fleks
+circumnavigate sVk}nav6gAt
+circumspection sVk}spekS~
+circumspections sVk}spekS~z
+circumstance sVk}stans
+circumstances sVk}stans6z
+circumstantial sVk}stanSL
+circus sVk@s
+cirrincione s@rinCEOnE
+cisar sIz)r
+cistern sistPn
+citation sItAS~
+citations sItAS~z
+citgo sitg]
+citibank sid/baNk
+cities sid/z
+citizen sid6z~
+citizenry sid6z~r/
+citizens sid6z~z
+citizenship sid6z~Sip
+citronelle sitr@nel
+citrus sitr@s
+city sit/
+city's sid/z
+citys sid/z
+cityscape sid/skAp
+civic siv6k
+civics siv6ks
+civil sivL
+civilian s6vily~
+civilians s6vily~z
+civilization siv6l6zAS~
+civilizations siv6l6zAS~z
+civilized siv6lIzd
+civilly siv6l/
+clack klak
+clackamas kl@kom@z
+clackamas klak@m@s
+claim klAm
+claimed klAmd
+clair kl,r
+claire kl,r
+clairsville kl,rzvil
+clairton kl,rd~
+clairton kl,rt~
+clairvoyant kl,rv<~t
+clam klam
+clambake klamb6k
+clamp klamp
+clams klamz
+clamshell klamSel
+clanging klaN6N
+clankscales klaNkskAlz
+clap klap
+clapham klaf}
+clapham klap}
+clapper klapP
+clapping klap6N
+clapton klapt~
+clara klar@
+claremont kl,rmont
+claremore kl,rm{r
+clarence klAr@ns
+clarification klar6f6kAS~
+clarifications klar6f6kAS~z
+clarified klar6fId
+clarify klar6fI
+clarifying klar6fI6N
+clarinetist klar6ned6st
+clark kl)rk
+clarkdale kl)rkdAl
+clarke kl)rk
+clarkesville kl)rksvil
+clarkfield kl)rkfEld
+clarklake kl)rklAk
+clarks kl)rks
+clarksboro kl)rksbP]
+clarksboro kl)rksbV]
+clarksburg kl)rksbVg
+clarksdale kl)rksdAl
+clarkston kl)rkst~
+clarkstown kl)rkst?n
+clarksville kl)rksvil
+clarkton kl)rkt~
+claryville klar/vil
+clasp klasp
+class klas
+classed klast
+classes klas6z
+classic klas6k
+classical klas6kL
+classics klas6ks
+classified klas6fId
+classroom klasrUm
+classrooms klasrUmz
+clatskanie kl6tskAn/
+clatskanie klatskan/
+clatter kladP
+claudia kl{d/@
+claudia kl{dE@
+clause kl{z
+claustrophobic kl{str@fOb6k
+clavicle klav6kL
+clawges kl{j6s
+clawson kl{s~
+clay klA
+claybank klAbaNk
+claycenter klAs~tP
+claydrying klAdr/6N
+claymore klAm{r
+claypool klApUl
+claysville klAzvil
+clayton klAd~
+cle klE
+clean klEn
+cleaned klEnd
+cleaner klEnP
+cleaners klEnPz
+cleanest klEn6st
+cleaning klEn6N
+cleans klEnz
+cleanse klenz
+cleansed klenzd
+cleanser klenzP
+cleansers klenzPz
+clear klEr
+cleared klErd
+clearing klEr6N
+clearinghouse klEriNh?s
+clearinghouses klEriNh?z6z
+clearlake klErlAk
+clearly klErl/
+clearway klErwA
+cleat klEt
+cleaveland klEvland
+cleaver klEvP
+cleburne klebPn
+cleese klEs
+clemency klem~s/
+clemens klem~z
+clementine klem6ntIn
+clements klem~ts
+clemins klem~z
+clench klenC
+clenched klenCt
+clendenin klend~~
+cleopatra klE@patr@
+clergyman klVj/m~
+clerk klVk
+clerks klVks
+cleron kl,r6n
+cleta klEt@
+cleveland klEvl~d
+clevelands klEvl~dz
+clever klevP
+cleverness klevPn6s
+cliche klESA
+cliff klif
+cliff's klifs
+cliffs klifs
+cliffside klifsId
+clifton klift~
+clifty klift/
+climate klIm6t
+climates klIm6ts
+climax klImaks
+climb klIm
+climbed klImd
+climber klImP
+climbers klImPz
+climbing klIm6N
+clinchco klinCk]
+clinched klinCt
+clinches klinC6z
+clinebell klInbel
+cling kliN
+clingenpeel kliN6npEl
+clinger kliNP
+clingerman kliNPm@n
+clings kliNz
+clingy kliN/
+clinic klin6k
+clink kliNk
+clinkingbeard kliNkiNbErd
+clinkscales kliNkskAlz
+clinton klint~
+clintondale klint~dAl
+clintonville klint~vil
+clintwood klintwqd
+clip klip
+clippings klip6Nz
+clips klips
+clive klIv
+clizbe klizbE
+cloakroom klOkrUm
+clock klok
+clocks kloks
+clockwork klokwVk
+clod klod
+clog klog
+clogged klogd
+clogs klogz
+cloister kl<stP
+clorox kl{roks
+close klOs
+close klOz
+closed klOzd
+closely klOsl/
+closeness klOsn6s
+closer klOsP
+closest klOs6st
+closet kloz6t
+closing klOz6N
+closure klOZP
+closures klOZPz
+clot klot
+cloth kl{T
+clothbound kl{Tb?nd
+clothe klOD
+clothed klODd
+clothes klODz
+clothesbasket kl@Tezb@sk6t
+clotheshorse kloT6SPs
+clothesline klODzlIn
+clothespin klODzpin
+clothing klOD6N
+clotted klod6d
+cloud kl?d
+cloudburst kl?dbPst
+cloudbursts kl?dbPsts
+clouds kl?dz
+cloudy kl?d/
+clout kl?t
+clove klOv
+clover klOvP
+cloverdale klOvPdAl
+cloverleaf klOvPlEf
+clowns kl?nz
+club klub
+clubhouses klubh?z6z
+clubroom klUbrUm
+clubs klubz
+cludki kludk/
+clue klU
+clues klUz
+clump klump
+clumsy klumz/
+clutched kluCt
+clute klUt
+co kO
+coach kOC
+coachbuilding kOCbyLd6N
+coachman kOCm~
+coachwork kOCwVk
+coahoma k6hOm@
+coal kOl
+coaldale kOldAl
+coalgate kOlgAt
+coaling kOl6N
+coalition kO@liS~
+coals kOlz
+coalsack kOlsak
+coalton kOlt~
+coalville kOlvil
+coarsely k{rsl/
+coast kOst
+coastal kOstL
+coastlines kOstlInz
+coat kOt
+coatbridge kOtbrij
+coatesville kOtsvil
+coating kOd6N
+coatroom kOtrUm
+coatsville kOtsvil
+coattails kOttAlz
+coauthors kO6TPz
+coax kOks
+cob kob
+cobalt kOb{lt
+cobbler koblP
+cobbler's koblPz
+cobblers koblPz
+cobblestone kobLstOn
+cobine kObIn
+cobleskill kObLzkil
+cobourn kObPn
+cobs kobz
+coburn kObPn
+coca kOk@
+cocco COkO
+cochabamba kOk@yomb@
+cochrane kokr~
+cocked kokt
+cockerill kok@ril
+cockle kokL
+cockleshell kokLSel
+cockpits kokpits
+cockroaches kokrOC6z
+cocktail koktAl
+cockwell kokwel
+cocoa kOk]
+coconut kOk@nut
+coconuts kOk@nuts
+cocoon k@kUn
+cod kod
+coddle kodL
+code kOd
+codes kOdz
+codispot k)d6sp)t
+coeditor k]ed6dP
+coeducational kOej6kAS~L
+coefficients kO6fiS~ts
+coercively k]Vs6vl/
+coeur kqr
+coexist kO6gzist
+coffee k{f/
+coffeecake k{f/kAk
+coffeehouse k{f/h?s
+coffeen k{fEn
+coffeepot k{f/pot
+coffeeville k{f/vil
+coffers k{fPz
+coffeyville k{f/vil
+coggon kog~
+coggsdale k)gzdAl
+cogwheel kogwEl
+cohen kO~
+coherence k]hEr~s
+coherent k]hEr~t
+coherently k]hEr~tl/
+cohesion k]hEZ~
+cohesions k]hEZ~z
+cohoes k]hOz
+cohort kOh{rt
+coil k<l
+coin k<n
+coincided kO~sId6d
+coincidence k]ins6d~s
+coincides kO~sIdz
+coins k<nz
+coit k<t
+coke kOk
+cokedale kOkdAl
+cokeley kOklE
+cokeville kOkvil
+cola kOl@
+colangelo k@lanjelO
+colby kOlb/
+colchester kOlCestP
+colclasure kOlklAZP
+cold kOld
+coldest kOld6st
+coldiron kOldIPn
+coldly kOldl/
+colds kOldz
+coldspring kOldspriN
+cole kOl
+colebank kOlbaNk
+colebrook kOlbrqk
+colegrove kOlgrOv
+coleman kOlm6n
+colemon kOlm@n
+colerain kOlrAn
+colerain kol@rAn
+coleridge kOlrij
+coles kOlz
+colesar kOls)r
+colesburg kOlzbPg
+colesburg kOlzbVg
+coleslaw kOlsl{
+coleson kOls@n
+colestock kOlstok
+colette k@let
+coleville kOlvil
+coley kOl/
+colgate kOlgAt
+colijn k6lA6n
+colijn kOlE6n
+coliseum kol6sE}
+collaboration k@lab@rAS~
+collaborators k@lab@rAdPz
+collage k@loZ
+collapse k@laps
+collapsed k@lapst
+collapsible k@laps@bl
+collar kolP
+collared kolPd
+collateral k@lad@rL
+collbran kolbr~
+colleague kolEg
+colleagues kolEgz
+collect k@lekt
+collected k@lekt6d
+collecting k@lekt6N
+collection k@lekS~
+collective k@lekt6v
+collectivism k@lekt6viz}
+collectivization k@lekt6v6zAS~
+collectivized k@lekt6vIzd
+collects k@lekts
+colleen k)lEn
+college kol6j
+colleges kol6j6z
+collete kolEt
+collette k)let
+colley k{lE
+colleyville kol/vil
+colliding k@lId6N
+collie kol/
+collin kol~
+collingswood koliNzwqd
+collingwood kOliNwqd
+collins kol~z
+collinston kol~st~
+collinston kol~zt~
+collinsville kol~zvil
+collinsworth k)linswPT
+collision k@liZ~
+collusion k@lUZ~
+colma kOlm@
+colmesneil kLmeznAl
+colombes kol@mbz
+colombes k{l]mz
+colombo k@lumbO
+colome kol}
+colon k@lOn
+colon kOl~
+colonel kVnL
+colonial k@lOn/L
+colonial's k@lOn/Lz
+colonialization k@lOn/L6zAS~
+colonials k@lOn/Lz
+colonists kol~6sts
+colonization kol~6zAS~
+colonnade k@lonAd
+colony kol~/
+color kulP
+colorado kol@rad]
+colorado kol@rod]
+colorado's kol@rod]z
+colorados kol@rod]z
+colored kulPd
+colorfast k@l{rf6st
+colorful kulPfL
+coloring kulP6N
+colorless kulPl6s
+colors kulPz
+colossal k@losL
+colossus k@los@s
+colour kulP
+coloured kulPd
+colourful kulPfL
+colouring kulP6N
+colours kulPz
+colp kOlp
+colrain kOlrAn
+colrain kolrAn
+colstrip kOlstr@p
+colstrip kOlstrip
+colstrip kolstrip
+colt kOlt
+colton kOlt~
+coltrane kOltrAn
+columbia k@lumb/@
+columbian k@lumb/~
+columbiana k@lumb/on@
+columbiaville k@lumb/@vil
+columbus k@lumb@s
+column kol}
+columned kol@md
+columnist kol@mnist
+columns kol}z
+colville kOlvil
+colvin kOlv6n
+colwich kOlw6C
+colwich k{lw6C
+comanche kom~C
+combats kombats
+combe kOm
+comber kOmP
+combination komb6nAS~
+combinations komb6nAS~z
+combinatorial k}bin@t{r/L
+combine k}bIn
+combined k}bInd
+combines k}bInz
+combings kOm6Nz
+combles kombLz
+combs kOmz
+combust k}bust
+combuster k}bustP
+combustion k}busC~
+come kum
+comedian's k@mEd/~z
+comedians k@mEd/~z
+comedy kom6d/
+comer kumP
+comes kumz
+comfort kumfPt
+comfortable kumftPbL
+coming kum6N
+comings kum6Nz
+comiskey kom6sk/
+comma kom@
+commack kom6k
+commack komak
+command k@mand
+command's k@mandz
+commandeer kom~dEr
+commander k@mandP
+commands k@mandz
+commemorates k@mem@rAts
+commencement k@mensm~t
+commented koment6d
+comments koments
+commerce komPs
+commercial k@mVSL
+commercialization k@mVSL6zAS~
+commercials k@mVSLz
+commissioned k@miS~d
+commissions k@miS~z
+commitment k@mitm~t
+committee k@mid/
+commodation kom@dAS~
+commodity k@mod6d/
+commodore's kom@d{rz
+commodores kom@d{rz
+common kom~
+commonplace kom~plAs
+commonwealth kom~welT
+commonwealth's kom~welTs
+commonwealths kom~welTs
+communal k@myUnL
+communally k@myUn6l/
+communicate k@myUn6kAt
+communicating k@myUn6kAd6N
+communication k@myUn6kAS~
+communism komy@niz}
+communities k@myUn6d/z
+community k@myUn6d/
+communize kom6nIz
+commuter k@myUdP
+comp komp
+compact k}pakt
+compactly k}paktl/
+compactness k}paktn6s
+compacts k}pakts
+compagno k)mp)nyO
+companies kump~/z
+companion k}pany~
+companions k}pany~z
+companionship k}pany~Sip
+company kump~/
+compaq kompak
+comparable kompr@bL
+comparatively k}par@d6vl/
+compare k}p,r
+compared k}pard
+comparing k}p,r6N
+compartment k}p)rtm~t
+compartments k}p)rtm~ts
+compass kump6s
+compensate komp~sAt
+compensation komp~sAS~
+compete k}pEt
+competently komp6t~tl/
+competes k}pEts
+competing k}pEd6N
+competition komp6tiS~
+competitions komp6tiS~z
+competitive k}ped6d6v
+competitiveness k}ped6d6vn6s
+competitors k}ped6dPz
+compilation komp6lAS~
+compile k}pIl
+compiled k}pIld
+compiler k}pIlP
+compiles k}pIlz
+complain k}plAn
+complaint k}plAnt
+complaints k}plAnts
+complementary kompl6ment@r/
+complemented kompl6m~t6d
+complete k}plEt
+completed k}plEd6d
+completely k}plEtl/
+completes k}plEts
+completing k}plEd6N
+complex kompleks
+complexes kompleks6z
+complexion k}plekS~
+complexity k}pleks6d/
+compliance k}plI~s
+complicated kompl6kAd6d
+complicity k}plis6d/
+complier k}plIP
+comply k}plI
+component k}pOn~t
+components k}pOn~ts
+compose k}pOz
+composed k}pOzd
+composers k}pOzPz
+composes k}pOz6z
+composing k}pOz6N
+composite k}poz6t
+composition komp@ziS~
+compositions komp@ziS~z
+compost kompOst
+composure k}pOZP
+compound komp?nd
+compounding k}p?nd6N
+compounds komp?ndz
+comprehending kompr6hend6N
+comprehensible kompr6hens@bl
+comprehension kompr6henS~
+comprehensive kompr6hens6v
+compress kompres
+compress k}pres
+compression k}preS~
+compressor k}presP
+comprised k}prIzd
+compromise kompr@mIz
+compromises kompr@mIz6z
+compu kompU
+compulsory k}puls@r/
+computation kompy6tAS~
+computer k}pyUtP
+computers k}pyUdPz
+computervision k}pyUdPviZ~
+computing k}pyUd6N
+comrades komradz
+comstock komstok
+conan kOn~
+conceal k~sEl
+concealed k~sEld
+concede k~sEd
+conceivably k~sEv@bl/
+conceived k~sEvd
+concentrates kons~trAts
+concentration kons~trAS~
+concept konsept
+conception k)nsepS@n
+concepts konsepts
+conceptual k~sepCwL
+concern k~sVn
+concerned k~sVnd
+concert konsVt
+concertgoer konsVtgOP
+concertmaster konsVtmastP
+concerts konsVts
+concessionaire k~seS@n,r
+concierge kons/,rZ
+conciliation k~sil/AS~
+conclusion k~klUZ~
+conclusions k~klUZ~z
+concoctions k~kokS~z
+concord koNkPd
+concordia k~k{rd/@
+concrete koNkrEt
+concur k~kP
+concurrent k~kP~t
+conde k)ndA
+condemnation kond@mnAS~
+condemned k~demd
+condemns k~demz
+condition k~diS~
+conditioned k~diS~d
+conditioner k~diS~P
+conditioning k~diS~6N
+conditions k~diS~z
+condolence k~dOl~s
+condolences k~dOl~s6z
+condominiums kond@min/}z
+condoning k~dOn6N
+conductivity kond6ktiv6d/
+conducts kondukts
+cone kOn
+coneflower kOnfl?P
+conestoga kon@stOg@
+conesus k]nes@s
+conesville kOnzvil
+coney kOn/
+confabulation k~faby6lAS~
+confer k~fV
+conference konfr~s
+confers k~fVz
+confession k~feS~
+confessions k~feS~z
+confetti k~fed/
+confidence konf6d~s
+confident konf6d~t
+confidential konf6denSL
+confidentiality konf6denC/al6d/
+configuration k~figy@rAS~
+confinement k~fInm~t
+confirm k~fVm
+confirmation konfPmAS~
+conflict konflikt
+confluence konflU~s
+conform k~f{rm
+conformational konfPmAS~L
+conformists k~f{rm6sts
+confounded k~f?nd6d
+confront k~frunt
+confrontation konfr~tAS~
+confrontations konfr~tAS~z
+confronted k~frunt6d
+confusing k~fyUz6N
+confusion k~fyUZ~
+confusions k~fyUZ~z
+conger k)NgP
+congested k~jest6d
+congestion k~jesC~
+congleton k)Ng@lt6n
+conglomeration k~glom@rAS~
+congratulate k~graC6lAt
+congratulating k~graC6lAd6N
+congratulation k~graC6lAS~
+congratulations k~graC6lAS~z
+congregated koNgr6gAd6d
+congregation koNgr6gAS~
+conjecture k~jekCP
+conjugation konj6gAS~
+conjunction k~juNkS~
+conjunctions k~juNkS~z
+conjure konjP
+conjured konjPd
+conjurer konjPP
+connaughton k@n{t~
+conneaut konOt
+conneautville konOtvil
+connect k@nekt
+connected k@nekt6d
+connecticut k6nedik@t
+connecticut k@net6k6t
+connecticut k@net@k@t
+connecting k@nekt6N
+connection k@nekS~
+connects k@nekts
+connellys kon6l/z
+connellys kon@l/z
+connersville konPzvil
+connerton k)nPt@n
+connie kon/
+connive k@nIv
+conniving k@nIv6N
+connoisseur kon6sV
+connolly k)n@lE
+connor konP
+conour k)nUr
+conquer koNkP
+conquered koNkPd
+conqueror koNkPP
+conquerors koNkPPz
+conquest koNkwest
+conquests koNkwests
+conrad konrad
+conroy konr<
+cons konz
+conscience konS~s
+conscientious konS/enS@s
+conscientiously konS/enS@sl/
+conscious konS@s
+consciously konS@sl/
+consequence kons6kwens
+consequences kons6kwens6z
+consequent kons6kw~t
+consequently kons6kw~tl/
+conservation konsPvAS~
+conservatism k~sVv@tiz}
+conservative k~sVv@d6v
+conservatory k~sVv@t{r/
+conshohocken k~SOh@k~
+consider k~sidP
+considerable k~sidr@bL
+considerably k~sidr@bl/
+considerations k~sid@rAS~z
+considered k~sidPd
+consist k~sist
+consistently k~sist~tl/
+consists k~sists
+console k~sOl
+consolidation k~sol6dAS~
+consolidations k~sol6dAS~z
+consonants kons~~ts
+consor konsP
+consorting k~s{rd6N
+conspicuous k~spikyU@s
+conspiracies k~spEr@s/z
+conspiratorial k~spEr@t{r/L
+constance konst~s
+constant konst~t
+constanta k~st)ns@
+constanta k~stant@
+constantine konst~tEn
+constantini k)nst@ntEnE
+constantly konst~tl/
+constellation konst6lAS~
+constituted konst6tUd6d
+constitutionality konst6tUS@nal6d/
+constitutionally konst6tUS~L/
+constraints k~strAnts
+construct k~strukt
+constructed k~strukt6d
+construction k~strukS~
+constructions k~strukS~z
+constructive k~strukt6v
+consultants k~sult~ts
+consultations konsLtAS~z
+consulting k~sult6N
+consume k~sUm
+consumers k~sUmPz
+consuming k~sUm6N
+consumption k~sumpS~
+contact kontakt
+contact k~takt
+contacted kontakt6d
+contacts kontakts
+contacts k~takts
+contadora kont@d{r@
+contagious k~tAj@s
+contain k~tAn
+contained k~tAnd
+container k~tAnP
+contains k~tAnz
+contemplation kont@mplAS~
+contemporary k~temp@rer/
+contemptuous k~tempCU@s
+contender k~tendP
+content kontent
+contentedly k~tent6dl/
+contents kontents
+contessa k~tes@
+contest kontest
+contests kontests
+context kontekst
+contextual k~teksCwL
+continent kont~~t
+continental kont6nentL
+continually k~tinyU6l/
+continue k~tinyU
+continued k~tinyUd
+continues k~tinyUz
+continuing k~tinyU6N
+continuity kont6nU6d/
+continuous k~tinyU@s
+continuously k~tinyU@sl/
+contour kontUr
+contours kontUrz
+contract kontrakt
+contractor kontraktP
+contrary kontrer/
+contrast kontrast
+contribute k~tribyUt
+contributed k~tribyUd6d
+contributions kontr6byUS~z
+contributors k~triby6dPz
+contributory k~triby6t{r/
+control k~trOl
+controlled k~trOld
+controlling k~trOl6N
+controls k~trOlz
+controversial kontr@vVSL
+controversy kontr@vVs/
+convenience k~vEny~s
+conveniencia k@nvenyenC@
+convenient k~vEny~t
+convent konv~t
+convention k~venS~
+conventional k~venS~L
+converge k~vVj
+converging k~vVj6N
+conversation konvPsAS~
+conversationalist konvPsAS~L6st
+converse k~vVs
+conversing k~vVs6N
+conversion k~vVZ~
+converted k~vVd6d
+convertible k~vVd@bl
+convey k~vA
+conveys k~vAz
+conviction k~vikS~
+convictions k~vikS~z
+convince k~vins
+convinced k~vinst
+convoy konv<
+convulsion k~vulS~
+conway konwA
+conyers kOn/Pz
+cook kqk
+cooke kqk
+cooked kqkt
+cookeville kqkvil
+cookies kqk/z
+cooking kqk6N
+cookout kqk?t
+cooksville kqksvil
+cookville kqkvil
+cool kUl
+cooler kUlP
+coolidge kUl6j
+cooling kUl6N
+coolness kUln6s
+coombes kUmz
+coomes kUmz
+coon kUn
+cooney kUn/
+coontz kUnts
+cooper kUpP
+cooperate k]op@rAt
+cooperated k]op@rAd6d
+cooperates k]op@rAts
+cooperation kOop@rAS~
+cooperative k]opr@d6v
+coopersburg kUpPzbVg
+coopersmith kUpPsmiT
+coopersville kUpPzvil
+coopman kUpm~
+coordinates k]{rd6nAts
+coordination kO{rd6nAS~
+coordinators k]{rd6nAdPz
+cooter kUdP
+cop kop
+copalis k]pal6s
+copalis kopL6s
+copan kOp~
+copel kopL
+copeland kOpl6nd
+copelin kOplin
+copeman kOpm6n
+copenhaver kOp6nhAvP
+copes kOpz
+copiague kOp/ag
+copies kop/z
+coplay koplA
+coppell kopel
+copper kopP
+copperas k@par@z
+copperas kopP)s
+coppersmith kopPsmiT
+coppola k)p@l@
+copra kopr@
+copy kop/
+copyboy kop/b<
+copying kop/6N
+copyreaders kop/rEdPz
+copyright kop/rIt
+copyrights kop/rIts
+coral k{rL
+coralee k{r@lE
+coralie k{r@lE
+coralville k{rLvil
+corazon k{r@zOn
+corbel k{rbL
+corbett k{rb6t
+corbin k{rb~
+corcoran k{rk@r~
+cord k{rd
+cordele kPdel
+cordell k{rdel
+corder k{rdP
+cordes k{rdz
+cordesville k{rdzvil
+cordoba kPdOb@
+cordoba k{rd@b@
+cordoua k{rdU@
+corduroy k{rj@r<
+corduroys k{rj@r<z
+core k{r
+coretta k@red@
+corey k{r/
+corfu k{rfU
+corinna k@rin@
+corinna kPin@
+corinth kor6nT
+corinth k{r6nT
+corinth k{r~T
+cork k{rk
+corkboard k{rkb{rd
+corked k{rkt
+corks k{rks
+corksboard k{rksb{rd
+corkscrew k{rkskrU
+corkwood k{rkwqd
+cormorant k{rm@rant
+cormorant k{rmP~t
+cormorant k{rmr~t
+corn k{rn
+corncob k{rnkob
+corncrib k{rNkrib
+corned k{rnd
+corneille kOrnEl
+cornelian k{rnEl/~
+cornelius kPnEl/@s
+cornell k{rnel
+corner k{rnP
+cornered k{rnPd
+cornett k{rnet
+cornflakes k{rnflAks
+cornhusk k{rnhusk
+corning k{rn6N
+cornish k{rn6S
+cornmeal k{rnmEl
+cornstarch k{rnst)rC
+cornwall k{rnw{l
+coroboa k@rob]@
+corollated k{r@lAd6d
+corona k@rOn@
+coronado k{r@nod]
+coronation k{r@nAS~
+coronel k{r@nel
+corp k{rp@rAS~
+corporation k{rp@rAS~
+corporation's k{rp@rAS~z
+corporations k{rp@rAS~z
+corpse k{rps
+corpulent k{rpy6l~t
+corpus k{rp@s
+corrales k{ral6s
+correct k@rekt
+correctedness k@rekt6dn6s
+correction k@rekS~
+corrections k@rekS~z
+correctly k@rektl/
+correctness k@rektn6s
+correll k{rel
+corresponded k{r6spond6d
+correspondency k{r6spond~s/
+corresponds k{r6spondz
+corridor k{r6dP
+corrigan k{r6g~
+corroborated k@rob@rAd6d
+corrosions k@rOZ~z
+corrugated k{r6gAd6d
+corrupt k@rupt
+corruptly k@ruptl/
+corry k{r/
+corryton k{r/t~
+corryton k{r6t~
+corsage k{rsoZ
+corsaut kOrsO
+corsica k{rs6k@
+corsicana k{rs6k)n@
+corsicana k{rs6kon@
+cortland k{rtland
+cortland k{rtl~d
+corvallis k{rvL6s
+corvus k{rv@s
+corwin k{rwin
+cory k{r/
+corydon k{r6d~
+coryea k{rE@
+cosby kozb/
+cosenza k@senz@
+cosenza k]senz@
+cosme k)zm@
+cosmetics kozmed6ks
+cosmic kozm6k
+cosmo kozm]
+cosmology k6smol@j/
+cosmopolis k6smopL6s
+cosmopolis kozmop@l6s
+cosmopolitan kozm@pol6t~
+cost k{st
+costa kOst@
+costa_mesa kost@mAs@
+costcutting k{stkud6N
+costly k{stl/
+costner kostnP
+costs k{sts
+costume kosCUm
+costumer kosCUmP
+costumes kosCUmz
+cottage kod6j
+cottageville kod6jvil
+cottbus kotbus
+cottingham k)tiNham
+cotton kod~
+cottongim k)t~jim
+cottonmouth kod~m?T
+cottonpicking kod~pik6N
+cottonport kod~p{rt
+cottonport kot~p{rt
+cottontail kod~tAl
+cottontown kod~t?n
+cottontown kot~t?n
+cottonweed kod~wEd
+cottonwoods kod~wqdz
+cotugno k@tUnyO
+couch k?C
+couched k?Ct
+couches k?C6z
+couchman k?Cm~
+coudersport k?dPzp{rt
+couey kUE
+cougar kUgP
+cough k{f
+coughlan k)fl@n
+coughlin k)fl6n
+coughs k{fs
+couillard kUl)rd
+could kqd
+could've kqd@v
+couldn't kqd~t
+couldnt kqd~t
+couldve kqd@v
+coulee k?l/
+coulee kUl/
+coulibaly kUlibalE
+coulombe k@lOm
+coulon kUl)n
+coulson kOls~
+council k?nsL
+councilmen k?nsLm~
+count k?nt
+countdowns k?ntd?nz
+counted k?nt6d
+counter k?ntP
+counterblast k?ntPblast
+counterforce k?ntPf{rs
+countermeasures k?ntPmeZPz
+countermove k?ntPmUv
+countermovers k?ntPmUvPz
+countermoves k?ntPmUvz
+counterpoint k?ntPp<nt
+counterrevolutionary k?ntPrev@lUS@ner/
+counterterrorism k?ntPtarPiz}
+countertop k?ntPtop
+counties k?nt/z
+countless k?ntl6s
+countries kuntr/z
+country kuntr/
+countryman kuntrEm6n
+countryside kuntr/sId
+county k?nt/
+coupeville kUpvil
+couple kupL
+coupled kupLd
+couples kupLz
+coupling kupl6N
+coupon kUpon
+courage kV6j
+courier kV/P
+courrege kUrej
+course k{rs
+courseault kUrsO
+courses k{rs6z
+coursework k{rswVk
+coursey kUrsE
+courson k{rs@n
+court k{rt
+courtesy kVt@s/
+courthouse k{rth?s
+courtland k{rtland
+courtly k{rtl/
+courtney k{rtn/
+courtrooms k{rtrUmz
+courts k{rts
+courtship k{rtSip
+courtyard k{rty)rd
+courtyards k{rty)rdz
+coushatta k6Sad@
+cousin kuz~
+cousins kuz~z
+coutermarsh kUtPm)rS
+coutinho kUt~hO
+coutre kUtr@
+couture kUtUr
+cove kOv
+covenant kuv~~t
+coventry kuv~tr/
+cover kuvP
+coverage kuvr6j
+coveralls kovrLz
+covered kuvPd
+covering kuvP6N
+covers kuvPz
+coverstone kuvPstOn
+covert kOvPt
+covesville kOvzvil
+covey kuvE
+covina k@vEn@
+covington kuv6Nt~
+covington kuviNt~
+cow k?
+cowan k?6n
+cowans k?6nz
+cowansville k?~zvil
+cowansville kO~zvil
+coward k?Pd
+cowardice k?Pd6s
+cowarts k?)rts
+cowbells k?belz
+cowboy k?b<
+cowboy's k?b<z
+cowboys k?b<z
+cowen k?6n
+cowen kO~
+coweta k?Ad@
+cowgill k?gil
+cowgirls k?gVlz
+cowherd k?hVd
+cowhide k?hId
+cowin k?win
+cowl k?l
+cowles kOwlz
+cowley k?l/
+cowling k?l6N
+cowman k?man
+cowpoke k?pOk
+cows k?z
+cox koks
+coxe k)ks
+coy k<
+coyote kIOd/
+cozad koz6d
+cozart kOz)rt
+cozumel koz6mL
+cozy kOz/
+cozying kOz/6N
+crab krab
+crabtree krabtrE
+crack krak
+crackdowns krakd?nz
+cracked krakt
+crackerjack krakPjak
+crackerjacks krakPjaks
+crackers krakPz
+cradle krAd@l
+cradles krAdLz
+craft kraft
+crafting kraft6N
+craftwork kraftwVk
+crager krAgP
+cragsmoor kragzmUr
+cragsmoor kragzmqr
+craig krAg
+craig's krAgz
+craige krAg
+craigen krAgin
+craigmiles kregmIlz
+craigs krAgz
+cram kram
+crammed kramd
+cramp kramp
+cranberry kranber/
+cranbury kranbP/
+crane krAn
+cranes krAnz
+cranesville krAnzvil
+cranfills kranfilz
+crankcase kraNkkAs
+crankshafts kraNkSafts
+cranston kranst~
+crape krAp
+crash kraS
+crashed kraSt
+crashing kraS6N
+crate krAt
+cravat kr@vat
+crave krAv
+cravens krAv~z
+crawfish kr{fiS
+crawford kr{fPd
+crawfordsville kr{fPdzvil
+crawled kr{ld
+crawling kr{l6N
+crawls kr{lz
+crayfish krAfiS
+crayon krAon
+crayons krAonz
+crazily krAz6l/
+craziness krAz/n6s
+crazy krAz/
+creaked krEkt
+creaky krEk/
+cream krEm
+creamed krEmd
+creamridge krEmrij
+crease krEs
+creases krEs6z
+create kr/At
+created kr/Ad6d
+creates kr/Ats
+creation kr/AS~
+creations kr/AS~z
+creative krEAd6v
+creativity krE6tiv6d/
+creators kr/AdPz
+creatures krECPz
+credit kred6t
+credited kred6d6d
+credits kred6ts
+credulous krej6l@s
+creede krEd
+creek krEk
+creekmore krEkm{r
+creeping krEp6N
+cregin krEgin
+creole krEOl
+crept krept
+cresco kresk]
+cress kres
+cressey kres/
+cressona kr6sOn@
+cressona kr@sOn@
+crest krest
+crestfallen krestf{l~
+crestmont krestmont
+crestone krEstOn
+crestone krestOn
+cretsinger kretsiNP
+creve krEv
+crew krU
+crews krUz
+crichton krIt~
+cricket krik6t
+cridersville krIdPzvil
+cried krId
+crime krIm
+criminal krim~L
+criminality krim6nal6d/
+crimped krimpt
+crimson krimz~
+cringed krinjd
+crinkle kriNkL
+crippen krip~
+crisis krIs6s
+crisp krisp
+crisply krispl/
+crispness krispn6s
+criss kris
+crisscrossed kriskr{st
+cristopher krist@fP
+criteria krItEr/@
+critical krid6kL
+critically krid6kl/
+criticism krid6siz}
+criticized krid6sIzd
+crivitz kriv6ts
+croce krOCE
+crocodile krok@dIl
+croix kr<ks
+crompton krompt~
+cromwell kromwL
+cronan krOn~
+cronin krOn6n
+cronkite kroNkIt
+crook krqk
+crooked krqk6d
+crookedness krqk6dn6s
+crooks krqks
+crop krop
+cropped kropt
+crops krops
+crosbie krozb/
+crosby krozb/
+crosbyton krozb/t~
+crosbyton krozb6t~
+crosdale kr)sdAl
+cross kr{s
+crossbar kr{sb)r
+crossbeam kr{sbEm
+crossbills kr{sbilz
+crossbreed kr{sbrEd
+crosse kr{s
+crossed kr{st
+crossett kr{set
+crossing kr{s6N
+crossings kr{s6Nz
+crossly kr{sl/
+crossnore kr{sn{r
+crossroads kr{srOdz
+crosswalk kr{sw{k
+crosswhite kr{swIt
+croswell krOzwel
+crothersville krODPzvil
+crouch kr?C
+crouched kr?Ct
+crouton krUton
+crowbars krObPz
+crowd kr?d
+crowded kr?d6d
+crowden krOt6n
+crowder kr?dP
+crowding kr?d6N
+crowds kr?dz
+crowe krO
+crown kr?n
+crownlike kr?nlIk
+crownover kr?nOvP
+crows krOz
+croydon kr<d~
+crozat krOzat
+cruces krUs6z
+crucial krUSL
+crucially krUSL/
+crucified krUs6fId
+crude krUd
+crudely krUdl/
+cruea krUy@
+cruel krUL
+cruelest krU6l6st
+cruelties krULt/z
+cruelty krULt/
+cruger krUjP
+cruikshank krU6kSaNk
+cruise krUz
+cruised krUzd
+cruiser krUzP
+crumb krum
+crumbled krumbLd
+crumbs krumz
+crunch krunC
+crunched krunCt
+cruncher krunCP
+crunchers krunCPz
+crunkleton kruNk@lt6n
+crupper krupP
+crusader krUsAdP
+crushed kruSt
+crusher kruSP
+crushers kruSPz
+crust krust
+crutcher kruCP
+crutchfield kruCfEld
+crutsinger krutsiNP
+cruz krUz
+cry krI
+crybaby krIb@b/
+cryogenics krI@jen6ks
+crystal kristL
+crystalline krist@lEn
+csaszar sazP
+cuadra kw)dr@
+cuadrado kw)dr)dO
+cuadros kw)drOs
+cuban kyUb~
+cubans kyUb~z
+cubbyhole kub/hOl
+cubic kyUb6k
+cubist kyUb6st
+cubs kubz
+cuc kUk
+cucamonga kyUk@moNg@
+cucchiara kUkEy)r@
+cucco CUkO
+cucino kUCEnO
+cucumber kyUkumbP
+cuddling kudL6N
+cue kyU
+cuello kwAlO
+cuernaceva kw,rn@sev@
+cuernavaca kw,rn@vok@
+cuernavaca kwern@v)k@
+cuervo kwArvO
+cuesta kwest@
+cueva kwAv@
+cuevas kwAv@s
+cuff kuf
+cuffs kufs
+cuisine kw6zEn
+culbreath kulbreT
+culdesac kuld6sak
+culdesac kuld@sak
+cull kul
+cullman kulm~
+culloden k@lod~
+culloden kul@d~
+cullowhee kul@wE
+culminate kulm6nAt
+culmination kulm6nAS~
+culp kulp
+cultivated kult6vAd6d
+cults kults
+cultural kulCPL
+culture kulCP
+cultured kulCPd
+cultures kulCPz
+culver kulvP
+culverhouse kulvPh?s
+cumberland kumbPl~d
+cumby kumbE
+cummington kum6Nt~
+cummins kum~z
+cuney kyUn/
+cunha kyUn@
+cunningham kuniNham
+cuoco kwOkO
+cuomo kwOmO
+cup kup
+cupboard kubPd
+cupcakes kupkAks
+cupertino kUpPtEn]
+cupertino kyUpPtEn]
+cupful kupfL
+cupholder kuphOldP
+cupped kupt
+cupples kup@ls
+cups kups
+curator kyV6dP
+curb kVb
+curbside kVbsId
+curbstone kVbstOn
+cure kyUr
+cured kyUrd
+curfew kVfyU
+curfews kVfyUz
+curimao k@rEmIO
+curiosity kyUr/os6d/
+curious kyUr/@s
+curiously kyUr/@sl/
+curl kVl
+curles kPlz
+curls kVlz
+curran kV~
+currencies kV~s/z
+currency kV~s/
+current kV~t
+current kur~t
+currently kV~tl/
+curriculum kPiky6l}
+curriculums kPiky6l}z
+curry kV/
+cursor kVsP
+curt kVt
+curtain kVd~
+curtains kVd~z
+curtis kVd6s
+curvature kVv@CP
+curves kVvz
+curwensville kVw~zvil
+cushing kqSiN
+cushing kuS6N
+cushion kqS~
+cushioning kqS~6N
+cushions kqS~z
+cushman kqSm6n
+cusseta k6sed@
+cusseta k@set@
+custard kustPd
+customary kust@mer/
+customer kust}P
+customers kust}Pz
+customized kust@mIzd
+customs kust}z
+cut kut
+cutbacks kutbaks
+cuteness kyUtn6s
+cuthbert kuTbPt
+cuthill kuthil
+cutler kutlP
+cutlery kutlP/
+cutouts kud?ts
+cutright kutrIt
+cuts kuts
+cutsinger kutsiNP
+cutter kudP
+cutters kudPz
+cutthroat kutTrOt
+cutting kud6N
+cutty kud/
+cutworm kutwVm
+cyclical sikl6kL
+cycling sIkl6N
+cyclists sIkl6sts
+cyclotron sIkl@tron
+cygnet sign6t
+cygnus sign@s
+cylinder sil~dP
+cylindrical s6lindr6kL
+cynics sin6ks
+cynthia sinT/@
+cynthiana sinT/an@
+cynthiana sinT/on@
+cypher sIfP
+cyprus sIpr@s
+czar s)r
+czech Cek
+d d
+d dE
+dabbles dabLz
+dabney dabn/
+dace dAs
+dacono d@kOn]
+dacono dakOn]
+dacquel d)kel
+dacunha d@kyUn@
+dad dad
+dadeville dAdvil
+daffodil daf@dL
+daffodils daf@dLz
+dagel dAg@l
+dagenhart dAg6nh)rt
+dagger dagP
+daggers dagPz
+daggett dag6t
+dagostino dag@stEnO
+dagsboro dagzbP]
+dahlgren dolgr~
+daignault dagnO
+daigneault dAny)lt
+dailey dIl/
+daily dAl/
+dairy der/
+dairymen d,r/m~
+daisy dAz/
+dakar d@k)r
+dakar dak)r
+dakar dok)r
+dakota d@kOd@
+dakota's d@kOd@z
+dakotas d@kOd@z
+dales dAlz
+daleville dAlvil
+daley dAl/
+daley dAlE
+dalhouse dolh?s
+dalhousie dalh?s/
+dalia d)lE@
+dalila d@lIl@
+dallam dal}
+dallas dal6s
+dallastown dal6st?n
+dallavalle dal@valE
+dalles dalz
+dallesandro dal6sandrO
+dallesport dalzp{rt
+dalrymple dalrimp@l
+dalton d{lt~
+dalton's d{lt~z
+daltons d{lt~z
+daly dAl/
+dam dam
+damage dam6j
+damaged dam6jd
+damaris d@mAr6s
+damascus d@mask@s
+damewood dAmwqd
+damico d@mEkO
+damietta dam/et@
+damn dam
+damore d@m{rA
+damp damp
+dan dan
+dana dAn@
+dana don@
+danae d@nA
+danbury danbP/
+danbury danber/
+dance dans
+danced danst
+dancers dansPz
+dances dans6z
+dancing dans6N
+dandrade dandr)dE
+daneker dan6kP
+danforth danfPT
+dangelo dEanj@lO
+danger dAnjP
+dangerfield dAnjPfEld
+dangerous dAnj@r@s
+dangerously dAnj@r@sl/
+dangers dAnjPz
+dangled daNgLd
+dangleish daNgl6S
+dangles daNgLz
+danial dany@l
+daniel danyL
+daniell danyel
+daniella danyel@
+danielovich dany@lOviC
+daniels dany@lz
+danielsen dany6ls6n
+danielson danyLs~
+daniely dany@lE
+dann dan
+dannemora dan6m{r@
+dannielle danyel
+danny dan/
+dansville danzvil
+dante dontA
+danube danyUb
+danvers danvPz
+danziger danz6gP
+daphne dafnE
+daphne's dafn/z
+daphnes dafn/z
+daquino d@kEnO
+darby d)rb/
+darcangelo d)rkanjelO
+dardanelle d)rd@nel
+dardenne d)rden
+dare d,r
+dared dard
+daredevil d,rdevL
+daredevils d,rdevLz
+darell dAr@l
+darien d,r/~
+darien dar/en
+darien dar/~
+dark d)rk
+darkened d)rk~d
+darker d)rkP
+darkness d)rkn6s
+darkroom d)rkrUm
+darline d)rlEn
+darmstadt d)rmSt)t
+darmstadt d)rmstat
+darned d)rnd
+darnstaedt d)rnstad
+darragh dAr{
+darrell dAr@l
+darren dar~
+darrouzett darUzet
+darryl darL
+dart d)rt
+darting d)rtiN
+dartmoors d)rtmUrz
+darwin d)rwin
+daryl dar6l
+daryl darL
+daschofsky dasC)fskE
+dash daS
+dashboard daSb{rd
+dashboards daSb{rdz
+dasouza dasUz@
+data dAd@
+date dAt
+dates dAts
+daughenbaugh d{6nb{
+daugherty d{PtE
+daughety d)@tE
+daughrity d{PtE
+daughter d{dP
+daughters d{dPz
+daunt d{nt
+dauntlessly d{ntl6sl/
+dave dAv
+davenport dav~p{rt
+davenport's dav~p{rts
+davenports dav~p{rts
+davey dAv/
+davi dAvE
+david d)vEd
+david dAv6d
+davidsmeyer dAvidzmIP
+davidson dAv6ds~
+davie dAv/
+davies dAv/z
+davine davIn
+davis dAv6s
+davisboro dAv6sbV]
+davise davEz
+davison dAv6s6n
+davisson dAvis@n
+davisville dAv6svil
+davy dAv/
+dawe d{
+dawes d{z
+dawn d{n
+dawning d{n6N
+dawson d{s~
+dawson's d{s~z
+dawsons d{s~z
+dawsonville d{~vil
+day dA
+daybreak dAbrAk
+daydreamed dAdrEmd
+daylight dAlIt
+daylights dAlIts
+days dAz
+daytime dAtIm
+daytimes dAtImz
+dayton dAd~
+dayton dAt~
+dayton's dAd~z
+daytons dAd~z
+dazzle dazL
+dazzled dazLd
+de d@
+deacon dEk~
+deactivate dEakt6vAt
+deactivated dEakt6vAd6d
+dead ded
+deadening ded~6N
+deadline dedlIn
+deadlocked dedlokt
+deadpan dedpan
+deadwood dedwqd
+deaf def
+deafness defn6s
+deaguiar dEagU)r
+deal dEl
+dealer dElP
+dealers dElPz
+dealership dElPSip
+dealerships dElPSips
+dealing dEl6N
+dealmakers dElmAkPz
+deals dElz
+dean dEn
+deana dEn@
+deanda dEand@
+deandra dEandr@
+deandrade dEandr)dE
+deandre dE)ndrA
+deandrea dEandrE@
+deang dEaN
+deangeles dEanj@l6s
+deangelis dEanj@l6s
+deangelo dEanj6lO
+deangelus dEanj@l@s
+deann dEan
+deanna dEan@
+deans dEnz
+deansboro dEnzbP]
+deansboro dEnzbV]
+dear dEr
+dearborn dErb{rn
+dearly dErl/
+dearment dErm~t
+death deT
+deathbed deTbed
+deathblow dETbl]
+deathly deTl/
+deathstrap deTstrap
+deathtrap deTtrap
+deathwatch deTwoC
+deauville dOvil
+deauville d]vEl
+deb deb
+debaets d@bAtz
+debardelaben deb)rdlAb@n
+debate d6bAt
+debated d6bAd6d
+debates d6bAts
+debating d6bAd6N
+debbie deb/
+debby deb/
+debera debP@
+debi debE
+deborah debP@
+deborah debr@
+deborde d6b{rd
+debore d@bOr
+debose debOs
+debra debr@
+debrae d@brA
+debrecen debr@tsen
+debris d@brE
+debruyn d6brU6n
+debt det
+debtholders dethOldPz
+debts dets
+debut dAbyU
+debutiaco d@byUtE)kO
+decade dekAd
+decade's dekAdz
+decadently dek@d~tl/
+decades dekAdz
+decamp dEkamp
+decathlon d6kaTlon
+decatur d6kAdP
+decay d6kA
+decayed d6kAd
+decaying d6kA6N
+decays d6kAz
+dececco d@CekO
+deceitful d6sEtfL
+deceiving d6sEv6N
+decelles d6selz
+december d6sembP
+decent dEs~t
+decentralization dEsentrL6zAS~
+deceptively d6sept6vl/
+decerbo d6sVb]
+dechert deCPt
+decide d6sId
+decided d6sId6d
+decides d6sIdz
+decimals des6mLz
+decimated des6mAd6d
+decision d6siZ~
+decisions d6siZ~z
+decisive d6sIs6v
+deck dek
+decker dekP
+declarations dekl@rAS~z
+declared d6klard
+declassification dEklas6f6kAS~
+decline d6klIn
+declined d6klInd
+declines d6klInz
+declining d6klIn6N
+decomposer dEk}pOzP
+decomposition dEkomp@ziS~
+decompress dEk}pres
+decompression dEk}preS~
+decongestants dEk~jest~ts
+decontrolled dEk~trOld
+decorate dek@rAt
+decorated dek@rAd6d
+decorative dek@r@d6v
+decoratively dek@r@d6vl/
+decorator dek@rAdP
+decoy dEk<
+decrease d/krEs
+decrease dEkrEs
+dede dEdE
+dederich ded@rik
+dedham ded}
+dedicate ded6kAt
+dedicated ded6kAd6d
+dedios d6dEOs
+deduct d6dukt
+deductible d6dukt@bl
+deduction d6dukS~
+dee dE
+deed dEd
+deejay dEjA
+deep dEp
+deepak dEpak
+deepened dEp~d
+deepens dEp~z
+deeper dEpP
+deeply dEpl/
+deepwater dEpw{dP
+deepwater dEpw{tP
+deer dEr
+deere dEr
+deerfield dErfEld
+deerman dErm~
+deerpark dErp)rk
+deerskin dErskin
+dees dEz
+defamation def@mAS~
+default d6f{lt
+default dEf{lt
+defayette defIyet
+defeat d6fEt
+defective d6fekt6v
+defects dEfekts
+defelice defelEs
+defend d6fend
+defense d6fens
+defensive d6fens6v
+deferring d6fV6N
+defiance d6fI~s
+defiantly d6fI~tl/
+deficits def6s6ts
+define d6fIn
+defined d6fInd
+definite def~6t
+definitely def~6tl/
+definition def6niS~
+definitive d6fin6d6v
+defiore defE{rA
+deflects d6flekts
+deforest d6f{r6st
+defreece d6frEs
+defreese d@frEs
+defrost d/fr{st
+defroster d/fr{stP
+defuniak d6fyUn/ak
+defuniak defy6nyak
+degaetano d6dZ@t)nO
+degasparre d@gasp)r
+degear d@gEr
+degele dej6lE
+degenhart deg@nh)rt
+degeorge d6j{rj
+degeston degest@n
+degeyter d@gAtP
+degiorgio d@j{rjEO
+degradation degr@dAS~
+degrand d6grand
+degrave d@grAv
+degree d6grE
+degrees d6grEz
+dehaas d@h)z
+dehaven dehAv6n
+dehetre d@hetP
+dehumidify dEhyUmid6fI
+dehydrate dEhIdrAt
+deichman dIkm@n
+deichmann dIkm@n
+deignan dEn@n
+deitrich dEtr6k
+dejaeger d@jAgP
+dejean d@jEn
+dejesus dAhAsUs
+dejonge d6y{N
+del del
+del_norte dcln{rt
+del_norte dcln{rtA
+delabarre d@lab)r
+delacruz d@lakrUz
+delacuesta del@kwest@
+delacueva del@kwAv@
+delafield del@fiLd
+delafuente del@fwentA
+delagrange d@l@gr)nZ
+delair delAr
+delaney d@lAnE
+delano d6lon]
+delapaz del@p)z
+delapena d6l@pEn@
+delaporte d@lapOrt
+delapuente d@lapwentA
+delashmutt del@Smut
+delatorre del@t{rA
+delauder d6l{tP
+delaughter d@laftP
+delavergne d@lavern
+delaware del@w,r
+delaware del@wAr
+delay d6lA
+delayed d6lAd
+delcastillo delk@stEyO
+delcour delkUr
+delectable d6lekt@bL
+delectables d6lekt@bLz
+delegated del6gAd6d
+deleston delst@n
+delete d/lEt
+deleted d6lEd6d
+delford delfPd
+delft delft
+delgadillo delg@dilO
+delhi del/
+delicate del6k6t
+delicately del6k6tl/
+delicatessen del6k@tes~
+delicious d6liS@s
+delight d6lIt
+delighted d6lId6d
+delightful d6lItfL
+delinquencies d6liNkw~s/z
+delinquency d6liNkw~s/
+delirious d6lEr/@s
+deliriously d6lEr/@sl/
+delisle d@lIl
+deliver d6livP
+delivered d6livPd
+deliverer d6livPP
+deliveries d6livP/z
+delivering d6livP6N
+delivery d6livP/
+dell del
+della del@
+dellacioppa del@C)p@
+dellaratta del@rat@
+dellarose del@rOz
+dellavalle del@valE
+dellefave delefav
+dellroy delr<
+delmar delmP
+delmas delm@z
+delmont delmont
+delores delPz
+delorey d6l{rE
+delorge delOrj
+delorme d@l{rmA
+delorse d@l{rs
+delosreyes d6lOsrA6z
+delossantos d6l@santOs
+deloye d@l<
+delprincipe delprins6pA
+delray delrA
+delrosario delrOs)rEO
+delsignore delsiny{r
+delta delt@
+delucca d6lUk@
+delusion d6lUZ~
+delvalle delvIyA
+delvecchio delvekEO
+demand d6mand
+demanded d6mand6d
+demands d6mandz
+demange d@m)nZ
+demarest demP6st
+demetriou d@mEtrEU
+demichele d@mESel
+demille d6mil
+demineralization dEminrL6zAS~
+deming dEm6N
+demo dem]
+democracy d6mokr@s/
+demolition dem@liS~
+demonstrate dem~strAt
+demonstrates dem~strAts
+demonstration dem~strAS~
+demonstrations dem~strAS~z
+demonstrative d6monstr@d6v
+demonstratively d6monstr@d6vl/
+demopolis d6mopL6s
+demopolis dcmop@l6s
+demorest demPest
+demorizi demOrEtzE
+demorrett demOret
+demoss d@m)s
+dempewolf dempwqlf
+denae d@nA
+deneise den/6s
+denes denes
+deneui denUE
+denied d6nId
+denise d6nEs
+denman denm~
+denmark denm)rk
+denmark denm)rk
+denmark's denm)rks
+denmarks denm)rks
+denney den/
+dennies denEz
+dennis den6s
+dennise d@nEs
+dennison den6s~
+denny den/
+denominations d6nom6nAS~z
+denoyer d@n<yP
+dense dens
+densely densl/
+density dens6d/
+denson dens~
+dent dent
+dental dentL
+dentist dent6st
+dentists dent6sts
+dentler dentlP
+dentmer dentmP
+denton dent~
+denunciation d6nuns/AS~
+denver denvP
+deny d6nI
+denying d6nI6N
+denyse d@nEs
+deodorant dEOd@r~t
+deodorize dEOdPIz
+depadua d@pajU@
+depalma d6p{lm@
+depaola d6p?l@
+depaoli d@p?lE
+departing d6p)rd6N
+department d6p)rtm~t
+departments d6p)rtm~ts
+departure d6p)rCP
+departures d6p)rCPz
+depend d6pend
+dependant d6pend~t
+depending d6pend6N
+depends d6pendz
+depew depyU
+depeyster d@pAstP
+depicted d6pikt6d
+depicts d6pikts
+depletion d6plES~
+deploy d6pl<
+deployed d6pl<d
+deportations dEp{rtAS~z
+depositing d6poz6d6N
+deposition dep@ziS~
+depot dEp]
+depreciable d6prES@bL
+depreciation d6prES/AS~
+depression d6preS~
+depriest d6prEst
+deprivation depr6vAS~
+deprive d6prIv
+depth depT
+depths depTs
+depugh depyU
+deputy depy6d/
+derby dVb/
+derbyshire d)rb6SP
+derched dVCt
+deregulated dEregy6lAd6d
+derek dar6k
+derek der6k
+derelict dar6l6kt
+dereliction dar6likS~
+derienzo derEenzO
+dering dV6N
+derivative d6riv@d6v
+derived d6rIvd
+deriving d6rIv6N
+dermatology dVm@tol@j/
+dermott dVm6t
+dermott dVm@t
+derose d@rOz
+derosie derOzE
+derrickson dar6ks~
+derryberry dArEbArE
+deruiter derUitP
+des dA
+des_moines d@m<n
+desalvatore d@salv@tOrA
+desantiago d6santEagO
+descendant d6send~t
+describe d6skrIb
+described d6skrIbd
+description d6skripS~
+descriptions d6skripS~z
+desegregation dEsegr6gAS~
+deselect dez6lekt
+deseri d6zer/
+desert dezPt
+deserted d6zVd6d
+deserting d6zVd6N
+deserve d6zVv
+deserved d6zVvd
+deserves d6zVvz
+deshawn d@S)n
+deshotel deshOtel
+deshotels deshOtelz
+design d6zIn
+designated dez6gnAd6d
+designation dez6gnAS~
+designations dez6gnAS~z
+designed d6zInd
+designer d6zInP
+designers d6zInPz
+designing d6zIn6N
+designs d6zInz
+desimone dAs@mOn
+desirable d6zIr@bL
+desirae dez@rA
+desire d6zIr
+desiree dezPA
+desires d6zIrz
+desjardins dAZ)rdan
+desk desk
+deskbound deskb?nd
+deskjet deskjet
+desks desks
+desktop desktop
+desloge dAlOj
+desolate desL6t
+desolation des@lAS~
+desoto d6zOd]
+desouza d6sUs@
+despair d6sp,r
+despairing d6sp,r6N
+desperate despr6t
+desperately despr6tl/
+desperation desp@rAS~
+despised d6spIzd
+despite d6spIt
+desroberts dAr)bPts
+desrochers dArOSA
+desrosiers dArOA
+desruisseaux dArUsO
+dessert d6zVt
+desserts d6zVts
+destefano d@stef@nO
+destin dest~
+destination dest~AS~
+destinational dest6nAS~L
+destinations dest~AS~z
+destiny dest~/
+destrehan destr6h~
+destrehan destr@hon
+destroy d6str<
+destroyed d6str<d
+destroyer d6str<P
+destroying d6str<6N
+destruction d6strukS~
+desvergnes desvPny@s
+detaeye det@I
+detail d6tAl
+detail dEtAl
+detailed d6tAld
+details d6tAlz
+details dEtAlz
+detection d6tekS~
+detective d6tekt6v
+detectives d6tekt6vz
+detector d6tektP
+determination d6tVm6nAS~
+determine d6tVm~
+determined d6tVm~d
+determining d6tVm~6N
+dethomas d@t{m@s
+dethomasis d@tOmasis
+detienne detyen
+detour dEtqr
+detract d6trakt
+detrich detrik
+detroit d/tr<t
+detroit d6tr<t
+dettorre detOrA
+detwiler detwIlP
+deutsch d<C
+deutschman d<Cm6n
+devall d6val
+devastation dev@stAS~
+devaughn d@v{n
+devault d6v{lt
+devaux d@vO
+develop d6vel@p
+developed d6vel@pt
+developing d6vel@p6N
+development d6vel@pm~t
+develops d6vel@ps
+deviant dEv/~t
+deviated dEv/Ad6d
+deviation dEv/AS~
+device d6vIs
+devices d6vIs6z
+devils devLz
+devilwood devLwqd
+devine d@vIn
+devise d6vIz
+devised d6vIzd
+devita d6vEd@
+devivo d6vEvO
+devlin devl6n
+devoe d@vO
+devoid d6v<d
+devore d@v{r
+devoted d6vOd6d
+devour d6v?P
+devries d@vrEz
+devries devr/z
+dew dU
+dewaele d@wAl
+dewater d@w)tP
+dewayne d6wAn
+deweese d@wEs
+deweyville dUw/vil
+dewilde d@wIld
+dewitt dUwit
+dewittville d@witvil
+dewittville dUitvil
+dewy dU/
+dexter dekstP
+dexterity dekstar6d/
+dey dA
+deyoung d@yuN
+dh D
+dharas d)r@z
+dhillon dil@n
+diagnose dI6gnOs
+diagnosed dI6gnOst
+diagnosis dI6gnOs6s
+diagnostics dI@gnost6ks
+diagonally dIag~6l/
+diagram dI@gram
+dial dIL
+dialed dILd
+dialing dIL6N
+dialogue dI@l{g
+dialogues dI@l{gz
+dials dILz
+diametrical dI@metr6kL
+diametrically dI@metr6kl/
+diamond dIm~d
+diamondback dIm~dbak
+diamonds dIm~dz
+diamondville dIm~dvil
+diana dIan@
+diane dIan
+diane's dIanz
+dianes dIanz
+dianne dIan
+diapering dIpP6N
+diaphragm dI@fram
+diaries dI@r/z
+diarrhea dI@rE@
+diary dI@r/
+dias dE@s
+diaz dEaz
+dibble dibL
+dibbles dib@lz
+diberardino d6bAr)rdEnO
+diblase diblAs
+dibs dibz
+dice dIs
+dicecco d6CekO
+dicesare dEsez)r
+dicharry dik@rE
+dichiara dEkE)r@
+dickes diks
+dickins dik~z
+dickinson dik~s~
+dickson diks~
+dictate diktAt
+dictating diktAd6N
+dictation diktAS~
+dictator diktAdP
+dictators diktAdPz
+dictatorship diktAdPSip
+dictionary dikS@ner/
+did did
+didn't did~t
+didnt did~t
+didonatis did@natis
+die dI
+dieball dIb)l
+died dId
+diederichs dEt@riks
+diego d/Ag]
+diehards dI6hPdz
+dies dIz
+diestler dEstlP
+diet dI6t
+dieterich dEd@r6C
+dietrich dEtr6k
+diets dI6ts
+difede d@fEd@
+differ difP
+difference difr~s
+different difr~t
+differential dif@renSL
+differentiate dif@renC/At
+differently difr~tl/
+differing difP6N
+differs difPz
+difficult dif6kLt
+difficulty dif6kult/
+diffuser d6fyUzP
+diffusions d6fyUZ~z
+difiore dEfE{rA
+dig dig
+digaetano dEj@t)nO
+digangi diganjE
+digeorgio d6jOrjEO
+digestion d6jesC~
+digging dig6N
+dighton dId~
+digiacomo didZ)k@mO
+digiovanni dE@v)nE
+digital dij6dL
+digitally dij6d6l/
+digits dij6ts
+digiuseppe d6jyUsepE
+dignity dign6d/
+digrande d6gr)ndA
+dike dIk
+dilate dIlAt
+dilemmas d6lem@z
+diligence dil6j~s
+diligently dil6j~tl/
+dill dil
+dilliner dil6nP
+dilliner dilInP
+dillingham diliNham
+dillsboro dilzbP]
+dillsboro dilzbV]
+dillwyn dilw~
+dilly dil/
+dilute d6lUt
+diluted d6lUd6d
+dim dim
+dimaggio d6maj/]
+dimas dEm6s
+dime dIm
+dimensional d6menS~L
+dimensionality d6menS@nal6d/
+dimensionally d6menS~L/
+dimensions d6menS~z
+dimery dimPE
+dimes dImz
+diminish d6min6S
+diminishing d6min6S6N
+dimitri d6mEtrE
+dimitry dimEtrE
+dimly diml/
+dimock dimok
+dimona d6mOn@
+dimsdale dimzdAl
+din din
+dinah dIn@
+dine dIn
+dinehart dInh)rt
+dinette d6net
+dingell diNg@l
+dinger diNP
+dinges dinj6s
+dingham diN}
+dinghy diN/
+dingo diNg]
+dingy dinj/
+dining dIn6N
+dinizio d6nEtsEO
+dinkins diNk~z
+dinner dinP
+dinnertime dinPtIm
+dinnerware dinPw,r
+dinsdale dinzdAl
+dinuba d6nUb@
+dinuzzo d6nUtzO
+dion dE)n
+dione dE)n
+dioxides dIoksIdz
+dioxins d/oks~z
+dip dip
+dipaola d@p?l@
+dipasquale d6paskw)lA
+diploma d6plOm@
+diplomatic dipl@mad6k
+diplomatically dipl@mad6kl/
+diplomats dipl@mats
+dipped dipt
+dipper dipP
+dire dIr
+direct d6rekt
+directing d6rekt6N
+direction d6rekS~
+directions d6rekS~z
+directly d6rektl/
+director d6rektP
+director's d6rektPz
+directors d6rektPz
+directory d6rektP/
+directory d6rektr/
+directory dIrektP/
+dirk dVk
+dirt dVt
+dirty dVd/
+disabling disAbl6N
+disallow dis@l?
+disallowed dis@l?d
+disappear dis@pEr
+disappearance dis@pEr~s
+disappeared dis@pErd
+disappearing dis@pEr6N
+disappointed dis@p<nt6d
+disappointing dis@p<nt6N
+disappointment dis@p<ntm~t
+disappointments dis@p<ntm~ts
+disapproval dis@prUvL
+disarmament d6s)rm@m~t
+disarray dis@rA
+disaster d6zastP
+disastrously d6zastr@sl/
+disavow dis@v?
+disbanding disband6N
+disbarred d6sb)rd
+disbelief disb6lEf
+disbelieve disb6lEv
+disbursed d6sbVst
+disc disk
+discard d6sk)rd
+discard disk)rd
+discernible d6sVn@bl
+discharged disC)rjd
+discharges disCorj6z
+discipline dis6plin
+disciplined dis6plind
+disciplines dis6plinz
+disclaim disklAm
+disclaimer disklAmP
+disclose d6sklOz
+disclosing d6sklOz6N
+disclosure d6sklOZP
+disclosures d6sklOZPz
+disco disk]
+discoloration diskul@rAS~
+discordant d6sk{rd~t
+discount disk?nt
+discounting d6sk?nt6N
+discourage d6skV6j
+discouraged d6skV6jd
+discouragement d6skV6jm~t
+discouraging d6skV6j6N
+discovered d6skuvPd
+discoverer d6skuvPP
+discoveries d6skuvP/z
+discovering d6skuvP6N
+discovery d6skuvP/
+discreditness diskred6tn6s
+discreetly d6skrEtl/
+discrete d6skrEt
+discreteness d6skrEtn6s
+discretionary d6skreS@ner/
+discrimination d6skrim6nAS~
+discs disks
+discuss d6skus
+discussed d6skust
+discussing d6skus6N
+discussion d6skuS~
+discussions d6skuS~z
+disease d6zEz
+disease's d6zEz6z
+diseased d6zEzd
+diseases d6zEz6z
+disenchanted dis~Cant6d
+disengage dis6NgAj
+disfavor disf@vP
+disfiguration disfigy@rAS~
+disfigured disfigyPd
+disfiguring disfigyP6N
+disgraceful d6sgrAsfL
+disgruntled d6sgruntLd
+disguise disgIz
+disguises disgIz6z
+disgust d6sgust
+disgusted d6sgust6d
+disgusts d6sgusts
+dish diS
+disharmony dish)rm~/
+dishcloth diSkl{T
+disheartened d6sh)rd~d
+dishes diS6z
+dishevel d6SevL
+disheveled d6SevLd
+dishful diSfL
+dishing diS6N
+dishonestly dison6stl/
+dishonesty dison6st/
+dishpan diSpan
+dishrag diSrag
+dishtowel diSt?L
+dishwasher diSwoSP
+dishwashers diSwoSPz
+dishwater diSw{dP
+disillusionment dis6lUZ~m~t
+disinfectant dis~fekt~t
+disinfectants dis~fekt~ts
+disinfects dis~fekts
+disinherit dis~har6t
+disjointed disj<nt6d
+disk disk
+disks disks
+dislike dislIk
+disliked dislIkt
+dislikes dislIks
+dislodge disloj
+disloyalty disl<Lt/
+dismay d6smA
+dismayed d6smAd
+dismaying d6smA6N
+dismember dismembP
+disney dizn/
+disneyland dizn/land
+disobedient dis]bEd/~t
+disobeyed dis]bAd
+disorder dis{rdP
+disorganization dis{rg~6zAS~
+disorganize dis{rg@nIz
+disoriented dis{r/ent6d
+disotell dIz@tel
+disown disOn
+dispel d6spel
+dispensation disp~sAS~
+dispense d6spens
+dispensing d6spens6N
+dispersed d6spVst
+displacements displAsm~ts
+display d6splA
+displayed d6splAd
+displays d6splAz
+displeased displEzd
+displeasure displeZP
+disposal d6spOzL
+disproportionate dispr@p{rS~6t
+disproportionately dispr@p{rS~6tl/
+disprove disprUv
+dispute d6spyUt
+disputes d6spyUts
+disqualifying d6skw{l6fI6N
+disquieting diskwI6d6N
+disregarding disr6g)rd6N
+disrepair disr6p,r
+disreputable disrepy6d@bL
+disrepute disr6pyUt
+disrespectful disr6spektfL
+disruptive disrupt6v
+disruptively disrupt6vl/
+dissatisfaction d6sad6sfakS~
+dissatisfied d6sad6sfId
+dissatisfy d6sad6sfI
+dissertation disPtAS~
+dissertations disPtAS~z
+disservice dissVv6s
+dissimilar d6sim6lP
+dissimilarity d6sim6lar6d/
+dissolve d6zolv
+dissolves d6zolvz
+dissolving d6zolv6N
+dissuasion d6swAZ~
+dissuasive d6swAs6v
+distance dist~s
+distances dist~s6z
+distant dist~t
+distaste distAst
+distefano distef@nO
+distilled d6stild
+distinct d6stiNkt
+distinction d6stiNkS~
+distinctive d6stiNkt6v
+distinctly d6stiNktl/
+distinguish d6stiNgw6S
+distinguished d6stiNgw6St
+distinguishing d6stiNgw6S6N
+distler dislP
+distorted d6st{rd6d
+distortion d6st{rS~
+distorts d6st{rts
+distract d6strakt
+distraught d6str{t
+distress d6stres
+distributed d6stribyUd6d
+distributes d6stribyUts
+district distr6kt
+district_of_columbia dEsE
+district_of_columbia distr6kt@vk@lumb/@
+districts distr6kts
+disturb d6stVb
+disturbed d6stVbd
+disturbing d6stVb6N
+disunity disyUn6d/
+ditch diC
+ditchdigger diCd6gP
+ditchwater diCw{dP
+dithering diDP6N
+ditore ditOrA
+ditto did]
+dive dIv
+dived dIvd
+diveley dIvlE
+dively dIvlE
+diver dIvP
+diverging dIvVj6N
+divernon dIvPnon
+divernon divPn~
+diversity d6vVs6d/
+divert d6vVt
+divide d6vId
+divided d6vId6d
+dividend div6d~d
+dividends div6d~dz
+dividing d6vId6N
+divination div6nAS~
+divine d6vIn
+divinely d6vInl/
+diving dIv6N
+divining d6vIn6N
+divinities d6vin6d/z
+divinity d6vin6d/
+divirgilio divPjilEO
+division d6viZ~
+divisions d6viZ~z
+divorce d6v{rs
+divorced d6v{rst
+divorcee d6v{rsE
+divorces d6v{rs6z
+divorcing d6v{rs6N
+dix diks
+dixhills dikshilz
+dixie diks/
+dixieland diks/land
+dixmoor diksmUr
+dixon diks~
+dizziness diz/n6s
+dj dEjA
+do d@
+do dO
+do dU
+dobbins dob~z
+dobbs dobz
+dobies dObEz
+dobroth dObr}T
+dobson dobs~
+docked dokt
+dockson doks~
+dockyard doky)rd
+doctor doktP
+doctoral dokt{rL
+doctors doktPz
+doctrine doktr~
+document doky@ment
+document doky@m~t
+documentary doky@mentP/
+documentary doky@mentr/
+documentation doky6m~tAS~
+documented doky6ment6d
+documents doky6m~ts
+dodd dod
+dodds d)dz
+dodge doj
+dodged dojd
+dodgeville dojvil
+dodging doj6N
+dodimead dOd@mEd
+dodson dods~
+doe dO
+doede dOdE
+does duz
+doesn't duz~t
+doesnt duz~t
+dog d{g
+dogberry d{gber/
+dogcatcher d{gkaCP
+doge dOj
+dogfights d{gfIts
+dogfish d{gfiS
+doggedly d{g6dl/
+doggie d{g/
+doggies d{g/z
+doghouse d{gh?s
+doglike d{glIk
+dogmatic d{gmad6k
+dogmatically d{gmad6kl/
+dogs d{gz
+dogwood d{gwqd
+doherty dOPtE
+doig d<g
+doily d<l/
+doing dU6N
+dokuchitz d)kUSits
+dolby dOlb/
+dolce dOlCA
+dole dOl
+dolecek dOlCek
+doles dOlz
+dolgeville d{lg@vil
+doll d{l
+dollar dolP
+dollars dolPz
+dollhouse d{lh?s
+dolly dol/
+dolores d@l{r6s
+dolphin d{lf~
+dolphins d{lf~z
+dolton dOlt~
+dome dOm
+domed dOmd
+domenech d)m6nek
+domenic d)m6nik
+domestication d@mest6kAS~
+dominance dom~~s
+dominant dom~~t
+dominate dom6nAt
+dominated dom6nAd6d
+dominges d@miNg6s
+domingez d@miNg@z
+domingue d@miNgA
+dominici d)m6nECE
+dominion d@miny~
+domino dom6nO
+dominos dom6nOz
+don don
+don$$$'t dOnt
+don$$$t dOnt
+don$$'t dOnt
+don$$t dOnt
+don$'t dOnt
+don$t dOnt
+don't dOnt
+don'ts donts
+donaghe d)n@hE
+donaghey d)n@hE
+donaghue d)n@hyU
+donaghy d)n@hE
+donahue don@hyU
+donald donLd
+donaldson d)n@lds@n
+donaldson's donLds~z
+donaldsons donLds~z
+donate dOnAt
+donated dOnAd6d
+donations d]nAS~z
+done dun
+doneker don6k/P
+donelson d)n@ls@n
+dongola doNgOl@
+donkeys doNk/z
+donna don@
+donndelinger d)nd6liNgP
+donned dond
+donnellson donLs~
+donnelsville donLzvil
+donnybrook don/brqk
+donoghue d)n@ghyU
+donohoe d)n@hO
+donohue d)n@hyU
+donora d@n{r@
+donora don@r@
+donovan don@v~
+donovan's don@v~z
+donovans don@v~z
+dont dOnt
+donts donts
+doobly dUbl/
+doolittle dUl6dL
+dooly dUl/
+doomed dUmd
+doomsday dUmzdA
+doon dUn
+door d{r
+doorjam d{rjam
+doorjamb d{rjam
+doorknob d{rnob
+doors d{rz
+doorstep d{rstep
+doorways d{rwAz
+doped dOpt
+doppler doplP
+dorchester d{rCestP
+dore d{r
+doreen d{rEn
+dorena d6rEn@
+dorena d{rEn@
+doretha d@rET@
+dorfman d{rfm~
+dorland d{rland
+dorman d{rm~
+dormitories d{rm6t{r/z
+dorothea d{r@TE@
+dorothy dor@T/
+dorothy d{r@T/
+dorr d{r
+dorrance d{r~s
+dorrell d{r@l
+dorries d{rEz
+dorwin d{rwin
+dosages dOs6j6z
+doses dOs6z
+dot dot
+dothan dOT~
+dots dots
+dotson dots~
+doty dOd/
+double dubL
+doubled dubLd
+doubleday dubLdA
+doubles dubLz
+doubletree dubLtrE
+doubt d?t
+doubtful d?tfL
+doubtless d?tl6s
+doubts d?ts
+doug dug
+dougal dUg@l
+dougan dUg@n
+dough dO
+doughan dUg@n
+doughboy dOb<
+doughnut dOnut
+doughty d?t/
+douglas dugl6s
+douglass dugl6s
+douglasville dugl6svil
+doulton dOlt~
+doused d?st
+douthett d?Tet
+douyette dUyet
+dove dOv
+dove duv
+dovelike dOvlIk
+dover dOvP
+doverspike dOvPspIk
+doves duvz
+dovetailed dOvtAld
+dovie duvE
+dow d?
+dow's d?z
+dowell d?L
+dowker d?kP
+down d?n
+downcast d?nkast
+downer d?nP
+downey d?n/
+downey's d?n/z
+downeys d?n/z
+downfall d?nf{l
+downgrading d?ngrAd6N
+downheartedly d?nh)rd6dl/
+downhour d?n?P
+downingtown d?niNt?n
+downloading d?nlOd6N
+downplay d?nplA
+downplaying d?nplA6N
+downpour d?np{r
+downstairs d?nst,rz
+downsview d?nzvyU
+downtown d?nt?n
+downtrodden d?ntrod~
+downturn d?ntVn
+downturns d?ntVnz
+downward d?nwPd
+downwards d?nwPdz
+dows d?z
+doylestown d<lzt?n
+dozen duz~
+dozier dOz/P
+dr doktP
+draft draft
+draftsmen draftsm~
+drag drag
+draggoo dragU
+dragich dragiC
+dragnets dragn6ts
+dragon drag~
+dragonfly drag~flI
+dragonhead drag~hed
+dragoon dragUn
+dragster dragstP
+drain drAn
+drained drAnd
+drakeford drAkfPd
+drakes drAks
+drakesboro drAksbV]
+drakesville drAksvil
+drama dr)m@
+drama dram@
+dramatic dr@mad6k
+dramatically dr@mad6kl/
+drank draNk
+draper drApP
+draperies drApP/z
+drapes drAps
+drastically drast6kl/
+draughn dr{n
+draves drAvz
+dravosburg drAv]sbVg
+draw dr{
+drawbacks dr{baks
+drawdown dr{d?n
+drawdowns dr{d?nz
+drawe dr{
+drawer dr{r
+drawers dr{rz
+drawing dr{6N
+drawings dr{6Nz
+drawl dr{l
+drawn dr{n
+drda dPt@
+dreadful dredfL
+dreadlocks dredloks
+dream drEm
+dreamers drEmPz
+dreams drEmz
+dreamworld drEmwVld
+dreary drEr/
+drechsler drekslP
+drenched drenCt
+drenching drenC6N
+dresden drezd~
+dress dres
+dressed drest
+dresser dresP
+dresses dres6z
+dressier dres/P
+dressing dres6N
+dressmaker dresmAkP
+dressy dres/
+drew drU
+drewes drUz
+drexler drekslP
+dreyer drIP
+drg dE)rjE
+dried drId
+drier drIP
+drift drift
+drifting drift6N
+drifts drifts
+driftwood driftwqd
+drilled drild
+drills drilz
+drink driNk
+drinks driNks
+drinkwater driNkw{dP
+drip drip
+dripped dript
+drive drIv
+driven driv~
+driver drIvP
+drivers drIvPz
+drives drIvz
+driveway drIvwA
+driving drIv6N
+drizzle drizL
+drizzling drizl6N
+droned drOnd
+drool drUl
+droop drUp
+drooping drUp6N
+droopy drUp/
+drop drop
+dropouts drop?ts
+dropped dropt
+dropping drop6N
+drops drops
+drosick drOsik
+drought dr?t
+droughts dr?ts
+drove drOv
+drover drOvP
+drown dr?n
+drowned dr?nd
+drowning dr?n6N
+drownings dr?n6Nz
+drug drug
+drug's drugz
+drugs drugz
+drugstore drugst{r
+druid drU6d
+drumbeat drumbEt
+drumhead drumhed
+drummer drumP
+drummers drumPz
+drummond drum~d
+drums drumz
+drunk druNk
+drunkard druNkPd
+drunkards druNkPdz
+drunkenness druNk~n6s
+dry drI
+drybranch drIbranC
+drye drI
+dryers drIPz
+dryfork drIf{rk
+drying drI6N
+dryly drIl/
+drypoint drIp<nt
+drysdale drIzdAl
+ds dEes
+dsp dEespE
+dtmf dEtEemef
+du dU
+dual dUL
+dualistic dU@list6k
+duality dUal6d/
+duane dwAn
+duarte dUPt
+dubach dUb6C
+dubach dUbak
+dubberly dubPl/
+dubious dUb/@s
+dublin dubl6n
+dublin dubl~
+dubois dUbwo
+dubose dUbOs
+dubuque d@byUk
+dubuque dUbyUk
+ducci dUkE
+duchaine dUSAn
+duchane dUSAn
+ducharme dUS)rm
+duchesne duCeznE
+duchesneau dUS@nO
+duchess duC6s
+duck duk
+ducking duk6N
+ducklings dukl6Nz
+ducks duks
+ducksworth dukswVT
+ducktown dukt?n
+duckwall dukw{l
+duckworth dukwVT
+ducrohet dUkrOhA
+ductless duktl6s
+ductwork duktwVk
+dud dud
+dude dUd
+dudenbostel dUd@nb)st@l
+dudley dudl/
+due dU
+dueling dU6l6N
+duenas dwAn@s
+duenow dUn?
+dues dUz
+duesing dUsiN
+duet dUet
+duets dUets
+dufauchard dUfOS)rd
+dufrain dUfrAn
+dufresne dUfresnE
+dug dug
+dugout dug?t
+dugspur dugspV
+duke dUk
+dukeman dUkm~
+duker dUkP
+dulce dulsA
+dull dul
+duluth dUly@T
+dumar dUm)r
+dumas dUm6s
+dumb dum
+dumbbell dumbel
+dumbstruck dumstruk
+dumfries d@mfrEs
+dumfries dumfr/z
+dummerston dumPst~
+dumouchel dUmUSel
+dumped dumpt
+dumplings dumpl6Nz
+dumpsters dumpstPz
+dunagin dun@jin
+dunaway dun@wA
+dunbar dunb)r
+dunbridge dunbrij
+duncan duNk~
+duncanville duNk~vil
+duncanville dunk~vil
+dundee dundE
+dune dUn
+dunedin dUn6d~
+dunellen d6nel~
+dunellen d@nel~
+dunellen dunel~
+dunes dUnz
+dungannon d6Ngan~
+dunk duNk
+dunked duNkt
+dunkerque d@nkVk
+dunkerque duNkVk
+dunkerque dunkVk
+dunkerton duNkPt~
+dunkerton dunkPt~
+dunkirk dunkVk
+dunkleberger duNk@lbPgP
+dunleavy dunlevE
+dunmore dunm{r
+dunn dun
+dunning dun6N
+dunseith dunsET
+dunstable dunst@bL
+dupes dUps
+duplechain dUp@lCAn
+duplessy dUplesE
+duplex dUpleks
+duplicate dUpl6kAt
+duplicated dUpl6kAd6d
+duplication dUpl6kAS~
+duplicity d6plis6d/
+dupo dUp]
+dupont dUpont
+dupre dUprA
+dupree dUprE
+dupuis dUpwEs
+durable dUr@bL
+durables dUr@bLz
+duracell dUr@sel
+duran d@ran
+durand dUr~d
+durant dUr~t
+duration dVAS~
+durban dVb~
+durham dV}
+durham dur}
+during dVr6N
+durr dV
+dusenbery dUs@nberE
+dushore dUS{r
+dushore duSP
+dusk dusk
+dust dust
+dustcloth dustkl{T
+dusting dust6N
+dustpan dustpan
+dusty dust/
+dutch duC
+dutchman duCm~
+duties dUd/z
+dutremble dUtremb@l
+duttweiler dutwIlP
+duty dUd/
+duval dUv{l
+duvall dUvL
+duvalle dUval
+duxbury duksbP/
+duxbury duksber/
+dvd dEvEdE
+dwarf dw{rf
+dwarfed dw{rft
+dwarfs dw{rfs
+dwayne dwAn
+dwell dwel
+dwellings dwel6Nz
+dwight dwIt
+dwindled dwindLd
+dyar dIP
+dye dI
+dyed dId
+dyeing dI6N
+dyer dIP
+dyes dIz
+dyett dI6t
+dying dI6N
+dyke dIk
+dykeman dIkm6n
+dykhouse dIkh?s
+dykstra dIkstr@
+dylan dil~
+dynamic dInam6k
+dynamics dInam6ks
+dynamite dIn@mIt
+dynamo dIn@m]
+dynastic d6nast6k
+dyne dIn
+dysfunction d6sfuNkS~
+dysfunctional d6sfuNkS~L
+dysinger dIsiNP
+e E
+e$$$-mail EmAl
+e$$-mail EmAl
+e$-mail EmAl
+e-mail EmAl
+each EC
+eacho ekO
+eadington Ed6Nt~
+eadington EdiNt~
+eagen Eg@n
+eager EgP
+eagerly EgPl/
+eagerness EgPn6s
+eagle EgL
+eagleman Eg@lm6n
+eagleson Eg@ls6n
+eaglet Egl6t
+eagleton Eg@lt6n
+eagletown EgLt?n
+eakles Ek@lz
+ealing El6N
+eames Emz
+ear Er
+earache ErAk
+eardrum Erdrum
+earful ErfL
+earhart Erh)rt
+earheart Erh)rt
+earlean PlEn
+earles Plz
+earlham Erlam
+earlham Vlham
+earlier Vl/P
+earliest Vl/6st
+earlimart ErlimPt
+earlimart Vl6m)rt
+earlton Vlt~
+earlville Vlvil
+early Vl/
+earlysville Vl/zvil
+earmuff Ermuf
+earn Vn
+earned Vnd
+earnestly Vn6stl/
+earnestness Vn6stn6s
+earnings Vn6Nz
+earphones ErfOnz
+earpiece ErpEs
+earplug Erplug
+earring Er6N
+ears Erz
+earshot ErSot
+earsplitting Ersplid6N
+earth VT
+earth's VTs
+eartha PT@
+earthbound VTb?nd
+earthenware VT~w,r
+earthiness VT/n6s
+earthlings VTliNz
+earthly VTl/
+earthquake VTkwAk
+earthquake's VTkwAks
+earthquakes VTkwAks
+earths VTs
+earthshaking VTSAk6N
+earthshine VTSIn
+earthstar VTst)r
+earthwork VTwVk
+earthworks VTwVks
+earthworm VTwVm
+earthy VT/
+earwax Erwaks
+ease Ez
+easier Ez/P
+easily Ez6l/
+easley Ezl/
+east Est
+eastbound Estb?nd
+eastbourne Estb{rn
+eastburn EstbVn
+easter EstP
+eastern EstPn
+easterner EstPnP
+eastgroup EstgrUp
+easthampton 6sTampt~
+eastlake EstlAk
+eastland's Estlandz
+eastlands Estlandz
+eastman Estm~
+eastmost EstmOst
+easton Est~
+eastover EstOvP
+eastpointe Estp<nt
+eastside EstsId
+eastville Estvil
+eastwick Estwik
+eastwood Estwqd
+easy Ez/
+easygoing 6sig]6N
+eat Et
+eaten Ed~
+eating Ed6N
+eaton Ed~
+eaton's Ed~z
+eatons Ed~z
+eatontown Ed~t?n
+eatontown Et~t?n
+eatonville Ed~vil
+eatonville Et~vil
+eaves Evz
+ebb eb
+ebensburg Eb~zbVg
+ebensburg eb~zbVg
+eberheart EbPh)rt
+eboni eb@nE
+ebonie eb@nE
+ebony eb@nE
+ebro Abr]
+ebro ebr]
+eccentric 6ksentr6k
+eccentricity eks~tris6d/
+eccentrics 6ksentr6ks
+eccles ek@ls
+eccleston ek6lst6n
+echave eC)vA
+echelberger ek@lbPgP
+echo ek]
+echoes ek]z
+echoles ekOles
+echols ek@lz
+echternach ektPnak
+eckels ekLz
+eckerle ekPlE
+eckerty ekPd/
+eckerty ekPt/
+eckes eks
+eckrich ekr6C
+eckstein ekstIn
+eclectic 6klekt6k
+eclipse 6klips
+ecology 6kol@j/
+economic Ek@nom6k
+economics Ek@nom6ks
+economies 6kon@m/z
+economists 6kon@m6sts
+economy /kon@m/
+economy 6kon@m/
+ecorse EkPs
+ecosystem Ek]sist}
+ecstatically 6kstad6kl/
+ecumenical eky6men6kL
+ed ed
+eddie ed/
+eddy ed/
+eddystone ed/stOn
+eddyville ed/vil
+edelman em6n
+edenfield Et6nfEld
+edenholm Ed@nhOm
+edenville Ed~vil
+edgar edgP
+edgar's edgPz
+edgardo edg)rtO
+edgars edgPz
+edgartown edgPt?n
+edge ej
+edgecliff ejklif
+edgefield ejfEld
+edgeman ejm6n
+edgemon ejm@n
+edgerson edgPs@n
+edgerton ejPt@n
+edges ej6z
+edgewater ejw{dP
+edgewater ejw{tP
+edgeways ejwAz
+edgewood ejwqd
+edgeworth ejwVT
+edgy ej/
+edifice ed6f6s
+ediger edigP
+edina 6dEn@
+edinburg ed~bVg
+edinburgh ed~bV]
+edinger ed~jP
+edington etiNt6n
+edirine ed@rEn
+edirne cdVn
+edison ed6s~
+edit ed6t
+edith Ed@T
+edition 6diS~
+editions 6diS~z
+editor ed6dP
+editorially ed6t{r/6l/
+edmondson edm~ds~
+edmonston edm~st~
+edmonton edm~t~
+edmundson edmunds@n
+edouard edwPd
+eduardo edw)rdO
+educate ej@kAt
+educated ej6kAd6d
+education ej@kAS~
+educational ej6kAS~L
+edward edwPd
+edwards edwPdz
+edwardsburg edwPdzbVg
+edwardson edwPds~
+edwardsville edwPdzvil
+edwin edw~
+edyth EtiT
+edythe Ed6T
+ee /
+ee E
+eelgrass Elgras
+eerie Er/
+effect 6fekt
+effective 6fekt6v
+effectively 6fekt6vl/
+effects 6fekts
+effeminate 6fem~6t
+efficiency 6fiS~s/
+efficient 6fiS~t
+effington ef6Nt~
+effington efiNt~
+effort efPt
+effortlessly efPtl6sl/
+efforts efPts
+egan Eg~
+eganville Eg~vil
+egelston eg@lst@n
+egerton ejPt@n
+egg eg
+eggbeater egbEdP
+eggcrate egkrAt
+egghead eghed
+eggleston eg@lst6n
+eggleston egLst~
+eggleton eg@lt@n
+eggnog egnog
+eggplant egplant
+eggplants egplants
+eggs egz
+eggshell egSel
+egleston eg@lst@n
+egleton eg@lt@n
+eglington egl6Nt~
+egner egnP
+ego Eg]
+egocentric Eg@sentr6k
+egotism Eg@tiz}
+egotist Eg@tist
+egwuohua @gwO@
+egypt Ej@pt
+egyptian 6jipS~
+egyptians 6jipS~z
+egyptology Ej@ptol@j/
+eh c
+eh e
+ehrich erik
+ehrlich Pl6k
+eich Ik
+eichberg IkbPg
+eichberger IkbPgP
+eichenberg Ik@nbPg
+eichenberger IkinbPgP
+eichert IkPt
+eichholz IkhOltz
+eichhorn Ikh{rn
+eichhorst Ikh{rst
+eichinger IkinjP
+eichmann Ikm@n
+eichorn E6kh{rn
+eichorn Ikh{rn
+eichorst Ikh{rst
+eichstedt Iksted
+eiffel IfL
+eighmey AmE
+eighmy AmE
+eight H2
+eighteen H2Y|
+eighteenth H22Y|G
+eighth AT
+eighth AtT
+eighth H2G
+eighths AtTs
+eighties Ad/z
+eightieth HQ[(G
+eighty H2[
+eikleberry Ik@lbArE
+eileen IlEn
+eilene IlEn
+einstein InstIn
+eisenbeis Is@nbIs
+eisenhower Iz~h?P
+eisiminger Is@miNgP
+either EDP
+eject /jekt
+eject 6jekt
+eject Ejekt
+ejected 6jekt6d
+ejection 6jekS~
+el el
+elaborate 6lab@r6t
+elaborately 6lab@r6tl/
+elaine 6lAn
+eland el~d
+elane @lAn
+elapsed 6lapst
+elberta LbVd@
+elberton elbPt~
+elbow elbO
+elbowing elbO6N
+elbowroom elbOrUm
+elburn elbPn
+elchert elkh)rt
+elcor elkP
+elderly eldPl/
+elderon eld@r~
+elderon eldPon
+elders eldPz
+eldon eld~
+eldred eldrd
+eleanor el@n{r
+eleanora el@n{r@
+eleanore el6n{r
+elect 6lekt
+election 6lekS~
+electric 6lektr6k
+electrical 6lektr6kL
+electricity el6ktris6d/
+electromagnetic @lektr]magned6k
+electromagnetism @lektr]magn6tiz}
+electronic 6lektronik
+electronics 6lektroniks
+electrons 6lektronz
+elegant el6g~t
+elegantly el6g~tl/
+element el6m~t
+elemental el6mentL
+elements el6m~ts
+elenore el@n{r
+eleonor el@n{r
+eleonore el@n{r
+elephant's el6f~ts
+elephants el6f~ts
+elevator el6vAdP
+eleven 6lev~
+eleven's 6lev~z
+elevens 6lev~z
+eleventh 6lev~T
+elgin elj~
+eli ElI
+eliassen elE@s@n
+elijah @lI@
+eliminate 6lim6nAt
+eliminates 6lim6nAts
+eliot el/6t
+elisabeth @liz@b6T
+elise el6z
+elise elEs
+elizabeth 6liz@b6T
+elizabeth 6liz@b6T
+elizabeth 6liz@beT
+elizabeth's 6liz@b6Ts
+elizabeths 6liz@b6Ts
+elizabethtown 6liz@b6Tt?n
+elizalde elEzAld
+elizaville 6lIz@vil
+elizaville 6liz@vil
+elizebeth @liz@beT
+elk elk
+elkader clkAdP
+elkader elkAdP
+elkhart elkh)rt
+elkhorn elkh{rn
+elkland elkland
+elkland elkl~d
+elkmont elkmont
+elkport elkp{rt
+elkton elkt~
+elkview elkvyU
+ellabell el@bel
+ellamae el@mA
+ellaville el@vil
+ellen el~
+ellena @lAn@
+ellenbogen el@nbOg@n
+ellensburg el~zbVg
+ellensburgh el~zbVg
+ellenton el~t~
+ellenwood el6nwqd
+ellerbee elPbE
+ellie el/
+ellinghuysen eliNhyUz@n
+ellipse 6lips
+ellipsoids 6lips<dz
+ellis el6s
+elloree elPE
+ellsberg elzbVg
+ellsbury elzbP/
+ellsmore elzmOr
+ellwanger elwaNP
+ellwein elwIn
+ellwood elwqd
+ellyn el~
+elm elm
+elma elm@
+elmer elmP
+elmhurst elmhVst
+elmira elmIr@
+elmont elmont
+elmore elmP
+elmsford elmzfPd
+elmwood elmwqd
+eloisa elOEs@
+eloise elOEz
+elongation el6NgAS~
+elsa els@
+elsah els@
+else els
+else's els6z
+elses els6z
+elsewhere elsw,r
+elsie's els/z
+elsies els/z
+elton elt~
+elum el}
+elverson elvPs~
+elvira LvEr@
+ely El/
+elyse @lEs
+elysian 6liZ~
+em em
+email EmAl
+emanuel 6manyU@l
+emanuele 6manyU@l
+embarkment 6mb)rkm~t
+embarrassed 6mbar6st
+embarrassment 6mbar6sm~t
+embassy emb@s/
+embattlement 6mbadLm~t
+embedded 6mbed6d
+embellish 6mbel6S
+emberton embPt@n
+embezzlement 6mbezLm~t
+emblazon 6mblAz~
+emblem embl}
+emblematic embl6mad6k
+embleton embLt~
+embodying 6mbod/6N
+embraced 6mbrAst
+embracing 6mbrAs6N
+embreeville embr/vil
+embroidery 6mbr<dP/
+embry embrE
+embryology 6mbryol@j/
+emco emk]
+emely em@lE
+emerado em@rod]
+emerado emP)d]
+emerald emrLd
+emerge 6mVj
+emerged 6mVjd
+emergency /mVj~s/
+emergency 6mVj~s/
+emergent 6mVj~t
+emerging 6mVj6N
+emerich em@r6k
+emerita 6mer6t@
+emerita em@rEd@
+emery em@r/
+emeryville em@r/vil
+emfinger emfiNP
+emge emjE
+emhouse emh?s
+emiko @mEkO
+emile emEl
+emilee em6lE
+emilie em@lE
+emily em6l/
+emissions 6miS~z
+emmanuel 6manyUel
+emmerich em@rik
+emmetsburg em6tsbVg
+emmett em6t
+emmons em~z
+emmy em/
+emory em@r/
+emory em@rE
+emotional 6mOS~L
+emotionalism 6mOS~@liz}
+emotionally 6mOS~L/
+emotions 6mOS~z
+empathy emp@T/
+emperor empPP
+emperor's empPPz
+emperors empPPz
+emphasis emf@s6s
+emphasising emf@sIz6N
+emphasize emf@sIz
+emphasized emf@sIzd
+emphatically 6mfad6kl/
+emphysema emf6zEm@
+empire empIr
+empires empIrz
+empirical 6mpEr6kL
+emplacement empl6sm~t
+employ 6mpl<
+employed 6mpl<d
+employee empl<y/
+employees empl<y/z
+employer 6mpl<P
+employers 6mpl<Pz
+employing 6mpl<6N
+employment 6mpl<m~t
+emporia 6mp{r/@
+emporium 6mp{r/}
+empowered 6mp?Pd
+empress empr6s
+emptied empt/d
+empty empt/
+emulate emy6lAt
+enable 6nAbL
+enabled 6nAbLd
+enables 6nAbLz
+enabling 6nAbl6N
+enact 6nakt
+enamel 6namL
+encamped 6Nkampt
+encampment 6Nkampm~t
+encapsulate 6Nkaps6lAt
+enchantment 6nCantm~t
+encharski 6nC)rsk/
+encinitas ens6nEd@z
+encircle 6nsVkL
+enciso ensEsO
+enclasp eNkl6sp
+enclosed 6NklOzd
+enclosing 6NklOz6N
+enclosure 6NklOZP
+encoded 6NkOd6d
+encores oNk{rz
+encountered 6Nk?ntPd
+encourage 6nkV6j
+encouraged 6nkV6jd
+encouragement 6nkV6jm~t
+encyclopedias 6nsIkl@pEd/@z
+end end
+endangered 6ndAnjPd
+endeavored endevPd
+endeavors endevPz
+ended end6d
+enderlin endPl6n
+enderlin endPl~
+endfield endfEld
+ending end6N
+endless endl6s
+endnote endn6t
+endorsement 6nd{rsm~t
+endosperm end@spPm
+endpiece endpEs
+ends endz
+endurance 6ndUr~s
+endure 6ndUr
+endwell endwel
+enemies en6m/z
+enemy en6m/
+energies enPj/z
+energize enPjIz
+energizing enPjIz6N
+energy enPj/
+enfield enf/Ld
+enfield enfEld
+enforceable 6nf{rs@bL
+enforced 6nf{rst
+enforcement 6nf{rsm~t
+enforcing 6nf{rs6N
+engadine eNg@dEn
+engage 6NgAj
+engaged 6NgAjd
+engagingly 6NgAj6Nl/
+enge eN
+engebretsen eNg@brets6n
+engebretson eNg@brets@n
+engel eNg@l
+engelberg eNgLbVg
+engelbert eNgLbVt
+engelbrecht eNg@lbrekt
+engelhard eNg@lh)rd
+engelhardt eNg@lh)rt
+engelhart eNgLh)rt
+engelke eNgelkE
+engelkes eNgelkEs
+engelman eNg@lm@n
+engelmann eNg@lm6n
+engelmark eNg@lm)rk
+engelmeyer eNg@lmIP
+engels eNg@lz
+engelsman eNg@lsm6n
+engelstad eNg@lstad
+engeman eNm@n
+engemann eNm@n
+enger eNgP
+engert eNgPt
+engine enj~
+engineer enj6nEr
+engineered enj6nErd
+engineering enj6nEr6N
+engineers enj6nErz
+engineers' enj6nErz
+england iNgl~d
+england's iNgl~dz
+englands iNgl~dz
+engleberg eNg@lbPg
+englebert eNg@lbPt
+englebrecht eNg@lbrekt
+englefield eNgLfEld
+englehart eNg@lh)rt
+engleking eNg@lkiN
+engleman eNg@lm6n
+engles eng@lz
+engleson eNg@ls@n
+englewood eNgLwqd
+english iNgl6S
+englishtown iNgl6St?n
+englishtown iNgliSt?n
+englishwoman iNgliSwqm~
+engradine eNgr@dEn
+engravings 6NgrAv6Nz
+engrossed 6ngrOst
+engulfed 6Ngulft
+enhance 6nhans
+enhanced 6nhanst
+enhancements 6nhansm~ts
+enhancer 6nhansP
+enid En6d
+enigma 6nigm@
+enjoined 6nj<nd
+enjoy 6nj<
+enjoyed 6nj<d
+enjoying 6nj<6N
+enjoyment 6nj<m~t
+enlarged 6nl)rjd
+enlargement 6nl)rjm~t
+enlightenment 6nlId~m~t
+enlistment 6nlistm~t
+ennis en6s
+enoch En)k
+enochs En)ks
+enola 6nOl@
+enon En~
+enormous 6n{rm@s
+enough 6nuf
+enrage 6nrAj
+enraptured 6nrapCPd
+enrich 6nriC
+enrichment 6nriCm~t
+enrique enrEkA
+enriques enrEk6s
+enriqueta enrEket@
+enrollment 6nrOlm~t
+enrollments 6nrOlm~ts
+enrolment 6nrOlm~t
+ensenada ens6nod@
+ensenada ens@n)d@
+ensign ensIn
+ensign ens~
+enslavement 6nslAvm~t
+ensue 6nsU
+ensure 6nSUr
+ensures 6nSUrz
+ensuring 6nSUr6N
+entails 6ntAlz
+entanglement 6ntaNgLm~t
+entanglements 6ntaNgLm~ts
+enter entP
+entered entPd
+entering entP6N
+entertainer entPtAnP
+entertaining entPtAn6N
+entertainment entPtAnm~t
+enthrall 6nTr{l
+enthrone 6nTrOn
+enthronement 6nTrOnm~t
+enthusiasm 6nTUz/az}
+enthusiasms 6nTUz/az}z
+enthusiast 6nTUz/ast
+enthusiastic 6nTUz/ast6k
+enthusiasts 6nTUz/asts
+entice 6ntIs
+entire 6ntIr
+entire cntIr
+entirely 6ntIrl/
+entitled 6ntIdLd
+entourage ont@roZ
+entrance entr~s
+entranceway entr~swA
+entrant entr~t
+entrepreneur's ontr@pr@nVz
+entrepreneurial ontr@pr@nV/L
+entrepreneurs ontr@pr@nVz
+entrepreneurship ontr@pr@nVSip
+entropy entr@p/
+entrusted 6ntrust6d
+entry entr/
+entwistle entwis@l
+enugu AnUgU
+env_p ^
+envelope env6lOp
+envelopes env6lOps
+envelopment 6nvel@pm~t
+enville 6nvil
+enville envil
+environment 6nvIPnm~t
+environmental 6nvIr~mentL
+environmentalist 6nvIr~mentL6st
+environmentally 6nvIr~ment6l/
+environments 6nvIPnm~ts
+envisioned 6nviZ~d
+envisioning 6nviZ~6N
+enzyme enzIm
+eon Eon
+ephesus ef6s@s
+ephraim efrAm
+ephrata 6frod@
+epidemic ep6dem6k
+epileptic ep6lept6k
+episcopalian 6pisk@pAl/~
+episode ep6sOd
+eppes eps
+epsom eps}
+epson eps~
+epstein epstEn
+equal EkwL
+equality Ekw{l6d/
+equalization EkwL6zAS~
+equalizer EkwLIzP
+equally Ekw6l/
+equals EkwLz
+equation 6kwAZ~
+equations 6kwAZ~z
+equihua 6hw@
+equipment 6kwipm~t
+equipped 6kwipt
+equivalence 6kwivL~s
+equivalent 6kwivL~t
+era Er@
+eradicating @rad6kAd6N
+eradication @rad6kAS~
+erase 6rAs
+erases @rAs6z
+erasmus @razm@s
+erbes Pbz
+ereaux ArO
+erfurt erfVt
+eric ar6k
+eric er6k
+erica ar6k@
+erica er6k@
+erich Arik
+erichson eriks@n
+erick ar6k
+erick er6k
+ericka er6k@
+erickson Ar6ks@n
+ericson eriks@n
+ericsson @riks~
+ericsson eriks@n
+erieville Er/vil
+erika Ar@k@
+erika ar6k@
+eriksson eriks@n
+erin ar~
+ermine Vm~
+ernestine Vn6stEn
+erosion @rOZ~
+erotic @rod6k
+errand ar~d
+errands ar~dz
+errant ar~t
+errol Ar@l
+error arP
+errors arPz
+ertl Pt6l
+erupted @rupt6d
+eruption @rupS~
+eruptions @rupS~z
+erwin Vw~
+eryn Ar@n
+escajeda esk@hEd@
+escalated esk@lAd6d
+escalation esk@lAS~
+escalator esk@lAdP
+escanaba esk@n)b@
+escanaba esk@nob@
+escape 6skAp
+escapement 6skApm~t
+escaping 6skAp6N
+eschete eSetE
+escobar esk@b)r
+escondido esk~dEd]
+escorting 6sk{rd6N
+escue eskyU
+eskew eskyU
+eskimo esk6m]
+eskimos esk6m]z
+eskridge eskrij
+esnardy 6sn)rd/
+esophagus 6sof@g@s
+esoteric es@tar6k
+espe espE
+especially 6speSL/
+esperanza espPanz@
+espinal esp@n{l
+esqueda eskAd@
+esquibel esk6b@l
+esquivel esk6vel
+esquivez esk6vez
+esquivias esk6vE@s
+essay esA
+essendon 6send~
+essendon es~d~
+essential 6senSL
+essentially 6senS6l/
+essington es6Nt~
+essington esiNt~
+established 6stabl6St
+establishment 6stabl6Sm~t
+establishments 6stabl6Sm~ts
+estacada est@k)d@
+estacada est@kod@
+estancia 6stanS@
+estancia cst)nsy@
+estates 6stAts
+estelline cstel/n
+estelline est6lIn
+estevez est@vez
+esther estP
+estherville estPvil
+estimate est6m6t
+estimates est6m6ts
+estle es@l
+etcetera etsed@r@
+eternal 6tVnL
+eternalize 6tVn@lIz
+eternity 6tVn6d/
+ethan ET~
+ethel eTL
+ethers ETPz
+etherton eDPt6n
+ethical eT6kL
+ethics eT6ks
+ethiopia ET/Op/@
+ethiopia's ET/Op/@z
+ethiopian ET/Op/~
+ethiopias ET/Op/@z
+ethnicity @Tnis6d/
+ethnics eTn6ks
+ethos eT6s
+etiquette ed6k6t
+ettienne etyen
+etulain etyUlAn
+eucalyptus yUk@lipt@s
+euclid yUkl6d
+euell yU@l
+eufaula y6f{l@
+eugene yUjEn
+eugenie yUjEnE
+euless Ul6s
+eupora y6p{r@
+eurasian y@rAZ~
+eureka yUrEk@
+eureka yqrEk@
+eurich yUr6k
+euro yUr]
+euromarkets yUr]m)rk6ts
+europe yUr@p
+european yVr@pE~
+europeans yVr@pE~z
+eva Ev@
+evacuate 6vakyUAt
+evacuating 6vakyUAd6N
+evacuation 6vakyUAS~
+evadale Ev@dAl
+evade 6vAd
+evaluate 6valyUAt
+evaluation 6valyUAS~
+evalyn ev@lin
+evan ev~
+evangeline 6vanj6lEn
+evangelista 6vanj@lEst@
+evans ev~z
+evans' ev~z
+evans's ev~z
+evansdale ev~zdAl
+evanss ev~z
+evansville ev~zvil
+evaporation 6vap@rAS~
+evaporization Ev@pP6zAS~
+evasion 6vAZ~
+evasive 6vAs6v
+eve Ev
+eveleigh ev6lE
+evelyn ev6l6n
+evelynn ev@l6n
+even Ev~
+evening Evn6N
+evenings Evn6Nz
+evenly Ev~l/
+evenness Ev~n6s
+evens Evinz
+evens Ev~z
+evenson Ev6ns@n
+evensville Ev~zvil
+evensville ev~zvil
+event 6vent
+events /vents
+eventualities 6venCUal6d/z
+eventually 6venCU6l/
+ever evP
+everest evP6st
+everett evP6t
+everett evr6t
+everette evret
+everetts evr6ts
+everglades evPglAdz
+evergreen evPgrEn
+everheart evPh)rt
+everington evr6Nt~
+everington evriNt~
+everlasting evPlast6N
+everlastings evPlast6Nz
+evers evPz
+evert 6vVt
+everton evPt~
+every evr/
+everybody evr/bud/
+everybody's evr/bud/z
+everybodys evr/bud/z
+everyday evr/dA
+everyone evr/wun
+everyone's evr/wunz
+everyones evr/wunz
+everything evr/T6N
+everything's evr/T6Nz
+everythings evr/T6Nz
+everywhere evr/w,r
+evidence ev6d~s
+evidences ev6d~s6z
+evident ev6d~t
+evidently ev6dentl/
+evil EvL
+evils EvLz
+evilsizor Ev@lsIzP
+evington EviNt~
+evington ev6Nt~
+evolutionary ev@lUS@ner/
+evolve 6volv
+ewa yU@
+ewald yUw{ld
+ewan yU6n
+ewbank yUbaNk
+ewell yUw6l
+ewen yU~
+ewens yU6ns
+ewer yUP
+ewers yUPz
+ewin yUw6n
+ewing yUwiN
+ewings yUiNs
+ewton yUt~
+ex eks
+exacerbated 6gzasPbAd6d
+exactly 6gzaktl/
+exaggerated 6gzaj@rAd6d
+exaggeration 6gzaj@rAS~
+exalted 6gz{lt6d
+exam 6gzam
+examination 6gzam6nAS~
+examinations 6gzam6nAS~z
+examined 6gzam~d
+examiners 6gzam~Pz
+examines 6gzam~z
+examining 6gzam~6N
+example 6gzampL
+examples 6gzampLz
+exasperate 6gzasp@rAt
+exboyfriend eksb<frend
+excalibur 6kskal6bP
+excavate eksk@vAt
+excavated eksk@vAd6d
+excavation eksk@vAS~
+excavations eksk@vAS~z
+excelled 6kseld
+excellent eks6l~t
+excelsior 6ksels/P
+except 6ksept
+exception 6ksepS~
+exceptions 6ksepS~z
+excess ekses
+excessive 6kses6v
+exchange 6ksCAnj
+exchanged 6ksCAnjd
+excise eksIz
+excited 6ksId6d
+excitement 6ksItm~t
+exciting 6ksId6N
+exclaiming 6ksklAm6N
+exclamation ekskl@mAS~
+exclamations ekskl@mAS~z
+excluded 6ksklUd6d
+exclusion 6ksklUZ~
+exclusionary 6ksklUZ@ner/
+exclusive 6ksklUs6v
+exclusively 6ksklUs6vl/
+exclusivity eksklUsiv6d/
+excommunicated eksk@myUn6kAd6d
+excretion 6kskrES~
+excretory ekskr6t{r/
+excruciating 6kskrUS/Ad6N
+excursions 6kskVZ~z
+excuse 6kskyUz
+exe eks
+execute eks6kyUt
+execution eks6kyUS~
+executive 6gzeky6d6v
+executives 6gzeky6d6vz
+executory 6gzeky6t{r/
+exemplary 6gzempl@r/
+exemption 6gzempS~
+exempts 6gzempts
+exercise eksPsIz
+exercised eksPsIzd
+exercisers eksPsIzPz
+exercises eksPsIz6z
+exertions 6gzVS~z
+exerts 6gzVts
+exeter eks6dP
+exeter eks@tP
+exhalation eksh@lAS~
+exhaled ekshAld
+exhaust 6gz{st
+exhausted 6gz{st6d
+exhaustion 6gz{sC~
+exhibit 6gzib6t
+exhibited 6gzib6d6d
+exhibition eks6biS~
+exhibitions eks6biS~z
+exhibitors 6gzib6dPz
+exhibits 6gzib6ts
+exie eksE
+exile egzIl
+exiled egzIld
+exist 6gzist
+existed 6gzist6d
+existence 6gzist~s
+existing 6gzist6N
+exists 6gzists
+exit egz6t
+exit eks6t
+exited eks6d6d
+exiting eks6d6N
+exmore eksmP
+exon eks~
+exonerating 6gzon@rAd6N
+exorbitant 6gz{rb6t~t
+exoskeleton eks@skelt~
+exotic 6gzod6k
+exotically 6gzod6kl/
+expansion 6kspanS~
+expansionism 6kspanS@niz}
+expect 6kspekt
+expectation eksp6ktAS~
+expectations eksp6ktAS~z
+expected 6kspekt6d
+expecting 6kspekt6N
+expectorate 6kspekt@rAt
+expects 6kspekts
+expedited eksp6dId6d
+expedition eksp6diS~
+expelling 6kspel6N
+expenditure 6kspend6CP
+expense 6kspens
+expensive 6kspens6v
+experience 6kspEr/~s
+experienced 6kspEr/~st
+experiences 6kspEr/~s6z
+experiencing 6kspEr/~s6N
+experiment 6kspar6m~t
+experimental 6kspar6mentL
+experimentalist 6kspar6mentL6st
+experimentally 6kspar6ment6l/
+experimented 6kspar6m~t6d
+experimenter 6kspar6m~tP
+experiments 6kspar6m~ts
+expert ekspPt
+expertise ekspPtEz
+experts ekspPts
+expiration eksp@rAS~
+expire 6kspIr
+expired 6kspIrd
+expires 6kspIrz
+explain 6ksplAn
+explainable 6ksplAn@bL
+explained 6ksplAnd
+explains 6ksplAnz
+explanation ekspl@nAS~
+explanatory 6ksplan@t{r/
+explicitly 6ksplis6tl/
+exploded 6ksplOd6d
+exploit 6kspl<t
+exploitation ekspl<tAS~
+exploited 6kspl<d6d
+exploits 6kspl<ts
+exploration ekspl@rAS~
+exploratory 6kspl{r@t{r/
+explore 6kspl{r
+explored 6kspl{rd
+explorer 6kspl{rP
+explorer ckspl{rP
+explorers 6kspl{rPz
+exploring 6kspl{r6N
+explosion 6ksplOZ~
+explosions 6ksplOZ~z
+explosives 6ksplOs6vz
+exponents 6kspOn~ts
+export 6ksp{rt
+exportable 6ksp{rd@bL
+exporter 6ksp{rdP
+exporters 6ksp{rdPz
+exposed 6kspOzd
+exposure 6kspOZP
+expounds 6ksp?ndz
+express ckspres
+expressed 6ksprest
+expression 6kspreS~
+expressway 6kspreswA
+expulsion 6kspulS~
+exquisite 6kskwiz6t
+exquisitely 6kskwiz6tl/
+extend 6kstend
+extended 6kstend6d
+extending 6kstend6N
+extends 6kstendz
+extension 6kstenS~
+extensive 6kstens6v
+extensively 6kstens6vl/
+extent 6kstent
+exterior 6kstEr/P
+extermination 6kstVm6nAS~
+external ckstVnL
+externalize 6kstVn@lIz
+externally 6kstVn6l/
+extinction 6kstiNkS~
+extinguisher 6kstiNgw6SP
+extortion 6kst{rS~
+extra ekstr@
+extracted 6kstrakt6d
+extracting 6kstrakt6N
+extramural ekstr@myUrL
+extraneously 6kstrAn/@sl/
+extraordinary ekstr{rdiner/
+extrapolated 6kstrap@lAd6d
+extras ekstr@z
+extraterestial ekstr@d@resCL
+extraterrestrial ekstr@d@restr/L
+extravagance 6kstrav@g~s
+extravaganza 6kstrav@ganz@
+extravaganzas 6kstrav@ganz@z
+extremely 6kstrEml/
+extremes 6kstrEmz
+extremity 6kstrem6d/
+extricated ekstr6kAd6d
+extroverted ekstr@vPd6d
+extrusion 6kstrUZ~
+exuberant 6gzUbr~t
+exuberantly 6gzUbr~tl/
+exuded 6gzUd6d
+exultantly 6gzult~tl/
+exultation eksLtAS~
+exults 6gzults
+exxon ekson
+ey A
+eye I
+eyeball Ib{l
+eyedrops Idrops
+eyeful IfL
+eyeglass Iglas
+eyelid Ilid
+eyelids Ilidz
+eyepiece IpEs
+eyes Iz
+eyeshade ISAd
+eyesight IsIt
+eyesore Is{r
+eyespot Ispot
+eyestone IstOn
+eyestrain IstrAn
+eyewitnesses Iwitn6s6z
+eyota AOd@
+ezell ezel
+ezequiel 6zEkE@l
+f ef
+f f
+fabacher fAb)kP
+fables fAbLz
+fabre fAbP
+fabric fabr6k
+fabrication fabr6kAS~
+fabrications fabr6kAS~z
+fabrics fabr6ks
+facade f@sod
+face fAs
+faced fAst
+faces fAs6z
+facial fASL
+facilities f@sil6d/z
+facility f@sil6d/
+facing fAs6N
+fact fakt
+factor faktP
+factorial fakt{r/L
+factories fakt@r/z
+factors faktPz
+factory fakt@r/
+facts fakts
+faculty fakLt/
+fad fad
+fadden fad6n
+fade fAd
+faded fAd6d
+fades fAdz
+fagan fAg~
+fager fAgP
+fageraes faj@ras
+fagerquist fAjPkist
+fagerstrom fAgPstr)m
+fagin fAg6n
+fagnani f)ny)nE
+fahrenheit far~hIt
+faidley fAdlE
+faigin fAgin
+fail fAl
+failed fAld
+failing fAl6N
+fails fAlz
+failure fAlyP
+failures fAlyPz
+faintness fAntn6s
+faints fAnts
+fair f,r
+fairbanks f,rbaNks
+fairborn f,rb{rn
+fairbridge f,rbrij
+fairbury f,rbP/
+fairbury f,rber/
+fairchild f,rCIld
+fairchild fArCIld
+fairchild's f,rCIldz
+fairchilds f,rCIldz
+faircloth f,rkl{T
+fairdale f,rdAl
+faires fArz
+fairfax f,rfaks
+fairfield f,rfEld
+fairford f,rfPd
+fairforest f,rfP6st
+fairforest f,rfor6st
+fairground f,rgr?nd
+fairgrounds f,rgr?ndz
+fairhope f,rh@p
+fairhurst f,rhVst
+fairlea f,rlA
+fairlea f,rlE
+fairlea fIrl/@
+fairless f,rl6s
+fairly f,rl/
+fairman f,rm~
+fairmont f,rmont
+fairplay f,rplA
+fairton f,rd~
+fairton f,rt~
+fairview f,rvyU
+fairway f,rwA
+fairy fer/
+faith fAT
+faithful fATfL
+faithfull fATfL
+faithfulness fATfLn6s
+faithlessly fATl6sl/
+faiths fATs
+fake fAk
+faked fAkt
+falcioni falCEOnE
+falcon falk~
+falconer falk~P
+falfurrias falfV/@z
+falfurrias falfqr/@s
+falk f{k
+falkenberg f{k6nbPg
+falkenstein f{lk@nstIn
+falkland f{kl~d
+falklands f{kl~dz
+falkner f{knP
+falks f{ks
+falkville f{kvil
+fall f{l
+fallbrook f{lbrqk
+fallen f{l~
+falling f{l6N
+fallout f{l?t
+fallouts f{l?ts
+falls f{lz
+fallston falst~
+fallston f{lzt~
+falmouth falm@T
+falmouth folm@T
+falmouth f{lm@T
+false f{ls
+falsehood f{lshqd
+falsely f{lsl/
+falterman f{ltPm@n
+fame fAm
+familiar f@milyP
+familiarity f@mil/ar6d/
+familiarize f@milyPIz
+familiarized f@milyPIzd
+familiarly f@milyPl/
+families faml/z
+family faml/
+famished fam6St
+famous fAm@s
+famulare famyUl)rE
+fan fan
+fanatic f@nad6k
+fancier fans/P
+fancy fans/
+fanfare fanf,r
+fanfold fanfOld
+fanged faNd
+fangs faNz
+fans fanz
+fanshawe fanS6
+fanshawe fanS{
+fantastic fantast6k
+fantasy fant@s/
+far f)r
+faraci f@r)CE
+faragher fer@gP
+farahkhan fer@k)n
+fare f,r
+farewell f,rwel
+farfetched f)rf6Ct
+fargo f)rg]
+fargo's f)rg]z
+fargos f)rg]z
+farley f)rl/
+farm f)rm
+farmer f)rmP
+farmers f)rmPz
+farmerville f)rmPvil
+farmhand f)rmhand
+farmhands f)rmhandz
+farmhouse f)rmh?s
+farmhouses f)rmh?z6z
+farmingdale f)rm6NdAl
+farmingdale f)rmiNdAl
+farmings f)rm6Nz
+farmington f)rmiNt~
+farmland f)rmland
+farms f)rmz
+farmstead f)rmsted
+farmville f)rmvil
+farmworker f)rmwVkP
+farmyard f)rmy)rd
+farnum f)rn}
+farquharson f)rkPs@n
+farr f)r
+farrar f@r)r
+farrare f)r)r
+farren far~
+farris far6s
+farrow far]
+farther f)rDP
+farthest f)rD@st
+fasciculations f@siky6lAS~z
+fascinating fas6nAd6N
+fashion faS~
+fashioned faS~d
+fashioning faS~6N
+fassnacht fasn)kt
+fast fast
+fastball fastb{l
+fasten fas~
+fastener fas~P
+faster fastP
+fastest fast6st
+fastixx fast6ks
+fasts fasts
+fat fat
+fatal fAdL
+fatalism fAd@liz}
+fate fAt
+father foDP
+father's foDPz
+fatheree f)D@rE
+fatherhood foDPhqd
+fatherlike foDPlIk
+fathers foDPz
+fathman faTm~
+fathomless faD@ml6s
+fathoms faD}z
+fatigue f@tEg
+fatigued f@tEgd
+fatigues f@tEgz
+fatimah fatim)
+fattore fatOrA
+faughn f{n
+faught f{t
+faulk f{k
+faulk f{lk
+faulkenburg f{k6nbPg
+faulknen f{kn6n
+faulkner f{lknP
+faulks f{lks
+fault f{lt
+faultfinder f{ltfIndP
+faultless f{ltl6s
+faults f{lts
+faunsdale f{nzdAl
+fauntleroy f{ntl@r<
+faust f?st
+favor fAvP
+favorable fAvP@bL
+favorite fAvP6t
+favorite fAvr6t
+favorites fAvP6ts
+favorites fAvr6ts
+favoritism fAvr6tiz}
+favors fAvPz
+favre fAvP
+favuzzi favUtzE
+fawn f{n
+fax faks
+faxes faks6z
+faxon faks~
+fay fA
+faye fA
+fazed fAzd
+fazenbaker fAz6nbAkP
+fe fA
+feagin fEg6n
+fear fEr
+feared fErd
+fearful fErfL
+fearless fErl6s
+fearlessly fErl6sl/
+fears fErz
+fearsome fErs}
+feasible fEz@bl
+feast fEst
+feaster fEstP
+feat fEt
+feather feDP
+feathered feDPd
+featheroff feD@r)f
+feathers feDPz
+featherston feDPst6n
+featherstone feDPstOn
+feature fECP
+featureless fECPl6s
+features fECPz
+febles fEb@lz
+february febrUer/
+february febyUer/
+february's febyU,r/z
+februarys febyU,r/z
+fecher fekP
+fechtig fektig
+fed fed
+federal fedrL
+federalist fedrL6st
+federalists fedrL6sts
+federici fed@rECE
+fedewa f@dUw@
+fee fE
+feeble fEbL
+feebly fEbl/
+feed fEd
+feedback fEdbak
+feedbox fEdboks
+feedstock fEdstok
+feel fEl
+feeling fEl6N
+feelings fEl6Nz
+feels fElz
+feet fEt
+fegett feget
+fegles feg@lz
+feigenbaum fEg6nb{m
+feighner fAnP
+feild fEld
+feilds fEldz
+feintuch fIntuk
+feisthamel fIstham@l
+feldberg feldbVg
+feldon feld~
+feldspar feldsp)r
+felica f@lEk@
+felicidad f@lis6t)d
+felicita fel6sEt@
+felicitas fel6sEt@s
+feline fElIn
+felipe f6lEpA
+felix fEliks
+fell fel
+fella fel@
+felled feld
+fellezs felez
+fellow fel]
+fellowships fel]Sips
+fellsmere felzmEr
+felony fel~/
+felt felt
+feltes feltz
+feltham felt@m
+female fEmAl
+feminine fem~~
+fence fens
+fenced fenst
+fencepost fens6p6st
+fences fens6z
+fenelton fenLt~
+fennel fenL
+fennimore fen/m{r
+fennville fenvil
+fenske fenskE
+fenstermacher fenstPm)kP
+fenwood fenwqd
+fequiere fekEAr
+feral fErL
+ferencz fPenz
+ferenz f@renz
+ferge fPg
+fergerson fPgPs@n
+fergeson fPg@s6n
+ferguson fVg@s~
+ferguson fVg@s~
+ferguson's fVg@s~z
+fergusons fVg@s~z
+ferment fPment
+fermented fPment6d
+fern fVn
+fernandez fPnand6z
+fernando fPnand]
+ferndale fVndAl
+fernlike fVnlIk
+ferns fVnz
+ferocity f@ros6d/
+ferrari f@ror/
+ferraro f@r)rO
+ferrell fAr@l
+ferries f,r/z
+ferrington fer6Nt~
+ferriolo ferEOlO
+ferris far6s
+ferrisburg far6sbVg
+ferrisburg fer6sbVg
+ferry fer/
+ferrysburg f,r/zbVg
+ferryville f,r/vil
+ferryville fer/vil
+fertile fVdL
+fertility fPtil6d/
+fertilization fVd6l6zAS~
+fertilizer fVd6lIzP
+fertilizers fVd6lIzPz
+fess fes
+fester festP
+festival fest6vL
+festivals fest6vLz
+festus fest@s
+fetter fedP
+fettes fetz
+fetzer fetsP
+feudalism fyUd@liz}
+feuding fyUd6N
+feuds fyUdz
+fever fEvP
+fevered fEvPd
+feverish fEvP6S
+feverishly fEvP6Sl/
+fevers fEvPz
+few fyU
+fewell fyU@l
+fewer fyUP
+feyereisen fI@rIs@n
+fez fez
+fi fI
+fialco f/alk]
+fiance f/onsA
+fiasco f/ask]
+fiascos f/ask]z
+fib fib
+fiberoptic fib@ropt6k
+fibers fIbPz
+fibrosis fIbrOs6s
+fichtner fiktnP
+fickes fikz
+fickleness fikLn6s
+fiction fikS~
+fictional fikS~L
+ficus fIk@s
+fiddle fidL
+fiddler fidLP
+fiddles fidLz
+fiddlestick fidLstik
+fiddlesticks fidLstiks
+fidel fidel
+fidelity f6del6d/
+fidgety fij6d/
+fiducia f6dUC@
+fiegel fEg@l
+field fEld
+fielder fEldP
+fielders fEldPz
+fieldhouse fEldh?s
+fielding fEld6N
+fieldon fEld~
+fields fEldz
+fieldsboro fEldzbV]
+fieldwork fEldwVk
+fierce fErs
+fiercely fErsl/
+fiercer fErsP
+fiery fIP/
+fiesole fI6sOl
+fiesole fyAz]lA
+fife fIf
+fifteen R.R2Y|
+fifteenth R.R2Y|G
+fifth R.RG
+fifths fifTs
+fifties fift/z
+fiftieth R.R2[(G
+fifty R.R2[
+fig fig
+figeroa fig@rO@
+fight fIt
+figment figm~t
+figs figz
+figuerda figwerd@
+figueroa fig@rO@
+figuratively figy@r@d6vl/
+figure figyP
+figured figyPd
+figurehead figyPhed
+figures figyPz
+filched filCt
+file fIl
+filename fIlnAm
+filene f6lEn
+filer fIlP
+files fIlz
+filiault filEO
+filice filECA
+filing fIl6N
+fill fil
+filled fild
+filling fil6N
+fillingham fil6Nham
+film film
+filmed filmd
+filmless filml6s
+films filmz
+filmstrip filmstr@p
+filtered filtPd
+filtering filtP6N
+filth filT
+filthaut filt?t
+filthy filT/
+fin fin
+final fInL
+finalist fInL6st
+finalists fInL6sts
+finally fIn6l/
+finance f6nans
+finance fInans
+finances fInans6z
+financial fInanSL
+financially fInanSL/
+financing fInans6N
+find fInd
+finding fInd6N
+findings fInd6Nz
+findlay findlA
+findling fIndliN
+finds fIndz
+fine fIn
+fineberg fInbPg
+finefrock fInfr)k
+fineman fInm6n
+fineout fIn?t
+fines fInz
+finest fIn6st
+fineview fInvyU
+finger fiNgP
+fingerhut fiNgPhut
+fingerman fiNgPm@n
+fingernails fiNgPnAlz
+fingerprint fiNgPprint
+fingerprints fiNgPprints
+fingers fiNgPz
+fingerson fiNgPs@n
+finicky fin6k/
+finish fin6S
+finished fin6St
+finishing fin6S6N
+finklestein fiNk@lstIn
+finksburg fiNksbPg
+finksburg fiNksbVg
+finleyville finl/vil
+finnigan fin6g~
+fiore fE{rA
+fiqueroa f6kPO@
+fir fV
+fire fIr
+firearm fIr)rm
+firebaugh fIrb)
+firebrand fIrbrand
+firebug fIrbug
+firecracker fIrkrakP
+firecrackers fIrkrakPz
+fired fIrd
+firedog fIrd{g
+firefight fIrfIt
+firefighters fIrfIdPz
+firefly fIrflI
+firehouses fIrh?z6z
+fireman fIrm6n
+firenze f@renzE
+fireplace fIrplAs
+firepower fIrp?P
+fireproofing fIrprUf6N
+fires fIrz
+firestein fIrstIn
+firestine fIrstEn
+fireweed fIrwEd
+fireworks fIrwVks
+firing fIr6N
+firm fVm
+firmly fVml/
+firmness fVmn6s
+firms fVmz
+first fVst
+firstly fVstl/
+firsts fVsts
+firth fVT
+fiscal fiskL
+fish fiS
+fishback fiSbak
+fishbein fiSbAn
+fished fiSt
+fisher fiSP
+fisheries fiSP/z
+fishermen fiSPm~
+fishers fiSPz
+fishertown fiSPt?n
+fishhook fiShqk
+fishing fiS6N
+fishkill fiSk6l
+fishkill fiSkil
+fishmonger fiSmoNgP
+fishnet fiSn6t
+fishtail fiStAl
+fisk fisk
+fist fist
+fistfight fistfIt
+fit fit
+fitanides fit~Et@s
+fitchburg fiCbPg
+fitchburg fiCbVg
+fitcheard fiCPd
+fitful fitfL
+fitfully fitfL/
+fitness fitn6s
+fits fits
+fitted fid6d
+fittstown fitst?n
+fitz fits
+fitzgerald fitsjarLd
+fitzgerald's fitsjarLdz
+fitzgeralds fitsjarLdz
+fitzgibbon fitsgib@n
+fitzhugh fitshyU
+fitzpatrick fitspatr6k
+fitzsimmons fitsim6nz
+fitzwater fitsw{dP
+fitzwilliam fitswily}
+five R>3
+fiveash fIvaS
+fivecoat fIvkOt
+fives fIvz
+fiwck fik
+fix fiks
+fixated fiksAd6d
+fixed fikst
+fixtures fiksCPz
+fizz fiz
+fizzled fizLd
+fjords fj{rdz
+flaa fl)
+flach fl)k
+flachs flaks
+flag flag
+flagge flag
+flagging flag6N
+flagler flAglP
+flagpoles flagpOlz
+flags flagz
+flagships flagSips
+flagstaff flagstaf
+flagstone flagstOn
+flaherty flaPtE
+flaker flAkP
+flam flam
+flamboyant flamb<~t
+flamboyantly flamb<~tl/
+flame flAm
+flameproof flAmprUf
+flames flAmz
+flamethrower flAmTr?P
+flaming flAm6N
+flamingo fl@miNg]
+flammability flam@bil6d/
+flanagan flan@g~
+flanagin flan@g@n
+flandres flandPz
+flandres flandr@
+flanked flaNkt
+flapjack flapjak
+flaps flaps
+flares fl,rz
+flash flaS
+flashbulb flaSbulb
+flashcube flaSkyUb
+flashdance flaSd~s
+flasher flaSP
+flashier flaS/P
+flashing flaS6N
+flashlight flaSlIt
+flashpoint flaSp<nt
+flask flask
+flat flat
+flatbed flatbed
+flatboat flatbOt
+flatbread flatbred
+flatfooted flatfqd6d
+flatgap flatg@p
+flatgap flatgap
+flatheads flathedz
+flatland flatland
+flatness flatn6s
+flatonia fl@tOn/@
+flats flats
+flatten flad~
+flattop flattop
+flatware flatw,r
+flatwoods flatwqdz
+flaugher fl?P
+flaunt fl{nt
+flavin flAv~
+flavor flAvP
+flavorfully flAvPfL/
+flavors flAvPz
+flaw fl{
+flawless fl{l6s
+flawlessly fl{l6sl/
+flax flaks
+flaxman flaksm~
+flaxseed flakssEd
+flea flE
+fleabite flEbIt
+fleckles flek@lz
+fled fled
+fledgling flejl6N
+fleecy flEs/
+fleeger flEgP
+fleet flEt
+fleets flEts
+fleetwood flEtwqd
+flegel fleg@l
+fleites flItEz
+fleming flem6N
+flemington flemiNt~
+fleshed fleSt
+fleta flEt@
+fletch fleC
+fletes flEtz
+flew flU
+flex fleks
+flexibility fleks6bil6d/
+flexible fleks@bl
+flextime flekstIm
+flick flik
+flickered flikPd
+fliers flIPz
+flies flIz
+flight flIt
+flights flIts
+flimsy flimz/
+fling fliN
+flint flint
+flintlocks flintloks
+flintridge flintrij
+flints flints
+flintstone flintstOn
+flintville flintvil
+flintville flinvil
+flip flip
+flipper flipP
+flirting flVd6N
+flitch fliC
+float flOt
+floated flOd6d
+floats flOts
+floc flok
+flogging fl{g6N
+flomaton fl]mAt~
+flood flud
+flooded flud6d
+floodgates fludgAts
+floodplain flUdpl~
+floods fludz
+floodwood fludwqd
+floor fl{r
+floorboards fl{rb{rdz
+floors fl{rz
+flop flop
+flopped flopt
+floral fl{rL
+florala fl@rol@
+florala fl{ral@
+flordell fl{rdel
+florence flor~s
+florence fl{r~s
+florence's fl{r~s6z
+florences fl{r~s6z
+florescence fl@res~s
+florescent fl@res~t
+floresville fl{r6svil
+florida flOr6d@
+florida flor6d@
+florida fl{r6d@
+florien fl{r/n
+florien fl{r/~
+florio fl{r/]
+florist fl{r6st
+floss fl{s
+flotation fl]tAS~
+flounder fl?ndP
+flour fl?P
+flourish flViS
+flourished flViSt
+flourishes flViS6z
+flourtown fl?Pt?n
+flovilla flOvil@
+flow flO
+flowed flOd
+flower fl?P
+flowerless fl?Pl6s
+flowerpost fl?Pp6st
+flowerpot fl?Ppot
+flowers fl?Pz
+flowing flO6N
+flows flOz
+floyd fl<d
+fluctuating flukCUAd6N
+fluctuation flukCUAS~
+fluctuations flukCUAS~z
+fluency flU~s/
+fluent flU~t
+fluently flU~tl/
+fluffier fluf/P
+fluid flU6d
+fluidity flUid6d/
+fluorescent fl@res~t
+fluorides fl{rIdz
+fluorocarbons fl{r@k)rb~z
+flurries flV/z
+flush fluS
+flushing fluS6N
+fluster flustP
+fluttered fludPd
+fly flI
+flyby flIbI
+flying flI6N
+flywheel flIwEl
+fm efem
+fm1 efemwun
+fm2 efemtU
+foal fOl
+foam fOm
+foams fOmz
+foamy fOm/
+fobes fObz
+focal fOkL
+focus fOk@s
+focusing fOk@s6N
+foddrell f)drel
+foe fO
+fog fog
+fogarty fOgPtE
+fogbank fogbaNk
+fogel fOg@l
+fogelsville fOgLzvil
+fogerson fOgPs@n
+fogerty fojPd/
+foggiest fog/6st
+fogginess fog/n6s
+foghorn fogh{rn
+fogleman fOg@lm@n
+foglesong fOg@ls)N
+fogt fOt
+foibles f<bLz
+foil f<l
+foisted f<st6d
+fold fOld
+foldaway fOld@wA
+folded fOld6d
+folder fOldP
+folding fOld6N
+folds fOldz
+foley fOl/
+foliage fOl/6j
+folk fOk
+folkestone fOkst~
+folks fOks
+follansbee fol~zbE
+follicle fol6kL
+follow fol]
+followed fol]d
+following fol]6N
+follows fol]z
+folsom fOls}
+fombell fombL
+fombell fombel
+fond fond
+fondness fondn6s
+fong f{N
+fonnesbeck f)nzbek
+fonseca f)ns@k@
+fontana fonton@
+fontenot f)nt6nO
+foo fU
+food fUd
+foods fUdz
+foodstuffs fUdstufs
+foodtown fUdt?n
+foodways fUdwAz
+fool fUl
+foolhardiness fUlh)rd/n6s
+foolish fUl6S
+foolproof fUlprUf
+foot fqt
+footage fqd6j
+football fqtb{l
+footballs fqtb{lz
+footbridge fqtbrij
+foote fUt
+foote fqt
+footer fqdP
+footfall fqtf{l
+footgear fqtgEr
+foothill fqthil
+foothills fqthilz
+footlocker fqtlokP
+footloose fqtlUs
+footman fqtm~
+footnotes fqtnOts
+footpath fqtpaT
+footprints fqtprints
+footrace fqtrAs
+footsteps fqtsteps
+footstool fqtstUl
+footville fqtvil
+footwall fqtw{l
+for fP
+for fV
+for f{r
+forbes f{rbz
+forbidden f{rbid~
+forbids fPbidz
+force f{rs
+forced f{rst
+forcefully f{rsfL/
+forces f{rs6z
+forcing f{rs6N
+ford f{rd
+fordingham f{rd6Nham
+fordingham f{rdiNham
+fordland f{rdland
+fords f{rdz
+fordsville f{rdzvil
+fordyce f{rdis
+forearm f{r)rm
+foreboding f{rbOd6N
+forebrain f{rbrAn
+forecast f{rkast
+forecasts f{rkasts
+foreclosing f{rklOz6N
+foreclosure f{rklOZP
+forefather f{rfoDP
+forefront f{rfrunt
+foreground f{rgr?nd
+forehand f{rhand
+forehands f{rhandz
+forehead f{rhed
+foreign f{r~
+foreigner f{r~P
+foreigners f{r~Pz
+forelands f{rlandz
+forelimbs f{rlimz
+foreman f{rm6n
+foresman f{rzman
+forest f{r6st
+forestburg for6stbVg
+forestburg f{r6stbVg
+forestdale for6stdAl
+forestdale f{r6stdAl
+forester f{r6stP
+foresthill for6sthil
+foresthill f{r6sthil
+foreston f{rston
+forests f{r6sts
+forethought f{rT{t
+foretold f{rtOld
+forever fPevP
+forewarn f{rw{rn
+forewarned f{rw{rnd
+forfeit f{rf6t
+forfeited f{rf6d6d
+forgan f{rgan
+forgan f{rg~
+forgave f{rgAv
+forge f{rj
+forged f{rjd
+forgery f{rjP/
+forget fPget
+forgetful fPgetfL
+forgive fPgiv
+forgiven fPgiv~
+forgiveness fPgivn6s
+forgot fPgot
+forgotten f{rgod~
+foristell f{r6stel
+fork f{rk
+forkland f{rkland
+forklifts f{rklifts
+forks f{rks
+forland f{rland
+form f{rm
+formal f{rmL
+formality f{rmal6d/
+formalization f{rmL6zAS~
+formalized f{rmLIzd
+formally f{rmL/
+format f{rmat
+formation f{rmAS~
+formats f{rmats
+formed f{rmd
+former f{rmP
+formerly f{rmPl/
+formica f{rmIk@
+formlessly f{rml6sl/
+formoso f{rmOs]
+forms f{rmz
+formula f{rmy6l@
+formulating f{rmy6lAd6N
+formulations f{rmy6lAS~z
+forres f{rz
+forrest f{r6st
+forreston for6st~
+forreston f{r6st~
+forsaken fPsAk~
+forsyth f{rsIT
+forsythe f{rsIT
+forsythia f{rsiT/@
+fort f{rt
+fort_bend f{rtbend
+fort_worth f{rtwVT
+fortaleza f{rd@lEz@
+fortaleza f{rt@lAz@
+forte f{rtA
+fortes f{rts
+forth f{rT
+forthcoming f{rTkum6N
+fortieth RX0Q[(G
+fortified f{rd6fId
+fortnight f{rtnIt
+fortuitous f{rtU6d@s
+fortun fOrtun
+fortunate f{rC~6t
+fortunato f{rCUn)tO
+fortune f{rC~
+fortunetelling f{rtUn6d6l6N
+fortville f{rtvil
+fortworth f{rtwVT
+forty RX02[
+forum f{r}
+forward f{rwPd
+forwardness f{rwPdn6s
+fosse f)sE
+fossel fosL
+fossil fosL
+fosston fost~
+fosston f{st~
+foster fostP
+fostered fostPd
+fosters fostPz
+fostertown fostPt?n
+foucault fUk{lt
+fought f{t
+fougner fUgnP
+fouke f?k
+foul f?l
+foulke fOlk
+foulmouthed f?lm@Dd
+foulness f?ln6s
+found f?nd
+foundation f?ndAS~
+foundations f?ndAS~z
+founded f?nd6d
+founding f?nd6N
+foundry f?ndr/
+fount f?nt
+fountains f?nt~z
+fouquet fUket
+fouquette fUket
+four RX0
+fouraker f{rAkP
+fournier f{rnEP
+fourscore f{rsk{r
+fourteen RX02Y|
+fourteenth RX02Y|G
+fourth RX0G
+fourths f{rTs
+fowle f?l
+fowler f?lP
+fowles fOlz
+fowley f?lE
+fowlkes fOlks
+fox foks
+foxed fokst
+foxfire foksfIr
+foxglove foksgluv
+foxhole fokshOl
+foxhound foksh?nd
+foxtrot fokstrot
+foxworthy fokswVD/
+foxx f)ks
+frackelton frakLt~
+frackville frakvil
+fraction frakS@n
+fragile frajL
+fragmental fragmentL
+fragmentary fragm~ter/
+fragmentation fragm~tAS~
+fragrance frAgr~s
+frail frAl
+frailty frAlt/
+frame frAm
+framed frAmd
+framework frAmwVk
+framingham framiNham
+france frans
+frances frans6s
+franceschi franseskE
+francestown frans6st?n
+francesville frans6svil
+franchised franCIzd
+franchises franCIz6z
+francine fransEn
+francine's fransEnz
+francines fransEnz
+francis frans6s
+franciscan fransisk~
+francisco fransisk]
+francistown frans6st?n
+francisville frans6svil
+franck fraNk
+francois fransw)
+franconia fraNkOn/@
+frank fraNk
+frankel fraNkL
+frankenstein fraNk~stIn
+frankfort fraNkfPt
+frankfurter fraNkfPdP
+frankfurters fraNkfPdPz
+franklin fraNkl~
+franklinton fraNkl~t~
+frankness fraNkn6s
+franks fraNks
+franktown fraNkt?n
+franny fran/
+franqui fraNkE
+frantically frant6kl/
+fraser frAsP
+frasier frAs/P
+frasure frAZP
+fratercangelo fratPkanj@lO
+fraudulent fr{j6l~t
+fraudulently fr{j6l~tl/
+frausto fr?stO
+frawley fr{l/
+frazeysburg frAz/zbVg
+freakish frEk6S
+freckleton frek@lt@n
+fred fred
+frederica fr6dar6k@
+frederick's fred@r6ks
+fredericks fred@r6ks
+frederico fr6dar6k]
+fredericton fred@r6kt~
+fredericton fredP6kt~
+fredericton fredr6kt~
+fredonia fr6dOny@
+fredregill fredr@g@l
+fredrick fredr6k
+fredricka fredrik@
+fredrickson fredr6ks~
+fredrikstad fredr6kstad
+fredville fredvil
+free frE
+freebie frEbI
+freed frEd
+freedman's frEdm~z
+freedmans frEdm~z
+freedom frEd}
+freedom's frEd}z
+freedomburg frEd@mbVg
+freedoms frEd}z
+freedonia fr/dOny@
+freedonia frEdOny@
+freehand frEhand
+freehold frEhOld
+freelance frElans
+freeloader frElOdP
+freely frEl/
+freeman frEm~
+freeport frEp{rt
+freeport's frEp{rts
+freeports frEp{rts
+freer frEP
+freesia frEZ@
+freestatt frEstat
+freethinker frETiNkP
+freethinkers frETiNkPz
+freeville frEvil
+freeway frEwA
+freeways frEwAz
+freeze frEz
+freiermuth frIPmqT
+freimark frIm)rk
+freker frekP
+fremantle fr/mantL
+fremont frEmont
+french frenC
+frenchtown frenCt?n
+frenchwoman frenCwqm~
+frenzel frenzL
+frenzied frenz/d
+frenzy frenz/
+frequency frEkw~s/
+frequent frEkw~t
+frequently frEkw~tl/
+frerich frerik
+fresh freS
+freshly freSl/
+freshman freSm~
+freshness freSn6s
+freshwater freSw{dP
+fresno frezn]
+freud's fr<dz
+freuds fr<dz
+frew frU
+frewsburg frUzbPg
+fricke fr6k/
+frictionless frikS~l6s
+friday frId/
+friday frIdA
+fridays frIdAz
+fridley fridl/
+fried frId
+frieda fr/Ed@
+frieda frEt@
+friedens frEd~z
+friedl frEd@l
+friedrich frEdr6k
+friedrichsen frEdr6ks6n
+friend frend
+friendlier frendl/P
+friendliness frendl/n6s
+friendly frendl/
+friends frendz
+friendships frendSips
+friendswood frendzwqd
+fries frIz
+friese frEs
+frieze frEz
+fright frIt
+frighten frId~
+frightened frId~d
+frightening frId~n6N
+friis frEz
+frills frilz
+fringe frinj
+fringes frinj6z
+frisbee frizbE
+frisco frisk]
+fritsche fritS
+frivolous frivL@s
+fro frO
+frocks froks
+frog fr{g
+frogmouths fr{gm?Ts
+frolicking frol6k6N
+from frum
+frond frond
+fronds frondz
+front frunt
+frontier fruntEr
+froot frUt
+frost fr{st
+frostbite fr{stbIt
+frostbitten fr{stbid~
+frostburg fr{stbPg
+frostburg fr{stbVg
+frosted fr{st6d
+frosting fr{st6N
+frostproof fr{stprUf
+frosts fr{sts
+frosty fr{st/
+frothingham fr{D6Nham
+frown fr?n
+frowned fr?nd
+frowning fr?n6N
+frowningly fr?n6Nl/
+frozen frOz~
+fruge frUg
+fruit frUt
+fruitcake frUtkAk
+fruitful frUtfL
+fruition frUiS~
+fruitport frUtp{rt
+fruits frUts
+frushour fruS?P
+frustrate frustrAt
+frustrating frustrAd6N
+frustration frustrAS~
+fry frI
+frymoyer frIm<P
+fryrear frIrEr
+fuapau fw)p?
+fuchs fyUks
+fuchsia fyUS@
+fuddle fudL
+fudge fuj
+fudging fuj6N
+fuel fyUL
+fuel fyUl
+fueled fyULd
+fueling fyU6l6N
+fuerbringer fUPbriNP
+fuerstenau fwerst@n?
+fuerstenberge fyPst6nbPg
+fuerte fUwertA
+fuertes fwArtAs
+fuest fwest
+fugate fUg)tA
+fugueroa fUgwerO@
+fujikake fUjEkakE
+fulfilling fLfil6N
+fulfillment fLfilm~t
+full fql
+fullback fqlbak
+fullbright fqlbrIt
+fuller fqlP
+fullerton fqlPt~
+fullington fql6Nt~
+fullness fqln6s
+fullwood fqlwqd
+fully fql/
+fulmer fulmP
+fulness fuln6s
+fulshear fqlS/r
+fulshear fulS/P
+fulton fult~
+fultondale fqlt~dAl
+fultondale fult~dAl
+fultonville fqlt~vil
+fultonville fult~vil
+fumble fumbL
+fumbled fumbLd
+fuming fyUm6N
+fun fun
+funchal fUnS)l
+funchal funCL
+function fuNkS~
+functional fuNkS~L
+functionality fuNkS@nal6d/
+functioning fuNkS~6N
+fund fund
+fundamental fund@mentL
+funded fund6d
+funding fund6N
+funds fundz
+funeral fyUnrL
+fungicides funj6sIdz
+funiak fUn/ak
+funiak fyUn/ak
+funiak fyUnyak
+funkstown fuNkst?n
+funnel funL
+funniest fun/6st
+funny fun/
+fuqua fUkU@
+fuquay fukwA
+fur fV
+furies fyUr/z
+furlough fVlO
+furman fVm~
+furnish fVn6S
+furniture fVn6CP
+furniture's fVn6CPz
+furnitures fVn6CPz
+furrier fV/P
+furriers fV/Pz
+furtak fPttak
+further fVDP
+furthering fVDP6N
+furthers fVDPz
+furuya f@rUw@
+fury fyUr/
+fuselage fyUsLoZ
+fushimi fUSimE
+fusion fyUZ~
+fuss fus
+fussy fus/
+future fyUCP
+futures fyUCPz
+futuristic fyUCPist6k
+fuzzer fuzP
+fuzzier fuz/P
+g g
+g jE
+gaastra gostr@
+gab gab
+gabardines gabPdEnz
+gabehart gAbh)rt
+gabel gAb@l
+gabled gAbLd
+gables gAbLz
+gabon g@bOn
+gabon gAb~
+gaborone g)b@rOn/
+gaborone gabr~
+gabriel gAbr/L
+gabrielli gabrEelE
+gacek gaCek
+gackle gakL
+gadewoltz gAd@wOltz
+gadfly gadflI
+gadget gaj6t
+gadgets gaj6ts
+gael gAl
+gafford gafPd
+gag gag
+gagel gag@l
+gaggle gagL
+gaglione gaglEOnE
+gagner gagnP
+gagnier ganyEr
+gagnon gany@n
+gaiety gA6d/
+gail gAl
+gaily gAl/
+gain gAn
+gained gAnd
+gaines gAnz
+gainesboro gAnzbP]
+gainesboro gAnzbV]
+gainesville gAnzvil
+gainful gAnfL
+gains gAnz
+gait gAt
+gajate g@j)tE
+galagher gal@gP
+galan g@l)n
+galarno g@l)rn]
+galarus gal@r@s
+galbraith g{lbr@T
+galbreath g)lbreT
+galeana g)lE)n@
+galeano g)lE)nO
+galena g@lEn@
+galesburg gAlzbPg
+galesburg gAlzbVg
+galesville gAlzvil
+gall g{l
+gallager gal@gP
+gallagher gal@gP
+gallant gal~t
+gallantry gal~tr/
+gallatin gal@t~
+gallaway g{l@wA
+gallbladder g{lbladP
+gallegos gIAgOs
+galleria g@lEr/@
+gallery gal@r/
+galligher gal6gP
+gallihugh gal6hyU
+gallon gal~
+gallons gal~z
+gallop gal@p
+gallup gal@p
+galore g@l{r
+galosh galoS
+galoshes galoS6z
+galt g{lt
+galva galv@
+galvanic galvan6k
+galveston galv6st~
+galway galwA
+galway g{lwA
+gamaliel g@mAl/L
+gambale g@mb)lE
+gamble gambL
+gambling gambl6N
+gambrills gambril6s
+gambrills gambrilz
+game gAm
+gamekeeper gAmkEpP
+gamel gamL
+gamemanship gAmm~Sip
+games gAmz
+gamesmanship gAmzm~Sip
+ganado g@n)d]
+ganado g@nod]
+gandhi gond/
+gandy gand/
+ganesh g@neS
+gang gaN
+gangbusters gaNbustPz
+gange gaN
+gangelhoff gaNg@lh{f
+gangi ganjE
+gangl gaNg@l
+gangplank gaNgpl6Nk
+gangsters gaNgstPz
+ganiron ganIPn
+gannet gan6t
+gannett gan6t
+gans ganz
+ganske ganskE
+ganttown gantt?n
+gap gap
+gaping gAp6N
+gaps gaps
+garage g@roZ
+garages g@roZ6z
+garate g@r)tE
+garbage g)rb6j
+garbages g)rb6j6z
+garber g)rbP
+garcia g)rsE@
+garcon g)rs{n
+garden g)rd~
+gardena g)rdEn@
+gardendale g)rd~dAl
+gardener g)rd~P
+gardeners g)rd~Pz
+gardens g)rd~z
+gardenville g)rd~vil
+gardiner g)rd~P
+gardner g)rdnP
+gardners g)rdnPz
+gareth gar@T
+garfield g)rfEld
+gargantuan g)rganCU~
+gargiulo g)rjyUlO
+gargoyle g)rg<l
+garland g)rl~d
+garlic g)rl6k
+garments g)rm~ts
+garnache g)rnaS
+garner g)rnP
+garnett g)rn6t
+garnished g)rn6St
+garre g)r
+garretson gar6ts~
+garrett gar6t
+garrison gar6s~
+garroutte g@r?t
+garry ger/
+garske g)rskE
+garth g)rT
+gartland g)rtland
+gary ger/
+garyburg g,r/bVg
+garysburg g,r/zbVg
+garysburg gar/zbVg
+gas gas
+gascoigne gask<n
+gasconade gask@nAd
+gashes gaS6z
+gaskill gaskil
+gasman gasman
+gasoline gas@lEn
+gasped gaspt
+gassel gasL
+gassing gas6N
+gastonia g@stOn/@
+gastonia gastOny@
+gastronomy g@stron@m/
+gate gAt
+gatekeeper gAtkEpP
+gateley gAtlE
+gately gAtlE
+gatepost gAtpOst
+gates gAts
+gateway gAtwA
+gatewood gAtwqd
+gather gaDP
+gathered gaDPd
+gatherers gaDPPz
+gatheright gaD@rIt
+gathering gaDP6N
+gathers gaDPz
+gatos gAd]z
+gaubert g{bPt
+gauche gOS
+gauci g?CE
+gaudet g{tA
+gaudy g{d/
+gauge gAj
+gaukroger g{kr)jP
+gauley g?l/
+gaunt g{nt
+gause g?s
+gautier g{d/A
+gauze g{z
+gave gAv
+gavin gav~
+gavula gavyUl)
+gawking g{k6N
+gawrys g?rEz
+gay gA
+gaylesville gAlzvil
+gaze gAz
+gazebo g@zEb]
+gazed gAzd
+gazelle g@zel
+gazing gAz6N
+geach gEC
+gear gEr
+gearbox gErboks
+gearhart gErh)rt
+gearheart gErh)rt
+gearn gern
+gearon gEr@n
+gearshift gErSift
+gearwheel gErwEl
+geary gErE
+gebel geb@l
+gebhard gebh)rd
+gebhardt gebh)rt
+gebhart gebh)rt
+geck gek
+geckles jek@lz
+geddes get6s
+geddie gedE
+geddings getiNz
+geddis getis
+gede gedE
+gederman gedPman
+gedye getE
+geeding gEtiN
+geeing jE6N
+geen gEn
+geer gEr
+geese gEs
+geeting gEtiN
+geff gef
+geff jef
+geffert gefPt
+gegenheimer geg@nhImP
+gehl gel
+gehle gel
+gehler gelP
+gehlert gelPt
+gehling geliN
+gehm gem
+gehman gem6n
+gehr ger
+gehrer gerP
+gehret gAr6t
+gehrig gAr6g
+gehrig ger6g
+gehring geriN
+gehrke gPkE
+gehrki gerkE
+gehrlein gerlAn
+gehrmann gArm@n
+gehron gAr@n
+geib gEb
+geibel gEb@l
+geidl gId6l
+geidner gIdnP
+geier gIP
+geigel gIg@l
+geiger gIgP
+geigle gIg@l
+geil gEl
+geimer gImP
+geis gEs
+geiselman gIs@lm6n
+geiser gIzP
+geisler gIslP
+geiss gIs
+geissler gIslP
+geist gIst
+geiszler gIslP
+geitner gItnP
+geitz gEtz
+gel jel
+gelb gelb
+gelbart gelb)rt
+gelber gelbP
+gelder geldP
+gelfand gelf@nd
+gelfond gelf)nd
+geller gelP
+gellert gelPt
+gellinger gelinjP
+gellings geliNz
+gelman gelm@n
+geltz geltz
+gelvin gelvin
+gem jem
+gema jem@
+gemberling gembPliN
+gemes jEmz
+gemstones jemstOnz
+genco geNkO
+gene jEn
+general jenrL
+general's jenrLz
+generalao jen@r@llaO
+generalize jenr@lIz
+generalized jenr@lIzd
+generally jenr6l/
+generals jenrLz
+generalship jenrLSip
+generated jen@rAd6d
+generates jen@rAts
+generation jen@rAS~
+generations jen@rAS~z
+generator jen@rAdP
+generosity jen@ros6d/
+generous jen@r@s
+generously jen@r@sl/
+genesee j6nEzE
+genet Z@nA
+geneva j6nEv@
+genevieve jen@vEv
+genevive jen@vEv
+gengler geNglP
+genial jEn/L
+genius jEny@s
+genoa jen]@
+genqing gunCEN
+genqing jeNkEN
+genre Zonr@
+genres Zonr@z
+genta gent@
+gentges gentg@s
+gentile jentIl
+gentile's jentIlz
+gentiles jentIlz
+gentility j~til6d/
+gentle jentL
+gentlefolk jentLfOk
+gentleman jentLm~
+gentlemen jentLm~
+gentlemen's jentLm~z
+gentlemens jentLm~z
+gentleness jentLn6s
+gentles jent6ls
+gently jentl/
+gentry jentr/
+gentsy gentsE
+gentz gents
+gentzler gentslP
+genuine jenyU~
+genuinely jenyU~l/
+geoff jef
+geoghegan jyOg@g@n
+geographical jE@graf6kL
+geography j/ogr@f/
+geologic jE@loj6k
+geological jE@loj6kL
+geoly gOlE
+geometric jE@metr6k
+geometry j/om6tr/
+geophysical jE]fiz6kL
+geopolitics jE]pol6tiks
+georgann j{rjan
+george j{rj
+georgeann j{rjan
+georgeanna j{rjan@
+georges j{rj6s
+georgetown j{rjt?n
+georgette j{rjet
+georgi j{rj/
+georgia j{rj@
+georgiadis j{rjad6s
+georgiana j{rj/on@
+georgiann j{rjEan
+georgianna j{rdZEan@
+georgianne j{rjEan
+georgie j{rj/
+georgopoulos j{rj)p@l@s
+gepp gep
+gerald jarLd
+geraldine jarLdEn
+geraldo h@r)ldO
+gerber jVbP
+gerberich gPbP6C
+gerbert jVbPt
+gerbil jVbL
+gerda gPt@
+gerdel gPt@l
+gerdeman gPdm6n
+gerdes gPt6s
+gerdiman gerd@m@n
+gerdis gerdis
+gere gEr
+gere jEr
+geren jEr~
+gerety gAr6tE
+gergel jPg@l
+gergely gPjlE
+gergen jPg6n
+gerhardt gerh)rt
+gerhart gArh)rt
+gerhold gPhOld
+gerich gerik
+gering geriN
+geringer gArinjP
+gerke gPkE
+gerlach gPl)k
+gerland gerl@nd
+gerling gPliN
+germ jVm
+german jVm~
+germans jVm~z
+germantown jVm~t?n
+germany jVm~/
+germanys jVm~/z
+germination jVm6nAS~
+germproof jVmprUf
+gerney gernE
+geronimo j@ron6m]
+gerraro g@r)rO
+gerrero g@rArO
+gerrity ger6tE
+gerry jer/
+gershenson gPS6ns@n
+gershkovich gPSk@viC
+gershon jVS~
+gershwin jVSwin
+gerst gPst
+gerstein gPstEn
+gerstenberger gPst@nbPgP
+gerstle gPs@l
+gerteisen gPtIz@n
+gertel gPt@l
+gertelman gPt@lmin
+gertha gPT@
+gerthung gPTuN
+gertie gPtE
+gertner gPtnP
+gertrud gPtrUd
+gertrude gVtrUd
+gertrudis gPtrUt6s
+gertsch gPC
+gertude gPtUd
+gertz gPtz
+gerveler gPv@lP
+gerwin gPwin
+gerz gPtz
+gesamondo ges@m)ndO
+geske geskE
+gessner geznP
+gest gest
+gestether gesteDP
+gesture jesCP
+get get
+getaways get@wAz
+getchman geCm6n
+gethers geDPz
+gets gets
+getsinger getsiNP
+getson gets@n
+gett get
+gettel get@l
+gettelman get@lm@n
+gettens get@nz
+getter getP
+gettig get6g
+getting ged6N
+gettinger get~jP
+gettis getis
+gettle get@l
+gettman getm6n
+getts gets
+getty getE
+gettys getEs
+gettysburg get/zbVg
+gettysburg jed/zbVg
+getz getz
+getzlaff getslaf
+getzschman getSm@n
+geurts g@rtz
+gevara g@v)r@
+geyer gIP
+geyman gAm6n
+gezalyan gez@lEan
+ghea gE@
+ghebremicael gebr@mIk@l
+ghettos ged]z
+gholar gOlP
+ghosh ghOS
+ghost gOst
+ghostbusters gOstbustPz
+ghostlike gOstlIk
+ghostwrite gOstrIt
+ghoul gUl
+gia jE@
+giacalone dZy)k@lOnE
+giacchi gEakE
+giaccone dZy@kOnE
+giacobbe dZy@k)bE
+giambattista jambatEst@
+giampaolo dZamp?lO
+giangregorio jangreg{rEO
+giangrosso jangr)sO
+gianno jIanO
+giannone dZy@nOnE
+giant jI~t
+giants jI~ts
+gibbins gib~z
+gibbon gib~
+gibeau ZEbO
+gibeon gib/~
+gibraltar j6br{ltP
+gibsland gibzland
+gibsland jibzland
+gibson gibs~
+gibsonburg gibs~bVg
+gibsonia g6bsOn/@
+gibsonia g@bsOn/@
+gibsonville gibs~vil
+gideon gidE6n
+gierke gErkE
+gierlach gErl)k
+giffen gif~
+gifford giffPd
+gift gift
+gifted gift6d
+gifts gifts
+giftwrapping giftwr@p6N
+gig gig
+gigante j6gantE
+gigantic jIgant6k
+gigantino jEg@ntEnO
+giggle gigL
+giggly gigl/
+gigi jEjE
+gigliotti jElE)tE
+gignac ginyak
+gilberg gilbVg
+gilberton gilbPt~
+gilbertsville gilbPtsvil
+gilbreath gilbreT
+gilchrist gilkr6st
+gilcrease gilkrEs
+gildford gildfPd
+gilead gil/6d
+gilead gil/ad
+giles jIlz
+gilgore gilg{r
+gill gil
+gillam gil}
+gillespie gilesp/
+gillette j6let
+gilley gil/
+gillian gily~
+gillies gilEz
+gilligan gil6g~
+gillsville gilzvil
+gilman gilm~
+gilmanton gilm~t~
+gilmore gilm{r
+gilpatrick gilpatr6k
+gilreath gilrET
+gilroy gilr<
+gilsum gils}
+giltner giltnP
+gimmicks gim6ks
+gin jin
+gina jEn@
+gindlesperger gind@lspPjP
+ginette j@net
+ginger jinjP
+gingerbread jinjPbred
+gingerich giNgriC
+gingerly jinjPl/
+gingersnap jinjPsnap
+gingery jinjPE
+gingham giN}
+gingivitis giNg6vId6s
+ginny jin/
+gino jEnO
+ginsburg ginzbPg
+gionta jE)nt@
+giorgianni jOrjEanE
+giorgio j{rjyO
+giraffes j@rafs
+giraldo j@r)ldO
+girard j@r)rd
+girardville j6r)rdvil
+girardville j@r)rdvil
+girdle gVdL
+girl gVl
+girlfriend gVlfrend
+girlhood gVlhqd
+girlie gVl/
+girlishly gVl6Sl/
+girls gVlz
+girone jIrOn
+giroux gErO
+gisela j6sel@
+gisele j6sel
+giselle j6sel
+gish giS
+gisi jEsE
+gittings gitiNz
+giulioli jUlEOlE
+giuseppe dZ@sepE
+give giv
+giveaways giv@wAz
+given giv~
+giveness givn6s
+givenness giv~n6s
+givens giv6nz
+giver givP
+gives givz
+givhan giv@n
+givin giv~
+giving giv6N
+givins giv~z
+glacier glASP
+glaciers glASPz
+glad glad
+gladden glad~
+glade glAd
+gladewater glAdw{dP
+gladewater glAdw{tP
+gladhill gladhil
+gladiator glad/AdP
+gladstone gladst~
+gladwin gladwin
+gladwin gladw~
+gladys glat6s
+glance glans
+glanced glanst
+gland gland
+glares gl,rz
+glaring gl,r6N
+glarius gl,r/@s
+glarus glar@s
+glas glas
+glas gloz
+glasgow glazgO
+glass glas
+glassberg glasbVg
+glassblowing glazbl]6N
+glassboro glasbV]
+glassbrook glasbrqk
+glasses glas6z
+glassford glasfPd
+glassful glasfL
+glasshouse glash?s
+glassmeyer glasmIP
+glassner glasnP
+glaze glAz
+glazebrook glAzbrqk
+glazed glAzd
+glazing glAz6N
+gleam glEm
+gleamed glEmd
+gleaming glEm6N
+gleason glEs~
+gleason's glEs~z
+gleasons glEs~z
+glebe glEb
+glee glE
+gleefully glEfL/
+gleich glIk
+glen glen
+glenarm glen)rm
+glenbrook glenbrqk
+glencoe glenkO
+glencoe glenk]
+glencove glenkOv
+glenden glend~
+glenford glenfPd
+glenham glenham
+glenmont glenmont
+glenmora glenm{r@
+glenns glenz
+glenolden glcnOld~
+glenolden glenOld~
+glenpool glenpUl
+glenrock glenrok
+glens glenz
+glenview glenvyU
+glenville glenvil
+glenwillard glenwilPd
+glenwood glenwqd
+glided glId6d
+glidewell glIdwel
+glimmer glimP
+glimpse glimps
+glimpsed glimpst
+glimpses glimps6z
+glisan glIs~
+glistened glis~d
+glistening glis~6N
+glo glO
+global glObL
+globally glObL/
+globe glOb
+globes glObz
+globetrotter glObtrodP
+globs globz
+glomar glOmP
+gloom glUm
+gloomier glUm/P
+gloomily glUmL/
+gloomingly glUm6Nl/
+gloomy glUm/
+glore gl{r
+gloria gl{r/@
+glories gl{r/z
+glorieta gl{r/ed@
+glorieta gl{r/et@
+glorification gl{r6f6kAS~
+glorified gl{r6fId
+glorious gl{r/@s
+glory gl{r/
+gloss gl{s
+glossary glos@r/
+glossy gl{s/
+gloucester glostP
+gloucester gl{stP
+glouster gl?stP
+glouster gl{stP
+glove gluv
+glover gluvP
+gloversville gluvPzvil
+gloverville gluvPvil
+gloves gluvz
+glow glO
+glowed glOd
+glows glOz
+glucose glUkOs
+glue glU
+gluttons glud~z
+glynn glin
+gnabah n)b)
+gnadenhutten nad~hud~
+gnau n{
+gnawed n{d
+gneiser nIzP
+gnoza nOz@
+go gO
+goads gOdz
+goal gOl
+goalkeeper gOlkEpP
+goalpost gOlp6st
+goals gOlz
+goaltender gOltendP
+goat gOt
+goats gOts
+goatskin gOtskin
+gobblers goblPz
+gocek g)Cek
+god god
+godbe g)dbE
+godchild godCIld
+goddaughter godd{dP
+godfather's godfoDPz
+godfathers godfoDPz
+godfrey godfrE
+godmother godmuDP
+godparent godpar~t
+godzilla godzil@
+goecke gOkE
+goedicke gOt6kE
+goeing gOwiN
+goerges g{rj6z
+goes gOz
+goessel gOsL
+goessl gOss@l
+goettl gOt@l
+goetz getz
+goffstown gofst?n
+goffstown g{fst?n
+gogerty gOgPtE
+goin g<n
+going gO6N
+goings gO6Nz
+goland gol~d
+gold gOld
+goldade gOld)dE
+goldbeck gOldbek
+goldberg gOldbVg
+goldbrick gOldbr6k
+goldcrest gOldkrest
+golden gOld~
+goldfarb gOldf)rb
+goldfarb gOldfPb
+goldfinches gOldfinC6z
+goldfish gOldfiS
+goldhammer gOldhamP
+goldilocks gOld/loks
+goldmine gOldmIn
+goldring gOldr6N
+goldsberry gOldzber/
+goldsboro gOldzbP]
+goldsboro gOldzbV]
+goldsborough gOldzbV]
+goldsby gOldzb/
+goldsmith gOldsmiT
+goldsmith's gOldsmiTs
+goldsmiths gOldsmiTs
+goldson gOlds~
+goldstein gOldstEn
+goldston gOldst~
+goldstone gOldstOn
+goldthwait gOldTwAt
+goldwire gOldwIr
+goleman gOlm@n
+golf golf
+golf's golfs
+golfed golft
+golfing golf6N
+golfs golfs
+goliad gOl/6d
+goliad gOl/ad
+gomer gOmP
+gone g{n
+gongs g{Nz
+gonna gun@
+gonzalas g)nzal@s
+gonzale g@nz)lA
+gonzales g)nz)les
+gonzalez gonz)lAs
+gonzalez g~zol6s
+gonzalez g~zolcs
+gonzalo g@nz)lO
+goo gU
+goochland gUCland
+goochland gUCl~d
+good gqd
+goodale gqtAl
+goodall gqd{l
+goodbread gqdbred
+goodbye gqdbI
+goode gqd
+goodell gqdel
+gooden gqt6n
+goodenough gqdEnuf
+goodenow gqdn?
+goodfellow gqdfel]
+goodfriend gqdfrend
+goodheart gqdh)rt
+goodhue gqdhyU
+goodiel gqdy@l
+goodies gqd/z
+goodin gqd6n
+gooding gqtiN
+goodkin gqdk6n
+goodknight gqdnIt
+goodland gqdland
+goodly gqdlE
+goodman gqdm6n
+goodman gqdm~
+goodmanson gqdm@ns@n
+goodner gUdnP
+goodness gqdn6s
+goodnight gqdnIt
+goodnow gqdn?
+goodrich gqdriC
+goodrich's gqdriC6z
+goodrichs gqdriC6z
+goods gqdz
+goodsell gqdsel
+goodsite gqdsIt
+goodson gqds@n
+goodspeed gqdspEd
+goodsprings gqdspriNz
+goodwill gqdwil
+goodwin gqdwin
+goodyear gqdyEr
+goodyear's gqdyErz
+goodyears gqdyErz
+goof gUf
+goofed gUft
+goofs gUfs
+goose gUs
+gooseberry gUsber/
+goosefish gUsfiS
+gooseflesh gUs6fl6S
+goosefoot gUsfqt
+gooseneck gUsnek
+gopher gOfP
+gophers gOfPz
+gordon g{rd~
+gore g{r
+gorge g{rj
+gorged g{rjd
+gorgeous g{rj@s
+gorilla g@ril@
+gorillas g@ril@z
+gorman g{rm~
+gormley g{rml/
+gorse g{rs
+gosh goS
+goshen goS~
+gosling gozl6N
+gospel gospL
+gospels gospLz
+gosport gosp{rt
+gossett gos6t
+got got
+gotcher goCP
+gotham goT}
+gothenberg gOT~bVg
+gothenberg goT~bVg
+gothenburg gOT~bVg
+gothenburg goT~bVg
+gotten god~
+gottlieb g)tlEb
+gottula g{tyUl@
+gouging g?j6N
+goulash gUlaS
+gould gUld
+gouldsboro gUldzbP]
+goulet gUlA
+gourley g{rlE
+gourmet g{rmA
+gourmets g{rmAz
+govern guvPn
+governing guvPn6N
+government guvPnm~t
+governmental guvPnmentL
+governments guvPnm~ts
+governor guvPnP
+gowan g?6n
+gowen g?6n
+gower g?P
+gowns g?nz
+gra gro
+grab grab
+grace grAs
+graceful grAsfL
+gracefully grAsfL/
+gracemont grAsmont
+gracious grAS@s
+grade grAd
+grader grAdP
+grades grAdz
+gradual grajwL
+gradually grajU6l/
+graduate grajU6t
+graduated grajUAd6d
+graduates grajU6ts
+graduating grajUAd6N
+graduation grajUAS~
+graf graf
+graff graf
+graford grAfPd
+graford grofPd
+grafton graft~
+graham grA}
+grahan gr)n
+grain grAn
+grainfield grAnfEld
+grains grAnz
+grainton grAnt~
+grambling grambl6N
+gramercy gramPs/
+grammarian gr@m,r/~
+grammy gram/
+granada gr@nod@
+granados gr@n)dOs
+granary gran@r/
+granberry granber/
+granbury granbP/
+granbury granber/
+grand grand
+grand_forks grandf{rks
+grand_isle grandIl
+grandbaby grandbAb/
+grandberry grandber/
+grandberrys grandb,r/z
+grandchamp grandCamp
+grandchild grandCIld
+grandchildren grandCildr~
+grandchildren's grandCildr~z
+grandchildrens grandCildr~z
+granddaddy granddad/
+granddaughters grandd{dPz
+grande grand
+grandfalls grandf{lz
+grandfather grandfoDP
+grandjean grandjEn
+grandkids grandkidz
+grandma gram@
+grandma's gram@z
+grandmas gram@z
+grandmother grandmuDP
+grandmotherly grandmODPl/
+grandnephew grandnefyU
+grandpa gramp@
+grandparent grandpar~t
+grandparents grandpar~ts
+grandsons grandsunz
+grandstaff grandstaf
+grandview grandvyU
+grandville grandvil
+grange grAnj
+granger grAnjP
+grangeville grAnjvil
+granstrom granstr}
+grant grant
+grants grants
+grantsboro grantsbP]
+grantsville grantsvil
+grape grAp
+grapefruits grApfrUts
+grapes grAps
+grapeshot grApSot
+grapeville grApvil
+grapevine grApvIn
+grapevines grApvInz
+graph graf
+graphic graf6k
+graphical graf6kL
+graphics graf6ks
+grass gras
+grasshopper grashopP
+grasshoppers grashopPz
+grasslands graslandz
+grasston grast~
+grateful grAtfL
+grattelo gr@telO
+gratz grats
+gravedigger grav6d6gP
+gravel gravL
+gravely grAvl/
+graves grAvz
+gravette gr@vet
+gravette gravct
+graveyard grAvy)rd
+gravies grAv/z
+gravitate grav6tAt
+gravitational grav6tAS~L
+gravitationally grav6tAS~L/
+gravity grav6d/
+grawe gr{
+gray grA
+graybeard grAbErd
+grayes grAz
+graying grA6N
+grayish grA6S
+grayling grAl6N
+grays grAz
+grayslake grAzlAk
+grayson grAs~
+graysville grAzvil
+grazing grAz6N
+grazioplene gr)tzEOplAn
+grazyna gr@zEn@
+grease grEs
+greasing grEs6N
+greasy grEs/
+great grAt
+greater grAdP
+greatest grAd6st
+greathouse grAth?s
+greatly grAtl/
+greatneck grAtnek
+grebe grEb
+greece grEs
+greedily grEd6l/
+greedy grEd/
+greek grEk
+green grEn
+green_lake grEnlAk
+greenacres grEnAkPz
+greenbay grEnbA
+greenbelt grEnbelt
+greenberg grEnbVg
+greenburg grEnbVg
+greendale grEndAl
+greeneville grEnvil
+greenfield grEnfEld
+greenhill grEnhil
+greenhoe grEnhO
+greenhorn grEnh{rn
+greenhurst grEnhVst
+greenhut grEnhut
+greenland grEnl~d
+greenlawn grEnl{n
+greenleaf grEnlEf
+greenlief grEnlEf
+greenness grEnn6s
+greenock grEnok
+greenpeace grEnpEs
+greenport grEnp{rt
+greensboro grEnzbV]
+greensboro grEnzbur]
+greensburg grEnzbVg
+greenspan grEnspan
+greentown grEnt?n
+greenvale grEnvAl
+greenville grEnvil
+greenwald grEnw{ld
+greenwood grEnwqd
+greer grEr
+greet grEt
+greeted grEd6d
+greeting grEd6N
+greetings grEd6Nz
+greg greg
+greger grEgP
+gregersen gregPs@n
+gregerson gregPs@n
+gregoire gregw)r
+gregor gregP
+gregoria gr6g{r/@
+gregorian gr6g{r/~
+gregory greg@r/
+gregory's gregP/z
+gregorys gregP/z
+gregware gregwAr
+grenada gr@nAd@
+grenades gr6nAdz
+grenloch grenl6C
+grenloch grenlok
+grennan gren~
+gresaca gr6sok@
+gresham greS}
+gretchen greC~
+gretzinger gretsiNP
+grew grU
+grey grA
+greyhound's grAh?ndz
+greyhounds grAh?ndz
+griddlecake gridLkAk
+gridley gridl/
+grieco grEkO
+grier grir
+griesinger grEs6NP
+grieve grEv
+griffin grif~
+griffins grif~z
+griffith grif@T
+griffiths grif@Ts
+grifton grift~
+griggsville grigzvil
+grill gril
+grills grilz
+grim grim
+grimes grImz
+grimesland grImzl~d
+grimmer grimP
+grin grin
+grind grInd
+grindstone grIndstOn
+grinned grind
+grip grip
+grisly grizl/
+grist grist
+griswold griswqld
+grizzly grizl/
+groberg grObPg
+grobes grObz
+grocer grOsP
+groceries grOsr/z
+grocery grOsr/
+groesbeck grOzbek
+groin gr<n
+groom grUm
+groomes grUmz
+grooviest grUv/6st
+groseclose grOsklOs
+grosman grOsm6n
+gross grOs
+grosse grOs
+grossman grOsm~
+grotesque gr@tesk
+groton grOt~
+groton grod~
+groton grot~
+grotzinger gr)ts6NP
+grouch gr?C
+grouchy gr?C/
+groulx grUl
+ground gr?nd
+groundbreaker gr?ndbrAkP
+groundhog gr?ndh{g
+groundkeeper gr?ndkEpP
+groundnut gr?ndnut
+grounds gr?ndz
+groundwork gr?ndwVk
+group grUp
+groups grUps
+grove grOv
+groveoak grOv/Ok
+groveoak grOvOk
+grover grOvP
+groves grOvz
+grovetown grOvt?n
+grow grO
+grower grOP
+growers grOPz
+growing grO6N
+growl gr?l
+growled gr?ld
+growling gr?l6N
+growls gr?lz
+grown grOn
+grownups grOnups
+grows grOz
+growth grOT
+growths grOTs
+grubworm grubwVm
+grudge gruj
+grudges gruj6z
+grueninger grUniNP
+gruffness grufn6s
+grumbled grumbLd
+grumbles grumb@lz
+grumbling grumbl6N
+grumman grumm~
+grunewald grUnw{ld
+grunt grunt
+gruss grus
+grygla grigl@
+grzelak grelak
+gsm jEesem
+guadagno gw@d)nyO
+guadagnolo gw)d6nyOlO
+guadalajara gw)d@l@h)r@
+guadalajara gwodL@hor@
+guadalcanal gw)dLk@nal
+guadalcanal gw@dalk~L
+guadalupe gw)d@lUpA
+guadeloupe gw)d@lUp
+guadeloupe gwod6lUp
+guanajuato gw)n@hw)t]
+guanajuato gwon@wod]
+guarantee gar~tE
+guaranteed gar~tEd
+guaranteeing gar~tE6N
+guarantees gar~tEz
+guard g)rd
+guardfish g)rdfiS
+guardians g)rd/~z
+guardroom g)rdrUm
+guards g)rdz
+guardsman g)rdzm~
+guarnieri gw)rnEerE
+guarno gw)rnO
+guarriello gw)rEelO
+guatemala gwod6mol@
+guavas gwov@z
+guay gwI
+guccione gUCEOnE
+guenther gunTP
+guernsey gVnz/
+guerre g,r
+guerrilla g@ril@
+guerrillas g@ril@z
+guertin gertin
+guess ges
+guessed gest
+guesses ges6z
+guesthouse gesth?s
+guests gests
+guethle gUT6l
+gueydan gAd~
+gugel gUg@l
+gugerty gUgPtE
+guidance gId~s
+guide gId
+guidebook gIdbqk
+guided gId6d
+guidepost gid6p6st
+guides gIdz
+guido gwEtO
+guignard giny)rd
+guilder gildP
+guildsboro gildzbV]
+guiles gIlz
+guilford gilfPd
+guillaume gEOm
+guillermina gEArmEn@
+guillermo gEArmO
+guilt gilt
+guiltless giltl6s
+guiltlessly giltl6sl/
+guilty gilt/
+guiney ginE
+guinness ginn6s
+guitarist g6tor6st
+gulf gulf
+gulfport gulfp{rt
+gulfs gulfs
+gulfstream gulfstrEm
+gulley gul/
+gullibility gul6bil6d/
+gullies gul/z
+gully gul/
+gulps gulps
+gum gum
+gumaer gUmAr
+gumdrop gumdrop
+gummersheimer gumPSImP
+gums gumz
+gun gun
+gunawan gun@w)n
+gundelach gund@lak
+gunfighter gunfIdP
+gunflint gunflint
+gunman gunm~
+gunmen gunm~
+gunnison gunnIz~
+gunnysack gun/sak
+gunplay gunplA
+gunpoint gunp<nt
+gunpowder gunp?dP
+gunrunner gunrunP
+guns gunz
+gunslingers gunslinjPz
+gunsmith gunsmiT
+gunstocking gunstok6N
+gunstream gunstrEm
+guppies gup/z
+gurdon gVd~
+gurgle gVgL
+gurivireddy g@r6v6redE
+gurivireddy gUr6v6redE
+gurnee gVnE
+gurney gVn/
+gus gus
+gusewelle gUswel
+gushed guSt
+gustafson gUst)fs@n
+gustafsson gustafs@n
+gustaveson gUst)vs@n
+gustitus gustIt@s
+guston gust~
+guthrie guTr/
+gutknecht gUtnekt
+gutmann gutm~
+guts guts
+guttenberg gUt~bVg
+guttenberg gud~bVg
+guttman gutm~
+guy gI
+guys gIz
+guzzlers guzlPz
+gwen gwen
+gwinnett gwin6t
+gwyneth gwin6T
+gwynn gwin
+gyles jIlz
+gyllensten gil@nst@n
+gym jim
+gymnasiums j@mnAz/}z
+gymnasts jimn6sts
+gypsum jips}
+gyro jIr]
+gyrocompass jIr@komp6s
+gyroscope jIr]skOp
+h AC
+h h
+ha ho
+haag hAg
+haberlach habPlak
+haberstroh habPstrO
+habit hab6t
+habits hab6ts
+habitual h@biCwL
+hach h)k
+hachting haktiN
+hacked hakt
+hackenberg hak~bVg
+hackett hak6t
+hackford hakfPd
+hackleburg hakLbVg
+hackleman hak@lm6n
+hackler haklP
+hackney hakn/
+hacksaw haks{
+had had
+hadaller had@lP
+haddad h@t)d
+haddenfield had~fEld
+haddington had6Nt~
+haddonfield had~fEld
+hadesty hadestE
+hadfield hadfEld
+hadges haj6s
+hadley hadl/
+hadn't had~t
+hadnt had~t
+haefele hAf@lE
+hafer hAfP
+haferkamp hafPkamp
+hagaman hog@m~
+hagans hAg6nz
+hage hAg
+hagebusch hAgbqS
+hagemann hAjm@n
+hagemeyer hAjmIP
+hagenbuch hAg@nbyUk
+hager hAjP
+hagerhill hAgPhil
+hagerhill hAjPhil
+hagerman hAjPm~
+hagerstown hAjPzt?n
+hagerty hagPtE
+hagfish hagfiS
+haggard hagPd
+haggermaker hagPmAkP
+haggerton hagPt@n
+hagie hAgE
+hagin hag@n
+hagins hag6ns
+hagist hag6st
+hagler hAglP
+hagner hagnP
+hagood h)gqd
+hague hAg
+hagy hAgE
+hahira h)Ir@
+hahnville h)nvil
+hahnville honvil
+haig hAg
+haight hAt
+hail hAl
+hailed hAld
+haileyville hAl/vil
+hails hAlz
+hailstorm hAlst{rm
+hainesport hAnzp{rt
+hainesworth hAnzwPT
+hainsville hAnzvil
+hair h,r
+hairbrush h,rbruS
+haircut h,rkut
+hairdo h,rdU
+hairdos h,rdUz
+hairdresser h,rdresP
+haired hard
+hairier h,r/P
+hairsplitter h,rsplidP
+hairston h,rst~
+hairstyle h,rstIl
+haiti's hAd/z
+haitians hAS~z
+haitis hAd/z
+hal hal
+hale hAl
+haledon hAld~
+haledon hal6d~
+halen hAl~
+haley hol/
+half haf
+halfacre hafAkP
+halfback hafbak
+halferty hafPtE
+halfheartedness hafh)rd6dn6s
+halfhill hafhil
+halfmann hafm@n
+halfway hafwA
+halifax hal6faks
+hall h{l
+hallahan hal@h~
+hallandale hal~dAl
+halleck hal6k
+hallelujah hal6lUy@
+hallemeyer h{lmIP
+halliday h)l6tA
+halliwell hal/wel
+hallmark h{lm)rk
+hallock halok
+halloween hal]En
+hallsville h{lzvil
+halltown h{lt?n
+hallucinate h@lUs6nAt
+hallum hal}
+hallway h{lwA
+halmstad halmst6d
+halmstad halmstad
+halpern halpPn
+halprin halpr~
+halsey h{ls/
+halston halst~
+halt h{lt
+halting h{lt6N
+haltom h{lt}
+halves havz
+halvorsen halvPs6n
+halvorson halvPs@n
+ham ham
+hama ham@
+hama hom@
+hamacher hamAkP
+hamamatsu h)m@m)tsU
+hamamatsu ham@matsU
+hambleton hamb@lt6n
+hambly hamblE
+hamburg h)mbqrg
+hamburg hambPg
+hamburg hambVg
+hamburger hambVgP
+hamby ham/
+hamby hambE
+hamden hamd~
+hamed h)med
+hamersville hAmPzvil
+hamette h@met
+hamilton hamLt~
+hamilton's hamLt~z
+hamiltons hamLt~z
+hamlet haml6t
+hammel hamL
+hammer hamP
+hammerle hamPlE
+hammerstein hamPstEn
+hammock ham@k
+hammond ham~d
+hammonton ham~t~
+hammot ham6t
+hamner hamP
+hampden hamd~
+hampden hampd~
+hampered hampPd
+hampshire hampSP
+hampshire's hampSPz
+hampshires hampSPz
+hampstead hampstcd
+hampton hampt~
+hamsters hamstPz
+hamstrings hamstriNz
+hamtramck hamtr@mk
+hamtramck hamtram6k
+hamtramck hamtramk
+hanahan han@h~
+hanapepe han@p@p
+hanapepe han@pEp
+hand hand
+handbag handbag
+handball handb{l
+handbills handbilz
+handbook handbqk
+handclaps handklaps
+handclasp handklasp
+handcrafted handkraft6d
+handcuffed handkuft
+handed hand6d
+handelsman hant@lsm@n
+handful handfL
+handguns handgunz
+handicappers hand/kapPz
+handicraft hand/kraft
+handiwork hand/wVk
+handkerchief handkPC@f
+handkerchiefs handkPC@fs
+handle handL
+handlebars handLb)rz
+handled handLd
+handler handLP
+handler handlP
+handling handL6N
+handlooms handlUmz
+handmaid handmAd
+handouts hand?ts
+handover handOvP
+handrail handrAl
+hands handz
+handshakes handSAks
+handsome hans}
+handsomely hans@ml/
+handspring handspriN
+handwork handwVk
+handwoven handwOv~
+handwriting handrId6N
+handy hand/
+handyman hand/man
+handymen hand/men
+hanebutt hAnbut
+haney hAn/
+hanford hanfPd
+hang haN
+hanged haNd
+hanger haNP
+hangers haNPz
+hanging haN6N
+hangman haNm~
+hangnail haNnAl
+hangouts haN?ts
+hangover haNOvP
+hangup haNup
+hankey haNk/
+hanley hanl/
+hanlon hanlon
+hanlontown hanlont?n
+hanlontown hanl~t?n
+hanna han@
+hannah han@
+hannibal han@bL
+hannibal han@bl
+hannon han~
+hannover h@nOvP
+hannover hanOvP
+hannover han]vP
+hanover hanOvP
+hanoverton hanOvPt~
+hans h)nz
+hansa hons@
+hanson hans~
+hansville hanzvil
+hansville honsvil
+hapeman hApm6n
+hapgood hapgqd
+haphazardly haphazPdl/
+happen hap~
+happened hap~d
+happening hap~6N
+happens hap~z
+happier hap/P
+happiest hap/6st
+happily hapL/
+happy hap/
+harald harLd
+haralson harLs~
+harare h@r)rA
+harare harP
+harbor h)rbP
+harborcreek h)rbPkrEk
+harborside h)rbPsId
+harbour h)rbP
+hard h)rd
+hardacre h)rdAkP
+hardcastle h)rdkas@l
+hardeeville h)rd/vil
+hardener h)rd~P
+harder h)rdP
+hardesty h)rdest/
+hardgoods h)rdgqdz
+hardgrave h)rdgrAv
+hardhead h)rdhed
+hardliners h)rdlInPz
+hardly h)rdl/
+hardness h)rdn6s
+hards h)rdz
+hardscrabble h)rdskrabL
+hardship h)rdSip
+hardships h)rdSips
+hardtop h)rdtop
+hardware h)rdw,r
+hardwood h)rdwqd
+hardy h)rd/
+hare h,r
+harebrained h,rbrAnd
+harewood hArwqd
+hargeisa h)rgEs@
+hargeisa h)rgIs@
+hargeisa h)rjIs@
+hargenrader h)rg6nradP
+hargraves h)rgrAvz
+harkers h)rkPz
+harkleroad h)rk@lrOd
+harkness h)rkn6s
+harlem h)rl}
+harleton h)rl6t~
+harleton harlt~
+harley h)rl/
+harleyville h)rl/vil
+harlin h)rl~
+harlingen h)rl6N~
+harlingen h)rlinj~
+harlingen h)rl~j~
+harlingen horlinj~
+harlowton h)rlOd~
+harlowton h)rl]t~
+harlowton horlOd~
+harm h)rm
+harmful h)rmfL
+harmfully h)rmfL/
+harmlessly h)rml6sl/
+harmon h)rm~
+harmonize h)rm@nIz
+harmony h)rm~/
+harms h)rmz
+harned h)rn6d
+harnett h)rn6t
+harold harLd
+haroldson harLds~
+harootunian h@rUtUnE6n
+harped h)rpt
+harper h)rpP
+harpers h)rpPz
+harpist h)rp6st
+harpo h)rp]
+harpoon h)rpUn
+harpoon horpUn
+harpster h)rpstP
+harpswell h)rpswel
+harra har@
+harrell hArel
+harrells hArelz
+harrells harLz
+harrier h,r/P
+harrietta h,r/ed@
+harrietta har/et@
+harriette hArEet
+harrington hariNt~
+harris har6s
+harrisburg har6sbVg
+harristown har6st?n
+harrisville har6svil
+harrodsburg har@dzbVg
+harrold harLd
+harroun h)rUn
+harry her/
+harsens h)rs~z
+harsh h)rS
+harshness h)rSn6s
+hart h)rt
+hartford h)rtfPd
+hartford's h)rtfPdz
+hartfords h)rtfPdz
+hartgrove h)rtgrOv
+harting h)rd6N
+harting h)rtiN
+hartington h)rdiNt~
+hartl h)rt@l
+hartleben h)rt@lben
+hartley h)rtl/
+hartmann h)rtm~
+hartnett h)rtn6t
+hartsdale h)rtsdAl
+hartselle hPtsel
+hartson h)rts~
+hartsville h)rtsvil
+hartt h)rt
+hartung h)rtuN
+hartville h)rtvil
+harvard's h)rvPdz
+harvards h)rvPdz
+harvey h)rv/
+harveysburg h)rv/zbVg
+harveyville h)rv/vil
+harwood h)rwqd
+harwood horwqd
+haryana h)ryan@
+haryana h,ryon@
+has haz
+hasbro hazbr]
+hasbro's hazbr]z
+hasbros hazbr]z
+hasbrouck hazbr6k
+haseman hAsm@n
+hash haS
+hasher haSP
+haskell hask@l
+haslam hazl}
+hasn't haz~t
+hasnt haz~t
+hass h)s
+hasselbarth has@lb)rT
+hassle hasL
+haste hAst
+hastie hAstE
+hastings hAst6Nz
+hasty hAst/
+haswell hozwel
+hat hat
+hatboro hatbV]
+hatch haC
+hatchets haC6ts
+hate hAt
+hated hAd6d
+hathaway haT@wA
+hatler hatlP
+hatpin hatpin
+hatred hAtr6d
+hats hats
+hattieville hat/vil
+hatzenbihler hats@nbilP
+haug h?g
+haugen h?g6n
+haugh h?
+haughey h{fE
+haughn h)n
+haughney h{fnE
+haughton h{d~
+haughty h{d/
+hauled h{ld
+hauling h{l6N
+haunt h{nt
+haunted h{nt6d
+hauppauge h{p{Z
+haupt h?pt
+hauschild h)sCIld
+hausrath h?sraT
+have hav
+havekost hav@k)st
+havelock hAvlok
+haveman hAvm6n
+haven hAv~
+haven't hav~t
+havenhill hAv@nhil
+havens hAv~z
+havent hav~t
+havercroft hAvPkr{ft
+haverhill havPhil
+haverkamp hAvPkamp
+haverstock havPst)k
+haverstraw havPstr{
+having hav6N
+havre havP
+hawaii h@wI/
+hawaii's h@wIEz
+hawaiian h@wI~
+hawaiians h@wI~z
+hawaiis h@wIEz
+hawarden h@w)rd~
+hawarden h{)rd~
+hawe h)
+hawes h{z
+hawesville hozvil
+hawesville h{zvil
+hawing h{6N
+hawk h{k
+hawkes h{ks
+hawkeye h{kI
+hawkeye's h{kIz
+hawkeyes h{kIz
+hawkish h{k6S
+hawknose h{kn6s
+hawks h{ks
+hawley h{l/
+haworth h?PT
+hawthorn h{T{rn
+hawthorne h{T{rn
+hawthrone h{TrOn
+hay hA
+haydenville hAd~vil
+haydon hAd~
+hayes hAz
+hayfork hAf{rk
+haygood hAgqd
+haymaker hAmAkP
+haymarket hAm)rk6t
+haymore hAm{r
+haynesville hAnzvil
+haynesworth hAnzwPT
+hayrack hArak
+hayride hArId
+hays hAz
+haysville hAzvil
+hayti hAd/
+hayti hAt/
+hayward hAwPd
+haywire hAwIr
+haywood hAwqd
+hayworth hAwVT
+hazards hazPdz
+haze hAz
+hazel hAz@l
+hazelhurst hAz@lhPst
+hazelnut hAzLnut
+hazelpark hAzLp)rk
+hazelton hAzLt~
+hazelwood hAzLwqd
+hazen hAz~
+hazim hazEm
+hazlegrove hAz@lgrOv
+hazlehurst hAzLhVst
+hazleton hAzLt~
+hazlewood hAz@lwqd
+hazy hAz/
+he hE
+he'd hEd
+he'll hEl
+he's hEz
+head hed
+headache hedAk
+headaches hedAks
+headcount hedk?nt
+headdress heddres
+headdresses heddres6z
+heade hed
+headed hed6d
+header hedP
+headgear hedgEr
+headhunters hedhuntPz
+heading hed6N
+headland hedl@nd
+headley hedlE
+headlights hedlIts
+headline hedlIn
+headlines hedlInz
+headmaster hedmastP
+headphones hedfOnz
+headquarters hedkw{rdPz
+headrick hedrik
+heads hedz
+headstand hedstand
+headstrong hedstr{N
+heady hetE
+heal hEl
+healdsburg hEldzbPg
+healdsburg hEldzbVg
+healdton hEldt~
+health helT
+healthcare helTk,r
+healthcare's helTk,rz
+healthcares helTk,rz
+healthful helTfL
+healthier helT/P
+healthiest helT/6st
+healthy helT/
+heap hEp
+heaped hEpt
+hear hEr
+heard hVd
+hearing hEr6N
+heart h)rt
+heartache h)rdAk
+heartbeats h)rtbEts
+heartbroken h)rtbrOk~
+heartburning h)rtbVn6N
+hearted h)rd6d
+heartfelt h)rtfelt
+hearth h)rT
+hearths h)rTs
+heartily h)rd6l/
+hearts h)rts
+heartsick h)rtsik
+heartthrob h)rtTrob
+heartwarming hErtwPm6N
+heat hEt
+heat's hEts
+heated hEt6d
+heater hEtP
+heath hET
+heath's hETs
+heathcliff hETklif
+heathen hED~
+heather heDP
+heatherington heD@riNt@n
+heatherly heDPlE
+heathers heDPz
+heathershaw heDPS{
+heatherton heDPt@n
+heaths hETs
+heathsville hETsvil
+heating hEd6N
+heats hEts
+heatstroke hEtstr@k
+heave hEv
+heaven hev~
+heavener hev~P
+heavenly hev~l/
+heavens hev~z
+heavenward hev~wPd
+heaves hEvz
+heavier hev/P
+heaviest hev/6st
+heavily hevL/
+heaviness hev/n6s
+heaving hEv6N
+heavy hev/
+heavyweight hev/wAt
+heavyweights hev/wAts
+hebrew hEbrU
+hechinger hekiNgP
+heck hek
+heckle hekL
+hed hEd
+hedegore het6g{r
+hedge hej
+hedged hejd
+hedgehog hejh{g
+hedgehogs hejh{gz
+hedgepath hejpaT
+hedgerow hejrO
+hedges hej6z
+heebner hEbnP
+heedless hEdl6s
+heel hEl
+heels hElz
+heenan hEn~
+heffelfinger hef6lfiNgP
+hefling hEfl6N
+hefty heft/
+hegel hejL
+heggood hegqd
+hegwood hegwqd
+heidelberg hIdLbVg
+heidenreich hItenrIk
+heidgerken hIdgPk@n
+heidi hId/
+heidrick hIdr6k
+height hIt
+heightened hId~d
+heights hIts
+heigl hIg@l
+heiliger hIl6gP
+heimerdinger hImPtiNP
+heineman hInm6n
+heinrich hInr6k
+heinrichs hInr6ks
+heinz hInz
+heinz's hInz6z
+heinzs hInz6z
+heir ,r
+heird hErd
+heirloom ,rlUm
+heirlooms ,rlUmz
+heister hIstP
+held held
+helen hel~
+helena helAn@
+helena hel~@
+helene h6lEn
+helene h@lAn
+helens hel~z
+helgager helgAjP
+helger helgP
+helget helget
+helicopter hel6koptP
+helicopters hel6koptPz
+heliopolis hEl/op@l6s
+helium hEl/}
+hell hEl
+hell hel
+hellenistic hel6nist6k
+hellens hel~z
+hellertown helPt?n
+hellman helm~
+hello helO
+hellriegel helrEg@l
+helman helm~
+helmet helm6t
+helmsley helmzl/
+helmsleys helmzl/z
+helmsman helmzm~
+helotes hel6ts
+helotes hel]ts
+help help
+helped helpt
+helpers helpPz
+helpful helpfL
+helpfully helpfL/
+helpless helpl6s
+helplessness helpl6sn6s
+helps helps
+helton helt~
+heltonville helt~vil
+helvetia hLvES@
+hem hem
+hembree hembrE
+hemet hem6t
+hemet hemct
+hemingway hem6NwA
+hemispheres hem6sfErz
+hemlock hemlok
+hemoglobin h6mogl@b~
+hemorrhage hemr6j
+hemorrhaging hemr6j6N
+hemphill hemphil
+hempstead hempsted
+hempstead hemst6d
+hemsley hemzl/
+hen hen
+henbane henbAn
+hence hens
+henchmen henCm~
+henderson hendPs~
+hendersonville hendPs~vil
+hendricksen hendr6ks~
+hendrik hendr6k
+hendriks hendr6ks
+hendrix hendriks
+hendry hendr/
+hendryx hendr6ks
+hengel heNg@l
+henley henl/
+henline henlIn
+hennes henz
+hennessey hen6s/
+henrichs henriks
+henrichsen henr6ks6n
+henricksen henr6ks~
+henriette henrEet
+henriques henrEk6s
+henry henr/
+henryetta henr/et@
+henryetta h~ryed@
+hentges hentj6s
+hepburn's hepbVnz
+hepburns hepbVnz
+her hV
+herald harLd
+heralded harLd6d
+heralding harLd6N
+heralds harLdz
+herandez h@rand6z
+herb Vb
+herculaneum hVky6lan/}
+hercules hVky6lEz
+herd hVd
+herdin hVd~
+herdsmen hVdzm~
+here hEr
+here's hErz
+hereditary h@red6ter/
+hereford har6fPd
+herendeen her@ndEn
+heres hErz
+hergenrader hPgenrAdP
+hergert hPgPt
+heritage har6d6j
+herke hPkE
+herkimer hVk6mP
+hermansen hPm@ns6n
+hermanville hVm~vil
+hermine hPmEn
+hermiston hVm6st~
+hermleigh hVml/
+hermleigh hVmlE
+hermosa hPmOs@
+herms hVmz
+hernan hVn~
+hernandez crnondcs
+hernandez hPnand/z
+hernandez hPnand6z
+hernando hPnand]
+herndon hVnd~
+hernia hVn/@
+hero hEr]
+heroes hEr]z
+heroic h@rO6k
+heroics h@rO6ks
+heroin har]~
+heroism har]6z}
+heron har~
+herpes hVp/z
+herrarte her)rtA
+herriges herEges
+herriman her6m6n
+herrin har~
+herringbone hariNbOn
+herrod her@d
+herron har~
+hers hVz
+herscher hVSP
+herself hVself
+hershaun hVS{n
+hershey hVS/
+hershey's hVS/z
+hersheys hVS/z
+hertford h)rtfPd
+herting hPtiN
+hertz hVts
+herwood hPwqd
+hes hEz
+hesitantly hez6t~tl/
+hesitate hez6tAt
+hesperia h6spEr/@
+heston hest~
+hettick hed6k
+hettinga hetiNg@
+heuvelton hyUvLt~
+hewlett hyUl6t
+hewn hyUn
+hey hA
+heyburn hAbVn
+heyes hAz
+heyman hAm~
+heywood hAwqd
+hi hI
+hialeah hI@lE@
+hiawassee hI@w@sE
+hiawassee hI@wos/
+hibachi h6boC/
+hickinbotham hik6nb)t@m
+hickingbottom hikiNb)t@m
+hickonbottom hik@nb)t@m
+hickory hik@r/
+hicks hiks
+hicksville hiksvil
+hico hEk]
+hico hIk]
+hid hid
+hidden hid~
+hide hId
+hideouts hId?ts
+hides hIdz
+hiding hId6N
+hidlesheim hIdLzhIm
+hiedi hIdE
+hierarchal hI@r)rCL
+hierarchical hI@r)rk6kL
+hierarchies hI@r)rk/z
+hierarchy hI@r)rk/
+hietala hItal@
+hiett hI6t
+higby higb/
+higden higd~
+higginbotham hig6nb)t@m
+higgins hig~z
+high hI
+higham hI}
+higham hig@m
+highboy hIb<
+highchair hIC,r
+higher hIP
+highest hI6st
+highfield hIfEld
+highlanders hIlandPz
+highlandpark hIl~dp)rk
+highlands hIl~dz
+highlight hIlIt
+highly hIl/
+highman hIm~
+highmore hIm{r
+highness hIn6s
+hightower hIt?P
+hightstown hItst?n
+highway hIwA
+highways hIwAz
+higinbotham h6g6nb)T@m
+hijack hIjak
+hike hIk
+hiked hIkt
+hikes hIks
+hiking hIk6N
+hilarious h6l,r/@s
+hilariously h6l,r/@sl/
+hilary hil@r/
+hildegard hild6gPd
+hildesheim hild@SIm
+hildesheim hildzhIm
+hildinger hildiNP
+hildred hildr6d
+hileman hIlm6n
+hiles hIlz
+hill hil
+hillary hil@r/
+hillbillies hilb6l/z
+hillbilly hilb6l/
+hillburn hilbVn
+hilleary hilerE
+hillhaven hilhAv~
+hilliard hilyPd
+hillis hil6s
+hillpoint hilp<nt
+hillrose hilr6s
+hillrose hilrOz
+hills hilz
+hillsboro hilzbP]
+hillsboro hilzbV]
+hillsdale hilzdAl
+hillside hilsId
+hillsman hilzm~
+hilltonia hLtOn/@
+hilltown hilt?n
+hilmer hilmP
+hilsendager hils@ndagP
+hilsinger hilsiNP
+hilt hilt
+hilton hilt~
+hilts hilts
+him him
+hima hEm@
+hima hIm@
+himes hImz
+himself himself
+himy hIm/
+hinchcliff hinCklif
+hinchliffe hinClif
+hinckley hiNkl/
+hind hInd
+hindes hIndz
+hindrances hindr~s6z
+hinds hIndz
+hindsight hIndsIt
+hindu hindU
+hinduism hinjUiz}
+hindus hindUz
+hinebaugh hInb)
+hinegardner hIng)rdnP
+hineline hInl6n
+hineman hInm6n
+hineman hInm~
+hinesdale hInzdAl
+hinge hinj
+hingham hiN}
+hinkle hiNkL
+hinrichs hinr6ks
+hinrichsen hinr6ks6n
+hinsdale hinzdAl
+hinsley hinzl/
+hint hint
+hintze hintzE
+hinz hInz
+hip hip
+hippo hip]
+hips hips
+hipster hipstP
+hiram hIr@m
+hiraoka hEr?k@
+hire hIr
+hired hIrd
+hires hIrz
+hirneise hPnIs
+hironaka hEr@nak@
+hiroshi hirOSE
+hirsch hVS
+hirsh hVS
+his hiz
+hislope hizlOp
+hispanic h6span6k
+hiss his
+hissed hist
+histology h6stol@j/
+historians h6st{r/~z
+historical h6st{r6kL
+historically h6st{r6kl/
+history histP/
+history histr/
+hit hit
+hitachi h6toC/
+hitch hiC
+hitchcock hiCkok
+hitchcock's hiCkoks
+hitchcocks hiCkoks
+hitchhike hiC6k
+hite hIt
+hitler's hitlPz
+hitlers hitlPz
+hits hits
+hives hIvz
+hixon hiks6n
+hixton hikst~
+hjonnevag honivag
+ho hO
+hoag hOg
+hoage hOg
+hoarse h{rs
+hoax hOks
+hobart hOb)rt
+hobbies hob/z
+hobbs hobz
+hobby hob/
+hoberg hobPg
+hobert hObPt
+hoboken hOb@k~
+hoboken hObOk~
+hobson hobs~
+hochhalter h)kh{ltP
+hochschild h)SCIld
+hochstetler h)CstetlP
+hock hok
+hockenberger hok~bVgP
+hocker hokP
+hockessin h@kes~
+hockessin hok6s~
+hockessin hokes~
+hockey hok/
+hockman hokm~
+hodel hodL
+hodge hoj
+hodgeman h)jm6n
+hodges hoj6z
+hodgins hoj~z
+hodgkins hojk~z
+hoeffliger hOflEgP
+hoey hOE
+hoffa h{f@
+hoffman h{fm~
+hoffner h{fnP
+hofstra hofstr@
+hoftiezer h)ftEzP
+hog h{g
+hogan's hOg~z
+hogans hOg~z
+hogarty h@g)rd/
+hoge hOg
+hogeland hOjl@nd
+hogen hOg6n
+hogge h)g
+hognose hogn6s
+hogs h{gz
+hogsed h)gsed
+hogshead h{gzhed
+hogwash h{gwoS
+hohaia hOhIy@
+hoist h<st
+hoisted h<st6d
+hokus hOk@s
+hokutan h)k@t@n
+holberg hOlbVg
+holberton hOlbPt6n
+holcombe hOlkOm
+hold hOld
+holden hOld~
+holdenville hOld~vil
+holder hOldP
+holders hOldPz
+holding hOld6N
+holdingford hOld6NfPd
+holdingford hOldiNfPd
+holdouts hOld?ts
+holds hOldz
+hole hOl
+holecek hOlCek
+holeman hOlm@n
+holes hOlz
+holgate hOlgAt
+holiday hol6dA
+holidays hol6dAz
+holistic h@list6k
+holland hol~d
+hollander hol~dP
+hollandia h@land/@
+hollandia holand/@
+hollandsworth hol~dzwVT
+hollansburg hol~zbVg
+hollenberg hol~bVg
+hollenshead h)linshed
+holleran hol@r~
+hollering holP6N
+holley h)lE
+holliman hol/m~
+hollings hol6Nz
+hollingshead h)liNshed
+hollingshed h)liNSed
+hollingsworth holiNzwVT
+hollinshead h)linzhed
+hollinshed h)linSed
+holliston hol6st~
+holloway hol]A
+holly hol/
+hollywood hol/wqd
+holman hOlm~
+holmberg hOlmbPg
+holmen hOlm~
+holmes hOlmz
+holmesville hOlmzvil
+holmesville hOmzvil
+holmgren hOlmgr6n
+holshouser hOlsh?zP
+holsinger hOls6NP
+holstein hOlstEn
+holsworth hOlzwPT
+holt hOlt
+holte hOlt
+holtgrewe hOltgrU
+holtsville hOltsvil
+holtzman hOltsm~
+holyfield hOl/fEld
+holyoke hOl/Ok
+holyoke holy@k
+home hOm
+homecoming hOmkum6N
+homedale hOmdAl
+homeland's hOmlandz
+homelands hOmlandz
+homeless hOml6s
+homemaker hOmmAkP
+homeowner hOmOnP
+homer hOmP
+homeroom hOmrUm
+homerville hOmPvil
+homes hOmz
+homesick hOmsik
+homestake hOmztAk
+homestead hOmsted
+hometown hOmt?n
+homeward hOmwPd
+homewood hOmwqd
+homicide hom6sId
+homo hOm]
+homogeneous hom@jEn/@s
+honda hond@
+hondo hond]
+honest on6st
+honestly on6stl/
+honesty on6st/
+honey hun/
+honeybees hun/bEz
+honeycomb hun/kOm
+honeycutt h@nEkut
+honeydew hun/dU
+honeyman hunEman
+honeymoon hun/mUn
+honeymooned hun/mUnd
+honeysuckle hun/sukL
+honeysuckles hun/sukLz
+honeywell hun/wel
+hong h{N
+hongerholt h)NgPhOlt
+honk hoNk
+honking hoNk6N
+honokaa hOn]k)
+honolulu hon@lUlU
+honolulu's hon@lUlUz
+honolulus hon@lUlUz
+honor onP
+honorary on@rer/
+honored onPd
+honors onPz
+honour )nP
+hood hqd
+hoodsport hqdzp{rt
+hoodwinked hUdw6Nkt
+hoody hqd/
+hooe hOE
+hoof hqf
+hoofprint hqfprint
+hoofs hqfs
+hook hqk
+hooked hqkt
+hooking hqk6N
+hookstown hqkst?n
+hookup hqkup
+hookups hqkups
+hoolihan hUl6h~
+hoon hUn
+hooper hUpP
+hooperman hUpPm~
+hoopes hUps
+hoopeston hUp6st~
+hoopeston hUpst~
+hoople hUpL
+hoops hUps
+hooter hUdP
+hoover's hUvPz
+hoovers hUvPz
+hop hop
+hopatcong h@patk{N
+hope hOp
+hoped hOpt
+hopedale hOpdAl
+hopeful hOpfL
+hopefully hOpfL/
+hopeless hOpl6s
+hopes hOps
+hopewell hOpwel
+hoping hOp6N
+hopkins hopk~z
+hopkinson hopk~s~
+hopkinsville hopk~zvil
+hopkinton hopk~t~
+hopp hop
+hoppes h)ps
+hops hops
+hopscotch hopskoC
+hopwell hopwel
+hopwood h)pwqd
+horeb h{r@b
+horicon h{r/kon
+horicon h{r6k~
+horizon h@rIz~
+horizons h@rIz~z
+horizontal h{r6zontL
+horizontally h{r6zont6l/
+hormel h{rmL
+hormone h{rmOn
+horn h{rn
+hornbarger h{rnb)rgP
+hornbeak h{rnbEk
+hornbeck h{rnbek
+hornbrook h{rnbrqk
+hornbuckle h{rnbuk@l
+horne h{rn
+hornell h{rnel
+hornick h{rn6k
+hornitos h{rnEd]z
+hornitos h{rnEt]s
+hornless h{rnl6s
+hornsby h{rnzb/
+horoscope hor@skOp
+horrendous h@rend@s
+horribly h{r6bl/
+horrific h@rif6k
+horror h{rP
+horse h{rs
+horseback h{rsbak
+horsefeathers h{rsfEDPz
+horseflesh h{rsfleS
+horsehair h{rsh,r
+horseheads h{rshedz
+horsely h{rslE
+horseman h{rsm6n
+horseplay h{rsplA
+horsepower h{rsp?P
+horseradish h{rsrad6S
+horses h{rs6z
+horseshoe h{rsSU
+horseshoes h{rsSUz
+horstman h{rstm~
+hortencia h{rtenS@
+hortense h{rtens
+hortensia h{rtensE@
+horticulture h{rd6kulCP
+horticulturist h{rd6kulCP6st
+horton h{rd~
+hortonville h{rd~vil
+hose hOz
+hosiery hOs/P/
+hospitable hospid@bL
+hospital hosp6dL
+hospitalization hosp6dL6zAS~
+hospitals hosp6dLz
+hosston host~
+hosston h{st~
+host hOst
+hostages host6j6z
+hostel hostL
+hostess hOst6s
+hostetler h)stetlP
+hostility hostil6d/
+hosts hOsts
+hot hot
+hot_springs hotspriNz
+hotchkiss hotCkis
+hotel h]tel
+hotelkeeper h]telkEpP
+hotels h]telz
+hotfires hotfIrz
+hotfoot hotfqt
+hotheaded hothed6d
+hotlines hotlInz
+hotly hotl/
+hotshot hotSot
+hough hok
+houis hU6s
+houlihan hUl@han
+houlka h?lk@
+houma h?m@
+hour ?P
+hourglass hVgl6s
+hourly ?Pl/
+hours ?Pz
+house h?s
+houseboat h?sbOt
+housebroken h?sbrOk~
+housecleaning h?sklEn6N
+housed h?zd
+housefly h?sflI
+houseful h?sfL
+household h?shOld
+householder h?shOldP
+housekeeper h?skEpP
+housekeepers h?skEpPz
+housekeeping h?skEp6N
+houseknecht h?sk@nekt
+houselights h?slIts
+housemaid h?smAd
+houseman h?sm6n
+houseman h?sm~
+houses h?z6z
+housewarming h?sw{rm6N
+housewife h?swIf
+housewives h?swIvz
+housework h?swVk
+housewright h?srIt
+housholder h?shOldP
+housing h?z6N
+houston hyUst~
+hovanesian hOv@nES@n
+hove hOv
+hovercraft huvPkraft
+hovered huvPd
+hovering huvP6N
+how h?
+how's h?z
+howard h?Pd
+howarth h?PT
+howdy h?d/
+howdyshell h?dESel
+howe h?
+howells h?Lz
+hower h?P
+howerton h?Pt@n
+howes h?z
+however h?evP
+howey hOw/
+howfield h?fEld
+howie hOw/
+howington hOiNt~
+howland h?land
+howlett h?l6t
+howley h?lE
+howling h?l6N
+hows h?z
+howsare h?sar
+howze h?z
+hoyer h<P
+hoyle h<l
+hoyles h<lz
+hoznour h)znUr
+hrycenko hrICeNkO
+hua hU@
+hua w)
+huang hUaN
+huang hyUaN
+hub hub
+hubbardston hubPdst~
+hubbardston hubPdzt~
+hubbell hubbel
+hubble hubL
+hubcaps hubkaps
+hubert hyUbPt
+huckleberry huk@lberE
+hudach hyUd@k
+huddled hudLd
+huddling hudL6N
+hudson huds~
+hue hyU
+huebert hyUbPt
+huebner hyUbnP
+huebschman hyUbSm@n
+hueneme hyU6nEm
+huerta wArt@
+huertas wert@s
+hues hyUz
+huewe hyUE
+huey hyU/
+huff's hufs
+huffington huf6Nt~
+huffington hufiNt~
+huffs hufs
+hufnagel hqfnAg@l
+huge hyUj
+hugel hyUg@l
+hugely hyUjl/
+huger hyUjP
+hugest hyUj6st
+hugged hugd
+huggies hug/z
+hugging hug6N
+huggins hug~z
+hugh hyU
+hughart hyUg)rt
+hughe hyU
+hughen hyUen
+hughes hyUz
+hughestown hyUzt?n
+hughesville hyUzvil
+hughett hyUet
+hughey hyUE
+hughs hyUz
+hughson hyUs@n
+hughston hyUst@n
+hugill hyUg@l
+hugueley hyUglE
+hules hyUlz
+hulks hulks
+hull hul
+hulled huld
+hulling hul6N
+hulmeville hulmvil
+hulmeville hyUmvil
+hum hum
+human hyUm~
+humaneness hyUmAnn6s
+humanism hyUm@niz}
+humanist hyUm~6st
+humanity hyUman6d/
+humankind hyUm~kInd
+humanly hyUm~l/
+humanness hyUm~n6s
+humans hyUm~z
+humansville hyUm~zvil
+humarock hyUm@rok
+humbles humb@ls
+humblest humbl6st
+humbug humbug
+humdinger humd~jP
+humdrum humdrum
+humes hyUmz
+humid hyUm6d
+humiliate hyUmil/At
+humility hyUmil6d/
+hummingbird humiNbPd
+humor hyUmP
+humorous hyUm@r@s
+humpback humpbak
+humphrey's humfr/z
+humphreys humfr/z
+humphries humfrEz
+humps humps
+humus hyUm@s
+hunchbacked hunCbakt
+hundred hundr6d
+hundredfold hundr6dfOld
+hundreds hundr6dz
+hundredth hundr6dT
+hundredths hundr6dTs
+hundredweight hundr6dwAt
+huneycutt hunEkut
+hung huN
+hungarian huNg,r/~
+hunger huNgP
+hungerford huNgPf{rd
+hungnam huNn)m
+hungnam huNn}
+hungrily huNgr6l/
+hungry huNgr/
+hunkele huNk@lE
+hunlock hunlok
+hunnewell hyUnwel
+hunnicutt hunEkut
+hunstiger hunst6gP
+hunt hunt
+hunte hunt
+hunter huntP
+huntertown huntPt?n
+hunting hunt6N
+huntingburg hunt6NbVg
+huntingburg huntiNbVg
+huntingdon hunt6Ngd~
+huntington huntiNt~
+huntley huntl/
+huntsinger hunts~jP
+huntsman huntsm~
+huntsville huntsvil
+huprich hUprik
+hurdle hVdL
+hurlbut hVlb6t
+hurlebaus hPlb?s
+hurled hVld
+hurles hPlz
+hurling hVl6N
+hurlock hVlok
+huron hyUron
+hurray hPA
+hurricane hV6kAn
+hurricanes hV6kAnz
+hurriedly hV6dl/
+hurry hV/
+hurrying hV/6N
+hurst hVst
+hurt hVt
+hurtful hVtfL
+hurts hVts
+hurtsboro hVtsbP]
+hurtsboro hVtsbV]
+hurtt hVt
+husain hUsAn
+husband huzb~d
+husband's huzb~dz
+husbandry huzb~dr/
+husbands huzb~dz
+huschle huS@l
+huseby hyUsbE
+huseman hyUsm6n
+hush huS
+hushed huSt
+husky husk/
+hustead hyUsted
+husted hyUst6d
+hustisford hust6sfPd
+hustisford hyUst6sfPd
+hustontown hust~t?n
+hustonville hust~vil
+hut hut
+hutchcraft huCkraft
+hutchins huC~z
+hutchinson huC~s~
+huts huts
+hutsonville huts~vil
+huttig hud6g
+huttonsville hud~zvil
+huus hyUs
+huxtable hukst@bL
+huxtables hukst@bLz
+huyett hyUet
+huynh hyUn
+hwa hw)
+hwang hwaN
+hyacinthe hI@sinT
+hyacinths hI@s~Ts
+hyannis hIan6s
+hyannis hIyan6s
+hyatt hI6t
+hyattsville hI6tsvil
+hybarger hIb)rgP
+hycroft hIkr@ft
+hyde hId
+hydeville hIdvil
+hydrate hIdrAt
+hydraulic hIdr{l6k
+hydrochloric hIdr]kl{r6k
+hydrochloride hIdr]kl{rId
+hydrolysis hIdrol6s6s
+hydrothermal hIdr]TVmL
+hyena hIEn@
+hyenas hIEn@z
+hyett hI6t
+hyles hIlz
+hymera hImar@
+hymnals himnLz
+hynd hInd
+hypersensitive hIpPsens6d6v
+hypes hIps
+hyphen hIf~
+hyphenate hIf6nAt
+hyphenated hIf6nAd6d
+hypnosis h@pnOs6s
+hypnotics h@pnod6ks
+hypocrites hip@kr6ts
+hypothalamic hIp]T@lam6k
+hypothesis hIpoT6s6s
+hypothesize hIpoT6sIz
+hysinger hIsiNP
+hysterical h6star6kL
+i I
+i'd Id
+i'll Il
+i'm Im
+i've Iv
+iaeger E6jP
+iafrate I@fr)tE
+ian E~
+iannotti yan)tE
+iatan I@t~
+ibach Ib)k
+ibarra 6b)r@
+iberia IbEr/@
+iberville IbPvil
+ibrahim ibr@him
+ice Is
+icebergs IsbVgz
+icebound Isb?nd
+icebox Isboks
+icebreaker IsbrAkP
+icecap Iskap
+icefield IsfEld
+icehouse Ish?s
+iceland Isl~d
+iceman Isman
+ices Is6s
+ices Is6z
+iceskating IsskAd6N
+ich iC
+icicles Is6kLz
+ickes iks
+icons Ikonz
+icy Is/
+id Id
+ida Id@
+idabel Id@bel
+idaho Id@hO
+idaho's Id@h]z
+idahos Id@h]z
+idaville Id@vil
+idea IdE@
+ideal IdEl
+idealized IdElIzd
+ideally IdEl/
+ideals IdElz
+ideas IdE@z
+identical Ident6kL
+identifiable 6dent6fI@bL
+identified 6dent6fId
+identify 6dent6fI
+identifying 6dent6fI6N
+ideological 6dE@loj6kL
+ideology Id/ol@j/
+idiosyncrasies id/@siNkr@s/z
+idiotic id/od6k
+idiotically id/od6kl/
+idly Idl/
+idolize Id@lIz
+idyllic 6dil6k
+if if
+ifs ifs
+iglesias 6glAsE@z
+igloo iglU
+igniter ignIdP
+ignition igniS~
+ignorance ign@r~s
+ignore 6gn{r
+ignored 6gn{rd
+ignores 6gn{rz
+ignoring 6gn{r6N
+iguana 6gwon@
+iguanas 6gwon@z
+ih 6
+ih i
+iiams Iamz
+ileana ilE)n@
+ilene IlEn
+ilion Ily~
+ilion il/~
+ilion ily~
+ilium Il/}
+ilium il/}
+iliyan ilEy6n
+ill Il
+ill il
+illegal ilEgL
+illegality ilEgal6d/
+illegally ilEg6l/
+illegitimate il6jid6m6t
+illies ilEz
+illinois il6n<
+illness iln6s
+illnesses iln6s6z
+illogic 6loj6k
+illuminate 6lUm6nAt
+illuminated 6lUm6nAd6d
+illuminating 6lUm6nAd6N
+illumination 6lUm6nAS~
+illumined 6lUm~d
+illusion 6lUZ~
+illusionist 6lUZ~6st
+illusions 6lUZ~z
+illustrate il6strAt
+illustrated il6strAd6d
+illustrious 6lustr/@s
+ilwaco 6lwak]
+im Im
+im im
+image im6j
+imagery im6jr/
+images im6j6z
+imaginary 6maj6ner/
+imagination 6maj6nAS~
+imaginative 6maj~@d6v
+imagine 6maj~
+imagined 6maj~d
+imagines 6maj~z
+imaging im6j6N
+imagining 6maj~6N
+imes Imz
+imitate im6tAt
+imitation im6tAS~
+immeasurable immeZP@bL
+immediate 6mEd/6t
+immediately 6mEd/6tl/
+immensely 6mensl/
+immenseness 6mensn6s
+immersed 6mVst
+immersion 6mVZ~
+immigrants im6gr~ts
+immigration im6grAS~
+immobile immObL
+immobility imm]bil6d/
+immobilizing immOb6lIz6N
+immodestly immod6stl/
+immorality imm@ral6d/
+immortal 6m{rdL
+immortality imPtal6d/
+immovable immUv@bL
+immune 6myUn
+immunity 6myUn6d/
+immunize imy6nIz
+imogene im@jEn
+impact impakt
+impairment 6mp,rm~t
+impairs 6mp,rz
+impale 6mpAl
+impart 6mp)rt
+imparted 6mp)rd6d
+impartiality 6mp)rS/al6d/
+imparting 6mp)rd6N
+impatient 6mpAS~t
+impatiently 6mpAS~tl/
+impeachments 6mpECm~ts
+impediments 6mped6m~ts
+impeding 6mpEd6N
+impelled 6mpeld
+imperceptible impPsept@bl
+imperceptibly impPsept6bl/
+imperfect impVf6kt
+imperia 6mpEr/@
+imperial 6mpEr/L
+imperialistic 6mpEr/@list6k
+impersonal impVs~L
+impertinently 6mpVd~n~tl/
+impervious 6mpVv/@s
+impetuous 6mpeCU@s
+implantation impl~tAS~
+implausibly 6mpl{s6bl/
+implementation impl6m~tAS~
+implication impl6kAS~
+implications impl6kAS~z
+implicitly 6mplis6tl/
+implied 6mplId
+implored 6mpl{rd
+implores 6mpl{rz
+implosion 6mplOZ~
+implying 6mplI6N
+impolite imp@lIt
+import imp{rt
+importance 6mp{rd~s
+important 6mp{rd~t
+importantly 6mp{rd~tl/
+imported 6mp{rd6d
+imports imp{rts
+impose 6mpOz
+imposes 6mpOz6z
+impossibility 6mpos6bil6d/
+impossible 6mpos@bl
+impound 6mp?nd
+impoundment 6mp?ndm~t
+impoverishment 6mpovr6Sm~t
+impracticable imprakt6k@bL
+impractical 6mprakt6kL
+imprecision impr6siZ~
+impressed 6mprest
+impression 6mpreS~
+impressionist 6mpreS~6st
+impressionistic 6mpreS@nist6k
+impressive 6mpres6v
+imprisoned impriz~d
+imprisonment impriz~m~t
+improbability improb@bil6d/
+improbably improb@bl/
+impropriety impr@prI6d/
+improve 6mprUv
+improved 6mprUvd
+improvement 6mprUvm~t
+improves 6mprUvz
+improving 6mprUv6N
+impulse impuls
+impulses impuls6z
+impulsion 6mpulS~
+impulsiveness 6mpuls6vn6s
+impurities impyUr6d/z
+imputation impy6tAS~
+in 6n
+in in
+in ~
+inadequate inad6kw6t
+inadvertently in@dvVd~tl/
+inadvisable in@dvIz@bL
+inalienable 6nAl/~@bL
+inanely 6nAnl/
+inappropriate in@prOpr/6t
+inarticulate in)rtikyL6t
+inaudible 6n{d@bl
+inaudible] 6n{d@bl
+inaugural 6n{gy@rL
+inauguration 6n{gy@rAS~
+inbound inb?nd
+inbox inboks
+inbreeding inbrEd6N
+inc 6Nk{rp@rAd6d
+incapable inkAp@bL
+incarcerate 6Nk)rs@rAt
+incarceration 6Nk)rs@rAS~
+incentive 6nsent6v
+incentives 6nsent6vz
+inch inC
+inchelium 6nCEl/}
+inchelium 6nCel/}
+inches inC6z
+inchon 6nCon
+inchon inC~
+incident ins6d~t
+inciong insE{N
+incipient 6nsip/~t
+incision 6nsiZ~
+inclination iNkl6nAS~
+inclinations iNkl6nAS~z
+include 6NklUd
+included 6NklUd6d
+includes 6NklUdz
+including 6NklUd6N
+inclusion 6NklUZ~
+inclusions 6NklUZ~z
+incoherent ink]hEr~t
+income iNkum
+incoming iNkum6N
+incompetent 6Nkomp6t~t
+incomplete ink}plEt
+incomprehensible 6Nkompr6hens@bl
+inconsistencies ink~sist~s/z
+inconsistency ink~sist~s/
+inconsolable ink~sOl@bL
+inconspicuously ink~spikyU@sl/
+inconvenience ink~vEny~s
+incoordination 6NkUrd6nAS~
+incorporate 6Nk{rp@rAt
+incorporated 6Nk{rp@rAd6d
+incorporating 6Nk{rp@rAd6N
+incorrectly ink@rektl/
+incorvaia iNk{rvI@
+increase 6nkrEs
+increase inkrEs
+increased 6NkrEst
+increases 6NkrEs6z
+increasing 6NkrEs6N
+increasingly 6NkrEs6Nl/
+incredible inkred@bl
+incredibly inkred6bl/
+incredulous 6Nkrej6l@s
+incredulously 6Nkrej6l@sl/
+increment iNkr6m~t
+incremental iNkr6mentL
+increments iNkr6m~ts
+incriminating 6Nkrim6nAd6N
+incubating iNky6bAd6N
+incubation iNky6bAS~
+incubator iNky6bAdP
+incumbent 6Nkumb~t
+incurable inkyUr@bL
+indash indaS
+indecision ind6siZ~
+indeed indEd
+indefinable ind6fIn@bL
+indefinite indef~6t
+indefinitely indef~6tl/
+indelicate indel6k6t
+indemnity 6ndemn6d/
+independence ind6pend~s
+independent ind6pend~t
+independently ind6pend~tl/
+index indeks
+india ind/@
+indiahoma 6ndI@hOm@
+indian ind/~
+indiana ind/an@
+indianapolis ind/@napL6s
+indianola 6ndI@nOl@
+indians ind/~z
+indicate ind6kAt
+indicated ind6kAd6d
+indicates ind6kAts
+indication ind6kAS~
+indictments 6ndItm~ts
+indifferent 6ndifr~t
+indigenous 6ndij~@s
+indigestion ind6jesC~
+indignation ind6gnAS~
+indio ind/]
+indios ind/Os
+indios ind/]z
+indispensable ind6spens@bL
+individual ind6vijwL
+individuality ind6vijUal6d/
+individually ind6vijU6l/
+individuals ind6vijwLz
+indivisible ind6viz@bl
+indochina ind]CIn@
+indoctrinate 6ndoktr6nAt
+indoctrination 6ndoktr6nAS~
+indonesia ind@nEZ@
+indoors ind{rz
+induce 6ndUs
+induced 6ndUst
+inducing 6ndUs6N
+induction 6ndukS~
+indulge 6ndulj
+indulged 6nduljd
+indulgence 6ndulj~s
+industrial 6ndustr/L
+industrialization 6ndustr/L6zAS~
+industrialize 6ndustr/@lIz
+industries ind6str/z
+industry ind6str/
+ineffective in6fekt6v
+inefficient in6fiS~t
+inelastic in6last6k
+ineptitude 6nept6tUd
+inequality in6kw{l6d/
+inevitability inev6d@bil6d/
+inevitable inev6d@bL
+inevitably inev6d@bl/
+inexcusable in6kskyUz@bL
+inexhaustible in6ks{st@bl
+inexorably ineksP@bl/
+inexperience in6kspEr/~s
+inexplicable in6ksplik@bL
+inez in6z
+infallible 6nfal@bl
+infamous inf@m@s
+infamy inf@m/
+infancy inf~s/
+infante inf)ntA
+infatuation 6nfaCUAS~
+infeasible 6nfEs@bl
+infection 6nfekS~
+infer 6nfV
+inferior 6nfEr/P
+inferiority 6nfEr/{r6d/
+inferred 6nfVd
+infidels inf6dLz
+infield infEld
+infiltration infLtrAS~
+infiltrator infLtrAdP
+infinite inf~6t
+infinitesimal 6nfin6tes6mL
+infiniti inf6nEd/
+infirmary 6nfVm@r/
+inflammation infl@mAS~
+inflammatory 6nflam@t{r/
+inflate 6nflAt
+inflated 6nflAd6d
+inflected 6nflekt6d
+inflexibility 6nfleks6bil6d/
+inflicted 6nflikt6d
+inflicts 6nflikts
+inflows infl]z
+influence inflU~s
+influenced inflU~st
+influential inflUenSL
+info inf]
+inform 6nf{rm
+informally 6nf{rm6l/
+information infPmAS~
+informational infPmAS~L
+informative 6nf{rm@d6v
+informed 6nf{rmd
+informs 6nf{rmz
+infrared infr@red
+infrequent infrEkw~t
+infrequently infrEkw~tl/
+infringements 6nfrinjm~ts
+infuriating infyUr/Ad6N
+infuriatingly infyUr/Ad6Nl/
+infuriation infyUr/AS~
+infusing infyUz6N
+ing iN
+ingalls iNgLz
+ingalsbe iNg@lsbE
+inge g@
+ingeborg iNg@b{rg
+ingebretsen iNg@brets6n
+ingegneri iNg6nyArE
+ingels iNg@lz
+ingemar inj6mP
+ingeniously 6njEn/@sl/
+ingenuity inj6nU6d/
+inger iNgP
+ingersoll iNgPs{l
+ingersoll injPsL
+inghram iNgr@m
+ingle iNgL
+ingles iNg@lz
+ingleside iNgLsId
+inglewood 6NgLwqd
+inglewood ANgLwqd
+inglewood iNgLwqd
+inglewood iNgLwqd
+inglorious 6Ngl{r/@s
+ingraham iNgr@m
+ingrain 6NgrAn
+ingredient 6NgrEd/~t
+ingredients 6NgrEd/~ts
+inhabit 6nhab6t
+inhabitants 6nhab6t~ts
+inhabited 6nhab6d6d
+inhalation inh@lAS~
+inhale 6nhAl
+inhaled 6nhAld
+inherently 6nhar~tl/
+inherited 6nhar6d6d
+inhibit 6nhib6t
+inhibitor 6nhib6dP
+inhospitable inhospid@bL
+inhuman inhyUm~
+inhumane inhyUmAn
+inhumanely inhyUmAnl/
+inhumanly inhyUm~l/
+initial 6niSL
+initialize 6niS@lIz
+initially 6niS6l/
+initiative 6niS@d6v
+injection 6njekS~
+injured injPd
+injuries inj@r/z
+injury inj@r/
+injustice 6njust6s
+ink iNk
+inkblot iNkbl6t
+inklebarger iNk@lb)rjP
+inks iNks
+inkwell iNkwel
+inlaid inl6d
+inlaw inl{
+inlay inlA
+inlet inl6t
+inlets inl6ts
+inman inm~
+inmate inmAt
+inn in
+inning in6N
+innings in6Nz
+innkeeper inkEpP
+innkeepers inkEpPz
+innocence in@s~s
+innsbruck inzbr6k
+innsbruck inzbrqk
+innuendo inyUend]
+innumerable innUmP@bL
+inoculations 6noky6lAS~z
+inopportunely inopPtUnl/
+inoue inU
+input inpqt
+inputs inpqts
+inquirer 6NkwIrP
+inquiring 6NkwIr6N
+inquiry iNkw@r/
+inquisition iNkw6ziS~
+inquisitive 6Nkwiz6d6v
+inroads inrOdz
+inscribe 6nskrIb
+inscription 6nskripS~
+inscriptions 6nskripS~z
+insecticide 6nsekt6sId
+insecticides 6nsekt6sIdz
+insects insekts
+insert 6nsVt
+insertion 6nsVS~
+insertions 6nsVS~z
+inset inset
+inside insId
+insightful insItfL
+insignia 6nsign/@
+insignificant ins6gnif6k~t
+insincere 6nsinsEr
+insincerely 6nsinsErl/
+insincerity ins~sar6d/
+insist 6nsist
+insisted 6nsist6d
+insolent insL~t
+insolvencies insolv~s/z
+insomnia 6nsomn/@
+inspector 6nspektP
+inspectors 6nspektPz
+inspects 6nspekts
+inspirational insp@rAS~L
+inspires 6nspIrz
+inspiring 6nspIr6N
+instability inst@bil6d/
+install 6nst{l
+installations inst@lAS~z
+installed 6nst{ld
+installing 6nst{l6N
+installments 6nst{lm~ts
+instance inst~s
+instances inst~s6z
+instant inst~t
+instantaneous inst~tAn/@s
+instantly inst~tl/
+instead insted
+instep instep
+instill 6nstil
+instillation inst6lAS~
+instinct inst6Nkt
+instinctively 6nstiNkt6vl/
+instincts inst6Nkts
+instinctually 6nstiNkCU6l/
+institute inst6tUt
+institution inst6tUS~
+institutionalize inst6tUS~@lIz
+instructed 6nstrukt6d
+instruction 6nstrukS~
+instructions 6nstrukS~z
+instructor 6nstruktP
+instrument instr6m~t
+instrumental instr@mentL
+instrumentalist instr6mentL6st
+instruments instr6m~ts
+insubordinately ins6b{rd6nAtl/
+insufferable insufr@bL
+insufficient ins6fiS~t
+insulate ins6lAt
+insulated ins6lAd6d
+insulator ins6lAdP
+insulting 6nsult6N
+insurable inSUr@bL
+insurance inSUr~s
+insure inSUr
+insuring inSUr6N
+intact 6ntakt
+integers int6jPz
+integral int6grL
+integrate int6grAt
+integrated int6grAd6d
+integration int6grAS~
+integrity 6ntegr6d/
+intel intel
+intellect int6lekt
+intellects int6lekts
+intellectual int6lekCwL
+intellectuals int6lekCwLz
+intelligence 6ntel6j~s
+intelligent 6ntel6j~t
+intelligible 6ntel6j@bl
+intended 6ntend6d
+intending 6ntend6N
+intense 6ntens
+intensification 6ntens6f6kAS~
+intensified 6ntens6fId
+intensity 6ntens6d/
+intent 6ntent
+intention 6ntenS~
+intentions 6ntenS~z
+interactive intPakt6v
+interacts intPakts
+interagency intPAj~s/
+intercellular intPselyLP
+interceptions intPsepS~z
+intercepts intPsepts
+interchangeably intPCAnj@bl/
+intercollegiate intPk@lEj/6t
+interdependent intPd6pend~t
+interdisciplinary intPdis6pl6ner/
+interdonato intPd@n)tO
+interest intPest
+interest intr6st
+interested intr6st6d
+interesting intr6st6N
+interests intr6sts
+interface intPfAs
+interfaces intPfAs6z
+interfering intPfEr6N
+intergalactic intPg@lakt6k
+intergovernmental intPguvPnmentL
+interior 6ntEr/P
+interiors 6ntEr/Pz
+interjects intPjekts
+interlaken intPlAk~
+interlochen intPlok~
+interlude intPlUd
+interludes intPlUdz
+intermediary intPmEd/er/
+interminable 6ntVm~@bL
+intermountain intPm?nt~
+internal 6ntVnL
+internalize 6ntVn@lIz
+internally 6ntVn6l/
+international intPnaS~L
+internet intPnet
+internship intVnSip
+interpersonal intPpVs~L
+interpolate 6ntVp@lAt
+interpretation 6ntVpr6tAS~
+interpretations 6ntVpr6tAS~z
+interprets 6ntVpr6ts
+interrogate 6ntar@gAt
+interrupt int@rupt
+interrupted int@rupt6d
+interruption int@rupS~
+interrupts int@rupts
+intersection intPsekS~
+interspersed intPspVst
+intertops intPtops
+intertwining intPtwIn6N
+interval intPvL
+intervals intPvLz
+interview intPvyU
+interviewed intPvyUd
+interviewee intPvyUE
+interviewing intPvyU6N
+interweaving intPwEv6N
+intestinal 6ntest~L
+intimate int6m6t
+intimidating 6ntim6dAd6N
+intimidation 6ntim6dAS~
+into intU
+intolerable intol@r@bL
+intoxication 6ntoks6kAS~
+intrepid 6ntrep6d
+intrigued 6ntrEgd
+intriguing 6ntrEg6N
+intrinsically 6ntrins6kl/
+introduced intr@dUst
+introduction intr@dukS~
+introductory intr@dukt@r/
+intrusion 6ntrUZ~
+intrusions 6ntrUZ~z
+intrusively 6ntrUs6vl/
+intuition inCUiS~
+intuitive 6ntU6d6v
+invade 6nvAd
+invades 6nvAdz
+invalid inval6d
+invalids invL6dz
+invaluable invaly@bL
+invariable inv,r/@bL
+invariably inv,r/@bl/
+invasion 6nvAZ~
+invasions 6nvAZ~z
+invasive 6nvAs6v
+inventoried inv~t{r/d
+inventories inv~t{r/z
+inventory inv~t{r/
+inver invP
+inversion 6nvVZ~
+invertebrate invVd6br6t
+invertebrates invVd6br6ts
+inverted 6nvVd6d
+invest 6nvest
+investigated 6nvest6gAd6d
+investigation 6nvest6gAS~
+investigations 6nvest6gAS~z
+investigator 6nvest6gAdP
+investigators 6nvest6gAdPz
+investment 6nvestm~t
+investors 6nvestPz
+invigorate 6nvig@rAt
+invigorating 6nvig@rAd6N
+inviolate 6nvIL6t
+invisibility inviz6bil6d/
+invisible inviz@bl
+invitation inv6tAS~
+invitations inv6tAS~z
+invited 6nvId6d
+invitingly 6nvId6Nl/
+invoice inv<s
+invoked 6nvOkt
+invokes 6nvOks
+involve 6nvolv
+involved 6nvolvd
+involves 6nvolvz
+involving 6nvolv6N
+invulnerability invulnP@bil6d/
+invulnerable invulnP@bL
+inward inwPd
+inwardly inwPdl/
+iodine I@dIn
+iodize I@dIz
+iomega E@mAg@
+ion Ion
+ione I~
+ionia /On/@
+iowa I@w@
+iowa I]w@
+ipswich ipsw6C
+ipswich ipswiC
+irani iranE
+irasburg Ir@zbVg
+irate IrAt
+irbil VbL
+irbil irbL
+iredale IrdAl
+ireland Irl~d
+irene IrEn
+irene's IrEnz
+irenes IrEnz
+ireton Irt@n
+iris Ir6s
+irish Ir6S
+irishman Ir6Sm~
+irkutsk Pkqtsk
+irmo Vm]
+iron IPn
+ironed IPnd
+ironhorse IPnh{rs
+ironic Iron6k
+ironically Iron6kl/
+ironies Ir~/z
+ironing IPn6N
+irons IPnz
+ironsides IPnsIdz
+ironsmith IPnsmiT
+ironton IPnt~
+ironworks IPnwVks
+irradiation 6rAd/AS~
+irrationality IrAS@nal6d/
+irrationally IrAS~L/
+irregular Erregy6lP
+irregularity Erregy6lar6d/
+irrelevantly Errel6v~tl/
+irremediable Errem6d/@bL
+irreplaceable Err6plAs@bL
+irresponsible Err6spons@bl
+irreverence Errevr~s
+irreverently Errevr~tl/
+irreversibly Err6vVs6bl/
+irrigated Er6gAd6d
+irrigation Er6gAS~
+irrigon ir6gon
+irritated Er6tAd6d
+irritating Er6tAd6N
+irvine VvEn
+irvine VvIn
+irvine Vv~
+irving Vv6N
+irving's Vv6Nz
+irvings Vv6Nz
+irvington Vv6Nt~
+irvington VviNt~
+irwin Vw~
+irwinville Vw6nvil
+irwinville Vw~vil
+is 6z
+is iz
+isaac Iz6k
+isaacks Iz6ks
+isaacs Iz@ks
+isaacson Iz6ks@n
+isabel iz@bel
+isabell Is@bel
+isabella Is@bel@
+isachsen Iz@ks6n
+isacs Iz@ks
+isacson Iz6ks@n
+isadora iz@d{r@
+isaiah IzA@
+isaias IsA@s
+isanti 6sant/
+isenhower Izinh?wP
+isfahan isf@h)n
+isfahan isf@h~
+isherwood iSPwqd
+ishii ESE
+isidore iz6d{r
+islam izl)m
+islam's izlomz
+islamic 6zlom6k
+islams izlomz
+island Il~d
+islandia 6zland/@
+islands Il~dz
+isle Il
+isles Ilz
+islesboro IlzbP]
+islesboro IlzbV]
+isleston Ilst~
+isleta 6zlAt@
+isleton Ilt~
+islip isl@p
+ism iz}
+isn't iz~t
+isnt iz~t
+isobel is@bel
+isolation Is@lAS~
+isolationist Is@lAS~6st
+isothermal 6soTPmL
+isotopes Is@d@ps
+israel izr/L
+israelis 6zrAl/z
+israelsen izrA@ls6n
+issaquah 6sakw@
+issue iSU
+issued iSUd
+issueless iSUl6s
+issuers iSUPz
+issues iSUz
+issuing iSU6N
+it 6t
+it it
+it'll idL
+it's its
+italian italy~
+italics 6tal6ks
+italy's idL/z
+italys idL/z
+itches iC6z
+itching iC6N
+itchy iC/
+item It}
+itemize Id6mIz
+items Id}z
+ithaca iT@k@
+itll idL
+its its
+itself itself
+iuka /Uk@
+iuka IUk@
+ivanhoe 6vanh]
+ivanoff Iv~{f
+ive Iv
+ivelisse Ev@lEs
+iversen IvPs~
+ives Ivz
+ivesdale IvzdAl
+ivey Iv/
+ivor IvP
+ivory Iv@r/
+ivy Iv/
+ivydale Iv/dAl
+izaguirre iz@gEr
+izquierdo EzkEArdO
+j j
+j jA
+jabbed jabd
+jabber jabP
+jabs jabz
+jacelyn jak@lin
+jach j)k
+jacinto j@sint]
+jack jak
+jackass jakas
+jackdaw jakd{
+jacket jak6t
+jackhammer jakhamP
+jackie jak/
+jackknife jaknIf
+jackpot jakpot
+jackpots jakpots
+jackson jaks~
+jacksonboro jaks~bP]
+jacksonboro jaks~bV]
+jacksonburg jaks~bVg
+jacksonville jaks~vil
+jacob jAk@b
+jacobs jAk@bz
+jacobsen jAk@bs6n
+jacobson jAk@bs@n
+jacoby jAk@bE
+jacque jak
+jacqueline jakL~
+jacquelyn jakw6l~
+jacques j)k
+jacquet jak6t
+jacquetta jaket@
+jacquez j)kez
+jacqui jakE
+jacquie jakE
+jada jAt@
+jade jAd
+jaded jAd6d
+jaeger jAgP
+jaegers jAgPz
+jaffe jaf
+jaffe jafE
+jageman jAgm@n
+jagers jAgPz
+jagged jag6d
+jaguar jagw)r
+jaguar's jagw)rz
+jaguars jagw)rz
+jahde j)tE
+jail jAl
+jailhouse jAlh?s
+jaime jAmE
+jakobsson jAkubs6n
+jalalabad j@l)l@b)d
+jalalabad j@lal@b6d
+jaleesa j@lEs@
+jalopy jal@p/
+jam jam
+jamaal j@m)l
+jamaica j@mAk@
+jamal j@m)l
+jamar j@m)r
+jamboree jambPE
+jamee jAmE
+jamerson jAmPs@n
+james jAmz
+jameson jAm6s@n
+jamesport jAmzp{rt
+jamesson jAms@n
+jamestown jAmzt?n
+jamie jAm/
+jamieson jAmEs6n
+jamison jAm6s6n
+jammed jamd
+jams jamz
+jamul j@mql
+jamul jamL
+janae j@nA
+janczak yanCak
+jane jAn
+jane jAn
+jane's jAnz
+janean j@nEn
+janecka yan@k@
+janeen j@nEn
+janene j@nEn
+janes jAnz
+janesville jAnzvil
+janet jan6t
+janeway jAnwA
+jangled jaNgLd
+jani janE
+janice jan6s
+janiece j@nEs
+janine j@nEn
+janis jan6s
+janocha j@nOk@
+jansen jans~
+january janyUer/
+janyce jan@s
+japanese jap@nEz
+japen jAp~
+jaqueline jakw@lEn
+jar j)r
+jara hor@
+jaramillo h)r@mEO
+jared jard
+jarek jarek
+jarod jAr@d
+jars j)rz
+jarvis j)rv6s
+jarzombek j)rz)mbek
+jasmine jazm~
+jason jAs~
+jasonville jAs~vil
+jasper jaspP
+jaundice j{nd6s
+jaunt j{nt
+jaurequi j{r@kE
+jaurez hOrez
+java jov@
+javaux j@vO
+javier h)vEAr
+jaw j{
+jawbone j{bOn
+jawed j{d
+jaworski j@w{rskE
+jaworsky j@wOrskE
+jaws j{z
+jay jA
+jaybird jAbVd
+jayme jAmE
+jayne jAn
+jays jAz
+jaywalking jAw{k6N
+jazmine jazm6n
+jazz jaz
+jazzed jazd
+jazzman jazm~
+jazzy jaz/
+jealously jel@sl/
+jealousy jel6s/
+jean jEn
+jeanbaptiste jEnbaptEst
+jeanelle j@nel
+jeanene j@nEn
+jeanett j@net
+jeanette j@net
+jeanfrancois jEnfransw{
+jeanice j@nEs
+jeanjacques Z)nZ)k
+jeanne jEan
+jeannetta j@net@
+jeannette jEnet
+jeannie jEn/
+jebb jeb
+jed jed
+jeep jEp
+jeeps jEps
+jeering jEr6N
+jeff jef
+jeff's jefs
+jefferey jefrE
+jefferies jefrEz
+jefferson jefPs~
+jeffersontown jefPs~t?n
+jeffery jefP/
+jeffrey jefr/
+jeffries jefr/z
+jeffries jefrEz
+jeffs jefs
+jegede j@gedE
+jellybean jel/bEn
+jemenez h6men6z
+jen jen
+jenavee jen@vE
+jenise j@nEs
+jenkin jeNk~
+jenkinsburg jeNk6nzbVg
+jenkinsburg jeNk~zbVg
+jenkintown jeNk~t?n
+jennerstown jenPzt?n
+jennifer jen6fP
+jennings jen6Nz
+jennings jenENz
+jenny jen/
+jeopardize jepPdIz
+jeopardizes jepPdIz6z
+jerde jPdE
+jeremy jar6m/
+jergens jPg6nz
+jergenson jPg6ns@n
+jerich jAr6k
+jerk jVk
+jerked jVkt
+jerky jVk/
+jerome j@rOm
+jeromesville j@rOmzvil
+jeronimo j@r)n6mO
+jerrell jAr6l
+jerrica jArik@
+jerry jer/
+jersey jVz/
+jersey_city jVz/sit/
+jerseys jVz/z
+jerusalem j@rUsL}
+jervis jVv6s
+jervis jerv6s
+jesica jesik@
+jesse jesE
+jessica jes6k@
+jesus jEz@s
+jesusita hAsUsEt@
+jet jet
+jethro jeTr]
+jetliner jetlInP
+jettisoned jed6s~d
+jewel jUL
+jewelers jU6lPz
+jewelmaster jULmastP
+jewelmasters jULmastPz
+jewelry jUlr/
+jewish jU6S
+jews jUz
+jiang jEaN
+jiang jEuN
+jiau jy?
+jiffy jif/
+jigsaw jigs{
+jiles jIlz
+jill jil
+jim jim
+jim's jimz
+jimenez h6men6s
+jimenz himenz
+jimerson jimPs@n
+jiminez himin6z
+jimmy jim/
+jims jimz
+jinenez hinen6z
+jiri jEr/
+jive jIv
+jiving jIv6N
+joachim w)kEm
+joachin yOkin
+joan jOn
+joana jOan@
+joann j]an
+joanna j]an@
+joanne jOan
+joaquin w)kEn
+joaquina w)kEn@
+joas jO@z
+job job
+jobes jObz
+jobs jobz
+jocelyn jos6l~
+jochems j)k6mz
+jochim yOkim
+jochum yOk@m
+jochumsen jOk@ms6n
+jockey jok/
+jockeying jok/6N
+jocular joky6lP
+jodi jOd/
+jodie jOd/
+jody jOd/
+joe jO
+joeann jOan
+joel jOL
+joel jOl
+joella jOel@
+joellen jOel6n
+joelson jOls~
+joelton jOlt~
+joetta jOet@
+joette jOet
+joey jO/
+joffe j)fE
+jogged jogd
+jogger jogP
+johanne jOan
+johannesen jOhans@n
+johanningmeie jOh)niNmA
+johansen yOhans~
+johanson yOhans@n
+johanson yOhans~
+johansson jOhans6n
+john jon
+john's jonz
+johna j)n@
+johnathan jOn@T~
+johnathon j)n@T6n
+johnetta j)net@
+johnette j)net
+johnie j{nE
+johnna j{n@
+johnnie j)nE
+johnny jon/
+johns jonz
+johnsen j)ns6n
+johnsie j)nsE
+johnson jons~
+johnsonburg jOns~bVg
+johnsonburg jons~bVg
+johnsonville jOns~vil
+johnston jonst~
+johnstone j)nstOn
+johnstown jonzt?n
+johnsville jonzvil
+joice j<s
+joie j<
+join j<n
+joined j<nd
+joiner j<nP
+joining j<n6N
+joint j<nt
+jointness j<ntn6s
+joist j<st
+jokebook jOkbqk
+jokers jOkPz
+jokes jOks
+joking jOk6N
+jokingly jOk6Nl/
+joleen jOlEn
+jolene jOlEn
+joles jOlz
+jolicoeur j)lik{r
+jolie jOl/
+joliet jOl/6t
+joliet jOl/et
+joline jOlEn
+jolley j{lE
+jolly jol/
+jolyn jOlin
+jolynn jOlin
+jomes jOmz
+jonathan jon@T~
+jonathon jon@T~
+jone jOn
+jones jOnz
+jonesboro jOnzbP]
+jonesboro jOnzbV]
+joneses j@nEz6z
+jonesport jOnzp{rt
+jonestown jOnzt?n
+jonesville jOnzvil
+jongsma y)Nzm@
+joo jU
+joplin jopl6n
+joplin jopl~
+jordan j{rd~
+jordanian j{rdAn/~
+jorgensen j{rj~s~
+jorgenson j{rg6ns@n
+jose h]zA
+josefina jOs@fEn@
+josefine jOs@fEn
+joseph jOs@f
+joseph's jOs@fs
+josephina jOs6fEn@
+josephine jOs6fEn
+josephpauline jOs6fp{lEn
+josephs jOs@fs
+josephsen jOs6fs6n
+josephson jOs@fs~
+josette jOset
+josey jOs/
+josh joS
+joshi yOSE
+joshua j)SU@
+jotted jod6d
+journal jVnL
+journalese jVn@lEz
+journalism's jVn@liz}z
+journalisms jVn@liz}z
+journalist jVnL6st
+journalists jVnL6sts
+journals jVnLz
+journey jVn/
+journeyman jVn/m~
+joust j?st
+jousting j?st6N
+joy j<
+joya j<@
+joyce j<s
+joye j<
+joyfully j<fL/
+joyless j<l6s
+joynes j<nz
+joyous j<@s
+joyride j<rId
+joys j<z
+juan won
+juarbe hw)rbA
+juarez w)rez
+juart jU{rt
+jubilant jUb6l~t
+jubilation jUb6lAS~
+judas jUd6s
+judds judz
+judge juj
+judged jujd
+judges juj6z
+judgeships jujSips
+judgmental j6jmentL
+judgments jujm~ts
+judicial jUdiSL
+judicious jUdiS@s
+judith jUd@T
+judsonia j@dsOn/@
+judy jUd/
+juergens jUrg6nz
+jug jug
+jugful jugfL
+jugglers juglPz
+jugs jugz
+jugular jUgy6lP
+juice jUs
+juiciest jUs/6st
+juicy jUs/
+jukebox jUk6boks
+jukes jUks
+jules jUlz
+julia jUl/@
+julian jUl/~
+julianne jUl/an
+julie jUl/
+julieann jUlEan
+juliet jUl/et
+juliette jUl/et
+julius jUl/@s
+july j6lI
+july j@lI
+july jUlI
+july's j6lIz
+julys j6lIz
+jumble jumbL
+jumbled jumbLd
+jump jump
+jumped jumpt
+jumping jump6N
+jumpsuit jumpsUt
+junction juNkS~
+juncture juNkCP
+june jUn
+juneau jUnO
+juneja j6nAj@
+jung's juNz
+jungels juNg@lz
+jungle juNgL
+junglegym juNgl6j}
+jungs juNz
+junior jUnyP
+juniper jUn6pP
+junipers jUn6pPz
+junk juNk
+junk_p J
+junkbond juNkb~d
+junkbox juNkboks
+junkholders juNkhOldPz
+junkier juNk/P
+junkman juNkm~
+junky juNk/
+junkyard juNky)rd
+junkyards juNky)rdz
+juno jUn]
+jupiter jUp6dP
+jurassic j@ras6k
+jurgensen jVj~s~
+jurgensmeyer jPg6nsmIP
+jurgenson jPg6ns@n
+jurisdiction jUr6sdikS~
+jurisdictional jUr6sdikS~L
+jurisdictions jUr6sdikS~z
+jurors jqrPz
+just just
+justice just6s
+justifiably just6fI@bl/
+justification just6f6kAS~
+justifications just6f6kAS~z
+justin just~
+jut jut
+jutted jud6d
+juul jUl
+k k
+k kA
+kabul k)bL
+kabul k@bUl
+kachemak kak6mak
+kaci kAsE
+kaduna k@dUn@
+kaea kI@
+kagel kAg@l
+kagoshima k)g@SEm@
+kagoshima k@gOS6m@
+kagoshima kag@SEm@
+kahahane k)h@h)nE
+kahoun k@hUn
+kaighn kAn
+kaiser kIzP
+kalaheo k@lAh/]
+kalaheo kal@hE]
+kalaho kal@h]
+kalamazoo k@lam@zU
+kalamazoo kal@m@zU
+kalawe k)l@wE
+kalb kalb
+kaleigh kalE
+kaleva k@lEv@
+kaley kAlE
+kaliningrad k@lEn~grad
+kalispell kal6spel
+kalkaska kalkask@
+kalloch kal@k
+kaloi k@l<
+kalona kalOn@
+kalyn kAl@n
+kamakura k)m@kV@
+kamakura kam@kqr@
+kamala kam@l@
+kamas kom@z
+kamloops kamlUps
+kampsville kampsvil
+kamuela k@myAl@
+kamuela kamyUel@
+kanaan kAn6n
+kanahele k)n@hElE
+kanevsky k@nevskE
+kangaroo kaNg@rU
+kangaroos kaNg@rUz
+kangley kaNl/
+kankakee kaNk@kE
+kannapolis k@napL6s
+kanode k@nOdE
+kanojiya kanOjEy@
+kanopolis kanop@l6s
+kanpur k)npP
+kansas kanz6s
+kansas kanz@s
+kansas_city kanz@ssit/
+kansasville kanz6svil
+kansasville kanz@svil
+kapp kap
+kappa kap@
+kapur kapUr
+kara kor@
+karaganda kar@gand@
+karaganda kar@g~d)
+karageorge kar@jOrj
+karan kar~
+karate k@rod/
+karbala k)rbal@
+karbala k)rbol@
+karcher k)rCP
+karen k@ren
+karen kar~
+karina k@rEn@
+karla k)rl@
+karlsruhe k)rlzrU
+karlyn k)rl6n
+karnak k)rnak
+karns k)rnz
+karonya k@rony@
+karri k)rE
+karthaus k)rT?s
+karve k)rv6
+karyl kAr@l
+karyn kAr6n
+kasi kAsE
+kasota k@sOd@
+kasota k@sOt@
+kasten kast~
+kastl kas@l
+kate kAt
+katelyn kAtl6n
+katelynn kAtlin
+katharina kaT@rEn@
+katharine kaT@r~
+katharine kaTr6n
+kathe kaTE
+katherin kaT@rin
+katherina katPEn@
+katherine kaT@r~
+kathleen kaTlEn
+kathman kaTm~
+kathryn kaTr~
+kathryne kaTrin
+kathy kaT/
+kati kAtE
+katmandu k)tm)ndU
+katmandu katmandU
+katmandu katm~dU
+kato kAd]
+katy kAd/
+kaukauna k{k{n@
+kaup k?p
+kaupu k?pU
+kavanagh kav@n{
+kavanah kav@n{
+kawachi k@w)CE
+kay kA
+kayak kAak
+kayaks kAaks
+kayce kAsE
+kayes kAz
+kayleigh kAlE
+kayo kA]
+kaysville kAzvil
+kboo kbU
+kea kE@
+keanu kE)nU
+kearny kVn/
+keck kek
+ked ked
+keeble kEbL
+keedysville kEd/zvil
+keego kEg]
+keel kEl
+keele kEl
+keels kElz
+keelson kEls~
+keene kEn
+keensburg kEnzbVg
+keep kEp
+keeper kEpP
+keeping kEp6N
+keeps kEps
+keepsake kEpsAk
+keeseville kEsvil
+keeton kEd~
+keewatin k/wot~
+keg keg
+kegel kAg@l
+kehoe kEhO
+keil kEl
+keim kIm
+keisha kAS@
+keister kEstP
+keith kET
+keithville kETvil
+kelii kelE
+keliihoomalu kelEhUm@lU
+keliipaakaua kelEp@k@w@
+kellee kelE
+keller kelP
+kellerhouse kelPh?s
+kellogg kelog
+kellogg's kelogz
+kelloggs kelogz
+kelly kel/
+kelsey kels/
+kelseyville kels/vil
+kelsheimer kelSImP
+kelso kels]
+kemah kem@
+kemmerer kemPP
+kemock kemok
+kemp kemp
+kemp's kemps
+kemper kempP
+kempner kempnP
+kemps kemps
+kempsville kempsvil
+ken ken
+kenansville kEn~zvil
+kendal kendL
+kendleton kendLt~
+kendra kendr@
+kenduskeag kend@skEg
+kenduskeag k~dusk/ag
+kenesaw kEns{
+kenfield kenfEld
+kenilworth kenLwVT
+kenmare kenm)r
+kenmare kenm,r
+kenmore kenm{r
+kennealy k6nElE
+kennebunk ken6buNk
+kennebunk ken@buNk
+kennedy ken6d/
+kennel kenL
+kennels kenLz
+kenner kenP
+kennesaw kens{
+kenneth ken6T
+kennett ken6t
+kenning ken6N
+kenny ken/
+kenosha k6noS@
+kenosha k@nOS@
+kenova k6nOv@
+kenova kcnOv@
+kensington kenz6Nt~
+kensington kenziNt~
+kent kent
+kentland kentland
+kentucky kcntuk/
+kentucky k~tuk/
+kentwood kentwqd
+kenvil kenv6l
+kenvil kenvL
+kenwood kenwqd
+kenyan keny~
+kenyatta keny)t@
+kenyon keny~
+keo kE]
+keokuk kE@k6k
+keomah k/om@
+keough kEO
+kepler kEplP
+kept kept
+kerekes k@rek@s
+keren kAr6n
+kermit kVm6t
+kern kVn
+kernels kVnLz
+kernersville kVnPzvil
+kerosene kar@sEn
+kerrigan kAr@gin
+kerrville kVvil
+kerstein kPstIn
+kessler keslP
+ketchem keC}
+ketchikan keC6k~
+ketchum keC}
+ketchup keCup
+kettering kedP6N
+kettl ket@l
+kettledrum kedLdrum
+kettlersville kedLPzvil
+kettlewell ket@lwel
+keven kev6n
+kevin kev~
+kewanee k6w{n/
+kewanee kyUAnE
+kewanna kyUan@
+kewaunee k6w{n/
+kewaunee kyU{nE
+key kE
+key_west kEwest
+keya_paha kE@p)h@
+keyed kEd
+keyes kAz
+keyes kEz
+keyesport kAzp{rt
+keyesport kEzp{rt
+keyhole kEhOl
+keymar kEm)r
+keypunch kEpunC
+keys kEz
+keyser kIzP
+keystone kEstOn
+keystroke kEstrOk
+keysville kEzvil
+keytesville kAtsvil
+keytesville kEt6svil
+keyworth kEwVT
+khadijah k)dij)
+khaldoun kald~
+khan k)n
+kharkiv k)rk6f
+kharkov k)rkov
+kharkov k)rk{f
+khatib katib
+khazaleh k@zal@
+khensovan kensOv@n
+khols kOlz
+khouri kUrE
+khoury k?rE
+khuu kU
+ki kE
+ki kI
+kibler kIblP
+kick kik
+kickbacks kikbaks
+kicklighter kiklItP
+kickoff kik{f
+kid kid
+kidder kidP
+kidding kid6N
+kiddingly kid6Nl/
+kidnappers kidnapPz
+kidnaps kidnaps
+kids kidz
+kiel kEl
+kielce k/eltsA
+kielice kI6lEs
+kiener kEnP
+kiernan kErn~
+kightlinger kItliNP
+kihei k6hA
+kikwit kikw6t
+kikwit kikwit
+kilborne kilb{rn
+kilbourne kilb{rn
+kilcrease kilkrEs
+kiles kIlz
+kilgore kilgP
+kilimanjaro kil6manj@r]
+kill kil
+killbuck kilb6k
+killed kild
+killeen kilEn
+killer kilP
+killgore kilgP
+killingsworth kiliNzwVT
+killington kiliNt~
+kills kilz
+kilmarnock k6lm)rn@k
+kilmichael kilm6CL
+kilmichael kilmIkL
+kilometers k6lom@tPz
+kilometers kil@mEtPz
+kilt kilt
+kim kim
+kimball kimbL
+kimbark kimb)rk
+kimberlee kimbPlE
+kimberly kimbPl/
+kimbolton kimbLt~
+kimes kImz
+kimi kimE
+kimper kimpP
+kinark kin)rk
+kincaid kiNkAd
+kind kInd
+kinda kind@
+kinder kIndP
+kindergarten kindPg)rd~
+kindergarteners kindPg)rd~nPz
+kindheartedness kindPd6dn6s
+kindle kindL
+kindling kindL6N
+kindly kIndl/
+kindness kIndn6s
+kindred kindr6d
+kinds kIndz
+kinetic k6ned6k
+king kiN
+kingan kiNg~
+kingdom kiNd}
+kingdoms kiNd}z
+kingery kiNg@rE
+kingfisher kiNfiSP
+kinghaven kiNhAv~
+kinghood kiNhqd
+kingmaker kiNmAkP
+kingpins kiNpinz
+kings kiNz
+kingsboro kiNzbV]
+kingsboro kiNzbur]
+kingsborough kiNzbV]
+kingsbridge kiNzbrij
+kingsbury kiNzber/
+kingsdale kiNzdAl
+kingsford kiNzfPd
+kingship kiNSip
+kingsland kiNzland
+kingsley kiNzl/
+kingsnake kiNsnAk
+kingsport kiNzp{rt
+kingston kiNst~
+kingston kiNzt~
+kingstown kiNzt?n
+kingstree kiNztrE
+kingsville kiNzvil
+kingsway kiNzwA
+kingswell kiNzwel
+kink kiNk
+kinney kin/
+kinsfolk kinzfOk
+kinsley kinzl/
+kinsman kinzm~
+kinst kinst
+kinstle kins@l
+kinston kinst~
+kinswoman kinzwqm~
+kinta kint@
+kinzers kinzPz
+kiplinger kipl~jP
+kippers kipPz
+kirby kVb/
+kirchgesler kPCgeslP
+kirchmeier kPCmIP
+kirk kVk
+kirkham kVk}
+kirkland kVkland
+kirklin kVkl~
+kirkman kVkm~
+kirkpatrick kVkpatr6k
+kirksville kVksvil
+kirkuk k6rkUk
+kirkville kVkvil
+kirkwood kVkwqd
+kirschner kVSnP
+kirsten kVst~
+kirtland kVtland
+kirvin kVv~
+kiser kIzP
+kissed kist
+kissel kisL
+kisser kisP
+kissimmee kis6m/
+kissimmee kis6mE
+kistenmacher kis6nm)kP
+kistle kis@l
+kit kit
+kitcat kitkat
+kitchen kiC~
+kitchenaid kiC6nAd
+kitchenette kiC6net
+kitchenware kiC~w,r
+kite kIt
+kitten kid~
+kittens kid~z
+kittery kidP/
+kittery kitP/
+kittleson kit@ls6n
+kittredge kitr6j
+kittyhawk kid6h6k
+kittyhawk kit/h{k
+kivalina kiv@lEn@
+klagenfurt kl)g~fVt
+klagenfurt kl@jenfPt
+klages klAj6z
+klamet klamet
+klapperich klap@rik
+klaus kl?s
+klegin klEg@n
+kleinknecht klInnekt
+kleinpeter klInpEtP
+klien klEn
+klimes klImz
+klinedinst klIndinst
+klinekole klInkOl
+klingel kliNg@l
+klingelhoefer kliNg@lhOfP
+klingelhoets kliNg@lhOts
+klingensmith kliN6nsmiT
+klinger kliNP
+klingerman kliNPm@n
+klinglesmith kliNg@lsmiT
+klondike klond6k
+klossner kl)snP
+kloster klOstP
+kluesner klUznP
+kmart kAm)rt
+kmiec kmEek
+knabe nAb
+knack nak
+knacks naks
+knapp nap
+knapsack napsak
+knee nE
+kneeling nEl6N
+kneepad nEp6d
+knees nEz
+kneifl nEf@l
+knelt nelt
+knew nU
+kniceley nis@lE
+knick nik
+knife nIf
+knifelike nIflIk
+knight nIt
+knighter nItP
+knighton nIt~
+knisely nIslE
+knit nit
+knitted nid6d
+knitwear nitw,r
+knives nIvz
+knoblauch n)bl)k
+knobloch n)bl)k
+knock nok
+knockdown nokd?n
+knocked nokt
+knocking nok6N
+know nO
+knowing nO6N
+knowingly nO6Nl/
+knowledge nol6j
+knowles nOlz
+known nOn
+knows nOz
+knox noks
+knoxville noksvil
+knuckles nuk@lz
+knudsen nUds6n
+knudson nUds@n
+knudsuig nUdswig
+knueppel nUp@l
+knuth nUT
+kobayashi kObI)SE
+kobe kOb/
+kobe kObA
+kochler k)ClP
+kodak kOdak
+koestler kOstlP
+kohn kOn
+koles kOlz
+kollmorgen kOlm{rg@n
+kombe kOmbE
+kong's k{Nz
+kongs k{Nz
+konigsberg kOnigzbPg
+konrad k)nrad
+konrad konrad
+koo kU
+kooistra kUEstr@
+koppel kopL
+kopperl k]perl
+kopperl kopPl
+koppers kopPz
+koran k@r)n
+korea k@rE@
+korgie k{rgE
+kornberg k{rnbVg
+kotlik kotl6k
+kouyate kUy)tA
+kovac kOvak
+kovach kOvak
+kovacs kOvaks
+kowalski k]{lsk/
+kown kOn
+kozak kOzak
+kraebel krAb@l
+kraeger krAgP
+kraemer krAmP
+krafft kraft
+krage krAg
+krager krAgP
+kramer krAmP
+kranawetter kran@wetP
+kraus kr?s
+krause kr?s
+krauss kr?s
+kravitz krav6ts
+kreeger krEgP
+kreis krIs
+kremer krAmP
+kresge krezgE
+kresgeville krezg/vil
+kresgeville krezjvil
+kretsinger kretsiNP
+kriege krEg
+kriegel krEg@l
+krieger krEgP
+krieger krEjP
+kriese krEs
+kringel kriNg@l
+kristian krisC@n
+kristiansen krisC6ns6n
+kristianson krisC@ns@n
+kristin krist~
+kristofferson krist@fPs~
+kristopher krist@fP
+kroeger krOgP
+kronemeyer krOnmIP
+kropp krop
+krstic kPst6k
+kruebbe krUeb
+kruegel krUg@l
+krueger krUgP
+krug krUg
+kruger krUgP
+krugh krU
+krulik krUlik
+krulish krUliS
+krumbholz krumhOlts
+krumm krum
+kruse krUs
+krygier krEgP
+krys kris
+krysl kris@l
+krystyna kristEn@
+kuakini kw)kEnE
+kuchenbecker kUk6nbekP
+kuchenmeister kUk6nmIstP
+kuchle kUk@l
+kuechle kUk@l
+kuehl kyUl
+kuehn kyUn
+kuehnel kyUn@l
+kuehneman kyUn@m6n
+kuenstler kwenstlP
+kuenzi kwenzE
+kugler kUglP
+kuhl kyUl
+kuhn kyUn
+kuhns kyUnz
+kules kUlz
+kulikov kUl6kov
+kulpmont kqlpmont
+kulpmont kulpmont
+kulpsville kulpsvil
+kumar kUm)r
+kumasi kUm)s/
+kunz kunz
+kuokkanen kU)k@n@n
+kursk kVsk
+kurtistown kVt6st?n
+kuske kuskE
+kuttler kutlP
+kuwait kUwAt
+kwan kw)n
+kwang kwaN
+kye kI
+kylertown kIlPt?n
+kyles kIlz
+kymberly kimbPlE
+kyra kEr@
+kyte kIt
+l el
+l l
+la lo
+la_crosse l@kr{s
+la_moure l@mqr
+la_paz l)p)z
+la_porte l@p{rt
+lab lab
+labarbera l@b)rb@r@
+labeled lAbLd
+labels lAbLz
+labor lAbP
+laboratories labr@t{r/z
+laboratory labr@t{r/
+laborers lAbPPz
+labour lAbP
+laboy l@b<
+labreche labreS
+labreck labrek
+labrecque labrek
+lac lak
+lacassagne lakasAn
+lace lAs
+lacefield lAsfEld
+lacerate las@rAt
+lacewell lAswel
+lacey lAs/
+lach l)k
+lachance l@Cans
+lachapelle l)S@pel
+lachappelle l)S@pel
+lachelle l@Sel
+lachowicz lak@wiC
+laci lAsE
+lack lak
+lackawanna lak@wan@
+lackawaxen lak@waks~
+lackeys lak/z
+lackluster laklustP
+laclair l@klAr
+lacombe l@kOm
+lacona l@kOn@
+laconia l@kOn/@
+lacorte lakOrt
+lacoste lak6st
+lacota l@kOd@
+lacota l@kOt@
+lacour l@kUr
+lacresha l@krES@
+lacroix l@kr{
+lacrosse l@kr{s
+lactating laktAd6N
+lactose lakt6s
+lacuesta l@kwest@
+lad lad
+ladawn l@d)n
+ladder ladP
+laden lAd~
+ladesma l@desm@
+ladies lAd/z
+ladle lAdL
+ladoga l@dOg@
+ladonia l@dOny@
+ladonna l@don@
+ladue lajU
+laduke l@dUk
+lady lAd/
+lady's lAd/z
+ladybird lAd/bVd
+ladybugs lAd/bugz
+ladyfinger lAd/finjP
+ladys lAd/z
+ladyship lAdESip
+laeger lAgP
+lafave l@fAv
+lafayette l@fAet
+laferte l@fPtA
+lafevers lafevPz
+lafevre l@fevr@
+laflamme l@flam
+lafleur l@flUr
+lafollette laf{let
+lafond l@f)nd
+laforest l@f{r6st
+laforte l@f{rtA
+lafortune l@f{rC@n
+laframboise l)frambw{
+lafrance l@frans
+lafrancois l@fransw{
+lag lag
+lagace lagAs
+lageman l)gm@n
+lagerman l)gPm@n
+lagerquist l)gPkwist
+lagging lag6N
+laginess lagines
+lagnese lanyEs
+lago lAg]
+lagoon l@gUn
+lagoons l@gUnz
+lagrange lagr~j
+laguardia l@gw)rd/@
+lagueux l@gyU
+lagunitas l)gUnEt)s
+lahaska l@hask@
+lahaye l@hA
+laher l)P
+lahey lAh/
+lahoma l@hOm@
+lahore l@h{r
+laid lAd
+laidlaw lAdl{
+laila lAl@
+laingsburg lANzbPg
+laingsburg lANzbVg
+lair l,r
+laird lard
+lajeunesse laZ@nes
+lajoie l@j<
+lajos lAhOs
+lajos lIhOs
+lajos lajos
+lake lAk
+lakefront lAkfrunt
+lakehead lAkhed
+lakehurst lAkhVst
+lakeland lAkl~d
+lakemoor lAkmUr
+lakemore lAkm{r
+lakeport lAkp{rt
+lakes lAks
+lakeshore lAkS{r
+lakeview lAkvyU
+lakewood lAkwqd
+lakia l@kE@
+lakiesha l@kES@
+lakin lAk6n
+laliberte l@libPtE
+lamantagne lam)ntAn
+lamar l@m)r
+lamb lam
+lamb's lamz
+lambert lambPt
+lamberton lamPt~
+lambeth lam6T
+lambs lamz
+lambsburg lamzbPg
+lambsburg lamzbVg
+lambskin lamskin
+lame lAm
+lament l@ment
+lamentation lam~tAS~
+laments l@ments
+lamesa l@mEs@
+lamiere lAm/,r
+laminates lam6nAts
+lamination lam6nAS~
+lamiraux lam6rA
+lamiraux lam6rO
+lammert lamPt
+lamoni l@mOn/
+lamont l@mont
+lamontagne l)m)ntAn
+lamore lamOr
+lamoreux l@m{rU
+lamorte l@m{rt
+lamp lamp
+lampasas lampas@s
+lampasas lampos@z
+lampley lampl/
+lamplight lamplIt
+lamplighter's lamplIdPz
+lamplighters lamplIdPz
+lampman lampm~
+lamppost lamp6st
+lampposts lamp6sts
+lamps lamps
+lampshade lampSAd
+lana lon@
+lanark lan)rk
+lancaster laNk@stP
+lance lans
+lancelet lansl6t
+lancing lans6N
+land land
+landa lond@
+landacre landAkP
+landaverde land@vArdA
+landberg landbVg
+landed land6d
+lander landP
+landfair landf,r
+landfall landf{l
+landfill landfil
+landford landfPd
+landforms landf{rmz
+landgrave landgrAv
+landholders landhOldPz
+landing land6N
+landisburg land6sbVg
+landisville land6svil
+landlady landlAd/
+landlocked landlokt
+landlord landl{rd
+landman landm~
+landmark landm)rk
+landmarks landm)rks
+landon land~
+landor landP
+landowner landOnP
+lands landz
+landsburg landzbPg
+landsburg landzbVg
+landscape landskAp
+landscaped landskApt
+landslide landslId
+landsman landzm~
+landstrom landstr}
+landum land}
+lane lAn
+lanes lAnz
+lanett lan6t
+lanett lanct
+lang =
+langby laNb/
+langdon laNgd~
+lange laN
+langeland laNland
+langelier laNlEr
+langenfeld laNg6nfeld
+langer lAnjP
+langer laNgP
+langerman laNgPm@n
+langford laNfPd
+langland laNl@nd
+langley laNl/
+langmyer laNmIP
+langner laNnP
+langsville laNzvil
+language laNgw6j
+languages laNgw6j6z
+langworthy laNwVD/
+lanham lan}
+lanka loNk@
+lanman lanm~
+lannon lan~
+lansdale lanzdAl
+lansdowne lanzd~
+lansford lanzfPd
+lansia lanS@
+lansing lans6N
+lantagne l)nt)ny@
+lantern lantPn
+lanterns lantPnz
+lanyard lanyPd
+lao l?
+laos l?s
+lap lap
+lapage lapAj
+lapful lapfL
+lapierre l)pEAr
+laplante l@plant
+lapoint lap<nt
+lapointe l@p<nt
+laporte l@p{rt
+lapre l@prA
+laprise laprEz
+lapse laps
+lapsed lapst
+lapsing laps6N
+laptop laptop
+laptops laptops
+lapwai lapwI
+laquita l@kEt@
+lara lor@
+laramie lar@m/
+larceny l)rs~/
+larch l)rC
+larco l)rk]
+laredo l@rEd]
+large l)rj
+largely l)rjl/
+larger lorjP
+largest lorj6st
+largo l)rg]
+larhonda l@r)nd@
+larisa l)r6s@
+larisa l@ris@
+larkspur l)rkspV
+laroche l@rOC
+larochelle lar{Sel
+larose l@rOz
+larouche l@
+larrison lar6s~
+larry ler/
+larsson l)rs~
+larvae l)rv/
+larynx lar6Nks
+las los
+las_animas l)san6m@s
+lasagne l@sAn
+laser lAzP
+lashanda l@S)nd@
+lashawn l@S{n
+lashings laS6Nz
+lashon l@S)n
+laske laskE
+lasker laskP
+lasseigne l@sAn
+lassen las~
+last last
+lasted last6d
+laster lastP
+lasting last6N
+lasts lasts
+latanya l@t)ny@
+latch laC
+latchford laCfPd
+late lAt
+lately lAtl/
+latent lAd~t
+later lAdP
+latest lAd6st
+latham lAT@m
+lathan lAT6n
+lathe lAD
+lathrop lATr@p
+latimer lad6mP
+latin lad~
+latino l@tEn]
+latitude lad6tUd
+latonya l@t)ny@
+latour l@tUr
+latourrette latUret
+latrobe latr@b
+latta lad@
+latter ladP
+latulipe l@tUl6p
+laub l?b
+laudenslager l)t6nsl)gP
+lauder l{dP
+lauderbaugh l{tPb{
+lauderdale l{dPdAl
+laue l?
+laugh laf
+laughary l{PE
+laughead l)fed
+laughed laft
+laughery l{PE
+laughing laf6N
+laughinghouse lafiNh?s
+laughingstock lafiNstok
+laughlin l)fl6n
+laughman lafm~
+laughner l)fnP
+laughridge lafrij
+laughter laftP
+launched l{nCt
+launchers l{nCPz
+launching l{nC6N
+laundries l{ndr/z
+laundromat l{ndr]mat
+laundry l{ndr/
+laura l{r@
+laure l{rE
+laurel l{rL
+lauren l{r~
+laurens l{r~z
+laurie l{r/
+laurinburg l{r~bVg
+lautaro l?t)r]
+lautaro l{d@r]
+lautenschlage l)t~Sl)g
+lautz l?ts
+laux l{
+lava lov@
+lavaca l@vok@
+lavallee l@valE
+lavangie lav~j/
+lavecchia lavekE@
+lavender lav~dP
+laverde l@vArdA
+lavergne l@vPn
+laverne l@vVn
+lavesque lavek
+lavigne l@vEn
+lavine l@vEn
+lavishes lav6S6z
+lavishly lav6Sl/
+lavoie l@v<
+lavone l@vOn
+lavonia l@vOn/@
+law l{
+lawbook l{bqk
+lawe l{
+lawer l{P
+lawerance l{r6ns
+lawerence l)r6ns
+lawes l{z
+lawful l{fL
+lawhead l{hed
+lawlessly l{l6sl/
+lawmakers l{mAkPz
+lawmen l{men
+lawn l{n
+lawndale l{ndAl
+lawnmower l{nmOP
+lawrence l{r~s
+lawrenceburg l{r~sbVg
+lawrenceville l{r~svil
+laws l{z
+lawsuits l{sUts
+lawtell l{tel
+lawton l{d~
+lawyer l<P
+lawyers l<Pz
+laxness laksn6s
+lay lA
+layette lAet
+layfield lAfEld
+layland lAland
+layoffs lA{fs
+layout lA?t
+layouts lA?ts
+layovers lAOvPz
+layton lAd~
+lazare laz@rA
+lazaro l@z)rO
+lazarus laz@r@s
+lazenby lAz6nbE
+lazer lAzP
+lazy lAz/
+le l@
+lea lE
+leachville lECvil
+lead lEd
+leader lEdP
+leadership lEdPSip
+leading lEd6N
+leadoff lEd{f
+leads lEdz
+leadville lEdvil
+leadville lEdvil
+leadville ledvil
+leadwood lEdwqd
+leadwood ledwqd
+leaf lEf
+leafing lEf6N
+leaflet lEfl6t
+leaflets lEfl6ts
+league lEg
+leagues lEgz
+leahey lEh/
+leahy lAhE
+leak lEk
+leakesville lEksvil
+leaks lEks
+lean lEn
+leana lEan@
+leander l/andP
+leandra lEandr@
+leandro lEandrO
+leandry lEandrE
+leaned lEnd
+leann lEan
+leanna lEan@
+leanne lEan
+leanora lE@n{r@
+leap lEp
+leapfrogged lEpfr{gd
+leapfrogging lEpfr{g6N
+leaphart lEph)rt
+leapt lept
+lear's lErz
+learn lVn
+learned lVnd
+learning lVn6N
+learnt lVnt
+lears lErz
+lease lEs
+leaser lEsP
+leash lES
+least lEst
+leasure lEZP
+leather leDP
+leatherman leDPman
+leathers leDPz
+leatherwood leDPwqd
+leathery leDP/
+leave lEv
+leavenworth lev~wVT
+leaverton lEvPt@n
+leaverworth lEvPwVT
+leaves lEvz
+leaving lEv6N
+leavings lEv6Nz
+leawood lEwqd
+lebanon leb@non
+lebanon's leb@nonz
+lebanons leb@nonz
+lebeouf l@bEf
+leblanc l@bl)Nk
+lebo lEb]
+lebouef l@bUf
+lebowitz leb]6ts
+lebrecque l@brek
+lebron l@br)n
+lecates l@kAtz
+leclair l@klAr
+leclaire l6klAr
+lecompton lek@mpt~
+lecomte l@k)mt
+lecture lekCP
+lecturers lekCPPz
+lectures lekCPz
+led led
+ledeen ledEn
+lederer lEdPP
+lederman lAtPm@n
+ledge lej
+ledger lejP
+ledgerwood lejPwqd
+ledoux l@dO
+ledyard ledy)rd
+lee lE
+leech lEC
+leechburg lECbPg
+leechburg lECbVg
+leeco lEk]
+leehy lEhE
+leer lEr
+leesburg lEzbVg
+leesport lEzp{rt
+leesville lEzvil
+leetonia l/tOny@
+leetonia l6tOn/@
+leetsdale lEtsdAl
+leeway lEwA
+leewood lEwqd
+lefave l@fav
+lefebvre l@fEvP
+lefevre l@fevr@
+leffew l6fyU
+leflore l@fl{r
+lefrak lefrak
+lefrancois l@fr)nsw)
+left left
+lefthand lefthand
+leftism leftiz}
+leftovers leftOvPz
+leftridge leftrij
+leftward leftwPd
+leg leg
+legace leg@sE
+legacy leg@s/
+legal lEgL
+legalism lEg@liz}
+legalization lEgL6zAS~
+legalize lEg@lIz
+legally lEg6l/
+legend lej~d
+legendary lej~der/
+legerski l@gPskE
+legeyt l@gAt
+legg leg
+legged leg6d
+legging leg6N
+legions lEj~z
+legislation lej6slAS~
+legislative lej6slAd6v
+legislature lej6slACP
+legislatures lej6slACPz
+legrand l6grand
+legrand legr~d
+legroom legrUm
+legs legz
+legwork legwVk
+lehi lAh/
+lehi lEh/
+lehner lenP
+lehrke lerkE
+leianna lAan@
+leigh lE
+leigha lE@
+leighann lEan
+leilani l6lon/
+leipzig lIpz6g
+leisure lEZP
+leisure leZP
+lejeune l6jUn
+lela lEl@
+leland lAl6nd
+leland lEl6nd
+leland lEl~d
+lemans l@monz
+lemaster l@mastP
+lemieux lemyU
+lemle lemlE
+lemon lem~
+lemonade lem@nAd
+lemons lem~z
+lemoore l@m{r
+lemoore lemP
+lene l@nA
+lenexa l6nEks@
+lengel leNg@l
+length leNT
+lengthened leNT~d
+lengthening leNT~6N
+lengthwise leNTwIz
+lengthy leNT/
+lennon len~
+lenny len/
+lenoci l@nOCE
+lenoir lenw)r
+lenore lenP
+lenox lenoks
+lenscrafters lenskraftPz
+lenses lenz6z
+lenske lenskE
+lent lent
+lentils lentLz
+lenzburg lenzbPg
+lenzburg lenzbVg
+leo lE]
+leod lE6d
+leod lEod
+leoma l/Om@
+leon lEon
+leona l/On@
+leonard lenPd
+leonardtown lenPdt?n
+leone l/On
+leone l/On/
+leone lAOnA
+leone lEOn
+leonel lE@nel
+leonore lE@n{r
+leonville lEonvil
+leopard lepPd
+leopards lepPdz
+leotard lE@dPd
+leoti l/Od/
+leoti l/Ot/
+lepage l@pAj
+lepore lep{r
+leprechaun lepr6kon
+leprosy lepr@s/
+leroy lEr<
+les les
+lesions lEZ~z
+leske leskE
+leslee leslE
+lesley lesl/
+leslie lesl/
+less les
+lessing les6N
+lesson les~
+lessons les~z
+lester lestP
+let let
+let's lets
+letang l6taN
+letdown letd?n
+letendre l6tendrA
+lethal lETL
+lethargy leTPj/
+lets lets
+letter letP
+letterman ledPm~
+letters ledPz
+letting led6N
+lettre letr@
+letts lets
+lettuce let@s
+leung lEuN
+levan lev6n
+levar l6v)r
+leve levE
+level levL
+level's levLz
+leveling lev6l6N
+levelland lev6land
+levelland levLland
+levels levLz
+levenberg lev~bVg
+levenson lev~s~
+levers levPz
+leverton levPt@n
+levesque l@vek
+levi lEvI
+levine l@vEn
+levinson levins@n
+levitated lev6tAd6d
+levittown lev6tt?n
+lewandowski lU@nd?skE
+lewd lUd
+lewellen lU@lin
+lewerke l@wPkE
+lewin lU~
+lewis lU6s
+lewisberry lU6sber/
+lewisburg lU6sbVg
+lewisport lU6sp{rt
+lewiston lU6st~
+lewisville lU6svil
+lexie leksE
+lexington leks6Nt~
+lexington leksiNt~
+lexmark leksm)rk
+leyden lAd~
+liana l/an@
+liane lEan
+liang lEaN
+libby lib/
+liberal librL
+liberalism libr@liz}
+liberality lib@ral6d/
+liberalization librL6zAS~
+liberals librLz
+liberatore libP@t{rE
+liberec lib@rek
+liberec lib@rets
+liberties libPd/z
+liberty libPd/
+libertytown libPd/t?n
+libertytown libPt/t?n
+libertyville libPd/vil
+libory l6b{r/
+libory lib@r/
+libory libP/
+librarian lIbr,r/~
+libraries lIbr,r/z
+library lIbrer/
+libya lib/@
+libyan liby~
+license lIs~s
+licensed lIs~st
+lichak liC@k
+lichfield liCfEld
+lichtenfeld likt6nfeld
+lichtenstein likt6nstIn
+lichtenwalner likt6nw{lnP
+licudine likyUdIn
+lid lid
+lidgerwood lijPwqd
+lids lidz
+lie lI
+lieder lEdP
+lies lIz
+life lIf
+lifeboat lIfbOt
+lifeboats lIfbOts
+lifeful lIffL
+lifeguard lIfg)rd
+lifeline lIflIn
+lifelong lIfl{N
+lifer lIfP
+lifesaving lIfsAv6N
+lifespan lIfspan
+lifestyles lIfstIlz
+lifetime lIftIm
+lifetimes lIftImz
+lift lift
+lifted lift6d
+lifting lift6N
+liftoff lift{f
+lifts lifts
+ligament lig@m~t
+light lIt
+lightbulbs lItbulbz
+lighted lId6d
+lighter lIdP
+lightfoot lItfqt
+lighthall lIth)l
+lighthill lIthil
+lighthouse lIth?s
+lighting lId6N
+lightly lItl/
+lightning lItn6N
+lights lIts
+lignite lignIt
+like lIk
+liked lIkt
+likely lIkl/
+likened lIk~d
+likeness lIkn6s
+likes lIks
+likewise lIkwIz
+lilac lIlak
+lilbourn lilbPn
+lilbourn lilb{rn
+liles lIlz
+lilesville lIlzvil
+lili lilE
+lilian lily~
+lilies lil/z
+lillich liliC
+lillie lil/
+lillington lil6Nt~
+lillington liliNt~
+lily lil/
+lima lEm@
+limaville lEm@vil
+limb lim
+lime lIm
+limehouse lImh?s
+limelight lImlIt
+limerick limP6k
+limerick limr6k
+limes lImz
+limestone lImstOn
+limestones lImstOnz
+limewater lImw{dP
+limington lIm6Nt~
+limington limiNt~
+limit lim6t
+limitations lim6tAS~z
+limited lim6d6d
+limits lim6ts
+limo limO
+limon l@mOn
+limp limp
+limpet limp6t
+linares linArz
+lincoln liNk~
+lincolnton liNk~t~
+lincolnville liNk~vil
+lincolnwood liNk~wqd
+linda lind@
+lindbergh lindbVg
+lindelof lindl)f
+lindemuth lindmuT
+linden lind~
+lindenhurst lind~hVst
+lindenwold lind~wqld
+lindgren lindgr6n
+lindholm lindh]lm
+lindhurst lindhVst
+lindner lindnP
+lindsay linz/
+lindsey linz/
+lindside lindsId
+lindstedt linsted
+line lIn
+linearity l6nEr6d/
+linearly lin/Pl/
+lineback lInbak
+linebackers lInbakPz
+linebarger lInb)rjP
+linebaugh lInb{
+lineberger lInbPgP
+lineberry lInbArE
+lined lInd
+linen lin6n
+linens lin~z
+liner lInP
+liners lInPz
+lines lInz
+lineup lInup
+linford linfPd
+lingefelt liNfelt
+lingel liNg@l
+lingelbach liNg@lb)k
+lingenfelter liNg6nfeltP
+linger liNgP
+lingerfelt liNgPfelt
+lingering liNgP6N
+lingers liNgPz
+lingg liN
+lingleville liNgLvil
+linguistical l6Ngwist6kL
+lining lIn6N
+link liNk
+linked liNkt
+linking liNk6N
+linkoping liNk@p6N
+linkoping linCVp6N
+links liNks
+linkup liNk@p
+linkups liNk@ps
+linn lin
+linneus l6nA@s
+linneus lin/@s
+lino lIn]
+linoleum l6nOl/}
+linwood linwqd
+linz linz
+lion lI~
+lionel lIn@l
+lionheart lI~h)rt
+lionhearted lI~h)rd6d
+lions lI~z
+lionville lI~vil
+liou lEU
+lip lip
+lippincott l6piNk6t
+lips lips
+lipstone lipstOn
+liquid likw6d
+liquidations likw6dAS~z
+liquor likP
+lisa lEs@
+lisbon lizb~
+lise lEs
+lisle lIsL
+lismore l6zm{r
+lismore lism{r
+lismore lizm{r
+list list
+listed list6d
+listen lis~
+listened lis~d
+listening lis~6N
+listing list6N
+listings list6Nz
+listless listl6s
+lists lists
+lit lit
+litchfield liCfEld
+literacy lid@r@s/
+literally lid@r6l/
+literary lid@rer/
+literate lid@r6t
+literature lid@r@CP
+lithia liT/@
+lithographer l6Togr@fP
+lithographs liT@grafs
+lithuania liTUAn/@
+litter lidP
+littered lidPd
+litterport lidPp{rt
+little lidL
+littlefield lidLfEld
+littlejohn lit@lj)n
+littleport lidLp{rt
+littleport litLp{rt
+littleriver lidLrIvP
+littleriver litLrivP
+littlerock lidLrok
+littlerock litLrok
+littlestown lidLzt?n
+littlestown litL6stOn
+littleton lidLt~
+littman litm~
+litton lid~
+litwin litwin
+litzinger litziNP
+livable liv@bL
+live liv
+live_oak lIvOk
+lived livd
+livelihood lIvlEhqd
+lively lIvl/
+livened lIv~d
+livengood liv6ngqd
+liver livP
+liverani livP)nE
+livermore livPm{r
+livernoche livPn)k
+liverpool livPpUl
+lives livz
+livesey lIvsE
+livestock lIvstok
+livezey lIvzE
+livigni l@vEnE
+living liv6N
+livingston liviNst~
+livingwell's liviNwelz
+livingwells liviNwelz
+livonia l6vOn/@
+liz liz
+liza lIz@
+llewellyn lUel6n
+lloyd l<d
+load lOd
+loaded lOd6d
+loads lOdz
+loafs lOfs
+loami lOm/
+loami l]om/
+loan lOn
+loaned lOnd
+lobbies lob/z
+lobby lob/
+lobbying lob/6N
+lobelville lObLvil
+lobelville l]belvil
+lobelville lobLvil
+lobes lObz
+lobo lOb]
+local lOkL
+locally lOk6l/
+locals lOkLz
+locate lOkAt
+locate l]kAt
+located lOkAd6d
+location l]kAS~
+locations l]kAS~z
+loch lok
+lochan l)k@n
+lochte l)ktE
+lock lok
+locked lokt
+lockhart lokh)rt
+lockheart l)kh)rt
+lockheed lokhEd
+lockheimer lokhImP
+lockington lokiNt~
+lockjaw lokj{
+lockout lok?t
+lockport lokp{rt
+locks loks
+locksmith loksmiT
+lockwood l)kwqd
+lockwood lokwqd
+locomotion lOk@mOS~
+locust lOk6st
+lodense lOdens
+lodestar lOdst)r
+lodge loj
+lodgepole lojpOl
+lodging loj6N
+lodrigue l)drEgA
+loewen lO6n
+lofthouse l{fth?s
+lofting l{ft6N
+loftis l{ft6s
+lofty l{ft/
+log log
+logan lOg~
+logansport lOg~zp{rt
+loganville lOg~vil
+logarithms l{g@riD}z
+logemann lOZm@n
+loges lOj6s
+logger l{gP
+logghe lOjE
+logging l{g6N
+logical loj6kL
+logically loj6kl/
+logins l)g6nz
+logiudice lOjyUdECA
+logoff log{f
+logroll logrL
+logrolling logrL6N
+logs l{gz
+lohman lOm~
+lohrville lOrvil
+loin l<n
+lois lOis
+loise lOEs
+loiseau lw)zO
+loiter l<dP
+loitering l<dP6N
+lokaphone lOk@fOn
+lokietek lOkI@tek
+lola lOl@
+lolagne lOl)ny@
+lollipops lol/pops
+lomax lOmaks
+lomb lom
+lomita l@mEd@
+lomita l]mEt@
+lonaconing lOn@kOn6N
+lonaconing lon@k~6N
+london lund~
+londonderry lund~der/
+londrina l]ndrEn@
+londrina londrEn@
+lone lOn
+loneliness lOnl/n6s
+lonely lOnl/
+lonesome lOns}
+long l{N
+long_beach l{NbEC
+longacre l)NAkP
+longboat l{NbOt
+longbotham l)Nb)t@m
+longbow l{NbO
+longdale l{NdAl
+longed l{Nd
+longenecker l)Ng@nekP
+longer l{NgP
+longerbeam l)NgPbEm
+longest l{Ng6st
+longfellow l{Nfel]
+longford l{NfPd
+longhorn l{Nh{rn
+longhouse l{Nh?s
+longhurst l{NhVst
+longingly l{N6Nl/
+longknife l)NnIf
+longley l{Nl/
+longmeadow l{Nmed]
+longmont l{Nmont
+longport l{Np{rt
+longpre l)NprA
+longs l)Nz
+longshot l{NSot
+longstreth loNgstr6T
+longsworth l{NzwVT
+longtin l)Nt6n
+longview l{NvyU
+longwave l{NwAv
+longwood l{Nwqd
+longworth l{NwVT
+lonnie lon/
+lonoke lon@k
+lonoke lonOk
+lonpoke lonp@k
+lonsdale l)nzdAl
+loo lU
+loogootee lUgUtE
+look lqk
+lookalike lqk@lIk
+looked lqkt
+looking lqk6N
+lookout lqk?t
+looks lqks
+loom lUm
+loon lUn
+loop lUp
+loopholes lUphOlz
+loops lUps
+loose lUs
+lope lOp
+lopez lOp6z
+lopez lOpAs
+lopez lOpcz
+lopilato lOp6l)tO
+lopriore lOprE{rE
+lopsided lopsId6d
+lopuzzo l@pyUtsO
+lorain l{rAn
+loramie l@rAm/
+lord l{rd
+lordsburg l{rdzbPg
+lordsburg l{rdzbVg
+lordship l{rdSip
+lore l{r
+lorean l{rEn
+loreauville l@rOvil
+loreen l{rEn
+lorelei l{r@lI
+loren l{r~
+lorenzo l@renz]
+loreta l@red@
+loretta l@red@
+loretto l@red]
+lori l{r/
+lori l{r/
+lori's l{r/z
+loriann l{rEan
+lorie l{r/
+loris l{r/z
+lorita l@rEd@
+lorraine l@rAn
+lorriane l{rEan
+lorrie l{r/
+los los
+los_alamos lOsal@mOs
+los_altos lOsalt]s
+lose lUz
+losecco lOsekO
+losey lUzE
+losing lUz6N
+loss l{s
+lost l{st
+lot lot
+lotions lOS~z
+lots lots
+lotspeich l)tspIk
+lottery lotP/
+lottsburg lotsbPg
+lottsburg lotsbVg
+loud l?d
+loudenslager l?t6nsl)gP
+loudenville l?d~vil
+louder l?dP
+loudermilk l?tPmilk
+loudest l?d6st
+loudly l?dl/
+loudmouth l?dm?T
+loudness l?dn6s
+loudon l?d~
+loudonville l?d~vil
+loudspeakers l?dspEkPz
+louella lUel@
+loughlin l)ghl6n
+loughnane l)fn@n
+loughner l)fnP
+louie lUE
+louis lUis
+louisa lUEs@
+louisbourg lU6sbVg
+louisburg lU/bVg
+louisburg lU6sbVg
+louisburg lUisbVg
+louise lUEz
+louisiana lUEz/an@
+louisiana lUz/an@
+louisiana's lUEz/an@z
+louisianas lUEz/an@z
+louissaint lUEsAnt
+louisville lU/vil
+louisville lU6svil
+louisville lU@vL
+lounge l?nj
+lounging l?nj6N
+loura l{r@
+lourdes lUrt@s
+lourie l{rE
+lousy l?z/
+louvenia lUvEnE@
+lovable luv@bL
+love luv
+loveall luv@l
+lovebird luvbVd
+loved luvd
+loveday luvdA
+lovejoy luvj<
+lovelace luvlAs
+lovelady luvlAtE
+loveland luvland
+loveless luvl6s
+lovell luv@l
+lovely luvl/
+loveman luvman
+lovensheimer luv6nSImP
+loverde l@vArdA
+loverich luvr6C
+loveridge luvrij
+lovering luvPiN
+lovers luvPz
+loves luvz
+lovesick luvsik
+lovett luv6t
+lovie lOv/
+loving luv6N
+lovings luv6Nz
+lovington loviNt~
+lovington luv6Nt~
+lovins l)v~z
+low lO
+lowbrow lObr?
+lowell lOL
+lower lOwP
+lowered lOwPd
+lowering lOwP6N
+lowermost lOwPmOst
+lowery l?PE
+lowest lO6st
+lowland lOl~d
+lowlands lOl~dz
+lowlife lOlIf
+lowndesboro l?ndzbP]
+lowndesboro l?ndzbV]
+lowpoint lOp<nt
+lowrey l?rE
+lowry l?r/
+lowville lOvil
+loxley loksl/
+loyal l<L
+loyalist l<L6st
+loyalties l<Lt/z
+loyalty l<Lt/
+loyd l<d
+loyola l<Ol@
+loysville l<zvil
+lozenge loz~j
+luanne lUan
+lubbock lub@k
+lubricant lUbr6k~t
+lubricate lUbr6kAt
+lubrication lUbr6kAS~
+lucasville lUk6svil
+lucasville lUk@svil
+lucchesi lUCesE
+lucedale lUsdAl
+lucent lUs~t
+lucerne lUsVn
+lucia lUCE@
+lucie lUs/
+lucile lUsEl
+luck luk
+lucksinger luksiNP
+lucky luk/
+lucrative lUkr@d6v
+lucratively lUkr@d6vl/
+lucrecia lUkrES@
+lucy lUs/
+ludeman lUdm6n
+ludewig ludwig
+ludgate ludgAt
+ludgood ludgqd
+ludington lUdiNt~
+ludlow ludl]
+ludlum's ludl}z
+ludlums ludl}z
+ludowici lUd]is/
+luebbers lUbPz
+luechtefeld lUCt@feld
+luecke lU6kE
+luedeman lUd@m6n
+lueders lU6dPz
+luella lUel@
+luerssen lU,rs~
+luetkemeyer k@mIP
+luetta lUet@
+lufkin lufk6n
+lufkin lufk~
+lugansk lUgansk
+lugansk lUg~sk
+luggage lug6j
+lugoff lugof
+lugoff lug{f
+lugworms lugwVmz
+luigi lUEjE
+luis lUEs
+luisa lUEs@
+luise lUEz
+luisi lUEsE
+luiso lUEsO
+lula lUl@
+lullaby lul@bI
+lulu lUlU
+lumber lumbP
+lumberjack lumbPjak
+lumberton lumbPt~
+lumberville lumbPvil
+lumberyard lumbPy)rd
+lumpfish lumpfiS
+lumpish lump6S
+luna lUn@
+lunatics lUn@tiks
+lunceford lunsfPd
+lunch lunC
+luncheonette lunC/@net
+lunches lunC6z
+lunchroom lunCrUm
+lunchtime lunCtIm
+lunderville lundPvil
+lundgreen lundgrEn
+lundgren lundgr6n
+lungfish luNfiS
+lungs luNz
+lupe lUpA
+lupus lUp@s
+lure lUr
+lurgan lVg~
+lurgan lqrg~
+lurid lUr6d
+luridly lUr6dl/
+lurks lVks
+lush luS
+lushness luSn6s
+lusignan lUsiny)n
+lusk lusk
+lutcher luCP
+luther TP
+luther lUTP
+lutheran lUT@r~
+luthern lUDPn
+luthersburg lUTPzbVg
+luton lUd~
+luton lUt~
+luttrell lutrel
+luu lU
+luxemburg luks}bVg
+luxon luks@n
+luxurious lugZV/6s
+luxuriously lugZV/6sl/
+luxuriousness lugZV/6sn6s
+luxury lukSP/
+luz lUs
+luzern lUzPn
+luzern lUzVn
+lydia lid/@
+lydian lid/~
+lying lI6N
+lykes lIks
+lykins lIk6nz
+lyles lIlz
+lymph limf
+lyn lin
+lynbrook linbrqk
+lynch linC
+lynchburg linCbPg
+lynchburg linCbVg
+lynden lind~
+lyndon lind~
+lyndonville lind~vil
+lyndsay linsE
+lynetta l@net@
+lynford linfPd
+lynn lin
+lynndale lindAl
+lynnfield linfEld
+lynnwood linwqd
+lynwood linwqd
+lyrical lEr6kL
+lytle lit@l
+lytton lid~
+lyza liz@
+m em
+m m
+ma'am mam
+maam mam
+maastricht m)str6kt
+mabank mAbaNk
+mabel mabL
+mabelvale mAbLvAl
+mabelvale mabLvAl
+mableton mAbLt~
+mabscott mabskot
+macabre m@kobr@
+macadam mak@d}
+macao m@k?
+macao m@kA]
+macao mak?
+macaraeg m6karAg
+macaroni mak@rOn/
+macbeth m6kbeT
+maccarone mak@rOn
+maccartney m@k)rtnE
+macdonald m6kdonLd
+macdougall m6kdUg@l
+macdowell m6kd?L
+macduff m6kduf
+mace mAs
+maceachern m@kECPn
+macedon mas6d~
+macewen m@kyU@n
+macfar_laneplaza m6kforlAn&plaz@
+macfarland m6kf)rland
+macfarlane m6kf)rl@n
+macgowan m@kg?6n
+macgregor m6kgregP
+macguire m@gwIr
+mach m)k
+machain makAn
+machamer m6khamP
+machele m@Cel
+machelle m@Sel
+machenry m6khenrE
+machesney m@Cezn/
+machine m@SEn
+machined m@SEnd
+machinery m@SEnP/
+machines m@SEnz
+macho moC]
+machold makOld
+maciejczyk m@sEjC6k
+macintosh mak~toS
+macintyre makintIr
+macisaac m@kIzik
+maciver m@kIvP
+macivor m@kIvP
+mackay m@kA
+mackerel mak@rL
+mackey mak/
+mackham mak}
+mackinaw mak6n{
+mackintosh mak~toS
+macklin makl~
+macksburg maksbPg
+macksburg maksbVg
+macksville maksvil
+maclaren m@klar6n
+maclean m@klAn
+macleod m@kl?d
+macmahon m6kman
+macmillan m6kmil@n
+macmullen m6kmul~
+macneil m6knEl
+macomb m6kom
+macomber m@kOmP
+macon mAk~
+macpherson m@kfirs@n
+macungie m@kunj/
+macwilliams m6kwily}z
+macy's mAs/z
+macys mAs/z
+mad mad
+madam mad}
+madcap madkap
+madden mad~
+maddest mad6st
+maddox madoks
+made mAd
+madeleine mad@lAn
+madge maj
+madin mad~
+madison mad6s~
+madole mad@lE
+madonna m@don@
+madore m@d{rE
+madras m@dras
+madras madr6s
+madras madr@s
+madre modrA
+madrid m@drid
+madstones madstOnz
+mae mA
+maeda mAt@
+maegan mAg@n
+maenius mAnE@s
+maes mAz
+maestre mIstr@
+magadan m)g@d)n
+magalia m@gAl/@
+magalia mag@lE@
+magallanes mag@lAnz
+magazine mag@zEn
+magazines mag@zEnz
+magdalen magd@l@n
+magdalena magdal~@
+magee m@gE
+magelssen mAj@ls@n
+magen mAg@n
+mages mAj6z
+maggini m@jEnE
+maggio maj/]
+magically maj6kl/
+magician m@jiS~
+magicians m@jiS~z
+magierski m@jErskE
+magil m@gil
+magill m@gil
+magin mag6n
+maginn m@gin
+maginnis m@gin6s
+magistrale maj6str)lE
+magistrate maj6strAt
+maglaughlin m@gl{fl6n
+magleby mAg@lbE
+maglione maglEOnE
+magnanimously magnan6m@sl/
+magner manP
+magnesium magnEz/}
+magnetism magn6tiz}
+magnetize magn6tIz
+magnifications magn6f6kAS~z
+magnificent magnif6s~t
+magnificently magnif6s~tl/
+magnified magn6fId
+magnolia magnOl/@
+magnum magn}
+magnuson magn@s6n
+magpie magpI
+maguire m@gwIr
+magyar magyP
+mahan man
+mahaska m@hask@
+maher m)P
+mahler molP
+mahnomen m@nOm~
+mahogany m@hog~/
+mahomes m@hOmz
+mahon man
+mahone m@hOnE
+mahoney mah~/
+mahopac m@hOpak
+mahopac mah@pak
+mahwah m)w)
+mahwah mow@
+maid mAd
+maidenform mAd~f{rm
+maidens mAd~z
+maids mAdz
+maids' mAdz
+maignan mAny@n
+mail mAl
+mailbox mAlboks
+mailed mAld
+mails mAlz
+mailson mAls~
+main mAn
+maine mAn
+maineville mAnvil
+mainframes mAnfrAmz
+mainlanders mAnlandPz
+mainly mAnl/
+mainsail mAnsAl
+mainstays mAnstAz
+mainstream mAnstrEm
+maintain mAntAn
+maintained mAntAnd
+maintaining mAntAn6N
+maintenance mAntn~s
+maintenance mAnt~~s
+mainville mAnvil
+maiorano mA{r)nO
+maitland mAtland
+maize mAz
+major mAjP
+majorie mAj@rE
+majoring mAjP6N
+majorities m@j{r6d/z
+majority m@j{r6d/
+majors mAjPz
+make mAk
+makepeace mAkpEs
+maker mAkP
+makes mAks
+makeshift mAkSift
+making mAk6N
+malabe mal@bE
+malabo m@l)b]
+malabo m@lab]
+malachi mal@kI
+maladies mal@d/z
+malakoff malak{f
+malang m@l)N
+malang malaN
+malaria m@l,r/@
+malatya m@laty@
+malaysia m@lAZ@
+malboeuf m)lbEf
+malchev malCev
+malcolm malk}
+malcom malk}
+malcomson malk@ms@n
+malden mald~
+malden m{ld~
+male mAl
+malegaon m)l@g?n
+malegaon m@legA~
+malekzadeh malekzade
+males mAlz
+malevolently m@levL~tl/
+maley mAlE
+malformed malf{rmd
+malfunction malfuNkS~
+malfunctioning malfuNkS~6N
+malibu mal6bU
+maliciousness m@liS@sn6s
+malignancy m@lign~s/
+malika malik@
+malinchalk mal6nC)k
+mall m{l
+malloch mal@k
+malloy m@l<
+malls m{lz
+malmo malmP
+malmo malm]
+malnutrition malnUtriS~
+malnutritions malnUtriS~z
+maloch mal)k
+malone m@lOn
+maloney m@lOnE
+malorie mal@rE
+malt m{lt
+malta m{lt@
+maltreatment maltrEtm~t
+malvern m{lvPn
+malvert malvPt
+mama mom@
+mamaroneck m@mar~ck
+mamaroneck mamr]nek
+mammals mamLz
+mammoth mam@T
+man man
+man's manz
+mana mon@
+manage man6j
+managed man6jd
+management man6jm~t
+manager man6jP
+manageress man6jP6s
+managers man6jPz
+managua m@n)gw@
+managua man@gw@
+manassas m@nas6s
+manassas m@nas@s
+manasse m@nasE
+mancelona mans6lOn@
+mancelona mans@lOn@
+manchester manC@stP
+manchester manCestP
+mancilla mansEl@
+mandalay mand@lA
+mandan mand~
+mandated mandAd6d
+mandates mandAts
+mandatory mand@t{r/
+mandel mandel
+mandrake mandrAk
+maness man6s
+maneuverability m@nUvP@bil6d/
+maneuvering m@nUvP6N
+manford manfPd
+manfred manfred
+mangiamele m)ndZ@melE
+mangling maNgl6N
+mango maNg]
+manhattan manhad~
+manhood manhqd
+manifest man6fest
+manifests man6fests
+manila m@nil@
+maning mAn6N
+manipulation m@nipy6lAS~
+manito m@nEd]
+manito manIt]
+manitoba man6tOb@
+manitou man6tU
+mankato maNkod]
+mankato mankAt]
+mankind maNkInd
+mankind's maNkIndz
+mankinds maNkIndz
+manly manl/
+mann man
+manned mand
+manner manP
+mannerism manPiz}
+mannerisms manPiz}z
+mannerless manPl6s
+manners manPz
+mannheim manhIm
+manning man6N
+mannsville manzvil
+manomet m)n]met
+manor manP
+manorhaven manPhAv~
+manors manPz
+manpower manp?P
+manpower's manp?Pz
+manpowers manp?Pz
+manquero maNkArO
+mans manz
+mansfield manzfEld
+mansion manS~
+mansker manskP
+mantel mantL
+manteno mantEn]
+manteno manten]
+manteno mant~]
+manternach mantPn)k
+manthe manT
+mantle mantL
+mantorville mantPvil
+mantua manCU@
+mantua mantU@
+manual manyUL
+manufactur many6faktP
+manufactured many6fakCPd
+manufacturer many6fakCPP
+manufacturers many6fakCPPz
+manufacturing many6fakCP6N
+manure m@nUr
+manus man@s
+manvel manvL
+manville manvil
+manx maNks
+many men/
+manzione manzEOnE
+map map
+mapes mAps
+maple mApL
+maples mAp@lz
+mapleton mApLt~
+mapleview mApLvyU
+maplewood mApLwqd
+maps maps
+mapstone mapstOn
+maquon makw~
+mar m)r
+marable mer@b@l
+maragaret m)r@gret
+marais mArAs
+marathon mar@Ton
+marathons mar@Tonz
+marauding m@r{d6N
+marble m)rbL
+marblehead m)rbLhed
+marblemount m)rbLm?nt
+marblemount m)rbl6m?nt
+marbleton m)rbLt~
+marbling m)rbl6N
+marc m)rk
+marceline m)rs6l~
+marcellus m)rsel@s
+march m)rC
+marchbanks m)rCbaNks
+marchwood m)rCwqd
+marci m)rs/
+marcia m)rS@
+marcinkowski m)rk6n?skE
+marcola m)rkOl@
+marconi morkOn/
+marcoux kO
+marcum m)rk}
+marcus m)rk@s
+marcy m)rs/
+mardela m)rdel@
+marden m)rd~
+mardy m)rd/
+mare m,r
+mare's m,rz
+maready maredE
+marenisco mar@nisk]
+mares m,rz
+marfa m)rf@
+marg m)rj
+margar m)rg)r
+margar m)rgP
+margaret m)rgr6t
+margaret margr6t
+margarette m)rg@ret
+margarita m)rg@rEd@
+margate m)rgAt
+margeret m)rgret
+margert m)rgPt
+margery morjP/
+marget m)rg6t
+margit m)rg6t
+margorie m)rj@rE
+margot m)rgO
+marguerite m)rg@rEt
+maria m@rE@
+mariam m,r/}
+mariana m,r/on@
+marias m@rE@z
+maricopa mar6kOp@
+maricopy m@rik@p/
+maricruz mArEkrUz
+marie m@rE
+marienville m,r/~vil
+marienville mar/~vil
+marietta m,r/ed@
+marilou mArElU
+marilu mArElU
+marilyn mar6l~
+marilynn mArElin
+marina m@rEn@
+marine m@rEn
+marine's m@rEnz
+mariners mar~Pz
+marines m@rEnz
+marinette mar6net
+maringa m@riNg@
+marino m@rEn]
+mario m)rEO
+mario m,rEO
+marion m,r/~
+marionville m,r/~vil
+mariposa mar6pOs@
+mariscal m)risk)l
+marissa m@ris@
+marital mar6dL
+marjorie morj@r/
+mark m)rk
+mark m)rk
+mark's m)rks
+markdowns m)rkd?nz
+marked m)rkt
+market m)rk6t
+marketing m)rk6d6N
+marketplace m)rk6tplAs
+marketplaces m)rk6tplAs6z
+markets m)rk6ts
+markham m)rk}
+markleton m)rkLt~
+markleville m)rkLvil
+marks m)rks
+marksberry m)rksber/
+marksmanship m)rksm~Sip
+marksville m)rksvil
+markus m)rk@s
+marl m)rl
+marlboro m)rlbV]
+marlborough m)rlbV]
+marlborough m)rlbur]
+marlene m)rlEn
+marley m)rl/
+marlin m)rl~
+marline m)rlEn
+marlo m)rl]
+marlow m)rl]
+marlowe m)rl]
+marlton m)rlt~
+marlynne m)rl~
+marmaduke m)rm@dUk
+marmalade m)rm@lAd
+maroa marO@
+maroa mar]@
+maroney m@rOnE
+maroon m@rUn
+marooned m@rUnd
+maroun m@rUn
+marple m)rpL
+marples m)rp@lz
+marquam m)rkw}
+marquardt m)rkw)rd
+marque m)rk
+marquerite m)rkPEt
+marques m)rkes
+marquetta m)rket@
+marquis m)rkEs
+marquita m)rkEt@
+marquitta m)rkEt@
+marra m)r@
+marriage mar6j
+married m,r/d
+marriot m,r/6t
+marriott m,r/6t
+marris mar6s
+marron mar~
+marrow mar]
+marrs m)rz
+marrujo m@rUhO
+marsalis m)rsL6s
+marsh m)rS
+marsh's m)rS6z
+marsha m)rS@
+marshall m)rSL
+marshalled m)rSLd
+marshalls m)rSLz
+marshallville m)rSLvil
+marshes m)rS6z
+marshfield m)rSfEld
+marshland m)rSland
+marshmallows m)rSmel]z
+marshs m)rS6z
+marshville m)rSvil
+marske skE
+marston m)rst~
+marstons m)rst~z
+mart m)rt
+marte m)rtE
+martelle m)rtel
+marten m)rd~
+martensdale m)rd~zdAl
+martha m)rT@
+martha's m)rT@z
+marthas m)rT@z
+marthe m)rt@
+martial m)rSL
+martin m)rd~
+martin m)rt~
+martin's m)rd~z
+martindale m)rd~dAl
+martineau m)rd~nO
+martines m)rtEn6s
+martinez m)rtEn6z
+martinez m)rtEncz
+martingale m)rtiNgAl
+martinkus m)rtiNk@s
+martino mortEn]
+martins m)rd~z
+martinsburg m)rd~zbVg
+martinsburg m)rt~zbVg
+martinsdale m)rt~zdAl
+marton m)rd~
+martyr m)rdP
+marvel m)rvL
+marveled m)rvLd
+marvell m)rvel
+marvell morvel
+marvelous m)rv6l@s
+marvelously m)rv6l@sl/
+marvin m)rv~
+marxist m)rks6st
+mary m,r/
+mary mer/
+maryalice mArEal@s
+maryanna mArEan@
+maryanne mArEan
+marybelle mArEbel
+marybeth m,r/beT
+marydel m,r/del
+maryellen mArEel6n
+maryjane mArEjAn
+maryjo mArEjO
+maryland mAr@l~d
+maryland mar6l~d
+marylee mArElE
+marylou m,r/lU
+marylouise mArElUEz
+maryrose mArErOz
+maryruth m,r/rUT
+marysvale m,r/zvAl
+marysville m,r/zvil
+maryville m,r/vil
+marzinske m)rzinskE
+mas m)s
+mascagni m@sk)nE
+mascoutah m@sk?d@
+mascoutah maskUt@
+masculine masky6l~
+masefield mAsfEld
+maseru maz@rU
+mash maS
+masha moS@
+mask mask
+masks masks
+mason mAs~
+masonry mAs~r/
+masquerade mask@rAd
+mass mas
+massachusetts mas@CUs6ts
+massachusetts mas@CUs@ts
+massacre mas@kP
+massacred mas@kPd
+massacres mas@kPz
+massage m@soZ
+massaged m@soZd
+massapequa mas@pekw@
+massengill mas6ngil
+massiah m@sI@
+massie mas/
+massillon mas6lon
+massingill masingil
+massive mas6v
+master mastP
+master's mastPz
+masterful mastPfL
+masterfully mastPfl/
+mastermind mastPmInd
+masterpiece mastPpEs
+masters mastPz
+masthead masthed
+mastoris mast{ris
+mastrogiovann mastrOjEOvan
+matadi m@tod/
+matador mad@dP
+matalavage met@lavij
+matane m@tAn
+matane matAn
+matawan mad@w~
+match maC
+matchbox maCboks
+matched maCt
+matches maC6z
+matchlock maClok
+matchlocks maCloks
+mate mAt
+mateo m@tA]
+material m@tEr/L
+materialistic m@tEr/@list6k
+materials m@tEr/Lz
+mates mAts
+matesic m@tesik
+matewan mat@won
+matey mAtE
+mathe maTE
+mathematic maT6mad6k
+mathematical maT6mad6kL
+mathematically maT6mad6kl/
+mathematician maT6m@tiS~
+mathematics maT6mad6ks
+mathers mADPz
+mathewes maTyUz
+mathews maTyUz
+mathewson maTyUs@n
+mathias matE@z
+mathias matI@z
+mathieu maTyU
+mathilda m@tild@
+mathilde m@tild@
+mathiston maT6st~
+matias m@tE@s
+matilda m@tild@
+matilde m@tild@
+matinicus m@tin6k@s
+matinicus m@tin@k@s
+matonak mat@nak
+matone m@tOn
+matrimony matr6mOn/
+mats mats
+matsubara m)tsUb)r@
+matsubara mats6bor@
+matsuura matsUr@
+matt mat
+mattapan mad@pan
+mattapan mat@pan
+mattawa m@tow@
+mattawan mad@w~
+mattawan mat@won
+mattel madL
+matter madP
+matterhorn madPh{rn
+matters madPz
+matteson mad6s~
+matthew maTyU
+matthews maTyUz
+matthewson maTyUs@n
+matthiesen maTE@s@n
+mattingley matiNlE
+mattingly matiNlE
+mattoon m@tUn
+mattress matr6s
+mattresses matr6s6z
+maturation maC@rAS~
+matured m@CUrd
+maturin m)t@rEn
+maturin maC@r~
+maturity m@tUr6d/
+matute m@tUtE
+matzinger matziNP
+mauckport m{kp{rt
+maude m{d
+maui m?/
+mauldin m{ld~
+maureen m{rEn
+mausoleum m{z@lE}
+mauston m{st~
+mautino m{tEnO
+maverick mavr6k
+mawhorter m)w{rtP
+max maks
+maxey maksE
+maxfield maksfEld
+maxie maksE
+maxima maks6m@
+maximal maks6mL
+maximize maks6mIz
+maximized maks6mIzd
+maximo maks@mO
+maximum maks6m@m
+maxine maksEn
+maxon maks6n
+maxwell makswel
+maxwell's makswelz
+maxwells makswelz
+maxwelton makswLt~
+maxwelton makswclt~
+may mA
+mayan mA~
+maybe mAbE
+mayday mAdA
+maydelle mAdel
+mayer's mAPz
+mayers mAPz
+mayes mAz
+mayesville mAzvil
+mayfair mAf,r
+mayflower mAfl?P
+mayhem mAhem
+mayhugh mAhyU
+mayland mAland
+maynard mAnPd
+mayne mAn
+mayo mA]
+mayol mI{l
+mayonnaise mA@nAz
+mayoral mAr@l
+maypearl mApPl
+maypearl mApVl
+maypole mApOl
+mayport mAp{rt
+mays mAz
+maysville mAzvil
+maytag mAtag
+maytorena mAt@rEn@
+maytown mAt?n
+mayview mAvyU
+mayville mAvil
+mayweather mAweDP
+maze mAz
+mazola m@zOl@
+mazomanie maz@mAn/
+mazon mAz~
+mazzillo m@tsilO
+mcabee mak@bE
+mcadams m6kad@mz
+mcadenville m6kAd~vil
+mcadoo m6kadU
+mcafee mak@fE
+mcalister m6kal6stP
+mcallen m6kal~
+mcandrew m6kandrU
+mcarthur m6k)rTP
+mcaskill m6kask6l
+mcatee mak@tE
+mcavoy mak@v<
+mcbain m6kbAn
+mcbaine m6kbAn
+mcbee m6kbE
+mcbrayer m6kbrAP
+mcbride m6kbrId
+mcbrien m6kbrI~
+mccain m6kAn
+mccamey m6kAm/
+mccammon m6kam~
+mccandles m6kand@lz
+mccann m6kan
+mccarran m6kar~
+mccarren m6kar~
+mccarron m6kar~
+mccarthy m6k)rT/
+mccarthy's m6k)rT/z
+mccarthys m6k)rT/z
+mccartney m6k)rtn/
+mccaskill m6kozkil
+mccay m6kA
+mcchesney m6kCeznE
+mcchristian m6krisC6n
+mccier m6kIP
+mcclain m6klAn
+mcclaughry m6kl?rE
+mcclean m6k
+mccleary m6klEr/
+mcclendon m6klend~
+mccleod m6kl?d
+mccloskey m6klosk/
+mccloutenburg m6kl?d~bVg
+mccloy m6kl<
+mcclure m6klUr
+mccole m6kOl
+mccoll m6kOl
+mccollough m6kul@
+mccollum m6kol}
+mccomb m6kOm
+mccomber m@kOmP
+mccombs m6kOmz
+mcconaghy m6k)n@hE
+mcconaughy m6k)n@hE
+mcconnaughey m6k)n@hE
+mcconnaughhay m6k)n@hA
+mcconnaughy m6k)n@hE
+mcconnell m6k{n@l
+mccooey m@kUE
+mccormick m6k{rm6k
+mccoys m6k<z
+mccrae m6krA
+mccrea m6krA
+mccrea m6krE
+mccrory m6kr{r/
+mccue m6kyU
+mccuistion m6kwEstE6n
+mccullagh m6kul@
+mcculloch m6kul6k
+mccullough m6kul@
+mcculough m6kulu
+mccurry m6kV/
+mccurtain m6kVd~
+mccusker m6kuskP
+mccutcheon m6kuC/~
+mcdaniel m6kdany@l
+mcdaniels m6kdanyLz
+mcdavid m6kdAv6d
+mcdonagh m6kd)n@
+mcdonald m6kdonLd
+mcdonnell m6kdonL
+mcdonough m6kdonO
+mcdougal m6kdUgL
+mcdougald m6kdUg@ld
+mcdougall m6kdUg@l
+mcdowell m6kd?L
+mcelreath mak@lrET
+mcelveen m6kelvEn
+mcelwain mak6lwAn
+mcelwaine mak6lwAn
+mcentee mak6ntE
+mcentire mak6ntIr
+mcentyre mak6ntIr
+mcevoy mak6v<
+mcewen m6kyU~
+mcfadden m6kfad~
+mcfall m6kf{l
+mcfarland m6kforland
+mcfarlane m6kf)rl6n
+mcgahan m6gan
+mcgeachy m@gECE
+mcgeary m6kgErE
+mcgee m6gE
+mcgeehan m6gEh6n
+mcgeever m6kgEvP
+mcgehee m6kg@hE
+mcgehee m6kjeE
+mcgeorge m6kj{rj
+mcgettigan m6kget6g6n
+mcghehey m6gAhE
+mcgillen m6gil~
+mcglynn m6glin
+mcgovern m6guvPn
+mcgowan m6g?6n
+mcgowan m6g?~
+mcgowen m6g?6n
+mcgregor m6gregP
+mcgregory m6greg@r/
+mcgugin m6gUg6n
+mcguire m6gwIr
+mcguyer m6gIP
+mchale m6khAl
+mchan m@kan
+mchenry m6khenr/
+mchugh m6khyU
+mchughes m6khyUz
+mcilvenny mak@lvAnE
+mcilwain mak6lwAn
+mcintire makintIr
+mcintosh m6kintoS
+mcintosh makint)S
+mcinture makintUr
+mcintyre makintIr
+mcisaac m@kIzik
+mciwraith m6kEraT
+mckane m6kAn
+mckay m6kA
+mckechnie m6keknE
+mckee m6kE
+mckeesport m6kEzp{rt
+mckeller m6kelP
+mckenna m6ken@
+mckeon m@kE@n
+mckeown m@kE@n
+mckinley m6kinl/
+mckinney m6kin/
+mckinnley m6kinl/
+mckinnon m6kin~
+mckittrick m6kitr6k
+mcknight m6knIt
+mclauchlin m6kl{kl6n
+mclauglin m6gl)klin
+mclean m6klEn
+mclemore makl@m{r
+mcleod m6klaOd
+mcleoud m6kl)Od
+mcloughlin m6kl)fl6n
+mcmahan m6kman
+mcmahon m6kman
+mcmains m6kmAnz
+mcmann m6kman
+mcmanus m6kman@s
+mcmartin m6km)rd~
+mcmaster m6kmastP
+mcmechen m6kmek~
+mcmichael m6kmIkL
+mcmicheal m6kmIk@l
+mcmillan m6kmil~
+mcmiller m6kmilP
+mcmurphy m6kmVf/
+mcmurphy's m6kmVf/z
+mcmurphys m6kmVf/z
+mcmurray m6kmV/
+mcmurry m6kmV/
+mcnab m6knab
+mcnabb m6knab
+mcnally m6knal/
+mcnamara m6kn@mor@
+mcnamara makn@mAr@
+mcnamee makn@mE
+mcneil m6knEl
+mcneill m6knEl
+mcneilly m6knEl/
+mcnicholas m6knikL6s
+mcnichols m6knikOlz
+mcnutt m6knut
+mcomber m6kOmP
+mcowen m@kaw@n
+mcphearson m6kfErs~
+mcpherson m6kfVs~
+mcphillips m6kfil@ps
+mcrae m@krA
+mcreynolds m6krAn@ldz
+mcroberts m6kr)bPts
+mcrory m6kr{r/
+mcroy m6kr<
+mcshane m6kSAn
+mctighe m6ktEg
+mcvaigh m6kvA
+mcwaters m6kw{dPz
+mcwhirter m6kwPtP
+mcwhorter m6kw{rdP
+mcwright m6krIt
+me mE
+mead mEd
+meadow med]
+meadowridge med]rij
+meadows med]z
+meadowview med]vyU
+meadowville med]vil
+meadville mEdvil
+meager mEgP
+meagerness mEgPn6s
+meagher mEgP
+meal mEl
+meals mElz
+mealtime mEltIm
+mealynosed mEl~6st
+mean mEn
+meandered m/andPd
+meandering m/andP6N
+meaning mEn6N
+meaningful mEniNfL
+meaningless mEniNl6s
+meaninglessly mEniNl6sl/
+means mEnz
+meant ment
+meanwhile mEnwIl
+meares mErz
+measurability meZP@bil6d/
+measurable meZP@bL
+measure meZP
+measured meZPd
+measurement meZPm~t
+measurements meZPm~ts
+measurers meZPPz
+measures meZPz
+measuring meZP6N
+meat mEt
+meatball mEtb{l
+meats mEts
+mecca mek@
+mech mek
+mechanical m6kan6kL
+mechanism mek@niz}
+mechelle m@Sel
+mecklenburg mekl~bVg
+mecklinburg mekl~bVg
+medal medL
+medallion m6daly~
+medcalf medkaf
+meddlesome medLs}
+medfield medfEld
+medford medfPd
+media mEd/@
+median mEd/~
+mediapolis mEd/apL6s
+mediapolis mEd/op@l6s
+medical med6kL
+medicare med6k,r
+medication med6kAS~
+medications med6kAS~z
+medici m@dECE
+medicine med6s~
+medieval midEvL
+mediocre mEd/OkP
+mediocrity mEd/okr6d/
+mediterranean med6t@rAn/~
+medium mEd/}
+mediumwave mEd/}wAv
+medora m6d{r@
+medusa m6dUs@
+medved medved
+medway medwA
+medwick medw6k
+meekly mEkl/
+meet mEt
+meeteetse m/tEts/
+meeteetse mEd6ts
+meeting mEd6N
+meetings mEt6Nz
+meets mEts
+megaphone meg@fOn
+megara @g)r@
+megara m6gor@
+megeath m@gET
+meger mEgP
+megha meg@
+meginnes m6gin6s
+megivern m6givPn
+megna meny@
+mehat mehat
+meier mIP
+meierhofer mIPh)fP
+meinert mInPt
+meir mIr
+meire mIr
+mejia m@hE@
+mejias m@hE@s
+mejorado meh{r)dO
+mel mel
+melamed mel@med
+melancholy mel6Nkol/
+melancon m@lans@n
+melani mel@nE
+melanie mel@nE
+melanson m@lans@n
+melba melb@
+melbourne melb{rn
+melchiorre melCE{rA
+meldrim meldr6m
+meldrim meldr}
+melford melfPd
+meliorate m6lI@rAt
+melissa m6lis@
+melle mel
+mellenville mel~vil
+mellett mel6t
+mellette m6let
+mello mel]
+mellott mel6t
+mellow mel]
+melnick meln6k
+meloan mElOn
+meloche mel)k
+melodee mel@dE
+melodi mel@dE
+melodie mel@tE
+melodious m6lOd/@s
+melodramatic mel@dr@mad6k
+melody mel@d/
+melon mel~
+melrose melrOz
+melrose melr]z
+melstone melstOn
+meltdown meltd?n
+melted melt6d
+melting melt6N
+melverk melvPk
+melvern melvPn
+member membP
+members membPz
+membership membPSip
+membranes membrAnz
+memo mem]
+memorex mem@reks
+memorial m6m{r/L
+memorials m6m{r/Lz
+memories mem@r/z
+memorized memPIzd
+memory memP/
+memphis memf6s
+men men
+menaces men@s6z
+menagerie m6naZ@r/
+mend mend
+mendelsohn m~dels~
+mendibles mend@b@lz
+mendocino mend@sEn]
+mendota m~dOd@
+meneley menlE
+menge meN
+mengel meNg@l
+mengel meNgL
+menges meNg6s
+mengsteab meNstEb
+menial mEn/L
+menlo menl]
+menlo_park menl]p)rk
+menno men]
+menomonee m@nom@nE
+menomonee men@m@nE
+mensinger mensiNP
+menswear menzw,r
+mental mentL
+mentality mental6d/
+mentally mentL/
+menthol menT{l
+mention menS~
+mentioned menS~d
+mentone ment~
+mentor mentP
+mentor's mentPz
+mentors mentPz
+menu menyU
+menus menyUz
+meow mE?
+mequon mekw~
+merced mPsed
+mercedes mPsAdEz
+mercenary mVs6ner/
+mercer mVsP
+merchandise mVC~dIz
+merchandisers mVC~dIzPz
+merchandising mVC~dIz6N
+merchant mVC~t
+merchantmen mVC~tm~
+merchants mVC~ts
+merchantsbank mVC~tsbaNk
+mercies mVs/z
+merciful mVs6fL
+mercifully mVs6fl/
+mercilessly mVs6l6sl/
+mercury mVky@r/
+mere mEr
+merely mErl/
+merganthaler mPg@nT)lP
+merge mVj
+merger mVjP
+mergers mVjPz
+meriden mar6d~
+meriden mer@d~
+merideth mAr@t6T
+meridian m@rid/~
+merigold mar6gLd
+merigold mer6gOld
+merion mEr/~
+merit mar6t
+merkl mPk@l
+merlin mVl~
+merlo mVl]
+merlyn mPl@n
+mermaids mVmAdz
+merman mVman
+merone m@rOn
+merriam m,r/}
+merrick mar6k
+merrill mAril
+merrillan mar6l~
+merrillville mArilvil
+merrily mar6l/
+merriman mAr6m@n
+merriweather mArEweDP
+merryman merEman
+merryville m,r/vil
+merryville mer/vil
+mertz mVts
+merv mVv
+mervin mVv~
+mesa mAs@
+mesh meS
+meshing meS6N
+mesich mes@k
+mesick mes6k
+mesmerize mezmPIz
+mesmerizing mezmPIz6N
+mesquita meskEt@
+mesquite meskwIt
+mess mes
+message mes6j
+messages mes6j6z
+messaging mes6j6N
+messinger mes6NP
+messinger mes~jP
+messner meznP
+messy mes/
+met met
+metabiotic med@bIod6k
+metabolic med@bol6k
+metal medL
+metaline med@lIn
+metallic m6tal6k
+metallica m6tal6k@
+metallurgist medLPj6st
+metallurgy m6talPj/
+metalware medLw,r
+metalworking medLwVk6N
+metaphysics med@fiz6ks
+metcalf metkaf
+metcalfe metkaf
+meteorite mEd/@rIt
+meteorites mEd/@rIts
+meteorology mEd/@rol@j/
+meter mEdP
+methanol meT@n{l
+method meT6d
+methodically m6Tod6kl/
+methodist meT@d6st
+methodologies meT@dol@j/z
+methodology meT@dol@j/
+methods meT6dz
+methuen mcTU~
+methuen meTU~
+metric metr6k
+metrodome metr@dOm
+metromail metr]mAl
+metrowest metr]6st
+metrowest metr]west
+mettawa m6tow@
+metter medP
+mettle medL
+metuchen m@tqC~
+metuchen med6C~
+metzger metsgP
+mewes myUz
+mexicali meks6kal/
+mexicali meks6kol/
+mexican meks6k~
+mexico meks6k]
+mexico_city meks6k]sit/
+meyer mIP
+meyers mIPz
+meyersdale mIPzdAl
+meyerson mIPs~
+mezquita mezkEt@
+mhoon mUn
+mi mE
+mia mE@
+miami mIam/
+miami's mIam/z
+miamis mIam/z
+miamisburg mI@m6sbVg
+miamitown mIam/t?n
+micaela m6kAl@
+micah mIk@
+micalizzi mIk@lEtsE
+micanopy m6kan@p/
+micanopy mik~Op/
+micaville mIk@vil
+mice mIs
+micha mES@
+michael mIkL
+michaela mIk@l@
+michaele mIk@l
+michaeli mIk@lE
+michaelis mIk@l6s
+michaels mIk@lz
+michaels mIkLz
+michaelson mIk@ls@n
+michal mIk@l
+michalak mIk@lak
+michale mikhAl
+michales mIk@lz
+michalicek m6kal6sek
+michalowski mik@l?skE
+michals mIk@ls
+micheal mIk@l
+micheals mIk@lz
+michele m6Sel
+michelin miS@l@n
+micheline miS@lEn
+michelini mIk6lEnE
+michelle m6Sel
+michelman mIk@lm6n
+michels mIk@lz
+michelsen mIk@ls@n
+michelson mIk@ls6n
+michie miC/
+michigan miS6g~
+michigantown miS6g~t?n
+michl mik@l
+michoacan m6COk~
+michoacan mEC])k)n
+mickelson mikLs~
+mickle mikL
+mickleberry mik@lbArE
+mickles mik@lz
+micro mIkr]
+microbiology mIkr]bIol@j/
+microchip mIkr]Cip
+microcosm mIkr]koz}
+microfilm mIkr]film
+micrometeorite m6krom6tE@rIt
+microorganisms mIkr]{rg@niz}z
+microphone mIkr@f]n
+microscopically mIkr]skop6kl/
+microsoft mIkr@s{ft
+microsoft's mIkr@s{fts
+microsofts mIkr@s{fts
+microwave mIkr]wAv
+mid mid
+midafternoon midaftPnUn
+midair mid,r
+midday middA
+middle midL
+middlebrook midLbrqk
+middleburg midLbVg
+middlebury midLbP/
+middlebury midLber/
+middlekauff mit@lk{f
+middleport midLp{rt
+middlesboro midLzbV]
+middlesex midLseks
+middleton midLt~
+middletown midLt?n
+middleweight midLwAt
+mideast midEst
+midflight midflIt
+midland midl~d
+midlands midl~dz
+midmorning midm{rn6N
+midnight midnIt
+midpoint midp<nt
+midriff midr@f
+midsection midsekS~
+midst midst
+midstream midstrEm
+midstreaming midstrEm6N
+midsummer midsumP
+midtown midt?n
+midvale midvAl
+midville midvil
+midweek midwEk
+midwest midwest
+midwesterners midwestPnPz
+midwood midwqd
+midyear midyEr
+mieke mEk
+mieles mEelEz
+might mIt
+mighty mId/
+migliore miglE{rE
+migneault minyO
+mignogna y)ny@
+mignon miny)n
+mignone minyOnE
+mignot miny)t
+migration mIgrAS~
+migratory mIgr@t{r/
+miguel migel
+mihai mEhI
+mijares m6h)r6s
+mike mIk
+mikesell mIksel
+mikles mik@lz
+mila mEl@
+milan m6l)n
+milan m6lan
+milanville m6l)nvil
+milanville m6lanvil
+milburn milbVn
+milch milC
+mild mIld
+milder mIldP
+mildew mildU
+mildewed mildUd
+mildews mildUz
+mildred mildr6d
+mile mIl
+mileage mIl6j
+mileham mIlham
+miles mIlz
+milestone mIlstOn
+milestones mIlstOnz
+miletus mIlEt@s
+miletus mil6d@s
+milford milfPd
+military mil6ter/
+milk milk
+milker milkP
+milkmaid milkmAd
+milks milks
+milkshake milkS6k
+mill mil
+millar mil)r
+millbrae milbrA
+millbrooke milbrqk
+millbury milbP/
+millbury milber/
+milldale mildAl
+milled mild
+millenium m6lEn/}
+millennium m6len/}
+miller milP
+millersport milPzp{rt
+millerstown milPzt?n
+millerville milPvil
+millet mil6t
+millfield milfEld
+milliken mil6ken
+milliliters mil6lEdPz
+millimeter mil6mEdP
+millington miliNt~
+millinocket mil6nok6t
+millinocket mil@nok6t
+million mily~
+millionaire mily6n,r
+millionaires mily6n,rz
+millions mily~z
+millionth mily~T
+millionths mily~Ts
+milliron milIPn
+millon mil~
+millrace milr6s
+mills milz
+millstone milstOn
+milltown milt?n
+millville milvil
+millwood milwqd
+milne miln
+milner milnP
+milo mIl]
+milosevic mil)s@vik
+milpitas mLpEd@z
+milt milt
+milton milt~
+miltona m6ltOn@
+miltona mLtOn@
+miltonsburg milt~zbVg
+milwaukee mLw{k/
+mimbres mimbr@s
+mime mIm
+mimeograph mim/@graf
+mimi mEm/
+minaai m6nI
+mince mins
+mincemeat minsmEt
+mind mInd
+minded mInd6d
+minden mind~
+mindful mIndfL
+mindless mIndl6s
+minds mIndz
+mindy mind/
+mine mIn
+mined mInd
+minefield mInfEld
+minehart mInh)rt
+miner mInP
+mineral minrL
+mineralogically m6nar@loj6kl/
+mineralogist min@ral@j6st
+miners mInPz
+minersville mInPzvil
+minesweepers mInswEpPz
+mineworkers mInwVkPz
+minges miNz
+mingledorff miNg@ld{rf
+mingo miNg]
+mingus miNg@s
+miniature min6CP
+miniaturize min6CPIz
+minidisc min6d6sk
+minidisc min6disk
+minima min6m@
+minimal min6mL
+minimally min6m6l/
+minimize min6mIz
+minimum min6m@m
+minimums min6m@mz
+mining mIn6N
+minion miny~
+minister min6stP
+ministers min6stPz
+ministry min6str/
+minna min@
+minnaert minArt
+minneapolis min/apL6s
+minnesota min6sOd@
+minnesota min@sOt@
+minnetonka min6toNk@
+minnetrista min6trist@
+minneweather min@wetP
+minniefield minEfEld
+minnow minO
+minocqua m6nokw@
+minocqua m6n{kw@
+minor mInP
+minoring mInP6N
+minorities mIn{r6d/z
+minority mIn{r6d/
+mint mint
+minted mint6d
+minugh minyU
+minus mIn@s
+minute mInUt
+minute min6t
+minuteman min6tman
+minutemen min6tmen
+minutes min6ts
+minx miNks
+minyard miny)rd
+mion myon
+mira mEr@
+miracle mir@k@l
+miraculous m@raky6l@s
+miraculously m@raky6l@sl/
+mirage m@roZ
+miramar m@rAmP
+miramon mEr@m{n
+miranda m@rand@
+miravalle mEr@valE
+mirles mPlz
+mirror mirP
+mirrored mErPd
+mirroring mErP6N
+mirrors mirPz
+mirthful mVTfL
+mirthlessly mVTl6sl/
+mis mis
+misanthropic mis~Trop6k
+misappropriation mis@prOpr/AS~
+misbehave misb6hAv
+misbehavior misb6hAvyP
+miscalculations miskalky6lAS~z
+mischievous misC6v6s
+mischievously misC6v6sl/
+misconstrue misk~strU
+miscreations miskr/AS~z
+misdeeds misdEdz
+misdemeanor misd6mEnP
+misdirected misd@rekt6d
+miserable mizr@bL
+miserably mizr@bl/
+miseries miz@r/z
+miserly mIzPl/
+misery miz@r/
+misfire misfIr
+misfortune misf{rC~
+misfortunes misf{rC~z
+misgiving misgiv6N
+misha mES@
+mishandling mishandL6N
+mishaps mishaps
+mishawaka mish@wok@
+mishicot miS6kot
+misinterpret mis~tVpr6t
+misjudged misjujd
+misleading mislEd6N
+mismatches mismaC6z
+misplaced misplAst
+misprint misprint
+misquote miskwOt
+misreading misrEd6N
+misrepresentations misrepr6z~tAS~z
+misrule misrUl
+miss mis
+missed mist
+misses mis6z
+misshapen misSAp~
+missing mis6N
+mission miS~
+missions miS~z
+mississauga mis6s{g@
+mississauga miss6s{g@
+mississippi mis6sip/
+missoula m6s?l@
+missouri m6z@r6
+missouri m6zUr/
+missouri m6zUr6
+missouri m6zV/
+misspelling misspel6N
+misspent misspent
+misstated misstAd6d
+misstep misstep
+mistake m6stAk
+mistaken m6stAk~
+mistakenly m6stAk~l/
+mistakes m6stAks
+mister mistP
+mistrustful mistrustfL
+misunderstand misundPstand
+misunderstandings misundPstand6Nz
+misunderstood misundPstqd
+mitch miC
+mitcham miC}
+mitchell miCL
+mix miks
+mixed mikst
+mixes miks6z
+mixing miks6N
+mixon miks6n
+mixture miksCP
+mixtures miksCPz
+miyagishima mE)gESEm@
+miyake mE)kA
+miyose mEyOsA
+mob mob
+mobbed mobd
+moberg mObPg
+moberly mObPl/
+mobil mObL
+mobile mObEl
+mobile mObIl
+mobile mObL
+mobile m]bEl
+mobley mOblE
+mobridge mObr6j
+mobridge mobr6j
+mobridge mobrij
+mobs mobz
+moccasin mok@s~
+mock mok
+mockingbird mokiNbVd
+mocksville moksvil
+moctezuma m)kt6zUm@
+mode mOd
+model modL
+modeled modLd
+modeling mod6l6N
+models modLz
+modem mOd}
+modena m@dEn@
+moderate mod@r6t
+modern modPn
+modernization modPn6zAS~
+modernize modPnIz
+modest mod6st
+modestat mOdstat
+modesto m@dest]
+modesty mod6st/
+modifications mod6f6kAS~z
+modular moj6lP
+modularisation moj6lP6zAS~
+modularization moj6lP6zAS~
+modulate moj6lAt
+modulation moj6lAS~
+module mojUl
+modules mojUlz
+moessner mOsnP
+moffett m{f6t
+mogel mOg@l
+mohair mOhAr
+mohall mOhL
+mohall mOhol
+mohamed mOh)m6d
+mohammad m@hom6d
+mohammed mOhamed
+mohawk mOh6k
+mohead mOhed
+mohican m@hEk~
+mohnton mOnt~
+mohomed m@h)m6d
+mohrsville mOrzvil
+mohrsville m{rzvil
+moille m<l
+moille m]il
+moines m<n
+moist m<st
+moistened m<s~d
+moisture m<sCP
+moisturizer m<sCPIzP
+mojarro m@h)rO
+mojica mOhEk@
+mokane mokAn
+mokena m@kEn@
+molalla m@lal@
+molalla m]lal@
+mold mOld
+molded mOld6d
+moldy mOld/
+molecular m@leky6lP
+molehill mOlhil
+molena molEn@
+moles mOlz
+molesworth mOlzwVT
+moline mol~
+moll mol
+moller mOlP
+molloy m@l<
+mollusks mol6sks
+mom mom
+moment mOm~t
+momentary mOm~ter/
+moments mOm~ts
+momentum m]ment}
+momma mom@
+mommy mom/
+monaco m)n@kO
+monahans mon@hanz
+monarch mon)rk
+monarchies mon)rk/z
+monarchs mon)rks
+monaville mOn@vil
+moncrief m)nkrEf
+moncton moNkt~
+monday mund/
+monday mundA
+mondays mundAz
+mondovi mondOv/
+monessen m@nes~
+monessen mon@s~
+monet mOnA
+monetary mon6ter/
+monette m@net
+money mun/
+moneychanger mun/CAnjP
+moneylender mun/lendP
+moneylike mun/lIk
+moneypenny mun/pen/
+monger m)NgP
+mongolian moNgOl/~
+mongoose moNg6s
+monica mon6k@
+monika mon6k@
+monitor mon6tP
+monitored mon6dPd
+monitoring mon6dP6N
+monitors mon6dPz
+monk muNk
+monkey muNk/
+monkeylike muNk/lIk
+monkeys muNk/z
+monkfish muNkfiS
+monkhood muNkhqd
+monkhouse muNkh?s
+monks muNks
+monmouth monm@T
+monogamous m@nog@m@s
+monogamy m@nog@m/
+monogram mon@gram
+monologue mon@l{g
+monon mOn~
+monopoli m@n)p@lE
+monopolist mon@pOl6st
+monopolize m@nop@lIz
+monotonic mon@ton6k
+monponsett monpons6t
+monroe monrO
+monroeville monrOvil
+monrovia monrOv/@
+monroy m@nr<
+monstrous monstr@s
+montagna m)nt)ny@
+montagne m)ntAn
+montague m)nt@gyU
+montana montan@
+montclair montkl,r
+monte mont/
+monte_carlo mont6k)rl]
+monteagle mont6gL
+monteagle montEgL
+monteforte m)nt6f{rtA
+montego montAg]
+montego montEg]
+monteleone montcl/On
+montello montel]
+monterey mont@rA
+monteria mont@rE@
+monteria montEr/@
+monterrey mont@rA
+montevallo mont6val]
+montevallo mont@val]
+monteverde m)nt6vArdA
+montevideo mont6vid/]
+montfort montfPt
+montgomery montgomP/
+montgomery m~tgum@r/
+month munT
+month's munTs
+months munTs
+montour montP
+montreal mOnrA)l
+montreal mOntrAol
+montreal montr/{l
+montreat montr/6t
+montreat montrEt
+montreux montrO
+montrose montrOz
+montserrat monsP)t
+montserrat m~tsar6t
+montvale montvAl
+monty mont/
+monument mony6m~t
+monument mony@m~t
+monumental mony6mentL
+monuments mony6m~ts
+moochler mUClP
+mood mUd
+moodus mUd@s
+moody mUd/
+moody's mUd/z
+moodys mUd/z
+mooe mUE
+moon mUn
+moonlight mUnlIt
+moonraker mUnr@kP
+moonscape mUnskAp
+moonshine mUnSIn
+moonstone mUnstOn
+moonstruck mUnstruk
+moore mqr
+moore m{r
+moorefield m{rfEld
+moorehead m{rhed
+moorehouse m{rh?s
+mooresburg mqrzbPg
+mooresburg m{rsbVg
+mooresburg m{rzbPg
+moorestown mqrzt?n
+moorestown m{rzt?n
+mooresville mqrzvil
+mooresville m{rsvil
+mooresville m{rzvil
+mooreville mqrvil
+mooreville m{rvil
+moorhead mUrhed
+moorpark mUrp)rk
+moosehead mUshed
+moosewood mUswqd
+moosup mUs@p
+moosup mUsup
+moot mUt
+mopboard mopb{rd
+moping mOp6N
+mopped mopt
+moraga m@rog@
+moral m{rL
+morales m{ral@s
+moralistic m{r@list6k
+moralize m{r@lIz
+more m{r
+moreauville m{r]vil
+morefield m{rfEld
+morehead m{rhed
+morehouse m{rh?s
+morejon m{rj)n
+moreland m{rland
+morelia m@rEl/@
+morelia m{rEl/@
+morenci m@rens/
+morenci m{rens/
+moreover m{rOvP
+moreton m{rt~
+moretown m{rt?n
+morgan m{rg~
+morganton m{rg~t~
+morgantown m{rg~t?n
+morganza m{rganz@
+morgen mOrg6n
+morgenbesser m{rg~bcsP
+morgenroth mOrg6nr)T
+morgenstein m{rg6nstEn
+morgenstern m{rg@nstPn
+morgenthaler mOrgint)lP
+morgia m{rdZE@
+mori m{r/
+moriarty m{rE)rtE
+morinville m{r6nvil
+morison m{r6s~
+morissette m{r6set
+morles m{rlz
+morning m{rn6N
+mornings m{rn6Nz
+morningstar m{rniNst)r
+moro m{r]
+moroccan m@rok~
+morones m@rOn6s
+morongo m@roNg]
+morongo m{r]n]
+morphological m{rf@loj6kL
+morphophonemic m{rfof@nem6k
+morris m{r6s
+morrisdale mor6sdAl
+morrisdale m{r6sdAl
+morrison m{r6s~
+morrisroe mOrisrO
+morrissette m{r6set
+morrissey m)r6sE
+morristown mor6st?n
+morristown m{r6st?n
+morrow m{r]
+mortalize m{rd@lIz
+mortellaro m{rtel)rO
+mortgage m{rg6j
+mortgaged m{rg6jd
+morton m{rd~
+morton's m{rd~z
+mortons m{rd~z
+mortons m{rt~z
+mortuary m{rCUer/
+mosaic m]zA6k
+mosby mozb/
+moscow mosk?
+moscow's mosk?z
+moscows mosk?z
+mosely mOzlE
+moser mOsP
+moses mOz6s
+mosheim mOzhIm
+mosier mOs/P
+mosque mosk
+mosqueda m)skAd@
+mosquera m)skAr@
+mosques mosks
+mosquito m6skEd]
+mosquitoes m6skEd]z
+moss m{s
+mossville m{svil
+most mOst
+mostly mOstl/
+motel m]tel
+moth m{T
+mothballed m{Tb{ld
+mother muDP
+mother's muDPz
+motherhood muDPhqd
+mothering muDP6N
+mothers muDPz
+mothershead muDPzhed
+mothershed muDPSed
+motioning mOS~6N
+motionless mOS~l6s
+motions mOS~z
+motivate mOd6vAt
+motivated mOd6vAd6d
+motivates mOd6vAts
+motivation mOd6vAS~
+motive mOd6v
+motives mOd6vz
+motonaga mOt@n)g@
+motor mOdP
+motorbike mOdPbIk
+motorcade mOdPkAd
+motorcycle mOdPsIkL
+motorcyclists m@t{rs6kl6sts
+motoring mOdP6N
+motorists mOdP6sts
+motors mOdPz
+motorway mOdPwA
+motorways mOdPwAz
+motown mOt?n
+mottstown motst?n
+moua m?@
+moulmein m?lmAn
+moulmein mqlmAn
+mound m?nd
+mounds m?ndz
+moundsville m?ndzvil
+moundville m?ndvil
+mount m?nt
+mountain m?nt~
+mountainair m?nt~,r
+mountainair m~tAn,r
+mountainboro m?nt~bV]
+mountains m?nt~z
+mountainside m?nt~sId
+mountainsides m?nt~sIdz
+mountaintop m?nt~top
+mountcastle m?ntkas@l
+mounted m?nt6d
+mountford m?ntfPd
+mounting m?nt6N
+mountlake m?ntlAk
+mountrail m?ntrAl
+mountville m?ntvil
+mourned m{rnd
+mournful m{rnfL
+mournfully m{rnfL/
+mourns m{rnz
+mouse m?s
+mousehole m?shOl
+mousetail m?stAl
+mousetrap m?strap
+mousse mUs
+mouth m?T
+mouthful m?TfL
+mouthing m?D6N
+mouthpiece m?TpEs
+mouthpieces m?TpEs6z
+mouths m?Dz
+move mUv
+moved mUvd
+movement mUvm~t
+movements mUvm~ts
+movers mUvPz
+moves mUvz
+movie mUv/
+movieland mUv/land
+moviemaker mUv/mAkP
+movies mUv/z
+movietime mUv/tIm
+moville m@vil
+moving mUv6N
+mow mO
+moweaqua m]wEkw@
+mowers mOPz
+mowery m?PE
+mowing mO6N
+mowles mOlz
+mowry m?rE
+mows mOz
+moyers m<Pz
+mozer mOzP
+mp3 mpB0Y
+mr mistP
+mrs mis6z
+mrvan m6rv@n
+ms emes
+ms emes
+much muC
+muckelroy muk@lr<
+muckleroy muk@lr<
+mud mud
+muddier mud/P
+muddleheaded mudLhed6d
+muddy mud/
+mudfish mudfiS
+mudskipper mudsk6pP
+mudslinger mudsl~jP
+mudville mudvil
+mudwagon mudwag~
+muellner myUlnP
+muenchow mwenC?
+muenzenberger mU6nzenbPgP
+muff muf
+muffins muf~z
+muffled mufLd
+muffler muflP
+mugger mugP
+mugleston mug@lst6n
+mugs mugz
+muhammad mUh)m6d
+muhammed mUham6d
+muhlestein myUlstEn
+muirhead myUrhed
+mukilteo myUkLtA]
+mul_laneplaza mulAn&plaz@
+mulcahy mulkAhE
+muldrow muldr]
+mule myUl
+mules myUlz
+muleshoe myUlSU
+mulhall mulhL
+mulhouse mulh?s
+mulkey mulk/
+mull mul
+mullarkey mul)rkE
+mullens mul~z
+mullet mul6t
+mullins mul~z
+mullinville mul~vil
+multi mult/
+multibillion mult/bily~
+multifaceted mult/fas6d6d
+multimillionaires mult/mily6n,rz
+multinational mult/naS~L
+multiple mult6pL
+multiplex mult6pleks
+multiply mult6plI
+multitude mult6tUd
+multitudes mult6tUdz
+multivalve mult/valv
+multnomah mLtnom@
+mum mum
+mumble mumbL
+mumby mumbE
+mummy mum/
+mump mump
+muncie muns/
+muncrief munkrEf
+mundelein mund6lAn
+munford munfPd
+munfordville munfPdvil
+munger muNgP
+munich myUn6k
+municipal my6nis6pL
+municipality my6nis6pal6d/
+munising mUn/siN
+munising mUnis6N
+munising munIz6N
+munising myUnis6N
+munsonville muns~vil
+munsterman munstPm@n
+munteanu muntE)nU
+muppets mup6ts
+murals myUrLz
+muratore mP@t{rE
+murder mVdP
+murderer mVdPP
+murderers mVdPPz
+murdoch mPt)k
+murdock mVdok
+murdy mVd/
+murky mVk/
+murmansk mPmansk
+murmansk mVm~sk
+murmured mVmPd
+murray mV/
+murrayville mV/vil
+murrayville mqr/vil
+murrells mVLz
+murrells mVelz
+murrieta mV/ed@
+murrysville mV/zvil
+mursh mVS
+muscatine musk@tEn
+muscle musL
+muscles musLz
+muscoda m6skOd@
+muscoda muskOd@
+muscular musky6lP
+muse myUz
+museum myUzE}
+museums myUzE}z
+mushroom muSrUm
+mushroomed muSrUmd
+mushrooming muSrUm6N
+mushrooms muSrUmz
+music myUz6k
+musical myUz6kL
+musician myUziS~
+musicians myUziS~z
+musicland myUz6kland
+musicus myUz6k@s
+muskego muskEg]
+musketeer musk6tEr
+muskogee m@skOg/
+muskrat muskrat
+muslim muzl}
+must must
+mustang mustaN
+mustangs mustaNz
+mustard mustPd
+mutana myUt)n@
+mute myUt
+mutineer myUd~nEr
+mutinies myUd~n/z
+muttonchops mud~Cops
+muttontown mud~t?n
+mutual myUCwL
+mutualism myUCw@liz}
+mutually myUCU6l/
+muzquiz mUzkEz
+mwakitwile mw@kitw6lA
+my mI
+myers mIrz
+myerscough mIPzk)f
+myesha mIES@
+myhre mIr
+mylar mIl)r
+myles mIlz
+mynah mIn@
+myong mE)N
+myopia mIOp/@
+myres mIrz
+myrl mPl
+myrtle mVdL
+myrtlewood mVdLwqd
+myself mIself
+mysteries mistP/z
+mysterious m6stEr/@s
+mysteriously m6stEr/@sl/
+mystery mistP/
+mythical miT6kL
+mythological miT@loj6kL
+mythology m6Tol@j/
+myths miTs
+myton mId~
+n en
+n n
+nabbing nab6N
+nabisco n@bisk]
+nablus nabl@s
+nabors nAbPz
+nabulus naby6l@s
+nachman n)km@n
+nacho naC]
+nachor n@k{r
+nadel nadL
+naderman nAtPm@n
+nadia nAd/@
+naes nAs
+nag nag
+nagel nAg@l
+nagele nag@lE
+nagelkirk nAg@lkPk
+nagelschmidt nAg@lSmit
+nagged nagd
+nagging nag6N
+nagle nAg@l
+nagoya n@g<@
+nags nagz
+nagy nAg/
+nagy nAj/
+nahunta n@hqnt@
+nahunta n@hunt@
+naida nAt@
+nail nAl
+nailbrush nAlbruS
+nailed nAld
+nails nAlz
+naive nIEv
+najjar n@j)r
+najmuddin najmud6n
+nakanishi n@kan@SE
+nakayama nakAom@
+naked nAk6d
+nakhichevan n@kiC6v~
+nakhichevan nak6CEv~
+nakia n@kE@
+nakina n@kEn@
+nalco nalk]
+namanworth nam@nwPT
+name nAm
+named nAmd
+nameplate nAmplAt
+names nAmz
+namesake nAmsAk
+nametag nAmtag
+nametags nAmtagz
+nampa namp@
+nan's nanz
+nancee nansE
+nancy nans/
+nancy nans/
+nancy's nans/z
+nancys nans/z
+nanking naNk6N
+nanking nankiN
+nannette n@net
+nans nanz
+nansemond nans6m~d
+nansemond nants@m~d
+nanty nant/
+naomi nAOm/
+nap nap
+napa nap@
+nape nAp
+napier nAp/P
+napierala n)pir)l@
+napkins napk~z
+naples nApLz
+napoleon n@pOl/~
+napoleonic n@pOl/on6k
+napolitano n@p)l6t)nO
+naquin nakEn
+naranjo n@r)nhO
+narcissus n)rsis@s
+narcissus norsis@s
+narcotic n)rkod6k
+narcotics n)rkod6ks
+nardozzi n)rd)tsE
+narrate nArAt
+narration nArAS~
+narrator nArAdP
+narrow nar]
+narrowed nar]d
+narrowest nar]6st
+narrowsburg nar]zbVg
+narvaez n)rvaz
+naselle n@sel
+naselle nAzel
+nash naS
+nashotah n@SOt@
+nashotah n@Sod@
+nashport naSp{rt
+nashua naSU@
+nashville naSvil
+nashwauk naSw{k
+nason nAs~
+nassau nas{
+nassawadox nas@wadoks
+nassr nasP
+nast nast
+nasty nast/
+nat nat
+natalbany n@talb~/
+natalbany nat{lb@n/
+natale nat@lE
+natalie nadL/
+natalie nat@l/
+natalya n@t)ly@
+natasha n@toS@
+natcher naCP
+natchez naC6z
+nate nAt
+nathalie naTL/
+nathalie natL/
+nathan nAT~
+nathanael n@TanAl
+nathaniel n@TanyL
+natick nad6k
+nation nAS~
+national naS~L
+nationalism naS~@liz}
+nationality naS6nal6d/
+nationhood nAS~hqd
+nations nAS~z
+nationwide's nAS~wIdz
+nationwides nAS~wIdz
+natividad natEvEdad
+natrona n@trOn@
+natural naC@rL
+naturalization naC@rL6zAS~
+naturalized naC@r@lIzd
+naturally naCrL/
+nature nACP
+naufzinger n{fz6NP
+naugatuck n{g@d6k
+naugher n?P
+nauseated n{z/Ad6d
+nauseating n{z/Ad6N
+nautilus n{d6l@s
+nav nav
+navaho nav@h]
+navajo nov@h]
+naval nAvL
+navarrete nav@rEt
+navarrette nav@ret
+navel nAvL
+navesink nAvsiNk
+navesink nav6s6Nk
+navigate nav6gAt
+navigation nav6gAS~
+navigational nav6gAS~L
+navigations nav6gAS~z
+navigator nav6gAdP
+navratil navr@til
+navy nAv/
+nay nA
+nazianz nAz/~z
+ncaa ensEAA
+ncaa ensEdubLA
+neal's nElz
+neale nEl
+nealeigh nElE
+nealon nEl~
+neals nElz
+neanderthal n/andPTol
+neang nEaN
+near nEr
+nearby nErbI
+nearer nErP
+nearest nEr6st
+nearhood nErhqd
+nearing nEr6N
+nearly nErl/
+neat nEt
+neatly nEtl/
+nebeker neb@kP
+nebesny neb6znE
+neborak neb@r@k
+nebraska n6brask@
+nebraska n@brask@
+necessarily nes6sar6l/
+necessary nes6ser/
+necessitates n6ses6tAts
+necessity n6ses6d/
+neck nek
+necklace nekl6s
+necktie nekt/
+neckwear nekw,r
+nectar nektP
+ned's nedz
+nederland nEdPland
+neds nedz
+nedved nedved
+nee nE
+need nEd
+needed nEd6d
+needful nEdfL
+needle nEdL
+needlecraft nEdLkraft
+needlefish nEdLfiS
+needlelike nEd@lIk
+needleman nEt@lm6n
+needlepoint nEdLp<nt
+needles nEdLz
+needless nEdl6s
+needn't nEdnt
+neednt nEdnt
+needs nEdz
+neenah nEn@
+nefarious n6f,r/@s
+negate n6gAt
+negatively neg@d6vl/
+neglect n6glekt
+neglectful n6glektfL
+negligent negl6j~t
+negligently negl6j~tl/
+negligible negl6j@bl
+negotiated n6gOS/Ad6d
+negotiating n6gOS/Ad6N
+negotiation n6gOS/AS~
+negotiations n6gOS/AS~z
+nehalem n@hAl}
+nehalem nehL}
+neigenfind nIg6nfInd
+neigh nE
+neighbor nAbP
+neighborhood nAbPhqd
+neighborhoods nAbPhqdz
+neighbors nAbPz
+neighbours nAbPz
+neihart nAh)rt
+neil nEl
+neill nEl
+neilsen nEls6n
+neilson nEls@n
+neither nEDP
+nekoosa n6kUs@
+nelissen nEls6n
+nelles nelz
+nellie nel/
+nelliston nel6st~
+nelson nels~
+nelsonville nels~vil
+nemaha n6moh@
+nembhard nemh)rd
+nemes nEmz
+neoclassic nE]klas6k
+neoga nE]go
+neon nEon
+neons nEonz
+neponset n6pons6t
+neptune neptyUn
+nerds nVdz
+neren ner6n
+nerve nVv
+nerves nVvz
+nervous nVv@s
+nervy nVv/
+nesbit nezb6t
+nespelem nesp6l}
+ness nes
+nest nest
+nested nest6d
+nestingen nestiN6n
+nestle nesL
+nestled nesLd
+nestler neslP
+nestling nesl6N
+net net
+netherton neDPt@n
+nets nets
+netterville nedPvil
+nettleton net6lt6n
+network netwVk
+networking netwVk6N
+networks netwVks
+neumeier nUmIP
+neural nUrL
+neurological nUr@loj6kL
+neuromuscular nqr]musky6lP
+neuron nUr~
+neuroscience nqr]sI~s
+neurosis n@rOs6s
+neurotic n@rod6k
+neutra n<tr@
+neutra nUtr@
+neutrality nUtral6d/
+neutralization nUtrL6zAS~
+neutron nUtron
+nevada n6vod@
+nevada n@vod@
+nevada ncv)d@
+nevada ncvad@
+nevada's n6vod@z
+nevadas n6vod@z
+never nevP
+nevertheless nevPD@les
+neveux n@v@
+neville nev6l
+new nU
+new_castle nUkasL
+new_hampshire nUhampS6r
+new_hampshire nUhampSP
+new_hanover nUhan]vP
+new_jersey nUjVz/
+new_kent nUkent
+new_madrid nUm@drid
+new_madrid nUmadr6d
+new_mexico nUmeks6kO
+new_york nUy{rk
+newark nUPk
+newark's nUPks
+newarks nUPks
+newberg nUbVg
+newborn nUb{rn
+newbury nUbP/
+newbury nUber/
+newburyport nUbP/p{rt
+newburyport nUby@r/p{rt
+newcastle nUkasL
+newcomb nUkOm
+newcomer nUkumP
+newcomers nUkumPz
+newenle nyU6nlE
+newer nUP
+newest nU6st
+newfane nUfAn
+newfield nUfEld
+newfields nUfEldz
+newfolden n6fOld~
+newfolden nUfOld~
+newgard nyUg)rd
+newhaven nUhAv~
+newhudson nU6ds~
+newhyde nUid
+newkirk nUkVk
+newllano n6lon]
+newly nUl/
+newlywed nUl/wed
+newman nUm~
+newmanstown nUm~zt?n
+newmarket nUm)rk6t
+newmont nUmont
+newnan nUn~
+newport nUp{rt
+newport's nUp{rts
+newports nUp{rts
+newry nUr/
+news nUz
+newsboy nUzb<
+newsbreak nUzbrAk
+newscast nUzkast
+newshound nUzh?nd
+newsletter nUzledP
+newspaper nUspApP
+newspaperman nUsp@pPman
+newspapers nUspApPz
+newsprint nUzprint
+newsroom nUzrUm
+newsstands nUzstandz
+newsweek's nUzwEks
+newsweeks nUzwEks
+newsworthiness nUzwVD/n6s
+newsworthy nUzwVD/
+newton nUd~
+newtown nUt?n
+newulm nULm
+newville nUvil
+next nekst
+next's neksts
+nexts neksts
+ney nA
+ng N
+nga n)
+ngan n)n
+nghe nE
+ngo nO
+ngoc nOk
+ngov nOv
+nguen nwen
+ngueyn nUen
+nguy nU
+nguyen nUyen
+nguyen nwen
+nguyet nUyet
+nguyn nUy6n
+ngvyen nven
+niagara nIagr@
+niagara's nIagr@z
+niagaras nIagr@z
+niantic n/ant6k
+niantic nIant6k
+nibbles nibLz
+nice nIs
+nicely nIsl/
+niceness nIsn6s
+nicest nIs6st
+niceville nIsvil
+nicewarner nIsw{rnP
+nichelle n@Sel
+nichelson nik@ls@n
+nichol nik@l
+nicholas nikL6s
+nichole nikOl
+nicholes nikOlz
+nicholl nik@l
+nicholle n@kOl
+nicholls nikulz
+nichols nikOlz
+nicholsen nik@ls@n
+nicholson nik@ls6n
+nick nik
+nickelodeon nik6lOd/~
+nickels nikLz
+nickelson nikLs~
+nickerson nikPs~
+nickleberry nik@lberE
+nickleby nikl6b/
+nickles nik@lz
+nickleson nik@ls6n
+nicknack niknak
+nickname niknAm
+nicknamed niknAmd
+nickolas nik@l@s
+nicolais nikOlAz
+nicolas nik@l@z
+nicolau nik@l?
+nicole n6kOl
+nicole's n6kOlz
+nicoles n6kOlz
+nicolle n6kOl
+nicolson nik@ls@n
+nidigallu nid6galU
+niederwald nEdPw{ld
+niedzwiecki nEdzwekE
+niehaus nEh?s
+niemeyer nEmIP
+niemietz nEm6ts
+nienhaus nInh?s
+nienhuis nyenhwEs
+nienow nEn?
+niese nEs
+niethamer nEthAmP
+nieto nEetO
+nigel nIj@l
+nigeria nIjEr/@
+nigeria's nIjEr/@z
+nigerias nIjEr/@z
+night nIt
+nightclub nItklub
+nightdress nItdr6s
+nighthawk nIth{k
+nightingale nId~gAl
+nightly nItl/
+nightmare nItm,r
+nightmares nItm,rz
+nights nIts
+nightshade nItSAd
+nightshirt nItSVt
+nightspot nItspot
+nightstand nItstand
+nighttimes nIttImz
+nihart nEh)rt
+nihilistic nE@list6k
+niki nik/
+nikki nik/
+nikolai nik@lI
+nil nil
+nile nIl
+niles nIlz
+nilles nilz
+nilwood nilwqd
+nina nEn@
+nine +>|
+nineteen +>|2Y|
+nineteenth +>|2Y|G
+nineteenth nIntEnT
+nineteeth nIntET
+ninetieth +>|Q[(G
+ninetieth nInd/6T
+ninety +>|2[
+ninety +>|[
+ninilchik n6nilC6k
+ninth +>|G
+ninths nInTs
+niota n/Od@
+nippe nipE
+nisland nisland
+nisonger nis)NgP
+nissan nEson
+niswonger nisw)NgP
+nitpick nitpik
+nitrate nItrAt
+nitration nItrAS~
+nitro nItr]
+nitterhouse nitPh?s
+nives nIvz
+nixa niks@
+nixon niks6n
+no +4
+noack nOak
+noah nO@
+noah nOu
+nob nob
+nobel n]bel
+noble nObL
+nobleboro nObLbV]
+nobles nOb@lz
+noblesville nObLzvil
+nobody nObud/
+nobody's nObud/z
+nobodys nObud/z
+nocatee nOk@t/
+nocatee nOkAtE
+noctor noktP
+noctor nokt{r
+nocturnally noktVn6l/
+nodaway nod@wA
+nodded nod6d
+noddle nodL
+node nOd
+nodules nojUlz
+noel nOL
+noel's nOLz
+noelia nOelE@
+noella nOel@
+noels nOLz
+noemi nOemE
+noffsinger n{fs6NP
+nofsinger n)fsiNP
+nogales n]g)lAs
+nogales nogAlz
+nohel el
+noise n<z
+noiseless n<zl6s
+noisemaker n<zmAkP
+noises n<z6z
+noisiest n<z/6st
+noisy n<z/
+nokesville nOksvil
+nokomis nOk@m6s
+nolan nOl~
+noland nOl6nd
+nole nOl
+nolensville nOl~zvil
+noles nOlz
+nolesensville nol6s~zvil
+noma nOm@
+nomad nOmad
+non non
+nonaggression non@greS~
+nonantum n]nant}
+nonantum nonant}
+nonbeliever nonb6lEvP
+nonbelievers nonb6lEvPz
+nonconformity nonk~f{rm6d/
+nondescript nond6skript
+nondurables nondUr@bLz
+none nun
+nonfat nonfat
+nonfiction nonfikS~
+nonhuman nonhyUm~
+nonpaying nonpA6N
+nonpolar nonpOlP
+nonpolitical nonp@lid6kL
+nonprescription nonpr6skripS~
+nonprofit nonprof6t
+nonsense nonsens
+nonsensuous nonsensU@s
+nonspecific nonsp6sif6k
+nonstandard nonstandPd
+nonunion nonyUny~
+nonviolence nonvIL~s
+nonwhite nonwIt
+noodle nUdL
+noodles nUdLz
+nooks nqks
+noon nUn
+noonan nUn~
+noonday nUndA
+noontime nUntIm
+noose nUs
+nope nOp
+nor n{r
+nora n{r@
+nora's n{r@z
+noras n{r@z
+norco n{rk]
+norcross n{rkr{s
+nordgren n{rdgr6n
+nordstroms n{rdstr}z
+norfolk n{rf@k
+norgren n{rgr~
+norlina n{rlEn@
+normal n{rmL
+normally n{rmL/
+norman n{rm~
+normandie n{rmand/
+normandie n{rm~d/
+normandie n{rm~dE
+normangee n{rm~jE
+norms n{rmz
+norquest n{rkwest
+norridge n{rij
+norrington n{riNt~
+norris n{r6s
+norristown n{r6st?n
+norseworthy n{rswPDE
+norsingle n{rsiNg@l
+nortel n{rtel
+north n{rT
+north's n{rTs
+north_carolina n{rTkar@lIn@
+north_dakota n{rTd@kOt@
+north_slope n{rTslOp
+northampton n{rTampt~
+northbend n{rTbend
+northboro n{rTbP]
+northboro n{rTb{r]
+northborough n{rTbVO
+northbound n{rTb?nd
+northbrook n{rTbrqk
+northcliff n{rTklif
+northcraft n{rTkraft
+northeast n{rTEst
+northeastern n{rTEstPn
+northerly n{rDPl/
+northern n{rDPn
+northerner n{rDPnP
+northerners n{rDPnPz
+northfield n{rTfEld
+northgate n{rTgAt
+northglenn n{rTglen
+northington n{rTiNt~
+northland n{rTland
+northport n{rTp{rt
+northridge n{rTrij
+norths n{rTs
+northumbria n{rTumbr/@
+northvale n{rTvAl
+northview n{rTvyU
+northville n{rTvil
+northward n{rTwPd
+northwest n{rTwest
+northwestern n{rTwestPn
+northwestern's n{rTwestPnz
+northwesterns n{rTwestPnz
+northwood n{rTwqd
+norway n{rwA
+norwegian n{rwEj~
+norwell n{rwel
+norwich n{rw6C
+norwood n{rwqd
+nose nOz
+nosebleed nOzblEd
+nosedive nOzdIv
+noser nOzP
+nostalgia n@stalj@
+not not
+notable nOd@bL
+notably nOd@bl/
+notched noCt
+note nOt
+notebooks nOtbqks
+noteboom nOtbUm
+noted nOd6d
+notedly nOd6dl/
+noteholders nOthOldPz
+notepaper nOtpApP
+notes nOts
+notestine n)testIn
+noteworthy nOtwVD/
+nothing nuT6N
+nothingness nuTiNn@s
+nothnagel n{TnAg@l
+noti nOd/
+noti nOt/
+notice nOd6s
+noticed nOd6st
+notices nOd6s6z
+noting nOd6N
+notionally nOS~L/
+notoriety nOd@rI6d/
+nottingham n)tiNham
+notwithstanding notwiTstand6N
+nouakchott nUokSot
+noumea n?m/@
+noumea nUmA@
+nourishes nV6S6z
+nourishing nV6S6N
+nova nOv@
+nova's nOv@z
+novak nOvak
+novara n@vor@
+novara n]v)r@
+novas nOv@z
+novel novL
+novel's novLz
+novelist nov6l6st
+novelists nov6l6sts
+novelle n@vel
+novels novLz
+novelty novLt/
+november n]vembP
+novembers n]vembPz
+novembre nOvembP
+novi nOv/
+novocaine nOv@kAn
+now n?
+now's n?z
+nowaday nOw@dA
+nowadays n?@dAz
+nowata n]od@
+nowata n]wot@
+nowhere nOw,r
+nowlin nOl6n
+nowosielski n@w)sEelskE
+nows n?z
+noxen noks~
+noxen nok~
+noyes n<z
+nozzle nozL
+nozzles nozLz
+npr enpE)r
+nquyen nUyen
+nub nub
+nuce nUCE
+nuckles nuk6lz
+nuclear nUkl/P
+nucleus nUkl/@s
+nudge nuj
+nudging nuj6N
+nugent nUj~t
+nuisance nUs~s
+null nul
+nullifying nul6fI6N
+numb num
+number numbP
+numbering numbP6N
+numbers numbPz
+numerals nUmrLz
+numerous nUm@r@s
+nun nun
+nunda nund@
+nunemaker nUn6mAkP
+nunhood nunhqd
+nunnery nunP/
+nurse nVrs
+nurse nVs
+nurse nVs
+nursed nVst
+nursery nVsP/
+nurses nVs6z
+nurses' nVs6z
+nursing nVs6N
+nurtures nVCPz
+nut nut
+nutcracker nutkrakP
+nutmeg nutmeg
+nutrasweet nUtr@swEt
+nutrients nUtr/~ts
+nuts nuts
+nutshell nutSel
+nutt nut
+nwachukwu nw)C6kwU
+ny en&wI
+nyenhuis nyenhwEs
+nylon nIlon
+nymphomaniacs nimf@mAn/aks
+nymphs nimfs
+nyssa nis@
+nyswonger nIsw)NP
+o O
+o$$$'clock ]klok
+o$$$clock ]klok
+o$$'clock ]klok
+o$$clock ]klok
+o$'clock ]klok
+o$clock ]klok
+o'clock @klok
+o'clock ]klok
+o'connor ]konP
+o'fallon ]fal~
+o'kean ]kEn
+o'neil ]nEl
+o'neill ]nEl
+o'spades ]spAdz
+oacoma 6kOm@
+oaf Of
+oagletree OgLtrE
+oak Ok
+oakboro OkbP]
+oakboro OkbV]
+oakbrook Okbrqk
+oakdale OkdAl
+oakes Oks
+oakesdale OksdAl
+oakfield OkfEld
+oakhurst OkhVst
+oakland Okl~d
+oakleaf OklEf
+oakley Okl/
+oaklyn Okl~
+oakman Okm~
+oakmont Okmont
+oakpark Okp)rk
+oakridge Okrij
+oaks Oks
+oakton Okt~
+oaktown Okt?n
+oakvale OkvAl
+oakville Okvil
+oakwood Okwqd
+oasis ]As6s
+oat Ot
+oath OT
+oaths OTs
+oatmeal OtmEl
+oats Ots
+obannon Oban@n
+obdulia )bdUly@
+obenchain Ob@nCAn
+oberdorf ObPdOrf
+oberg ObPg
+oberhausen ObPh?z@n
+oberhelman {bPhelm@n
+oberlin obPl~
+obey ]bA
+obeying ]bA6N
+obeys ]bAz
+obispo @bisp]
+object obj6kt
+objectionable @bjekS~@bL
+objectively @bjekt6vl/
+objectives @bjekt6vz
+objectivity obj6ktiv6d/
+objects obj6kts
+oblige @blIj
+obliged @blIjd
+obliges @blIj6z
+obliteration @blid@rAS~
+oblong obl{N
+obnoxious @bnokS@s
+oboyle Ob<l
+obregon Obreg)n
+obrian ObrI6n
+obrien ObrI@n
+obringer ObriNP
+obryan ObrI6n
+obryant ObrI6nt
+obscene @bsEn
+obscure @bskyUr
+obscured @bskyUrd
+obscures @bskyUrz
+obscuring @bskyUr6N
+obscurity @bskyUr6d/
+observable @bzVv@bL
+observance @bzVv~s
+observances @bzVv~s6z
+observation obzPvAS~
+observe @bzVv
+observed @bzVvd
+observer @bzVvP
+observers @bzVvPz
+observes @bzVvz
+observing @bzVv6N
+obsession @bseS~
+obsessions @bseS~z
+obsolete obs@lEt
+obstacle obst@kL
+obstacles obst@kLz
+obstetrics @bstetr6ks
+obstruction @bstrukS~
+obstructs @bstrukts
+obtain @btAn
+obtained @btAnd
+obtaining @btAn6N
+obtains @btAnz
+obtuse @btUs
+obverse obvPs
+obvious obv/@s
+obviously obv/@sl/
+ocala @kol@
+ocala ]kal@
+ocallahan @kal@h~
+occasion @kAZ~
+occasional @kAZ~L
+occasionally @kAZ~L/
+occasioned @kAZ~d
+occhuizzo @kyU6tsO
+occupancy oky@p~s/
+occupant oky6p~t
+occupied oky6pId
+occupies oky6pIz
+occupying oky6pI6N
+occur @kV
+occurred @kVd
+occurrence @kV~s
+occurs @kVz
+ocean OS~
+ocean's OS~z
+oceanfront OS~frunt
+oceangoing @sENg]6N
+oceanographic @sEn@graf6k
+oceanport OS~p{rt
+oceans OS~z
+oceanside OS~sId
+oceanville OS~vil
+ocejo OsAhO
+ocelot os6l6t
+ochayon OCAyon
+ochoa OCO@
+ochs )ks
+ocilla @sil@
+oclock @klok
+oclock ]klok
+oclock oklok
+oconnell Ok)n@l
+oconnor ]konP
+octagonal aktag~L
+octavia aktAv/@
+octillion aktily~
+october oktObP
+october's oktObPz
+octobers oktObPz
+octopus okt@p@s
+odaniel Odany6l
+odd od
+oddball odb{l
+odds odz
+odea OdA
+odebolt OdbOlt
+odebolt od@blt
+oden Od~
+odenville Od~vil
+odessa @des@
+odis Ot6s
+odometer ]dom6dP
+odonnell Od)n@l
+odonoghue Od)n@hyU
+odor OdP
+odore Ot{rE
+odors OdPz
+odum Od@m
+oechsle OkslE
+oehlenschlage Ol6nSl)g
+oelschlaeger OlSl)gP
+oelschlager OlSl)gP
+oertle {rt@l
+oest Oest
+oesterreich OstPrIk
+oestreich ustPrIk
+oestreicher OstrIkP
+oetting OtiN
+of @v
+of uv
+ofallon ]fal~
+off 8R
+off XR
+off] {f
+offending @fend6N
+offensive @fens6v
+offer {fP
+offered {fPd
+offering {fP6N
+offerle {fPl
+offers {fPz
+offhand {fhand
+office {f6s
+officeholders {f6shOldPz
+officer {f6sP
+officers {f6sPz
+offices {f6s6z
+official @fiSL
+officials @fiSLz
+offline {flIn
+offramp {fr@mp
+offs {fs
+offshore {fS{r
+offspring {fspriN
+oflynn Oflin
+often {f~
+ogden ogd~
+ogdensburg ogd~zbVg
+ogilvie @jilv/
+oglala @glol@
+oglala ogl)l@
+ogles Og@lz
+oglesbee Og6lzbE
+oglesby Og@lzbE
+ogletree OgLtrE
+ogrady OgrAtE
+ogress ogr6s
+oh 4
+ohair OhAr
+ohanley OhanlE
+ohara OhAr@
+ohare OhAr
+ohatchee OhaC/
+ohatchee ]haC/
+ohern OhPn
+ohio OhI]
+ohio OhIy]
+ohio ]hI]
+ohio's ]hI]z
+ohios ]hI]z
+ohioville ]hI]vil
+ohlman Olm~
+ohman Om~
+oil <l
+oilcan <lkan
+oiled <ld
+oilfield <lfEld
+oilfields <lfEldz
+oilman <lm~
+oils <lz
+oilskin <lskin
+oilton <lt~
+oilwell <lwel
+oily <l/
+ointment <ntm~t
+oja Oh@
+ojai ohI
+ojeda @jAt@
+ok OkA
+ok ]kA
+okanogan @kan@g~
+okanogan Ok~Og~
+okapi @kop/
+okay ]kA
+okayama Ok@y)m@
+okayama okAom@
+okayed ]kAd
+okean ]kEn
+okeefe OkEf
+okeeffe OkEf
+okeene @kEn
+okeene ]kEn
+okeke @kekE
+okelley OkelE
+okemah @kem@
+okemah Ok@m)
+oketo @ked]
+oklahoma Okl@hOm@
+okoboji Ok@bOj/
+olafson Ol@fs6n
+olalla @lal@
+olalla ]lal@
+olander OlandP
+olar OlP
+olathe ]lAD
+olathe ol@D
+olaughlin Ol)fl@n
+old Old
+oldenburg Old~bVg
+older OldP
+oldest Old6st
+oldfield OldfEld
+oldham Old}
+oldies Old/z
+oldmore Oldm{r
+oldsmar Oldzm)r
+oldsmar OldzmP
+oldsmobile Oldzm]bEl
+oldsters OldstPz
+oldwick Oldwik
+ole ]lA
+olea OlE@
+oleathe ol@D
+olene OlEn
+olenski OlenskE
+olerud Ol6rUd
+oleson Ols6n
+oley OlA
+olga Olg@
+olheiser OlhIzP
+olide OlId
+oligschlaeger Ol6gSlAgP
+oliphant ol6f~t
+olivares )l6vAr6s
+olivas )livas
+olive ol6v
+olivencia )l6vensE@
+oliver ol6vP
+oliver's ol6vPz
+olivera )l6vAr@
+olivers ol6vPz
+olives {l6vz
+olivestedt ol6vstet
+olivier @l6vEA
+olivo @lEvO
+ollie ol/
+ollivier @livEA
+ollivierre OlivEer
+olmsted Olmst6d
+oloughlin Ol)fl6n
+olufson Ol@fs@n
+olympia olimp/@
+olympiad @limp/6d
+olympic @limp6k
+olympics @limp6ks
+olympics ]limp6ks
+omaha Om@ho
+omaha's Om@hoz
+omahas Om@hoz
+omak omak
+omalley OmalE
+oman Om~
+omar Om)r
+omega ]meg@
+omelets oml6ts
+omen Om~
+omitted ]mid6d
+omitting ]mid6N
+omnisciently @mniS~tl/
+omro omr]
+omsi oms/
+on 8|
+on X|
+onawa @now@
+onawa on@w)
+onaway On@wA
+onaway on@wA
+once wuns
+oncoming onkum6N
+one 5F|
+one's wunz
+oneal OnEl
+oneil ]nEl
+oneill ]nEl
+oneonta On/ont@
+ones wunz
+oneself wunself
+onida ]nId@
+onion uny~
+onishea On@SA
+online onlIn
+onlooker onlqkP
+onlookers onlqkPz
+only Onl/
+onofre )n)frE
+onorato )n@rotO
+onslaught onsl{t
+onstad onst6d
+ontario ont,r/]
+onto ontU
+ontonagon onton@g~
+onward onwPd
+onwards onwPdz
+oo q
+ooh U
+oolagah 6lag@
+oops Ups
+oostburg UstbVg
+ooze Uz
+oozed Uzd
+oozing Uz6N
+opal OpL
+opaque ]pAk
+opatrny OpatPnE
+opatz Opatz
+opdyke opdik
+opelika @pel6k@
+opelousas op6l?s@z
+open Op~
+opened Op~d
+opener Op~P
+openers Op~Pz
+opening Op~6N
+openly Op~l/
+openness Op~n6s
+opens Op~z
+opera opr@
+operate op@rAt
+operated op@rAd6d
+operates op@rAts
+operatic op@rad6k
+operating op@rAd6N
+operation op@rAS~
+operations op@rAS~z
+operative opr@d6v
+operatives opr@d6vz
+operator op@rAdP
+operators op@rAdPz
+opheim )phIm
+ophir ofP
+ophthalmology ofTLmol@j/
+opinion @piny~
+opinions @piny~z
+opium Op/}
+opossum @pos}
+oppegard )pg)rd
+opponent @pOn~t
+opportunities opPtUn6d/z
+opportunity opPtUn6d/
+oppose @pOz
+opposing @pOz6N
+opposite op@z6t
+opstein )pstIn
+opted opt6d
+optical opt6kL
+opticals opt6kLz
+opticians @ptiS~z
+optimal opt6mL
+optimism opt6miz}
+optimum opt6m@m
+option opS~
+optional opS~L
+options opS~z
+opulent opy6l~t
+or P
+or {r
+orab {r@b
+orab {rab
+orabone {r@bOn
+oral {rL
+oran {r~
+orange or~j
+orange {r~j
+orangeade {r~jAd
+orangeburg or~jbVg
+orangeburg {r~jbVg
+orangeman {r~jm~
+oranges {r~j6z
+orangevale or~jvAl
+orangevale {r~jvAl
+orangeville {r~jvil
+oratorical {r@t{r6kL
+orbin {rb~
+orbiter {rb6dP
+orbiters {rb6dPz
+orchard {rCPd
+orchestra {rk6str@
+orchestras {rk6str@z
+orchestrated {rk6strAd6d
+orchid {rk6d
+ordahl Ord)l
+order {rdP
+ordered {rdPd
+ordering {rdP6N
+orderly {rdPl/
+orders {rdPz
+orderville {rdPvil
+ordinances {rdin~s6z
+ordinary {rd6ner/
+ordones {rdOnez
+ore {r
+oreana @rEn@
+oregon Or@g~
+oregon Orig~
+oregon {rigon
+oregon {rig~
+oregonia {r@gOn/@
+oregonie {r6gOn/
+oreilly OrIlE
+oreily OrIlE
+orejuela {r@hwAl@
+orem {r}
+orenco @reNk]
+orewiler {r6wIlP
+orfordville {rfPdvil
+organically {rgan6kl/
+organisations {rg~6zAS~z
+organisms {rg@niz}z
+organist {rg~6st
+organization {rg~6zAS~
+organization's {rg~6zAS~z
+organizational {rg~6zAS~L
+organizations {rg~6zAS~z
+organized {rg@nIzd
+organizer {rg@nIzP
+organizing {rg@nIz6N
+orielley OrIlE
+orielly OrIlE
+oriental {r/entL
+orientation {r/~tAS~
+oriented {r/ent6d
+origin {r6j~
+original @rij~L
+originality @rij6nal6d/
+originally @rij~6l/
+originals @rij~Lz
+originating @rij6nAd6N
+oriley OrIlE
+orin {r~
+orinda @rind@
+orinda {rind@
+orioles {r/Lz
+orion @rI~
+orion's @rI~z
+orions @rI~z
+oriordan OrErd@n
+oriskany @risk~/
+oriskany {r6skan/
+orland {rl~d
+orlando {rland]
+orleans {rlEnz
+orme {rm
+ornament {rn@m~t
+ornamental {rn@mentL
+ornate {rnAt
+ornateness {rnAtn6s
+oropesa OrOpAs@
+orourke OrOrk
+orphan {rf~
+orphanage {rf~6j
+orphanages {rf~6j6z
+orphaned {rf~d
+orpington {rp6Nt~
+orpington {rpiNt~
+orrick {r6k
+orrin {r~
+orrington {r6Nt~
+orrington {riNt~
+orrtanna Ptan@
+orrtanna {rtan@
+orrum {r}
+orrville {rvil
+orson {rs~
+orthodontic {rT@dont6k
+orthodontist {rT@dont6st
+orthopedic {rT@pEd6k
+ortiz {rtEz
+ortlieb {rtlEb
+orville {rvil
+orzech Orzek
+osage Os6j
+osawatomie ]s)w@tOm/
+osborn ozbPn
+oscar oskP
+oscarson oskPs~
+osceola os/Ol@
+oscillator os6lAdP
+osegueda OsAgwAd@
+osgood )zgqd
+osgood ozgUd
+oshaughnessy OS)n@sE
+oshea OSA
+oshkosh oSkoS
+oskaloosa osk@lUs@
+oslo osl]
+oslo ozl]
+osmond ozm~d
+osmosis 6smOs6s
+osnabrock ozn@brok
+ospades ]spAdz
+osprey ospr/
+osprey osprA
+ossining osEn6N
+ostend ostend
+ostend ost~d
+osteopathy {st/]pAD/
+osterville ostPvil
+ostheimer )sthImP
+ostrander ostr~dP
+ostrava @strov@
+ostrava {str)v)
+ostrich ostr6C
+oswayo @swA]
+oswego @swEg]
+osyka @sik@
+otanicar Otan6k)r
+otego @tAg]
+otego ]tAg]
+otex Oteks
+otey OtE
+other uDP
+others uDPz
+otherwise uDPwIz
+othoudt )thUd
+otis Ot6s
+otis od6s
+otoole OtUl
+ottawa od@w@
+ottawa ot@w@
+otteman )t@m6n
+otter odP
+otter odP
+otter otP
+otter_tail otPtAl
+otto od]
+otto's od]z
+ottogary )tOgArE
+ottos od]z
+ottumwa @tumw@
+otukolo {t6kOlO
+ou U
+oubre ?brE
+ouellet w)let
+ouellete w)let
+ouellette Ulet
+ought {t
+ouida OEt@
+ouillette wElet
+ouimet wEmet
+ouimette wEmet
+ounce ?ns
+our ?r
+ouray ?rA
+ourselves ?Vselvz
+out ?t
+outage ?d6j
+outbidding ?tbid6N
+outbound ?tb?nd
+outbreak ?tbrAk
+outburst ?tbVst
+outbursts ?tbVsts
+outcast ?tkast
+outcome ?tkum
+outcomes ?tkumz
+outcry ?tkrI
+outdated ?tdAd6d
+outdid ?tdid
+outdistance ?tdist~s
+outdoor ?td{r
+outdoors ?td{rz
+outer ?dP
+outerwear ?dPw,r
+outfielders ?tfEldPz
+outfit ?tfit
+outfitter ?tfidP
+outflank ?tflaNk
+outgoing ?tgO6N
+outgrew ?tgrU
+outgrow ?tgrO
+outgrown ?tgrOn
+outgrowth ?tgrOT
+outguess ?tges
+outhouse ?th?s
+outlandish ?tland6S
+outlandishly ?tland6Sl/
+outlaw ?tl{
+outlawing ?tl{6N
+outlaws ?tl{z
+outlet ?tlet
+outlets ?tlets
+outlive ?tliv
+outlook ?tlqk
+outlooks ?tlqks
+outmoded ?tmOd6d
+outnumber ?tnumbP
+outnumbered ?tnumbPd
+outnumbering ?tnumbP6N
+outpatient ?tpAS~t
+outperform ?tpPf{rm
+outpost ?tpOst
+output ?tpqt
+outputs ?tpqts
+outrage ?trAj
+outrageous ?trAj@s
+outrageously ?trAj@sl/
+outriders ?trIdPz
+outs ?ts
+outset ?tset
+outshine ?tSIn
+outshone ?tSOn
+outside ?tsId
+outsider ?tsIdP
+outskirt ?tskVt
+outskirts ?tskVts
+outsmart ?tsm)rt
+outspending ?tspend6N
+outspent ?tspent
+outspoken ?tspOk~
+outstanding ?tstand6N
+outstretched ?tstreCt
+outstrip ?tstrip
+outvoted ?tvOd6d
+outward ?twPd
+outweighed ?twAd
+outwitting ?twid6N
+ouye UE
+oval OvL
+ovarian ov,r/~
+oven uv~
+ovens uv~z
+ovenware uv~w,r
+over OvP
+overabundance OvP@bund~s
+overall OvP{l
+overalls OvP{lz
+overambitious OvPambiS@s
+overarching OvP)rC6N
+overarm OvP)rm
+overbaugh OvPb{
+overbearing OvPb,r6N
+overboard OvPb{rd
+overbrook OvPbrqk
+overby OvPbE
+overcame OvPkAm
+overcash OvPkaS
+overcharged OvPC)rjd
+overcharging OvPCorj6N
+overcome OvPkum
+overcompensation OvPkomp~sAS~
+overconfident OvPkonf6d~t
+overconsumption OvPk~sumpS~
+overcrowding OvPkr?d6N
+overdick OvPdik
+overdorf OvPdOrf
+overdrafts OvPdrafts
+overdue OvPdU
+overeager OvPEgP
+overeating OvPEd6N
+overemphasized OvPemf@sIzd
+overenthusiasm OvP~TUz/az}
+overestimated OvPest6mAd6d
+overexpose OvP6kspOz
+overextended OvP6kstend6d
+overflowed OvPflOd
+overfunded OvPfund6d
+overgenerous OvPjen@r@s
+overgrow OvPgrO
+overgrown OvPgrOn
+overhangs OvPhaNz
+overhead OvPhed
+overheat OvPhEt
+overheating OvPhEd6N
+overholtzer OvPhOltsP
+overkamp OvPkamp
+overkill OvPkil
+overland OvPland
+overlap OvPlap
+overlapping OvPlap6N
+overlay OvPlA
+overlee OvPlE
+overload OvPlOd
+overloaded OvPlOd6d
+overlook OvPlqk
+overlooked OvPlqkt
+overlooking OvPlqk6N
+overlord OvPl{rd
+overly OvPl/
+overnight OvPnIt
+overpayments OvPpAm~ts
+overplayed OvPplAd
+overpowering OvPp?P6N
+overpriced OvPprIst
+overproducing OvPpr6dUs6N
+overprotection OvPpr@tekS~
+overqualified OvPkw{l6fId
+overqualify OvPkw{l6fI
+overrated OvPrAd6d
+overreached OvPrECt
+overreaction OvPr/akS~
+overruling OvPrUl6N
+overrunning OvPrun6N
+overs OvPz
+overseeing OvPsE6N
+overshadow OvPSad]
+overshadowed OvPSad]d
+overshiner OvPSInP
+overshoot OvPSUt
+oversized OvPsIzd
+oversleep OvPslEp
+overstreet OvPstrEt
+oversubscribed OvPs@bskrIbd
+overt ]vVt
+overtake OvPtAk
+overthrow OvPTrO
+overton OvPt@n
+overton OvPtun
+overtook OvPtqk
+overtown OvPt?n
+overture OvPCP
+overtures OvPCPz
+overturf OvPtPf
+overturns OvPtVnz
+overview OvPvyU
+overweg OvPweg
+overweight OvPwAt
+overwhelm OvPwelm
+overwhelmed OvPwelmd
+overwhelming OvPwelm6N
+overwhelmingly OvPwelm6Nl/
+overwritten OvPrid~
+overzealous OvPzel@s
+ovesen )vs@n
+oviedo Ov/Ed]
+ovsanik {vs@nik
+ovulation ovy6lAS~
+ow ?
+owasso ]as]
+owatana O@ton@
+owatonna )w@ton@
+owatonna O@ton@
+owe O
+owed Od
+owego @wEg]
+owego ]Ag]
+owen O~
+owens O~z
+owensboro O~zbP]
+owensboro O~zbV]
+owensburg O~zbVg
+owensville O~zvil
+owing O6N
+owlish ?l6S
+own On
+owner OnP
+owners OnPz
+ownership OnPSip
+owns Onz
+ox oks
+oxford oksfPd
+oxford's oksfPdz
+oxfords oksfPdz
+oxfordshire oksfPdSEr
+oxide oksId
+oxley oksl/
+oxman oksm~
+oxnard oksnPd
+oxtail okstL
+oxygen oks6j~
+oxygenated oks6j6nAd6d
+oy <
+oyellette <let
+oyervides <ArvEd6s
+oyster <stP
+oysters <stPz
+ozark oz)rk
+ozie )zE
+ozone OzOn
+ozzie oz/
+p p
+p pE
+pa po
+paa p)
+pabon pab6n
+paccione paCEOnE
+pace pAs
+pacek paCek
+pacemaker pAsmAkP
+pacer pAsP
+pacesetter pas6s6dP
+pachar p@k)r
+pachua paCU@
+pachuca p@CUk@
+pachuta p@CUd@
+paci p)CE
+pacific p@sif6k
+pacifica p@sif6k@
+pacify pas6fI
+pacini p@CEnE
+paciolla p)CEOl@
+pacitti p@CEtE
+pack pak
+package pak6j
+packaged pak6jd
+packaging pak6j6N
+packard pakPd
+packed pakt
+packers pakPz
+packing pak6N
+packwaukee pakw{k/
+packwood pakwqd
+paco pAk]
+pacoima p@k<m@
+pacolet pAk]l6t
+pad pad
+paddock pad@k
+padlock padlok
+padmanabha padmanabh@
+padmanabhan p@dman6ban
+padre podrA
+pads padz
+paduano padZU)nO
+padula padUl@
+paez pIez
+pagan pAg~
+pagdanganan pagdaNg@n@n
+page pAj
+pageants paj~ts
+pageboy pAjb<
+pagels pAg@lz
+pagemaker pAjmAkP
+pagenkopf paj6nk{pf
+pager pAjP
+pages pAj6z
+paglialunga paglE@luNg@
+pahmeier p)mIP
+paia pA@
+paia pI@
+paid pAd
+pail pAl
+pailful pAlfL
+pain pAn
+paine pAn
+painesdale pAnzdAl
+painesville pAnzvil
+painful pAnfL
+painkiller pAnkilP
+painless pAnl6s
+pains pAnz
+painsville pAnzvil
+paint pAnt
+paintbrush pAntbruS
+painted pAnt6d
+painter pAntP
+painting pAnt6N
+paintings pAnt6Nz
+pair p,r
+pairs p,rz
+paisley pAzl/
+pal pal
+palace pal6s
+palatine pal@tEn
+palatine pal@tIn
+pale pAl
+palenville pAl~vil
+palenville pal~vil
+paler pAlP
+palermo p@lVm]
+palermo p@lerm]
+palestine pal6stEn
+palisades pal6sAdz
+palladino pal@dEn]
+palm pom
+palm_beach pombEC
+palma palm@
+palmer pomP
+palmer's pomPz
+palmerdale p)lmPdAl
+palmerdale pomPdAl
+palmers pomPz
+palmerton pomPt~
+palmetto palmed]
+palmieri p{lmEArE
+palmolive palmL6v
+palmrose p{lmrOz
+palms pomz
+palmyra palmEr@
+palmyra palmIr@
+palo pal]
+palo_alto pal]alt]
+palo_pinto pal]pint]
+palos pol6s
+palpably palp@bl/
+pam pam
+pamela pam6l@
+pamella pam@l@
+pampa pamp@
+pamphlet pamfl6t
+pamphlets pamfl6ts
+pamplona pamplOn@
+pamula pamyUl)
+pan pan
+panagis pan@gis
+panama pan@m@
+panama pan@m@
+panama's pan@m@z
+panamas pan@m@z
+pancake pankAk
+panda pand@
+pandemonium pand6mOn/}
+paned pAnd
+panel panL
+paneled panLd
+panelization pan6l6zAS~
+panelled panLd
+panels panLz
+panguitch paNgw6C
+panguitch pangEC
+panhandle panhandL
+paniagua panE)gw@
+panic pan6k
+pankiw pankU
+panorama pan@ram@
+pansies panz/z
+pantheon panT/~
+panther panTP
+pantoja pantOh@
+pants pants
+pantsuit pantsUt
+panty pant/
+pantyhose pant6h6s
+paola p?l@
+paoli p?lE
+papa pop@
+papageorge p)p@j{rj
+papagni p@p)nyE
+papale p@palA
+papaya p@poy@
+papazian p@pAz/~
+papciak papCEak
+paper pApP
+paperboy pApPb<
+papered pApPd
+paperless pApPl6s
+papers pApPz
+paperweight pApPwAt
+paperweights pApPwAts
+papillion p@pily~
+papoose pap6s
+pappajohn p)p@j)n
+paprika papr6k@
+papstein papstIn
+parachuting par@SUd6N
+parades p@rAdz
+paradise par@dIs
+paradox par@doks
+paragon par@gon
+paragould par@gUld
+paragraph par@graf
+parallel par@lel
+paralleling par@lel6N
+paralysis p@ral6s6s
+paramaribo par@m@rib]
+paramaribo par@mar6bO
+paramedic par@med6k
+parameter p@ram6dP
+paramount par@m?nt
+paramount's par@m?nts
+paramounts par@m?nts
+paramus par@mus
+parana p@r)n@
+parana par@n)
+parana par@no
+paranoia par@n<@
+paranoid par@n<d
+parasols par@s{lz
+parcels p)rsLz
+parch p)rC
+parched p)rCt
+parchman p)rCm~
+parchment p)rCm~t
+pardeeville p)rd/vil
+pardo p)rd]
+pardon p)rd~
+paredes p@red6s
+parekh p@rek
+parekh p@rek@
+parentage par~t6j
+parental p@rentL
+parentheses p@renT6sEz
+parenthetic par~Ted6k
+parenthood par~thqd
+parents par~ts
+paris p@rE
+paris par6s
+parish par6S
+parishioners p@riS~Pz
+parishville par6Svil
+parisi p@rEsE
+parisian p@rEZ@n
+parisians p@riZ~z
+park p)rk
+parked p)rkt
+parker p)rkP
+parkerford p)rkPfPd
+parkesburg p)rksbPg
+parkesburg p)rksbVg
+parkin p)rk~
+parking p)rk6N
+parkland p)rkland
+parkland p)rkl~d
+parkmont p)rkmont
+parks p)rks
+parksley p)rksl/
+parkston p)rkst~
+parksville p)rksvil
+parktown p)rkt?n
+parkview p)rkvyU
+parkway p)rkwA
+parliament p)rl@m~t
+parlier p)rl/P
+parlormaid p)rlPmAd
+parma p)rm@
+parmalee p)rm@lE
+parmele p)rmel
+parmelee p)rm6lE
+parnell p)rnel
+parole p@rOl
+parowan par]wan
+parowan par]~
+parra p)r@
+parris par6s
+parry per/
+parsley p)rsl/
+parsnip p)rsnip
+parsonsburg p)rs~zbVg
+part p)rt
+partain p)rtAn
+partch p)rC
+parted p)rd6d
+parthenon p)rT~~
+partial p)rSL
+partially p)rS6l/
+participant p)rtis6p~t
+participants p)rtis6p~ts
+participate p)rtis6pAt
+participates p)rtis6pAts
+participation p)rtis6pAS~
+particle p)rd6kL
+particular p)rtiky6lP
+particularly p)rtiky6lPl/
+parties p)rd/z
+partington p)rtiNt6n
+partly p)rtl/
+partner p)rtnP
+partners p)rtnPz
+partnership p)rtnPSip
+partnership's p)rtnPSips
+partnerships p)rtnPSips
+partridge p)rtrij
+parts p)rts
+parttime p)rttIm
+party p)rd/
+pasadena pas@dEn@
+pascagoula pask@g?l@
+pascagoula pask@gUl@
+pascoal paskOl
+pascual paskw)l
+pasion paS@n
+paso pAs]
+pasquale paskw)l
+pass pas
+passage pas6j
+passaic p@sA6k
+passed past
+passenger pas~jP
+passer pasP
+passes pas6z
+passing pas6N
+passion paS~
+passionate paS~6t
+passionfruit paS~frUt
+passionless paS~l6s
+passions paS~z
+passive pas6v
+passover pasOvP
+passport pasp{rt
+password paswVd
+passwords paswVdz
+past past
+pasta post@
+paste pAst
+pasteboard pAstb{rd
+pastel pastel
+pastes pAsts
+pastime pastIm
+pastries pAstr/z
+pastry pAstr/
+pasture pasCP
+pastures pasCPz
+pat pat
+patajo p@t)hO
+pataskala pad@skol@
+patch paC
+patches paC6z
+patchogue paC{g
+patchwork paCwVk
+patel p@tel
+paterson pAdPs~
+path paT
+pathetic p@Ted6k
+pathfinder paTfIndP
+pathmark's paTm)rks
+pathmarks paTm)rks
+pathological paT@loj6kL
+pathways paTwAz
+patience pAS~s
+patient pAS~t
+patient's pAS~ts
+patiently pAS~tl/
+patients pAS~ts
+patio pad/]
+patoka p@tOk@
+patricia p@triS@
+patrick patr6k
+patriot pAtr/6t
+patriotic pAtr/od6k
+patrol p@trOl
+patrolmen p@trOlm~
+patrols p@trOlz
+patron pAtr@n
+patrons pAtr~z
+patsy pats/
+patt pat
+pattered padPd
+pattern padPn
+patterns padPnz
+patterson padPs~
+patty pad/
+patty pat/
+pattyre patIr
+paul p{l
+paul's p{lz
+paula p{l@
+paulding p{ld6N
+paulette p{let
+paulina p{lEn@
+pauline p{lEn
+pauls p{lz
+paulsboro p{lzbP]
+paulsboro p{lzbV]
+paunch p{nC
+paupack p?pak
+paupack p{pak
+pauper p{pP
+pause poz
+pause p{z
+paused pozd
+paused p{zd
+pausing poz6N
+pausing p{z6N
+pavarotti pav@rod/
+pave pAv
+paved pAvd
+pavelich pavliC
+pavement pAvm~t
+pavilion p@vily~
+paw p{
+pawn p{n
+pawnee p{nE
+pawnshops p{nSops
+pax paks
+paxico paks6k]
+paxson paks~
+paxton pakst~
+pay pA
+payable pA@bL
+paybox pAboks
+paychecks pACeks
+payday pAdA
+payes pAz
+payless pAl6s
+payload pAlOd
+payload's pAlOdz
+payloads pAlOdz
+payment pAm~t
+payments pAm~ts
+payne pAn
+payoffs pA{fs
+payout pA?t
+payrolls pArOlz
+pays pAz
+paysinger pAsiNP
+payson pAs~
+paysour pAsUr
+pc pEsE
+pea pE
+peabody pEbod/
+peace pEs
+peaceful pEsfL
+peacefully pEsfL/
+peacekeepers pEskEpPz
+peacetime pEstIm
+peach pEC
+peaches pEC6z
+peachtree pECtrE
+peachy pEC/
+peacock pEkok
+peak pEk
+peaks pEks
+peanut pEnut
+peapack pEpak
+pear p,r
+pearblossom p,rblos}
+pearblossom pPblos}
+pearisburg pEr6sbVg
+pearisburg per6sbVg
+pearl pVl
+pearl_river pVlrivP
+pearland p,rland
+pearland p,rl~d
+pearland pVl~d
+pearlfish pVlfiS
+pearline pPlEn
+pearlington pVl6Nt~
+pearlman pVlm~
+pearls pVlz
+pears p,rz
+peas pEz
+pease pEs
+peashooter pESUdP
+peat pEt
+pebbles pebLz
+pecan p6kan
+pecatonica pEk@ton6k@
+pecatonica pek@ton6k@
+pecatoste pek@t)st
+peck pek
+pecos pEkOs
+pecue pekyU
+peculiar p6kyUlyP
+pedaci p6d)CE
+pedal pedL
+pedals pedLz
+peddle pedL
+peddler pedLP
+pedeare pedEr
+pedersen pEdPs~
+pedersen pEtPs6n
+pederson pEtPs@n
+pedestal ped6stL
+pedigo p6dEgO
+pedigree ped6gr/
+pedro pAdrO
+pedro pedrO
+peduzzi p@dUtzE
+pee pE
+peebles pEb@lz
+peeing pE6N
+peeked pEkt
+peekskill pEkskil
+peel pEl
+peeler pElP
+peeling pEl6N
+peels pElz
+peep pEp
+peeped pEpt
+peephole pEphOl
+peeples pEp@lz
+peered pErd
+peers pErz
+peever pEvP
+peevish pEv6S
+peewee pEwE
+peg peg
+pegboards pegb{rdz
+peggy peg/
+peiffer pIfP
+peisun pAsun
+pekin pek~
+pekoe pek]
+pelaez p@lIez
+pele pAlA
+peles pelEz
+pelham pel}
+pelion pEl/~
+pelion pel/~
+pelkie pelk/
+pellerin pel@rin
+pelletiu pelety@
+pellietier pel@tyA
+pellston pelst~
+pellston pelzt~
+pelon pEl~
+peloquin pelOkwin
+peltier pelt/A
+pelts pelts
+peluse pelUz
+pemberton pemPt~
+pemberville pemPvil
+pemberville pembPvil
+pembina p@mbEn@
+pembleton pemb@lt@n
+pembroke pembrOk
+pen pen
+pena pAn@
+penal pEnL
+penale p@n)lE
+penalties penLt/z
+penalty penLt/
+penate p@n)tE
+pencak penCak
+pencil pensL
+pencils pensLz
+pendleton pendLt~
+pendulum penj6l}
+penelope nel@pE
+penetrate pen6trAt
+penetrated pen6trAd6d
+penfound penf?nd
+penguins peNgw~z
+penha pen@
+penholder penhOldP
+penicillin pen6sil~
+peninsula p6nins6l@
+peniston pen6st6n
+penknife pennIf
+penley penl/
+penn pen
+pennant pen~t
+pennbrook penbrqk
+penney pen/
+penngrove pengrOv
+penniless pen6l6s
+pennington pen6Nt~
+pennington peniNt~
+penns penz
+pennsboro penzbP]
+pennsboro penzbV]
+pennsylvania pensLvAny@
+penny pen/
+pennypacker pen6pakP
+pennzoil penz<l
+penrose penr6s
+pensacola pens@kOl@
+pension penS~
+penski penskE
+pentagon pent@gon
+pentecost pent6k)st
+penthouse penth?s
+pentwater pentw{dP
+pentwater pentw{tP
+people pEpL
+peoples pEpLz
+peoria p/{r/@
+peotone pE@t~
+peotone pE]tOn
+pepe pepA
+pepin pep~
+pepper pepP
+peppercorn pepPk{rn
+pepperidge pep@rij
+peppers pepPz
+pepsi peps/
+pequannock p6kan@k
+pequannock p6kwan@k
+per pV
+peralta p@r{lt@
+percentile pPsentIl
+perception pPsepS~
+perch pVC
+perchance pPCans
+perched pVCt
+perches pVC6z
+percussionist pPkuS~6st
+perdue pVjU
+perennial p@ren/L
+perez p@rez
+perez par6z
+perez percz
+perfect pVf6kt
+perfectionism pPfekS@niz}
+perfectly pVf6ktl/
+perforated pVf@rAd6d
+perforations pVf@rAS~z
+perform pPf{rm
+performance pPf{rm~s
+performances pPf{rm~s6z
+performed pPf{rmd
+performers pPf{rmPz
+performing pPf{rm6N
+perfume pPfyUm
+perhaps pPhaps
+peril parL
+perils parLz
+perimeter p@rim6dP
+period pEr/6d
+periodic pEr/od6k
+periodical pEr/od6kL
+periodically pEr/od6kl/
+periodicity p@rI@dis6d/
+periods pEr/6dz
+perkin pVk~
+perkinson pVk~s~
+perks pVks
+perky pVk/
+perley pVl/
+perm pVm
+permanent pVm~~t
+permission pPmiS~
+permit pVmit
+permits pVmits
+permutation pVmy6tAS~
+permutations pVmy6tAS~z
+peron pAr)n
+perot p@rO
+peroxide p@roksId
+perpendicular pVp~diky6lP
+perpetual pPpeCwL
+perpetuate pPpeCUAt
+perpetuates pPpeCUAts
+perpignan pPpiny~
+perreault pAr{lt
+perrinton per6nt~
+perris par6s
+perrone p@rOn
+perry per/
+perryman pArEm6n
+perryopolis pPyopL6s
+perryopolis per/op@l6s
+perrytown p,r/t?n
+perryvillage par6vil6j
+perseverance pVs6vEr~s
+persevering pVs6vEr6N
+pershing pVS6N
+persia pVZ@
+persian pVZ~
+persians pVZ~z
+persimmon pPsim~
+persinger pPs6NP
+persist pPsist
+persistence pPsist~s
+persistent pPsist~t
+persistently pPsist~tl/
+persists pPsists
+person pVs~
+personal pVs~L
+personalities pVs@nal6d/z
+personality pVs@nal6d/
+personalized pVs~@lIzd
+personally pVs~6l/
+personification pPson6f6kAS~
+personnel pVs@nel
+persons pVs~z
+perspiration pVsp@rAS~
+persuaded pPswAd6d
+persuasion pPswAZ~
+persuasions pPswAZ~z
+persuasive pPswAs6v
+pert pVt
+pertinent pVd~n~t
+perturb pPtVb
+perturbations pVdPbAS~z
+peru p@rU
+peru's p@rUz
+perus p@rUz
+pervasion pPvAZ~
+pervasive pPvAs6v
+perverse pPvVs
+pescadero pesk@dar]
+pescadero pesk@der]
+pesce peSE
+pesotum pcsOt}
+pesotum pez@d}
+pessimism pes6miz}
+pessimist pes6m6st
+pessimistic pes6mist6k
+pessimists pes6m6sts
+pests pests
+pet pet
+petals pedLz
+petaluma ped@lUm@
+petaluma pet@lUm@
+pete pEt
+peter pEdP
+peter pEtP
+peterboro pEdPbV]
+peterboro pEtPbV]
+peterkin pEtPk6n
+peterman pEtPm@n
+petermeier pEtPmIP
+peters pEdPz
+petersburg pEdPzbVg
+petersdorf pEtPzd{rf
+petersen pEdPs~
+petersen pEtPs6n
+peterson pEdPs~
+petesic petezik
+petigny petiNnyE
+petr petr@
+petramale petr@m)lE
+petrides petr@d6s
+petrie petr/
+petrina p6trEn@
+petrol petrL
+petroleum p6trOl/}
+petronila petr@nEl@
+petroske p6tr)skE
+petrouits petrUits
+petruccelli petrUkelE
+petrucelli petr6CelE
+petrunger petruNP
+pets pets
+petticoats ped/kOts
+petting ped6N
+pettipas petip)
+pevehouse pEvh?s
+pevely pEvl/
+pevely pevL/
+pewaukee p@w{k/
+pewaukee pyU{kE
+pewter pyUdP
+pfeifer fIfP
+pfeiffenberge fIf@nbPg
+pfeiffer fIfP
+pflieger flEgP
+pfliger flEgP
+pflueger flUgP
+pfluger flUgP
+pfrogner fr)gnP
+pham fam
+phanthanouvon fanT@nUv@n
+phantom fant}
+pharr f)r
+phase fAz
+phd pE&AC&dE
+pheasant fez@nt
+phebe fEbE
+phelan fEl~
+phelps felps
+phenix feniks
+phenomenon f6nom6non
+pheonix fEniks
+pherguson fPg@s@n
+phi fI
+phil fil
+phil's filz
+philadelphia fil@delf/@
+philadelphians fil@delf/~z
+philanthropist f6lanTr@p6st
+philanthropy f6lanTr@p/
+philharmonic's filhPmon6ks
+philharmonics filhPmon6ks
+philip fil@p
+philips fil@ps
+phillies filEz
+phillip fil@p
+phillips fil6ps
+phillips fil@ps
+phillipsburg fil@psbVg
+phillipson fil@ps~
+philomath fIl]maT
+philosopher f6los@fP
+philosophize fil@s@fIz
+philosophy f6los@f/
+phils filz
+philson fils~
+phippsburg fipsbPg
+phish fiS
+phlegm flem
+phlox floks
+phnom_penh nompen
+phnom_penh p@n{mpen
+phoebe fEbE
+phoenix fEn6ks
+phoenix fEniks
+phoenixville fEniksvil
+phone fOn
+phonebook fOnbqk
+phoned fOnd
+phonein fOnin
+phones fOnz
+phonetics f@ned6ks
+phonics fon6ks
+phony fOn/
+phosphate fosfAt
+phosphates fosfAts
+photo fOd]
+photoconductive fOd]k~dukt6v
+photoelectric fOd]6lektr6k
+photograph fOd@graf
+photographer f@togr@fP
+photographic fOd@graf6k
+photographs fOd@grafs
+photos fOd]z
+photosynthesize fOd]sinT6sIz
+phrase frAz
+physical fiz6kL
+physicians f6ziS~z
+physicist fiz6s6st
+physics fiz6ks
+physique fizEk
+piano pEan]
+piatt pE)t
+picard p@k)rd
+picayune pikAUn
+piccadilly pik@dil/
+pick pik
+picked pikt
+picker pikP
+pickering pikP6N
+pickerington pik@riNt~
+pickets pik6ts
+picking pik6N
+pickl pik@l
+pickle pikL
+pickles pikLz
+picklesimer pik@ls6mP
+pickpocket pikpok6t
+pickpockets pikpok6ts
+pickups pik@ps
+picnic pikn6k
+picot pEkO
+pictogram pikt]gram
+picture pikCP
+pictured pikCPd
+pictures pikCPz
+picturesque pikC@resk
+pidgeon pij6n
+pie pI
+piece pEs
+piecemeal pEsmEl
+pieces pEs6z
+piecrust pEkr6st
+piedad pE@d)d
+piedmont pEdmont
+pieloch pEl)k
+pieper pIpP
+pier pEr
+pierce pErs
+pierced pErst
+piercefield pErsfEld
+pierceton pErst~
+pierpont pErp~t
+pierre pE,r
+pierron p/ar~
+pierrot pyArO
+pierson pErs~
+pietrafesa pyetr@fAz@
+piffard pifPd
+pig pig
+pigeon pij~
+pigeonholed pij~hOld
+piggyback pig/bak
+pigmentation pigm~tAS~
+pignatelli pign@telE
+pignone pignOn
+pignotti piny)tE
+pigpen pigpen
+pigskin pigskin
+pigtail pigtAl
+pike pIk
+piketon pIkt~
+pikeville pIkvil
+pilar pEl)r
+pile pIl
+piled pIld
+piles pIlz
+pilgrim pilgr}
+pilgrims pilgr}z
+pilkerton pilkPt@n
+pill pil
+pillar pilP
+pillars pilPz
+pillbox pilboks
+pills pilz
+pillsbury pilzber/
+pilot pIl6t
+pimental pEment)l
+pimentel pEm)ntel
+pimps pimps
+pin pin
+pinch pinC
+pinched pinCt
+pinconning pinkon6N
+pincus pinkus
+pincushion pinkqS~
+pindall pind{l
+pine pIn
+pineda p6nAd@
+pinehurst pInhVst
+pineland pInland
+pinellas p6nel@s
+pinellas pinel@z
+pines pInz
+pinetop pIntop
+pinetta p6net@
+pingitore piNg@t{rE
+pingleton piNg@lt@n
+pingpong piNp{N
+pink piNk
+pinkerton piNkPt6n
+pinkleton piNk@lt6n
+pinnacles pin@kLz
+pinned pind
+pinola pinOl@
+pinpointing pinp<nt6N
+pins pinz
+pinsoneault pins@nO
+pinsonneault pins@nO
+pinstripes pinstrIps
+pint pInt
+pinto pint]
+pints pInts
+pinwheel pinwEl
+piny pIn/
+pinzone pinzOnE
+pioneer pI@nEr
+pioneering pI@nEr6N
+pioneertown pI@nErt?n
+pioske pE)skE
+pipe pIp
+pipes pIps
+pipestone pIpstOn
+pippin pippin
+piqua pikw@
+pirates pIr6ts
+pires pIrz
+pirieda p@rAd@
+piru pErU
+piru pirU
+piscataway p6skat@wA
+piseco p6sAk]
+piseco p6sek]
+pisegna p6seny@
+piserchio pisArkEO
+pisses pis6z
+pistachio p6staS/]
+pistol pistL
+pistols pistLz
+pisturesque pisC@resk
+pit pit
+pitcairn pitkarn
+pitch piC
+pitched piCt
+pitcher piCP
+pitchfork piCf{rk
+pitchmen piCm~
+pithy piT/
+pitiable pid/@bL
+pitiful pid6fL
+pitre pEtP
+pits pits
+pitsenbarger pits6nb)rgP
+pittman pitm~
+pittock pid@k
+pitts pits
+pittsburg pitsbPg
+pittsburg pitsbVg
+pittsburgh pitsbPg
+pittsburgh pitsbVg
+pittsfield pitsfEld
+pittsinger pits6NP
+pittston pitst~
+pittsville pitsvil
+pity pid/
+pius pI@s
+pivoting piv@d6N
+pixies piks/z
+pizza pEts@
+pizzeria p6zEr/@
+pizzerias p6zEr/@z
+place plAs
+placed plAst
+placement plAsm~t
+placentia pl@senS@
+placerville plAsPvil
+places plAs6z
+placing plAs6N
+plageman plAjm@n
+plagiarized plAjPIzd
+plague plAg
+plagued plAgd
+plaguing plAg6N
+plain plAn
+plainfield plAnfEld
+plaintiff plAnt@f
+plaintiff's plAnt@fs
+plaintiffs plAnt@fs
+plainview plAnvyU
+plainville plAnvil
+plaistow plAst?
+plaistow plAstO
+plaistow plAst]
+plan plan
+planada pl@nod@
+planck plaNk
+plandome plandOm
+plane plAn
+planes plAnz
+planet plan6t
+planetarium plan6t,r/}
+planets plan6ts
+plank plaNk
+planks plaNks
+planned pland
+planning plan6N
+plano plAn]
+plans planz
+plant plant
+plantain plant~
+plantation plantAS~
+planted plant6d
+planting plant6N
+plantlike plantlIk
+plants plants
+plantsville plantsvil
+plaskett plask6t
+plasters plastPz
+plastic plast6k
+plata plod@
+plate plAt
+plateau pl@tO
+plated plAd6d
+plates plAts
+platform platf{rm
+platforms platf{rmz
+platinum plad~n}
+platinum's plad~n}z
+platinums plad~n}z
+platt plat
+plattekill platkil
+platteville platvil
+plattsburg platsbPg
+plattsburg platsbVg
+plattsburgh platsbPg
+plattsburgh platsbVg
+plaugher pl?wP
+plaut pl?t
+play plA
+playable plA@bL
+playacting plAakt6N
+playas plI@s
+playas ploy@z
+playbill plAbil
+playbook plAbqk
+played plAd
+player plA@
+player plAP
+players plAPz
+playfully plAfL/
+playground plAgr?nd
+playhouse plAh?s
+playing plA6N
+playoff plA{f
+playroom plArUm
+plays plAz
+plaything plATiN
+playthings plATiNz
+plaza ploz@
+plaza's ploz@z
+plazas ploz@z
+plea plE
+plead plEd
+pleak plEk
+pleas plEz
+pleasant plez~t
+pleasantly plez~tl/
+pleasanton plEs~t~
+pleasantridge plEs~trij
+pleasantry plez~tr/
+pleasantville plez~tvil
+please plEz
+pleased plEzd
+pleasurable pleZP@bL
+pleasure pleZP
+pledge plej
+pleiman plIm@n
+pleitez plEt6z
+plenty plent/
+plentywood plent/wqd
+plesant plez@nt
+plese plEz
+plessner plesnP
+plethora pleT@r@
+plod plod
+ploeger plOgP
+plot plot
+plotkin plotk~
+plots plots
+plott plot
+plough pl?
+plourde pl{rd
+plow pl?
+plowe pl?
+plowed pl?d
+plowing pl?6N
+plowman pl?m~
+pluck pluk
+plucks pluks
+pluemer plUmP
+plug plug
+plugs plugz
+plum plum
+plumadore plUm@dOr
+plumber plumP
+plumbing plum6N
+plume plUm
+plumerville plUmPvil
+plumes plUmz
+plumley pluml/
+plumville plumvil
+plunge plunj
+plunged plunjd
+plural plUrL
+pluralistic plUr@list6k
+plurality pl@ral6d/
+plus plus
+pluses plus6z
+plush pluS
+plutonium plUtOn/}
+ply plI
+plymouth plim@T
+plywood plIwqd
+pm pEem
+pneumonia n6mOn/@
+poached pOCt
+poacher pOCP
+pocasset p@kas6t
+pocasset p]kas6t
+pocekay pOskA
+pock pok
+pocket pok6t
+pocketful pok6tfL
+pockets pok6ts
+pockmarked pokm)rkt
+pocono p@kOn]
+pocono pOk@nO
+poconos p@kOn]z
+pod pod
+podbielski p)dbEelskE
+podiatry p@dI@tr/
+pods podz
+podunk pOduNk
+podunk pod6Nk
+poem pO}
+poems pO}z
+poet pO6t
+poetic p]ed6k
+poetry pO6tr/
+poets pO6ts
+poette pOet
+poffenroth p)f6nr)T
+pogo pOg]
+pogoda p@gOd@
+pogorelc p)gOrelk
+poi p<
+poi pEOI
+point p<n
+point p<nt
+pointe p<nt
+pointed p<nt6d
+pointing p<nt6N
+pointless p<ntl6s
+points p<nts
+poirier p<rEA
+poised p<zd
+poiser p<zP
+poison p<z~
+poisoned p<z~d
+poisonous p<z~@s
+poisons p<z~z
+poitier pw)tyA
+poke pOk
+poland pOl6nd
+polar pOlP
+polaroid's pol@r<dz
+polaroids pol@r<dz
+pole pOl
+poledore p)l@dOr
+poles pOlz
+policare p)likAr
+police p@lEs
+policeman p@lEsm~
+policemen p@lEsm~
+policewoman p@lEswqm~
+policies pol6s/z
+policy pol6s/
+polidore pOl@d{rE
+poling pOliN
+polish pol6S
+polished pol6St
+polite p@lIt
+politely p@lItl/
+politeness p@lItn6s
+political p@lid6kL
+politically p@lid6k6l/
+politicians pol6tiS~z
+politics pol6t6ks
+poll pOl
+pollack pol6k
+polley p)lE
+polling pOl6N
+pollock p)l@k
+pollute p@lUt
+polluting p@lUd6N
+pollution p@lUS~
+poltorak pOltPak
+polyester pol/estP
+polynesia pol6nEZ@
+polyunsaturated pol/~saC@rAd6d
+polyurethane pol/yUr6TAn
+pomaria pOm@rE@
+pomaria p]mar/@
+pomeroy pomr<
+pompano p@mpon]
+pompousness pomp@sn6s
+pompton pompt~
+ponca poNk@
+ponce pons
+ponchatoula ponC@t?l@
+poncho ponC]
+pond pond
+ponder pondP
+ponnusamy ponUsamE
+ponsford ponzfPd
+pontiac pont/ak
+pontiac's pont/aks
+pontiacs pont/aks
+pontotoc pont@tok
+ponty pont/
+pony pOn/
+ponytail pOn/tAl
+pooch pUC
+poodles pUdLz
+pool pUl
+pooler pUlP
+pooley pUl/
+pools pUlz
+poolside pUlsId
+poor pUr
+poore p{r
+poorer pUrP
+poorly pUrl/
+pop pop
+popcorn popk{rn
+pope pOp
+popeye popI
+popgun popgun
+poplar poplP
+poplarville poplPvil
+popover popOvP
+poppe p)pE
+popping pop6N
+poppleton p)p@lt6n
+popplewell p)p@lwel
+populace popy6l6s
+popular popy6lP
+popularity popy6lar6d/
+popularization popy6lP6zAS~
+popularize popy6lPIz
+popularizer popy6lPIzP
+population popy6lAS~
+populists popy6l6sts
+poquette p)ket
+porcelain p{rs6l~
+porcelains p{rs6l~z
+porch p{rC
+porcupine p{rky6pIn
+porcupines p{rky6pInz
+pores p{rz
+porgy p{rj/
+pork p{rk
+porkchop p{rkCop
+porky p{rk/
+port p{rt
+port_louis p{rtlU/
+portable p{rd@bL
+portage p{rd6j
+portales p{rtAlz
+portals p{rdLz
+porter p{rdP
+portersville p{rdPzvil
+porterville p{rdPvil
+porterville p{rtPvil
+portfolio's p{rtfOl/]z
+portfolios p{rtfOl/]z
+porthole p{rthOl
+portia p{rS@
+portion p{rS~
+portions p{rS~z
+portis p{rd6s
+portland p{rtl~d
+portman p{rtm~
+portola p{rtOl@
+portrait p{rtr6t
+portray p{rtrA
+portrayal p{rtrAL
+portrayals p{rtrALz
+ports p{rts
+portugal p{rC6gL
+portugal's p{rC6gLz
+portugals p{rC6gLz
+portuguese p{rC@gEz
+portville p{rtvil
+portwood p{rtwqd
+posadas p@zod@z
+posadas p]sod@s
+posed pOzd
+poser pOzP
+position p@ziS~
+positioning p@ziS~6N
+positions p@ziS~z
+positive poz6d6v
+posse p)sE
+possess p@zes
+possessed p@zest
+possesses p@zes6z
+possessions p@zeS~z
+possibilities pos6bil6d/z
+possibility pos6bil6d/
+possible pos@bl
+possibly pos6bl/
+possum pos}
+post pOst
+postal pOstL
+postbox pOstboks
+postcard pOstk)rd
+postcards pOstk)rdz
+postdate pOstdAt
+poste pOst
+posted pOst6d
+poster pOstP
+posthuma pOsthyUm@
+postle p)s@l
+postles p)st@lz
+postlethwait p)s@lTwAt
+postlethwaite p)s@lTwAt
+postlewait p)s@lwAt
+postlewaite p)st@lwAt
+postmark pOstm)rk
+poston pOst6n
+postpone pOstpOn
+postponed pOstpOnd
+postscript pOstskript
+postulates posC6lAts
+posture posCP
+postville pOstvil
+posy pOz/
+pot pot
+potaczala p)t@ksal@
+potanovic p@tan@vik
+potassium p@tas/}
+potato p@tAd]
+potatoes p@tAd]z
+potawatomie p@tow@tOm/
+potawatomie pOt@w@tOm/
+potbelly potb6l/
+poteete p@tEt
+potent pOd~t
+potential p@tenSL
+potentially p@tenS6l/
+potholes pothOlz
+pothoven p)tOv@n
+potiuk potE@k
+potiuk potEUk
+potsdam potsdam
+potter podP
+potterville podPvil
+potterville potPvil
+pottery podP/
+pottsboro potsbV]
+pottstown potst?n
+pottsville potsvil
+potwin potwin
+pouch p?C
+pouches p?C6z
+poughkeepsie p6kEps/
+pouk pUk
+poulin pUl6n
+pouliot pUlEO
+poulisse pUlEs
+poultices pOlt6s6z
+poultry pOltr/
+pound p?nd
+pounds p?ndz
+poundstone p?ndstOn
+pour p{r
+poured p{rd
+pourier pUrEP
+pouring p{r6N
+pourvase pUrvAz
+poutre pUtr@
+poverty povPd/
+poway pOA
+powder p?dP
+powders p?dPz
+powe p?
+powell p?L
+powellton p?Lt~
+power p?P
+power's p?Pz
+powerboat p?PbOt
+powerbook p?Pbqk
+powered p?Pd
+powerful p?PfL
+powerfully p?Pfl/
+powerhouse p?Ph?s
+powers p?Pz
+powers p?Vrz
+powersville p?Pzvil
+powhatan pO6t~
+powles p?lz
+powsey p?zE
+poynor p<nP
+practicable prakt6k@bL
+practical prakt6kL
+practically prakt6kl/
+practice prakt6s
+practiced prakt6st
+practices prakt6s6z
+practicing prakt6s6N
+practising prakt6s6N
+practitioner praktiS~P
+prado pr)dO
+prado prAd]
+prague prog
+prague's progz
+pragues progz
+prairie prer/
+praises prAz6z
+praiseworthy prAzwVD/
+praml pram@l
+pramod pramOd
+pramod pramod
+prance prans
+prankster praNkstP
+prately prAtlE
+prattsburg pratsbVg
+prattsville pratsvil
+prattville pratvil
+pray prA
+prayed prAd
+prayer pr,r
+prchal pPC@l
+prchlik pPClik
+pre prE
+preach prEC
+preached prECt
+precarious pr/k,r/@s
+precariously pr/k,r/@sl/
+precaution pr/k{S~
+precautions pr/k{S~z
+preceded pr/sEd6d
+prechtel prekt@l
+precincts prEsiNkts
+precious preS@s
+precise pr/sIs
+precision pr/siZ~
+precooked prEkqkt
+precythe presIT
+preda pred@
+predator pred@dP
+predetermined prEd6tVm~d
+predicament pr/dik@m~t
+predicted pr/dikt6d
+predictions pr/dikS~z
+predigestion prEd6jesC~
+predispositions prEdisp@ziS~z
+predominantly pr/dom~~tl/
+preference prefP~s
+prefers pr/fVz
+prefix prEfiks
+pregibon preg6bon
+prehistoric prEh6st{r6k
+preissner prIsnP
+prejsnar prejznP
+prejudice prej6d6s
+prejudices prej6d6s6z
+premature prEm@CUr
+premium prEm/}
+premiums prEm/}z
+prentice prent6s
+prentiss prent6s
+preoccupation prEoky6pAS~
+preoccupied prEoky6pId
+preoccupies prEoky6pIz
+preparation prep@rAS~
+prepare pr/p,r
+prepared pr/pard
+prepares pr/p,rz
+preparing pr/p,r6N
+prepayments prEpAm~ts
+prerecord prErekPd
+prerequisites prErekw6s6ts
+prerogative pr@rog@d6v
+presbyterian presb6tEr/~
+preschooler prEskUlP
+prescott presk6t
+prescribe pr/skrIb
+prescribing pr/skrIb6N
+presence prez~s
+present prez~t
+presented pr/zent6d
+presently prez~tl/
+presents prez~ts
+preservation prezPvAS~
+preservative pr/zVv@d6v
+preservatives pr/zVv@d6vz
+preserve pr/zVv
+preserved pr/zVvd
+preserves pr/zVvz
+preserving pr/zVv6N
+preset pr/set
+preset prEset
+presets pr/sets
+presets prEsets
+presided pr/zId6d
+president prez6d~t
+presidents prez6d~ts
+presides pr/zIdz
+presley presl/
+press pres
+pressboard presb{rd
+pressed prest
+pressroom presrUm
+pressure preSP
+pressured preSPd
+pressurized preSPIzd
+prestige prestEZ
+prestigious pr/stij@s
+preston prest~
+presumably pr/zUm@bl/
+presume pr/zUm
+presumed pr/zUmd
+presumes pr/zUmz
+presumptuous pr/zumpCU@s
+presupposition prEsup@ziS~
+pretend pr/tend
+pretty prid/
+prevalent prevL~t
+prevent pr/vent
+prevented pr/vent6d
+preventing pr/vent6N
+prevention pr/venS~
+preview prEvyU
+previous prEv/@s
+previously prEv/@sl/
+prevot prEvO
+prey prA
+prezzia prettsE@
+price prIs
+priced prIst
+priceless prIsl6s
+prices prIs6z
+prichard priCPd
+pride prId
+pridemore prIdm{r
+priest prEst
+prim prim
+prima prEm@
+primacy prIm@s/
+primarily prImar6l/
+primary prImer/
+primate prImAt
+prime prIm
+primes prImz
+primghar primg)r
+primghar primgP
+primitive prim6d6v
+primly priml/
+primrose primrOz
+prince prins
+princes prins6z
+princess prins6s
+princeton prinst~
+princevalle prinsvAl
+princeville prinsvil
+principal prins6pL
+principals prins6pLz
+principle prins6pL
+principles prins6pLz
+prinkleton priNk@lt6n
+print print
+printed print6d
+prints prints
+priolean prI)lEn
+prior prIP
+priore prEOr
+priorities prI{r6d/z
+priority prI{r6d/
+priscila prisil@
+prison priz~
+prisoner priz~P
+prisoners priz~Pz
+pritchard priCPd
+pritchett priC6t
+privacy prIv6s/
+private prIv6t
+privateer prIv@tEr
+privately prIv6tl/
+privations prIvAS~z
+privilege priv6l6j
+privileged priv6l6jd
+priyanka pr6yank@
+prize prIz
+prizes prIz6z
+probably prob@bl/
+probes prObz
+problem probl}
+problematic probl6mad6k
+problems probl}z
+procaine pr@kAn
+procedure pr@sEjP
+procedures pr@sEjPz
+proceed pr@sEd
+proceeded pr@sEd6d
+proceedings pr@sEd6Nz
+process proses
+processed prosest
+processes proses6z
+processing proses6N
+procession pr@seS~
+processor prosesP
+proclaims pr@klAmz
+proclamation prokl@mAS~
+procrastinating pr@krast6nAd6N
+procreation prOkr/AS~
+procter proktP
+procured pr@kyUrd
+procurements pr@kyUrm~ts
+prod prod
+produce pr/dUs
+produced pr/dUst
+producers pr/dUsPz
+producing pr/dUs6N
+product prod6kt
+production pr@dukS~
+productive pr@dukt6v
+products prod6kts
+profanity pr@fan6d/
+profession pr@feS~
+professional pr@feS~L
+professor pr@fesP
+professors pr@fesPz
+proficient pr@fiS~t
+profile prOfIl
+profiles prOfIlz
+profiling prOfIl6N
+profit prof6t
+profits prof6ts
+profound pr@f?nd
+profusely pr@fyUsl/
+progl pr)g@l
+program prOgram
+program prOgr}
+programme prOgram
+programmed prOgramd
+programming prOgram6N
+programs prOgramz
+programs prOgr}z
+progress progres
+progresses progres6z
+progression pr@greS~
+prohibited pr@hib6d6d
+prohibitions prO6biS~z
+project projekt
+projected pr@jekt6d
+projectiles pr@jektIlz
+projective pr@jekt6v
+projects projekts
+prolongs pr@l{Nz
+prominent prom~~t
+promiscuous pr@miskyU@s
+promise prom6s
+promised prom6st
+promises prom6s6z
+promising prom6s6N
+promontory prom~t{r/
+promote pr@mOt
+promoted pr@mOd6d
+promotes pr@mOts
+promoting pr@mOd6N
+prompt prompt
+prompted prompt6d
+prompter promptP
+promptly promptl/
+prompton prompt~
+prompts prompts
+prone prOn
+prong pr{N
+pronounces pr@n?ns6z
+pronouncing pr@n?ns6N
+pronouns prOn?nz
+pronovost prOnOvOst
+pronunciation pr@nuns/AS~
+proof prUf
+proofreading prUfrEd6N
+proper propP
+properly propPl/
+properties propPd/z
+property propPd/
+propes prOps
+prophets prof6ts
+proportion pr@p{rS~
+proportions pr@p{rS~z
+proposal pr@pOzL
+proposed pr@pOzd
+propounded pr@p?nd6d
+propriety pr@prI6d/
+props props
+prosak prOzak
+proscia prOsE@
+prose prOz
+prosecuted pros6kyUd6d
+prosecutors pros6kyUdPz
+prospect prospekt
+prospective pr@spekt6v
+prospects prospekts
+prosperity prospar6d/
+prosperous prosp@r@s
+prosthesis prosT6s6s
+prostitution prost6tUS~
+protain prOtAn
+protect pr@tekt
+protected pr@tekt6d
+protecting pr@tekt6N
+protection pr@tekS~
+protects pr@tekts
+protein prOtEn
+protest pr@test
+protestant prod6st~t
+protestants prod6st~ts
+protests pr@tests
+protocol prOd@k{l
+prototype prOd]tIp
+protruding pr@trUd6N
+protrusion pr@trUZ~
+proud pr?d
+proudest pr?d6st
+proudly pr?dl/
+prove prUv
+proved prUvd
+proven prUv~
+provide pr@vId
+provided pr@vId6d
+providence prov6d~s
+providences prov6d~s6z
+providencia pr)v@tensE@
+provident prov6d~t
+provides pr@vIdz
+providing pr@vId6N
+province prov~s
+provinces prov~s6z
+provincetown prov~st?n
+provision pr@viZ~
+provisionally pr@viZ~L/
+provisions pr@viZ~z
+provo prOv]
+provocatively pr@vok@d6vl/
+provoke pr@vOk
+provoked pr@vOkt
+provost prOvOst
+prow pr?
+prowler pr?lP
+prowling pr?l6N
+prows pr?z
+proximity proksim6d/
+prudential prUdenSL
+prudential's prUdenSLz
+prudentials prUdenSLz
+prudently prUd~tl/
+pruessner prUesnP
+prune prUn
+prunedale prUndAl
+pryor prIP
+przewozman pruz)vzm6n
+psychiatric sIk/atr6k
+psychic sIk6k
+psychoanalysis sIk]@nal6s6s
+psychoanalytic sIk]an@lid6k
+psychogenetic sIk]j6ned6k
+psychogenic sIk]jen6k
+psychological sIk@loj6kL
+psychologically sIk@loj6kl/
+psychology sIkol@j/
+psychopath sIk@paT
+psychopathic sIk@paT6k
+psychopaths sIk@paTs
+psychotherapy sIk]Tar@p/
+psychotic sIkod6k
+public publ6k
+publication publ6kAS~
+publications publ6kAS~z
+publicity p6blis6d/
+publicize publ6sIz
+published publ6St
+puccetti pUCetE
+puckett puk6t
+pudding pqd6N
+puddings pqd6Nz
+puddles pudLz
+pue pyU
+pueblo pwebl]
+puello pUelO
+puente pwentA
+puentes pwentAs
+puerta pwArt@
+puertas pwert@s
+puff puf
+puffenbarger puf6nb)rjP
+puffer pufP
+puffin puf~
+pug pug
+pugel pyUg@l
+pugh pyU
+pugsley pugzl/
+puidokas pwEtOk@s
+pull pql
+pulled pqld
+pullen pql~
+puller pqlP
+pulling pql6N
+pullman pqlm~
+pullouts pql?ts
+pullover pqlOvP
+pulping pulp6N
+pulpwood pulpwqd
+pulsan puls~
+pulsating pulsAd6N
+pulses puls6z
+pulsing puls6N
+pulvermacher pulvPm)kP
+pumpernickel pumpPnikL
+pumpkin pumpk~
+pumpkins pumpk~z
+pumpkinseed pumpk~sEd
+pumps pumps
+punch punC
+punchline punClIn
+punctuality puNkCUal6d/
+punctuate puNkCUAt
+punctuation puNkCUAS~
+punctured puNkCPd
+punctures puNkCPz
+pungent punj~t
+punish pun6S
+punishes pun6S6z
+punishment pun6Sm~t
+puny pyUn/
+pup pup
+puppets pup6ts
+pups pups
+purcell pVsel
+purchase pVC6s
+purchased pVC6st
+purchaser pVC@sP
+purchasers pVC@sPz
+purdys pVd/z
+pure pyUr
+purebreds pyUrbredz
+puree pyUrA
+purely pyUrl/
+purge pVj
+purged pVjd
+purification pyUr6f6kAS~
+purina py@rEn@
+purists pyUr6sts
+purity pyUr6d/
+purkhiser pPkhIzP
+purple pVpL
+purpleness pVpLn6s
+purpose pVp6s
+purposeless pVp@sl6s
+purposely pVp@sl/
+purrell pVel
+purring pV6N
+purrs pVz
+purse pVs
+pursed pVst
+pursglove pVsgl@v
+pursglove pVzglOv
+pursue pPsU
+pursued pPsUd
+pursuer pPsUP
+pursuers pPsUPz
+pursuing pPsU6N
+pursuit pPsUt
+pursuits pPsUts
+purvis pVv6s
+pusan pUs)n
+pusan pUson
+push pqS
+pushcart puSkPt
+pushchairs pqSC,rz
+pushed pqSt
+pushers pqSPz
+pushing pqS6N
+pushover pqSOvP
+put pqt
+puterbaugh pyUtPb)
+putnam's putn}z
+putnams putn}z
+puts pqts
+putting pqd6N
+puyallup pIL@p
+puzzle puzL
+puzzling puzl6N
+pyatt pI6t
+pyette pIet
+pygmy pigm/
+pyles pIlz
+pylesville pIlzvil
+pyramid pEr@m6d
+pyramids pEr@m6dz
+pyrex pIreks
+pyromania pIr]mAn/@
+python pIT~
+q kyU
+qian CEin
+qian kEan
+qua kw)
+quack kwak
+quackenbush kwak6nbqS
+quackery kwakP/
+quadruple kwodrUpL
+quagliato kw)glE)tO
+quail kwAl
+quails kwAlz
+quaint kwAnt
+quaintly kwAntl/
+quaker kwAkP
+quakertown kwAkPt?n
+qualification kw{l6f6kAS~
+qualifications kw{l6f6kAS~z
+qualified kw{l6fId
+qualitative kw{l6tAd6v
+qualities kw{l6d/z
+quality kw{l6d/
+quamba kwamb@
+quan kw)n
+quandt kwont
+quang CUaN
+quang kwaN
+quantity kwont6d/
+quantize kwontIz
+quapaw kwop{
+quarles kw{rlz
+quarrel kw{rL
+quarrels kw{rLz
+quarrelsome kw{rLs}
+quarry kw{r/
+quarryville kw{r/vil
+quart kw{rt
+quarter kw{rdP
+quartets kw{rtets
+quasqueton kwoskt~
+quaver kwAvP
+quebec kw6bek
+queen kwEn
+queens kwEnz
+queensberry kwEnzber/
+queensland kwEnzl~d
+queenstown kwEnzt?n
+queensy kwEns/
+queja kAj@
+quelling kwel6N
+quench kwenC
+queru kw,rU
+querulous kwar6l@s
+query kwEr/
+quesada kAs)t@
+quesenberry kwes6nbArE
+quesnell keznel
+question kwesC~
+questioner kwesC~P
+questioning kwesC~6N
+questionnaire kwesC@n,r
+questionnaires kwesC@n,rz
+questions kwesC~z
+quevedo k6vAdO
+quezada kAz)t@
+quezaire kAzAr
+quiana kE)n@
+quick kwik
+quickened kwik~d
+quickest kwik6st
+quickly kwikl/
+quickness kwikn6s
+quicksands kwiksandz
+quicksilver kwiksilvP
+quickstop kwikstop
+quiet kwI@t
+quiet] kwI6t
+quieted kwI6d6d
+quietly kwI6tl/
+quietness kwI6tn6s
+quiett kwI6t
+quigley kwigl/
+quijada kEh)t@
+quijano j)nO
+quiles kwElz
+quilici kwilECE
+quimby kwimbE
+quinault kw6nO
+quinault kw6n{lt
+quinault kwin{lt
+quince kwins
+quincy kwins/
+quincy kwinz/
+quine kwIn
+quinhagak kwinh@gak
+quinlan kwinl~
+quinnesec kwin6sek
+quinones kinyOn6s
+quinonez kinyOn6s
+quinta kEnt@
+quinta kwint@
+quintana kwintan@
+quintana kw~ton@
+quintessential kwint6senSL
+quintupled kwintupLd
+quintuplet kwintupl6t
+quirarte kwEr)rt
+quiroz kErOz
+quit kwit
+quite kwIt
+quitter kwitP
+quiver kwivP
+quo kwO
+quogue kwOg
+quoin kw<n
+quote kwOt
+quoted kwOd6d
+quotes kwOts
+quotient kwOS~t
+r )r
+r r
+r$$$&b )r~bE
+r$$&b )r~bE
+r$&b )r~bE
+r&b )r~bE
+rabbits rab6ts
+rabehl rabel
+rabeneck rAbnek
+rabenhorst rAbinhOrst
+rabies rAb/z
+rabinowitz r@binO6ts
+raccoon rakUn
+raccoons rakUnz
+race rAs
+racecourse rAsk{rs
+racehorse rAsh{rs
+racerunner rAsrunP
+races rAs6z
+rachael rAC6l
+rachal rAC@l
+racheal rAC6l
+rachel rACL
+rachel's rACLz
+rachele rAC@l
+rachelle rACel
+rachels rACLz
+racine r@sEn
+racing rAs6N
+racioppo r@sEOpO
+rack rak
+racks raks
+racquel r@kel
+racy rAs/
+radar rAd)r
+radars rAd)rz
+radcliffe radklif
+radej radej
+radford radfPd
+radiance rAd/~s
+radiant rAd/~t
+radiation rAd/AS~
+radical rad6kL
+radio rAd/]
+radioactive rAd/]akt6v
+radioactivity rAd/]aktiv6d/
+radiologists rAd/ol@j6sts
+radisson rad6s~
+radziewicz radzE@wiC
+raeann rAan
+raes rAz
+rafaela r)fAel@
+rafferty rafPd/
+raft raft
+rafting raft6N
+rafts rafts
+rag rag
+raggedy rag6d/
+raging rAj6N
+ragins rag6nz
+ragland ragl~d
+rags ragz
+ragsdale ragzdAl
+ragtime ragtIm
+rahmes r)mz
+rail rAl
+rail_roadroad rAlrOd&rOd
+railcars rAlk)rz
+railer rAlP
+railing rAl6N
+railroad rAlrOd
+railroads rAlrOdz
+rails rAlz
+railway rAlwA
+railways rAlwAz
+raimi rIm/
+rain rAn
+rainbolt rAnbOlt
+rainbow rAnbO
+rainbows rAnbOz
+raindrops rAndrops
+raine rAn
+rained rAnd
+rainelle rAnel
+rainer rAnP
+rainfall rAnf{l
+rainforest rAnf{r6st
+rainier rAn/P
+rains rAnz
+rainwater rAnw{dP
+rainwaters rAnw)tPz
+rainy rAn/
+raise rAz
+raised rAzd
+raisers rAzPz
+raises rAz6z
+raisin rAz~
+raising rAz6N
+raisins rAz~z
+raisler rAzlP
+raisley rAzlE
+rajeev r6jEv
+rajeswaran rajesw)ran
+rake rAk
+raked rAkt
+rakestraw rAkstr{
+rakestrow rAkstrO
+raleigh rol/
+rallies ral/z
+rallying ral/6N
+ralph ralf
+ralph's ralfs
+ralphs ralfs
+ralston r{lst~
+ram ram
+raman raman
+rambousek rambUsek
+ramer rAmP
+rames r)mes
+ramire r@
+ramires r@mErez
+ramirez ramErez
+ramiriz ramEriz
+ramjhon ramj)n
+ramon r@mOn
+ramp ramp
+rampages rampAj6z
+ramsay ramz/
+ramsbottom ramzb)t@m
+ramsdale ramsdAl
+ramsey ramz/
+ramsgate ramzgAt
+ramstad ramstad
+ramzinski ramzinsk/
+ran ran
+ranae r@nA
+ranch ranC
+ranchland ranCland
+rancho ranC]
+randazzo randaz]
+randee randE
+randleman rand@lm@n
+randles rand@lz
+randlett randl6t
+randolph randLf
+random rand}
+randomly rand@ml/
+randy rand/
+ranee r)nE
+rang raN
+range rAnj
+rangel rAnj@l
+ranging rAnj6N
+rangoon raNgUn
+ransom rans}
+ransoms rans}z
+ranson rans~
+rantoul rantL
+rantoul rantUl
+rap rap
+rape rAp
+rapelyea r@pelyE
+raphael rafAel
+raphael rafL
+raphine raphIn
+rapid rap6d
+rapidly rap6dl/
+rapids rap6dz
+rapose r@pOsE
+rappenecker rap6nekP
+rappl rap@l
+rappleyea rap@lE@
+rapuano rapwanO
+raquel r@kel
+rare r,r
+rarely r,rl/
+rarer rarP
+rarest rar6st
+raritan rar6t~
+rarity rar6d/
+rascally rask6l/
+rashad r@S)d
+rashed r@Sed
+rasheeda r@SEd@
+rashid r@SEd
+rasmuson razm@s@n
+rasmussen rasm6s6n
+raspberries razb,r/z
+raspberry razberE
+rasped raspt
+rasps rasps
+ratdogs ratd{gz
+rate rAt
+rated rAd6d
+rates rAts
+rather raDP
+rathmanner raTmanP
+rating rAd6N
+ratio rAS]
+rational raS~L
+rationalizations raS~L6zAS~z
+rationalize raS~@lIz
+rationed raS~d
+rationing raS~6N
+ratissen r@tis~
+rats rats
+rattle radL
+rattled radLd
+rattler radLP
+rattlesnake radLsnAk
+rattlesnakes radLsnAks
+rauf r?f
+ravage rav6j
+ravenell rAv6nel
+ravenna r@ven@
+ravenscraft rAv6nzkraft
+ravenscroft rAv6nzkr)ft
+ravia rAv/@
+raw r{
+rawe r{
+rawhide r{hId
+rawhouser r{h?zP
+rawles r{lz
+rawls r{lz
+rawson r{s~
+ray rA
+rayes rAz
+rayland rAland
+raymer rAmP
+raymond rAm~d
+raymondville rAm~dvil
+raynesford rAnzfPd
+raynham rAn}
+rays rAz
+raysville rAzvil
+rayville rAvil
+razor rAzP
+razorback rAzPbak
+razorbacks rAzPbaks
+rd rOd
+rds )rdEes
+re rE
+rea rA
+reabsorbed rE@bz{rbd
+reach rEC
+reachable rEC@bL
+reached rECt
+reaches rEC6z
+reacting rEakt6N
+reaction r/akS~
+reactivated rEakt6vAd6d
+reactivity rEaktiv6d/
+read rEd
+read red
+reader rEdP
+readers rEdPz
+readiness red/n6s
+reading rEd6N
+reading red6N
+readings rEd6Nz
+readjustment rE@justm~t
+reads rEdz
+ready red/
+readyville rEAd/vil
+readyville red/vil
+reaffirmation rEafPmAS~
+reaffirmed rE@fVmd
+reagan rAg@n
+reagan's rAg~z
+reagans rAg~z
+reagen rAg@n
+real rEl
+realism rE@liz}
+realistic rE@list6k
+reality r/al6d/
+realization rEl6zAS~
+realize rElIz
+realized rElIzd
+realizing rElIz6N
+really rEl/
+realm relm
+realms relmz
+realty rElt/
+reames rEmz
+reamstown rEamzt?n
+reamstown rEmzt?n
+reanna rEan@
+reappraisal rE@prAzL
+rear rEr
+reared rErd
+rearing rEr6N
+rearrange rE@rAnj
+rearranging rE@rAnj6N
+reason rEz~
+reasonable rEz~@bL
+reasonableness rEz~@bLn6s
+reasoning rEz~6N
+reasonover rEz@nOvP
+reasons rEz~z
+reasserting rE@sVd6N
+reassurance rE@SUr~s
+reassure rE@SUr
+reassuring rE@SUr6N
+reauthorize rE{TPIz
+reavely rEvlE
+reavis rEv6s
+reawakening rE@wAk~6N
+reba rEb@
+rebbeca r@bek@
+rebeca r@bek@
+rebecca r/bek@
+rebecca r/bek@
+rebecca r@bek@
+rebekah r@bek@
+rebel rebL
+rebirth rEbVT
+rebuild rEbild
+rebuilt rEbilt
+rebuttal r/budL
+rebuttal rEbutL
+recalculate rEkalky6lAt
+recalculated rEkalky6lAd6d
+recall r/k{l
+recall rEk{l
+recalled r/k{ld
+recalls r/k{lz
+recede r/sEd
+receipt r/sEt
+receive r/sEv
+received r/sEvd
+receives r/sEvz
+receiving r/sEv6N
+recent rEs~t
+recently rEs~tl/
+reception r/sepS~
+rechis rAC6s
+rechis rIkis
+rechtzigel rektzIg@l
+recife r@sEf/
+recife rEsIf
+recipe res6p/
+reciprocation r/sipr@kAS~
+recirc r/sVk
+recirc rEsVk
+recirculation rEsVky6lAS~
+reckleben rek@lb6n
+reckless rekl6s
+recognised rek@gnIzd
+recognises rek@gnIz6z
+recognition rek@gniS~
+recognitions rek@gniS~z
+recognize rek@gnIz
+recognized rek@gnIzd
+recognizes rek@gnIz6z
+recoiled r/k<ld
+recommendation rek@m~dAS~
+recommended rek@mend6d
+reconciles rek~sIlz
+reconciliatory r/kons6lI@t{r/
+reconnaissance r/kon@s~s
+reconsider rEk~sidP
+reconsidered rEk~sidPd
+reconstruct rEk~strukt
+reconstructions rEk~strukS~z
+record r/k{rd
+record rekPd
+recorded r/k{rd6d
+recording r/k{rd6N
+recording r6k{rd6N
+recordings r/k{rd6Nz
+records rekPdz
+recover r/kuvP
+recovered rEkuvPd
+recreation rekr/AS~
+recriminations r/krim6nAS~z
+rectangle rektaNgL
+rectangular rektaNgy6lP
+rector rektP
+recuperating r/kUp@rAd6N
+recurring r/kV6N
+recycles rEsIkLz
+red red
+red_lake redlAk
+red_river redrivP
+red_willow redwil]
+redcoats redkOts
+redcross redkr)s
+reddekopp redk)p
+redding red6N
+reddish red6S
+redecorating rEdek@rAd6N
+redeemed r/dEmd
+redeployed rEd6pl<d
+redeposition rEdep@ziS~
+redesigned rEd6zInd
+redfield redfEld
+redford redfPd
+redgate redgAt
+redgranite redgran6t
+redgrave redgrAv
+redhanded rEdand6d
+redhead redhed
+redheaded rEdEd6d
+redheads rEdEdz
+redial rEdIL
+redlands redlandz
+redlands redl~dz
+redlinger redliNP
+redmond redm~d
+redness redn6s
+redondo rEdond]
+redone rEdun
+redraw rEdr{
+redskins redskinz
+redstone redstOn
+reduce r/dUs
+reduced r/dUst
+reduces r/dUs6z
+reducing r/dUs6N
+reduction r/dukS~
+redundant r/dund~t
+redwald rEdw{ld
+redwood redwqd
+redwoods redwqdz
+reeceville rEEsvil
+reeceville rEsvil
+reed rEd
+reeder rEdP
+reedley rEedl/
+reedsburg rEdzbPg
+reedsburg rEedzbVg
+reedsville rEdzvil
+reedsville rEedzvil
+reef rEf
+reefer rEEfP
+reel rEl
+reels rElz
+reelsville rElzvil
+rees rEz
+reexamine rE6gzam~
+refer r/fV
+referee ref@rE
+referees ref@rEz
+reference refr~s
+references refr~s6z
+referred r/fVd
+referring r/fV6N
+refers r/fVz
+reflect r/flekt
+reflected r/flekt6d
+reflecting r/flekt6N
+reflection r/flekS~
+reflections r/flekS~z
+reflects r/flekts
+reflex rEfleks
+reform r/f{rm
+reformulate r/f{rmy6lAt
+reformulation r/f{rmy6lAS~
+refresh r/freS
+refreshed r/freSt
+refrigerator r/frij@rAdP
+refugia r@fyUjE@
+refund rEfund
+refurbishing rEfVb6S6N
+refusal r/fyUzL
+refuse r/fyUz
+refused r/fyUzd
+refusing r/fyUz6N
+regal rEg@l
+regan's rEg~z
+regans rEg~z
+regard r/g)rd
+regarding r/g)rd6N
+regelman rEg@lm@n
+regenerating rEjen@rAd6N
+regensburg rAg~zbVg
+regensburg rEjenzbVg
+regent rEj~t
+reggae regA
+reggie rej/
+reggio rej/]
+regime rAZEm
+reginald rej~Ld
+reginald's rej~Ldz
+reginalds rej~Ldz
+regine r@jIn
+region rEj~
+regional rEj~L
+regis rEj6s
+register rej6stP
+registration rej6strAS~
+regret r/gret
+regretting r/gred6N
+regular regy6lP
+regularity regy6lar6d/
+regularly regy6lPl/
+regulars regy6lPz
+regulated regy6lAd6d
+regulation regy6lAS~
+regulations regy6lAS~z
+regulative regy6l@d6v
+rehabilitate rEh@bil6tAt
+rehabilitation rEh@bil6tAS~
+rehearsal r/hVsL
+reheating rEhEd6N
+rehmeier remIP
+rehobeth rEhOb6T
+reich rIk
+reichardt rIk)rt
+reichart rIkPt
+reiche rIk
+reichelderfer rIk@ldPfP
+reichenbach rIk@nb)k
+reichenberg rIk6nbPg
+reichert rIkPt
+reichman rIkm@n
+reichmann rIkm6n
+reichow rIk?
+reidhaar rEdh)r
+reifschneider rIfSnIdP
+reigel rIg@l
+reigh rA
+reighley rAlE
+reigleman rIg@lm@n
+reilly rIlE
+reimbursement rE6mbVsm~t
+reimer rImP
+reina rAn@
+reincarnation rEink)rnAS~
+reindeer rAndEr
+reineccius rIn@kE@s
+reineking rInkiN
+reinforce rE~f{rs
+reinhart rInh)rt
+reinhold rInhOld
+reinstatement rE~stAtm~t
+reinsure rEinSUr
+reinsures rEinSUrz
+reintegrated rEint6grAd6d
+reis rEs
+reiss rEs
+reissued rEiSUd
+reiswig rIswig
+reitano rEt)nO
+reitmeier rItmIP
+reitmeyer rItmIP
+rejected r/jekt6d
+rejoicing r/j<s6N
+rekemeyer rEkmIr
+relate r/lAt
+related r/lAt6d
+related r6lAt6d
+relating r/lAd6N
+relationship rElAS~Sip
+relative rel@d6v
+relatively rel@d6vl/
+relatives rel@d6vz
+relativistic rel@d6vist6k
+relax r/laks
+relaxation rElaksAS~
+relaxed r/lakst
+relaxing r/laks6N
+relay rElA
+release r/lEs
+released r/lEst
+relentless rElentl6s
+relevance rel6v~s
+relevant rel6v~t
+reliance r/lI~s
+relics rel6ks
+relief r/lEf
+relieved r/lEvd
+relieving r/lEv6N
+religion r6lij~
+religions r/lij~z
+religious r/lij@s
+relinquishing r/liNkw6S6N
+relish rel6S
+relished rel6St
+relishing rel6S6N
+reluctance r/lukt~s
+reluctant r/lukt~t
+rely r/lI
+remain r/mAn
+remainder r/mAndP
+remained r/mAnd
+remaining r/mAn6N
+remains r/mAnz
+remarkable r/m)rk@bL
+remarkably r/m)rk@bl/
+remedies rem6d/z
+remedios r6mEdEOs
+remedy rem6d/
+remember r/membP
+remembered r/membPd
+remembers r/membPz
+remembrance r/membr~s
+remind r/mInd
+reminded r/mInd6d
+reminder r/mIndP
+reminders r/mIndPz
+reminding r/mInd6N
+reminiscence rem6nis~s
+remote r/mOt
+removal r/mUvL
+remove r/mUv
+removed r/mUvd
+remsenburg rems~bVg
+remy rEm/
+renae r@nA
+renaissance ren6sons
+renata rEnod@
+renate r@n)tA
+rendering rendP6N
+rendleman rend@lm@n
+rendler rendlP
+rendville rendvil
+rene r@nA
+renee r@nA
+renewable r/nU@bL
+renfield renfEld
+rengel reNg@l
+rengers reNPs
+renier rEnIP
+renneker ren6kP
+rennert renPt
+reno rEn]
+renovo rEnOv]
+renovo rcnOv]
+renowned r/n?nd
+rensselaer r/nsel@P
+rensselaer rens@l)r
+rent rent
+rental rentL
+rented rent6d
+renton rent~
+rentz rents
+renunciation r/nuns/AS~
+reopen rEOp~
+reorganization rE{rg~6zAS~
+reorganizing rE{rg@nIz6N
+repainted rEpAnt6d
+repainting rEpAnt6N
+repair r/p,r
+repaired r/pard
+repairs r/p,rz
+reparation rep@rAS~
+repeat r/pEt
+repeat rEpEt
+repeated r/pEd6d
+repeating r/pEd6N
+repetition rep6tiS~
+repetitive r/ped6d6v
+repine r@pIn
+replace r/plAs
+replacements r/plAsm~ts
+replan rEplan
+replane rEplAn
+replay rEplA
+replenish r/plen6S
+replication repl6kAS~
+replied r/plId
+reply r/plI
+report r/p{rt
+reported r/p{rd6d
+reporters r/p{rdPz
+reports r/p{rts
+reprehended rEprEhend6d
+represent repr6zent
+representation repr6z~tAS~
+representations repr6z~tAS~z
+representative repr6zent@d6v
+reproaching r/prOC6N
+reproduce rEpr6dUs
+reptiles reptIlz
+reptilian r@ptily~
+republic r/publ6k
+republican r/publ6k~
+republicans r/publ6k~z
+repugnant r/pugn~t
+reputation repy6tAS~
+reputedly r/pyUd6dl/
+requena r@kAn@
+request r/kwest
+requests r/kwests
+requiem rekw/}
+require r/kwIr
+required r/kwIrd
+requirement r/kwIrm~t
+requirements r/kwIrm~ts
+requires r/kwIrz
+requisitioned rekw6ziS~d
+reroute r/r?t
+reroute r/rUt
+rerucha rerUk@
+resaca r6sak@
+resaca rEsok@
+rescue reskyU
+rescuer reskyUP
+research rEsPC
+researched rEsPCt
+researcher rEsPCP
+researchers rEsPCPz
+resemble r/zembL
+resembled r/zembLd
+resembles r/zembLz
+reservation rezPvAS~
+reservations rezPvAS~z
+reserve r/zVv
+reserved r/zVvd
+reserves r/zVvz
+reservoir rezPvw)r
+reservoirs rezPvw)rz
+reset r/set
+reset rEset
+residency rez6d~s/
+resident rez6d~t
+residential rez6denSL
+residents rez6d~ts
+resides r/zIdz
+residual r/zijwL
+residue rez6dU
+resigned r/zInd
+resin rez~
+resistance r/zist~s
+resisting r/zist6N
+resolute rez@lUt
+resolutely rez@lUtl/
+resolution rez@lUS~
+resolve r/zolv
+resolved r/zolvd
+resonance rez~~s
+resort r/z{rt
+resource rEs{rs
+resources rEs{rs6z
+respect r/spekt
+respected r/spekt6d
+respects r/spekts
+respicio respECEO
+respiratory respr@t{r/
+respond r/spond
+response r/spons
+responsibility r/spons6bil6d/
+responsible r/spons@bl
+responsively r/spons6vl/
+rest rest
+restart rEst)rt
+restaurant restPont
+restaurant restr~t
+restauranteur r/st@r~tV
+restaurants rest@ronts
+restaurateur r/st@r@tV
+restful restfL
+restless restl6s
+restore r/st{r
+restored r/st{rd
+restores r/st{rz
+restrain r/strAn
+restricted r/strikt6d
+restrictions r/strikS~z
+restroom restrUm
+rests rests
+result r/zult
+resulted r/zult6d
+results r/zults
+resume r/zUm
+resume rezqmA
+resumed r/zUmd
+resureccion resPekS@n
+resurrected rezPekt6d
+retains r/tAnz
+retaliatory r/tal/6t{r/
+retardation rEt)rdAS~
+rethmeier reTmIr
+retinal red~nL
+retire r/tIr
+retired r/tIrd
+retirement r/tIrm~t
+retires r/tIrz
+retouching rEtuC6N
+retracted r/trakt6d
+retrain r/trAn
+retraining rEtrAn6N
+retreat r@trEt
+retribution retr6byUS~
+retrieval r/trEvL
+retrieve r/trEv
+retroactive retr]akt6v
+retry r/trI
+retry rEtrI
+rettinger retiNgP
+retune r/tUn
+return r/tVn
+return r6tVn
+returned r/tVnd
+returning r/tVn6N
+returns r/tVnz
+reunion rEyUny~
+reuniting rEy6nId6N
+reupholstering rE@pOlstP6N
+reuss rUs
+reutlinger rUtliNP
+reveal r/vEl
+revealed r/vEld
+revelation rev6lAS~
+revelations rev6lAS~z
+revelers rev6lPz
+revenge r/venj
+revenues rev6nUz
+reverberated r/vVb@rAd6d
+revere r/vEr
+reverse r/vVs
+reversed r/vVst
+review r/vyU
+reviewers r/vyUPz
+revised r/vIzd
+revision r/viZ~
+revisionist rEviZ~6st
+revive r/vIv
+revives r/vIvz
+revocation rev@kAS~
+revoir revw)r
+revolution rev@lUS~
+revolutionary rev@lUS@ner/
+revolutionized rev@lUS@nIzd
+revolved r/volvd
+revolving r/volv6N
+revulsion r/vulS~
+rew rU
+rewarded r/w{rd6d
+rewind r/wInd
+rewind rEwInd
+rewrite rErIt
+rexburg reksbVg
+reynaud rAn)d
+reynolds renLdz
+reynoldson rAnLds~
+reznicek rezn6Cek
+rhame rAm
+rhatigan rad@gin
+rheault rE{lt
+rhees rEz
+rheingold rIngOld
+rhen ren
+rheydt rAt
+rhine rIn
+rhinebolt rInbOlt
+rhinehardt rInh)rt
+rhinehart rInh)rt
+rhinerson rInPs@n
+rhinesmith rInsmiT
+rhino rIn]
+rhinoceros rInos@r6s
+rhoad rOd
+rhoades rOdz
+rhoads rOdz
+rhoan rO@n
+rhoda rOt@
+rhode rOd
+rhode_island rOdIl~d
+rhodehamel rOdham@l
+rhoden rOt6n
+rhodes rOdz
+rhodesia r/dEZ@
+rhodesia r]dEZ@
+rhodhiss rodh6s
+rhody rOd/
+rhoe rO
+rhome rOm
+rhonda rond@
+rhone rOn
+rhubarb rUb)rb
+rhue rU
+rhum rum
+rhump rump
+rhym rIm
+rhymes rImz
+rhyner rInP
+rhythm riD}
+rhythmic riDmik
+rhythms riD}z
+rialto r/{lt]
+ribas rEb@s
+ribbed ribd
+ribbon rib~
+ribbons rib~z
+ribs ribz
+ricci rECE
+ricciardelli riCE)rdelE
+rice rIs
+riceboro rIsbP]
+riceboro rIsbV]
+riceville rIsvil
+rich riC
+richard riCPd
+richards riCPdz
+richardson riCPds~
+richardson's riCPds~z
+richardsons riCPds~z
+richardton riCPdt~
+richboro riCbP]
+richboro riCbV]
+riches riC6z
+richey riC/
+richeyville riC/vil
+richfield riCfEld
+richford riCfPd
+richgrove riCgrOv
+richie riC/
+richland riCland
+richlands riClandz
+richlands riSl~dz
+richman riCm~
+richmond riCm~d
+richness riCn6s
+richrdson riCPds@n
+richstone riCstOn
+richton riCt~
+richvale riCvAl
+richview riCvyU
+richville riCvil
+richwoods riCwqdz
+rick rik
+ricketts rik6ts
+rickety rik6d/
+rickles rik@lz
+rico rEkO
+ridder ridP
+ride rId
+ridenour rId@n?r
+rideout rId?t
+rider rIdP
+riders rIdPz
+ridge rij
+ridgeaway rij@wA
+ridgecrest rijkrest
+ridged rijd
+ridgefield rijfEld
+ridgeland rijland
+ridgely rijl/
+ridgeville rijvil
+ridgeway rijwA
+ridgewood rijwqd
+ridicule rid6kyUl
+ridiculed rid6kyUld
+ridiculous r/diky6l@s
+riding rId6N
+ridings rItiNz
+ridler ridlP
+ridley ridl/
+riedel rItel
+riegel rEg@l
+riegelwood rEgLwqd
+riegelwood rEjLwqd
+riegelwood rIgLwqd
+rieley rIlE
+rielly rIlE
+ries rIz
+rieske rEeskE
+rieve rEv
+rif rif
+rifenbery rIf@nberE
+riffle rifL
+rifle rIfL
+rifleman rIfLm~
+rifling rIfl6N
+rigas rEg@s
+rigby rigb/
+riggles rig@lz
+righi rEjE
+right rIt
+righteous rIC6s
+righthouse rIth?s
+rightly rItl/
+rights rIts
+rigid rij6d
+rigidity r/jid6d/
+rigidly rij6dl/
+rigs rigz
+riina rEn@
+riippi rEpE
+riis rEs
+rijos rEhOs
+rile rIl
+riled rIld
+riles rIlz
+riley rIl/
+rileyville rIl/vil
+rill ril
+rim rim
+rimersburg rImPzbVg
+rimes rImz
+rimforest rimfP6st
+rimforest rimfor6st
+rin rin
+rincon riNkOn
+rinde rindE
+rinderknecht rindPnekt
+rindler rindlP
+rinebarger rInb)rjP
+rinebold rInbOld
+rinehardt rInh)rt
+rinehart rInh)rt
+rineheart rInh)rt
+ring riN
+ringbloom riNblUm
+ringeisen riNgEs@n
+ringelheim riNg@lhIm
+ringelspaugh riNg@lsp{
+ringer riNP
+ringgold riNgLd
+ringing riN6N
+ringing] riN6N
+ringland riNland
+ringleaders riNlEdPz
+ringley riNlE
+ringo riNg]
+ringoes riNg]z
+ringrose riNrOz
+rings riNz
+ringside riNsId
+ringtown riNt?n
+ringwood riNwqd
+ringworm riNwVm
+rink riNk
+rio rE]
+riojas rEOh)s
+riordan rirt6n
+rios rEOs
+riot rI6t
+rioux rU
+rioz rEOs
+rip rip
+ripe rIp
+ripening rIp~6N
+ripped ript
+ripper ripP
+rippetoe riptO
+riptide riptId
+risa rEs@
+risbeck rizbek
+rise rIz
+risen riz~
+rises rIz6z
+risewick rIswik
+rising rIz6N
+risinger rIsiNP
+risk risk
+riskless riskl6s
+rison rIz~
+rita rEd@
+ritchey riC/
+rite rIt
+rites rIts
+rittenhouse rit~h?s
+ritual riCwL
+rituals riCwLz
+rivalry rIvLr/
+riven rIv~
+rivendell riv~del
+river rivP
+riverbank rivPbaNk
+riverbend rivPbend
+riverboat rivPbOt
+riverdale rivPdAl
+riverfront rivPfrunt
+riverhead rivPhed
+riverlea rivPlE
+rivers rivPz
+riverside rivPsId
+riverton rivPt~
+rivervale rivPvAl
+riverview rivPvyU
+riverway rivPwA
+riverwoods rivPwqdz
+rives rIvz
+rivesville rIvzvil
+riviezzo rivEetzO
+rixeyville riks/vil
+rizo rEzO
+roachdale rOCdAl
+road rOd
+roadbent r{dbent
+roadblocks rOdbloks
+roadhouse rOdh?s
+roadhurst r{dhVst
+roadlane r{d&lAn
+roadmaster rOdmastP
+roadrailer rOdrAlP
+roads rOdz
+roadside rOdsId
+roadster rOdstP
+roadway rOdwA
+roadwork rOdwVk
+roam rOm
+roann r]an
+roanoke rOn@k
+roar r{r
+roaring r{r6N
+roasted rOst6d
+roaster rOstP
+roasts rOsts
+rob rob
+robart robPt
+robbed robd
+robberies robP/z
+robbie rob/
+robbins rob~z
+robed rObd
+robeline rOblIn
+roberge r)bPg
+roberson rObPs@n
+robert robPt
+roberta r@bVd@
+roberton r)bPt@n
+robertos rObertOz
+roberts robPts
+robertson r)bPts@n
+robes rObz
+robeson rob6s~
+robesonia r]bsOn/@
+robesonia rob6sOn/@
+robichard rObES)rd
+robichaux rOb6CO
+robicheau rObESO
+robin rob~
+robinault rObinO
+robinette r)b6net
+robinette rob6net
+robins rob~z
+robinson rob~s~
+robison rOb6s6n
+robles rOb@lz
+robots rObots
+robust r]bust
+robustness r]bustn6s
+robyn rob~
+roch rOk
+roche rOC
+roche rOS
+rochelle r@Sel
+rochenstire rOk@nstIr
+rochester roCestP
+rochester roCestP
+rochester's roCestPz
+rochesters roCestPz
+rochford r)kfPd
+rocho rOkO
+rock rok
+rock$$$-and-roll rok~rOl
+rock$$-and-roll rok~rOl
+rock$-and-roll rok~rOl
+rock-and-roll rok~rOl
+rockefellers rok6felPz
+rockets rok6ts
+rockholds rokhOldz
+rockhouse rokh?s
+rockhurst rokhVst
+rocking rok6N
+rockingham rok6N}
+rockingham rokiNham
+rocklake roklAk
+rockland rokland
+rockland rokl~d
+rockledge rokl6j
+rockledge roklcj
+rocklin rokl~
+rockmart rokm)rt
+rockmart rokmPt
+rockport rokp{rt
+rockrose rokr6s
+rocks roks
+rockvale rokvAl
+rockville rokvil
+rockwall rokw{l
+rockwell rokwel
+rockwood r)kwqd
+rockwood rokwqd
+rocky rok/
+rocquemore rOkm{r
+rod rod
+rodarte rOd)rtA
+roddenberry rod~ber/
+rode rOd
+rodebush rOdbqS
+rodeheaver rOdhEvP
+rodemoyer rOdm<P
+roden rOd~
+rodessa r@des@
+rodessa r]des@
+rodewald rOdw{ld
+rodgers rojPz
+rodney rodn/
+rodregez r)dregez
+rodriges r@drEgez
+rodrigeuz r)drEgez
+rodrigez r)drEg6z
+rodrigue r)drEgA
+rodriguez rodrEg6z
+rodriguez rodrEgcz
+rodriques r)drEk6s
+rodwell rodwel
+roebuck rObuk
+roebuck's rObuks
+roebucks rObuks
+roeske rOskE
+roettgen rOtg@n
+roffman r{fm~
+roger rojP
+roger's rojPz
+rogers rojPz
+rogne rOn
+rognstad r)nstad
+rohan rOhan
+rohnert rOnPt
+rojas rOh)s
+roland rOl6nd
+rolanda rOl)nd@
+role rOl
+roleplaying rol6plA6N
+roles rOlz
+rolfes rOlfs
+roll rOl
+rolla rol@
+rolled rOld
+roller rOlP
+rollercoaster rolPk6stP
+rolling rOl6N
+rollins rol~z
+rollinsford rol6nzfPd
+rollinsford rol~zfPd
+rollovers rOlOvPz
+rolls rOlz
+rolltop rOltop
+roma rOm@
+romain rOmAn
+roman rOm~
+romance r@mans
+romano r@mon]
+romans rOm6nz
+romanski r@mansk/
+romantic r]mant6k
+rombauer romb?P
+rome rOm
+romelus r)myUl@s
+romeo rOm/]
+romer rOmP
+romine rOmEn
+romulus romy6l@s
+romulus romy@l@s
+ron ron
+ron's ronz
+ronald ronLd
+ronda rond@
+rondo rond]
+ronnie ron/
+ronoke ron@k
+rons ronz
+roof rUf
+roofs rUfs
+rooftops rUftops
+rooftree rUftrE
+rookies rqk/z
+room rUm
+roomful rUmfL
+roommate rUmAt
+rooms rUmz
+roosevelt rOz@velt
+root rUt
+root rqt
+rootless rUtl6s
+roots rUts
+rootstown rUtst?n
+rootstown rqtst?n
+rope rOp
+ropers rOpPz
+ropes rOps
+ropesville rOpsvil
+roquemore rOkm{r
+rorabaugh rOr@b)
+rosa rOz@
+rosacker rOzakP
+rosaen rOs6n
+rosalee rOs@lE
+rosales rOz)l6s
+rosalie rOzL/
+rosamaria rOs@m@rE@
+rosann rOzan
+roscoe rosk]
+roscommon r@skom~
+roscommon roskom~
+rose rOz
+roseann rOzan
+roseanne rOzan
+roseau r@zO
+roseau r]zO
+rosebrook rOzbrqk
+rosebud rOzbud
+roseburg rOzbVg
+rosebush rOzbqS
+rosedale rOzdAl
+rosefield rOzfEld
+roseglen rOzglen
+roseland rOzland
+roselia rOzElE@
+roseline rOzlIn
+roselle r@zel
+rosemarie rOzm@rE
+rosemary rOzmer/
+rosemead rOzmEd
+rosemeyer rOzmIP
+rosemount rOzm?nt
+rosenbaum rOz~b{m
+rosendale rOz~dAl
+rosenfield rOz~fEld
+rosenhayn rOz~hAn
+rosenkranz rOz~kranz
+rosenthall rOz@nT)l
+rosenwald rOz~w{ld
+rosepine rOzpIn
+roses rOz6z
+rosete rOzetE
+roseth rOz6T
+rosetta r@zed@
+rosetta rOzet@
+rosette rOzet
+rosettes r@zets
+rosetti rOzetE
+rosettie rOzetE
+roseum rOzE@m
+roseville rOzvil
+rosewood rOzwqd
+rosharon r]Sar~
+rosharon roS@r~
+rosharon roSPon
+rosiclare rOz6klP
+rosie rOz/
+rosin r{z~
+roske r)skE
+roslindale rozl~dAl
+roslyn rosl~
+rosman rozm~
+ross r{s
+rossburg rosbPg
+rossburg r{sbVg
+rossdale rosdAl
+rossdale r{sdAl
+rosse r)sE
+rosser r{sP
+rossi ros/
+rossie ros/
+rossignol r)siny)l
+rossnagel r)snaj@l
+rosston rost~
+rosston r{st~
+rossville rosvil
+rossville r{svil
+roswell rozwel
+rosy rOz/
+roszales rOsales
+rot rot
+rota rOd@
+rotan rOd~
+rotation r]tAS~
+rothbury roTbP/
+rothbury r{Tber/
+rothermich r)TPmik
+rothfuss roTfus
+rothgeb r)Tgeb
+rothsay roTsA
+rothsay r{TsA
+rothschild r)TsCIld
+rothville r{Tvil
+rothweiler r)twIlP
+rottinghaus r)tiNh?s
+rottinghous r)tiNh?s
+rotunda r@tund@
+roubekas rUb@k@z
+rouge rUZ
+rough ruf
+roughen ruf~
+roughened ruf~d
+roughnecks rufneks
+roughrider r{rIdP
+rougier rUZEP
+rouillard rU6l)rd
+rouisse rUEs
+roulette rUlet
+roulette's rUlets
+roulettes rUlets
+roumeliotis rUm@lE)t6s
+round r?nd
+roundabout r?nd@b?t
+roundhead r?ndhed
+roundhouse r?ndh?s
+rounds r?ndz
+roundtree r?ndtrE
+roundup r?ndup
+rounkles r?nk@lz
+rourke r{rk
+rouse r?z
+roused r?zd
+rouses r?z6z
+route r?t
+route rUt
+routine rUtEn
+routinely rUtEnl/
+roux rO
+rove rOv
+rover rOvP
+row rO
+rowan rO~
+rowesville rOzvil
+rowland rOl@nd
+rowles rOlz
+rowlesburg rOwlzbVg
+rowlett r?l6t
+rowlette r?let
+rowlock rOlok
+rows rOz
+roxana rokson@
+roxane r)ksan
+roxann roksan
+roxanna roksan@
+roxberry roksber/
+roxborough roksbV]
+roxborough roksbur]
+roxbury roksbP/
+roxbury roksber/
+roxton rokst~
+roxy r)ksE
+roy r<
+royal r<L
+royal's r<Lz
+royals r<Lz
+royalton r<Lt~
+royalty r<Lt/
+royce r<s
+royce's r<s6z
+royces r<s6z
+rozeboom rOzbUm
+rozelle r@zel
+rpm )rpEem
+rubalcave rUb@lkAv
+rubbed rubd
+rubber rubP
+rubberized rubPIzd
+rubbish rub6S
+ruchti ruktE
+ruck ruk
+rude rUd
+rudiger rUd6jP
+rudolph rUd{lf
+rue rU
+rueben rUb6n
+ruebush rUbqS
+ruediger rUd@jP
+rueger rUgP
+ruesink rUsiNk
+ruffles rufLz
+ruffling rufl6N
+rug rug
+rugby rugb/
+ruggeri rUjArE
+ruggerio rUjArEO
+ruggiano rUjE)nO
+ruggieri rUjEArE
+ruggiero rUjEArO
+ruggles rug@ls
+rugs rugz
+ruhl rUl
+ruhr rV
+ruin rU~
+ruined rU~d
+ruins rU~z
+ruisi rUEsE
+rule rUl
+rulebook rUlbqk
+ruled rUld
+ruler rUlP
+rulers rUlPz
+rules rUlz
+ruling rUl6N
+rum rum
+ruma rUm@
+rumen rUm~
+rummaging rum6j6N
+rumors rUmPz
+rumours rUmPz
+run run
+runge runj
+runnells runelz
+runner runP
+runners runPz
+running run6N
+runs runz
+runt runt
+runway runwA
+runyon runy6n
+rupert rUpPt
+rural rUrL
+rush ruS
+rushed ruSt
+rushford ruSfPd
+rushing ruS6N
+rushmore ruSm{r
+rushville ruSvil
+rusich rUsik
+russ rus
+russell rusL
+russellton rusLt~
+russellville rusLvil
+russia ruS@
+russian ruS~
+russians ruS~z
+russiaville ruS@vil
+russo rUsO
+rust rust
+rustburg rustbPg
+rustburg rustbVg
+rustin rust~
+rustle rusL
+ruston rust~
+rustproofing rustprUf6N
+rusty rust/
+rutan rUd~
+rutana rUt)n@
+rutgers rutgPz
+ruth rUT
+rutha rUT@
+ruthann rUTan
+ruthanne rUTan
+ruthe rUT
+rutheford ruD6fPd
+rutherford ruDPfPd
+ruthie rUTE
+ruthlessness rUTl6sn6s
+ruths rUTs
+ruthton rUTt~
+rutiaga rUtE)g@
+ruys rUEz
+ruyz rUEz
+ruzich rUzik
+ryan rI~
+rydal rIdL
+ryder rIdP
+ryderwood rIdPwqd
+rye rI
+ryen rI6n
+ryerson rIPs~
+ryles rIlz
+ryll rIl
+rymes rImz
+rys rIs
+s es
+s es
+s s
+saa s)
+sabados sab@dOz
+sabagh s@b)
+sabah s)b@
+sabah sab@
+sabbagh sab)
+sabin sab~
+sabinal sab6nL
+sabine sAbIn
+sabinsville sab~zvil
+sables sAb@lz
+sabor sAbP
+sabotage sab@toZ
+sabotaged sab@toZd
+sac sak
+sacha s)S@
+sachleben sak@lben
+sachs saks
+sackcloth sakkl{T
+sackful sakfL
+sacks saks
+sacramento sakr@ment]
+sacramento's sakr@ment]z
+sacramentos sakr@ment]z
+sacre sakr@
+sacred sAkr6d
+sacrifice sakr6fIs
+sacrificed sakr6fIst
+sacrificial sakr6fiSL
+sad sad
+saddle sadL
+saddlebags sadLbagz
+saddlecloth sadLkl{T
+saddler sadLP
+sadhu sadU
+sadist sAd6st
+sadness sadn6s
+sadsbury sadzbP/
+sadsbury sadzber/
+sadye sAdE
+saegertown sAgPt?n
+saegertown sEjPt?n
+saenphimmacha sanfim@k@
+saenz sanz
+safar saf)r
+safari s@for/
+safe sAf
+safeco s@fek]
+safeguards sAfg)rdz
+safekeeping sAfkEp6N
+safely sAfl/
+safer sAfP
+safest sAf6st
+safety sAft/
+safeway sAfwA
+safford saffPd
+saffron safr~
+sag sag
+saga sog@
+sage sAj
+sagebrush sAjbruS
+sagehorn sAjh{rn
+sagen sAg@n
+sagendorf sAg@ndOrf
+sages sAj6z
+sagging sag6N
+saginaw sag6n{
+saginaw saj6n{
+sagittarius saj6t,r/@s
+sagraves sagrAvz
+sagucio s@gUCEO
+sahagan sah@g~
+sahagian s@hAgE@n
+sahuarita s@hw)r6t@
+sahuarita s@hyU@rEd@
+sahuhara sahy6hor@
+said sed
+saida sAd@
+saide sAdE
+sail sAl
+sailboat sAlbOt
+sailcloth sAlkl{T
+sailed sAld
+sailfish sAlfiS
+sailing sAl6N
+sailors sAlPz
+saint sAnt
+saint_johns sAntjonz
+saint_lucie sAntlUs/
+sainthood sAnthqd
+saisa sAz@
+saison sAz@n
+sajwn sajwn
+sake sAk
+sakelaris sak@l)r6s
+sakiestewa sakEestU@
+sakshaug saksh{g
+salad sal6d
+salads sal6dz
+salamander sal@mandP
+salary sal@r/
+sale sAl
+saleh salA
+salem sAl}
+salem's sAl}z
+salemburg sAl@mbVg
+salemburg sAl}bVg
+salems sAl}z
+salerno s@lVn]
+salerno s@lern]
+sales sAlz
+salesclerk sAlzklVk
+salesgirl sAlzgVl
+salesmen sAlzm~
+salespeople sAlzpEpL
+salesperson sAlzpVs~
+salesroom sAlzrUm
+saleswoman sAlzwqm~
+saleswomen sAlzwim~
+salford s{lfPd
+salinas s@lEn@s
+salinas s@lEn@z
+salineville sAlEnvil
+salisberry salizberE
+salisbury s{lzb@r/
+saliva s@lIv@
+salk s{k
+sallee salE
+sallied sal/d
+sallies salEz
+sallisaw sal/s{
+sallisaw sal6s{
+sally sal/
+salman salm~
+salmen sam@n
+salmon sam~
+salmons sam6nz
+salmonsen sam@ns6n
+salmonson sam@ns@n
+salois salO6s
+salome sal@mA
+salomon sal@m~
+saloum salUm
+salt s{lt
+saltbox s{ltboks
+salted s{lt6d
+saltillo s{ltil]
+saltine s{ltEn
+saltmarsh s{ltmPS
+saltville s{ltvil
+salty s{lt/
+saluda salUd@
+salutation saly6tAS~
+salvation salvAS~
+salvisa salvEs@
+salvisa salvis@
+salyersville sAl/Pzvil
+salzburg saltsbVg
+sam sam
+samantha s@manT@
+samarkand s)mPk)nt
+samarkand s@m)rk~d
+samarkand samPkand
+same sAm
+samide s@mEd@
+sammamish sam@m6S
+samone sam~
+samoyoa samOyO@
+sampan sampan
+sample sampL
+samplers samplPz
+samples sampLz
+sampling sampl6N
+samsonite sams@nIt
+samuel samyUL
+samuels samyULz
+samuelsen samyULs~
+samuelson samyUls@n
+san san
+san_antonio sanantOn/]
+san_diego sand/Ag]
+san_jose sanh]zA
+san_juan sanhwon
+san_marino sanm@rEn]
+san_mateo sanm@tA]
+sanbornton sanbPnt~
+sanbornton sanb{rnt~
+sanctuary saNkCUer/
+sanctum saNkt}
+sand sand
+sandals sandLz
+sandalwood sandLwqd
+sandate sand)tE
+sandbagged sandbagd
+sandbar sandb)r
+sandberg sandbVg
+sandblast sandbl6st
+sandee sandE
+sanderland sandPland
+sandfly sandflI
+sandles sand@lz
+sandmeyer sandmIP
+sandner sandnP
+sandpaper sandpApP
+sandpit sandpit
+sandpoint sandp<nt
+sandra sandr@
+sandridge sandrij
+sands sandz
+sandstone sandstOn
+sandwich sandw6C
+sandwiches sandw6C6z
+sandy sand/
+sandyfield sand/fEld
+sandyville sand/vil
+saneness sAnn6s
+sanfilippo sanf6lEpO
+sanford sanfPd
+sang saN
+sanghez saNgez
+sangi sanjE
+sanibel san6bel
+sanibel san@bL
+sanibel san@bl
+saniger sanigP
+sanilac san6lak
+sanitariums san6t,r/}z
+sanjose sanhOzA
+sank saNk
+sanmiguel sanm6gel
+sannes sanz
+sannicolas sanEl@s
+sansom sans}
+santa sant@
+santa_ana sant@an@
+santa_clara sant@klar@
+santacroce sant@krOCE
+santacruz sant@krUz
+santamaria sant@m@rE@
+santamarina sant@m@rEn@
+santana santan@
+santangelo santanj6lO
+santas sant@z
+santee sant/
+santee santE
+santiago s)ntE)gO
+santore sant{rE
+santoro sant{r]
+saperstein sapPstIn
+sapless sapl6s
+sapphire safIr
+sapulpa s@pulp@
+sapwood sapwqd
+sara sar@
+sarah sar@
+saraland s,r@land
+saraland sar@land
+sarandon s@rand~
+sarasota sar@sOd@
+sarasota sar@sOt@
+saratoga sar@tOg@
+saratov s@r)t@v
+sarcasm s)rkaz}
+sarcophagus s)rkof@g@s
+sarcoxie s)rkoks/
+sardine s)rdEn
+sardinis s)rd~6s
+sardis s)rd6s
+sarepta s)rept@
+sarepta s@rept@
+sargeant s)rj6nt
+sargent sorj~t
+sarjeant s)rj6nt
+sarles s)rlz
+sartell s)rtel
+sasakwa s@sakw@
+sash saS
+sasser sasP
+sastre sastrA
+sat sat
+satanta s@tant@
+satchel saCL
+satellite sad6lIt
+satellites sad6lIts
+sathre saTr@
+satiago s)tE)gO
+satire satIr
+satirical s@tEr6kL
+satisfaction sad6sfakS~
+satisfactorily sad6sfakt@r6l/
+satisfactory sad6sfakt@r/
+satisfied sad6sfId
+satisfy sad6sfI
+satterwhite satPwIt
+saturated saC@rAd6d
+saturating saC@rAd6N
+saturday sadPdA
+saturday satPd/
+saturday satPdA
+saturdays sadPdAz
+sauce s{s
+sauceman s)sm@n
+saucier s{s/P
+sauer s?P
+sauerkraut s?Pkr?t
+sauers s?Pz
+sauerwein s?PwIn
+saugatuck s{g@d6k
+saugatuck s{g@tuk
+sauget s{j6t
+saugus s{g@s
+sauk s{k
+saukville s{kvil
+sault sU
+sault s{lt
+saunas s{n@z
+saunter s{ntP
+sausage s{s6j
+sausalita s{s@lEd@
+sausalito s{s@lEd]
+sausalito s{s@lEt]
+sause s?s
+sauteed s{tEd
+savage sav6j
+savagely sav6jl/
+savageness sav6jn6s
+savages sav6j6z
+savanna s@van@
+savannah s@van@
+savannas s@van@z
+save sAv
+saved sAvd
+savely sAvlE
+savers sAvPz
+saves sAvz
+saving sAv6N
+savings sAv6Nz
+savoie sav<
+savonburg sAv~bVg
+saw s{
+sawdust s{dust
+sawer s{P
+sawhorse s{h{rs
+sawmill s{mil
+sawpit s{pit
+saws s{z
+sawyer s<P
+sawyer's s<Pz
+sawyers s<Pz
+sawyerville s<Pvil
+saxe saks
+saxon saks6n
+saxonburg saks~bVg
+saxophone saks@fOn
+say sA
+sayed sAed
+saying sA6N
+saylorsburg sAlPzbVg
+sayres sArz
+sayreville sAPvil
+says sez
+scaglione skaglEOnE
+scald sk{ld
+scalds sk{ldz
+scale skAl
+scales skAlz
+scalise sk@lEs
+scalloped skal@pt
+scalp skalp
+scalped skalpt
+scalps skalps
+scamp skamp
+scampered skampPd
+scan skan
+scandal skandL
+scandalized skand@lIzd
+scandalous skandL@s
+scandals skandLz
+scandinavians skand6nAv/~z
+scantlebury skant@lbArE
+scapegoats skApgOts
+scar sk)r
+scarborough sk)rbPO
+scarbrough sk)rbrO
+scarbrough sk)rbr]
+scarce skars
+scarcely sk,rsl/
+scarcer sk,rsP
+scare sk,r
+scarecrow sk,rkrO
+scared skard
+scares sk,rz
+scarf sk)rf
+scarfpin sk)rfpin
+scarier sk,r/P
+scarles sk)rlz
+scarpaci sk)rp)CE
+scarsdale sk)rzdAl
+scarville sk)rvil
+scathingly skAD6Nl/
+scatter skadP
+scattered skadPd
+scattergood skadPgqd
+scene sEn
+scenery sEnP/
+scenes sEnz
+scenic sEn6k
+scent sent
+sceptre septP
+schaaf S)f
+schaal S)l
+schaap S)p
+schaar S)r
+schabes SAbz
+schacher S)kP
+schaefer SAfP
+schaeffer SAfP
+schafer SAfP
+schaffer SAfP
+schaffhauser Safh?zP
+schalk S{k
+schar S)r
+schardt S)rd
+scharf S)rf
+scharte S)rtE
+schaufelberge S{f@lbPg
+schaumburg S{mbVg
+schech Sek
+schedule skejL
+schedule skejUL
+scheduled skejUld
+schedules skejUlz
+scheduling skejUl6N
+scheibe SIb
+scheide SId
+scheidegger SIt6gP
+scheller SelP
+schemes skEmz
+scheming skEm6N
+schenectady sk6nekt@d/
+schenz Sents
+scher SV
+scherer S@rP
+scherz SPtz
+schiefelbein SEf@lbAn
+schieler SIlP
+schiesher SESP
+schildknecht Sildnekt
+schiller SilP
+schindler SindLP
+schindler SindlP
+schirtzinger SPtziNP
+schizophrenia skits@frEn/@
+schlater SlAdP
+schlauch Sl{k
+schlegel SlAg@l
+schleicher SlICP
+schleswig Slesw6g
+schleuder SlUdP
+schlieper SlEpP
+schmaus Sm?s
+schmeichel SmIk@l
+schmid Smid
+schmidt Smit
+schmiesing SmEziN
+schnabl SnAb@l
+schnall Sn{l
+schneider SnItP
+schnieder SnItP
+schnieders SnIdPz
+schoch S)k
+schoenstein SOenstEn
+schoenthal SOenT{l
+schol skOl
+scholar skolP
+scholars skolPz
+scholarship skolPSip
+scholastic sk@last6k
+scholes SOlz
+scholls SOlz
+scholtes SOlts
+schoneman SOnm6n
+schons SOnz
+school skUl
+schoolboy skUlb<
+schoolchildren skUlCildr~
+schoolcraft skUlkraft
+schooler skUlP
+schooley skUlE
+schoolfield skUlfEld
+schoolgirl skUlgVl
+schoolhouse skUlh?s
+schoolman skUlm6n
+schoolmistress skUlmistr6s
+schoolroom skUlrUm
+schools skUlz
+schoolteaching skUltEC6N
+schoolwork skUlwVk
+schoolyard skUly)rd
+schooner skUnP
+schoreplum S{rplum
+schott S)t
+schowengerdt SO@ngPt
+schram Sram
+schramm Sram
+schranz Srantz
+schrauger Sr{gP
+schreiber SrIbP
+schreiner SrInP
+schreuder SrUdP
+schriefer SrIfP
+schuchat SUCat
+schuemann SUm@n
+schueneman SU@nm@n
+schuetze SwetzE
+schulte SultE
+schultes Sqltz
+schulze SultsE
+schum Sum
+schumacher SUm)kP
+schumachor SUmAkP
+schumacker SUmAkP
+schuman SUm~
+schuneman SUnm@n
+schuster SUstP
+schuyler skIlP
+schwab Sw)b
+schwager SwAgP
+schwart Sw{rt
+schwarting Sw{rtiN
+schwartz Sw{rts
+schwarz Sw{rtz
+schwegel Sweg@l
+schweigert SwIgPt
+schwein SvIn
+schweitz SwIts
+schweitzer SwItzP
+schwend Swend
+schwenneker Swen@kP
+schwerdtfeger SwPdfEgP
+schwertfeger SwPtfEgP
+schwiebert SwEbPt
+schwieger SwIgP
+schwier SwEr
+schwieterman SwItPman
+schwipps Swips
+schwizer SwItzP
+schy skE
+sciacchitano skEakit)nO
+scialpi skEalpE
+science sI~s
+scientific sI~tif6k
+scientifically sI~tif6kl/
+scientist sI~t6st
+scientists sI~t6sts
+scimitar sim6t)r
+sciotti skE)tE
+scipio sip/]
+scipione sipEOnE
+scism Siz@m
+sclerosis skl@rOs6s
+scobey skOb/
+scolding skOld6N
+scolds skOldz
+scoles skOlz
+scone skOn
+scooba skUb@
+scoop skUp
+scoopful skUpfL
+scoot skUt
+scoots skUts
+scope skOp
+scorch sk{rC
+scorched sk{rCt
+scorcher sk{rCP
+score sk{r
+scoreboards sk{rb{rdz
+scorebook sk{rbqk
+scored sk{rd
+scorepad sk{r6p6d
+scores sk{rz
+scorned sk{rnd
+scornfully sk{rnfL/
+scorns sk{rnz
+scot sk)t
+scotchgard skoCgPd
+scotland skotl~d
+scotland's skotl~dz
+scotlands skotl~dz
+scots skots
+scott skot
+scottsbluff skotsbl@f
+scottsboro skotsbP]
+scottsboro skotsbV]
+scottsdale skotsdAl
+scottsmoor skotsmUr
+scottsmoor skotsmqr
+scotty skod/
+scour sk?P
+scouring sk?P6N
+scours sk?Pz
+scout's sk?ts
+scouted sk?d6d
+scouthood sk?thqd
+scouting sk?d6N
+scouts sk?ts
+scowl sk?l
+scowled sk?ld
+scram skram
+scrapbook skrapbqk
+scraped skrApt
+scrapes skrAps
+scraping skrAp6N
+scraps skraps
+scratch skraC
+scratches skraC6z
+scrawler skr{lP
+scrawny skr{n/
+scream skrEm
+screamed skrEmd
+screams skrEmz
+screeched skrECt
+screeching skrEC6N
+screen skrEn
+screenplay skrEnplA
+screens skrEnz
+screenwriter skrEnrIdP
+screw skrU
+screwdriver skrUdrIvP
+scribner's skribnPz
+scribners skribnPz
+scripps skrips
+script skript
+scripts skripts
+scriptural skripCPL
+scriptwriters skriptrIdPz
+scrivener skrivnP
+scroggins skrog6nz
+scroll skrOl
+scrolls skrOlz
+scrubbed skrubd
+scrubwoman skrubwqm~
+scruff skruf
+scrumptious skrumpS@s
+scuba skUb@
+scullawl skul{l
+scully skul/
+sculpt skulpt
+sculpted skulpt6d
+sculptor skulptP
+sculptors skulptPz
+sculpts skulpts
+sculptural skulpCPL
+sculpture skulpCP
+sculptured skulpCPd
+sculptures skulpCPz
+sdoia sd<y@
+se sE
+sea sE
+seabird sEbVd
+seaborn sEb{rn
+seaborne sEb{rn
+seabreeze sEbrEz
+seabrook sEbrqk
+seacaucus s6k{k@s
+seacaucus sEk{k@s
+seadrift sEdrift
+seafarer sEfarP
+seafarers sEfarPz
+seafood sEfUd
+seaford sEfPd
+seafowl sEf?l
+seagram's sEgr}z
+seagrams sEgr}z
+seagraves sEgrAvs
+seagroves sEgrOvz
+seagull sEgul
+seagull's sEgulz
+seagulls sEgulz
+seahawk sEh{k
+seahawks sEh{ks
+seal sEl
+seals sElz
+sealskin sElskin
+seam sEm
+seamster sEmstP
+seamstress sEmstr6s
+seamstresses sEmstr6s6z
+sean S{n
+seapower sEp?P
+sear sEr
+search sVC
+searched sVCt
+searching sVC6N
+searchlight sVClIt
+searcy sErs/
+searingtown sEr6Nt?n
+searingtown sEriNt?n
+searle sVl
+searles sPlz
+sears sErz
+searsboro sErzbP]
+searsboro sErzbV]
+searsmont sErzmont
+searsport sErzp{rt
+seas sEz
+seascape sEskAp
+seashell sESel
+seashore sES{r
+seaside sEsId
+season sEz~
+seasonal sEz~L
+seasonally sEz~6l/
+seasoned sEz~d
+seasoning sEz~6N
+seasonings sEz~6Nz
+seat sEt
+seatack sEtak
+seated sEd6d
+seating sEd6N
+seatonville sEd~vil
+seats sEts
+seattle sEadL
+seattle's sEadLz
+seattles sEadLz
+seaward sEwPd
+seaweeds sEwEdz
+seawolf sEwqlf
+seawolf's sEwqlfs
+seawolfs sEwqlfs
+seaworthy sEwVD/
+seawright sErIt
+sebasco s6bask]
+sebasco s@bask]
+sebastian s6basC~
+sebastopol s6bast@pL
+sebastopol s@bast@pol
+sebeniecher seb@nIkP
+sebewaing sEb@wAN
+sebree sebrE
+sebring sEbriN
+sechrist sEkr6st
+seckletstewa sek@lstUw@
+secluded s6klUd6d
+seclusion s6klUZ~
+second sek~d
+secondary sek~der/
+seconded sek~d6d
+secondly sek~dl/
+seconds sek~dz
+secour s6k{r
+secour sEkP
+secour sEk{r
+secret sEkr6t
+secretarial sekr6t,r/L
+secretaries sekr6t,r/z
+secretary sekr6ter/
+secretly sEkr6tl/
+secrets sEkr6ts
+section sekS~
+sections sekS~z
+sector sektP
+secularist seky6lP6st
+secure s6kyUr
+secured s6kyUrd
+secures s6kyUrz
+securities s6kyUr6d/z
+security s6kyqr6t/
+sedan s6dan
+sedative sed@d6v
+sedem sed@m
+sedimentary sed6ment@r/
+sedro sedr]
+seduced s6dUst
+see sE
+seed sEd
+seeds sEdz
+seeger sEgP
+seegers sEgPz
+seeing sE6N
+seek sEk
+seeker sEkP
+seekers sEkPz
+seeking sEk6N
+seeley sEl/
+seelyville sEl/vil
+seem sEm
+seemed sEmd
+seems sEmz
+seen sEn
+seesawing sEs{6N
+seething sED6N
+segal s6g)l
+segelhorst sEg@lhOrst
+seger sEgP
+seger sEjP
+segerman sEgPm@n
+segers sEgPz
+segment segm~t
+segmentation segm~tAS~
+segmented segm~t6d
+segraves segrAvz
+segundo s6gund]
+sehnert senPt
+seidl sId6l
+seidler sEdlP
+seiling sAl6N
+seismic sIzm6k
+seized sEzd
+seizure sEZP
+seizures sEZPz
+selby selb/
+selbyville selb/vil
+selden seld~
+seldom seld}
+select s@lekt
+selected s6lekt6d
+selecting s6lekt6N
+selection s6lekS~
+selective s6lekt6v
+selectively s6lekt6vl/
+selectman s6lektm~
+selesnick selznik
+self self
+self's selfs
+selfishly self6Sl/
+selfishness self6Sn6s
+selflessly selfl6sl/
+selfridge selfrij
+selfs selfs
+selinsgrove sel6nzgrOv
+selinsgrove sel~zgrOv
+selkirk selkVk
+sell sel
+seller selP
+sellersburg selPzbVg
+sellouts sel?ts
+selma selm@
+selmer selmP
+sema sEm@
+semarang s@m)r)N
+semarang sem@raN
+semester s6mestP
+semesters s6mestPz
+semi sem/
+semicircular sem/sVky6lP
+semiconductor sem/k~duktP
+seminar sem6n)r
+seminaries sem6n,r/z
+seminars sem6n)rz
+seminole sem6nOl
+senate sen6t
+senatobia sen@tOb/@
+senatore sen@t{rA
+send send
+sender sendP
+sending send6N
+senecaville sen6k@vil
+senecaville sen@k@vil
+senechal sen@k@l
+sengvilay seNvilA
+senile sEnIl
+senior sEnyP
+seniority sEny{r6d/
+seniors sEnyPz
+senn sen
+senoia s@n<@
+senoia sen<@
+sensation sensAS~
+sense sens
+senseman sensm@n
+sensibly sens6bl/
+sensitive sens6d6v
+sensor sensP
+sensory sens@r/
+sensual senSwL
+sensualism senSw@liz}
+sent sent
+sentence sent~s
+sentences sent~s6z
+sentencing sent~s6N
+sentiment sent6m~t
+sentimental sent6mentL
+sentinel sent~L
+separate sepr6t
+separated sep@rAd6d
+separately sepr6tl/
+separation sep@rAS~
+september s@ptembP
+september scptembP
+september's s@ptembPz
+septembers s@ptembPz
+sepulveda sepqlv@t@
+sepvlieda sepvlEd@
+sequined sekwEnd
+sequoia sekw<@
+sere sEr
+serge sVj
+sergeant s)rj6nt
+serial sEr/L
+series sEr/z
+serious sEr/@s
+seriously sEr/@sl/
+sermon sVm~
+serpent's sVp~ts
+serpents sVp~ts
+serpico serpEkO
+servant sVv~t
+servants sVv~ts
+serve sVv
+served sVvd
+servers sVvPz
+serves sVvz
+service sVv6s
+services sVv6s6z
+serving sVv6N
+sesame ses@m/
+session seS@n
+sessions seS~z
+set set
+setauket s@t{k6t
+seth seT
+seth's seTs
+seths seTs
+setler setlP
+sets sets
+setting sed6N
+settings set6Nz
+settle sedL
+settling sedL6N
+setup setup
+setups sedups
+seuss sUs
+seven 1x3M
+sevenfold sev~fOld
+sevens sev~z
+seventeen 1x3M2Y|
+seventeenth 1x3M2Y|G
+seventh 1x3MG
+sevenths sev~Ts
+seventies sev~d/z
+seventieth 1x3MQ[(G
+seventy 1x3M2[
+seventy 1x3M[
+seventy's sev~d/z
+seventys sev~d/z
+sever sevP
+several sevrL
+severe s6vEr
+severed sevPd
+severity s6var6d/
+severn sevPn
+severs sevPz
+severson sevPs~
+severyn sevP6n
+sevierville sEv/Pvil
+sevigny sevinyE
+sevin sev~
+sew sO
+sewall's sULz
+sewalls sULz
+sewanee s@won/
+sewanee sUAnE
+sewaren s@w)r~
+sewaren sU@r~
+seweall sEwel
+sewed sOd
+sewers sOPz
+sewickley s@wikl/
+sewing sO6N
+sexual sekSUL
+seymore sEm{r
+seymour sEm{r
+sh S
+sha S)
+shabbily SabL/
+shabbiness Sab/n6s
+shabby Sab/
+shack Sak
+shackelford SakLfPd
+shackled SakLd
+shackleford Sak@lf{rd
+shackles SakLz
+shackleton Sak@lt6n
+shacks Saks
+shade SAd
+shadeland SAdland
+shades SAdz
+shadle SAt@l
+shadow Sad]
+shadows Sad]z
+shadowy Sad]/
+shady SAd/
+shae SA
+shaft Saft
+shafter SaftP
+shafts Safts
+shag Sag
+shaggy Sag/
+shah So
+shah's Soz
+shahs Soz
+shake SAk
+shaked S)k6d
+shakedown SAkd?n
+shakelike SAklIk
+shaken SAk~
+shaker SAkP
+shakers SAkPz
+shakespear SAkspEr
+shakespeare SAkspEr
+shakespeare's SAksp/rz
+shakespeares SAksp/rz
+shakeups SAkups
+shakia S@kE@
+shaky SAk/
+shall Sal
+shallotte Sal6t
+shallow Sal]
+shallowater Sal]AtP
+shallowater Sal]w{dP
+shallowater Sal]w{tP
+shallowness Sal]n6s
+shalon S@l)n
+shambaugh Samb{
+shame SAm
+shameful SAmfL
+shamika SamEk@
+shamir SamEr
+shampoo SampU
+shampooed SampUd
+shampoos SampUz
+shan't Sant
+shandon Sandon
+shane SAn
+shanel S@nel
+shanghai SaNhI
+shanika Sanik@
+shankland SaNkland
+shankles SaNk@lz
+shanley Sanl/
+shannon San~
+shannonhouse San@nh?s
+shanon San6n
+shant Sant
+shantae S)ntA
+shante S)ntA
+shantel Santel
+shape SAp
+shaped SApt
+shapelessly SApl6sl/
+shapelessness SApl6sn6s
+shapes SAps
+shapleigh SaplE
+share S,r
+sharecrop S,rkrop
+sharecropper S,rkropP
+sharecroppers S,rkropPz
+shared Sard
+sharee SArE
+shareholders S,rhOldPz
+shareholding S,rhOld6N
+shares S,rz
+shari Sor/
+sharika SArik@
+sharkskin S)rkskin
+sharma S)rm@
+sharon Sar~
+sharonville Sar~vil
+sharp S)rp
+sharpe S)rp
+sharpeville S)rpvil
+sharply S)rpl/
+sharpness S)rpn6s
+sharps S)rps
+sharpshooter S)rpSUdP
+sharpsville S)rpsvil
+sharyl SAr@l
+sharyn SAr@n
+shaske SaskE
+shasta Sast@
+shattered SadPd
+shaughnessy S{n6sE
+shave SAv
+shaven SAv~
+shavers SAvPz
+shaves SAvz
+shaving SAv6N
+shavings SAv6Nz
+shavon S@v)n
+shaw's S{z
+shawanee S@w)n/
+shawanee SowAnE
+shawano S@w)n]
+shawano S@won]
+shawe S{
+shawls S{lz
+shawn S{n
+shawnee S{n/
+shawneetown S{n/t?n
+shaws S{z
+she SE
+she'd SEd
+she's SEz
+shea SA
+shead SEd
+sheakleyville SEkl/vil
+sheath SET
+sheathed SEDd
+sheba SEb@
+sheboygan S6b<g~
+sheckles Sek@ls
+shed SEd
+shed Sed
+sheep SEp
+sheepdog SEpd{g
+sheepishly SEp6Sl/
+sheeps SEps
+sheepskin SEpskin
+sheepswool SEpswUl
+sheer SEr
+sheerness SErn6s
+sheet SEt
+sheeting SEd6N
+sheets SEts
+sheffield Sef/Ld
+sheidler SEdlP
+sheik SEk
+sheila SEl@
+sheilah SEl@
+shel Sel
+shelburn SelbVn
+shelbyville Selb/vil
+sheldahl Seldol
+sheldon Seld~
+shell Sel
+shelley Sel/
+shellfish SelfiS
+shelly Sel/
+shelter SeltP
+shelters SeltPz
+shelves Selvz
+shemika Semik@
+sheneman Senm@n
+shenika Senik@
+shenzhen SenZ~
+shenzhen Senz~
+shepardson SepPds~
+shephard SepPd
+shepheard SepPd
+shepherd SepPd
+shepperd SepPd
+shepton Sept~
+sherbet SVb6t
+sherborn SVb{rn
+sherborn SVb~
+sherborne SVb{rn
+sherburne SVbPn
+sheri Ser/
+sheridan Sar6d~
+sherie SArE
+sheriff Sar@f
+sherika SArik@
+sherise S@rEz
+sherlock SVlok
+sherman SVm~
+sherman's SVm~z
+shermans SVm~z
+sherrer SVP
+sherrock Ser)k
+sherrodsville SArodzvil
+sherry Ser/
+sherryl SarL
+sherwood SPwqd
+sherwood's SVwqdz
+sherwoods SVwqdz
+shery SArE
+sheryl SAr6l
+sheryll SAr6l
+shes SEz
+shettleroe Set@lrO
+shibles Sib@lz
+shickley Sikl/
+shidler SIdLP
+shiela SEl@
+shield SEld
+shielded SEld6d
+shielding SEld6N
+shields SEldz
+shift Sift
+shifted Sift6d
+shigeta Siget@
+shikles Sik@lz
+shillington SiliNt~
+shiloh SIlO
+shimmered SimPd
+shimmering SimP6N
+shimmers SimPz
+shimonoseki S6mOn]sek/
+shimonoseki S6mon@sek/
+shimonoseki Sim@n]sek/
+shin Sin
+shine SIn
+shingledecker SiNg@ldekP
+shingler SiNglP
+shingles SiNg@ls
+shingleton SiNg@lt6n
+shingletown SiNgLt?n
+shining SIn6N
+shinnston Sinst~
+shiny SIn/
+ship Sip
+ship Sip
+ship's Sips
+shipbuilder SipbildP
+shipbuilding Sipbild6N
+shipes SIps
+shipley Sipl/
+shiploads SiplOdz
+shipmate SipmAt
+shipped Sipt
+shippensburg Sip~zbVg
+shipping Sip6N
+ships Sips
+shipshape SipSAp
+shipwreck Siprek
+shipyard Sipy)rd
+shires SIrz
+shirin Sir6n
+shirley SVl/
+shirt SVt
+shirtmaker SVtmAkP
+shirtsleeve SVtslEv
+shit Sit
+shively SIvl/
+shivered SivPd
+shivering SivP6N
+shivers SivPz
+shives SIvz
+shoal SOl
+shoals SOlz
+shock Sok
+shocked Sokt
+shocking Sok6N
+shockingly Sok6Nl/
+shocks Soks
+shoe SU
+shoehorn SUh{rn
+shoelace SUlAs
+shoelaces SUlAs6z
+shoemake SUmAk
+shoemaker SUmAkP
+shoes SUz
+shoeshine SUSIn
+shoesource SUs{rs
+shoestring SUstriN
+shofestall SOfst{l
+shohola S@hOl@
+shohola S]hOl@
+sholes SOlz
+shone SOn
+shongaloo SoNg@lU
+shook Sqk
+shoot SUt
+shooting SUd6N
+shop Sop
+shopgirl SopgVl
+shopkeepers SopkEpPz
+shopping Sop6N
+shops Sops
+shore S{r
+shoreacres S{r6sPz
+shorebird S{rbVd
+shoreham S{rham
+shoreham S{rh}
+shoreline S{rlIn
+shores S{rz
+shoreview S{rvyU
+shorewood S{rwqd
+short S{rt
+shortage S{rd6j
+shortages S{rd6j6z
+shortcomings S{rtkum6Nz
+shorten S{rd~
+shortened S{rd~d
+shorter S{rdP
+shortest S{rt6st
+shortfall S{rtf{l
+shortgrass S{rtgras
+shorthair SOrthAr
+shorthaired S{rthard
+shorthand S{rthand
+shortly S{rtl/
+shortridge S{rtrij
+shorts S{rts
+shortstop S{rtstop
+shortsville S{rtsvil
+shoshana SOS)n@
+shoshone SoS~
+shot Sot
+shotguns Sotgunz
+shots Sots
+should Sqd
+shoulder SOldP
+shouldering SOldP6N
+shoulders SOldPz
+shouldn't Sqd~t
+shouldnt Sqd~t
+shoun SUn
+shouted S?d6d
+shouting S?d6N
+shove Suv
+shoved Suvd
+shovel SuvL
+shoveled SuvLd
+shovelful SuvLfL
+shoveling Suv6l6N
+shovels SuvLz
+shoves Suvz
+shoving Suv6N
+show SO
+showbirds SObVdz
+showboat's SObOts
+showboats SObOts
+showcase SOkAs
+showcases SOkAs6z
+showdown SOd?n
+showed SOd
+shower S?P
+showered S?Pd
+showering S?P6N
+showers S?Pz
+showgirl SOgVl
+showiest SO/6st
+showing SO6N
+showings SO6Nz
+showman SOm~
+shown SOn
+showpiece SOpEs
+showrooms SOrUmz
+shows SOz
+showtime's SOtImz
+showtimes SOtImz
+shrapnel SrapnL
+shredded Sred6d
+shreds Sredz
+shren Sren
+shreveport SrEvp{rt
+shreves SrEvz
+shrewdness SrUdn6s
+shrieked SrEkt
+shrill Sril
+shrimplin Srimplin
+shrine SrIn
+shrinkage SriNk6j
+shriver SrIvP
+shroer SrOP
+shrub Srub
+shrubs Srubz
+shrug Srug
+shrugged Srugd
+shrugs Srugz
+shrunk SruNk
+shucks Suks
+shuddering SudP6N
+shuecraft SUkraft
+shueyville SU/vil
+shuffle SufL
+shufflebarger Suf@lb)rjP
+shuffleburg Suf@lbPg
+shufflers SuflPz
+shugart SUgPt
+shullsburg SulzbPg
+shullsburg SulzbVg
+shultz Sults
+shuman SUm~
+shumway SumwA
+shupe SUp
+shuqualak S6kw{lak
+shuqualak S@kwAlak
+shuster SUstP
+shut Sut
+shutdowns Sutd?nz
+shutesbury SUtsbP/
+shutesbury SUtsber/
+shutter SudP
+shuttle SudL
+shuttleworth Sut@lwPT
+shwab Sw)b
+shy SI
+shying SI6N
+siamese sI@mEz
+siberia sIbEr/@
+siberian sIbEr/~
+sibgert sibgPt
+sibley sibl/
+siblings sibl6Nz
+sicily sis6l/
+sicily sisL/
+sick sik
+sickendick sik@ndik
+sickmeir s6kmIr
+sickness sikn6s
+sickroom sikrUm
+sid sid
+siddiqui sid6kE
+siddiqui sid6kwU
+side sId
+sidebottom sIdb)t@m
+sidekick sIdkik
+sideline sIdlIn
+sidelinger sIdliNP
+sideman sIdm@n
+sides sIdz
+sidesaddle sIdsadL
+sideshow sIdSO
+sidestep sIdstep
+sideswipe sIdswIp
+sidetracked sIdtrakt
+sidewalks sIdw{ks
+sideways sIdwAz
+sidewinder sIdwIndP
+sidles sIt@lz
+sidney sidn/
+sieben sEb~
+siege sEj
+siegel sEgL
+sieger sEgP
+siegfried sEgfr/d
+sieja sEj@
+siena sEen@
+sienkiewicz siNk@witz
+sierra s/ar@
+sieve siv
+sifre sifr@
+sigel sEg@l
+sigelman sEg@lm6n
+sigh sI
+sighed sId
+sighing sI6N
+sight sIt
+sighted sId6d
+sights sIts
+sightseers sItsEPz
+sigmund sigm~d
+sign sIn
+signaigo sinyAgO
+signal signL
+signaled signLd
+signalled signLd
+signals signLz
+signe signE
+signed sInd
+signet sign6t
+significance signif6k~s
+significant signif6k~t
+significantly signif6k~tl/
+signings sIn6Nz
+signorile siny{rEl
+signposts sInpOsts
+signs sInz
+sigourney sigPn/
+sikeston sIkst~
+sikeston sik6st~
+silas sEl6s
+silberman silbPm~
+silbernagel silbPnAg@l
+silence sIl~s
+silencer sIl~sP
+silent sIl~t
+silerio s6lerEO
+siles sIlz
+siletz sil6ts
+siletz silcts
+silevinac silv@nak
+silhouette silUwet
+silicon sil6k~
+siliezar silEz)r
+silk silk
+silkscreen silkskrEn
+silkworms silkwVmz
+silky silk/
+sill sil
+sills silz
+silly sil/
+siloam sil}
+silsbee silzbE
+siluria s6lUr/@
+siluria s6lqr/@
+silva silv@
+silver silvP
+silverdale silvPdAl
+silverdome silvPdOm
+silverlake silvPlAk
+silvernail silvPnAl
+silvers silvPz
+silverstein silvPstEn
+silverstone silvPstOn
+silverware silvPw,r
+silverwood silvPwqd
+silvestre silvestrA
+silvestri sLvestr/
+simar sEm)r
+simi sEm/
+similar sim6lP
+simino sim6nO
+simla siml@
+simmer simP
+simmering sim@riN
+simmesport simzp{rt
+simmonds sim~dz
+simms simz
+simoens sIm@nz
+simon sIm~
+simonds sim@ndz
+simone simOn
+simoneau sIm@nO
+simoneaux sIm@nO
+simoneavd sIm@nEvd
+simonett sIm@net
+simonetta sIm@net@
+simonne s6mOn
+simons sIm~z
+simonsen sIm@ns6n
+simonson sIm@ns@n
+simonton sIm@nt6n
+simple simpL
+simpler simplP
+simplest simpl6st
+simplifies simpl6fIz
+simply simpl/
+simpson simps~
+simpson's simps~z
+simpsons simps~z
+simsboro simzbP]
+simsboro simzbV]
+simulated simy6lAd6d
+simulation simy6lAS~
+sin sin
+sinatra s6notr@
+sinbad sinb6d
+since sins
+sincere sinsEr
+sincerity s~sar6d/
+sinclair siNkl,r
+sind sInd
+sind sind
+sinewy sinU/
+sing siN
+singapore siN@p{r
+singaporean siNg@p{r/~
+singelton siNg@lt6n
+singer siNP
+singer's siNPz
+singerman siNPm@n
+singers siNPz
+singewald siNw)ld
+singing siN6N
+single siNgL
+singletary siNg@ltArE
+singleterry siNg6lterE
+singleton siNgLt~
+singular siNgy6lP
+sink siNk
+sinkhorn siNkh{rn
+sinking siNk6N
+sinks siNks
+sinuous sinyU@s
+sinus sIn@s
+siobhan S@b)n
+sioux sU
+sip sip
+sipes sIps
+siphoned sIf~d
+sir sV
+siren sIr~
+sirens sIr~z
+sirignano sEriny)nO
+sirles sPlz
+sisemore sIzm{r
+sisley sisl/
+sister sistP
+sisters sistPz
+sit sit
+site sIt
+sites sIts
+sitting sid6N
+sittre sitr@
+situated siCUAd6d
+situation siCUAS~
+situations siCUAS~z
+sivaram siv@ram
+sivas sEv@z
+sivas siv@z
+six 1.\1
+sixon siks@n
+sixpence sikspens
+sixteen 1.\12Y|
+sixteenth 1.\12Y|G
+sixth 1.\1G
+sixth siksT
+sixties sikst/z
+sixtieth 1.\12[(G
+sixty 1.\12[
+size sIz
+sized sIzd
+sizemore sIzm{r
+sizes sIz6z
+sizzled sizLd
+sizzler sizlP
+skadden skad~
+skagen skAg@n
+skaggs skagz
+skaneateles skan/atl@s
+skaneateles skan6telz
+skateboarding skAtb{rd6N
+skating skAd6N
+skellytown skel/t?n
+skeptic skept6k
+sketchbooks skeCbqks
+sketched skeCt
+sketchy skeC/
+skewers skyUPz
+ski skE
+skidmore skidm{r
+skies skIz
+skiffs skifs
+skiing skE6N
+skiles skIlz
+skill skil
+skills skilz
+skimehorn skImhOrn
+skimmed skimd
+skimpier skimp/P
+skin skin
+skinhead skinhed
+skinless skinl6s
+skip skip
+skipjack skipjak
+skipworth skipwVT
+skirmish skVm6S
+skirmishing skVm6S6N
+skirt skVt
+skirts skVts
+skrabanek skrab@nek
+skroch skr)k
+skulls skulz
+skunks skuNks
+skweres skwErz
+sky skI
+skycap skIkap
+skydive skIdIv
+skye skI
+skyers skIPz
+skyes skIz
+skyforest skIfor6st
+skyforest skIf{r6st
+skyhawk skIh{k
+skylark skIl)rk
+skyrocket skIrok6t
+skyrocketing skIrok6d6N
+skyscrapers skIskrApPz
+skytook skItqk
+skytop skItop
+skywriter skIrIdP
+slab slab
+slagle slAg@l
+slam slam
+slammed slamd
+slang slaN
+slant slant
+slanted slant6d
+slapped slapt
+slash slaS
+slashed slaSt
+slate slAt
+slater slAdP
+slather slADP
+slaugenhaupt sl{g@nh)pt
+slaughenhoupt sl{enhUpt
+slaughtered sl{dPd
+slaughterhouse sl{dPh?s
+slavery slAvP/
+sledge slej
+sleek slEk
+sleep slEp
+sleepily slEpL/
+sleeping slEp6N
+sleepless slEpl6s
+sleepwalking slEpw{k6N
+sleepwear slEpw,r
+sleepy slEp/
+sleepyhead slEp/hed
+sleeved slEvd
+sleeveless slEvl6s
+sleigh slA
+slepski slepskE
+slept slept
+slice slIs
+slices slIs6z
+slid slid
+slide slId
+slidell sl6del
+slides slIdz
+sliding slId6N
+slight slIt
+slightly slItl/
+slimy slIm/
+slingland sliNland
+slink sliNk
+slip slip
+slipcover slipkuvP
+slipknot slipnot
+slippage slip6j
+slipped slipt
+slipping slip6N
+slips slips
+slither sliDP
+slocombe slOk@m
+slocum slOk@m
+slone slOn
+slope slOp
+slopes slOps
+sloppy slop/
+slosek slOsek
+slot slot
+slotemaker slOtmAkP
+slothful sl{TfL
+sloughhouse sl?h?s
+sloughhouse slufh?s
+slovak slOvak
+slow slO
+slowed slOd
+slower slOP
+slowly slOl/
+slowpoke slOp@k
+sludge sluj
+slug slug
+slugging slug6N
+sluggishness slug6Sn6s
+sluicing slUs6N
+slums slumz
+slurp slVp
+slush sluS
+sly slI
+slyly slIl/
+smackover smakOvP
+smalarz smalPts
+small sm{l
+smaller sm{lP
+smalley smal/
+smalltalk smalt6k
+smallwood sm{lwqd
+smart sm)rt
+smartly sm)rtl/
+smartville sm)rtvil
+smash smaS
+smashed smaSt
+smashing smaS6N
+smatter smadP
+smear smEr
+smedes smEdEz
+smell smel
+smelled smeld
+smelling smel6N
+smells smelz
+smelt smelt
+smethport smeTp{rt
+smicksburg smiksbVg
+smietana smEt)n@
+smigel smEg@l
+smile smIl
+smiled smIld
+smiles smIlz
+smiley smIl/
+smiling smIl6N
+smirking smVk6N
+smith smiT
+smithbridge smiTbrij
+smithburg smiTbVg
+smithdale smiTdAl
+smithe smiT
+smithheart smiTh)rt
+smithland smiTland
+smithmill smiTmil
+smiths smiTs
+smithsburg smiTsbPg
+smithsburg smiTsbVg
+smithson smiTs~
+smithson's smiTs~z
+smithsonian sm@TsOn/~
+smithsons smiTs~z
+smithtown smiTt?n
+smoaks smOks
+smog smog
+smoke smOk
+smoked smOkt
+smokers smOkPz
+smokes smOks
+smokescreen smOkskrEn
+smokestack smOkstak
+smoketown smOkt?n
+smoking smOk6N
+smoky smOk/
+smooth smUD
+smoothed smUDd
+smoother smUDP
+smoothest smUD6st
+smoothing smUD6N
+smoothly smUDl/
+smoothness smUDn6s
+smothering smuDP6N
+smothers smuDPz
+smoulder smOldP
+sms esemes
+smucker smukP
+smudge smuj
+smuggled smugLd
+smuggling smugl6N
+smurf smVf
+smurthwaite smPTwAt
+smyrna smVn@
+smyth smiT
+snacks snaks
+snail's snAlz
+snails snAlz
+snake snAk
+snakelike snAklIk
+snakes snAks
+snapdragon snapdr@g~
+snapdragons snapdr@g~z
+snaples snap@lz
+snapped snapt
+snapper snapP
+snapping snap6N
+snapshot snapSot
+snare sn,r
+snares sn,rz
+snarled sn)rld
+snatched snaCt
+snavely snAvlE
+sneak snEk
+sneaking snEk6N
+snearly snErlE
+snedeker snEd@kP
+sneed snEd
+sneedville snEdvil
+sneer snEr
+sneeze snEz
+sneezed snEzd
+snelling snel6N
+snickering snikP6N
+snickers snikPz
+snip snip
+snipe snIp
+sniped snIpt
+snipes snIps
+snipped snipt
+snitch sniC
+snob snob
+snodgrass sn)dgras
+snoop snUp
+snoozing snUz6N
+snoqualmie sn@kw{lm/
+snoring sn{r6N
+snorted sn{rd6d
+snow snO
+snowbirds snObVdz
+snowbound snOb?nd
+snowdeal snOdEl
+snowden snOt6n
+snowdon snOd@n
+snowdrift snOdrift
+snowdrop snOdrop
+snowed snOd
+snowfall snOf{l
+snowfield snOfEld
+snowflake snOflAk
+snowmobile snOm]bEl
+snowpeas snOpEz
+snowplow snOpl?
+snowshoe snOSU
+snowville snOvil
+snowy snO/
+snuffbox snufboks
+snuggle snugL
+snyder snIdP
+so sO
+soak sOk
+soaked sOkt
+soaking sOk6N
+soap sOp
+soapbox sOpboks
+soapes sOps
+soapstone sOpstOn
+soapstones sOpstOnz
+soapsuds sOps6dz
+soaring s{r6N
+sobel sOb@l
+sobenes sObEnz
+sober sObP
+soberanes sOb@ranz
+sobrante s@brontA
+sobrante s]brantA
+soccer sokP
+sociable sOS@bL
+social sOSL
+socialized sOS@lIzd
+societal s@sI6dL
+societies s@sI6d/z
+society s@sI6d/
+sociological s@sI@loj6kL
+sociology sOs/ol@j/
+sock sok
+sockets sok6ts
+socks soks
+sodaville sOd@vil
+sodawasser sOd@w)sP
+soddy sod/
+sodergren sOdPgr6n
+sodium sOd/}
+soechting sOktiN
+soesbe sOzbE
+sofa sOf@
+sofas sOf@z
+sofia sOf/@
+sofia s]fE@
+sofiya s@fEy@
+sofiya s]fE@
+sofiya s{f/@
+soft s{ft
+softball s{ftb{l
+softdrink s{ftdr6Nk
+softener s{f~P
+softly s{ftl/
+softness s{ftn6s
+software s{ftw,r
+software's s{ftw,rz
+softwares s{ftw,rz
+soggy sog/
+soho sOh]
+soil s<l
+soil's s<lz
+soiled s<ld
+soils s<lz
+sokoto s@kOd]
+sokoto sOk@t]
+solange sOlanj
+solar sOlP
+solarz sOl@rz
+solazar sOlaz)r
+sold sOld
+soldering sodP6N
+soldier sOljP
+soldiering sOljP6N
+soldiers sOljPz
+soldotna sLdotn@
+sole sOl
+solebury sOlbP/
+solebury sOlber/
+soledad sOlAtad
+solely sOl/
+soles sOlz
+solesbee sOlzbE
+solicitors s@lis6dPz
+solicits s@lis6ts
+solid sol6d
+solidified s@lid6fId
+solien sOlEn
+solies sOlEz
+solitary sol6ter/
+sollitto sOlEtO
+soloist sOl]6st
+solomon sol@m~
+solomons s)l@m@nz
+solonar sOl@n)r
+solsberry sOlzber/
+solsberry solzber/
+solstice sOlst6s
+solution s@lUS~
+solutions s@lUS~z
+solve solv
+solved solvd
+solves solvz
+some sum
+somebody sumbud/
+somebody'll sumbud/L
+somebodyll sumbud/L
+someday sumdA
+somehow sumh?
+someone sumwun
+someone's sumwunz
+someones sumwunz
+someplace sumplAs
+somerdale sumPdAl
+somerfield sumPfeld
+somers sumPz
+somersaults sumPs{lts
+somerset sumPsct
+somerset sumPset
+somersworth sumPzwVT
+somervell sumPvel
+somervell sumrvel
+somerville sumPvil
+something sumT6N
+something] sumT6N
+sometime sumtIm
+sometimes sumtImz
+somewhat sumwut
+somewhere sumw,r
+somis sOm6s
+sommerville sumPvil
+somonauk som@n{k
+somonauk som~ok
+son sun
+sonar sOn)r
+sonderegger sOndregP
+sondles s)nd@lz
+song s{N
+songbird s{NbVd
+songer s)NP
+songs s{Nz
+songwriter s{NrIdP
+songwriters s{NrIdPz
+songwriting s{NrId6N
+sonia sOn/@
+sonia sOny@
+sonia sony@
+sonic son6k
+sonja sOny@
+sonneborn s)nb{rn
+sonny sunE
+sonoma s@nOm@
+sontheimer s)nthImP
+sony sOn/
+sonya sony@
+soo sU
+soon sUn
+sooners sUnPz
+soothe sUD
+soothed sUDd
+soothes sUDz
+soothing sUD6N
+soothingly sUD6Nl/
+soothsayer sUTsAP
+sooy sUE
+sopchoppy sopC@p/
+soperton sOpPt~
+sophia sOfE@
+sophie sOf/
+sophie sOfE
+sophisticated s@fist6kAd6d
+sophistication s@fist6kAS~
+sophomores sOf]m{rz
+soppeland s)pl@nd
+sorceress s{rsP6s
+sorcery s{rsP/
+sordid s{rd6d
+sorenson sOr@ns@n
+soricelli s{r@CelE
+sorority s@r{r6d/
+sorrell s{rel
+sorrells s{relz
+sorrento s@rent]
+sorrow sor]
+sorrowful sor]fL
+sorry sor/
+sort s{rt
+sorts s{rts
+sosbe sOzbE
+sosebee sOs@bE
+sostre s)str@
+sotlar s)tlP
+soto sOd]
+soto sOt]
+sought s{t
+soul sOl
+soule sUl
+soules sUlz
+soulful sOlfL
+soulliere sUlEAr
+souls sOlz
+sound s?nd
+sounded s?nd6d
+sounding s?nd6N
+soundproof s?ndprUf
+sounds s?ndz
+soundtrack s?ndtrak
+soundview s?ndvyU
+soup sUp
+soups sUps
+soupspoon sUpspUn
+sour s?P
+source s{rs
+sources s{rs6z
+sourdough s?PdO
+souring s?P6N
+sousa sUs@
+south s?T
+south s?T
+south_carolina s?Tkar@lIn@
+south_dakota s?Td@kOt@
+southampton s?Tampt~
+southaven s?TAv~
+southbound s?Tb?nd
+southbury s?TbP/
+southdown s?Td?n
+southeast s?TEst
+southeastern s?TEstPn
+southeasterner s?TEstPnP
+southerland suDPland
+southern suDPn
+southfield s?TfEld
+southgate s?TgAt
+southington s?TiNt~
+southington suT6Nt~
+southland s?Tland
+southmayd s?TmAd
+southmont s?Tmont
+southpaw s?Tp{
+southport s?Tp{rt
+southside s?TsId
+southwest s?Twest
+southwest's s?Twests
+southwestern s?TwestPn
+southwests s?Twests
+southwick s?Twik
+southworth s?TwVT
+souvannakhily sUvan@kilE
+souvannavong sUvan@v{N
+souvenir sUv6nEr
+souvenirs sUv6nErz
+souza sUz@
+sovereign s)vP6n
+soviet's sOv/6ts
+soviets sOv/6ts
+sowell s?L
+sowell sO@l
+soweto s@wAt]
+soweto s@wEt]
+sowle sOl
+soy s<
+soybean s<bEn
+soybeans s<bEnz
+soysauce s<s{s
+spa spo
+space spAs
+spacecraft spAskraft
+spacecraft's spAskrafts
+spacecrafts spAskrafts
+spaced spAst
+spacelink spAsliNk
+spacenet spAsnet
+spaces spAs6z
+spaceships spAsSips
+spacesuit spAssUt
+spacing spAs6N
+spade spAd
+spadeful spAdfL
+spades spAdz
+spadework spAdwVk
+spading spAd6N
+spagnola spanyOl@
+spain spAn
+spakes spAks
+spalding sp{ld6N
+spanger spaNP
+spangle spaNgL
+spangler spaNglP
+spaniards spanyPdz
+spanicek span@Cek
+spaniel spany@l
+spanish span6S
+spanishburg span6SbVg
+spank spaNk
+spanned spand
+spano spanO
+spare sp,r
+sparerib sp,rrib
+spark sp)rk
+sparked sp)rkt
+sparkill sp)rk6l
+sparkill sp)rkil
+sparkill sporkil
+sparkled sp)rkLd
+sparkling sp)rkl6N
+sparkplug sp)rkpl6g
+sparks sp)rks
+sparky sp)rk/
+sparland sp)rland
+sparland sp)rl~d
+sparling sp)rl6N
+sparta sp)rd@
+sparta sp)rd@
+sparta sp)rt@
+spartanburg sp)rd~bVg
+spasm spaz}
+spasms spaz}z
+spatial spASL
+spattered spadPd
+spaulding sp{ld6N
+spawn sp{n
+spawners sp{nPz
+spawning sp{n6N
+speak spEk
+speaker spEkP
+speaking spEk6N
+speaks spEks
+speares spErz
+spearfish spErfiS
+spearhead spErhed
+spearsville spErzvil
+spearville spErvil
+special speSL
+speciale speSE)lE
+specialist speSL6st
+specialists speSL6sts
+speciality speS/al6d/
+specialization speSL6zAS~
+specializes speS@lIz6z
+specially speSL/
+specials speSLz
+specialty speSLt/
+species spES/z
+specific sp6sif6k
+specifications spes6f6kAS~z
+specimens spes6m~z
+spectacular spektaky6lP
+spectacularly spektaky6lPl/
+spectator spektAdP
+spectators spektAdPz
+spectral spektrL
+spectrum spektr}
+speculated speky6lAd6d
+speculation speky6lAS~
+speculations speky6lAS~z
+speculator speky@lAtP
+speech spEC
+speechless spECl6s
+speechwriter spECrIdP
+speed spEd
+speedboats spEdbOts
+speeding spEd6N
+speedometer sp6dom6dP
+speedy spEd/
+speers spErz
+speigel spEg@l
+spell spel
+spellbound spelb?nd
+spelling spel6N
+spelman spelm~
+spence spens
+spencer spensP
+spencertown spensPt?n
+spencerville spensPvil
+spend spend
+spending spend6N
+spendthrift spendTrift
+spent spent
+speonk spEoNk
+sperry sper/
+speziale spezE)lE
+sphere sfEr
+spherical sfar6kL
+spice spIs
+spicer spIsP
+spices spIs6z
+spicewood spIswqd
+spicier spIs/P
+spider spIdP
+spiegel spEg@l
+spiegelman spEg@lm@n
+spielmaker spElmAkP
+spielvogel spElvOg@l
+spies spIz
+spigelman spEg@lm6n
+spigelmyer spEg@lmIP
+spike spIk
+spil_lanestreet spilAn&strEt
+spill spil
+spilled spild
+spillman spilm~
+spills spilz
+spin spin
+spinach spin6C
+spinal spInL
+spinar spin)r
+spincic spinCik
+spindale spindAl
+spindler spindLP
+spinner spinP
+spinning spin6N
+spinoff spin{f
+spins spinz
+spirally spIr6l/
+spirals spIrLz
+spirit spEr6t
+spirited spEr6d6d
+spirits spEr6ts
+spiritual spEriCwL
+spiritualism spEriCw@liz}
+spirituality spEriCUalid/
+spiritually spEriCU6l/
+spiritwood spEr6twqd
+spiritwood spir6twqd
+spiro spIr]
+spiro spir]
+spirounias spErUnE@s
+spit spit
+spiteful spItfL
+spitler spitlP
+splashdown splaSd?n
+splashed splaSt
+splatt splat
+spleen splEn
+splendid splend6d
+splendidly splend6dl/
+splendor splendP
+splett splet
+splicing splIs6N
+splinter splintP
+splinters splintPz
+splints splints
+split split
+splotch sploC
+splurge splVj
+splurged splVjd
+spoiled sp<ld
+spoils sp<lz
+spoilsport sp<lsp{rt
+spoilt sp<lt
+spokane spOkan
+spokane sp]kAn
+spoke spOk
+spoken spOk~
+spokes spOks
+spokesman spOksm~
+spokeswoman spOkswqm~
+sponged spunjd
+sponges spunj6z
+sponsored sponsPd
+sponsoring sponsP6N
+sponsors sponsPz
+sponsorship sponsPSip
+sponsorships sponsPSips
+spontaneous spontAn/@s
+spontaneously spontAn/@sl/
+spooked spUkt
+spool spUl
+spoon spUn
+spoonbill spUnbil
+spoonemore spUnmOr
+spooner spUnP
+sport sp{rt
+sported sp{rd6d
+sporting sp{rd6N
+sports sp{rts
+sportscaster sp{rtskastP
+sportsclub sp{rtsklub
+sportsman sp{rtsm@n
+sportsmanship sp{rtsm~Sip
+sportsmen sp{rtsm~
+sportswear sp{rtsw,r
+sportswriter sp{rtsrIdP
+spot spot
+spots spots
+spotted spod6d
+spotting spod6N
+spouse sp?s
+spouted sp?d6d
+sprague sprAg
+spraguer sprAgP
+spragueville sprAgvil
+sprain sprAn
+sprained sprAnd
+sprang spraN
+spratt sprat
+sprawls spr{lz
+spray sprA
+sprayberry sprAber/
+spread spred
+spreading spred6N
+spreadsheets spredSEts
+spree sprE
+sprengelmeyer spreNg@lmIr
+sprenger spreNP
+sprewell sprUw@l
+sprig sprig
+sprigg sprig
+spriggs sprigz
+spring spriN
+springboard spriNb{rd
+springborn spriNb{rn
+springboro spriNbP]
+springboro spriNbV]
+springbrook spriNbrqk
+springcreek spriNkrEk
+springdale spriNdAl
+springe spriN
+springer spriNP
+springfield spriNfEld
+springs spriNz
+springside spriNsId
+springstead spriNsted
+springsteen spriNgstEn
+springtail spriNtAl
+springtide spriNtId
+springtown spriNt?n
+springvale spriNvAl
+springville spriNvil
+sprinkled spriNkLd
+sprinkler spriNklP
+sprinkles spriNk@lz
+sprinkling spriNkl6N
+sprint sprint
+sprite sprIt
+sproles sprOlz
+sprott spr)t
+sproul sprUl
+sprout spr?t
+sprouted spr?d6d
+sprouting spr?d6N
+sprung spruN
+sprunger spruNP
+spun spun
+spur spV
+spurgeon spPj6n
+spurious spyUr/@s
+spurs spVz
+sputniks sputn6ks
+sputtered spudPd
+sputters spudPz
+spyglass spIgl6s
+spyies spIEz
+squab skwob
+squabble skwobL
+squad skwod
+squair skwAr
+squandered skwondPd
+square skw,r
+squared skward
+squares skw,rz
+squaw skw?
+squeaked skwEkt
+squeals skwElz
+squeamishness skwEm6Sn6s
+squeeze skwEz
+squeezed skwEzd
+squeo skEO
+squiers skwIPz
+squinting skwint6N
+squires skwIPz
+squirmish skwVm6S
+squirrel skwVrL
+squirreled skwVrLd
+squirrels skwVrLz
+squirts skwVts
+squish skwiS
+sri srE
+sridhar sridh)r
+srinivas sriniv@z
+sriram srEram
+srnsky sPnskE
+stab stab
+stability st@bil6d/
+stable stAbL
+stableford stAb@lfPd
+stables stAbLz
+stacee stAsE
+stach st)k
+stachowiak stakOwEak
+staci stAsE
+stack stak
+stacked stakt
+stackpole stakpOl
+stacy stAs/
+stadium stAd/}
+stadler stAdLP
+stadler stadlP
+staff staf
+stag stag
+stage stAj
+stagecoach stAjkOC
+stagecraft stAjkraft
+stagehand stAjhand
+stagehands stAjhandz
+stageman stAjm6n
+stages stAj6z
+staggered stagPd
+stagles stag@lz
+stagner stagnP
+stahlstown st)lzt?n
+stahlstown stolzt?n
+staiger stAgP
+stain stAn
+stainmaster stAnmastP
+staircase st,rkAs
+staircases st,rkAs6z
+stairs st,rz
+stairwell st,rwel
+stake stAk
+stakeout stAk?t
+staker stAkP
+stakes stAks
+stakkeland stakl@nd
+stale stAl
+stalemated stAlmAd6d
+staley stAlE
+stalk st{k
+stalked st{kt
+stalker st{kP
+stall st{l
+stalled st{ld
+stallings st{l6Nz
+stallone st@lOn
+stalls st{lz
+stallworth st{lwVT
+stamford stamfPd
+stamm stam
+stamped stampt
+stampede stampEd
+stamps stamps
+stan stan
+stanberry stanber/
+stanchfield stanCfEld
+stand stand
+standaert stand)rt
+standard standPd
+standardized standPdIzd
+standardizing standPdIz6N
+standards standPdz
+standby standbI
+standing stand6N
+standish stand6S
+standoff stand{f
+standpoint standp<nt
+stands standz
+standstill standstil
+staneart stanPt
+stanesic stAnsik
+stanhope stanhOp
+stanislaw stan6sl{
+stankovic staNk@v6k
+stanley stanl/
+stansberry stanzber/
+stansfield stanzfEld
+stantonsburg stant~zbVg
+stantonville stant~vil
+stanville stanvil
+stanwood stanwqd
+stanzione stanzEOnE
+stapels stAp@lz
+stapelton stAp@lt@n
+staple stAp@l
+stapleford stAp@lf{rd
+staplehurst stApLhVst
+staplers stAplPz
+staples stAp@lz
+stapleton stAp@lt6n
+star st)r
+starbuck st)rbuk
+starbucks st)rbuks
+starched st)rCt
+starchlike st)rClIk
+stardom st)rd}
+stardust st)rdust
+stare st,r
+stared stard
+starfish st)rfiS
+starflower st)rfl?P
+stark st)rk
+starkville st)rkvil
+stars st)rz
+starstream st)rstrEm
+start st)rt
+started st)rd6d
+starting st)rd6N
+startled st)rdLd
+startling st)rdL6N
+starts st)rts
+startups st)rdups
+starweather st)rweDP
+stash staS
+stashlstown staSlzt?n
+stasia stAZ@
+state stAt
+statecraft stAtkraft
+statehouses stAth?z6z
+stately stAtl/
+statement stAtm~t
+statements stAtm~ts
+staten stat~
+states stAts
+statesboro stAtsbP]
+statesboro stAtsbV]
+statesmen stAtsm~
+station stAS~
+stationed stAS~d
+stations stAS~z
+statistic st@tist6k
+statistics st@tist6ks
+statler statlP
+staton stAd~
+statue staCU
+statues staCUz
+statuesque staCUesk
+statuettes staCUets
+status stAt@s
+status stat@s
+staudenmeier st{t@nmIr
+stavely stAvlE
+stavnes stavn@s
+stay stA
+stayed stAd
+stayer stAP
+staying stA6N
+stcharles sAntC)rlz
+stclair sAntklAr
+stclaire sAntklAr
+stcyr sAntsir
+stdenis sAntden6s
+stdenny sAntdenE
+steadfastly stedfastl/
+steadham sted@m
+steadily sted6l/
+steadman stedm6n
+steadman stedm~
+steady sted/
+steak stAk
+stealing stEl6N
+stealth stelT
+steam stEm
+steamboat stEmbOt
+steamboats stEmbOts
+steamily stEmL/
+steaming stEm6N
+steampipe stEmpIp
+steamrollered stEmrOlPd
+steamship stEmSip
+steamtown stEmt?n
+stedfastly stedf6stl/
+steed stEd
+steel stEl
+steelcase stElkAs
+steeleville stElvil
+steelworks stElwVks
+steely stEl/
+steenbergen stEnbPg6n
+steenhuis stEnhwEs
+steep stEp
+steeplechase stEpLCAs
+steeplechasing stEpLCAs6N
+steepness stEpn6s
+steer stEr
+steering stEr6N
+stefania stef)ny@
+stefanie stef6nE
+steffanie stef@nE
+stefl stef@l
+stegeman stEgm@n
+stegemann stEgm6n
+steger stEgP
+steggeman stegm@n
+steib stIb
+steiger stIgP
+steinbeck stInbek
+steinbrenner stInbrenP
+steinhart stInh)rt
+steiniger stIn6gP
+steinkirchner stInkPCnP
+steinkuehler stInkUlP
+stelling stel6N
+stelly stel/
+stemarie sAntm@rE
+stems stemz
+stench stenC
+stendeback stendbak
+stengel steNg@l
+stenography st6nogr@f/
+step step
+stepanie step@nE
+stepbrother stepbruDP
+stepchild stepCIld
+stepchildren stepCildr~
+stepdaughters stepd{dPz
+stepfatherly stepfADPl/
+steph stef
+stephani stef@nE
+stephania st@f)ny@
+stephanie stef~/
+stephanie's stef~/z
+stephanies stef~/z
+stephen stEv~
+stephens stEv6nz
+stephens stEv~z
+stephenson stEv6ns@n
+stephentown stEv~t?n
+stephenville stEv~vil
+stepladders stepladPz
+stepleton step@lt@n
+stepmother stepmuDP
+stepparent steppar~t
+stepping step6N
+steppingstone stepiNstOn
+steps steps
+stepsisters stepsistPz
+stepstool stepstUl
+stepstools stepstUlz
+stereo st,r/]
+stereophonic st@rE@fon6k
+sterilization star6l6zAS~
+sterling stVl6N
+sterlingheights stVliNhIts
+stern stVn
+stethoscope stET]skOp
+stetsonville stets~vil
+stettler stetlP
+steubenville stUb~vil
+steve stEv
+steven stEv~
+stevens stEv~z
+stevenson stEv~s~
+steverson stEvPs@n
+steves stEvz
+stevinson stEv~s~
+stevinson stev~s~
+stevison stev6s~
+stew stU
+steward stUPd
+stewardess stUPd6s
+stewardesses stUPd6s6z
+stewards stUPdz
+stewardship stUPdSip
+stewardson stUPts@n
+stewart stUPt
+stewart stUPt
+stewart's stUPts
+stewarts stUPts
+stewpot stUpot
+stfleur sAntfl@r
+stflorant sAntflOr@nt
+stford sAntfOrd
+stfort sAntfOrt
+stgelais sAntjelAs
+stgeorge sAntj{rj
+stgermain sAntjPmAn
+stgermaine sAntjPmAn
+sthill sAnthil
+stick stik
+stickball stikb{l
+stickney stikn/
+sticks stiks
+sticky stik/
+stiegemeier stEjmIP
+stien stIn
+stiff stif
+stiffen stif~
+stifflemire stif@lmIr
+stiffly stifl/
+stiffness stifn6s
+stiles stIlz
+stilesville stIlzvil
+still stil
+stillborn stilb{rn
+stillman stilm~
+stillmeadow stilmed]
+stillmore stilm{r
+stillwater stilw{dP
+stillwater stilw{tP
+stilwagen stilwag@n
+stimulant stimy6l~t
+stimulate stimy6lAt
+stimulates stimy6lAts
+stimulating stimy6lAd6N
+stimuli stimy6l/
+stinebuck stInbuk
+stinehelfer stInhelfP
+stinehour stIn?P
+stinespring stInspriN
+sting stiN
+stinging stiN6N
+stingley stiNlE
+stings stiNz
+stinkbugs stiNkbugz
+stinks stiNks
+stinnett stinet
+stipes stIps
+stipulated stipy6lAd6d
+stir stV
+stirewalt stIrw{lt
+stirred stVd
+stirrin stVr~
+stirring stV6N
+stirrings stV6Nz
+stirrup stVr@p
+stirrups stVr@ps
+stitch stiC
+stitely stItlE
+stjacques sAntjaks
+stjames s@yntjAmz
+stjean sAntjEn
+stjohn sAntj)n
+stjohns sAntj)ns
+stjulian sAntjUlE@n
+stjulien sAntjUlE6n
+stlaurent sAntl{r6nt
+stlouis sAntlU6s
+stlouise sAntlUwis
+stlucien sAntlUS@n
+stmartin sAntm)rt~
+stmary sAntmArE
+stmichel sAntmiSel
+stock stok
+stockade stokAd
+stockbreeder stokbrEdP
+stockbridge stokbrij
+stockbroker's stokbrOkPz
+stockbrokers stokbrOkPz
+stockdale stokdAl
+stockdales stokdAlz
+stockebrand st)kbrand
+stockham stokham
+stockholder stokhOldP
+stockholding stokhOld6N
+stockings stok6Nz
+stockless stokl6s
+stockpiling stokpIl6N
+stockroom stokrUm
+stocks stoks
+stocksdale stoksdAl
+stoddard stodPd
+stodomingo stOdOmiNgO
+stoett stOet
+stoey stOE
+stogner st)gnP
+stoicism stO6siz}
+stokely stOklE
+stoker stOkP
+stole stOl
+stolebarger stOlb)rjP
+stolen stOl~
+stolte stOlt
+stomach stum6k
+stomachs stum6ks
+stomp stomp
+stomped stompt
+stomping stomp6N
+stone stOn
+stoneback stOnbak
+stonebarger stOnb)rgP
+stoneberg stOnbVg
+stonebraker stOnbrAkP
+stoneburner stOnbPnP
+stonecipher stOnsIfP
+stonecipher ston6s6fP
+stonecutters stOnkudPz
+stonefield stOnfEld
+stonefort stOnfPt
+stonefort ston6fPt
+stoneham stOnham
+stonehenge stOnhenj
+stonehouse stOnh?s
+stoneking stOnkiN
+stoneman stOnm6n
+stoneridge ston@rij
+stonerock stOnrok
+stoneroller ston@rLP
+stones stOnz
+stonestreet ston6strEt
+stoneville stOnvil
+stonewall stOnw{l
+stonewalling stOnw{l6N
+stoneware stOnw,r
+stonich stOnik
+stony stOn/
+stonybrook stOn/brqk
+stonyford stOn/fPd
+stood stqd
+stooges stUj6z
+stool stUl
+stools stUlz
+stoop stUp
+stop stop
+stoplight stoplIt
+stoplights stoplIts
+stopped stopt
+stopping stop6N
+stopwatch stopwoC
+stopwatches stopwoC6z
+storage stOrij
+storden st{rd~
+store st{r
+stored st{rd
+storekeepers st{rkEpPz
+storer st{rP
+storeroom st{rrUm
+stores st{rz
+storey st{r/
+stories st{r/z
+storing st{r6N
+storm st{rm
+stormville st{rmvil
+story st{r/
+storyboard st{r/b{rd
+storybook st{r/bqk
+storybooks st{r/bqks
+storyline st{r/lIn
+storylines st{r/lInz
+storytelling st{r/tel6N
+storyville st{r/vil
+stouall stU@l
+stoudymire stUdEmIr
+stouffer stOfP
+stoughton stOt~
+stoughton st{d~
+stoutland st?tland
+stoutland st?tl~d
+stoutly st?tl/
+stovall stOv{l
+stowaway stO@wA
+stowing stO6N
+stoystown st<zt?n
+stpaul sAntp{l
+stpeter sAntpEtP
+stpierre sAntpEAr
+stpierrie sAntpyAr
+strachman strakm@n
+strachn str)kn
+stragglers straglPz
+straight strAt
+straightedge strAd6j
+straighten strAd~
+straightened strAd~d
+straightening strAd~n6N
+straightens strAd~z
+straightforward strAtf{rwPd
+strain strAn
+strained strAnd
+straitjacket strAtjak6t
+straitsville strAtsvil
+straley strAlE
+strand strand
+stranded strand6d
+strange strAnj
+strangely strAnjl/
+strangeness strAnjn6s
+stranger strAnjP
+strangers strAnjPz
+strangest strAnj6st
+stranglehold straNgLhOld
+strap strap
+straphanging straf~j6N
+strapped strapt
+straps straps
+strasburg str)sbPg
+strasburg strozbVg
+strategic str@tEj6k
+strategically str@tEj6kl/
+strathcona str@TkOn@
+strathcona straTkOn@
+stratton strad~
+stratton strat~
+stratus strAd@s
+straughan str)n
+straughn str)n
+straus str?s
+strause str?s
+strausner str?znP
+strauss str?s
+strausstown str?st?n
+strausz str?s
+straw str{
+strawberries str{b,r/z
+strawberry str{ber/
+strawbridge str{brij
+strawn str)n
+strawn str{n
+straws str{z
+stray strA
+streak strEk
+stream strEm
+streaming strEm6N
+streamlined strEmlInd
+streams strEmz
+streamwood strEmwqd
+streat strEt
+strech streC
+stred stred
+street strEt
+streetcar strEtk)r
+streets strEts
+streetsboro strEtsbV]
+streetwalker strEtw{kP
+streff stref
+strehl strel
+streicher strIkP
+streight strAt
+strem strem
+streng streN
+strength streNT
+strengthen streNT~
+strengthened streNT~d
+strengthener streNT~P
+strengthening streNT~6N
+strengths streNTs
+stressing stres6N
+stretch streC
+stretched streCt
+stretz stretz
+strewn strUn
+strictly striktl/
+strief strEf
+striegel strEg@l
+strieker strIkP
+strike strIk
+strikebound strIkb?nd
+strikebreakers strIkbrAkPz
+strikeouts strIk?ts
+striker strIkP
+strikers strIkPz
+striking strIk6N
+strikingly strIk6Nl/
+string striN
+stringent strinj~t
+stringer striNP
+stringfellow striNgf6l]
+strip strip
+stripe strIp
+striped strIpt
+stripped stript
+strippers stripPz
+strive strIv
+strnad stPnad
+strobl strOb@l
+strogen strOg@n
+stroh strO
+strohecker strOhekP
+stroke strOk
+stroker strOkP
+strokes strOks
+strolled strOld
+strolls strOlz
+strom str)m
+strome strOm
+stromsburg stromzbVg
+strong str{N
+strongbox str{Nboks
+stronger str{NgP
+stronghold str{NhOld
+stronghurst str{NhVst
+strongly str{Nl/
+strongpoint str{Np<nt
+strongroom str{NrUm
+strongstown str{Nzt?n
+strop str)p
+strother struDP
+strotz str)tz
+stroud str?d
+stroudsburg str?dzbVg
+stroup strUp
+strous strUs
+strowe strO
+struble strUbL
+struck struk
+structural strukCPL
+structurally strukCPL/
+structure strukCP
+structures strukCPz
+struggle strugL
+struggled strugLd
+struggling strugl6N
+struzzi strUtzE
+stsauveur sAnts)vyP
+stthomas sAntt)m6s
+stuart stUPt
+stubblefield stub@lfEld
+stubborn stubPn
+stubbornly stubPnl/
+stubbornness stubPnn6s
+stuck stuk
+stuckemeyer stukmIP
+stuckey stuk/
+stucky stuk/
+studded stud6d
+student stUd~t
+students stUd~ts
+studer stUdP
+studies stud/z
+studio stUd/]
+studios stUd/]z
+studler studlP
+studs studz
+study stud/
+studying stud/6N
+studyvance studEvans
+stueber stUbP
+stuff stuf
+stuffed stuft
+stuffing stuf6N
+stufflebeam stuf@lbEm
+stufflebean stuf@lbEn
+stumbled stumbLd
+stumping stump6N
+stumpings stump6Nz
+stumptown stumpt?n
+stung stuN
+stunned stund
+stunt stunt
+stupendous stUpend@s
+stupid stUp6d
+sturbridge stVbrij
+sturdiest stVd/6st
+sturdy stVd/
+sturgeon stVj~
+sturges stPj6s
+sturgis stVj6s
+sturgul stPj@l
+sturtevant stVd6v~t
+stutter] studP
+stutters studPz
+stuttgart Stqtg)rt
+stuttgart stqtg)rt
+stuttgart stutg)rt
+stuyahok stI@hok
+stvictor sAntviktP
+stweart stwPt
+sty stI
+style stIl
+styles stIlz
+stylish stIl6S
+stylist stIl6st
+stylistic stIlist6k
+stylize stIlIz
+stylized stIlIzd
+stys stIz
+suares sw)rez
+suarez sw)rez
+suave swov
+sub sub
+subarctic sub)rkt6k
+subaru sUbrU
+subcategory subkad6g{r/
+subcommittee subk@mid/
+subcommittees subk@mid/z
+subcontinent subkont~~t
+subcontracting subkontrakt6N
+subcultures subkulCPz
+subdivisions subd6viZ~z
+subdued s@bdUd
+subfreezing subfrEz6N
+subgroups subgrUps
+subha sUbh@
+subhuman subhyUm~
+subiaco sUbI@kO
+subiaco sub/ak]
+subject subj6kt
+subjective s@bjekt6v
+subjectivity subj6ktiv6d/
+subjects subj6kts
+subjoint subj<nt
+sublett subl6t
+sublime s6blIm
+subliminally s6blim~6l/
+submarginal submorj~L
+submarine subm@rEn
+submerge s@bmVj
+submersion s@bmVZ~
+submission s@bmiS~
+submit s@bmit
+subscribers s@bskrIbPz
+subscriptions s@bskripS~z
+subsequence subs6kw~s
+subsequent subs6kw~t
+subset subset
+subsides s@bsIdz
+subsidization subs6d6zAS~
+subsidy subs6d/
+subsistence s@bsist~s
+subsistent subs6st~t
+subspace subspAs
+substance subst~s
+substances subst~s6z
+substantial s@bstanSL
+substantially s@bstanS6l/
+substitutes subst6tUts
+substitutions subst6tUS~z
+subsystems subsist}z
+subtitle subtIdL
+subtitled subtIdLd
+subtitles subtIdLz
+subtraction s@btrakS~
+subtractional s@btrakS~L
+suburb subPb
+suburban s@bVb~
+suburbanites sUbVb@nIts
+suburbs subPbz
+subversion s@bvVZ~
+subway subwA
+subways subwAz
+subwoofer s@bwqfP
+succeed s6ksEd
+succeeded s6ksEd6d
+succeeding s6ksEd6N
+succeeds s6ksEdz
+success s6kses
+successful s6ksesfL
+successfully s6ksesfL/
+succession s6kseS~
+successors s6ksesPz
+sucgang sukgaN
+such suC
+sucharzewski sUkPzUskE
+sucking suk6N
+suckle sukL
+suckow suk?
+sucks suks
+sucre sUkr@
+sudan sUdan
+sudbury sudber/
+sudden sud~
+suddenly sud~l/
+suddenness sud~n6s
+sudlersville sUdLPzvil
+sueann sUan
+sueltenfuss swelt@nfus
+suero swArO
+sueur sUV
+suey sU/
+suffer sufP
+suffered sufPd
+sufferers sufPPz
+suffern sufPn
+suffers sufPz
+suffice s6fIs
+sufficiency s6fiS~s/
+sufficient s6fiS~t
+sufficiently s6fiS~tl/
+suffield suf/ld
+sugabo sUg@bU
+sugar SqgP
+sugarbush SqgPbqS
+sugarcane SqgPkAn
+sugarcreek SqgPkrEk
+sugarman SqgPm~
+suggest s@jest
+suggested s@jest6d
+suggestion s@jesC~
+suggestively s@jest6vl/
+suggests s@jests
+sughroue sUgrU
+sugiyama sUgE)m@
+suicidal sU6sIdL
+suicide sU6sId
+suisun sUs~
+suit sUt
+suitable sUd@bL
+suitably sUd@bl/
+suitcase sUtkAs
+suitcases sUtkAs6z
+suite swEt
+suited sUd6d
+suites swEts
+suits sUts
+suk sUk
+sulfur sulfP
+sulfuric sLfyUr6k
+sulipizio sUlipEtzEO
+sulk sulk
+sulked sulkt
+sulking sulk6N
+sullen sul~
+sullivan sul6v~
+sullivans sul6v~z
+sulphate sulfAt
+sulphur sulfP
+sum sum
+sumas sUm@z
+sumbry sumbrE
+sume sUm
+sumiton sUm6ton
+sumiton sUm6t~
+summary sumP/
+summer sumP
+summerall sumrL
+summerdale sumPdAl
+summerhill sumPhil
+summerside sumPsId
+summertime sumPtIm
+summerton sumPt@n
+summertown sumPt?n
+summerville sumPvil
+summit sum6t
+summitville sum6tvil
+summon sum~
+summonsed sum~zd
+sumption sumS@n
+sumptuous sumpCU@s
+sums sumz
+sumter sumtP
+sun sun
+sunbaked sunbAkt
+sunbathe sunbAD
+sunbeam's sunbEmz
+sunbeams sunbEmz
+sunbelt's sunbelts
+sunbelts sunbelts
+sunbright sunbrIt
+sunburg sunbPg
+sunburg sunbVg
+sunburn sunbVn
+sunburned sunbVnd
+sunburnt sunbVnt
+sunburst sunbVst
+sunbury sunber/
+suncoast sunkOst
+sundae sundA
+sunday sund/
+sunday sundA
+sundays sundAz
+sundial sundIL
+sundown sund?n
+sundsvall sundsv{l
+sundsvall sundzvol
+sunflower sunfl?P
+sung suN
+sunglass sunglas
+sunglasses sunglas6z
+sungroup sungrUp
+sunken suNk~
+sunland sunland
+sunlight sunlIt
+sunlit sunlit
+sunning sun6N
+sunny sun/
+sunnyside sun/sId
+sunnyvale sun/vAl
+sunproof sunprUf
+sunray sunrA
+sunrise sunrIz
+sunroom sunrUm
+suns sunz
+sunset sunset
+sunsets sunsets
+sunshine sunSIn
+sunshine's sunSInz
+sunshines sunSInz
+sunspots sunspots
+sunstroke sunstrOk
+suntan suntan
+sunworld's sunwVldz
+sunworlds sunwVldz
+super sUpP
+superb sUpVb
+superbly sUpVbl/
+supercharged sUpPC)rjd
+supercomputers sUpPk}pyUdPz
+superfluous sUpVflU@s
+superhighway sUpPhIwA
+superintendent sUpP~tend~t
+superintendents sUpP~tend~ts
+superior s6pEr/P
+superior's s6pEr/Pz
+superiors s6pEr/Pz
+supermarkets sUpPm)rk6ts
+superpowers sUpPp?Pz
+superstar sUpPst)r
+supervision sUpPviZ~
+supervisor sUpPvIzP
+supervisors sUpPvIzPz
+supervisory sUpPvIz@r/
+supper supP
+suppers supPz
+supplement supl6m~t
+supplementary supl6ment@r/
+supplements supl6m~ts
+supplied s6plId
+supplier s6plIP
+supplies s6plIz
+supply s6plI
+support s@p{rt
+supported s6p{rd6d
+supporter s6p{rdP
+supporters s6p{rdPz
+supporting s6p{rd6N
+supports s6p{rts
+suppose s6pOz
+supposed s@pOzd
+supposition sup@ziS~
+suppositions sup@ziS~z
+suprasegmegntal s6pras6gmegntL
+suprasegmental s6pras6gmentL
+supreme s6prEm
+surcharge sVC)rj
+surcharges sVCorj6z
+sure SUr
+surely SUrl/
+suresh sUreS
+surest SUr6st
+surety sUr6d/
+surf sVf
+surface sVf6s
+surfaced sVf6st
+surfaceness sVf6sn6s
+surfaces sVf@s6z
+surfboards sVfb{rdz
+surfboat sVfbOt
+surfeit sVf6t
+surffish sVffiS
+surgeon sVj~
+surgery sVjP/
+suring SUr6N
+suring Sqr6N
+suring sqr6N
+surles sPlz
+surly sVl/
+surmount sPm?nt
+surnames sVnAmz
+surpassed sPpast
+surplus sVplus
+surpluses sVplus6z
+surprise sPprIz
+surprised sPprIzd
+surprising sPprIz6N
+surprisingly sPprIz6Nl/
+surrealism sPEliz}
+surrealistic sPElist6k
+surrell s@r@l
+surrender sPendP
+surrendering sPendP6N
+surrogate sV@g6t
+surround sP?nd
+surrounded sP?nd6d
+surrounding sP?nd6N
+surroundings sP?nd6Nz
+surrounds sP?ndz
+survey sVvA
+surveyed sPvAd
+surveying sPvA6N
+surveys sVvAz
+survival sPvIvL
+survive sPvIv
+survived sPvIvd
+survives sPvIvz
+surviving sPvIv6N
+survivor sPvIvP
+susan sUz~
+susanville sUz~vil
+susany sUz@nE
+susceptible s6sept@bl
+sushi sUS/
+suspect s6spekt
+suspected s6spekt6d
+suspend s@spend
+suspenseful s6spensfL
+suspensions s6spenS~z
+suspicious s6spiS@s
+suspiciously s6spiS@sl/
+sussex sus6ks
+sustained s6stAnd
+sutersville sUdPzvil
+sutersville sUtPzvil
+suwanee sUwAnE
+suzanne sUzan
+suzette sUzet
+suzie sUz/
+suzuki sUzUk/
+suzy sUz/
+svrcek svPCek
+swab sw)b
+swade swAd
+swagerty swagPtE
+swaggart swagPt
+swahili sw@hil/
+swain swAn
+swainsboro swAnzbP]
+swainsboro swAnzbV]
+swaledale swAldAl
+swallow swol]
+swallowtail swol]tAl
+swam swam
+swamp swomp
+swampbuster swompbustP
+swamped swompt
+swampland swompland
+swan swon
+swanessa sw@nes@
+swanger swaNP
+swank swaNk
+swann swon
+swannanoa sw@nan]@
+swannanoa swon@nO@
+swansea swonz/
+swanville swonvil
+swap swop
+swaps swops
+swarmed sw{rmd
+swarth sw{rT
+swarthmore sw{rTm{r
+swartz sw{rts
+swartzfager sw{rtsfAgP
+swatch swoC
+swauger sw)gP
+swayed swAd
+swaying swA6N
+swayze swAzE
+swear sw,r
+swearingen swArinj6n
+sweat swet
+sweatbox swEtboks
+sweater swedP
+sweaters swedPz
+sweatshirt swEtSPt
+sweatshops swetSops
+sweatt swet
+swede swEd
+sweden swEd~
+swedesford swEdzfPd
+swedish swEd6S
+sweeney swEn/
+sweep swEp
+sweepback swEpbak
+sweepstakes swEpstAks
+sweet swEt
+sweet_grass swEtgras
+sweetbread swEtbred
+sweetbriar swEtbrIP
+sweetheart swEth)rt
+sweethearts swEth)rts
+sweetly swEtl/
+sweets swEts
+sweetwater swEtw{dP
+sweetwater swEtw{tP
+sweigert swIgPt
+sweitzer swItzP
+swell swel
+swelling swel6N
+swells swelz
+swerve swVv
+swerved swVvd
+swiftest swift6st
+swiftly swiftl/
+swiftness swiftn6s
+swifton swift~
+swiger swIgP
+swigert swigPt
+swim swim
+swimming swim6N
+swimsuits swimsUts
+swindlers swindLPz
+swineford swInfPd
+swinehart swInh)rt
+swinerton swInPt@n
+swing swiN
+swinger swiNP
+swinging swiN6N
+swingle swiNgL
+swiping swIp6N
+swires swIrz
+swirled swVld
+swirls swVlz
+swish swiS
+swisher swiSP
+swiss swis
+switch swiC
+switchblade swiCblAd
+switchboards swiCb{rdz
+switches swiC6z
+switchyard swiCy)rd
+swithenbank swiD~baNk
+switz swits
+switzer switsP
+switzerland switsPl~d
+switzerland's switsPl~dz
+switzerlands switsPl~dz
+swivels swivLz
+swollen swOl~
+swooped swUpt
+swoopes swUps
+swopes swOps
+sword s{rd
+swordbill s{rdbil
+swordcraft s{rdkraft
+swordfish s{rdfiS
+swordlike s{rdlIk
+swordplay swVdplA
+swords s{rds
+swordsman s{rdzm~
+swore sw{r
+sworn sw{rn
+swoyersville sw<Pzvil
+swung swuN
+swygert swIgPt
+syble sib@l
+sycoff sik{f
+sydney sidn/
+sykesville sIksvil
+sylacauga sil@k{g@
+sylvan silv~
+sylvania sLvAn/@
+sylvarena sLvar~@
+sylve silvE
+sylvester s6lvestP
+sylvestre silvestrA
+symbol simbL
+symbolic s@mbol6k
+symbolized simb@lIzd
+symbols simbLz
+symes sImz
+symmetrical s6metr6kL
+symmetry sim6tr/
+sympathetic simp@Ted6k
+sympathetically simp@Ted6kl/
+sympathized simp@TIzd
+sympathizer simp@TIzP
+sympathizers simp@TIzPz
+symphonic s@mfon6k
+symphony simf~/
+symposium s@mpOz/}
+symptom simpt}
+symptomatic simpt@mad6k
+symsonia s6msOn/@
+symsonia s@msOn/@
+synagogue sin@gog
+synch sinC
+synchronized siNkr@nIzd
+syndromes sindrOmz
+synonymous s6non6m@s
+synovic sInOvik
+syntax sintaks
+synthesize sinT6sIz
+synthesized sinT6sIzd
+synthetics s~Ted6ks
+syosset sIos6t
+syracuse sir@kyUs
+syreeta sIrEt@
+system sist}
+systems sist}z
+systemwide sist@mwId
+szczygiel sCEg6l
+szitar sEt)r
+t t
+t tE
+ta to
+tabasco t@bask]
+tabatha t@baT@
+tabetha tab@T@
+tabitha tab@T@
+table tAbL
+tablecloth tAbLkl{T
+tablecloths tAbLkl{Ts
+tables tAbLz
+tablespoon tAbLspUn
+tablespoonful tabl6spUnfL
+tablespoons tAbLspUnz
+tabletop tAbLtop
+tableware tAbLw,r
+tabloids tabl<dz
+taboos tabUz
+tabriz t@brEz
+tabriz tabr6z
+tabuena tabwAn@
+tach taC
+tacheny t@CAnE
+tachometer takom6dP
+tack tak
+tackle takL
+tacks taks
+taco tok]
+tacoma t@kOm@
+tacos tok]z
+tactful taktfL
+tactic takt6k
+tactics takt6ks
+tactlessly taktl6sl/
+tad tad
+tadpole tadpOl
+tadpoles tadpOlz
+taegel tAg@l
+taetzsch tetS
+taft taft
+tafton taft~
+tag tag
+taggart tagPt
+tagge tag
+taglialatela taglE@tel@
+tahiti t@hEd/
+tahiti t@hEt/
+tahlequah t@lekw@
+tahlequah talEkw@
+tahoka t@hOk@
+tail tAl
+tailgater tAlgAdP
+tailhook tAlhqk
+tailor tAlP
+tailorbird tAlPbVd
+tailored tAlPd
+tailpipe tAlpIp
+tailspin tAlspin
+taina tAn@
+taiwan tIwon
+take tAk
+takehara t)k@h)r@
+takemura t)k@mUr@
+taken tAk~
+takeovers tAkOvPz
+takes tAks
+takeshita t)k@SEt@
+takiguchi tak6gUCE
+takin tak~
+taking tAk6N
+takoma t@kOm@
+tal tal
+talala t@lal@
+talala t@lol@
+talaro talArO
+talbot t{lb@t
+talbotton talbod~
+talc talk
+talco talk]
+tale tAl
+talent tal~t
+talented tal~t6d
+talents tal~ts
+tales tAlz
+talia t)ly@
+taliaferro t)ly@fArO
+talihina tal6hEn@
+talihina tal@hEn@
+talk t{k
+talked t{kt
+talking t{k6N
+talkington t{kiNt6n
+talks t{ks
+tall t{l
+tallahassee tal@has/
+tallapoosa tal@pUs@
+tallaposia tal@pOZ@
+tallmadge talm6j
+tallow tal]
+tallula t@lUl@
+tallula taly6l@
+tally tal/
+talon tal~
+talus tAl@s
+talvola t@lvOl@
+tamaqua t@m)kw@
+tamaqua t@makw@
+tamar t@m)r
+tamara t@m)r@
+tamara t@mor@
+tamarac tam@rak
+tamaroa t)m@rO@
+tamaroa t@mar]@
+tamayo t@mIO
+tamburino tamb@rEnO
+tame tAm
+tamica t@mEk@
+tamie tamE
+tamika tamik@
+tammy tam/
+tampa tamp@
+tampere tamp@rA
+tampere tampEr
+tampico tamp6k]
+tamworth tamwPT
+tamworth tamwVT
+tan tan
+tanasbourne ton@zb{rn
+tandy tand/
+tang taN
+tangela tanj@l@
+tangerine tanj@rEn
+tangle taNgL
+tangleberry taNgLber/
+tanglewood taNgLwqd
+tangman taNm~
+tangy taN/
+tania t)ny@
+tanika tanik@
+tanja t)ny@
+tank taNk
+tanke taNk
+tanked taNkt
+tankersley taNkPzl/
+tankesly taNkslE
+tankful taNkfL
+tanks taNks
+tankship taNkSip
+tankxley taNkslE
+tannery tan@rE
+tanoue tanU
+tantalizing tantLIz6N
+tantrums tantr}z
+tanya t)ny@
+tanya tany@
+tap tap
+tapanes tap@n@s
+tapawingo tap{iNg]
+tape tAp
+tapes tAps
+tapestry tap6str/
+tapeworm tApwVm
+taphous taph?s
+tappan tappan
+tapped tapt
+taps taps
+tar t)r
+tara t)r@
+tara tar@
+tara tor@
+tarboro t)rbV]
+tarentum t@rent}
+tareyton t@rAd~
+target t)rg6t
+targeted t)rg6d6d
+tarkington t)rkiNt~
+tarricone tAr6kOn
+tarry ter/
+tarrytown t,r/t?n
+tarsus t)rs@s
+tart t)rt
+tarzana t)rzan@
+tarzana t)rzon@
+tarzana torzon@
+tash taS
+tashia t)Sy@
+tasia tAZ@
+task task
+taskmaster taskmastP
+tasks tasks
+taskwork taskwVk
+tasmania t6smAn/@
+tassell tasL
+taste tAst
+tasted tAst6d
+tasteful tAstfL
+tastefully tAstfL/
+tastes tAsts
+tastier tAst/P
+tasting tAst6N
+tasty tAst/
+tate tAt
+tatiana t)tE)n@
+tattered tadPd
+tattoos tatUz
+tatum tAt@m
+tatums tad}z
+taualii t?w@lE
+taught t{t
+taunton t{nt~
+taunts t{nts
+taurus t{r@s
+taut t{t
+taverns tavPnz
+tawakoni tow@kOn/
+tax taks
+taxation taksAS~
+taxes taks6z
+taxi taks/
+taxicab taks6kab
+taxidermy taksidPm/
+taxied taks/d
+taxiplane taks/plAn
+taxpayer takspAP
+taxpayers takspAPz
+tay tA
+taylor tAlP
+taylors tAlPz
+taylorsville tAlPzvil
+tea tE
+teach tEC
+teacher tECP
+teachers tECPz
+teachey tEC/
+teaching tEC6N
+teacupful tEk@pfL
+teagan tEg~
+teagarden tEg)rd~
+teague tEg
+teagues tEgz
+teal tEl
+team tEm
+teammates tEmmAts
+teams tEmz
+teamwork tEmwVk
+teaneck tEnck
+teaneck tEnek
+tear tEr
+tears tErz
+teasdale tEzdAl
+tease tEz
+teased tEzd
+teaspoonful t6spUnfL
+teaspoons tEspUnz
+tech tek
+technical tekn6kL
+technically tekn6kl/
+technicolor tekn6kulP
+technique teknEk
+techniques teknEks
+technological tekn@loj6kL
+technologically tekn@loj6kl/
+technologies teknol@j/z
+technology tcknol@j/
+tectonics t6kton6ks
+ted ted
+tedeschi tedeSE
+teed tEd
+teems tEmz
+teenager tEnAjP
+teensy tEns/
+teesdale tEzdAl
+teeth tET
+teething tED6N
+teetotaler tEtOdLP
+teffeteller teftelP
+tegeler teglP
+tegner tegnP
+tehakmah t6hakm@
+teichman tIkm6n
+tejada tAh)d@
+tejeda t@hAd@
+tekamah t6kam@
+tekamah tek@m)
+tekippe t@kipE
+tekoa t6kO@
+tekoa tek]@
+tekonsha t6konS@
+tel_aviv tel@vEv
+telecharge tel6C)rj
+telecommunications tel6k@myUn6kAS~z
+telegraph tel6graf
+telematic tel6mad6k
+telematics tel6mad6ks
+telepathic tel6paT6k
+telephone tel@fOn
+telephones tel6fOnz
+teletech tel6tek
+teletext tel@tekst
+televise tel6vIz
+television tel@viZ~
+telex teleks
+telford telfPd
+tell tel
+telle telE
+teller telP
+tellers telPz
+telling tel6N
+tells telz
+temecula t6meky6l@
+temores temOrez
+temoshenka tem@SeNk@
+temp temp
+tempe tcmpE
+tempe temp
+tempe temp/
+temper tempP
+temperamental tempr@mentL
+temperance tempP~s
+temperate tempr6t
+temperature tempP@CP
+temperature tempPCP
+temperature tempr@CP
+temperatures tempr6CPz
+tempered tempPd
+temple tempL
+templeman temp@lm6n
+temples tempLz
+templeton temp@lt6n
+templeville tempLvil
+tempo temp]
+temporarily temp@rar6l/
+temporary temp@rer/
+temptation temptAS~
+temptations temptAS~z
+tempted tempt6d
+tempting tempt6N
+temptress temptr6s
+ten 2x|
+tenafly tEn@flI
+tenafly tcnafl/
+tenant ten~t
+tend tend
+tended tend6d
+tender tendP
+tenderfoot tendPfqt
+tenderizer tendPIzP
+tenderness tendPn6s
+tendril tendrL
+tends tendz
+tengben teNben
+tennessee ten6sE
+tennessee ten@sE
+tenney ten/
+tennille t6nil
+tennis ten6s
+tens tenz
+tension tenS~
+tent tent
+tentacles tent@kLz
+tenth 2x|G
+tenths tenTs
+tentmaker tentmAkP
+tents tents
+tenuous tenyU@s
+tenure tenyP
+tequila t6kEl@
+teresa t@rEs@
+teresita tAr6sEt@
+teriyaki tar6yok/
+terlizzi terlEtzE
+term tVm
+terminal tVm~L
+terminals tVm~Lz
+terminate tVm6nAt
+termination tVm6nAS~
+termites tVmIts
+termless tVml6s
+terms tVmz
+teroganesyan terOgAnsy@n
+terrace tar6s
+terral tVL
+terrapin tar@pin
+terrazas t@raz@z
+terrell tArel
+terri ter/
+terrible tar@bl
+terribly tar6bl/
+terrier t,r/P
+terrific t@rif6k
+terrifying tar6fI6N
+terril tarL
+territorial tar6t{r/L
+territory tar6t{r/
+terron tar~
+terrones t@rOn6s
+terrorized tarPIzd
+terry ter/
+terseness tVsn6s
+tersigni tPsEnE
+terwilliger tVw6l6jP
+tescott tesk6t
+tescott tesk@t
+tesh teS
+tesoro t6s{rO
+tess tes
+test test
+testa test@
+tested test6d
+testicle test6kL
+testimonial test6mOn/L
+testimony test6mOn/
+testing test6N
+tests tests
+tetanus ted~n@s
+teteak tetEk
+tetherball teDPb{l
+tethered teDPd
+tethering teDP6N
+tevebaugh tEvb{
+tewksbury tUksbP/
+tewksbury tUksber/
+texaco teks@kO
+texarkana teksPkon@
+texas teks6s
+texas teks@s
+texico teks6k]
+text tekst
+textbook tekstbqk
+textile tekstIl
+textiles tekstIlz
+texts teksts
+texture teksCP
+th T
+thad Tad
+thai tI
+thailand tIl~d
+thalia T)lE@
+thalmus Talm@s
+tham tam
+thames tAmz
+than Dan
+thanas T)n@s
+thank TaNk
+thankful TaNkfL
+thankfully TaNkfL/
+thankless TaNkl6s
+thanklessness TaNkl6sn6s
+thanks TaNks
+thanksgiving TaNksgiv6N
+tharp T)rp
+that Dat
+that'll DadL
+that's Dats
+thatch TaC
+thatched TaCt
+thatching TaC6N
+thatll DadL
+thats Dats
+thaw T{
+thawed T{d
+thawing T{6N
+thaws T{z
+thayer TAP
+the D/
+the D@
+the DE
+the Du
+thea TE@
+theater TE@dP
+theatre TE@dP
+theatres TE@tPz
+theatrical T/atr6kL
+theatrically T/atr6kL/
+theatricals T/atr6kLz
+theaux TO
+theft Teft
+theftproof TeftprUf
+thefts Tefts
+their D,r
+theirs D,rz
+theirselves T,rsLvz
+theis TEs
+theisen TEs6n
+theiss TEs
+thelma Telm@
+them Dem
+thematic T6mad6k
+theme TEm
+themes TEmz
+themselves D6mselvz
+then Den
+theobald TE@bLd
+theocracy T/okr@s/
+theodore TE@d{r
+theodosia TE@dOS@
+theodosia TE@dOZ@
+theological TE@loj6kL
+theologize T/ol@jIz
+theorem TE@r}
+theoretical TE@red6kL
+theoretics TE@red6ks
+theory TEr/
+therapeutic Tar@pyUd6k
+therapies Tar@p/z
+therapist Tar@p6st
+therapy Tar@p/
+there D,r
+there'd Dar6d
+there's D,rz
+thereabouts Dar@b?ts
+thereafter DAraftP
+thereby D,rbI
+thered Dar6d
+therefore D,rf{r
+theres D,rz
+theresa t@rEs@
+therese t@rEs
+theresia t@rEsE@
+theressa t@res@
+thermal TVmL
+thermally TVmL/
+thermometer TPmom6dP
+thermometers TPmom6dPz
+thermonuclear TVm]nUkl/P
+thermopolis TVm]pol6s
+thermostat TVm@stat
+therriault terEO
+thesaurus T6s{r@s
+these DEz
+thesis TEs6s
+they DA
+they'd DAd
+they'll DAl
+they're D,r
+they've DAv
+theyd DAd
+theyll DAl
+theyre D,r
+theyve DAv
+thibadeau tEb@dO
+thibaudeau tib@dO
+thibault tib{lt
+thibaut tEbO
+thibeault tibOlt
+thibideau tib@tO
+thibodeau tib@dO
+thibodeaux tib@dO
+thiboutot tib@tO
+thick Tik
+thickens Tik~z
+thicker TikP
+thicket Tik6t
+thief TEf
+thief's TEfs
+thiefs TEfs
+thielges TElgez
+thieves TEvz
+thigh TI
+thighs TIz
+thilges Tilj6s
+thimble TimbL
+thimmesch Tim@S
+thimphu TimfU
+thimphu timpU
+thin Tin
+thing TiN
+things TiNz
+think TiNk
+thinker TiNkP
+thinkin TiNk~
+thinking TiNk6N
+thinks TiNks
+thinner TinP
+thinners TinPz
+third BWd
+third TVd
+thirds TVdz
+thirst TVst
+thirstier TVst/P
+thirsty TVst/
+thirteen BW2Y|
+thirteenth BW2Y|G
+thirteenths TVtEnTs
+thirtieth BWQ[(G
+thirty BW2[
+this Dis
+thistle TisL
+thistles TisLz
+thistlethwait Tis6lTwAt
+thom t)m
+thomae t)mA
+thoman t)m@n
+thomas tom6s
+thomas tom@s
+thomasboro tom6sbV]
+thomasena t)m@sEn@
+thomases t)m@s6z
+thomasina t)m@sEn@
+thomasine t)m@sEn
+thomason t)m@s6n
+thomasson t)m@s@n
+thomaston tom6st~
+thomaston tom@st~
+thomasville tom6svil
+thomeczek t)m@Cek
+thomes t)m@s
+thometz tOmets
+thomison t)m6s6n
+thomlinson t)ml6ns6n
+thomlison t)ml6s6n
+thommarson t)mPs@n
+thompkins t)mpk6nz
+thompon t)mp@n
+thompsom t)ms@n
+thompson tomps~
+thompson toms~
+thompsontown Tomps~t?n
+thomsen t)ms6n
+thomson toms~
+thong T{N
+thorn T{rn
+thornburg T{rnbVg
+thornfield T{rnfEld
+thornier T{rn/P
+thornridge T{rnrij
+thornsberry T{rnzber/
+thornton T{rnt~
+thorntown T{rnt?n
+thornville T{rnvil
+thornwood T{rnwqd
+thorough TVO
+thoroughbred TVObred
+thoroughfares TVOf,rz
+thoroughgood T@rOgqd
+thoroughly TVL/
+thoroughness TVOn6s
+thorp T{rp
+thorsander T{rsandP
+those DOz
+thou D?
+though DO
+thought T{t
+thoughtful T{tfL
+thoughtfully T{tfL/
+thoughtless T{tl6s
+thoughts T{ts
+thousand T?z~d
+thousands T?z~dz
+thousandth T?z~dT
+thousandths T?z~dTs
+thouvenel TUvn@l
+thrash TraS
+thread Tred
+threadgill Tredgil
+threat Tret
+threatened Tred~d
+threatening Tred~n6N
+threateningly Tred~n6Nl/
+threats Trets
+threatt Tret
+three B0Y
+threefold TrEfOld
+threlkeld TrelkLd
+thresh TreS
+threshold TreSOld
+thresholds TreSOldz
+thress Tres
+threw TrU
+thrift's Trifts
+thriftless Triftl6s
+thrifts Trifts
+thriftshop TriftSop
+thrill Tril
+thrilled Trild
+thriller TrilP
+thrilling Tril6N
+thrive TrIv
+thrived TrIvd
+throat TrOt
+throaty TrOd/
+throbbing Trob6N
+thrombosis TrombOs6s
+throne TrOn
+throneburg TrOnbPg
+throng Tr{N
+through TrU
+throughout TrU?t
+throughway TrUwA
+throw TrO
+throwback TrObak
+thrower TrOP
+thrown TrOn
+throws TrOz
+thrun Trun
+thrust Trust
+thrusting Trust6N
+thrusts Trusts
+thruway TrUwA
+thudding Tud6N
+thumb Tum
+thumbnail TumnAl
+thumbs Tumz
+thumbscrew TumbskrU
+thumbtack Tumtak
+thump Tump
+thunder TundP
+thunderbird TundPbVd
+thunderbolt TundPbLt
+thundercloud TundPkl?d
+thundershower TundPSOP
+thunderstorms TundPst{rmz
+thunderstruck TundPstruk
+thurmont TVmont
+thurow TUr]
+thursday TVzd/
+thursday TVzdA
+thursday's TVzdAz
+thursdays TVzdAz
+thury T@rE
+thus Dus
+thuy tUE
+thwarted Tw{rd6d
+thy DI
+thyroid TIr<d
+thyself DIself
+tiana t/on@
+tibbetts tib6ts
+tibbie tib/
+tibbits tib6ts
+tibet t6bet
+ticket tik6t
+ticketmaster tik6tmastP
+ticketmasters tik6tmastPz
+ticketron tik6tron
+tickets tik6ts
+ticklish tikl6S
+tidbits tidb6ts
+tide tId
+tides tIdz
+tidesville tIdzvil
+tidewater tIdw{dP
+tidewaters tIdw{dPz
+tidioute t6dw)
+tidioute tid/?t
+tidioute tid/Ot
+tidwell tidwel
+tie tI
+tieback tIbak
+tied tId
+tieman tIm~
+ties tIz
+tieton tEd~
+tiffani tif@nE
+tiffanie tif@nE
+tiffany tif~/
+tiffin tif~
+tifton tift~
+tigard tigPd
+tiger tIgP
+tigerfish tIgPfiS
+tigers tIgPz
+tigerton tIgPt~
+tigges tEgz
+tighe tEg
+tight tIt
+tighter tIdP
+tightly tItl/
+tightrope tItrOp
+tignall tignL
+tigress tIgr6s
+tigue tEg
+tilburg tilbPg
+tiled tIld
+tiles tIlz
+tilghman tilm6n
+tiling tIl6N
+till til
+tillar tilP
+tilly til/
+tilson tils~
+tilted tilt6d
+tim tim
+timber timbP
+timberlake timbPlAk
+timberlinks timbPl6Nks
+timberville timbPvil
+timberwork timbPwVk
+timbuctoo timb6ktU
+timbuctoo timb@ktU
+timbuktu t@mbuktU
+time tIm
+timecard tImk)rd
+timepiece tImpEs
+timeplex tImpleks
+timers tImPz
+times tImz
+timetable tImtAbL
+timetabled tImtAbLd
+timetables tImtAbLz
+timeworn tImw{rn
+timika timik@
+timing tIm6N
+timmons tim~z
+timothy tim@T/
+timpani timp~/
+timpe timpE
+timpson timps~
+tin tin
+tina tEn@
+tinder tindP
+tinged tinjd
+tinker tiNkP
+tinkled tiNkLd
+tinsel tinsL
+tint tint
+tinton tint~
+tiny tIn/
+tionesta tI@nest@
+tip tip
+tippecanoe t6pek~]
+tippecanoe tip/k@nU
+tipped tipt
+tipping tip6N
+tipre tipr@
+tips tips
+tiptoed tipt]d
+tiptoeing tiptO6N
+tiptonville tipt~vil
+tirana t6r)n@
+tirana t@ron@
+tire tIr
+tired tIrd
+tirelessly tIrl6sl/
+tires tIrz
+tiresome tIrs}
+tiring tIr6N
+tis tis
+tisdale tizdAl
+tishmoningo tiSm@niNg]
+tishomingo tiS@miNg]
+tishomingo tiS]miNg]
+tiskilwa t6skilw@
+tissue tiSU
+titan tId~
+tithe tID
+title tIdL
+titleholder tIdLhOldP
+titler titlP
+titter tidP
+tittl tit@l
+tittle tidL
+titus tIt@s
+titusville tId@svil
+titusville tIt@svil
+tiverton tIvPt~
+tiverton tivPt~
+tivoli tivL/
+tjepkema Cepk6m@
+tlatelpa tlatelp@
+to t@
+to tU
+to tq
+to tu
+toad tOd
+toadfish tOdfiS
+toadstool tOdstUl
+toala tO{l@
+toast tOst
+toastmaster tOstmastP
+tobacco t@bak]
+tobe tOb
+tobe tObE
+tobias tObI@z
+tobiassen tObI6s@n
+tobin tOb@n
+tobruk tObrqk
+tobruk t]brqk
+tobruk tobr6k
+tocchio t)kEO
+toccopola tok@pOl@
+toce tOCE
+toco tOk]
+today t@dA
+today tUdA
+today's t@dAz
+todays t@dAz
+todays t]dAs
+todays t]dAz
+todd tod
+toddler todLP
+toddlers todLPz
+todoroff tOd@r)f
+toe tO
+toed tUd
+toehold tOhOld
+toenails tOnAlz
+toes tOz
+tofflemire t)f@lmIr
+tofu tOfU
+together t@geDP
+togetherness t@geDPn6s
+tognazzini t)ny@zEnE
+togni t)nyE
+toil t<l
+toilet t<l6t
+toiletry t<l6tr/
+tokushima tOkUSEm@
+tokushima t]kUS6m@
+tokyo tOk/]
+toland tOl6nd
+tolar tOlP
+told tOld
+toledo t@lEd]
+toledo t]lAD]
+tolefree tOlfrE
+tolerably tol@r@bl/
+tolerance tol@r~s
+tolerant tol@r~t
+tolerated tol@rAd6d
+toleration tol@rAS~
+toles tOlz
+toleston tOlst@n
+tolfree tOlfrE
+toline tOlIn
+toll tOl
+tollbooth tOlbUT
+tolle tOl
+tolley tOl/
+tolley t{lE
+tolna tOln@
+tolstoy tolst<
+toluca t@lUk@
+tom tom
+tomahawk tom@h6k
+tomales t]m)lAs
+tomales tomAlz
+tomato t@mAd]
+tomatoes t@mAd]z
+tomb tUm
+tomball tUm{l
+tomball tomb{l
+tombleson t)mb@ls@n
+tomboy tomb<
+tombs tUmz
+tombstones tUmstOnz
+tomcat tomkat
+tomfoolery tomfUlP/
+tomika t{mik@
+tomopoulos t@m)p@l6s
+tomorrow t@mor]
+tomorrow tUmor]
+tompkins tompk~z
+ton tun
+tonawanda ton@wond@
+tonda tond@
+tone tOn
+tones tOnz
+tonge t)N
+tongs t{Nz
+tongue tuN
+tongues tuNz
+toniatti tOnEatE
+tonight t@nIt
+tonight's t@nIts
+tonights t@nIts
+tonkawa toNk)w@
+tonks toNks
+tons tunz
+tony tOn/
+too tU
+tooele tUel
+tooele tqel@
+took tqk
+tooksberry tqksber/
+tool tUl
+toole tUl
+tooles tUlz
+toolshed tUlSed
+toombaganhan tUmb@ganh~
+toomes tUmz
+toomsboro tUmzbP]
+toomsboro tUmzbV]
+toomsuba t@msUb@
+toomsuba tUmsUb@
+tooth tUT
+toothacre tUTAkP
+toothbrush tUTbruS
+toothbrushes tUTbruS6z
+toothless tUTl6s
+toothpaste tUTpAst
+toothpastes tUTpAsts
+toothpicks tUTpiks
+toothy tUD/
+top top
+topcoat topkOt
+topeka t@pEk@
+topic top6k
+topics top6ks
+topmast topmast
+topoian tOp<y@n
+toporek t)p{rek
+topp top
+toppings top6Nz
+topps tops
+topsail topsAl
+topsfield topsfEld
+topside topsId
+topton topt~
+torch t{rC
+torchbearer t{rCbarP
+torchmark t{rCm)rk
+torchwood t{rCwqd
+tore t{r
+torn t{rn
+tornados t{rnAd]z
+tornatore t{rn@t{rE
+toro t{r]
+toromanides tOrOm@nEdEz
+torongeau tOr)NgO
+torpedoing t{rpEd]6N
+torrance t{r~s
+torre t{rE
+torrent t{r~t
+torrijos t{rEhOs
+torrington t{riNt~
+torruellas tOrUel@z
+torso t{rs]
+tortoise t{rd6s
+tortorici t{rt@rECE
+toss t{s
+tossed t{st
+tosses t{s6z
+total tOdL
+total's tOdLz
+totalitarian t@tal6t,r/~
+totalitarianism t@tal6t,r/@niz}
+totally tOdL/
+totals tOdLz
+totowa t@tOw@
+totter todP
+touar t?P
+touart tUPt
+touch tuC
+touchback tuCbak
+touchdown tuCd?n
+touchdowns tuCd?nz
+touched tuCt
+touches tuC6z
+touchette tUSet
+touching tuC6N
+touchstone tuCstOn
+touchy tuC/
+tougaloo t?g@lU
+tougaloo tUg@lU
+tough tuf
+toughening tuf~6N
+toughens tuf~z
+touhy tUhE
+touma tUm@
+tour tUr
+toured tUrd
+touring tqr6N
+touring t{r6N
+tourism tUriz}
+tourist tUr6st
+tourists tUr6sts
+tournament tVn@m~t
+tours tUrz
+tours tqr
+touts t?ts
+tow tO
+towanda t@wond@
+towanda t]ond@
+toward tw{rd
+towards tw{rdz
+towel t?L
+toweling t?6l6N
+tower t?P
+towers t?Pz
+towery t?PE
+towing tO6N
+towle t?l
+town t?n
+towner t?nP
+townish t?n6S
+towns t?nz
+townscape t?nskAp
+townsend t?ns~d
+townsend's t?ns~dz
+townsends t?ns~dz
+township t?nSip
+townspeople t?nzpEpL
+townsville t?nzvil
+townswoman t?nzwqm~
+townville t?nvil
+towrope t{r@p
+towse t?z
+towsend t?s6nd
+towson t?s~
+toxic toks6k
+toy t<
+toying t<6N
+toymaker t<mAkP
+toyota t<Od@
+toys t<z
+trabuco tr@bUk]
+trace trAs
+traced trAst
+tracee trAsE
+traces trAs6z
+tracewell trAswel
+trachsel traS@l
+trachte traktE
+trachtenberg trakt@nbPg
+traci trAsE
+track trak
+tracked trakt
+tracking trak6N
+tracks traks
+tract trakt
+traction trakS~
+tracy trAs/
+trade trAd
+trademarked trAdm)rkt
+traders trAdPz
+tradesfolk trAdzfOk
+tradesmen trAdzm~
+tradeswoman trAdzwqm~
+tradition tr@diS~
+traditional tr@diS~L
+traditionalism tr@diS~@liz}
+traditionally tr@diS~L/
+traffic traf6k
+trafford traffPd
+tragedy traj6d/
+trager trAgP
+tragesser tragesP
+tragic traj6k
+trail trAl
+trailblazer trAlblAzP
+trailer trAlP
+trails trAlz
+train trAn
+trainer trAnP
+training trAn6N
+trains trAnz
+trainshed trAnSt
+trainsick trAnsik
+trait trAt
+traits trAts
+trajectories tr@jekt@r/z
+trajectory tr@jekt@r/
+tram tram
+trammell tramel
+trample trampL
+trampoline tramp@lEn
+tranbarger tranb)rgP
+tranquil traNkwL
+tranquility traNkwil6d/
+tranquilizer traNkw6lIzP
+tranquilizers traNkw6lIzPz
+tranquillize traNkwilIz
+tranquillized traNkwilIzd
+transact tranzakt
+transaction tranzakS~
+transalaska tranz@lask@
+transamerica's tranz@mar6k@z
+transamericas tranz@mar6k@z
+transcendence transend~s
+transcontinental transkont6nentL
+transcription transkripS~
+transcripts transkr@pts
+transducers tranzjUsPz
+transfer transfP
+transfers transfPz
+transfixed transfikst
+transform transf{rm
+transformation transfPmAS~
+transforming transf{rm6N
+transfusion transfyUZ~
+transfusions transfyUZ~z
+transgress tranzgres
+transgressor tranzgresP
+transit tranz6t
+transition tranziS~
+translate tranzlAt
+translated tranzlAd6d
+translation tranzlAS~
+translations tranzlAS~z
+translucent tranzlUs~t
+transmission tranzmiS~
+transmit tranzmit
+transmittal tranzmidL
+transmitters tranzmidPz
+transmutation tranzmy6tAS~
+transnational tranznaS~L
+transoceanic tranzOS/anik
+transparency transpar~s/
+transparent transpar~t
+transparently transpar~tl/
+transpired transpIrd
+transport transp{rt
+transportation transpPtAS~
+transportation's transpPtAS~z
+transportations transpPtAS~z
+transporters transp{rdPz
+transverse tranzvVs
+trap trap
+trapezoid trap6z<d
+trapper trapP
+trash traS
+traskwood traskwqd
+trastevere trast6vEr
+trastevere trostAvArA
+trauma tr{m@
+traumatic tr{mad6k
+travel travL
+traveled travLd
+traveler travlP
+traveler's travlPz
+travelers travlPz
+traveling trav6l6N
+travellers trav6lPz
+travels travLz
+travelstead travLsted
+travers travPz
+travis trav6s
+trawl tr{l
+tray trA
+treacherous treC@r@s
+treadmill tredmil
+treadmills tredmilz
+treadway tredwA
+treadwell tredwel
+treason trEz~
+treasure treZP
+treasured treZPd
+treasurer treZPP
+treasures treZPz
+treat trEt
+treated trEd6d
+treatment trEtm~t
+treats trEts
+treble trebL
+trecroci tr6krOCE
+tree trE
+treefrog trEfr{g
+treefrogs trEfr{gz
+treehopper trEh@pP
+treeless trEl6s
+trees trEz
+trelliswork trel6swVk
+treloar trelOr
+tremaine tr6mAn
+tremble trembL
+trembled trembLd
+trembling trembl6N
+trembly tremblE
+tremendous tr6mend@s
+tremendousless tr6mend@sl6s
+tremendously tr6mend@sl/
+tremendousness tr6mend@sn6s
+treml trem@l
+tremor tremP
+trempealeau tremp6lO
+trempealeau trempLO
+trempspealeau trempsp6lO
+trenbeath trenbET
+trench trenC
+trend trend
+trendcenter trends~tP
+trends trendz
+trendsetter trends6dP
+trent trent
+trento trent]
+trepagnier tr6p)nyP
+trespassing tresp@s6N
+treusdell trUzdel
+trevigne tr@vEn
+trevithick trev6Tik
+trevor trevP
+trexlertown trekslPt?n
+treynor trAnP
+treynor trAn{r
+tri trI
+trial trIL
+trials trILz
+triangle trIaNgL
+triangular trIaNgy6lP
+tribalism trIb@liz}
+tribes trIbz
+tribesmen trIbzm~
+tribulation triby6lAS~
+tribune tribyUn
+tributaries triby6t,r/z
+trick trik
+trickiest trik/6st
+tricks triks
+tried trId
+trieger trEgP
+tries trIz
+trieste tr/est
+trieste tr/est/
+trieste trEst
+trifle trIfL
+trifone trifOn
+triggered trigPd
+trilla tril@
+trim trim
+trimble trimbL
+trimont trImont
+trims trimz
+tringham triN@m
+trinidad trin6dad
+trinity trin6d/
+trinkets triNk6ts
+trinkl triNk@l
+trip trip
+tripoli trIpOl/
+tripped tript
+trips trips
+trisdale trizdAl
+trish triS
+trisha triS@
+tristan trist~
+triumph trI@mf
+triumphant trIumf~t
+triumphed trI@mft
+triumphs trI@mfs
+trivial triv/L
+triviality triv/al6d/
+troche trOC
+trod trod
+troia tr<@
+trojan trOj~
+trojillo trOhEyO
+troll trOl
+trolley trol/
+trolleys trol/z
+tronaas trOn)s
+trondheim trondhIm
+trondheim tronhAm
+tronnes tr{nz
+troops trUps
+trophy trOf/
+tropic trop6k
+tropical trop6kL
+tropicana trop6kon@
+trost tr)st
+trotochaud trOtOSO
+trotted trod6d
+trouble trubL
+troubled trubLd
+troublefield trub@lfEld
+troublemakers trubLmAkPz
+troubles trubLz
+troubleshoot trubLSUt
+troubleshooter trubLSUdP
+trounce tr?ns
+trouser tr?zP
+trousers tr?zPz
+trout tr?t
+troutdale tr?tdAl
+troutman tr?tm~
+troutville tr?tvil
+trove trOv
+trowel tr?L
+troxler tr)kslP
+troy tr<
+troyes tr<z
+troyes tr@w)
+truck truk
+truckdriver trukdr6vP
+truckee trukE
+trucks truks
+trudgeon truj@n
+true trU
+trueax trUO
+trueblood trUblud
+trueheart trUh)rt
+truehearted trUh)rd6d
+truelove trUwluv
+trueluck trUluk
+trueman trUm6n
+truesdale trUzdAl
+truesdell trUzdel
+truiolo trUEOlO
+truism trUiz}
+trujillo trUhElO
+truly trUl/
+truman trUm~
+trumbull trumbL
+trumpet trump6t
+truncated truNkAd6d
+truncation truNkAS~
+trunk truNk
+trunkful truNkfL
+trunks truNks
+trussville trusvil
+trust trust
+trusthouse trusth?s
+trusting trust6N
+trustless trustl6s
+trustworthiness trustwVD/n6s
+trustworthy trustwVD/
+truth trUT
+truthful trUTfL
+truths trUTs
+truxell truks6l
+truxton trukst~
+try trI
+trying trI6N
+tryouts trI?ts
+trythall trIth{l
+tseng CEN
+tseng seNg
+tseng tseN
+tshudy tSUdE
+tsuchiura tsUkEyUr@
+tsunami tsUnom/
+tualatin tU@lAt~
+tualatin tUal@t~
+tuan tw)n
+tub tub
+tubac tUbak
+tube tUb
+tubercular tUbVky6lP
+tuberculosis t6bVky6lOs6s
+tubes tUbz
+tubular tUby6lP
+tuck tuk
+tuckasegee tuk@s6jE
+tuckasegee tuk@sEg/
+tucson tUson
+tudor tUdP
+tuesday tUzd/
+tuesday tUzdA
+tuesdays tUzdAz
+tuft tuft
+tufted tuft6d
+tufts tufts
+tugboats tugbOts
+tuggles tug@lz
+tugman tugm~
+tuite twEt
+tuition tUiS~
+tukwila t6kwEl@
+tulelake tUl@lAk
+tulelake tUlAk
+tulips tUl@ps
+tull tul
+tullahoma tul@hOm@
+tulloch tul@k
+tullytown tul/t?n
+tulsa tuls@
+tumbled tumbLd
+tumbler tumblP
+tumbles tumbLz
+tumbleson tumb@ls6n
+tumbleston tumb@lst@n
+tumbleweed tumbLwEd
+tumbling tumbl6N
+tumwater tumw{dP
+tuna tUn@
+tune tUn
+tuned tUnd
+tuner tUnP
+tunes tUnz
+tunica tUn6k@
+tunkhannock t6Nkan@k
+tunnel tunL
+tunnels tunLz
+tunnelton tunLt~
+tunney tun/
+tupelo tUp@l]
+tupelo tUpel]
+tupperware tupPw,r
+turberville tPbPvil
+turbes tPbz
+turbos tVb]z
+turbulence tVby6l~s
+turbulent tVby6l~t
+turbulently tVby6l~tl/
+turcotte tPk)t
+turf tVf
+turin tUr~
+turin tqr6n
+turin tqrin
+turkey tVk/
+turkish tVk6S
+turlock tVlok
+turmoil tVm<l
+turn tVn
+turnabout tVn@b?t
+turnabouts tVn@b?ts
+turnaround tVn@r?nd
+turnarounds tVn@r?ndz
+turnbridge tVnbrij
+turnbull tVnbql
+turncoat tVnkOt
+turned tVnd
+turner tVnP
+turney tVn/
+turnout tVn?t
+turnouts tVn?ts
+turnover tVnOvP
+turnovers tVnOvPz
+turnpikes tVnpIks
+turnquist tVnkwist
+turns tVnz
+turnstile tVnstIl
+turntables tVntAbLz
+turpentine tVp~tIn
+turquoise tVkw<z
+turrell tVel
+turret tV6t
+turtle tVdL
+turtledove tVdLduv
+turtleneck tVdLnek
+turtletown tVdLt?n
+turtletown tVtLt?n
+tuscaloosa tusk@lUs@
+tuscarawas tusk@row@z
+tusk tusk
+tuskegee t@skEg/
+tusks tusks
+tustin tust~
+tuthill tut@l
+tutoni tUtOnE
+tutu tUdU
+tutuska tUtusk@
+tuxedo tuksEd]
+tuy tUE
+tv tEvE
+tweeze twEz
+tweezers twEzPz
+twelfth twelfT
+twelth twelT
+twelve twelv
+twelves twelvz
+twentieth 25x|2[(G
+twentieth twent/6T
+twentieths twent/6Ts
+twenty 25x|2[
+twenty 25x|[
+twice twIs
+twig twig
+twigged twigd
+twila twIl@
+twilight twIlIt
+twill twil
+twilligear twil6gEr
+twin twin
+twin_falls twinf{lz
+twine twIn
+twined twInd
+twins twinz
+twinsburg twinzbPg
+twinsburg twinzbVg
+twirler twVlP
+twist twist
+twisted twist6d
+twisting twist6N
+twitched twiCt
+two 2K
+twogood tUgqd
+twos tUz
+twosome tUs}
+ty tI
+tycoons tIkUnz
+tydeman tIdm@n
+tyisha tIES@
+tyler tIlP
+tylertown tIlPt?n
+tylwalk tilw{k
+tyndall tindL
+type tIp
+typecasting tIpkast6N
+typefaces tIpfAs6z
+types tIps
+typeset tIpset
+typewriter tIprIdP
+typhoid tIf<d
+typhoons tIfUnz
+typical tip6kL
+typically tip6kl/
+typified tip6fId
+typifies tip6fIz
+typographical tIp@graf6kL
+tyrannical t@ran6kL
+tyranny tEr~/
+tyre tIr
+tyres tIrz
+tyrone tIrOn
+tysinger tIsiNP
+tyson tIs~
+u yU
+ubl Ub@l
+uccello UCelO
+udall yUdL
+udder udP
+udell y6del
+udicious UdiSE@s
+ueki UekE
+ugalde Ug)ldE
+ugarte Ug)rtA
+uglier ugl/P
+ugly ugl/
+ugolini Ug@lEnE
+uh @
+uh u
+ukraine yUkrAn
+ul L
+uleman yUlm@n
+ulm ulm
+ulshafer UlSAfP
+ultimate ult6m6t
+ultimately ult6m6tl/
+ultra's ultr@z
+ultras ultr@z
+ultrasonic ultr@son6k
+ultrasound ultr@s?nd
+ultraviolet ultr@vIL6t
+ulysse yUlisE
+ulysses y@lis/z
+ulysses yUlisEs
+um um
+um }
+umatilla yUm@til@
+umbarger umb)rgP
+umber umbP
+umbilical @mbil6kL
+umbrella umbrel@
+umbrellas umbrel@z
+umpire umpIr
+umpires umpIrz
+umpteen umptEn
+umpteenth umptEnT
+un ~
+una Un@
+unable unAbL
+unacceptably un@ksept@bl/
+unaccompanied un@kump~/d
+unaccomplished un@kompl6St
+unaccustomed un@kust@md
+unadilla Un@dil@
+unadilla un@dil@
+unalaska un@lask@
+unallowable un@l?@bL
+unalterable un{ltP@bL
+unaltered un{ltPd
+unambiguous unambigyU@s
+unanimity yUn@nim6d/
+unanimous yUnan6m@s
+unanimously yUnan6m@sl/
+unannounced un@n?nst
+unanswerable unansP@bL
+unanticipated unantis6pAd6d
+unapproachable un@prOC@bL
+unaptness unaptn6s
+unargued un)rgyUd
+unarmed un)rmd
+unashamed un@SAmd
+unauthentic un{Tent6k
+unauthorized un{TPIzd
+unavailable un@vAl@bL
+unavoidable un@v<d@bL
+unawares un@w,rz
+unbalanced unbal~st
+unbearableness unbar@bLn6s
+unbeat unbEt
+unbeatable unbEd@bL
+unbeaten unbEd~
+unbeknownst unb6nOnst
+unbelievable unb6lEv@bL
+unbelt unbelt
+unbend unbend
+unbleached unblECt
+unblinking unbliNk6N
+unborn unb{rn
+unbound unb?nd
+unbounded unb?nd6d
+unbraided unbrAd6d
+unbroken unbrOk~
+unbuilt unbilt
+unburden unbVd~
+unbutton unbud~
+uncanny unkan/
+uncertain unsVd~
+unchain unCAn
+unchallenged unCal~jd
+unchanging unCAnj6N
+uncharted unC)rd6d
+unchartered unC)rdPd
+unchecked unCekt
+uncircumcised unsVk}sIzd
+unclassified unklas6fId
+uncle uNkL
+unclear unklEr
+unclench unklenC
+unclog unklog
+unclothing unklOD6N
+uncoiled unk<ld
+uncomfortable unkumftPbL
+uncomfortably unkumftPbl/
+uncommon unkom~
+uncommonness unkom~n6s
+uncompleted unk}plEd6d
+uncompromising unkompr@mIz6N
+unconvincing unk~vins6N
+uncounted unk?nt6d
+uncover unkuvP
+uncritical unkrid6kL
+uncritically unkrid6kl/
+uncrown unkr?n
+uncrowned unkr?nd
+uncurl unkVl
+undeniably und6nI@bl/
+under undP
+underachievers undPaC6vPz
+underage undPAj
+underbrush undPbruS
+undercarriage undPkar6j
+undercharge undPC)rj
+underclothing undPklOD6N
+undercurrent undPkV~t
+underdogs undPd{gz
+underestimating undPest6mAd6N
+underfoot undPfqt
+undergrowth undPgrOT
+underhand undPhand
+underhill undPhil
+undermined undPmInd
+undernourish undPnV6S
+undernourished undPnV6St
+underperformed undPpPf{rmd
+underprivileged undPpriv6l6jd
+underscore undPsk{r
+undershirts undPSVts
+understand undPstand
+understandably undPstand@bl/
+understanding undPstand6N
+understands undPstandz
+understood undPstqd
+understudy undPstud/
+undertake undPtAk
+undertaken undPtAk~
+undertakes undPtAks
+undertaking undPtAk6N
+undertones undPtOnz
+undervaluation undPvalyUAS~
+undervalued undPvalyUd
+underwithholding undPwiThOld6N
+underwood undPwqd
+underworld undPwVld
+underwriters undPrIdPz
+undeterred und6tVd
+undiscovered und6skuvPd
+undisturbed und6stVbd
+undo undU
+undoing undU6N
+undoubted und?d6d
+undoubtedly und?d6dl/
+undressed undrest
+unduly undUl/
+unearned unVnd
+unearthed unVTt
+uneasily unEz6l/
+uneasy unEz/
+uneducated unej6kAd6d
+unemployable un6mpl<@bL
+unemployment un6mpl<m~t
+unenlightened un~lId~d
+unenthusiastic un~TUz/ast6k
+unequal unEkwL
+unequaled unEkwLd
+unethical uneT6kL
+uneven unEv~
+unevenly unEv~l/
+uneventful un6ventfL
+unexpectedly un6kspekt6dl/
+unexplored un6kspl{rd
+unfailing unfAl6N
+unfaithfully unfATfL/
+unfavorable unfAvP@bL
+unfeeling unfEl6N
+unfenced unfenst
+unfinished unfin6St
+unfit unfit
+unflagging unflag6N
+unfolded unfOld6d
+unforeseeable unf{rsE@bL
+unforgettable unfPged@bL
+unforgivable unfPgiv@bL
+unfortunately unf{rC~6tl/
+unfortunates unf{rC~6ts
+unfounded unf?nd6d
+unfreeze unfrEz
+unfulfill unfLfil
+unfulfilled unfLfild
+unfunded unfund6d
+ungar ung)r
+unger uNgP
+ungerecht uNgPekt
+ungerleider uNgPlEdP
+unglesbee uNg@lzbE
+unglue unglU
+ungovernable unguvPn@bL
+ungrammatical ungr@mad6kL
+ungratefulness ungrAtfLn6s
+unguarded ung)rd6d
+unhampered unhampPd
+unhappiness unhap/n6s
+unhappy unhap/
+unharmed unh)rmd
+unheard unhVd
+unholy unhOl/
+unhook unhqk
+unhorsed unh{rst
+unhurried unhV/d
+uniacke yUnEak
+unidentified un6dent6fId
+uniform yUn6f{rm
+uniformly yUn6f{rml/
+uniforms yUn6f{rmz
+uninhabited un~hab6d6d
+uninhibited un~hib6d6d
+uninspired un~spIrd
+uninstructed un~strukt6d
+uninsurable uninSUr@bL
+uninsure uninSUr
+uninsured uninSUrd
+uninterrupted unint@rupt6d
+union yUny~
+uniondale yUny~dAl
+unionism yUny@niz}
+unionist yUny~6st
+unionists yUny~6sts
+unions yUny~z
+uniontown yUny~t?n
+unionville yUny~vil
+unique yUnEk
+uniqueness yUnEkn6s
+unit yUn6t
+united y6nId6d
+units yUn6ts
+unity yUn6d/
+unityville yUn6d/vil
+unityville yUn6t/vil
+universal yUn6vVsL
+universality y6nivPsal6d/
+universally yUn6vVs6l/
+universe yUn6vPs
+universities yUn6vVs6d/z
+university yUn6vVs6d/
+unjustified unjust6fId
+unkempt unkempt
+unkept unkept
+unknot unnot
+unknow unkn?
+unknowing unnO6N
+unknown unnOn
+unlabeled unlAbLd
+unlatch unlaC
+unlawful unl{fL
+unlawfully unl{fL/
+unleashed unlESt
+unleashes unlES6z
+unless ~les
+unlike unlIk
+unlikely unlIkl/
+unlimited unlim6d6d
+unlined unlInd
+unlisted unlist6d
+unloading unlOd6N
+unloads unlOdz
+unlock unlok
+unlucky unluk/
+unmade unmAd
+unmagnified unmagn6fId
+unmanageable unman6j@bL
+unmarked unm)rkt
+unmask unmask
+unmerciful unmVs6fL
+unmindful unmIndfL
+unmistakable unm6stAk@bL
+unmistakably unm6stAk@bl/
+unmixed unmikst
+unmolested unm@lest6d
+unmoving unmUv6N
+unmute unmyUt
+unnamed unnAmd
+unnatural unnaC@rL
+unnecessarily unnes6sar6l/
+unnerved unnVvd
+unnumbered unnumbPd
+unoccupied unoky6pId
+unopened unOp~d
+unpaid unpAd
+unparalleled unpar@leld
+unpin unpin
+unpleasant unplez~t
+unpleasantness unplez~tn6s
+unplug unplug
+unpopular unpopy6lP
+unpopularity unpopy6lar6d/
+unpracticed unprakt6st
+unprecedented unpres6d~t6d
+unpredictability unpr6dikt@bil6d/
+unpredictable unpr6dikt@bL
+unprejudiced unprej6d6st
+unpunctuality unpuNkCUal6d/
+unquestionable unkwesC~@bL
+unquestionably unkwesC~@bl/
+unravel unravL
+unraveled unravLd
+unraveling unrav6l6N
+unreadable unrEd@bL
+unreal unrEl
+unrealistic unrE@list6k
+unreasonable unrEz~@bL
+unreasoning unrEz~6N
+unrecognized unrek@gnIzd
+unreconstructed unrEk~strukt6d
+unrivaled unrIvLd
+unruffle unrufL
+unruffled unrufLd
+unruh unru
+unsafe unsAf
+unsaturated unsaC@rAd6d
+unsavory unsAv@r/
+unscathed unskADd
+unscrew unskrU
+unscrupulous unskrUpy6l@s
+unseen unsEn
+unshakable unSAk@bL
+unshaped unSApt
+unsharped unS)rpt
+unsharpened unS)rp~d
+unshipped unSipt
+unskillful unskilfL
+unsnap unsnap
+unsociable unsOS@bL
+unsolicited uns@lis6d6d
+unsound uns?nd
+unspecified unspes6fId
+unspectacular unspektaky6lP
+unspoken unspOk~
+unstable unstAbL
+unsteady unsted/
+unstressed unstrest
+unstuck unstuk
+unsuited unsUd6d
+unsure unSUr
+unsurmountable unsPm?nt@bL
+unsurpassed unsPpast
+untasted untAst6d
+untaxed untakst
+unthankful unTaNkfL
+unthinkable unTiNk@bL
+unthinking unTiNk6N
+unthinkingly unTiNk6Nl/
+unthoughtful unT{tfL
+unthrone unTrOn
+untidy untId/
+until ~til
+untimely untIml/
+untold untOld
+untouchable untuC@bL
+untrained untrAnd
+untraveled untravLd
+untuck untuk
+unused unyUzd
+unusual unyUZwL
+unusually unyUZU6l/
+unvoiced unv<st
+unwanted unwont6d
+unwashed unwoSt
+unwell unwel
+unwieldiness unwEld/n6s
+unwillingness unwiliNn6s
+unwise unwIz
+unworkable unwVk@bL
+unworthy unwVD/
+unwound unw?nd
+unwritten unrid~
+unzip unzip
+up @p
+up up
+upbeat upbEt
+upbraided upbrAd6d
+upbringing upbriN6N
+update updAt
+updating updAd6N
+updraft updraft
+upgrade upgrAd
+upham up@m
+uphaus uph{s
+upheavals uphEvLz
+upheld upheld
+uphoff up)f
+uphold uphOld
+upjohn upjon
+upland upl~d
+uplands upl~dz
+uplift uplift
+uplinger upliNgP
+upmanship upm~Sip
+upon @pon
+upper upP
+upperville upPvil
+uppsala @ps)l@
+uppsala ups@l@
+uppsala upsol@
+upright uprIt
+uproar upr{r
+uproarious upr{r/@s
+ups ups
+upset @pset
+upsetting @psed6N
+upshot upSot
+upstaged upstAjd
+upstairs upst,rz
+upstanding upstand6N
+upstart upst)rt
+upstarts upst)rts
+upstream upstrEm
+upsurge upsVj
+upswings upswiNz
+uptake uptAk
+upthrust upTrust
+upton upt~
+uptown upt?n
+upward upwPd
+upwards upwPdz
+ur P
+ur V
+urban Vb~
+urbana Pban@
+urbana Pbon@
+urbanized Vb@nIzd
+urchins VC~z
+uremia y@rEm/@
+urethane yUr6TAn
+urfa Vf@
+urfa qrf@
+urge Vj
+urged Vjd
+urgent Vj~t
+urgently Vj~tl/
+urges Vj6z
+urging Vj6N
+urgings Vj6Nz
+uriarte yUrE)rtA
+uribe yUrEbA
+urquidi PkEdE
+urquilla PkEl@
+urquiza PkEz@
+urso Vs]
+ursula Vs6l@
+us us
+us yUes
+usage yUs6j
+usages yUs6j6z
+use yUs
+use yUz
+used yUst
+used yUzd
+useful yUsfL
+usefulness yUsfLn6s
+useless yUsl6s
+uselton yUz6lt6n
+user yUzP
+users yUzPz
+uses yUz6z
+ushering uSP6N
+using yUz6N
+usual yUZwL
+usually yUZU6l/
+utah yUto
+utensil yUtensL
+utensils yUtensLz
+utica yUd6k@
+utica yUt6k@
+utilized yUd6lIzd
+utmost utmOst
+utopians y6tOp/~z
+utter udP
+uttered udPd
+utterly udPl/
+uvalde yUvLd
+uy UE
+v v
+v vE
+vacant vAk~t
+vacation vAkAS~
+vacationed vAkAS~d
+vacations vAkAS~z
+vacaville vok@vil
+vaccinated vaks6nAd6d
+vaccinations vaks6nAS~z
+vaccines vaksEnz
+vache vaS
+vacherie vaC@r/
+vacherie vaCP/
+vacuum vakyUm
+vader vAdP
+vagt v)t
+vague vAg
+vaguely vAgl/
+vain vAn
+val_verde valvVd/
+valarie val@rE
+valdosta valdost@
+vale vAl
+valenstein val@nstIn
+valenti v@lent/
+valentin val6ntEn
+valentine val6ntIn
+valentine val~tIn
+valentines val~tInz
+valentyn val@ntIn
+valeri v@ler/
+valerie val@r/
+valerie valP/
+valhalla valhal@
+valiant valy~t
+validated val6dAd6d
+validity v@lid6d/
+valladares val@der6s
+vallance val@ns
+valle valE
+vallecito vIy@sEt]
+vallecito val6sEd]
+vallee valE
+vallejo v)yAhO
+vallejos v@lAhOs
+valles vIez
+valley val/
+valleys val/z
+vallonia v@lOn/@
+vallonia valOny@
+valmeyer valmIP
+valorie valPE
+valparaiso v)lp)r)Es]
+valparaiso valp@rAs]
+valparaiso valp@rIz]
+valuable valy@bL
+valuables valy@bLz
+valuations valyUAS~z
+value valyU
+valued valyUd
+valueless valyUl6s
+values valyUz
+valve valv
+valverde valvArdA
+valves valvz
+vamp vamp
+vampire vampIr
+van van
+vanamburgh van@mbPg
+vanbenthuyse vanbenTyUs
+vanburg vanbVg
+vance vans
+vanceboro vansbP]
+vanceboro vansbV]
+vanceburg vansbVg
+vancleave vanklEv
+vanclief vanklEf
+vanco vaNk]
+vancouver vankUvP
+vandalia vandAl/@
+vandalism vand@liz}
+vandawalker vant@w{kP
+vandenacre vand@nAkP
+vandenburg vand~bVg
+vander vandP
+vanderbilt vandPbilt
+vanderburg vandPbVg
+vanderburgh vandPbVg
+vanderbush vandPbqS
+vandercook vandPkqk
+vandergiessen vandPgEs@n
+vanderheide vandPhId
+vanderheyden vandPhAt6n
+vanderschaege vandPSAg
+vanderslice vandPslIs
+vandertuig vandPtUig
+vanderwege vandPwEg
+vanderwoude vandPwUd
+vandeweert vand@wPt
+vandunk vanduNk
+vanduynhoven vandUnhOv@n
+vane vAn
+vanepps vaneps
+vanesa v@nes@
+vanessa v@nes@
+vanetten vanet~
+vangelder vangeldP
+vangemert vaNmPt
+vangieson vanjEs@n
+vangilder vangildP
+vangorder vang{rtP
+vangrouw vangrU
+vanguard vang)rd
+vanguard's vang)rdz
+vanguards vang)rdz
+vangyi vaNyE
+vanhamme vanham
+vanhyning vanhIniN
+vania v)ny@
+vanilla v@nil@
+vanished van6St
+vanishing van6S6N
+vanlaar vanl)r
+vanlinden vanlint6n
+vanmarter vanm)rtP
+vanmatre vanmatP
+vanmeter vanmEtP
+vanmetre vanmEtP
+vannesa v@nes@
+vanochten van)kt6n
+vanorsdale vanPzdAl
+vanpatten vanpad~
+vanpelt vanpelt
+vanquish vaNkw6S
+vanquished vaNkw6St
+vanschoiack vanS<ak
+vanschuyver vanSwEvP
+vanscoik vansk<k
+vanslyke vanslIk
+vantuyl vantU@l
+vanwagner vanw)gnP
+vanwingerden vanwiNgPd6n
+vanwyck vanwik
+vanzandt vanzant
+vapor vApP
+vaporization vApP6zAS~
+vaquera v@kAr@
+vaquero v@kArO
+varda v)rd@
+vardeman v)rdm@n
+vargis v)rgis
+variability v,r/@bil6d/
+variable v,r/@bL
+variance v,r/~s
+variation v,r/AS~
+variations v,r/AS~z
+varied var/d
+varies v,r/z
+varieties v@rI6d/z
+variety v@rI6d/
+varina v@rEn@
+various v,r/@s
+varns v)rnz
+vartanyan v)rtany@n
+varughese varUgEz
+vary ver/
+varysburg v,r/zbVg
+varysburg var/zbVg
+vascular vasky6lP
+vase vAs
+vases vAs6z
+vasques vaskez
+vast vast
+vastly vastl/
+vastness vastn6s
+vat vat
+vattes vats
+vaucluse v{klUz
+vaudeville v{dvil
+vaughan v{n
+vaughn v{n
+vaughns v{nz
+vault v{lt
+vaulted v{lt6d
+vaulting v{lt6N
+vauxhall voksh{l
+vauxhall v{ks{l
+vavricek vavriCek
+vea vE@
+veal vEl
+veaux vO
+vector vektP
+veda vAt@
+vedder vedP
+veer vEr
+veered vErd
+vega vAg@
+vegas vAg6s
+vegas vAg@s
+vegetable vejt@bL
+vegetables vejt@bLz
+vegetarianism vej6t,r/@niz}
+vegetation vej6tAS~
+vehicle vE6kL
+vehicle vEhikL
+vehicle's vEikLz
+vehicles vEikLz
+veigel vEg@l
+veil vAl
+vein vAn
+vejarano vAh@r)nO
+velarde v@l)rdA
+velazques v@laskez
+velcro velkr]
+velda veld@
+veles veles
+velocity v6los6d/
+veltre veltr@
+velverton velvPt@n
+velzeboer veltzbOP
+venable ven@b@l
+venango v6naNg]
+venango v@nang]
+vendors vendPz
+vengeance venj~s
+vengeful venjfL
+venice ven6s
+vennard ven)rd
+vent vent
+ventilate vent6lAt
+ventilation vent6lAS~
+ventnor ventnP
+ventre ventr@
+ventress ventr6s
+ventress ventres
+ventured venCPd
+ventures venCPz
+venus vEn@s
+vera vir@
+verandas v@rand@z
+verbal vVbL
+verbalize vVb@lIz
+verbose vPbOs
+verbs vVbz
+verdant vVd~t
+verde vArdA
+verdes v,rdAz
+verdict vVd6kt
+verdicts vVd6kts
+verdie vVd/
+verdigre vVd6jP
+verdiguel vPdigwel
+verdon vVd~
+vergas vVg@z
+verge vVj
+vergennes vVjenz
+vergne vVn
+verhaag vPh)g
+verhines vPInz
+verify ver6fI
+verkin vVk~
+verkin verk6n
+vermilion vPmily~
+vermilyea vPmilyE@
+vermont vPmont
+vermont vPmont
+vermont's vPmonts
+vermonts vPmonts
+vermouth vPmUT
+vern vVn
+verne vVn
+vernon vVn~
+vernon's vVn~z
+vernonburg vVn~bVg
+vernons vVn~z
+vero vEr]
+verona v@rOn@
+veronica v@ron6k@
+veronika v@r)n@k@
+verrone vPOn
+versace vPs)CE
+versailles vPsAlz
+versailles vVsI
+versailles vcrsI
+versatile vVs@dL
+versatility vVs@til6d/
+verse vVs
+versions vVZ~z
+vertebral vVd6brL
+vertical vVd6kL
+veruca v@rUk@
+very ver/
+vessel vesL
+vest vest
+vesta vest@
+vestaburg vest@bVg
+vet vet
+veteran ved@r~
+veteran's ved@r~z
+veterans ved@r~z
+vetere v@tArE
+veterinarian ved@r6n,r/~
+vetter vedP
+veve vEvE
+via vE@
+viability vI@bil6d/
+viable vI@bL
+vibrancy vIbr~s/
+vibrant vIbr~t
+vibrate vIbrAt
+vicars vikPz
+vice vIs
+vici vis/
+vicic viCiC
+vickery vikP/
+vickie vik/
+vicksburg viksbPg
+vicksburg viksbVg
+vicky vik/
+victim vikt}
+victimized vikt6mIzd
+victims vikt}z
+victor viktP
+victoria v6kt{r/@
+victorian v6kt{r/~
+victorious v6kt{r/@s
+victorville viktPvil
+victory vikt@r/
+vidal vid)l
+vidalia v6dAl/@
+vidalia v@dAly@
+video vid/]
+videos vid/]z
+videotaped vid/]tApt
+videotapes vid/]tAps
+vides vEd6s
+vidette v6det
+vidler vidlP
+viedma vEdm@
+viedma vyAdm)
+viejo v/Ah]
+viener vEnP
+vienna v/en@
+vietnam vEetnom
+vietnam's vEetnomz
+vietnamese v/etn@mEz
+vietnams vEetnomz
+vieux vyU
+view vyU
+viewer vyUP
+viewers vyUPz
+viewership vyUPSip
+viewing vyU6N
+viewless vyUl6s
+viewpoint vyUp<nt
+viewpoints vyUp<nts
+views vyUz
+viggiano vijE)nO
+vigilance vij6l~s
+vignaux viny{
+vigne vEny@
+vigneault viNnyO
+vigoren vig{r6n
+vigorous vig@r@s
+vigorously vig@r@sl/
+vigue vEg
+viking vIk6N
+vilar vil)r
+viles vIlz
+viligance vil6j~s
+villa vil@
+villafana vil@fan@
+village vil6j
+villains vil~z
+villalouos vil@lUOz
+villamayor vil@mAr
+villanova vil@nOv@
+villaplana vil@pl)n@
+villarreal vil@rA)l
+villasenor vil@siny{r
+villaverde vil@vArdA
+villeneuve vil@nyUv
+vilna viln@
+vilnius viln/@s
+vilonia v6lOn/@
+vilonia v6lOny@
+vina vEn@
+vinalhaven vInLhAv~
+vincent's vins~ts
+vincentown vins~t?n
+vincents vins~ts
+vine vIn
+vinegars vin6gPz
+vinegrowing vin6gr]6N
+vineland vInland
+vineyard vinyPd
+vinger viNP
+vining vIn6N
+vinita v6nEd@
+vintondale vint~dAl
+vinyard viny@rd
+violated vI@lAd6d
+violates vI@lAts
+violence vIL~s
+violent vIL~t
+violently vIL~tl/
+violet vIL6t
+violets vIL6ts
+violin vI@lin
+vipe vIp
+vires vIrz
+virgil vVjL
+virgilina vVj6lEn@
+virginia vPjiny@
+virginity vPjin6d/
+virgo vVg]
+viroqua v@rokw@
+virtual vVCwL
+virtually vVCU6l/
+virtue vVCU
+virtues vVCUz
+virtuous vVCU@s
+virulently vEr6l~tl/
+virus vIr@s
+visa vEz@
+visage viz6j
+visalia v6sAl/@
+viscar visk)r
+viscosity v6skos6d/
+viscount vIk?nt
+visible viz@bl
+visibly viz6bl/
+vision viZ~
+visit viz6t
+visitacion vizitAS@n
+visitation vis6tAS~
+visited viz6d6d
+visiting viz6d6N
+visitors viz6dPz
+visits viz6ts
+vista vist@
+visual viZUL
+visualize viZw@lIz
+visually viZU6l/
+vital vIdL
+vitale v@t)l
+vitaliy vitalE
+vitamin vId@m~
+vitamins vId@m~z
+vitaniemi vitanEyemE
+vitellaro vit6l)rO
+vitez vEt6z
+vitry vitr/
+viva vEv@
+vivan vivan
+vivas vEv@s
+vivian viv/~
+vivid viv6d
+vividly viv6dl/
+vividness viv6dn6s
+vivienne vivEen
+vizuete vizwAtA
+vlach vl)k
+vlchek v@lCek
+vljeric v@ljP6k
+vocabulary v@kaby6ler/
+vocational v]kAS~L
+vodka vodk@
+vodkas vodk@z
+voegele vOg@lE
+vogel vOg@l
+vogelgesang vOgelg@saN
+vogelpohl vOg@lpOl
+vogelsang vOg@lsaN
+vogelzang vOg@lzaN
+vogenthaler vOg@nT)lP
+voges vOgz
+vogl vOg@l
+vogt v{t
+vogue vOg
+voice v<s
+voiced v<st
+voiceless v<sl6s
+voicemail v<smAl
+voices v<s6z
+voiceworks v<swVks
+void v<d
+voided v<d6d
+voiding v<d6N
+voigt v<t
+voigtlander v<tlandP
+voiles v<lz
+volatility vol@til6d/
+volcanic v{lkan6k
+volcano volkAn]
+volesky vOlskE
+volga volg@
+vollette v)let
+volley vol/
+volleyball vol/b{l
+vollmering v)lm@riN
+volpicelli vOlp6CelE
+volpone vOlpOn
+volta vOlt@
+voltage vOlt6j
+voltaire vOltP
+voltmeter vOltmEdP
+volume voly@m
+volume volyUm
+volume v{ly@m
+volumes volyUmz
+voluntarily vol~tar6l/
+voluntary vol~ter/
+volunteer vol~tEr
+volunteered vol~tErd
+volunteers vol~tErz
+voluntown vol~t?n
+voluptuous v@lupCU@s
+vonbank v)nbaNk
+vonbargen v)nb)rgin
+vonderhaar v)ndPh)r
+vonfelden v{nfeld@n
+vongvivath v)NvivAT
+vonholt v{nhOlt
+vonseeger v)nsEgP
+voodoo vUdU
+voracek vOr@Cek
+vorhies v{rEz
+votaua vOt?w@
+vote vOt
+voted vOd6d
+voters vOdPz
+votes vOts
+votsmier v)tsmIP
+vouch v?C
+vouchers v?CPz
+vow v?
+vowed v?d
+vowel v?L
+vowing v?6N
+vowles vOlz
+vows v?z
+voyage v<@j
+voyagers v<6jPz
+voyages v<6j6z
+voyles v<lz
+vrbas vPb@s
+vukcevic vuks@viC
+vulgar vulgP
+vulgarity vLgar6d/
+vulgarization vulgP6zAS~
+vulnerable vulnP@bL
+vultures vulCPz
+w dubLyU
+w w
+waack w)k
+waag w)g
+waananen w)n@n6n
+wabash wobaS
+wabbaseka wob@sEk@
+waccamaw wok@m{
+wachtel w)ktel
+wachtler w)ktlP
+wacker wakP
+wackerbarth wakPb)rT
+wacky wak/
+waco wAk]
+waconda w@kond@
+wadded wod6d
+waddell wodel
+wade wAd
+wadela w@del@
+wademan wAdm@n
+wading wAd6N
+wadley wodl/
+wadsworth wodzwVT
+waegner wagnP
+waffles wofLz
+wage wAj
+waged wAjd
+wagemann wAjm@n
+wagenaar wAjn)r
+wagenblast w)g@nblast
+wagener wagnP
+wagenheim wag@nhIm
+wagenknecht wag@nnekt
+wagered wAjPd
+wages wAj6z
+wageworker wAjwVkP
+waggoner wag@nP
+wagner wagnP
+wagon wag~
+wagons wag~z
+wagram wagram
+wagram wagr}
+wags wagz
+wahid w)hEd
+wahoske w@h)skE
+waianae wAnA
+waianae wA~/
+waianae wInA
+waidelich wAdlik
+wailuku w6lUkU
+wailuku wAlUkU
+waimanalo w6manL]
+waimanalo wAman@l]
+wainkrantz wAnkrants
+wainscot wAnsk6t
+wainwright wAnrIt
+wair wAr
+waisanen wIs@n6n
+wait wAt
+waite wAt
+waited wAd6d
+waiter wAdP
+waiters wAdPz
+waites wAts
+waiting wAd6N
+waits wAts
+waitsburg wAtsbPg
+waitsburg wAtsbVg
+waitsfield wAtsfEld
+waivers wAvPz
+wakarusa wak@rUs@
+wake wAk
+wakefield wAkfEld
+wakeful wAkfL
+wakeham wAkh@m
+wakeland wAkl@nd
+wakeley wAklE
+wakeling wAkliN
+wakely wAklE
+wakenda w@kend@
+wakenight wAknIt
+waking wAk6N
+wakulla w@kUl@
+wakulla w@kul@
+walawender w)l@wendP
+walcott w{lk6t
+wald w{ld
+walden w{ld~
+waldoch w{ld)k
+waldport w{ldp{rt
+waldvogel w{ldvOg@l
+waldwick w{ldwik
+walensburg wAl~zbVg
+wales wAlz
+walford w{lfPd
+walgreen w{lgrEn
+walk w{k
+walked w{kt
+walken w{k6n
+walker w{kP
+walkers w{kPz
+walkersville w{kPzvil
+walkertown w{kPt?n
+walkerville w{kPvil
+walking w{k6N
+walkling w{kliN
+walkman w{kman
+walkouts w{k?ts
+walkup w{lk@p
+wall w{l
+walla w{l@
+walla_walla w)l@w)l@
+wallace w{l6s
+wallaert w{l)rt
+walland w{land
+walland w{l~d
+walled w{ld
+walledlake w{l6dlAk
+wallingford wol6NfPd
+wallingford w{liNfPd
+wallington w{liNt~
+wallins wol~z
+wallpapered w{lpApPd
+walls w{lz
+wallschlaeger w{lSlAgP
+wallwork w{lwPk
+wally's w{l/z
+wallys w{l/z
+walmart w{lmPt
+walnut w{lnut
+walnutport w{ln@tp{rt
+walnuts w{lnuts
+walpole w{lpOl
+walraven w{lrAv6n
+walsenburg w{ls~bVg
+walsh w{lS
+walsh's w{lS6z
+walshs w{lS6z
+walsingham wols6Nh}
+walsingham w{lsiNham
+walstonburg w{lst~bVg
+walt w{lt
+walter w{ltP
+walterboro w{ltPbV]
+waltham w{lTam
+waltham w{lT}
+walthill w{lthil
+walton w{lt~
+waltzing w{lts6N
+walvatne w{lvatnE
+wamac wamak
+wampler w)mplP
+wan w)n
+wanamaker w)n@mAkP
+wanamingo won@miNg]
+wanaque w@nak
+wanchese wanCEz
+wanchese wanCes
+wanchese w~CEz
+wander wondP
+wandered wondPd
+wandering wondP6N
+wanders wondPz
+waneta w)nAt@
+waneta w@ned@
+wanette w@net
+wanette wonet
+wang waN
+wang's waNz
+wangs waNz
+waninger w)niNgP
+wanna w)n@
+wannaska w@nask@
+wannaska wonask@
+want wont
+wanted wont6d
+wants wonts
+wapanucka wap~uk@
+waples wAp@lz
+wapwallopen w@pwal@p~
+wapwallopen w{pw{l@p~
+war w{r
+warba w{rb@
+warble w{rbL
+warbler w{rblP
+warboys w{rb<z
+ward w)rd
+ward w{rd
+wardell w{rdel
+warden w{rd~
+wardley w{rdl/
+wardrobe w{rdrOb
+wardroom w{rdrUm
+wardsboro w{rdzbP]
+wardsboro w{rdzbV]
+wardsville w{rdzvil
+wareham w,rham
+wareheim wArhIm
+warehouse w,rh?s
+wareing wAriN
+wares wArz
+waretown w,rt?n
+warfare w{rf,r
+warlike w{rlIk
+warlock w{rlok
+warlords w{rl{rdz
+warm w{rm
+warmer w{rmP
+warming w{rm6N
+warminster w{rminstP
+warmish w{rm6S
+warmly w{rml/
+warmongering w{rmoNgP6N
+warmth w{rmT
+warn w{rn
+warncke w{rNkE
+warneka w{rnek@
+warner w{rnP
+warners w{rnPz
+warnerville w{rnPvil
+warningly w{rn6Nl/
+warnings w{rn6Nz
+warnock w{rnok
+warp w{rp
+warped w{rpt
+warping w{rp6N
+warplanes w{rplAnz
+warps w{rps
+warrant w{r~t
+warranted w{r~t6d
+warrants w{r~ts
+warranty w{r~t/
+warren w{r~
+warrendale wor~dAl
+warrensburg wor~zbVg
+warrensburg w{r~zbVg
+warrensville w{r~zvil
+warrenton w{r~t~
+warrenville w{r~vil
+warrick w{r6k
+warrington w{r6Nt~
+warrington w{riNt~
+warrior w{r/P
+warriors w{r/Pz
+wars w{rz
+warsaw w{rs{
+warsme w{rzm@
+warstler w{rslP
+warthog w{rth{g
+warwick wor6k
+warwick w{r6k
+warwick w{rw6k
+wary wer/
+was wuz
+wasco wosk]
+wash woS
+washbowl woSbOl
+washburn woSbVn
+washed woSt
+washing woS6N
+washington woS6Nt~
+washougal w@SUgL
+washouts woS?ts
+washroom woSrUm
+washstand woSstand
+washtub woStub
+washtucna w6Stukn@
+washwoman woSwqm~
+wasicek wasECek
+wasington wosiNt~
+wasn't wuz~t
+wasnt wuz~t
+wasp wosp
+wasps wosps
+wasserman wosPm~
+waste wAst
+wasteland wAstland
+wastepaper wAstpApP
+wastepile wost6pIl
+watanabe w)tun)bE
+watauga w@t{g@
+watch woC
+watchband woCband
+watchcase woCkAs
+watchdogs woCd{gz
+watched woCt
+watches woC6z
+watchful woCfL
+watchfully woCfL/
+watching woC6N
+watchless woCl6s
+watchmaker woCmAkP
+watchtower woCt?P
+water w{dP
+waterboro w{tPbV]
+waterbury w{dPber/
+waterbury w{tPbP/
+watered w{dPd
+waterfall w{dPf{l
+waterfalls w{dPf{lz
+waterford w{dPfPd
+waterfowl w{dPf?l
+watergate w{dPgAt
+waterhouse w{tPh?s
+waterlog w{dPl{g
+waterlogged w{dPl{gd
+waterman w)tPm6n
+watermelons w{dPmel~z
+watermill w{dPmil
+waterproof w{dPprUf
+waters w{dPz
+watershed w{dPSed
+watersmeet w{tPzmEt
+waterton w{dPt~
+waterton w{tPt~
+watertown w{dPt?n
+watertown w{tPt?n
+waterville w{dPvil
+waterville w{tPvil
+waterworks w{dPwVks
+waterworth w{dPwVT
+watkins wotk~z
+watkinsville wotk~zvil
+watne w)tn@
+watonga w@toNg@
+watseka w6tsEk@
+watseka watsEk@
+watseka watsek@
+watson wots~
+watsontown wots~t?n
+watsonville wots~vil
+wattles wodLz
+wattsburg wotsbPg
+wattsburg wotsbVg
+waubay wo6bA
+waubun wo6b~
+waubun w{b~
+wauch w)C
+wauchula w)CUl@
+wauchula woUC6l@
+waucoma w{kOm@
+wauconda wo6kond@
+wauconda w{kond@
+wauford w)fPd
+waugh w)
+waugh w{
+waughtal w)t@l
+waughtel w)tel
+waukesha wo6keS@
+waukesha w{k@S@
+waukomis w)kOm6s
+waukomis woUk@m6s
+waukomis w{k@m6s
+wauseon woUs/~
+wauseon wos/on
+wauseon wosEon
+wauters w)tPz
+wautoma w)tOm@
+wautoma wo6tOm@
+wauwatosa woUw@tOs@
+wave wAv
+waved wAvd
+waveland wAvland
+wavelength wAvleNT
+wavelengths wAvleNTs
+wavered wAvPd
+waverley wAvPl/
+waverly wAvPl/
+waverly wAvPlE
+waves wAvz
+wavy wAv/
+wax waks
+waxed wakst
+waxing waks6N
+waxy waks/
+way wA
+waybill wAbil
+waycaster wAkastP
+waycross wAkr{s
+wayfaring wAf,r6N
+waylaid wAlAd
+wayland wAland
+wayland wAl~d
+waymart wAm)rt
+waymouth wAm?T
+wayne wAn
+waynesboro wAnzbV]
+waynesboro wAnzbur]
+waynesburg wAnzbPg
+waynesburg wAnzbVg
+waynesville wAnzvil
+waypoint wAp<nt
+ways wAz
+wayside wAsId
+wayzata wAzod@
+we wE
+we'd wEd
+we'll wEl
+we're wEr
+we've wEv
+weagel wEg@l
+weak wEk
+weaker wEkP
+weakhanded wEkhand6d
+weakly wEkl/
+weakness wEkn6s
+weaknesses wEkn6s6z
+wealth welT
+wealths welTs
+wealthy welT/
+weapon wep~
+weaponry wep~r/
+wear w,r
+weare w,r
+weare wEr
+wearing w,r6N
+wears w,rz
+weary wEr/
+weaseling wEz6l6N
+weather weDP
+weatherall weDP{l
+weatherby weDPbE
+weatherford weDPfPd
+weatherglass weDPglas
+weatherhead weDPhed
+weatherington weDPiNt@n
+weatherly weDPl/
+weatherman weDPman
+weatherproof weDPprUf
+weatherproofing weDPprUf6N
+weathers weDPz
+weathersbee weDPzbE
+weathersby weDPzbE
+weatherspoon weDPspUn
+weatherstone weDPstOn
+weatherstrip weDPstrip
+weathertight weDPtIt
+weave wEv
+weaver wEvP
+weaver's wEvPz
+weavers wEvPz
+weaverville wEvPvil
+weaving wEv6N
+web web
+webb web
+webbed webd
+webber webP
+webber's webPz
+webbers webPz
+webberville webPvil
+webbing web6N
+webbville webvil
+weber webP
+webfoot webfqt
+webre webP
+webs webz
+webster webstP
+wechselblatt weks@lblat
+wed wEd
+wedded wed6d
+wedding wed6N
+weddington wediNt~
+wedgestone wejstOn
+wedgwood wejwqd
+wednesday wenzd/
+wednesday wenzdA
+wednesdays wenzdAz
+wedowee wed@wE
+wedowee wed]E
+weed wEd
+weeds wEdz
+weedsport wEdzp{rt
+week wEk
+weekday wEkdA
+weekend wEkend
+weekly wEkl/
+weeks wEks
+weeping wEp6N
+weeze wEz
+wegner wegnP
+wehausen wAh?z@n
+weichbrodt wIkbrOt
+weidemann wIdmin
+weidner wIdnP
+weigel wIg@l
+weigelt wIg@lt
+weight wAt
+weightless wAtl6s
+weightlifting wAtlift6N
+weil wIl
+weiler wIlP
+weimer wImP
+weiner wEnP
+weinert wInPt
+weinrib wInrib
+weinrich wInrik
+weinzetl wInzet@l
+weinzinger wInz6NP
+weirsdale wErzdAl
+weis wIs
+weiser wIsP
+weisgerber wIzgPbP
+weismiller wIsmilP
+weiss wIs
+weissport wIsp{rt
+welaka w6lok@
+welch welC
+welcome welk}
+welcomed welk@md
+welcomes welk}z
+welcoming welk@m6N
+weldon weld~
+welds weldz
+weldwood weldwqd
+welfare welf,r
+well wEl
+well wel
+wellersburg welPzbVg
+welles welz
+wellesley welzl/
+wellfleet welflEt
+wellington weliNt~
+wellman welm~
+wells welz
+wellsboro welzbP]
+wellsboro welzbV]
+wellsburg welzbPg
+wellsburg welzbVg
+wellspring welspriN
+wellsville welzvil
+welsh welS
+welshman welSm~
+welshwoman welSwqm~
+wempe wempE
+wenatchee wen@CE
+wende wendE
+wendover wendOvP
+wendy wend/
+wengel weNg@l
+wenger weNP
+wengerd wengPd
+weniger wen6gP
+wenner wenP
+went went
+wentworth wentwVT
+wentzville wentsvil
+wenzinger wenziNP
+wept wept
+were wEr
+were wV
+weren't wVnt
+werent wVnt
+werries werEz
+wert wVt
+wertheimer wPTImP
+wertz wVts
+wes wes
+wesley wesl/
+wessington wesiNt~
+wessling wesl6N
+west west
+west_virginia westvPjiny@
+westbend westbend
+westbend westb~d
+westberry westber/
+westbloomfield westblUmfEld
+westboro westbP@
+westboro westbV]
+westborough westbV]
+westbound westb?nd
+westbridge westbrij
+westbrook westbrqk
+westbrooks westbrqks
+westbury westbP/
+westbury westber/
+westchester wesCestP
+westchester's wesCestPz
+westchesters wesCestPz
+westcliffe westkl6f
+westcliffe westklif
+westcott westk)t
+westerlo w6stVl]
+westerlo westPl]
+westerly westPl/
+western westPn
+westerners westPnPz
+westernization westPn6zAS~
+westfall westf{l
+westfield westfEld
+westgate westgAt
+westhouse westh?s
+westin west~
+westlake westlAk
+westland westland
+westland westl~d
+westler westlP
+westminister westm~6stP
+westminster westminstP
+westminster westm~stP
+westmont westmont
+westmoreland westmPl~d
+weston west~
+westport westp{rt
+westpride westprId
+westre westr@
+westridge westrij
+westtown westt?n
+westville westvil
+westwall westw{l
+westward westwPd
+westwego w6stwAg]
+westwego wcstwEg]
+westwood westwqd
+westwood's westwqdz
+westwoods westwqdz
+westworld westwVld
+wet wet
+wethje weTjE
+wetmore wetm{r
+wetproof wetprUf
+wettach wet@k
+wettest wed6st
+wetumka w@tumk@
+wetzstein wetstIn
+weve wEv
+wewahitchka wU@hiCk@
+wewoka wUOk@
+wexler wekslP
+weyauwega wA6wAg@
+weymouth wAm@T
+whacked wakt
+whaite wAt
+whal w)l
+whale wAl
+whaleboat wAlbOt
+whaler wAlP
+whalers wAlPz
+whales wAlz
+whan w)n
+whapham wap@m
+wharehouse w,rh?s
+wharf w{rf
+wharton w{rt~
+wharves w)rvz
+what w@t
+what wut
+what're wudP
+what's wuts
+whatever wudevP
+whatley w)tlE
+whatre wudP
+whats wuts
+whatsoever wuts]evP
+wheadon wEd@n
+wheat wEt
+wheatcroft wEtkr{ft
+wheatley wEtlE
+wheatly wEtlE
+wheaton wEd~
+wheatstone wEtstOn
+wheatstones wEtstOnz
+wheel wEl
+wheelbarrows wElbar]z
+wheelbase wElbAs
+wheelchair wElC,r
+wheelchairs wElC,rz
+wheeled wEld
+wheelhouse wElh?s
+wheeling wEl6N
+wheelon wEl~
+wheels wElz
+wheelwriter wElrIdP
+wheeze wEz
+when wen
+whenever wenevP
+where w,r
+where're warP
+wherere warP
+wherever wArevP
+whether weDP
+whetstone wetstOn
+which wiC
+whichever wiCevP
+whiff wif
+whigham wI}
+while wIl
+whim wim
+whimsically wims6kl/
+whining wIn6N
+whinney win/
+whiplashes wiplaS6z
+whipped wipt
+whipple's wipplEz
+whipples wipplEz
+whipsawed wips{d
+whirl wVl
+whirled wVld
+whirlpools wVlpUlz
+whirlwind wVlwind
+whirring wV6N
+whisked wiskt
+whiskey wisk/
+whisky wisk/
+whisper wispP
+whispered wispPd
+whispers wispPz
+whist wist
+whistle wisL
+whistlehunt wis@lhunt
+whistler wislP
+whistling wisl6N
+whitacre witAkP
+whitaker wit@kP
+white wIt
+whitebeard wItbErd
+whitecap wItkap
+whitefield wItfEld
+whitefish wItfiS
+whitehall wIth{l
+whitehorn wIth{rn
+whitehorse wIth{rs
+whiteland wItl~d
+whitelaw wItl{
+whiteleather wItleDP
+whiteley wItlE
+whitelightnin wItlItn6n
+whitelow wItlO
+whiteman wItm6n
+whitemarsh wItm)rS
+whitemore wItmOr
+whitenack wItnak
+whitener wId~nP
+whitesboro wItsbP]
+whitesboro wItsbV]
+whiteside wItsId
+whitesides wItsIdz
+whitesinger wItsiNP
+whitesman wItsm~
+whitestown wItst?n
+whitesville wItsvil
+whitethorn wItT{rn
+whitetop wIttop
+whitewashed wItwoSt
+whitewater wItw)tP
+whitewright wItrIt
+whither wiDP
+whiting wId6N
+whitlach witl)k
+whitney witn/
+whittinghill witiNhil
+whittington witiNt6n
+whitworth witwVT
+whizzing wiz6N
+who hU
+who'd hUd
+who'll hUL
+who's hUz
+whod hUd
+whoever hUevP
+whole hOl
+wholesale hOlsAl
+wholesome hOls}
+wholesomeness hOls@mn6s
+wholey hOlE
+wholl hUL
+wholly hOlE
+whom hUm
+whomever hUmevP
+whoops wqps
+whoppers wopPz
+whos hUz
+whose hUz
+whosoever hUs]evP
+why wI
+whyman wIm@n
+whyte wIt
+wiacek wI@Cek
+wiatr wIatr@
+wibaux w6bO
+wibberley wibPlE
+wichita wiC6to
+wick wik
+wickedly wik6dl/
+wickenburg wik~bVg
+wickersham wikPS}
+wickerwork wikPwVk
+wickes wiks
+wicket wik6t
+wickliffe wikl@f
+wicks wiks
+wickware wikw,r
+wickwire wikwIr
+wicomico w6kom6k]
+widdoes widOz
+wide wId
+widely wIdl/
+wideman wIdm6n
+widened wId~d
+wider wIdP
+widgeon wij6n
+widmaier widmIP
+widow wid]
+widowed wid]d
+width widT
+widths widTs
+wiechec wICek
+wiechert wIkPt
+wiedenheft wEd@nheft
+wiegel wEg@l
+wieloch wEl)k
+wien wEn
+wienandt wEn6nt
+wienecke wEn6kE
+wiener wEnP
+wieners wEnPz
+wienert wEnPt
+wienhoff wInh)f
+wienke wENkE
+wiens wEns
+wierzbicki wErtzbikE
+wiese wEs
+wife wIf
+wife's wIfs
+wifes wIfs
+wigelsworth wig@lswPT
+wigen wig@n
+wigfall wigf{l
+wigfield wigfEld
+wigglesworth wig@lzwPT
+wigington wigiNt6n
+wigwam wigwom
+wilber wilbP
+wilbraham wilbr@ham
+wilbratham wilbr6tham
+wilburton wilbPt~
+wild wIld
+wildcats wIldkats
+wilde wIld
+wildeman wIldm6n
+wilder wIldP
+wildes wIldz
+wildfires wIldfIrz
+wildflower wIldfl?P
+wildlife wIldlIf
+wildly wIldl/
+wildman wIldm6n
+wildness wIldn6s
+wilds wIldz
+wildt wIlt
+wildwood wIldwqd
+wileman wIlm6n
+wiles wIlz
+wilfred wilfr6d
+wilhoit wilh<t
+wilkes wilks
+wilkesboro wilksbV]
+wilkinsburg wilk~zbVg
+will wil
+willacy wil@s/
+willacy wil@sE
+willamette wil@met
+willards wilPdz
+william wily}
+williams wily}z
+williamsburg wily@mzbVg
+williamsburgh wily@mzbVg
+williamsfield wily@mzfEld
+williamson wily@ms~
+williamsport wily@mzp{rt
+williamston wil/@mst~
+williamston wily}zt~
+williamstown wily@mzt?n
+willie wil/
+williemae wilEmA
+willies wilEz
+willimantic wil6mant6k
+willimas wilim@s
+willing wil6N
+willingness wiliNn6s
+willis wil6s
+willisburg wil6sbVg
+williston wil6st~
+willistown wil6st?n
+willmar wilmP
+willmott wilm6t
+willodean wil@dEn
+willow wil]
+willowbrook wil]brqk
+willowood wil]wqd
+willowy wil]/
+willpower wilp?P
+willsboro wilzbP]
+willsboro wilzbV]
+wilmes wilmz
+wilmette wLmet
+wilmington wilm6Nt~
+wilmington wilmiNt~
+wilmot wilm6t
+wilson wils~
+wilsonville wils~vil
+wilton wilt~
+wimauma w6m?m@
+wimauma w6m{m@
+wimbledon wimbLd~
+wimes wImz
+win win
+winchester winCestP
+wind wind
+windblown windblOn
+windbreaker windbrAkP
+windburn windbVn
+winder wIndP
+windermere windVmEr
+windfall windf{l
+windfalls windf{lz
+windflower windfl?P
+winding wInd6N
+windjammer windjamP
+windmiller windmilP
+windom wind}
+window wind@
+window wind]
+windowed windOd
+windowless windOl6s
+windowpane windOpAn
+windowpanes windOpAnz
+windows wind@z
+windows wind]z
+windowsill windOsil
+windpipe windpIp
+windproof windprUf
+winds windz
+windschitl windSIt@l
+windshield winSEld
+windshield windSEld
+windsor windsP
+windsor winzP
+windstorm windst{rm
+windswept windswept
+windthorst windT{rst
+windthorst winth{rst
+windtight windtIt
+windtilled windtild
+windward windwPd
+windy wind/
+wine wIn
+winebarger wInb)rjP
+winebaugh wInb{
+winebrenner wInbrenP
+winegarden wIng)rt@n
+wineglassful win6gl6sfL
+winegrowing win6gr]6N
+wineland wInland
+winemiller wInmilP
+winery wInP/
+winesberry wInzberE
+winesickle wInsuk@l
+wineskin wInskin
+winetka w6netk@
+winfield winfEld
+winfred winfrd
+winfrey winfr/
+wing wiN
+wingard wing)rd
+wingback wiNbak
+winge wiN
+wingenter wiNentP
+winger wiNP
+wingerd wiNPd
+wingerter wingPtP
+wingett wiNget
+winglike wiNlIk
+wingman wiNman
+wings wiNz
+wingspan wiNspan
+winifred win@frd
+winingear win6ngEr
+winking wiNk6N
+winkleblack wiNk@lblak
+winkleman wiNk@lm6n
+winklepleck wiNk@lplek
+winkles wiNk@lz
+winlock winlok
+winneconne win6kon
+winneconne win6kon@
+winner winP
+winnetka w6netk@
+winnett win6t
+winnewisser winwisP
+winnifred win6fr6d
+winning win6N
+winnisquam win6skw}
+winnisquam win@skwom
+winnsboro winzbP]
+winnsboro winzbV]
+winona w6nOn@
+winooski w6nUsk/
+wins winz
+winship winSip
+winsted winst6d
+winston winst~
+winter wintP
+winterize wintPIz
+winterport wintPp{rt
+winterrowd wint@r?d
+winters wintPz
+winterset wintPs6t
+winterset wintPset
+winterton wintPt@n
+winterville wintPvil
+winton wint~
+wipe wIp
+wiped wIpt
+wiper wIpP
+wire wIr
+wirebaugh wIrb{
+wired wIrd
+wireless wIrl6s
+wireman wIrm6n
+wirepulling wIrpql6N
+wirer wIrP
+wires wIrz
+wiretapper wIrtapP
+wiretapping wIrtap6N
+wiretaps wIrtaps
+wiretrapper wIrtrapP
+wirework wIrwVk
+wiring wIr6N
+wiry wIr/
+wiscasset w6skas6t
+wischmeier wiSmIP
+wisconsin w6skons~
+wisconsin w@skons~
+wisdom wizd}
+wise wIz
+wiseacre wIzAkP
+wisecarver wIzk)rvP
+wisecrack wIzkrak
+wisecup wIzkup
+wised wIzd
+wiseguy wIzgI
+wisehart wIzh)rt
+wiseley wIzlE
+wiseman wIzm6n
+wisenor wIznOr
+wisest wIz6st
+wish wiS
+wishbone wiSbOn
+wished wiSt
+wishful wiSfL
+wishfully wiSfL/
+wishing wiS6N
+wisp wisp
+wit wit
+witchcraft wiCkraft
+with w6D
+with wiD
+with wiT
+witham wiTam
+withdraw wiTdr{
+withdrawal wiTdr{L
+withdrawals wiTdr{Lz
+withdrawing wiTdr{6N
+withdrew wiTdrU
+wither wiDP
+witherington wiT@riNt~
+witherite wiD@rIt
+witherspoon wiDPspUn
+withheld wiTheld
+withhold wiThOld
+withholding wiThOld6N
+withholds wiThOldz
+within w6Tin
+without wiT?t
+withstand wiTstand
+withstanding wiTstand6N
+witness witn6s
+witnessed witn6st
+witnesses witn6s6z
+witnessing witn6s6N
+wits wits
+witt wit
+wittler witlP
+wixom wiks}
+wkrp dubLyUkA)rpE
+wobble wobL
+wobbled wobLd
+woburn wObPn
+woburn wUbPn
+woburn wobPn
+woden wOd~
+woe wO
+wohlschlegel wOlSleg@l
+wojciak wOCEak
+wojcicki wOCikE
+wojcik wOCik
+wok wok
+woke wOk
+woken wOk~
+wolcott wqlk6t
+woleslagle wOlslAg@l
+wolf wqlf
+wolfe wqlf
+wolfe's wqlfs
+wolfenbarger wqlf6nb)rgP
+wolfes wqlfs
+wolfgang wqlfgaN
+wolfhound wqlfh?nd
+wolfred wqlfr6d
+wolfsburg wqlfsbPg
+wolfsburg wqlfsbVg
+wollaston wol@st~
+wollaston wql@st~
+wollschlager Sl)gP
+wolslegel wOlslAg@l
+wolter wqltP
+wolverton wqlvPt6n
+womack wOmak
+woman wqm~
+womanfolk wqm~fOk
+womanhood wqm~hqd
+womb wUm
+wombles w)mb@lz
+womelsdorf wOmLzd{rf
+womelsdorf womLzd{rf
+women wim~
+womenfolk wim~fOk
+won won
+won wun
+won't wOnt
+wonder wundP
+wondered wundPd
+wonderful wundPfL
+wonderfully wundPfL/
+wondering wundP6N
+wonderland wundPland
+wonders wundPz
+wong w{N
+wont wOnt
+woo wU
+wood wqd
+woodacre wqdAkP
+woodall wqd)l
+woodard wqtPd
+woodbine wqdbIn
+woodbranch wqdbranC
+woodbridge wqdbrij
+woodburn wqdbVn
+woodbury wqdber/
+woodby wUdb/
+woodcarvers wqdk)rvPz
+woodchoper wqdCOpP
+woodchopper wqdCopP
+woodchuck wqdCuk
+woodcliff wqdklif
+woodcock wqdk)k
+woodcuts wqdkuts
+wooded wqd6d
+wooden wqd~
+woodenville wqd~vil
+woodfill wqdfil
+woodfin wqdfin
+woodfolk wqdfOk
+woodford wqdfPd
+woodfork wqdf{rk
+woodgate wqdgAt
+woodhall wqdh{l
+woodham wqd@m
+woodhaven wqdhAv~
+woodhill wqdhil
+woodhouse wqdh?s
+woodhull wqdhul
+woodinbille wqd~bil
+woodinville wUd~vil
+woodinville wqd~vil
+woodland wqdl~d
+woodlands wqdl~dz
+woodlawn wqdl{n
+woodley wqdlE
+woodman wqdm~
+woodmen wqdm~
+woodmere wqdm/r
+woodmere wqdmEr
+woodpecker wqdpekP
+woodprint wqdprint
+woodridge wqdrij
+woodring wqdriN
+woodrow wqdrO
+woodruff wqdr@f
+woodrum wqdr@m
+woods wqdz
+woodsfield wqdzfEld
+woodshed wqdSed
+woodside wqdsId
+woodsmall wqdsm{l
+woodsmen's wqdzm~z
+woodsmens wqdzm~z
+woodson wqds@n
+woodstock wqdstok
+woodston wUdst~
+woodstown wqdzt?n
+woodstream wqdstrEm
+woodsy wUds/
+woodturner wqdtVnP
+woodville wqdvil
+woodward wqdwPd
+woodway wqdwA
+woodwind wqdwind
+woodwinds wqdwindz
+woodwinked wqdwiNkt
+woodworth wqdwPT
+woody wqtE
+woodyard wqdy)rd
+woofer wUfP
+wool wql
+woolard wqlPd
+woolcott wqlk)t
+woolen wql~
+woolens wql~z
+woolery wqlPE
+wooley wqlE
+woolf wqlf
+woolfolk wqlfOk
+woolgathering wUlg@DP6N
+woollcott wUlk6t
+woollen wql~
+woolley wql/
+woolly wql/
+woolshed wUlSt
+woolverton wqlvPt6n
+woolworth's wqlwVTs
+woolworths wqlwVTs
+woonsocket wUns@k6t
+wooster wUstP
+wops wops
+worcester wqstP
+word wVd
+wordless wVdl6s
+wordlessly wVdl6sl/
+wordly wVdl/
+wordplay wVdplA
+words wVdz
+wordsmith wVdsmiT
+wordstar wVdst)r
+wordsworth wVdzwVT
+wore w{r
+work wVk
+workable wVk@bL
+workbench wVkbenC
+workbook wVkbqk
+workbooks wVkbqks
+workdays wVkdAz
+worked wVkt
+worker wVkP
+workers wVkPz
+workfare wVkf,r
+workforce wVkf{rs
+workhouse wVkh?s
+working wVk6N
+workmanlike wVkm~lIk
+workmen wVkm~
+workout wVk?t
+workouts wVk?ts
+workplace wVkplAs
+workplaces wVkplAs6z
+workroom wVkrUm
+works wVks
+worksheet wVkSEt
+workship wVkSip
+workshops wVkSops
+workstations wVkstAS~z
+workweeks wVkwEks
+workwoman wVkwqm~
+world wVld
+world's wVldz
+worldly wVldl/
+worldpass wVldp6s
+worlds wVldz
+worldscope wVldskOp
+worldwide wVldwId
+worldwide's wVldwIdz
+worldwides wVldwIdz
+worm wVm
+wormely wPmlE
+worms v{rmz
+worms wVmz
+wormwood wVmwqd
+worn w{rn
+worried wVr/d
+worries wVr/z
+worriest wVr/6st
+worrisome wVr/s}
+worry wVr/
+worrywart wVr6wPt
+worse wVs
+worsham wVS}
+worship wVS@p
+worshipful wVS@pfL
+worshippers wVS6pPz
+worst wVst
+worsted wVst6d
+worth wVT
+worthier wVD/P
+worthiest wVD/6st
+worthingham wVD6Nham
+worthingham wVD6N}
+worthingham wVTiNham
+worthington wVD6Nt~
+worthington wVTiNt~
+worthless wVTl6s
+worthwhile wVTwIl
+wortz wOrts
+would wqd
+would've wqd@v
+wouldn't wqd~t
+wouldnt wqd~t
+wouldve wqd@v
+wound wUnd
+wounded wUnd6d
+wounds wUndz
+wove wOv
+woven wOv~
+wow w?
+wowed w?d
+wows w?z
+woznicki w)znikE
+wrangell ranjel
+wrap rap
+wraparound rap@r?nd
+wrapped rapt
+wrapping rap6N
+wraps raps
+wrath raT
+wray rA
+wreck rek
+wreckage rek6j
+wrecking rek6N
+wren ren
+wrenched renCt
+wrestling resl6N
+wright rIt
+wrightsman rItsm~
+wrinkles riNk@lz
+wrist rist
+wristband ristband
+wristwatches ristwoC6z
+write rIt
+writer rIdP
+writers rIdPz
+writes rIts
+writing rId6N
+writings rId6Nz
+written rid~
+wrong r{N
+wrongdoers r{NdUPz
+wrongheaded r{Nhed6d
+wrongly r{Nl/
+wrote rOt
+wrung ruN
+wucherer wuC@rP
+wuerth wUrT
+wuest wUst
+wuhan wUh)n
+wuhan wUhan
+wuitschick wUitsCik
+wuk wuk
+wurtsboro wVtsbP]
+wurtsboro wVtsbV]
+wwj dubLyUdubLyUjA
+wyaconda wI@kond@
+wyalusing wIL@s6N
+wyandotte wIand6t
+wyandotte wI~dot
+wyanet wI~6t
+wyche wIC
+wyckoff wIk{f
+wycoff wIk{f
+wye wI
+wyeville wIvil
+wykoff wik{f
+wyles wIlz
+wylie wil/
+wynantskill wIn~tskil
+wyndam wind}
+wynmoor winmqr
+wynne win
+wynnewood winwqd
+wyoming wIOm6N
+wysox wIsoks
+wyss wis
+wytheville wIDvil
+x cks
+x eks
+xenia zeny@
+xenophon zen@f~
+xerox zEroks
+xie SE
+ximines zimEn6s
+xinxiang S6NksyaN
+xinxiang Sinj)N
+xiong Zy{N
+xochitl zOCit6l
+xu SU
+xuan Zw)n
+y wI
+y y
+y yI
+yach y)k
+yacht yot
+yachts yots
+yadkinville yadk~vil
+yaeger yAgP
+yaeko yAkO
+yafaie yafA
+yafei yafI
+yager yAgP
+yagin yagin
+yagoudaef yagUdef
+yakima y@kEm@
+yakutat yak@tat
+yakutat yaky6d6t
+yakutsk y@kqtsk
+yale's yAlz
+yales yAlz
+yamashita yam@SEt@
+yams yamz
+yanceyville yans/vil
+yancik yanCik
+yanking yaNk6N
+yankovich yaNk@vik
+yankton yaNkt~
+yanni yon/
+yap yap
+yarborough yorbV]
+yard y)rd
+yardley y)rdl/
+yards y)rdz
+yardstick y)rdstik
+yarmouth y)rm@T
+yarn y)rn
+yarns y)rnz
+yaron y)rOn
+yarwood y)rwqd
+yasmine yazm6n
+yates yAts
+yatesboro yAtsbP]
+yatesboro yAtsbV]
+yatesville yAtsvil
+yauger y)gP
+yawl y{l
+yawning y{n6N
+yawns y{nz
+yazoo y@zU
+ybarra 6b)r@
+ye yA
+ye yE
+yeager yEjP
+yeah ye@
+year yEr
+year's yErz
+yearbook yErbqk
+yearling yVl6N
+yearly yErl/
+yearned yVnd
+years yErz
+yearwood yErwqd
+yeast yEst
+yeasts yEsts
+yeates yAts
+yell yel
+yelled yeld
+yellow yel]
+yellowbelly yel]bel/
+yellowhammer yel]hamP
+yellowish yel]6S
+yellowstone yel]stOn
+yells yelz
+yellville yelvil
+yelp yelp
+yelverton yelvPt6n
+yen's yenz
+yendra yendr@
+yengich yeng6C
+yens yenz
+yeomans yOm@nz
+yep yep
+yes 9x1
+yeske yeskE
+yesterday yestPdA
+yet yet
+yield yEld
+yielded yEld6d
+yields yEldz
+yip yip
+yipe yIp
+yippee yipE
+yocam yok}
+yocham yOk@m
+yochim y)kim
+yocum yOk@m
+yodeling yod6l6N
+yoe yO
+yoga yOg@
+yogi yOg/
+yogurt yOgPt
+yoked yokt
+yokel yOk@l
+yokely yOklE
+yolande y@l)nd@
+yonge yuN
+yongue y)N
+yonkers yoNkPz
+yonkoske y)nk)skE
+yoo yU
+yoquelet y)klet
+york y{rk
+yorkton y{rkt~
+yorktown's y{rkt?nz
+yorktowns y{rkt?nz
+yoseph yOs6f
+you yU
+you'd yUd
+you'll yUl
+you're yV
+you've yUv
+youd yUd
+youlanda yUland@
+youll yUl
+youmans yUm6nz
+young yuN
+young's yuNz
+youngberg yuNbVg
+youngblood yuNblud
+younger yuNgP
+younglove yuNluv
+youngman yuNm~
+youngs yuNz
+youngsters yuNgstPz
+youngstown yuNzt?n
+youngtown yuNt?n
+your y{r
+youre yV
+yours y{rz
+yourself yPself
+yourselves yPselvz
+youth yUT
+youthfully yUTfL/
+youths yUTs
+youve yUv
+yowler y?lP
+ypsilanti ips6lant/
+ysquierdo EskEArdO
+yucha yUk@
+yugo yUg]
+yugoslavia yUg@slov/@
+yukon yUkon
+yuma yUm@
+yummy yum/
+yuppie yup/
+yuricic yUr6Cik
+yves Ev
+yves Evz
+yvette 6vet
+yvone 6v)n
+yvonne Evon
+yzquierdo EzkEArtO
+z zE
+z zed
+zabarkes z@b)rk6s
+zachary zak@r/
+zagel zAg@l
+zagen zAg@n
+zager zAgP
+zagged zagd
+zahir z@hir
+zaida zAt@
+zaituna zAtUn@
+zakrzewski z@krUskE
+zales zAlz
+zalma zalm@
+zanesville zAnzvil
+zangl zaNg@l
+zany zAn/
+zappa zap@
+zaragoza zar@gOz@
+zarate z@r)tE
+zaugg z)g
+zawislak z?wislak
+ze zE
+zeal zEl
+zealand zEl~d
+zealand's zEl~dz
+zealands zEl~dz
+zealously zel@sl/
+zebras zEbr@z
+zebrawood zEbr@wqd
+zech zek
+zed zed
+zeegers zEgPz
+zeeland zEl@nd
+zeger zEgP
+zehnder zendP
+zeiger zEgP
+zeigler zEglP
+zeilinger zEP
+zelda zeld@
+zell zel
+zenith zEn@T
+zenith's zEn@Ts
+zeniths zEn@Ts
+zeringue z@raN
+zero =Y07
+zeroing zEr]6N
+zeros zEr]z
+zest zest
+zestful zestfL
+zevenbergen zev@nbPg@n
+zh Z
+zh dr
+zhang ZaN
+zhang draN
+zhong Z{N
+zhong dr{N
+zhou Z?
+zhou dr?
+ziad zEad
+zich zik
+zicherman zikPm@n
+ziegel zEg@l
+ziegelbauer zEg@lb?P
+ziegenbein zEg@nbAn
+ziegenhagen zEg@nhAg@n
+ziego zEegO
+zieske zEeskE
+zig zig
+zigzagged zigzagd
+zigzagging zigzag6N
+zillah zil@
+zimmerman zimPm~
+zinnias zin/@z
+zion zI~
+zionist zI~6st
+zionists zI~6sts
+zionville zI~vil
+zip zip
+zippers zipPz
+zircon zVk~
+zircons zVk~z
+zirkles zPk@lz
+zithers zIDPz
+zodiac zOd/ak
+zoe zOE
+zofia zOfE@
+zolnoske n)skE
+zombie zomb/
+zone zOn
+zones zOnz
+zongker zoNkP
+zoning zOn6N
+zoo zU
+zoologist z]ol@j6st
+zoology z]ol@j/
+zoom zUm
+zoomed zUmd
+zoos zUz
+zorich z{r6k
+zoroiwchak zOr<iCak
+zuchara zUk@r@
+zuckerman's zukPm~z
+zuckermans zukPm~z
+zumbrota z@mbrOd@
+zuniga z6nig@
+zurawik z@r@wik
+zurich zqr6k
+zwagerman zwAgPm@n
+zweier zwIP
+zwinger zwiNP
+zwingle zwiNgL
diff --git a/config/en.us/dictionary/numbers.ok b/config/en.us/dictionary/numbers.ok
new file mode 100644
index 0000000..190d737
--- /dev/null
+++ b/config/en.us/dictionary/numbers.ok
@@ -0,0 +1,38 @@
+#LANG=EN-US
+-pau- #
+-pau2- #
+0 =Y07
+00 hundr6d
+1 5F|
+10 2x|
+100 uhundr6d
+100 wunhundr6d
+1000 wunT?z~d
+11 6lev~
+12 twelv
+13 BW2Y|
+14 RX02Y|
+15 R.R2Y|
+16 1.\12Y|
+17 1x3M2Y|
+18 H2Y|
+19 +>|2Y|
+2 2K
+20 25x|2[
+20 25x|[
+3 B0Y
+30 BW2[
+4 RX0
+40 RX02[
+5 R>3
+50 R.R2[
+6 1.\1
+60 1.\12[
+7 1x3M
+70 1x3M2[
+70 1x3M[
+8 H2
+80 H2[
+9 +>|
+90 +>|2[
+90 +>|[
diff --git a/config/en.us/g2p/en-US-ttp.data b/config/en.us/g2p/en-US-ttp.data
new file mode 100644
index 0000000..06b6f3a
--- /dev/null
+++ b/config/en.us/g2p/en-US-ttp.data
Binary files differ
diff --git a/config/en.us/grammars/VoiceDialer.grxml b/config/en.us/grammars/VoiceDialer.grxml
new file mode 100644
index 0000000..fc81cad
--- /dev/null
+++ b/config/en.us/grammars/VoiceDialer.grxml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+
+<rule id="ROOT" scope="public">
+  <one-of>
+    <item> <ruleref uri="#DIAL_NANP_3"/> <tag>meaning=DIAL_NANP_3.CMD;</tag> </item> 
+    <item> <ruleref uri="#DIAL_NANP_7"/> <tag>meaning=DIAL_NANP_7.CMD;</tag> </item> 
+    <item> <ruleref uri="#DIAL_NANP_10"/> <tag>meaning=DIAL_NANP_10.CMD;</tag> </item> 
+    <item> <ruleref uri="#CALL"/> <tag>meaning=CALL.CMD;</tag> </item>
+    <item> Call Voice Mail <tag>meaning='voicemail'</tag> </item>
+    <item> Redial <tag>meaning='redial'</tag> </item>
+  </one-of>
+</rule>
+
+<rule id="DIAL_NANP_3">
+  <item> Dial <tag>CMD='DIAL '</tag> </item>
+  
+  <item> <ruleref uri="#DIGIT29"/> <tag>CMD=CMD+DIGIT29.V</tag> </item>
+  <item> 1 <tag>CMD=CMD+'1'</tag> </item>
+  <item> 1 <tag>CMD=CMD+'1'</tag> </item>
+</rule> 
+
+<rule id="DIAL_NANP_7">
+  <item> Dial <tag>CMD='DIAL '</tag> </item>
+  
+  <item> <ruleref uri="#DIGIT29"/> <tag>CMD=CMD+DIGIT29.V</tag> </item>
+  <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+  <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+  
+  <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+  <one-of>
+    <item>
+      <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+      <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+      <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+    </item>
+    <item> thousand <tag>CMD=CMD+'000'</tag> </item>
+  </one-of>
+</rule> 
+
+<rule id="DIAL_NANP_10">
+  <item> Dial <tag>CMD='DIAL '</tag> </item>
+  
+  <!-- ignore leading 1 -->
+  <item repeat="0-1"> 1 </item>
+  
+  <!-- accept either xxx or 'eight hundred' -->
+  <one-of>
+    <item>
+      <item> <ruleref uri="#DIGIT29"/> <tag>CMD=CMD+DIGIT29.V</tag> </item>
+      <item> <ruleref uri="#DIGIT08"/> <tag>CMD=CMD+DIGIT08.V</tag> </item>
+      <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+    </item>
+    <item> 8 hundred <tag>CMD=CMD+'800'</tag> </item>
+  </one-of>
+  
+  <item> <ruleref uri="#DIGIT29"/> <tag>CMD=CMD+DIGIT29.V</tag> </item>
+  <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+  <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+  
+  <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+  <one-of>
+    <item>
+      <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+      <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+      <item> <ruleref uri="#DIGIT09"/> <tag>CMD=CMD+DIGIT09.V</tag> </item>
+    </item>
+    <item> thousand <tag>CMD=CMD+'000'</tag> </item>
+  </one-of>
+</rule> 
+
+<rule id="DIGIT09">
+  <item>
+  <one-of>
+    <item> zero <tag>V='0'</tag> </item>
+    <item> oh <tag>V='0'</tag> </item>
+    <item> 1 <tag>V='1'</tag> </item>
+    <item> 2 <tag>V='2'</tag> </item>
+    <item> 3 <tag>V='3'</tag> </item>
+    <item> 4 <tag>V='4'</tag> </item>
+    <item> 5 <tag>V='5'</tag> </item>
+    <item> 6 <tag>V='6'</tag> </item>
+    <item> 7 <tag>V='7'</tag> </item>
+    <item> 8 <tag>V='8'</tag> </item>
+    <item> 9 <tag>V='9'</tag> </item>
+  </one-of>
+  </item>
+</rule> 
+
+<rule id="DIGIT08">
+  <item>
+  <one-of>
+    <item> zero <tag>V='0'</tag> </item>
+    <item> oh <tag>V='0'</tag> </item>
+    <item> 1 <tag>V='1'</tag> </item>
+    <item> 2 <tag>V='2'</tag> </item>
+    <item> 3 <tag>V='3'</tag> </item>
+    <item> 4 <tag>V='4'</tag> </item>
+    <item> 5 <tag>V='5'</tag> </item>
+    <item> 6 <tag>V='6'</tag> </item>
+    <item> 7 <tag>V='7'</tag> </item>
+    <item> 8 <tag>V='8'</tag> </item>
+  </one-of>
+  </item>
+</rule> 
+
+<rule id="DIGIT29">
+  <item>
+  <one-of>
+    <item> 2 <tag>V='2'</tag> </item>
+    <item> 3 <tag>V='3'</tag> </item>
+    <item> 4 <tag>V='4'</tag> </item>
+    <item> 5 <tag>V='5'</tag> </item>
+    <item> 6 <tag>V='6'</tag> </item>
+    <item> 7 <tag>V='7'</tag> </item>
+    <item> 8 <tag>V='8'</tag> </item>
+    <item> 9 <tag>V='9'</tag> </item>
+  </one-of>
+  </item>
+</rule> 
+
+<rule id="CALL">
+	<item> Call <tag>CMD='CALL '</tag> </item>
+	
+	<item> <ruleref uri="#Names"/> <tag>CMD=CMD+Names.V</tag> </item>
+	
+	<item repeat="0-1">
+		<one-of>
+			<!-- corresponds to android.provider.Contacts.People.Phones.TYPE_HOME -->
+			<item> at home <tag>CMD=CMD+' H'</tag> </item>
+			<!-- corresponds to android.provider.Contacts.People.Phones.TYPE_MOBILE -->
+			<item>
+			  <one-of> <item> at </item> <item> on </item> </one-of>
+			  <one-of> <item> cell </item> <item> mobile </item> </one-of>
+			  <tag>CMD=CMD+' M'</tag>
+			</item>
+			<!-- corresponds to android.provider.Contacts.People.Phones.TYPE_WORK -->
+			<item> at work <tag>CMD=CMD+' W'</tag> </item>
+			<!-- corresponds to android.provider.Contacts.People.Phones.TYPE_OTHER -->
+			<item>
+			  <one-of> <item> at </item> <item> on </item> </one-of>
+			  <item> other </item>
+			  <tag>CMD=CMD+' O'</tag>
+			</item>
+		</one-of>
+	</item>		
+</rule> 
+
+<rule id="Names" scope="public">
+  <item>__Names__</item>
+</rule>
+
+
+</grammar>
diff --git a/config/en.us/grammars/boolean.grxml b/config/en.us/grammars/boolean.grxml
new file mode 100644
index 0000000..e9fa199
--- /dev/null
+++ b/config/en.us/grammars/boolean.grxml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<grammar version="1.0" xml:lang="en-US" mode="voice" root="_boolean">
+<!-- 
+	Boolean yes/no grammar, alternatives for yes and no can be added
+	to the grammar in the ROOT slot but this should be done carefully
+	to avoid confusions.
+ -->
+
+ <rule id="_boolean" scope="public">
+    <one-of>
+      <item>yes <tag>MEANING='1'</tag></item>
+      <item>no <tag>MEANING='0'</tag></item>
+      <item> <ruleref uri="#ROOT"/> </item> 
+    </one-of>
+ </rule>
+
+<rule id="ROOT" scope="public">
+<item>__ROOT__</item>
+</rule>
+
+</grammar>
+
+
+
+
+
+
+
+
+
+
diff --git a/config/en.us/grammars/bothtags5.grxml b/config/en.us/grammars/bothtags5.grxml
new file mode 100644
index 0000000..38ed871
--- /dev/null
+++ b/config/en.us/grammars/bothtags5.grxml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<!--
+	Test grammar, this grammar demonstrates the use of voicetags and 
+	texttags added to the grammar.  It also demonstrates how multiple
+	literals can be mapped to the same meaning.
+-->
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+      
+<rule id="ROOT" scope="public">
+  <one-of>
+	  <item><ruleref uri="#Phone"/>
+		<tag>meaning=Phone.V;</tag>
+	  </item>
+	  <item><ruleref uri="#Find"/>
+		<tag>meaning=Find.V;</tag>
+	  </item>
+	  <item><ruleref uri="#OtherCommands"/>
+		<tag>meaning=OtherCommands.V;</tag>
+	  </item>
+  </one-of>
+</rule>
+
+<rule id="Phone">
+  <item>
+    <item>
+        <item repeat="0-1">phone</item>
+        <item>
+          <one-of>
+            <item>
+		enter
+		<tag>C='ENTER ';</tag>
+	    </item>
+            <item>
+		delete
+		<tag>C='DEL ';</tag>
+	    </item>
+            <item>
+		remove
+		<tag>C='DEL ';</tag>
+	    </item>
+          </one-of>
+        </item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+  </item>
+</rule>
+
+<rule id="Find">
+  <item>
+    <item>
+        <item repeat="0-1">
+		find
+	</item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+  </item>
+</rule>
+
+<rule id="Names" scope="public">
+  <item>__Names__</item>
+</rule>
+
+<rule id="OtherCommands">
+  <item>
+    <one-of>
+	<item>
+		hello
+		<tag>V='HI';</tag>
+	</item>
+	<item>
+		forward
+                <tag>V='FWD';</tag>
+	</item>
+	<item>
+		backward
+                <tag>V='BAK';</tag>
+	</item>
+	<item>
+		changer
+                <tag>V='CHANGER';</tag>
+	</item>
+	<item>
+		asterisk
+                <tag>V='STAR';</tag>
+	</item>
+	<item>
+		cd player
+                <tag>V='CDPL';</tag>
+	</item>
+	<item>
+		traffic information
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic info
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic memory
+                <tag>V='TRFM';</tag>
+	</item>
+	<item>
+		fahrenheit
+                <tag>V='DEGF';</tag>
+	</item>
+	<item>
+		celsius
+                <tag>V='DEGC';</tag>
+	</item>
+    </one-of>
+    <tag>C=(C?C:''); V=C+V;</tag>
+  </item>
+</rule>
+
+</grammar>
diff --git a/config/en.us/grammars/digits.grxml b/config/en.us/grammars/digits.grxml
new file mode 100644
index 0000000..4745d61
--- /dev/null
+++ b/config/en.us/grammars/digits.grxml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<grammar version="1.0" xml:lang="en-US" mode="voice" root="_digits">
+<!-- 
+	Test grammar, this digits grammar recognizes a variable number of
+	digits.  For best accuracy, is is always better to apply constraints
+	to the grammar, such as phone number constraints, length constraints
+	or other.   
+-->
+<meta name="word_penalty" content="160"/>
+
+   <rule id="_digits" scope="public">
+      <item>
+      <ruleref uri="#S"/>
+      <tag>MEANING=S.X;</tag>
+      </item>
+   </rule>
+      
+   <rule id="S">
+      <item repeat="1-">
+         <ruleref uri="#DIGIT"/>
+         <tag>X=X?X:'';X=X+DIGIT.V;</tag>
+      </item>
+   </rule>
+
+   <rule id="DIGIT">
+      <one-of>
+         <item>
+            zero
+            <tag>V='0'</tag>
+         </item>
+         <item>
+            oh
+            <tag>V='0'</tag>
+         </item>
+         <item>
+            one
+            <tag>V='1'</tag>
+         </item>
+         <item>
+            two
+            <tag>V='2'</tag>
+         </item>
+         <item>
+            three
+            <tag>V='3'</tag>
+         </item>
+         <item>
+            four
+            <tag>V='4'</tag>
+         </item>
+         <item>
+            five
+            <tag>V='5'</tag>
+         </item>
+         <item>
+            six
+            <tag>V='6'</tag>
+         </item>
+         <item>
+            seven
+            <tag>V='7'</tag>
+         </item>
+         <item>
+            eight
+            <tag>V='8'</tag>
+         </item>
+         <item>
+            nine
+            <tag>V='9'</tag>
+         </item>
+      </one-of>
+   </rule>
+
+</grammar>
+
+
diff --git a/config/en.us/grammars/dynamic-test.grxml b/config/en.us/grammars/dynamic-test.grxml
new file mode 100644
index 0000000..3149212
--- /dev/null
+++ b/config/en.us/grammars/dynamic-test.grxml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+
+<rule id="ROOT" scope="public">
+  <one-of>
+          <item>  <ruleref uri="#Displayer"/> <tag>meaning=Displayer.V</tag> </item>
+  </one-of>
+</rule>
+
+<rule id="Displayer">
+  <item><tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item>
+          <one-of>
+             <item>lookup</item><tag>C='LKUP '</tag>
+          </one-of>
+        </item>
+        <item><ruleref uri="#Names"/><tag>V=Names.V</tag></item>
+    </item>
+  </item>
+</rule>
+
+<rule id="Names" scope="public">
+  <item>__Names__</item>
+</rule>
+
+</grammar>
diff --git a/config/en.us/grammars/enroll.grxml b/config/en.us/grammars/enroll.grxml
new file mode 100644
index 0000000..ca1d2bb
--- /dev/null
+++ b/config/en.us/grammars/enroll.grxml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<grammar version="1.0" xml:lang="en-US" mode="voice" root="ROOT">
+<meta name="word_penalty" content="40" />
+<meta name="do_skip_interword_silence" content="true"/>
+      
+   <rule id="ROOT" scope="public">
+      <item> 
+         <ruleref uri="#SENT"/>
+	 <tag>type=SENT.type; meaning=SENT.V</tag>
+      </item>
+   </rule>
+      
+   <rule id="SENT">
+      <item repeat="1-">
+            <ruleref uri="#PHONE"/>
+		<tag>V=PHONE.V;</tag>
+      </item>
+   </rule>
+      
+   <rule id="PHONE">
+      <one-of>
+         <item><tag>V=V?V:'';V=V+' ph_AE';</tag>ph_AE</item>
+         <item><tag>V=V?V:'';V=V+' ph_ee';</tag>ph_ee</item>
+         <item><tag>V=V?V:'';V=V+' ph_ih';</tag>ph_ih</item>
+         <item><tag>V=V?V:'';V=V+' ph_OY';</tag>ph_OY</item>
+         <item><tag>V=V?V:'';V=V+' ph_OW';</tag>ph_OW</item>
+         <item><tag>V=V?V:'';V=V+' ph_uh';</tag>ph_uh</item>
+         <item><tag>V=V?V:'';V=V+' ph_EY';</tag>ph_EY</item>
+         <item><tag>V=V?V:'';V=V+' ph_ch';</tag>ph_ch</item>
+         <item><tag>V=V?V:'';V=V+' ph_dh';</tag>ph_dh</item>
+         <item><tag>V=V?V:'';V=V+' ph_EE1';</tag>ph_EE1</item>
+         <item><tag>V=V?V:'';V=V+' ph_AY';</tag>ph_AY</item>
+         <item><tag>V=V?V:'';V=V+' ph_ul';</tag>ph_ul</item>
+         <item><tag>V=V?V:'';V=V+' ph_ng';</tag>ph_ng</item>
+         <item><tag>V=V?V:'';V=V+' ph_OH1';</tag>ph_OH1</item>
+         <item><tag>V=V?V:'';V=V+' ph_ur';</tag>ph_ur</item>
+         <item><tag>V=V?V:'';V=V+' ph_sh';</tag>ph_sh</item>
+         <item><tag>V=V?V:'';V=V+' ph_th';</tag>ph_th</item>
+         <item><tag>V=V?V:'';V=V+' ph_OOH';</tag>ph_OOH</item>
+         <item><tag>V=V?V:'';V=V+' ph_UR1';</tag>ph_UR1</item>
+         <item><tag>V=V?V:'';V=V+' ph_zh';</tag>ph_zh</item>
+         <item><tag>V=V?V:'';V=V+' ph_oh';</tag>ph_oh</item>
+         <item><tag>V=V?V:'';V=V+' ph_AA';</tag>ph_AA</item>
+         <item><tag>V=V?V:'';V=V+' ph_b';</tag>ph_b</item>
+         <item><tag>V=V?V:'';V=V+' ph_eh';</tag>ph_eh</item>
+         <item><tag>V=V?V:'';V=V+' ph_d';</tag>ph_d</item>
+         <item><tag>V=V?V:'';V=V+' ph_EH1';</tag>ph_EH1</item>
+         <item><tag>V=V?V:'';V=V+' ph_f';</tag>ph_f</item>
+         <item><tag>V=V?V:'';V=V+' ph_g';</tag>ph_g</item>
+         <item><tag>V=V?V:'';V=V+' ph_h';</tag>ph_h</item>
+         <item><tag>V=V?V:'';V=V+' ph_IH1';</tag>ph_IH1</item>
+         <item><tag>V=V?V:'';V=V+' ph_j';</tag>ph_j</item>
+         <item><tag>V=V?V:'';V=V+' ph_k';</tag>ph_k</item>
+         <item><tag>V=V?V:'';V=V+' ph_l';</tag>ph_l</item>
+         <item><tag>V=V?V:'';V=V+' ph_m';</tag>ph_m</item>
+         <item><tag>V=V?V:'';V=V+' ph_n';</tag>ph_n</item>
+         <item><tag>V=V?V:'';V=V+' ph_AW';</tag>ph_AW</item>
+         <item><tag>V=V?V:'';V=V+' ph_p';</tag>ph_p</item>
+         <item><tag>V=V?V:'';V=V+' ph_OO';</tag>ph_OO</item>
+         <item><tag>V=V?V:'';V=V+' ph_r';</tag>ph_r</item>
+         <item><tag>V=V?V:'';V=V+' ph_s';</tag>ph_s</item>
+         <item><tag>V=V?V:'';V=V+' ph_t';</tag>ph_t</item>
+         <item><tag>V=V?V:'';V=V+' ph_UH1';</tag>ph_UH1</item>
+         <item><tag>V=V?V:'';V=V+' ph_v';</tag>ph_v</item>
+         <item><tag>V=V?V:'';V=V+' ph_w';</tag>ph_w</item>
+         <item><tag>V=V?V:'';V=V+' ph_y';</tag>ph_y</item>
+         <item><tag>V=V?V:'';V=V+' ph_z';</tag>ph_z</item>
+         <item><tag>V=V?V:'';V=V+' ph_AWH';</tag>ph_AWH</item>
+         <item><tag>V=V?V:'';V=V+' ph_um';</tag>ph_um</item>
+         <item><tag>V=V?V:'';V=V+' ph_un';</tag>ph_un</item>
+     </one-of>
+   </rule>
+
+
+</grammar>
diff --git a/config/en.us/grammars/homonym_test1.grxml b/config/en.us/grammars/homonym_test1.grxml
new file mode 100644
index 0000000..1b5e5c9
--- /dev/null
+++ b/config/en.us/grammars/homonym_test1.grxml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<!--
+	Test grammar, here we test "hello" vs "hellow", used in places
+	where they won't be confused with each other
+-->
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+      
+<rule id="ROOT" scope="public">
+  <one-of>
+	  <item><ruleref uri="#Phone"/>
+		<tag>meaning=Phone.V;</tag>
+	  </item>
+	  <item><ruleref uri="#Find"/>
+		<tag>meaning=Find.V;</tag>
+	  </item>
+	  <item><ruleref uri="#OtherCommands"/>
+		<tag>meaning=OtherCommands.V;</tag>
+	  </item>
+  </one-of>
+</rule>
+
+<rule id="Phone">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item repeat="0-1">phone</item>
+        <item>
+          <one-of>
+            <item>
+		enter
+		<tag>C='ENTER';</tag>
+	    </item>
+	<item>
+		hellow
+		<tag>V='HI';</tag>
+	</item>
+            <item>
+		delete
+		<tag>C='DEL';</tag>
+	    </item>
+            <item>
+		remove
+		<tag>C='DEL';</tag>
+	    </item>
+          </one-of>
+        </item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+  </item>
+</rule>
+
+<rule id="Find">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item repeat="0-1">
+		find
+	</item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+  </item>
+</rule>
+
+<rule id="Names" scope="public">
+  <item>__Names__</item>
+</rule>
+
+<rule id="OtherCommands">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <one-of>
+	<item>
+		hello
+		<tag>V='HI';</tag>
+	</item>
+	<item>
+		forward
+                <tag>V='FWD';</tag>
+	</item>
+	<item>
+		backward
+                <tag>V='BAK';</tag>
+	</item>
+	<item>
+		changer
+                <tag>V='CHANGER';</tag>
+	</item>
+	<item>
+		asterisk
+                <tag>V='STAR';</tag>
+	</item>
+	<item>
+		cd player
+                <tag>V='CDPL';</tag>
+	</item>
+	<item>
+		traffic information
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic info
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic memory
+                <tag>V='TRFM';</tag>
+	</item>
+	<item>
+		fahrenheit
+                <tag>V='DEGF';</tag>
+	</item>
+	<item>
+		celsius
+                <tag>V='DEGC';</tag>
+	</item>
+    </one-of>
+  </item>
+</rule>
+
+</grammar>
diff --git a/config/en.us/grammars/homonym_test2.grxml b/config/en.us/grammars/homonym_test2.grxml
new file mode 100644
index 0000000..93cf9c7
--- /dev/null
+++ b/config/en.us/grammars/homonym_test2.grxml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<!--
+	Test grammar, here we test "hello" vs "hellow", used in places
+	where they YES will be confused with each other
+-->
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+      
+<rule id="ROOT" scope="public">
+  <one-of>
+	  <item><ruleref uri="#Phone"/>
+		<tag>meaning=Phone.V;</tag>
+	  </item>
+	  <item><ruleref uri="#Find"/>
+		<tag>meaning=Find.V;</tag>
+	  </item>
+	  <item><ruleref uri="#OtherCommands"/>
+		<tag>meaning=OtherCommands.V;</tag>
+	  </item>
+  </one-of>
+</rule>
+
+<rule id="Phone">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item >phone</item>
+        <item>
+          <one-of>
+            <item>
+		enter
+		<tag>C='ENTER';</tag>
+	    </item>
+	<item>
+		hellow
+		<tag>V='HI';</tag>
+	</item>
+	<item>
+		hello
+		<tag>V='HI';</tag>
+	</item>
+            <item>
+		delete
+		<tag>C='DEL';</tag>
+	    </item>
+            <item>
+		remove
+		<tag>C='DEL';</tag>
+	    </item>
+          </one-of>
+        </item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+  </item>
+</rule>
+
+<rule id="Find">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item repeat="0-1">
+		find
+	</item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+  </item>
+</rule>
+
+<rule id="Names" scope="public">
+  <item>__Names__</item>
+</rule>
+
+<rule id="OtherCommands">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <one-of>
+	<item>
+		hello
+		<tag>V='HI';</tag>
+	</item>
+	<item>
+		forward
+                <tag>V='FWD';</tag>
+	</item>
+	<item>
+		backward
+                <tag>V='BAK';</tag>
+	</item>
+	<item>
+		changer
+                <tag>V='CHANGER';</tag>
+	</item>
+	<item>
+		asterisk
+                <tag>V='STAR';</tag>
+	</item>
+	<item>
+		cd player
+                <tag>V='CDPL';</tag>
+	</item>
+	<item>
+		traffic information
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic info
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic memory
+                <tag>V='TRFM';</tag>
+	</item>
+	<item>
+		fahrenheit
+                <tag>V='DEGF';</tag>
+	</item>
+	<item>
+		celsius
+                <tag>V='DEGC';</tag>
+	</item>
+    </one-of>
+  </item>
+</rule>
+
+</grammar>
diff --git a/config/en.us/grammars/homonym_test3.grxml b/config/en.us/grammars/homonym_test3.grxml
new file mode 100644
index 0000000..c4810b9
--- /dev/null
+++ b/config/en.us/grammars/homonym_test3.grxml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<!--
+	Test grammar, two slots, one sequential with the other
+-->
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+      
+<rule id="ROOT" scope="public">
+  <one-of>
+	  <item><ruleref uri="#Phone"/>
+		<tag>meaning=Phone.V;</tag>
+	  </item>
+	  <item><ruleref uri="#Find"/>
+		<tag>meaning=Find.V;</tag>
+	  </item>
+	  <item><ruleref uri="#OtherCommands"/>
+		<tag>meaning=OtherCommands.V;</tag>
+	  </item>
+  </one-of>
+</rule>
+
+<rule id="Phone">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item repeat="0-1">phone</item>
+        <item>
+          <one-of>
+            <item>
+		enter
+		<tag>C='ENTER';</tag>
+	    </item>
+            <item>
+		delete
+		<tag>C='DEL';</tag>
+	    </item>
+            <item>
+		remove
+		<tag>C='DEL';</tag>
+	    </item>
+          </one-of>
+        </item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+  </item>
+</rule>
+
+<rule id="Find">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item >
+		find
+	</item>
+        <item>
+		<ruleref uri="#Places"/>
+		<tag>V=Places.V;</tag>
+	</item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+  </item>
+</rule>
+
+<rule id="Names" scope="public">
+  <item>__Names__</item>
+</rule>
+
+<rule id="Places" scope="public">
+  <item>__Places__</item>
+</rule>
+
+<rule id="OtherCommands">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <one-of>
+	<item>
+		hello
+		<tag>V='HI';</tag>
+	</item>
+	<item>
+		forward
+                <tag>V='FWD';</tag>
+	</item>
+	<item>
+		backward
+                <tag>V='BAK';</tag>
+	</item>
+	<item>
+		changer
+                <tag>V='CHANGER';</tag>
+	</item>
+	<item>
+		asterisk
+                <tag>V='STAR';</tag>
+	</item>
+	<item>
+		cd player
+                <tag>V='CDPL';</tag>
+	</item>
+	<item>
+		traffic information
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic info
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic memory
+                <tag>V='TRFM';</tag>
+	</item>
+	<item>
+		fahrenheit
+                <tag>V='DEGF';</tag>
+	</item>
+	<item>
+		celsius
+                <tag>V='DEGC';</tag>
+	</item>
+    </one-of>
+  </item>
+</rule>
+
+</grammar>
diff --git a/config/en.us/grammars/homonym_test4.grxml b/config/en.us/grammars/homonym_test4.grxml
new file mode 100644
index 0000000..77c62ac
--- /dev/null
+++ b/config/en.us/grammars/homonym_test4.grxml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<!--
+	Test grammar, two slots in parallel with each other
+-->
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+      
+<rule id="ROOT" scope="public">
+  <one-of>
+	  <item><ruleref uri="#Phone"/>
+		<tag>meaning=Phone.V;</tag>
+	  </item>
+	  <item><ruleref uri="#Find"/>
+		<tag>meaning=Find.V;</tag>
+	  </item>
+	  <item><ruleref uri="#OtherCommands"/>
+		<tag>meaning=OtherCommands.V;</tag>
+	  </item>
+  </one-of>
+</rule>
+
+<rule id="Phone">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item repeat="0-1">phone</item>
+        <item>
+          <one-of>
+            <item>
+		enter
+		<tag>C='ENTER';</tag>
+	    </item>
+            <item>
+		delete
+		<tag>C='DEL';</tag>
+	    </item>
+            <item>
+		remove
+		<tag>C='DEL';</tag>
+	    </item>
+          </one-of>
+        </item>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+    </item>
+  </item>
+</rule>
+
+<rule id="Find">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <item>
+        <item >
+		find
+	</item>
+<one-of>
+        <item>
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+	</item>
+        <item>
+		<ruleref uri="#Places"/>
+		<tag>V=Places.V;</tag>
+	</item>
+</one-of>
+    </item>
+  </item>
+</rule>
+
+<rule id="Names" scope="public">
+  <item>__Names__</item>
+</rule>
+
+<rule id="Places" scope="public">
+  <item>__Places__</item>
+</rule>
+
+<rule id="OtherCommands">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+    <one-of>
+	<item>
+		hello
+		<tag>V='HI';</tag>
+	</item>
+	<item>
+		forward
+                <tag>V='FWD';</tag>
+	</item>
+	<item>
+		backward
+                <tag>V='BAK';</tag>
+	</item>
+	<item>
+		changer
+                <tag>V='CHANGER';</tag>
+	</item>
+	<item>
+		asterisk
+                <tag>V='STAR';</tag>
+	</item>
+	<item>
+		cd player
+                <tag>V='CDPL';</tag>
+	</item>
+	<item>
+		traffic information
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic info
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic
+                <tag>V='TRFI';</tag>
+	</item>
+	<item>
+		traffic memory
+                <tag>V='TRFM';</tag>
+	</item>
+	<item>
+		fahrenheit
+                <tag>V='DEGF';</tag>
+	</item>
+	<item>
+		celsius
+                <tag>V='DEGC';</tag>
+	</item>
+    </one-of>
+  </item>
+</rule>
+
+</grammar>
diff --git a/config/en.us/grammars/ipaq_commands.grxml b/config/en.us/grammars/ipaq_commands.grxml
new file mode 100644
index 0000000..169bf0a
--- /dev/null
+++ b/config/en.us/grammars/ipaq_commands.grxml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<!-- 
+	ipaq_commands.grxml ... this is a sample which shows how to use 
+	natural numbers in a grammar.  It allows phrases such as
+	go to step $N .. where $N can range from 0 to 99
+-->
+ 
+<rule id="ROOT" scope="public">
+  <one-of>
+	<item>
+	    <item>center</item>
+	    <item repeat="0-1">
+	      <one-of>
+		<item>here <tag>MEANING='CTR'</tag></item>
+		<item>of this <tag>MEANING='CTR'</tag></item>
+		<item>on this <tag>MEANING='CTR'</tag></item>
+		<item>on this point <tag>MEANING='CTR'</tag></item>
+	      </one-of>
+	    </item>
+	</item>
+	<item>
+	    <item>get</item>
+	    <one-of>
+		<item>a map <tag>MEANING='MAP'</tag> </item>
+		<item>directions <tag>MEANING='DIR'</tag></item>
+		<item>map <tag>MEANING='MAP'</tag></item>
+		<item>maps <tag>MEANING='MAP'</tag></item>
+	    </one-of>
+	</item>
+	<item>
+	    <one-of> 
+	      <item>
+      	        <item repeat="0-1">go to</item>
+	        <item>
+	         <one-of>
+		  <item>step</item>
+		  <item>steps</item>
+	         </one-of>
+	        </item>
+	      </item>
+              <item>go to</item>
+	    </one-of>
+	    <ruleref uri="#NUMBER"/>
+	    <tag>MEANING='STEP' + NUMBER.X;</tag>
+	</item>
+	<item>map <tag>V='MAP'</tag> </item>
+	<item>
+            <item> <one-of>
+	      <item>map <tag>V='MAP'</tag> </item>
+	      <item>map of<tag>V='MAP'</tag> </item>
+	      <item>map of the<tag>V='MAP'</tag> </item>
+	      <item>map the<tag>V='MAP'</tag> </item>
+	    </one-of> </item>
+            <item>
+	       <one-of>
+		<item> arrival             <tag>V=V+' AP';</tag></item>
+		<item> destination         <tag>V=V+' DP';</tag></item>
+		<item> end                 <tag>V=V+' EP';</tag></item>
+		<item> ending              <tag>V=V+' EP';</tag></item>
+		<item> origin              <tag>V=V+' SP';</tag></item>
+		<item> start               <tag>V=V+' SP';</tag></item>
+		<item> starting            <tag>V=V+' SP';</tag></item>
+	       </one-of>
+             </item>
+	     <item repeat="0-1"> point </item>
+	</item>
+
+	<item>
+	  <item>move</item>
+	  <one-of>
+		<item>down</item>
+		<item>left</item>
+		<item>right</item>
+		<item>up</item>
+	  </one-of>
+	</item>
+
+	<item>next step</item>
+
+	<item>route map</item>
+
+	<item>
+	  <item>zoom <tag>V='ZOOM'</tag></item>
+	  <one-of>
+		<item>in               <tag>V=' IN'</tag></item>
+		<item>in here          <tag>V=' INH'</tag></item>
+		<item>in on this       <tag>V=' INH'</tag></item>
+		<item>in on this point <tag>V=' INH'</tag></item>
+		<item>on this          <tag>V=' ONH'</tag></item>
+		<item>out              <tag>V=' OUT'</tag></item>
+	  </one-of>
+	</item>
+
+  </one-of>
+</rule>
+
+   <rule id="NUMBER">
+     <one-of>
+      <item repeat="1-">
+          <ruleref uri="#DIGIT"/>
+	  <tag>X=X?X:'';X=X+DIGIT.V;</tag>
+      </item>
+      <item>
+	  <ruleref uri="#TEEN"/>
+	  <tag>X=X?X:'';X=X+TEEN.V;</tag>
+      </item>
+      <item>
+	  <ruleref uri="#TY"/>
+	  <ruleref uri="#NZ_DIGIT"/>
+	  <tag>X=X?X:'';X=X+TY.V+NZ_DIGIT.V;</tag>
+      </item>
+      <item>
+	  <ruleref uri="#TY"/>
+	  <tag>X=X?X:'';X=X+TY.V+'0';</tag>
+      </item>
+     </one-of>
+   </rule>
+
+   <rule id="DIGIT">
+      <one-of>
+         <item>            oh              <tag>V='0'</tag>         </item>
+         <item>            zero            <tag>V='0'</tag>         </item>
+         <item>            one             <tag>V='1'</tag>         </item>
+         <item>            two             <tag>V='2'</tag>         </item>
+         <item>            three           <tag>V='3'</tag>         </item>
+         <item>            four            <tag>V='4'</tag>         </item>
+         <item>            five            <tag>V='5'</tag>         </item>
+         <item>            six             <tag>V='6'</tag>         </item>
+         <item>            seven           <tag>V='7'</tag>         </item>
+         <item>            eight           <tag>V='8'</tag>         </item>
+         <item>            nine            <tag>V='9'</tag>         </item>
+      </one-of>   
+   </rule>
+
+   <rule id="NZ_DIGIT">
+      <one-of>
+         <item>            one             <tag>V='1'</tag>         </item>
+         <item>            two             <tag>V='2'</tag>         </item>
+         <item>            three           <tag>V='3'</tag>         </item>
+         <item>            four            <tag>V='4'</tag>         </item>
+         <item>            five            <tag>V='5'</tag>         </item>
+         <item>            six             <tag>V='6'</tag>         </item>
+         <item>            seven           <tag>V='7'</tag>         </item>
+         <item>            eight           <tag>V='8'</tag>         </item>
+         <item>            nine            <tag>V='9'</tag>         </item>
+      </one-of>   
+   </rule>
+
+  <rule id="TEEN">
+    <one-of>
+	<item>		nineteen		<tag>V='19'</tag>	</item>
+	<item>		eighteen                <tag>V='18'</tag>	</item>
+	<item>		seventeen               <tag>V='17'</tag>	</item>
+	<item>		sixteen                 <tag>V='16'</tag>	</item>
+	<item>		fifteen                 <tag>V='15'</tag>	</item>
+	<item>		fourteen                <tag>V='14'</tag>	</item>
+	<item>		thirteen                <tag>V='13'</tag>	</item>
+	<item>		twelve                  <tag>V='12'</tag>	</item>
+	<item>		eleven                  <tag>V='11'</tag>	</item>
+	<item>		ten                     <tag>V='10'</tag>	</item>
+    </one-of>
+  </rule>
+
+  <rule id="TY">
+    <one-of>
+	<item>		ninety               <tag>V='9'</tag>	</item>
+	<item>		eighty               <tag>V='8'</tag>	</item>
+	<item>		seventy              <tag>V='7'</tag>	</item>
+	<item>		sixty                <tag>V='6'</tag>	</item>
+	<item>		fifty                <tag>V='5'</tag>	</item>
+	<item>		forty                <tag>V='4'</tag>	</item>
+	<item>		thirty               <tag>V='3'</tag>	</item>
+	<item>		twenty               <tag>V='2'</tag>	</item>
+    </one-of>
+  </rule>
+
+
+</grammar>
diff --git a/config/en.us/grammars/lookup.grxml b/config/en.us/grammars/lookup.grxml
new file mode 100644
index 0000000..647006f
--- /dev/null
+++ b/config/en.us/grammars/lookup.grxml
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<grammar xml:lang="en-us" version="1.0" root="ROOT" xmlns="http://www.w3.org/2001/06/grammar"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://www.w3.org/2001/06/grammar http://www.w3.org/TR/speech-grammar/grammar.xsd">
+<meta name="word_penalty" content="40" />
+<!-- 
+	Lookup name grammar, this is a sample grammar that can recognize
+	lookup followed by a digit string or a name.  Names can be followed
+	by a place (such as office, home, mobile).  The return key value pairs
+	in two cases are shown below.
+# parseStringTest.out -base lookup 
+)) parse ok (1 results) (lookup Wilson at office) (8)
+{LOOKUP.PLACE : office}
+{ROOT.M_P : office}
+{meaning : office Wilson }
+{NAMES.N : Wilson}
+{LOOKUP.NAME : Wilson}
+{ROOT.M_N : Wilson}
+{PLACES.P : office}
+{ROOT.M_T : }
+--Done--
+) parse ok (1 results) (lookup seven one) (7)
+{ROOT.M_P : }
+{DIGIT.V : 1}
+{LOOKUP.TELN : 71}
+{S.X : 71}
+{meaning : 71}
+{ROOT.M_N : }
+{ROOT.M_T : 71}
+-->
+<rule id="ROOT" scope="public">
+        <item>
+	  <ruleref uri="#LOOKUP"/>
+	  <tag>M_N=LOOKUP.NAME?LOOKUP.NAME:'';
+               M_P=LOOKUP.PLACE?LOOKUP.PLACE:'';
+               M_T=LOOKUP.TELN?LOOKUP.TELN:'';</tag>
+	</item>
+</rule>
+
+   <rule id="LOOKUP">
+     <item>lookup</item>
+     <one-of>
+	<item>
+	   <ruleref uri="#NAMES"/>
+	   <item repeat="0-1">
+		<item>at</item>
+		<ruleref uri="#PLACES"/>
+		<tag>PLACE=PLACES.P</tag>
+	   </item>
+	   <tag>NAME=NAMES.N</tag>
+	</item>
+	<item>
+	   <ruleref uri="#S"/>
+	   <tag>TELN=S.X;</tag>
+        </item>
+     </one-of>
+   </rule>
+
+   <rule id="NAMES">
+     <one-of>
+      <item>
+	Peter
+	<tag>N='Peter'</tag>
+      </item>
+      <item>
+	Wilson
+        <tag>N='Wilson'</tag>
+      </item>
+      <item>
+	Jessica
+        <tag>N='Jessica'</tag>
+      </item>
+      <item>
+	Janese
+        <tag>N='Janese'</tag>
+      </item>
+      <item>
+	John Martinez
+        <tag>N='John Martinez'</tag>
+      </item>
+      <item>
+	Jen Parker
+        <tag>N='Jen Parker'</tag>
+      </item>
+      <item>
+	Jennifer
+        <tag>N='Jennifer'</tag>
+      </item>
+      <item>
+	Elaine
+        <tag>N='Elaine'</tag>
+      </item>
+      <item>
+	David
+        <tag>N='David'</tag>
+      </item>
+     </one-of>
+   </rule>
+
+   <rule id="PLACES">
+     <one-of>
+      <item>office <tag>P='office'</tag>     </item>
+      <item>	friends       <tag>P='friends'</tag>      </item>
+      <item>	home        <tag>P='home'</tag> </item>
+      <item>	mobile        <tag>P='mobile'</tag> </item>
+     </one-of>
+   </rule>
+   
+   <rule id="S">
+      <item repeat="1-">
+         <ruleref uri="#DIGIT"/>
+         <tag>X=X?X:'';X=X+DIGIT.V;</tag>
+      </item>
+   </rule>
+
+   <rule id="DIGIT">
+      <one-of>
+         <item>
+            zero
+            <tag>V='0'</tag>
+         </item>
+         <item>
+            oh
+            <tag>V='0'</tag>
+         </item>
+         <item>
+            one
+            <tag>V='1'</tag>
+         </item>
+         <item>
+            two
+            <tag>V='2'</tag>
+         </item>
+         <item>
+            three
+            <tag>V='3'</tag>
+         </item>
+         <item>
+            four
+            <tag>V='4'</tag>
+         </item>
+         <item>
+            five
+            <tag>V='5'</tag>
+         </item>
+         <item>
+            six
+            <tag>V='6'</tag>
+         </item>
+         <item>
+            seven
+            <tag>V='7'</tag>
+         </item>
+         <item>
+            eight
+            <tag>V='8'</tag>
+         </item>
+         <item>
+            nine
+            <tag>V='9'</tag>
+         </item>
+      </one-of>
+   </rule>
+
+</grammar>
diff --git a/config/en.us/grammars/rootslot.grxml b/config/en.us/grammars/rootslot.grxml
new file mode 100644
index 0000000..49126c5
--- /dev/null
+++ b/config/en.us/grammars/rootslot.grxml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<grammar xml:lang="en-us" version="1.0" mode="speech" root="myRoot">
+<!-- 
+	Root slot grammar, this is an empty grammar that can be used when
+	all the content is to be added at runtime.  The return value for
+	semantic meaning is 'V', and items should be added to the grammar
+	with a semantic tag such as V='45' or V='do-it-now'
+-->
+
+<rule id="myRoot" scope="public">
+	<item>  <ruleref uri="#Name"/> <tag>V=Name.V;</tag> </item>
+</rule>
+
+<rule id="Name" scope="public">
+	<item>__Name__ </item>
+</rule>
+
+</grammar>
diff --git a/config/en.us/grammars/run_clean_grammars.sh b/config/en.us/grammars/run_clean_grammars.sh
new file mode 100755
index 0000000..4b55078
--- /dev/null
+++ b/config/en.us/grammars/run_clean_grammars.sh
@@ -0,0 +1,16 @@
+echo "Deleting output grammar files to do a clean compilation...."
+
+rm *.phn           >/dev/null 2>&1
+rm *.pmap          >/dev/null 2>&1
+rm *.script        >/dev/null 2>&1
+rm *.g2g           >/dev/null 2>&1
+rm *.gram          >/dev/null 2>&1
+rm *.Grev2.det.txt >/dev/null 2>&1
+rm *.map           >/dev/null 2>&1
+rm *.G.txt         >/dev/null 2>&1
+rm *.P             >/dev/null 2>&1
+rm *.P.txt         >/dev/null 2>&1
+rm *.PCLG          >/dev/null 2>&1
+rm *.PCLG.txt      >/dev/null 2>&1
+rm *.omap          >/dev/null 2>&1
+rm *.params        >/dev/null 2>&1
diff --git a/config/en.us/grammars/run_compile_grammars.sh b/config/en.us/grammars/run_compile_grammars.sh
new file mode 100755
index 0000000..3749aa6
--- /dev/null
+++ b/config/en.us/grammars/run_compile_grammars.sh
@@ -0,0 +1,58 @@
+BASELINE_PAR_FILE=../baseline11k.par
+
+GMR=enroll
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml -vocab dictionary/$GMR.ok
+make_g2g -base $GMR -out $GMR.g2g
+
+GMR=bothtags5
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR,addWords=100 -out $GMR.g2g
+
+GMR=dynamic-test
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR,addWords=1000 -out $GMR.g2g
+
+GMR=lookup
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR,addWords=1000 -out $GMR.g2g
+
+GMR=digits
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR,addWords=1000 -out $GMR.g2g
+
+GMR=rootslot
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR,addWords=3000 -out $GMR.g2g
+
+GMR=boolean
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR -out $GMR.g2g
+
+GMR=ipaq_commands
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR -out $GMR.g2g
+
+GMR=homonym_test1
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR -out $GMR.g2g
+
+GMR=homonym_test2
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR -out $GMR.g2g
+
+GMR=homonym_test3
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR -out $GMR.g2g
+
+GMR=homonym_test4
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR -out $GMR.g2g
+
+GMR=slot_test1
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR -out $GMR.g2g
+
+GMR=slot_test2
+grxmlcompile -par $BASELINE_PAR_FILE -grxml $GMR.grxml
+make_g2g -base $GMR -out $GMR.g2g
+
diff --git a/config/en.us/grammars/slot_test1.grxml b/config/en.us/grammars/slot_test1.grxml
new file mode 100644
index 0000000..c268258
--- /dev/null
+++ b/config/en.us/grammars/slot_test1.grxml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<!--
+	Test grammar, stacked slots
+-->
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+      
+<rule id="ROOT" scope="public">
+  <one-of>
+  <item>
+	<item>	<ruleref uri="#slot1"/> <tag>MEANING=slot1.V;</tag></item>
+  </item>
+  <item>
+	<item>	<ruleref uri="#slot1"/> <tag>MEANING=slot1.V;</tag></item>
+	<item>	<ruleref uri="#slot2"/> <tag>MEANING=slot2.V;</tag></item>
+  </item>
+  <item>
+	<item>	<ruleref uri="#slot1"/> <tag>MEANING=slot1.V;</tag></item>
+	<item>	<ruleref uri="#slot2"/> <tag>MEANING=slot2.V;</tag></item>
+	<item>	<ruleref uri="#slot3"/> <tag>MEANING=slot3.V;</tag></item>
+  </item>
+  <item>
+	<item>	<ruleref uri="#slot1"/> <tag>MEANING=slot1.V;</tag></item>
+	<item>	<ruleref uri="#slot2"/> <tag>MEANING=slot2.V;</tag></item>
+	<item>	<ruleref uri="#slot3"/> <tag>MEANING=slot3.V;</tag></item>
+	<item>	<ruleref uri="#slot4"/> <tag>MEANING=slot4.V;</tag></item>
+  </item>
+  </one-of>
+</rule>
+
+<rule id="slot1" scope="public">
+  <item>__slot1__</item>
+  <item>word1<tag>V='word1';</tag></item>
+</rule>
+
+<rule id="slot2" scope="public">
+  <item>__slot2__</item>
+  <item>word2<tag>V='word2';</tag></item>
+</rule>
+
+<rule id="slot3" scope="public">
+  <item>__slot3__</item>
+  <item>word3<tag>V='word3';</tag></item>
+</rule>
+
+<rule id="slot4" scope="public">
+  <item>__slot4__</item>
+  <item>word4<tag>V='word4';</tag></item>
+</rule>
+
+
+</grammar>
diff --git a/config/en.us/grammars/slot_test2.grxml b/config/en.us/grammars/slot_test2.grxml
new file mode 100644
index 0000000..0e843ee
--- /dev/null
+++ b/config/en.us/grammars/slot_test2.grxml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO8859-1" ?>
+<!--
+	Test grammar
+	hello $SLOT | hello
+-->
+<grammar xml:lang="en-us" version="1.0" root="ROOT">
+<meta name="word_penalty" content="40" />
+      
+<rule id="ROOT" scope="public">
+  <one-of>
+	  <item><ruleref uri="#Phone"/>
+		<tag>meaning=Phone.V;</tag>
+	  </item>
+  </one-of>
+</rule>
+
+<rule id="Phone">
+  <item>
+    <tag>C=(C?C:''); V=C+V;</tag>
+       <item>
+	  hello
+	<tag>V='HI';</tag>
+       </item>
+       <item repeat="0-1">
+		<ruleref uri="#Names"/>
+		<tag>V=Names.V;</tag>
+       </item>
+  </item>
+</rule>
+
+
+<rule id="Names" scope="public">
+  <item>__Names__</item>
+</rule>
+
+</grammar>
diff --git a/config/en.us/models/generic.C b/config/en.us/models/generic.C
new file mode 100644
index 0000000..092b1ed
--- /dev/null
+++ b/config/en.us/models/generic.C
Binary files differ
diff --git a/config/en.us/models/generic.lda b/config/en.us/models/generic.lda
new file mode 100644
index 0000000..5811f58
--- /dev/null
+++ b/config/en.us/models/generic.lda
Binary files differ
diff --git a/config/en.us/models/generic.pht b/config/en.us/models/generic.pht
new file mode 100644
index 0000000..cbfae0e
--- /dev/null
+++ b/config/en.us/models/generic.pht
@@ -0,0 +1,83 @@
+82 2
+32 sil # 1
+40 ih0 ( 2
+41 AH ) 2
+44 AE , 2
+46 IH0 . 2
+47 ee / 2
+48 r0 0 2
+49 s0 1 2
+50 t0 2 2
+51 v0 3 2
+52 OH0 4 2
+53 w0 5 2
+54 ih 6 2
+55 oh0 7 2
+56 AW0 8 3
+57 y0 9 2
+60 OY < 3
+61 z0 = 2
+62 AY0 > 3
+63 OW ? 3
+64 uh @ 2
+65 EY A 3
+66 th0 B 2
+67 ch C 2
+68 dh D 2
+69 EE E 2
+70 UH0 F 2
+71 th1 G 2
+72 EY0 H 3
+73 AY I 3
+75 AA0 K 2
+76 ul L 2
+77 un0 M 2
+78 ng N 2
+79 OH O 2
+80 ur P 2
+81 d0 Q 2
+82 f0 R 2
+83 sh S 2
+84 th T 2
+85 OOH U 2
+86 UR V 2
+87 UR0 W 2
+88 AH0 X 2
+89 EE0 Y 2
+90 zh Z 2
+91 ee0 [ 2
+92 k0 \ 2
+93 oh ] 2
+97 AA a 2
+98 b b 2
+99 eh c 2
+100 d d 2
+101 EH e 2
+102 f f 2
+103 g g 2
+104 h h 2
+105 IH i 2
+106 j j 2
+107 k k 2
+108 l l 2
+109 m m 2
+110 n n 2
+111 AW o 3
+112 p p 2
+113 OO q 2
+114 r r 2
+115 s s 2
+116 t t 2
+117 UH u 2
+118 v v 2
+119 w w 2
+120 EH0 x 2
+121 y y 2
+122 z z 2
+123 AWH { 2
+124 n0 | 2
+125 um } 2
+126 un ~ 2
+127 n1  2
+94 ENV ^ 2
+74 jnk J 1
diff --git a/config/en.us/models/generic.swiarb b/config/en.us/models/generic.swiarb
new file mode 100644
index 0000000..a33737f
--- /dev/null
+++ b/config/en.us/models/generic.swiarb
Binary files differ
diff --git a/config/en.us/models/generic11.lda b/config/en.us/models/generic11.lda
new file mode 100644
index 0000000..5811f58
--- /dev/null
+++ b/config/en.us/models/generic11.lda
Binary files differ
diff --git a/config/en.us/models/generic11_f.swimdl b/config/en.us/models/generic11_f.swimdl
new file mode 100644
index 0000000..24f4683
--- /dev/null
+++ b/config/en.us/models/generic11_f.swimdl
Binary files differ
diff --git a/config/en.us/models/generic11_m.swimdl b/config/en.us/models/generic11_m.swimdl
new file mode 100644
index 0000000..6b73c26
--- /dev/null
+++ b/config/en.us/models/generic11_m.swimdl
Binary files differ
diff --git a/config/en.us/models/generic8.lda b/config/en.us/models/generic8.lda
new file mode 100644
index 0000000..5811f58
--- /dev/null
+++ b/config/en.us/models/generic8.lda
Binary files differ
diff --git a/config/en.us/models/generic8_f.swimdl b/config/en.us/models/generic8_f.swimdl
new file mode 100644
index 0000000..8412fe8
--- /dev/null
+++ b/config/en.us/models/generic8_f.swimdl
Binary files differ
diff --git a/config/en.us/models/generic8_m.swimdl b/config/en.us/models/generic8_m.swimdl
new file mode 100644
index 0000000..e1ae564
--- /dev/null
+++ b/config/en.us/models/generic8_m.swimdl
Binary files differ
diff --git a/config/en.us/models/generic_f.swimdl b/config/en.us/models/generic_f.swimdl
new file mode 100644
index 0000000..24f4683
--- /dev/null
+++ b/config/en.us/models/generic_f.swimdl
Binary files differ
diff --git a/config/en.us/models/generic_m.swimdl b/config/en.us/models/generic_m.swimdl
new file mode 100644
index 0000000..6b73c26
--- /dev/null
+++ b/config/en.us/models/generic_m.swimdl
Binary files differ
diff --git a/config/en.us/models/models128x.map b/config/en.us/models/models128x.map
new file mode 100644
index 0000000..b3b8ef2
--- /dev/null
+++ b/config/en.us/models/models128x.map
@@ -0,0 +1,780 @@
+eps 0
+.wb 1
+.ph 2
+hmm003_# 3
+hmm004_# 4
+hmm005_# 5
+hmm006_( 6
+hmm007_) 7
+hmm008_) 8
+hmm009_) 9
+hmm010_) 10
+hmm011_) 11
+hmm012_) 12
+hmm013_) 13
+hmm014_) 14
+hmm015_, 15
+hmm016_, 16
+hmm017_. 17
+hmm018_. 18
+hmm019_/ 19
+hmm020_/ 20
+hmm021_/ 21
+hmm022_/ 22
+hmm023_/ 23
+hmm024_/ 24
+hmm025_/ 25
+hmm026_/ 26
+hmm027_/ 27
+hmm028_/ 28
+hmm029_0 29
+hmm030_0 30
+hmm031_0 31
+hmm032_0 32
+hmm033_0 33
+hmm034_1 34
+hmm035_1 35
+hmm036_1 36
+hmm037_1 37
+hmm038_1 38
+hmm039_1 39
+hmm040_1 40
+hmm041_1 41
+hmm042_1 42
+hmm043_1 43
+hmm044_1 44
+hmm045_1 45
+hmm046_1 46
+hmm047_1 47
+hmm048_2 48
+hmm049_2 49
+hmm050_2 50
+hmm051_2 51
+hmm052_2 52
+hmm053_2 53
+hmm054_2 54
+hmm055_2 55
+hmm056_2 56
+hmm057_2 57
+hmm058_2 58
+hmm059_2 59
+hmm060_2 60
+hmm061_2 61
+hmm062_3 62
+hmm063_3 63
+hmm064_3 64
+hmm066a_4 65
+hmm066_4 66
+hmm066b_4 67
+hmm066c_4 68
+hmm069_5 69
+hmm070_5 70
+hmm071_5 71
+hmm072_5 72
+hmm073_5 73
+hmm074_5 74
+hmm075_5 75
+hmm076_5 76
+hmm077_5 77
+hmm078_6 78
+hmm079_6 79
+hmm080_6 80
+hmm081_6 81
+hmm082_6 82
+hmm083_6 83
+hmm084_6 84
+hmm085_6 85
+hmm086_6 86
+hmm087_6 87
+hmm088_6 88
+hmm089_6 89
+hmm090_6 90
+hmm091_6 91
+hmm092_6 92
+hmm093_6 93
+hmm094_6 94
+hmm095_6 95
+hmm096_6 96
+hmm097_6 97
+hmm098_7 98
+hmm099_7 99
+hmm100_8 100
+hmm101_8 101
+hmm102_9 102
+hmm103_< 103
+hmm104_< 104
+hmm105_< 105
+hmm106_= 106
+hmm107_= 107
+hmm108_= 108
+hmm109_> 109
+hmm110_> 110
+hmm111_? 111
+hmm112_? 112
+hmm113_? 113
+hmm114_? 114
+hmm115_? 115
+hmm116_? 116
+hmm117_? 117
+hmm118_@ 118
+hmm119_@ 119
+hmm120_@ 120
+hmm121_@ 121
+hmm122_@ 122
+hmm123_@ 123
+hmm124_@ 124
+hmm125_@ 125
+hmm126_@ 126
+hmm127_@ 127
+hmm128_@ 128
+hmm129_@ 129
+hmm130_@ 130
+hmm131_A 131
+hmm132_A 132
+hmm133_A 133
+hmm134_A 134
+hmm135_A 135
+hmm136_A 136
+hmm137_A 137
+hmm138_A 138
+hmm139_A 139
+hmm140_A 140
+hmm141_A 141
+hmm142_A 142
+hmm143_A 143
+hmm144_A 144
+hmm145_A 145
+hmm146_A 146
+hmm147_B 147
+hmm148_B 148
+hmm149_B 149
+hmm150_B 150
+hmm151_B 151
+hmm152_B 152
+hmm153_C 153
+hmm154_C 154
+hmm155_C 155
+hmm156_C 156
+hmm157_C 157
+hmm158_C 158
+hmm159_C 159
+hmm160_D 160
+hmm161_D 161
+hmm162_D 162
+hmm163_D 163
+hmm164_E 164
+hmm165_E 165
+hmm166_E 166
+hmm167_E 167
+hmm168_E 168
+hmm169_E 169
+hmm170_E 170
+hmm171_E 171
+hmm172_E 172
+hmm173_E 173
+hmm174_E 174
+hmm175_E 175
+hmm176_E 176
+hmm177_E 177
+hmm178_E 178
+hmm179_E 179
+hmm180_E 180
+hmm181_E 181
+hmm182_E 182
+hmm183_F 183
+hmm184_G 184
+hmm185_G 185
+hmm186_G 186
+hmm187_G 187
+hmm188_H 188
+hmm189_H 189
+hmm190_H 190
+hmm191_H 191
+hmm192_H 192
+hmm193_H 193
+hmm194_I 194
+hmm195_I 195
+hmm196_I 196
+hmm197_I 197
+hmm198_I 198
+hmm199_I 199
+hmm200_I 200
+hmm201_I 201
+hmm202_I 202
+hmm203_I 203
+hmm204_I 204
+hmm205_I 205
+hmm206_I 206
+hmm207_I 207
+hmm208_I 208
+hmm209_K 209
+hmm210_K 210
+hmm211_L 211
+hmm212_L 212
+hmm213_L 213
+hmm214_L 214
+hmm215_L 215
+hmm216_L 216
+hmm217_L 217
+hmm218_L 218
+hmm219_L 219
+hmm220_M 220
+hmm221_M 221
+hmm222_N 222
+hmm223_N 223
+hmm224_N 224
+hmm225_N 225
+hmm226_O 226
+hmm227_O 227
+hmm228_O 228
+hmm229_O 229
+hmm230_O 230
+hmm231_O 231
+hmm232_O 232
+hmm233_O 233
+hmm234_O 234
+hmm235_O 235
+hmm236_O 236
+hmm237_O 237
+hmm238_O 238
+hmm239_P 239
+hmm240_P 240
+hmm241_P 241
+hmm242_P 242
+hmm243_P 243
+hmm244_P 244
+hmm245_P 245
+hmm246_P 246
+hmm247_P 247
+hmm248_P 248
+hmm249_P 249
+hmm250_P 250
+hmm251_P 251
+hmm252_P 252
+hmm253_P 253
+hmm254_P 254
+hmm255_P 255
+hmm256_Q 256
+hmm257_Q 257
+hmm258_R 258
+hmm259_R 259
+hmm260_R 260
+hmm261_R 261
+hmm262_R 262
+hmm263_R 263
+hmm264_R 264
+hmm265_R 265
+hmm266_R 266
+hmm267_R 267
+hmm268_R 268
+hmm269_S 269
+hmm270_S 270
+hmm271_S 271
+hmm272_S 272
+hmm273_S 273
+hmm274_S 274
+hmm275_S 275
+hmm276_S 276
+hmm277_T 277
+hmm278_T 278
+hmm279_T 279
+hmm280_T 280
+hmm281_T 281
+hmm282_T 282
+hmm283_T 283
+hmm284_U 284
+hmm285_U 285
+hmm286_U 286
+hmm287_U 287
+hmm288_U 288
+hmm289_U 289
+hmm290_U 290
+hmm291_U 291
+hmm292_U 292
+hmm293_U 293
+hmm294_U 294
+hmm295_U 295
+hmm296_V 296
+hmm297_V 297
+hmm298_V 298
+hmm299_V 299
+hmm300_V 300
+hmm301_V 301
+hmm302_W 302
+hmm303_X 303
+hmm304_X 304
+hmm305_X 305
+hmm306_Y 306
+hmm307_Y 307
+hmm308_Y 308
+hmm309_Y 309
+hmm310_Z 310
+hmm311_[ 311
+hmm312_\ 312
+hmm313_] 313
+hmm314_] 314
+hmm315_] 315
+hmm316_] 316
+hmm317_] 317
+hmm318_a 318
+hmm319_a 319
+hmm320_a 320
+hmm321_a 321
+hmm322_a 322
+hmm323_a 323
+hmm324_a 324
+hmm325_a 325
+hmm326_a 326
+hmm327_a 327
+hmm328_a 328
+hmm329_a 329
+hmm330_a 330
+hmm331_a 331
+hmm332_a 332
+hmm333_a 333
+hmm334_a 334
+hmm335_a 335
+hmm336_a 336
+hmm337_a 337
+hmm338_a 338
+hmm339_b 339
+hmm340_b 340
+hmm341_b 341
+hmm342_b 342
+hmm343_b 343
+hmm344_b 344
+hmm345_b 345
+hmm346_b 346
+hmm347_b 347
+hmm348_b 348
+hmm349_b 349
+hmm350_b 350
+hmm351_c 351
+hmm352_c 352
+hmm353_d 353
+hmm354_d 354
+hmm355_d 355
+hmm356_d 356
+hmm357_d 357
+hmm358_d 358
+hmm359_d 359
+hmm360_d 360
+hmm361_d 361
+hmm362_d 362
+hmm363_d 363
+hmm364_d 364
+hmm365_d 365
+hmm366_d 366
+hmm367_d 367
+hmm368_d 368
+hmm369_d 369
+hmm370_d 370
+hmm371_d 371
+hmm372_d 372
+hmm373_d 373
+hmm374_d 374
+hmm375_d 375
+hmm376_d 376
+hmm377_d 377
+hmm378_d 378
+hmm379_d 379
+hmm380_e 380
+hmm381_e 381
+hmm382_e 382
+hmm383_e 383
+hmm384_e 384
+hmm385_e 385
+hmm386_e 386
+hmm387_e 387
+hmm388_e 388
+hmm389_e 389
+hmm390_e 390
+hmm391_e 391
+hmm392_e 392
+hmm393_e 393
+hmm394_e 394
+hmm395_e 395
+hmm396_e 396
+hmm397_e 397
+hmm398_e 398
+hmm399_e 399
+hmm400_e 400
+hmm401_e 401
+hmm402_e 402
+hmm403_e 403
+hmm404_e 404
+hmm405_e 405
+hmm406_e 406
+hmm407_f 407
+hmm408_f 408
+hmm409_f 409
+hmm410_f 410
+hmm411_f 411
+hmm412_f 412
+hmm413_f 413
+hmm414_f 414
+hmm415_f 415
+hmm416_f 416
+hmm417_f 417
+hmm418_f 418
+hmm419_g 419
+hmm420_g 420
+hmm421_g 421
+hmm422_g 422
+hmm423_g 423
+hmm424_g 424
+hmm425_h 425
+hmm426_h 426
+hmm427_h 427
+hmm428_h 428
+hmm429_h 429
+hmm430_h 430
+hmm431_h 431
+hmm432_i 432
+hmm433_i 433
+hmm434_i 434
+hmm435_i 435
+hmm436_i 436
+hmm437_i 437
+hmm438_i 438
+hmm439_i 439
+hmm440_i 440
+hmm441_i 441
+hmm442_i 442
+hmm443_i 443
+hmm444_i 444
+hmm445_i 445
+hmm446_i 446
+hmm447_i 447
+hmm448_i 448
+hmm449_i 449
+hmm450_j 450
+hmm451_j 451
+hmm452_j 452
+hmm453_j 453
+hmm454_j 454
+hmm455_j 455
+hmm456_j 456
+hmm457_j 457
+hmm458_k 458
+hmm459_k 459
+hmm460_k 460
+hmm461_k 461
+hmm462_k 462
+hmm463_k 463
+hmm464_k 464
+hmm465_k 465
+hmm466_k 466
+hmm467_k 467
+hmm468_k 468
+hmm469_k 469
+hmm470_k 470
+hmm471_k 471
+hmm472_k 472
+hmm473_k 473
+hmm474_k 474
+hmm475_k 475
+hmm476_l 476
+hmm477_l 477
+hmm478_l 478
+hmm479_l 479
+hmm480_l 480
+hmm481_l 481
+hmm482_l 482
+hmm483_l 483
+hmm484_l 484
+hmm485_l 485
+hmm486_l 486
+hmm487_l 487
+hmm488_l 488
+hmm489_l 489
+hmm490_l 490
+hmm491_l 491
+hmm492_l 492
+hmm493_l 493
+hmm494_l 494
+hmm495_l 495
+hmm496_l 496
+hmm497_l 497
+hmm498_l 498
+hmm499_l 499
+hmm500_l 500
+hmm501_m 501
+hmm502_m 502
+hmm503_m 503
+hmm504_m 504
+hmm505_m 505
+hmm506_m 506
+hmm507_m 507
+hmm508_m 508
+hmm509_m 509
+hmm510_m 510
+hmm511_m 511
+hmm512_m 512
+hmm513_m 513
+hmm514_m 514
+hmm515_m 515
+hmm516_m 516
+hmm517_m 517
+hmm518_m 518
+hmm519_m 519
+hmm520_m 520
+hmm521_m 521
+hmm522_m 522
+hmm523_n 523
+hmm524_n 524
+hmm525_n 525
+hmm526_n 526
+hmm527_n 527
+hmm528_n 528
+hmm529_n 529
+hmm530_n 530
+hmm531_n 531
+hmm532_n 532
+hmm533_n 533
+hmm534_n 534
+hmm535_n 535
+hmm536_n 536
+hmm537_n 537
+hmm538_n 538
+hmm539_n 539
+hmm540_n 540
+hmm541_n 541
+hmm542_n 542
+hmm543_n 543
+hmm544_n 544
+hmm545_n 545
+hmm546_n 546
+hmm547_n 547
+hmm548_n 548
+hmm549_n 549
+hmm550_n 550
+hmm551_n 551
+hmm552_o 552
+hmm553_o 553
+hmm554_o 554
+hmm555_o 555
+hmm556_o 556
+hmm557_o 557
+hmm558_o 558
+hmm559_o 559
+hmm560_o 560
+hmm561_p 561
+hmm562_p 562
+hmm563_p 563
+hmm564_p 564
+hmm565_p 565
+hmm566_p 566
+hmm567_p 567
+hmm568_p 568
+hmm569_p 569
+hmm570_p 570
+hmm571_p 571
+hmm572_p 572
+hmm573_p 573
+hmm574_q 574
+hmm575_q 575
+hmm576_q 576
+hmm577_r 577
+hmm578_r 578
+hmm579_r 579
+hmm580_r 580
+hmm581_r 581
+hmm582_r 582
+hmm583_r 583
+hmm584_r 584
+hmm585_r 585
+hmm586_r 586
+hmm587_r 587
+hmm588_r 588
+hmm589_r 589
+hmm590_r 590
+hmm591_r 591
+hmm592_r 592
+hmm593_r 593
+hmm594_r 594
+hmm595_r 595
+hmm596_r 596
+hmm597_r 597
+hmm598_r 598
+hmm599_r 599
+hmm600_r 600
+hmm601_r 601
+hmm602_r 602
+hmm603_r 603
+hmm604_r 604
+hmm605_r 605
+hmm606_s 606
+hmm607_s 607
+hmm608_s 608
+hmm609_s 609
+hmm610_s 610
+hmm611_s 611
+hmm612_s 612
+hmm613_s 613
+hmm614_s 614
+hmm615_s 615
+hmm616_s 616
+hmm617_s 617
+hmm618_s 618
+hmm619_s 619
+hmm620_s 620
+hmm621_s 621
+hmm622_s 622
+hmm623_s 623
+hmm624_s 624
+hmm625_s 625
+hmm626_s 626
+hmm627_s 627
+hmm628_s 628
+hmm629_s 629
+hmm630_s 630
+hmm631_t 631
+hmm632_t 632
+hmm633_t 633
+hmm634_t 634
+hmm635_t 635
+hmm636_t 636
+hmm637_t 637
+hmm638_t 638
+hmm639_t 639
+hmm640_t 640
+hmm641_t 641
+hmm642_t 642
+hmm643_t 643
+hmm644_t 644
+hmm645_t 645
+hmm646_t 646
+hmm647_t 647
+hmm648_t 648
+hmm649_t 649
+hmm650_t 650
+hmm651_t 651
+hmm652_t 652
+hmm653_t 653
+hmm654_t 654
+hmm655_t 655
+hmm656_t 656
+hmm657_t 657
+hmm658_t 658
+hmm659_t 659
+hmm660_u 660
+hmm661_u 661
+hmm662_u 662
+hmm663_u 663
+hmm664_u 664
+hmm665_u 665
+hmm666_u 666
+hmm667_u 667
+hmm668_u 668
+hmm669_u 669
+hmm670_u 670
+hmm671_u 671
+hmm672_u 672
+hmm673_u 673
+hmm674_v 674
+hmm675_v 675
+hmm676_v 676
+hmm677_v 677
+hmm678_v 678
+hmm679_v 679
+hmm680_v 680
+hmm681_v 681
+hmm682_v 682
+hmm683_v 683
+hmm684_v 684
+hmm685_v 685
+hmm686_w 686
+hmm687_w 687
+hmm688_w 688
+hmm689_w 689
+hmm690_w 690
+hmm691_w 691
+hmm692_w 692
+hmm693_w 693
+hmm694_w 694
+hmm695_w 695
+hmm696_w 696
+hmm697_w 697
+hmm698_x 698
+hmm699_x 699
+hmm700_x 700
+hmm701_x 701
+hmm702_y 702
+hmm703_y 703
+hmm704_y 704
+hmm705_y 705
+hmm706_y 706
+hmm707_y 707
+hmm708_y 708
+hmm709_y 709
+hmm710_y 710
+hmm711_y 711
+hmm712_z 712
+hmm713_z 713
+hmm714_z 714
+hmm715_z 715
+hmm716_z 716
+hmm717_z 717
+hmm718_z 718
+hmm719_z 719
+hmm720_z 720
+hmm721_z 721
+hmm722_z 722
+hmm723_z 723
+hmm724_z 724
+hmm725_z 725
+hmm726_z 726
+hmm727_z 727
+hmm728_z 728
+hmm729_z 729
+hmm730_z 730
+hmm731_{ 731
+hmm732_{ 732
+hmm733_{ 733
+hmm734_{ 734
+hmm735_{ 735
+hmm736_{ 736
+hmm737_{ 737
+hmm738_{ 738
+hmm739_{ 739
+hmm740_{ 740
+hmm741_{ 741
+hmm742_{ 742
+hmm743_{ 743
+hmm744_{ 744
+hmm745_| 745
+hmm746_| 746
+hmm747_| 747
+hmm748_| 748
+hmm749_| 749
+hmm750_| 750
+hmm751_| 751
+hmm752_| 752
+hmm753_| 753
+hmm754_| 754
+hmm755_} 755
+hmm756_} 756
+hmm757_~ 757
+hmm758_~ 758
+hmm759_~ 759
+hmm760_~ 760
+hmm761_~ 761
+hmm762_~ 762
+hmm763_~ 763
+hmm764_~ 764
+hmm765_~ 765
+hmm766_~ 766
+hmm767_~ 767
+hmm768_~ 768
+hmm769_~ 769
+hmm770_~ 770
+hmm771_+ 771
+hmm772_+ 772
+hmm773_+ 773
+hmm774_+ 774
+hmm775_+ 775
+hmm776_+ 776
+hmm777_+ 777
+hmm778_^ 778
+hmm779_J 779
diff --git a/config/en.us/models/phones.map b/config/en.us/models/phones.map
new file mode 100644
index 0000000..b56bbd8
--- /dev/null
+++ b/config/en.us/models/phones.map
@@ -0,0 +1,128 @@
+eps 0
+.wb 1
+phn2 2
+phn3 3
+phn4 4
+phn5 5
+phn6 6
+phn7 7
+phn8 8
+phn9 9
+phn10 10
+phn11 11
+phn12 12
+phn13 13
+phn14 14
+phn15 15
+phn16 16
+phn17 17
+phn18 18
+phn19 19
+phn20 20
+phn21 21
+phn22 22
+phn23 23
+phn24 24
+phn25 25
+phn26 26
+phn27 27
+phn28 28
+phn29 29
+phn30 30
+phn31 31
+phn32 32
+! 33
+" 34
+# 35
+$ 36
+% 37
+& 38
+' 39
+( 40
+) 41
+* 42
++ 43
+, 44
+- 45
+. 46
+/ 47
+0 48
+1 49
+2 50
+3 51
+4 52
+5 53
+6 54
+7 55
+8 56
+9 57
+: 58
+; 59
+< 60
+= 61
+> 62
+? 63
+@ 64
+A 65
+B 66
+C 67
+D 68
+E 69
+F 70
+G 71
+H 72
+I 73
+J 74
+K 75
+L 76
+M 77
+N 78
+O 79
+P 80
+Q 81
+R 82
+S 83
+T 84
+U 85
+V 86
+W 87
+X 88
+Y 89
+Z 90
+[ 91
+\ 92
+] 93
+^ 94
+_ 95
+` 96
+a 97
+b 98
+c 99
+d 100
+e 101
+f 102
+g 103
+h 104
+i 105
+j 106
+k 107
+l 108
+m 109
+n 110
+o 111
+p 112
+q 113
+r 114
+s 115
+t 116
+u 117
+v 118
+w 119
+x 120
+y 121
+z 122
+{ 123
+| 124
+} 125
+~ 126
++ 127
diff --git a/config/en.us/run-bothtags5-from-saved.sh b/config/en.us/run-bothtags5-from-saved.sh
new file mode 100755
index 0000000..6a75eff
--- /dev/null
+++ b/config/en.us/run-bothtags5-from-saved.sh
@@ -0,0 +1,17 @@
+/system/bin/SRecTest -parfile baseline11k.par -tcp tcp/bothtags5_from_saved.tcp -datapath audio/ >out_SHIP_bothtags5_from_saved.txt 2>&1
+
+# mv is not supported on Android device
+# mv -f recog4.res recog4_SHIP_bothtags5_from_saved.res
+# mv a1__VCE_Pete_Gonzalez.raw  linux_ship_a1__VCE_Pete_Gonzalez_from_saved.raw
+# mv a2__VCE_Andrew_Evans.raw   linux_ship_a2__VCE_Andrew_Evans_from_saved.raw
+# mv a3__VCE_Peter_Wilson.raw   linux_ship_a3__VCE_Peter_Wilson_from_saved.raw
+# mv a4__VCE_Edgar_Young.raw    linux_ship_a4__VCE_Edgar_Young_from_saved.raw
+# mv a5__VCE_John_Martinez.raw  linux_ship_a5__VCE_John_Martinez_from_saved.raw
+
+# use cat instead
+cat recog4.res                  > recog4_SHIP_bothtags5_from_saved.res
+cat a1__VCE_Pete_Gonzalez.raw  > linux_ship_a1__VCE_Pete_Gonzalez_from_saved.raw
+cat a2__VCE_Andrew_Evans.raw   > linux_ship_a2__VCE_Andrew_Evans_from_saved.raw
+cat a3__VCE_Peter_Wilson.raw   > linux_ship_a3__VCE_Peter_Wilson_from_saved.raw
+cat a4__VCE_Edgar_Young.raw    > linux_ship_a4__VCE_Edgar_Young_from_saved.raw
+cat a5__VCE_John_Martinez.raw  > linux_ship_a5__VCE_John_Martinez_from_saved.raw
diff --git a/config/en.us/run-bothtags5.sh b/config/en.us/run-bothtags5.sh
new file mode 100755
index 0000000..22753c4
--- /dev/null
+++ b/config/en.us/run-bothtags5.sh
@@ -0,0 +1,17 @@
+/system/bin/SRecTest -parfile baseline11k.par -tcp tcp/bothtags5.tcp -datapath audio/ >out_SHIP_bothtags5.txt 2>&1
+
+# mv is not supported on Android device
+# mv -f recog4.res recog4_SHIP_bothtags5.res
+# mv a1__VCE_Pete_Gonzalez.raw  linux_ship_a1__VCE_Pete_Gonzalez.raw
+# mv a2__VCE_Andrew_Evans.raw   linux_ship_a2__VCE_Andrew_Evans.raw
+# mv a3__VCE_Peter_Wilson.raw   linux_ship_a3__VCE_Peter_Wilson.raw
+# mv a4__VCE_Edgar_Young.raw    linux_ship_a4__VCE_Edgar_Young.raw
+# mv a5__VCE_John_Martinez.raw  linux_ship_a5__VCE_John_Martinez.raw
+
+# use cat instead
+cat recog4.res                  > recog4_SHIP_bothtags5.res
+cat a1__VCE_Pete_Gonzalez.raw  > linux_ship_a1__VCE_Pete_Gonzalez.raw
+cat a2__VCE_Andrew_Evans.raw   > linux_ship_a2__VCE_Andrew_Evans.raw
+cat a3__VCE_Peter_Wilson.raw   > linux_ship_a3__VCE_Peter_Wilson.raw
+cat a4__VCE_Edgar_Young.raw    > linux_ship_a4__VCE_Edgar_Young.raw
+cat a5__VCE_John_Martinez.raw  > linux_ship_a5__VCE_John_Martinez.raw
diff --git a/config/en.us/run-change-sample-rate2.sh b/config/en.us/run-change-sample-rate2.sh
new file mode 100755
index 0000000..e97e781
--- /dev/null
+++ b/config/en.us/run-change-sample-rate2.sh
@@ -0,0 +1,7 @@
+/system/bin/SRecTest -parfile baseline11k.par -tcp tcp/change_sample_rate2.tcp -datapath wave/ >out_SHIP_change_sample_rate2.txt 2>&1
+
+# mv is not supported on Android device
+# mv -f recog4.res recog4_SHIP_change_sample_rate2.res
+
+# use cat instead
+cat recog4.res > recog4_SHIP_change_sample_rate2.res
diff --git a/config/en.us/run-chmod.sh b/config/en.us/run-chmod.sh
new file mode 100755
index 0000000..1d17e22
--- /dev/null
+++ b/config/en.us/run-chmod.sh
@@ -0,0 +1,5 @@
+chmod 777 ./run-bothtags5.sh
+chmod 777 ./run-bothtags5-from-saved.sh
+chmod 777 ./run-liveaudio.sh
+chmod 777 ./run-set-get-param.sh
+chmod 777 ./run-change-sample-rate2.sh
diff --git a/config/en.us/run-liveaudio.sh b/config/en.us/run-liveaudio.sh
new file mode 100755
index 0000000..80e79d7
--- /dev/null
+++ b/config/en.us/run-liveaudio.sh
@@ -0,0 +1,7 @@
+/system/bin/SRecTestAudio -parfile baseline11k.par -tcp tcp/recognize_10_live.tcp
+
+# mv is not supported on Android device
+# mv -f recog4.res recog4_SHIP_liveaudio.res
+
+# use cat instead
+cat recog4.res > recog4_SHIP_liveaudio.res
diff --git a/config/en.us/run-set-get-param.sh b/config/en.us/run-set-get-param.sh
new file mode 100755
index 0000000..4ca88c1
--- /dev/null
+++ b/config/en.us/run-set-get-param.sh
@@ -0,0 +1,7 @@
+/system/bin/SRecTest -parfile baseline11k.par -tcp tcp/set_get_param.tcp -datapath wave/ >out_SHIP_set_get_param.txt 2>&1
+
+# mv is not supported on Android device
+# mv -f recog4.res recog4_SHIP_set_get_param.res
+
+# use cat instead
+cat recog4.res > recog4_SHIP_set_get_param.res
diff --git a/config/en.us/tcp/bothtags5.tcp b/config/en.us/tcp/bothtags5.tcp
new file mode 100644
index 0000000..bb91e9e
--- /dev/null
+++ b/config/en.us/tcp/bothtags5.tcp
@@ -0,0 +1,104 @@
+# this test describes operation of voicetags and texttags
+#
+# to run this script please be sure to prepare the input grammars
+#
+# grxmlcompile -par baseline11k.par -grxml bothtags5.grxml 
+# make_g2g -base bothtags5,addWords=100 -out bothtags5.g2g 
+# grxmlcompile -par baseline11k.par -grxml enroll.grxml
+# make_g2g -base enroll -out enroll.g2g
+#
+# now from the srec/config/en.us directory run the script with the following command line:
+#
+# /system/bin/SRecTest -parfile baseline11k.par -tcp tcp/bothtags5.tcp -datapath audio/ >out_SHIP_bothtags5.txt 2>&1
+#
+# VOICETAGS PREPARATION
+# let's load up the voice-enrollment "grammar" and refer to it as "ve" later
+# ROOT is the name of the rule we activate in that grammar, no other rule should work anyways
+context_load  grammars/bothtags5.g2g  BothTags   trash  not_ve
+context_load  grammars/enroll.g2g VoiceEnroll ROOT ve
+##context_load  grammars/bothtags5,addWords=100  BothTags   trash  not_ve
+##context_load  grammars/enroll VoiceEnroll ROOT ve
+#
+# VOICETAGS
+# the pattern for voicetags is :
+# (1) the we loadup the voice-enrollment grammar
+# (2) the user utters the training token for the "voicetag" (sometimes loosely called nametag)
+# (3) the voicetag "recognition result" from that training token is then added to a list of tags (for saving to disk)n
+# (4) the voicetag is also added to the primary recognition grammar
+context_use  VoiceEnroll
+recognize_nist  v139/v139_024.nwv 0 0 VCE_Pete_Gonzalez
+context_free  VoiceEnroll
+context_use  BothTags
+addword_from_last_nametag  @Names VCE_Pete_Gonzalez 0
+context_free  BothTags
+context_use VoiceEnroll
+recognize_nist  v139/v139_254.nwv 0 0 VCE_Andrew_Evans
+context_free  VoiceEnroll
+context_use  BothTags
+addword_from_last_nametag  @Names VCE_Andrew_Evans 0
+context_free  BothTags
+context_use VoiceEnroll
+recognize_nist  v139/v139_127.nwv 0 0 VCE_Peter_Wilson
+context_free  VoiceEnroll
+context_use  BothTags
+addword_from_last_nametag  @Names VCE_Peter_Wilson 0
+context_free  BothTags
+context_use  VoiceEnroll
+recognize_nist  v139/v139_107.nwv 0 0 VCE_Edgar_Young
+context_free  VoiceEnroll
+context_use BothTags
+addword_from_last_nametag  @Names VCE_Edgar_Young 0
+context_free  BothTags
+context_use VoiceEnroll
+recognize_nist  v139/v139_248.nwv 0 0 VCE_John_Martinez
+context_free  VoiceEnroll
+context_use  BothTags
+addword_from_last_nametag  @Names VCE_John_Martinez 0
+#
+# TEXTTAGS
+# The pattern for texttags is that we just add the texttag
+# since pronunciation guessing is not always available we're specifying
+# the pronunciation to be used for this text tag.
+# If NULL appears in the transcription field (immediately after the name)
+# then the phonetic transcription will be requested from the G2P
+# (Grapheme-to-Phoneme) module at runtime.
+#
+addword  @Names Jen_Parker NULL 0 V='Jen_Parker'
+addword  @Names Jennifer_Hernandez NULL 0 V='Jennifer_Hernandez'
+addword  @Names Barb_Baker NULL 0 V='Barb_Baker'
+addword  @Names Elaine NULL 0 V='Elaine'
+addword  @Names David NULL 0 V='David'
+#
+# RECOGNITION
+# prepare the recognition context for recognition
+context_compile
+#
+# ACTUAL RECOGNITION UTTERANCES
+#
+# These utterance test that we're able to recognize the voicetags
+recognize_nist  v139/v139_077.nwv 0 0 phone delete VCE_Pete_Gonzalez
+recognize_nist  v139/v139_040.nwv 0 0 phone delete VCE_Peter_Wilson
+recognize_nist  v139/v139_021.nwv 0 0 phone delete VCE_Edgar_Young
+recognize_nist  v139/v139_206.nwv 0 0 phone delete VCE_Andrew_Evans
+recognize_nist  v139/v139_103.nwv 0 0 phone delete VCE_John_Martinez
+#
+# CMD: context_reset
+# These utterances test that we're able to recognize the texttags
+recognize_nist  v139/v139_113.nwv 0 0 phone delete Jen_Parker
+recognize_nist  v139/v139_067.nwv 0 0 phone delete Jennifer_Hernandez
+recognize_nist  v139/v139_202.nwv 0 0 phone delete Barb_Baker
+recognize_nist  v139/v139_007.nwv 0 0 phone delete Elaine
+recognize_nist  v139/v139_189.nwv 0 0 phone delete David
+#
+#
+acousticstate_reset
+recognize_nist  m252/m252a12e.nwv 0 0 forward
+recognize_nist  m252/m252a22e.nwv 0 0 traffic
+recognize_nist  m252/m252a10e.nwv 0 0 changer
+recognize_nist  m252/m252a3fe.nwv 0 0 cd player
+recognize_nist  m252/m252a11e.nwv 0 0 traffic information
+recognize_nist  m252/m252a21e.nwv 0 0 traffic memory
+recognize_nist  m252/m252a24e.nwv 0 0 fahrenheit
+context_free  BothTags
+context_unload  VoiceEnroll
+context_unload  BothTags
diff --git a/config/en.us/tcp/bothtags5_from_saved.tcp b/config/en.us/tcp/bothtags5_from_saved.tcp
new file mode 100644
index 0000000..35704a7
--- /dev/null
+++ b/config/en.us/tcp/bothtags5_from_saved.tcp
@@ -0,0 +1,93 @@
+context_load  grammars/bothtags5.g2g  BothTags   trash  not_ve
+##context_load  grammars/bothtags5,addWords=100  BothTags   trash  not_ve
+context_load  grammars/enroll.g2g VoiceEnroll ROOT ve
+##context_load  grammars/enroll VoiceEnroll ROOT ve
+context_use  VoiceEnroll
+recognize_nist  v139/v139_024.nwv 0 0 VCE_Pete_Gonzalez
+context_free  VoiceEnroll
+
+context_use  BothTags
+addword_from_last_nametag  @Names VCE_Pete_Gonzalez 0
+context_free  BothTags
+context_use VoiceEnroll
+recognize_nist  v139/v139_254.nwv 0 0 VCE_Andrew_Evans
+context_free  VoiceEnroll
+context_use  BothTags
+addword_from_last_nametag  @Names VCE_Andrew_Evans 0
+context_free  BothTags
+context_use VoiceEnroll
+recognize_nist  v139/v139_127.nwv 0 0 VCE_Peter_Wilson
+context_free  VoiceEnroll
+context_use  BothTags
+addword_from_last_nametag  @Names VCE_Peter_Wilson 0
+context_free  BothTags
+context_use  VoiceEnroll
+recognize_nist  v139/v139_107.nwv 0 0 VCE_Edgar_Young
+context_free  VoiceEnroll
+context_use BothTags
+addword_from_last_nametag  @Names VCE_Edgar_Young 0
+context_free  BothTags
+context_use VoiceEnroll
+recognize_nist  v139/v139_248.nwv 0 0 VCE_John_Martinez
+context_free  VoiceEnroll
+context_use  BothTags
+addword_from_last_nametag  @Names VCE_John_Martinez 0
+#
+# TEXTTAGS
+# The pattern for texttags is that we just add the texttag
+# since pronunciation guessing is not always available we're specifying
+# the pronunciation to be used for this text tag.
+# If NULL appears in the transcription field (immediately after the name)
+# then the phonetic transcription will be requested from the G2P
+# (Grapheme-to-Phoneme) module at runtime.
+#
+addword  @Names Jen_Parker NULL 0 V='Jen_Parker'
+addword  @Names Jennifer_Hernandez NULL 0 V='Jennifer_Hernandez'
+addword  @Names Barb_Baker NULL 0 V='Barb_Baker'
+addword  @Names Elaine NULL 0 V='Elaine'
+addword  @Names David NULL 0 V='David'
+
+#
+# RECOGNITION
+# prepare the recognition context for recognition
+context_save bothtags5_saved.g2g
+# trouble starts
+context_free BothTags
+context_unload BothTags
+context_load bothtags5_saved.g2g BothTagsNew trash not_ve
+# trouble ends
+
+context_use BothTagsNew 
+context_compile
+
+#
+# ACTUAL RECOGNITION UTTERANCES
+#
+# These utterance test that we're able to recognize the voicetags
+recognize_nist  v139/v139_077.nwv 0 0 phone delete VCE_Pete_Gonzalez
+recognize_nist  v139/v139_040.nwv 0 0 phone delete VCE_Peter_Wilson
+recognize_nist  v139/v139_021.nwv 0 0 phone delete VCE_Edgar_Young
+recognize_nist  v139/v139_206.nwv 0 0 phone delete VCE_Andrew_Evans
+recognize_nist  v139/v139_103.nwv 0 0 phone delete VCE_John_Martinez
+#
+# CMD: context_reset
+# These utterances test that we're able to recognize the texttags
+recognize_nist  v139/v139_113.nwv 0 0 phone delete Jen_Parker
+recognize_nist  v139/v139_067.nwv 0 0 phone delete Jennifer_Hernandez
+recognize_nist  v139/v139_202.nwv 0 0 phone delete Barb_Baker
+recognize_nist  v139/v139_007.nwv 0 0 phone delete Elaine
+recognize_nist  v139/v139_189.nwv 0 0 phone delete David
+#
+#
+acousticstate_reset
+recognize_nist  m252/m252a12e.nwv 0 0 forward
+recognize_nist  m252/m252a22e.nwv 0 0 traffic
+recognize_nist  m252/m252a10e.nwv 0 0 changer
+recognize_nist  m252/m252a3fe.nwv 0 0 cd player
+recognize_nist  m252/m252a11e.nwv 0 0 traffic information
+recognize_nist  m252/m252a21e.nwv 0 0 traffic memory
+recognize_nist  m252/m252a24e.nwv 0 0 fahrenheit
+context_free  BothTagsNew 
+context_unload  BothTagsNew 
+
+context_unload  VoiceEnroll
diff --git a/config/en.us/tcp/change_sample_rate2.tcp b/config/en.us/tcp/change_sample_rate2.tcp
new file mode 100644
index 0000000..b2b6b72
--- /dev/null
+++ b/config/en.us/tcp/change_sample_rate2.tcp
@@ -0,0 +1,78 @@
+###########################################################
+#
+# setup, this is a test of sample rate switching
+#
+context_load  grammars/digits.g2g Digits trash not_ve
+############################################################
+#
+# 11kHz tests
+#
+context_use   Digits
+acousticstate_reset
+recognize_nist  dallas/0000/S072.nwf 0 0 oh eight four zero nine two five one eight five
+recognize_nist  dallas/0000/S074.nwf 0 0 eight six one oh five six six two six two
+recognize_nist  dallas/0000/S075.nwf 0 0 zero seven six five nine oh zero two five two
+recognize_nist  dallas/0000/S076.nwf 0 0 five zero two seven four nine three three zero zero
+recognize_nist  dallas/0000/S077.nwf 0 0 six nine five zero two eight seven seven three six
+recognize_nist  dallas/0000/S079.nwf 0 0 seven one one five six zero oh six five nine
+recognize_nist  dallas/0000/S080.nwf 0 0 seven oh three seven nine zero six eight five seven
+recognize_nist  dallas/0000/S083.nwf 0 0 zero nine nine five seven two oh one zero six
+recognize_nist  dallas/0000/S086.nwf 0 0 six eight seven two one oh eight five zero seven
+recognize_nist  dallas/0000/S088.nwf 0 0 four two zero eight five nine oh nine four zero
+acousticstate_reset
+recognize_nist  dallas/0300/S052.nwf 0 0 zero seven nine five two five seven six nine eight
+recognize_nist  dallas/0300/S053.nwf 0 0 eight three five seven nine zero three five two oh
+recognize_nist  dallas/0300/S057.nwf 0 0 eight four zero five six five four one four six
+recognize_nist  dallas/0300/S063.nwf 0 0 oh nine seven three one three zero five five zero
+recognize_nist  dallas/0300/S065.nwf 0 0 one three three three zero zero five oh oh six
+context_free    Digits
+############################################################
+#
+# 8kHz tests 
+#
+change_sample_rate 8000
+context_use   Digits
+acousticstate_reset
+recognize_nist  dallas-8kHz/0301/S078.nwf 0 0 six seven five seven zero zero two six seven zero
+recognize_nist  dallas-8kHz/0301/S079.nwf 0 0 zero seven nine six five one four eight one eight
+recognize_nist  dallas-8kHz/0301/S080.nwf 0 0 three eight eight seven oh nine one seven five two
+recognize_nist  dallas-8kHz/0301/S082.nwf 0 0 eight one two six three six two five one oh
+recognize_nist  dallas-8kHz/0301/S083.nwf 0 0 seven six zero eight three three zero five nine four
+recognize_nist  dallas-8kHz/0301/S089.nwf 0 0 nine seven zero six five nine six oh six five
+acousticstate_reset
+recognize_nist  dallas-8kHz/0302/S051.nwf 0 0 four nine seven eight four five eight two zero zero
+recognize_nist  dallas-8kHz/0302/S052.nwf 0 0 nine oh one one five oh oh seven five zero
+recognize_nist  dallas-8kHz/0302/S053.nwf 0 0 five zero nine two four four six two two three
+recognize_nist  dallas-8kHz/0302/S054.nwf 0 0 four nine three zero three oh five seven two three
+recognize_nist  dallas-8kHz/0302/S065.nwf 0 0 five six five four five five three eight six seven
+recognize_nist  dallas-8kHz/0302/S070.nwf 0 0 oh six two nine one five two nine five oh
+recognize_nist  dallas-8kHz/0302/S071.nwf 0 0 two zero five oh four nine two six five eight
+context_free    Digits
+############################################################
+#
+# back to 11kHz
+#
+change_sample_rate 11025
+context_use   Digits
+acousticstate_reset
+recognize_nist  dallas/0303/S080.nwf 0 0 six eight five four oh one six two seven three
+recognize_nist  dallas/0303/S083.nwf 0 0 three four three four eight four eight five six eight
+recognize_nist  dallas/0303/S084.nwf 0 0 one two eight five zero seven eight six seven one
+recognize_nist  dallas/0303/S087.nwf 0 0 oh five six eight eight nine five five one eight
+recognize_nist  dallas/0303/S088.nwf 0 0 five four four oh two one four four zero nine
+recognize_nist  dallas/0303/S089.nwf 0 0 oh five one oh six eight seven one zero nine
+recognize_nist  dallas/0303/S090.nwf 0 0 five nine zero two eight seven three three four three
+acousticstate_reset
+recognize_nist  dallas/0304/S052.nwf 0 0 nine five eight one eight five eight seven five
+recognize_nist  dallas/0304/S054.nwf 0 0 one zero nine two five four seven seven six seven
+recognize_nist  dallas/0304/S055.nwf 0 0 oh seven four five four oh seven three oh oh
+recognize_nist  dallas/0304/S074.nwf 0 0 eight six one oh five six six two six two
+recognize_nist  dallas/0304/S075.nwf 0 0 zero seven six five nine oh zero two five two
+recognize_nist  dallas/0304/S076.nwf 0 0 five zero two seven four nine three three zero zero
+recognize_nist  dallas/0304/S077.nwf 0 0 six nine five zero two eight seven seven three six
+context_free    Digits
+###########################################################
+#
+# wrap-up, this was a test of sample rate switching
+#
+context_unload  Digits
diff --git a/config/en.us/tcp/recognize_10_live.tcp b/config/en.us/tcp/recognize_10_live.tcp
new file mode 100644
index 0000000..b2103c0
--- /dev/null
+++ b/config/en.us/tcp/recognize_10_live.tcp
@@ -0,0 +1,14 @@
+context_load  grammars/bothtags5.g2g  BothTags   trash  not_ve
+context_use  BothTags
+recognize_live
+recognize_live
+recognize_live
+recognize_live
+recognize_live
+recognize_live
+recognize_live
+recognize_live
+recognize_live
+recognize_live
+context_free  BothTags
+context_unload  BothTags
diff --git a/config/en.us/tcp/recognize_1_live.tcp b/config/en.us/tcp/recognize_1_live.tcp
new file mode 100644
index 0000000..359e4f7
--- /dev/null
+++ b/config/en.us/tcp/recognize_1_live.tcp
@@ -0,0 +1,5 @@
+context_load  grammars/bothtags5.g2g  BothTags   trash  not_ve
+context_use  BothTags
+recognize_live
+context_free  BothTags
+context_unload  BothTags
diff --git a/config/en.us/tcp/set_get_param.tcp b/config/en.us/tcp/set_get_param.tcp
new file mode 100644
index 0000000..5a7aab7
--- /dev/null
+++ b/config/en.us/tcp/set_get_param.tcp
@@ -0,0 +1,15 @@
+get_size_t_parameter SREC.Recognizer.utterance_timeout 
+set_size_t_parameter SREC.Recognizer.utterance_timeout 100
+get_size_t_parameter SREC.Recognizer.utterance_timeout 
+get_size_t_parameter CREC.Recognizer.terminal_timeout 
+set_size_t_parameter CREC.Recognizer.terminal_timeout 100
+get_size_t_parameter CREC.Recognizer.terminal_timeout 
+get_size_t_parameter CREC.Recognizer.optional_terminal_timeout
+set_size_t_parameter CREC.Recognizer.optional_terminal_timeout 100
+get_size_t_parameter CREC.Recognizer.optional_terminal_timeout
+get_size_t_parameter CREC.Recognizer.non_terminal_timeout
+set_size_t_parameter CREC.Recognizer.non_terminal_timeout 100
+get_size_t_parameter CREC.Recognizer.non_terminal_timeout
+get_size_t_parameter CREC.Recognizer.eou_threshold
+set_size_t_parameter CREC.Recognizer.eou_threshold 100
+get_size_t_parameter CREC.Recognizer.eou_threshold
diff --git a/config/en.us/wave/dallas-8kHz/0301/S078.nwf b/config/en.us/wave/dallas-8kHz/0301/S078.nwf
new file mode 100644
index 0000000..e227842
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0301/S078.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0301/S079.nwf b/config/en.us/wave/dallas-8kHz/0301/S079.nwf
new file mode 100644
index 0000000..10af0fe
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0301/S079.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0301/S080.nwf b/config/en.us/wave/dallas-8kHz/0301/S080.nwf
new file mode 100644
index 0000000..a489545
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0301/S080.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0301/S082.nwf b/config/en.us/wave/dallas-8kHz/0301/S082.nwf
new file mode 100644
index 0000000..2cebf76
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0301/S082.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0301/S083.nwf b/config/en.us/wave/dallas-8kHz/0301/S083.nwf
new file mode 100644
index 0000000..b671763
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0301/S083.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0301/S089.nwf b/config/en.us/wave/dallas-8kHz/0301/S089.nwf
new file mode 100644
index 0000000..d693b7f
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0301/S089.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0302/S051.nwf b/config/en.us/wave/dallas-8kHz/0302/S051.nwf
new file mode 100644
index 0000000..6d9247d
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0302/S051.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0302/S052.nwf b/config/en.us/wave/dallas-8kHz/0302/S052.nwf
new file mode 100644
index 0000000..689659a
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0302/S052.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0302/S053.nwf b/config/en.us/wave/dallas-8kHz/0302/S053.nwf
new file mode 100644
index 0000000..eb84a93
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0302/S053.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0302/S054.nwf b/config/en.us/wave/dallas-8kHz/0302/S054.nwf
new file mode 100644
index 0000000..ef48e72
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0302/S054.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0302/S065.nwf b/config/en.us/wave/dallas-8kHz/0302/S065.nwf
new file mode 100644
index 0000000..e50e616
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0302/S065.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0302/S070.nwf b/config/en.us/wave/dallas-8kHz/0302/S070.nwf
new file mode 100644
index 0000000..65f31c0
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0302/S070.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas-8kHz/0302/S071.nwf b/config/en.us/wave/dallas-8kHz/0302/S071.nwf
new file mode 100644
index 0000000..03feddb
--- /dev/null
+++ b/config/en.us/wave/dallas-8kHz/0302/S071.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S072.nwf b/config/en.us/wave/dallas/0000/S072.nwf
new file mode 100644
index 0000000..1831f7f
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S072.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S074.nwf b/config/en.us/wave/dallas/0000/S074.nwf
new file mode 100644
index 0000000..dd8856e
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S074.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S075.nwf b/config/en.us/wave/dallas/0000/S075.nwf
new file mode 100644
index 0000000..1fbda97
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S075.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S076.nwf b/config/en.us/wave/dallas/0000/S076.nwf
new file mode 100644
index 0000000..80ab1c2
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S076.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S077.nwf b/config/en.us/wave/dallas/0000/S077.nwf
new file mode 100644
index 0000000..be1c2db
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S077.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S079.nwf b/config/en.us/wave/dallas/0000/S079.nwf
new file mode 100644
index 0000000..370a702
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S079.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S080.nwf b/config/en.us/wave/dallas/0000/S080.nwf
new file mode 100644
index 0000000..410a3c0
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S080.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S083.nwf b/config/en.us/wave/dallas/0000/S083.nwf
new file mode 100644
index 0000000..b9b85de
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S083.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S086.nwf b/config/en.us/wave/dallas/0000/S086.nwf
new file mode 100644
index 0000000..a1f006b
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S086.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0000/S088.nwf b/config/en.us/wave/dallas/0000/S088.nwf
new file mode 100644
index 0000000..0e08140
--- /dev/null
+++ b/config/en.us/wave/dallas/0000/S088.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0300/S052.nwf b/config/en.us/wave/dallas/0300/S052.nwf
new file mode 100644
index 0000000..ec76059
--- /dev/null
+++ b/config/en.us/wave/dallas/0300/S052.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0300/S053.nwf b/config/en.us/wave/dallas/0300/S053.nwf
new file mode 100644
index 0000000..ae36808
--- /dev/null
+++ b/config/en.us/wave/dallas/0300/S053.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0300/S057.nwf b/config/en.us/wave/dallas/0300/S057.nwf
new file mode 100644
index 0000000..40457c0
--- /dev/null
+++ b/config/en.us/wave/dallas/0300/S057.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0300/S063.nwf b/config/en.us/wave/dallas/0300/S063.nwf
new file mode 100644
index 0000000..b376044
--- /dev/null
+++ b/config/en.us/wave/dallas/0300/S063.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0300/S065.nwf b/config/en.us/wave/dallas/0300/S065.nwf
new file mode 100644
index 0000000..9839bad
--- /dev/null
+++ b/config/en.us/wave/dallas/0300/S065.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0303/S080.nwf b/config/en.us/wave/dallas/0303/S080.nwf
new file mode 100644
index 0000000..bc3f15c
--- /dev/null
+++ b/config/en.us/wave/dallas/0303/S080.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0303/S083.nwf b/config/en.us/wave/dallas/0303/S083.nwf
new file mode 100644
index 0000000..c267843
--- /dev/null
+++ b/config/en.us/wave/dallas/0303/S083.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0303/S084.nwf b/config/en.us/wave/dallas/0303/S084.nwf
new file mode 100644
index 0000000..734ee4a
--- /dev/null
+++ b/config/en.us/wave/dallas/0303/S084.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0303/S087.nwf b/config/en.us/wave/dallas/0303/S087.nwf
new file mode 100644
index 0000000..f7634dc
--- /dev/null
+++ b/config/en.us/wave/dallas/0303/S087.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0303/S088.nwf b/config/en.us/wave/dallas/0303/S088.nwf
new file mode 100644
index 0000000..bd8981a
--- /dev/null
+++ b/config/en.us/wave/dallas/0303/S088.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0303/S089.nwf b/config/en.us/wave/dallas/0303/S089.nwf
new file mode 100644
index 0000000..414ac38
--- /dev/null
+++ b/config/en.us/wave/dallas/0303/S089.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0303/S090.nwf b/config/en.us/wave/dallas/0303/S090.nwf
new file mode 100644
index 0000000..719bbde
--- /dev/null
+++ b/config/en.us/wave/dallas/0303/S090.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0304/S052.nwf b/config/en.us/wave/dallas/0304/S052.nwf
new file mode 100644
index 0000000..6e07793
--- /dev/null
+++ b/config/en.us/wave/dallas/0304/S052.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0304/S054.nwf b/config/en.us/wave/dallas/0304/S054.nwf
new file mode 100644
index 0000000..9beb8f9
--- /dev/null
+++ b/config/en.us/wave/dallas/0304/S054.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0304/S055.nwf b/config/en.us/wave/dallas/0304/S055.nwf
new file mode 100644
index 0000000..6b8e62c
--- /dev/null
+++ b/config/en.us/wave/dallas/0304/S055.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0304/S074.nwf b/config/en.us/wave/dallas/0304/S074.nwf
new file mode 100644
index 0000000..1fd3dc3
--- /dev/null
+++ b/config/en.us/wave/dallas/0304/S074.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0304/S075.nwf b/config/en.us/wave/dallas/0304/S075.nwf
new file mode 100644
index 0000000..bc71540
--- /dev/null
+++ b/config/en.us/wave/dallas/0304/S075.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0304/S076.nwf b/config/en.us/wave/dallas/0304/S076.nwf
new file mode 100644
index 0000000..931d526
--- /dev/null
+++ b/config/en.us/wave/dallas/0304/S076.nwf
Binary files differ
diff --git a/config/en.us/wave/dallas/0304/S077.nwf b/config/en.us/wave/dallas/0304/S077.nwf
new file mode 100644
index 0000000..4196362
--- /dev/null
+++ b/config/en.us/wave/dallas/0304/S077.nwf
Binary files differ
diff --git a/doc/Recognizer_status.pdf b/doc/Recognizer_status.pdf
new file mode 100644
index 0000000..30173bf
--- /dev/null
+++ b/doc/Recognizer_status.pdf
Binary files differ
diff --git a/doc/SREC_Architecture.pdf b/doc/SREC_Architecture.pdf
new file mode 100644
index 0000000..513044e
--- /dev/null
+++ b/doc/SREC_Architecture.pdf
Binary files differ
diff --git a/doc/SREC_User_Guide.pdf b/doc/SREC_User_Guide.pdf
new file mode 100644
index 0000000..a6ea1d8
--- /dev/null
+++ b/doc/SREC_User_Guide.pdf
Binary files differ
diff --git a/doc/SREC_and_UAPI_Release_Notes.pdf b/doc/SREC_and_UAPI_Release_Notes.pdf
new file mode 100644
index 0000000..7a568ab
--- /dev/null
+++ b/doc/SREC_and_UAPI_Release_Notes.pdf
Binary files differ
diff --git a/doc/SREC_eScript_Specification.pdf b/doc/SREC_eScript_Specification.pdf
new file mode 100644
index 0000000..d04b9ca
--- /dev/null
+++ b/doc/SREC_eScript_Specification.pdf
Binary files differ
diff --git a/doc/UAPI_Design.pdf b/doc/UAPI_Design.pdf
new file mode 100644
index 0000000..77f550a
--- /dev/null
+++ b/doc/UAPI_Design.pdf
Binary files differ
diff --git a/doc/UAPI_User_Guide.pdf b/doc/UAPI_User_Guide.pdf
new file mode 100644
index 0000000..36a0fc4
--- /dev/null
+++ b/doc/UAPI_User_Guide.pdf
Binary files differ
diff --git a/doc/doxygen.tar.gz b/doc/doxygen.tar.gz
new file mode 100644
index 0000000..98760b6
--- /dev/null
+++ b/doc/doxygen.tar.gz
Binary files differ
diff --git a/doc/logs/srec/bothtags5_saved.g2g b/doc/logs/srec/bothtags5_saved.g2g
new file mode 100644
index 0000000..0e019ba
--- /dev/null
+++ b/doc/logs/srec/bothtags5_saved.g2g
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a1__VCE_Pete_Gonzalez.raw b/doc/logs/srec/linux_ship_a1__VCE_Pete_Gonzalez.raw
new file mode 100644
index 0000000..9f0bf63
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a1__VCE_Pete_Gonzalez.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a1__VCE_Pete_Gonzalez_from_saved.raw b/doc/logs/srec/linux_ship_a1__VCE_Pete_Gonzalez_from_saved.raw
new file mode 100644
index 0000000..9f0bf63
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a1__VCE_Pete_Gonzalez_from_saved.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a2__VCE_Andrew_Evans.raw b/doc/logs/srec/linux_ship_a2__VCE_Andrew_Evans.raw
new file mode 100644
index 0000000..ec7497d
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a2__VCE_Andrew_Evans.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a2__VCE_Andrew_Evans_from_saved.raw b/doc/logs/srec/linux_ship_a2__VCE_Andrew_Evans_from_saved.raw
new file mode 100644
index 0000000..ec7497d
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a2__VCE_Andrew_Evans_from_saved.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a3__VCE_Peter_Wilson.raw b/doc/logs/srec/linux_ship_a3__VCE_Peter_Wilson.raw
new file mode 100644
index 0000000..1b32915
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a3__VCE_Peter_Wilson.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a3__VCE_Peter_Wilson_from_saved.raw b/doc/logs/srec/linux_ship_a3__VCE_Peter_Wilson_from_saved.raw
new file mode 100644
index 0000000..1b32915
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a3__VCE_Peter_Wilson_from_saved.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a4__VCE_Edgar_Young.raw b/doc/logs/srec/linux_ship_a4__VCE_Edgar_Young.raw
new file mode 100644
index 0000000..33dd9ff
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a4__VCE_Edgar_Young.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a4__VCE_Edgar_Young_from_saved.raw b/doc/logs/srec/linux_ship_a4__VCE_Edgar_Young_from_saved.raw
new file mode 100644
index 0000000..33dd9ff
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a4__VCE_Edgar_Young_from_saved.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a5__VCE_John_Martinez.raw b/doc/logs/srec/linux_ship_a5__VCE_John_Martinez.raw
new file mode 100644
index 0000000..4b42b1b
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a5__VCE_John_Martinez.raw
Binary files differ
diff --git a/doc/logs/srec/linux_ship_a5__VCE_John_Martinez_from_saved.raw b/doc/logs/srec/linux_ship_a5__VCE_John_Martinez_from_saved.raw
new file mode 100644
index 0000000..4b42b1b
--- /dev/null
+++ b/doc/logs/srec/linux_ship_a5__VCE_John_Martinez_from_saved.raw
Binary files differ
diff --git a/doc/logs/srec/out_SHIP_bothtags5.txt b/doc/logs/srec/out_SHIP_bothtags5.txt
new file mode 100644
index 0000000..65b9309
--- /dev/null
+++ b/doc/logs/srec/out_SHIP_bothtags5.txt
@@ -0,0 +1,606 @@
+
+Create Recognizer:
+    InitSession()
+    SR_RecognizerCreate()
+    SR_RecognizerSetup()
+Create vocabulary object and associate with grammar:
+    SR_VocabularyLoad()
+    SR_VocabularyGetLanguage()
+Start a new log session:
+    SR_RecognizerLogSessionStart()
+Recognize:
+    SR_NametagsCreate()
+Grammar Loaded
+Grammar Loaded
+D: v139/v139_024.nwv
+C: VCE_Pete_Gonzalez
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 191
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_Pete_Gonzalez'
+LITERAL[ 0]      : 'ph_EY ph_k ph_un ph_t ph_ih ph_OH1 ph_z'
+MEANING[ 0]      : ' ph_EY ph_k ph_un ph_t ph_ih ph_OH1 ph_z'
+CONFIDENCE VALUE : '191'
+RAW SCORE[ 0]    : '25016'
+
+LITERAL[ 1]      : 'ph_eh ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 1]      : ' ph_eh ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '36'
+RAW SCORE[ 1]    : '25023'
+
+LITERAL[ 2]      : 'ph_p ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 2]      : ' ph_p ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 2]    : '25024'
+
+LITERAL[ 3]      : 'ph_ul ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 3]      : ' ph_ul ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 3]    : '25025'
+
+LITERAL[ 4]      : 'ph_g ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 4]      : ' ph_g ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 4]    : '25027'
+
+LITERAL[ 5]      : 'ph_ih ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 5]      : ' ph_ih ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '25032'
+
+LITERAL[ 6]      : 'ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 6]      : ' ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '25037'
+
+LITERAL[ 7]      : 'ph_k ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 7]      : ' ph_k ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '25039'
+
+LITERAL[ 8]      : 'ph_dh ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 8]      : ' ph_dh ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '25043'
+
+LITERAL[ 9]      : 'ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 9]      : ' ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '25063'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a1__VCE_Pete_Gonzalez.raw
+Recognizer has been stopped
+D: v139/v139_254.nwv
+C: VCE_Andrew_Evans
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 279
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_Andrew_Evans'
+LITERAL[ 0]      : 'ph_eh ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d'
+MEANING[ 0]      : ' ph_eh ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d'
+CONFIDENCE VALUE : '279'
+RAW SCORE[ 0]    : '16401'
+
+LITERAL[ 1]      : 'ph_eh ph_n ph_d ph_r ph_IH1 ph_n ph_un ph_d'
+MEANING[ 1]      : ' ph_eh ph_n ph_d ph_r ph_IH1 ph_n ph_un ph_d'
+CONFIDENCE VALUE : '78'
+RAW SCORE[ 1]    : '16407'
+
+LITERAL[ 2]      : 'ph_eh ph_n ph_d ph_r ph_IH1 ph_r ph_un ph_d'
+MEANING[ 2]      : ' ph_eh ph_n ph_d ph_r ph_IH1 ph_r ph_un ph_d'
+CONFIDENCE VALUE : '22'
+RAW SCORE[ 2]    : '16412'
+
+LITERAL[ 3]      : 'ph_eh ph_n ph_d ph_r ph_r ph_un ph_d'
+MEANING[ 3]      : ' ph_eh ph_n ph_d ph_r ph_r ph_un ph_d'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 3]    : '16425'
+
+LITERAL[ 4]      : 'ph_eh ph_n ph_d ph_r ph_AE ph_m ph_un ph_d'
+MEANING[ 4]      : ' ph_eh ph_n ph_d ph_r ph_AE ph_m ph_un ph_d'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 4]    : '16431'
+
+LITERAL[ 5]      : 'ph_eh ph_n ph_d ph_r ph_IH1 ph_un ph_d'
+MEANING[ 5]      : ' ph_eh ph_n ph_d ph_r ph_IH1 ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '16432'
+
+LITERAL[ 6]      : 'ph_eh ph_n ph_d ph_r ph_AE ph_n ph_un ph_d'
+MEANING[ 6]      : ' ph_eh ph_n ph_d ph_r ph_AE ph_n ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '16437'
+
+LITERAL[ 7]      : 'ph_eh ph_n ph_d ph_r ph_AE ph_r ph_un ph_d'
+MEANING[ 7]      : ' ph_eh ph_n ph_d ph_r ph_AE ph_r ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '16442'
+
+LITERAL[ 8]      : 'ph_AA ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d'
+MEANING[ 8]      : ' ph_AA ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '16443'
+
+LITERAL[ 9]      : 'ph_eh ph_n ph_d ph_r ph_ih ph_m ph_un ph_d'
+MEANING[ 9]      : ' ph_eh ph_n ph_d ph_r ph_ih ph_m ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '16443'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a2__VCE_Andrew_Evans.raw
+Recognizer has been stopped
+D: v139/v139_127.nwv
+C: VCE_Peter_Wilson
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 258
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_Peter_Wilson'
+LITERAL[ 0]      : 'ph_ih ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 0]      : ' ph_ih ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '258'
+RAW SCORE[ 0]    : '15199'
+
+LITERAL[ 1]      : 'ph_IH1 ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 1]      : ' ph_IH1 ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '67'
+RAW SCORE[ 1]    : '15200'
+
+LITERAL[ 2]      : 'ph_EY ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 2]      : ' ph_EY ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '17'
+RAW SCORE[ 2]    : '15207'
+
+LITERAL[ 3]      : 'ph_ih ph_r ph_w ph_EH1 ph_s ph_un'
+MEANING[ 3]      : ' ph_ih ph_r ph_w ph_EH1 ph_s ph_un'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 3]    : '15218'
+
+LITERAL[ 4]      : 'ph_IH1 ph_r ph_w ph_EH1 ph_s ph_un'
+MEANING[ 4]      : ' ph_IH1 ph_r ph_w ph_EH1 ph_s ph_un'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 4]    : '15219'
+
+LITERAL[ 5]      : 'ph_EY ph_r ph_w ph_EH1 ph_s ph_un'
+MEANING[ 5]      : ' ph_EY ph_r ph_w ph_EH1 ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '15226'
+
+LITERAL[ 6]      : 'ph_eh ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 6]      : ' ph_eh ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '15229'
+
+LITERAL[ 7]      : 'ph_AA ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 7]      : ' ph_AA ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '15234'
+
+LITERAL[ 8]      : 'ph_ih ph_r ph_w ph_IH1 ph_l ph_s ph_un'
+MEANING[ 8]      : ' ph_ih ph_r ph_w ph_IH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '15238'
+
+LITERAL[ 9]      : 'ph_IH1 ph_r ph_w ph_IH1 ph_l ph_s ph_un'
+MEANING[ 9]      : ' ph_IH1 ph_r ph_w ph_IH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '15239'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a3__VCE_Peter_Wilson.raw
+Recognizer has been stopped
+D: v139/v139_107.nwv
+C: VCE_Edgar_Young
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 228
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_Edgar_Young'
+LITERAL[ 0]      : 'ph_eh ph_d ph_r ph_y ph_UH1 ph_n ph_d'
+MEANING[ 0]      : ' ph_eh ph_d ph_r ph_y ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '228'
+RAW SCORE[ 0]    : '14538'
+
+LITERAL[ 1]      : 'ph_eh ph_g ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 1]      : ' ph_eh ph_g ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '47'
+RAW SCORE[ 1]    : '14540'
+
+LITERAL[ 2]      : 'ph_eh ph_d ph_y ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 2]      : ' ph_eh ph_d ph_y ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 2]    : '14541'
+
+LITERAL[ 3]      : 'ph_eh ph_t ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 3]      : ' ph_eh ph_t ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 3]    : '14545'
+
+LITERAL[ 4]      : 'ph_eh ph_d ph_AE ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 4]      : ' ph_eh ph_d ph_AE ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 4]    : '14546'
+
+LITERAL[ 5]      : 'ph_eh ph_d ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 5]      : ' ph_eh ph_d ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '14547'
+
+LITERAL[ 6]      : 'ph_eh ph_d ph_ih ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 6]      : ' ph_eh ph_d ph_ih ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '14547'
+
+LITERAL[ 7]      : 'ph_eh ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 7]      : ' ph_eh ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '14555'
+
+LITERAL[ 8]      : 'ph_eh ph_g ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 8]      : ' ph_eh ph_g ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '14557'
+
+LITERAL[ 9]      : 'ph_eh ph_t ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 9]      : ' ph_eh ph_t ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '14562'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a4__VCE_Edgar_Young.raw
+Recognizer has been stopped
+D: v139/v139_248.nwv
+C: VCE_John_Martinez
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 305
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_John_Martinez'
+LITERAL[ 0]      : 'ph_p ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 0]      : ' ph_p ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '305'
+RAW SCORE[ 0]    : '16945'
+
+LITERAL[ 1]      : 'ph_k ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 1]      : ' ph_k ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '85'
+RAW SCORE[ 1]    : '16965'
+
+LITERAL[ 2]      : 'ph_k ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 2]      : ' ph_k ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '26'
+RAW SCORE[ 2]    : '16970'
+
+LITERAL[ 3]      : 'ph_t ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 3]      : ' ph_t ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '7'
+RAW SCORE[ 3]    : '16975'
+
+LITERAL[ 4]      : 'ph_t ph_OO ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 4]      : ' ph_t ph_OO ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 4]    : '16990'
+
+LITERAL[ 5]      : 'ph_ih ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 5]      : ' ph_ih ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '17006'
+
+LITERAL[ 6]      : 'ph_p ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 6]      : ' ph_p ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '17011'
+
+LITERAL[ 7]      : 'ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 7]      : ' ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '17027'
+
+LITERAL[ 8]      : 'ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 8]      : ' ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '17030'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a5__VCE_John_Martinez.raw
+Recognizer has been stopped
+D: v139/v139_077.nwv
+C: phone delete VCE_Pete_Gonzalez
+Sem (1):  invocab=1
+S: 747
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_Pete_Gonzalez'
+LITERAL[ 0]      : 'phone delete VCE_Pete_Gonzalez'
+MEANING[ 0]      : 'DEL VCE_Pete_Gonzalez'
+CONFIDENCE VALUE : '747'
+RAW SCORE[ 0]    : '21902'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_040.nwv
+C: phone delete VCE_Peter_Wilson
+Sem (1):  invocab=1
+S: 497
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_Peter_Wilson'
+LITERAL[ 0]      : 'phone delete VCE_Peter_Wilson'
+MEANING[ 0]      : 'DEL VCE_Peter_Wilson'
+CONFIDENCE VALUE : '497'
+RAW SCORE[ 0]    : '19919'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_021.nwv
+C: phone delete VCE_Edgar_Young
+Sem (1):  invocab=1
+S: 719
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_Edgar_Young'
+LITERAL[ 0]      : 'phone delete VCE_Edgar_Young'
+MEANING[ 0]      : 'DEL VCE_Edgar_Young'
+CONFIDENCE VALUE : '719'
+RAW SCORE[ 0]    : '17946'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_206.nwv
+C: phone delete VCE_Andrew_Evans
+Sem (1):  invocab=1
+S: 678
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_Andrew_Evans'
+LITERAL[ 0]      : 'phone delete VCE_Andrew_Evans'
+MEANING[ 0]      : 'DEL VCE_Andrew_Evans'
+CONFIDENCE VALUE : '678'
+RAW SCORE[ 0]    : '17426'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_103.nwv
+C: phone delete VCE_John_Martinez
+Sem (1):  invocab=1
+S: 692
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_John_Martinez'
+LITERAL[ 0]      : 'phone delete VCE_John_Martinez'
+MEANING[ 0]      : 'DEL VCE_John_Martinez'
+CONFIDENCE VALUE : '692'
+RAW SCORE[ 0]    : '19618'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_113.nwv
+C: phone delete Jen_Parker
+Sem (1):  invocab=1
+S: 848
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete Jen_Parker'
+LITERAL[ 0]      : 'phone delete Jen_Parker'
+MEANING[ 0]      : 'DEL Jen_Parker'
+CONFIDENCE VALUE : '848'
+RAW SCORE[ 0]    : '18295'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_067.nwv
+C: phone delete Jennifer_Hernandez
+Sem (1):  invocab=1
+S: 900
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete Jennifer_Hernandez'
+LITERAL[ 0]      : 'phone delete Jennifer_Hernandez'
+MEANING[ 0]      : 'DEL Jennifer_Hernandez'
+CONFIDENCE VALUE : '900'
+RAW SCORE[ 0]    : '20075'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_202.nwv
+C: phone delete Barb_Baker
+Sem (1):  invocab=1
+S: 878
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete Barb_Baker'
+LITERAL[ 0]      : 'phone delete Barb_Baker'
+MEANING[ 0]      : 'DEL Barb_Baker'
+CONFIDENCE VALUE : '878'
+RAW SCORE[ 0]    : '15807'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_007.nwv
+C: phone delete Elaine
+Sem (1):  invocab=1
+S: 832
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete Elaine'
+LITERAL[ 0]      : 'phone delete Elaine'
+MEANING[ 0]      : 'DEL Elaine'
+CONFIDENCE VALUE : '832'
+RAW SCORE[ 0]    : '19576'
+
+LITERAL[ 1]      : 'phone delete David'
+MEANING[ 1]      : 'DEL David'
+CONFIDENCE VALUE : '411'
+RAW SCORE[ 1]    : '19963'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_189.nwv
+C: phone delete David
+Sem (1):  invocab=1
+S: 807
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete David'
+LITERAL[ 0]      : 'phone delete David'
+MEANING[ 0]      : 'DEL David'
+CONFIDENCE VALUE : '807'
+RAW SCORE[ 0]    : '12998'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a12e.nwv
+C: forward
+Sem (1):  invocab=1
+S: 661
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'forward'
+LITERAL[ 0]      : 'forward'
+MEANING[ 0]      : 'FWD'
+CONFIDENCE VALUE : '661'
+RAW SCORE[ 0]    : '13135'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a22e.nwv
+C: traffic
+Sem (1):  invocab=1
+S: 810
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'traffic'
+LITERAL[ 0]      : 'traffic'
+MEANING[ 0]      : 'TRFI'
+CONFIDENCE VALUE : '810'
+RAW SCORE[ 0]    : '14253'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a10e.nwv
+C: changer
+Sem (1):  invocab=1
+S: 806
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'changer'
+LITERAL[ 0]      : 'changer'
+MEANING[ 0]      : 'CHANGER'
+CONFIDENCE VALUE : '806'
+RAW SCORE[ 0]    : '14150'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a3fe.nwv
+C: cd player
+Sem (1):  invocab=1
+S: 877
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'cd player'
+LITERAL[ 0]      : 'cd player'
+MEANING[ 0]      : 'CDPL'
+CONFIDENCE VALUE : '877'
+RAW SCORE[ 0]    : '18357'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a11e.nwv
+C: traffic information
+Sem (1):  invocab=1
+S: 862
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'traffic information'
+LITERAL[ 0]      : 'traffic information'
+MEANING[ 0]      : 'TRFI'
+CONFIDENCE VALUE : '862'
+RAW SCORE[ 0]    : '19602'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a21e.nwv
+C: traffic memory
+Sem (1):  invocab=1
+S: 848
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'traffic memory'
+LITERAL[ 0]      : 'traffic memory'
+MEANING[ 0]      : 'TRFM'
+CONFIDENCE VALUE : '848'
+RAW SCORE[ 0]    : '15676'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a24e.nwv
+C: fahrenheit
+Sem (1):  invocab=1
+S: 252
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'fahrenheit'
+LITERAL[ 0]      : 'fahrenheit'
+MEANING[ 0]      : 'DEGF'
+CONFIDENCE VALUE : '252'
+RAW SCORE[ 0]    : '11640'
+
+----------------------------------------------
+
+Recognizer has been stopped
diff --git a/doc/logs/srec/out_SHIP_bothtags5_from_saved.txt b/doc/logs/srec/out_SHIP_bothtags5_from_saved.txt
new file mode 100644
index 0000000..dcd3f13
--- /dev/null
+++ b/doc/logs/srec/out_SHIP_bothtags5_from_saved.txt
@@ -0,0 +1,607 @@
+
+Create Recognizer:
+    InitSession()
+    SR_RecognizerCreate()
+    SR_RecognizerSetup()
+Create vocabulary object and associate with grammar:
+    SR_VocabularyLoad()
+    SR_VocabularyGetLanguage()
+Start a new log session:
+    SR_RecognizerLogSessionStart()
+Recognize:
+    SR_NametagsCreate()
+Grammar Loaded
+Grammar Loaded
+D: v139/v139_024.nwv
+C: VCE_Pete_Gonzalez
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 191
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_Pete_Gonzalez'
+LITERAL[ 0]      : 'ph_EY ph_k ph_un ph_t ph_ih ph_OH1 ph_z'
+MEANING[ 0]      : ' ph_EY ph_k ph_un ph_t ph_ih ph_OH1 ph_z'
+CONFIDENCE VALUE : '191'
+RAW SCORE[ 0]    : '25016'
+
+LITERAL[ 1]      : 'ph_eh ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 1]      : ' ph_eh ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '36'
+RAW SCORE[ 1]    : '25023'
+
+LITERAL[ 2]      : 'ph_p ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 2]      : ' ph_p ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 2]    : '25024'
+
+LITERAL[ 3]      : 'ph_ul ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 3]      : ' ph_ul ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 3]    : '25025'
+
+LITERAL[ 4]      : 'ph_g ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 4]      : ' ph_g ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 4]    : '25027'
+
+LITERAL[ 5]      : 'ph_ih ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 5]      : ' ph_ih ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '25032'
+
+LITERAL[ 6]      : 'ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 6]      : ' ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '25037'
+
+LITERAL[ 7]      : 'ph_k ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 7]      : ' ph_k ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '25039'
+
+LITERAL[ 8]      : 'ph_dh ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 8]      : ' ph_dh ph_y ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '25043'
+
+LITERAL[ 9]      : 'ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+MEANING[ 9]      : ' ph_ee ph_p ph_un ph_d ph_un ph_OH1 ph_z'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '25063'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a1__VCE_Pete_Gonzalez.raw
+Recognizer has been stopped
+D: v139/v139_254.nwv
+C: VCE_Andrew_Evans
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 279
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_Andrew_Evans'
+LITERAL[ 0]      : 'ph_eh ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d'
+MEANING[ 0]      : ' ph_eh ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d'
+CONFIDENCE VALUE : '279'
+RAW SCORE[ 0]    : '16401'
+
+LITERAL[ 1]      : 'ph_eh ph_n ph_d ph_r ph_IH1 ph_n ph_un ph_d'
+MEANING[ 1]      : ' ph_eh ph_n ph_d ph_r ph_IH1 ph_n ph_un ph_d'
+CONFIDENCE VALUE : '78'
+RAW SCORE[ 1]    : '16407'
+
+LITERAL[ 2]      : 'ph_eh ph_n ph_d ph_r ph_IH1 ph_r ph_un ph_d'
+MEANING[ 2]      : ' ph_eh ph_n ph_d ph_r ph_IH1 ph_r ph_un ph_d'
+CONFIDENCE VALUE : '22'
+RAW SCORE[ 2]    : '16412'
+
+LITERAL[ 3]      : 'ph_eh ph_n ph_d ph_r ph_r ph_un ph_d'
+MEANING[ 3]      : ' ph_eh ph_n ph_d ph_r ph_r ph_un ph_d'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 3]    : '16425'
+
+LITERAL[ 4]      : 'ph_eh ph_n ph_d ph_r ph_AE ph_m ph_un ph_d'
+MEANING[ 4]      : ' ph_eh ph_n ph_d ph_r ph_AE ph_m ph_un ph_d'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 4]    : '16431'
+
+LITERAL[ 5]      : 'ph_eh ph_n ph_d ph_r ph_IH1 ph_un ph_d'
+MEANING[ 5]      : ' ph_eh ph_n ph_d ph_r ph_IH1 ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '16432'
+
+LITERAL[ 6]      : 'ph_eh ph_n ph_d ph_r ph_AE ph_n ph_un ph_d'
+MEANING[ 6]      : ' ph_eh ph_n ph_d ph_r ph_AE ph_n ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '16437'
+
+LITERAL[ 7]      : 'ph_eh ph_n ph_d ph_r ph_AE ph_r ph_un ph_d'
+MEANING[ 7]      : ' ph_eh ph_n ph_d ph_r ph_AE ph_r ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '16442'
+
+LITERAL[ 8]      : 'ph_AA ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d'
+MEANING[ 8]      : ' ph_AA ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '16443'
+
+LITERAL[ 9]      : 'ph_eh ph_n ph_d ph_r ph_ih ph_m ph_un ph_d'
+MEANING[ 9]      : ' ph_eh ph_n ph_d ph_r ph_ih ph_m ph_un ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '16443'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a2__VCE_Andrew_Evans.raw
+Recognizer has been stopped
+D: v139/v139_127.nwv
+C: VCE_Peter_Wilson
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 258
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_Peter_Wilson'
+LITERAL[ 0]      : 'ph_ih ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 0]      : ' ph_ih ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '258'
+RAW SCORE[ 0]    : '15199'
+
+LITERAL[ 1]      : 'ph_IH1 ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 1]      : ' ph_IH1 ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '67'
+RAW SCORE[ 1]    : '15200'
+
+LITERAL[ 2]      : 'ph_EY ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 2]      : ' ph_EY ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '17'
+RAW SCORE[ 2]    : '15207'
+
+LITERAL[ 3]      : 'ph_ih ph_r ph_w ph_EH1 ph_s ph_un'
+MEANING[ 3]      : ' ph_ih ph_r ph_w ph_EH1 ph_s ph_un'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 3]    : '15218'
+
+LITERAL[ 4]      : 'ph_IH1 ph_r ph_w ph_EH1 ph_s ph_un'
+MEANING[ 4]      : ' ph_IH1 ph_r ph_w ph_EH1 ph_s ph_un'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 4]    : '15219'
+
+LITERAL[ 5]      : 'ph_EY ph_r ph_w ph_EH1 ph_s ph_un'
+MEANING[ 5]      : ' ph_EY ph_r ph_w ph_EH1 ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '15226'
+
+LITERAL[ 6]      : 'ph_eh ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 6]      : ' ph_eh ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '15229'
+
+LITERAL[ 7]      : 'ph_AA ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+MEANING[ 7]      : ' ph_AA ph_r ph_w ph_EH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '15234'
+
+LITERAL[ 8]      : 'ph_ih ph_r ph_w ph_IH1 ph_l ph_s ph_un'
+MEANING[ 8]      : ' ph_ih ph_r ph_w ph_IH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '15238'
+
+LITERAL[ 9]      : 'ph_IH1 ph_r ph_w ph_IH1 ph_l ph_s ph_un'
+MEANING[ 9]      : ' ph_IH1 ph_r ph_w ph_IH1 ph_l ph_s ph_un'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '15239'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a3__VCE_Peter_Wilson.raw
+Recognizer has been stopped
+D: v139/v139_107.nwv
+C: VCE_Edgar_Young
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 228
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_Edgar_Young'
+LITERAL[ 0]      : 'ph_eh ph_d ph_r ph_y ph_UH1 ph_n ph_d'
+MEANING[ 0]      : ' ph_eh ph_d ph_r ph_y ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '228'
+RAW SCORE[ 0]    : '14538'
+
+LITERAL[ 1]      : 'ph_eh ph_g ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 1]      : ' ph_eh ph_g ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '47'
+RAW SCORE[ 1]    : '14540'
+
+LITERAL[ 2]      : 'ph_eh ph_d ph_y ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 2]      : ' ph_eh ph_d ph_y ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 2]    : '14541'
+
+LITERAL[ 3]      : 'ph_eh ph_t ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 3]      : ' ph_eh ph_t ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 3]    : '14545'
+
+LITERAL[ 4]      : 'ph_eh ph_d ph_AE ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 4]      : ' ph_eh ph_d ph_AE ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 4]    : '14546'
+
+LITERAL[ 5]      : 'ph_eh ph_d ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 5]      : ' ph_eh ph_d ph_d ph_r ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '14547'
+
+LITERAL[ 6]      : 'ph_eh ph_d ph_ih ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 6]      : ' ph_eh ph_d ph_ih ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '14547'
+
+LITERAL[ 7]      : 'ph_eh ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 7]      : ' ph_eh ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '14555'
+
+LITERAL[ 8]      : 'ph_eh ph_g ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 8]      : ' ph_eh ph_g ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '14557'
+
+LITERAL[ 9]      : 'ph_eh ph_t ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+MEANING[ 9]      : ' ph_eh ph_t ph_d ph_OO ph_EE1 ph_UH1 ph_n ph_d'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '14562'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a4__VCE_Edgar_Young.raw
+Recognizer has been stopped
+D: v139/v139_248.nwv
+C: VCE_John_Martinez
+Sem:  <NO INTERPRETATION FOUND>
+CSem: <NO INTERPRETATION FOUND>
+S: 305
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'VCE_John_Martinez'
+LITERAL[ 0]      : 'ph_p ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 0]      : ' ph_p ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '305'
+RAW SCORE[ 0]    : '16945'
+
+LITERAL[ 1]      : 'ph_k ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 1]      : ' ph_k ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '85'
+RAW SCORE[ 1]    : '16965'
+
+LITERAL[ 2]      : 'ph_k ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 2]      : ' ph_k ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '26'
+RAW SCORE[ 2]    : '16970'
+
+LITERAL[ 3]      : 'ph_t ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 3]      : ' ph_t ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '7'
+RAW SCORE[ 3]    : '16975'
+
+LITERAL[ 4]      : 'ph_t ph_OO ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 4]      : ' ph_t ph_OO ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 4]    : '16990'
+
+LITERAL[ 5]      : 'ph_ih ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 5]      : ' ph_ih ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '17006'
+
+LITERAL[ 6]      : 'ph_p ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 6]      : ' ph_p ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '17011'
+
+LITERAL[ 7]      : 'ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 7]      : ' ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '17027'
+
+LITERAL[ 8]      : 'ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+MEANING[ 8]      : ' ph_um ph_ur ph_k ph_y ph_n ph_ih ph_s'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '17030'
+
+----------------------------------------------
+
+VoiceEnrollment=>SUCCESS
+Dumping audio waveform to file a5__VCE_John_Martinez.raw
+Recognizer has been stopped
+Grammar Loaded
+D: v139/v139_077.nwv
+C: phone delete VCE_Pete_Gonzalez
+Sem (1):  invocab=1
+S: 747
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_Pete_Gonzalez'
+LITERAL[ 0]      : 'phone delete VCE_Pete_Gonzalez'
+MEANING[ 0]      : 'DEL VCE_Pete_Gonzalez'
+CONFIDENCE VALUE : '747'
+RAW SCORE[ 0]    : '21902'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_040.nwv
+C: phone delete VCE_Peter_Wilson
+Sem (1):  invocab=1
+S: 497
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_Peter_Wilson'
+LITERAL[ 0]      : 'phone delete VCE_Peter_Wilson'
+MEANING[ 0]      : 'DEL VCE_Peter_Wilson'
+CONFIDENCE VALUE : '497'
+RAW SCORE[ 0]    : '19919'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_021.nwv
+C: phone delete VCE_Edgar_Young
+Sem (1):  invocab=1
+S: 719
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_Edgar_Young'
+LITERAL[ 0]      : 'phone delete VCE_Edgar_Young'
+MEANING[ 0]      : 'DEL VCE_Edgar_Young'
+CONFIDENCE VALUE : '719'
+RAW SCORE[ 0]    : '17946'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_206.nwv
+C: phone delete VCE_Andrew_Evans
+Sem (1):  invocab=1
+S: 678
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_Andrew_Evans'
+LITERAL[ 0]      : 'phone delete VCE_Andrew_Evans'
+MEANING[ 0]      : 'DEL VCE_Andrew_Evans'
+CONFIDENCE VALUE : '678'
+RAW SCORE[ 0]    : '17426'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_103.nwv
+C: phone delete VCE_John_Martinez
+Sem (1):  invocab=1
+S: 692
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete VCE_John_Martinez'
+LITERAL[ 0]      : 'phone delete VCE_John_Martinez'
+MEANING[ 0]      : 'DEL VCE_John_Martinez'
+CONFIDENCE VALUE : '692'
+RAW SCORE[ 0]    : '19618'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_113.nwv
+C: phone delete Jen_Parker
+Sem (1):  invocab=1
+S: 848
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete Jen_Parker'
+LITERAL[ 0]      : 'phone delete Jen_Parker'
+MEANING[ 0]      : 'DEL Jen_Parker'
+CONFIDENCE VALUE : '848'
+RAW SCORE[ 0]    : '18295'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_067.nwv
+C: phone delete Jennifer_Hernandez
+Sem (1):  invocab=1
+S: 900
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete Jennifer_Hernandez'
+LITERAL[ 0]      : 'phone delete Jennifer_Hernandez'
+MEANING[ 0]      : 'DEL Jennifer_Hernandez'
+CONFIDENCE VALUE : '900'
+RAW SCORE[ 0]    : '20075'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_202.nwv
+C: phone delete Barb_Baker
+Sem (1):  invocab=1
+S: 878
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete Barb_Baker'
+LITERAL[ 0]      : 'phone delete Barb_Baker'
+MEANING[ 0]      : 'DEL Barb_Baker'
+CONFIDENCE VALUE : '878'
+RAW SCORE[ 0]    : '15807'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_007.nwv
+C: phone delete Elaine
+Sem (1):  invocab=1
+S: 832
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete Elaine'
+LITERAL[ 0]      : 'phone delete Elaine'
+MEANING[ 0]      : 'DEL Elaine'
+CONFIDENCE VALUE : '832'
+RAW SCORE[ 0]    : '19576'
+
+LITERAL[ 1]      : 'phone delete David'
+MEANING[ 1]      : 'DEL David'
+CONFIDENCE VALUE : '411'
+RAW SCORE[ 1]    : '19963'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: v139/v139_189.nwv
+C: phone delete David
+Sem (1):  invocab=1
+S: 807
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'phone delete David'
+LITERAL[ 0]      : 'phone delete David'
+MEANING[ 0]      : 'DEL David'
+CONFIDENCE VALUE : '807'
+RAW SCORE[ 0]    : '12998'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a12e.nwv
+C: forward
+Sem (1):  invocab=1
+S: 661
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'forward'
+LITERAL[ 0]      : 'forward'
+MEANING[ 0]      : 'FWD'
+CONFIDENCE VALUE : '661'
+RAW SCORE[ 0]    : '13135'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a22e.nwv
+C: traffic
+Sem (1):  invocab=1
+S: 810
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'traffic'
+LITERAL[ 0]      : 'traffic'
+MEANING[ 0]      : 'TRFI'
+CONFIDENCE VALUE : '810'
+RAW SCORE[ 0]    : '14253'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a10e.nwv
+C: changer
+Sem (1):  invocab=1
+S: 806
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'changer'
+LITERAL[ 0]      : 'changer'
+MEANING[ 0]      : 'CHANGER'
+CONFIDENCE VALUE : '806'
+RAW SCORE[ 0]    : '14150'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a3fe.nwv
+C: cd player
+Sem (1):  invocab=1
+S: 877
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'cd player'
+LITERAL[ 0]      : 'cd player'
+MEANING[ 0]      : 'CDPL'
+CONFIDENCE VALUE : '877'
+RAW SCORE[ 0]    : '18357'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a11e.nwv
+C: traffic information
+Sem (1):  invocab=1
+S: 862
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'traffic information'
+LITERAL[ 0]      : 'traffic information'
+MEANING[ 0]      : 'TRFI'
+CONFIDENCE VALUE : '862'
+RAW SCORE[ 0]    : '19602'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a21e.nwv
+C: traffic memory
+Sem (1):  invocab=1
+S: 848
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'traffic memory'
+LITERAL[ 0]      : 'traffic memory'
+MEANING[ 0]      : 'TRFM'
+CONFIDENCE VALUE : '848'
+RAW SCORE[ 0]    : '15676'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: m252/m252a24e.nwv
+C: fahrenheit
+Sem (1):  invocab=1
+S: 252
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'fahrenheit'
+LITERAL[ 0]      : 'fahrenheit'
+MEANING[ 0]      : 'DEGF'
+CONFIDENCE VALUE : '252'
+RAW SCORE[ 0]    : '11640'
+
+----------------------------------------------
+
+Recognizer has been stopped
diff --git a/doc/logs/srec/out_SHIP_change_sample_rate2.txt b/doc/logs/srec/out_SHIP_change_sample_rate2.txt
new file mode 100644
index 0000000..55de2e8
--- /dev/null
+++ b/doc/logs/srec/out_SHIP_change_sample_rate2.txt
@@ -0,0 +1,2534 @@
+
+Create Recognizer:
+    InitSession()
+    SR_RecognizerCreate()
+    SR_RecognizerSetup()
+Create vocabulary object and associate with grammar:
+    SR_VocabularyLoad()
+    SR_VocabularyGetLanguage()
+Start a new log session:
+    SR_RecognizerLogSessionStart()
+Recognize:
+    SR_NametagsCreate()
+Grammar Loaded
+D: dallas/0000/S072.nwf
+C: oh eight four zero nine two five one eight five
+Sem (1):  invocab=1
+S: 453
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'oh eight four zero nine two five one eight five'
+LITERAL[ 0]      : 'oh eight four nine two five one eight five'
+MEANING[ 0]      : '084925185'
+CONFIDENCE VALUE : '453'
+RAW SCORE[ 0]    : '44626'
+
+LITERAL[ 1]      : 'five four nine two five one eight five'
+MEANING[ 1]      : '54925185'
+CONFIDENCE VALUE : '195'
+RAW SCORE[ 1]    : '44790'
+
+LITERAL[ 2]      : 'oh eight four nine two five one eight five oh'
+MEANING[ 2]      : '0849251850'
+CONFIDENCE VALUE : '68'
+RAW SCORE[ 2]    : '44836'
+
+LITERAL[ 3]      : 'oh eight four nine two five one five'
+MEANING[ 3]      : '08492515'
+CONFIDENCE VALUE : '28'
+RAW SCORE[ 3]    : '44848'
+
+LITERAL[ 4]      : 'oh eight four oh nine two five one eight five'
+MEANING[ 4]      : '0840925185'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 4]    : '44861'
+
+LITERAL[ 5]      : 'oh oh eight four nine two five one eight five'
+MEANING[ 5]      : '0084925185'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 5]    : '44863'
+
+LITERAL[ 6]      : 'oh eight four nine two five one two five'
+MEANING[ 6]      : '084925125'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 6]    : '44865'
+
+LITERAL[ 7]      : 'oh eight four nine two five four eight five'
+MEANING[ 7]      : '084925485'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '44892'
+
+LITERAL[ 8]      : 'oh eight one nine two five one eight five'
+MEANING[ 8]      : '081925185'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '44893'
+
+LITERAL[ 9]      : 'oh eight four eight nine two five one eight five'
+MEANING[ 9]      : '0848925185'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '44905'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S074.nwf
+C: eight six one oh five six six two six two
+Sem (1):  invocab=1
+S: 289
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'eight six one oh five six six two six two'
+LITERAL[ 0]      : 'eight eight nine five eight eight two eight four'
+MEANING[ 0]      : '889588284'
+CONFIDENCE VALUE : '289'
+RAW SCORE[ 0]    : '39091'
+
+LITERAL[ 1]      : 'eight eight one five eight eight two eight four'
+MEANING[ 1]      : '881588284'
+CONFIDENCE VALUE : '82'
+RAW SCORE[ 1]    : '39126'
+
+LITERAL[ 2]      : 'eight eight five five eight eight two eight four'
+MEANING[ 2]      : '885588284'
+CONFIDENCE VALUE : '23'
+RAW SCORE[ 2]    : '39132'
+
+LITERAL[ 3]      : 'eight eight nine five eight eight two eight two'
+MEANING[ 3]      : '889588282'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 3]    : '39173'
+
+LITERAL[ 4]      : 'eight eight nine five eight eight six eight four'
+MEANING[ 4]      : '889588684'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 4]    : '39174'
+
+LITERAL[ 5]      : 'eight eight nine nine eight eight two eight four'
+MEANING[ 5]      : '889988284'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 5]    : '39191'
+
+LITERAL[ 6]      : 'eight eight nine five eight eight three eight four'
+MEANING[ 6]      : '889588384'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '39204'
+
+LITERAL[ 7]      : 'eight eight one five eight eight two eight two'
+MEANING[ 7]      : '881588282'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '39208'
+
+LITERAL[ 8]      : 'eight eight one five eight eight six eight four'
+MEANING[ 8]      : '881588684'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '39209'
+
+LITERAL[ 9]      : 'eight eight five five eight eight two eight two'
+MEANING[ 9]      : '885588282'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '39214'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S075.nwf
+C: zero seven six five nine oh zero two five two
+Sem (1):  invocab=1
+S: 376
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'zero seven six five nine oh zero two five two'
+LITERAL[ 0]      : 'zero seven six five nine oh zero two five two'
+MEANING[ 0]      : '0765900252'
+CONFIDENCE VALUE : '376'
+RAW SCORE[ 0]    : '44688'
+
+LITERAL[ 1]      : 'zero seven seven five nine oh zero two five two'
+MEANING[ 1]      : '0775900252'
+CONFIDENCE VALUE : '143'
+RAW SCORE[ 1]    : '44699'
+
+LITERAL[ 2]      : 'zero five six five nine oh zero two five two'
+MEANING[ 2]      : '0565900252'
+CONFIDENCE VALUE : '55'
+RAW SCORE[ 2]    : '44739'
+
+LITERAL[ 3]      : 'zero five seven five nine oh zero two five two'
+MEANING[ 3]      : '0575900252'
+CONFIDENCE VALUE : '21'
+RAW SCORE[ 3]    : '44750'
+
+LITERAL[ 4]      : 'zero seven six five nine nine zero two five two'
+MEANING[ 4]      : '0765990252'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 4]    : '44828'
+
+LITERAL[ 5]      : 'zero seven seven five nine nine zero two five two'
+MEANING[ 5]      : '0775990252'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 5]    : '44839'
+
+LITERAL[ 6]      : 'zero five six five nine nine zero two five two'
+MEANING[ 6]      : '0565990252'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 6]    : '44879'
+
+LITERAL[ 7]      : 'zero five seven five nine nine zero two five two'
+MEANING[ 7]      : '0575990252'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '44890'
+
+LITERAL[ 8]      : 'zero seven six five nine oh zero two five oh two'
+MEANING[ 8]      : '07659002502'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '44914'
+
+LITERAL[ 9]      : 'zero seven seven five nine oh zero two five oh two'
+MEANING[ 9]      : '07759002502'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '44925'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S076.nwf
+C: five zero two seven four nine three three zero zero
+Sem (1):  invocab=1
+S: 392
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'five zero two seven four nine three three zero zero'
+LITERAL[ 0]      : 'five zero two seven four nine three three zero zero'
+MEANING[ 0]      : '5027493300'
+CONFIDENCE VALUE : '392'
+RAW SCORE[ 0]    : '33178'
+
+LITERAL[ 1]      : 'five zero two seven four nine three three three zero'
+MEANING[ 1]      : '5027493330'
+CONFIDENCE VALUE : '150'
+RAW SCORE[ 1]    : '33224'
+
+LITERAL[ 2]      : 'oh zero two seven four nine three three zero zero'
+MEANING[ 2]      : '0027493300'
+CONFIDENCE VALUE : '55'
+RAW SCORE[ 2]    : '33254'
+
+LITERAL[ 3]      : 'five zero two seven four nine three three two zero'
+MEANING[ 3]      : '5027493320'
+CONFIDENCE VALUE : '21'
+RAW SCORE[ 3]    : '33269'
+
+LITERAL[ 4]      : 'oh zero two seven four nine three three three zero'
+MEANING[ 4]      : '0027493330'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 4]    : '33300'
+
+LITERAL[ 5]      : 'nine zero two seven four nine three three zero zero'
+MEANING[ 5]      : '9027493300'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 5]    : '33324'
+
+LITERAL[ 6]      : 'five zero two seven four five three three zero zero'
+MEANING[ 6]      : '5027453300'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 6]    : '33332'
+
+LITERAL[ 7]      : 'five zero two seven four nine three three seven zero'
+MEANING[ 7]      : '5027493370'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '33342'
+
+LITERAL[ 8]      : 'oh zero two seven four nine three three two zero'
+MEANING[ 8]      : '0027493320'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '33345'
+
+LITERAL[ 9]      : 'nine zero two seven four nine three three three zero'
+MEANING[ 9]      : '9027493330'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '33370'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S077.nwf
+C: six nine five zero two eight seven seven three six
+Sem (1):  invocab=1
+S: 493
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'six nine five zero two eight seven seven three six'
+LITERAL[ 0]      : 'six nine five zero two eight seven seven'
+MEANING[ 0]      : '69502877'
+CONFIDENCE VALUE : '493'
+RAW SCORE[ 0]    : '31833'
+
+LITERAL[ 1]      : 'six nine five zero two eight seven oh three'
+MEANING[ 1]      : '695028703'
+CONFIDENCE VALUE : '241'
+RAW SCORE[ 1]    : '31843'
+
+LITERAL[ 2]      : 'six nine five zero two eight seven seven three'
+MEANING[ 2]      : '695028773'
+CONFIDENCE VALUE : '119'
+RAW SCORE[ 2]    : '31862'
+
+LITERAL[ 3]      : 'six nine five zero two eight seven oh'
+MEANING[ 3]      : '69502870'
+CONFIDENCE VALUE : '56'
+RAW SCORE[ 3]    : '31908'
+
+LITERAL[ 4]      : 'six nine five zero two eight seven seven four'
+MEANING[ 4]      : '695028774'
+CONFIDENCE VALUE : '25'
+RAW SCORE[ 4]    : '31922'
+
+LITERAL[ 5]      : 'six nine five zero two eight seven seven five'
+MEANING[ 5]      : '695028775'
+CONFIDENCE VALUE : '11'
+RAW SCORE[ 5]    : '31933'
+
+LITERAL[ 6]      : 'six nine five zero two eight seven five'
+MEANING[ 6]      : '69502875'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 6]    : '31945'
+
+LITERAL[ 7]      : 'six nine five zero two eight seven five three'
+MEANING[ 7]      : '695028753'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 7]    : '31963'
+
+LITERAL[ 8]      : 'six nine five zero two eight seven oh three four'
+MEANING[ 8]      : '6950287034'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '31971'
+
+LITERAL[ 9]      : 'six nine five zero two eight seven oh three five'
+MEANING[ 9]      : '6950287035'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '31982'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S079.nwf
+C: seven one one five six zero oh six five nine
+Sem (1):  invocab=1
+S: 445
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'seven one one five six zero oh six five nine'
+LITERAL[ 0]      : 'seven one one five six zero oh six five nine'
+MEANING[ 0]      : '7115600659'
+CONFIDENCE VALUE : '445'
+RAW SCORE[ 0]    : '34104'
+
+LITERAL[ 1]      : 'seven one one five zero oh six five nine'
+MEANING[ 1]      : '711500659'
+CONFIDENCE VALUE : '195'
+RAW SCORE[ 1]    : '34159'
+
+LITERAL[ 2]      : 'oh one five six zero oh six five nine'
+MEANING[ 2]      : '015600659'
+CONFIDENCE VALUE : '82'
+RAW SCORE[ 2]    : '34193'
+
+LITERAL[ 3]      : 'seven oh one five six zero oh six five nine'
+MEANING[ 3]      : '7015600659'
+CONFIDENCE VALUE : '34'
+RAW SCORE[ 3]    : '34201'
+
+LITERAL[ 4]      : 'five one one five six zero oh six five nine'
+MEANING[ 4]      : '5115600659'
+CONFIDENCE VALUE : '14'
+RAW SCORE[ 4]    : '34212'
+
+LITERAL[ 5]      : 'seven one one five eight zero oh six five nine'
+MEANING[ 5]      : '7115800659'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 5]    : '34234'
+
+LITERAL[ 6]      : 'oh one one five six zero oh six five nine'
+MEANING[ 6]      : '0115600659'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 6]    : '34238'
+
+LITERAL[ 7]      : 'seven one one five four zero oh six five nine'
+MEANING[ 7]      : '7115400659'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 7]    : '34238'
+
+LITERAL[ 8]      : 'five oh one five six zero oh six five nine'
+MEANING[ 8]      : '5015600659'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '34240'
+
+LITERAL[ 9]      : 'oh one five zero oh six five nine'
+MEANING[ 9]      : '01500659'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '34248'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S080.nwf
+C: seven oh three seven nine zero six eight five seven
+Sem (1):  invocab=1
+S: 398
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'seven oh three seven nine zero six eight five seven'
+LITERAL[ 0]      : 'oh three seven nine zero six eight five seven'
+MEANING[ 0]      : '037906857'
+CONFIDENCE VALUE : '398'
+RAW SCORE[ 0]    : '31428'
+
+LITERAL[ 1]      : 'seven oh three seven nine zero six eight five seven'
+MEANING[ 1]      : '7037906857'
+CONFIDENCE VALUE : '161'
+RAW SCORE[ 1]    : '31440'
+
+LITERAL[ 2]      : 'five three seven nine zero six eight five seven'
+MEANING[ 2]      : '537906857'
+CONFIDENCE VALUE : '66'
+RAW SCORE[ 2]    : '31482'
+
+LITERAL[ 3]      : 'nine three seven nine zero six eight five seven'
+MEANING[ 3]      : '937906857'
+CONFIDENCE VALUE : '26'
+RAW SCORE[ 3]    : '31524'
+
+LITERAL[ 4]      : 'oh oh three seven nine zero six eight five seven'
+MEANING[ 4]      : '0037906857'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 4]    : '31558'
+
+LITERAL[ 5]      : 'oh three seven nine zero six two five seven'
+MEANING[ 5]      : '037906257'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 5]    : '31572'
+
+LITERAL[ 6]      : 'oh three seven nine zero six six five seven'
+MEANING[ 6]      : '037906657'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 6]    : '31573'
+
+LITERAL[ 7]      : 'five oh three seven nine zero six eight five seven'
+MEANING[ 7]      : '5037906857'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '31583'
+
+LITERAL[ 8]      : 'seven oh three seven nine zero six two five seven'
+MEANING[ 8]      : '7037906257'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '31584'
+
+LITERAL[ 9]      : 'seven oh three seven nine zero six six five seven'
+MEANING[ 9]      : '7037906657'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '31585'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S083.nwf
+C: zero nine nine five seven two oh one zero six
+Sem (1):  invocab=1
+S: 477
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'zero nine nine five seven two oh one zero six'
+LITERAL[ 0]      : 'zero nine nine five seven two oh one zero six'
+MEANING[ 0]      : '0995720106'
+CONFIDENCE VALUE : '477'
+RAW SCORE[ 0]    : '32352'
+
+LITERAL[ 1]      : 'zero nine nine five seven two one zero six'
+MEANING[ 1]      : '099572106'
+CONFIDENCE VALUE : '221'
+RAW SCORE[ 1]    : '32432'
+
+LITERAL[ 2]      : 'zero nine five seven two oh one zero six'
+MEANING[ 2]      : '095720106'
+CONFIDENCE VALUE : '106'
+RAW SCORE[ 2]    : '32437'
+
+LITERAL[ 3]      : 'zero nine nine five seven zero one zero six'
+MEANING[ 3]      : '099570106'
+CONFIDENCE VALUE : '49'
+RAW SCORE[ 3]    : '32486'
+
+LITERAL[ 4]      : 'zero nine five seven two one zero six'
+MEANING[ 4]      : '09572106'
+CONFIDENCE VALUE : '23'
+RAW SCORE[ 4]    : '32517'
+
+LITERAL[ 5]      : 'seven nine five seven two oh one zero six'
+MEANING[ 5]      : '795720106'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 5]    : '32522'
+
+LITERAL[ 6]      : 'zero nine nine five seven two oh one zero seven'
+MEANING[ 6]      : '0995720107'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 6]    : '32565'
+
+LITERAL[ 7]      : 'zero nine five seven zero one zero six'
+MEANING[ 7]      : '09570106'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 7]    : '32571'
+
+LITERAL[ 8]      : 'zero nine nine nine seven two oh one zero six'
+MEANING[ 8]      : '0999720106'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '32575'
+
+LITERAL[ 9]      : 'zero nine nine five seven two oh one zero six oh'
+MEANING[ 9]      : '09957201060'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '32579'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S086.nwf
+C: six eight seven two one oh eight five zero seven
+Sem (1):  invocab=1
+S: 556
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'six eight seven two one oh eight five zero seven'
+LITERAL[ 0]      : 'six eight seven two one oh eight five zero seven'
+MEANING[ 0]      : '6872108507'
+CONFIDENCE VALUE : '556'
+RAW SCORE[ 0]    : '33085'
+
+LITERAL[ 1]      : 'six six seven two one oh eight five zero seven'
+MEANING[ 1]      : '6672108507'
+CONFIDENCE VALUE : '280'
+RAW SCORE[ 1]    : '33265'
+
+LITERAL[ 2]      : 'six eight seven oh two one oh eight five zero seven'
+MEANING[ 2]      : '68702108507'
+CONFIDENCE VALUE : '136'
+RAW SCORE[ 2]    : '33300'
+
+LITERAL[ 3]      : 'six eight seven two one oh eight five zero seven oh'
+MEANING[ 3]      : '68721085070'
+CONFIDENCE VALUE : '65'
+RAW SCORE[ 3]    : '33303'
+
+LITERAL[ 4]      : 'oh six eight seven two one oh eight five zero seven'
+MEANING[ 4]      : '06872108507'
+CONFIDENCE VALUE : '37'
+RAW SCORE[ 4]    : '33326'
+
+LITERAL[ 5]      : 'six six seven oh two one oh eight five zero seven'
+MEANING[ 5]      : '66702108507'
+CONFIDENCE VALUE : '18'
+RAW SCORE[ 5]    : '33480'
+
+LITERAL[ 6]      : 'six six seven two one oh eight five zero seven oh'
+MEANING[ 6]      : '66721085070'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 6]    : '33483'
+
+LITERAL[ 7]      : 'oh six six seven two one oh eight five zero seven'
+MEANING[ 7]      : '06672108507'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 7]    : '33506'
+
+LITERAL[ 8]      : 'six eight seven oh two one oh eight five zero seven oh'
+MEANING[ 8]      : '687021085070'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '33518'
+
+LITERAL[ 9]      : 'oh six eight seven oh two one oh eight five zero seven'
+MEANING[ 9]      : '068702108507'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '33541'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0000/S088.nwf
+C: four two zero eight five nine oh nine four zero
+Sem (1):  invocab=1
+S: 490
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'four two zero eight five nine oh nine four zero'
+LITERAL[ 0]      : 'four two zero eight five nine oh nine four zero'
+MEANING[ 0]      : '4208590940'
+CONFIDENCE VALUE : '490'
+RAW SCORE[ 0]    : '34801'
+
+LITERAL[ 1]      : 'four two zero oh eight five nine oh nine four zero'
+MEANING[ 1]      : '42008590940'
+CONFIDENCE VALUE : '218'
+RAW SCORE[ 1]    : '34961'
+
+LITERAL[ 2]      : 'four two zero eight five nine one oh nine four zero'
+MEANING[ 2]      : '42085910940'
+CONFIDENCE VALUE : '97'
+RAW SCORE[ 2]    : '34989'
+
+LITERAL[ 3]      : 'four two zero eight five nine oh oh nine four zero'
+MEANING[ 3]      : '42085900940'
+CONFIDENCE VALUE : '41'
+RAW SCORE[ 3]    : '35033'
+
+LITERAL[ 4]      : 'four two zero eight five nine two oh nine four zero'
+MEANING[ 4]      : '42085920940'
+CONFIDENCE VALUE : '17'
+RAW SCORE[ 4]    : '35035'
+
+LITERAL[ 5]      : 'four two zero eight five nine eight oh nine four zero'
+MEANING[ 5]      : '42085980940'
+CONFIDENCE VALUE : '7'
+RAW SCORE[ 5]    : '35038'
+
+LITERAL[ 6]      : 'oh four two zero eight five nine oh nine four zero'
+MEANING[ 6]      : '04208590940'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 6]    : '35044'
+
+LITERAL[ 7]      : 'four two zero eight five five oh nine four zero'
+MEANING[ 7]      : '4208550940'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 7]    : '35081'
+
+LITERAL[ 8]      : 'four two zero eight five nine oh nine four zero oh'
+MEANING[ 8]      : '42085909400'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '35089'
+
+LITERAL[ 9]      : 'one two zero eight five nine oh nine four zero'
+MEANING[ 9]      : '1208590940'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '35090'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0300/S052.nwf
+C: zero seven nine five two five seven six nine eight
+Sem (1):  invocab=1
+S: 628
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'zero seven nine five two five seven six nine eight'
+LITERAL[ 0]      : 'zero seven nine five two five seven six nine eight'
+MEANING[ 0]      : '0795257698'
+CONFIDENCE VALUE : '628'
+RAW SCORE[ 0]    : '71731'
+
+LITERAL[ 1]      : 'zero seven nine five two five seven oh six nine eight'
+MEANING[ 1]      : '07952570698'
+CONFIDENCE VALUE : '340'
+RAW SCORE[ 1]    : '71975'
+
+LITERAL[ 2]      : 'zero seven nine five oh two five seven six nine eight'
+MEANING[ 2]      : '07950257698'
+CONFIDENCE VALUE : '184'
+RAW SCORE[ 2]    : '71980'
+
+LITERAL[ 3]      : 'zero seven nine oh five two five seven six nine eight'
+MEANING[ 3]      : '07905257698'
+CONFIDENCE VALUE : '103'
+RAW SCORE[ 3]    : '71981'
+
+LITERAL[ 4]      : 'oh zero seven nine five two five seven six nine eight'
+MEANING[ 4]      : '00795257698'
+CONFIDENCE VALUE : '59'
+RAW SCORE[ 4]    : '71990'
+
+LITERAL[ 5]      : 'zero seven nine five two five seven six oh nine eight'
+MEANING[ 5]      : '07952576098'
+CONFIDENCE VALUE : '33'
+RAW SCORE[ 5]    : '72040'
+
+LITERAL[ 6]      : 'two zero seven nine five two five seven six nine eight'
+MEANING[ 6]      : '20795257698'
+CONFIDENCE VALUE : '19'
+RAW SCORE[ 6]    : '72064'
+
+LITERAL[ 7]      : 'zero seven nine five two five seven six eight nine eight'
+MEANING[ 7]      : '07952576898'
+CONFIDENCE VALUE : '11'
+RAW SCORE[ 7]    : '72074'
+
+LITERAL[ 8]      : 'zero seven nine five oh two five seven oh six nine eight'
+MEANING[ 8]      : '079502570698'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 8]    : '72224'
+
+LITERAL[ 9]      : 'oh zero seven nine five two five seven oh six nine eight'
+MEANING[ 9]      : '007952570698'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 9]    : '72234'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0300/S053.nwf
+C: eight three five seven nine zero three five two oh
+Sem (1):  invocab=1
+S: 567
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'eight three five seven nine zero three five two oh'
+LITERAL[ 0]      : 'eight three five seven nine zero three five two oh'
+MEANING[ 0]      : '8357903520'
+CONFIDENCE VALUE : '567'
+RAW SCORE[ 0]    : '57698'
+
+LITERAL[ 1]      : 'oh eight three five seven nine zero three five two oh'
+MEANING[ 1]      : '08357903520'
+CONFIDENCE VALUE : '304'
+RAW SCORE[ 1]    : '57770'
+
+LITERAL[ 2]      : 'eight three five seven nine zero three five two oh two'
+MEANING[ 2]      : '83579035202'
+CONFIDENCE VALUE : '147'
+RAW SCORE[ 2]    : '57854'
+
+LITERAL[ 3]      : 'four eight three five seven nine zero three five two oh'
+MEANING[ 3]      : '48357903520'
+CONFIDENCE VALUE : '73'
+RAW SCORE[ 3]    : '57861'
+
+LITERAL[ 4]      : 'nine eight three five seven nine zero three five two oh'
+MEANING[ 4]      : '98357903520'
+CONFIDENCE VALUE : '36'
+RAW SCORE[ 4]    : '57868'
+
+LITERAL[ 5]      : 'eight three five seven nine zero three five two oh oh'
+MEANING[ 5]      : '83579035200'
+CONFIDENCE VALUE : '18'
+RAW SCORE[ 5]    : '57869'
+
+LITERAL[ 6]      : 'one eight three five seven nine zero three five two oh'
+MEANING[ 6]      : '18357903520'
+CONFIDENCE VALUE : '9'
+RAW SCORE[ 6]    : '57893'
+
+LITERAL[ 7]      : 'oh eight three five seven nine zero three five two oh two'
+MEANING[ 7]      : '083579035202'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 7]    : '57926'
+
+LITERAL[ 8]      : 'eight oh three five seven nine zero three five two oh'
+MEANING[ 8]      : '80357903520'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 8]    : '57935'
+
+LITERAL[ 9]      : 'nine oh eight three five seven nine zero three five two oh'
+MEANING[ 9]      : '908357903520'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 9]    : '57940'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0300/S057.nwf
+C: eight four zero five six five four one four six
+Sem (1):  invocab=1
+S: 619
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'eight four zero five six five four one four six'
+LITERAL[ 0]      : 'eight four zero five six five four one four six'
+MEANING[ 0]      : '8405654146'
+CONFIDENCE VALUE : '619'
+RAW SCORE[ 0]    : '52886'
+
+LITERAL[ 1]      : 'oh eight four zero five six five four one four six'
+MEANING[ 1]      : '08405654146'
+CONFIDENCE VALUE : '333'
+RAW SCORE[ 1]    : '53115'
+
+LITERAL[ 2]      : 'eight four zero five six five four one oh four six'
+MEANING[ 2]      : '84056541046'
+CONFIDENCE VALUE : '178'
+RAW SCORE[ 2]    : '53115'
+
+LITERAL[ 3]      : 'eight four zero five six five oh four one four six'
+MEANING[ 3]      : '84056504146'
+CONFIDENCE VALUE : '96'
+RAW SCORE[ 3]    : '53120'
+
+LITERAL[ 4]      : 'eight four zero five six five four one four six oh'
+MEANING[ 4]      : '84056541460'
+CONFIDENCE VALUE : '51'
+RAW SCORE[ 4]    : '53122'
+
+LITERAL[ 5]      : 'eight four zero oh five six five four one four six'
+MEANING[ 5]      : '84005654146'
+CONFIDENCE VALUE : '28'
+RAW SCORE[ 5]    : '53138'
+
+LITERAL[ 6]      : 'eight four zero five six five four one one six'
+MEANING[ 6]      : '8405654116'
+CONFIDENCE VALUE : '15'
+RAW SCORE[ 6]    : '53174'
+
+LITERAL[ 7]      : 'eight four zero five six five four one nine four six'
+MEANING[ 7]      : '84056541946'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 7]    : '53191'
+
+LITERAL[ 8]      : 'eight four zero five six five four one four six two'
+MEANING[ 8]      : '84056541462'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 8]    : '53191'
+
+LITERAL[ 9]      : 'two eight four zero five six five four one four six'
+MEANING[ 9]      : '28405654146'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 9]    : '53215'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0300/S063.nwf
+C: oh nine seven three one three zero five five zero
+Sem (1):  invocab=1
+S: 625
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'oh nine seven three one three zero five five zero'
+LITERAL[ 0]      : 'oh nine seven three one three zero five five zero'
+MEANING[ 0]      : '0973130550'
+CONFIDENCE VALUE : '625'
+RAW SCORE[ 0]    : '51878'
+
+LITERAL[ 1]      : 'oh nine seven three oh one three zero five five zero'
+MEANING[ 1]      : '09730130550'
+CONFIDENCE VALUE : '340'
+RAW SCORE[ 1]    : '52092'
+
+LITERAL[ 2]      : 'oh two nine seven three one three zero five five zero'
+MEANING[ 2]      : '02973130550'
+CONFIDENCE VALUE : '185'
+RAW SCORE[ 2]    : '52096'
+
+LITERAL[ 3]      : 'oh oh nine seven three one three zero five five zero'
+MEANING[ 3]      : '00973130550'
+CONFIDENCE VALUE : '101'
+RAW SCORE[ 3]    : '52106'
+
+LITERAL[ 4]      : 'oh nine seven three one three zero oh five five zero'
+MEANING[ 4]      : '09731300550'
+CONFIDENCE VALUE : '56'
+RAW SCORE[ 4]    : '52106'
+
+LITERAL[ 5]      : 'oh nine seven three one three zero five five oh zero'
+MEANING[ 5]      : '09731305500'
+CONFIDENCE VALUE : '31'
+RAW SCORE[ 5]    : '52115'
+
+LITERAL[ 6]      : 'oh nine seven three two one three zero five five zero'
+MEANING[ 6]      : '09732130550'
+CONFIDENCE VALUE : '17'
+RAW SCORE[ 6]    : '52147'
+
+LITERAL[ 7]      : 'oh nine oh seven three one three zero five five zero'
+MEANING[ 7]      : '09073130550'
+CONFIDENCE VALUE : '9'
+RAW SCORE[ 7]    : '52168'
+
+LITERAL[ 8]      : 'two oh nine seven three one three zero five five zero'
+MEANING[ 8]      : '20973130550'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 8]    : '52169'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0300/S065.nwf
+C: one three three three zero zero five oh oh six
+Sem (1):  invocab=1
+S: 630
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'one three three three zero zero five oh oh six'
+LITERAL[ 0]      : 'one three three three zero zero five oh six'
+MEANING[ 0]      : '133300506'
+CONFIDENCE VALUE : '630'
+RAW SCORE[ 0]    : '48201'
+
+LITERAL[ 1]      : 'one three three three zero zero five oh oh six'
+MEANING[ 1]      : '1333005006'
+CONFIDENCE VALUE : '369'
+RAW SCORE[ 1]    : '48353'
+
+LITERAL[ 2]      : 'one three three three eight zero zero five oh six'
+MEANING[ 2]      : '1333800506'
+CONFIDENCE VALUE : '203'
+RAW SCORE[ 2]    : '48415'
+
+LITERAL[ 3]      : 'oh one three three three zero zero five oh six'
+MEANING[ 3]      : '0133300506'
+CONFIDENCE VALUE : '111'
+RAW SCORE[ 3]    : '48423'
+
+LITERAL[ 4]      : 'one three three oh three zero zero five oh six'
+MEANING[ 4]      : '1330300506'
+CONFIDENCE VALUE : '60'
+RAW SCORE[ 4]    : '48426'
+
+LITERAL[ 5]      : 'one three three three oh zero zero five oh six'
+MEANING[ 5]      : '1333000506'
+CONFIDENCE VALUE : '34'
+RAW SCORE[ 5]    : '48426'
+
+LITERAL[ 6]      : 'one three three three zero zero five oh six oh'
+MEANING[ 6]      : '1333005060'
+CONFIDENCE VALUE : '19'
+RAW SCORE[ 6]    : '48430'
+
+LITERAL[ 7]      : 'two one three three three zero zero five oh six'
+MEANING[ 7]      : '2133300506'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 7]    : '48496'
+
+LITERAL[ 8]      : 'one three three three zero zero five oh six two'
+MEANING[ 8]      : '1333005062'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 8]    : '48503'
+
+----------------------------------------------
+
+Recognizer has been stopped
+
+Successfully Set Sample Rate To  :  8000
+D: dallas-8kHz/0301/S078.nwf
+C: six seven five seven zero zero two six seven zero
+Sem (1):  invocab=1
+S: 507
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'six seven five seven zero zero two six seven zero'
+LITERAL[ 0]      : 'six seven five seven zero zero two six seven zero'
+MEANING[ 0]      : '6757002670'
+CONFIDENCE VALUE : '507'
+RAW SCORE[ 0]    : '67430'
+
+LITERAL[ 1]      : 'six seven five oh seven zero zero two six seven zero'
+MEANING[ 1]      : '67507002670'
+CONFIDENCE VALUE : '224'
+RAW SCORE[ 1]    : '67632'
+
+LITERAL[ 2]      : 'seven five seven zero zero two six seven zero'
+MEANING[ 2]      : '757002670'
+CONFIDENCE VALUE : '119'
+RAW SCORE[ 2]    : '67639'
+
+LITERAL[ 3]      : 'eight seven five seven zero zero two six seven zero'
+MEANING[ 3]      : '8757002670'
+CONFIDENCE VALUE : '53'
+RAW SCORE[ 3]    : '67656'
+
+LITERAL[ 4]      : 'six oh seven five seven zero zero two six seven zero'
+MEANING[ 4]      : '60757002670'
+CONFIDENCE VALUE : '23'
+RAW SCORE[ 4]    : '67660'
+
+LITERAL[ 5]      : 'oh six seven five seven zero zero two six seven zero'
+MEANING[ 5]      : '06757002670'
+CONFIDENCE VALUE : '11'
+RAW SCORE[ 5]    : '67674'
+
+LITERAL[ 6]      : 'six seven five seven zero zero two six oh seven zero'
+MEANING[ 6]      : '67570026070'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 6]    : '67689'
+
+LITERAL[ 7]      : 'seven five oh seven zero zero two six seven zero'
+MEANING[ 7]      : '7507002670'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 7]    : '67841'
+
+LITERAL[ 8]      : 'oh seven five seven zero zero two six seven zero'
+MEANING[ 8]      : '0757002670'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '67874'
+
+LITERAL[ 9]      : 'seven five seven zero zero two six oh seven zero'
+MEANING[ 9]      : '7570026070'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '67898'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0301/S079.nwf
+C: zero seven nine six five one four eight one eight
+Sem (1):  invocab=1
+S: 568
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'zero seven nine six five one four eight one eight'
+LITERAL[ 0]      : 'zero seven nine six five one four eight one eight'
+MEANING[ 0]      : '0796514818'
+CONFIDENCE VALUE : '568'
+RAW SCORE[ 0]    : '48289'
+
+LITERAL[ 1]      : 'zero seven nine two six five one four eight one eight'
+MEANING[ 1]      : '07926514818'
+CONFIDENCE VALUE : '279'
+RAW SCORE[ 1]    : '48521'
+
+LITERAL[ 2]      : 'zero seven nine oh six five one four eight one eight'
+MEANING[ 2]      : '07906514818'
+CONFIDENCE VALUE : '137'
+RAW SCORE[ 2]    : '48533'
+
+LITERAL[ 3]      : 'zero two seven nine six five one four eight one eight'
+MEANING[ 3]      : '02796514818'
+CONFIDENCE VALUE : '67'
+RAW SCORE[ 3]    : '48536'
+
+LITERAL[ 4]      : 'zero seven nine six five one oh four eight one eight'
+MEANING[ 4]      : '07965104818'
+CONFIDENCE VALUE : '33'
+RAW SCORE[ 4]    : '48546'
+
+LITERAL[ 5]      : 'zero oh seven nine six five one four eight one eight'
+MEANING[ 5]      : '00796514818'
+CONFIDENCE VALUE : '16'
+RAW SCORE[ 5]    : '48547'
+
+LITERAL[ 6]      : 'zero seven nine six five one four eight oh one eight'
+MEANING[ 6]      : '07965148018'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 6]    : '48577'
+
+LITERAL[ 7]      : 'zero seven nine eight five one four eight one eight'
+MEANING[ 7]      : '0798514818'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 7]    : '48588'
+
+LITERAL[ 8]      : 'two zero seven nine six five one four eight one eight'
+MEANING[ 8]      : '20796514818'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '48628'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0301/S080.nwf
+C: three eight eight seven oh nine one seven five two
+Sem (1):  invocab=1
+S: 493
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'three eight eight seven oh nine one seven five two'
+LITERAL[ 0]      : 'three eight eight seven oh nine one seven five two'
+MEANING[ 0]      : '3887091752'
+CONFIDENCE VALUE : '493'
+RAW SCORE[ 0]    : '46576'
+
+LITERAL[ 1]      : 'three eight eight seven oh oh nine one seven five two'
+MEANING[ 1]      : '38870091752'
+CONFIDENCE VALUE : '211'
+RAW SCORE[ 1]    : '46786'
+
+LITERAL[ 2]      : 'three eight eight seven oh nine one seven five oh two'
+MEANING[ 2]      : '38870917502'
+CONFIDENCE VALUE : '84'
+RAW SCORE[ 2]    : '46789'
+
+LITERAL[ 3]      : 'three eight eight oh seven oh nine one seven five two'
+MEANING[ 3]      : '38807091752'
+CONFIDENCE VALUE : '36'
+RAW SCORE[ 3]    : '46807'
+
+LITERAL[ 4]      : 'three eight eight seven oh nine one oh seven five two'
+MEANING[ 4]      : '38870910752'
+CONFIDENCE VALUE : '15'
+RAW SCORE[ 4]    : '46821'
+
+LITERAL[ 5]      : 'three eight eight seven oh nine one seven five two oh'
+MEANING[ 5]      : '38870917520'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 5]    : '46840'
+
+LITERAL[ 6]      : 'three eight eight two seven oh nine one seven five two'
+MEANING[ 6]      : '38827091752'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 6]    : '46857'
+
+LITERAL[ 7]      : 'oh three eight eight seven oh nine one seven five two'
+MEANING[ 7]      : '03887091752'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 7]    : '46872'
+
+LITERAL[ 8]      : 'three eight eight eight seven oh nine one seven five two'
+MEANING[ 8]      : '38887091752'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '46877'
+
+LITERAL[ 9]      : 'three eight oh eight seven oh nine one seven five two'
+MEANING[ 9]      : '38087091752'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '46917'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0301/S082.nwf
+C: eight one two six three six two five one oh
+Sem (1):  invocab=1
+S: 557
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'eight one two six three six two five one oh'
+LITERAL[ 0]      : 'eight one two six three six two five one oh'
+MEANING[ 0]      : '8126362510'
+CONFIDENCE VALUE : '557'
+RAW SCORE[ 0]    : '47444'
+
+LITERAL[ 1]      : 'eight one two six three six two five one oh oh'
+MEANING[ 1]      : '81263625100'
+CONFIDENCE VALUE : '250'
+RAW SCORE[ 1]    : '47661'
+
+LITERAL[ 2]      : 'eight one two oh six three six two five one oh'
+MEANING[ 2]      : '81206362510'
+CONFIDENCE VALUE : '124'
+RAW SCORE[ 2]    : '47662'
+
+LITERAL[ 3]      : 'eight one oh two six three six two five one oh'
+MEANING[ 3]      : '81026362510'
+CONFIDENCE VALUE : '60'
+RAW SCORE[ 3]    : '47689'
+
+LITERAL[ 4]      : 'eight one two two six three six two five one oh'
+MEANING[ 4]      : '81226362510'
+CONFIDENCE VALUE : '29'
+RAW SCORE[ 4]    : '47702'
+
+LITERAL[ 5]      : 'eight one two six oh three six two five one oh'
+MEANING[ 5]      : '81260362510'
+CONFIDENCE VALUE : '14'
+RAW SCORE[ 5]    : '47706'
+
+LITERAL[ 6]      : 'eight one two six three six oh two five one oh'
+MEANING[ 6]      : '81263602510'
+CONFIDENCE VALUE : '7'
+RAW SCORE[ 6]    : '47727'
+
+LITERAL[ 7]      : 'oh eight one two six three six two five one oh'
+MEANING[ 7]      : '08126362510'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 7]    : '47730'
+
+LITERAL[ 8]      : 'eight one two six two six two five one oh'
+MEANING[ 8]      : '8126262510'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '47759'
+
+LITERAL[ 9]      : 'eight one two eight three six two five one oh'
+MEANING[ 9]      : '8128362510'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '47778'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0301/S083.nwf
+C: seven six zero eight three three zero five nine four
+Sem (1):  invocab=1
+S: 551
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'seven six zero eight three three zero five nine four'
+LITERAL[ 0]      : 'seven six zero eight three three zero five nine four'
+MEANING[ 0]      : '7608330594'
+CONFIDENCE VALUE : '551'
+RAW SCORE[ 0]    : '48844'
+
+LITERAL[ 1]      : 'oh seven six zero eight three three zero five nine four'
+MEANING[ 1]      : '07608330594'
+CONFIDENCE VALUE : '268'
+RAW SCORE[ 1]    : '49078'
+
+LITERAL[ 2]      : 'seven six zero eight oh three three zero five nine four'
+MEANING[ 2]      : '76080330594'
+CONFIDENCE VALUE : '128'
+RAW SCORE[ 2]    : '49100'
+
+LITERAL[ 3]      : 'seven six zero eight three three two zero five nine four'
+MEANING[ 3]      : '76083320594'
+CONFIDENCE VALUE : '60'
+RAW SCORE[ 3]    : '49116'
+
+LITERAL[ 4]      : 'seven six zero eight two three three zero five nine four'
+MEANING[ 4]      : '76082330594'
+CONFIDENCE VALUE : '28'
+RAW SCORE[ 4]    : '49118'
+
+LITERAL[ 5]      : 'seven six zero eight three three oh zero five nine four'
+MEANING[ 5]      : '76083300594'
+CONFIDENCE VALUE : '13'
+RAW SCORE[ 5]    : '49119'
+
+LITERAL[ 6]      : 'seven oh six zero eight three three zero five nine four'
+MEANING[ 6]      : '70608330594'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 6]    : '49130'
+
+LITERAL[ 7]      : 'two seven six zero eight three three zero five nine four'
+MEANING[ 7]      : '27608330594'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 7]    : '49135'
+
+LITERAL[ 8]      : 'four seven six zero eight three three zero five nine four'
+MEANING[ 8]      : '47608330594'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '49176'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0301/S089.nwf
+C: nine seven zero six five nine six oh six five
+Sem (1):  invocab=1
+S: 577
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'nine seven zero six five nine six oh six five'
+LITERAL[ 0]      : 'nine seven zero six five nine six oh six five'
+MEANING[ 0]      : '9706596065'
+CONFIDENCE VALUE : '577'
+RAW SCORE[ 0]    : '50953'
+
+LITERAL[ 1]      : 'nine seven zero six five oh nine six oh six five'
+MEANING[ 1]      : '97065096065'
+CONFIDENCE VALUE : '296'
+RAW SCORE[ 1]    : '51181'
+
+LITERAL[ 2]      : 'nine seven zero six five nine oh six oh six five'
+MEANING[ 2]      : '97065906065'
+CONFIDENCE VALUE : '147'
+RAW SCORE[ 2]    : '51211'
+
+LITERAL[ 3]      : 'nine seven zero six five nine six oh oh six five'
+MEANING[ 3]      : '97065960065'
+CONFIDENCE VALUE : '73'
+RAW SCORE[ 3]    : '51218'
+
+LITERAL[ 4]      : 'nine oh seven zero six five nine six oh six five'
+MEANING[ 4]      : '90706596065'
+CONFIDENCE VALUE : '36'
+RAW SCORE[ 4]    : '51220'
+
+LITERAL[ 5]      : 'nine seven oh zero six five nine six oh six five'
+MEANING[ 5]      : '97006596065'
+CONFIDENCE VALUE : '18'
+RAW SCORE[ 5]    : '51228'
+
+LITERAL[ 6]      : 'nine seven zero six five nine six oh six five oh'
+MEANING[ 6]      : '97065960650'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 6]    : '51240'
+
+LITERAL[ 7]      : 'nine seven zero six oh five nine six oh six five'
+MEANING[ 7]      : '97060596065'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 7]    : '51241'
+
+LITERAL[ 8]      : 'oh nine seven zero six five nine six oh six five'
+MEANING[ 8]      : '09706596065'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 8]    : '51253'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0302/S051.nwf
+C: four nine seven eight four five eight two zero zero
+Sem (1):  invocab=1
+S: 492
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'four nine seven eight four five eight two zero zero'
+LITERAL[ 0]      : 'four nine seven eight four five eight two zero zero'
+MEANING[ 0]      : '4978458200'
+CONFIDENCE VALUE : '492'
+RAW SCORE[ 0]    : '55924'
+
+LITERAL[ 1]      : 'four nine oh seven eight four five eight two zero zero'
+MEANING[ 1]      : '49078458200'
+CONFIDENCE VALUE : '211'
+RAW SCORE[ 1]    : '56157'
+
+LITERAL[ 2]      : 'four nine seven eight four five eight two oh zero zero'
+MEANING[ 2]      : '49784582000'
+CONFIDENCE VALUE : '92'
+RAW SCORE[ 2]    : '56158'
+
+LITERAL[ 3]      : 'four nine seven eight oh four five eight two zero zero'
+MEANING[ 3]      : '49780458200'
+CONFIDENCE VALUE : '39'
+RAW SCORE[ 3]    : '56195'
+
+LITERAL[ 4]      : 'four nine seven oh eight four five eight two zero zero'
+MEANING[ 4]      : '49708458200'
+CONFIDENCE VALUE : '16'
+RAW SCORE[ 4]    : '56198'
+
+LITERAL[ 5]      : 'four nine seven eight four five eight oh two zero zero'
+MEANING[ 5]      : '49784580200'
+CONFIDENCE VALUE : '7'
+RAW SCORE[ 5]    : '56204'
+
+LITERAL[ 6]      : 'oh four nine seven eight four five eight two zero zero'
+MEANING[ 6]      : '04978458200'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 6]    : '56211'
+
+LITERAL[ 7]      : 'four nine seven eight four five oh eight two zero zero'
+MEANING[ 7]      : '49784508200'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '56222'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0302/S052.nwf
+C: nine oh one one five oh oh seven five zero
+Sem (1):  invocab=1
+S: 564
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'nine oh one one five oh oh seven five zero'
+LITERAL[ 0]      : 'nine oh one one five oh four seven five zero'
+MEANING[ 0]      : '9011504750'
+CONFIDENCE VALUE : '564'
+RAW SCORE[ 0]    : '51405'
+
+LITERAL[ 1]      : 'nine oh one one five oh oh seven five zero'
+MEANING[ 1]      : '9011500750'
+CONFIDENCE VALUE : '310'
+RAW SCORE[ 1]    : '51492'
+
+LITERAL[ 2]      : 'nine eight oh one one five oh four seven five zero'
+MEANING[ 2]      : '98011504750'
+CONFIDENCE VALUE : '156'
+RAW SCORE[ 2]    : '51579'
+
+LITERAL[ 3]      : 'nine oh one one five four four seven five zero'
+MEANING[ 3]      : '9011544750'
+CONFIDENCE VALUE : '81'
+RAW SCORE[ 3]    : '51581'
+
+LITERAL[ 4]      : 'nine four one one five oh four seven five zero'
+MEANING[ 4]      : '9411504750'
+CONFIDENCE VALUE : '42'
+RAW SCORE[ 4]    : '51602'
+
+LITERAL[ 5]      : 'nine oh oh one one five oh four seven five zero'
+MEANING[ 5]      : '90011504750'
+CONFIDENCE VALUE : '21'
+RAW SCORE[ 5]    : '51617'
+
+LITERAL[ 6]      : 'nine oh one oh one five oh four seven five zero'
+MEANING[ 6]      : '90101504750'
+CONFIDENCE VALUE : '11'
+RAW SCORE[ 6]    : '51631'
+
+LITERAL[ 7]      : 'nine oh one one five oh four seven oh five zero'
+MEANING[ 7]      : '90115047050'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 7]    : '51657'
+
+LITERAL[ 8]      : 'oh nine oh one one five oh four seven five zero'
+MEANING[ 8]      : '09011504750'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 8]    : '51660'
+
+LITERAL[ 9]      : 'nine eight oh one one five oh oh seven five zero'
+MEANING[ 9]      : '98011500750'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 9]    : '51666'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0302/S053.nwf
+C: five zero nine two four four six two two three
+Sem (1):  invocab=1
+S: 517
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'five zero nine two four four six two two three'
+LITERAL[ 0]      : 'five zero nine two four four six two three'
+MEANING[ 0]      : '509244623'
+CONFIDENCE VALUE : '517'
+RAW SCORE[ 0]    : '39751'
+
+LITERAL[ 1]      : 'five zero nine two four four six two two three'
+MEANING[ 1]      : '5092446223'
+CONFIDENCE VALUE : '279'
+RAW SCORE[ 1]    : '39758'
+
+LITERAL[ 2]      : 'five zero nine two four four six three two three'
+MEANING[ 2]      : '5092446323'
+CONFIDENCE VALUE : '138'
+RAW SCORE[ 2]    : '39932'
+
+LITERAL[ 3]      : 'five zero nine oh two four four six two three'
+MEANING[ 3]      : '5090244623'
+CONFIDENCE VALUE : '65'
+RAW SCORE[ 3]    : '39974'
+
+LITERAL[ 4]      : 'five zero nine two four four six oh two two three'
+MEANING[ 4]      : '50924460223'
+CONFIDENCE VALUE : '30'
+RAW SCORE[ 4]    : '39978'
+
+LITERAL[ 5]      : 'five zero nine oh two four four six two two three'
+MEANING[ 5]      : '50902446223'
+CONFIDENCE VALUE : '14'
+RAW SCORE[ 5]    : '39981'
+
+LITERAL[ 6]      : 'oh five zero nine two four four six two three'
+MEANING[ 6]      : '0509244623'
+CONFIDENCE VALUE : '7'
+RAW SCORE[ 6]    : '40005'
+
+LITERAL[ 7]      : 'oh five zero nine two four four six two two three'
+MEANING[ 7]      : '05092446223'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 7]    : '40012'
+
+LITERAL[ 8]      : 'five zero nine two four four six oh three two three'
+MEANING[ 8]      : '50924460323'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '40152'
+
+LITERAL[ 9]      : 'five zero nine oh two four four six three two three'
+MEANING[ 9]      : '50902446323'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '40155'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0302/S054.nwf
+C: four nine three zero three oh five seven two three
+Sem (1):  invocab=1
+S: 584
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'four nine three zero three oh five seven two three'
+LITERAL[ 0]      : 'four nine three zero three oh five seven two three'
+MEANING[ 0]      : '4930305723'
+CONFIDENCE VALUE : '584'
+RAW SCORE[ 0]    : '43691'
+
+LITERAL[ 1]      : 'four nine three zero three four five seven two three'
+MEANING[ 1]      : '4930345723'
+CONFIDENCE VALUE : '332'
+RAW SCORE[ 1]    : '43805'
+
+LITERAL[ 2]      : 'four nine three zero three eight oh five seven two three'
+MEANING[ 2]      : '49303805723'
+CONFIDENCE VALUE : '173'
+RAW SCORE[ 2]    : '43898'
+
+LITERAL[ 3]      : 'four nine three zero three oh five seven oh two three'
+MEANING[ 3]      : '49303057023'
+CONFIDENCE VALUE : '88'
+RAW SCORE[ 3]    : '43918'
+
+LITERAL[ 4]      : 'four nine oh three zero three oh five seven two three'
+MEANING[ 4]      : '49030305723'
+CONFIDENCE VALUE : '46'
+RAW SCORE[ 4]    : '43920'
+
+LITERAL[ 5]      : 'four nine three zero three oh five seven two three oh'
+MEANING[ 5]      : '49303057230'
+CONFIDENCE VALUE : '23'
+RAW SCORE[ 5]    : '43928'
+
+LITERAL[ 6]      : 'oh four nine three zero three oh five seven two three'
+MEANING[ 6]      : '04930305723'
+CONFIDENCE VALUE : '12'
+RAW SCORE[ 6]    : '43944'
+
+LITERAL[ 7]      : 'four nine three oh zero three oh five seven two three'
+MEANING[ 7]      : '49300305723'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 7]    : '43944'
+
+LITERAL[ 8]      : 'four nine three zero three oh oh five seven two three'
+MEANING[ 8]      : '49303005723'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 8]    : '43958'
+
+LITERAL[ 9]      : 'four nine three zero three oh one five seven two three'
+MEANING[ 9]      : '49303015723'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 9]    : '43966'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0302/S065.nwf
+C: five six five four five five three eight six seven
+Sem (1):  invocab=1
+S: 600
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'five six five four five five three eight six seven'
+LITERAL[ 0]      : 'five six five four five five three eight six seven'
+MEANING[ 0]      : '5654553867'
+CONFIDENCE VALUE : '600'
+RAW SCORE[ 0]    : '35540'
+
+LITERAL[ 1]      : 'five six five four five five three six seven'
+MEANING[ 1]      : '565455367'
+CONFIDENCE VALUE : '344'
+RAW SCORE[ 1]    : '35695'
+
+LITERAL[ 2]      : 'five six five four five five oh three eight six seven'
+MEANING[ 2]      : '56545503867'
+CONFIDENCE VALUE : '178'
+RAW SCORE[ 2]    : '35767'
+
+LITERAL[ 3]      : 'oh five six five four five five three eight six seven'
+MEANING[ 3]      : '05654553867'
+CONFIDENCE VALUE : '103'
+RAW SCORE[ 3]    : '35768'
+
+LITERAL[ 4]      : 'five six five four five five three eight six seven oh'
+MEANING[ 4]      : '56545538670'
+CONFIDENCE VALUE : '56'
+RAW SCORE[ 4]    : '35771'
+
+LITERAL[ 5]      : 'five six five four five five oh three six seven'
+MEANING[ 5]      : '5654550367'
+CONFIDENCE VALUE : '29'
+RAW SCORE[ 5]    : '35922'
+
+LITERAL[ 6]      : 'oh five six five four five five three six seven'
+MEANING[ 6]      : '0565455367'
+CONFIDENCE VALUE : '16'
+RAW SCORE[ 6]    : '35923'
+
+LITERAL[ 7]      : 'five six five four five five three six seven oh'
+MEANING[ 7]      : '5654553670'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 7]    : '35926'
+
+LITERAL[ 8]      : 'oh five six five four five five oh three eight six seven'
+MEANING[ 8]      : '056545503867'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 8]    : '35995'
+
+LITERAL[ 9]      : 'five six five four five five oh three eight six seven oh'
+MEANING[ 9]      : '565455038670'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 9]    : '35998'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0302/S070.nwf
+C: oh six two nine one five two nine five oh
+Sem (1):  invocab=1
+S: 549
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'oh six two nine one five two nine five oh'
+LITERAL[ 0]      : 'oh six two nine one five two nine five oh'
+MEANING[ 0]      : '0629152950'
+CONFIDENCE VALUE : '549'
+RAW SCORE[ 0]    : '31936'
+
+LITERAL[ 1]      : 'four six two nine one five two nine five oh'
+MEANING[ 1]      : '4629152950'
+CONFIDENCE VALUE : '302'
+RAW SCORE[ 1]    : '32038'
+
+LITERAL[ 2]      : 'oh oh six two nine one five two nine five oh'
+MEANING[ 2]      : '00629152950'
+CONFIDENCE VALUE : '162'
+RAW SCORE[ 2]    : '32163'
+
+LITERAL[ 3]      : 'two oh six two nine one five two nine five oh'
+MEANING[ 3]      : '20629152950'
+CONFIDENCE VALUE : '84'
+RAW SCORE[ 3]    : '32212'
+
+LITERAL[ 4]      : 'oh six two nine one five two nine oh five oh'
+MEANING[ 4]      : '06291529050'
+CONFIDENCE VALUE : '42'
+RAW SCORE[ 4]    : '32212'
+
+LITERAL[ 5]      : 'six two nine one five two nine five oh'
+MEANING[ 5]      : '629152950'
+CONFIDENCE VALUE : '28'
+RAW SCORE[ 5]    : '32228'
+
+LITERAL[ 6]      : 'four six two nine one five two nine oh five oh'
+MEANING[ 6]      : '46291529050'
+CONFIDENCE VALUE : '15'
+RAW SCORE[ 6]    : '32314'
+
+LITERAL[ 7]      : 'oh oh six two nine one five two nine oh five oh'
+MEANING[ 7]      : '006291529050'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 7]    : '32439'
+
+LITERAL[ 8]      : 'two oh six two nine one five two nine oh five oh'
+MEANING[ 8]      : '206291529050'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 8]    : '32488'
+
+LITERAL[ 9]      : 'six two nine one five two nine oh five oh'
+MEANING[ 9]      : '6291529050'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 9]    : '32504'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas-8kHz/0302/S071.nwf
+C: two zero five oh four nine two six five eight
+Sem (1):  invocab=1
+S: 551
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'two zero five oh four nine two six five eight'
+LITERAL[ 0]      : 'two zero five four four nine two six five eight'
+MEANING[ 0]      : '2054492658'
+CONFIDENCE VALUE : '551'
+RAW SCORE[ 0]    : '34135'
+
+LITERAL[ 1]      : 'two zero five oh four nine two six five eight'
+MEANING[ 1]      : '2050492658'
+CONFIDENCE VALUE : '313'
+RAW SCORE[ 1]    : '34183'
+
+LITERAL[ 2]      : 'two zero five four four nine two six five eight oh'
+MEANING[ 2]      : '20544926580'
+CONFIDENCE VALUE : '139'
+RAW SCORE[ 2]    : '34385'
+
+LITERAL[ 3]      : 'two zero five oh four four nine two six five eight'
+MEANING[ 3]      : '20504492658'
+CONFIDENCE VALUE : '69'
+RAW SCORE[ 3]    : '34387'
+
+LITERAL[ 4]      : 'two zero five four four nine oh two six five eight'
+MEANING[ 4]      : '20544902658'
+CONFIDENCE VALUE : '34'
+RAW SCORE[ 4]    : '34404'
+
+LITERAL[ 5]      : 'oh two zero five four four nine two six five eight'
+MEANING[ 5]      : '02054492658'
+CONFIDENCE VALUE : '17'
+RAW SCORE[ 5]    : '34410'
+
+LITERAL[ 6]      : 'two zero five one four nine two six five eight'
+MEANING[ 6]      : '2051492658'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 6]    : '34411'
+
+LITERAL[ 7]      : 'two zero five oh four nine two six five eight oh'
+MEANING[ 7]      : '20504926580'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 7]    : '34433'
+
+LITERAL[ 8]      : 'two zero five oh oh four nine two six five eight'
+MEANING[ 8]      : '20500492658'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '34435'
+
+LITERAL[ 9]      : 'two zero five oh four nine oh two six five eight'
+MEANING[ 9]      : '20504902658'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '34452'
+
+----------------------------------------------
+
+Recognizer has been stopped
+
+Successfully Set Sample Rate To  :  11025
+D: dallas/0303/S080.nwf
+C: six eight five four oh one six two seven three
+Sem (1):  invocab=1
+S: 404
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'six eight five four oh one six two seven three'
+LITERAL[ 0]      : 'six eight five four oh one six two seven three'
+MEANING[ 0]      : '6854016273'
+CONFIDENCE VALUE : '404'
+RAW SCORE[ 0]    : '64307'
+
+LITERAL[ 1]      : 'six eight five four four one six two seven three'
+MEANING[ 1]      : '6854416273'
+CONFIDENCE VALUE : '150'
+RAW SCORE[ 1]    : '64432'
+
+LITERAL[ 2]      : 'six eight five oh four oh one six two seven three'
+MEANING[ 2]      : '68504016273'
+CONFIDENCE VALUE : '53'
+RAW SCORE[ 2]    : '64461'
+
+LITERAL[ 3]      : 'six eight five four oh one oh six two seven three'
+MEANING[ 3]      : '68540106273'
+CONFIDENCE VALUE : '19'
+RAW SCORE[ 3]    : '64462'
+
+LITERAL[ 4]      : 'six eight five four oh one three six two seven three'
+MEANING[ 4]      : '68540136273'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 4]    : '64486'
+
+LITERAL[ 5]      : 'six eight five four oh one six two oh seven three'
+MEANING[ 5]      : '68540162073'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 5]    : '64487'
+
+LITERAL[ 6]      : 'six eight five four oh one two six two seven three'
+MEANING[ 6]      : '68540126273'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '64491'
+
+LITERAL[ 7]      : 'six eight five four oh one seven two seven three'
+MEANING[ 7]      : '6854017273'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '64495'
+
+LITERAL[ 8]      : 'six eight five four oh one four six two seven three'
+MEANING[ 8]      : '68540146273'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '64507'
+
+LITERAL[ 9]      : 'seven eight five four oh one six two seven three'
+MEANING[ 9]      : '7854016273'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '64518'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0303/S083.nwf
+C: three four three four eight four eight five six eight
+Sem (1):  invocab=1
+S: 401
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'three four three four eight four eight five six eight'
+LITERAL[ 0]      : 'three four three four eight four eight five six eight'
+MEANING[ 0]      : '3434848568'
+CONFIDENCE VALUE : '401'
+RAW SCORE[ 0]    : '44234'
+
+LITERAL[ 1]      : 'three four three four eight four eight five six two'
+MEANING[ 1]      : '3434848562'
+CONFIDENCE VALUE : '136'
+RAW SCORE[ 1]    : '44386'
+
+LITERAL[ 2]      : 'three four three four eight four two eight five six eight'
+MEANING[ 2]      : '34348428568'
+CONFIDENCE VALUE : '48'
+RAW SCORE[ 2]    : '44408'
+
+LITERAL[ 3]      : 'three four three four eight four eight five two two'
+MEANING[ 3]      : '3434848522'
+CONFIDENCE VALUE : '15'
+RAW SCORE[ 3]    : '44431'
+
+LITERAL[ 4]      : 'three four three four eight four eight five six eight oh'
+MEANING[ 4]      : '34348485680'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 4]    : '44434'
+
+LITERAL[ 5]      : 'three four three four eight four eight five six three'
+MEANING[ 5]      : '3434848563'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 5]    : '44437'
+
+LITERAL[ 6]      : 'three four three four eight four eight five oh six eight'
+MEANING[ 6]      : '34348485068'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 6]    : '44452'
+
+LITERAL[ 7]      : 'three four three four eight four two five six eight'
+MEANING[ 7]      : '3434842568'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '44455'
+
+LITERAL[ 8]      : 'oh three four three four eight four eight five six eight'
+MEANING[ 8]      : '03434848568'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '44463'
+
+LITERAL[ 9]      : 'three four three four eight four eight five eight six eight'
+MEANING[ 9]      : '34348485868'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '44463'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0303/S084.nwf
+C: one two eight five zero seven eight six seven one
+Sem (1):  invocab=1
+S: 433
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'one two eight five zero seven eight six seven one'
+LITERAL[ 0]      : 'one two eight five zero seven eight six seven one'
+MEANING[ 0]      : '1285078671'
+CONFIDENCE VALUE : '433'
+RAW SCORE[ 0]    : '45788'
+
+LITERAL[ 1]      : 'one two eight five zero seven eight six seven four'
+MEANING[ 1]      : '1285078674'
+CONFIDENCE VALUE : '169'
+RAW SCORE[ 1]    : '45896'
+
+LITERAL[ 2]      : 'one two eight five oh zero seven eight six seven one'
+MEANING[ 2]      : '12850078671'
+CONFIDENCE VALUE : '65'
+RAW SCORE[ 2]    : '45939'
+
+LITERAL[ 3]      : 'one two eight oh five zero seven eight six seven one'
+MEANING[ 3]      : '12805078671'
+CONFIDENCE VALUE : '25'
+RAW SCORE[ 3]    : '45954'
+
+LITERAL[ 4]      : 'one two eight five eight zero seven eight six seven one'
+MEANING[ 4]      : '12858078671'
+CONFIDENCE VALUE : '9'
+RAW SCORE[ 4]    : '45963'
+
+LITERAL[ 5]      : 'one two eight five zero seven eight oh six seven one'
+MEANING[ 5]      : '12850780671'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 5]    : '45972'
+
+LITERAL[ 6]      : 'one two eight five zero seven eight two six seven one'
+MEANING[ 6]      : '12850782671'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 6]    : '45975'
+
+LITERAL[ 7]      : 'one two eight two five zero seven eight six seven one'
+MEANING[ 7]      : '12825078671'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '46013'
+
+LITERAL[ 8]      : 'one two eight four five zero seven eight six seven one'
+MEANING[ 8]      : '12845078671'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '46026'
+
+LITERAL[ 9]      : 'oh one two eight five zero seven eight six seven one'
+MEANING[ 9]      : '01285078671'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '46041'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0303/S087.nwf
+C: oh five six eight eight nine five five one eight
+Sem (1):  invocab=1
+S: 616
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'oh five six eight eight nine five five one eight'
+LITERAL[ 0]      : 'oh five six eight eight nine five five one eight'
+MEANING[ 0]      : '0568895518'
+CONFIDENCE VALUE : '616'
+RAW SCORE[ 0]    : '41569'
+
+LITERAL[ 1]      : 'oh five six eight oh eight nine five five one eight'
+MEANING[ 1]      : '05680895518'
+CONFIDENCE VALUE : '348'
+RAW SCORE[ 1]    : '41737'
+
+LITERAL[ 2]      : 'oh five six eight eight nine five five one eight oh'
+MEANING[ 2]      : '05688955180'
+CONFIDENCE VALUE : '180'
+RAW SCORE[ 2]    : '41792'
+
+LITERAL[ 3]      : 'oh five oh six eight eight nine five five one eight'
+MEANING[ 3]      : '05068895518'
+CONFIDENCE VALUE : '96'
+RAW SCORE[ 3]    : '41797'
+
+LITERAL[ 4]      : 'oh five six oh eight eight nine five five one eight'
+MEANING[ 4]      : '05608895518'
+CONFIDENCE VALUE : '51'
+RAW SCORE[ 4]    : '41803'
+
+LITERAL[ 5]      : 'oh five six eight eight nine five five oh one eight'
+MEANING[ 5]      : '05688955018'
+CONFIDENCE VALUE : '27'
+RAW SCORE[ 5]    : '41809'
+
+LITERAL[ 6]      : 'oh oh five six eight eight nine five five one eight'
+MEANING[ 6]      : '00568895518'
+CONFIDENCE VALUE : '15'
+RAW SCORE[ 6]    : '41810'
+
+LITERAL[ 7]      : 'oh five six eight eight nine oh five five one eight'
+MEANING[ 7]      : '05688905518'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 7]    : '41814'
+
+LITERAL[ 8]      : 'oh five six two eight eight nine five five one eight'
+MEANING[ 8]      : '05628895518'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 8]    : '41817'
+
+LITERAL[ 9]      : 'oh five six eight eight nine five five one eight four'
+MEANING[ 9]      : '05688955184'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 9]    : '41914'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0303/S088.nwf
+C: five four four oh two one four four zero nine
+Sem (1):  invocab=1
+S: 567
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'five four four oh two one four four zero nine'
+LITERAL[ 0]      : 'five four four oh two one four four zero nine'
+MEANING[ 0]      : '5440214409'
+CONFIDENCE VALUE : '567'
+RAW SCORE[ 0]    : '50525'
+
+LITERAL[ 1]      : 'five four four oh two oh one four four zero nine'
+MEANING[ 1]      : '54402014409'
+CONFIDENCE VALUE : '320'
+RAW SCORE[ 1]    : '50595'
+
+LITERAL[ 2]      : 'five four four oh two one four four zero one nine'
+MEANING[ 2]      : '54402144019'
+CONFIDENCE VALUE : '158'
+RAW SCORE[ 2]    : '50715'
+
+LITERAL[ 3]      : 'five four four oh two one four four zero nine oh'
+MEANING[ 3]      : '54402144090'
+CONFIDENCE VALUE : '75'
+RAW SCORE[ 3]    : '50744'
+
+LITERAL[ 4]      : 'oh five four four oh two one four four zero nine'
+MEANING[ 4]      : '05440214409'
+CONFIDENCE VALUE : '38'
+RAW SCORE[ 4]    : '50748'
+
+LITERAL[ 5]      : 'five four four oh two one four four oh zero nine'
+MEANING[ 5]      : '54402144009'
+CONFIDENCE VALUE : '20'
+RAW SCORE[ 5]    : '50749'
+
+LITERAL[ 6]      : 'five four four oh two one one four four zero nine'
+MEANING[ 6]      : '54402114409'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 6]    : '50772'
+
+LITERAL[ 7]      : 'five four four oh two one four four two zero nine'
+MEANING[ 7]      : '54402144209'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 7]    : '50799'
+
+LITERAL[ 8]      : 'oh five four four oh two oh one four four zero nine'
+MEANING[ 8]      : '054402014409'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 8]    : '50818'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0303/S089.nwf
+C: oh five one oh six eight seven one zero nine
+Sem (1):  invocab=1
+S: 526
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'oh five one oh six eight seven one zero nine'
+LITERAL[ 0]      : 'oh five one oh six eight seven one zero nine'
+MEANING[ 0]      : '0510687109'
+CONFIDENCE VALUE : '526'
+RAW SCORE[ 0]    : '44060'
+
+LITERAL[ 1]      : 'oh five one oh oh six eight seven one zero nine'
+MEANING[ 1]      : '05100687109'
+CONFIDENCE VALUE : '256'
+RAW SCORE[ 1]    : '44195'
+
+LITERAL[ 2]      : 'oh five one oh six eight oh seven one zero nine'
+MEANING[ 2]      : '05106807109'
+CONFIDENCE VALUE : '124'
+RAW SCORE[ 2]    : '44230'
+
+LITERAL[ 3]      : 'oh five one oh six eight seven oh one zero nine'
+MEANING[ 3]      : '05106870109'
+CONFIDENCE VALUE : '58'
+RAW SCORE[ 3]    : '44271'
+
+LITERAL[ 4]      : 'oh oh five one oh six eight seven one zero nine'
+MEANING[ 4]      : '00510687109'
+CONFIDENCE VALUE : '28'
+RAW SCORE[ 4]    : '44289'
+
+LITERAL[ 5]      : 'oh five one oh six eight seven one zero nine oh'
+MEANING[ 5]      : '05106871090'
+CONFIDENCE VALUE : '13'
+RAW SCORE[ 5]    : '44289'
+
+LITERAL[ 6]      : 'oh five one oh six eight seven one zero five'
+MEANING[ 6]      : '0510687105'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 6]    : '44351'
+
+LITERAL[ 7]      : 'oh five one oh oh six eight oh seven one zero nine'
+MEANING[ 7]      : '051006807109'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 7]    : '44365'
+
+LITERAL[ 8]      : 'oh five one oh oh six eight seven oh one zero nine'
+MEANING[ 8]      : '051006870109'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '44406'
+
+LITERAL[ 9]      : 'oh oh five one oh oh six eight seven one zero nine'
+MEANING[ 9]      : '005100687109'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '44424'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0303/S090.nwf
+C: five nine zero two eight seven three three four three
+Sem (1):  invocab=1
+S: 601
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'five nine zero two eight seven three three four three'
+LITERAL[ 0]      : 'five nine zero two eight seven three three four three'
+MEANING[ 0]      : '5902873343'
+CONFIDENCE VALUE : '601'
+RAW SCORE[ 0]    : '45003'
+
+LITERAL[ 1]      : 'five nine zero two eight seven oh three three four three'
+MEANING[ 1]      : '59028703343'
+CONFIDENCE VALUE : '312'
+RAW SCORE[ 1]    : '45228'
+
+LITERAL[ 2]      : 'five nine zero two eight seven three three four three oh'
+MEANING[ 2]      : '59028733430'
+CONFIDENCE VALUE : '156'
+RAW SCORE[ 2]    : '45229'
+
+LITERAL[ 3]      : 'oh five nine zero two eight seven three three four three'
+MEANING[ 3]      : '05902873343'
+CONFIDENCE VALUE : '84'
+RAW SCORE[ 3]    : '45238'
+
+LITERAL[ 4]      : 'five nine oh zero two eight seven three three four three'
+MEANING[ 4]      : '59002873343'
+CONFIDENCE VALUE : '44'
+RAW SCORE[ 4]    : '45254'
+
+LITERAL[ 5]      : 'five nine two zero two eight seven three three four three'
+MEANING[ 5]      : '59202873343'
+CONFIDENCE VALUE : '23'
+RAW SCORE[ 5]    : '45270'
+
+LITERAL[ 6]      : 'five oh nine zero two eight seven three three four three'
+MEANING[ 6]      : '50902873343'
+CONFIDENCE VALUE : '12'
+RAW SCORE[ 6]    : '45282'
+
+LITERAL[ 7]      : 'five nine zero two eight oh seven three three four three'
+MEANING[ 7]      : '59028073343'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 7]    : '45289'
+
+LITERAL[ 8]      : 'five nine eight zero two eight seven three three four three'
+MEANING[ 8]      : '59802873343'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 8]    : '45291'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0304/S052.nwf
+C: nine five eight one eight five eight seven five
+Sem (1):  invocab=1
+S: 541
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'nine five eight one eight five eight seven five'
+LITERAL[ 0]      : 'nine five eight three one eight five eight seven five'
+MEANING[ 0]      : '9583185875'
+CONFIDENCE VALUE : '541'
+RAW SCORE[ 0]    : '66816'
+
+LITERAL[ 1]      : 'nine five eight eight one eight five eight seven five'
+MEANING[ 1]      : '9588185875'
+CONFIDENCE VALUE : '304'
+RAW SCORE[ 1]    : '66841'
+
+LITERAL[ 2]      : 'nine five eight two one eight five eight seven five'
+MEANING[ 2]      : '9582185875'
+CONFIDENCE VALUE : '160'
+RAW SCORE[ 2]    : '66967'
+
+LITERAL[ 3]      : 'nine five eight three one eight five eight oh seven five'
+MEANING[ 3]      : '95831858075'
+CONFIDENCE VALUE : '81'
+RAW SCORE[ 3]    : '67006'
+
+LITERAL[ 4]      : 'nine five eight three one eight oh five eight seven five'
+MEANING[ 4]      : '95831805875'
+CONFIDENCE VALUE : '40'
+RAW SCORE[ 4]    : '67030'
+
+LITERAL[ 5]      : 'nine five eight eight one eight five eight oh seven five'
+MEANING[ 5]      : '95881858075'
+CONFIDENCE VALUE : '20'
+RAW SCORE[ 5]    : '67031'
+
+LITERAL[ 6]      : 'nine five eight eight one eight oh five eight seven five'
+MEANING[ 6]      : '95881805875'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 6]    : '67055'
+
+LITERAL[ 7]      : 'nine five eight three one eight five oh eight seven five'
+MEANING[ 7]      : '95831850875'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 7]    : '67055'
+
+LITERAL[ 8]      : 'oh nine five eight three one eight five eight seven five'
+MEANING[ 8]      : '09583185875'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 8]    : '67061'
+
+LITERAL[ 9]      : 'nine five eight three one oh eight five eight seven five'
+MEANING[ 9]      : '95831085875'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 9]    : '67067'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0304/S054.nwf
+C: one zero nine two five four seven seven six seven
+Sem (1):  invocab=1
+S: 432
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'one zero nine two five four seven seven six seven'
+LITERAL[ 0]      : 'one zero nine two five four seven seven six seven'
+MEANING[ 0]      : '1092547767'
+CONFIDENCE VALUE : '432'
+RAW SCORE[ 0]    : '49825'
+
+LITERAL[ 1]      : 'one zero nine two five four seven seven seven seven'
+MEANING[ 1]      : '1092547777'
+CONFIDENCE VALUE : '183'
+RAW SCORE[ 1]    : '49912'
+
+LITERAL[ 2]      : 'one zero two nine two five four seven seven six seven'
+MEANING[ 2]      : '10292547767'
+CONFIDENCE VALUE : '70'
+RAW SCORE[ 2]    : '50020'
+
+LITERAL[ 3]      : 'one zero nine two five four seven seven oh six seven'
+MEANING[ 3]      : '10925477067'
+CONFIDENCE VALUE : '27'
+RAW SCORE[ 3]    : '50024'
+
+LITERAL[ 4]      : 'one zero nine oh two five four seven seven six seven'
+MEANING[ 4]      : '10902547767'
+CONFIDENCE VALUE : '10'
+RAW SCORE[ 4]    : '50047'
+
+LITERAL[ 5]      : 'one zero nine two five four oh seven seven six seven'
+MEANING[ 5]      : '10925407767'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 5]    : '50058'
+
+LITERAL[ 6]      : 'oh one zero nine two five four seven seven six seven'
+MEANING[ 6]      : '01092547767'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 6]    : '50060'
+
+LITERAL[ 7]      : 'one zero nine two five four seven seven six seven oh'
+MEANING[ 7]      : '10925477670'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 7]    : '50063'
+
+LITERAL[ 8]      : 'one zero nine two five four seven seven six five'
+MEANING[ 8]      : '1092547765'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '50074'
+
+LITERAL[ 9]      : 'one zero two nine two five four seven seven seven seven'
+MEANING[ 9]      : '10292547777'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '50107'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0304/S055.nwf
+C: oh seven four five four oh seven three oh oh
+Sem (1):  invocab=1
+S: 504
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'oh seven four five four oh seven three oh oh'
+LITERAL[ 0]      : 'oh seven four five four oh seven three oh oh'
+MEANING[ 0]      : '0745407300'
+CONFIDENCE VALUE : '504'
+RAW SCORE[ 0]    : '43414'
+
+LITERAL[ 1]      : 'oh seven four five four oh seven three eight oh oh'
+MEANING[ 1]      : '07454073800'
+CONFIDENCE VALUE : '222'
+RAW SCORE[ 1]    : '43619'
+
+LITERAL[ 2]      : 'oh seven four five four oh one seven three oh oh'
+MEANING[ 2]      : '07454017300'
+CONFIDENCE VALUE : '98'
+RAW SCORE[ 2]    : '43626'
+
+LITERAL[ 3]      : 'oh oh seven four five four oh seven three oh oh'
+MEANING[ 3]      : '00745407300'
+CONFIDENCE VALUE : '45'
+RAW SCORE[ 3]    : '43648'
+
+LITERAL[ 4]      : 'oh seven four five four oh seven three oh oh oh'
+MEANING[ 4]      : '07454073000'
+CONFIDENCE VALUE : '19'
+RAW SCORE[ 4]    : '43648'
+
+LITERAL[ 5]      : 'oh seven four oh five four oh seven three oh oh'
+MEANING[ 5]      : '07405407300'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 5]    : '43652'
+
+LITERAL[ 6]      : 'oh seven four five four oh oh seven three oh oh'
+MEANING[ 6]      : '07454007300'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 6]    : '43672'
+
+LITERAL[ 7]      : 'oh seven four five four oh two seven three oh oh'
+MEANING[ 7]      : '07454027300'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 7]    : '43676'
+
+LITERAL[ 8]      : 'oh seven four five four oh four seven three oh oh'
+MEANING[ 8]      : '07454047300'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 8]    : '43681'
+
+LITERAL[ 9]      : 'oh seven oh four five four oh seven three oh oh'
+MEANING[ 9]      : '07045407300'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '43702'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0304/S074.nwf
+C: eight six one oh five six six two six two
+Sem (1):  invocab=1
+S: 536
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'eight six one oh five six six two six two'
+LITERAL[ 0]      : 'eight six one oh five six six two six two'
+MEANING[ 0]      : '8610566262'
+CONFIDENCE VALUE : '536'
+RAW SCORE[ 0]    : '40788'
+
+LITERAL[ 1]      : 'eight six four oh five six six two six two'
+MEANING[ 1]      : '8640566262'
+CONFIDENCE VALUE : '271'
+RAW SCORE[ 1]    : '40931'
+
+LITERAL[ 2]      : 'eight six one oh oh five six six two six two'
+MEANING[ 2]      : '86100566262'
+CONFIDENCE VALUE : '130'
+RAW SCORE[ 2]    : '40979'
+
+LITERAL[ 3]      : 'eight six one oh five oh six six two six two'
+MEANING[ 3]      : '86105066262'
+CONFIDENCE VALUE : '61'
+RAW SCORE[ 3]    : '41013'
+
+LITERAL[ 4]      : 'eight six one oh five six six oh two six two'
+MEANING[ 4]      : '86105660262'
+CONFIDENCE VALUE : '28'
+RAW SCORE[ 4]    : '41015'
+
+LITERAL[ 5]      : 'eight six oh one oh five six six two six two'
+MEANING[ 5]      : '86010566262'
+CONFIDENCE VALUE : '13'
+RAW SCORE[ 5]    : '41016'
+
+LITERAL[ 6]      : 'eight six one oh five six six two six two oh'
+MEANING[ 6]      : '86105662620'
+CONFIDENCE VALUE : '6'
+RAW SCORE[ 6]    : '41025'
+
+LITERAL[ 7]      : 'oh eight six one oh five six six two six two'
+MEANING[ 7]      : '08610566262'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 7]    : '41040'
+
+LITERAL[ 8]      : 'eight six one oh five two six six two six two'
+MEANING[ 8]      : '86105266262'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '41054'
+
+LITERAL[ 9]      : 'eight six one oh five six seven two six two'
+MEANING[ 9]      : '8610567262'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '41068'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0304/S075.nwf
+C: zero seven six five nine oh zero two five two
+Sem (1):  invocab=1
+S: 564
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'zero seven six five nine oh zero two five two'
+LITERAL[ 0]      : 'zero seven six five nine oh zero two five two'
+MEANING[ 0]      : '0765900252'
+CONFIDENCE VALUE : '564'
+RAW SCORE[ 0]    : '42076'
+
+LITERAL[ 1]      : 'zero seven six five nine oh zero two oh five two'
+MEANING[ 1]      : '07659002052'
+CONFIDENCE VALUE : '281'
+RAW SCORE[ 1]    : '42273'
+
+LITERAL[ 2]      : 'zero seven seven five nine oh zero two five two'
+MEANING[ 2]      : '0775900252'
+CONFIDENCE VALUE : '142'
+RAW SCORE[ 2]    : '42284'
+
+LITERAL[ 3]      : 'oh zero seven six five nine oh zero two five two'
+MEANING[ 3]      : '00765900252'
+CONFIDENCE VALUE : '71'
+RAW SCORE[ 3]    : '42310'
+
+LITERAL[ 4]      : 'zero seven six oh five nine oh zero two five two'
+MEANING[ 4]      : '07605900252'
+CONFIDENCE VALUE : '35'
+RAW SCORE[ 4]    : '42310'
+
+LITERAL[ 5]      : 'zero seven six five nine oh zero two five two oh'
+MEANING[ 5]      : '07659002520'
+CONFIDENCE VALUE : '17'
+RAW SCORE[ 5]    : '42312'
+
+LITERAL[ 6]      : 'zero seven six five nine oh oh zero two five two'
+MEANING[ 6]      : '07659000252'
+CONFIDENCE VALUE : '9'
+RAW SCORE[ 6]    : '42322'
+
+LITERAL[ 7]      : 'three zero seven six five nine oh zero two five two'
+MEANING[ 7]      : '30765900252'
+CONFIDENCE VALUE : '5'
+RAW SCORE[ 7]    : '42422'
+
+LITERAL[ 8]      : 'two zero seven six five nine oh zero two five two'
+MEANING[ 8]      : '20765900252'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 8]    : '42465'
+
+LITERAL[ 9]      : 'four zero seven six five nine oh zero two five two'
+MEANING[ 9]      : '40765900252'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 9]    : '42468'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0304/S076.nwf
+C: five zero two seven four nine three three zero zero
+Sem (1):  invocab=1
+S: 599
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'five zero two seven four nine three three zero zero'
+LITERAL[ 0]      : 'five zero two seven four nine three three zero zero'
+MEANING[ 0]      : '5027493300'
+CONFIDENCE VALUE : '599'
+RAW SCORE[ 0]    : '38923'
+
+LITERAL[ 1]      : 'five zero two oh seven four nine three three zero zero'
+MEANING[ 1]      : '50207493300'
+CONFIDENCE VALUE : '330'
+RAW SCORE[ 1]    : '39084'
+
+LITERAL[ 2]      : 'five zero two seven four nine three three eight zero zero'
+MEANING[ 2]      : '50274933800'
+CONFIDENCE VALUE : '173'
+RAW SCORE[ 2]    : '39135'
+
+LITERAL[ 3]      : 'oh five zero two seven four nine three three zero zero'
+MEANING[ 3]      : '05027493300'
+CONFIDENCE VALUE : '93'
+RAW SCORE[ 3]    : '39149'
+
+LITERAL[ 4]      : 'five zero two one seven four nine three three zero zero'
+MEANING[ 4]      : '50217493300'
+CONFIDENCE VALUE : '50'
+RAW SCORE[ 4]    : '39152'
+
+LITERAL[ 5]      : 'nine zero two seven four nine three three zero zero'
+MEANING[ 5]      : '9027493300'
+CONFIDENCE VALUE : '28'
+RAW SCORE[ 5]    : '39155'
+
+LITERAL[ 6]      : 'three five zero two seven four nine three three zero zero'
+MEANING[ 6]      : '35027493300'
+CONFIDENCE VALUE : '16'
+RAW SCORE[ 6]    : '39239'
+
+LITERAL[ 7]      : 'two five zero two seven four nine three three zero zero'
+MEANING[ 7]      : '25027493300'
+CONFIDENCE VALUE : '8'
+RAW SCORE[ 7]    : '39267'
+
+LITERAL[ 8]      : 'four five zero two seven four nine three three zero zero'
+MEANING[ 8]      : '45027493300'
+CONFIDENCE VALUE : '4'
+RAW SCORE[ 8]    : '39277'
+
+LITERAL[ 9]      : 'oh five zero two oh seven four nine three three zero zero'
+MEANING[ 9]      : '050207493300'
+CONFIDENCE VALUE : '2'
+RAW SCORE[ 9]    : '39310'
+
+----------------------------------------------
+
+Recognizer has been stopped
+D: dallas/0304/S077.nwf
+C: six nine five zero two eight seven seven three six
+Sem (1):  invocab=1
+S: 527
+
+
+----------------------------------------------
+TRANSCRIPTION    : 'six nine five zero two eight seven seven three six'
+LITERAL[ 0]      : 'six nine five zero two eight seven seven three six'
+MEANING[ 0]      : '6950287736'
+CONFIDENCE VALUE : '527'
+RAW SCORE[ 0]    : '42904'
+
+LITERAL[ 1]      : 'six nine five zero two eight seven seven three seven'
+MEANING[ 1]      : '6950287737'
+CONFIDENCE VALUE : '268'
+RAW SCORE[ 1]    : '42976'
+
+LITERAL[ 2]      : 'six nine five zero two oh eight seven seven three six'
+MEANING[ 2]      : '69502087736'
+CONFIDENCE VALUE : '141'
+RAW SCORE[ 2]    : '42990'
+
+LITERAL[ 3]      : 'six nine five zero two oh eight seven seven three seven'
+MEANING[ 3]      : '69502087737'
+CONFIDENCE VALUE : '71'
+RAW SCORE[ 3]    : '43062'
+
+LITERAL[ 4]      : 'two six nine five zero two eight seven seven three six'
+MEANING[ 4]      : '26950287736'
+CONFIDENCE VALUE : '34'
+RAW SCORE[ 4]    : '43113'
+
+LITERAL[ 5]      : 'six nine five zero two eight seven oh seven three six'
+MEANING[ 5]      : '69502870736'
+CONFIDENCE VALUE : '16'
+RAW SCORE[ 5]    : '43130'
+
+LITERAL[ 6]      : 'oh six nine five zero two eight seven seven three six'
+MEANING[ 6]      : '06950287736'
+CONFIDENCE VALUE : '7'
+RAW SCORE[ 6]    : '43137'
+
+LITERAL[ 7]      : 'six nine five zero two eight seven seven three six oh'
+MEANING[ 7]      : '69502877360'
+CONFIDENCE VALUE : '3'
+RAW SCORE[ 7]    : '43141'
+
+LITERAL[ 8]      : 'six nine five oh zero two eight seven seven three six'
+MEANING[ 8]      : '69500287736'
+CONFIDENCE VALUE : '1'
+RAW SCORE[ 8]    : '43142'
+
+LITERAL[ 9]      : 'eight six nine five zero two eight seven seven three six'
+MEANING[ 9]      : '86950287736'
+CONFIDENCE VALUE : '0'
+RAW SCORE[ 9]    : '43168'
+
+----------------------------------------------
+
+Recognizer has been stopped
diff --git a/doc/logs/srec/out_SHIP_set_get_param.txt b/doc/logs/srec/out_SHIP_set_get_param.txt
new file mode 100644
index 0000000..b26e416
--- /dev/null
+++ b/doc/logs/srec/out_SHIP_set_get_param.txt
@@ -0,0 +1,22 @@
+
+Create Recognizer:
+    InitSession()
+    SR_RecognizerCreate()
+    SR_RecognizerSetup()
+Create vocabulary object and associate with grammar:
+    SR_VocabularyLoad()
+    SR_VocabularyGetLanguage()
+Start a new log session:
+    SR_RecognizerLogSessionStart()
+Recognize:
+    SR_NametagsCreate()
+Get Parameter  :  SREC.Recognizer.utterance_timeout  :  400
+Get Parameter  :  SREC.Recognizer.utterance_timeout  :  100
+Get Parameter  :  CREC.Recognizer.terminal_timeout  :  30
+Get Parameter  :  CREC.Recognizer.terminal_timeout  :  100
+Get Parameter  :  CREC.Recognizer.optional_terminal_timeout  :  45
+Get Parameter  :  CREC.Recognizer.optional_terminal_timeout  :  100
+Get Parameter  :  CREC.Recognizer.non_terminal_timeout  :  90
+Get Parameter  :  CREC.Recognizer.non_terminal_timeout  :  100
+Get Parameter  :  CREC.Recognizer.eou_threshold  :  120
+Get Parameter  :  CREC.Recognizer.eou_threshold  :  100
diff --git a/doc/logs/srec/recog4_SHIP_bothtags5.res b/doc/logs/srec/recog4_SHIP_bothtags5.res
new file mode 100644
index 0000000..087a782
--- /dev/null
+++ b/doc/logs/srec/recog4_SHIP_bothtags5.res
@@ -0,0 +1,44 @@
+R: ph_EY ph_k ph_un ph_t ph_ih ph_OH1 ph_z
+S: 191
+R: ph_eh ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d
+S: 279
+R: ph_ih ph_r ph_w ph_EH1 ph_l ph_s ph_un
+S: 258
+R: ph_eh ph_d ph_r ph_y ph_UH1 ph_n ph_d
+S: 228
+R: ph_p ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s
+S: 305
+R: phone delete VCE_Pete_Gonzalez
+S: 747
+R: phone delete VCE_Peter_Wilson
+S: 497
+R: phone delete VCE_Edgar_Young
+S: 719
+R: phone delete VCE_Andrew_Evans
+S: 678
+R: phone delete VCE_John_Martinez
+S: 692
+R: phone delete Jen_Parker
+S: 848
+R: phone delete Jennifer_Hernandez
+S: 900
+R: phone delete Barb_Baker
+S: 878
+R: phone delete Elaine
+S: 832
+R: phone delete David
+S: 807
+R: forward
+S: 661
+R: traffic
+S: 810
+R: changer
+S: 806
+R: cd player
+S: 877
+R: traffic information
+S: 862
+R: traffic memory
+S: 848
+R: fahrenheit
+S: 252
diff --git a/doc/logs/srec/recog4_SHIP_bothtags5_from_saved.res b/doc/logs/srec/recog4_SHIP_bothtags5_from_saved.res
new file mode 100644
index 0000000..087a782
--- /dev/null
+++ b/doc/logs/srec/recog4_SHIP_bothtags5_from_saved.res
@@ -0,0 +1,44 @@
+R: ph_EY ph_k ph_un ph_t ph_ih ph_OH1 ph_z
+S: 191
+R: ph_eh ph_n ph_d ph_r ph_IH1 ph_m ph_un ph_d
+S: 279
+R: ph_ih ph_r ph_w ph_EH1 ph_l ph_s ph_un
+S: 258
+R: ph_eh ph_d ph_r ph_y ph_UH1 ph_n ph_d
+S: 228
+R: ph_p ph_UH1 ph_m ph_ur ph_k ph_y ph_n ph_ih ph_s
+S: 305
+R: phone delete VCE_Pete_Gonzalez
+S: 747
+R: phone delete VCE_Peter_Wilson
+S: 497
+R: phone delete VCE_Edgar_Young
+S: 719
+R: phone delete VCE_Andrew_Evans
+S: 678
+R: phone delete VCE_John_Martinez
+S: 692
+R: phone delete Jen_Parker
+S: 848
+R: phone delete Jennifer_Hernandez
+S: 900
+R: phone delete Barb_Baker
+S: 878
+R: phone delete Elaine
+S: 832
+R: phone delete David
+S: 807
+R: forward
+S: 661
+R: traffic
+S: 810
+R: changer
+S: 806
+R: cd player
+S: 877
+R: traffic information
+S: 862
+R: traffic memory
+S: 848
+R: fahrenheit
+S: 252
diff --git a/doc/logs/srec/recog4_SHIP_change_sample_rate2.res b/doc/logs/srec/recog4_SHIP_change_sample_rate2.res
new file mode 100644
index 0000000..d5aa6d1
--- /dev/null
+++ b/doc/logs/srec/recog4_SHIP_change_sample_rate2.res
@@ -0,0 +1,84 @@
+R: oh eight four nine two five one eight five
+S: 453
+R: eight eight nine five eight eight two eight four
+S: 289
+R: zero seven six five nine oh zero two five two
+S: 376
+R: five zero two seven four nine three three zero zero
+S: 392
+R: six nine five zero two eight seven seven
+S: 493
+R: seven one one five six zero oh six five nine
+S: 445
+R: oh three seven nine zero six eight five seven
+S: 398
+R: zero nine nine five seven two oh one zero six
+S: 477
+R: six eight seven two one oh eight five zero seven
+S: 556
+R: four two zero eight five nine oh nine four zero
+S: 490
+R: zero seven nine five two five seven six nine eight
+S: 628
+R: eight three five seven nine zero three five two oh
+S: 567
+R: eight four zero five six five four one four six
+S: 619
+R: oh nine seven three one three zero five five zero
+S: 625
+R: one three three three zero zero five oh six
+S: 630
+R: six seven five seven zero zero two six seven zero
+S: 507
+R: zero seven nine six five one four eight one eight
+S: 568
+R: three eight eight seven oh nine one seven five two
+S: 493
+R: eight one two six three six two five one oh
+S: 557
+R: seven six zero eight three three zero five nine four
+S: 551
+R: nine seven zero six five nine six oh six five
+S: 577
+R: four nine seven eight four five eight two zero zero
+S: 492
+R: nine oh one one five oh four seven five zero
+S: 564
+R: five zero nine two four four six two three
+S: 517
+R: four nine three zero three oh five seven two three
+S: 584
+R: five six five four five five three eight six seven
+S: 600
+R: oh six two nine one five two nine five oh
+S: 549
+R: two zero five four four nine two six five eight
+S: 551
+R: six eight five four oh one six two seven three
+S: 404
+R: three four three four eight four eight five six eight
+S: 401
+R: one two eight five zero seven eight six seven one
+S: 433
+R: oh five six eight eight nine five five one eight
+S: 616
+R: five four four oh two one four four zero nine
+S: 567
+R: oh five one oh six eight seven one zero nine
+S: 526
+R: five nine zero two eight seven three three four three
+S: 601
+R: nine five eight three one eight five eight seven five
+S: 541
+R: one zero nine two five four seven seven six seven
+S: 432
+R: oh seven four five four oh seven three oh oh
+S: 504
+R: eight six one oh five six six two six two
+S: 536
+R: zero seven six five nine oh zero two five two
+S: 564
+R: five zero two seven four nine three three zero zero
+S: 599
+R: six nine five zero two eight seven seven three six
+S: 527
diff --git a/doc/logs/srec/recog4_SHIP_liveaudio.res b/doc/logs/srec/recog4_SHIP_liveaudio.res
new file mode 100644
index 0000000..fd886ea
--- /dev/null
+++ b/doc/logs/srec/recog4_SHIP_liveaudio.res
@@ -0,0 +1,20 @@
+R: forward
+S: 716
+R: backward
+S: 764
+R: cd player
+S: 892
+R: celsius
+S: 859
+R: fahrenheit
+S: 820
+R: traffic info
+S: 895
+R: traffic
+S: 920
+R: asterisk
+S: 916
+R: hello
+S: 718
+R: forward
+S: 906
diff --git a/doc/logs/srec/recog4_SHIP_set_get_param.res b/doc/logs/srec/recog4_SHIP_set_get_param.res
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/doc/logs/srec/recog4_SHIP_set_get_param.res
diff --git a/doc/logs/uapi/run_ERT.log b/doc/logs/uapi/run_ERT.log
new file mode 100644
index 0000000..9fdbcde
--- /dev/null
+++ b/doc/logs/uapi/run_ERT.log
@@ -0,0 +1,24 @@
+# cd /system/usr/srec
+# ./run_ERT.sh
+Create an EmbeddedRecognizer
+Load a grammar
+Add word to grammar slot
+Save the grammar
+Grammar saved
+Recognizing against the first grammar (dynamic add-word)
+Meaning1=DEL Jen_Parker
+RecognizerListener1.onStopped()
+Load the second grammar (pre-populated slot)
+Grammar loaded
+Recognizing against the pre-populated grammar
+Meaning=DEL Jen_Parker
+Literal=phone delete Jen_Parker
+Score=80
+	key=raws value=22722
+	key=Phone.V value=DEL Jen_Parker
+	key=Names.V value=Jen_Parker
+	key=Phone.C value=DEL 
+	key=ROOT.meaning value=DEL Jen_Parker
+----- PASS -----
+# exit
+
diff --git a/doc/logs/uapi/run_contacts.log b/doc/logs/uapi/run_contacts.log
new file mode 100644
index 0000000..d28be48
--- /dev/null
+++ b/doc/logs/uapi/run_contacts.log
@@ -0,0 +1,39 @@
+# cd /system/usr/srec
+# ./run_contacts.sh
+SpeechTest3Console
+Initialising...
+android.speech.recognition.test.contacts.CLRecognizer:before EmbeddedRecognizer.getInstance()
+android.speech.recognition.test.contacts.CLRecognizer:after EmbeddedRecognizer.getInstance(): android.speech.recognition.impl.EmbeddedRecognizerImpl android.speech.recognition.impl.EmbeddedRecognizerImpl@4001e7a8
+android.speech.recognition.test.contacts.CLRecognizer:before EmbeddedRecognizer.configure(/system/usr/srec/config/en.us/baseline11k.par)
+android.speech.recognition.test.contacts.CLRecognizer:after EmbeddedRecognizer.configure()
+android.speech.recognition.test.contacts.CLRecognizer:before recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/dynamic-test.g2g)
+android.speech.recognition.test.contacts.CLRecognizer:after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/dynamic-test.g2g)
+android.speech.recognition.test.contacts.CLRecognizer:before grammar.load()
+android.speech.recognition.test.contacts.CLRecognizer:onLoaded
+android.speech.recognition.test.contacts.CLRecognizer:Adding words to grammar slot
+android.speech.recognition.test.contacts.CLRecognizer:item 0: Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:after grammar.load()
+android.speech.recognition.test.contacts.CLRecognizer:item 1: Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:item 2: Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:onCompileAllSlots
+GrammarAction:onGrammarSuccess
+Recognizing against the first grammar (dynamic add-word)
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:24
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+----- PASS -----
+# exit
+
diff --git a/doc/logs/uapi/run_parameters.log b/doc/logs/uapi/run_parameters.log
new file mode 100644
index 0000000..d29e57a
--- /dev/null
+++ b/doc/logs/uapi/run_parameters.log
@@ -0,0 +1,35 @@
+# cd /system/usr/srec
+# ./run_parameters.sh
+Robustness1: ESRSDK = /system/usr/srec
+Initialising...
+before EmbeddedRecognizer.getInstance()
+after EmbeddedRecognizer.getInstance(): android.speech.recognition.impl.EmbeddedRecognizerImpl android.speech.recognition.impl.EmbeddedRecognizerImpl@4001e2f8
+before EmbeddedRecognizer.configure(/system/usr/srec/config/en.us/baseline11k.par)
+after EmbeddedRecognizer.configure()
+before EmbeddedRecognizer.setlistener()
+after EmbeddedRecognizer.setlistener()
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Frontend.samplerate = 11025
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Frontend.samplerate = 8000
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+Getting new parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.terminal_timeout = 200
+CREC.Frontend.samplerate = 8000
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+# exit
diff --git a/doc/logs/uapi/run_robustness1.log b/doc/logs/uapi/run_robustness1.log
new file mode 100644
index 0000000..759e184
--- /dev/null
+++ b/doc/logs/uapi/run_robustness1.log
@@ -0,0 +1,971 @@
+# cd /system/usr/srec
+# ./run_robustness1.sh
+Robustness1: ESRSDK = /system/usr/srec
+Initialising...
+android.speech.recognition.test.contacts.CLRecognizer:before EmbeddedRecognizer.getInstance()
+android.speech.recognition.test.contacts.CLRecognizer:after EmbeddedRecognizer.getInstance(): android.speech.recognition.impl.EmbeddedRecognizerImpl android.speech.recognition.impl.EmbeddedRecognizerImpl@4001e968
+android.speech.recognition.test.contacts.CLRecognizer:before EmbeddedRecognizer.configure(/system/usr/srec/config/en.us/baseline11k.par)
+android.speech.recognition.test.contacts.CLRecognizer:after EmbeddedRecognizer.configure()
+android.speech.recognition.test.contacts.CLRecognizer:before recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/dynamic-test.g2g)
+android.speech.recognition.test.contacts.CLRecognizer:after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/dynamic-test.g2g)
+android.speech.recognition.test.contacts.CLRecognizer:before grammar.load()
+android.speech.recognition.test.contacts.CLRecognizer:onLoaded
+android.speech.recognition.test.contacts.CLRecognizer:Adding words to grammar slot
+android.speech.recognition.test.contacts.CLRecognizer:item 0: Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:item 1: Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:item 2: Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:after grammar.load()
+android.speech.recognition.test.contacts.CLRecognizer:onCompileAllSlots
+GrammarAction:onGrammarSuccess
+Iteration: 1
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:24
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 2
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:25
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 3
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:27
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 4
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:18
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 5
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:15
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 6
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:16
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+Iteration: 7
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:16
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 8
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:16
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 9
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:16
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 10
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:17
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 11
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:18
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 12
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:18
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 13
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 14
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:20
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 15
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:20
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+Iteration: 16
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 17
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:21
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 18
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 19
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+writerListener: onStopped()
+File was saved
+Iteration: 20
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 21
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 22
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 23
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+writerListener: onStopped()
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+File was saved
+Iteration: 24
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 25
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 26
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 27
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 28
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 29
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 30
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 31
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+writerListener: onStopped()
+File was saved
+Iteration: 32
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 33
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 34
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 35
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 36
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 37
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 38
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 39
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 40
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 41
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 42
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 43
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 44
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 45
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 46
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 47
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 48
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 49
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+Iteration: 50
+Recognizing with: /system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:19
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+
+<< test continues on until it is manually stopped >>
diff --git a/doc/logs/uapi/run_robustness2.log b/doc/logs/uapi/run_robustness2.log
new file mode 100644
index 0000000..1c58457
--- /dev/null
+++ b/doc/logs/uapi/run_robustness2.log
@@ -0,0 +1,1321 @@
+# cd /system/usr/srec
+# ./run_robustness2.sh
+Robustness2: ESRSDK = /system/usr/srec
+Initialising...
+android.speech.recognition.test.contacts.CLRecognizer:before EmbeddedRecognizer.getInstance()
+android.speech.recognition.test.contacts.CLRecognizer:after EmbeddedRecognizer.getInstance(): android.speech.recognition.impl.EmbeddedRecognizerImpl android.speech.recognition.impl.EmbeddedRecognizerImpl@4001e990
+android.speech.recognition.test.contacts.CLRecognizer:before EmbeddedRecognizer.configure(/system/usr/srec/config/en.us/baseline11k.par)
+android.speech.recognition.test.contacts.CLRecognizer:after EmbeddedRecognizer.configure()
+android.speech.recognition.test.contacts.CLRecognizer:before recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/dynamic-test.g2g)
+android.speech.recognition.test.contacts.CLRecognizer:after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/dynamic-test.g2g)
+android.speech.recognition.test.contacts.CLRecognizer:before grammar.load()
+android.speech.recognition.test.contacts.CLRecognizer:onLoaded
+android.speech.recognition.test.contacts.CLRecognizer:Adding words to grammar slot
+android.speech.recognition.test.contacts.CLRecognizer:item 0: Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:after grammar.load()
+android.speech.recognition.test.contacts.CLRecognizer:item 1: Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:item 2: Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:onCompileAllSlots
+GrammarAction:onGrammarSuccess
+
+-----------------------------------
+Iteration: 0
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:67
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 1
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:76
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 2
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:83
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 3
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:79
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 4
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:88
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 5
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:80
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 6
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:81
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 7
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:85
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 8
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:90
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 9
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:85
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 10
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:88
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 11
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:81
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 12
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:83
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 13
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:89
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 14
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:88
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+writerListener: onStopped()
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+File was saved
+Woke up
+
+-----------------------------------
+Iteration: 15
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:68
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+writerListener: onStopped()
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 16
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:79
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 17
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:86
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 18
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:83
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 19
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:81
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 20
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:86
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 21
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:66
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 22
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:84
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 23
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:87
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 24
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:78
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 25
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:Dennis Velasco score:88
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 26
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:81
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 27
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:82
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 28
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:84
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 29
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:85
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 30
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:81
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 31
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:84
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 32
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:85
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 33
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:85
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 34
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:88
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 35
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:86
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 36
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:82
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 37
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:85
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 38
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:88
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 39
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:83
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 40
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:81
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 41
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:82
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 42
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:82
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 43
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:87
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 44
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:84
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 45
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:78
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 46
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:85
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 47
+Recording from microphone...
+SAY: LOOKUP Jen Parker
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Jen Parker literal:lookup Jen Parker score:83
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Jen Parker
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 48
+Recording from microphone...
+SAY: LOOKUP Andy Wyatt
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Andy Wyatt literal:lookup Andy Wyatt score:82
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Andy Wyatt
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+
+-----------------------------------
+Iteration: 49
+Recording from microphone...
+SAY: LOOKUP Dennis Velasco
+
+-----------------------------------
+android.speech.recognition.test.contacts.CLRecognizer:+recognize()
+android.speech.recognition.test.contacts.CLRecognizer:-recognize()
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStarted()
+android.speech.recognition.test.contacts.CLRecognizer:onStarted
+android.speech.recognition.test.contacts.CLRecognizer:onBeginningOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onEndOfSpeech
+android.speech.recognition.test.contacts.CLRecognizer:onRecognitionResult: 1
+android.speech.recognition.test.contacts.CLRecognizer:result 1 semantic: Dennis Velasco literal:lookup Dennis Velasco score:64
+android.speech.recognition.test.contacts.CLRecognizer:+onStopped()
+Recognition Result: SUCCESS
+num results: 1
+result 1:Dennis Velasco
+android.speech.recognition.test.contacts.CLRecognizer:-onStopped()
+writerListener: onStopped()
+File was saved
+android.speech.recognition.test.contacts.CLRecognizer:AudioSource: onStopped()
+Audio source stopped
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+----- PASS -----
+# exit
diff --git a/doc/logs/uapi/run_robustness3.log b/doc/logs/uapi/run_robustness3.log
new file mode 100644
index 0000000..3be866b
--- /dev/null
+++ b/doc/logs/uapi/run_robustness3.log
@@ -0,0 +1,8320 @@
+# cd /system/usr/srec
+# ./run_robustness3.sh
+Robustness3: ESRSDK = /system/usr/srec
+IDLE --> CREATE_RECOGNIZER
+before EmbeddedRecognizer.getInstance()
+after EmbeddedRecognizer.getInstance(): android.speech.recognition.impl.EmbeddedRecognizerImpl android.speech.recognition.impl.EmbeddedRecognizerImpl@40021740
+before EmbeddedRecognizer.configure(/system/usr/srec/config/en.us/baseline11k.par)
+after EmbeddedRecognizer.configure()
+before EmbeddedRecognizer.setlistener()
+after EmbeddedRecognizer.setlistener()
+CREATE_RECOGNIZER --> SHOW_ITERATION
+---------------------------------------
+Iteration:0
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:78
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:1
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:2
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+MFRListener: onStarted()
+onStarted
+-recognize()
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:74
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:3
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:83
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:89
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:4
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:89
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:5
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:82
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+-onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:6
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+MFRListener: onStopped()
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:7
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+-onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:8
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:83
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+-onStopped()
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:9
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:86
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:10
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+-onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:11
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:12
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:13
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:14
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:15
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:86
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:16
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:17
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:18
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:86
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:19
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:20
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:21
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:22
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:23
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:24
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+MFRListener: onStopped()
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:25
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:26
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:27
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:28
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:29
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+-onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:30
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+MFRListener: onStarted()
+onStarted
+-recognize()
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:31
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:32
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:33
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:34
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:35
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:36
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:37
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:38
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:39
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:40
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:41
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:42
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:43
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:44
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:45
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+MFRListener: onStarted()
+onStarted
+-recognize()
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:46
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+MFRListener: onStarted()
+onStarted
+-recognize()
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICListener: onStarted()
+Record for 2 secs.
+MICROPHONE --> STATE_MICROPHONE_STARTING
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:47
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:48
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:49
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+-onStopped()
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:50
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+-onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:51
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:52
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:53
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:54
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:55
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:56
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+-onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:57
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:58
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+MFRListener: onStarted()
+onStarted
+-recognize()
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+-onStopped()
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:59
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:60
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+MFRListener: onStopped()
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:61
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:62
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+MFRListener: onStarted()
+onStarted
+-recognize()
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:63
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:64
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_103.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete John Martinez:DEL John Martinez:88
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a10e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:changer:CHANGER:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:65
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_254.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:Andrew Evans:Andrew Evans:87
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFRListener: onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a12e.nwv
+MFRListener: onStarted()
+onStarted
+-recognize()
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:forward:FWD:85
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+---------------------------------------
+Iteration:66
+---------------------------------------
+SHOW_ITERATION --> CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR1 --> CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+CREATE_GRAMMAR2 --> LOAD_GRAMMAR1
+LOAD_GRAMMAR1 --> LOADING_GRAMMAR1
+G1Listener: onLoaded
+G1Listener: Adding words to grammar slot
+item 0: Jen Parker
+item 1: John Martinez
+item 2: Andrew Evans
+G1Listener: Starting adding words to grammar slot
+LOADING_GRAMMAR1 --> ADD_SLOT_ITEM_LIST
+G1Listener: onAddItemList
+G1Listener: Finish adding words to grammar slot
+ADD_SLOT_ITEM_LIST --> COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+COMPILING_GRAMMAR1 --> SAVE_GRAMMAR1
+SAVE_GRAMMAR1 --> SAVING_GRAMMAR1
+G1Listener: onSaved
+SAVING_GRAMMAR1 --> UNLOAD_GRAMMAR1
+UNLOAD_GRAMMAR1 --> UNLOADING_GRAMMAR1
+G1Listener: onUnloaded
+UNLOADING_GRAMMAR1 --> CREATE_GRAMMAR3
+CREATE_GRAMMAR3 --> LOADING_GRAMMAR3
+before CreateGrammar(/system/usr/srec/grammar3.g2g)
+after recognizer.createGrammar(/system/usr/srec/grammar3.g2g)
+G2Listener:  onLoaded
+LOADING_GRAMMAR3 --> RECOGNIZE_WITH_GRAMMAR3
+RECOGNIZE_WITH_GRAMMAR3 --> RECOGNIZING_WITH_GRAMMAR3
++recognize()
+/system/usr/srec/config/en.us/audio/v139/v139_113.nwv
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:phone delete Jen Parker:DEL Jen Parker:84
++onStopped()
+RECOGNIZING_WITH_GRAMMAR3 --> SAVING_CONTATCS_TEST_SOUND
+Saving.../system/usr/srec/R3_contactsTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_CONTATCS_TEST_SOUND --> UNLOAD_GRAMMAR3
+UNLOAD_GRAMMAR3 --> UNLOADING_GRAMMAR3
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR3 --> LOAD_GRAMMAR2
+LOAD_GRAMMAR2 --> LOADING_GRAMMAR2
+G2Listener:  onLoaded
+LOADING_GRAMMAR2 --> RECOGNIZE_WITH_GRAMMAR2
+RECOGNIZE_WITH_GRAMMAR2 --> RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/config/en.us/audio/m252/m252a11e.nwv
+-recognize()
+MFRListener: onStarted()
+onStarted
+onBeginningOfSpeech
+MFRListener: onStopped()
+onEndOfSpeech
+onRecognitionResult: 1
+result 1:traffic information:TRFI:90
++onStopped()
+RECOGNIZING_WITH_GRAMMAR2 --> SAVING_ACTION_TEST_SOUND
+Saving.../system/usr/srec/R3_actionTestSound.raw
+-onStopped()
+MFWListener: onStopped()
+SAVING_ACTION_TEST_SOUND --> UNLOAD_GRAMMAR2
+UNLOAD_GRAMMAR2 --> UNLOADING_GRAMMAR2
+G2Listener:   onUnloaded
+UNLOADING_GRAMMAR2 --> MICROPHONE
+Start recording...
+MICROPHONE --> STATE_MICROPHONE_STARTING
+MICListener: onStarted()
+Record for 2 secs.
+STATE_MICROPHONE_STARTING --> MICROPHONE_RECORDING
+MICROPHONE_RECORDING --> RECORDING_STOP
+RECORDING_STOP --> STOPPING_MICROPHONE
+MICListener: onStopped()
+STOPPING_MICROPHONE --> STATE_SAVE_RECORDED_AUDIO
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+Woke up
+MICListener: Saving record sound R3_microphoneTestSound.raw
+STATE_SAVE_RECORDED_AUDIO --> SAVING_RECORDED_AUDIO
+MFWListener: onStopped()
+SAVING_RECORDED_AUDIO --> COMPARE_FILES
+Compare MIC Files
+/system/usr/srec/R3_microphoneTestSound.raw
+Size:41004
+COMPARE_FILES --> GET_PARAMS
+GET_PARAMS --> GETTING_PARAMS
+Retrieving parameter values...
+onParametersGet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+GETTING_PARAMS --> SET_PARAMS
+SET_PARAMS --> SETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 400
+CREC.Recognizer.terminal_timeout = 200
+CREC.Recognizer.optional_terminal_timeout = 300
+CREC.Recognizer.eou_threshold = 500
+SREC.Recognizer.utterance_timeout = 100
+SETTING_PARAMS --> RESET_PARAMS
+RESET_PARAMS --> RESETTING_PARAMS
+Setting new parameter values...
+onParametersSet: 
+CREC.Recognizer.non_terminal_timeout = 90
+CREC.Recognizer.terminal_timeout = 30
+CREC.Recognizer.optional_terminal_timeout = 45
+CREC.Recognizer.eou_threshold = 120
+SREC.Recognizer.utterance_timeout = 400
+RESETTING_PARAMS --> RESET
+RESET --> SHOW_ITERATION
+<< test continues on until it is manually stopped >>
diff --git a/doc/logs/uapi/run_voicetags1.log b/doc/logs/uapi/run_voicetags1.log
new file mode 100644
index 0000000..f9641dc
--- /dev/null
+++ b/doc/logs/uapi/run_voicetags1.log
@@ -0,0 +1,4554 @@
+# cd /system/usr/srec
+# ./run_voicetags1.sh
+Voicetags1: ESRSDK = /system/usr/srec
+STATE_IDLE --> STATE_CREATE_RECOGNIZER
+before EmbeddedRecognizer.getInstance()
+after  EmbeddedRecognizer.getInstance(): android.speech.recognition.impl.EmbeddedRecognizerImpl android.speech.recognition.impl.EmbeddedRecognizerImpl@400212d0
+before EmbeddedRecognizer.configure(/system/usr/srec/config/en.us/baseline11k.par)
+after EmbeddedRecognizer.configure()
+before EmbeddedRecognizer.setlistener()
+after EmbeddedRecognizer.setlistener()
+STATE_CREATE_RECOGNIZER --> STATE_SET_PARAM_ON
+STATE_SET_PARAM_ON --> STATE_SETTING_PARAM_ON
+Setting parameter
+onParametersSet: 
+enableGetWaveform = 1
+STATE_SETTING_PARAM_ON --> STATE_CREATE_GRAMMAR1
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/enroll.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/enroll.g2g)
+STATE_CREATE_GRAMMAR1 --> STATE_LOAD_GRAMMAR1
+STATE_LOAD_GRAMMAR1 --> STATE_LOADING_GRAMMAR1
+G1Listener:  onLoaded
+STATE_LOADING_GRAMMAR1 --> STATE_COMPILING_GRAMMAR1
+G1Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR1 --> STATE_MICROPHONE
+STATE_MICROPHONE --> STATE_MICROPHONE_START
+Start recording...
+recognize()
+STATE_MICROPHONE_START --> STATE_RECORD_RECOGNIZING
+MICListener: onStarted()
+----------------------------
+        PLEASE SAY...
+Jen Parker
+----------------------------
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+MICListener: onStopped()
+Woke up
+Saving.../system/usr/srec/VTAudioJen Parker.raw
+STATE_RECORD_RECOGNIZING --> STATE_WAIT_SAVED_VOICETAG
++onStopped()
+State:STATE_WAIT_SAVED_VOICETAG
+-onStopped()
+VTGListener: onSaved: /system/usr/srec/Jen Parker.vtg
+STATE_WAIT_SAVED_VOICETAG --> STATE_RESET_ENROLLMENT
+STATE_RESET_ENROLLMENT --> STATE_MICROPHONE
+STATE_MICROPHONE --> STATE_MICROPHONE_START
+Start recording...
+recognize()
+STATE_MICROPHONE_START --> STATE_RECORD_RECOGNIZING
+MICListener: onStarted()
+----------------------------
+        PLEASE SAY...
+Pete Gonzalez
+----------------------------
+MFWListener: onStopped()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+MICListener: onStopped()
+Woke up
+Saving.../system/usr/srec/VTAudioPete Gonzalez.raw
+STATE_RECORD_RECOGNIZING --> STATE_WAIT_SAVED_VOICETAG
++onStopped()
+State:STATE_WAIT_SAVED_VOICETAG
+-onStopped()
+VTGListener: onSaved: /system/usr/srec/Pete Gonzalez.vtg
+STATE_WAIT_SAVED_VOICETAG --> STATE_RESET_ENROLLMENT
+STATE_RESET_ENROLLMENT --> STATE_MICROPHONE
+STATE_MICROPHONE --> STATE_MICROPHONE_START
+Start recording...
+recognize()
+STATE_MICROPHONE_START --> STATE_RECORD_RECOGNIZING
+MICListener: onStarted()
+----------------------------
+        PLEASE SAY...
+Andrew Evans
+----------------------------
+MFWListener: onStopped()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+Sleep 1800 ms (workaround for Sooner audio driver bug)
+MICListener: onStopped()
+Woke up
+Saving.../system/usr/srec/VTAudioAndrew Evans.raw
+STATE_RECORD_RECOGNIZING --> STATE_WAIT_SAVED_VOICETAG
++onStopped()
+State:STATE_WAIT_SAVED_VOICETAG
+-onStopped()
+VTGListener: onSaved: /system/usr/srec/Andrew Evans.vtg
+STATE_WAIT_SAVED_VOICETAG --> STATE_SET_PARAM_OFF
+STATE_SET_PARAM_OFF --> STATE_SETTING_PARAM_OFF
+Setting parameter
+onParametersSet: 
+enableGetWaveform = 0
+STATE_SETTING_PARAM_OFF --> STATE_UNLOAD_GRAMMAR1
+STATE_UNLOAD_GRAMMAR1 --> STATE_UNLOADING_GRAMMAR1
+G1Listener:   onUnloaded
+STATE_UNLOADING_GRAMMAR1 --> STATE_CREATE_GRAMMAR2
+before CreateGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+after recognizer.createGrammar(/system/usr/srec/config/en.us/grammars/bothtags5.g2g)
+STATE_CREATE_GRAMMAR2 --> STATE_LOAD_GRAMMAR2
+STATE_LOAD_GRAMMAR2 --> STATE_LOADING_GRAMMAR2
+G2Listener: onLoaded
+STATE_LOADING_GRAMMAR2 --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:1
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+MFWListener: onStopped()
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id93meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+MFRListener: onStarted()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id93meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:3
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id93meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id93meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:5
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id93meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+-onStopped()
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id93meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:7
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id93meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:9
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id93meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:11
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id93meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:13
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:15
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id93meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+-onStopped()
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:17
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:19
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:21
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:23
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:25
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:27
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:29
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:31
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:33
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:35
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:37
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:39
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:41
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:43
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:45
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:47
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:49
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:51
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:53
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:55
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:57
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:59
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:61
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:63
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:65
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:67
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:69
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:71
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:73
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:75
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+-onStopped()
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+onStarted
+-recognize()
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-onStopped()
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:77
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-onStopped()
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:79
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:81
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:83
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:85
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:87
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:89
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-onStopped()
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:91
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:93
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:95
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:97
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+-onStopped()
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+-recognize()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:99
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:101
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-onStopped()
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:103
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:105
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:107
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+onStarted
+-recognize()
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:109
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:111
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+-onStopped()
+MFRListener: onStarted()
+-recognize()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+MFRListener: onStarted()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+---------------------------------------
+Iteration:113
+---------------------------------------
+STATE_SHOW_ITERATION --> STATE_RESET_ALL_SLOTS_GRAMMAR2
+STATE_RESET_ALL_SLOTS_GRAMMAR2 --> STATE_RESETTING_SLOTS_GRAMMAR2
+-onStopped()
+G2Listener: onResetAllSlots
+STATE_RESETTING_SLOTS_GRAMMAR2 --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Jen Parker.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Pete Gonzalez.vtg
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+VTGListener: onLoaded
+STATE_LOADING_VOICETAG_IDX --> STATE_LOAD_VOICETAG_IDX
+Load Path:/system/usr/srec/Andrew Evans.vtg
+VTGListener: onLoaded
+STATE_LOAD_VOICETAG_IDX --> STATE_LOADING_VOICETAG_IDX
+STATE_LOADING_VOICETAG_IDX --> STATE_ADD_VOICETAGITEM_GRAMMAR2
+item 0: Jen Parker
+item 1: Pete Gonzalez
+item 2: Andrew Evans
+G2Listener: onAddItemList
+G2Listener: Finish adding voicetags to grammar slot
+STATE_ADD_VOICETAGITEM_GRAMMAR2 --> STATE_ADDING_VOICETAGITEM
+STATE_ADDING_VOICETAGITEM --> STATE_COMPILE_GRAMMAR2
+G2Listener: onCompileAllSlots
+STATE_COMPILE_GRAMMAR2 --> STATE_COMPILING_GRAMMAR2
+STATE_COMPILING_GRAMMAR2 --> STATE_SAVE_GRAMMAR2
+STATE_SAVE_GRAMMAR2 --> STATE_SAVING_GRAMMAR2
+G2Listener: onSaved :/system/usr/srec/grammarVoicetag.g2g
+STATE_SAVING_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioJen Parker.raw
+MFRListener: onStarted()
+onStarted
+-recognize()
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Jen Parker-Id92meaning:(514)555-8666
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioPete Gonzalez.raw
+MFRListener: onStarted()
+-recognize()
+-onStopped()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Pete Gonzalez-Id92meaning:(613)555-5464
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RECOGNIZE_WITH_GRAMMAR2
+STATE_RECOGNIZE_WITH_GRAMMAR2 --> STATE_RECOGNIZING_WITH_GRAMMAR2
++recognize()
+/system/usr/srec/VTAudioAndrew Evans.raw
+-recognize()
+-onStopped()
+MFRListener: onStarted()
+onStarted
+MFRListener: onStopped()
+onBeginningOfSpeech
+onEndOfSpeech
+onRecognitionResult: 1
+result 1Literal:Andrew Evans-Id92meaning:(800)555-1234
+================================
++onStopped()
+STATE_RECOGNIZING_WITH_GRAMMAR2 --> STATE_RESET
+STATE_RESET --> STATE_SHOW_ITERATION
+<< test continues on until it is manually stopped >>
diff --git a/doc/srec.doxygen b/doc/srec.doxygen
new file mode 100644
index 0000000..560e9ff
--- /dev/null
+++ b/doc/srec.doxygen
@@ -0,0 +1,1334 @@
+# Doxyfile 1.5.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file that 
+# follow. The default is UTF-8 which is also the encoding used for all text before 
+# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into 
+# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of 
+# possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = SREC
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = "(C) Copyright 2003-2007 Nuance  "
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = doc/srec_api
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, 
+# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, 
+# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, 
+# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = "The $name class  " \
+                         "The $name widget  " \
+                         "The $name file  " \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = YES
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 5
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = YES
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be extracted 
+# and appear in the documentation as a namespace called 'anonymous_namespace{file}', 
+# where file will be replaced with the base name of the file that contains the anonymous 
+# namespace. By default anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= NO
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = NO
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text  "
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = doxygen.log
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = Shared \
+                         portable \
+                         srec
+
+# This tag can be used to specify the character encoding of the source files that 
+# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
+# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
+# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = *Impl.h \
+                         */portable/include/pcputimer.h \
+                         */portable/include/pcrc.h \
+                         */portable/include/ptimer.h \
+                         */portable/include/phashtable.h \
+                         */portable/include/pmalloc.h \
+                         */portable/include/PANSIFileSystem.h \
+                         */portable/include/PMemoryFileSystem.h \
+                         */portable/include/PStackTrace.h \
+                         */portable/include/ptimestamp.h \
+                         */portable/include/ptrd.h \
+                         */portable/include/vxworks/* \
+                         */Shared/include/CircularBuffer.h \
+                         */Shared/include/ArrayList.h \
+                         */Shared/include/FloatArrayList.h \
+                         */Shared/include/IntArrayList.h \
+                         */Shared/include/LCHARSet.h \
+                         */Shared/include/HashMap.h \
+                         */Shared/include/Int8ArrayList.h \
+                         */Shared/include/lstring.h \
+                         */Shared/include/LCHAR.h \
+                         */srec/include/* \
+                         */srec/cfront/* \
+                         */srec/clib/* \
+                         */srec/crec/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the output. 
+# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, 
+# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = YES
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH 
+# then you must also enable this option. If you don't then doxygen will produce 
+# a warning and turn it on anyway
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.  Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = .\
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = YES
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 1
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 245
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = HAS_ASSERT \
+                         USE_STDIO \
+                         DOXYGEN_SHOULD_SKIP_THIS \
+                         _WIN32 \
+                         USE_THREAD
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to 
+# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to 
+# specify the directory where the mscgen tool resides. If left empty the tool is assumed to 
+# be found in the default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a caller dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable caller graphs for selected 
+# functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = "c:/Program Files/ATT/GraphViz/bin  "
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the number 
+# of direct children of the root node in a graph is already larger than 
+# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/java/Android.mk b/java/Android.mk
new file mode 100644
index 0000000..0541c8d
--- /dev/null
+++ b/java/Android.mk
@@ -0,0 +1,12 @@
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_MODULE := srec-java-tests 
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_JAVA_LIBRARY)
+
diff --git a/java/android/android/speech/recognition/test/EmbeddedRecognizerTest.java b/java/android/android/speech/recognition/test/EmbeddedRecognizerTest.java
new file mode 100644
index 0000000..fbf735b
--- /dev/null
+++ b/java/android/android/speech/recognition/test/EmbeddedRecognizerTest.java
@@ -0,0 +1,308 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedRecognizerTest.java                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+package android.speech.recognition.test;
+
+import android.speech.recognition.RecognitionResult;
+import java.util.Hashtable;
+import java.util.concurrent.Callable;
+import android.speech.recognition.AbstractEmbeddedGrammarListener;
+import android.speech.recognition.AbstractRecognizerListener;
+import android.speech.recognition.AudioSource;
+import android.speech.recognition.AudioStream;
+import android.speech.recognition.Codec;
+import android.speech.recognition.EmbeddedRecognizer;
+import android.speech.recognition.GrammarListener;
+import android.speech.recognition.MediaFileReader;
+import android.speech.recognition.MediaFileReaderListener;
+import android.speech.recognition.MediaFileWriter;
+import android.speech.recognition.MediaFileWriterListener;
+import android.speech.recognition.NBestRecognitionResult;
+import android.speech.recognition.NBestRecognitionResult.Entry;
+import android.speech.recognition.SrecGrammar;
+import android.speech.recognition.WordItem;
+import android.speech.recognition.Grammar;
+import java.util.Enumeration;
+
+/**
+ * Tests the embedded recognizer functionality.
+ */
+public class EmbeddedRecognizerTest implements Callable<Void>
+{
+  private static final String ESRSDK = (System.getenv("ESRSDK") != null) ? System.getenv("ESRSDK") : "/system/usr/srec";
+  private static final String QSDK = (System.getenv("QSDK") != null) ? System.getenv("QSDK") : "/system/usr/srec";
+  private static final String populatedGrammar = "grammar.g2g";
+  private SrecGrammar grammar;
+  private final JUnitListener junitListener;
+
+  private Object waitForTestToFinish;
+  private boolean testFinished = false;
+
+  public static void main(String[] args)
+  {
+    EmbeddedRecognizerTest test =
+      new EmbeddedRecognizerTest(new EmptyJUnitListener());
+    try
+    {
+      test.call();
+    }
+    catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+  }
+
+  /**
+   * Creates a new EmbeddedRecognizerTest with JUnit integration.
+   *
+   * @param junitListener listens for test events
+   */
+  public EmbeddedRecognizerTest(JUnitListener junitListener)
+  {
+    this.junitListener = junitListener;
+    waitForTestToFinish = new Object();
+  }
+
+  public Void call() throws Exception
+  {
+    System.out.println("Create an EmbeddedRecognizer");
+    EmbeddedRecognizer recognizer = EmbeddedRecognizer.getInstance();
+    String recognizerConfiguration = ESRSDK + "/config/en.us/baseline11k.par";
+    recognizer.configure(recognizerConfiguration);
+    recognizer.setListener(new RecognitionListener1());
+
+    System.out.println("Load a grammar");
+    String grammarPath = ESRSDK + "/config/en.us/grammars/bothtags5.g2g";
+    grammar =
+      (SrecGrammar) recognizer.createGrammar(grammarPath, new GrammarListener1());
+    grammar.load();
+
+    System.out.println("Add word to grammar slot");
+    String slotName = "@Names";
+    WordItem word = WordItem.valueOf("Jen_Parker", "jen&p)rkP");
+    int weight = 0;
+    String semanticValue = "V='Jen_Parker'";
+    grammar.addItem(slotName, word, weight, semanticValue);
+    grammar.compileAllSlots();
+
+    System.out.println("Save the grammar");
+    grammar.save(populatedGrammar);
+
+    synchronized (waitForTestToFinish)
+    {
+      waitForTestToFinish.wait(20000);
+      if(testFinished)
+        System.out.println("----- PASS -----");
+      else
+        System.out.println("----- FAIL -----");
+    }
+    //TODO remove this once android fixed the shutdownHook for our automatic System.dispose
+    android.speech.recognition.impl.System.getInstance().dispose();
+    
+    // Next event should be GrammarListener1.onSave()
+    return null;
+  }
+
+  private class GrammarListener1 extends AbstractEmbeddedGrammarListener
+  {
+    @Override
+    public void onSaved(String path)
+    {
+      System.out.println("Grammar saved");
+      String audioPath = ESRSDK + "/config/en.us/audio/v139/v139_113.nwv";
+      int headerLength = 1024;
+      MediaFileReader mediaFileReader =
+        MediaFileReader.create(audioPath, new ReaderListener());
+
+      System.out.println("Recognizing against the first grammar (dynamic " + "add-word)");
+      AudioStream audio = mediaFileReader.createAudio();
+      logRecognizerAudio(mediaFileReader, QSDK + "/EmbeddedRecognizerTest1.raw");
+
+      mediaFileReader.start();
+      EmbeddedRecognizer.getInstance().recognize(audio, grammar);
+      // Next event should be RecognitionListener1.onStopped()
+    }
+
+    @Override
+    public void onError(Exception e)
+    {
+      junitListener.onException(e);
+    }
+  }
+
+  private class RecognitionListener1 extends AbstractRecognizerListener
+  {
+    @Override
+    public void onRecognitionFailure(FailureReason reason)
+    {
+      junitListener.onRecognitionFailure(reason);
+    }
+
+    @Override
+    public void onError(Exception e)
+    {
+      junitListener.onException(e);
+    }
+
+    @Override
+    public void onRecognitionSuccess(RecognitionResult result)
+    {
+      if( result instanceof NBestRecognitionResult )
+      {
+          Entry entry = ((NBestRecognitionResult)result).getEntry(0);
+          if (entry != null)
+            System.out.println("Meaning1=" + entry.getSemanticMeaning());
+          else
+            System.out.println("Meaning1=null");
+      }
+    }
+
+    @Override
+    public void onStopped()
+    {
+      System.out.println("RecognizerListener1.onStopped()");
+      grammar.dispose();
+
+      EmbeddedRecognizer recognizer = EmbeddedRecognizer.getInstance();
+      recognizer.setListener(new RecognizerListener2());
+      grammar =
+        (SrecGrammar) recognizer.createGrammar(populatedGrammar, new GrammarListener2());
+      System.out.println("Load the second grammar (pre-populated slot)");
+      grammar.load();
+      // Next event should be GrammarListener2.onLoaded()
+    }
+  }
+
+/**
+   * Now try recognizing against a grammar with pre-populated slots.
+   */
+  private class GrammarListener2 extends AbstractEmbeddedGrammarListener
+  {
+    @Override
+    public void onLoaded()
+    {
+      System.out.println("Grammar loaded");
+      String audioPath = ESRSDK + "/config/en.us/audio/v139/v139_113.nwv";
+      int headerLength = 1024;
+      MediaFileReader mediaFileReader =
+        MediaFileReader.create(audioPath, new ReaderListener());
+
+      System.out.println("Recognizing against the pre-populated grammar");
+      AudioStream audio = mediaFileReader.createAudio();
+      logRecognizerAudio(mediaFileReader, QSDK + "/EmbeddedRecognizerTest2.raw");
+      mediaFileReader.start();
+      EmbeddedRecognizer.getInstance().recognize(audio, grammar);
+      // Next event should be RecognitionListener2.onStopped()
+    }
+
+    @Override
+    public void onError(Exception e)
+    {
+      junitListener.onException(e);
+    }
+  }
+
+  private class RecognizerListener2 extends AbstractRecognizerListener
+  {
+    @Override
+    public void onRecognitionFailure(FailureReason reason)
+    {
+      junitListener.onRecognitionFailure(reason);
+    }
+
+    @Override
+    public void onError(Exception e)
+    {
+      junitListener.onException(e);
+    }
+
+    @Override
+    public void onRecognitionSuccess(RecognitionResult result)
+    {
+      if( result instanceof NBestRecognitionResult ) {
+          Entry entry = ((NBestRecognitionResult)result).getEntry(0);
+          if (entry != null)
+          {
+            System.out.println("Meaning=" + entry.getSemanticMeaning());
+            System.out.println("Literal=" + entry.getLiteralMeaning());
+            System.out.println("Score=" + entry.getConfidenceScore());
+            Enumeration keys = entry.keys();
+            while( keys.hasMoreElements())
+            {
+                String key = (String)keys.nextElement();
+                String value = entry.get(key);
+                System.out.println("\tkey=" + key + " value=" + value);
+            }
+          }
+          else
+            System.out.println("Meaning2=null");
+      }
+      testFinished = true;
+    }
+
+    @Override
+    public void onStopped()
+    {
+      grammar.dispose();
+      junitListener.afterTest();
+
+      synchronized (waitForTestToFinish)
+      {
+        //tell the main thread that it can now exit. we are done running that test.
+        waitForTestToFinish.notify();
+      }
+    }
+  }
+
+  private void logRecognizerAudio(AudioSource audioSource, String path)
+  {
+    AudioStream recognizerAudio = audioSource.createAudio();
+    MediaFileWriter mediaFileWriter =
+      MediaFileWriter.create(new WriterListener());
+    mediaFileWriter.save(recognizerAudio, path);
+  }
+
+  private class ReaderListener implements MediaFileReaderListener
+  {
+    public void onError(Exception e)
+    {
+      junitListener.onException(e);
+    }
+
+    public void onStarted()
+    {
+    }
+
+    public void onStopped()
+    {
+    }
+  }
+
+  private class WriterListener implements MediaFileWriterListener
+  {
+    public void onError(Exception e)
+    {
+      junitListener.onException(e);
+    }
+
+    public void onStopped()
+    {
+    }
+  }
+}
diff --git a/java/android/android/speech/recognition/test/EmptyJUnitListener.java b/java/android/android/speech/recognition/test/EmptyJUnitListener.java
new file mode 100644
index 0000000..62228b9
--- /dev/null
+++ b/java/android/android/speech/recognition/test/EmptyJUnitListener.java
@@ -0,0 +1,43 @@
+/*---------------------------------------------------------------------------*
+ *  EmptyJUnitListener.java                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+package android.speech.recognition.test;
+
+import android.speech.recognition.RecognizerListener.FailureReason;
+
+/**
+ * A JUnitListener whose methods are empty. This class exists as convenience
+ * for creating listener objects.
+ */
+public class EmptyJUnitListener implements JUnitListener
+{
+  public void afterTest()
+  {
+  }
+
+  public void onException(Exception e)
+  {
+    e.printStackTrace();
+  }
+
+  public void onRecognitionFailure(FailureReason reason)
+  {
+    System.err.println("onRecognitionFailure=" + reason.toString());
+  }
+}
diff --git a/java/android/android/speech/recognition/test/JUnitListener.java b/java/android/android/speech/recognition/test/JUnitListener.java
new file mode 100644
index 0000000..c2f8481
--- /dev/null
+++ b/java/android/android/speech/recognition/test/JUnitListener.java
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*
+ *  JUnitListener.java                                                       *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+package android.speech.recognition.test;
+
+import android.speech.recognition.RecognizerListener.FailureReason;
+
+/**
+ * Listens for JUnit events.
+ */
+public interface JUnitListener
+{
+  /**
+   * Invoked after a test completes.
+   */
+  void afterTest();
+
+  /**
+   * Invoked when the test encounters an exception.
+   *
+   * @param e the exception
+   */
+  void onException(Exception e);
+
+  /**
+   * Invoked when the test encounters an expected recognition error.
+   *
+   * @param reason the error
+   */
+  void onRecognitionFailure(FailureReason reason);
+}
diff --git a/java/android/android/speech/recognition/test/contacts/CLRecognizer.java b/java/android/android/speech/recognition/test/contacts/CLRecognizer.java
new file mode 100644
index 0000000..77d90b9
--- /dev/null
+++ b/java/android/android/speech/recognition/test/contacts/CLRecognizer.java
@@ -0,0 +1,426 @@
+/*---------------------------------------------------------------------------*
+ *  CLRecognizer.java                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.contacts;
+
+//package com.android.speechtest;
+
+import android.speech.recognition.AbstractEmbeddedGrammarListener;
+import android.speech.recognition.AbstractRecognizerListener;
+import android.speech.recognition.AudioSource;
+import android.speech.recognition.AudioStream;
+import android.speech.recognition.Codec;
+import android.speech.recognition.EmbeddedRecognizer;
+import android.speech.recognition.Grammar;
+import android.speech.recognition.GrammarListener;
+import android.speech.recognition.MediaFileReader;
+import android.speech.recognition.MediaFileReaderListener;
+import android.speech.recognition.MediaFileWriter;
+import android.speech.recognition.MediaFileWriterListener;
+import android.speech.recognition.Microphone;
+import android.speech.recognition.MicrophoneListener;
+import android.speech.recognition.NBestRecognitionResult;
+import android.speech.recognition.RecognitionResult;
+import android.speech.recognition.RecognizerListener;
+import android.speech.recognition.SrecGrammar;
+import android.speech.recognition.WordItem;
+import java.util.Hashtable;
+
+//import android.util.Log;
+//CL stands for Contact List
+public class CLRecognizer extends AbstractRecognizerListener implements ICLRecognizer
+{
+  private static final String QSDK = (System.getenv("QSDK") != null) ? System.getenv("QSDK") : "/system/usr/srec";
+  private EmbeddedRecognizer recognizer;
+  //a single SrecGrammar
+  private SrecGrammar grammar;
+  private java.lang.String[] dynamicItems;
+  private ICLGrammarAction grammarAction;
+  private ICLRecognitionAction recognitionAction;
+  //recognition results
+  private String[] recognitionResults;
+  private String recognitionFailureReason;
+  private Exception recognitionException;
+  private boolean recognitionCancelled = false;
+  private AudioSourceListener audioSourceListener;
+  private AudioStream audioStream;
+  private AudioSource audioSource;
+  private MediaFileWriter mediaFileWriter;
+  private AudioStream audioToSave;
+  private boolean isMicrophone;
+  
+  public CLRecognizer()
+  {
+    //interesting stuff is done in allocate()
+    recognizer = null;
+    isMicrophone = false;
+  }
+
+  //synchronous
+  public void allocate(java.lang.String config) throws Exception
+  {
+    logDebug("before EmbeddedRecognizer.getInstance()");
+
+    recognizer = EmbeddedRecognizer.getInstance();
+
+    logDebug("after EmbeddedRecognizer.getInstance(): "  +
+      recognizer.getClass().getName() + " "  + recognizer.toString());
+
+
+    logDebug("before EmbeddedRecognizer.configure("  + config + ")");
+    try
+    {
+      recognizer.configure(config);
+    }
+    catch (Exception e)
+    {
+      logDebug("exception from EmbeddedRecognizer.configure()");
+      throw e;
+    }
+    logDebug("after EmbeddedRecognizer.configure()");
+  }
+
+  //asynchronous call
+  public void createGrammar(java.lang.String grammarURI,
+    java.lang.String[] dynamicItems, ICLGrammarAction grammarAction) throws Exception
+  {
+
+    logDebug("before recognizer.createGrammar("  + grammarURI + ")");
+
+    this.dynamicItems = dynamicItems;
+    this.grammarAction = grammarAction;
+    grammar =
+      (SrecGrammar) recognizer.createGrammar(grammarURI, 
+					   new CLGrammarListener());
+    logDebug("after recognizer.createGrammar("  + grammarURI + ")");
+
+
+    logDebug("before grammar.load()");
+    grammar.load();
+    logDebug("after grammar.load()");
+  }
+
+  //asynchronous call
+  public void recognize(ICLRecognitionAction action, java.lang.String audioFile)
+    throws Exception
+  {
+    logDebug("+recognize()");
+
+    //XXX if action is null throw our own exception
+    //save for future use
+    recognitionAction = action;
+
+    //clear results from previous recognition
+    recognitionResults = null;
+    recognitionFailureReason = null;
+    recognitionException = null;
+
+    //cleanup other objects from previous recognition
+    //just in case they remebered some state and we would need to get out of here
+    //on exception
+    audioSourceListener = null;
+    audioSource = null;
+    audioStream = null;
+
+    audioSourceListener = new AudioSourceListener();
+
+    if (audioFile != null)
+    {
+      audioSource =
+        MediaFileReader.create(audioFile, audioSourceListener);
+
+      //make MediaFileReader file look more like microphone
+      //((MediaFileReader) audioSource).setMode(MediaFileReader.Mode.REAL_TIME);
+      isMicrophone = false;
+    }
+    else
+    {
+      //use Microphone
+      audioSource = Microphone.getInstance();
+      ((Microphone) audioSource).setListener(audioSourceListener);
+      ((Microphone) audioSource).setCodec(Codec.PCM_16BIT_11K);
+      isMicrophone = true;
+    }
+
+
+    //create AudioStream to recognize from
+    audioStream = audioSource.createAudio();
+    //create AudioStream to save the audio
+    audioToSave = audioSource.createAudio();
+
+    //start capturing audio
+    audioSource.start();
+    
+    recognizer.setListener(this);
+
+    recognizer.recognize(audioStream, grammar);
+
+    logDebug("-recognize()");
+  }
+
+  //
+  public void cancel() throws Exception
+  {
+  }
+
+  //
+  public void deallocate() throws Exception
+  {
+  }
+
+  private class writerListener implements MediaFileWriterListener
+  {
+    public void onError(Exception e)
+    {
+       CLRecognizer.logDebug("writerListener: onError(): "  + e.toString());
+    }
+
+    public void onStopped()
+    {
+      System.out.println("writerListener: onStopped()");
+      recognitionAction.onFileWritten();
+    }
+  }
+  
+  private class AudioSourceListener implements MediaFileReaderListener,
+    MicrophoneListener
+  {
+    public AudioSourceListener()
+    {
+    }
+    public void onError(Exception e)
+    {
+      CLRecognizer.logDebug("AudioSource: onError(): "  + e.toString());
+      //XXX do something smart here
+    }
+
+    public void onStarted()
+    {
+      CLRecognizer.logDebug("AudioSource: onStarted()");
+    }
+
+    public void onStopped()
+    {
+      CLRecognizer.logDebug("AudioSource: onStopped()");
+      recognitionAction.onAudioSourceStopped();
+    }
+  }
+
+  private class CLGrammarListener extends AbstractEmbeddedGrammarListener
+    implements GrammarListener
+  {
+    @Override
+    public void onCompileAllSlots()
+    {
+      logDebug("onCompileAllSlots");
+      CLRecognizer.this.grammarAction.onGrammarSuccess(CLRecognizer.this);
+    }
+
+    @Override
+    public void onError(Exception e)
+    {
+      logDebug("GrammarListener:onError: "  + e.toString());
+      CLRecognizer.this.grammarAction.onGrammarError(CLRecognizer.this, e);
+    }
+
+    @Override
+    public void onLoaded()
+    {
+      try
+      {
+        logDebug("onLoaded");
+        //add words here
+        logDebug("Adding words to grammar slot");
+        if (CLRecognizer.this.dynamicItems != null)
+        {
+          for (int i = 0; i < CLRecognizer.this.dynamicItems.length; i++)
+          {
+            logDebug("item "  + i + ": "  + CLRecognizer.this.dynamicItems[i]);
+            String slotName = "@Names";
+            WordItem word =
+              WordItem.valueOf(CLRecognizer.this.dynamicItems[i], (String) null);
+            int weight = 1;
+            String semanticValue =
+              "V='"  + CLRecognizer.this.dynamicItems[i] + "'";
+            grammar.addItem(slotName, word, weight, semanticValue);
+          }
+        }
+
+        grammar.compileAllSlots();
+      }
+      catch (Exception e)
+      {
+        //this error is asynchronous to the user
+        CLRecognizer.this.grammarAction.onGrammarError(CLRecognizer.this, e);
+      }
+    }
+
+    @Override
+    public void onResetAllSlots()
+    {
+      logDebug("onResetAllSlots");
+    }
+
+    @Override
+    public void onSaved(String path)
+    {
+      logDebug("onSaved");
+    }
+
+    @Override
+    public void onUnloaded()
+    {
+      logDebug("onUnloaded");
+    }
+  }
+
+  //RecognizerListener interface
+  //
+  @Override
+  public void onBeginningOfSpeech()
+  {
+    logDebug("onBeginningOfSpeech");
+  }
+
+  @Override
+  public void onEndOfSpeech()
+  {
+    logDebug("onEndOfSpeech");
+  }
+
+  @Override
+  public void onRecognitionFailure(RecognizerListener.FailureReason reason)
+  {
+    logDebug("onExpectedError");
+    //save the result for future use
+    recognitionFailureReason = new String(reason.toString());
+  }
+
+  @Override
+  public void onRecognitionSuccess(RecognitionResult result)
+  {
+        if( result instanceof NBestRecognitionResult )
+        {
+            int numResults = ((NBestRecognitionResult)result).getSize();
+            logDebug("onRecognitionResult: "  + numResults);
+
+            recognitionResults = new String[numResults];
+            for (int i = 0; i < numResults; i++)
+            {
+              NBestRecognitionResult.Entry entry = ((NBestRecognitionResult)result).getEntry(i);
+              if (entry!=null)
+              {
+                    String txt = "result "  + (i + 1);
+                    if (entry.getSemanticMeaning()!=null)
+                    {
+                        String semanticMeaning = entry.getSemanticMeaning();
+                        recognitionResults[i] = new String(semanticMeaning);
+                        txt = txt + " semantic: "+ entry.getSemanticMeaning();
+                    }
+                    if (entry.getLiteralMeaning()!=null)
+                        txt = txt + " literal:"+entry.getLiteralMeaning();
+                    txt = txt + " score:"+entry.getConfidenceScore();
+                    logDebug(txt);
+                    txt = null;
+              }
+              else 
+                  recognitionResults[i] = "";
+            }
+        }
+  }
+
+  @Override
+  public void onStarted()
+  {
+    logDebug("onStarted");
+  }
+
+  @Override
+  public void onStartOfSpeechTimeout()
+  {
+    logDebug("onStartOfSpeechTimeout");
+  }
+
+  @Override
+  public void onStopped()
+  {
+    logDebug("+onStopped()");
+   
+    //cleanup AudioSource/AudioStream
+    if (audioSource != null) {
+        audioSource.stop();
+    }
+
+     // Display results
+     // call only one of ICLRecognitionAction methods to mark the end of recognition
+        if (recognitionException != null)
+        {
+          recognitionAction.onRecognitionError(this, recognitionException);
+        }
+        else if (recognitionCancelled == true)
+        {
+          recognitionAction.onRecognitionCancelled(this);
+        }
+        else if (recognitionFailureReason != null)
+        {
+          recognitionAction.onRecognitionFailure(this, recognitionFailureReason);
+          return;
+        }
+        else if (recognitionResults != null)
+        {
+          recognitionAction.onRecognitionSuccess(this, recognitionResults);
+        }
+        else
+        {
+          //we should not be able to get here
+          //
+          recognitionException =
+            new Exception("recognition stopped for unknown reason");
+          recognitionAction.onRecognitionError(this, recognitionException);
+        }
+    
+     // Save sound file
+    String savePath = QSDK+ "/contactsTestUsedSound.raw";
+    mediaFileWriter = MediaFileWriter.create(new writerListener());
+    mediaFileWriter.save(audioToSave, savePath);
+    
+    logDebug("-onStopped()");
+  }
+
+  @Override
+  public void onError(java.lang.Exception e)
+  {
+    logDebug("+onError");
+    recognitionException = e;
+    //cleanup AudioSource/AudioStream
+    if (audioSource != null) {
+        audioSource.stop();
+    }
+    recognitionAction.onRecognitionError(this, recognitionException);
+
+    logDebug("-onUnexpectedError");
+  }
+
+  static void logDebug(String msg)
+  {
+    System.out.println(CLRecognizer.class.getName() + ":"  + msg);
+    //Log.d(CLRecognizer.class.getName(), msg);
+  }
+}
diff --git a/java/android/android/speech/recognition/test/contacts/ICLGrammarAction.java b/java/android/android/speech/recognition/test/contacts/ICLGrammarAction.java
new file mode 100644
index 0000000..073f2ae
--- /dev/null
+++ b/java/android/android/speech/recognition/test/contacts/ICLGrammarAction.java
@@ -0,0 +1,31 @@
+/*---------------------------------------------------------------------------*
+ *  ICLGrammarAction.java                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.contacts;
+//package com.android.speechtest;
+
+public interface ICLGrammarAction {
+  
+    //error (exception)
+    public void onGrammarError(ICLRecognizer r, Exception e);
+
+    //success 
+    public void onGrammarSuccess(ICLRecognizer r);
+}
diff --git a/java/android/android/speech/recognition/test/contacts/ICLRecognitionAction.java b/java/android/android/speech/recognition/test/contacts/ICLRecognitionAction.java
new file mode 100644
index 0000000..d98ac8d
--- /dev/null
+++ b/java/android/android/speech/recognition/test/contacts/ICLRecognitionAction.java
@@ -0,0 +1,40 @@
+/*---------------------------------------------------------------------------*
+ *  ICLRecognitionAction.java                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.contacts;
+//package com.android.speechtest;
+
+public interface ICLRecognitionAction {
+  
+    //error (exception)
+    public void onRecognitionError(ICLRecognizer r, Exception e);
+
+    //failure - did not recognize anything
+    public void onRecognitionFailure(ICLRecognizer r, java.lang.String reason);
+    
+    //success - have the list 
+    public void onRecognitionSuccess(ICLRecognizer r, java.lang.String[] results);
+
+    //cancelled by user
+    public void onRecognitionCancelled(ICLRecognizer r);
+    
+    public void onFileWritten();
+    public void onAudioSourceStopped();
+}
diff --git a/java/android/android/speech/recognition/test/contacts/ICLRecognizer.java b/java/android/android/speech/recognition/test/contacts/ICLRecognizer.java
new file mode 100644
index 0000000..2f73905
--- /dev/null
+++ b/java/android/android/speech/recognition/test/contacts/ICLRecognizer.java
@@ -0,0 +1,42 @@
+/*---------------------------------------------------------------------------*
+ *  ICLRecognizer.java                                                       *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+package android.speech.recognition.test.contacts;
+
+//package com.android.speechtest;
+public interface ICLRecognizer
+{
+  //
+  public void allocate(java.lang.String config) throws Exception;
+
+  //asynchronous call
+  public void createGrammar(java.lang.String grammarURI,
+    java.lang.String[] dynamicItems, ICLGrammarAction grammarAction) throws Exception;
+
+  //asynchronous call
+  //if audioFile provided - use it, otherwise use Microphone
+  public void recognize(ICLRecognitionAction action, java.lang.String audioFile)
+    throws Exception;
+
+  //
+  public void cancel() throws Exception;
+
+  //
+  public void deallocate() throws Exception;
+}
diff --git a/java/android/android/speech/recognition/test/contacts/Main.java b/java/android/android/speech/recognition/test/contacts/Main.java
new file mode 100644
index 0000000..3b37053
--- /dev/null
+++ b/java/android/android/speech/recognition/test/contacts/Main.java
@@ -0,0 +1,205 @@
+/*---------------------------------------------------------------------------*
+ *  Main.java                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.contacts;
+
+//package com.android.speechtest;
+//import android.util.Log;
+
+
+/**
+ * Tests the embedded recognizer functionality.
+ */
+public class Main implements ICLGrammarAction, ICLRecognitionAction
+{
+  private static final String ESRSDK = (System.getenv("ESRSDK") != null) ? System.getenv("ESRSDK") : "/system/usr/srec";
+  CLRecognizer recognizer = null;
+  boolean bRecognitionEnded = false;
+
+  
+  private Object waitForTestToFinish;
+  private boolean testFinished = false;
+  
+  
+  public static void main(String[] args) throws Exception
+  {
+    System.out.println("SpeechTest3Console");
+
+    new Main();
+  }
+  //ICLGRammarAction interface
+
+  //error (exception)
+  public void onGrammarError(ICLRecognizer r, Exception e)
+  {
+    System.out.println("ICLGrammarAction:onGrammarError: "  + e.toString());
+    onRecognitionEnded();
+  }
+
+  //success
+  public void onGrammarSuccess(ICLRecognizer r)
+  {
+    System.out.println("GrammarAction:onGrammarSuccess");
+
+    //kick off the recognition
+    String audioPath = ESRSDK + "/config/en.us/audio/v139/v139_113.nwv";
+
+    System.out.println("Recognizing against the first grammar (dynamic "  +
+      "add-word)");
+
+    try
+    {
+      r.recognize(this, audioPath);
+    }
+    catch (Exception e)
+    {
+      System.out.println("Exception from ICLRecognizer.recognize(): "  +
+        e.toString());
+      onRecognitionEnded();
+    }
+  }
+
+  //error (exception)
+  public void onRecognitionError(ICLRecognizer r, Exception e)
+  {
+    System.out.println("Recognition Result: ERROR: "  + e.toString());
+    onRecognitionEnded();
+  }
+
+  //failure - did not recognize anything
+  public void onRecognitionFailure(ICLRecognizer r, String reason)
+  {
+    System.out.println("Recognition Result: FAILURE: "  + reason);
+
+    onRecognitionEnded();
+  }
+
+  //success - have NBest list
+  public void onRecognitionSuccess(ICLRecognizer r, String[] result)
+  {
+
+    int numResults = result.length;
+
+    System.out.println("Recognition Result: SUCCESS");
+
+    System.out.println("num results: "  + numResults);
+
+
+    for (int i = 0; i < numResults; i++)
+    {
+      System.out.println("result "  + (i + 1) + ":" + result[i]);
+    }
+   
+    
+    onRecognitionEnded();
+  }
+
+  public void onFileWritten()
+  {
+    testFinished = true;
+    synchronized (waitForTestToFinish)
+    {
+        //tell the main thread that it can now exit. we are done running that test.
+        waitForTestToFinish.notify();
+    }   
+  }
+  
+    public void onAudioSourceStopped()
+    {
+      System.out.println("Audio source stopped");
+    }
+    
+  //cancelled by user
+  public void onRecognitionCancelled(ICLRecognizer r)
+  {
+    System.out.println("Recognition Result: CANCELLED");
+
+    onRecognitionEnded();
+  }
+
+  public void onRecognitionEnded()
+  {
+
+    //synchronized (this) {
+    //    System.out.println("onRecognitionEnded()");
+    //    bRecognitionEnded = true;
+    //    notifyAll();
+    //}
+  }
+
+  public Main() throws Exception
+  {
+    waitForTestToFinish = new Object();
+    
+    System.out.println("Initialising...");
+
+    try
+    {
+      recognizer = new CLRecognizer();
+    }
+    catch (Exception e)
+    {
+      System.out.println("Exception from ICLRecognizer(): "  + e.toString());
+      System.exit(1);
+    }
+
+
+    try
+    {
+      String path = ESRSDK + "/config/en.us/baseline11k.par";
+      recognizer.allocate(path);
+    }
+    catch (Exception e)
+    {
+      System.out.println("Exception from ICLRecognizer.allocate(): "  +
+        e.toString());
+      System.exit(1);
+    }
+
+
+    try
+    {
+      String path = ESRSDK + "/config/en.us/grammars/dynamic-test.g2g";
+
+      String[] names = new String[3];
+      names[0] = "Andy Wyatt";
+      names[1] = "Dennis Velasco";
+      names[2] = "Jen Parker";
+
+      recognizer.createGrammar(path, names, this);
+    }
+    catch (Exception e)
+    {
+      System.out.println("Exception from ICLRecognizer.createGrammar(): "  +
+        e.toString());
+    }
+
+    synchronized (waitForTestToFinish)
+    {
+        waitForTestToFinish.wait(10000);  
+        if(testFinished)
+            System.out.println("----- PASS -----");
+        else
+            System.out.println("----- FAIL -----");
+    }
+    //TODO remove this once android fixed the shutdownHook for our automatic System.dispose
+    android.speech.recognition.impl.System.getInstance().dispose();
+  }
+}
diff --git a/java/android/android/speech/recognition/test/contacts/notes.txt b/java/android/android/speech/recognition/test/contacts/notes.txt
new file mode 100644
index 0000000..38bae07
--- /dev/null
+++ b/java/android/android/speech/recognition/test/contacts/notes.txt
@@ -0,0 +1,32 @@
+
+1. passing bad path to EmbeddedRecognizer.configure() does not raise an exception.
+Instead I get 
+peechTest3Console
+Initialising...
+uapi.test.RecognizerHandler:before EmbeddedRecognizer.getInstance()
+uapi.test.RecognizerHandler:after EmbeddedRecognizer.getInstance()
+uapi.test.RecognizerHandler:before EmbeddedRecognizer.configure(/sdcard/test/config/en.us/baseline11k.par)
+Exception in thread "Thread-0" java.lang.OutOfMemoryError: Could not allocate memory to perform the operation (OUT_OF_MEMORY)
+        at uapi.impl.EmbeddedRecognizerImpl.configureProxy(Native Method)
+        at uapi.impl.EmbeddedRecognizerImpl.configure(EmbeddedRecognizerImpl.java:70)
+        at uapi.test.RecognizerHandler.<init>(RecognizerHandler.java:187)
+        at uapi.test.Main$SetupRecognizer.run(Main.java:56)
+        at java.lang.Thread.run(Thread.java:595)
+#
+# An unexpected error has been detected by HotSpot Virtual Machine:
+#
+#  SIGSEGV (0xb) at pc=0xb7f6e3d5, pid=4308, tid=3085137600
+#
+# Java VM: Java HotSpot(TM) Client VM (1.5.0_11-b03 mixed mode, sharing)
+# Problematic frame:
+# C  [libpthread.so.0+0x43d5]
+#
+# An error report file with more information is saved as hs_err_pid4308.log
+#
+# If you would like to submit a bug report, please visit:
+#   http://java.sun.com/webapps/bugreport/crash.jsp
+#
+
+
+
+
diff --git a/java/android/android/speech/recognition/test/parameters/Parameters.java b/java/android/android/speech/recognition/test/parameters/Parameters.java
new file mode 100644
index 0000000..8ddb331
--- /dev/null
+++ b/java/android/android/speech/recognition/test/parameters/Parameters.java
@@ -0,0 +1,177 @@
+/*---------------------------------------------------------------------------*
+ *  Parameters.java                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.parameters;
+
+import android.speech.recognition.AbstractRecognizerListener;
+import android.speech.recognition.EmbeddedRecognizer;
+import java.util.Hashtable;
+import java.util.Vector;
+import java.util.Enumeration;
+
+/**
+ */
+public class Parameters   extends AbstractRecognizerListener {
+
+    private static final String ESRSDK = (System.getenv("ESRSDK") != null) ? System.getenv("ESRSDK") : "/system/usr/srec";
+    private static final String QSDK = (System.getenv("QSDK") != null) ? System.getenv("QSDK") : "/system/usr/srec";
+    private EmbeddedRecognizer recognizer;
+
+
+    public static void main(String[] args) throws Exception
+    {
+      System.out.println("Robustness1: ESRSDK = " + ESRSDK);
+
+      new Parameters();
+    }
+
+    public void allocate(java.lang.String config) throws Exception
+    {
+      System.out.println("before EmbeddedRecognizer.getInstance()");
+
+      recognizer = EmbeddedRecognizer.getInstance();
+
+      System.out.println("after EmbeddedRecognizer.getInstance(): "  +
+        recognizer.getClass().getName() + " "  + recognizer.toString());
+
+      System.out.println("before EmbeddedRecognizer.configure("  + config + ")");
+      try
+      {
+        recognizer.configure(config);
+      }
+      catch (Exception e)
+      {
+        System.out.println("exception from EmbeddedRecognizer.configure()");
+        throw e;
+      }
+      System.out.println("after EmbeddedRecognizer.configure()");
+
+      System.out.println("before EmbeddedRecognizer.setlistener()");
+      recognizer.setListener(this);
+      System.out.println("after EmbeddedRecognizer.setlistener()");
+    }
+
+    @Override
+    public void onParametersGetError(Vector<String> parameters, Exception e)
+    {
+      System.out.println("onParametersGetError!\n "+e.toString());
+    }
+
+    @Override
+    public void onParametersSetError(Hashtable<String, String> parameters,
+    Exception e)
+    {
+      System.out.println("onParametersSetError!\n "+e.toString());
+    }
+
+    @Override
+    public void onParametersGet(Hashtable<String, String> parameters)
+    {
+      System.out.println("onParametersGet: ");
+      Enumeration e = parameters.keys();
+      String key = null;
+      String value = null;
+      while(e.hasMoreElements()) {
+        key = (String) e.nextElement();
+        value = parameters.get(key);
+        System.out.println(key+" = "+value);
+      }
+      key = null;
+      value = null;
+    }
+
+    @Override
+    public void onParametersSet(Hashtable<String, String> parameters)
+    {
+      System.out.println("onParametersSet: ");
+      Enumeration e = parameters.keys();
+      String key = null;
+      String value = null;
+      while(e.hasMoreElements()) {
+        key = (String) e.nextElement();
+        value = parameters.get(key);
+        System.out.println(key+" = "+value);
+      }
+      key = null;
+      value = null;
+    }
+
+    public Parameters() throws Exception
+    {
+      System.out.println("Initialising...");
+
+      try {
+        String path = ESRSDK + "/config/en.us/baseline11k.par";
+        allocate(path);
+      } catch (Exception e) {
+        System.out.println("Exception from ICLRecognizer.allocate(): " + e.toString());
+        System.exit(1);
+      }
+
+      // Wait for callback to display parameters
+      try {Thread.currentThread().sleep(1500);} catch(InterruptedException e){}
+
+      System.out.println("Retrieving parameter values...");
+      // Create list of parameters to retrieve
+      Vector<String> lstGetParams = new Vector<String>();
+      lstGetParams.add("SREC.Recognizer.utterance_timeout");
+      lstGetParams.add("CREC.Recognizer.terminal_timeout");
+      lstGetParams.add("CREC.Recognizer.optional_terminal_timeout");
+      lstGetParams.add("CREC.Recognizer.non_terminal_timeout");
+      lstGetParams.add("CREC.Recognizer.eou_threshold");
+      lstGetParams.add("CREC.Frontend.samplerate");
+      // Retrieve actual params. Result will be display inside the callback
+      // function (CLRecognizer.java)
+      recognizer.getParameters(lstGetParams);
+
+      // Wait for callback to display parameters
+      try {Thread.currentThread().sleep(1500);} catch(InterruptedException e){}
+
+      System.out.println("Setting new parameter values...");
+      // Change the parameters
+      Hashtable<String,String> lstSetParams = new Hashtable<String,String>();
+      lstSetParams.put("SREC.Recognizer.utterance_timeout","100");
+      lstSetParams.put("CREC.Recognizer.terminal_timeout","200");
+      lstSetParams.put("CREC.Recognizer.optional_terminal_timeout","300");
+      lstSetParams.put("CREC.Recognizer.non_terminal_timeout","400");
+      lstSetParams.put("CREC.Recognizer.eou_threshold","500");
+      lstSetParams.put("CREC.Frontend.samplerate","8000"); // Change sample rate to 8K
+      //lstSetParams.put("CREC.Frontend.samplerate","11025"); // Change sample rate to 11K
+      
+      recognizer.setParameters(lstSetParams);
+
+      // Wait for callback to display parameters
+      try {Thread.currentThread().sleep(1500);} catch(InterruptedException e){}
+
+      // Retrieve new params.
+      // Result will be display inside the callback
+      // function (CLRecognizer.java)
+      System.out.println("Getting new parameter values...");
+      recognizer.getParameters(lstGetParams);
+
+      // Wait for callback to display parameters
+      try {Thread.currentThread().sleep(1500);} catch(InterruptedException e){}
+
+      lstGetParams.clear();
+      lstGetParams= null;
+      lstSetParams.clear();
+      lstSetParams = null;
+    }
+}
diff --git a/java/android/android/speech/recognition/test/robustness1/Robustness1.java b/java/android/android/speech/recognition/test/robustness1/Robustness1.java
new file mode 100644
index 0000000..8e4460c
--- /dev/null
+++ b/java/android/android/speech/recognition/test/robustness1/Robustness1.java
@@ -0,0 +1,194 @@
+/*---------------------------------------------------------------------------*
+ *  Robustness1.java                                                         *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.robustness1;
+
+import android.speech.recognition.test.contacts.CLRecognizer;
+import android.speech.recognition.test.contacts.ICLRecognizer;
+import android.speech.recognition.test.contacts.ICLGrammarAction;
+import android.speech.recognition.test.contacts.ICLRecognitionAction;
+
+import java.util.Hashtable;
+
+import android.speech.recognition.AbstractGrammarListener;
+import android.speech.recognition.AbstractRecognizerListener;
+import android.speech.recognition.AudioStream;
+import android.speech.recognition.Codec;
+import android.speech.recognition.EmbeddedRecognizer;
+import android.speech.recognition.Grammar;
+import android.speech.recognition.GrammarListener;
+import android.speech.recognition.MediaFileReader;
+import android.speech.recognition.MediaFileReaderListener;
+import android.speech.recognition.RecognizerListener.FailureReason;
+import android.speech.recognition.SrecGrammar;
+import android.speech.recognition.WordItem;
+import android.speech.recognition.RecognizerListener;
+import android.speech.recognition.NBestRecognitionResult;
+
+/**
+ * Tests the embedded recognizer functionality.
+ */
+
+public class Robustness1 implements ICLGrammarAction, ICLRecognitionAction
+{
+    private static final String ESRSDK = (System.getenv("ESRSDK") != null) ? System.getenv("ESRSDK") : "/system/usr/srec";
+    CLRecognizer recognizer = null;
+    boolean bRecognitionEnded = false;
+
+    //iteration Number
+    int iN = 0;
+
+    public static void main(String[] args) throws Exception
+    {
+      System.out.println("Robustness1: ESRSDK = " + ESRSDK);
+
+      new Robustness1();
+    }
+
+
+    public void startNextRecognition()
+    {
+      String audioPath = ESRSDK + "/config/en.us/audio/v139/v139_113.nwv";
+      iN = iN + 1;
+
+      System.out.println("Iteration: " + iN);
+      System.out.println("Recognizing with: " + audioPath);
+
+      try {
+        // Recognize from file
+        recognizer.recognize(this, audioPath);
+      } catch (Exception e) {
+        System.out.println("Exception from CLRecognizer.recognize(): " + e.toString());
+        System.exit(1);
+      }
+    }
+
+    //ICLGRammarAction interface
+
+    //error (exception)
+    public void onGrammarError(ICLRecognizer r, Exception e)
+    {
+      System.out.println("ICLGrammarAction:onGrammarError: " + e.toString());
+      System.exit(1);
+    }
+
+    //success
+    public void onGrammarSuccess(ICLRecognizer r)
+    {
+      System.out.println("GrammarAction:onGrammarSuccess");
+
+      startNextRecognition();
+    }
+
+
+    //error (exception)
+    public void onRecognitionError(ICLRecognizer r, Exception e)
+    {
+      System.out.println("Recognition Result: ERROR: " + e.toString());
+      System.exit(1);
+    }
+
+    //failure - did not recognize anything
+    public void onRecognitionFailure(ICLRecognizer r, String reason)
+    {
+      System.out.println("Recognition Result: FAILURE: " + reason);
+      startNextRecognition();
+    }
+
+
+    //success - have NBest list
+    public void onRecognitionSuccess(ICLRecognizer r, String[] result)
+    {
+      int numResults = result.length;
+
+      System.out.println("Recognition Result: SUCCESS");
+      System.out.println("num results: " + numResults);
+
+      for (int i = 0; i < numResults; i++) {
+        System.out.println("result " + (i + 1) + ":" + result[i]);
+      }
+      
+    }
+
+    public void onFileWritten()
+    {
+      System.out.println("File was saved");
+      startNextRecognition();
+    }
+  
+    public void onAudioSourceStopped()
+    {
+      System.out.println("Audio source stopped");
+    }
+      
+
+    //cancelled by user
+    public void onRecognitionCancelled(ICLRecognizer r)
+    {
+      System.out.println("Recognition Result: CANCELLED");
+    }
+
+
+    public Robustness1() throws Exception
+    {
+      System.out.println("Initialising...");
+
+      try {
+        recognizer = new CLRecognizer();
+      } catch (Exception e) {
+        System.out.println("Exception from ICLRecognizer(): " + e.toString());
+        System.exit(1);
+      }
+
+      try {
+        String path = ESRSDK + "/config/en.us/baseline11k.par";
+        recognizer.allocate(path);
+      } catch (Exception e) {
+        System.out.println("Exception from ICLRecognizer.allocate(): " + e.toString());
+        System.exit(1);
+      }
+
+      try {
+        String path = ESRSDK + "/config/en.us/grammars/dynamic-test.g2g";
+
+        String[] names = new String[3];
+        names[0] = "Andy Wyatt";
+        names[1] = "Dennis Velasco";
+        names[2] = "Jen Parker";
+
+        recognizer.createGrammar(path, names, this);
+      } catch (Exception e) {
+        System.out.println("Exception from ICLRecognizer.createGrammar(): " + e.toString());
+      }
+
+      while(true)
+      {
+        try {
+          Thread.sleep(100);
+        }
+        catch(InterruptedException e)
+        {
+          System.out.println("Exception from Thread.sleep: " + e.toString());
+          throw e;
+        }
+      }
+    }
+}
+
diff --git a/java/android/android/speech/recognition/test/robustness1/Robustness2.java b/java/android/android/speech/recognition/test/robustness1/Robustness2.java
new file mode 100644
index 0000000..da5052f
--- /dev/null
+++ b/java/android/android/speech/recognition/test/robustness1/Robustness2.java
@@ -0,0 +1,220 @@
+/*---------------------------------------------------------------------------*
+ *  Robustness2.java                                                         *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.robustness1;
+
+import android.speech.recognition.test.contacts.CLRecognizer;
+import android.speech.recognition.test.contacts.ICLRecognizer;
+import android.speech.recognition.test.contacts.ICLGrammarAction;
+import android.speech.recognition.test.contacts.ICLRecognitionAction;
+
+import java.util.Hashtable;
+
+import android.speech.recognition.AbstractGrammarListener;
+import android.speech.recognition.AbstractRecognizerListener;
+import android.speech.recognition.AudioStream;
+import android.speech.recognition.Codec;
+import android.speech.recognition.EmbeddedRecognizer;
+import android.speech.recognition.Grammar;
+import android.speech.recognition.GrammarListener;
+import android.speech.recognition.MediaFileReader;
+import android.speech.recognition.MediaFileReaderListener;
+import android.speech.recognition.RecognizerListener.FailureReason;
+import android.speech.recognition.SrecGrammar;
+import android.speech.recognition.WordItem;
+import android.speech.recognition.RecognizerListener;
+import android.speech.recognition.NBestRecognitionResult;
+
+/**
+ * Tests the embedded recognizer functionality.
+ */
+
+public class Robustness2 implements ICLGrammarAction, ICLRecognitionAction
+{
+    private static final String ESRSDK = (System.getenv("ESRSDK") != null) ? System.getenv("ESRSDK") : "/system/usr/srec";
+    CLRecognizer recognizer = null;
+    boolean bRecognitionEnded = false;
+    private String[] names;
+
+    private Object waitForTestToFinish;
+    private boolean testFinished = false;
+
+    //iteration Number
+    int iN = 0;
+
+    public static void main(String[] args) throws Exception
+    {
+      System.out.println("Robustness2: ESRSDK = " + ESRSDK);
+
+      new Robustness2();
+    }
+
+
+    public void startNextRecognition()
+    {
+      if (iN==50)
+      {
+        synchronized (waitForTestToFinish)
+        {
+            testFinished = true;
+            //tell the main thread that it can now exit. we are done running that test.
+            waitForTestToFinish.notify();
+        }
+        return;
+      }
+
+      System.out.println("");
+      System.out.println("-----------------------------------");
+      System.out.println("Iteration: " + iN);
+      System.out.println("Recording from microphone...");
+      System.out.println("SAY: LOOKUP " + names[iN%3]);
+      System.out.println("");
+      System.out.println("-----------------------------------");
+      iN++;
+
+      try {
+        // Recognize using microphone
+        recognizer.recognize(this, null);
+      } catch (Exception e) {
+        System.out.println("Exception from CLRecognizer.recognize(): " + e.toString());
+        System.exit(1);
+      }
+    }
+
+    //ICLGRammarAction interface
+
+    //error (exception)
+    public void onGrammarError(ICLRecognizer r, Exception e)
+    {
+      System.out.println("ICLGrammarAction:onGrammarError: " + e.toString());
+      System.exit(1);
+    }
+
+    //success
+    public void onGrammarSuccess(ICLRecognizer r)
+    {
+      System.out.println("GrammarAction:onGrammarSuccess");
+
+      startNextRecognition();
+    }
+
+
+    //error (exception)
+    public void onRecognitionError(ICLRecognizer r, Exception e)
+    {
+      System.out.println("Recognition Result: ERROR: " + e.toString());
+      System.exit(1);
+    }
+
+    //failure - did not recognize anything
+    public void onRecognitionFailure(ICLRecognizer r, String reason)
+    {
+      System.out.println("Recognition Result: FAILURE: " + reason);
+    }
+
+
+    //success - have NBest list
+    public void onRecognitionSuccess(ICLRecognizer r, String[] result)
+    {
+      int numResults = result.length;
+
+      System.out.println("Recognition Result: SUCCESS");
+      System.out.println("num results: " + numResults);
+
+      for (int i = 0; i < numResults; i++) {
+        System.out.println("result " + (i + 1) + ":" + result[i]);
+      }
+    }
+
+     public void onFileWritten()
+    {
+      System.out.println("File was saved");
+    }
+  
+    public void onAudioSourceStopped()
+    {
+      System.out.println("Audio source stopped");
+      try {
+        System.out.println("Sleep 1800 ms (workaround for Sooner audio driver bug)");
+        Thread.sleep(1800);  // workaround for bug in closing + restarting Android Sooner audio driver.
+        System.out.println("Woke up");
+      } catch (Exception e) {
+        System.out.println("Exception from Thread.sleep(): " + e.toString());
+      }
+      startNextRecognition();
+    }
+      
+    //cancelled by user
+    public void onRecognitionCancelled(ICLRecognizer r)
+    {
+      System.out.println("Recognition Result: CANCELLED");
+
+      startNextRecognition();
+    }
+
+
+    public Robustness2() throws Exception
+    {
+      waitForTestToFinish = new Object();
+      System.out.println("Initialising...");
+
+      try {
+        recognizer = new CLRecognizer();
+      } catch (Exception e) {
+        System.out.println("Exception from ICLRecognizer(): " + e.toString());
+        System.exit(1);
+      }
+
+      try {
+        String path = ESRSDK + "/config/en.us/baseline11k.par";
+        recognizer.allocate(path);
+      } catch (Exception e) {
+        System.out.println("Exception from ICLRecognizer.allocate(): " + e.toString());
+        System.exit(1);
+      }
+
+      try {
+        String path = ESRSDK + "/config/en.us/grammars/dynamic-test.g2g";
+
+        names = new String[3];
+        names[0] = "Andy Wyatt";
+        names[1] = "Dennis Velasco";
+        names[2] = "Jen Parker";
+
+        recognizer.createGrammar(path, names, this);
+      } catch (Exception e) {
+        System.out.println("Exception from ICLRecognizer.createGrammar(): " + e.toString());
+      }
+
+      //wait for the test to finish before we return.
+      //we have to make sure the Java thread stays alive.
+      synchronized (waitForTestToFinish)
+      {
+        waitForTestToFinish.wait();
+        if(testFinished)
+          System.out.println("----- PASS -----");
+        else
+          System.out.println("----- FAIL -----");
+      }
+      //TODO remove this once android fixed the shutdownHook for our automatic System.dispose
+      android.speech.recognition.impl.System.getInstance().dispose();
+    }
+}
+
diff --git a/java/android/android/speech/recognition/test/robustness1/Robustness3.java b/java/android/android/speech/recognition/test/robustness1/Robustness3.java
new file mode 100644
index 0000000..1429856
--- /dev/null
+++ b/java/android/android/speech/recognition/test/robustness1/Robustness3.java
@@ -0,0 +1,993 @@
+/*---------------------------------------------------------------------------*
+ *  Robustness3.java                                                         *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.robustness1;
+
+import android.speech.recognition.AbstractSrecGrammarListener;
+import android.speech.recognition.AbstractRecognizerListener;
+import android.speech.recognition.AudioStream;
+import android.speech.recognition.Codec;
+import android.speech.recognition.EmbeddedRecognizer;
+import android.speech.recognition.RecognitionResult;
+import android.speech.recognition.SrecGrammarListener;
+import android.speech.recognition.Grammar;
+import android.speech.recognition.GrammarListener;
+import android.speech.recognition.MediaFileReader;
+import android.speech.recognition.MediaFileReaderListener;
+import android.speech.recognition.MediaFileWriter;
+import android.speech.recognition.MediaFileWriterListener;
+import android.speech.recognition.Microphone;
+import android.speech.recognition.MicrophoneListener;
+import android.speech.recognition.NBestRecognitionResult;
+import android.speech.recognition.RecognizerListener;
+import android.speech.recognition.SrecGrammar;
+import android.speech.recognition.WordItem;
+import android.speech.recognition.Logger;
+import java.util.Hashtable;
+import java.util.Vector;
+import java.util.Enumeration;
+import java.io.File;
+/**
+ */
+public class Robustness3 extends AbstractRecognizerListener {
+
+    private static final String ESRSDK = (System.getenv("ESRSDK") != null) ? System.getenv("ESRSDK") : "/system/usr/srec";
+    private static final String QSDK = (System.getenv("QSDK") != null) ? System.getenv("QSDK") : "/system/usr/srec";
+    private static final int STATE_IDLE                           = 0;
+    private static final int STATE_CREATE_RECOGNIZER              = 1;
+    private static final int STATE_SHOW_ITERATION                 = 2;
+    private static final int STATE_CREATE_GRAMMAR1                = 3;
+    private static final int STATE_CREATE_GRAMMAR2                = 4;
+    private static final int STATE_LOAD_GRAMMAR1                  = 5;
+    private static final int STATE_LOADING_GRAMMAR1               = 6;
+    private static final int STATE_COMPILING_GRAMMAR1             = 7;
+    private static final int STATE_SAVE_GRAMMAR1                  = 8;
+    private static final int STATE_SAVING_GRAMMAR1                = 9;
+    private static final int STATE_UNLOAD_GRAMMAR1                = 10;
+    private static final int STATE_UNLOADING_GRAMMAR1             = 11;
+    private static final int STATE_CREATE_GRAMMAR3                = 12;
+    private static final int STATE_LOADING_GRAMMAR3               = 13;
+    private static final int STATE_RECOGNIZE_WITH_GRAMMAR3        = 14;
+    private static final int STATE_RECOGNIZING_WITH_GRAMMAR3      = 15;
+    private static final int STATE_SAVING_CONTATCS_TEST_SOUND     = 16;
+    private static final int STATE_UNLOAD_GRAMMAR3                = 17;
+    private static final int STATE_UNLOADING_GRAMMAR3             = 18;
+    private static final int STATE_LOAD_GRAMMAR2                  = 19;
+    private static final int STATE_LOADING_GRAMMAR2               = 20;
+    private static final int STATE_RECOGNIZE_WITH_GRAMMAR2        = 21;
+    private static final int STATE_RECOGNIZING_WITH_GRAMMAR2      = 22;
+    private static final int STATE_SAVING_ACTION_TEST_SOUND       = 23;
+    private static final int STATE_UNLOAD_GRAMMAR2                = 24;
+    private static final int STATE_UNLOADING_GRAMMAR2             = 25;
+    private static final int STATE_MICROPHONE                     = 26;
+    private static final int STATE_MICROPHONE_RECORDING           = 27;
+    private static final int STATE_RECORDING_STOP                 = 28;
+    private static final int STATE_STOPPING_MICROPHONE            = 29;
+    private static final int STATE_SAVING_RECORDED_AUDIO          = 30;
+    private static final int STATE_COMPARE_FILES                  = 31;
+    private static final int STATE_GET_PARAMS                     = 32;
+    private static final int STATE_GETTING_PARAMS                 = 33;
+    private static final int STATE_SET_PARAMS                     = 34;
+    private static final int STATE_SETTING_PARAMS                 = 35;
+    private static final int STATE_RESET_PARAMS                   = 36;
+    private static final int STATE_RESETTING_PARAMS               = 37;
+    private static final int STATE_RESET                          = 38;
+    private static final int STATE_QUIT                           = 39;
+    private static final int STATE_ERROR                          = 40;
+    private static final int STATE_ADD_SLOT_ITEM_LIST             = 41;
+    private static final int STATE_MICROPHONE_STARTING            = 42;
+    private static final int STATE_SAVE_RECORDED_AUDIO            = 43;
+
+    private String[] stateNames = { 
+    "IDLE",
+    "CREATE_RECOGNIZER",
+    "SHOW_ITERATION",
+    "CREATE_GRAMMAR1",
+    "CREATE_GRAMMAR2",
+    "LOAD_GRAMMAR1",
+    "LOADING_GRAMMAR1",
+    "COMPILING_GRAMMAR1",
+    "SAVE_GRAMMAR1",
+    "SAVING_GRAMMAR1",
+    "UNLOAD_GRAMMAR1",
+    "UNLOADING_GRAMMAR1",
+    "CREATE_GRAMMAR3",
+    "LOADING_GRAMMAR3",
+    "RECOGNIZE_WITH_GRAMMAR3",
+    "RECOGNIZING_WITH_GRAMMAR3",
+    "SAVING_CONTATCS_TEST_SOUND",
+    "UNLOAD_GRAMMAR3",
+    "UNLOADING_GRAMMAR3",
+    "LOAD_GRAMMAR2",
+    "LOADING_GRAMMAR2",
+    "RECOGNIZE_WITH_GRAMMAR2",
+    "RECOGNIZING_WITH_GRAMMAR2",
+    "SAVING_ACTION_TEST_SOUND",
+    "UNLOAD_GRAMMAR2",
+    "UNLOADING_GRAMMAR2",
+    "MICROPHONE",
+    "MICROPHONE_RECORDING",
+    "RECORDING_STOP",
+    "STOPPING_MICROPHONE",
+    "SAVING_RECORDED_AUDIO",
+    "COMPARE_FILES",
+    "GET_PARAMS",
+    "GETTING_PARAMS",
+    "SET_PARAMS",
+    "SETTING_PARAMS",
+    "RESET_PARAMS",
+    "RESETTING_PARAMS",
+    "RESET",
+    "QUIT",
+    "ERROR",
+    "ADD_SLOT_ITEM_LIST",
+    "STATE_MICROPHONE_STARTING",
+    "STATE_SAVE_RECORDED_AUDIO"
+    };
+  
+    private int iN = 0;
+    
+    private int m_State = STATE_IDLE;
+    
+    private int loadedGrammar = 0;
+    private Object mutex;
+    private EmbeddedRecognizer recognizer;  
+    private SrecGrammar grammar1;
+    private SrecGrammar grammar2;
+    private SrecGrammar grammar3;
+   
+    private String      recognitionFailureReason;
+    private Exception   recognitionException;
+    private boolean     recognitionCancelled = false;
+    private MFRListener audioSourceListener;
+    private AudioStream audioStream;
+    private AudioStream audioToSave;
+    private MediaFileReader mfr;
+    private MediaFileWriter mfw;
+    private Microphone mic;
+    private String[]    pathG;
+    private String[]    lstSoundsG;   
+    private String[]    recognitionResults;
+    private String[]    names;
+    private MICListener micListener;
+    private MFWListener mfwListener;
+  
+    public static void main(String[] args) throws Exception
+    {
+        System.out.println("Robustness3: ESRSDK = " + ESRSDK);
+        Logger.getInstance().info("Robustness3");
+        //android.speech.recognition.Logger.getInstance().setLoggingLevel(android.speech.recognition.Logger.LogLevel.LEVEL_TRACE);
+        new Robustness3();
+    }
+    
+    /*-------------------------------------------------------
+    * Robustness 3 Diagram Flow
+    * -------------------------------------------------------
+    * 1) Create recognizer
+    * 2) (start)Show Iteration - Create Grammar1
+    * 3) Create Grammar2
+    * 4) Load Grammar1 - add WordItems - Compile Grammar1
+    * 5) Save Grammar as Grammar3 - Unload Grammar 1
+    * 6) Load Grammar 3
+    * 7) MFR:Load sound (take one sound of a list A  ex. lstASound[i%3]).
+    * 8) Recognize with Grammar 3
+    * 9) MFW:Save sound used in recognition A
+    * 10)Unload Grammar 3
+    * 11)Load Grammar 2
+    * 12)MFR:Load sound (take one sound of a list B ex. lstBSound[i%3]).
+    * 13)Recognize with Grammar 2
+    * 14)MFW:Save sound used in recognition B
+    * 15)Unload Grammar 2
+    * 16)Create Microphone
+    * 17)Start Mic 
+    * 18)Record for 2 secs
+    * 19)Stop Mic
+    * 20)MFW:Save recorded sound
+    * 21)Compare size with a ref size (#seconds of (18))
+    * 22)Recognizer Get Params
+    * 23)Recognizer Set Params
+    * 24)Delete variables 
+    * 25)Goto (2)
+    * -------------------------------------------------------*/
+    public Robustness3() throws Exception
+    {
+        // Store two grammar paths
+        pathG = new String[2];
+        pathG[0] = ESRSDK + "/config/en.us/grammars/bothtags5.g2g"; 
+        pathG[1] = ESRSDK + "/config/en.us/grammars/bothtags5.g2g";
+
+        // Store six sounds files paths (3 for each grammar)
+        lstSoundsG = new String[6];
+        // Sounds for grammar 1
+        lstSoundsG[0] = ESRSDK + "/config/en.us/audio/v139/v139_113.nwv";
+        //phone delete jen parker
+        lstSoundsG[1] = ESRSDK + "/config/en.us/audio/v139/v139_103.nwv";
+        //phone delete john martinez
+        lstSoundsG[2] = ESRSDK + "/config/en.us/audio/v139/v139_254.nwv";
+        //andrew evans
+        
+        // Sounds for grammar 2
+        lstSoundsG[3]= ESRSDK + "/config/en.us/audio/m252/m252a11e.nwv";
+        //traffic information
+        lstSoundsG[4]= ESRSDK + "/config/en.us/audio/m252/m252a10e.nwv";
+        //changer
+        lstSoundsG[5]= ESRSDK + "/config/en.us/audio/m252/m252a12e.nwv";
+        //forward
+    
+        names = new String[3];
+        names[0] = "Jen Parker";
+        names[1] = "John Martinez";
+        names[2] = "Andrew Evans";
+        
+        // Create object that will be used to synch the states
+        mutex = new Object();
+       
+        // Change the state to create the recognizer
+        setState(STATE_CREATE_RECOGNIZER);
+        
+        // Main thread loop
+        while(true)
+        {
+            synchronized(mutex)
+            {
+                if ( m_State == STATE_QUIT) break; // Exit application
+                
+                switch (m_State)
+                {
+                    case STATE_ERROR:
+                        //Report Error
+                        logDebug("ERROR: Application stopped!");
+                        Logger.getInstance().error("ERROR: Fatal error has been reached\nApplication will stop");
+                        setStateLocked(STATE_QUIT);
+                        break;
+                    //For these state, we do nothing since we are waiting for
+                    //the event to trigger.
+                    case STATE_IDLE: 
+                    case STATE_LOADING_GRAMMAR1: 
+                    case STATE_COMPILING_GRAMMAR1: 
+                    case STATE_SAVING_GRAMMAR1:
+                    case STATE_UNLOADING_GRAMMAR1:
+                    case STATE_LOADING_GRAMMAR3:
+                    case STATE_RECOGNIZING_WITH_GRAMMAR3:
+                    case STATE_SAVING_CONTATCS_TEST_SOUND:
+                    case STATE_UNLOADING_GRAMMAR3:
+                    case STATE_LOADING_GRAMMAR2:
+                    case STATE_RECOGNIZING_WITH_GRAMMAR2:
+                    case STATE_SAVING_ACTION_TEST_SOUND:
+                    case STATE_UNLOADING_GRAMMAR2:
+                    case STATE_STOPPING_MICROPHONE:
+                    case STATE_SAVING_RECORDED_AUDIO:
+                    case STATE_GETTING_PARAMS:
+                    case STATE_SETTING_PARAMS:
+                    case STATE_RESETTING_PARAMS:
+                    case STATE_ADD_SLOT_ITEM_LIST:
+                    case STATE_MICROPHONE_STARTING:
+                        // Idle state
+                        try {
+                          //Thread.currentThread().sleep(5);
+                            mutex.wait();
+                        }
+                        catch(InterruptedException e)
+                        {
+                            System.out.println("Exception from Thread.sleep: " +
+                                           e.toString());
+                            throw e;
+                        }
+                        break;
+                    case STATE_CREATE_RECOGNIZER: 
+                        createRecognizer();
+                        createMicrophone();
+                        setStateLocked(STATE_SHOW_ITERATION);
+                        break;
+                        
+                    case STATE_SHOW_ITERATION:
+                        logDebug("---------------------------------------");
+                        logDebug("Iteration:"+iN);
+                        logDebug("---------------------------------------");                               
+                        setStateLocked(STATE_CREATE_GRAMMAR1);
+                        break;
+                    case STATE_CREATE_GRAMMAR1:
+                        grammar1 = createGrammar(pathG[0],new G1Listener());
+                        setStateLocked(STATE_CREATE_GRAMMAR2);
+                        break;
+                        
+                    case STATE_CREATE_GRAMMAR2:
+                        grammar2 = createGrammar(pathG[1], new G2Listener());
+                        setStateLocked(STATE_LOAD_GRAMMAR1);
+                        break;
+                    
+                    case STATE_LOAD_GRAMMAR1:
+                        setStateLocked(STATE_LOADING_GRAMMAR1);
+                        loadedGrammar = 1;
+                        grammar1.load(); //wait for G1Listener.onLoaded()
+                        break;
+                   
+                    case STATE_SAVE_GRAMMAR1:
+                        setStateLocked(STATE_SAVING_GRAMMAR1);
+                        grammar1.save(QSDK+"/grammar3.g2g"); //wait for G1Listener.onSaved()
+                        break;
+                        
+                    case STATE_UNLOAD_GRAMMAR1:
+                        setStateLocked(STATE_UNLOADING_GRAMMAR1);
+                        grammar1.unload();//wait for G1Listener.onUnloaded()
+                        break;
+                    
+                    case STATE_CREATE_GRAMMAR3:
+                        setStateLocked(STATE_LOADING_GRAMMAR3);
+                        grammar3 = createGrammar(QSDK+"/grammar3.g2g",new G2Listener());
+                        loadedGrammar = 3;
+                        grammar3.load();//wait for G2Listener.onLoaded()
+                        break;
+                        
+                    case STATE_RECOGNIZE_WITH_GRAMMAR3:
+                        setStateLocked(STATE_RECOGNIZING_WITH_GRAMMAR3);
+                        // Pass sound file and grammar use for
+                        // recognition
+                        recognize(lstSoundsG[iN%3],grammar3); //wait for RecognizerListener.onStopped()
+                        break;   
+
+                    case STATE_UNLOAD_GRAMMAR3:
+                        setStateLocked(STATE_UNLOADING_GRAMMAR3);
+                        grammar3.unload(); //wait for G2Listener.onUnloaded()
+                        break;
+                        
+                    case STATE_LOAD_GRAMMAR2:
+                        setStateLocked(STATE_LOADING_GRAMMAR2);
+                        loadedGrammar = 2;
+                        grammar2.load();//wait for G2Listener.onLoaded()
+                        break;     
+                   
+                    case STATE_RECOGNIZE_WITH_GRAMMAR2:
+                         setStateLocked(STATE_RECOGNIZING_WITH_GRAMMAR2);
+                        // Pass sound file and grammar use for
+                        // recognition
+                        recognize(lstSoundsG[3+(iN%3)],grammar2); //wait for RecognizerListener.onStopped()
+                        break;   
+                        
+                    case STATE_UNLOAD_GRAMMAR2:
+                        setStateLocked(STATE_UNLOADING_GRAMMAR2);
+                        grammar2.unload();//wait for G2Listener.onUnloaded()
+                        break;  
+
+                    case STATE_MICROPHONE:
+                        loadedGrammar = 0; // No grammar is loaded
+                        MicRecord();
+                        break;
+                        
+                    case STATE_MICROPHONE_RECORDING:
+                        //record for 2 seconds
+                        try {Thread.sleep(2000);}catch(InterruptedException e)
+                        {
+                            System.out.println("Exception from Thread.sleep: " +
+                                           e.toString());
+                            throw e;
+                        }
+                        // Lets stop the recording
+                        setStateLocked(STATE_RECORDING_STOP);
+                        break;
+
+                    case STATE_RECORDING_STOP:
+                        mic.stop();//wait for MICListener.onStopped();
+                        setStateLocked(STATE_STOPPING_MICROPHONE);  
+                        break;
+
+                    case STATE_SAVE_RECORDED_AUDIO:
+                        try {
+                          System.out.println("Sleep 1800 ms (workaround for Sooner audio driver bug)");
+                          Thread.sleep(1800);  // workaround for bug in closing + restarting Android Sooner audio driver.
+                          System.out.println("Woke up");
+                        } catch (Exception e) {
+                          System.out.println("Exception from Thread.sleep(): " + e.toString());
+                        }
+                        logDebug("MICListener: Saving record sound R3_microphoneTestSound.raw");
+                        String savePath = QSDK + "/R3_microphoneTestSound.raw";
+                        mfw.save(audioToSave, savePath); //wait for MFWListener.onStopped();
+                        setStateLocked(STATE_SAVING_RECORDED_AUDIO);
+                        break;
+                        
+                    case STATE_COMPARE_FILES:
+                        CompareMicFiles();
+                        setStateLocked(STATE_GET_PARAMS);
+                        break;
+                    case STATE_GET_PARAMS:
+                        setStateLocked(STATE_GETTING_PARAMS);
+                        getParams();
+                        break;
+                    
+                    case STATE_SET_PARAMS:
+                        setStateLocked(STATE_SETTING_PARAMS);                        
+                        setParams(false);
+                        break;
+                        
+                    case STATE_RESET_PARAMS:
+                        setStateLocked(STATE_RESETTING_PARAMS);  
+                        setParams(true);
+                        break;
+
+                    case STATE_RESET:
+                        // Increment iteration number
+                        iN = iN + 1;
+                        // Clean all variables
+                        Clean();
+                        // Start again
+                        setStateLocked(STATE_SHOW_ITERATION);
+                        break;
+                default:
+                        break;
+                }
+            }
+        }
+        //TODO remove this once android fixed the shutdownHook for our automatic System.dispose
+        android.speech.recognition.impl.System.getInstance().dispose();
+    }
+    public void setStateLocked(int newState)
+    {
+        logDebug(stateNames[m_State] + " --> " + stateNames[newState]);
+        m_State = newState;
+    }
+
+    public void setState(int newState)
+    {
+        synchronized(mutex)
+        {
+            logDebug(stateNames[m_State] + " --> " + stateNames[newState]);
+            m_State = newState;
+            mutex.notify();
+        }
+    }
+    
+    public int getState()
+    {
+        int result = 0;
+        synchronized(mutex)
+        {
+            result = m_State;
+        }
+        return result;
+    }
+    
+    public void createRecognizer() throws Exception
+    {
+        logDebug("before EmbeddedRecognizer.getInstance()");
+        recognizer = EmbeddedRecognizer.getInstance();
+        logDebug("after EmbeddedRecognizer.getInstance(): "  +
+        recognizer.getClass().getName() + " "  + recognizer.toString());
+        
+        // Initialize Recognizer with configuration 11K
+        String config = ESRSDK + "/config/en.us/baseline11k.par";
+        logDebug("before EmbeddedRecognizer.configure("  + config + ")");
+        try
+        {
+            recognizer.configure(config);
+        }
+        catch (Exception e)
+        {
+            logDebug("exception from EmbeddedRecognizer.configure()");
+            throw e;
+        }
+        logDebug("after EmbeddedRecognizer.configure()");
+        logDebug("before EmbeddedRecognizer.setlistener()");
+        try
+        {
+            recognizer.setListener(this);
+        }
+        catch (Exception e)
+        {
+            logDebug("exception from EmbeddedRecognizer.setListener()");
+            throw e;
+        }
+        logDebug("after EmbeddedRecognizer.setlistener()");
+    }
+      
+    public void createMicrophone()
+    {
+        micListener = new MICListener();
+        mic = Microphone.getInstance();
+        mic.setListener(micListener);
+        mic.setCodec(Codec.PCM_16BIT_11K);
+        
+        mfwListener = new MFWListener();
+        mfw = MediaFileWriter.create(mfwListener);
+        
+    }
+    
+    public SrecGrammar createGrammar(
+            java.lang.String grammarURI,
+            GrammarListener grammarListener) throws Exception
+    {
+        logDebug("before CreateGrammar("  + grammarURI + ")");
+        SrecGrammar _grammar =
+          (SrecGrammar) recognizer.createGrammar(grammarURI, grammarListener);
+        logDebug("after recognizer.createGrammar("  + grammarURI + ")");
+        return _grammar;
+    }
+
+    //asynchronous call
+    public void recognize(String audioFile, SrecGrammar _grammar)
+    throws Exception
+    {
+        logDebug("+recognize()");
+        logDebug(audioFile);
+        //clear results from previous recognition
+        recognitionResults = null;
+        recognitionFailureReason = null;
+        recognitionException = null;
+
+        //cleanup other objects from previous recognition
+        //just in case they remebered some state and we would need to get out of here
+        //on exception
+        audioSourceListener = null;
+        mfr = null;
+        //if (audioStream!=null) audioStream.dispose();
+        audioStream = null;
+        //if (audioToSave!=null) audioToSave.dispose();
+        audioToSave = null;
+        audioSourceListener = new MFRListener();
+
+        mfr = MediaFileReader.create(audioFile, audioSourceListener);
+
+        //make MediaFileReader file look more like microphone
+        mfr.setMode(MediaFileReader.Mode.REAL_TIME);
+
+        //create AudioStream 
+        audioStream = mfr.createAudio();
+        audioToSave = mfr.createAudio();
+        //start capturing audio
+        mfr.start();
+        // Start recognition
+        recognizer.recognize(audioStream, _grammar);
+        logDebug("-recognize()");
+    }
+    
+    public void Clean()
+    {
+        loadedGrammar = 0;
+        grammar1 = null;
+        grammar2 = null;
+        grammar3 = null;
+        recognitionFailureReason = null;
+        recognitionException = null;
+        recognitionCancelled = false;
+        audioSourceListener = null;
+        audioStream = null;
+        audioToSave = null;
+        mfr = null;
+      
+    }
+    
+    public void MicRecord()
+    {
+        // Clear audio source
+        //if (audioToSave != null) audioToSave.dispose();
+        audioToSave = null;
+        audioToSave = mic.createAudio();
+        logDebug("Start recording...");
+        mic.start();
+        setState(STATE_MICROPHONE_STARTING);
+    }
+    
+    public void CompareMicFiles()
+    {
+        logDebug("Compare MIC Files");
+        String path = QSDK + "/R3_microphoneTestSound.raw";
+        logDebug(path);
+        File file = new File(path);
+        boolean exists = file.exists();
+        if (exists) {
+            long length = file.length();
+            logDebug("Size:"+length);
+            if (length<40000 || length>45000)
+            {
+                logDebug("***** WARNING!!! File size not correct, maybe there is an error.");
+                //Logger.getInstance().error("***** WARNING!!! File size:"+ length +" not correct, maybe there is an error.");
+            }
+        } else {
+            logDebug("File or directory does not exist!");
+            Logger.getInstance().error("File or directory does not exist:"+QSDK + "/R3_microphoneTestSound.raw");
+        }
+    }
+    
+    public void getParams()
+    {
+        logDebug("Retrieving parameter values...");
+        // Create list of parameters to retrieve
+        Vector<String> lstGetParams = new Vector<String>();
+        lstGetParams.add("SREC.Recognizer.utterance_timeout");
+        lstGetParams.add("CREC.Recognizer.terminal_timeout");
+        lstGetParams.add("CREC.Recognizer.optional_terminal_timeout");
+        lstGetParams.add("CREC.Recognizer.non_terminal_timeout");
+        lstGetParams.add("CREC.Recognizer.eou_threshold");
+        // Retrieve actual params. Result will be display inside the callback
+        // function (CLRecognizer.java)
+        recognizer.getParameters(lstGetParams); //wait for RecognizerListener.onParametersGet()
+        lstGetParams.clear();
+        lstGetParams = null;
+    }
+    
+    public void setParams(boolean reset)
+    {
+        System.out.println("Setting new parameter values...");
+        // Change the parameters
+        Hashtable<String,String> lstSetParams = new Hashtable<String,String>();
+        lstSetParams.put("SREC.Recognizer.utterance_timeout",(reset)?"400":"100");
+        lstSetParams.put("CREC.Recognizer.terminal_timeout",(reset)?"30":"200");
+        lstSetParams.put("CREC.Recognizer.optional_terminal_timeout",(reset)?"45":"300");
+        lstSetParams.put("CREC.Recognizer.non_terminal_timeout",(reset)?"90":"400");
+        lstSetParams.put("CREC.Recognizer.eou_threshold",(reset)?"120":"500");
+        recognizer.setParameters(lstSetParams);//wait for RecognizerListener.onParametersSet()
+        lstSetParams.clear();
+        lstSetParams = null;
+    }
+    
+    public void logDebug(String msg)
+    {
+         System.out.println(msg);
+    }
+  
+    
+     /* -------------------------------------------------------
+     * Media File Writer Listener
+     * -------------------------------------------------------*/
+    private class MFWListener implements MediaFileWriterListener
+    {
+        public void onError(Exception e)
+        {
+           logDebug("MFWListener: onError(): "  + e.toString());
+           Logger.getInstance().error("MFWListener: onError(): "  + e.toString());
+           setState(STATE_ERROR);
+        }
+
+        public void onStopped()
+        {
+          logDebug("MFWListener: onStopped()");
+          if (loadedGrammar == 3)
+            setState(STATE_UNLOAD_GRAMMAR3);
+          else if (loadedGrammar == 2)
+            setState(STATE_UNLOAD_GRAMMAR2);
+          else
+            setState(STATE_COMPARE_FILES);   
+        }
+    }
+  
+    /* -------------------------------------------------------
+     * Media File Reader Listener 
+     * -------------------------------------------------------*/
+    private class MFRListener implements 
+            MediaFileReaderListener
+    {
+        public void onError(Exception e)
+        {
+          logDebug("MFRListener: onError(): "  + e.toString());
+          Logger.getInstance().error("MFRListener: onError(): "  + e.toString());
+          setState(STATE_ERROR);
+        }
+
+        public void onStarted()
+        {
+          logDebug("MFRListener: onStarted()");
+        }
+
+        public void onStopped()
+        {
+           logDebug("MFRListener: onStopped()");
+        }
+    }
+    
+     /* -------------------------------------------------------
+     * Microphone Listener 
+     * -------------------------------------------------------*/
+    public class MICListener implements MicrophoneListener
+    {
+     
+      public void onStarted()
+      {
+        logDebug("MICListener: onStarted()");
+        logDebug("Record for 2 secs.");
+        setState(STATE_MICROPHONE_RECORDING);
+      }
+
+      public void onStopped()
+      {
+        logDebug("MICListener: onStopped()");
+        setState(STATE_SAVE_RECORDED_AUDIO);
+      }
+
+      public void onError(Exception e)
+      {
+        logDebug("MICListener: onError(): "  + e.toString());
+        Logger.getInstance().error("MICListener: onError(): "  + e.toString());
+        setState(STATE_ERROR);
+      }
+    }
+    
+    /* -------------------------------------------------------
+     * Grammar 1  Listener 
+     * -------------------------------------------------------*/
+    private class G1Listener extends AbstractSrecGrammarListener
+        implements GrammarListener
+    {
+        @Override
+        public void onCompileAllSlots()
+        {
+            logDebug("G1Listener: onCompileAllSlots");
+            // Save the grammar 1 to file
+            setState(STATE_SAVE_GRAMMAR1);
+        }
+
+        @Override
+        public void onError(Exception e)
+        {
+            logDebug("G1Listener: onError: "  + e.toString());
+            Logger.getInstance().error("G1Listener: onError(): "  + e.toString());
+            setState(STATE_ERROR);
+        }
+
+        @Override
+        public void onLoaded()
+        {
+            try
+            {
+                logDebug("G1Listener: onLoaded");
+                //add words here
+                logDebug("G1Listener: Adding words to grammar slot");
+                
+                Vector<SrecGrammar.Item> WordItems = new Vector<SrecGrammar.Item>();
+                
+                String slotName = "@Names";
+                for (int i = 0; i < names.length; i++)
+                {
+                    logDebug("item "  + i + ": "  + names[i]);
+                    WordItem word =
+                      WordItem.valueOf(names[i], (String) null);
+                    int weight = 1;
+                    String semanticValue =
+                      "V='"  + names[i] + "'";
+                    SrecGrammar.Item item = new SrecGrammar.Item(word,weight,semanticValue);
+                    WordItems.add(item);
+                }
+		grammar1.addItemList(slotName, WordItems);
+                
+                WordItems.removeAllElements();
+                logDebug("G1Listener: Starting adding words to grammar slot");
+                setState(STATE_ADD_SLOT_ITEM_LIST);
+            }
+            catch (Exception e)
+            {
+                logDebug("G1Listener: onLoaded(): "  + e.toString());
+                Logger.getInstance().error("G1Listener: onLoaded(): "  + e.toString());
+                setState(STATE_ERROR);
+            }
+        }
+        @Override
+        public void onSaved(String path)
+        {
+            logDebug("G1Listener: onSaved");
+            // Unload Grammar 1
+            setState(STATE_UNLOAD_GRAMMAR1);
+        }
+
+        @Override
+        public void onUnloaded()
+        {
+            logDebug("G1Listener: onUnloaded");
+            // Create Grammar 3
+            setState(STATE_CREATE_GRAMMAR3);
+        }
+        
+        @Override
+        public void onAddItemList()
+        {
+            logDebug("G1Listener: onAddItemList");
+            logDebug("G1Listener: Finish adding words to grammar slot");
+            setState(STATE_COMPILING_GRAMMAR1);
+            grammar1.compileAllSlots();  //wait for G1Listener.onCompileAllSlots()
+     }
+    
+        @Override
+        public void onAddItemListFailure(int index, Exception e)
+        {
+            logDebug("G1Listener: onAddItemListFailure Item:"+index+ " E:"+e.toString());
+            setState(STATE_ERROR);
+        }
+    }
+    /* -------------------------------------------------------
+     * Grammar 2  Listener 
+     * -------------------------------------------------------*/
+    private class G2Listener extends AbstractSrecGrammarListener
+        implements GrammarListener
+    {
+        @Override
+        public void onError(Exception e)
+        {
+            logDebug("G2Listener: onError: "  + e.toString());
+            Logger.getInstance().error("G2Listener: onError(): "  + e.toString());
+            setState(STATE_ERROR);
+        }
+
+        @Override
+        public void onLoaded()
+        {
+             logDebug("G2Listener:  onLoaded");
+             if (loadedGrammar == 3)
+                setState(STATE_RECOGNIZE_WITH_GRAMMAR3);
+             else
+                setState(STATE_RECOGNIZE_WITH_GRAMMAR2);
+        }
+        @Override
+        public void onUnloaded()
+        {
+            logDebug("G2Listener:   onUnloaded");
+            if (loadedGrammar == 3)
+                setState(STATE_LOAD_GRAMMAR2);
+            else
+                setState(STATE_MICROPHONE);
+        }
+    }
+    
+    /* -------------------------------------------------------
+     * Recognizer Listener 
+     * -------------------------------------------------------*/
+    @Override
+    public void onParametersGetError(Vector<String> parameters, Exception e)
+    {
+      logDebug("onParametersGetError!\n "+e.toString()); 
+      Logger.getInstance().error("Recognition Listener: onParametersGetError(): "  + e.toString());
+      setState(STATE_ERROR);
+    }
+
+    @Override
+    public void onParametersSetError(Hashtable<String, String> parameters,
+    Exception e)
+    {
+       logDebug("onParametersSetError!\n "+e.toString()); 
+       Logger.getInstance().error("Recognition Listener: onParametersSetError(): "  + e.toString());
+       setState(STATE_ERROR);
+    }
+
+    @Override
+    public void onParametersGet(Hashtable<String, String> parameters)
+    {
+       logDebug("onParametersGet: "); 
+       Enumeration e = parameters.keys();
+       String key = null;
+       String value = null;
+       while(e.hasMoreElements()) {
+           key = (String) e.nextElement();
+           value = parameters.get(key);
+           logDebug(key+" = "+value);    
+       } 
+       key = null;
+       value = null;
+       
+       setState(STATE_SET_PARAMS);
+    }
+
+    @Override
+    public void onParametersSet(Hashtable<String, String> parameters)
+    {
+       logDebug("onParametersSet: "); 
+       Enumeration e = parameters.keys();
+       String key = null;
+       String value = null;
+       while(e.hasMoreElements()) {
+           key = (String) e.nextElement();
+           value = parameters.get(key);
+           logDebug(key+" = "+value);    
+       } 
+       key = null;
+       value = null;
+
+       if (getState()==STATE_SETTING_PARAMS) 
+         setState(STATE_RESET_PARAMS);
+       else
+         setState(STATE_RESET);
+    }
+
+    @Override
+    public void onBeginningOfSpeech()
+    {
+    logDebug("onBeginningOfSpeech");
+    }
+
+    @Override
+    public void onEndOfSpeech()
+    {
+    logDebug("onEndOfSpeech");
+    }
+
+    @Override
+    public void onRecognitionFailure(RecognizerListener.FailureReason reason)
+    {
+        logDebug("onExpectedError");
+        //save the result for future use
+        recognitionFailureReason = new String(reason.toString());
+        //Logger.getInstance().error("Recognition Failure: "  + recognitionFailureReason);
+    }
+
+    @Override
+    public void onRecognitionSuccess(RecognitionResult result)
+    {
+      if( result instanceof NBestRecognitionResult )
+      {
+        int numResults = ((NBestRecognitionResult)result).getSize();
+        logDebug("onRecognitionResult: "  + numResults);
+
+        NBestRecognitionResult.Entry entry;
+        recognitionResults = new String[numResults];
+
+        for (int i = 0; i < numResults; i++)
+        {
+          entry = ((NBestRecognitionResult)result).getEntry(i);
+          if (entry!=null)
+          {
+            recognitionResults[i] = new String((String) entry.getSemanticMeaning());
+            logDebug("result "  + (i + 1) + ":"  + entry.getLiteralMeaning() + ":"  +
+                entry.getSemanticMeaning() + ":" + entry.getConfidenceScore());
+          }
+          else
+          {
+            logDebug("Entry is null.");
+          }
+        }
+      }
+    }
+
+    @Override
+    public void onStarted()
+    {
+       logDebug("onStarted");
+    }
+
+    @Override
+    public void onStartOfSpeechTimeout()
+    {
+        logDebug("onStartOfSpeechTimeout");
+    }
+
+    @Override
+    public void onStopped()
+    {
+        logDebug("+onStopped()");
+        
+        String savePath = QSDK;
+        if (loadedGrammar == 3)
+        {
+            savePath = savePath + "/R3_contactsTestSound.raw";
+            setState(STATE_SAVING_CONTATCS_TEST_SOUND);
+        }
+        else
+        {
+            savePath = savePath + "/R3_actionTestSound.raw";
+            setState(STATE_SAVING_ACTION_TEST_SOUND);
+        }
+        logDebug("Saving..."+ savePath);
+        mfw.save(audioToSave, savePath); //wait for MFWListener.onStopped()
+        logDebug("-onStopped()");
+    }
+
+    @Override
+    public void onError(java.lang.Exception e)
+    {
+        logDebug("Recognition Listener onError:"+e.toString());
+        Logger.getInstance().error("Recognition Listener: onError(): "  + e.toString());
+        recognitionException = e;
+        setState(STATE_ERROR);
+    }
+}
diff --git a/java/android/android/speech/recognition/test/voicetags/Voicetags1.java b/java/android/android/speech/recognition/test/voicetags/Voicetags1.java
new file mode 100644
index 0000000..c5b8e3f
--- /dev/null
+++ b/java/android/android/speech/recognition/test/voicetags/Voicetags1.java
@@ -0,0 +1,951 @@
+/*---------------------------------------------------------------------------*
+ *  Voicetags1.java                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+package android.speech.recognition.test.voicetags;
+
+import android.speech.recognition.AbstractSrecGrammarListener;
+import android.speech.recognition.AbstractRecognizerListener;
+import android.speech.recognition.AudioStream;
+import android.speech.recognition.Codec;
+import android.speech.recognition.EmbeddedRecognizer;
+import android.speech.recognition.Grammar;
+import android.speech.recognition.RecognitionResult;
+import android.speech.recognition.SrecGrammarListener;
+import android.speech.recognition.GrammarListener;
+import android.speech.recognition.MediaFileReader;
+import android.speech.recognition.MediaFileReaderListener;
+import android.speech.recognition.MediaFileWriter;
+import android.speech.recognition.MediaFileWriterListener;
+import android.speech.recognition.Microphone;
+import android.speech.recognition.MicrophoneListener;
+import android.speech.recognition.NBestRecognitionResult;
+import android.speech.recognition.RecognizerListener;
+import android.speech.recognition.SrecGrammar;
+import android.speech.recognition.VoicetagItem;
+import android.speech.recognition.VoicetagItemListener;
+import android.speech.recognition.Logger;
+import java.util.Hashtable;
+import java.util.Vector;
+import java.util.Enumeration;
+import java.io.File;
+/**
+ */
+public class Voicetags1 extends AbstractRecognizerListener {
+
+    private static final String ESRSDK = (System.getenv("ESRSDK") != null) ? System.getenv("ESRSDK") : "/system/usr/srec";
+    private static final String QSDK = (System.getenv("QSDK") != null) ? System.getenv("QSDK") : "/system/usr/srec";
+    private static final int STATE_IDLE                           = 0;
+    private static final int STATE_CREATE_RECOGNIZER              = 1;
+    private static final int STATE_SET_PARAM_ON                   = 2;
+    private static final int STATE_SETTING_PARAM_ON               = 3;
+    private static final int STATE_CREATE_GRAMMAR1                = 4;
+    private static final int STATE_LOAD_GRAMMAR1                  = 5;
+    private static final int STATE_LOADING_GRAMMAR1               = 6;
+    private static final int STATE_COMPILING_GRAMMAR1             = 7;
+    private static final int STATE_MICROPHONE                     = 8;
+    private static final int STATE_MICROPHONE_START               = 9;
+    private static final int STATE_RECORD_RECOGNIZING             = 10;
+    private static final int STATE_SET_PARAM_OFF                  = 11;
+    private static final int STATE_SETTING_PARAM_OFF              = 12;
+    private static final int STATE_UNLOAD_GRAMMAR1                = 13;
+    private static final int STATE_UNLOADING_GRAMMAR1             = 14;
+    private static final int STATE_CREATE_GRAMMAR2                = 15;
+    private static final int STATE_LOAD_GRAMMAR2                  = 16;
+    private static final int STATE_LOADING_GRAMMAR2               = 17;
+    private static final int STATE_SHOW_ITERATION                 = 18;
+    private static final int STATE_RESET_ALL_SLOTS_GRAMMAR2       = 19;
+    private static final int STATE_RESETTING_SLOTS_GRAMMAR2       = 20;
+    private static final int STATE_LOAD_VOICETAG_IDX              = 21;
+    private static final int STATE_LOADING_VOICETAG_IDX           = 22;
+    private static final int STATE_ADD_VOICETAGITEM_GRAMMAR2      = 23;
+    private static final int STATE_ADDING_VOICETAGITEM            = 24;
+    private static final int STATE_COMPILE_GRAMMAR2               = 25;
+    private static final int STATE_COMPILING_GRAMMAR2             = 26;
+    private static final int STATE_RECOGNIZE_WITH_GRAMMAR2        = 27;
+    private static final int STATE_RECOGNIZING_WITH_GRAMMAR2      = 28;
+    private static final int STATE_RESET                          = 29;
+    private static final int STATE_QUIT                           = 30;
+    private static final int STATE_ERROR                          = 31;
+    private static final int STATE_RESET_ENROLLMENT               = 32;
+    private static final int STATE_WAIT_SAVED_VOICETAG            = 33;
+    private static final int STATE_SAVE_GRAMMAR2                  = 34;
+    private static final int STATE_SAVING_GRAMMAR2                = 35;
+    private static final int STATE_SAVE_AUDIOSOURCE               = 36;
+    private static final int STATE_SAVING_AUDIOSOURCE             = 37;
+ 
+    private String[] stateNames = { 
+    "STATE_IDLE",
+    "STATE_CREATE_RECOGNIZER",
+    "STATE_SET_PARAM_ON",
+    "STATE_SETTING_PARAM_ON",
+    "STATE_CREATE_GRAMMAR1",
+    "STATE_LOAD_GRAMMAR1",
+    "STATE_LOADING_GRAMMAR1",
+    "STATE_COMPILING_GRAMMAR1",
+    "STATE_MICROPHONE",
+    "STATE_MICROPHONE_START",
+    "STATE_RECORD_RECOGNIZING",
+    "STATE_SET_PARAM_OFF",
+    "STATE_SETTING_PARAM_OFF",
+    "STATE_UNLOAD_GRAMMAR1",
+    "STATE_UNLOADING_GRAMMAR1",
+    "STATE_CREATE_GRAMMAR2",
+    "STATE_LOAD_GRAMMAR2",
+    "STATE_LOADING_GRAMMAR2",
+    "STATE_SHOW_ITERATION",
+    "STATE_RESET_ALL_SLOTS_GRAMMAR2",
+    "STATE_RESETTING_SLOTS_GRAMMAR2",
+    "STATE_LOAD_VOICETAG_IDX",
+    "STATE_LOADING_VOICETAG_IDX",
+    "STATE_ADD_VOICETAGITEM_GRAMMAR2",
+    "STATE_ADDING_VOICETAGITEM",
+    "STATE_COMPILE_GRAMMAR2",
+    "STATE_COMPILING_GRAMMAR2",
+    "STATE_RECOGNIZE_WITH_GRAMMAR2",
+    "STATE_RECOGNIZING_WITH_GRAMMAR2",
+    "STATE_RESET",
+    "STATE_QUIT",
+    "STATE_ERROR",
+    "STATE_RESET_ENROLLMENT",
+    "STATE_WAIT_SAVED_VOICETAG",
+    "STATE_SAVE_GRAMMAR2",
+    "STATE_SAVING_GRAMMAR2",
+    "STATE_SAVE_AUDIOSOURCE",
+    "STATE_SAVING_AUDIOSOURCE"
+    };
+  
+    private int iN = 0;
+    private int itemIdx = 0;
+    private int m_State = STATE_IDLE;
+    private Object mutex;
+    private Object micMutex;
+    private boolean isRecording;
+    private EmbeddedRecognizer recognizer;  
+    private SrecGrammar grammar1;
+    private SrecGrammar grammar2;
+    private MFRListener audioSourceListener;
+    private MFWListener mfwListener;
+    private VTGListener voicetagListener;
+    private MICListener micListener;
+    private AudioStream audioStream;
+    private AudioStream audioToSave;
+    private MediaFileReader mfr;
+    private MediaFileWriter mfw;
+    private Microphone mic;
+    private String[]    pathG;
+    private String[]    names;
+    private String[]    semanticValues;
+    private VoicetagItem currentVoicetag;
+    private VoicetagItem[] voicetags;
+  
+    public static void main(String[] args) throws Exception
+    {
+        System.out.println("Voicetags1: ESRSDK = " + ESRSDK);
+        Logger.getInstance().info("Voicetags1");
+        new Voicetags1();
+    }
+    
+    /*-------------------------------------------------------
+    * Voicetags1 Diagram Flow
+    * -------------------------------------------------------
+    * 1) Create recognizer
+    * 2) Set recognizer parameter enableGetWaveform to true '1'
+    * 3) Create Enrollment Grammar1 - Load - CompileAllSlots
+    * 4) Create Microphone 
+    * 5) Start Mic 
+    * 6) Show name[itemIdx] to be enrolled, ask user to speak
+    * 7) Record until, recognition (success or fail)
+    * 8) Stop Mic, Create Voicetag
+    * 9) Save Voicetag to file
+    * 10) Goto (5) until all "itemIdx" enrollments are done.
+    * 11) Set recognizer parameter enableGetWaveform to false '0' 
+    * 12) Unload Grammar1
+    * 13) Create Grammar2 - load grammar2
+    * 14) Show iteration number
+    * 15) Grammar2.ResetAllSlots
+    * 16) Load Voicetag[itemIdx] - add VoicetagItem[itemIdx] - repeat until "itemIdx" are done.
+    * 17) Compile Grammar2
+    * 18) MFR:Load previously recorded Voicetag[itemIdx] sound.
+    * 19) Recognize with Grammar2
+    * 20) Goto  (18) until "itemIdx" are done.
+    * 21) Infinite Loop, Goto (15)
+    * -------------------------------------------------------*/
+    public Voicetags1() throws Exception
+    {
+       Logger.getInstance().setLoggingLevel(Logger.LogLevel.LEVEL_WARN);
+        // Store two grammar paths
+        pathG = new String[2];
+        // Enrollment Grammar
+        pathG[0] = ESRSDK + "/config/en.us/grammars/enroll.g2g";
+        // Grammar to be use to recognize
+        pathG[1] = ESRSDK + "/config/en.us/grammars/bothtags5.g2g";
+        
+        names = new String[3];
+        semanticValues = new String[3];
+        names[0] = "Jen Parker";           semanticValues[0]="(514)555-8666";
+        names[1] = "Pete Gonzalez";        semanticValues[1]="(613)555-5464";
+        names[2] = "Andrew Evans";         semanticValues[2]="(800)555-1234";
+        
+        // Create object that will be used to synch the states
+        mutex = new Object();
+        // Create mic mutex
+        micMutex = new Object();
+        isRecording = false;
+        // Change the state to create the recognizer
+        setState(STATE_CREATE_RECOGNIZER);
+        
+        // Main thread loop
+        while(true)
+        {
+            synchronized(mutex)
+            {
+                if ( m_State == STATE_QUIT) break; // Exit application
+                
+                switch (m_State)
+                {
+                    case STATE_ERROR:
+                        //Report Error
+                        logDebug("ERROR: Application stopped!");
+                        Logger.getInstance().error("ERROR: Fatal error has been reached\nApplication will stop");
+                        setStateLocked(STATE_QUIT);
+                        break;
+                    //For these state, we do nothing since we are waiting for
+                    //the event to trigger.
+                    case STATE_IDLE: 
+                    case STATE_LOADING_GRAMMAR1: 
+                    case STATE_COMPILING_GRAMMAR1: 
+                    case STATE_RECORD_RECOGNIZING:
+                    case STATE_RESETTING_SLOTS_GRAMMAR2:    
+                    case STATE_UNLOADING_GRAMMAR1:
+                    case STATE_LOADING_GRAMMAR2:
+                    case STATE_RECOGNIZING_WITH_GRAMMAR2:
+                    case STATE_LOADING_VOICETAG_IDX:
+                    case STATE_ADDING_VOICETAGITEM:
+                    case STATE_SETTING_PARAM_ON:
+                    case STATE_SETTING_PARAM_OFF:
+                    case STATE_COMPILING_GRAMMAR2:
+                    case STATE_WAIT_SAVED_VOICETAG:
+                    case STATE_SAVING_GRAMMAR2:
+                    case STATE_SAVING_AUDIOSOURCE:
+                        try {
+                          //Thread.currentThread().sleep(5);
+                          mutex.wait();
+                        }
+                        catch(InterruptedException e)
+                        {
+                          System.out.println("Exception from Thread.sleep: " + e.toString());
+                          throw e;
+                        }
+                        break;
+                        
+                    case STATE_CREATE_RECOGNIZER: 
+                        initApp();
+                        setStateLocked(STATE_SET_PARAM_ON);
+                        break;
+                        
+                    case STATE_SET_PARAM_ON:
+                        setStateLocked(STATE_SETTING_PARAM_ON);                        
+                        setParams(true);
+                        break;
+                        
+                    case STATE_CREATE_GRAMMAR1:
+                        grammar1 = createGrammar(pathG[0],new G1Listener());
+                        setStateLocked(STATE_LOAD_GRAMMAR1);
+                        break;
+                        
+                    case STATE_LOAD_GRAMMAR1:
+                        setStateLocked(STATE_LOADING_GRAMMAR1);
+                        grammar1.load(); //wait for G1Listener.onLoaded()
+                        break;
+                        
+                    case STATE_RESET_ENROLLMENT:
+                        synchronized(micMutex)
+                        {
+                           // Wait until record has been finished
+                           if (isRecording) break; 
+                        }
+                        // Continue with next enrollment
+                        audioStream = null;
+                        audioToSave = null;
+                        setStateLocked(STATE_MICROPHONE);
+                        break;
+                        
+                    case STATE_MICROPHONE:
+                        audioStream = mic.createAudio();
+                        audioToSave = mic.createAudio();
+                        setStateLocked(STATE_MICROPHONE_START);
+                        break;
+                        
+                    case STATE_MICROPHONE_START:
+                        startRecordRecognize();
+                        setStateLocked(STATE_RECORD_RECOGNIZING);
+                        break;
+                            
+                    case  STATE_SET_PARAM_OFF:
+                        setStateLocked(STATE_SETTING_PARAM_OFF);                        
+                        setParams(false);
+                        break;
+                       
+                    case STATE_UNLOAD_GRAMMAR1:
+                        mfwListener = null;
+                        mfw = null; // We don't need it anymore.
+                        setStateLocked(STATE_UNLOADING_GRAMMAR1);
+                        grammar1.unload();//wait for G1Listener.onUnloaded()
+                        break;
+                        
+                    case STATE_CREATE_GRAMMAR2:
+                        grammar2 = createGrammar(pathG[1],new G2Listener());
+                        setStateLocked(STATE_LOAD_GRAMMAR2);
+                        break;
+                     
+                    case STATE_LOAD_GRAMMAR2:
+                        setStateLocked(STATE_LOADING_GRAMMAR2);
+                        grammar2.load();//wait for G2Listener.onLoaded()
+                        break;        
+                        
+                    case STATE_SAVE_AUDIOSOURCE:
+                        break;
+                    
+                    case STATE_SHOW_ITERATION:
+                        iN++;
+                        logDebug("---------------------------------------");
+                        logDebug("Iteration:"+iN);
+                        logDebug("---------------------------------------");                               
+                        setStateLocked(STATE_RESET_ALL_SLOTS_GRAMMAR2);
+                        break;
+                  
+                    case STATE_RESET_ALL_SLOTS_GRAMMAR2:
+                        setStateLocked(STATE_RESETTING_SLOTS_GRAMMAR2);
+                        int sz = names.length;
+                        voicetags = new VoicetagItem[sz];
+                        itemIdx = 0;
+                        grammar2.resetAllSlots();
+                        break;
+                        
+                    case STATE_LOAD_VOICETAG_IDX:
+                        // Create the voicetag
+                        String loadPath = QSDK +"/"+ names[itemIdx] + ".vtg";
+                        logDebug("Load Path:" + loadPath);
+                        voicetags[itemIdx] = VoicetagItem.create(loadPath, voicetagListener);
+                        loadPath = null;
+                        // Load the voicetag
+                        voicetags[itemIdx].load();
+                        setStateLocked(STATE_LOADING_VOICETAG_IDX);
+                        break;
+                   
+                    case STATE_ADD_VOICETAGITEM_GRAMMAR2:
+                        Vector<SrecGrammar.Item> Items = new Vector<SrecGrammar.Item>();
+                        String slotName = "@Names";
+                        int weight = 1;
+                        for (int i = 0; i < names.length; i++)
+                        {
+                            logDebug("item "  + i + ": "  + names[i]);
+                            String semanticValue = "V='"  + semanticValues[i] + "'";
+                            SrecGrammar.Item item = new SrecGrammar.Item(voicetags[i],weight,semanticValue);
+                            Items.add(item);
+                        }
+                        grammar2.addItemList(slotName, Items); // wait for G2Listener.onAddItemList()
+                        Items.removeAllElements();
+                        Items = null;
+                        setStateLocked(STATE_ADDING_VOICETAGITEM);
+                        break;
+
+                    case STATE_COMPILE_GRAMMAR2:
+                        itemIdx = 0;
+                        grammar2.compileAllSlots();
+                        setStateLocked(STATE_COMPILING_GRAMMAR2);
+                        break;
+                        
+                    case STATE_SAVE_GRAMMAR2:
+                        String grammarPath = QSDK +"/grammarVoicetag.g2g";
+                        grammar2.save(grammarPath);
+                        setStateLocked(STATE_SAVING_GRAMMAR2);
+                        break;
+                    
+                    case STATE_RECOGNIZE_WITH_GRAMMAR2:
+                         String soundPath = QSDK +"/VTAudio"+ names[itemIdx++] + ".raw";
+                         setStateLocked(STATE_RECOGNIZING_WITH_GRAMMAR2);
+                        // Pass sound file used to create the voicetag
+                        // and grammar for recognition
+                        recognize(soundPath,grammar2); //wait for RecognizerListener.onStopped()
+                        break;   
+                        
+                    case STATE_RESET:
+                        // Increment iteration number
+                        iN = iN + 1;
+                        // Clean all variables
+                        Clean();
+                        // Start again
+                        setStateLocked(STATE_SHOW_ITERATION);
+                        break;
+                default:
+                        break;
+                }
+            }
+        }
+        //TODO remove this once android fixed the shutdownHook for our automatic System.dispose
+        android.speech.recognition.impl.System.getInstance().dispose();
+    }
+    public void setStateLocked(int newState)
+    {
+        logDebug(stateNames[m_State] + " --> " + stateNames[newState]);
+        m_State = newState;
+    }
+
+    public void setState(int newState)
+    {
+        synchronized(mutex)
+        {
+            logDebug(stateNames[m_State] + " --> " + stateNames[newState]);
+            m_State = newState;
+            mutex.notify();
+        }
+    }
+    
+    public void setMicState(boolean recording)
+    {
+        synchronized(micMutex)
+        {
+           isRecording = recording; 
+        }
+    }
+    public int getState()
+    {
+        int result = 0;
+        synchronized(mutex)
+        {
+            result = m_State;
+        }
+        return result;
+    }
+    
+    public void createRecognizer() throws Exception
+    {
+        logDebug("before EmbeddedRecognizer.getInstance()");
+        recognizer = EmbeddedRecognizer.getInstance();
+        logDebug("after  EmbeddedRecognizer.getInstance(): "  +
+        recognizer.getClass().getName() + " "  + recognizer.toString());
+        
+        // Initialize Recognizer with configuration 11K
+        String config = ESRSDK + "/config/en.us/baseline11k.par";
+        logDebug("before EmbeddedRecognizer.configure("  + config + ")");
+        try
+        {
+            recognizer.configure(config);
+        }
+        catch (Exception e)
+        {
+            logDebug("exception from EmbeddedRecognizer.configure()");
+            throw e;
+        }
+        logDebug("after EmbeddedRecognizer.configure()");
+        logDebug("before EmbeddedRecognizer.setlistener()");
+        try
+        {
+            recognizer.setListener(this);
+        }
+        catch (Exception e)
+        {
+            logDebug("exception from EmbeddedRecognizer.setListener()");
+            throw e;
+        }
+        logDebug("after EmbeddedRecognizer.setlistener()");
+    }
+
+    public void initApp() throws Exception
+    {
+        // Create recognizer
+        createRecognizer();
+        // Set Listeners
+        voicetagListener = new VTGListener();
+        micListener = new MICListener();
+        // Create mic                       
+        mic = Microphone.getInstance();
+        mic.setCodec(Codec.PCM_16BIT_11K);
+        mic.setListener(micListener);
+        
+        mfwListener = new MFWListener();
+        mfw = MediaFileWriter.create(mfwListener);
+    }
+     
+    public void setParams(boolean turnOn)
+    {
+        System.out.println("Setting parameter");
+        // Change the parameters
+        Hashtable<String,String> lstSetParams = new Hashtable<String,String>();
+        lstSetParams.put("enableGetWaveform",(turnOn)?"1":"0");
+        recognizer.setParameters(lstSetParams);
+        //wait for RecognizerListener.onParametersSet()
+        lstSetParams.clear();
+        lstSetParams = null;
+    }
+    
+    public SrecGrammar createGrammar(
+            java.lang.String grammarURI,
+            SrecGrammarListener grammarListener) throws Exception
+    {
+        logDebug("before CreateGrammar("  + grammarURI + ")");
+        SrecGrammar _grammar =
+          (SrecGrammar) recognizer.createGrammar(grammarURI, grammarListener);
+        logDebug("after recognizer.createGrammar("  + grammarURI + ")");
+        return _grammar;
+    }
+
+    public void startRecordRecognize()
+    {
+        mic.start();
+        logDebug("Start recording...");
+        // Start recognition
+        recognizer.recognize(audioStream, grammar1);
+        logDebug("recognize()");
+    }
+     
+    //asynchronous call
+    public void recognize(String audioFile, SrecGrammar _grammar)
+    throws Exception
+    {
+        logDebug("+recognize()");
+        logDebug(audioFile);
+        
+        //cleanup other objects from previous recognition
+        //just in case they remebered some state and we would need to get out of here
+        //on exception
+        audioSourceListener = null;
+        mfr = null;
+        audioStream = null;
+        audioSourceListener = new MFRListener();
+        mfr =MediaFileReader.create(audioFile, audioSourceListener);
+        //make MediaFileReader file look more like microphone
+        mfr.setMode(MediaFileReader.Mode.REAL_TIME);
+        //create AudioStream 
+        audioStream = mfr.createAudio();
+        //start capturing audio
+        mfr.start();
+        // Start recognition
+        recognizer.recognize(audioStream, _grammar);
+        logDebug("-recognize()");
+    }
+    
+    public void Clean()
+    {
+        grammar1 = null;
+        itemIdx = 0;
+        audioSourceListener = null;
+        audioStream = null;
+        audioToSave = null;
+        mfr = null;
+        currentVoicetag= null;
+        voicetags = null;
+    }
+    
+      
+    public void logDebug(String msg)
+    {
+         System.out.println(msg);
+    }
+  
+    /* -------------------------------------------------------
+     * Media File Reader Listener 
+     * -------------------------------------------------------*/
+    private class MFRListener implements 
+            MediaFileReaderListener
+    {
+        public void onError(Exception e)
+        {
+          logDebug("MFRListener: onError(): "  + e.toString());
+          Logger.getInstance().error("MFRListener: onError(): "  + e.toString());
+          setState(STATE_ERROR);
+        }
+
+        public void onStarted()
+        {
+          logDebug("MFRListener: onStarted()");
+        }
+
+        public void onStopped()
+        {
+           logDebug("MFRListener: onStopped()");
+        }
+    }
+    
+    /* -------------------------------------------------------
+     * Media File Writer Listener
+     * -------------------------------------------------------*/
+    private class MFWListener implements MediaFileWriterListener
+    {
+        public void onError(Exception e)
+        {
+           logDebug("MFWListener: onError(): "  + e.toString());
+           Logger.getInstance().error("MFWListener: onError(): "  + e.toString());
+           setState(STATE_ERROR);
+        }
+
+        public void onStopped()
+        {
+          logDebug("MFWListener: onStopped()");
+           
+        }
+    }
+  
+     /* -------------------------------------------------------
+     * Microphone Listener 
+     * -------------------------------------------------------*/
+    public class MICListener implements MicrophoneListener
+    {
+      public void onStarted()
+      {
+        setMicState(true);
+        logDebug("MICListener: onStarted()");
+        logDebug("----------------------------");
+        logDebug("        PLEASE SAY...");
+        logDebug(names[itemIdx]);
+        logDebug("----------------------------");
+      }
+
+      public void onStopped()
+      {
+        setMicState(false);
+        logDebug("MICListener: onStopped()");
+      }
+
+      public void onError(Exception e)
+      {
+        logDebug("MICListener: onError(): "  + e.toString());
+        Logger.getInstance().error("MICListener: onError(): "  + e.toString());
+        setState(STATE_ERROR);
+      }
+    }
+    
+    /* -------------------------------------------------------
+     * Voicetag Listener 
+     * -------------------------------------------------------*/
+    public class  VTGListener implements VoicetagItemListener
+    {
+        public void onSaved(String path)
+        {
+             logDebug("VTGListener: onSaved: "  + path);
+             currentVoicetag = null;
+             itemIdx++; //Next enrollment
+             if (itemIdx<names.length)
+                setState(STATE_RESET_ENROLLMENT); // goto create next voicetag
+             else
+             {
+                itemIdx = 0;                      // reset value
+                setState(STATE_SET_PARAM_OFF);    // disable recognize parameter
+             }
+        }
+
+        public void onLoaded()
+        {
+            logDebug("VTGListener: onLoaded");
+            itemIdx++; //Next 
+            if (itemIdx<names.length)
+               setState(STATE_LOAD_VOICETAG_IDX); // goto create load voicetag
+            else
+            {
+               itemIdx = 0;                      // reset value
+               setState(STATE_ADD_VOICETAGITEM_GRAMMAR2); 
+            }
+        }
+
+        public void onError(Exception e)
+        {
+            currentVoicetag = null;
+            logDebug("VTGListener: onError: "  + e.toString());
+            Logger.getInstance().error("VTGListener: onError(): "  + e.toString());
+            setState(STATE_ERROR); 
+        }
+    }
+   /* -------------------------------------------------------
+    * Grammar 1  Listener 
+    * -------------------------------------------------------*/
+    private class G1Listener extends AbstractSrecGrammarListener
+        implements GrammarListener
+    {
+        @Override
+        public void onError(Exception e)
+        {
+            logDebug("G1Listener: onError: "  + e.toString());
+            Logger.getInstance().error("G1Listener: onError(): "  + e.toString());
+            setState(STATE_ERROR);
+        }
+        
+        @Override
+        public void onCompileAllSlots()
+        {
+            logDebug("G1Listener: onCompileAllSlots");
+            // Goto create microphone
+            setState(STATE_MICROPHONE);
+        }
+        
+        @Override
+        public void onLoaded()
+        {
+             logDebug("G1Listener:  onLoaded");
+             grammar1.compileAllSlots();  //wait for G1Listener.onCompileAllSlots()
+             setState(STATE_COMPILING_GRAMMAR1);
+        }
+        @Override
+        public void onUnloaded()
+        {
+            logDebug("G1Listener:   onUnloaded");
+            setState(STATE_CREATE_GRAMMAR2);
+        }
+    }
+    
+    /* -------------------------------------------------------
+     * Grammar 2 Listener 
+     * -------------------------------------------------------*/
+    private class G2Listener extends AbstractSrecGrammarListener
+        implements GrammarListener
+    {
+        @Override
+        public void onResetAllSlots()
+        {
+            logDebug("G2Listener: onResetAllSlots");
+            setState(STATE_LOAD_VOICETAG_IDX);
+        }
+        @Override
+        public void onCompileAllSlots()
+        {
+            logDebug("G2Listener: onCompileAllSlots");
+            setState(STATE_SAVE_GRAMMAR2);
+        }
+        
+        @Override
+        public void onSaved(String path)
+        {
+            logDebug("G2Listener: onSaved :"+path);
+            setState(STATE_RECOGNIZE_WITH_GRAMMAR2);
+        }
+
+        @Override
+        public void onError(Exception e)
+        {
+            logDebug("G2Listener: onError: "  + e.toString());
+            Logger.getInstance().error("G2Listener: onError(): "  + e.toString());
+            setState(STATE_ERROR);
+        }
+
+        @Override
+        public void onLoaded()
+        {
+            logDebug("G2Listener: onLoaded");
+            setState(STATE_SHOW_ITERATION);
+        }
+     
+        @Override
+        public void onAddItemList()
+        {
+            logDebug("G2Listener: onAddItemList");
+            logDebug("G2Listener: Finish adding voicetags to grammar slot");
+            voicetags = null;
+            setState(STATE_COMPILE_GRAMMAR2);
+        }
+    
+        @Override
+        public void onAddItemListFailure(int index, Exception e)
+        {
+            logDebug("G2Listener: onAddItemListFailure Item:"+index+ " E:"+e.toString());
+            setState(STATE_ERROR);
+        }
+    }
+
+    
+    /* -------------------------------------------------------
+     * Recognizer Listener 
+     * -------------------------------------------------------*/
+    @Override
+    public void onParametersSetError(Hashtable<String, String> parameters,
+    Exception e)
+    {
+       logDebug("onParametersSetError!\n "+e.toString()); 
+       Logger.getInstance().error("Recognition Listener: onParametersSetError(): "  + e.toString());
+       setState(STATE_ERROR);
+    }
+
+    @Override
+    public void onParametersSet(Hashtable<String, String> parameters)
+    {
+       logDebug("onParametersSet: "); 
+       Enumeration e = parameters.keys();
+       String key = null;
+       String value = null;
+       while(e.hasMoreElements()) {
+           key = (String) e.nextElement();
+           value = parameters.get(key);
+           logDebug(key+" = "+value);    
+       } 
+       key = null;
+       value = null;
+       if (getState()==STATE_SETTING_PARAM_ON) 
+         setState(STATE_CREATE_GRAMMAR1);
+       else
+         setState(STATE_UNLOAD_GRAMMAR1);
+    }
+
+    @Override
+    public void onBeginningOfSpeech()
+    {
+        logDebug("onBeginningOfSpeech");
+    }
+
+    @Override
+    public void onEndOfSpeech()
+    {
+        logDebug("onEndOfSpeech");
+    }
+
+    @Override
+    public void onRecognitionFailure(RecognizerListener.FailureReason reason)
+    {
+        logDebug("onExpectedError "+ reason.toString());
+      
+        // If could not recognize when enrollment then
+        // goto end
+        if (getState()==STATE_RECORD_RECOGNIZING)
+        {
+            Logger.getInstance().error("Recognition Failure: "  + reason.toString());
+            mic.stop();
+            try {
+              System.out.println("Sleep 1800 ms (workaround for Sooner audio driver bug)");
+              Thread.sleep(1800);  // workaround for bug in closing + restarting Android Sooner audio driver.
+              System.out.println("Woke up");
+            } catch (Exception err) {
+              System.out.println("Exception from Thread.sleep(): " + err.toString());
+            }               
+            setState(STATE_ERROR);
+        }
+    }
+
+    @Override
+    public void onRecognitionSuccess(RecognitionResult result)
+    {
+      if( result instanceof NBestRecognitionResult )
+      {
+         // if enrollment recognition, create Voicetags
+        if (getState()==STATE_RECORD_RECOGNIZING)
+        {
+            // Stop microphone
+            mic.stop();
+            try {
+              System.out.println("Sleep 1800 ms (workaround for Sooner audio driver bug)");
+              Thread.sleep(1800);  // workaround for bug in closing + restarting Android Sooner audio driver.
+              System.out.println("Woke up");
+            } catch (Exception err) {
+              System.out.println("Exception from Thread.sleep(): " + err.toString());
+            }               
+            
+            // Saving also the sound file we used for recognition
+            String savePath = QSDK +"/VTAudio"+ names[itemIdx] + ".raw";
+            logDebug("Saving..."+ savePath);
+            mfw.save(audioToSave, savePath); //wait for MFWListener.onStopped()
+            
+            // Create a voicetag with id equal to the 
+            // name 
+            String id = names[itemIdx]+"-Id";
+            currentVoicetag = ((NBestRecognitionResult)result).createVoicetagItem(id, voicetagListener);
+            // Save the voicetag
+            savePath = QSDK +"/"+ names[itemIdx] + ".vtg";
+            currentVoicetag.save(savePath);
+        
+            setState(STATE_WAIT_SAVED_VOICETAG);
+            id = null;
+            savePath = null;
+            return;
+        }
+        
+        int numResults = ((NBestRecognitionResult)result).getSize();
+        logDebug("onRecognitionResult: "  + numResults);
+        NBestRecognitionResult.Entry entry;
+        // Display the recognition results
+        String literal = null;
+        String meaning = null;
+        String dspText = null;
+        for (int i = 0; i < numResults; i++)
+        {
+          entry = ((NBestRecognitionResult)result).getEntry(i);
+          if (entry!=null)
+          {
+              dspText = "result "  + (i + 1);
+              literal = entry.getLiteralMeaning();
+              meaning = (String) entry.getSemanticMeaning();
+              if (literal!=null) dspText=dspText+"Literal:"+literal;
+              dspText= dspText+ entry.getConfidenceScore();
+              if (meaning!=null) dspText=dspText+"meaning:"+meaning;
+              logDebug(dspText);
+          }
+        }
+        literal = null;
+        meaning = null;
+        dspText = null;
+        logDebug("================================");
+      }
+    }
+
+    @Override
+    public void onStarted()
+    {
+       logDebug("onStarted");
+    }
+
+    @Override
+    public void onStartOfSpeechTimeout()
+    {
+        logDebug("onStartOfSpeechTimeout");
+    }
+
+    @Override
+    public void onStopped()
+    {
+        logDebug("+onStopped()");
+        if (getState() == STATE_RECOGNIZING_WITH_GRAMMAR2)
+        { 
+            if (itemIdx<names.length)
+                setState(STATE_RECOGNIZE_WITH_GRAMMAR2);
+            else
+                setState(STATE_RESET);
+        }
+        else 
+            logDebug("State:"+stateNames[getState()]); 
+        logDebug("-onStopped()");
+    }
+
+    @Override
+    public void onError(java.lang.Exception e)
+    {
+        if (getState()==STATE_RECORD_RECOGNIZING)
+        {
+            mic.stop(); // Stop microphone
+            try {
+              System.out.println("Sleep 1800 ms (workaround for Sooner audio driver bug)");
+              Thread.sleep(1800);  // workaround for bug in closing + restarting Android Sooner audio driver.
+              System.out.println("Woke up");
+            } catch (Exception err) {
+              System.out.println("Exception from Thread.sleep(): " + err.toString());
+            }                  
+        }
+        audioStream = null;
+        audioToSave = null;
+        logDebug("Recognition Listener onError:"+e.toString());
+        Logger.getInstance().error("Recognition Listener: onError(): "  + e.toString());
+        setState(STATE_ERROR);
+    }
+}
diff --git a/make/asr/Makefile.common b/make/asr/Makefile.common
new file mode 100644
index 0000000..e18d338
--- /dev/null
+++ b/make/asr/Makefile.common
@@ -0,0 +1,14 @@
+###############################################################################
+# FILE: Makefile.common
+#
+# Common settings, independent of configuration (independent of Makefile.config).
+# This is included by Makefile.defs
+###############################################################################
+
+ASR_COMMON_DEFINES = \
+	-DDISABLE_MALLOC \
+	-DDISABLE_TIMESTAMPS \
+	-DAUDIOIN_SUPPORT_CALLBACK \
+
+#	-DSREC_ENGINE_VERBOSE_LOGGING \
+
diff --git a/make/asr/Makefile.config b/make/asr/Makefile.config
new file mode 100644
index 0000000..ba26e4e
--- /dev/null
+++ b/make/asr/Makefile.config
@@ -0,0 +1,36 @@
+###############################################################################
+# FILE: Makefile.config
+#
+# Configure the ASR build.  Works in conjunction with Makefile.defs and
+# system-wide makefiles
+###############################################################################
+
+ASR_HOST_OS	      = UNIX
+ASR_OS            = UNIX
+ASR_TARGET_OS     = UNIX
+
+ASR_HOST_CPU      = I86
+
+ifeq ($(TARGET_ARCH),arm)
+  ASR_CPU         = ARM
+  ASR_TARGET_CPU  = ARM
+else
+ifeq ($(TARGET_ARCH),x86)
+  ASR_CPU         = I86
+  ASR_TARGET_CPU  = I86
+else
+  $(error Unsupported TARGET_ARCH for ASR)
+endif
+endif
+
+ASR_COMPILER      = GNU
+
+ifeq ($(TARGET_BUILD_TYPE),debug)
+  ASR_BUILD       = DEBUG
+else
+ifeq ($(TARGET_BUILD_TYPE),release)
+  ASR_BUILD       = SHIP
+else
+  $(error Unsupported TARGET_BUILD_TYPE for ASR)
+endif
+endif
diff --git a/make/asr/Makefile.defs b/make/asr/Makefile.defs
new file mode 100644
index 0000000..7a18810
--- /dev/null
+++ b/make/asr/Makefile.defs
@@ -0,0 +1,918 @@
+###############################################################################
+# Defines $(ASR_GLOBAL_DEFINES) (among other things) that specify a build.
+#
+# !!! NOTE:	This file must be kept synchronized with builddef.h
+# !!!		Also the values of $(ASR_OPTIMIZE), $(ASR_PROFILE), & $(ASR_TRACE) must
+# !!!		be compatible with the corresponding values in buildddef.h
+#
+# Required macros set in macros.mak:
+#	$(ASR_OS)			The name of the operating system.
+#	$(ASR_CPU)			The name of the CPU architecture.
+#	$(ASR_COMPILER)		The name of the compiler.
+#	$(ASR_BUILD)		A string that defines what type of build to perform.
+#	$(ASR_UI)			The name of the type of user interface.
+#
+# The important macros defined herein are:
+# *	$(ASR_GLOBAL_DEFINES)The compiler defines based on the values of:
+#					$(ASR_OS), $(ASR_CPU), $(ASR_COMPILER), $(ASR_BUILD), & $(ASR_UI).
+# *	$(ASR_SUB_DIR)		The object, library, & binary sub-directory name.
+# *	$(ASR_OPTIMIZE)		Used by $(ASR_COMPILER_CHAR)flags.mak to enable optimization.
+# *	$(ASR_PROFILE)		Used by $(ASR_COMPILER_CHAR)flags.mak to enable profiling.
+# *	$(ASR_TRACE)		Used by $(ASR_COMPILER_CHAR)flags.mak to enable tracing.
+#
+# Other macros incidentally valid on exit:
+# *	$(ASR_OS_TYPE)		Value corresponding to the type of operating system.
+#	$(ASR_CPU_TYPE)		Value corresponding to the type of CPU architecture.
+#	$(ASR_COMPILER_TYPE)Value corresponding to the type of compiler.
+# *	$(ASR_BUILD_TYPE)	Value corresponding to the type of build to perform.
+#	$(ASR_UI_TYPE)		Value corresponding to the type of user interface.
+#	$(ASR_OS_CHAR)		Character corresponding to the type of operating system.
+#	$(ASR_CPU_CHARS)	Characters corresponding to the type of CPU architecture.
+# *	$(ASR_COMPILER_CHAR)Character corresponding to the type of compiler.
+#	$(ASR_BUILD_CHAR)	Character corresponding to the type of build to perform.
+#	$(ASR_OS_MSDOS)		Value associated with $(ASR_OS_CHAR) = D.
+#	$(ASR_OS_WIN32)		Value associated with $(ASR_OS_CHAR) = W.
+#	$(ASR_OS_MAC)		Value associated with $(ASR_OS_CHAR) = M.
+#	$(ASR_OS_UNIX)		Value associated with $(ASR_OS_CHAR) = U.
+#	$(ASR_OS_EMBEDDED)	Value associated with $(ASR_OS_CHAR) = E.
+#	$(ASR_OS_VXWORKS)	Value associated with $(ASR_OS_CHAR) = V.
+#	$(ASR_OS_QNX)		Value associated with $(ASR_OS_CHAR) = Q.
+#	$(ASR_OS_PSOS)		Value associated with $(ASR_OS_CHAR) = S.
+#	$(ASR_OS_WINCE)		Value associated with $(ASR_OS_CHAR) = C.
+#	$(ASR_OS_PALM)		Value associated with $(ASR_OS_CHAR) = P.
+#	$(ASR_OS_JAVA)		Value associated with $(ASR_OS_CHAR) = J.
+#	$(ASR_CPU_I86)		Value associated with $(ASR_CPU_CHARS) = IN.
+#	$(ASR_CPU_68K)		Value associated with $(ASR_CPU_CHARS) = MO.
+#	$(ASR_CPU_MIPS)		Value associated with $(ASR_CPU_CHARS) = MI.
+#	$(ASR_CPU_ALPHA)	Value associated with $(ASR_CPU_CHARS) = AL.
+#	$(ASR_CPU_PPC)		Value associated with $(ASR_CPU_CHARS) = PP.
+#	$(ASR_CPU_SPARC)	Value associated with $(ASR_CPU_CHARS) = SP.
+#	$(ASR_CPU_ARM)		Value associated with $(ASR_CPU_CHARS) = AR.
+#	$(ASR_CPU_STRONGARM)Value associated with $(ASR_CPU_CHARS) = SA.
+#	$(ASR_CPU_TMS320X)	Value associated with $(ASR_CPU_CHARS) = TI.
+#	$(ASR_CPU_SH3)		Value associated with $(ASR_CPU_CHARS) = HI.
+#	$(ASR_CPU_SH4)		Value associated with $(ASR_CPU_CHARS) = HI.
+#	$(ASR_CPU_FAMILY_TMS320C30)Value associated with $(ASR_CPU_FAMILY) = 3.
+#	$(ASR_CPU_FAMILY_TMS320C40)Value associated with $(ASR_CPU_FAMILY) = 4.
+#	$(ASR_CPU_FAMILY_TMS320C2XX)Value associated with $(ASR_CPU_FAMILY) = 2.
+#	$(ASR_CPU_FAMILY_TMS320C54X)Value associated with $(ASR_CPU_FAMILY) = 5.
+#	$(ASR_C_BORLAND)	Value associated with $(ASR_COMPILER_CHAR) = B.
+#	$(ASR_C_MICROSOFT)	Value associated with $(ASR_COMPILER_CHAR) = M.
+#	$(ASR_C_HIGH)		Value associated with $(ASR_COMPILER_CHAR) = H.
+#	$(ASR_C_INTEL)		Value associated with $(ASR_COMPILER_CHAR) = I.
+#	$(ASR_C_ZORTECH)	Value associated with $(ASR_COMPILER_CHAR) = Z.
+#	$(ASR_C_WATCOM)		Value associated with $(ASR_COMPILER_CHAR) = W.
+#	$(ASR_C_GNU)		Value associated with $(ASR_COMPILER_CHAR) = G.
+#	$(ASR_C_SUNPRO)		Value associated with $(ASR_COMPILER_CHAR) = S.
+#	$(ASR_C_DECCXX)		Value associated with $(ASR_COMPILER_CHAR) = D.
+#	$(ASR_C_METROWERKS)	Value associated with $(ASR_COMPILER_CHAR) = C.
+#	$(ASR_C_GHS)		Value associated with $(ASR_COMPILER_CHAR) = X.
+#	$(ASR_C_TICXC)		Value associated with $(ASR_COMPILER_CHAR) = T.
+#	$(ASR_C_ARM)		Value associated with $(ASR_COMPILER_CHAR) = A.
+#	$(ASR_BUILD_SHIP)	Value associated with $(ASR_BUILD_CHAR) = S.
+#	$(ASR_BUILD_INHOUSE)Value associated with $(ASR_BUILD_CHAR) = I.
+#	$(ASR_BUILD_DEBUGO)	Value associated with $(ASR_BUILD_CHAR) = G.
+#	$(ASR_BUILD_DEBUG)	Value associated with $(ASR_BUILD_CHAR) = X.
+#	$(ASR_BUILD_PROFILE)Value associated with $(ASR_BUILD_CHAR) = P.
+#	$(ASR_BUILD_TRACE)	Value associated with $(ASR_BUILD_CHAR) = L.
+#
+# !!! NOTE:	Should these UI macros be used?
+#
+#	$(ASR_UI_NONE)
+#	$(ASR_UI_TTY)
+#	$(ASR_UI_GUI)
+#
+# Optional (for certain values of $(ASR_CPU)) macros used herein:
+#	$(ASR_CPU_FAMILY)	OPTIONAL single-character name of the $(ASR_CPU) family.
+#
+# Optional (for certain values of $(ASR_CPU)) macros defined herein:
+# *	$(ASR_CPU_FAMILY_TYPE)For OPTIONAL CPU-specifics in $(ASR_COMPILER_CHAR)flags.mak.
+#
+# *	Used outside of this makefile. All macros with the suffix ``_TYPE''
+#	used outside of this makefile can be &ed with macros with the
+#	corresponding prefix. Threfore it is implied that those macros are
+#	also available outside of this makefile.
+###############################################################################
+
+# Makefile.config configures the ASR build.  Include this first!
+include $(ASR_MAKE_DIR)/Makefile.config
+
+# Makefile.common contains settings available to all ASR modules
+include $(ASR_MAKE_DIR)/Makefile.common
+
+# Define $(ASR_OS_*), $(ASR_CPU_*), $(ASR_COMPILER_*), $(ASR_BUILD_*) & $(ASR_UI_*) values.
+
+# OS
+
+ASR_OS_MSDOS = 1
+ASR_OS_WIN32 = 2
+ASR_OS_MAC = 4
+ASR_OS_UNIX = 8
+ASR_OS_EMBEDDED = 16
+ASR_OS_VXWORKS = 32
+ASR_OS_PSOS = 64
+ASR_OS_WINCE = 128
+ASR_OS_PALM = 256
+ASR_OS_JAVA = 512
+ASR_OS_QNX = 1024
+
+# CPU
+
+ASR_CPU_I86 = 1
+ASR_CPU_68K = 2
+ASR_CPU_MIPS = 4
+ASR_CPU_ALPHA = 8
+ASR_CPU_PPC = 16
+ASR_CPU_SPARC = 32
+ASR_CPU_ARM = 64
+ASR_CPU_STRONGARM = 128
+ASR_CPU_TMS320X = 256
+ASR_CPU_SH3 = 512
+ASR_CPU_SH4 = 1024
+
+# Used only by TFLAGS.MAK.
+
+ASR_CPU_FAMILY_TMS320C30 = 1
+ASR_CPU_FAMILY_TMS320C40 = 2
+ASR_CPU_FAMILY_TMS320C2XX = 4
+ASR_CPU_FAMILY_TMS320C54X = 8
+
+# COMPILER
+
+ASR_C_BORLAND = 1
+ASR_C_MICROSOFT = 2
+ASR_C_INTEL = 4
+ASR_C_HIGH = 8
+ASR_C_ZORTECH = 16
+ASR_C_WATCOM = 32
+ASR_C_GNU = 64
+ASR_C_SUNPRO = 128
+ASR_C_DECCXX = 256
+ASR_C_METROWERKS = 512
+ASR_C_GHS = 1024
+ASR_C_TICXC = 2048
+ASR_C_ARM = 4096
+ASR_C_DIABDATA = 8192
+
+# BUILD (must be synchronized with vcc_helper.h included by buildopt.h)
+
+ASR_BUILD_SHIP = 1
+ASR_BUILD_INHOUSE = 2
+ASR_BUILD_DEBUGO = 4
+ASR_BUILD_DEBUG = 8
+ASR_BUILD_PROFILE = 16
+ASR_BUILD_TRACE = 32
+
+ASR_OFF = 0
+
+# UI
+
+ASR_UI_NONE = 1
+ASR_UI_TTY = 2
+ASR_UI_GUI = 4
+
+########################################################################
+#
+# Define $(ASR_*_TYPE) and $(ASR_*_CHAR[S]) to be used to define $(ASR_GLOBAL_DEFINES)
+# and $(ASR_SUB_DIR).
+
+################################## OS ##################################
+
+ifeq ("$(ASR_OS)","MSDOS")
+ASR_OS_TYPE = $(ASR_OS_MSDOS)
+
+else								# same as OS = "Windows_NT"
+ifeq ("$(ASR_OS)","WIN32")
+ASR_OS_TYPE = $(ASR_OS_WIN32)
+
+else								# same as OS = "WIN32"
+ifeq ("$(ASR_OS)","Windows_NT")
+ASR_OS_TYPE = $(ASR_OS_WIN32)
+
+else
+ifeq ("$(ASR_OS)","MAC")
+ASR_OS_TYPE = $(ASR_OS_MAC)
+
+else
+ifeq ("$(ASR_OS)","UNIX")
+ASR_OS_TYPE = $(ASR_OS_UNIX)
+
+else
+ifeq ("$(ASR_OS)","EMBEDDED")
+ASR_OS_TYPE = $(ASR_OS_EMBEDDED)
+
+else
+ifeq ("$(ASR_OS)","VXWORKS")
+ASR_OS_TYPE = $(ASR_OS_VXWORKS)
+
+else
+ifeq ("$(ASR_OS)","PSOS")
+ASR_OS_TYPE = $(ASR_OS_PSOS)
+
+else
+ifeq ("$(ASR_OS)","Wince")
+ASR_OS_TYPE = $(ASR_OS_WINCE)
+
+else
+ifeq ("$(ASR_OS)","PALM")
+ASR_OS_TYPE = $(ASR_OS_PALM)
+
+else
+ifeq ("$(ASR_OS)","JAVA")
+ASR_OS_TYPE = $(ASR_OS_JAVA)
+
+else
+ifeq ("$(ASR_OS)","QNX")
+ASR_OS_TYPE = $(ASR_OS_QNX)
+
+else
+ERROR += \
+$(subst $(space),|,'Failed to select operating system with $$(ASR_OS) == "$(ASR_$(ASR_OS))"')
+ASR_OS_TYPE = ASR_BAD_OS
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+
+################################## HOST_OS ##################################
+
+ifeq ("$(ASR_HOST_OS)","MSDOS")
+ASR_HOST_OS_TYPE = $(ASR_OS_MSDOS)
+
+else								# same as OS = "Windows_NT"
+ifeq ("$(ASR_HOST_OS)","WIN32")
+ASR_HOST_OS_TYPE = $(ASR_OS_WIN32)
+
+else								# same as OS = "WIN32"
+ifeq ("$(ASR_HOST_OS)","Windows_NT")
+ASR_HOST_OS_TYPE = $(ASR_OS_WIN32)
+
+else
+ifeq ("$(ASR_HOST_OS)","MAC")
+ASR_HOST_OS_TYPE = $(ASR_OS_MAC)
+
+else
+ifeq ("$(ASR_HOST_OS)","UNIX")
+ASR_HOST_OS_TYPE = $(ASR_OS_UNIX)
+
+else
+ifeq ("$(ASR_HOST_OS)","EMBEDDED")
+ASR_HOST_OS_TYPE = $(ASR_OS_EMBEDDED)
+
+else
+ifeq ("$(ASR_HOST_OS)","VXWORKS")
+ASR_HOST_OS_TYPE = $(ASR_OS_VXWORKS)
+
+else
+ifeq ("$(ASR_HOST_OS)","PSOS")
+ASR_HOST_OS_TYPE = $(ASR_OS_PSOS)
+
+else
+ifeq ("$(ASR_HOST_OS)","Wince")
+ASR_HOST_OS_TYPE = $(ASR_OS_WINCE)
+
+else
+ifeq ("$(ASR_HOST_OS)","PALM")
+ASR_HOST_OS_TYPE = $(ASR_OS_PALM)
+
+else
+ifeq ("$(ASR_HOST_OS)","JAVA")
+ASR_HOST_OS_TYPE = $(ASR_OS_JAVA)
+
+else
+ifeq ("$(ASR_HOST_OS)","QNX")
+ASR_HOST_OS_TYPE = $(ASR_OS_QNX)
+
+else
+ERROR += \
+$(subst $(space),|,'Failed to select operating system with $$(ASR_HOST_OS) == "$(ASR_HOST_OS)"')
+ASR_HOST_OS_TYPE = ASR_BAD_OS
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################## TARGET_OS ##################################
+
+ifeq ("$(ASR_TARGET_OS)","MSDOS")
+ASR_TARGET_OS_TYPE = $(ASR_OS_MSDOS)
+
+else								# same as OS = "Windows_NT"
+ifeq ("$(ASR_TARGET_OS)","WIN32")
+ASR_TARGET_OS_TYPE = $(ASR_OS_WIN32)
+
+else								# same as OS = "WIN32"
+ifeq ("$(ASR_TARGET_OS)","Windows_NT")
+ASR_TARGET_OS_TYPE = $(ASR_OS_WIN32)
+
+else
+ifeq ("$(ASR_TARGET_OS)","MAC")
+ASR_TARGET_OS_TYPE = $(ASR_OS_MAC)
+
+else
+ifeq ("$(ASR_TARGET_OS)","UNIX")
+ASR_TARGET_OS_TYPE = $(ASR_OS_UNIX)
+
+else
+ifeq ("$(ASR_TARGET_OS)","EMBEDDED")
+ASR_TARGET_OS_TYPE = $(ASR_OS_EMBEDDED)
+
+else
+ifeq ("$(ASR_TARGET_OS)","VXWORKS")
+ASR_TARGET_OS_TYPE = $(ASR_OS_VXWORKS)
+
+else
+ifeq ("$(ASR_TARGET_OS)","PSOS")
+ASR_TARGET_OS_TYPE = $(ASR_OS_PSOS)
+
+else
+ifeq ("$(ASR_TARGET_OS)","Wince")
+ASR_TARGET_OS_TYPE = $(ASR_OS_WINCE)
+
+else
+ifeq ("$(ASR_TARGET_OS)","PALM")
+ASR_TARGET_OS_TYPE = $(ASR_OS_PALM)
+
+else
+ifeq ("$(ASR_TARGET_OS)","JAVA")
+ASR_TARGET_OS_TYPE = $(ASR_OS_JAVA)
+
+else
+ifeq ("$(ASR_TARGET_OS)","QNX")
+ASR_TARGET_OS_TYPE = $(ASR_OS_QNX)
+
+else
+ERROR += \
+$(subst $(space),|,'Failed to select operating system with $$(ASR_TARGET_OS) == "$(ASR_TARGET_OS)"')
+ASR_TARGET_OS_TYPE = ASR_BAD_OS
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################## CPU #################################
+
+ifeq ("$(ASR_CPU)","I86")
+ASR_CPU_TYPE = $(ASR_CPU_I86)
+ASR_CPU_CHARS = in
+
+else
+ifeq ("$(ASR_CPU)", "SIMNT")
+ASR_CPU_TYPE = $(ASR_CPU_I86)
+ASR_CPU_CHARS = in
+
+else
+ifeq ("$(ASR_CPU)","68K")
+ASR_CPU_TYPE = $(ASR_CPU_68K)
+ASR_CPU_CHARS = mo
+
+else
+ifeq ("$(ASR_CPU)","MIPS")
+ASR_CPU_TYPE = $(ASR_CPU_MIPS)
+ASR_CPU_CHARS = mi
+
+else
+ifeq ("$(ASR_CPU)","ALPHA")
+ASR_CPU_TYPE = $(ASR_CPU_ALPHA)
+ASR_CPU_CHARS = al
+
+else
+ifeq ("$(ASR_CPU)","PPC")
+ASR_CPU_TYPE = $(ASR_CPU_PPC)
+ASR_CPU_CHARS = pp
+
+else
+ifeq ("$(ASR_CPU)","SPARC")
+ASR_CPU_TYPE = $(ASR_CPU_SPARC)
+ASR_CPU_CHARS = pp
+
+else
+ifeq ("$(ASR_CPU)","ARM")
+ASR_CPU_TYPE = $(ASR_CPU_ARM)
+ASR_CPU_CHARS = ar
+
+else
+ifeq ("$(ASR_CPU)","STRONGARM")
+ASR_CPU_TYPE = $(ASR_CPU_STRONGARM)
+ASR_CPU_CHARS = sa
+
+else
+ifeq ("$(ASR_CPU)","TMS320X")
+ASR_CPU_TYPE = $(ASR_CPU_TMS320X)
+ASR_CPU_CHARS = ti
+
+ifndef CPU_FAMILY
+CPU_FAMILY_TYPE = 0
+MESSAGE += \
+$(subst $(space),|,'$$(ASR_CPU_FAMILY_TYPE) defaulted to "$(ASR_CPU_FAMILY_TYPE)"')
+
+else
+ASR_CPU_CHARS = T$(ASR_CPU_FAMILY)
+
+ifeq ("$(ASR_CPU_FAMILY)","3")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C30)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","4")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C40)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","2")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C2XX)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","5")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C54X)
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU family with $$(ASR_CPU_FAMILY) == "$(ASR_CPU_FAMILY)"')
+ASR_CPU_FAMILY_TYPE=ASR_BAD_CPU_FAMILY
+endif
+endif
+endif
+endif
+endif
+
+else
+ifeq ("$(ASR_CPU)","SH3")
+ASR_CPU_TYPE = $(ASR_CPU_SH3)
+ASR_CPU_CHARS = hi
+
+else
+ifeq ("$(ASR_CPU)","SH4")
+ASR_CPU_TYPE = $(ASR_CPU_SH4)
+ASR_CPU_CHARS = hi
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU architecture with $$(ASR_CPU) == "$(ASR_$(ASR_CPU))"')
+ASR_CPU_TYPE = ASR_BAD_CPU
+ASR_CPU_CHARS = ASR_BAD_CPU
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################## HOST_CPU #################################
+
+ifeq ("$(ASR_HOST_CPU)","I86")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_I86)
+
+else
+ifeq ("$(ASR_HOST_CPU)","68K")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_68K)
+
+else
+ifeq ("$(ASR_HOST_CPU)","MIPS")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_MIPS)
+
+else
+ifeq ("$(ASR_HOST_CPU)","ALPHA")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_ALPHA)
+
+else
+ifeq ("$(ASR_HOST_CPU)","PPC")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_PPC)
+
+else
+ifeq ("$(ASR_HOST_CPU)","SPARC")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_SPARC)
+
+else
+ifeq ("$(ASR_HOST_CPU)","ARM")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_ARM)
+
+else
+ifeq ("$(ASR_HOST_CPU)","STRONGARM")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_STRONGARM)
+
+else
+ifeq ("$(ASR_HOST_CPU)","TMS320X")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_TMS320X)
+
+ifndef CPU_FAMILY
+ASR_CPU_FAMILY_TYPE = 0
+MESSAGE += \
+$(subst $(space),|,'$$(ASR_CPU_FAMILY_TYPE) defaulted to "$(ASR_CPU_FAMILY_TYPE)"')
+
+else
+
+ifeq ("$(ASR_CPU_FAMILY)","3")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C30)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","4")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C40)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","2")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C2XX)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","5")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C54X)
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU family with $$(ASR_CPU_FAMILY) == "$(ASR_CPU_FAMILY)"')
+ASR_CPU_FAMILY_TYPE=ASR_BAD_CPU_FAMILY
+endif
+endif
+endif
+endif
+endif
+
+else
+ifeq ("$(ASR_HOST_CPU)","SH3")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_SH3)
+
+else
+ifeq ("$(ASR_HOST_CPU)","SH4")
+ASR_HOST_CPU_TYPE = $(ASR_CPU_SH4)
+
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU architecture with $$(ASR_HOST_CPU) == "$(ASR_HOST_CPU)"')
+ASR_HOST_CPU_TYPE = ASR_BAD_CPU
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################## TARGET_CPU #################################
+
+ifeq ("$(ASR_TARGET_CPU)","I86")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_I86)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","68K")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_68K)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","MIPS")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_MIPS)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","ALPHA")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_ALPHA)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","PPC")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_PPC)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","SPARC")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_SPARC)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","ARM")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_ARM)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","STRONGARM")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_STRONGARM)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","TMS320X")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_TMS320X)
+
+ifndef CPU_FAMILY
+ASR_CPU_FAMILY_TYPE = 0
+MESSAGE += \
+$(subst $(space),|,'$$(ASR_CPU_FAMILY_TYPE) defaulted to "$(ASR_CPU_FAMILY_TYPE)"')
+
+else
+
+ifeq ("$(ASR_CPU_FAMILY)","3")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C30)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","4")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C40)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","2")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C2XX)
+
+else
+ifeq ("$(ASR_CPU_FAMILY)","5")
+ASR_CPU_FAMILY_TYPE = $(ASR_CPU_FAMILY_TMS320C54X)
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU family with $$(ASR_CPU_FAMILY) == "$(ASR_CPU_FAMILY)"')
+ASR_CPU_FAMILY_TYPE=ASR_BAD_CPU_FAMILY
+endif
+endif
+endif
+endif
+endif
+
+else
+ifeq ("$(ASR_TARGET_CPU)","SH3")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_SH3)
+
+else
+ifeq ("$(ASR_TARGET_CPU)","SH4")
+ASR_TARGET_CPU_TYPE = $(ASR_CPU_SH4)
+
+else
+
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU architecture with $$(ASR_TARGET_CPU) == "$(ASR_TARGET_CPU)"')
+ASR_TARGET_CPU_TYPE = ASR_BAD_CPU
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+
+############################### COMPILER ###############################
+#
+# $(ASR_COMPILER_CHAR) is also used to select which flags makefile to include.
+
+ifeq ("$(ASR_COMPILER)","BORLAND")		# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_BORLAND)
+
+else								# same as COMPILER = "M$$"
+ifeq ("$(ASR_COMPILER)","MS")
+ASR_COMPILER_TYPE = $(ASR_C_MICROSOFT)
+
+else
+ifeq ("$(ASR_COMPILER)","INTEL")		# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_INTEL)
+
+else
+ifeq ("$(ASR_COMPILER)","HIGH")			# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_HIGH)
+
+else
+ifeq ("$(ASR_COMPILER)","ZORTECH")		# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_ZORTECH)
+
+else
+ifeq ("$(ASR_COMPILER)","WATCOM")		# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_WATCOM)
+
+else
+ifeq ("$(ASR_COMPILER)","GNU")			# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_GNU)
+
+else
+ifeq ("$(ASR_COMPILER)","SUNPRO")		# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_SUNPRO)
+
+else
+ifeq ("$(ASR_COMPILER)","DECCXX")		# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_DECCXX)
+
+else
+ifeq ("$(ASR_COMPILER)","METROWERKS")	# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_METROWERKS)
+
+else
+ifeq ("$(ASR_COMPILER)","GHS")			# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_GHS)
+
+else
+ifeq ("$(ASR_COMPILER)","TICXC")		# !!! NOT SURE WHAT STRING TO USE !!!
+ASR_COMPILER_TYPE = $(ASR_C_TICXC)
+
+else
+ifeq ("$(ASR_COMPILER)","ARM")			# !!! NOT ANY PARTICULAR COMPILER !!!
+ASR_COMPILER_TYPE = $(ASR_C_ARM)
+
+else
+ifeq ("$(ASR_COMPILER)","DIABDATA")			# !!! NOT ANY PARTICULAR COMPILER !!!
+ASR_COMPILER_TYPE = $(ASR_C_DIABDATA)
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select compiler with $$(ASR_COMPILER) == "$(ASR_COMPILER)"')
+ASR_COMPILER_TYPE = ASR_BAD_COMPILER
+ASR_COMPILER_CHAR = ASR_BAD_COMPILER
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################# BUILD ################################
+#
+# Define OPTIMIZE, PROFILE, and TRACE for use in $(ASR_COMPILER_CHAR)flags.mak.
+# These values must be compatible with the corresponding ones in builddef.h.
+
+ASR_OPTIMIZE = $(ASR_OFF)
+ASR_PROFILE = $(ASR_OFF)
+ASR_TRACE = $(ASR_OFF)
+
+#									# BUILD  CHAR  OPTIMIZE  PROFILE  TRACE
+#									  ----   ----  --------  -------  -----
+ifeq ("$(ASR_BUILD)","SHIP")			# SHIP    `S'  OPTIMIZE
+ASR_BUILD_TYPE = $(ASR_BUILD_SHIP)
+ASR_BUILD_CHAR = s
+ASR_OPTIMIZE = $(ASR_BUILD_TYPE)
+
+else
+ifeq ("$(ASR_BUILD)","NDEBUG")			# SHIP    `S'  OPTIMIZE
+ASR_BUILD_TYPE = $(ASR_BUILD_SHIP)
+ASR_BUILD_CHAR = s
+ASR_OPTIMIZE = $(ASR_BUILD_TYPE)
+
+else
+ifeq ("$(ASR_BUILD)","INHOUSE")			# INHOUSE `I'  OPTIMIZE
+ASR_BUILD_TYPE = $(ASR_BUILD_INHOUSE)
+ASR_BUILD_CHAR = i
+ASR_OPTIMIZE = $(ASR_BUILD_TYPE)
+
+else
+ifeq ("$(ASR_BUILD)","DEBUGO")			# DEBUG   `G'  OPTIMIZE
+ASR_BUILD_TYPE = $(ASR_BUILD_DEBUGO)
+ASR_BUILD_CHAR = g
+ASR_OPTIMIZE = $(ASR_BUILD_TYPE)
+
+else
+ifeq ("$(ASR_BUILD)","DEBUG")			# DEBUG   `X'
+ASR_BUILD_TYPE = $(ASR_BUILD_DEBUG)
+ASR_BUILD_CHAR = x
+
+else
+ifeq ("$(ASR_BUILD)","PROFILE")			# INHOUSE `P'  OPTIMIZE  PROFILE
+ASR_BUILD_TYPE = $(ASR_BUILD_PROFILE)
+ASR_BUILD_CHAR = p
+ASR_OPTIMIZE = $(ASR_BUILD_TYPE)
+ASR_PROFILE = $(ASR_BUILD_TYPE)
+
+else
+ifeq ("$(ASR_BUILD)","TRACE")			# INHOUSE `L'  OPTIMIZE           TRACE
+ASR_BUILD_TYPE = $(ASR_BUILD_TRACE)
+ASR_BUILD_CHAR = l
+ASR_OPTIMIZE = $(ASR_BUILD_TYPE)
+ASR_TRACE = $(ASR_BUILD_TYPE)
+
+else
+ERROR += \
+$(subst $(space),|,'Failed to select build type with $$(ASR_BUILD) == "$(ASR_BUILD)"')
+ASR_BUILD_TYPE = ASR_BAD_BUILD
+ASR_BUILD_CHAR = ASR_BAD_BUILD
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################# UI #################################
+#
+# !!! NOT USED !!!
+
+######################################################################
+#
+# Finally define the macros of interest.
+
+ASR_GLOBAL_DEFINES = \
+	-DOS_UNIX=$(ASR_OS_UNIX) \
+	-DOS_EMBEDDED=$(ASR_OS_EMBEDDED) \
+	-DOS_VXWORKS=$(ASR_OS_VXWORKS) \
+	-DOS_PSOS=$(ASR_OS_PSOS) \
+	-DOS_QNX=$(ASR_OS_QNX) \
+	-DOS=$(ASR_OS_TYPE) \
+	-DHOST_OS=$(ASR_HOST_OS_TYPE) \
+	-DTARGET_OS=$(ASR_TARGET_OS_TYPE) \
+	-DCPU_PPC=$(ASR_CPU_PPC) \
+	-DCPU_SPARC=$(ASR_CPU_SPARC) \
+	-DCPU_ARM=$(ASR_CPU_ARM) \
+	-DCPU_STRONGARM=$(ASR_CPU_STRONGARM) \
+	-DCPU_TMS320X=$(ASR_CPU_TMS320X) \
+	-DCPU_SH3=$(ASR_CPU_SH3) \
+	-DCPU_SH4=$(ASR_CPU_SH4) \
+	-DCPU=$(ASR_CPU_TYPE) \
+	-DHOST_CPU=$(ASR_HOST_CPU_TYPE) \
+	-DTARGET_CPU=$(ASR_TARGET_CPU_TYPE) \
+	-DC_GNU=$(ASR_C_GNU) \
+	-DC_SUNPRO=$(ASR_C_SUNPRO) \
+	-DC_METROWERKS=$(ASR_C_METROWERKS) \
+	-DC_TICXC=$(ASR_C_TICXC) \
+	-DC_ARM=$(ASR_C_ARM) \
+	-DCOMPILER=$(ASR_COMPILER_TYPE) \
+	-DBUILD_SHIP=$(ASR_BUILD_SHIP) \
+	-DBUILD_DEBUG=$(ASR_BUILD_DEBUG) \
+	-DBUILD=$(ASR_BUILD_TYPE) \
+
+# Include these from Makefile.common
+ASR_GLOBAL_DEFINES += $(ASR_COMMON_DEFINES) $(ASR_WORKAROUND_DEFINES)
+
+# OS specific defines
+ifeq ($(ASR_TARGET_OS),UNIX)
+ASR_GLOBAL_DEFINES += -DPOSIX -D__linux
+endif
+
+
+# BUILD specific defines and flags
+ASR_GLOBAL_CPPFLAGS =
+
+ifeq ($(ASR_BUILD),SHIP)
+ASR_GLOBAL_DEFINES += -DNDEBUG -D_SHIP -DFINAL_RELEASE
+#ASR_GLOBAL_CPPFLAGS += -O3 -fno-strict-aliasing
+endif
+
+ifeq ($(ASR_BUILD),NDEBUG)
+ASR_GLOBAL_DEFINES += -DNDEBUG
+#ASR_GLOBAL_CPPFLAGS +=
+endif
+
+ifeq ($(ASR_BUILD),INHOUSE)
+ASR_GLOBAL_DEFINES += -D_INHOUSE
+#ASR_GLOBAL_CPPFLAGS += -g3
+endif
+
+ifeq ($(ASR_BUILD),DEBUGO)
+ASR_GLOBAL_DEFINES += -D_DEBUG
+#ASR_GLOBAL_CPPFLAGS += -g
+endif
+
+ifeq ($(ASR_BUILD),DEBUG)
+ASR_GLOBAL_DEFINES += -D_DEBUG
+#ASR_GLOBAL_CPPFLAGS += -g
+endif
+
+ifneq ($(ASR_OPTIMIZE),$(ASR_OFF))
+ASR_GLOBAL_DEFINES += -D_OPTIMIZE
+#ASR_GLOBAL_CPPFLAGS += -O3
+endif
+
+ifneq ($(ASR_PROFILE),$(ASR_OFF))
+ASR_GLOBAL_DEFINES += -D_PROFILE
+#ASR_GLOBAL_CPPFLAGS += -g3
+endif
+
+ifneq ($(ASR_TRACE),$(ASR_OFF))
+ASR_GLOBAL_DEFINES += -D_TRACE
+#ASR_GLOBAL_CPPFLAGS +=
+endif
diff --git a/portable/Android.mk b/portable/Android.mk
new file mode 100644
index 0000000..a66f687
--- /dev/null
+++ b/portable/Android.mk
@@ -0,0 +1,75 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/ArrayList.c \
+	src/ArrayListImpl.c \
+	src/ESR_ReturnCode.c \
+	src/LCHAR.c  \
+	src/pcputimer.c \
+	src/pcrc.c \
+	src/pendian.c \
+	src/PFileWrap.c \
+	src/$(ASR_TARGET_OS)/PFileWrap$(ASR_TARGET_OS)_OS_Specific.c \
+	src/phashtable.c \
+	src/pLastError.c \
+	src/plog.c \
+	src/pmalloc.c \
+	src/pmemory.c \
+	src/pmemory_ext.c \
+	src/PStackSize.c \
+	src/ptimestamp.c \
+	src/ptypes.c \
+#	src/ptimer.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+
+common_CFLAGS := \
+	-DPORTABLE_EXPORTS \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES :=
+
+common_TARGET:= libESR_Portable
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+#LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := libcutils libmedia
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/portable/include/ArrayList.h b/portable/include/ArrayList.h
new file mode 100644
index 0000000..7d0ebfb
--- /dev/null
+++ b/portable/include/ArrayList.h
@@ -0,0 +1,295 @@
+/*---------------------------------------------------------------------------*
+ *  ArrayList.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ARRAYLIST_H
+#define __ARRAYLIST_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+#include "ptypes.h"
+#include <stdlib.h>
+
+/**
+ * @addtogroup ArrayListModule ArrayList API functions
+ * Collection of elements.
+ *
+ * @{
+ */
+
+/**
+ * Collection of elements.
+ */
+typedef struct ArrayList_t
+{
+  /**
+   * Adds element to list.
+   *
+   * @param self ArrayList handle
+   * @param element Element to be added
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+   */
+  ESR_ReturnCode(*add)(struct ArrayList_t* self, void* element);
+  
+  /**
+   * Inserts an element in the the list at the specified location.  This
+   * causes all elements above or at the specified location to be shifted by
+   * one.
+   *
+   * @param self ArrayList handle
+   * @param index  The index where to insert the element.
+   * @param element The element to insert.
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_SUCCESS if success or anaother value indicating
+  * the nature of the error. In particular, it returns ESR_ARGUMENT_OUT_OF_BOUNDS if index
+   * is less than 0 or greater than the array's size.
+   */
+  ESR_ReturnCode(*insertAt)(struct ArrayList_t* self, size_t index,
+                            void *element);
+                            
+  /**
+  * Removes element from list.
+  *
+  * @param self ArrayList handle
+  * @param element Element to be removed
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+  */
+  ESR_ReturnCode(*remove)(struct ArrayList_t* self, const void* element);
+  
+  /**
+  * Removes element from list at specified index.
+  *
+  * @param self ArrayList handle
+  * @param index Index of element to be removed
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory;
+  * ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+  */
+  ESR_ReturnCode(*removeAtIndex)(struct ArrayList_t* self, size_t index);
+  
+  /**
+  * Removes all elements from list.
+  *
+  * @param self ArrayList handle
+  * @return ESR_INVALID_ARGUMENT if self is null
+  */
+  ESR_ReturnCode(*removeAll)(struct ArrayList_t* self);
+  
+  /**
+  * Indicates if element is contained within the list.
+  *
+  * @param self ArrayList handle
+  * @param element Element to check for
+  * @param exists True if element was found
+  * @return ESR_INVALID_ARGUMENT if self is null
+  */
+  ESR_ReturnCode(*contains)(struct ArrayList_t* self, const void* element, ESR_BOOL* exists);
+  
+  /**
+  * Returns array size.
+  *
+  * @param self ArrayList handle
+  * @param size Returned size
+  * @return ESR_INVALID_ARGUMENT if self is null
+  */
+  ESR_ReturnCode(*getSize)(struct ArrayList_t* self, size_t* size);
+  
+  /**
+  * Returns the element at the specified index.
+  *
+  * @param self ArrayList handle
+  * @param index Element index
+  * @param element Element being returned
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+  */
+  ESR_ReturnCode(*get)(struct ArrayList_t* self, size_t index, void** element);
+  
+  /**
+  * Sets the element at the specified index.
+  *
+  * NOTE: Does *not* deallocate the element being overwritten.
+  * @param self ArrayList handle
+  * @param index Element index
+  * @param element Element's new value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+  */
+  ESR_ReturnCode(*set)(struct ArrayList_t* self, size_t index, void* element);
+  
+  /**
+   * Converts the ArrayList to a static array.
+   * The use of the ArrayList handle is undefined past this point.
+   *
+   * @param self ArrayList handle
+   * @param newArray Pointer to resulting array
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*toStaticArray)(struct ArrayList_t* self, void** newArray);
+  
+  /**
+  * Returns a clone of the ArrayList.
+  *
+  * @param self ArrayList handle
+   * @param clone [out] Clone of the ArrayList (created externally, populated internally)
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index (used internally) is out of bounds
+  * ESR_OUT_OF_MEMORY is system is out of memory
+  */
+  ESR_ReturnCode(*clone)(struct ArrayList_t* self, struct ArrayList_t* clone);
+  
+  /**
+  * Destroys the ArrayList.
+  *
+  * @param self ArrayList handle
+  * @return ESR_INVALID_ARGUMENT if self is null
+  */
+  ESR_ReturnCode(*destroy)(struct ArrayList_t* self);
+}
+ArrayList;
+
+/**
+ * Creates a new ArrayList.
+ *
+ * @param self ArrayList handle
+ * @return ESR_INVALID_ARGUMENT if self or the value it points to are null; ESR_OUT_OF_MEMORY is system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode ArrayListCreate(ArrayList** self);
+
+/**
+ * Creates a new ArrayList with minimum capacity.
+ *
+ * @param self ArrayList handle
+ * @param minCapacity Minimum capacity of the array.
+ * @return ESR_INVALID_ARGUMENT if self or the value it points to are null; ESR_OUT_OF_MEMORY is system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode ArrayListCreateWithCapacity(ArrayList** self, size_t minCapacity);
+
+/**
+ * Adds element to list.
+ *
+ * @param self ArrayList handle
+ * @param element Element to be added
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode ArrayListAdd(ArrayList* self, void* element);
+
+
+/**
+ * Inserts an element in the the list at the specified location.  This
+ * causes all elements above or at the specified location to be shifted by
+ * one.
+ *
+ * @param self ArrayList handle
+ * @param index  The index where to insert the element.
+ * @param element The element to insert.
+ *
+ * @return ESR_SUCCESS if success or anaother value indicating the nature of
+ * the error.  In particular, it returns ESR_ARGUMENT_OUT_OF_BOUNDS if index
+ * is less than 0 or greater than the array's size.
+ */
+PORTABLE_API ESR_ReturnCode ArrayListInsertAt(ArrayList* self,
+    size_t index,
+    void *element);
+    
+/**
+ * Removes element from list.
+ *
+ * @param self ArrayList handle
+ * @param element Element to be removed
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode ArrayListRemove(ArrayList* self, void* element);
+/**
+ * Removes element from list at specified index.
+ *
+ * @param self ArrayList handle
+ * @param index Index of element to be removed
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory;
+ * ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+ */
+PORTABLE_API ESR_ReturnCode ArrayListRemoveAtIndex(ArrayList* self, size_t index);
+
+/**
+ * Removes all elements from list.
+ *
+ * @param self ArrayList handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode ArrayListRemoveAll(ArrayList* self);
+
+/**
+ * Indicates if element is contained within the list.
+ *
+ * @param self ArrayList handle
+ * @param element Element to check for
+ * @param exists True if element was found
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode ArrayListContains(ArrayList* self, void* element, ESR_BOOL* exists);
+
+/**
+ * Returns array size.
+ *
+ * @param self ArrayList handle
+ * @param size Returned size
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode ArrayListGetSize(ArrayList* self, size_t* size);
+
+/**
+ * Returns the element at the specified index.
+ *
+ * @param self ArrayList handle
+ * @param index Element index
+ * @param element Element being returned
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+ */
+PORTABLE_API ESR_ReturnCode ArrayListGet(ArrayList* self, size_t index, void** element);
+
+/**
+ * Sets the element at the specified index.
+ *
+ * NOTE: Does *not* deallocate the element being overwritten.
+ * @param self ArrayList handle
+ * @param index Element index
+ * @param element Element's new value
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+ */
+PORTABLE_API ESR_ReturnCode ArrayListSet(ArrayList* self, size_t index, void* element);
+
+/**
+ * Returns a clone of the ArrayList.
+ *
+ * @param self ArrayList handle
+ * @param clone [out] Clone of the ArrayList (created externally, populated internally)
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index (used internally) is out of bounds
+ * ESR_OUT_OF_MEMORY is system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode ArrayListClone(ArrayList* self, ArrayList* clone);
+
+/**
+ * Destroys an ArrayList.
+ *
+ * @param self ArrayList handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode ArrayListDestroy(ArrayList* self);
+
+/**
+ * @}
+ */
+
+#endif /* __ARRAYLIST_H */
diff --git a/portable/include/ArrayListImpl.h b/portable/include/ArrayListImpl.h
new file mode 100644
index 0000000..09c679c
--- /dev/null
+++ b/portable/include/ArrayListImpl.h
@@ -0,0 +1,120 @@
+/*---------------------------------------------------------------------------*
+ *  ArrayListImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ARRAYLISTIMPL_H
+#define __ARRAYLISTIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+
+/**
+ * ArrayList implementation.
+ */
+typedef struct ArrayListImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  ArrayList Interface;
+  
+  /**
+   * ArrayList contents.
+   *
+   * Represents an array of void* elements. An element having a value of NULL denotes an
+   * empty slot.
+   */
+  void** contents;
+  
+  /**
+   * number element in the array.
+   */
+  size_t size;
+  
+  /**
+   * Actual capacity of the array.
+   */
+  size_t capacity;
+  
+  /**
+   * Min capacity of the array.
+   **/
+  size_t minCapacity;
+  
+}
+ArrayListImpl;
+
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_Add(ArrayList* self, void* element);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_InsertAt(ArrayList* self, size_t index, void* element);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_Remove(ArrayList* self, const void* element);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_RemoveAtIndex(ArrayList* self, size_t index);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_RemoveAll(ArrayList* self);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_Contains(ArrayList* self, const void* element, ESR_BOOL* exists);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_Get(ArrayList* self, size_t index, void** element);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_Set(ArrayList* self, size_t index, void* element);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_GetSize(ArrayList* self, size_t* size);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_Clone(ArrayList* self, ArrayList* clone);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode ArrayList_Destroy(ArrayList* self);
+
+#endif /* __ARRAYLIST_H */
diff --git a/portable/include/ESR_ReturnCode.h b/portable/include/ESR_ReturnCode.h
new file mode 100644
index 0000000..4fdd906
--- /dev/null
+++ b/portable/include/ESR_ReturnCode.h
@@ -0,0 +1,220 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_ReturnCode.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef ESR_RETURNCODE_H
+#define ESR_RETURNCODE_H
+
+
+
+#include "PortPrefix.h"
+
+/**
+ * @addtogroup ESR_PortableModule ESR_Portable API functions
+ *
+ * @{
+ */
+
+/**
+ * Return-code values.
+ */
+typedef enum ESR_ReturnCode_t
+{
+  /*
+   * Note: do not forget to modify ESR_rc2str when modifying this enum.
+   */
+  
+  /**
+   * Operation completed successfully.
+   */
+  ESR_SUCCESS,
+  
+  /**
+   * Intermediate stage of operation completed successfully, we wish to indicate
+   * that remainig stages of operation may proceed.
+   */
+  ESR_CONTINUE_PROCESSING,
+  
+  /**
+   * Indicates a fatal error.
+   */
+  ESR_FATAL_ERROR,
+  
+  /**
+   * Buffer overflow occured.
+   */
+  ESR_BUFFER_OVERFLOW,
+  
+  /**
+   * Error typing to open an entity or the operation failed because the entity was not opened.
+   */
+  ESR_OPEN_ERROR,
+  
+  /**
+   * Error trying to open an entity that is already open.
+   */
+  ESR_ALREADY_OPEN,
+  
+  /**
+   * Error typing to close a entity or the operation failed because the entity was not closed.
+   */
+  ESR_CLOSE_ERROR,
+  
+  /**
+   * Error trying to close a entity that was already closed.
+   */
+  ESR_ALREADY_CLOSED,
+  
+  /**
+   * Error trying to read a file.
+   */
+  ESR_READ_ERROR,
+  
+  /**
+   * Error trying to write to a entity.
+   */
+  ESR_WRITE_ERROR,
+  
+  /**
+   * Error trying to flush a entity.
+   */
+  ESR_FLUSH_ERROR,
+  
+  /**
+   * Error trying to seek a entity.
+   */
+  ESR_SEEK_ERROR,
+  
+  /**
+   * Error trying to allocate memory.
+   */
+  ESR_OUT_OF_MEMORY,
+  
+  /**
+   * Specified argument is out of bounds.
+   */
+  ESR_ARGUMENT_OUT_OF_BOUNDS,
+  
+  /**
+   * Failed to locate the specified entity.
+   */
+  ESR_NO_MATCH_ERROR,
+  
+  /**
+   * Passed in argument contains an invalid value. Such as when a NULL pointer
+   * is passed in when when an actual value is expected.
+   */
+  ESR_INVALID_ARGUMENT,
+  
+  /**
+   * Indicates that request functionality is not supported.
+   */
+  ESR_NOT_SUPPORTED,
+  
+  /**
+   * Indicates that the object is not in a state such that the operation can
+   * be succesfully performed.
+   */
+  ESR_INVALID_STATE,
+  
+  /**
+   * Indicates that a thread could not be created.
+   */
+  ESR_THREAD_CREATION_ERROR,
+  
+  /**
+   * Indicates that a resource with the same identifier already exists.
+   */
+  ESR_IDENTIFIER_COLLISION,
+  
+  /**
+   * Indicates that the operation timed out.
+   */
+  ESR_TIMED_OUT,
+  
+  /**
+   * Indicates that the object being retrieved isn't of the expected type.
+   * For example, when retrieving an integer from a HashMap we find out the
+   * value is actually of type float.
+   */
+  ESR_INVALID_RESULT_TYPE,
+  
+  /**
+   * Indicates that the invoked function has not been implemented.
+   */
+  ESR_NOT_IMPLEMENTED,
+  
+  /**
+   * A connection was forcibly closed by a peer. This normally results from
+   * a loss of the connection on the remote socket due to a timeout or a reboot.
+   */
+  ESR_CONNECTION_RESET_BY_PEER,
+  
+  /**
+   * Indicates that a process could not be created.
+   */
+  ESR_PROCESS_CREATE_ERROR,
+  
+  /**
+   * Indicates that no matching TTS engine is available.
+   */
+  ESR_TTS_NO_ENGINE,
+  
+  /**
+   * Indicates that an attempt to create a mutex failed because the OS is running out of resources.
+   */
+  ESR_MUTEX_CREATION_ERROR,
+  
+  /**
+   * Indicates a deadlock situation has occured.
+   */
+  ESR_DEADLOCK
+} ESR_ReturnCode;
+
+
+/**
+ * Checks the function return-code and if it is not ESR_SUCCESS, returns it.
+ */
+#define CHK(rc, x) do { if ((rc = (x)) != ESR_SUCCESS) goto CLEANUP; } while (0)
+
+#include "ptypes.h"
+
+/**
+ * Given a return-code, returns its string representation.
+ *
+ * @param rc Return-code
+ * @return String representation of return-code.
+ */
+PORTABLE_API const LCHAR* ESR_rc2str(const ESR_ReturnCode rc);
+
+#ifdef _WIN32
+/**
+ * Called before entering any function.
+ */
+PORTABLE_API void _cdecl _penter(void);
+/**
+ * Called after exiting any function.
+ */
+PORTABLE_API void _cdecl _pexit(void);
+#endif
+
+/**
+ * @}
+ */
+
+#endif 
diff --git a/portable/include/LCHAR.h b/portable/include/LCHAR.h
new file mode 100644
index 0000000..2bea16a
--- /dev/null
+++ b/portable/include/LCHAR.h
@@ -0,0 +1,170 @@
+/*---------------------------------------------------------------------------*
+ *  LCHAR.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __LCHAR_H
+#define __LCHAR_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup LCHARModule LCHAR API functions
+ * LCHAR manipulation functions.
+ *
+ * @{
+ */
+
+/**
+ * Trims string, removing any leading, trailing whitespace.
+ *
+ * @param text Text to trim
+ * @return ESR_SUCCESS
+ */
+PORTABLE_API ESR_ReturnCode lstrtrim(LCHAR* text);
+
+/**
+ * Inserts text into a string.
+ *
+ * @param source String to insert
+ * @param target String to insert into
+ * @param offset Offset in target string
+ * @param len [in/out] Length of target argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_BUFFER_OVERFLOW is target is too small to insert into
+ */
+PORTABLE_API ESR_ReturnCode lstrinsert(const LCHAR* source, LCHAR* target, size_t offset, size_t* len);
+
+/**
+ * Changes all instances of one character to another in a string.
+ *
+ * @param text String to process
+ * @param source Source character
+ * @param target Target character
+ * @return ESR_SUCCESS
+ */
+PORTABLE_API ESR_ReturnCode lstrreplace(LCHAR* text, const LCHAR source, const LCHAR target);
+
+/**
+ * Converts string to integer.
+ *
+ * @param text String to parse
+ * @param result [out] Resulting value
+ * @param base Number base to use
+ * @return ESR_INVALID_ARGUMENT is text is null or does not represent a number
+ */
+PORTABLE_API ESR_ReturnCode lstrtoi(const LCHAR* text, int* result, int base);
+
+/**
+ * Converts string to unsigned integer.
+ *
+ * @param text String to parse
+ * @param result [out] Resulting value
+ * @param base Number base to use
+ * @return ESR_INVALID_ARGUMENT is text is null or does not represent a number
+ */
+PORTABLE_API ESR_ReturnCode lstrtoui(const LCHAR* text, unsigned int* result, int base);
+
+/**
+ * Converts string to float.
+ *
+ * @param text String to parse
+ * @param result [out] Resulting value
+ * @return ESR_INVALID_ARGUMENT is text is null or does not represent a number
+ */
+PORTABLE_API ESR_ReturnCode lstrtof(const LCHAR* text, float* result);
+
+/**
+ * Converts string to boolean.
+ *
+ * @param text String to parse
+ * @param result [out] Resulting value
+ * @return ESR_INVALID_ARGUMENT is text is null or does not represent a boolean value
+ */
+PORTABLE_API ESR_ReturnCode lstrtob(const LCHAR* text, ESR_BOOL* result);
+
+/**
+ * Returns the first token in the string in the form of an integer.
+ *
+ * @param text Text containing integers
+ * @param value [out] Integer that was read
+ * @param finalPosition [out] The first character after the token. A NULL value means this
+ *                            argument is ignored.
+ * @return ESR_INVALID_ARGUMENT is text is null or does not represent an integer value
+ */
+PORTABLE_API ESR_ReturnCode LCHARGetInt( LCHAR* text, int* value, LCHAR** finalPosition);
+
+/**
+ * Convert string to upper case
+ *
+ * @param string [in/out] string to be converted
+ * @return ESR_INVALID_ARGUMENT is string is null
+ */
+PORTABLE_API ESR_ReturnCode lstrupr(LCHAR* string);
+
+/**
+ * Convert string to lower case
+ *
+ * @param string [in/out] string to be converted
+ * @return ESR_INVALID_ARGUMENT is string is null
+ */
+PORTABLE_API ESR_ReturnCode lstrlwr(LCHAR* string);
+
+/**
+ * Binary safe case-insensitive string comparison
+ *
+ * @param string1 Text containing integers
+ * @param string2 Integer that was read
+ * @param result [out] returns
+ *        < 0 if str1 is less than str2;
+ *        > 0 if str1 is greater than str2, and
+ *          0 if they are equal.
+ * @return ESR_INVALID_ARGUMENT is string1 or string2 is null
+ */
+PORTABLE_API ESR_ReturnCode lstrcasecmp(const LCHAR *string1, const LCHAR *string2, int *result);
+
+/**
+ * Converts int to string
+ *
+ * @param value unsigned long to convert
+ * @param string [out] String to store
+ * @param len [in/out] in: length of the buffer; out: length of the converted string
+ * @param radix Base of value; must be in the range 2 - 36
+ * @return ESR_INVALID_ARGUMENT is string is null; ESR_BUFFER_OVERFLOW is string is not big enough to contain result
+ */
+PORTABLE_API ESR_ReturnCode litostr(int value, LCHAR *string, size_t *len, int radix);
+
+/**
+ * Converts unsigned long to string
+ *
+ * @param value unsigned long to convert
+ * @param string [out] String to store
+ * @param len [in/out] in: length of the buffer; out: length of the converted string
+ * @param radix Base of value; must be in the range 2 - 36
+ * @return ESR_INVALID_ARGUMENT is string is null; ESR_BUFFER_OVERFLOW is string is not big enough to contain result
+ */
+PORTABLE_API ESR_ReturnCode lultostr(unsigned long value, LCHAR *string, size_t *len, int radix);
+
+/**
+ * @}
+ */
+
+#endif /* __LCHAR_H */
diff --git a/portable/include/PANSIFileImpl.h b/portable/include/PANSIFileImpl.h
new file mode 100644
index 0000000..372eb93
--- /dev/null
+++ b/portable/include/PANSIFileImpl.h
@@ -0,0 +1,134 @@
+/*---------------------------------------------------------------------------*
+ *  PANSIFileImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PANSIFILEIMPL_H
+#define __PANSIFILEIMPL_H
+
+
+
+#include "PFile.h"
+#include "PFileImpl.h"
+#ifdef USE_THREAD
+#include "ptrd.h"
+#endif
+
+/**
+ * Portable file, ANSI implementation.
+ */
+typedef struct PANSIFileImpl_t
+{
+  /**
+   * Superinterface.
+   */
+  PFileImpl Interface;
+  
+  /**
+   * Underlying file.
+   */
+  FILE* value;
+}
+PANSIFileImpl;
+
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileCreateImpl(const LCHAR* filename, ESR_BOOL isLittleEndian, PFile** self);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileDestroyImpl(PFile* self);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileOpenImpl(PFile* self, const LCHAR* mode);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileCloseImpl(PFile* self);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileReadImpl(PFile* self, void* buffer, size_t size, size_t* count);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileWriteImpl(PFile* self, void* buffer, size_t size, size_t* count);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileFlushImpl(PFile* self);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSeekImpl(PFile* self, long offset, int origin);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileGetPositionImpl(PFile* self, size_t* position);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileIsOpenImpl(PFile* self, ESR_BOOL* isOpen);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileIsEOFImpl(PFile* self, ESR_BOOL* isEof);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileIsErrorSetImpl(PFile* self, ESR_BOOL* isError);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileClearErrorImpl(PFile* self);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileVfprintfImpl(PFile* self, int* result, const LCHAR* format, va_list args);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileFgetcImpl(PFile* self, LINT* result);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileFgetsImpl(PFile* self, LCHAR* string, int n, LCHAR** result);
+
+/**
+ * ANSI implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileHideMemoryAllocation(PFile* self);
+
+#endif /* __PANSIFILEIMPL_H */
diff --git a/portable/include/PANSIFileSystem.h b/portable/include/PANSIFileSystem.h
new file mode 100644
index 0000000..2a409a3
--- /dev/null
+++ b/portable/include/PANSIFileSystem.h
@@ -0,0 +1,156 @@
+/*---------------------------------------------------------------------------*
+ *  PANSIFileSystem.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PANSIFILESYSTEM_H
+#define __PANSIFILESYSTEM_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+#include "PFileSystem.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup PANSIFileSystemModule PANSIFileSystem API functions
+ * Portable file-system API.
+ *
+ * Must call pmemInit() before using this module.
+ * If threads are to be used, ptrdInit() must be called before using this module as well.
+ *
+ * NOTE: It is technically impossible to provide a cross-platform version of scanf() and its
+ *       variants (since vscanf() does not exist). As a result, this module does not provide this
+ *       functionality. End-users are encourages to do their own parsing.
+ *
+ * @{
+ */
+
+/**
+ * Portable ANSI file-system.
+ */
+typedef struct PANSIFileSystem_t
+{
+  /**
+   * Superinterface.
+   */
+  PFileSystem super;
+  
+  /**
+   * Mounts an ANSI path.
+   *
+   * For example, if "c:/" is mounted as "/dev/c", then any file referenced under "/dev/c" will access
+   * "c:/" under the hood.
+   *
+   * @param self PFileSystem handle
+   * @param virtualPath PFileSystem path
+   * @param realPath ANSI path
+   * @return ESR_INVALID_ARGUMENT if self or virtualPath or realPath is null or realPath is not a valid path;
+   * ESR_OUT_OF_MEMORY if the system is out of memory; ESR_IDENTIFIER_COLLISION if virtualPath is already mounted.
+   */
+  ESR_ReturnCode(*addPath)(PFileSystem* self, const LCHAR* virtualPath, const LCHAR* realPath);
+  
+  /**
+   * Deassociates the file-system from a base path.
+   *
+   * @param self PFileSystem handle
+   * @param virtualPath PFileSystem path
+   * @return ESR_INVALID_ARGUMENT if self or virtualPath is null or virtualPath is not mounted
+   */
+  ESR_ReturnCode(*removePath)(PFileSystem* self, const LCHAR* virtualPath);
+  /**
+   * Returns the current working directory from the operating-system's point of view.
+   * This differs from PFileSystemGetcwd() in that the latter returns the current working
+   * directory on the virtual file-system while this function returns the native working directory.
+   *
+   * @param self PFileSystem handle
+   * @param cwd [out] Current working directory
+   * @param len [in/out] Length of path argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+   * @return ESR_INVALID_ARGUMENT if self or cwd is null; ESR_BUFFER_OVERFLOW if cwd is not large enough to contain result;
+   * ESR_INVALID_STATE if operating-system returns unexpected value.
+   */
+  ESR_ReturnCode(*getcwd)(PFileSystem* self, LCHAR* cwd, size_t* len);
+}
+PANSIFileSystem;
+
+/**
+ * Initializes the ANSI file-system module.
+ *
+ * @return ESR_OUT_OF_MEMORY if system is out of memory; ESR_INVALID_STATE if mutex could not be created or if this
+ * function is called after the Ptrd module has been shut down.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemCreate(void);
+
+/**
+ * Shuts down the ANSI file-system module.
+ *
+ * @return ESR_SUCCESS
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemDestroy(void);
+
+/**
+ * Mounts an ANSI path.
+ *
+ * For example, if "c:/" is mounted as "/dev/c", then any file referenced under "/dev/c" will access
+ * "c:/" under the hood.
+ *
+ * @param virtualPath PFileSystem path
+ * @param realPath ANSI path
+ * @return ESR_INVALID_ARGUMENT if self or virtualPath or realPath is null or realPath is not a valid path;
+ * ESR_OUT_OF_MEMORY if the system is out of memory; ESR_IDENTIFIER_COLLISION if virtualPath is already mounted.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemAddPath(const LCHAR* virtualPath, const LCHAR* realPath);
+
+/**
+ * Deassociates the file-system from a base path.
+ *
+ * @param virtualPath PFileSystem path
+ * @return ESR_INVALID_ARGUMENT if self or virtualPath is null or virtualPath is not mounted
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemRemovePath(const LCHAR* virtualPath);
+
+/**
+ * Returns a virtual path associated with the current ANSI directory.
+ *
+ * For example, if "/dev/ansi" is mapped to "/" and the current ANSI directory is "/usr/bin" then
+ * this function will return "/dev/ansi/usr/bin".
+ *
+ * If multiple virtual paths correspond to the current ANSI directory, the first one will be returned.
+ *
+ * @param cwd [out] Current working directory
+ * @param len [in/out] Length of path argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if self or cwd is null; ESR_BUFFER_OVERFLOW if cwd is not large enough to contain result;
+ * ESR_INVALID_STATE if operating-system returns unexpected value.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemGetcwd(LCHAR* cwd, size_t* len);
+
+/**
+ * Indicates if this file-system should act as the default file-system.
+ * If a path is specified which does not match any other file-system, it is resolved using this one.
+ *
+ * @param isDefault True if the file-system should be the default file-system
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemSetDefault(ESR_BOOL isDefault);
+
+/**
+ * @}
+ */
+#endif /* __PANSIFILESYSTEM_H */
diff --git a/portable/include/PANSIFileSystemImpl.h b/portable/include/PANSIFileSystemImpl.h
new file mode 100644
index 0000000..2d14e75
--- /dev/null
+++ b/portable/include/PANSIFileSystemImpl.h
@@ -0,0 +1,113 @@
+/*---------------------------------------------------------------------------*
+ *  PANSIFileSystemImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PANSIFILESYSTEMIMPL_H
+#define __PANSIFILESYSTEMIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+#include "PANSIFileSystem.h"
+#include "phashtable.h"
+
+/**
+ * Portable file-system implementation.
+ */
+typedef struct PANSIFileSystemImpl_t
+{
+  /**
+   * Superinterface.
+   */
+  PANSIFileSystem super;
+  
+  /**
+   * [virtualPath, realPath] mapping.
+   */
+  PHashTable* directoryMap;
+}
+PANSIFileSystemImpl;
+
+
+/**
+ * ANSI file system, singleton instance.
+ */
+PORTABLE_API PFileSystem* PANSIFileSystemSingleton;
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemDestroyImpl(PFileSystem* self);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemCreatePFileImpl(PFileSystem* self, const LCHAR* path, ESR_BOOL littleEndian, PFile** file);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemAddPathImpl(PFileSystem* self, const LCHAR* virtualPath, const LCHAR* realPath);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemRemovePathImpl(PFileSystem* self, const LCHAR* virtualPath);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemMkdirImpl(PFileSystem* self, const LCHAR* path);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemChdirImpl(PFileSystem* self, const LCHAR* path);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemGetcwdImpl(PFileSystem* self, LCHAR* cwd, size_t* len);
+
+/**
+ * Given a virtual-path, convert it to a real-path.
+ *
+ * @param self PFileSystem handle
+ * @param path Virtual-path
+ * @param len [out] Size of path argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemGetRealPathImpl(PFileSystem* self, LCHAR* path, size_t* len);
+
+/**
+ * Given a real-path, convert it to a virtual-path.
+ *
+ * @param self PFileSystem handle
+ * @param path Real path
+ * @param len [out] Size of path argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ */
+PORTABLE_API ESR_ReturnCode PANSIFileSystemGetVirtualPathImpl(PFileSystem* self, LCHAR* path, size_t* len);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemShutdownStreams(void);
+
+#endif /* __PANSIFILESYSTEMIMPL_H */
diff --git a/portable/include/PFile.h b/portable/include/PFile.h
new file mode 100644
index 0000000..1ae8605
--- /dev/null
+++ b/portable/include/PFile.h
@@ -0,0 +1,597 @@
+/*---------------------------------------------------------------------------*
+ *  PFile.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PFILE_H
+#define __PFILE_H
+
+
+
+#include <stdarg.h>
+#include <stddef.h>
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+#include "ptypes.h"
+#include "pstdio.h"
+
+
+/**
+ * @addtogroup PFileModule PFile API functions
+ * Portable file API.
+ *
+ * Must call pmemInit() before using this module.
+ * If threads are to be used, ptrdInit() must be called before using this module as well.
+ *
+ * NOTE: It is technically impossible to provide a cross-platform version of scanf() and its
+ *       variants (since vscanf() does not exist). As a result, this module does not provide this
+ *       functionality. End-users are encourages to do their own parsing.
+ *
+ * @{
+ */
+
+#define USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS        1
+
+
+#ifdef USE_NARROW_CHAR
+
+/**
+ * Portable EOF constant
+ */
+#define PEOF EOF
+
+#else
+
+/**
+* Portable EOF constant
+*/
+#define PEOF WEOF
+
+#endif /* USE_NARROW_CHAR */
+
+/**
+ * Portable file.
+ */
+
+#ifdef USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS
+
+typedef FILE PFile;
+
+#else
+typedef struct PFile_t
+{
+  /**
+  * Closes the PFile and destroys it.
+  *
+  * @param self PFile handle
+  * @return ESR_INVALID_ARGUMENT if self is null
+  */
+  ESR_ReturnCode(*destroy)(struct PFile_t* self);
+
+  
+  ESR_ReturnCode(*open)(struct PFile_t* self, const LCHAR* mode);
+
+  /**
+   * Closes a PFile.
+   *
+   * @param self PFile handle
+    * @return ESR_CLOSE_ERROR if file cannot be closed
+   */
+  ESR_ReturnCode(*close)(struct PFile_t* self);
+
+  /**
+   * Reads from a PFile.
+   *
+   * @param self PFile handle
+   * @param buffer Storage location for data
+   * @param size Item size in bytes
+   * @param count [in/out] Maximum number of items to be read. On output, contains the
+   *              number of full items actually read, which may be less than count if
+   *              an error occurs or if the end of the file is encountered before reaching
+   *              count.
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_READ_ERROR if a reading error occurs
+   */
+  ESR_ReturnCode(*read)(struct PFile_t* self, void* buffer, size_t size, size_t* count);
+
+  /**
+   * Writes data to a PFile.
+   *
+   * @param self PFile handle
+   * @param buffer Pointer to data to be written
+   * @param size Item size in bytes
+   * @param count [in/out] Maximum number of items to be read. On output, contains the
+   *              number of full items actually written, which may be less than count if
+   *              an error occurs.
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_WRITE_ERROR if a writing error occurs
+   */
+  ESR_ReturnCode(*write)(struct PFile_t* self, void* buffer, size_t size, size_t* count);
+
+  /**
+   * Flushes a PFile.
+   *
+   * @param self PFile handle
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_FLUSH_ERROR if a flushing error occurs
+   */
+  ESR_ReturnCode(*flush)(struct PFile_t* self);
+
+  /**
+   * Flushes a PFile.
+   *
+   * @param self PFile handle
+   * @param offset Number of bytes from <code>origin</code>
+   * @param origin Initial position
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_SEEK_ERROR if a seeking error occurs
+   */
+  ESR_ReturnCode(*seek)(struct PFile_t* self, long offset, int origin);
+
+  /**
+   * Gets the current position of a PFile.
+   *
+   * @param self PFile handle
+   * @param position [out] The position
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if an internal error occurs
+   */
+  ESR_ReturnCode(*getPosition)(struct PFile_t* self, size_t* position);
+
+  /**
+   * Indicates if the PFile is open.
+   *
+   * @param self PFile handle
+   * @param isOpen [out] True if file is open
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isOpen)(struct PFile_t* self, ESR_BOOL* isOpen);
+
+  /**
+   * Indicates if the PFile is at the end of file.
+   *
+   * @param self PFile handle
+   * @param isEof [out] True if end of file has been reached
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isEOF)(struct PFile_t* self, ESR_BOOL* isEof);
+
+  /**
+   * Returns filename associated with PFile.
+   *
+   * @param self PFile handle
+   * @param filename [out] The filename
+   * @param len [in/out] Length of filename argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+   * @return ESR_INVALID_ARGUMENT if self or filename are null; ESR_BUFFER_OVERFLOW if buffer is too small
+   * to contain results
+    */
+  ESR_ReturnCode(*getFilename)(struct PFile_t* self, LCHAR* filename, size_t* len);
+
+  /**
+   * Indicates if the error-flag is set in the PFile. This functionality is provided solely
+   * for backwards-compatibility reasons with ANSI-C ferror().
+   *
+   * @param self PFile handle
+   * @param isError [out] True if the error-flag is set
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isErrorSet)(struct PFile_t* self, ESR_BOOL* isError);
+
+  /**
+   * Clears the error-flag in the PFile. This functionality is provided solely
+   * for backwards-compatibility reasons with ANSI-C ferror().
+   *
+   * @param self PFile handle
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*clearError)(struct PFile_t* self);
+
+  /**
+   * vfprintf() implementation for PFile.
+   *
+   * @param self PFile handle
+   * @param result Function result
+   * @param format see vfprintf()
+   * @param args see vfprintf()
+   * @return see vfprintf()
+   */
+  ESR_ReturnCode(*vfprintf)(struct PFile_t* self, int* result, const LCHAR* format, va_list args);
+  /**
+   * fgetc() implementation for PFile.
+   * In case the underlying function returns an error, it will be propegated by the wrapper.
+   *
+   * @param self PFile handle
+   * @param result Function result
+   * @return see fgetc()
+   */
+  ESR_ReturnCode(*fgetc)(struct PFile_t* self, LINT* result);
+  /**
+   * fgets() implementation for PFile.
+   * In case the underlying function returns an error, it will be propegated by the wrapper.
+   *
+   * @param self PFile handle
+   * @param string See fgets()
+   * @param n See fgets()
+   * @param result Function result
+   * @return see fgets()
+   */
+  ESR_ReturnCode(*fgets)(struct PFile_t* self, LCHAR* string, int n, LCHAR** result);
+  /**
+   * Hide the memory footprint of this object from the PMemory module.
+   *
+   * NOTE: Because this function may be called by PMemory on shutdown,
+   *       no PLog (which is shutdown before PMemory) functions should
+   *       be used.
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*hideMemoryAllocation)(struct PFile_t* self);
+}
+PFile;
+
+#endif
+
+
+
+/*
+ * Expose functions only if use wrappers is not defined, otherwize only expose wrapper functions.
+ */
+
+#ifndef USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS
+
+/**
+ * Closes the PFile and destroys it.
+ *
+ * @param self PFile handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode PFileDestroy(PFile* self);
+
+
+PORTABLE_API ESR_ReturnCode PFileOpen(PFile* self, const LCHAR* mode);
+
+/**
+ * Closes a PFile.
+ *
+ * @param self PFile handle
+ * @return ESR_CLOSE_ERROR if file cannot be closed
+ */
+PORTABLE_API ESR_ReturnCode PFileClose(PFile* self);
+
+/**
+ * Reads from a PFile.
+ *
+ * @param self PFile handle
+ * @param buffer Storage location for data
+ * @param size Item size in bytes
+ * @param count [in/out] Maximum number of items to be read. On output, contains the
+ *              number of full items actually read, which may be less than count if
+ *              an error occurs or if the end of the file is encountered before reaching
+ *              count.
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_READ_ERROR if a reading error occurs
+ */
+PORTABLE_API ESR_ReturnCode PFileRead(PFile* self, void* buffer, size_t size, size_t* count);
+
+/**
+ * Writes data to a PFile.
+ *
+ * @param self PFile handle
+ * @param buffer Pointer to data to be written
+ * @param size Item size in bytes
+ * @param count [in/out] Maximum number of items to be read. On output, contains the
+ *              number of full items actually written, which may be less than count if
+ *              an error occurs.
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_WRITE_ERROR if a writing error occurs
+ */
+PORTABLE_API ESR_ReturnCode PFileWrite(PFile* self, void* buffer, size_t size, size_t* count);
+
+/**
+ * Flushes a PFile.
+ *
+ * @param self PFile handle
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_FLUSH_ERROR if a flushing error occurs
+ */
+PORTABLE_API ESR_ReturnCode PFileFlush(PFile* self);
+
+/**
+ * Flushes a PFile.
+ *
+ * @param self PFile handle
+ * @param offset Number of bytes from <code>origin</code>
+ * @param origin Initial position
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_SEEK_ERROR if a seeking error occurs
+ */
+PORTABLE_API ESR_ReturnCode PFileSeek(PFile* self, long offset, int origin);
+
+/**
+ * Gets the current position of a PFile.
+ *
+ * @param self PFile handle
+ * @param position [out] The position
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if an internal error occurs
+ */
+PORTABLE_API ESR_ReturnCode PFileGetPosition(PFile* self, size_t* position);
+
+/**
+ * Indicates if the PFile is open.
+ *
+ * @param self PFile handle
+ * @param isOpen [out] True if file is open
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode PFileIsOpen(PFile* self, ESR_BOOL* isOpen);
+
+
+/**
+ * Indicates if the PFile is at the end of file.
+ *
+ * @param self PFile handle
+ * @param isEof [out] True if end of file has been reached
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode PFileIsEOF(PFile* self, ESR_BOOL* isEof);
+
+/**
+ * Indicates if the error-flag is set in the PFile. This functionality is provided solely
+ * for backwards-compatibility reasons with ANSI-C ferror().
+ *
+ * @param self PFile handle
+ * @param isError [out] True if the error-flag is set
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode PFileIsErrorSet(PFile* self, ESR_BOOL* isError);
+
+/**
+ * Clears the error-flag in the PFile. This functionality is provided solely
+ * for backwards-compatibility reasons with ANSI-C ferror().
+ *
+ * @param self PFile handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode PFileClearError(PFile* self);
+
+/**
+ * fprintf() implementation for PFile.
+ *
+ * @param self PFile handle
+ * @param result Function result
+ * @param format see fprintf()
+ * @param args see fprintf()
+ * @return see fprintf()
+ */
+PORTABLE_API ESR_ReturnCode PFileFprintf(PFile* self, int* result, const LCHAR* format, va_list args);
+
+/**
+ * vfprintf() implementation for PFile.
+ *
+ * @param self PFile handle
+ * @param result Function result
+ * @param format see vfprintf()
+ * @param args see vfprintf()
+ * @return see vfprintf()
+ */
+PORTABLE_API ESR_ReturnCode PFileVfprintf(PFile* self, int* result, const LCHAR* format, va_list args);
+/**
+ * fgetc() implementation for PFile.
+ *
+ * @param self PFile handle
+ * @param result Function result
+ * @return see fgetc()
+ */
+PORTABLE_API ESR_ReturnCode PFileFgetc(PFile* self, LINT* result);
+/**
+ * fgets() implementation for PFile.
+ *
+ * @param self PFile handle
+ * @param string See fgets()
+ * @param n See fgets()
+ * @param result Function result
+ * @return see fgets()
+ */
+PORTABLE_API ESR_ReturnCode PFileFgets(PFile* self, LCHAR* string, int n, LCHAR** result);
+
+/**
+ * Reads an integer from the PFile.
+ *
+ * @param self PFile handle
+ * @param value [out] Integer that was read
+ * @return ESR_READ_ERROR if a reading error occurs; ESR_SEEK_ERROR if a seeking error occurs;
+ * ESR_INVALID_STATE if no EOF is reached before an integer
+ */
+PORTABLE_API ESR_ReturnCode PFileReadInt(PFile* self, int* value);
+
+/**
+ * Reads a string token from the PFile.
+ *
+ * @param self PFile handle
+ * @param value [out] String that was read
+ * @param len Size of value argument.
+ * @return ESR_BUFFER_OVERFLOW if the value argument is too small; ESR_READ_ERROR if a reading error occurs;
+ * ESR_SEEK_ERROR if a seeking error occurs; ESR_INVALID_STATE if no EOF is reached before an LCHAR*
+ */
+PORTABLE_API ESR_ReturnCode PFileReadLCHAR(PFile* self, LCHAR* value, size_t len);
+
+/**
+ * Returns filename associated with PFile.
+ *
+ * @param self PFile handle
+ * @param filename [out] The filename
+ * @param len [in/out] Length of filename argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if self or filename are null; ESR_BUFFER_OVERFLOW if buffer is too small
+ * to contain results
+ */
+PORTABLE_API ESR_ReturnCode PFileGetFilename(PFile* self, LCHAR* filename, size_t* len);
+
+#endif /* USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS */
+
+/**
+ * Backwards compatible fopen().
+ *
+ * @param filename See fopen()
+ * @param mode See fopen()
+ * @return see fopen()
+ */
+PORTABLE_API PFile* pfopen(const LCHAR* filename, const LCHAR* mode);
+
+/**
+ * Backwards compatible fread().
+ *
+ * @param buffer See fread()
+ * @param size See fread()
+ * @param count See fread()
+ * @param stream See fread()
+ * @return see fread()
+ */
+PORTABLE_API size_t pfread(void* buffer, size_t size, size_t count, PFile* stream);
+
+/**
+ * Backwards compatible fwrite().
+ *
+ * @param buffer See fwrite()
+ * @param size See fwrite()
+ * @param count See fwrite()
+ * @param stream See fwrite()
+ * @return see fwrite()
+ */
+PORTABLE_API size_t pfwrite(void* buffer, size_t size, size_t count, PFile* stream);
+
+/**
+ * Backwards compatible fclose().
+ *
+ * @param stream See fclose()
+ * @return see fclose()
+ */
+PORTABLE_API int pfclose(PFile* stream);
+
+/**
+ * Backwards compatible rewind()
+ *
+ * @param stream See rewind()
+ * @return see rewind()
+ */
+PORTABLE_API void prewind(PFile* stream);
+
+/**
+ * Backwards compatible fseek().
+ *
+ * @param stream See fseek()
+ * @param offset See fseek()
+ * @param origin See fseek()
+ * @return see fseek()
+ */
+PORTABLE_API int pfseek(PFile* stream, long offset, int origin);
+
+/**
+ * Backwards compatible ftell().
+ *
+ * @param stream See ftell()
+ * @return see ftell()
+ */
+PORTABLE_API long pftell(PFile* stream);
+
+/**
+ * Backwards compatible fgets().
+ *
+ * @param string See fgets()
+ * @param n See fgets()
+ * @param stream See fgets()
+ * @return see fgets()
+ */
+PORTABLE_API LCHAR* pfgets(LCHAR* string, int n, PFile* stream);
+
+/**
+ * Backwards compatible feof().
+ *
+ * @param stream See feof()
+ * @return see feof()
+ */
+PORTABLE_API int pfeof(PFile* stream);
+
+/**
+ * Backwards compatible ferror().
+ *
+ * @param stream See ferror()
+ * @return see ferror()
+ */
+PORTABLE_API int pferror(PFile* stream);
+
+/**
+ * Backwards compatible clearerr().
+ *
+ * @param stream See clearerr()
+ */
+PORTABLE_API void pclearerr(PFile* stream);
+
+/**
+ * Backwards compatible fgetc().
+ *
+ * @param stream See clearerr()
+ * @return see clearerr()
+ */
+PORTABLE_API LINT pfgetc(PFile* stream);
+
+/**
+ * Backwards compatible fflush().
+ *
+ * @param stream See fflush()
+ * @return see fflush()
+ */
+PORTABLE_API int pfflush(PFile* stream);
+
+/**
+ * Backwards compatible vfprintf().
+ *
+ * @param stream See vfprintf()
+ * @param format See vfprintf()
+ * @param args See vfprintf()
+ * @return see vfprintf()
+ */
+PORTABLE_API int pvfprintf(PFile* stream, const LCHAR* format, va_list args);
+
+/**
+ * Backwards compatible fprintf().
+ *
+ * @param stream See fprintf()
+ * @param format See fprintf()
+ * @return see fprintf()
+ */
+PORTABLE_API int pfprintf(PFile* stream, const LCHAR* format, ...);
+
+/**
+ * Backwards compatible printf().
+ *
+ * @param format See printf()
+ * @return see printf()
+ */
+
+#ifndef USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS
+PORTABLE_API int pprintf(const LCHAR* format, ...);
+#endif
+
+/*
+ * The following are only defined when using pfile wrappers.
+ */
+
+#ifdef USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS
+PORTABLE_API ESR_ReturnCode pf_convert_backslashes_to_forwardslashes ( LCHAR *string_to_convert );
+PORTABLE_API ESR_ReturnCode pf_is_path_absolute ( const LCHAR* input_path, ESR_BOOL* isAbsolute );
+PORTABLE_API ESR_ReturnCode pf_make_dir ( const LCHAR* path );
+PORTABLE_API ESR_ReturnCode pf_get_cwd ( LCHAR* path, size_t *len );
+PORTABLE_API ESR_ReturnCode pf_change_dir ( const LCHAR* path );
+#endif
+
+/**
+ * @}
+ */
+#endif /* __PFILE_H */
diff --git a/portable/include/PFileImpl.h b/portable/include/PFileImpl.h
new file mode 100644
index 0000000..8e50514
--- /dev/null
+++ b/portable/include/PFileImpl.h
@@ -0,0 +1,82 @@
+/*---------------------------------------------------------------------------*
+ *  PFileImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PFILEIMPL_H
+#define __PFILEIMPL_H
+
+
+
+#include "PFile.h"
+#include "ptrd.h"
+
+/**
+ * Portable file implementation.
+ */
+typedef struct PFileImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  PFile Interface;
+  
+  /**
+   * File name relative to the file-system path.
+   */
+  LCHAR* filename;
+  
+  /**
+   * True if file is in little endian format.
+   */
+  ESR_BOOL littleEndian;
+  
+#ifdef USE_THREAD
+  /**
+   * Used to lock underlying file and provide atomic read/write operations.
+   */
+  PtrdMonitor* lock;
+#endif
+}
+PFileImpl;
+
+/**
+ * Initializes variables declared in the superinterface.
+ *
+ * @param self PFile handle
+ * @param filename Name of the file
+ * @param littleEndian True if file is little-endian
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode PFileCreateImpl(PFile* self, const LCHAR* filename, ESR_BOOL littleEndian);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PFileDestroyImpl(PFile* self);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PFileGetFilenameImpl(PFile* self, LCHAR* filename, size_t* len);
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PFileVfprintfImpl(PFile* self, int* result, const LCHAR* format, va_list args);
+
+#endif /* __PFILEIMPL_H */
diff --git a/portable/include/PFileSystem.h b/portable/include/PFileSystem.h
new file mode 100644
index 0000000..f98edab
--- /dev/null
+++ b/portable/include/PFileSystem.h
@@ -0,0 +1,225 @@
+/*---------------------------------------------------------------------------*
+ *  PFileSystem.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PFILESYSTEM_H
+#define __PFILESYSTEM_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+#include "PFile.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup PFileSystemModule PFileSystem API functions
+ * Portable file-system API.
+ *
+ * Must call pmemInit() before using this module.
+ * If threads are to be used, ptrdInit() must be called before using this module as well.
+ *
+ * @{
+ */
+
+/**
+ * Portable standard input.
+ */
+/*PORTABLE_API PFile* PSTDIN;*/
+/**
+ * Portable standard output.
+ */
+/*PORTABLE_API PFile* PSTDOUT;*/
+/**
+ * Portable standard error.
+ */
+/*PORTABLE_API PFile* PSTDERR;*/
+
+#define PSTDIN 	stdin
+#define PSTDOUT stdout
+#define PSTDERR stderr
+/**
+ * Portable file-system.
+ */
+typedef struct PFileSystem_t
+{
+  /**
+  * Destroys the PFileSystem.
+  *
+  * @param self PFileSystem handle
+  * @return ESR_INVALID_ARGUMENT if self is null
+  */
+  ESR_ReturnCode(*destroy)(struct PFileSystem_t* self);
+  
+  /**
+    * Creates a new PFile using this file-system.
+   *
+   * @param self PFileSystem handle
+   * @param path Fully qualified file path
+   * @param littleEndian True if file is in little-endian format
+   * @param file [out] Resulting PFile
+   */
+  ESR_ReturnCode(*createPFile)(struct PFileSystem_t* self, const LCHAR* path, ESR_BOOL littleEndian, PFile** file);
+  
+  /**
+   * Creates a new directory.
+   *
+   * @param self PFileSystem handle
+   * @param path Fully qualified directory path
+    * @return ESR_INVALID_ARGUMENT if path is null; ESR_IDENTIFIER_COLLISION if directory already exists;
+    * ESR_NO_MATCH_ERROR if parent directory does not exist; ESR_INVALID_STATE if an internal error occurs
+   */
+  ESR_ReturnCode(*mkdir)(struct PFileSystem_t* self, const LCHAR* path);
+  
+  /**
+   * Sets the current working directory.
+   *
+   * @param self PFileSystem handle
+   * @param path Fully qualified file path
+   * @return ESR_SUCCESS if change of directory is allowed
+   */
+  ESR_ReturnCode(*chdir)(struct PFileSystem_t* self, const LCHAR* path);
+}
+PFileSystem;
+
+
+/**
+ * Initializes the portable file-system module.
+ *
+ * @return ESR_INVALID_STATE if calling StackTraceCreate() fails (see its documentation for more detail).
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemCreate(void);
+
+/**
+ * Indicates if the portable file-system module is initialized.
+ *
+ * @param isCreated [in/out] True if the module is initialized.
+ * @return ESR_INVALID_ARGUMENT if isCreated is null
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemIsCreated(ESR_BOOL* isCreated);
+
+/**
+ * Shuts down the portable file-system module.
+ *
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemDestroy(void);
+
+/**
+ * Creates a new PFile using this file-system.
+ *
+ * @param path Fully qualified file path
+ * @param littleEndian True if file is in little-endian format
+ * @param file [out] Resulting PFile
+ * @return ESR_OUT_OF_MEMORY if system is out of memory; ESR_INVALID_STATE if mutex could not be created
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemCreatePFile(const LCHAR* path, ESR_BOOL littleEndian, PFile** file);
+
+/**
+ * Indicates if path is absolute.
+ *
+ * @param path Path to be processed
+ * @param isAbsolute True if path is absolute
+ * @return ESR_INVALID_ARGUMENT if path or isAbsolute are null
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemIsAbsolutePath(const LCHAR* path, ESR_BOOL* isAbsolute);
+
+/**
+ * Returns the canonical pathname string of this abstract pathname.
+ *
+ * A canonical pathname is both absolute and unique. The precise definition of canonical
+ * form is system-dependent. This method first converts this pathname to absolute form.
+ * This typically involves removing redundant names such as "." and ".." from the pathname,
+ * resolving symbolic links (on UNIX platforms), and converting drive letters to
+ * a standard case (on Microsoft Windows platforms).
+ *
+ * POST-CONDITION: Path will contain only canonical slashes
+ *
+ * @param path Path to process
+ * @param len [in/out] Length of path argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if path or len are null
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemGetAbsolutePath(LCHAR* path, size_t* len);
+
+/**
+ * Converts all slashes in path to '/'.
+ *
+ * @param path [in/out] Path to process
+ * @return ESR_INVALID_ARGUMENT if path is null
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemCanonicalSlashes(LCHAR* path);
+
+/**
+ * Returns parent directory of specified path.
+ * If the path ends with a filename, its directory is returned.
+ * If the path ends with a directory, its parent directory is returned.
+ *
+ * PRECONDITION: Directory names must end with '/'
+ *
+ * @param path [in/out] Path to process
+ * @param len [in/out] Length of path argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if path or len are null; ESR_BUFFER_OVERFLOW if path is too small to contain the result
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemGetParentDirectory(LCHAR* path, size_t* len);
+
+/**
+ * Creates a new directory.
+ *
+ * @param path Directory path
+ * @return ESR_INVALID_ARGUMENT if path is null; ESR_IDENTIFIER_COLLISION if directory already exists;
+ * ESR_NO_MATCH_ERROR if parent directory does not exist; ESR_INVALID_STATE if an internal error occurs
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemMkdir(const LCHAR* path);
+
+/**
+ * Returns the current working directory (always ends with '/').
+ *
+ * @param path [out] The current working directory
+ * @param len [in/out] Length of path argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if path or len are null; ESR_BUFFER_OVERFLOW if path is too small to contain the result
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemGetcwd(LCHAR* path, size_t* len);
+
+/**
+ * Sets the current working directory.
+ *
+ * @param path Fully qualified file path
+ * @return ESR_SUCCESS if change of directory is allowed
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemChdir(const LCHAR* path);
+
+/**
+ * Converts a linear path string to an array of path tokens.
+ * Tokens ending with a '/' denote a directory, otherwise they are a file.
+ *
+ * POST-CONDITION: The array is allocated internally, but must be freed by the caller.
+ *
+ * @param path Command-line string to parse
+ * @param tokenArray [out] The array used to hold the tokens
+ * @param count [out] The number of tokens found
+ * @return ESR_INVALID_ARGUMENT if path, tokenArray or count are null; ESR_OUT_OF_MEMORY if system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemLinearToPathTokens(const LCHAR* path, LCHAR*** tokenArray, size_t* count);
+
+/**
+ * @}
+ */
+#endif /* __PFILESYSTEM_H */
diff --git a/portable/include/PFileSystemImpl.h b/portable/include/PFileSystemImpl.h
new file mode 100644
index 0000000..0856867
--- /dev/null
+++ b/portable/include/PFileSystemImpl.h
@@ -0,0 +1,115 @@
+/*---------------------------------------------------------------------------*
+ *  PFileSystemImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PFILESYSTEMIMPL_H
+#define __PFILESYSTEMIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+#include "PFileSystem.h"
+#include "phashtable.h"
+
+/**
+ * Portable file-system implementation.
+ */
+typedef struct PFileSystemImpl_t
+{
+  /**
+   * Superinterface.
+   */
+  PFileSystem super;
+  
+}
+PFileSystemImpl;
+
+
+/**
+ * [file path, PFileSystem*] mapping.
+ */
+PORTABLE_API PHashTable* PFileSystemPathMap;
+
+/**
+ * Current working directory.
+ */
+PORTABLE_API LCHAR PFileSystemCurrentDirectory[P_PATH_MAX];
+
+/**
+ * Default implementation.
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemDestroyImpl(PFileSystem* self);
+
+/**
+ * Initialize PSTDIN, PSTDOUT, PSTDERR.
+ *
+ * @return ESR_OUT_OF_MEMORY if system is out of memory; ESR_INVALID_STATE if mutex could not be created or if this
+ * function is called after the Ptrd module has been shut down.
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemInitializeStreamsImpl(void);
+/**
+ * Shutdown PSTDIN, PSTDOUT, PSTDERR.
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemShutdownStreamsImpl(void);
+
+/**
+ * Associates a base path with the file system.
+ *
+ * For example, if "/dev/cdrom" is specified, then any file under that path
+ * must make use of this file-system.
+ *
+ * @param basePath Base path for files associated with this filesystem
+ * @return ESR_INVALID_ARGUMENT if self or virtualPath or realPath is null or realPath is not a valid path;
+ * ESR_OUT_OF_MEMORY if the system is out of memory; ESR_IDENTIFIER_COLLISION if virtualPath is already mounted.
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemAddPathImpl(PFileSystem* self, const LCHAR* basePath);
+
+/**
+ * Deassociates the file-system from a base path.
+ *
+ * @param self PFileSystem handle
+ * @param basePath Base path for files associated with this filesystem
+ * @return ESR_INVALID_ARGUMENT if self or virtualPath is null or virtualPath is not mounted
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemRemovePathImpl(PFileSystem* self, const LCHAR* basePath);
+
+/**
+ * Given a path, returns the associated file-system and relative path.
+ *
+ * @param path Path to look up
+ * @param fileSystem [out] File-system which matches the path
+ * @param relativePath [out] Relative path associated with match. Set to NULL if this value shouldn't be returned.
+ *                           Otherwise, the buffer must be of size P_PATH_MAX.
+ * @return ESR_INVALID_ARGUMENT if path, fileSystem or relativePath is null; ESR_INVALID_STATE if no
+ * file-system handles the path
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemGetFS(const LCHAR* path, PFileSystem** fileSystem, LCHAR* relativePath);
+
+/**
+ * Indicates if the specified path refers to a directory. This function does not actually
+ * try resolving the path using a file-system to see if it exists. The result is based purely on the contents
+ * of the string.
+ *
+ * @param path Path to look up
+ * @param isDirectory [out] TRUE if path refers to a directory
+ * @return ESR_INVALID_ARGUMENT if path or isDirectory is null
+ */
+PORTABLE_API ESR_ReturnCode PFileSystemIsDirectoryPath(const LCHAR* path, ESR_BOOL* isDirectory);
+
+#endif /* __PFILESYSTEMIMPL_H */
diff --git a/portable/include/PStackSize.h b/portable/include/PStackSize.h
new file mode 100644
index 0000000..cd68d98
--- /dev/null
+++ b/portable/include/PStackSize.h
@@ -0,0 +1,42 @@
+/*---------------------------------------------------------------------------*
+ *  PStackSize.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PSTACKSIZE_H
+#define PSTACKSIZE_H
+
+#include "PortPrefix.h"
+
+
+
+/**
+ * Initialize the stack base.  This should be done in the main() function.
+ * Note that the local variables of main() are not taken into account in the
+ * stack size computation.  To overcome this problem, rewrite main() as a
+ * simple function that first invokes PSTACK_SIZE_INIT and then invokes the
+ * original main().
+ */
+PORTABLE_API void PSTACK_SIZE_INIT();
+
+/**
+ * Computes the current stack size.  The returned value is the number of bytes
+ * in the stack.
+ */
+PORTABLE_API size_t PSTACK_SIZE_GET();
+
+#endif
diff --git a/portable/include/PStackTrace.h b/portable/include/PStackTrace.h
new file mode 100644
index 0000000..ce9fc4a
--- /dev/null
+++ b/portable/include/PStackTrace.h
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*
+ *  PStackTrace.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PSTACKTRACE_H
+#define __PSTACKTRACE_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+
+/**
+ * @addtogroup PStackTraceModule PStackTrace API functions
+ * Manipulates process stack-trace information.
+ *
+ * @{
+ */
+
+/**
+ * Maximum length of stack-trace string.
+ */
+#define P_MAX_STACKTRACE 4096
+
+/**
+ * Maximum length of function name.
+ */
+#define P_MAX_FUNCTION_NAME 80
+
+/**
+ * Creates a new StackTrace object.
+ *
+ * @return ESR_INVALID_STATE if 1) module is already in the middle of being initialized
+ * 2) module has already been initialized by another process 3) module fails to get the current directory
+ * 4) module cannot retrieve the name of the current executing module (DLL/EXE)
+ * 5) ESR_BUFFER_OVERFLOW if an internal buffer is too small 6) module cannot retrieve the current executing module
+ * listing 7) module cannot retrieve the symbol table 8) module cannot create a new monitor
+ */
+PORTABLE_API ESR_ReturnCode PStackTraceCreate(void);
+
+/**
+ * Indicates if the PStackTrace module is initialized.
+ *
+ * @param value True if the module is initialized
+ * @return ESR_INVALID_ARGUMENT is value is null; ESR_FATAL_ERROR if locking an internal mutex fails
+ */
+PORTABLE_API ESR_ReturnCode PStackTraceIsInitialized(ESR_BOOL* value);
+
+/**
+ * Returns the depth of the current stack trace (0-based).
+ *
+ * @param depth [out] The depth
+ * @return ESR_NOT_SUPPORTED if debug symbols are missing
+ */
+PORTABLE_API ESR_ReturnCode PStackTraceGetDepth(size_t* depth);
+
+/**
+ * Returns the current process stack-track.
+ *
+ * @param text [out] The resulting stack-trace text
+ * @param len [in/out] Size of text argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_NOT_SUPPORTED if debug symbols are missing
+ */
+PORTABLE_API ESR_ReturnCode PStackTraceGetValue(LCHAR* text, size_t* len);
+
+/**
+ * Returns the current function name.
+ *
+ * @param text [out] The resulting function text
+ * @param len [in/out] Size of text argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_NOT_SUPPORTED if debug symbols are missing
+ */
+PORTABLE_API ESR_ReturnCode PStackTraceGetFunctionName(LCHAR* text, size_t* len);
+
+/**
+ * Removes the deepest level of the stack-trace.
+ *
+ * @param text [in/out] The stack-trace string.
+ * @return ESR_SUCCESS
+ */
+PORTABLE_API ESR_ReturnCode PStackTracePopLevel(LCHAR* text);
+
+/**
+ * Destroys the stack trace object.
+ *
+ * @return ESR_SUCCESS
+ */
+PORTABLE_API ESR_ReturnCode PStackTraceDestroy(void);
+
+/**
+ * @}
+ */
+
+#endif /* __PSTACKTRACE_H */
diff --git a/portable/include/PortExport.h b/portable/include/PortExport.h
new file mode 100644
index 0000000..a5a3d7e
--- /dev/null
+++ b/portable/include/PortExport.h
@@ -0,0 +1,123 @@
+/*---------------------------------------------------------------------------*
+ *  PortExport.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PORT_EXPORT_H
+#define __PORT_EXPORT_H
+
+
+
+/* (1) Platform specific macro which handles symbol exports & imports.*/
+
+/* These macros are used if defining DLL import/export in the source file
+ * rather than through a .def file. */
+
+/**
+ * @addtogroup ESR_PortableModule ESR_Portable API functions
+ *
+ * @{
+ */
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+#ifdef _WIN32
+
+#ifndef HAS_INLINE
+#define HAS_INLINE
+#endif
+
+#ifdef __cplusplus
+
+#define PORT_EXPORT_DECL extern "C" __declspec(dllexport)
+#define PORT_IMPORT_DECL extern "C" __declspec(dllimport)
+
+#else /* not __cplusplus */
+
+#define PORT_EXPORT_DECL __declspec(dllexport)
+#define PORT_IMPORT_DECL __declspec(dllimport)
+#endif /* __cplusplus */
+
+#else /* not _WIN32 */
+
+#ifdef __cplusplus
+#define PORT_EXPORT_DECL extern "C"
+#define PORT_IMPORT_DECL extern "C"
+#else
+#define PORT_EXPORT_DECL extern
+#define PORT_IMPORT_DECL extern
+#endif /* __cplusplus */
+
+#endif /* _WIN32 */
+
+#if !defined(PORT_EXPORT_DECL) || !defined(PORT_IMPORT_DECL)
+#error Symbol import/export pair not defined.
+#endif
+
+#endif /* DOXYGEN_SHOULD_SKIP_THIS */
+
+/* If using a .def file on win32, use these macros. */
+#ifdef __cplusplus
+
+/**
+ * Exports C-style symbols; avoids name-mangling.
+ */
+#define EXTERN extern "C"
+#else
+
+/**
+* Exports C-style symbols; avoids name-mangling.
+*/
+#define EXTERN extern
+#endif
+
+#ifdef __cplusplus
+
+/**
+ * Portable 'inline' keyword
+ */
+#define PINLINE inline
+#elif defined(_WIN32)
+
+/**
+* Portable 'inline' keyword
+*/
+#define PINLINE _inline
+#elif defined(__GNUC__)
+
+/**
+* Portable 'inline' keyword
+*/
+#ifdef __vxworks
+#define PINLINE __inline__
+#else
+#define PINLINE	__inline__ 
+#endif
+
+#elif !defined(PINLINE)
+
+/**
+* Portable 'inline' keyword
+*/
+#define PINLINE
+#endif
+
+/**
+ * @}
+ */
+
+#endif 
diff --git a/portable/include/PortPrefix.h b/portable/include/PortPrefix.h
new file mode 100644
index 0000000..8018b27
--- /dev/null
+++ b/portable/include/PortPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  PortPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PORTPREFIX_H
+#define PORTPREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef PORTABLE_EXPORTS
+#define PORTABLE_API PORT_EXPORT_DECL
+#else
+#define PORTABLE_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/portable/include/pLastError.h b/portable/include/pLastError.h
new file mode 100644
index 0000000..042e2c7
--- /dev/null
+++ b/portable/include/pLastError.h
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*
+ *  pLastError.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PLASTERROR_H
+#define __PLASTERROR_H
+
+#include "LCHAR.h"
+#include "PortPrefix.h"
+
+#define printGetLastError(text) \
+  printGetLastErrorInternal(text, __FILE__, __LINE__)
+
+/**
+ * Retrieves a verbose error message associated with the result of GetLastError() and outputs it
+ * using PLogError (if available) or alternatively to PSTDERR.
+ *
+ * @param prefix A message to prefix the error message with.
+ */
+PORTABLE_API void printGetLastErrorInternal(const LCHAR* text, char* file, int line);
+
+#endif /* __PLASTERROR_H */
diff --git a/portable/include/passert.h b/portable/include/passert.h
new file mode 100644
index 0000000..befbcf0
--- /dev/null
+++ b/portable/include/passert.h
@@ -0,0 +1,71 @@
+/*---------------------------------------------------------------------------*
+ *  passert.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PASSERT_H
+#define PASSERT_H
+
+
+
+/**
+ * @addtogroup ESR_PortableModule ESR_Portable API functions
+ *
+ * @{
+ */
+
+#if defined(_WIN32) || defined(POSIX)
+/**
+ * Checks if platform supports ASSERT.
+ */
+#define HAS_ASSERT
+#endif
+
+#if defined(HAS_ASSERT)
+
+#include <assert.h>
+
+/**
+ * Portable assert().
+ */
+#define passert(exp) assert(exp)
+
+#elif defined(NDEBUG)
+
+#define passert(exp)
+
+#else
+
+/**
+* Portable assert().
+*/
+#define passert(exp) do { \
+    if (!(exp)) \
+    { \
+      pfprintf(PSTDERR, __FILE__ "(%d): " #exp " failed.\n",__LINE__); \
+      abort(); \
+    } \
+  } \
+  while(0)
+
+#endif  /* HAS_ASSERT */
+
+/**
+ * @}
+ */
+
+#endif 
diff --git a/portable/include/pcputimer.h b/portable/include/pcputimer.h
new file mode 100644
index 0000000..2a81ff0
--- /dev/null
+++ b/portable/include/pcputimer.h
@@ -0,0 +1,95 @@
+/*---------------------------------------------------------------------------*
+ *  pcputimer.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PCPUTIMER_H
+#define PCPUTIMER_H
+
+
+
+#include "PortPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup PCPUTimerModule PCPUTimer API functions
+ *
+ * @{
+ */
+
+/** Typedef */
+typedef struct PCPUTimer_t PCPUTimer;
+
+/**
+ * Creates a new timer object.
+ *
+ * @param timer PCPUTimer handle
+ * @return ESR_INVALID_ARGUMENT if timer is value it points to is null
+ */
+PORTABLE_API ESR_ReturnCode PCPUTimerCreate(PCPUTimer **timer);
+
+
+/**
+ * Destroys timer object.
+ *
+ * @param timer PCPUTimer handle
+ * @return ESR_INVALID_ARGUMENT if timer is null
+ */
+PORTABLE_API ESR_ReturnCode PCPUTimerDestroy(PCPUTimer *timer);
+
+/**
+ * Starts the timer. This sets the reference time from which all new elapsed
+ * time are computed.  This does not reset the elapsed time to 0.  This is
+ * useful to pause the timer.
+ *
+ * @return ESR_INVALID_ARGUMENT if timer is null; ESR_FATAL_ERROR if OS timer is available
+ */
+PORTABLE_API ESR_ReturnCode PCPUTimerStart(PCPUTimer *timer);
+
+/**
+ * Stops the timer.
+ *
+ * @return ESR_INVALID_ARGUMENT if timer is null; ESR_FATAL_ERROR if OS timer is available
+ */
+PORTABLE_API ESR_ReturnCode PCPUTimerStop(PCPUTimer *timer);
+
+/**
+ * Returns the timer elapsed time.  If the Timer is in the stopped state,
+ * successive calls to getElapsed() will always return the same value.  If the
+ * Timer is in the started state, successive calls will return the elapsed
+ * time since the last time PCPUTimerStart() was called.
+ *
+ * @return ESR_INVALID_ARGUMENT if timer or elapsed to is null; ESR_FATAL_ERROR if OS timer is available
+ */
+PORTABLE_API ESR_ReturnCode PCPUTimerGetElapsed(PCPUTimer *timer,
+    asr_uint32_t* elapsed);
+    
+/**
+ * Resets the elapsed time to 0 and resets the reference time of the Timer.
+ * This effectively reset the timer in the same state it was right after
+ * creation.
+ *
+ * @return ESR_INVALID_ARGUMENT if timer is null
+ */
+PORTABLE_API ESR_ReturnCode PCPUTimerReset(PCPUTimer *timer);
+
+/**
+ * @}
+ */
+
+
+#endif
diff --git a/portable/include/pcrc.h b/portable/include/pcrc.h
new file mode 100644
index 0000000..e82d8c3
--- /dev/null
+++ b/portable/include/pcrc.h
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*
+ *  pcrc.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PCRC_H
+#define PCRC_H
+
+
+
+#include "PortPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup PCRCModule PCRC API functions
+ *
+ * @{
+ */
+
+/**
+ * Computes the CRC-encoding of the block of data.
+ *
+ * @param data The data on which to compute the CRC
+ * @param size the size of the data.
+ * @return the CRC of the data.
+ */
+PORTABLE_API unsigned int pcrcComputeData(const void *data, unsigned int size);
+
+
+/**
+ * Computes the CRC-encoding of a string.
+ *
+ * @param str The string for which to compute the CRC
+ * @return the CRC of the string.
+ */
+PORTABLE_API unsigned int pcrcComputeString(const LCHAR *str);
+
+
+/**
+ * Initial value to pass to the pcrcUpdateData to ensist consistency with
+ * pcrcComputeData.
+ */
+#define CRC_INITIAL_VALUE (~0U)
+
+/**
+ * Updates the CRC when adding a new byte.
+ *
+ * @param crc The initial crc value.
+ * @param data datum to append to the crc
+ * @param size the size of the data.
+ * @return the new crc value.
+ */
+PORTABLE_API unsigned int pcrcUpdateData(unsigned int crc,
+    const void * data,
+    unsigned int size);
+    
+/**
+ * @}
+ */
+
+
+#endif 
diff --git a/portable/include/pendian.h b/portable/include/pendian.h
new file mode 100644
index 0000000..f92480e
--- /dev/null
+++ b/portable/include/pendian.h
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*
+ *  pendian.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PENDIAN_H
+#define PENDIAN_H
+
+
+
+#include "PortPrefix.h"
+#include "ptypes.h"
+
+#ifdef __sgi
+/*	*/#include <sys/endian.h>
+
+#elif defined(__sparc)
+/*	*/#include <sys/isa_defs.h>
+/*	*/#ifdef __LITTLE_ENDIAN
+/*	*//*	*/#define __LITTLE_ENDIAN 1234
+/*	*//*	*/#define __BYTE_ORDER __LITTLE_ENDIAN
+/*	*/#elif defined(_BIG_ENDIAN)
+/*	*//*	*/#define __BIG_ENDIAN 4321
+/*	*//*	*/#define __BYTE_ORDER __BIG_ENDIAN
+/*	*/#endif
+
+#elif defined(ANDROID)
+
+/*  */#ifdef HAVE_ENDIAN
+/*  */#include <endian.h>
+
+/*  */#elif defined(HAVE_LITTLE_ENDIAN)
+/*  *//*   */#define __LITTLE_ENDIAN 1234
+/*  *//*   */#define __BYTE_ORDER __LITTLE_ENDIAN
+
+/*  */#elif defined(HAVE_BIG_ENDIAN)
+/*  *//*   */#define __BIG_ENDIAN 4321
+/*  *//*   */#define __BYTE_ORDER __BIG_ENDIAN
+
+/*  */#endif
+
+#elif defined (__linux)
+/*	    */#include <endian.h>
+
+#elif defined(__FreeBSD__) || defined(_decunix_)
+/*	*/#include <machine/endian.h>
+
+#elif defined(__i386) || defined(_M_IX86)
+/*	*/#undef  __LITTLE_ENDIAN
+/*	*/#define __LITTLE_ENDIAN 1234
+/*	*/#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#elif defined(_sh4_)||defined(SH4)
+/*	*/#if defined (__vxworks)
+/*	*//*	*/#if _BYTE_ORDER == _LITTLE_ENDIAN   /* VxWorks defines _BYTE_ORDER and _LITTLE_ENDIAN */
+/*	*//*	*//*	*/#undef __LITTLE_ENDIAN
+/*	*//*	*//*	*/#define __LITTLE_ENDIAN  1234
+/*	*//*	*//*	*/#define __BYTE_ORDER  __LITTLE_ENDIAN
+/*	*//*	*/#elif _BYTE_ORDER == _BIG_ENDIAN    /* VxWorks defines _BYTE_ORDER and _BIG_ENDIAN */
+/*	*//*	*//*	*/#undef __BIG_ENDIAN
+/*	*//*	*//*	*/#define __BIG_ENDIAN  4321
+/*	*//*	*//*	*/#define __BYTE_ORDER  __BIG_ENDIAN
+/*	*//*	*/#else
+/*	*//*	*//*	*/#error
+/*	*//*	*/#endif
+/*	*/#else
+/*	*//*	*/#error "Could not determine endianness of the machine Unknown OS for SH4 Chip."
+/*	*/#endif
+
+#else
+/*	*/#error "Could not determine endianness of the machine Chip Not Known."
+#endif
+
+
+/**
+ * @addtogroup ESR_PortableModule ESR_Portable API functions
+ *
+ * @{
+ */
+
+/**
+ * Swaps bytes of each item in buffer.
+ *
+ * @param buffer Buffer containing items to swap.
+ * @param count Number of items to swap.
+ * @param itemSize Size of each items.
+ */
+PORTABLE_API void swap_byte_order(void *buffer,
+                                  size_t count,
+                                  size_t itemSize);
+                                  
+/**
+ * @}
+ */
+
+#endif 
diff --git a/portable/include/phashtable.h b/portable/include/phashtable.h
new file mode 100644
index 0000000..8e96dc5
--- /dev/null
+++ b/portable/include/phashtable.h
@@ -0,0 +1,283 @@
+/*---------------------------------------------------------------------------*
+ *  phashtable.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PHASHTABLE_H
+#define PHASHTABLE_H
+
+
+
+#include "PortPrefix.h"
+#include "ptypes.h"
+#include "ESR_ReturnCode.h"
+
+/**
+ * The default initial capacity of a hash table.
+ */
+#define PHASH_TABLE_DEFAULT_CAPACITY 11
+
+/**
+ *
+ * The default maximum load factor
+ */
+#define PHASH_TABLE_DEFAULT_MAX_LOAD_FACTOR (0.75f)
+
+/**
+ * Default hash function used for hashing keys.  The default function assumes
+ * the key is a 0-terminated LSTRING.
+ */
+#define PHASH_TABLE_DEFAULT_HASH_FUNCTION NULL
+
+/**
+ * Default compare function used for hashing keys.  The default function
+ * assumes the key are 0-terminated LSTRING and uses LSTRCMP.
+ */
+#define PHASH_TABLE_DEFAULT_COMP_FUNCTION NULL
+
+/**
+ * @addtogroup HashTableModule HashTable API functions
+ * Abstract hash table operations.  The keys of the Map are strings and values
+ * are plain void pointers.  The keys and values are only stored as pointers
+ * and it is the responsibility of the user to ensure proper memory management
+ * for the keys and values.
+ *
+ * The HashTable is implemented using an array of linked lists.  The capacity
+ * of the HashTable is the number of entries in this array.  The load factor
+ * of the HashTable is the ratio of the total number of entries in the table
+ * vs the capacity of the table.  The lower the load factor, the faster the
+ * look-up is.  However, a lower load factor calls for a bigger capacity,
+ * hence it increases the memory requirement.
+ *
+ * When the load factor exceeds the maximum load factor, the capacity of the
+ * hash table is increased and each entry is put in its new linked list based
+ * on the new capacity.
+ *
+ * @{
+ */
+
+/**
+ * Signature for hashing functions.
+ */
+typedef unsigned int(*PHashFunction)(const void *key);
+
+/**
+ * Signature for comparison functions.  Must return 0 if key1 is identical to
+ * key2 and non-zero otherwise.  The hash function and the comparison function
+ * are related in the sense that if the comparison function for two keys
+ * return 0, then the values returned by the hash function when given these
+ * keys as arguments must be equal.
+ */
+typedef int (*PHashCompFunction)(const LCHAR *key1, const LCHAR *key2);
+
+/** Typedef */
+typedef struct PHashTable_t PHashTable;
+/** Typedef */
+typedef struct PHashTableEntry_t PHashTableEntry;
+
+/**
+ * Structure specified to specify initialization parameters for the hash
+ * table.
+ */
+typedef struct PHashTableArgs_t
+{
+  /**
+   * Total capacity.
+   */
+  size_t capacity;
+  
+  /**
+   * Maximum load-factor before hashtable is rehashed.
+   */
+  float maxLoadFactor;
+  
+  /**
+   * Hashing function used to compute the hashcode of a key.
+   */
+  PHashFunction hashFunction;
+  
+  /**
+   * Function used to compare two keys.
+   */
+  PHashCompFunction compFunction;
+}
+PHashTableArgs;
+
+/**
+ * Creates an hash table.  The hash table is created with specified capacity
+ * and maximum load factor.
+ *
+ * @param hashArgs Specifies the arguments controlling the hashtable.  If
+ * NULL, all arguments are assumed to be the default value.  This value is
+ * copied. This is the responsibility of the caller to delete the
+ * HashTableArgs if required.
+ *
+ * @param memTag Memory tag to be used for the internal memory allocation
+ * calls.  Since this string is used by the memory allocation tag, it is not
+ * copied internally and it must remain valid for the lifetime of the hash
+ * table including the call to the HashTableDestroy function.  Most likely,
+ * this string is a static string or is allocated from the stack.
+ *
+ * @param hashtable A pointer to the returned hash table. This parameter may
+ * not be NULL.
+ * @return ESR_INVALID_ARGUMENT if hashArgs, or hashTable is null or
+ * hashArgs->maxLoadFactor <= 0; ESR_OUT_OF_MEMORY if system is out of memory
+ */
+PORTABLE_API ESR_ReturnCode PHashTableCreate(PHashTableArgs *hashArgs,
+    const LCHAR *memTag,
+    PHashTable **hashtable);
+    
+/**
+ * Destructor.  The keys and values need to be deleted (if necessary) before
+ * deleting the table to avoid memory leak.
+ *
+ * @param ESR_INVALID_ARGUMENT if hashtable is null
+ */
+PORTABLE_API ESR_ReturnCode PHashTableDestroy(PHashTable *hashtable);
+
+/**
+ * Retrieves the size (number of entries) of the hashtable.
+ *
+ * @return ESR_INVALID_ARGUMENT if hashtable or size is null
+ */
+PORTABLE_API ESR_ReturnCode PHashTableGetSize(PHashTable *hashtable,
+    size_t *size);
+    
+    
+/**
+ * Retrieves the value associated with a key.
+ *
+ * @param hashtable The hashtable
+ * @param key The key for which to retrieve the value.
+ * @param value The value associated with the key.
+ * @return If no match, ESR_NO_MATCH_ERROR is returned.
+ */
+PORTABLE_API ESR_ReturnCode PHashTableGetValue(PHashTable *hashtable,
+    const void *key, void **value);
+    
+/**
+ * Indicates if hashtable contains the specified key.
+ *
+ * @param hashtable The hashtable
+ * @param key The key for which to retrieve the value.
+ * @param exists [out] True if the key was found
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+PORTABLE_API ESR_ReturnCode PHashTableContainsKey(PHashTable *hashtable,
+    const void *key, ESR_BOOL* exists);
+/**
+ * Associates a value with a key.
+ *
+ * @param hashtable The hashtable
+ *
+ * @param key The key to associate a value with.
+ *
+ * @param value The value to associate with a key.
+ *
+ * @param oldValue If this pointer is non-NULL, it will be set to the
+ * value previously associated with the key.
+ * @return ESR_INVALID_STATE if hashtable is null
+ */
+PORTABLE_API ESR_ReturnCode PHashTablePutValue(PHashTable *hashtable,
+    const void *key,
+    const void *value,
+    void **oldValue);
+    
+/**
+ * Removes the value with associated with a key.  Note that calling this
+ * function might cause a leak in the event that the key needs to be deleted.
+ * In those situations, use PHashTableGetEntry, then retrieve the key by
+ * PHashTableEntryGetKeyValue, destroy the key and value and then use
+ * PHashTableEntryRemove.
+ *
+ * @param hashtable The hashtable
+ * @param key The key for which to remove the associated value.
+ * @param oldValue If this pointer is non-NULL, it will be set to the value
+ * previously associated with the key and that was removed.
+ * @return ESR_INVALID_ARGUMENT if hashtable is null
+ */
+PORTABLE_API ESR_ReturnCode PHashTableRemoveValue(PHashTable *hashtable,
+    const void *key,
+    void **oldValue);
+    
+/**
+ * Retrieves the hash entry corresponding to the key.
+ *
+ * @param hashtable The hashtable
+ * @param key The key for which to retrieve the hash entry.
+ * @param entry The entry associated with the key. Cannot be NULL.
+ * @return If no match, ESR_NO_MATCH_ERROR is returned.
+ */
+PORTABLE_API ESR_ReturnCode PHashTableGetEntry(PHashTable *hashtable,
+    const void *key,
+    PHashTableEntry **entry);
+    
+/**
+ * Returns the key and value associated with this entry.  Both key and values
+ * can be deleted after removing the entry from the table.
+ *
+ * @param entry The hashtable entry
+ * @param key If non-NULL, returns the key associated with the entry.
+ * @param value If non-NULL, returns the value associated with the entry.
+ * @return ESR_INVALID_ARGUMENT if entry is null
+ */
+PORTABLE_API ESR_ReturnCode PHashTableEntryGetKeyValue(PHashTableEntry *entry,
+    void **key,
+    void **value);
+    
+/**
+ * Sets the value associated with this entry.
+ *
+ * @param entry The hashtable entry.
+ * @param value The value to associate with the entry.
+ * @param oldValue If this pointer is non-NULL, it will be set to the value
+ * previously associated with this entry.
+ */
+PORTABLE_API ESR_ReturnCode PHashTableEntrySetValue(PHashTableEntry *entry,
+    const void *value,
+    void **oldValue);
+    
+/**
+ * Removes the entry from its hash table.
+ *
+ * POST-CONDITION: 'entry' variable is invalid
+ *
+ * @param entry The hashtable entry.
+ * @return ESR_INVALID_ARGUMENT if entry is null
+ */
+PORTABLE_API ESR_ReturnCode PHashTableEntryRemove(PHashTableEntry *entry);
+
+/**
+ * Resets the iterator at the beginning.
+ */
+PORTABLE_API
+ESR_ReturnCode PHashTableEntryGetFirst(PHashTable *table,
+                                       PHashTableEntry **entry);
+                                       
+/**
+ * Advance to the next entry in the hash table.
+ *
+ * @param entry the current entry.
+ * @return ESR_INVALID_ARGUMENT if entry or the value it points to is null.
+ */
+PORTABLE_API ESR_ReturnCode PHashTableEntryAdvance(PHashTableEntry** entry);
+
+/**
+ * @}
+ */
+
+#endif
diff --git a/portable/include/plog.h b/portable/include/plog.h
new file mode 100644
index 0000000..adff438
--- /dev/null
+++ b/portable/include/plog.h
@@ -0,0 +1,338 @@
+/*---------------------------------------------------------------------------*
+ *  plog.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PLOG_H
+#define PLOG_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "PortPrefix.h"
+#ifdef USE_STACKTRACE
+#include "PStackTrace.h"
+#endif
+#include "passert.h"
+#include "PFileSystem.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup PLogModule PLogger API functions
+ * Logging API.
+ *
+ * Must call pmemInit() before using this module.
+ *
+ * The logging API is composed of a Logger.
+ * A Logger is an object who implements an API to actually write log messages.
+ * The logging API uses the logger when logging is to be performed but does
+ * not depend on an actual implementation of this API.
+ *
+ * When a request for logging is performed, the current level of the logging
+ * API is compared with the current stack-trace level.  If the logger's log
+ * level is greater than or equal to the stack-trace level, then the
+ * message is being logged through the use of the Logger.  Otherwise, the
+ * message is not logged.  Setting the log level of the API to UINT_MAX is
+ * equivalent to unconditionally log all messages from all modules. Conversely,
+ * setting the log level of the API to 0 is equivalent to disabling logging globally.
+ *
+ * @{
+ */
+
+
+/**
+ * Portable logging framework.
+ */
+typedef struct PLogger_t
+{
+  /**
+   * Prints and formats a message to the log.
+   *
+   * @param self the Logger.
+   *
+   * @param format the format string specifying the next arguments (a la
+   * printf).
+   *
+   * @return ESR_SUCCESS if success, otherwise a status code indicating the
+   * nature of the error.
+   */
+  ESR_ReturnCode(*printf)(struct PLogger_t *self,
+                          const LCHAR *format, ...);
+                          
+  /**
+   * Flushes internal buffer.  This function can be left unimplemented if no
+   * buffering is performed by the logger.
+  
+   * @param self the Logger
+   *
+   * @return ESR_SUCCESS if success, otherwise a status code indicating the nature of the error.
+   */
+  ESR_ReturnCode(*flush)(struct PLogger_t *self);
+  
+  /**
+   * Destroys the logger.  This function is responsible to deallocate any
+   * resources used by the logger.  In particular, if buffering is internally
+   * used, it needs to flush the buffer.
+   */
+  void(*destroy)(struct PLogger_t *self);
+}
+PLogger;
+
+/**
+ * Type used to control output format.
+ */
+typedef asr_uint16_t LOG_OUTPUT_FORMAT;
+
+/**
+ * Specifies that no extra information is to be output.
+ */
+#define LOG_OUTPUT_FORMAT_NONE 0x0000
+
+/**
+ * Specifies that the date and time is to be output.
+ */
+#define LOG_OUTPUT_FORMAT_DATE_TIME 0x0001
+
+/**
+ * Specifies that thread id of thread generating the message is to be output.
+ */
+#define LOG_OUTPUT_FORMAT_THREAD_ID 0x0002
+
+/**
+ * Specifies that the module name of the module generating the message is to
+ * be output.
+ */
+#define LOG_OUTPUT_FORMAT_MODULE_NAME 0x0004
+
+/**
+ * Initializes the LOG library.  This function must be called before any
+ * logging can take place. PtrdInit() must be called before this function on
+ * platforms that support threads.
+ *
+ * @param logger The logger to be used to output the messages.  If NULL, then
+ * logging goes to PSTDERR.
+ *
+ * @param logLevel The level of logging requested.
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error. In particular, it returns ESR_INVALID_STATE if already
+ * initialized.
+ */
+PORTABLE_API ESR_ReturnCode PLogInit(PLogger *logger, unsigned int logLevel);
+
+/**
+ * Indicates if PLog module is initialized.
+ *
+ * @param isInit True if module is initialized
+ * @return ESR_INVALID_ARGUMENT if isLocked is null
+ */
+PORTABLE_API ESR_ReturnCode PLogIsInitialized(ESR_BOOL* isInit);
+
+/**
+ * Indicates if PLog module is locked inside a critical section. This is for internal use only.
+ *
+ * @param isLocked True if module is locked
+ * @return ESR_INVALID_ARGUMENT if isLocked is null
+ */
+PORTABLE_API ESR_ReturnCode PLogIsLocked(ESR_BOOL* isLocked);
+
+/**
+ * Shutdowns the LOG library.  Once this function is called, no logging
+ * activity can be performed.
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error.  In particular, it returns ESR_INVALID_STATE if not
+ * initialized or already shutted down.
+ */
+PORTABLE_API ESR_ReturnCode PLogShutdown(void);
+
+/**
+ * Sets the format of the logging messages.  If this function is never called,
+ * the default format is
+ *
+ * <code>LOG_OUTPUT_FORMAT_MODULE_NAME | LOG_OUTPUT_FORMAT_DATE_TIME</code>.
+ *
+ * @param format the format specification for new messages.
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error.
+ */
+PORTABLE_API ESR_ReturnCode PLogSetFormat(LOG_OUTPUT_FORMAT format);
+
+/**
+ * Gets the current log level of the LOG API.
+ *
+ * @param logLevel A pointer to where the log level is to be stored.  If NULL,
+ * the function returns ESR_INVALID_ARGUMENT.
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error.  In particular, it returns ESR_INVALID_STATE if the
+ * API is not initialized.
+ */
+PORTABLE_API ESR_ReturnCode PLogGetLevel(unsigned int *logLevel);
+
+
+/**
+ * Sets the current log level of the LOG API.
+ *
+ * @param logLevel The new log level.
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error.  In particular, it returns ESR_INVALID_STATE if the
+ * API is not initialized.
+ */
+PORTABLE_API ESR_ReturnCode PLogSetLevel(unsigned int logLevel);
+
+/**
+ * Conditionally Logs a message.  The message is logged only if module is enabled.
+ *
+ * @param msg The message format specification (ala printf).
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error.  In particular, it returns ESR_INVALID_STATE if
+ * the API is not initialized.
+ */
+PORTABLE_API ESR_ReturnCode PLogMessage(const LCHAR* msg, ...);
+
+/**
+ * Unconditionally logs an error message.
+ *
+ * @param msg The message format specification (ala printf).
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error.  In particular, it returns ESR_INVALID_STATE if
+ * the API is not initialized.
+ */
+PORTABLE_API ESR_ReturnCode PLogError(const LCHAR* msg, ...);
+
+
+/**
+ *
+ * Creates a logger that logs to a file.
+ *
+ * @param file The file to log to.
+ * @param logger logger handle receiving the created logger.
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error.
+ */
+PORTABLE_API ESR_ReturnCode PLogCreateFileLogger(PFile* file,
+    PLogger** logger);
+    
+/**
+ * Creates a logger that logs to a circular file.
+ *
+ * @param filename The name of the file to be created.
+ * @param maxsize The maximum number of bytes that the file may have.
+ * @param logger logger handle receiving the created logger.
+ *
+ * @return ESR_SUCCESS if success, otherwise a status code indicating the
+ * nature of the error.
+ */
+PORTABLE_API ESR_ReturnCode PLogCreateCircularFileLogger(const LCHAR* filename,
+    unsigned int maxsize,
+    PLogger** logger);
+    
+    
+    
+/**
+ * Runs a function, checks its return-code. In case of an error, logs it and jumps to
+ * the CLEANUP label.
+ */
+/* show more information for vxworks due to lack of stack trace */
+#define CHKLOG(rc, function) do { rc = (function); if (rc != ESR_SUCCESS) { PLogError("%s in %s:%d", ESR_rc2str(rc),  __FILE__, __LINE__); goto CLEANUP; } } while (0)
+/**
+ * Invokes the function with args and if it is not ESR_SUCCESS, logs and
+ * returns it.
+ *
+ * @param rc Used to store the function return value
+ * @param function Function name
+ * @param args Function arguments
+ */
+#define PLOG_CHKRC_ARGS(rc, function, args) do { if((rc = (function args)) != ESR_SUCCESS) { PLogError(ESR_rc2str(rc)); return rc; } } while (0)
+
+/**
+ * Checks the function return-code and if it is not ESR_SUCCESS, logs and
+ * returns it.
+ */
+#define PLOG_CHKRC(rc, function) do { rc = (function); if (rc != ESR_SUCCESS) { PLogError(rc); return rc; } } while (0)
+
+#if defined(_DEBUG) && !defined(ENABLE_PLOG_TRACE) && ENABLE_STACKTRACE
+#define ENABLE_PLOG_TRACE
+#endif
+
+/**
+ * Macro used to have logging enabled on debug build only.
+ */
+#ifdef ENABLE_PLOG_TRACE
+
+#define PLOG_DBG_ERROR(msg) ((void) (PLogError msg))
+/**
+ * Usage: PLOG_DBG_TRACE((printf-arguments))
+ *
+ * The reason we require double brackets is to allow the use of printf-style variable
+ * argument listings in a macro.
+ */
+#define PLOG_DBG_TRACE(args) ((void) (PLogMessage args))
+#define PLOG_DBG_BLOCK(block) block
+#define PLOG_DBG_API_ENTER() \
+  do \
+  { \
+    LCHAR text[P_MAX_FUNCTION_NAME]; \
+    size_t len = P_MAX_FUNCTION_NAME; \
+    ESR_ReturnCode rc; \
+    \
+    rc = PStackTraceGetFunctionName(text, &len); \
+    if (rc==ESR_SUCCESS) \
+      PLogMessage(L("%s entered."), text); \
+    else if (rc!=ESR_NOT_SUPPORTED) \
+      pfprintf(PSTDERR, L("[%s:%d] PStackTraceGetValue failed with %s\n"), __FILE__, __LINE__, ESR_rc2str(rc)); \
+  } while (0)
+
+#define PLOG_DBG_API_EXIT(rc) \
+  \
+  do \
+  { \
+    LCHAR text[P_MAX_FUNCTION_NAME]; \
+    size_t len = P_MAX_FUNCTION_NAME; \
+    ESR_ReturnCode rc2; \
+    \
+    rc2 = PStackTraceGetFunctionName(text, &len); \
+    if (rc2==ESR_SUCCESS) \
+      PLogMessage(L("%s returned %s"), text, ESR_rc2str(rc)); \
+    else if (rc!=ESR_NOT_SUPPORTED) \
+      pfprintf(PSTDERR, "[%s:%d] PStackTraceGetValue failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc2)); \
+  } while (0)
+
+#else
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+#define PLOG_DBG_ERROR(msg) ((void) 0)
+#define PLOG_DBG_MODULE(name, logLevel)
+#define PLOG_DBG_TRACE(args) ((void) 0)
+#define PLOG_DBG_BLOCK(block)
+#define PLOG_DBG_API_ENTER() ((void) 0)
+#define PLOG_DBG_API_EXIT(rc) ((void) 0)
+#endif /* DOXYGEN_SHOULD_SKIP_THIS */
+#endif /* ENABLE_PLOG_TRACE */
+
+/**
+ * @}
+ */
+
+
+#endif 
diff --git a/portable/include/pmalloc.h b/portable/include/pmalloc.h
new file mode 100644
index 0000000..8bd2f21
--- /dev/null
+++ b/portable/include/pmalloc.h
@@ -0,0 +1,113 @@
+/*---------------------------------------------------------------------------*
+ *  pmalloc.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+/* xalloc.h internal header */
+#ifndef _PMALLOC
+#define _PMALLOC
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#ifndef _STD
+#define _STD
+#endif
+#define _STD_BEGIN
+#define _STD_END
+
+  typedef unsigned int psize_t;
+  
+#ifndef DKoffsetof
+#define DKoffsetof(T, member) ((_STD psize_t)&(((T *)0)->member))
+#endif
+  
+  /* storage alignment properties */
+#define DK_AUPBND 1U /* even-byte boundaries (2^^1) */
+#define DK_ADNBND 1U
+#define DK_MEMBND 2U /* cts : 4 byte malloc boundaries (3 ==> 8 byte) */
+  
+#ifndef NULL
+#define NULL 0
+#endif
+  
+  _STD_BEGIN
+  /* macros */
+#define M_MASK ((1 << DK_MEMBND) - 1) /* rounds all sizes */
+#define CELL_OFF ((DKoffsetof(_Cell, _Next) + M_MASK) & ~M_MASK)
+#define SIZE_BLOCK   256   /* minimum block size, power of 2 */
+#define SIZE_CELL ((sizeof (_Cell) + M_MASK) & ~M_MASK)
+  /* type definitions */
+  typedef struct _Cell
+  {
+    psize_t _Size; /* CELL_OFF <= SIZE_CELL <= _Size */
+    struct _Cell *_Next; /* reused if CELL_OFF < SIZE_CELL */
+  }
+  _Cell;
+  typedef struct
+  {
+    _Cell **_Plast; /* null, or where to resume malloc scan */
+    _Cell *_Head; /* null, or lowest addressed free cell */
+  }
+  _Altab;
+  /* declarations */
+  
+  void *_Getmem(psize_t);
+  extern _Altab _Aldata; /* free list initially empty */
+  
+#if _INTELx86
+  /* #define _PTR_NORM(p) (void __huge *)(p) should have worked */
+#define _PTR_NORM(p) \
+  ( (((unsigned long)(p) & 0xFFFF0000L)>>12) \
+    + ((unsigned long)(p) & 0xFFFFL) )
+#else
+#define _PTR_NORM(p) (p)
+#endif
+  
+  
+#if DEBUG
+  int _OK_Cell(_Cell *p);
+  int _OK_Altab(_Altab *p);
+  void _UPD_Altab(psize_t d_heap, psize_t d_alloc, psize_t d_free);
+#else
+#define _OK_Cell(p) (void)0
+#define _OK_Altab(p) (void)0
+#define _UPD_Altab(d_heap, d_alloc, d_free) (void)0
+#endif /*DEBUG*/
+  _STD_END
+  
+  /* function prototypes */
+  void    PortMallocSetPoolSize(psize_t size);
+  psize_t PortMallocGetPoolSize(void);
+  int     PortMallocGetMaxMemUsed(void);
+  void    PortMallocInit(void);
+  void    PortMallocTerm(void);
+  void *(PortMalloc)(psize_t size_arg);
+  void(PortFree)(void *ptr);
+  
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+#endif /* _PMALLOC */
+
+
+
diff --git a/portable/include/pmemory.h b/portable/include/pmemory.h
new file mode 100644
index 0000000..58716ad
--- /dev/null
+++ b/portable/include/pmemory.h
@@ -0,0 +1,309 @@
+/*---------------------------------------------------------------------------*
+ *  pmemory.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PMEMORY_H
+#define PMEMORY_H
+
+
+
+#define PMEM_MAP_TRACE
+
+#include "PortPrefix.h"
+#include "ptypes.h"
+#include "pstdio.h"
+#include <stddef.h>
+#include <stdlib.h>
+
+/**
+ * @addtogroup PmemoryModule PMemory API functions
+ * Library for basic memory management.
+ * Call PMemInit() to initialize and PmemShutdown() to shutdown module.
+ *
+ * @{
+ */
+
+/**
+ * Returns macro to string format.
+ */
+#define _VAL(x) #x
+/**
+ * Converts a digit to a string.
+ */
+#define _STR(x) _VAL(x)
+
+#ifdef DISABLE_MALLOC
+#define malloc #error
+#define calloc #error
+#define realloc #error
+#define free #error
+#endif
+
+#ifndef offsetof
+#define offsetof(type, member) ((size_t) &(((type *)0)->member))
+#endif
+
+/*
+ * PMEM_MAP_TRACE is not defined by default.
+ * It is up to user to define PMEM_MAP_TRACE;
+ * define in either makefile or here for test purpose.
+ */
+
+/**
+ * \<static_cast\> implementation for C.
+ */
+#define STATIC_CAST(self, subClass, member) ((subClass*) (((char*) self) - (offsetof(subClass, member))))
+
+#ifdef PMEM_MAP_TRACE
+/**
+ * Portable malloc()
+ */
+#define MALLOC(nbBytes, tag) (pmalloc(nbBytes, tag, L(__FILE__), __LINE__))
+#else
+/**
+ * Portable malloc()
+ */
+#define MALLOC(nbBytes, tag) (pmalloc(nbBytes))
+#endif
+
+#ifdef PMEM_MAP_TRACE
+/**
+ * Portable calloc()
+ */
+#define CALLOC(nbElem, elemSize, tag) (pcalloc(nbElem,  elemSize  , tag, L(__FILE__), __LINE__))
+#define CALLOC_CLR(nbElem, elemSize, tag) (pcalloc(nbElem,  elemSize  , tag, L(__FILE__), __LINE__))
+#else
+/**
+ * Portable calloc()
+ */
+#define CALLOC(nbElem, elemSize, tag) (pcalloc(nbElem,  elemSize))
+#define CALLOC_CLR(nbElem, elemSize, tag) (pcalloc(nbElem,  elemSize))
+#endif
+
+#ifdef PMEM_MAP_TRACE
+/**
+ * Portable realloc()
+ */
+#define REALLOC(ptr, newSize) (prealloc(ptr, newSize, L(__FILE__), __LINE__))
+#else
+/**
+ * Portable realloc()
+ */
+#define REALLOC(ptr, newSize) (prealloc(ptr, newSize))
+#endif
+
+/**
+ * Portable new()
+ */
+#define NEW(type, tag) ((type*) MALLOC(sizeof(type), tag))
+
+/**
+ * Allocates a new array
+ */
+#define NEW_ARRAY(type, nbElem, tag) ((type *) CALLOC(nbElem, sizeof(type), tag))
+
+#ifdef PMEM_MAP_TRACE
+/**
+ * Portable free()
+ */
+#define FREE(ptr) pfree(ptr, L(__FILE__), __LINE__)
+#else
+/**
+ * Portable free()
+ */
+#define FREE(ptr) pfree(ptr)
+#endif
+
+/**
+ * @}
+ */
+
+/**
+ * Allocates specified number of bytes, similar to malloc but initializes the
+ * memory to 0.
+ *
+ * @param nbBytes The number of bytes to allocate.
+ *
+ * @param tag     The tag associated with the memory for reporting.
+ *
+ * @param file The file name in which the function is invoked.  Should be the
+ * __FILE__ macro.
+ *
+ * @param line The line at which the function is invoked.  Should be the
+ * __LINE__ macro.
+ **/
+#ifdef PMEM_MAP_TRACE
+PORTABLE_API void *pmalloc(size_t nbBytes, const LCHAR* tag, const LCHAR* file, int line);
+#else
+PORTABLE_API void *pmalloc(size_t nbBytes);
+#endif
+
+/**
+ * Allocate an array of items, similar to calloc.
+ *
+ * @param nbItems  The number items to allocate.
+ *
+ * @param itemSize The size of each item.
+ *
+ * @param tag      The tag associated with the memory for reporting.
+ *
+ * @param file The file name in which the function is invoked.  Should be the
+ * __FILE__ macro.
+ *
+ * @param line The line at which the function is invoked.  Should be the
+ * __LINE__ macro.
+ *
+ **/
+#ifdef PMEM_MAP_TRACE
+PORTABLE_API void *pcalloc(size_t nbItems, size_t itemSize, const LCHAR* tag, const LCHAR* file, int line);
+#else
+PORTABLE_API void *pcalloc(size_t nbItems, size_t itemSize);
+#endif
+
+/**
+ * Reallocates data.  Similar to realloc.
+ *
+ * @param ptr A pointer previously allocated by pmalloc, pcalloc or prealloc.
+ *
+ * @param newSize The new size required.
+ *
+ * @param file The file name in which the function is invoked.  Should be the
+ * __FILE__ macro.
+ *
+ * @param line The line at which the function is invoked.  Should be the
+ * __LINE__ macro.
+ *
+ **/
+#ifdef PMEM_MAP_TRACE
+PORTABLE_API void *prealloc(void* ptr, size_t newSize, const LCHAR* file, int line);
+#else
+PORTABLE_API void *prealloc(void* ptr, size_t newSize);
+#endif
+
+/**
+ * Frees data allocated through pmalloc, pcalloc or realloc.
+ *
+ * @param ptr A pointer previously allocated by pmalloc, pcalloc or prealloc.
+ *
+ * @param file The file name in which the function is invoked.  Should be the
+ * __FILE__ macro.
+ *
+ * @param line The line at which the function is invoked.  Should be the
+ * __LINE__ macro.
+ *
+ **/
+#ifdef PMEM_MAP_TRACE
+PORTABLE_API void pfree(void* ptr, const LCHAR* file, int line);
+#else
+PORTABLE_API void pfree(void* ptr);
+#endif
+
+/**
+ * @addtogroup PmemoryModule PMemory API functions
+ * Library for basic memory management.
+ * Call PMemInit() to initialize and PmemShutdown() to shutdown module.
+ *
+ * @{
+ */
+
+/**
+ * Initializes the memory management API.
+ *
+ * @return ESR_INVALID_STATE if the PMem module is already initialized or an internal error occurs
+ */
+PORTABLE_API ESR_ReturnCode PMemInit(void);
+
+/**
+ * Shutdowns the memory management API.  pmemReport is invoked with the same
+ * file that was provided to pmemInit.
+ *
+ * @return ESR_INVALID_STATE if the PMem module is not initialized
+ */
+PORTABLE_API ESR_ReturnCode PMemShutdown(void);
+
+/**
+ * Enables low-level logging to file. This logs individual memory allocations and
+ * deallocations. On shutdown, pmemDumpLogFile() will be invoked.
+ *
+ * @param file A file in which logging of memory related operations should be
+ *    performed. If NULL, no logging is performed.
+ * @return ESR_INVALID_STATE if the PMem module is not initialized
+ */
+PORTABLE_API ESR_ReturnCode PMemSetLogFile(PFile* file);
+
+/**
+ * Dumps memory report to the log file, closes it and disables logging.
+ *
+ * @return ESR_INVALID_STATE if the PMem module is not initialized or an internal error occurs
+ */
+PORTABLE_API ESR_ReturnCode PMemDumpLogFile(void);
+
+/**
+ * Enables/disables memory logging. This is useful for hiding allocations/deallocation
+ * from pmemReport() and other reporting mechanisms, simply disable logging prior
+ * to hidden operations and reenable it thereafter.
+ *
+ * @param value True if logging should be enabled
+ * @return ESR_SUCCESS
+ */
+PORTABLE_API ESR_ReturnCode PMemSetLogEnabled(ESR_BOOL value);
+
+/**
+ * Hide memory allocation from pmemReport() by pretending the memory was deallocating. This is used to hide
+ * memory leaks from pmemReport(), which is useful for internal variables which are deallocated after the
+ * final call to pmemReport() occurs.
+ *
+ * @param ptr Address of memory allocation that should be hidden
+ * @return ESR_SUCCESS
+ */
+PORTABLE_API ESR_ReturnCode PMemLogFree(void* ptr);
+
+/**
+ * Generates a report of the memory allocation.
+ *
+ * @param file A file in which the report is generated.  If set to NULL, the
+ * report will be generated in the same file as that was provided to pmemInit.
+ * Therefore, it is possible that no report is generated if the function is
+ * invoked with NULL and pmemInit was also invoked with NULL.
+ * @return ESR_WRITE_ERROR if an error occurs while writing to the file
+ */
+PORTABLE_API ESR_ReturnCode PMemReport(PFile* file);
+
+/**
+ * Allow user to set the memory pool size when S2G uses its own memory management.
+ * It should be called before PMemInit()
+ * The predefined (default) size is 3M for S2G
+ *
+ * @param size the memory pool size in byte
+ * @return ESR_NOT_SUPPORTED if S2G uses native memory management; ESR_INVALID_STATE if it is called after PMemInit()
+ */
+PORTABLE_API ESR_ReturnCode PMemorySetPoolSize(size_t size);
+
+/**
+ * Get the memory pool size when S2G uses its own memory management
+ *
+ * @param size the memory pool size in byte
+ * @return ESR_NOT_SUPPORTED if S2G uses native memory management
+ */
+PORTABLE_API ESR_ReturnCode PMemoryGetPoolSize(size_t *size);
+
+/**
+ * @}
+ */
+
+#endif
diff --git a/portable/include/pmutex.h b/portable/include/pmutex.h
new file mode 100644
index 0000000..5728d3f
--- /dev/null
+++ b/portable/include/pmutex.h
@@ -0,0 +1,96 @@
+/*---------------------------------------------------------------------------*
+ *  pmutex.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PMUTEX_H
+#define __PMUTEX_H
+
+#if defined(__vxworks) && !defined(REAL_PTHREADS)
+#undef  USE_THREAD
+#define USE_THREAD
+#undef  POSIX
+#define POSIX
+#endif
+
+
+
+#include "ESR_ReturnCode.h"
+
+#define SECOND2NSECOND	1000000000
+#define SECOND2MSECOND	1000
+#define MSECOND2NSECOND	1000000
+
+#ifdef USE_THREAD
+
+#ifdef _WIN32
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include "windows.h"
+
+typedef HANDLE MUTEX;
+typedef HANDLE EVENT;
+
+#define createMutex(mutex, locked) \
+  (*mutex = CreateMutex(NULL, locked, NULL)) == 0 ? ESR_MUTEX_CREATION_ERROR : ESR_SUCCESS
+
+#define lockMutex(mutex) waitForHandle(mutex, INFINITE)
+#define unlockMutex(mutex) (ReleaseMutex(*mutex) ? ESR_SUCCESS : ESR_FATAL_ERROR)
+#define deleteMutex(mutex) ((void) CloseHandle(*mutex))
+ESR_ReturnCode waitForHandle(HANDLE* handle, asr_uint32_t timeout);
+
+#elif defined(POSIX)
+
+#if defined(__vxworks) && !defined(REAL_PTHREADS)
+#include "pthread_vx.h"
+#else
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "Thread is not defined!"
+#endif
+#endif /* _VX_WORKS_ */
+
+typedef pthread_mutex_t MUTEX;
+typedef pthread_cond_t EVENT;
+
+ESR_ReturnCode createMutex_posix(MUTEX *mutex, ESR_BOOL locked);
+ESR_ReturnCode deleteMutex_posix(MUTEX *mutex);
+
+#define createMutex(mutex, locked) createMutex_posix(mutex, locked)
+#define deleteMutex(mutex) deleteMutex_posix(mutex)
+#define lockMutex(mutex) (pthread_mutex_lock(mutex) == 0 ? ESR_SUCCESS : ESR_FATAL_ERROR)
+#define unlockMutex(mutex) (pthread_mutex_unlock(mutex) == 0 ? ESR_SUCCESS : ESR_FATAL_ERROR)
+
+#else /* NON_POSIX */
+
+#error Portable Synchronization not defined for this OS!
+
+#endif /* _WIN32 */
+
+#else /* USE_THREAD */
+
+#define createMutex(mutex, locked) (ESR_SUCCESS)
+#define deleteMutex(mutex) 
+#define lockMutex(mutex) ((void) 0)
+#define unlockMutex(mutex) ((void) 0)
+
+#endif /* USE_THREAD */
+
+#endif  
diff --git a/portable/include/pstdio.h b/portable/include/pstdio.h
new file mode 100644
index 0000000..8d8f0dd
--- /dev/null
+++ b/portable/include/pstdio.h
@@ -0,0 +1,97 @@
+/*---------------------------------------------------------------------------*
+ *  pstdio.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PSTDIO_H
+#define PSTDIO_H
+
+
+
+#include <stdio.h>
+#include "PortPrefix.h"
+#include "ptypes.h"
+#include "PFile.h"
+#include "ESR_ReturnCode.h"
+
+/**
+ * File table structure for memory FS
+ */
+typedef struct FileRecord_t
+{
+  /**
+   * file name
+      */
+  char name[80];
+  /**
+   * pointer to the file data
+   */
+  unsigned char *start;
+  /**
+      * real size of the file
+      */
+  int size;
+  /**
+      * total size in memory
+      */
+  int memsize;
+  /**
+   * mode: 0/1: text/binary
+   */
+  int mode;
+}
+FileRecord;
+
+#ifdef _WIN32
+
+#include "direct.h"
+#include "stdlib.h"
+
+/**
+ * @addtogroup ESR_PortableModule ESR_Portable API functions
+ *
+ * @{
+ */
+
+/**
+ * Platform-independant maximum filename path length.
+ */
+#define P_PATH_MAX _MAX_PATH
+
+/**
+ * Platform-independant maximum command-line length. In reality this value is shell-specific
+ * and is around 32k for WindowsNT however we can't spare that much stack-space and we assume
+ * such a large value will never actually occur so we settle for 4k instead.
+ */
+#define P_CMDLINE_MAX 4000
+/**
+ * @}
+ */
+
+#else
+
+#if defined(PATH_MAX)
+#define P_PATH_MAX PATH_MAX
+#elif defined(MAXPATHLEN)
+#define P_PATH_MAX MAXPATHLEN
+#else
+#error "Cannot determine value for P_PATH_MAX."
+#endif /* PATH_MAX */
+
+#endif /* _WIN32 */
+
+#endif 
diff --git a/portable/include/pstream.h b/portable/include/pstream.h
new file mode 100644
index 0000000..7678640
--- /dev/null
+++ b/portable/include/pstream.h
@@ -0,0 +1,105 @@
+/*---------------------------------------------------------------------------*
+ *  pstream.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _PORTSTREAM_H_
+#define _PORTSTREAM_H_
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdio.h>
+#include "ptypes.h"
+
+#ifdef PFILE_VIRTUAL_SUPPORT
+
+  struct FileBufferFrame;
+  typedef struct PORT_FILE_HANDLE
+  {
+    const char              *filename;
+    struct FileBufferFrame  *startFrame;
+    struct FileBufferFrame  *endFrame;
+    struct FileBufferFrame  *curFrame;  /* current buffer; useful for writable file */
+    const unsigned char     *curPos;
+    const unsigned char     *endPos;
+    unsigned int            size;       /* total buffer size; useful for writable file */
+    unsigned int            frame_size; /* buffer size in current frame; useful for writable file */
+    int                     eof;
+    int                     mode;      /* 0 readonly text; 1 readonly binary; 2 writable text; 3 writalbe binary */
+  }
+  PORT_FILE_HANDLE;
+  
+  typedef PORT_FILE_HANDLE* PORT_FILE;
+  
+  typedef struct _FileRecord
+  {
+    char name[80];
+    unsigned char *start;
+    int end;              /* offset of the end of the file */
+    int size;             /* total buffer size */
+    int mode;
+  }
+  FileRecord;
+  
+  typedef struct VirtualFileTable_t
+  {
+    const FileRecord* pFileTable;
+    const unsigned char* pFirstFile;
+  }
+  VirtualFileTable;
+  
+  /* Function prototypes */
+  PORTABLE_API void    PortFileInit(void);
+  PORTABLE_API PORT_FILE PortFopen(const char* filename, const char* mode);
+  PORTABLE_API int   PortFclose(PORT_FILE PortFile);
+  PORTABLE_API size_t  PortFread(void* buffer, size_t size, size_t count, PORT_FILE PortFile);
+  PORTABLE_API size_t  PortFwrite(const void* buffer, size_t size, size_t count, PORT_FILE PortFile);
+  PORTABLE_API int   PortFseek(PORT_FILE PortFile, long offset, int origin);
+  PORTABLE_API long    PortFtell(PORT_FILE PortFile);
+  PORTABLE_API int   PortFprintf(PORT_FILE PortFile, const char* format, ...);
+  PORTABLE_API char*  PortFgets(char* string, int n, PORT_FILE PortFile);
+  PORTABLE_API int   PortFflush(PORT_FILE PortFile);
+  PORTABLE_API int   PortFeof(PORT_FILE PortFile);
+  PORTABLE_API int   PortFgetc(PORT_FILE PortFile);
+  PORTABLE_API int   PortFscanf(PORT_FILE PortFile, const char *format, ...);
+  PORTABLE_API int   PortFerror(PORT_FILE PortFile);
+  PORTABLE_API void   PortClearerr(PORT_FILE PortFile);
+  PORTABLE_API void    PortRewind(PORT_FILE PortFile);
+  PORTABLE_API PORT_FILE PortFreopen(const char *path, const char *mode, PORT_FILE PortFile);
+  PORTABLE_API char*    PortGetcwd(char *buffer, int maxlen);
+  PORTABLE_API int      PortMkdir(const char *dirname);
+  
+  /* this function is to create a file with the limit size */
+  PORTABLE_API int      PortFcreate(const char *fname, void *pBuffer, int size);
+  PORTABLE_API void     PortFdelete(const char *fname);
+  
+  PORTABLE_API void     PortSetFileTable(const FileRecord* pFileTable, const unsigned char* pFirstFile);
+  
+  void     SetFileTable(VirtualFileTable *table);
+  
+#endif /* #ifdef PFILE_VIRTUAL_SUPPORT */
+  
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _PORTSTREAM_H */
diff --git a/portable/include/ptimer.h b/portable/include/ptimer.h
new file mode 100644
index 0000000..8aa2ee9
--- /dev/null
+++ b/portable/include/ptimer.h
@@ -0,0 +1,86 @@
+/*---------------------------------------------------------------------------*
+ *  ptimer.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PTIMER_H
+#define PTIMER_H
+
+
+
+#include "PortPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup PTimerModule PTimer API functions
+ * API to facilitate computing elapsed time of operations.  The units of time
+ * are milliseconds.
+ *
+ * @{
+ */
+
+/** Typedef */
+typedef struct PTimer_t PTimer;
+
+/**
+ * Creates a new timer object.
+ *
+ * @param timer PTimer handle.
+ */
+PORTABLE_API ESR_ReturnCode PTimerCreate(PTimer **timer);
+
+/**
+ * Destroys the timer object.
+ *
+ * @param timer PTimer handle.
+ */
+PORTABLE_API ESR_ReturnCode PTimerDestroy(PTimer *timer);
+
+/**
+ * Starts the timer. This sets the reference time from which all new elapsed
+ * time are computed.  This does not reset the elapsed time to 0.  This is
+ * useful to pause the timer.
+ **/
+PORTABLE_API ESR_ReturnCode PTimerStart(PTimer *timer);
+
+/**
+ * Stops the timer.
+ **/
+PORTABLE_API ESR_ReturnCode PTimerStop(PTimer *timer);
+
+/**
+ * Returns the timer elapsed time.  If the Timer is in the stopped state,
+ * successive calls to getElapsed() will always return the same value.  If the
+ * Timer is in the started state, successive calls will return the elapsed
+ * time since the last time PTimerStart() was called.
+ */
+PORTABLE_API ESR_ReturnCode PTimerGetElapsed(PTimer *timer,
+    asr_uint32_t *elapsed);
+    
+/**
+ * Resets the elapsed time to 0 and resets the reference time of the Timer.
+ * This effectively reset the timer in the same state it was right after
+ * creation.
+ **/
+PORTABLE_API ESR_ReturnCode PTimerReset(PTimer *timer);
+
+/**
+ * @}
+ */
+
+
+#endif
diff --git a/portable/include/ptimestamp.h b/portable/include/ptimestamp.h
new file mode 100644
index 0000000..ec60482
--- /dev/null
+++ b/portable/include/ptimestamp.h
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*
+ *  ptimestamp.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PTIMESTAMP_H
+#define PTIMESTAMP_H
+
+
+
+#include <time.h>
+#include "PortPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup PTimeStampModule PTimeStamp API functions
+ *
+ * @{
+ */
+
+/**
+ * Time stamp structure with two fields: seconds and milliseconds.  The secs
+ * field represent the number of seconds since January 1st 1970, 00:00:00 UTC.
+ * msecs represent the number of milliseconds within that second.
+ **/
+typedef struct PTimeStamp_t
+{
+  /**
+   * Seconds component of timestamp.
+   */
+  time_t secs;
+  
+  /**
+   * Milliseconds component of timestamp.
+   */
+  asr_uint16_t msecs;
+}
+PTimeStamp;
+
+/**
+ * Sets the time stamp to represent current time.  Sets both secs field and
+ * msecs field to 0 if platform does not support it.
+ **/
+PORTABLE_API void PTimeStampSet(PTimeStamp *timestamp);
+
+/**
+ * Returns the difference between two timestamps, in terms of milliseconds.
+ *
+ * @param a First timestamp
+ * @param b Second timestamp
+ * @return a - b
+ */
+PORTABLE_API int PTimeStampDiff(const PTimeStamp *a, const PTimeStamp *b);
+
+/**
+ * @}
+ */
+
+
+#endif
diff --git a/portable/include/ptrd.h b/portable/include/ptrd.h
new file mode 100644
index 0000000..eb301f1
--- /dev/null
+++ b/portable/include/ptrd.h
@@ -0,0 +1,494 @@
+/*---------------------------------------------------------------------------*
+ *  ptrd.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PTRD_H
+#define PTRD_H
+
+
+
+
+#ifdef USE_THREAD
+
+#include "PortPrefix.h"
+#include "ptypes.h"
+#include "ESR_ReturnCode.h"
+
+#define STACKSIZE_S2G_SINKER      12*1024
+#define STACKSIZE_S2G_RECOGNIZER  25*1024
+#define STACKSIZE_DEFAULT         18*1024
+
+#ifdef _WIN32
+typedef unsigned int PTHREAD_ID;
+#define PtrdGetCurrentThreadId GetCurrentThreadId
+#elif defined(POSIX)
+
+#if defined(__vxworks) && !defined(REAL_PTHREADS)
+#include "pthread_vx.h"
+#else
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "Thread is not defined!"
+#endif
+#endif /* #if defined(__vxworks) && !defined(REAL_PTHREADS) */
+
+typedef pthread_t PTHREAD_ID;
+#define PtrdGetCurrentThreadId pthread_self
+#else
+#error Portable Synchronization not defined for this OS!
+#endif /* os dependant basic types */
+
+/**
+ * @addtogroup PtrdModule PThread API functions
+ * Library for basic thread and monitor functionality to ensure portability.
+ * Call PtrdInit() to initialize and PtrdShutdown() to shutdown module.
+ *
+ * Every thread has a priority. Threads with higher priority are executed in preference
+ * to threads with lower priority. When code running in some thread creates a new Thread
+ * object, the new thread has its priority initially set equal to the priority of the creating
+ * thread.
+ *
+ *
+ * @{
+ */
+
+/** Typedef */
+typedef struct PtrdMonitor_t PtrdMonitor;
+/** Typedef */
+typedef struct PtrdMutex_t PtrdMutex;
+/** Typedef */
+typedef struct PtrdSemaphore_t PtrdSemaphore;
+/** Typedef */
+typedef struct PtrdThread_t PtrdThread;
+
+
+/**
+ * Blocks the current thread for the specified amount of time.
+ *
+ * @param sleepTimeMs number of milliseconds to sleep.  A value of 0 is
+ * equivalent to a thread yield.
+ *
+ * @return ESR_SUCCESS if success, or something else to indicate a failure.
+ */
+PORTABLE_API ESR_ReturnCode PtrdSleep(asr_uint32_t sleepTimeMs);
+
+/**
+ * Creates a thread monitor.  Thread monitors can be locked, unlocked, can be
+ * waited on and can be notified.  Monitors implement so-called recursive
+ * locking, meaning that a thread owning the monitor can call lock without
+ * blocking and will have to call unlock() as many times as lock() was called.
+ *
+ * @param  monitor  Handle to the created monitor
+ *
+ * @return ESR_SUCCESS if succes, or something else to indicate a failure.  In
+ * particular, it will return ESR_INVALID_STATE if the threading API is not
+ * properly initialized.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMonitorCreate(PtrdMonitor **monitor);
+
+/**
+ * Destroys a monitor.
+ *
+ * @param  monitor  Handle to the monitor to destroy
+ *
+ * @return ESR_SUCCESS if success; ESR_INVALID_STATE if this function is called after the thread
+ * library is shutdown, or cannot lock on mutex; ESR_INVALID_ARGUMENT if monitor is null
+ */
+PORTABLE_API ESR_ReturnCode PtrdMonitorDestroy(PtrdMonitor *monitor);
+
+/**
+ * Locks a monitor.
+ *
+ * @param  monitor  Handle to the monitor to lock
+ * @param  fname Filename of code requesting a lock
+ * @param  line Line of code requesting a lock
+ *
+ * @return ESR_SUCCESS if success; ESR_INVALID_ARGUMENT if monitor is null; ESR_FATAL_ERROR if waiting on the mutex failed
+ */
+PORTABLE_API ESR_ReturnCode PtrdMonitorLockWithLine(PtrdMonitor *monitor, const LCHAR *fname, int line);
+/**
+ * Locks a monitor.
+ *
+ * @param  monitor  Handle to the monitor to lock
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.
+ */
+#define PtrdMonitorLock(monitor) PtrdMonitorLockWithLine(monitor, L(__FILE__), __LINE__)
+
+/**
+ * Unlock a Monitor
+ *
+ * @param  monitor  Handle to the monitor to unlock
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.  In particular, it will return ESR_INVALID_STATE if the current
+ * thread does not hold the monitor.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMonitorUnlock(PtrdMonitor *monitor);
+
+/**
+ * Causes current thread to wait until another thread invokes the
+ * <code>PtrdMonitorNotify()</code> method or the
+ * <code>PtrdMonitorNotifyAll()</code> method for this monitor.
+ *
+ * <p>
+ *
+ * The current thread must own this monitor. The thread releases ownership of
+ * this monitor and waits until another thread notifies threads waiting on
+ * this object's monitor to wake up either through a call to the
+ * <code>PtrdMonitorNotify</code> method or the
+ * <code>PtrdMonitorNotifyAll</code> method. The thread then waits until it
+ * can re-obtain ownership of the monitor and resumes execution.
+ *
+ * @param monitor The monitor on which to wait.
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.  In particular, it will return ESR_INVALID_STATE if the current
+ * thread does not hold the monitor.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMonitorWait(PtrdMonitor *monitor);
+
+
+/**
+ * Causes current thread to wait until either another thread invokes the
+ * <code>PtrdMonitorNotify()</code> method or the
+ * <code>PtrdMonitorNotifyAll()</code> method for this monitor, or a specified
+ * amount of time has elapsed.
+ *
+ * @param monitor The monitor on which to wait.
+ *
+ * @param timeoutMs The amount of time (in millisecs) to wait for
+ * notification.
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.  In particular, it will return ESR_INVALID_STATE if the current
+ * thread does not hold the monitor, or ESR_TIMED_OUT if the timeout expired
+ * without a notification.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMonitorWaitTimeout(PtrdMonitor *monitor,
+    asr_uint32_t timeoutMs);
+    
+/**
+ * Wakes up a single thread that is waiting on this monitor. If more than one
+ * thread are waiting on this object, one of them is arbitrarily chosen to be
+ * awakened. A thread waits on the monitor by calling
+ * <code>PtrdMonitorWait</code> or <code>PtrdMonitorWaitTimeout</code>.
+ *
+ * <p>
+ *
+ * The awakened thread will not be able to proceed until the current thread
+ * relinquishes the lock on this object. The awakened thread will compete in
+ * the usual manner with any other threads that might be actively competing to
+ * synchronize on this object; for example, the awakened thread enjoys no
+ * reliable privilege or disadvantage in being the next thread to lock this
+ * monitor.
+ *
+ * <p>
+ *
+ * This method should only be called by a thread that is the owner of this
+ * monitor.
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.  In particular, it will return ESR_INVALID_STATE if the current
+ * thread does not hold the monitor, or ESR_TIMED_OUT if the timeout expired
+ * without a notification.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMonitorNotify(PtrdMonitor *monitor);
+
+/**
+ * Wakes up all threads that are waiting on this monitor. A thread waits on
+ * a monitor by calling <code>PtrdMonitorWait</code> or
+ * <code>PtrdMonitorWaitTimeout</code>
+ *
+ * <p>
+ *
+ * The awakened threads will not be able to proceed until the current thread
+ * relinquishes the monitor. The awakened threads will compete in the usual
+ * manner with any other threads that might be actively competing to
+ * synchronize on this monitor; for example, the awakened threads enjoy no
+ * reliable privilege or disadvantage in being the next thread to lock this
+ * object.
+ *
+ * <p>
+ *
+ * This method should only be called by a thread that is the owner of this
+ * object's monitor.
+ *
+ * @param monitor The monitor on which to wait.
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.  In particular, it will return ESR_INVALID_STATE if the current
+ * thread does not hold the monitor.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMonitorNotifyAll(PtrdMonitor *monitor);
+
+/**
+ * Creates a thread mutex.  Thread mutexes are similar to thread monitors
+ * except that they do not support wait and notify mechanism and require less
+ * resources from the OS.  In situations where this mechanism is not required,
+ * using mutexes instead of monitors is preferable. Mutexes implement
+ * so-called recursive locking, meaning that a thread owning the mutex can
+ * call lock without blocking and will have to call unlock() as many times as
+ * lock() was called.
+ *
+ * @param  mutex  Handle to the created mutex
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMutexCreate(PtrdMutex **mutex);
+
+/**
+ * Destroys a mutex.
+ *
+ * @param  mutex  Handle to the mutex to destroy
+ *
+ * @return        ESR_ReturnCode 0 on success
+ */
+PORTABLE_API ESR_ReturnCode PtrdMutexDestroy(PtrdMutex *mutex);
+
+/**
+ * Lock a mutex
+ *
+ * @param  mutex  Handle to the mutex to lock
+ * @param  fname Filename of code requesting a lock
+ * @param  line Line of code requesting a lock
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMutexLockWithLine(PtrdMutex *mutex, const LCHAR *fname, int line);
+/**
+ * Lock a mutex
+ *
+ * @param  mutex  Handle to the mutex to lock
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.
+ */
+#define PtrdMutexLock(mutex) PtrdMutexLockWithLine(mutex, L(__FILE__), __LINE__)
+
+/**
+ * Unlock a Mutex
+ *
+ * @param  mutex  Handle to the mutex to unlock
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure. In particular, it will return ESR_INVALID_STATE if the current
+ * thread does not hold the mutex.
+ */
+PORTABLE_API ESR_ReturnCode PtrdMutexUnlock(PtrdMutex *mutex);
+
+
+/**
+ * Creates a thread semaphore.
+ *
+ * @param  semaphore  Handle to the created semaphore.
+ * @param  initValue  Initial semaphore value
+ * @param  maxValue   Maximum semaphore value
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.
+ */
+PORTABLE_API ESR_ReturnCode PtrdSemaphoreCreate(unsigned int initValue,
+    unsigned int maxValue,
+    PtrdSemaphore **semaphore);
+    
+/**
+ * Destroy a semaphore
+ *
+ * @param  semaphore  Handle to the semaphore to destroy
+ *
+ * @return ESR_SUCCESS if success, or an an error indicating the cause of the
+ * failure.
+ */
+PORTABLE_API ESR_ReturnCode PtrdSemaphoreDestroy(PtrdSemaphore *semaphore);
+
+/**
+ * Decrements the semaphore.  If the semaphore's current value is 0, the
+ * current thread waits until the semaphore's value is greater than 0.
+ *
+ * @param  semaphore  Handle to the semaphore to acquire.
+ *
+ * @return ESR_SUCCESS if successful, or a status code indicating the nature of
+ * the error.
+ */
+PORTABLE_API ESR_ReturnCode PtrdSemaphoreAcquire(PtrdSemaphore *semaphore);
+
+
+/**
+ * Decrements the semaphore.  If the semaphore's current value is 0, the
+ * current thread waits until the semaphore's value is greater than 0 or until
+ * the timeout expires.
+ *
+ * @param  semaphore  Handle to the semaphore to acquire.
+ * @param  timeoutMs  Timeout in milliseconds.
+ *
+ * @return ESR_SUCCESS if wait is successful, ESR_TIMED_OUT if timed out, or an
+ * error status indicating the nature of the error in other situations.
+ */
+PORTABLE_API ESR_ReturnCode PtrdSemaphoreAcquireTimeout(PtrdSemaphore *semaphore,
+    asr_uint32_t timeoutMs);
+    
+/**
+ * Increments a semaphore.
+ *
+ * @param semaphore Handle to the semaphore to release.
+ *
+ * @return ESR_SUCCESS success or an error status indicating the nature of the
+ * error.  In particular, it will return ESR_INVALID_STATE if the semaphore is
+ * currently at its maximum value.
+ */
+PORTABLE_API ESR_ReturnCode PtrdSemaphoreRelease(PtrdSemaphore *semaphore);
+
+
+/**
+ * Function signature invoked on the new thread by PtrdThreadCreate(), and
+ * the argument to that function.
+ */
+typedef void* PtrdThreadArg;
+/**
+ * Function prototype that launched threads must conform to.
+ *
+ * @param userData Data passed in by caller of PtrdThreadCreate
+ */
+typedef void(*PtrdThreadStartFunc)(PtrdThreadArg userData);
+
+/**
+ * Minimum thread priority.
+ */
+#define PtrdThreadMinPriority 0
+
+/**
+ * Maximum thread priority.
+ */
+#define PtrdThreadMaxPriority UINT16_TMAX
+
+/**
+ * Normal thread priority.
+ */
+#define PtrdThreadNormalPriority (PtrdThreadMaxPriority / 2)
+
+/**
+ * Creates a thread.
+ *
+ * Execution starts on the thread immediately. To pause execution use a
+ * monitor or a mutex between the thread and the thread creator.
+ *
+ * @param  thread       Handle to the thread that is created
+ * @param  startFunc    Function for the thread to start execution on
+ * @param  arg          Argument to the thread function
+ *
+ * @return ESR_INVALID_ARGUMENT if thread or startFunc are null; ESR_OUT_OF_MEMORY if system is out of memory;
+ * ESR_THREAD_CREATION_ERROR if thread cannot be created
+ */
+PORTABLE_API ESR_ReturnCode PtrdThreadCreate(PtrdThreadStartFunc startFunc, PtrdThreadArg arg,
+    PtrdThread** thread);
+    
+/**
+ * Destroys a thread handle.
+ *
+ * Note: this does NOT stop or destroy the thread, it just releases
+ * the handle for accessing it. If this is not done, a memory leak
+ * occurs, so if the creator of the thread never needs to communicate
+ * with the thread again it should call this immediately after the
+ * create if the create was successful.
+ *
+ * @return ESR_SUCCESS on failure or an error indicating the nature of the
+ * error.
+ */
+PORTABLE_API ESR_ReturnCode PtrdThreadDestroy(PtrdThread *thread);
+
+/**
+ * Wait for the termination of a specified thread
+ *
+ * @param thread Handle to the thread to wait for
+ *
+ * @return ESR_INVALID_ARGUMENT if thread is null
+ */
+PORTABLE_API ESR_ReturnCode PtrdThreadJoin(PtrdThread *thread);
+
+/**
+ * Returns the thread priority.
+ *
+ * @param thread PtrdThread handle
+ * @param value [out] Thread priority
+ *
+ * @return ESR_INVALID_ARGUMENT if thread or value are null; ESR_INVALID_STATE if thread priority cannot be
+ * retrieved
+ */
+PORTABLE_API ESR_ReturnCode PtrdThreadGetPriority(PtrdThread *thread, asr_uint16_t* value);
+
+/**
+ * Sets the thread priority.
+ *
+ * @param thread PtrdThread handle
+ * @param value Thread priority
+ *
+ * @return ESR_INVALID_ARGUMENT if thread or value are null; ESR_INVALID_STATE if thread priority cannot be
+ * set
+ */
+PORTABLE_API ESR_ReturnCode PtrdThreadSetPriority(PtrdThread *thread, asr_uint16_t value);
+
+/**
+ * Yields execution of the current thread to other threads.
+ *
+ * @return ESR_SUCCESS
+ */
+PORTABLE_API ESR_ReturnCode PtrdThreadYield(void);
+
+/**
+ * Initializes the thread library.  This should be called before creating the
+ * first thread or the first monitor.
+ *
+ * @return ESR_INVALID_STATE if the Ptrd module has already been initialized;
+ * ESR_MUTEX_CREATION_ERROR if mutex cannot be created
+ */
+PORTABLE_API ESR_ReturnCode PtrdInit(void);
+
+/**
+ * Indicates if thread library has been initialized.
+ *
+ * @param enabled [out] True if library is initialized
+ * @return ESR_INVALID_ARGUMENT if enabled is null
+ */
+PORTABLE_API ESR_ReturnCode PtrdIsEnabled(ESR_BOOL* enabled);
+
+/**
+ * Shutdowns the thread library.  All thread and monitor should be terminated
+ * and destroyed before calling this function.
+ *
+ * @return ESR_INVALID_STATE if Ptrd module is not running
+ * error.
+ */
+PORTABLE_API ESR_ReturnCode PtrdShutdown(void);
+
+/**
+ * @}
+ */
+
+#else
+
+
+//#error "Including ptrd.h on a non-threaded platform."
+
+
+#endif /* USE_THREAD */
+#endif  
diff --git a/portable/include/ptstutils.h b/portable/include/ptstutils.h
new file mode 100644
index 0000000..dc7ca19
--- /dev/null
+++ b/portable/include/ptstutils.h
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------------*
+ *  ptstutils.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef PTSTUTILS_H
+#define PTSTUTILS_H
+
+
+
+#include "pstdio.h"
+
+#ifdef ASSERT
+#undef ASSERT
+#endif
+
+/**
+ * Macros defined to facilitate the writing of test programs.
+ * That's why they are not dependent on any compile-time flag.
+ */
+#define ASSERT(x) \
+  do { \
+    if (!(x)) \
+    { \
+      pfprintf(PSTDERR, L(__FILE__ "(%d): " #x " failed: aborting.\n"), __LINE__); \
+      exit(-1); \
+    } \
+  } \
+  while(0)
+
+#define ESR_ASSERT(x) \
+  do { \
+    if ((x) != ESR_SUCCESS) \
+    { \
+      pfprintf(PSTDERR, L(__FILE__ "(%d): " #x " failed: aborting.\n"), __LINE__); \
+      exit(-1); \
+    } \
+  } \
+  while(0)
+
+#define ASSERT2(x, count) \
+  do { \
+    if (!(x)) \
+    { \
+      pfprintf(PSTDERR, L(__FILE__ "(%d): " #x " failed.\n"), __LINE__); \
+      ++count; \
+    } \
+  } \
+  while(0)
+
+#endif
diff --git a/portable/include/ptypes.h b/portable/include/ptypes.h
new file mode 100644
index 0000000..40352c0
--- /dev/null
+++ b/portable/include/ptypes.h
@@ -0,0 +1,494 @@
+/*---------------------------------------------------------------------------*
+ *  ptypes.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PTYPES_H
+#define __PTYPES_H
+
+
+
+#include <string.h>
+#include <ctype.h>
+#include "limits.h"
+#include "PortPrefix.h"
+
+#ifndef MAX
+#define MAX(A,B) ((A)>(B)?(A):(B))
+#endif
+#ifndef MIN
+#define MIN(A,B) ((A)<(B)?(A):(B))
+#endif
+
+
+/**
+ * Boolean definition.
+ */
+typedef enum ESR_BOOL
+{
+  ESR_FALSE = 0,
+  ESR_TRUE = 1
+} ESR_BOOL;
+
+/**
+ * @addtogroup ESR_PortableModule ESR_Portable API functions
+ *
+ * @{
+ */
+
+#ifdef _WIN32
+
+#pragma warning (disable: 4100 4127)
+#pragma warning (error: 4133 4020)
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+
+/**
+ * Portable 32-bit unsigned integer.
+ */
+typedef unsigned int   asr_uint32_t;
+
+/**
+ * Portable 32-bit signed integer.
+ */
+typedef int            asr_int32_t;
+
+/**
+ * Portable 16-bit unsigned integer.
+ */
+typedef unsigned short asr_uint16_t;
+
+/**
+ * Portable 16-bit signed integer.
+ */
+typedef short          asr_int16_t;
+
+/**
+ * Portable 8-bit unsigned integer.
+ */
+typedef unsigned char asr_uint8_t;
+
+/**
+ * Portable 8-bit signed integer.
+ */
+typedef signed char   asr_int8_t;
+
+#else
+
+
+/**
+ * Portable 32-bit unsigned integer.
+ */
+typedef unsigned int   asr_uint32_t;
+
+/**
+ * Portable 32-bit signed integer.
+ */
+typedef int            asr_int32_t;
+
+/**
+ * Portable 16-bit unsigned integer.
+ */
+typedef unsigned short asr_uint16_t;
+
+/**
+ * Portable 16-bit signed integer.
+ */
+typedef short          asr_int16_t;
+
+/**
+ * Portable 8-bit unsigned integer.
+ */
+typedef unsigned char asr_uint8_t;
+
+/**
+ * Portable 8-bit signed integer.
+ */
+typedef signed char   asr_int8_t;
+
+///**
+// * Boolean definition.
+// */
+//#ifdef __vxworks
+///* VxWorks defines BOOL as: typedef int BOOL in vxTypesOld.h */
+//#include <vxWorks.h>
+//#define FALSE 0
+//#define TRUE  1
+//#endif
+
+#ifdef _solaris_
+#include <sys/int_types.h>
+#elif defined(_decunix_)
+#include <inttypes.h>
+#elif defined(POSIX)
+
+#include <time.h>
+#include <errno.h>
+
+#if (CPU != SIMNT)
+typedef void * HANDLE;
+#endif /*  (CPU != SIMNT) */
+
+#if defined(__vxworks)  /* VxWorks */
+#include <sys/times.h>
+#include <types.h>
+/* VxWorks does not support recursive mutex in POSIX.4 */
+#define OS_NO_RECURSIVE_MUTEX_SUPPORT
+#elif defined(_QNX_) /* QNX */
+#include <sys/time.h>
+#include <inttypes.h>
+#elif (OS == OS_UNIX)
+#include <string.h>
+#include <pthread.h>
+#else
+#error "New OS support here"
+#endif
+
+#ifndef _POSIX_SOURCE
+#define _POSIX_SOURCE
+#endif
+
+/* Both POSIX.1 and POSIX.4 (POSIX1003.1c) are supported */
+#ifndef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 199309
+#endif
+
+#include <unistd.h>
+/*
+#ifndef _POSIX_VERSION
+#error "POSIX is not supported!")
+#elif _POSIX_VERSION == 199009
+#pragma message("POSIX.1 is supported only")
+#elif _POSIX_VERSION == 199309
+#pragma message("POSIX.1 and POSIX.4 are supported")
+#elif _POSIX_VERSION > 199309
+#pragma message("Version is newer than POSIX.4")
+#endif // _POSIX_VERSION
+*/
+#else
+/* Linux, maybe others too */
+#endif
+#endif
+
+/**
+ * Minimum value of UINT16_T.
+ */
+#define UINT16_TMIN 0
+
+/**
+ * Maximum value of UINT16_T.
+ */
+#define UINT16_TMAX 65535
+
+/*
+ * These should be platform-dependent.  But for the moment, we will assume
+ * narrow character.
+ */
+#ifndef USE_NARROW_CHAR
+#define USE_NARROW_CHAR
+#endif
+
+#ifdef USE_NARROW_CHAR
+/**
+ * Locale-independant character.
+ */
+typedef char LCHAR;
+
+/**
+ * Locale-independant integer-representation of a character. Used by fgetc() and others.
+ */
+typedef int LINT;
+
+/**
+ * LCHAR version of string-constant
+ */
+#define L(x) x
+
+/**
+ * LCHAR version of strcat()
+ */
+#define LSTRCAT strcat
+
+/**
+ * LCHAR version of strchr()
+ */
+#define LSTRCHR strchr
+
+/**
+ * LCHAR version of strrchr()
+ */
+#define LSTRRCHR strrchr
+
+/**
+ * LCHAR version of strcmp()
+ */
+#define LSTRCMP strcmp
+
+/**
+ * LCHAR version of strncmp()
+ */
+#define LSTRNCMP strncmp
+
+/**
+ * LCHAR version of strcpy()
+ */
+#define LSTRCPY strcpy
+
+/**
+ * LCHAR version of strftime()
+ */
+#define LSTRFTIME strftime
+
+/**
+ * LCHAR version of strlen()
+ */
+#define LSTRLEN strlen
+
+/**
+ * LCHAR version of strncpy()
+ */
+#define LSTRNCPY strncpy
+
+/**
+ * LCHAR version of memmove()
+ */
+#define LMEMMOVE memmove
+
+/**
+ * LCHAR version of strstr()
+ */
+#define LSTRSTR strstr
+
+/**
+ * LCHAR version of strlwr() which converts a string to lowercase.
+ */
+#define LSTRLWR lstrlwr
+
+/**
+ * LCHAR version of strupr() which converts a string to lowercase.
+ */
+#define LSTRUPR lstrupr
+
+/**
+ * LCHAR version of strtod()
+ */
+#define LSTRTOD strtod
+
+/**
+ * LCHAR version of strtol()
+ */
+#define LSTRTOL strtol
+
+/**
+ * LCHAR version of strtoul()
+ */
+#define LSTRTOUL strtoul
+
+/**
+ * LCHAR version of isspace()
+ */
+#define LISSPACE(c) isspace((unsigned char) c)
+
+/**
+ * LCHAR version of strcspn()
+ */
+#define LSTRCSPN strcspn
+
+/**
+ * LCHAR version of isalpha()
+ */
+#define LISALPHA isalpha
+
+/**
+ * LCHAR version of isalnum()
+ */
+#define LISALNUM isalnum
+
+/**
+ * LCHAR version of isdigit()
+ */
+#define LISDIGIT isdigit
+
+/**
+ * LCHAR version of strtok()
+ */
+#define LSTRTOK strtok
+
+/**
+ * LCHAR version of getenv()
+ */
+#define LGETENV getenv
+
+/**
+ * Converts LCHAR character to uppercase.
+ */
+#define LTOUPPER toupper
+
+/**
+ * Converts LCHAR character to lowercase.
+ */
+#define LTOLOWER tolower
+
+/**
+ * Portable printf().
+ */
+#define LPRINTF   printf
+/**
+ * Portable fprintf().
+ */
+#define LFPRINTF fprintf
+/**
+ * Portable sprintf().
+ */
+#define LSPRINTF sprintf
+
+/**
+ * Portable sprintf().
+ */
+#define psprintf sprintf
+
+/**
+ * Portable svprintf().
+ */
+#define pvsprintf vsprintf
+
+#else
+
+#include <wchar.h>
+typedef wchar_t LCHAR;
+/**
+* Locale-independant integer-representation of a character. Used by fgetc() and others.
+*/
+typedef wint_t LINT;
+#define L(x) L ## x
+#define LSTRCAT wcscat
+#define LSTRCHR wcschr
+#define LSTRRCHR wcsrchr
+#define LSTRCMP wcscmp
+#define LSTRNCMP wcsncmp
+#define LSTRCPY wcscpy
+#define LSTRFTIME wcsftime
+
+#define LPRINTF   wprintf
+#define LFPRINTF fwprintf
+#define LSPRINTF swprintf
+
+#ifdef _WIN32
+
+/**
+* LCHAR version of getenv()
+*/
+#define LGETENV wgetenv
+
+/**
+* LCHAR version of strlwr() which converts a string to lowercase.
+*/
+#define LSTRLWR _wcslwr
+
+/**
+* LCHAR version of strtok()
+*/
+#define LSTRTOK wcstok
+
+/**
+* LCHAR version of strupr() which converts a string to lowercase.
+*/
+#define LSTRUPR _wcsupr
+#else
+#define LSTRCASECMP wcscasecmp
+#define LSTRLWR #error LSTRLWR not defined.
+#define LSTRUPR #error LSTRUPR not defined.
+#endif /* _WIN32 */
+
+#define LSTRLEN wcslen
+#define LSTRNCPY wcsncpy
+#define LMEMMOVE wmemmove
+#define LSTRSTR wcsstr
+#define LSTRTOD wcstod
+#define LSTRTOL wcstol
+#define LSTRTOUL wcstoul
+#define LISSPACE iswspace
+#define LSTRCSPN wcscspn
+#define LISALPHA iswalpha
+#define LISALNUM iswalnum
+#define LISDIGIT iswdigit
+
+/**
+* Converts LCHAR character to uppercase.
+*/
+#define LTOUPPER towupper
+
+/**
+* Converts LCHAR character to lowercase.
+*/
+#define LTOLOWER towlower
+
+/**
+* Portable sprintf().
+*/
+#define psprintf sprintf
+
+/**
+* Portable svprintf().
+*/
+#define pvsprintf vsprintf
+
+#endif /* USE_NARROW_CHAR */
+
+/**
+ * Log of 2 in base 10.
+ */
+#define LOG_10_2 (0.30102999566398)
+
+
+/**
+ * Maximum number of digits used to represent an unsigned int as a string in
+ * base 10.  The +1 is for taking into account the fact that the fractional
+ * part is removed and that we really need to take the ceiling.
+ */
+#define MAX_UINT_DIGITS ((size_t) ((CHAR_BIT * sizeof(int) * LOG_10_2) + 1))
+
+/**
+ * Maximum number of digits used to represent an int as a string in base 10.
+ * +1 for sign character [+, -]
+ */
+#define MAX_INT_DIGITS ((size_t) (MAX_UINT_DIGITS + 1))
+
+/**
+ * Indicates if text contains a number (and nothing else).
+ *
+ * @param text String to check
+ * @return ESR_TRUE if text is a number, ESR_FALSE otherwise.
+ */
+PORTABLE_API ESR_BOOL isNumber(const LCHAR* text);
+
+/**
+ * @}
+ */
+
+
+#include "ESR_ReturnCode.h"
+
+
+#include "pstdio.h"
+
+#endif 
+
+
diff --git a/portable/src/ArrayList.c b/portable/src/ArrayList.c
new file mode 100644
index 0000000..4c1127b
--- /dev/null
+++ b/portable/src/ArrayList.c
@@ -0,0 +1,132 @@
+/*---------------------------------------------------------------------------*
+ *  ArrayList.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "ArrayList.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+ESR_ReturnCode ArrayListAdd(ArrayList* self, void* element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->add(self, element);
+}
+
+ESR_ReturnCode ArrayListInsertAt(ArrayList* self, size_t index, void* element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->insertAt(self, index, element);
+}
+
+ESR_ReturnCode ArrayListRemove(ArrayList* self, void* element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->remove(self, element);
+}
+
+ESR_ReturnCode ArrayListRemoveAtIndex(ArrayList* self, size_t index)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->removeAtIndex(self, index);
+}
+
+ESR_ReturnCode ArrayListRemoveAll(ArrayList* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->removeAll(self);
+}
+
+ESR_ReturnCode ArrayListContains(ArrayList* self, void* element, ESR_BOOL* exists)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->contains(self, element, exists);
+}
+
+ESR_ReturnCode ArrayListGetSize(ArrayList* self, size_t* size)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getSize(self, size);
+}
+
+ESR_ReturnCode ArrayListGet(ArrayList* self, size_t index, void** element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->get(self, index, element);
+}
+
+ESR_ReturnCode ArrayListSet(ArrayList* self, size_t index, void* element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->set(self, index, element);
+}
+
+ESR_ReturnCode ArrayListClone(ArrayList* self, ArrayList* clone)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->clone(self, clone);
+}
+
+ESR_ReturnCode ArrayListDestroy(ArrayList* self)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->destroy(self);
+}
diff --git a/portable/src/ArrayListImpl.c b/portable/src/ArrayListImpl.c
new file mode 100644
index 0000000..0451e9c
--- /dev/null
+++ b/portable/src/ArrayListImpl.c
@@ -0,0 +1,241 @@
+/*---------------------------------------------------------------------------*
+ *  ArrayListImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "ArrayList.h"
+#include "ArrayListImpl.h"
+#include "pmemory.h"
+
+#define MTAG NULL
+#define INITIAL_CAPACITY 16
+
+ESR_ReturnCode ArrayListCreateWithCapacity(ArrayList **self, size_t minCapacity)
+{
+  ArrayListImpl* impl;
+  
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  impl = NEW(ArrayListImpl, MTAG);
+  
+  if (impl == NULL)
+    return ESR_OUT_OF_MEMORY;
+    
+  impl->Interface.add = &ArrayList_Add;
+  impl->Interface.insertAt = &ArrayList_InsertAt;
+  impl->Interface.contains = &ArrayList_Contains;
+  impl->Interface.destroy = &ArrayList_Destroy;
+  impl->Interface.get = &ArrayList_Get;
+  impl->Interface.getSize = &ArrayList_GetSize;
+  impl->Interface.remove = &ArrayList_Remove;
+  impl->Interface.removeAtIndex = &ArrayList_RemoveAtIndex;
+  impl->Interface.removeAll = &ArrayList_RemoveAll;
+  impl->Interface.set = &ArrayList_Set;
+  impl->Interface.toStaticArray = NULL; /* Not implemented */
+  impl->Interface.clone = &ArrayList_Clone;
+  
+  impl->contents = MALLOC(minCapacity * sizeof(void*), MTAG);
+  if (impl->contents == NULL)
+  {
+    FREE(impl);
+    return ESR_OUT_OF_MEMORY;
+  }
+  impl->capacity = minCapacity;
+  impl->minCapacity = minCapacity;
+  impl->size = 0;
+  
+  *self = (ArrayList*) impl;
+  return ESR_SUCCESS;
+}
+
+
+ESR_ReturnCode ArrayListCreate(ArrayList** self)
+{
+  return ArrayListCreateWithCapacity(self, INITIAL_CAPACITY);
+}
+
+static ESR_ReturnCode ArrayList_Insert_Internal(ArrayListImpl *impl, size_t index, void *element)
+{
+  size_t i;
+  
+  if (impl->size >= impl->capacity)
+  {
+    /* enlarge buffer */
+    size_t newCapacity = impl->capacity * 2;
+    void** temp = REALLOC(impl->contents, newCapacity * sizeof(void*));
+    if (temp == NULL)
+      return ESR_OUT_OF_MEMORY;
+    impl->contents = temp;
+    impl->capacity = newCapacity;
+  }
+  
+  for (i = impl->size; i > index; --i)
+    impl->contents[i] = impl->contents[i - 1];
+  ++impl->size;
+  impl->contents[index] = element;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ArrayList_Add(ArrayList* self, void* element)
+{
+  ArrayListImpl *impl = (ArrayListImpl *) self;
+  
+  return ArrayList_Insert_Internal(impl, impl->size, element);
+}
+
+ESR_ReturnCode ArrayList_InsertAt(ArrayList *self, size_t index, void *element)
+{
+  ArrayListImpl *impl = (ArrayListImpl *) self;
+  
+  if (index > impl->size)
+    return ESR_ARGUMENT_OUT_OF_BOUNDS;
+    
+  return ArrayList_Insert_Internal(impl, index, element);
+}
+
+static ESR_ReturnCode ArrayList_Remove_Internal(ArrayListImpl *impl, size_t i)
+{
+  --impl->size;
+  while (i < impl->size)
+  {
+    impl->contents[i] = impl->contents[i+1];
+    ++i;
+  }
+  
+  if (impl->capacity > impl->minCapacity &&
+      impl->size <= impl->capacity / 4)
+  {
+    void** temp;
+    size_t newCapacity = impl->capacity / 2;
+    
+    /* shrink buffer */
+    if ((temp = REALLOC(impl->contents, newCapacity * sizeof(void*))) == NULL)
+      return ESR_OUT_OF_MEMORY;
+    impl->contents = temp;
+    impl->capacity = newCapacity;
+  }
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ArrayList_Remove(ArrayList* self, const void* element)
+{
+  ArrayListImpl* impl = (ArrayListImpl*) self;
+  size_t i;
+  
+  /* Remove element */
+  for (i = 0; i < impl->size; ++i)
+  {
+    if (impl->contents[i] == element)
+      return ArrayList_Remove_Internal(impl, i);
+  }
+  
+  return ESR_NO_MATCH_ERROR;
+}
+
+ESR_ReturnCode ArrayList_RemoveAtIndex(ArrayList* self, size_t index)
+{
+  ArrayListImpl* impl = (ArrayListImpl*) self;
+  
+  if (index >= impl->size)
+    return ESR_ARGUMENT_OUT_OF_BOUNDS;
+    
+  return ArrayList_Remove_Internal(impl, index);
+}
+
+ESR_ReturnCode ArrayList_RemoveAll(ArrayList* self)
+{
+  ArrayListImpl* impl = (ArrayListImpl*) self;
+  
+  impl->size = 0;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ArrayList_Contains(ArrayList* self, const void* element,
+                                  ESR_BOOL* exists)
+{
+  ArrayListImpl* impl = (ArrayListImpl*) self;
+  size_t i;
+  
+  for (i = 0; i < impl->size; ++i)
+  {
+    if (impl->contents[i] == element)
+    {
+      *exists = ESR_TRUE;
+      return ESR_SUCCESS;
+    }
+  }
+  *exists = ESR_FALSE;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ArrayList_Get(ArrayList* self, size_t index, void** element)
+{
+  ArrayListImpl* impl = (ArrayListImpl*) self;
+  
+  if (index >= impl->size)
+    return ESR_ARGUMENT_OUT_OF_BOUNDS;
+  *element = impl->contents[index];
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ArrayList_Set(ArrayList* self, size_t index, void* element)
+{
+  ArrayListImpl* impl = (ArrayListImpl*) self;
+  
+  if (index >= impl->size)
+    return ESR_ARGUMENT_OUT_OF_BOUNDS;
+  impl->contents[index] = element;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ArrayList_GetSize(ArrayList* self, size_t* size)
+{
+  ArrayListImpl* impl = (ArrayListImpl*) self;
+  
+  *size = impl->size;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ArrayList_Clone(ArrayList* self, ArrayList* clone)
+{
+  size_t size, i;
+  void* element;
+  ESR_ReturnCode rc;
+  
+  CHK(rc, clone->removeAll(clone));
+  CHK(rc, self->getSize(self, &size));
+  for (i = 0; i < size; ++i)
+  {
+    CHK(rc, self->get(self, i, &element));
+    CHK(rc, clone->add(clone, element));
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ArrayList_Destroy(ArrayList* self)
+{
+  ArrayListImpl* impl = (ArrayListImpl*) self;
+  
+  FREE(impl->contents);
+  FREE(self);
+  return ESR_SUCCESS;
+}
diff --git a/portable/src/ESR_ReturnCode.c b/portable/src/ESR_ReturnCode.c
new file mode 100644
index 0000000..539ff24
--- /dev/null
+++ b/portable/src/ESR_ReturnCode.c
@@ -0,0 +1,143 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_ReturnCode.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "ESR_ReturnCode.h"
+
+#define RETURNCODE_COUNT 28
+static LCHAR* rcStringMapping[RETURNCODE_COUNT+1] =
+  {
+    L("ESR_SUCCESS"),
+    L("ESR_CONTINUE_PROCESSING"),
+    L("ESR_FATAL_ERROR"),
+    L("ESR_BUFFER_OVERFLOW"),
+    L("ESR_OPEN_ERROR"),
+    L("ESR_ALREADY_OPEN"),
+    L("ESR_CLOSE_ERROR"),
+    L("ESR_ALREADY_CLOSED"),
+    L("ESR_READ_ERROR"),
+    L("ESR_WRITE_ERROR"),
+    L("ESR_FLUSH_ERROR"),
+    L("ESR_SEEK_ERROR"),
+    L("ESR_OUT_OF_MEMORY"),
+    L("ESR_ARGUMENT_OUT_OF_BOUNDS"),
+    L("ESR_NO_MATCH_ERROR"),
+    L("ESR_INVALID_ARGUMENT"),
+    L("ESR_NOT_SUPPORTED"),
+    L("ESR_INVALID_STATE"),
+    L("ESR_THREAD_CREATION_ERROR"),
+    L("ESR_IDENTIFIER_COLLISION"),
+    L("ESR_TIMED_OUT"),
+    L("ESR_INVALID_RESULT_TYPE"),
+    L("ESR_NOT_IMPLEMENTED"),
+    L("ESR_CONNECTION_RESET_BY_PEER"),
+    L("ESR_PROCESS_CREATE_ERROR"),
+    L("ESR_TTS_NO_ENGINE"),
+    L("ESR_MUTEX_CREATION_ERROR"),
+    L("ESR_DEADLOCK"),
+    L("invalid return code") /* must remain last element for ESR_rc2str() to function */
+  };
+  
+const LCHAR* ESR_rc2str(const ESR_ReturnCode rc)
+{
+  if (rc >= RETURNCODE_COUNT)
+    return rcStringMapping[RETURNCODE_COUNT];
+  return rcStringMapping[rc];
+}
+
+
+#ifdef _WIN32
+__declspec(thread) unsigned long stackEnd = 0;
+__declspec(thread) unsigned long stackBeginMin = LONG_MAX;
+
+#include "plog.h"
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+  void __declspec(naked) _cdecl _penter(void)
+{
+  _asm
+  {
+    pushad
+    mov ebp, esp
+  }
+  
+  {
+    unsigned long espBuffer;
+    
+    _asm
+    {
+      mov espBuffer, esp
+    }
+    if (espBuffer > stackEnd)
+      stackEnd = espBuffer;
+    //printf("\nThread=%d,-addressStack-begin=%lu\n", GetCurrentThreadId(), espBuffer);
+  }
+  
+  _asm
+  {
+    popad
+    ret
+  }
+}
+
+void __declspec(naked) _cdecl _pexit(void)
+{
+  _asm
+  {
+    pushad
+    mov ebp, esp
+  }
+  
+  {
+    unsigned long stackBegin;
+    
+    _asm
+    {
+      sub esp, 4
+      mov stackBegin, esp
+    }
+    
+    if (stackBegin < stackBeginMin)
+    {
+      stackBeginMin = stackBegin;
+      if (stackEnd - stackBegin > 20*1000)
+        printf("*****************************\nThread %d, Maximum stack usage=%lu\n*******************************\n", GetCurrentThreadId(), (stackEnd - stackBeginMin));
+    }
+    /*
+    if (stackEnd - stackBegin > 15*1000)
+     printf("\nThread=%d,Stack-size=%lu\n", GetCurrentThreadId(), (stackEnd - stackBegin));
+    */
+    
+    _asm
+    {
+      add esp, 4
+      }
+    }
+    
+  _asm
+  {
+    popad
+    ret
+  }
+}
+#endif
diff --git a/portable/src/LCHAR.c b/portable/src/LCHAR.c
new file mode 100644
index 0000000..d17e0e8
--- /dev/null
+++ b/portable/src/LCHAR.c
@@ -0,0 +1,355 @@
+/*---------------------------------------------------------------------------*
+ *  LCHAR.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "LCHAR.h"
+#include "plog.h"
+#include "pmemory.h"
+
+#define MTAG NULL
+
+ESR_ReturnCode lstrtrim(LCHAR* text)
+{
+  size_t beginning, ending, len;
+  
+  len = LSTRLEN(text);
+  
+  /* locating first non-whitespace character from beginning */
+  for (beginning = 0; beginning < len && LISSPACE(text[beginning]); ++beginning);
+  /* locating first non-whitespace character from end */
+  for (ending = len - 1; ending > beginning && LISSPACE(text[ending]); --ending);
+  
+  if (beginning > 0 && beginning <= ending)
+    LMEMMOVE(text, text + beginning, ending - beginning + 1);
+  text[ending-beginning+1] = '\0';
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode lstrinsert(const LCHAR* source, LCHAR* target, size_t offset, size_t* len)
+{
+  ESR_ReturnCode rc;
+  
+  if (source == NULL || target == NULL || len == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (LSTRLEN(source) + LSTRLEN(target) + 1 > *len)
+  {
+    *len = LSTRLEN(source) + LSTRLEN(target) + 1;
+    rc = ESR_BUFFER_OVERFLOW;
+    PLOG_DBG_TRACE((ESR_rc2str(rc)));
+    goto CLEANUP;
+  }
+  memmove(target + offset + LSTRLEN(source), target + offset, LSTRLEN(target + offset) + 1);
+  LSTRNCPY(target + offset, source, LSTRLEN(source));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode lstrreplace(LCHAR* text, const LCHAR source, const LCHAR target)
+{
+  LCHAR* index;
+  
+  while (ESR_TRUE)
+  {
+    index = LSTRCHR(text, source);
+    if (index == NULL)
+      break;
+    *index = target;
+  }
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode lstrtoi(const LCHAR* text, int* result, int base)
+{
+  LCHAR* endPtr;
+  
+  if (result == NULL)
+    return ESR_INVALID_ARGUMENT;
+  *result = LSTRTOL(text, &endPtr, base);
+  if (endPtr == text || (!LISSPACE(*endPtr) && *endPtr != L('\0')))
+    return ESR_INVALID_ARGUMENT;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode lstrtoui(const LCHAR* text, unsigned int* result, int base)
+{
+  LCHAR* endPtr;
+  
+  if (result == NULL)
+    return ESR_INVALID_ARGUMENT;
+  *result = LSTRTOUL(text, &endPtr, base);
+  if (endPtr == text || (!LISSPACE(*endPtr) && *endPtr != L('\0')))
+    return ESR_INVALID_ARGUMENT;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode lstrtof(const LCHAR* text, float* result)
+{
+  LCHAR* endPtr;
+  
+  if (result == NULL)
+    return ESR_INVALID_ARGUMENT;
+  *result = (float) LSTRTOD(text, &endPtr);
+  if (endPtr == text || (!LISSPACE(*endPtr) && *endPtr != L('\0')))
+    return ESR_INVALID_ARGUMENT;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode lstrtob(const LCHAR* text, ESR_BOOL* result)
+{
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  int compare;
+  unsigned int temp;
+  
+  if (result == NULL)
+    return ESR_INVALID_ARGUMENT;
+  CHKLOG(rc, lstrcasecmp(text, L("true"), &compare));
+  if (compare == 0)
+  {
+    *result = ESR_TRUE;
+    return ESR_SUCCESS;
+  }
+  CHKLOG(rc, lstrcasecmp(text, L("yes"), &compare));
+  if (compare == 0)
+  {
+    *result = ESR_TRUE;
+    return ESR_SUCCESS;
+  }
+  CHKLOG(rc, lstrcasecmp(text, L("false"), &compare));
+  if (compare == 0)
+  {
+    *result = ESR_FALSE;
+    return ESR_SUCCESS;
+  }
+  CHKLOG(rc, lstrcasecmp(text, L("no"), &compare));
+  if (compare == 0)
+  {
+    *result = ESR_FALSE;
+    return ESR_SUCCESS;
+  }
+  
+  /* Check for boolean expressed as an integer value */
+  CHK(rc, lstrtoui(text, &temp, 10));
+  *result = (temp != 0);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode LCHARGetInt( LCHAR* text, int* value, LCHAR** finalPosition)
+{
+  LCHAR *beg, *end;
+  LCHAR temp;
+  ESR_ReturnCode rc;
+  
+  /* Skip whitespace */
+  for (beg = text; *beg != L('\0') && LISSPACE(*beg); ++beg);
+  if (beg == NULL)
+    return ESR_INVALID_ARGUMENT; /* invalid command syntax */
+  /* Find next whitespace */
+  for (end = beg; *end != L('\0') && !LISSPACE(*end); ++end);
+  if (end == NULL)
+    return ESR_INVALID_ARGUMENT; /* invalid command syntax */
+    
+  temp = *end;
+  *end = L('\0');
+  rc = lstrtoi(beg, value, 10);
+  if (rc != ESR_SUCCESS)
+  {
+    *end = temp;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  *end = temp;
+  if (finalPosition != NULL)
+    *finalPosition = end;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode lstrlwr(LCHAR* string)
+{
+  if (string)
+  {
+    while (*string)
+    {
+      if (LISALPHA(*string))
+        *string = (LCHAR) LTOLOWER(*string);
+      ++string;
+    }
+  }
+  else
+    return ESR_INVALID_ARGUMENT;
+    
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode lstrupr(LCHAR* string)
+{
+  if (string)
+  {
+    while (*string)
+    {
+      if (LISALPHA(*string))
+        *string = (LCHAR) LTOUPPER(*string);
+      ++string;
+    }
+  }
+  else
+    return ESR_INVALID_ARGUMENT;
+    
+  return ESR_SUCCESS;
+}
+
+/* strcasecmp is not POSIX.4 API */
+ESR_ReturnCode lstrcasecmp(const LCHAR *string1, const LCHAR *string2, int *result)
+{
+
+  if (!string1 || !string2)
+    return ESR_INVALID_ARGUMENT;
+    
+  while (LTOUPPER(*string1) == LTOUPPER(*string2++))
+  {
+    if (!*string1++)
+    {
+      *result = 0;
+      return ESR_SUCCESS;
+    }
+  }
+  
+  *result = LTOUPPER(*string1) - LTOUPPER(*--string2);
+  return ESR_SUCCESS;
+}
+
+/**
+ * This code is from MS SDK: C:\PROGRAM FILES\MICROSOFT SDK\src\crt\xtoa.c
+ * Buffer overflow checking is left up to the caller.
+ *
+ * @param value Number to be converted
+ * @param string String result
+ * @param radix Base of value; must be in the range 2 - 36
+ */
+static void pxtoa(unsigned long val, LCHAR *buf, unsigned radix, int is_neg)
+{
+  LCHAR *p;                /* pointer to traverse string */
+  LCHAR *firstdig;         /* pointer to first digit */
+  LCHAR temp;              /* temp char */
+  unsigned digval;        /* value of digit */
+  
+  p = buf;
+  
+  if (is_neg)
+  {
+    /* negative, so output '-' and negate */
+    *p++ = '-';
+    val = (unsigned long)(-(long)val);
+  }
+  
+  firstdig = p;           /* save pointer to first digit */
+  
+  do
+  {
+    digval = (unsigned)(val % radix);
+    val /= radix;       /* get next digit */
+    
+    /* convert to ascii and store */
+    if (digval > 9)
+      *p++ = (LCHAR)(digval - 10 + 'a');  /* a letter */
+    else
+      *p++ = (LCHAR)(digval + '0');       /* a digit */
+  }
+  while (val > 0);
+  
+  /* We now have the digit of the number in the buffer, but in reverse
+     order.  Thus we reverse them now. */
+  
+  *p-- = '\0';            /* terminate string; p points to last digit */
+  
+  do
+  {
+    temp = *p;
+    *p = *firstdig;
+    *firstdig = temp;   /* swap *p and *firstdig */
+    --p;
+    ++firstdig;         /* advance to next two digits */
+  }
+  while (firstdig < p); /* repeat until halfway */
+}
+
+/*
+ * Convert an integer to a string.
+ */
+ESR_ReturnCode litostr(int value, LCHAR *string, size_t *len, int radix)
+{
+  size_t size;
+  /* pxtoa() is guaranteed not to overflow past 33 characters */
+  LCHAR buffer[33];
+  
+  if (!string)
+    return ESR_INVALID_ARGUMENT;
+    
+  if (radix == 10 && value < 0)
+    pxtoa((unsigned long) value, buffer, radix, 1);
+  else
+    pxtoa((unsigned long) value, buffer, radix, 0);
+    
+  size = LSTRLEN(buffer);
+  
+  if (size >= *len)   /* + null-terminated character */
+  {
+    *len = size;
+    return ESR_BUFFER_OVERFLOW;
+  }
+  else
+    LSTRCPY(string, buffer);
+    
+  return ESR_SUCCESS;
+}
+
+
+/* Convert an unsigned long integer to a string. */
+ESR_ReturnCode lultostr(unsigned long  value, LCHAR *string, size_t *len, int radix)
+{
+  size_t size;
+  LCHAR buffer[33];
+  
+  if (!string)
+    return ESR_INVALID_ARGUMENT;
+    
+  pxtoa(value, buffer, radix, 0);
+  
+  size = LSTRLEN(buffer);
+  
+  if (size >= *len)   /* + null-terminated character */
+  {
+    *len = size;
+    return ESR_BUFFER_OVERFLOW;
+  }
+  else
+  {
+    *len = size;
+    LSTRCPY(string, buffer);
+  }
+  
+  return ESR_SUCCESS;
+}
diff --git a/portable/src/PANSIFileImpl.c b/portable/src/PANSIFileImpl.c
new file mode 100644
index 0000000..6d9a261
--- /dev/null
+++ b/portable/src/PANSIFileImpl.c
@@ -0,0 +1,449 @@
+/*---------------------------------------------------------------------------*
+ *  PANSIFileImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "errno.h"
+#include "passert.h"
+#include "pendian.h"
+#include "PFileImpl.h"
+#include "PANSIFileImpl.h"
+#include "PFileSystem.h"
+#include "ESR_ReturnCode.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "pstdio.h"
+#include "ptypes.h"
+
+#define MTAG NULL
+
+ESR_ReturnCode PANSIFileCreateImpl(const LCHAR* filename, ESR_BOOL isLittleEndian, PFile** self)
+{
+  PANSIFileImpl* impl = NULL;
+  ESR_ReturnCode rc;
+  
+  impl = NEW(PANSIFileImpl, MTAG);
+  if (impl == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  PFileCreateImpl(&impl->Interface.Interface, filename, isLittleEndian);
+  impl->Interface.Interface.close = &PANSIFileCloseImpl;
+  impl->Interface.Interface.clearError = &PANSIFileClearErrorImpl;
+  impl->Interface.Interface.destroy = &PANSIFileDestroyImpl;
+  impl->Interface.Interface.fgetc = &PANSIFileFgetcImpl;
+  impl->Interface.Interface.fgets = &PANSIFileFgetsImpl;
+  impl->Interface.Interface.getPosition = &PANSIFileGetPositionImpl;
+  impl->Interface.Interface.hideMemoryAllocation = &PANSIFileHideMemoryAllocation;
+  impl->Interface.Interface.isEOF = &PANSIFileIsEOFImpl;
+  impl->Interface.Interface.isErrorSet = &PANSIFileIsErrorSetImpl;
+  impl->Interface.Interface.isOpen = &PANSIFileIsOpenImpl;
+  impl->Interface.Interface.open = &PANSIFileOpenImpl;
+  impl->Interface.Interface.read = &PANSIFileReadImpl;
+  impl->Interface.Interface.seek = &PANSIFileSeekImpl;
+  impl->Interface.Interface.flush = &PANSIFileFlushImpl;
+  impl->Interface.Interface.write = &PANSIFileWriteImpl;
+  
+  impl->Interface.filename[0] = 0;
+  impl->value = NULL;
+  
+  LSTRCAT(impl->Interface.filename, filename);
+  *self = &impl->Interface.Interface;
+  return ESR_SUCCESS;
+CLEANUP:
+  if (impl != NULL)
+    impl->Interface.Interface.destroy(&impl->Interface.Interface);
+  return rc;
+}
+
+ESR_ReturnCode PANSIFileDestroyImpl(PFile* self)
+{
+  ESR_ReturnCode rc;
+  
+  CHK(rc, PFileDestroyImpl(self));
+  FREE(self);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+
+#ifdef USE_THREAD
+#define LOCK_MUTEX(rc, impl) \
+  if (impl->Interface.lock != NULL) \
+    CHKLOG(rc, PtrdMonitorLock(impl->Interface.lock));
+#else
+#define LOCK_MUTEX(rc, impl)
+#endif
+
+
+#ifdef USE_THREAD
+#define CLEANUP_AND_RETURN(rc, impl) \
+  if (impl->Interface.lock!=NULL) \
+    CHKLOG(rc, PtrdMonitorUnlock(impl->Interface.lock)); \
+  return ESR_SUCCESS; \
+  CLEANUP: \
+  if (impl->Interface.lock!=NULL) \
+    PtrdMonitorUnlock(impl->Interface.lock); \
+  return rc;
+#else
+#define CLEANUP_AND_RETURN(rc, impl) \
+  return ESR_SUCCESS; \
+  CLEANUP: \
+  return rc;
+#endif
+
+
+ESR_ReturnCode PANSIFileOpenImpl(PFile* self, const LCHAR* mode)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  if (impl->value != NULL)
+  {
+    rc = ESR_ALREADY_OPEN;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  impl->value = fopen(impl->Interface.filename, mode);
+  
+  if (impl->value == NULL)
+  {
+    LCHAR path[P_PATH_MAX];
+    size_t len;
+    
+    len = P_PATH_MAX;
+    CHKLOG(rc, PFileSystemGetcwd(path, &len));
+    rc = ESR_OPEN_ERROR;
+    /* PLOG_DBG_TRACE((L("%s: filename=%s, cwd=%s"), ESR_rc2str(rc), impl->Interface.filename, path)); */
+    PLogError(L("%s: filename=%s, cwd=%s"), ESR_rc2str(rc), impl->Interface.filename, path);
+    goto CLEANUP;
+  }
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileCloseImpl(PFile* self)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  if (fclose(impl->value) != 0)
+  {
+    rc = ESR_CLOSE_ERROR;
+    PLogMessage(L("%s: file %s, handle"), ESR_rc2str(rc), impl->Interface.filename, impl->value);
+    goto CLEANUP;
+  }
+  impl->value = NULL;
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileReadImpl(PFile* self, void* buffer, size_t size, size_t* count)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  if (count == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  if (size != 0 && *count != 0)
+  {
+    ESR_BOOL needToSwap;
+    
+    *count = fread(buffer, size, *count, impl->value);
+    if (*count == 0 && ferror(impl->value))
+    {
+      rc = ESR_READ_ERROR;
+      PLogMessage(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    
+#ifdef __LITTLE_ENDIAN
+    needToSwap = !impl->Interface.littleEndian;
+#else
+    needToSwap = impl->Interface.littleEndian;
+#endif
+    
+    if (needToSwap)
+      swap_byte_order(buffer, *count, size);
+  }
+  else
+    *count = 0;
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileWriteImpl(PFile* self, void* buffer, size_t size, size_t* count)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  size_t requested = *count;
+  
+  LOCK_MUTEX(rc, impl);
+  if (count == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (size != 0 && *count != 0)
+  {
+    ESR_BOOL needToSwap;
+    void* temp;
+    
+#ifdef __LITTLE_ENDIAN
+    needToSwap = !impl->Interface.littleEndian;
+#else
+    needToSwap = impl->Interface.littleEndian;
+#endif
+    if (needToSwap)
+    {
+      temp = MALLOC(*count * size, MTAG);
+      if (temp == NULL)
+      {
+        rc = ESR_OUT_OF_MEMORY;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      memcpy(temp, buffer, *count * size);
+      
+      swap_byte_order(temp, *count, size);
+    }
+    else
+      temp = buffer;
+      
+    *count = fwrite(temp, size, *count, impl->value);
+    if (needToSwap)
+    {
+      FREE(temp);
+      temp = NULL;
+    }
+    
+    if (*count < requested)
+    {
+      rc = ESR_WRITE_ERROR;
+      PLogMessage(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  else
+    *count = 0;
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileFlushImpl(PFile* self)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  if (fflush(impl->value) != 0)
+  {
+    rc = ESR_FLUSH_ERROR;
+    PLogMessage(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileSeekImpl(PFile* self, long offset, int origin)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  if (fseek(impl->value, offset, origin) != 0)
+  {
+    rc = ESR_SEEK_ERROR;
+    PLogMessage(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileGetPositionImpl(PFile* self, size_t* position)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  long pos;
+  
+  LOCK_MUTEX(rc, impl);
+  pos = ftell(impl->value);
+  if (pos == -1)
+  {
+    switch (errno)
+    {
+      case EBADF:
+        rc = ESR_INVALID_STATE;
+        PLogError(L("%s: Got EBADF"), rc);
+        goto CLEANUP;
+      case EINVAL:
+        rc = ESR_INVALID_STATE;
+        PLogError(L("%s: Got EINVAL"), rc);
+        goto CLEANUP;
+      default:
+        rc = ESR_INVALID_STATE;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+    }
+  }
+  *position = pos;
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileIsOpenImpl(PFile* self, ESR_BOOL* isOpen)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  if (isOpen == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  *isOpen = impl->value != NULL;
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileIsEOFImpl(PFile* self, ESR_BOOL* isEof)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  if (isEof == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+#ifdef NO_FEOF
+  {
+    long posCur;	/* remember current file position */
+    long posEnd;	/* end of file position */
+		
+    posCur = ftell(impl->value);
+    fseek(impl->value, 0, SEEK_END);
+    posEnd = ftell(impl->value);
+    *isEof = (posCur == posEnd);
+    fseek(impl->value, posCur, SEEK_SET);  /* restore position in file */
+  }
+#else	
+  *isEof = feof(impl->value) != 0;
+#endif
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileIsErrorSetImpl(PFile* self, ESR_BOOL* isError)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  if (isError == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  *isError = ferror(impl->value) != 0;
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileClearErrorImpl(PFile* self)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  clearerr(impl->value);
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileFgetsImpl(PFile* self, LCHAR* string, int n, LCHAR** result)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  LCHAR* temp;
+  
+  LOCK_MUTEX(rc, impl);
+  temp = fgets(string, n, impl->value);
+  if (result != NULL)
+    *result = temp;
+  if (temp == NULL && ferror(impl->value))
+  {
+    rc = ESR_INVALID_STATE;
+    PLogMessage(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileFgetcImpl(PFile* self, LINT* result)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  *result = fgetc(impl->value);
+  if (*result == PEOF && ferror(impl->value))
+  {
+    rc = ESR_INVALID_STATE;
+    PLogMessage(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PANSIFileHideMemoryAllocation(PFile* self)
+{
+  PANSIFileImpl* impl = (PANSIFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  LOCK_MUTEX(rc, impl);
+  rc = PMemLogFree(self);
+  if (rc != ESR_SUCCESS)
+  {
+    pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__);
+    goto CLEANUP;
+  }
+  rc = PMemLogFree(impl->Interface.filename);
+  if (rc != ESR_SUCCESS)
+  {
+    pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__);
+    goto CLEANUP;
+  }
+#ifdef USE_THREAD
+  rc = PMemLogFree(impl->Interface.lock);
+  if (rc != ESR_SUCCESS)
+  {
+    pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__);
+    goto CLEANUP;
+  }
+#endif
+  CLEANUP_AND_RETURN(rc, impl);
+}
diff --git a/portable/src/PANSIFileSystem.c b/portable/src/PANSIFileSystem.c
new file mode 100644
index 0000000..70c7b5d
--- /dev/null
+++ b/portable/src/PANSIFileSystem.c
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------------*
+ *  PANSIFileSystem.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "LCHAR.h"
+#include "PANSIFileSystemImpl.h"
+#include "plog.h"
+
+extern PFileSystem* PANSIFileSystemSingleton;
+
+ESR_ReturnCode PANSIFileSystemAddPath(const LCHAR* virtualPath, const LCHAR* realPath)
+{
+  return ((PANSIFileSystem*) PANSIFileSystemSingleton)->addPath(PANSIFileSystemSingleton, virtualPath, realPath);
+}
+
+ESR_ReturnCode PANSIFileSystemRemovePath(const LCHAR* virtualPath)
+{
+  return ((PANSIFileSystem*) PANSIFileSystemSingleton)->removePath(PANSIFileSystemSingleton, virtualPath);
+}
+
+ESR_ReturnCode PANSIFileSystemGetcwd(LCHAR* path, size_t* len)
+{
+  return ((PANSIFileSystem*) PANSIFileSystemSingleton)->getcwd(PANSIFileSystemSingleton, path, len);
+}
+
+ESR_ReturnCode PANSIFileSystemDestroy(void)
+{
+  ESR_ReturnCode rc;
+  
+  if (PANSIFileSystemSingleton == NULL)
+    return ESR_SUCCESS;
+  CHKLOG(rc, PANSIFileSystemSingleton->destroy(PANSIFileSystemSingleton));
+  PANSIFileSystemSingleton = NULL;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/portable/src/PANSIFileSystemImpl.c b/portable/src/PANSIFileSystemImpl.c
new file mode 100644
index 0000000..cbe74b3
--- /dev/null
+++ b/portable/src/PANSIFileSystemImpl.c
@@ -0,0 +1,365 @@
+/*---------------------------------------------------------------------------*
+ *  PANSIFileSystemImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "LCHAR.h"
+#include "PFileSystemImpl.h"
+#include "PANSIFileSystemImpl.h"
+#include "PANSIFileImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+//extern PFileSystem* PANSIFileSystemSingleton;
+PFileSystem* PANSIFileSystemSingleton = (PFileSystem*)NULL;
+
+#define MTAG NULL
+
+
+#ifdef USE_THREAD
+/* Prototype of private function */
+PORTABLE_API ESR_ReturnCode PtrdFlush();
+#endif
+
+/**
+ * [file path, PFileSystem*] mapping.
+ */
+extern PHashTable* PFileSystemPathMap;
+
+
+ESR_ReturnCode PANSIFileSystemCreate(void)
+{
+  PANSIFileSystemImpl* impl;
+  ESR_ReturnCode rc;
+  
+  if (PANSIFileSystemSingleton != NULL)
+    return ESR_SUCCESS;
+  impl = NEW(PANSIFileSystemImpl, MTAG);
+  if (impl == NULL)
+    return ESR_OUT_OF_MEMORY;
+  impl->super.super.destroy = &PANSIFileSystemDestroyImpl;
+  impl->super.super.createPFile = &PANSIFileSystemCreatePFileImpl;
+  impl->super.addPath = &PANSIFileSystemAddPathImpl;
+  impl->super.removePath = &PANSIFileSystemRemovePathImpl;
+  impl->super.getcwd = &PANSIFileSystemGetcwdImpl;
+  impl->super.super.mkdir = &PANSIFileSystemMkdirImpl;
+  impl->super.super.chdir = &PANSIFileSystemChdirImpl;
+  
+  CHKLOG(rc, PHashTableCreate(NULL, MTAG, &impl->directoryMap));
+  PANSIFileSystemSingleton = &impl->super.super;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PANSIFileSystemDestroyImpl(PFileSystem* self)
+{
+  PANSIFileSystemImpl* impl = (PANSIFileSystemImpl*) self;
+  PHashTableEntry* entry;
+  PHashTableEntry* oldEntry;
+  LCHAR* key;
+  LCHAR* value;
+  ESR_ReturnCode rc;
+  
+  if (impl->directoryMap != NULL)
+  {
+    CHKLOG(rc, PHashTableEntryGetFirst(impl->directoryMap, &entry));
+    while (entry != NULL)
+    {
+      CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)&value));
+      oldEntry = entry;
+      CHKLOG(rc, PHashTableEntryAdvance(&entry));
+      CHKLOG(rc, PHashTableEntryRemove(oldEntry));
+      CHKLOG(rc, PHashTableRemoveValue(PFileSystemPathMap, key, NULL));
+      FREE(key);
+      FREE(value);
+    }
+    CHKLOG(rc, PHashTableDestroy(impl->directoryMap));
+    impl->directoryMap = NULL;
+  }
+  FREE(self);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PANSIFileSystemAddPathImpl(PFileSystem* self, const LCHAR* virtualPath, const LCHAR* realPath)
+{
+  PANSIFileSystemImpl* impl = (PANSIFileSystemImpl*) self;
+  ESR_BOOL exists;
+  LCHAR* key = NULL;
+  LCHAR* value = NULL;
+  ESR_ReturnCode rc;
+  size_t len;
+  
+  if (virtualPath == NULL || realPath == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  len = LSTRLEN(virtualPath) + 1;
+  if (virtualPath[LSTRLEN(virtualPath)-1] != L('/'))
+    ++len;
+  key = MALLOC(sizeof(LCHAR) * len, MTAG);
+  if (key == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(key, virtualPath);
+  /* Make sure paths end with '/' */
+  CHKLOG(rc, PFileSystemCanonicalSlashes(key));
+  if (key[LSTRLEN(key)-1] != L('/'))
+    LSTRCAT(key, L("/"));
+  value = MALLOC(sizeof(LCHAR) * (LSTRLEN(realPath) + 1), MTAG);
+  if (value == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(value, realPath);
+  
+  /* Make sure realPath is not an empty string */
+  lstrtrim(value);
+  if (LSTRLEN(value) == 0)
+  {
+    FREE(value);
+    value = NULL;
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(L("%s: realPath cannot be empty"), ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  /* Make sure paths end with '/' */
+  CHKLOG(rc, PFileSystemCanonicalSlashes(value));
+  if (value[LSTRLEN(value)-1] != L('/'))
+    LSTRCAT(value, L("/"));
+    
+  CHKLOG(rc, PHashTableContainsKey(impl->directoryMap, key, &exists));
+  if (exists)
+  {
+    LCHAR* oldValue;
+    
+    CHKLOG(rc, PHashTableGetValue(impl->directoryMap, key, (void **)&oldValue));
+    if (LSTRCMP(oldValue, value) != 0)
+    {
+      rc = ESR_IDENTIFIER_COLLISION;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  CHKLOG(rc, PHashTablePutValue(impl->directoryMap, key, value, NULL));
+  CHKLOG(rc, PHashTablePutValue(PFileSystemPathMap, key, self, NULL));
+  return ESR_SUCCESS;
+CLEANUP:
+  FREE(key);
+  FREE(value);
+  return rc;
+}
+
+ESR_ReturnCode PANSIFileSystemRemovePathImpl(PFileSystem* self, const LCHAR* virtualPath)
+{
+  PANSIFileSystemImpl* impl = (PANSIFileSystemImpl*) self;
+  LCHAR path[P_PATH_MAX];
+  LCHAR* key;
+  LCHAR* value;
+  PHashTableEntry* entry;
+  ESR_ReturnCode rc;
+  
+  if (virtualPath == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  /* Make sure paths end with '/' */
+  LSTRCPY(path, virtualPath);
+  CHKLOG(rc, PFileSystemCanonicalSlashes(path));
+  if (path[LSTRLEN(path)-1] != L('/'))
+    LSTRCAT(path, L("/"));
+  CHKLOG(rc, PHashTableGetEntry(impl->directoryMap, path, &entry));
+  CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)&value));
+  CHKLOG(rc, PHashTableEntryRemove(entry));
+  CHKLOG(rc, PHashTableRemoveValue(PFileSystemPathMap, key, NULL));
+  FREE(key);
+  FREE(value);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PANSIFileSystemGetRealPathImpl(PFileSystem* self, LCHAR* path, size_t* len)
+{
+  PANSIFileSystemImpl* impl = (PANSIFileSystemImpl*) self;
+  PHashTableEntry* entry;
+  LCHAR* key;
+  LCHAR* value;
+  LCHAR* bestKey = NULL;
+  LCHAR* bestValue = NULL;
+  ESR_BOOL isAbsolute;
+  ESR_ReturnCode rc;
+  
+  CHKLOG(rc, PFileSystemGetAbsolutePath(path, len));
+  CHKLOG(rc, PHashTableEntryGetFirst(impl->directoryMap, &entry));
+  while (entry != NULL)
+  {
+    CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void**)&key, (void**)&value));
+    if (LSTRNCMP(path, key, LSTRLEN(key)) == 0)
+    {
+      /* File-system handles file path */
+      if (bestKey == NULL || LSTRLEN(key) > LSTRLEN(bestKey))
+      {
+        /* Found a better match -- the new key is a subdirectory of the previous bestKey */
+        bestKey = key;
+        bestValue = value;
+      }
+    }
+    CHKLOG(rc, PHashTableEntryAdvance(&entry));
+  }
+  if (bestKey == NULL)
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(L("PANSIFileSystem does not handle the specified path: %s"), path);
+    goto CLEANUP;
+  }
+  
+  if (LSTRLEN(bestValue) + 1 > *len)
+  {
+    *len = LSTRLEN(bestValue) + 1;
+    rc = ESR_BUFFER_OVERFLOW;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  /* Delete the virtual-path */
+  LSTRCPY(path, path + LSTRLEN(bestKey));
+  
+  CHKLOG(rc, PFileSystemIsAbsolutePath(path, &isAbsolute));
+  if (LSTRCMP(bestValue, L("/")) == 0 && isAbsolute)
+  {
+    /* do nothing */
+  }
+  else
+  {
+    /* Insert the key-path */
+    CHKLOG(rc, lstrinsert(bestValue, path, 0, len));
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PANSIFileSystemCreatePFileImpl(PFileSystem* self, const LCHAR* path, ESR_BOOL littleEndian, PFile** file)
+{
+  LCHAR realPath[P_PATH_MAX];
+  size_t len;
+  ESR_ReturnCode rc;
+  
+  LSTRCPY(realPath, path);
+  len = P_PATH_MAX;
+  CHKLOG(rc, PANSIFileSystemGetRealPathImpl(self, realPath, &len));
+  return PANSIFileCreateImpl(realPath, littleEndian, file);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PANSIFileSystemSetDefault(ESR_BOOL isDefault)
+{
+  PANSIFileSystemImpl* impl = (PANSIFileSystemImpl*) PANSIFileSystemSingleton;
+  ESR_BOOL exists;
+  LCHAR* key = NULL;
+  LCHAR* value = NULL;
+  PHashTableEntry* entry;
+  ESR_ReturnCode rc;
+  
+  if (isDefault)
+  {
+
+		key = MALLOC(sizeof(LCHAR), MTAG);
+    if (key == NULL)
+    {
+      rc = ESR_OUT_OF_MEMORY;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    LSTRCPY(key, L(""));
+    value = MALLOC(sizeof(LCHAR), MTAG);
+    if (value == NULL)
+    {
+      rc = ESR_OUT_OF_MEMORY;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    LSTRCPY(value, L(""));
+    
+    CHKLOG(rc, PHashTableContainsKey(impl->directoryMap, key, &exists));
+    if (exists)
+    {
+      LCHAR* key;
+      LCHAR* value;
+      
+      CHKLOG(rc, PHashTableGetEntry(impl->directoryMap, L(""), &entry));
+      CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)&value));
+      CHKLOG(rc, PHashTableEntryRemove(entry));
+      CHKLOG(rc, PHashTableRemoveValue(PFileSystemPathMap, key, NULL));
+      FREE(key);
+      FREE(value);
+    }
+    CHKLOG(rc, PHashTablePutValue(impl->directoryMap, key, value, NULL));
+    CHKLOG(rc, PHashTablePutValue(PFileSystemPathMap, key, PANSIFileSystemSingleton, NULL));
+
+		/* Set virtual current working directory to native current working directory */
+  }
+  else
+  {
+    CHKLOG(rc, PHashTableContainsKey(impl->directoryMap, L(""), &exists));
+    if (exists)
+    {
+      LCHAR* key;
+      LCHAR* value;
+      
+      CHKLOG(rc, PHashTableGetEntry(impl->directoryMap, L(""), &entry));
+      CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)&value));
+
+      CHKLOG(rc, PHashTableContainsKey(PFileSystemPathMap, L(""), &exists));
+      if (exists)
+      {
+        LCHAR* key;
+        PFileSystem* value;
+        PHashTableEntry* entry;
+        
+        CHKLOG(rc, PHashTableGetEntry(PFileSystemPathMap, L(""), &entry));
+        CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)&value));
+        if (value == PANSIFileSystemSingleton)
+          CHKLOG(rc, PHashTableEntryRemove(entry));
+      }
+
+      CHKLOG(rc, PHashTableEntryRemove(entry));
+      FREE(key);
+      FREE(value);
+    }
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  FREE(key);
+  FREE(value);
+  return rc;
+}
diff --git a/portable/src/PFile.c b/portable/src/PFile.c
new file mode 100644
index 0000000..06e1317
--- /dev/null
+++ b/portable/src/PFile.c
@@ -0,0 +1,521 @@
+/*---------------------------------------------------------------------------*
+ *  PFile.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "LCHAR.h"
+#include "pendian.h"
+#include "PFile.h"
+#include "PFileSystem.h"
+#include "plog.h"
+#include "pstdio.h"
+
+
+ESR_ReturnCode PFileDestroy(PFile* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
+
+ESR_ReturnCode PFileOpen(PFile* self, const LCHAR* mode)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->open(self, mode);
+}
+
+ESR_ReturnCode PFileClose(PFile* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->close(self);
+}
+
+ESR_ReturnCode PFileRead(PFile* self, void* buffer, size_t size, size_t* count)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->read(self, buffer, size, count);
+}
+
+ESR_ReturnCode PFileWrite(PFile* self, void* buffer, size_t size, size_t* count)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->write(self, buffer, size, count);
+}
+
+ESR_ReturnCode PFileFlush(PFile* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->flush(self);
+}
+
+ESR_ReturnCode PFileSeek(PFile* self, long offset, int origin)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->seek(self, offset, origin);
+}
+
+
+ESR_ReturnCode PFileGetPosition(PFile* self, size_t* position)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getPosition(self, position);
+}
+
+ESR_ReturnCode PFileIsOpen(PFile* self, ESR_BOOL* isOpen)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isOpen(self, isOpen);
+}
+
+ESR_ReturnCode PFileIsEOF(PFile* self, ESR_BOOL* isEof)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isEOF(self, isEof);
+}
+
+ESR_ReturnCode PFileGetFilename(PFile* self, LCHAR* filename, size_t* len)
+{
+  ESR_ReturnCode rc;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  rc = self->getFilename(self, filename, len);
+  return rc;
+}
+
+ESR_ReturnCode PFileIsErrorSet(PFile* self, ESR_BOOL* isError)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isErrorSet(self, isError);
+}
+
+ESR_ReturnCode PFileClearError(PFile* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->clearError(self);
+}
+
+ESR_ReturnCode PFileVfprintf(PFile* self, int* result, const LCHAR* format, va_list args)
+{
+  ESR_ReturnCode rc;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  rc = self->vfprintf(self, result, format, args);
+  return rc;
+}
+
+ESR_ReturnCode PFileFgetc(PFile* self, LINT* result)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->fgetc(self, result);
+}
+
+ESR_ReturnCode PFileFgets(PFile* self, LCHAR* string, int n, LCHAR** result)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->fgets(self, string, n, result);
+}
+
+ESR_ReturnCode PFileReadInt(PFile* self, int* value)
+{
+  LCHAR number[MAX_INT_DIGITS+1];
+  size_t i, bufferSize, count, totalRead = 0;
+  ESR_ReturnCode rc;
+  
+  /* Skip whitespace before token */
+  do
+  {
+    count = pfread(number, sizeof(LCHAR), MAX_INT_DIGITS, self);
+    totalRead += count;
+    if (count < MAX_INT_DIGITS)
+    {
+      if (pferror(self))
+      {
+        rc = ESR_READ_ERROR;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      else
+      {
+        rc = ESR_INVALID_STATE;
+        PLogError(L("%s: reached end of file before finding token"), ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+    }
+    /* locate first non-whitespace character */
+    for (i = 0; i < count && LISSPACE(number[i]); ++i);
+  }
+  while (i == count);
+  bufferSize = count - i;
+  
+  /* Fill remainder of buffer */
+  if (bufferSize < MAX_INT_DIGITS)
+  {
+    count = pfread(number + bufferSize, sizeof(LCHAR), MAX_INT_DIGITS - bufferSize, self);
+    bufferSize += count;
+    totalRead += count;
+    if (count < MAX_INT_DIGITS - bufferSize && pferror(self))
+    {
+      rc = ESR_READ_ERROR;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  
+  /* locate first whitespace character */
+  for (i = 0; i < bufferSize && !LISSPACE(number[i]); ++i);
+  if (i < bufferSize)
+  {
+    /* unread anything after the token */
+    if (PFileSeek(self, - (int)(bufferSize - i), SEEK_CUR))
+    {
+      rc = ESR_SEEK_ERROR;
+      PLogError(ESR_rc2str(rc));
+    }
+    totalRead -= bufferSize - i;
+    number[i] = L('\0');
+  }
+  
+  if (number[0] != L('-') && !LISDIGIT(number[0]))
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(L("%s: token was not number (%s)"), ESR_rc2str(rc), number);
+    goto CLEANUP;
+  }
+  
+  CHKLOG(rc, lstrtoi(number, value, 10));
+  return rc;
+CLEANUP:
+  if (PFileSeek(self,  - (int) count, SEEK_CUR))
+    PLogError(L("ESR_SEEK_ERROR"));
+  return rc;
+}
+
+ESR_ReturnCode PFileReadLCHAR(PFile* self, LCHAR* value, size_t len)
+{
+  size_t i, bufferSize, count, totalRead = 0;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  /* Skip whitespace before token */
+  do
+  {
+    count = pfread(value, sizeof(LCHAR), len, self);
+    totalRead += count;
+    if (count < len)
+    {
+      if (pferror(self))
+      {
+        rc = ESR_READ_ERROR;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      else
+      {
+        rc = ESR_INVALID_STATE;
+        PLogError(L("%s: reached end of file before finding token"), ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+    }
+    /* locate first non-whitespace character */
+    for (i = 0; i < count && LISSPACE(value[i]); ++i);
+  }
+  while (i == count);
+  bufferSize = count - i;
+  
+  /* Fill remainder of buffer */
+  if (bufferSize < len)
+  {
+    count = pfread(value + bufferSize, sizeof(LCHAR), len - bufferSize, self);
+    bufferSize += count;
+    totalRead += count;
+    if (count < len - bufferSize && pferror(self))
+    {
+      rc = ESR_READ_ERROR;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  
+  /* locate first whitespace character */
+  for (i = 0; i < bufferSize && !LISSPACE(value[i]); ++i);
+  if (i < bufferSize)
+  {
+    /* unread anything after the token */
+    if (PFileSeek(self, -(int)(bufferSize - i), SEEK_CUR))
+    {
+      rc = ESR_SEEK_ERROR;
+      PLogError(ESR_rc2str(rc));
+    }
+    totalRead -= bufferSize - i;
+    value[i] = L('\0');
+  }
+  return rc;
+CLEANUP:
+  if (PFileSeek(self, - (int) count, SEEK_CUR))
+    PLogError(L("ESR_SEEK_ERROR"));
+  return rc;
+}
+
+PFile* pfopen(const LCHAR* filename, const LCHAR* mode)
+{
+  PFile* result;
+  ESR_ReturnCode rc;
+  ESR_BOOL isLittleEndian;
+  
+#if __BYTE_ORDER==__LITTLE_ENDIAN
+  isLittleEndian = ESR_TRUE;
+#else
+  isLittleEndian = ESR_FALSE;
+#endif
+  
+  rc = PFileSystemCreatePFile(filename, isLittleEndian, &result);
+  if (rc != ESR_SUCCESS)
+    return NULL;
+  rc = result->open(result, mode);
+  if (rc != ESR_SUCCESS)
+  {
+    result->destroy(result);
+    return NULL;
+  }
+  return result;
+}
+
+size_t pfread(void* buffer, size_t size, size_t count, PFile* stream)
+{
+  ESR_ReturnCode rc;
+  
+  rc = PFileRead(stream, buffer, size, &count);
+  if (rc != ESR_SUCCESS)
+    return 0;
+  return count;
+}
+
+size_t pfwrite(void* buffer, size_t size, size_t count, PFile* stream)
+{
+  ESR_ReturnCode rc;
+  
+  rc = PFileWrite(stream, buffer, size, &count);
+  if (rc != ESR_SUCCESS)
+    return 0;
+  return count;
+}
+
+int pfclose(PFile* stream)
+{
+  ESR_ReturnCode rc;
+  
+  rc = PFileDestroy(stream);
+  if (rc != ESR_SUCCESS)
+    return PEOF;
+  return 0;
+}
+
+void prewind(PFile* stream)
+{
+  PFileSeek(stream, 0, SEEK_SET);
+}
+
+int pfseek(PFile* stream, long offset, int origin)
+{
+  ESR_ReturnCode rc;
+  
+  rc = PFileSeek(stream, offset, origin);
+  if (rc != ESR_SUCCESS)
+    return 1;
+  return 0;
+}
+
+long pftell(PFile* stream)
+{
+  size_t result;
+  ESR_ReturnCode rc;
+  
+  rc = PFileGetPosition(stream, &result);
+  if (rc != ESR_SUCCESS)
+    return -1;
+  return result;
+}
+
+int pfeof(PFile* stream)
+{
+  ESR_BOOL eof;
+  
+  PFileIsEOF(stream, &eof);
+  if (!eof)
+    return 0;
+  return 1;
+}
+
+int pferror(PFile* stream)
+{
+  ESR_BOOL error;
+  
+  PFileIsErrorSet(stream, &error);
+  if (!error)
+    return 0;
+  return 1;
+}
+
+void pclearerr(PFile* stream)
+{
+  PFileClearError(stream);
+}
+
+int pfflush(PFile* stream)
+{
+  ESR_ReturnCode rc;
+  
+  rc = PFileFlush(stream);
+  if (rc != ESR_SUCCESS)
+    return PEOF;
+  return 0;
+}
+
+LCHAR* pfgets(LCHAR* string, int n, PFile* self)
+{
+  LCHAR* result;
+  ESR_ReturnCode rc;
+  
+  rc = PFileFgets(self, string, n, &result);
+  if (rc != ESR_SUCCESS)
+    return NULL;
+  return result;
+}
+
+LINT pfgetc(PFile* self)
+{
+  LINT result;
+  ESR_ReturnCode rc;
+  
+  rc = PFileFgetc(self, &result);
+  if (rc != ESR_SUCCESS)
+    return PEOF;
+  return result;
+}
+
+int pfprintf(PFile* stream, const LCHAR* format, ...)
+{
+#ifdef FINAL_RELEASE
+  return 0;
+#else
+  va_list args;
+  int result;
+  ESR_ReturnCode rc;
+  
+  va_start(args, format);
+  rc = PFileVfprintf(stream, &result, format, args);
+  va_end(args);
+  if (rc != ESR_SUCCESS)
+    return -1;
+  return result;
+#endif
+}
+
+int pvfprintf(PFile* stream, const LCHAR* format, va_list argptr)
+{
+#ifdef FINAL_RELEASE
+  return 0;
+#else
+  int result;
+  ESR_ReturnCode rc;
+  
+  rc = PFileVfprintf(stream, &result, format, argptr);
+  if (rc != ESR_SUCCESS)
+    return -1;
+  return result;
+#endif
+}
+
+int pprintf(const LCHAR* format, ...)
+{
+#ifdef FINAL_RELEASE
+  return 0;
+#else
+  va_list args;
+  int result;
+  ESR_ReturnCode rc;
+  
+  va_start(args, format);
+  rc = PFileVfprintf(PSTDOUT, &result, format, args);
+  va_end(args);
+  if (rc != ESR_SUCCESS)
+    return -1;
+  return result;
+#endif
+}
diff --git a/portable/src/PFileImpl.c b/portable/src/PFileImpl.c
new file mode 100644
index 0000000..72abfba
--- /dev/null
+++ b/portable/src/PFileImpl.c
@@ -0,0 +1,199 @@
+/*---------------------------------------------------------------------------*
+ *  PFileImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "passert.h"
+#include "pendian.h"
+#include "PFileImpl.h"
+#include "PFileSystem.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "pstdio.h"
+#include "ptypes.h"
+
+#define MTAG NULL
+
+
+/**
+ * Initializes variables declared in the superinterface.
+ */
+ESR_ReturnCode PFileCreateImpl(PFile* self, const LCHAR* filename, ESR_BOOL isLittleEndian)
+{
+  PFileImpl* impl = (PFileImpl*) self;
+  ESR_ReturnCode rc;
+#ifdef USE_THREAD
+  ESR_BOOL threadingEnabled;
+#endif
+  
+#ifdef USE_THREAD
+  impl->lock = NULL;
+#endif
+  impl->littleEndian = isLittleEndian;
+  
+  impl->Interface.destroy = &PFileDestroyImpl;
+  impl->Interface.getFilename = &PFileGetFilenameImpl;
+  impl->Interface.vfprintf = &PFileVfprintfImpl;
+  impl->filename = MALLOC(sizeof(LCHAR) * (LSTRLEN(filename) + 1), MTAG);
+  
+  if (impl->filename == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(impl->filename, filename);
+  
+#ifdef USE_THREAD
+  rc = PtrdIsEnabled(&threadingEnabled);
+  if (rc != ESR_SUCCESS)
+  {
+    pfprintf(PSTDERR, L("[%s:%d] PtrdIsEnabled failed with %s\n"), __FILE__, __LINE__, ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (threadingEnabled)
+  {
+    rc = PtrdMonitorCreate(&impl->lock);
+    if (rc != ESR_SUCCESS)
+      goto CLEANUP;
+  }
+#endif
+  return ESR_SUCCESS;
+CLEANUP:
+  self->destroy(self);
+  return rc;
+}
+
+
+#ifdef USE_THREAD
+#define LOCK_MUTEX(rc, impl) \
+  if (impl->lock != NULL) \
+    CHKLOG(rc, PtrdMonitorLock(impl->lock));
+#else
+#define LOCK_MUTEX(rc, impl)
+#endif
+
+
+#ifdef USE_THREAD
+#define CLEANUP_AND_RETURN(rc, impl) \
+  if (impl->lock!=NULL) \
+    CHKLOG(rc, PtrdMonitorUnlock(impl->lock)); \
+  return ESR_SUCCESS; \
+  CLEANUP: \
+  if (impl->lock!=NULL) \
+    PtrdMonitorUnlock(impl->lock); \
+  return rc;
+#else
+#define CLEANUP_AND_RETURN(rc, impl) \
+  return ESR_SUCCESS; \
+  CLEANUP: \
+  return rc;
+#endif
+
+
+ESR_ReturnCode PFileDestroyImpl(PFile* self)
+{
+  PFileImpl* impl = (PFileImpl*) self;
+  ESR_ReturnCode rc;
+  ESR_BOOL isOpen;
+  
+  LOCK_MUTEX(rc, impl);
+  CHKLOG(rc, self->isOpen(self, &isOpen));
+  if (isOpen)
+    CHKLOG(rc, self->close(self));
+  if (impl->filename)
+  {
+    FREE(impl->filename);
+    impl->filename = NULL;
+  }
+#ifdef USE_THREAD
+  if (impl->lock != NULL)
+  {
+    PtrdMonitorUnlock(impl->lock);
+    rc = PtrdMonitorDestroy(impl->lock);
+    if (rc != ESR_SUCCESS)
+      goto CLEANUP;
+  }
+#endif
+  return ESR_SUCCESS;
+CLEANUP:
+#ifdef USE_THREAD
+  if (impl->lock != NULL)
+    PtrdMonitorUnlock(impl->lock);
+#endif
+  return rc;
+}
+
+ESR_ReturnCode PFileGetFilenameImpl(PFile* self, LCHAR* filename, size_t* len)
+{
+  PFileImpl* impl = (PFileImpl*) self;
+  ESR_ReturnCode rc;
+  
+  if (self == NULL || len == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  LOCK_MUTEX(rc, impl);
+  if (LSTRLEN(impl->filename) + 1 > *len)
+  {
+    *len = LSTRLEN(impl->filename) + 1;
+    rc = ESR_BUFFER_OVERFLOW;
+    goto CLEANUP;
+  }
+  LSTRCPY(filename, impl->filename);
+  CLEANUP_AND_RETURN(rc, impl);
+}
+
+ESR_ReturnCode PFileVfprintfImpl(PFile* self, int* result, const LCHAR* format, va_list args)
+{
+  ESR_ReturnCode rc;
+  ESR_BOOL isOpen;
+#define BUFFER_SIZE 5120
+  static LCHAR buffer[BUFFER_SIZE];
+  size_t len;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  CHKLOG(rc, self->isOpen(self, &isOpen));
+  if (!isOpen)
+  {
+    rc = ESR_OPEN_ERROR;
+    PLogError(L("%s: cannot operate on closed file"), ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  /*
+   * fprintf() is computationally expensive, so we compute its output without grabbing a lock
+   * and only lock while actually writing the results into the file.
+   */
+  if (result != NULL)
+    *result = vsprintf(buffer, format, args);
+  else
+    vsprintf(buffer, format, args);
+  len = LSTRLEN(buffer);
+  passert(len < BUFFER_SIZE);
+  
+  CHKLOG(rc, self->write(self, buffer, sizeof(LCHAR), &len));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/portable/src/PFileSystem.c b/portable/src/PFileSystem.c
new file mode 100644
index 0000000..14fbf6b
--- /dev/null
+++ b/portable/src/PFileSystem.c
@@ -0,0 +1,552 @@
+/*---------------------------------------------------------------------------*
+ *  PFileSystem.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ArrayList.h"
+#include "LCHAR.h"
+#include "PFileSystem.h"
+#include "PFileSystemImpl.h"
+#include "phashtable.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+#define MTAG NULL
+
+/**
+ * Indicates if PFileSystem is initialized.
+ */
+extern ESR_BOOL PFileSystemCreated;
+
+/**
+ * [file path, PFileSystem*] mapping.
+ */
+extern PHashTable* PFileSystemPathMap;
+
+/**
+ * Current working directory.
+ */
+extern LCHAR PFileSystemCurrentDirectory[P_PATH_MAX];
+
+PORTABLE_API ESR_ReturnCode PFileSystemCanonicalSlashes(LCHAR* path)
+{
+  ESR_ReturnCode rc;
+  
+  if (path == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  lstrtrim(path);
+  CHKLOG(rc, lstrreplace(path, L('\\'), L('/')));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemLinearToPathTokens(const LCHAR* path, LCHAR*** tokenArray, size_t* count)
+{
+  ESR_ReturnCode rc;
+  const LCHAR* beginning;
+  const LCHAR* ending;
+  LCHAR linear[P_PATH_MAX];
+  ArrayList* arrayList = NULL;
+  LCHAR* value = NULL;
+  size_t i;
+  
+  if (path == NULL || tokenArray == NULL || count == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(linear, path);
+  CHKLOG(rc, PFileSystemCanonicalSlashes(linear));
+  CHKLOG(rc, ArrayListCreate(&arrayList));
+  beginning = linear;
+  while (ESR_TRUE)
+  {
+    ending = LSTRCHR(beginning, L('/'));
+    if (ending == NULL)
+      ending = beginning + LSTRLEN(beginning);
+    value = MALLOC(sizeof(LCHAR) * (ending - beginning + 1 + 1), MTAG);
+    if (value == NULL)
+    {
+      rc = ESR_OUT_OF_MEMORY;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    LSTRNCPY(value, beginning, ending - beginning + 1);
+    value[ending-beginning+1] = L('\0');
+    CHKLOG(rc, lstrtrim(value));
+    if (LSTRLEN(value) == 0)
+    {
+      FREE(value);
+      value = NULL;
+    }
+    else
+    {
+      CHKLOG(rc, arrayList->add(arrayList, value));
+      value = NULL;
+    }
+    if (*ending == 0)
+      break;
+    beginning = ending + 1;
+  }
+  
+  /* Build static token array */
+  CHKLOG(rc, arrayList->getSize(arrayList, count));
+  *tokenArray = MALLOC(*count * sizeof(LCHAR*), MTAG);
+  if (*tokenArray == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  for (i = 0; i < *count; ++i)
+  {
+    rc = arrayList->get(arrayList, i, (void**)(&(*tokenArray)[i]));
+    if (rc != ESR_SUCCESS)
+      goto CLEANUP;
+  }
+  rc = arrayList->destroy(arrayList);
+  if (rc != ESR_SUCCESS)
+    goto CLEANUP;
+  return ESR_SUCCESS;
+CLEANUP:
+  FREE(value);
+  if (arrayList != NULL)
+  {
+    ESR_ReturnCode cleanRC;
+    
+    cleanRC = arrayList->getSize(arrayList, count);
+    if (cleanRC != ESR_SUCCESS)
+      return rc;
+    for (i = 0; i < *count; ++i)
+    {
+      cleanRC = arrayList->get(arrayList, 0, (void**)&value);
+      if (cleanRC != ESR_SUCCESS)
+        return rc;
+      FREE(value);
+      cleanRC = arrayList->remove(arrayList, 0);
+      if (cleanRC != ESR_SUCCESS)
+        return rc;
+    }
+    arrayList->destroy(arrayList);
+  }
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemIsAbsolutePath(const LCHAR* path, ESR_BOOL* isAbsolute)
+{
+  LCHAR canonical[P_PATH_MAX];
+  ESR_ReturnCode rc;
+  
+  if (isAbsolute == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(canonical, path);
+  CHKLOG(rc, PFileSystemCanonicalSlashes(canonical));
+  
+  *isAbsolute = (canonical[0] == '/' ||
+                 (LISALPHA(canonical[0]) && canonical[1] == ':' && canonical[2] == '/'));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemGetAbsolutePath(LCHAR* path, size_t* len)
+{
+  ESR_ReturnCode rc;
+#define MAX_PATH_TOKENS 20
+  LCHAR** tokens = NULL;
+  size_t tokenLen = 0, i;
+  ESR_BOOL isAbsolute;
+  
+  if (path == NULL || len == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CHKLOG(rc, PFileSystemIsAbsolutePath(path, &isAbsolute));
+  
+  /* Prefix relative paths with the current working directory */
+  if (!isAbsolute)
+  {
+    LCHAR cwd[P_PATH_MAX];
+    size_t len2;
+    
+    len2 = P_PATH_MAX;
+    CHKLOG(rc, PFileSystemGetcwd(cwd, &len2));
+    len2 = *len;
+    CHKLOG(rc, lstrinsert(cwd, path, 0, &len2));
+  }
+  
+  CHKLOG(rc, PFileSystemCanonicalSlashes(path));
+  tokenLen = MAX_PATH_TOKENS;
+  CHKLOG(rc, PFileSystemLinearToPathTokens(path, &tokens, &tokenLen));
+  
+  LSTRCPY(path, L(""));
+  for (i = 0; i < tokenLen; ++i)
+  {
+    if (LSTRCMP(tokens[i], L("../")) == 0)
+    {
+      size_t len2;
+      
+      len2 = *len;
+      passert(path[LSTRLEN(path)-1] == L('/'));
+      CHKLOG(rc, PFileSystemGetParentDirectory(path, &len2));
+    }
+    else if (LSTRCMP(tokens[i], L("./")) == 0)
+    {
+      if (i > 0)
+      {
+        /* do nothing */
+      }
+      else
+      {
+        LSTRCPY(path, L("./"));
+      }
+    }
+    else
+      LSTRCAT(path, tokens[i]);
+    FREE(tokens[i]);
+    tokens[i] = NULL;
+  }
+  FREE(tokens);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (tokens != NULL)
+  {
+    for (i = 0; i < tokenLen; ++i)
+    {
+      FREE(tokens[i]);
+      tokens[i] = NULL;
+    }
+  }
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemIsCreated(ESR_BOOL* isCreated)
+{
+  ESR_ReturnCode rc;
+  
+  if (isCreated == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  *isCreated = PFileSystemCreated;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Given a path, returns the associated file-system and relative path.
+ *
+ * @param path Path to look up
+ * @param fs [out] File-system which matches the path
+ * @param relativePath [out] Relative path associated with match (should have length P_PATH_MAX)
+ */
+ESR_ReturnCode PFileSystemGetFS(const LCHAR* path, PFileSystem** fileSystem, LCHAR* relativePath)
+{
+  ESR_ReturnCode rc;
+  PHashTableEntry* entry;
+  LCHAR* key;
+  PFileSystem* value;
+  LCHAR* bestKey = NULL;
+  PFileSystem* bestValue = NULL;
+  
+  CHKLOG(rc, PHashTableEntryGetFirst(PFileSystemPathMap, &entry));
+  while (entry != NULL)
+  {
+    CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)&value));
+    if (LSTRSTR(path, key) == path)
+    {
+      /* File-system handles file path */
+      
+      if (bestKey == NULL || LSTRLEN(key) > LSTRLEN(bestKey))
+      {
+        /* Found a better match -- the new key is a subdirectory of the previous bestKey */
+        bestKey = key;
+        bestValue = value;
+      }
+    }
+    CHKLOG(rc, PHashTableEntryAdvance(&entry));
+  }
+  if (bestKey == NULL)
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(L("No file-system handles the specified path (%s)"), path);
+    goto CLEANUP;
+  }
+  *fileSystem = bestValue;
+  if (relativePath != NULL)
+  {
+    ESR_BOOL isAbsolute;
+    
+    CHKLOG(rc, PFileSystemIsAbsolutePath(path + LSTRLEN(bestKey), &isAbsolute));
+    LSTRCPY(relativePath, L(""));
+    if (!isAbsolute)
+    {
+      /* Make sure that the relative path is relative to the root of the file-system */
+      LSTRCAT(relativePath, L("/"));
+    }
+    LSTRCAT(relativePath, path + LSTRLEN(bestKey));
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemCreatePFile(const LCHAR* filename, ESR_BOOL littleEndian, PFile** self)
+{
+  ESR_ReturnCode rc;
+  LCHAR absolutePath[P_PATH_MAX];
+  PFileSystem* fileSystem;
+  size_t len;
+  
+  if (filename == NULL || self == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(absolutePath, filename);
+  lstrtrim(absolutePath);
+  len = P_PATH_MAX;
+  CHKLOG(rc, PFileSystemGetAbsolutePath(absolutePath, &len));
+  CHKLOG(rc, PFileSystemGetFS(absolutePath, &fileSystem, NULL));
+  rc = fileSystem->createPFile(fileSystem, absolutePath, littleEndian, self);
+  if (rc == ESR_NO_MATCH_ERROR)
+    rc = ESR_OPEN_ERROR;
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError("%s, %s, %s", ESR_rc2str(rc), filename, absolutePath);
+    goto CLEANUP;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemMkdir(const LCHAR* path)
+{
+  ESR_ReturnCode rc;
+  LCHAR absolutePath[P_PATH_MAX];
+  PFileSystem* fileSystem;
+  size_t len;
+  
+  if (path == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(absolutePath, path);
+  lstrtrim(absolutePath);
+  len = P_PATH_MAX;
+  CHKLOG(rc, PFileSystemGetAbsolutePath(absolutePath, &len));
+  CHKLOG(rc, PFileSystemGetFS(absolutePath, &fileSystem, NULL));
+  CHK(rc, fileSystem->mkdir(fileSystem, absolutePath));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemGetcwd(LCHAR* path, size_t* len)
+{
+  ESR_ReturnCode rc;
+  
+  if (path == NULL || len == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (LSTRLEN(PFileSystemCurrentDirectory) + 1 > *len)
+  {
+    rc = ESR_BUFFER_OVERFLOW;
+    *len = LSTRLEN(PFileSystemCurrentDirectory) + 1;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(path, PFileSystemCurrentDirectory);
+  /* Check function postcondition */
+  passert(path[LSTRLEN(path)-1] == L('/'));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemChdir(const LCHAR* path)
+{
+  ESR_ReturnCode rc;
+  LCHAR absolutePath[P_PATH_MAX];
+  PFileSystem* fileSystem;
+  size_t len;
+  
+  if (path == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(absolutePath, path);
+  /* Ensure path ends with '/' */
+  if (absolutePath[LSTRLEN(absolutePath)-1] != L('/'))
+    LSTRCAT(absolutePath, L("/"));
+  lstrtrim(absolutePath);
+  len = P_PATH_MAX;
+  CHKLOG(rc, PFileSystemGetAbsolutePath(absolutePath, &len));
+  CHKLOG(rc, PFileSystemGetFS(absolutePath, &fileSystem, NULL));
+  rc = fileSystem->chdir(fileSystem, absolutePath);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (absolutePath[LSTRLEN(absolutePath)-1] != L('/'))
+    LSTRCAT(absolutePath, L("/"));
+  LSTRCPY(PFileSystemCurrentDirectory, absolutePath);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * PRECONDITION: Directory names must end with '/'
+ */
+ESR_ReturnCode PFileSystemGetParentDirectory(LCHAR* path, size_t* len)
+{
+  LCHAR* lastSlash;
+  LCHAR clone[P_PATH_MAX];
+  ESR_ReturnCode rc;
+  size_t len2;
+  
+  if (path == NULL || len == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(clone, path);
+  lstrtrim(clone);
+  len2 = P_PATH_MAX;
+  CHKLOG(rc, PFileSystemGetAbsolutePath(clone, &len2));
+  
+  /* 1.0 - Strip filename */
+  lastSlash = LSTRRCHR(clone, L('/'));
+  if (lastSlash == NULL)
+  {
+    /* path contains only a filename */
+    LSTRCPY(path, L("../"));
+    return ESR_SUCCESS;
+  }
+  else if (lastSlash < clone + LSTRLEN(clone) - 1)
+  {
+    
+    *(lastSlash + 1) = L('\0');
+    if (LSTRLEN(clone) > *len)
+    {
+      *len = LSTRLEN(clone);
+      rc = ESR_BUFFER_OVERFLOW;
+      goto CLEANUP;
+    }
+    LSTRCPY(path, clone);
+    *len = LSTRLEN(path);
+    return ESR_SUCCESS;
+  }
+  
+  /* Get parent directory */
+  if (lastSlash -clone + 2 == 3 && LSTRNCMP(clone, L("../"), 3) == 0)
+  {
+    LSTRCAT(clone, L("../"));
+    if (LSTRLEN(clone) > *len)
+    {
+      *len = LSTRLEN(clone);
+      rc = ESR_BUFFER_OVERFLOW;
+      goto CLEANUP;
+    }
+    LSTRCPY(path, clone);
+    *len = LSTRLEN(path);
+    return ESR_SUCCESS;
+  }
+  if (lastSlash -clone + 1 == 2 && LSTRNCMP(clone, L("./"), 2) == 0)
+  {
+    if (LSTRLEN(L("../")) > *len)
+    {
+      *len = LSTRLEN(L("../"));
+      rc = ESR_BUFFER_OVERFLOW;
+      goto CLEANUP;
+    }
+    LSTRCPY(path, L("../"));
+    *len = LSTRLEN(path);
+    return ESR_SUCCESS;
+  }
+  else if (lastSlash == clone && LSTRNCMP(clone, L("/"), 1) == 0)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  *lastSlash = 0;
+  lastSlash = LSTRRCHR(clone, L('/'));
+  if (lastSlash != NULL)
+  {
+    *(lastSlash + 1) = 0;
+    if (LSTRLEN(clone) > *len)
+    {
+      *len = LSTRLEN(clone);
+      rc = ESR_BUFFER_OVERFLOW;
+      goto CLEANUP;
+    }
+    LSTRCPY(path, clone);
+    *len = LSTRLEN(path);
+  }
+  else
+  {
+    LSTRCPY(path, L(""));
+    *len = 0;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemIsDirectoryPath(const LCHAR* path, ESR_BOOL* isDirectory)
+{
+  LCHAR temp[P_PATH_MAX];
+  ESR_ReturnCode rc;
+  
+  passert(isDirectory != NULL);
+  LSTRCPY(temp, path);
+  lstrtrim(temp);
+  CHKLOG(rc, PFileSystemCanonicalSlashes(temp));
+  *isDirectory = temp[LSTRLEN(temp)-1] == '/';
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/portable/src/PFileSystemImpl.c b/portable/src/PFileSystemImpl.c
new file mode 100644
index 0000000..1b1e00b
--- /dev/null
+++ b/portable/src/PFileSystemImpl.c
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*
+ *  PFileSystemImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "LCHAR.h"
+#include "PFileSystemImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+#define MTAG NULL
+
+ESR_BOOL PFileSystemCreated = ESR_FALSE;
+
+/**
+ * [file path, PFileSystem*] mapping.
+ */
+PHashTable* PFileSystemPathMap = NULL;
+
+/**
+ * Portable standard input.
+ */
+PFile* PSTDIN = NULL;
+/**
+ * Portable standard output.
+ */
+PFile* PSTDOUT = NULL;
+/**
+ * Portable standard error.
+ */
+PFile* PSTDERR = NULL;
+
+/**
+ * Current working directory.
+ */
+LCHAR PFileSystemCurrentDirectory[P_PATH_MAX] = L("/");
+
+#ifdef USE_THREAD
+/* Prototype of private function */
+PORTABLE_API ESR_ReturnCode PtrdFlush();
+#endif
+
+
+ESR_ReturnCode PFileSystemCreate(void)
+{
+  ESR_ReturnCode rc;
+  
+  if (PFileSystemCreated)
+    return ESR_SUCCESS;
+    
+#ifdef USE_STACKTRACE
+  CHKLOG(rc, PStackTraceCreate());
+#endif
+  CHKLOG(rc, PHashTableCreate(NULL, MTAG, &PFileSystemPathMap));
+  CHKLOG(rc, PFileSystemInitializeStreamsImpl());
+  PFileSystemCreated = ESR_TRUE;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PFileSystemDestroy(void)
+{
+  ESR_ReturnCode rc;
+  LCHAR* key;
+  PHashTableEntry* entry;
+  PHashTableEntry* oldEntry;
+  
+  if (!PFileSystemCreated)
+    return ESR_SUCCESS;
+  PFileSystemCreated = ESR_FALSE;
+  if (PFileSystemPathMap != NULL)
+  {
+    CHKLOG(rc, PHashTableEntryGetFirst(PFileSystemPathMap, &entry));
+    while (entry != NULL)
+    {
+      CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)NULL));
+      oldEntry = entry;
+      CHKLOG(rc, PHashTableEntryAdvance(&entry));
+      CHKLOG(rc, PHashTableEntryRemove(oldEntry));
+      FREE(key);
+    }
+    CHKLOG(rc, PHashTableDestroy(PFileSystemPathMap));
+    PFileSystemPathMap = NULL;
+  }
+  CHKLOG(rc, PFileSystemShutdownStreamsImpl());
+#ifdef USE_STACKTRACE
+  CHKLOG(rc, PStackTraceDestroy());
+#endif
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/portable/src/PFileWrap.c b/portable/src/PFileWrap.c
new file mode 100644
index 0000000..d7dddfe
--- /dev/null
+++ b/portable/src/PFileWrap.c
@@ -0,0 +1,513 @@
+/*---------------------------------------------------------------------------*
+ *  PFileWrap.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "LCHAR.h"
+#include "pendian.h"
+#include "PFile.h"
+#include "plog.h"
+#include "pstdio.h"
+#include "ptypes.h"
+
+
+
+
+ESR_ReturnCode PFileClose( PFile *self )
+    {
+
+    fclose ( (FILE *)self );
+    return ( ESR_SUCCESS );
+    }
+
+
+
+ESR_ReturnCode PFileRead ( PFile *self, void *buffer, size_t size, size_t *count )
+    {
+    ESR_ReturnCode  read_status;
+    size_t          items_read;
+    int             ferror_status;
+
+    items_read = fread ( buffer, size, *count, (FILE *)self );
+
+    if ( items_read > 0 )
+        {
+        read_status = ESR_SUCCESS;
+        *count = items_read;
+        }
+    else
+        {
+        ferror_status = ferror ( (FILE *)self );
+
+        if ( ferror_status == 0 )
+            {
+            read_status = ESR_SUCCESS;
+            *count = items_read;
+            }
+        else
+            {
+            read_status = ESR_READ_ERROR;
+            }
+        }
+    return ( read_status );
+    }
+
+
+
+ESR_ReturnCode PFileWrite ( PFile *self, void *buffer, size_t size, size_t *count )
+    {
+    ESR_ReturnCode  write_status;
+    size_t          items_written;
+
+    items_written = fwrite ( buffer, size, *count, (FILE *)self );
+
+    if ( items_written == ( *count ) )
+        {
+        write_status = ESR_SUCCESS;
+        *count = items_written;
+        }
+    else
+        {
+        write_status = ESR_READ_ERROR;
+        }
+    return ( write_status );
+    }
+
+
+
+ESR_ReturnCode PFileFlush ( PFile *self )
+    {
+    ESR_ReturnCode  flush_status;
+    size_t          flush_ok;
+
+    flush_ok = fflush ( (FILE *)self );
+
+    if ( flush_ok == 0 )
+        {
+        flush_status = ESR_SUCCESS;
+        }
+    else
+        {
+        flush_status = ESR_FLUSH_ERROR;
+        }
+    return ( flush_status );
+    }
+
+
+
+ESR_ReturnCode PFileSeek ( PFile *self, long offset, int origin )
+    {
+    ESR_ReturnCode  seek_status;
+    size_t          seek_ok;
+
+    seek_ok = fseek ( (FILE *)self, offset, origin );
+
+    if ( seek_ok == 0 )
+        {
+        seek_status = ESR_SUCCESS;
+        }
+    else
+        {
+        seek_status = ESR_SEEK_ERROR;
+        }
+    return ( seek_status );
+    }
+
+
+
+ESR_ReturnCode PFileGetPosition ( PFile *self, size_t *position )
+    {
+    ESR_ReturnCode  get_status;
+    long            ftell_result;
+
+    ftell_result = ftell ( (FILE *)self );
+
+    if ( ftell_result >= 0 )
+        {
+	*position = (size_t)ftell_result;
+        get_status = ESR_SUCCESS;
+        }
+    else
+        {
+        get_status = ESR_INVALID_STATE;
+        }
+    return ( get_status );
+    }
+
+
+
+ESR_ReturnCode PFileIsEOF ( PFile *self, ESR_BOOL *isEof )
+    {
+#ifdef NO_FEOF
+    long            posCur;    /* remember current file position */
+    long            posEnd;    /* end of file position */
+
+    posCur = ftell ( self );
+    fseek ( self, 0, SEEK_END );
+    posEnd = ftell ( self );
+
+    if ( posCur == posEnd )
+        *isEof = ESR_TRUE;
+    else
+        *isEof = ESR_FALSE;
+    fseek ( self, posCur, SEEK_SET );  /* restore position in file */
+#else
+    int             is_eof;
+
+    is_eof = feof ( (FILE *)self );
+
+    if ( is_eof != 0 )
+        *isEof = ESR_TRUE;
+    else
+        *isEof = ESR_FALSE;
+#endif
+    return ( ESR_SUCCESS );
+    }
+
+
+
+ESR_ReturnCode PFileIsErrorSet ( PFile *self, ESR_BOOL *isError )
+    {
+    int is_error;
+
+    is_error = ferror ( (FILE *)self );
+
+    if ( is_error != 0 )
+        *isError = ESR_TRUE;
+    else
+        *isError = ESR_FALSE;
+    return ( ESR_SUCCESS );
+    }
+
+
+
+ESR_ReturnCode PFileClearError ( PFile *self )
+    {
+
+    clearerr ( (FILE *)self );
+    return ( ESR_SUCCESS );
+    }
+
+
+
+ESR_ReturnCode PFileVfprintf ( PFile *self, int *result, const LCHAR *format, va_list args )
+    {
+    int bytes_printed;
+
+    bytes_printed = vfprintf ( (FILE *)self, format, args );
+
+    if ( result != NULL )
+        *result = bytes_printed;
+    return ( ESR_SUCCESS );
+    }
+
+
+
+ESR_ReturnCode PFileFgetc ( PFile *self, LINT *result )
+    {
+    ESR_ReturnCode  fgetc_status;
+    int             error_status;
+
+    *result = fgetc ( (FILE *)self );
+
+    if ( ( *result ) != EOF )
+        {
+        fgetc_status = ESR_SUCCESS;
+        }
+    else
+        {
+        error_status = ferror ( (FILE *)self );
+
+        if ( error_status == 0 )
+            fgetc_status = ESR_SUCCESS;
+        else
+            fgetc_status = ESR_INVALID_STATE;
+        }
+    return ( fgetc_status );
+    }
+
+
+
+ESR_ReturnCode PFileFgets ( PFile *self, LCHAR *string, int n, LCHAR **result )
+    {
+    ESR_ReturnCode  fgets_status;
+    int             error_status;
+    LCHAR           *temp;
+
+    temp = fgets ( string, n, (FILE *)self );
+
+    if ( temp != NULL )
+        {
+        fgets_status = ESR_SUCCESS;
+
+        if ( result != NULL )
+            *result = temp;
+        }
+    else
+        {
+        error_status = ferror ( (FILE *)self );
+
+        if ( error_status == 0 )
+            {
+            fgets_status = ESR_SUCCESS;
+
+            if ( result != NULL )
+                *result = NULL;
+            }
+        else
+            fgets_status = ESR_INVALID_STATE;
+        }
+    return ( fgets_status );
+    }
+
+
+
+PFile *pfopen ( const LCHAR *filename, const LCHAR *mode )
+    {
+    PFile           *result;
+
+    result = (PFile *)fopen ( filename, mode );
+    return ( result );
+    }
+
+
+
+size_t pfread ( void *buffer, size_t size, size_t count, PFile *stream )
+    {
+    ESR_ReturnCode rc;
+
+    rc = PFileRead ( stream, buffer, size, &count );
+
+    if ( rc != ESR_SUCCESS )
+        return ( 0 );
+    return ( count );
+    }
+
+
+
+size_t pfwrite ( void *buffer, size_t size, size_t count, PFile *stream )
+    {
+    ESR_ReturnCode rc;
+
+    rc = PFileWrite ( stream, buffer, size, &count );
+    if ( rc != ESR_SUCCESS )
+        return ( 0 );
+    return ( count );
+    }
+
+
+
+int pfclose ( PFile *stream )
+    {
+
+    fclose ( (FILE *)stream );
+
+    return ( 0 );
+    }
+
+
+
+void prewind (PFile *stream)
+    {
+
+    PFileSeek ( stream, 0, SEEK_SET );
+    }
+
+
+
+int pfseek ( PFile *stream, long offset, int origin )
+    {
+    ESR_ReturnCode rc;
+
+    rc = PFileSeek ( stream, offset, origin );
+
+    if ( rc != ESR_SUCCESS )
+        return ( 1 );
+    return ( 0 );
+    }
+
+
+
+long pftell ( PFile *stream )
+    {
+    ESR_ReturnCode  rc;
+    size_t          result;
+
+    rc = PFileGetPosition ( stream, &result );
+
+    if ( rc != ESR_SUCCESS )
+        return ( -1 );
+    return ( result );
+    }
+
+
+
+int pfeof ( PFile *stream )
+    {
+    ESR_BOOL eof;
+
+    PFileIsEOF ( stream, &eof );
+
+    if ( ! eof )
+        return ( 0 );
+        return ( 1 );
+    }
+
+
+
+int pferror ( PFile *stream )
+    {
+    ESR_BOOL error;
+
+    PFileIsErrorSet ( stream, &error );
+
+    if ( ! error )
+        return ( 0 );
+    return ( 1 );
+    }
+
+
+
+void pclearerr ( PFile *stream )
+    {
+
+    PFileClearError ( stream );
+    }
+
+
+
+int pfflush ( PFile *stream )
+    {
+    ESR_ReturnCode rc;
+
+    rc = PFileFlush ( stream );
+
+    if ( rc != ESR_SUCCESS )
+        return ( PEOF );
+    return ( 0 );
+    }
+
+
+
+LCHAR* pfgets ( LCHAR *string, int n, PFile *self )
+    {
+    LCHAR           *result;
+    ESR_ReturnCode  rc;
+
+    rc = PFileFgets ( self, string, n, &result );
+
+    if ( rc != ESR_SUCCESS )
+        return ( NULL );
+    return ( result );
+    }
+
+
+
+LINT pfgetc ( PFile *self )
+    {
+    ESR_ReturnCode  rc;
+    LINT            result;
+
+    rc = PFileFgetc ( self, &result );
+
+    if ( rc != ESR_SUCCESS )
+        return ( PEOF );
+    return ( result );
+    }
+
+
+
+int pfprintf ( PFile *stream, const LCHAR *format, ... )
+    {
+    ESR_ReturnCode  rc;
+    int             result;
+    va_list         args;
+
+    va_start ( args, format );
+    rc = PFileVfprintf ( stream, &result, format, args );
+    va_end ( args );
+
+    if ( rc != ESR_SUCCESS )
+        return ( -1 );
+    return ( result );
+    }
+
+
+
+int pvfprintf ( PFile *stream, const LCHAR *format, va_list argptr )
+    {
+    ESR_ReturnCode  rc;
+    int             result;
+
+    rc = PFileVfprintf ( stream, &result, format, argptr );
+
+    if ( rc != ESR_SUCCESS )
+        return ( -1 );
+    return ( result );
+    }
+
+
+ESR_ReturnCode pf_convert_backslashes_to_forwardslashes ( LCHAR *string_to_convert )
+    {
+    ESR_ReturnCode  rc;
+    int             string_status;
+
+    if ( string_to_convert != NULL )
+        {
+	string_status = lstrreplace ( string_to_convert, L('\\'), L('/') );
+
+	if ( string_status == 0 )
+	    rc = ESR_SUCCESS;
+	else
+	    rc = ESR_INVALID_ARGUMENT;
+	}
+    else
+	{
+	rc = ESR_INVALID_ARGUMENT;
+	}
+    return ( rc );
+    }
+
+
+
+ESR_ReturnCode pf_is_path_absolute ( const LCHAR* input_path, ESR_BOOL* isAbsolute )
+    {
+    ESR_ReturnCode rc;
+    LCHAR path [P_PATH_MAX];
+	     
+    if ( isAbsolute != NULL )
+        {
+	LSTRCPY ( path, input_path );
+	rc = pf_convert_backslashes_to_forwardslashes ( path );
+
+	if ( rc == ESR_SUCCESS )
+	    {
+	    if ( ( path [0] == '/' ) || ( ( LISALPHA ( path [0] ) ) && ( path [1] == ':' ) && ( path [2] == '/' ) ) )
+		*isAbsolute = ESR_TRUE;
+	    else
+		*isAbsolute = ESR_FALSE;
+	    }
+	}
+    else
+	{
+	rc = ESR_INVALID_ARGUMENT;
+	}
+    return ( rc );
+    }    
+ 
diff --git a/portable/src/PStackSize.c b/portable/src/PStackSize.c
new file mode 100644
index 0000000..9679ca6
--- /dev/null
+++ b/portable/src/PStackSize.c
@@ -0,0 +1,61 @@
+/*---------------------------------------------------------------------------*
+ *  PStackSize.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "pstdio.h"
+#include "PStackSize.h"
+
+#ifdef _WIN32
+
+static const char * PSTACK_BASE = NULL;
+
+/** Initialize the stack base.  This should be done in the main() function.
+ * Note that the local variables of main() are not taken into account in the
+ * stack size computation.  To overcome this problem, rewrite main() as a
+ * simple function that first invokes PSTACK_SIZE_INIT and then invokes the
+ * original main().
+*/
+void PSTACK_SIZE_INIT()
+{
+  PSTACK_BASE = (const char *) _alloca(0);
+}
+
+/**
+ * Computes the current stack size.  The returned value is the number of bytes
+ * in the stack.
+ **/
+size_t PSTACK_SIZE_GET()
+{
+  return (PSTACK_BASE - ((const char *) _alloca(0)));
+}
+
+#else
+
+/* Insert other platform implementations here... */
+/*
+#error not supported at this time
+*/
+void PSTACK_SIZE_INIT()
+{}
+
+size_t PSTACK_SIZE_GET()
+{
+  return 0;
+}
+
+#endif
diff --git a/portable/src/UNIX/PANSIFileSystemUNIXImpl.c b/portable/src/UNIX/PANSIFileSystemUNIXImpl.c
new file mode 100644
index 0000000..2c561b1
--- /dev/null
+++ b/portable/src/UNIX/PANSIFileSystemUNIXImpl.c
@@ -0,0 +1,166 @@
+/*---------------------------------------------------------------------------*
+ *  PANSIFileSystemUNIXImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "errno.h"
+#include "PFileSystemImpl.h"
+#include "PANSIFileSystem.h"
+#include "PANSIFileSystemImpl.h"
+#include "phashtable.h"
+#include "LCHAR.h"
+#include "plog.h"
+
+ESR_ReturnCode PANSIFileSystemGetVirtualPathImpl(PFileSystem* self, LCHAR* path, size_t* len)
+{
+  PANSIFileSystemImpl* impl = (PANSIFileSystemImpl*) self;
+  PHashTableEntry* entry;
+  LCHAR driveLetter = 0;
+  LCHAR* key;
+  LCHAR* value;
+  LCHAR* bestKey = NULL;
+  LCHAR* bestValue = NULL;
+  ESR_BOOL isAbsolute;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, lstrtrim(path));
+  CHKLOG(rc, PFileSystemCanonicalSlashes(path));
+  CHKLOG(rc, PFileSystemIsAbsolutePath(path, &isAbsolute));
+  if (isAbsolute && path[0] != L('/'))
+  {
+    /* Skip drive letters in absolute paths */
+    driveLetter = path[0];
+    LSTRCPY(path, path + 2);
+  }
+  CHKLOG(rc, PHashTableEntryGetFirst(impl->directoryMap, &entry));
+  while (entry!=NULL)
+  {
+    CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)&value));
+    if (LSTRSTR(path, value)==path)
+    {
+      /* File-system handles file path */
+
+      if (bestValue==NULL || LSTRLEN(value) > LSTRLEN(bestValue))
+      {
+        /* Found a better match -- the new key is a subdirectory of the previous bestKey */
+        bestKey = key;
+        bestValue = value;
+      }
+    }
+    CHKLOG(rc, PHashTableEntryAdvance(&entry));
+  }
+  if (bestKey == NULL)
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(L("PANSIFileSystem does not handle the specified path: %s"), path);
+    goto CLEANUP;
+  }
+
+  /* Delete the real-path */
+  LSTRCPY(path, path + LSTRLEN(bestValue));
+  /* Insert the virtual-path */
+  CHKLOG(rc, lstrinsert(bestKey, path, 0, len));
+
+  /* Bring back the drive letter */
+  if (driveLetter!=0)
+  {
+    CHKLOG(rc, lstrinsert(L("X:/"), path, LSTRLEN(bestKey), len));
+    path[LSTRLEN(bestKey)] = driveLetter;
+  }
+  return ESR_SUCCESS;
+ CLEANUP:
+  return rc;
+}
+ESR_ReturnCode PANSIFileSystemMkdirImpl(PFileSystem* self, const LCHAR* path)
+{
+  LCHAR realPath[P_PATH_MAX];
+  size_t len;
+  ESR_ReturnCode rc;
+
+  passert(path!=NULL);
+  LSTRCPY(realPath, path);
+  len = P_PATH_MAX;
+  CHKLOG(rc, PANSIFileSystemGetRealPathImpl(self, realPath, &len));
+
+  if (mkdir(realPath, S_IRWXU|S_IRWXG|S_IRWXO ) != 0)
+    {
+      switch (errno)
+      {
+       case EEXIST:
+         return ESR_IDENTIFIER_COLLISION;
+       case ENOENT:
+         return ESR_NO_MATCH_ERROR;
+       default:
+         PLogError(L("ESR_INVALID_STATE"));
+         return ESR_INVALID_STATE;
+      }
+    }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PANSIFileSystemGetcwdImpl(PFileSystem* self, LCHAR* path, size_t* len)
+{
+	ESR_ReturnCode rc;
+
+	if (path==NULL)
+	{
+		rc = ESR_INVALID_ARGUMENT;
+		PLogError(ESR_rc2str(rc));
+		goto CLEANUP;
+	}
+    if (getcwd(path, *len) == NULL)
+    {
+      switch (errno)
+      {
+       case ERANGE:
+         *len = P_PATH_MAX;
+         return ESR_BUFFER_OVERFLOW;
+       case ENOMEM:
+       default:
+         PLogError(L("ESR_INVALID_STATE"));
+         return ESR_INVALID_STATE;
+      }
+    }
+
+	CHKLOG(rc, PANSIFileSystemGetVirtualPathImpl(self, path, len));
+	return ESR_SUCCESS;
+CLEANUP:
+	return rc;
+}
+
+ESR_ReturnCode PANSIFileSystemChdirImpl(PFileSystem* self, const LCHAR* path)
+{
+	LCHAR realPath[P_PATH_MAX];
+	size_t len;
+	ESR_ReturnCode rc;
+
+	passert(path!=NULL);
+	LSTRCPY(realPath, path);
+	len = P_PATH_MAX;
+	CHKLOG(rc, PANSIFileSystemGetRealPathImpl(self, realPath, &len));
+
+	if ((*path != '\0') && (chdir(realPath) != 0))
+		return ESR_NO_MATCH_ERROR;
+	return ESR_SUCCESS;
+CLEANUP:
+	return rc;
+}
diff --git a/portable/src/UNIX/PFileSystemUNIXImpl.c b/portable/src/UNIX/PFileSystemUNIXImpl.c
new file mode 100644
index 0000000..06655f3
--- /dev/null
+++ b/portable/src/UNIX/PFileSystemUNIXImpl.c
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------*
+ *  PFileSystemUNIXImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "PANSIFileImpl.h"
+#include "PANSIFileSystemImpl.h"
+#include "PFileSystem.h"
+#include "PFileSystemImpl.h"
+#include "PANSIFileSystem.h"
+#include "phashtable.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+#ifdef USE_THREAD
+	/* Prototype of private function */
+	PORTABLE_API ESR_ReturnCode PtrdFlush();
+#endif
+
+
+/** 
+ * Initializes STDIN, STDOUT, STDERR.
+ */
+ESR_ReturnCode PFileSystemInitializeStreamsImpl(void)
+{
+	ESR_ReturnCode rc;
+	PANSIFileImpl* impl;
+#ifdef USE_THREAD
+	ESR_BOOL threadingEnabled;
+#endif
+	ESR_BOOL isLittleEndian;
+	PANSIFileSystemImpl* ANSIImpl = NULL;
+
+#if __BYTE_ORDER==__LITTLE_ENDIAN
+	isLittleEndian = ESR_TRUE;
+#else
+	isLittleEndian = ESR_FALSE;
+#endif
+	CHKLOG(rc, PANSIFileSystemCreate());
+	ANSIImpl = (PANSIFileSystemImpl*) PANSIFileSystemSingleton;
+	CHKLOG(rc, PMemSetLogEnabled(ESR_FALSE));
+	CHKLOG(rc, PHashTablePutValue(PFileSystemPathMap, L("/"), PANSIFileSystemSingleton, NULL));
+	CHKLOG(rc, PHashTablePutValue(ANSIImpl->directoryMap, L("/"), L("/"), NULL));
+	CHKLOG(rc, PANSIFileSystemSingleton->createPFile(PANSIFileSystemSingleton, L("/dev/stdin"), isLittleEndian, &PSTDIN));
+	impl = (PANSIFileImpl*) PSTDIN;
+	impl->value = stdin;
+
+	CHKLOG(rc, PANSIFileSystemSingleton->createPFile(PANSIFileSystemSingleton, L("/dev/stdout"), isLittleEndian, &PSTDOUT));
+	impl = (PANSIFileImpl*) PSTDOUT;
+		setvbuf(stdout, NULL, _IONBF, 0);
+	impl->value = stdout;
+
+	CHKLOG(rc, PANSIFileSystemSingleton->createPFile(PANSIFileSystemSingleton, L("/dev/stderr"), isLittleEndian, &PSTDERR));
+	impl = (PANSIFileImpl*) PSTDERR;
+		setvbuf(stderr, NULL, _IONBF, 0);
+	impl->value = stderr;
+
+	#ifdef USE_THREAD
+	/* Have STDERR and STDOUT share the same lock */
+	CHKLOG(rc, PtrdIsEnabled(&threadingEnabled));
+	if (threadingEnabled)
+	{
+		CHKLOG(rc, PtrdMonitorDestroy(impl->Interface.lock));
+		impl->Interface.lock = ((PANSIFileImpl*) PSTDOUT)->Interface.lock;
+	}
+	#endif
+	CHKLOG(rc, PHashTableRemoveValue(PFileSystemPathMap, L("/"), NULL));
+	CHKLOG(rc, PHashTableRemoveValue(ANSIImpl->directoryMap, L("/"), NULL));
+	CHKLOG(rc, PMemSetLogEnabled(ESR_TRUE));
+	return ESR_SUCCESS;
+CLEANUP:
+	PHashTableRemoveValue(PFileSystemPathMap, L("/"), NULL);
+	if (ANSIImpl!=NULL)
+		PHashTableRemoveValue(ANSIImpl->directoryMap, L("/"), NULL);
+	PMemSetLogEnabled(ESR_TRUE);
+	return rc;
+}
+
+ESR_ReturnCode PFileSystemShutdownStreamsImpl(void)
+{
+	ESR_ReturnCode rc;
+	PANSIFileImpl* impl;
+
+	/* It is illegal to log to file after the file system has shutdown so we do it now */
+#ifdef USE_THREAD
+	PtrdFlush();
+#endif
+	PMemDumpLogFile();
+
+	if (PSTDIN!=NULL)
+	{
+		CHKLOG(rc, PFileFlush(PSTDIN));
+		impl = (PANSIFileImpl*) PSTDIN;
+		impl->value = NULL;
+		CHKLOG(rc, PFileDestroy(PSTDIN));
+		PSTDIN = NULL;
+	}
+	if (PSTDOUT!=NULL)
+	{
+#ifdef USE_THREAD
+		if (PSTDERR!=NULL)
+		{
+			/* stdout, stderr share the same lock, only one of them should destroy it */
+			PFileImpl* impl = (PFileImpl*) PSTDOUT;
+			
+			impl->lock = NULL;
+		}
+#endif
+		CHKLOG(rc, PFileFlush(PSTDOUT));
+		impl = (PANSIFileImpl*) PSTDOUT;
+		impl->value = NULL;
+		CHKLOG(rc, PFileDestroy(PSTDOUT));
+		PSTDOUT = NULL;
+	}
+	if (PSTDERR!=NULL)
+	{
+		CHKLOG(rc, PFileFlush(PSTDERR));
+		impl = (PANSIFileImpl*) PSTDERR;
+		impl->value = NULL;
+		CHKLOG(rc, PFileDestroy(PSTDERR));
+		PSTDERR = NULL;
+	}
+	CHKLOG(rc, PANSIFileSystemDestroy());
+	return ESR_SUCCESS;
+CLEANUP:
+	return rc;
+}
diff --git a/portable/src/UNIX/PFileWrapUNIX_OS_Specific.c b/portable/src/UNIX/PFileWrapUNIX_OS_Specific.c
new file mode 100644
index 0000000..dfe2efe
--- /dev/null
+++ b/portable/src/UNIX/PFileWrapUNIX_OS_Specific.c
@@ -0,0 +1,116 @@
+/*---------------------------------------------------------------------------*
+ *  PFileWrapUNIX_OS_Specific.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "errno.h"
+#include "PFileSystemImpl.h"
+#include "PANSIFileSystem.h"
+#include "PANSIFileSystemImpl.h"
+#include "phashtable.h"
+#include "LCHAR.h"
+#include "plog.h"
+
+ESR_ReturnCode pf_make_dir ( const LCHAR* path )
+    {
+    ESR_ReturnCode rc;
+
+    passert(path!=NULL);
+
+    if ( mkdir ( path, S_IRWXU|S_IRWXG|S_IRWXO ) == 0)
+	{
+	rc = ESR_SUCCESS;
+	}
+    else
+        {
+        switch (errno)
+            {
+            case EEXIST:
+                rc = ESR_IDENTIFIER_COLLISION;
+		break;
+
+            case ENOENT:
+                rc = ESR_NO_MATCH_ERROR;
+		break;
+
+            default:
+                PLogError ( L("ESR_INVALID_STATE") );
+                rc = ESR_INVALID_STATE;
+		break;
+            }
+        }
+    return ( rc );
+    }
+
+
+
+ESR_ReturnCode pf_get_cwd ( LCHAR* path, size_t *len )
+    {
+    ESR_ReturnCode rc;
+
+    if ( path != NULL )
+	{
+        if ( getcwd ( path, *len ) != NULL)
+	    {
+	    rc = ESR_SUCCESS;
+	    }
+	else
+	    {
+            switch ( errno )
+                {
+                case ERANGE:
+                    rc =  ESR_BUFFER_OVERFLOW;
+		    break;
+
+                case ENOMEM:
+                    rc =  ESR_OUT_OF_MEMORY;
+		    break;
+
+                default:
+                    PLogError(L("ESR_INVALID_STATE"));
+                    rc = ESR_INVALID_STATE;
+		    break;
+                }
+	    }
+	}
+    else
+	{
+	rc = ESR_INVALID_ARGUMENT;
+	PLogError(ESR_rc2str(rc));
+	}
+
+    return ( rc );
+    }
+
+
+
+ESR_ReturnCode pf_change_dir ( const LCHAR* path )
+    {
+    ESR_ReturnCode rc;
+
+    passert ( path != NULL );
+    passert ( *path != '\0' );
+
+    if ( chdir ( path ) == 0 )
+	rc = ESR_SUCCESS;
+    else
+	rc = ESR_NO_MATCH_ERROR;
+    return ( rc );
+    }
diff --git a/portable/src/pLastError.c b/portable/src/pLastError.c
new file mode 100644
index 0000000..446be08
--- /dev/null
+++ b/portable/src/pLastError.c
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------------*
+ *  pLastError.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "pLastError.h"
+#include "plog.h"
+
+void printGetLastErrorInternal(const LCHAR* text, char* file, int line)
+{
+#ifdef _WIN32
+  LCHAR* msg;
+  
+  if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                    FORMAT_MESSAGE_FROM_SYSTEM |
+                    FORMAT_MESSAGE_IGNORE_INSERTS,
+                    NULL,
+                    GetLastError(),
+                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
+                    (LPTSTR) &msg,
+                    0,
+                    NULL))
+  {
+    ESR_BOOL isInit;
+    ESR_ReturnCode rc;
+    msg[LSTRLEN(msg)-2] = L('\0'); /* cut off newline character */
+    
+    rc = PLogIsInitialized(&isInit);
+    if (rc != ESR_SUCCESS)
+      isInit = FALSE;
+    if (isInit)
+      PLogError(L("%s: %s"), text, msg);
+    else
+      pfprintf(PSTDERR, L("[%s:%d] %s: %s\n"), file, line, text, msg);
+    LocalFree(msg);
+  }
+#elif defined(__vxworks)
+  int err;
+  
+  err = errnoGet(); /* get the error status value of the calling task */
+#ifndef NDEBUG
+  /*  printErrno(err); */ /* need special flag to build Simulator */
+#endif
+  pfprintf(PSTDERR, "[%s:%d] %s, errno = %x\n", file, line, text, err);
+  
+#elif (OS == OS_UNIX)
+
+#else
+#error("Have not implemented yet!!!")
+#endif
+}
diff --git a/portable/src/pcputimer.c b/portable/src/pcputimer.c
new file mode 100644
index 0000000..3338475
--- /dev/null
+++ b/portable/src/pcputimer.c
@@ -0,0 +1,238 @@
+/*---------------------------------------------------------------------------*
+ *  pcputimer.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "pcputimer.h"
+#include "pmemory.h"
+
+#if defined(_WIN32)
+
+/*
+  Note that this implementation assumes that GetThreadTimes is
+  available (requires NT 3.5 and above) and that 64 bit arithmetic is
+  available (requires VC)
+*/
+
+struct PCPUTimer_t
+{
+  HANDLE hThread;
+  LARGE_INTEGER RefTime;
+  asr_uint32_t elapsed;
+};
+
+
+/**
+ * Creates a new timer object.
+ **/
+ESR_ReturnCode PCPUTimerCreate(PCPUTimer **timer)
+{
+  PCPUTimer *tmp = NULL;
+  
+  if (timer == NULL)
+    return ESR_INVALID_ARGUMENT;
+  tmp = NEW(PCPUTimer, "PCPUTimer");
+  if (tmp == NULL) return ESR_OUT_OF_MEMORY;
+  
+  tmp->hThread = GetCurrentThread();
+  tmp->RefTime.QuadPart = -1;
+  tmp->elapsed = 0;
+  *timer = tmp;
+  
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PCPUTimerDestroy(PCPUTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  FREE(timer);
+  return ESR_SUCCESS;
+}
+
+/**
+ * Starts the timer. This sets the reference time from which all new elapsed
+ * time are computed.  This does not reset the elapsed time to 0.  This is
+ * useful to pause the timer.
+ **/
+ESR_ReturnCode PCPUTimerStart(PCPUTimer *timer)
+{
+  FILETIME CreationTime;
+  FILETIME ExitTime;
+  FILETIME KernelTime;
+  FILETIME UserTime;
+  
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  if (!GetThreadTimes(timer->hThread,
+                      &CreationTime, &ExitTime, &KernelTime, &UserTime))
+  {
+    return ESR_FATAL_ERROR;
+  }
+  
+  timer->RefTime.QuadPart = (((LARGE_INTEGER*) & KernelTime)->QuadPart +
+                             ((LARGE_INTEGER*) & UserTime)->QuadPart);
+                             
+  return ESR_SUCCESS;
+}
+
+/**
+ * Stops the timer.
+ **/
+ESR_ReturnCode PCPUTimerStop(PCPUTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  if (timer->RefTime.QuadPart != -1)
+  {
+    FILETIME CreationTime;
+    FILETIME ExitTime;
+    FILETIME KernelTime;
+    FILETIME UserTime;
+    
+    if (!GetThreadTimes(timer->hThread,
+                        &CreationTime, &ExitTime, &KernelTime, &UserTime))
+      return ESR_FATAL_ERROR;
+      
+    timer->elapsed =
+      (asr_uint32_t) (((LARGE_INTEGER*) &KernelTime)->QuadPart +
+                  ((LARGE_INTEGER*) &UserTime)->QuadPart -
+                  timer->RefTime.QuadPart) / 10;
+  }
+  return ESR_SUCCESS;
+}
+
+/**
+ * Returns the timer elapsed time.  If the Timer is in the stopped state,
+ * successive calls to getElapsed() will always return the same value.  If
+ * the Timer is in the started state, successive calls will return the
+ * elapsed time since the last time PCPUTimerStart() was called.
+ */
+ESR_ReturnCode PCPUTimerGetElapsed(PCPUTimer *timer, asr_uint32_t *elapsed)
+{
+  if (timer == NULL || elapsed == NULL) return ESR_INVALID_ARGUMENT;
+  if (timer->RefTime.QuadPart != -1)
+  {
+    FILETIME CreationTime;
+    FILETIME ExitTime;
+    FILETIME KernelTime;
+    FILETIME UserTime;
+    
+    if (!GetThreadTimes(timer->hThread,
+                        &CreationTime, &ExitTime, &KernelTime, &UserTime))
+      return ESR_FATAL_ERROR;
+      
+    *elapsed = timer->elapsed +
+               (asr_uint32_t)(((LARGE_INTEGER*) & KernelTime)->QuadPart +
+                              ((LARGE_INTEGER*) & UserTime)->QuadPart -
+                              timer->RefTime.QuadPart) / 10;
+  }
+  else
+    *elapsed = timer->elapsed;
+  return ESR_SUCCESS;
+}
+
+
+/**
+ * Resets the elapsed time to 0 and resets the reference time of the Timer.
+ * This effectively reset the timer in the same state it was right after creation.
+ **/
+ESR_ReturnCode PCPUTimerReset(PCPUTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  timer->RefTime.QuadPart = -1;
+  timer->elapsed = 0;
+  return ESR_SUCCESS;
+}
+
+#elif defined(POSIX)
+/*
+*/
+
+struct PCPUTimer_t
+{
+  HANDLE   hThread;
+  asr_uint32_t RefTime;
+  asr_uint32_t elapsed;
+};
+
+/**
+* Creates a new timer object.
+**/
+ESR_ReturnCode PCPUTimerCreate(PCPUTimer **timer)
+{
+  PCPUTimer *tmp = NULL;
+
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  tmp = NEW(PCPUTimer, "PCPUTimer");
+  if (tmp == NULL) return ESR_OUT_OF_MEMORY;
+
+  tmp->hThread = (HANDLE)pthread_self();
+  tmp->elapsed = 0;
+  *timer = tmp;
+
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PCPUTimerDestroy(PCPUTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  FREE(timer);
+  return ESR_SUCCESS;
+}
+
+/**
+* Starts the timer. This sets the reference time from which all new elapsed
+* time are computed.  This does not reset the elapsed time to 0.  This is
+* useful to pause the timer.
+**/
+ESR_ReturnCode PCPUTimerStart(PCPUTimer *timer)
+{
+  return ESR_SUCCESS;
+}
+
+/**
+* Stops the timer.
+**/
+ESR_ReturnCode PCPUTimerStop(PCPUTimer *timer)
+{
+  return ESR_SUCCESS;
+}
+
+/**
+* Returns the timer elapsed time.  If the Timer is in the stopped state,
+* successive calls to getElapsed() will always return the same value.  If
+* the Timer is in the started state, successive calls will return the
+* elapsed time since the last time PCPUTimerStart() was called.
+*/
+ESR_ReturnCode PCPUTimerGetElapsed(PCPUTimer *timer, asr_uint32_t *elapsed)
+{
+  return ESR_SUCCESS;
+}
+
+
+/**
+* Resets the elapsed time to 0 and resets the reference time of the Timer.
+* This effectively reset the timer in the same state it was right after creation.
+**/
+ESR_ReturnCode PCPUTimerReset(PCPUTimer *timer)
+{
+  return ESR_SUCCESS;
+}
+
+#else
+/* #error "Ptimer not implemented for this platform." */
+#endif
diff --git a/portable/src/pcrc.c b/portable/src/pcrc.c
new file mode 100644
index 0000000..a178fd8
--- /dev/null
+++ b/portable/src/pcrc.c
@@ -0,0 +1,159 @@
+/*---------------------------------------------------------------------------*
+ *  pcrc.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "pcrc.h"
+#include <limits.h>
+
+/* the CRC tables are computed by the crctable.c program which is part of this
+   distribution but not compiled.
+ */
+
+#if (UINT_MAX >= 0xFFFFFFFFU)
+
+#define WIDTH 32
+
+/* USE CRC-32 algorithm on machine with at least 32 bits. */
+#define POLYNOMIAL 0x04C11DB7
+
+static unsigned int crcTable[] =
+  {
+    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
+    0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
+    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
+    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
+    0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
+    0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
+    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
+    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
+    0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
+    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
+    0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
+    0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
+    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
+    0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
+    0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
+    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
+    0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
+    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
+    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
+    0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
+    0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
+    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
+    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
+    0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
+    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
+    0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
+    0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
+    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
+    0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
+    0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
+    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
+    0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
+  };
+  
+#elif (UINT_MAX >= 0xFFFFU)*/
+/* use CRC-16 on machine with [16..32[ bits integer. */
+  
+#define WIDTH  16
+#define TOPBIT (1 << (WIDTH - 1))
+  
+#define POLYNOMIAL 0x8005
+  
+static unsigned int crcTable[] =
+  {
+    0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
+    0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
+    0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
+    0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
+    0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
+    0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
+    0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
+    0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
+    0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
+    0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
+    0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
+    0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
+    0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
+    0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
+    0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
+    0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
+    0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
+    0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
+    0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
+    0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
+    0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
+    0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
+    0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
+    0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
+    0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
+    0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
+    0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
+    0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
+    0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
+    0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
+    0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
+    0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
+  };
+  
+#else
+#error "CRC is not defined on machine with less than 16 bits arithmetic."
+#endif
+  
+unsigned int pcrcComputeData(const void *data, unsigned int size)
+{
+  return pcrcUpdateData(CRC_INITIAL_VALUE, data, size);
+}
+
+unsigned int pcrcUpdateData(unsigned int crc, const void *data, unsigned int size)
+{
+  register unsigned char byte;
+  register const unsigned char *p = (const unsigned char *) data;
+  register unsigned int remainder = crc;
+  
+  if (p != NULL)
+  {
+    while (size > 0)
+    {
+#if CHAR_BIT <= 8
+      byte = (unsigned char)((remainder >> (WIDTH - 8)) ^ *p++);
+      remainder = crcTable[byte] ^(remainder << 8);
+#elif CHAR_BIT <= 16
+      byte = (unsigned char)(((remainder >> (WIDTH - 8)) ^(*p >> 8)) & 0xFF);
+      remainder = crcTable[byte] ^(remainder << 8);
+      byte = (unsigned char)(((remainder >> (WIDTH - 8)) ^(*p++ & 0xFF)) & 0xFF);
+      remainder = crcTable[byte] ^(remainder << 8);
+#else
+#error "crcCompute not defined for this platform."
+#endif
+      --size;
+    }
+  }
+  
+  return remainder;
+}
+
+unsigned int pcrcComputeString(const LCHAR *str)
+{
+  if (str == NULL)
+    return pcrcComputeData(NULL, 0);
+    
+  return pcrcComputeData(str, sizeof(LCHAR) * LSTRLEN(str));
+}
diff --git a/portable/src/pendian.c b/portable/src/pendian.c
new file mode 100644
index 0000000..3649ab0
--- /dev/null
+++ b/portable/src/pendian.c
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*
+ *  pendian.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+
+
+#include "pendian.h"
+
+void swap_byte_order(void *buffer, size_t count, size_t itemSize)
+{
+  char *data = (char *) buffer;
+  register char *p, *q, c;
+  
+  /* Process every item */
+  while (count > 0)
+  {
+    p = data;
+    q = data + itemSize - 1;
+    
+    while (p < q)
+    {
+      c = *p;
+      *p++ = *q;
+      *q-- = c;
+    }
+    
+    /* Prepare for next pass */
+    data += itemSize;
+    count--;
+  }
+}
diff --git a/portable/src/phashtable.c b/portable/src/phashtable.c
new file mode 100644
index 0000000..4940c60
--- /dev/null
+++ b/portable/src/phashtable.c
@@ -0,0 +1,560 @@
+/*---------------------------------------------------------------------------*
+ *  phashtable.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+
+
+#include <string.h>
+
+#include "phashtable.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "pstdio.h"
+
+//extern int strcmp(const char * s1,  const char * s2);
+
+#define ALLOC_SIZE 16
+
+struct PHashTableEntry_t
+{
+  const void *key;
+  const void *value;
+  PHashTable *table;
+  unsigned int idx;
+  PHashTableEntry *next;
+  PHashTableEntry *prev;
+  unsigned int hashCode;
+};
+
+typedef struct PHashTableEntryBlock_t
+{
+  PHashTableEntry entries[ALLOC_SIZE];
+  struct PHashTableEntryBlock_t *next;
+}
+PHashTableEntryBlock;
+
+
+struct PHashTable_t
+{
+  PHashTableArgs args;
+  const LCHAR *memoryTag;
+  unsigned int size;
+  float maxLoadFactor;
+  PHashTableEntry **entries;
+  unsigned int threshold;
+  PHashTableEntry *freeList;
+  PHashTableEntryBlock *entryBlock;
+};
+
+#include "pcrc.h"
+
+static unsigned int hashString(const void *key)
+{
+  return ~pcrcComputeString(key);
+}
+
+ESR_ReturnCode PHashTableCreate(PHashTableArgs *args,
+                                const LCHAR *memTag,
+                                PHashTable **table)
+{
+  PHashTable *tmp;
+  unsigned int i;
+  
+  if (table == NULL ||
+      (args != NULL && args->maxLoadFactor <= 0.0))
+    return ESR_INVALID_ARGUMENT;
+    
+    
+  if ((tmp = NEW(PHashTable, memTag)) == NULL)
+    return ESR_OUT_OF_MEMORY;
+    
+  if (args == NULL)
+  {
+    tmp->args.capacity = PHASH_TABLE_DEFAULT_CAPACITY;
+    tmp->args.maxLoadFactor = PHASH_TABLE_DEFAULT_MAX_LOAD_FACTOR;
+    tmp->args.hashFunction = PHASH_TABLE_DEFAULT_HASH_FUNCTION;
+    tmp->args.compFunction = PHASH_TABLE_DEFAULT_COMP_FUNCTION;
+  }
+  else
+  {
+    memcpy(&tmp->args, args, sizeof(PHashTableArgs));
+  }
+  if (tmp->args.hashFunction == PHASH_TABLE_DEFAULT_HASH_FUNCTION)
+    tmp->args.hashFunction = hashString;
+    
+  if (tmp->args.compFunction == PHASH_TABLE_DEFAULT_COMP_FUNCTION)
+    tmp->args.compFunction = LSTRCMP;
+    
+  tmp->entries = NEW_ARRAY(PHashTableEntry *, tmp->args.capacity, memTag);
+  
+  if (tmp->entries == NULL)
+  {
+    FREE(tmp);
+    return ESR_OUT_OF_MEMORY;
+  }
+  
+  for (i = tmp->args.capacity; i > 0;)
+  {
+    tmp->entries[--i] = NULL;
+  }
+  
+  tmp->memoryTag = memTag;
+  tmp->size = 0;
+  tmp->threshold = (unsigned int)(tmp->args.capacity * tmp->args.maxLoadFactor);
+  tmp->freeList = NULL;
+  tmp->entryBlock = NULL;
+  
+  *table = tmp;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PHashTableDestroy(PHashTable *table)
+{
+  PHashTableEntryBlock *tmp, *block;
+  
+  if (table == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  block = table->entryBlock;
+  while (block != NULL)
+  {
+    tmp = block->next;
+    FREE(block);
+    block = tmp;
+  }
+  
+  FREE(table->entries);
+  FREE(table);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PHashTableGetSize(PHashTable *table,
+                                 size_t *size)
+{
+  if (table == NULL || size == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  *size = table->size;
+  return ESR_SUCCESS;
+}
+
+static PHashTableEntry *getEntry(PHashTable *table,
+                                 const void *key,
+                                 unsigned int hashCode,
+                                 unsigned int idx)
+{
+  PHashTableEntry *entry = table->entries[idx];
+  
+  if (key == NULL)
+  {
+    while (entry != NULL)
+    {
+      if (entry->key == NULL)
+        return entry;
+        
+      entry = entry->next;
+    }
+  }
+  else
+  {
+    while (entry != NULL)
+    {
+      if (entry->hashCode == hashCode && table->args.compFunction(key, entry->key) == 0)
+        return entry;
+        
+      entry = entry->next;
+    }
+  }
+  
+  return NULL;
+}
+
+static void removeEntry(PHashTableEntry *entry)
+{
+  if (entry->prev == NULL)
+    entry->table->entries[entry->idx] = entry->next;
+  else
+    entry->prev->next = entry->next;
+    
+  if (entry->next != NULL)
+    entry->next->prev = entry->prev;
+    
+  entry->table->size--;
+  
+  entry->next = entry->table->freeList;
+  entry->table->freeList = entry;
+  /* clean up entry for re-use. */
+  entry->key = entry->value = NULL;
+}
+
+ESR_ReturnCode PHashTableGetValue(PHashTable *table, const void *key, void **value)
+{
+  PHashTableEntry *entry;
+  unsigned int hashCode;
+  unsigned int idx;
+  
+  if (table == NULL || value == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  hashCode = table->args.hashFunction(key);
+  idx = hashCode % table->args.capacity;
+  if ((entry = getEntry(table, key, hashCode, idx)) != NULL)
+  {
+    *value = (void *) entry->value;
+    return ESR_SUCCESS;
+  }
+  else
+  {
+    *value = NULL;
+    return ESR_NO_MATCH_ERROR;
+  }
+}
+
+ESR_ReturnCode PHashTableContainsKey(PHashTable *table, const void *key, ESR_BOOL* exists)
+{
+  ESR_ReturnCode rc;
+  PHashTableEntry* entry;
+  
+  if (table == NULL || exists == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  rc = PHashTableGetEntry(table, key, &entry);
+  if (rc == ESR_SUCCESS)
+    *exists = ESR_TRUE;
+  else if (rc == ESR_NO_MATCH_ERROR)
+    *exists = ESR_FALSE;
+  else
+    goto CLEANUP;
+    
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PHashTableGetEntry(PHashTable *table, const void *key, PHashTableEntry **entry)
+{
+  unsigned int hashCode;
+  unsigned int idx;
+  PHashTableEntry* result;
+  
+  if (table == NULL || entry == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  hashCode = table->args.hashFunction(key);
+  idx = hashCode % table->args.capacity;
+  
+  result = getEntry(table, key, hashCode, idx);
+  if (result == NULL)
+    return ESR_NO_MATCH_ERROR;
+  *entry = result;
+  return ESR_SUCCESS;
+}
+
+static ESR_ReturnCode PHashTableRehash(PHashTable *table)
+{
+  unsigned int i, idx;
+  unsigned int oldCapacity = table->args.capacity;
+  unsigned int newCapacity = ((oldCapacity << 1) | 0x01);
+  PHashTableEntry *entry, *tmp, *next;
+  
+  PHashTableEntry **newEntries =
+    (PHashTableEntry **)
+    REALLOC(table->entries,
+            sizeof(PHashTableEntry *) * newCapacity);
+            
+  if (newEntries == NULL)
+    return ESR_OUT_OF_MEMORY;
+    
+  table->entries = newEntries;
+  table->args.capacity = newCapacity;
+  table->threshold = (unsigned int)(newCapacity * table->args.maxLoadFactor);
+  
+  for (i = oldCapacity; i < newCapacity; ++i)
+  {
+    table->entries[i] = NULL;
+  }
+  
+  for (i = 0; i < oldCapacity; i++)
+  {
+    for (entry = table->entries[i]; entry != NULL;)
+    {
+      idx = entry->hashCode % newCapacity;
+      if (idx != i)
+      {
+        /* Need to change location. */
+        entry->idx = idx;
+        
+        next = entry->next;
+        
+        if (entry->prev != NULL)
+          entry->prev->next = next;
+        else
+          table->entries[i] = next;
+          
+        if (next != NULL)
+          next->prev = entry->prev;
+          
+        tmp = table->entries[idx];
+        entry->next = tmp;
+        entry->prev = NULL;
+        if (tmp != NULL)
+          tmp->prev = entry;
+        table->entries[idx] = entry;
+        
+        entry = next;
+      }
+      else
+      {
+        /* Already in the right slot. */
+        entry = entry->next;
+      }
+    }
+  }
+  return ESR_SUCCESS;
+}
+
+
+ESR_ReturnCode PHashTablePutValue(PHashTable *table,
+                                  const void *key,
+                                  const void *value,
+                                  void **oldValue)
+{
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  unsigned int hashCode, idx;
+  PHashTableEntry *entry;
+  
+  if (table == NULL) return ESR_INVALID_ARGUMENT;
+  hashCode = table->args.hashFunction(key);
+  idx = hashCode % table->args.capacity;
+  
+  entry = getEntry(table, key, hashCode, idx);
+  if (entry != NULL)
+  {
+    if (oldValue != NULL) *oldValue = (void *) entry->value;
+    entry->value = value;
+    return ESR_SUCCESS;
+  }
+  
+  /* If we get here, we need to add a new entry.  But first, verify if we need
+     to rehash. */
+  if (table->size >= table->threshold)
+  {
+    if ((rc = PHashTableRehash(table)) != ESR_SUCCESS)
+      return rc;
+    idx = hashCode % table->args.capacity;
+  }
+  
+  if (table->freeList == NULL)
+  {
+    /* Allocate a new block and put all entries on the free list. */
+    PHashTableEntryBlock *block;
+    int i;
+    
+    block = NEW(PHashTableEntryBlock, table->memoryTag);
+    if (block == NULL)
+      return ESR_OUT_OF_MEMORY;
+      
+    block->next = table->entryBlock;
+    table->entryBlock = block;
+    
+    for (i = 0; i < ALLOC_SIZE - 1; ++i)
+    {
+      block->entries[i].next = &block->entries[i+1];
+    }
+    block->entries[ALLOC_SIZE-1].next = NULL;
+    
+    /* do not see any bug in following code. But on the VxWorks with optimization option -O3
+      it produces wrong result: block->entries[0].next is correct but block->entries[1].next = NULL
+      it causes lot of memory wastes.
+    for (i = 0, entry = block->entries; i < ALLOC_SIZE - 1; ++i, ++entry)
+    {
+      entry->next = entry+1;
+    }
+    entry->next = table->freeList;
+    */
+    
+    table->freeList = block->entries;
+  }
+  
+  /* Get an entry from the freeList. */
+  entry = table->freeList;
+  table->freeList = entry->next;
+  
+  /* Initialize entry data structure. */
+  entry->table = table;
+  entry->idx = idx;
+  entry->key = key;
+  entry->value = value;
+  entry->hashCode = hashCode;
+  entry->next = table->entries[idx];
+  entry->prev = NULL;
+  if (entry->next != NULL)
+    entry->next->prev = entry;
+  table->entries[idx] = entry;
+  table->size++;
+  
+  if (oldValue != NULL) *oldValue = NULL;
+  return ESR_SUCCESS;
+}
+
+
+ESR_ReturnCode PHashTableRemoveValue(PHashTable *table,
+                                     const void *key,
+                                     void **oldValue)
+{
+  unsigned int hashCode, idx;
+  PHashTableEntry *entry;
+  ESR_ReturnCode rc;
+  
+  if (table == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  hashCode = table->args.hashFunction(key);
+  idx = hashCode % table->args.capacity;
+  
+  entry = getEntry(table, key, hashCode, idx);
+  if (entry != NULL)
+  {
+    if (oldValue != NULL)
+      *oldValue = (void*) entry->value;
+    removeEntry(entry);
+  }
+  else
+  {
+    if (oldValue != NULL)
+      *oldValue = NULL;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode PHashTableEntryGetKeyValue(PHashTableEntry *entry,
+    void **key,
+    void **value)
+{
+  if (entry == NULL) return ESR_INVALID_ARGUMENT;
+  
+  if (key != NULL) *key = (void *) entry->key;
+  if (value != NULL) *value = (void *) entry->value;
+  return ESR_SUCCESS;
+}
+
+
+/**
+ * Sets the value associated with this entry.
+ * @param entry The hashtable entry.
+ * @param value The value to associate with the entry.
+ * @param oldvalue If this pointer is non-NULL, it will be set to the previous value associated with this entry.
+ **/
+ESR_ReturnCode PHashTableEntrySetValue(PHashTableEntry *entry,
+                                       const void *value,
+                                       void **oldValue)
+{
+  if (entry == NULL) return ESR_INVALID_ARGUMENT;
+  
+  if (oldValue != NULL) *oldValue = (void *) entry->value;
+  entry->value = value;
+  return ESR_SUCCESS;
+}
+
+
+/**
+ * Removes the entry from its hash table.
+ *
+ * @param entry The hashtable entry.
+ **/
+ESR_ReturnCode PHashTableEntryRemove(PHashTableEntry *entry)
+{
+  if (entry == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  removeEntry(entry);
+  
+  return ESR_SUCCESS;
+}
+
+static PHashTableEntry* iteratorAdvance(PHashTable *table, PHashTableEntry *entry)
+{
+  unsigned int idx;
+  
+  if (entry != NULL)
+  {
+    idx = entry->idx;
+    entry = entry->next;
+    if (entry == NULL)
+    {
+      while (++idx < table->args.capacity)
+      {
+        if (table->entries[idx] != NULL)
+        {
+          entry = table->entries[idx];
+          break;
+        }
+      }
+    }
+  }
+  else
+  {
+    for (idx = 0; idx < table->args.capacity; ++idx)
+    {
+      if (table->entries[idx] != NULL)
+      {
+        entry = table->entries[idx];
+        break;
+      }
+    }
+  }
+  return entry;
+}
+
+
+ESR_ReturnCode PHashTableEntryGetFirst(PHashTable *table, PHashTableEntry **entry)
+{
+  if (table == NULL || entry == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  *entry = iteratorAdvance(table, NULL);
+  return ESR_SUCCESS;
+}
+
+/**
+ * Iterates on the next key and value.  Returns a NULL key when at the end of the hash table.
+ *
+ * @param iter The iterator on which the iteration is performed.
+ * @param key Returns the key associated with the entry, cannot be NULL.
+ * @param value If non-NULL, returns the value associated with the entry.
+ **/
+ESR_ReturnCode PHashTableEntryAdvance(PHashTableEntry **entry)
+{
+  if (entry == NULL || *entry == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  *entry = iteratorAdvance((*entry)->table, *entry);
+  return ESR_SUCCESS;
+}
diff --git a/portable/src/plog.c b/portable/src/plog.c
new file mode 100644
index 0000000..3aefbc7
--- /dev/null
+++ b/portable/src/plog.c
@@ -0,0 +1,538 @@
+/*---------------------------------------------------------------------------*
+ *  plog.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "PFileSystem.h"
+#include "ptypes.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "pstdio.h"
+#include "ptimestamp.h"
+#include "passert.h"
+#ifdef USE_STACKTRACE
+#include "PStackTrace.h"
+#endif
+
+#ifdef USE_THREAD
+#include "ptrd.h"
+#include "pmutex.h"
+#endif
+
+
+#if defined (ANDROID)
+#if defined (HAVE_ANDROID_OS)
+#define LOG_TAG "Srec" 
+#include <utils/Log.h>
+#endif
+#endif
+
+#include "phashtable.h"
+
+#define MTAG __FILE__
+
+#define FILTER_MSG_1		"ESR_BUFFER_OVERFLOW"
+#define FILTER_MSG_1_SIZE	( sizeof ( FILTER_MSG_1 ) - 1 )
+
+#define FILTER_MSG_2		"ESR_NO_MATCH_ERROR"
+#define FILTER_MSG_2_SIZE	( sizeof ( FILTER_MSG_2 ) - 1 )
+
+static unsigned int GlogLevel = 0;
+static PLogger *Glogger = NULL;
+static LOG_OUTPUT_FORMAT GlogFormat = LOG_OUTPUT_FORMAT_MODULE_NAME |
+                                      LOG_OUTPUT_FORMAT_DATE_TIME;
+/**
+ * Used to detect endless recursion where the PLog module calls itself.
+ */
+static ESR_BOOL locked = ESR_FALSE;
+#ifdef USE_THREAD
+
+static PtrdMutex* Gmutex = NULL;
+#endif
+
+typedef struct FileLogger_t
+{
+  PLogger base;
+  PFile* fp;
+}
+FileLogger;
+
+/**
+ * Prints and formats a message to the log.
+ *
+ * @param self the PLogger.
+ *
+ * @param format the format string specifying the next arguments (a la
+ * printf).
+ *
+ * @param args variable argument list.
+ *
+ * @return The number of bytes written to the PLogger or -1 if an error
+ * occurs.
+ */
+static ESR_ReturnCode FileLoggerPrintf(PLogger *self, const LCHAR *format, ...)
+{
+  FileLogger *p = STATIC_CAST(self, FileLogger, base);
+  ESR_ReturnCode rc;
+  va_list args;
+  
+  va_start(args, format);
+  rc = pvfprintf(p->fp, format, args);
+  va_end(args);
+  return rc;
+}
+
+static ESR_ReturnCode FileLoggerFlush(PLogger *self)
+{
+  FileLogger *p = STATIC_CAST(self, FileLogger, base);
+  return pfflush(p->fp) == 0 ? ESR_SUCCESS : ESR_FATAL_ERROR;
+}
+
+
+/**
+ * Destroys the logger.  This function is responsible to deallocate any
+ * resources used by the logger.  In particular, if buffering is internally
+ * used, it needs to flush the buffer.
+ */
+static void FileLoggerDestroy(PLogger *self)
+{
+  FileLogger *p = STATIC_CAST(self, FileLogger, base);
+  pfflush(p->fp);
+  
+  if (p->fp != PSTDERR && p->fp != PSTDOUT)
+    pfclose(p->fp);
+  FREE(p);
+}
+
+static ESR_ReturnCode createPFileLogger(PFile* fp, PLogger** logger)
+{
+  FileLogger* fileLogger;
+  
+  if (fp == NULL)
+    return ESR_INVALID_ARGUMENT;
+  fileLogger = NEW(FileLogger, MTAG);
+  if (fileLogger == NULL)
+    return ESR_OUT_OF_MEMORY;
+    
+  fileLogger->base.printf = FileLoggerPrintf;
+  fileLogger->base.flush = FileLoggerFlush;
+  fileLogger->base.destroy = FileLoggerDestroy;
+  fileLogger->fp = fp;
+  
+  *logger = &fileLogger->base;
+  return ESR_SUCCESS;
+}
+
+/**
+ * Initializes the LOG library.  This function must be called before any
+ * logging can take place.
+ *
+ * @param logger The logger to be used to output the messages.  If NULL, then
+ * logging goes to PSTDERR.  @param logLevel The level of logging requested.
+ *
+ * @return ESR_SUCCESS if success, anything else if an error occurs.
+ *
+ */
+ESR_ReturnCode PLogInit(PLogger *logger, unsigned int logLevel)
+{
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  if (Glogger != NULL)
+    return ESR_INVALID_STATE;
+    
+  GlogLevel = logLevel;
+  
+#ifdef USE_THREAD
+  if ((rc = PtrdMutexCreate(&Gmutex)) != ESR_SUCCESS)
+    return rc;
+#endif
+    
+  if (logger != NULL)
+    Glogger = logger;
+  else
+  {
+    rc = createPFileLogger(PSTDERR, &Glogger);
+    if (rc != ESR_SUCCESS)
+      goto CLEANUP;
+  }
+  
+  return rc;
+CLEANUP:
+#ifdef USE_THREAD
+  if (Gmutex != NULL)
+  {
+    PtrdMutexDestroy(Gmutex);
+    Gmutex = NULL;
+  }
+#endif
+  return rc;
+}
+
+ESR_ReturnCode PLogIsInitialized(ESR_BOOL* isInit)
+{
+  if (isInit == NULL)
+    return ESR_INVALID_STATE;
+  *isInit = Glogger != NULL;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PLogIsLocked(ESR_BOOL* isLocked)
+{
+  if (isLocked == NULL)
+    return ESR_INVALID_STATE;
+  *isLocked = locked;
+  return ESR_SUCCESS;
+}
+
+/**
+ * Shutdowns the LOG library.  Once this function is called, no logging activity can be performed.
+ * Also, the logger that was given to pLogInit is destroyed.
+ *
+ * @return ESR_SUCCESS if success, anything else if an error occurs.
+ *
+ */
+ESR_ReturnCode PLogShutdown()
+{
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  if (Glogger == NULL)
+    return ESR_INVALID_STATE;
+    
+#ifdef USE_THREAD
+  if ((rc = PtrdMutexDestroy(Gmutex)) != ESR_SUCCESS)
+    return rc;
+  Gmutex = NULL;
+#endif
+  
+  if (Glogger->flush != NULL)
+    Glogger->flush(Glogger);
+  Glogger->destroy(Glogger);
+  Glogger = NULL;
+  return rc;
+}
+
+ESR_ReturnCode PLogGetLevel(unsigned int *logLevel)
+{
+  if (Glogger == NULL)
+    return ESR_INVALID_STATE;
+  if (logLevel == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  *logLevel = GlogLevel;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PLogSetLevel(unsigned int logLevel)
+{
+  if (Glogger == NULL)
+    return ESR_INVALID_STATE;
+    
+  GlogLevel = logLevel;
+  return ESR_SUCCESS;
+}
+
+#define TIME_BUF_SIZE 24
+#define TIME_FORMAT L("%Y/%m/%d %H:%M:%S")
+#define PLOG_PANIC(x, rc) \
+  do \
+  { \
+    { \
+      pfprintf(PSTDERR, L("[%s:%d] %s failed with %s\n"), __FILE__, __LINE__, x, ESR_rc2str(rc)); \
+      pfflush(PSTDERR); \
+    } \
+  } while (0)
+
+static ESR_ReturnCode logIt(const LCHAR *format, va_list args, ESR_BOOL showStackTrace)
+{
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  ESR_ReturnCode flushRC = ESR_SUCCESS;
+#ifdef USE_STACKTRACE
+#define BUFFER_SIZE P_MAX_STACKTRACE + 2000
+#else
+#define BUFFER_SIZE 2000
+#endif
+  LCHAR buffer[BUFFER_SIZE] = L("");
+
+  // TODO: Remove once logging subsystem supports "warn" level
+  if (strstr(format, "ESR_BUFFER_OVERFLOW")==format)
+    return ESR_SUCCESS;
+  
+#ifdef USE_STACKTRACE
+  if (Glogger == NULL)
+  {
+    /*
+     * There are three possible scenerios for why logging would occur although the PLog module
+     * is uninitialized:
+     *
+     * 1) The code fails before PLog is initialized (perhaps in other portable components)
+     * 2) The user forgets to initialize the PLog module
+     * 3) The code fails after PLog is uninitialized (on shutdown)
+     *
+     * We do our best by logging any errors but this might result in the memory leak of
+     * the PStackTrace module in case 3.
+     */
+    rc = PStackTraceCreate();
+    if (rc != ESR_SUCCESS)
+    {
+      PLOG_PANIC(L("PStackTraceCreate"), rc);
+      goto CLEANUP;
+    }
+  }
+  else
+  {
+#ifdef USE_THREAD
+    rc = PtrdMutexLock(Gmutex);
+    if (rc != ESR_SUCCESS)
+      return rc;
+#endif
+  }
+  if (locked)
+    return ESR_INVALID_STATE;
+  locked = ESR_TRUE;
+  
+  if (GlogFormat & LOG_OUTPUT_FORMAT_DATE_TIME)
+  {
+    PTimeStamp now;
+    struct tm* loctime;
+    LCHAR timeStr[TIME_BUF_SIZE];
+    size_t timeStrSize;
+    
+    PTimeStampSet(&now);
+    loctime = localtime(&now.secs);
+    timeStrSize = LSTRFTIME(timeStr, TIME_BUF_SIZE, TIME_FORMAT, loctime);
+    passert(timeStrSize == (TIME_BUF_SIZE - 5));
+    psprintf(timeStr + (TIME_BUF_SIZE - 5), ".%03hu", now.msecs);
+    
+    psprintf(buffer + LSTRLEN(buffer), L("%s|"), timeStr);
+    passert(LSTRLEN(buffer) < BUFFER_SIZE);
+  }
+  
+  if (GlogFormat & LOG_OUTPUT_FORMAT_THREAD_ID)
+  {
+    rc = psprintf(buffer + LSTRLEN(buffer), L("trd=%u|"), PtrdGetCurrentThreadId());
+    passert(LSTRLEN(buffer) < BUFFER_SIZE);
+  }
+  
+  if (GlogFormat & LOG_OUTPUT_FORMAT_MODULE_NAME && showStackTrace)
+  {
+    size_t len = P_MAX_STACKTRACE;
+    LCHAR text[P_MAX_STACKTRACE];
+    LCHAR* index;
+    size_t i;
+    
+    rc = PStackTraceGetValue((LCHAR*) & text, &len);
+    if (rc == ESR_SUCCESS)
+    {
+      for (i = 0; i < 2; ++i)
+      {
+        rc = PStackTracePopLevel((LCHAR*) & text);
+        if (rc != ESR_SUCCESS)
+        {
+          PLOG_PANIC(L("PStackTracePopLevel"), rc);
+          goto CLEANUP;
+        }
+      }
+      index = text;
+      while (index)
+      {
+        index = LSTRSTR(index, L(" at\n"));
+        if (index != NULL)
+        {
+          *(index + 1) = L('<');
+          *(index + 2) = L('-');
+          *(index + 3) = L(' ');
+        }
+      }
+    }
+    else if (rc == ESR_NOT_SUPPORTED)
+      LSTRCPY(text, L(""));
+    else if (rc != ESR_SUCCESS)
+    {
+      PLOG_PANIC(L("PStackTraceGetValue"), rc);
+      goto CLEANUP;
+    }
+    rc = psprintf(buffer + LSTRLEN(buffer), L("Module=%s|"), text);
+    passert(LSTRLEN(buffer) < BUFFER_SIZE);
+  }
+  
+  pvsprintf(buffer + LSTRLEN(buffer), format, args);
+#else
+  pvsprintf(buffer + LSTRLEN(buffer), format, args);
+#endif
+  passert(LSTRLEN(buffer) < BUFFER_SIZE);
+  
+  psprintf(buffer + LSTRLEN(buffer), L("\n"));
+  passert(LSTRLEN(buffer) < BUFFER_SIZE);
+  
+  if (Glogger != NULL)
+  {
+    rc = Glogger->printf(Glogger, L("%s"), buffer);
+    if (rc != ESR_SUCCESS)
+      goto CLEANUP;
+    flushRC = Glogger->flush(Glogger);
+  }
+  else
+  {
+    /* We need to log but the logging module is disabled or is locked so we output to stderr instead */
+    {
+      pfprintf(PSTDERR, L("%s"), buffer);
+      pfflush(PSTDERR);
+    }
+  }
+  locked = ESR_FALSE;
+#ifdef USE_THREAD
+  PtrdMutexUnlock(Gmutex);
+#endif
+  return flushRC;
+CLEANUP:
+  if (Glogger != NULL && Glogger->flush != NULL)
+    flushRC = Glogger->flush(Glogger);
+  locked = ESR_FALSE;
+#ifdef USE_THREAD
+  PtrdMutexUnlock(Gmutex);
+#endif
+  return rc != ESR_SUCCESS ? rc : flushRC;
+}
+
+/**
+ * Conditionally PLogs a message.  The message is logged only if module is enabled.
+ *
+ * @param msg The message format specification (ala printf).
+ * @return ESR_SUCCESS if success, anything else if an error occurs.
+ */
+ESR_ReturnCode PLogMessage(const char* msg, ...)
+{
+  va_list args;
+  ESR_ReturnCode rc;
+#if USE_STACKTRACE
+  size_t depth;
+#endif
+  
+#if defined (ANDROID)
+#if defined (HAVE_ANDROID_OS)
+  return ( ESR_SUCCESS );/* Get rid of this for phone device */
+#endif
+#endif
+
+  if (Glogger == NULL)
+    return ESR_INVALID_STATE;
+#ifdef USE_STACKTRACE
+  return ESR_SUCCESS;
+  rc = PStackTraceGetDepth(&depth);
+  
+  if (rc == ESR_NOT_SUPPORTED)
+  {
+    /* Debugging symbols are missing */
+    return ESR_SUCCESS;
+  }
+  else if (rc != ESR_SUCCESS)
+  {
+    pfprintf(PSTDERR, L("PStackTraceGetDepth"), ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  /* Remove PLogMessage() from depth */
+  --depth;
+  if (GlogLevel < depth)
+    return ESR_SUCCESS;
+#endif
+    
+  va_start(args, msg);
+  rc = logIt(msg, args, ESR_FALSE);
+  va_end(args);
+  return rc;
+#if USE_STACKTRACE
+CLEANUP:
+  return rc;
+#endif
+}
+
+
+/**
+ * Unconditionally logs an error message.
+ *
+ * @param msg The message format specification (ala printf).
+ * @return ESR_SUCCESS if success, anything else if an error occurs.
+ */
+ESR_ReturnCode PLogError(const char* msg, ...)
+{
+  va_list args;
+  ESR_ReturnCode rc;
+#if defined (ANDROID)
+#if defined (HAVE_ANDROID_OS)
+  char log_text [2048];
+#endif
+#endif
+
+  va_start(args, msg);
+#if defined (ANDROID)
+#if defined (HAVE_ANDROID_OS)
+  pvsprintf ( log_text, msg, args);
+/* We need to disable some error messages because they are frequently not
+ * errors but due to sloppy use of some functions. This prevents us from
+ * getting flooded with bad error messages. SteveR
+ */
+  if ( ( strncmp ( log_text, FILTER_MSG_1, FILTER_MSG_1_SIZE ) != 0 ) &&
+    ( strncmp ( log_text, FILTER_MSG_2, FILTER_MSG_2_SIZE ) != 0 ) )
+  {
+    LOGE ( log_text );
+  }
+  rc = 0;
+#else
+  rc = logIt(msg, args, ESR_TRUE);
+#endif
+#else
+  rc = logIt(msg, args, ESR_TRUE);
+#endif
+  va_end(args);
+  
+  return rc;
+}
+
+
+
+ESR_ReturnCode PLogCreateFileLogger(PFile* file, PLogger **logger)
+{
+  if (logger == NULL || file == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  return createPFileLogger(file, logger);
+}
+
+/**
+ * Creates a logger that logs to a circular file.
+ *
+ * @param filename The name of the file to be created.
+ * @param maxsize The maximum number of bytes that the file may have.
+ * @param logger logger handle receiving the created logger.
+ */
+ESR_ReturnCode PLogCreateCircularFileLogger(const LCHAR *filename,
+    unsigned int maxsize,
+    PLogger **logger)
+{
+  return ESR_NOT_SUPPORTED;
+}
+
+
+ESR_ReturnCode PLogSetFormat(LOG_OUTPUT_FORMAT format)
+{
+  GlogFormat = format;
+  return ESR_SUCCESS;
+}
diff --git a/portable/src/pmalloc.c b/portable/src/pmalloc.c
new file mode 100644
index 0000000..eaf8007
--- /dev/null
+++ b/portable/src/pmalloc.c
@@ -0,0 +1,610 @@
+/*---------------------------------------------------------------------------*
+ *  pmalloc.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+/* this source file is only used when PORTABLE_DINKUM_MEM_MGR is defined
+ */
+#ifdef PORTABLE_DINKUM_MEM_MGR
+
+#include <stdlib.h>
+#include <string.h> /* for memset */
+#include "pmalloc.h"
+#include "passert.h"
+#include "ptypes.h"
+#include "plog.h"
+
+#undef malloc
+#undef calloc
+#undef realloc
+#undef free
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  /*
+   * There are two controlling options within this scheme:
+   *
+   * STATIC_MEMORY_POOL: When defined, there is a static array from which memory is
+   * allocated.  The size of this array is defined at compile time.  When undefined
+   * (the default), the memory is allocated via malloc().  This code works under PSOS and
+   * PSOSIM, but has not been tested anywhere else (4March02).
+   * VOYAGER_KERNEL_MEMORY: When defined for the Voyager platform, it is similar to the
+   * non-static memory pool, but the memory buffer is pre-defined, and is simply pointed
+   * at by the pmalloc initializer.
+   * RTXC_PARTITION_MEMORY: When defined for the RTXC operating system, uses a static kernel
+   * partition resource for the memory chunk.
+   * VOYAGER_KERNEL_MEMORY and RTXC_PARTITION_MEMORY are mutually exclusive and take precedence
+   * over STATIC_MEMORY.
+   *
+  
+   * the standard off-the-shelf Dinkumware software is pretty slow, primarily due to
+   * scanning the free-memory linked list in PortFree(). If SPEEDUP is defined, then
+   * split the memory pool into imaginary 'bins', and keep track of the first free list
+   * entry in each bin. Then the linked list lookup can be MUCH faster, as you can
+   * start very close to the final destination in the linked list.
+   *
+   * (If SPEEDUP_COMPARE is defined, then run BOTH the standard technique and the
+   * speedup technique and compare the results.)
+   */
+  
+  /* malloc function */
+  _STD_BEGIN
+  
+  /* data *******************************************************************************/
+  
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+  /* Verify that memory pool actually was created, because of the lack of structure, this is accessed externally */
+  ESR_ReturnCode memory_pool_creation_status = ESR_FATAL_ERROR;
+#endif
+  
+  /* static data */
+  _Altab  _Aldata  = {0}; /* heap initially empty */
+  psize_t  _Size_block = {SIZE_BLOCK}; /* preferred _Getmem chunk */
+  
+  /* Memory pool size */
+#define MEM_SIZE_MB( mbytes )   ((mbytes) * 1024 * 1024 )
+  
+#ifndef MEM_SIZE
+  /* If not defined on the command line, use default values. */
+#define MEM_SIZE    MEM_SIZE_MB( 5 )
+#endif
+  
+  /* Memory pool initialized */
+  static int pmallocInitted = FALSE;  /* TRUE once initialized */
+  
+#ifdef STATIC_MEMORY_POOL
+  /* The memory pool can either be statically allocated or require a one-time system malloc.
+   * For VTB, the system was taking 2 seconds to zero the static memBuffer[] array at
+   * boot time, since it's in the BSS segment. Therefore, for VTB, it is better to allocate
+   * at run time.
+   */
+  static char memBuffer[MEM_SIZE];
+#else
+  static char *memBuffer;
+#endif
+  
+  static psize_t memSize = MEM_SIZE;
+  
+  /* Memory pool free list */
+  /* partition memory range into 'bins', and keep track of the first
+   * free list entry in each bin. This is to speed up the linked-list search
+   * that takes place when memory is freed.
+   */
+#define BIN_BITS         14   /* smaller number ==> more bins */
+#define BIN_SIZE      16384   /* 2 ^ BIN_BITS */
+  
+#define __NUM_MEM_BINS(memPoolSize)  (((memPoolSize)/BIN_SIZE) + 5) /* 5 = extra for roundoff */
+#define GET_MEM_BIN( _ptr_ )   (int)(((unsigned int)_ptr_ - (unsigned int)&memBuffer[0]) >> BIN_BITS)
+  
+#define NUM_MEM_BINS  __NUM_MEM_BINS(MEM_SIZE)
+static _Cell				*binsFirstFreeCell[NUM_MEM_BINS+1] = {0};
+  static psize_t    numMemBins;
+  
+  /* Memory Pool sbrk/getmem variables */
+  
+  static char *__heap_ptr = NULL;
+  static char *__heap_end = NULL;
+  static int  maxMemUsed = 0;
+  
+  /* Memory Pool initialization and _GetMem functions ************************************/
+  
+#if _USE_EXISTING_SYSTEM_NAMES
+#define _Sbrk sbrk
+#endif
+  
+  _STD_BEGIN
+  
+  void *_Sbrk(int incr)
+  {
+    char *ret;
+    
+    /* Subtract 1 from __heap_ptr so that the left hand side of the comparison evaluates to the address of the
+       last address of the requested memory block */
+    if ((__heap_ptr + incr - 1) > __heap_end) return(void *) - 1;
+    
+    ret = __heap_ptr;
+    __heap_ptr += incr;
+    maxMemUsed += incr;
+    return (void *)ret;
+  }
+  
+  void *_Getmem(psize_t size)
+  { /* allocate raw storage */
+    void *p;
+    int isize = size;
+    
+    return (isize <= 0 || (p = _Sbrk(isize)) == (void *) - 1
+            ? 0 : p);
+  }
+  _STD_END
+  
+  /* PortMallocInit() : initialize memory pool. There is no initialization needed for
+   * a static memory pool. Otherwise, perform a one-time malloc from the OS.
+   */
+  void PortMallocInit(void)
+  {
+#if defined STATIC_MEMORY_POOL
+    memSize = MEM_SIZE;
+#else
+    /* TODO: is malloc of binsFirstFreeCell safe under PSOS in all conditions ? */
+    memBuffer    = (char *)malloc(memSize);
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+    if (memBuffer != NULL) /* For external access, check comment at top */
+      memory_pool_creation_status = ESR_SUCCESS;
+#endif
+    numMemBins    = __NUM_MEM_BINS(memSize);
+#endif /* #ifdef VOYAGER_KERNEL_MEMORY */
+    
+    passert(memBuffer != NULL);
+    passert(binsFirstFreeCell != NULL);
+    
+    __heap_ptr = &memBuffer[0];
+    __heap_end = &memBuffer[memSize-1];
+    
+    /* set initted flag so we only do this once */
+    pmallocInitted = TRUE;
+    maxMemUsed = 0;
+    
+    memset(&_Aldata, 0, sizeof(_Altab));
+    
+    memset(binsFirstFreeCell, 0, sizeof(_Cell*)*(NUM_MEM_BINS + 1));
+  }
+  
+  void PortMallocTerm(void)
+  {
+#ifndef STATIC_MEMORY_POOL
+    memSize = 0;
+    free(memBuffer);
+    memBuffer = NULL;
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+    memory_pool_creation_status = ESR_FATAL_ERROR; /* For external access, check comment at top */
+#endif
+#endif
+    pmallocInitted = FALSE;
+  }
+  
+  /* PortGetMaxMemUsed() : return the maximum real memory allocated.
+   * There is another function of the same name in pmemory.cpp, for tracking
+   * psos block memory. It uses #ifdef MEM_PSOS_BLOCK_SCHEME to enable.
+   */
+  int PortMallocGetMaxMemUsed(void)
+  {
+    return maxMemUsed;
+  }
+  
+  /* PortMallocSetPoolSize( psize_t size ) : define size of memory pool.
+   */
+  void PortMallocSetPoolSize(psize_t size)
+  {
+#if !defined(STATIC_MEMORY_POOL) && !defined(VOYAGER_KERNEL_MEMORY) && !defined(RTXC_PARTITION_MEMORY)
+    if (!pmallocInitted)
+    {
+      memSize = size;
+    }
+#else
+    (void)size;
+#endif
+  }
+  
+  /* PortMallocGetPoolSize() : return size of memory pool.
+   */
+  psize_t PortMallocGetPoolSize(void)
+  {
+#if defined STATIC_MEMORY_POOL
+    return MEM_SIZE;
+#else
+    return memSize;
+#endif
+  }
+  
+  /* debug *******************************************************************************/
+  
+  /* xalloc.h internal header - debugging components */
+#if DEBUG
+  
+  int _OK_Cell(_Cell *p)
+  {
+    passert(SIZE_CELL <= p->_Size);
+    return 1;
+  }
+  
+  typedef struct _DB_Altab
+  {
+    psize_t total_heap;
+    psize_t total_alloc;
+    psize_t total_free;
+  }
+  _DB_Altab;
+  
+  _DB_Altab _DB_Altab_object = {0};
+  
+  void _UPD_Altab(psize_t d_heap, psize_t d_alloc, psize_t d_free)
+  {
+    _DB_Altab *pd = &_DB_Altab_object;
+    pd->total_heap += d_heap;
+    pd->total_alloc += d_alloc;
+    pd->total_free += d_free;
+  }
+  
+  int _OK_Altab(_Altab *p)
+  {
+    _DB_Altab *pd = &_DB_Altab_object;
+    _Cell *q;
+    psize_t total_free = 0;
+    if (p->_Head == 0)
+      return 1;
+    for (q = p->_Head; q != 0; q = q->_Next)
+    {
+      total_free += q->_Size;
+      _OK_Cell(q);
+      if (q->_Next != 0)
+      {
+        passert(_PTR_NORM((char *)q + q->_Size) <=
+                _PTR_NORM((char *)q->_Next));
+        passert(_PTR_NORM(q) < _PTR_NORM(q->_Next));
+      }
+    }
+    passert(pd->total_heap == pd->total_alloc + pd->total_free);
+    passert(total_free == pd->total_free);
+    return 1;
+  }
+#endif /* DEBUG */
+  
+  /* allocation functions ***************************************************************/
+  
+  static _Cell **findmem(psize_t size)
+  { /* find storage */
+    _Cell *q, **qb;
+    
+    for (; ;)
+    { /* check freed space first */
+      if ((qb = _Aldata._Plast) == 0)
+      { /* take it from the top */
+        for (qb = &_Aldata._Head; *qb != 0;
+             qb = &(*qb)->_Next)
+          if (size <= (*qb)->_Size)
+            return (qb);
+      }
+      else
+      { /* resume where we left off */
+        for (; *qb != 0; qb = &(*qb)->_Next)
+          if (size <= (*qb)->_Size)
+            return (qb);
+        q = *_Aldata._Plast;
+        for (qb = &_Aldata._Head; *qb != q;
+             qb = &(*qb)->_Next)
+          if (size <= (*qb)->_Size)
+            return (qb);
+      }
+      { /* try to buy more space */
+        psize_t bs;
+        
+        for (bs = _Size_block; ; bs >>= 1)
+        { /* try larger blocks first */
+          if (bs < size)
+            bs = size;
+          if ((q = (_Cell *)_Getmem(bs)) != 0)
+            break;
+          else if (bs == size)
+            return (0); /* no storage */
+        }
+        /* got storage: add to heap and retry */
+        q->_Size = bs;
+        _UPD_Altab(q->_Size, q->_Size, 0); /* heap=alloc+free */
+        PortFree((char *)q + CELL_OFF);
+      }
+    }
+  }
+  
+  
+  void *(PortMalloc)(psize_t size_arg)
+  { /* allocate a data object on the heap */
+    _Cell *q, **qb;
+#ifdef SPEEDUP
+    int qbsBin;
+    int qbNextBin;
+#endif /* SPEEDUP */
+    psize_t size;
+    
+    passert(pmallocInitted);
+    
+    size = (size_arg + (CELL_OFF + M_MASK)) & ~M_MASK;
+    
+    _OK_Altab(&_Aldata);
+    if (size <= size_arg)
+      return (0); /* size_arg too large */
+    if (size < SIZE_CELL) /* round up size */
+      size = SIZE_CELL;
+    if ((qb = findmem(size)) == 0)
+      return (0);
+    q = *qb;
+    if (q->_Size - SIZE_CELL < size)
+    {
+      /* use entire cell (there's not enough space to carve out a new cell from this one) */
+#ifdef SPEEDUP
+      /* remove *qb cell from free list.
+       * careful : the Next pointer may be in a different bin.
+       */
+      qbsBin = GET_MEM_BIN(*qb);
+      
+      /* Check whether the cell is at the end of the 'free' linked-list */
+      if (0 != ((*qb)->_Next))
+      {
+        /* The cell is not at the end of the free linked-list; find out which bin the next free cell is in */
+        qbNextBin = GET_MEM_BIN((*qb)->_Next);
+        
+        if (qbsBin == qbNextBin)
+        {
+          if (binsFirstFreeCell[qbsBin] == *qb)
+          {
+            /* The allocated cell was the first free cell in the bin; update the first free cell
+               pointer to point to the next free cell */
+            binsFirstFreeCell[qbsBin] = (*qb)->_Next;
+          }
+        }
+        else
+        {
+          if (binsFirstFreeCell[qbsBin] == *qb)
+          {
+            /* The allocated cell was the only free cell in the bin; update the first free cell
+               pointer to point to NULL */
+            
+            binsFirstFreeCell[qbsBin] = 0;
+          }
+        }
+      }
+      else
+      {
+        /* Cell is at the end of the 'free' linked-list */
+        if (binsFirstFreeCell[qbsBin] == *qb)
+        {
+          /* The allocated cell was the first free cell in the bin; there are no following free cells
+             so set the first free cell pointer to NULL */
+          binsFirstFreeCell[qbsBin] = 0;
+        }
+      }
+#endif /* SPEEDUP */
+      *qb = q->_Next;
+    }
+    else
+    { /* peel off a residual cell */
+      *qb = (_Cell *)((char *)q + size);
+      (*qb)->_Next = q->_Next;
+      (*qb)->_Size = q->_Size - size;
+      q->_Size = size;
+#ifdef SPEEDUP
+      /* remove q from free list, and add *qb to free list.
+       * Do this as two separate steps because they may be in 2 different bins.
+       */
+      /* remove q from free list */
+      if (binsFirstFreeCell[GET_MEM_BIN(q)] == q)
+        binsFirstFreeCell[GET_MEM_BIN(q)] = 0;
+      /* now add *qb to its bin's free list if it's the first */
+      qbsBin = GET_MEM_BIN(*qb);
+      if ((binsFirstFreeCell[qbsBin] == 0) || (*qb < binsFirstFreeCell[qbsBin]))
+        binsFirstFreeCell[qbsBin] = *qb;
+#endif /* SPEEDUP */
+    }
+    _Aldata._Plast = qb; /* resume scan here */
+    _UPD_Altab(0, q->_Size, -q->_Size); /* heap=alloc+free */
+    _OK_Altab(&_Aldata);
+    return ((char *)q + CELL_OFF);
+  }
+  _STD_END
+  
+  
+  /* free function */
+  _STD_BEGIN
+  
+  void(PortFree)(void *ptr)
+  { /* free an allocated data object */
+    register _Cell *q;
+    register psize_t size;
+#ifdef SPEEDUP
+    int binNum;
+    int binIndex;
+    int qNextBin;
+    int qNextNextBin;
+#endif /* SPEEDUP */
+    static int portFreeCount = 0;
+    portFreeCount++;
+    
+    passert(pmallocInitted);
+    
+    _OK_Altab(&_Aldata);
+    if (ptr == 0)
+      return;
+    q = (_Cell *)((char *)ptr - CELL_OFF);
+    size = q->_Size;
+#ifdef SPEEDUP
+    binNum = GET_MEM_BIN(q);
+#endif /* SPEEDUP */
+    if (size < SIZE_CELL || (size & M_MASK) != 0)
+      return; /* erroneous call, bad count */
+    if (_Aldata._Head == 0
+        || _PTR_NORM(q) < _PTR_NORM(_Aldata._Head))
+    { /* insert at head of list */
+      q->_Next = _Aldata._Head;
+      _Aldata._Head = q;
+#ifdef SPEEDUP
+      /* always the start of a bin */
+      binsFirstFreeCell[binNum] = q;
+#endif /* SPEEDUP */
+    }
+    else
+    { /* scan for insertion point */
+      register _Cell *qp = _Aldata._Head;
+      register char *qpp;
+      register _Cell *nextCell;
+#if !defined SPEEDUP || defined SPEEDUP_COMPARE
+      _Cell *savedQp;
+      
+      /* this search loop is where all the time is spent */
+      while ((nextCell = qp->_Next) != 0
+             && _PTR_NORM(nextCell) < _PTR_NORM(q))
+        qp = qp->_Next;
+      savedQp = qp;
+#endif /* SPEEDUP */
+      
+#ifdef SPEEDUP
+      /* this is where the SPEEDUP code is sped up : start with the bin's first free cell */
+      _Cell *firstFreeInBin = binsFirstFreeCell[binNum];
+      if ((firstFreeInBin != 0) && (q > firstFreeInBin))
+      {
+        qp = firstFreeInBin;
+        while ((nextCell = qp->_Next) != 0
+               && _PTR_NORM(nextCell) < _PTR_NORM(q))
+        {
+          qp = qp->_Next;
+        }
+      }
+      else
+      {
+        /* go back to the previous non-zero bin */
+        qp = NULL;  /* for diagnostics */
+        for (binIndex = binNum; binIndex >= 0; binIndex--)
+        {
+          if ((binsFirstFreeCell[binIndex] != 0) && (q > binsFirstFreeCell[binIndex]))
+          {
+            qp = binsFirstFreeCell[binIndex];
+            break;
+          }
+        }
+        /* this code for diagnostic purposes to see how often it happens. otherwise,
+         * qp could have been set to _Aldata._Head prior to the binIndex loop above.
+         */
+        if (qp == NULL)
+        {
+          qp = _Aldata._Head;
+        }
+        
+        /* find the free cell location */
+        while ((nextCell = qp->_Next) != 0
+               && _PTR_NORM(nextCell) < _PTR_NORM(q))
+          qp = qp->_Next;
+      }
+      
+#ifdef SPEEDUP_COMPARE
+      if (qp != savedQp)
+        printf("oops \n");
+#endif /* SPEEDUP_COMPARE */
+#endif /* SPEEDUP */
+        
+#if !defined SPEEDUP || defined SPEEDUP_COMPARE
+      qp = savedQp;
+#endif /* SPEEDUP */
+      
+      qpp = (char *)qp + qp->_Size;
+      if (_PTR_NORM((char *)q) < _PTR_NORM(qpp))
+        return; /* erroneous call, overlaps qp */
+      else if (_PTR_NORM(qpp) == _PTR_NORM((char *)q))
+      { /* merge qp and q (merge with prior cell) */
+        /* nothing to do to bin's free list here */
+        qp->_Size += q->_Size;
+        q = qp;
+      }
+      else if (qp->_Next != 0 && _PTR_NORM((char *)qp->_Next)
+               < _PTR_NORM((char *)q + q->_Size))
+        return; /* erroneous call, overlaps qp->_Next */
+      else
+      { /* splice q after qp */
+#ifdef SPEEDUP
+        /* add 1 entry here - this could change first entry in q's bin */
+        _Cell *firstFree = binsFirstFreeCell[binNum];
+        if ((firstFree == 0) || (q < firstFree))
+          binsFirstFreeCell[binNum] = q;
+#endif /* SPEEDUP */
+        q->_Next = qp->_Next;
+        qp->_Next = q;
+      }
+    }
+    if (q->_Next != 0 && _PTR_NORM((char *)q + q->_Size)
+        == _PTR_NORM((char *)q->_Next))
+    { /* merge q and q->_Next (merge with latter cell) */
+#ifdef SPEEDUP
+      /* lose 1 cell here - this could change first entry in bin.
+       * if q->_Next was first in bin, now it's its Next.
+       * careful : watch for next being in a different bin.
+       */
+      qNextBin = GET_MEM_BIN(q->_Next);
+      
+      if (binsFirstFreeCell[qNextBin] == q->_Next)
+      {
+        /* The q->_Next cell is the first free cell in its bin; set the first free cell
+           pointer to NULL for now; if there is another free cell in the same bin then
+           the first free cell pointer will be updated in next 'if' code block */
+        binsFirstFreeCell[qNextBin] = 0;
+        
+        /* If there is another free cell after q->_Next and it's in the same bin then
+           update the first free cell pointer if necessary */
+        if (0 != (q->_Next->_Next))
+        {
+          qNextNextBin = GET_MEM_BIN(q->_Next->_Next);
+          
+          /* The first free cell pointer for q->_Next->_Next's bin can only be set to 0
+             by the code above; if it is 0 then q->_Next->_Next must be the first free
+             cell in the bin */
+          if (0 == binsFirstFreeCell[qNextNextBin])
+          {
+            binsFirstFreeCell[qNextNextBin] = q->_Next->_Next;
+          }
+        }
+      }
+#endif /* SPEEDUP */
+      _Aldata._Plast = 0; /* deoptimize for safety */
+      q->_Size += q->_Next->_Size;
+      q->_Next = q->_Next->_Next;
+    }
+    _UPD_Altab(0, -size, size); /* heap=alloc+free */
+    _OK_Altab(&_Aldata);
+    /* every successful free "falls off" here */
+  }
+  _STD_END
+  
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+#endif /* PORTABLE_DINKUM_MEM_MGR */
+
+
diff --git a/portable/src/pmemblock.c b/portable/src/pmemblock.c
new file mode 100644
index 0000000..5f3277d
--- /dev/null
+++ b/portable/src/pmemblock.c
@@ -0,0 +1,544 @@
+/*---------------------------------------------------------------------------*
+ *  pmemblock.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "pmemory.h"
+#include "ptypes.h"
+
+#if PORTABLE_MEM_MGR == PORTABLE_PSOS_BLOCK_SCHEME_MEM_MGR
+
+#ifdef PSOSIM
+#define PSOS
+#endif
+
+#ifdef PSOS
+#include <stdlib.h>
+#include <psos.h>
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  /* Data *****************************************************************/
+  
+#define NUM_POOL_BINS 32
+#define NUM_POOL_SLOTS  8
+  
+  typedef struct memory_pools
+  {
+    uint32   currentNumberOfPools;
+    
+    struct pool_info
+    {
+      unsigned long poolId;
+      void*   pMemory;
+      unsigned long size;
+    }
+    poolInfo[NUM_POOL_SLOTS];
+    
+  }
+  MEMORY_POOL;
+  
+  static MEMORY_POOL memoryPool[NUM_POOL_BINS];
+  
+#define NUM_TRACKING_BINS NUM_POOL_BINS
+  
+  /* Object tracking variables */
+  static struct tracking_struct
+  {
+    uint32 sCurrentAllocationSize;
+    uint32 sMaximumAllocationSize;
+    uint32 sTotalAllocationSize;
+    
+    uint32  sCurrentAllocRealSize;
+    uint32  sMaximumAllocRealSize;
+    uint32  sTotalAllocRealSize;
+    
+    uint32 sCurrentAllocationNumber;
+    uint32 sMaximumAllocationNumber;
+    uint32 sTotalAllocationNumber;
+    
+    uint32 sCurrentAllocationNumberArray[NUM_TRACKING_BINS];
+    uint32 sMaximumAllocationNumberArray[NUM_TRACKING_BINS];
+    uint32 sTotalAllocationNumberArray[NUM_TRACKING_BINS];
+    
+    uint32 sCurrentAllocationSizeArray[NUM_TRACKING_BINS];
+    uint32 sMaximumAllocationSizeArray[NUM_TRACKING_BINS];
+    uint32 sTotalAllocationSizeArray[NUM_TRACKING_BINS];
+  }
+  gMemoryTracking;
+  
+  
+  /* Functions *********************************************************/
+  
+  static uint32 findBin(size_t size)
+  {
+    int i, bin;
+    for (i = 0, bin = 1; i < NUM_TRACKING_BINS; i++, bin <<= 1)
+    {
+      if ((int)size <= bin)
+        return i;
+    }
+    
+    return 0;
+  }
+  
+  
+  static void MemoryTrackingInit(void)
+  {
+    int i;
+    /* Initialization of object tracking variables */
+    gMemoryTracking.sCurrentAllocationSize = 0;
+    gMemoryTracking.sMaximumAllocationSize = 0;
+    gMemoryTracking.sTotalAllocationSize = 0;
+    
+    gMemoryTracking.sCurrentAllocationNumber = 0;
+    gMemoryTracking.sMaximumAllocationNumber = 0;
+    gMemoryTracking.sTotalAllocationNumber = 0;
+    
+    gMemoryTracking.sCurrentAllocRealSize = 0;
+    gMemoryTracking.sMaximumAllocRealSize = 0;
+    gMemoryTracking.sTotalAllocRealSize = 0;
+    
+    for (i = 0; i < NUM_TRACKING_BINS; i++)
+    {
+      gMemoryTracking.sCurrentAllocationNumberArray[i] = 0;
+      gMemoryTracking.sMaximumAllocationNumberArray[i] = 0;
+      gMemoryTracking.sTotalAllocationNumberArray[i] = 0;
+      
+      gMemoryTracking.sCurrentAllocationSizeArray[i] = 0;
+      gMemoryTracking.sMaximumAllocationSizeArray[i] = 0;
+      gMemoryTracking.sTotalAllocationSizeArray[i] = 0;
+    }
+  }
+  
+  
+  static void MemoryTrackingAdd(size_t size)
+  {
+    /* Memory tracking code */
+    uint32 bin = findBin(size);
+    uint32 binsize = 1 << bin;
+    uint32 dummy;
+    
+    /* for breakpoint setting */
+#ifdef PSOSIM
+    if (bin == 0)
+      dummy = 0;
+    if (bin == 1)
+      dummy = 0;
+    if (bin == 2)
+      dummy = 0;
+    if (bin == 3)
+      dummy = 0;
+    if (bin == 4)
+      dummy = 0;
+    if (bin == 5)
+      dummy = 0;
+    if (bin == 6)
+      dummy = 0;
+    if (bin == 7)
+      dummy = 0;
+    if (bin == 8)
+      dummy = 0;
+    if (bin == 9)
+      dummy = 0;
+    if (bin == 10)
+      dummy = 0;
+    if (bin == 11)
+      dummy = 0;
+    if (bin == 12)
+      dummy = 0;
+    if (bin == 13)
+      dummy = 0;
+    if (bin == 14)
+      dummy = 0;
+    if (bin == 15)
+      dummy = 0;
+    if (bin == 16)
+      dummy = 0;
+    if (bin == 17)
+      dummy = 0;
+    if (bin == 18)
+      dummy = 0;
+    if (bin == 19)
+      dummy = 0;
+    if (bin == 20)
+      dummy = 0;
+    if (bin == 21)
+      dummy = 0;
+    if (bin >  21)
+      dummy = 0;
+#endif /* PSOSIM */
+      
+    gMemoryTracking.sCurrentAllocationSize += size;
+    gMemoryTracking.sTotalAllocationSize += size;
+    if (gMemoryTracking.sCurrentAllocationSize > gMemoryTracking.sMaximumAllocationSize)
+      gMemoryTracking.sMaximumAllocationSize = gMemoryTracking.sCurrentAllocationSize;
+      
+    gMemoryTracking.sCurrentAllocRealSize += binsize;
+    gMemoryTracking.sTotalAllocRealSize += binsize;
+    if (gMemoryTracking.sCurrentAllocRealSize > gMemoryTracking.sMaximumAllocRealSize)
+      gMemoryTracking.sMaximumAllocRealSize = gMemoryTracking.sCurrentAllocRealSize;
+      
+    gMemoryTracking.sCurrentAllocationNumber++;
+    gMemoryTracking.sTotalAllocationNumber++;
+    if (gMemoryTracking.sCurrentAllocationNumber > gMemoryTracking.sMaximumAllocationNumber)
+      gMemoryTracking.sMaximumAllocationNumber = gMemoryTracking.sCurrentAllocationNumber;
+      
+    gMemoryTracking.sCurrentAllocationSizeArray[bin] += size;
+    gMemoryTracking.sTotalAllocationSizeArray[bin] += size;
+    if (gMemoryTracking.sCurrentAllocationSizeArray[bin] > gMemoryTracking.sMaximumAllocationSizeArray[bin])
+      gMemoryTracking.sMaximumAllocationSizeArray[bin] = gMemoryTracking.sCurrentAllocationSizeArray[bin];
+      
+    gMemoryTracking.sCurrentAllocationNumberArray[bin]++;
+    gMemoryTracking.sTotalAllocationNumberArray[bin]++;
+    if (gMemoryTracking.sCurrentAllocationNumberArray[bin] > gMemoryTracking.sMaximumAllocationNumberArray[bin])
+      gMemoryTracking.sMaximumAllocationNumberArray[bin] = gMemoryTracking.sCurrentAllocationNumberArray[bin];
+  }
+  
+  
+  static void MemoryTrackingDelete(unsigned long size)
+  {
+    /* Memory tracking code */
+    uint32 bin = findBin(size);
+    uint32 binsize = 1 << bin;
+    
+    gMemoryTracking.sCurrentAllocationSize -= size;
+    gMemoryTracking.sCurrentAllocationNumber--;
+    
+    gMemoryTracking.sCurrentAllocationSizeArray[bin] -= size;
+    gMemoryTracking.sCurrentAllocationNumberArray[bin]--;
+    
+    gMemoryTracking.sCurrentAllocRealSize -= binsize;
+  }
+  
+  
+  static void InitPools(void)
+  {
+    int i, j;
+    for (i = 0; i < NUM_POOL_BINS; i++)
+    {
+      memoryPool[i].currentNumberOfPools = 0;
+      
+      for (j = 0; j < NUM_POOL_SLOTS; j++)
+      {
+        memoryPool[i].poolInfo[j].poolId = 0;
+        memoryPool[i].poolInfo[j].pMemory = NULL;
+        memoryPool[i].poolInfo[j].size = 0;
+      }
+    }
+  }
+  
+  
+  static void TermPools(void)
+  {
+    int i, j;
+    /* For some reason, deleting the region then freeing the memory causes a failure */
+    /* TODO: Figure out why??? */
+    for (i = 1; i < NUM_POOL_BINS; i++)
+    {
+      for (j = 0; j < (int)memoryPool[i].currentNumberOfPools; j++)
+      {
+        if (memoryPool[i].poolInfo[j].pMemory != NULL)
+        {
+          unsigned long retval = pt_delete(memoryPool[i].poolInfo[j].poolId);
+          PORT_ASSERT(retval == 0);
+          
+          PORT_ASSERT_GOOD_WRITE_POINTER(memoryPool[i].poolInfo[j].pMemory);
+          free(memoryPool[i].poolInfo[j].pMemory);
+          
+          memoryPool[i].poolInfo[j].poolId = 0;
+          memoryPool[i].poolInfo[j].pMemory = NULL;
+          memoryPool[i].poolInfo[j].size = 0;
+        }
+      }
+      
+      memoryPool[i].currentNumberOfPools = 0;
+    }
+  }
+  
+  
+#define PARTITION_CONTROL_BLOCK_SIZE 0x400
+  
+  static BOOL CreatePool(uint32 whichPool, uint32 poolSize)
+  {
+    static uint32 poolNumber = 0;
+    
+    void*   pMemory = NULL;
+    unsigned long poolId, unused;
+    
+    uint32 currentNumberOfPools = memoryPool[whichPool].currentNumberOfPools;
+    
+    PORT_ASSERT((whichPool >= 0) && (whichPool < NUM_POOL_BINS));
+    
+    if (currentNumberOfPools == NUM_POOL_SLOTS)
+      return FALSE;
+      
+      
+    if (whichPool < 2)
+    {
+      /* Invalid partition size */
+      return FALSE;
+    }
+    else
+    {
+      char name[5];
+      unsigned long retval;
+      
+      pMemory = malloc(poolSize * (1 << whichPool) + PARTITION_CONTROL_BLOCK_SIZE);
+      PORT_ASSERT_GOOD_WRITE_POINTER(pMemory);
+      
+      /* No memory protection */
+      if (pMemory == NULL)
+      {
+        /* No memory left in system */
+        return FALSE;
+      }
+      
+      
+      sprintf(name, "DP%02d", poolNumber);
+      
+      retval = pt_create(name, pMemory, 0, poolSize * (1 << whichPool) + PARTITION_CONTROL_BLOCK_SIZE,
+                         1 << whichPool, PT_LOCAL | PT_DEL, &poolId, &unused);
+      if (retval != 0)
+      {
+        /* Unable to create a pSOS partition */
+        return FALSE;
+      }
+    }
+    
+    memoryPool[whichPool].poolInfo[currentNumberOfPools].poolId = poolId;
+    memoryPool[whichPool].poolInfo[currentNumberOfPools].pMemory = pMemory;
+    memoryPool[whichPool].poolInfo[currentNumberOfPools].size = poolSize;
+    memoryPool[whichPool].currentNumberOfPools++;
+    
+    poolNumber++;
+    
+    return TRUE;
+  }
+  
+  static BOOL AddPool(uint32 whichPool, uint32 poolSize)
+  {
+    if (memoryPool[whichPool].poolInfo[0].pMemory == NULL)
+      return FALSE;
+      
+    return CreatePool(whichPool, poolSize);
+  }
+  
+  static void* AllocateFromPsos(uint32 whichPool, uint32 poolIndex, uint32 size)
+  {
+    uint32 retval;
+    void* pMemory;
+    
+    PORT_ASSERT(memoryPool[whichPool].poolInfo[poolIndex].poolId);
+    
+    retval = pt_getbuf(memoryPool[whichPool].poolInfo[poolIndex].poolId, &pMemory);
+    
+    /* If we got memory, then return */
+    if (retval == 0)
+    {
+      PORT_ASSERT_GOOD_WRITE_POINTER(pMemory);
+      *((unsigned long *)pMemory) = (whichPool << 27) + (poolIndex << 24) + size;
+      return (unsigned long *)pMemory + 1;
+    }
+    else
+      return NULL;
+  }
+  
+  static void* SearchPoolsForMemory(uint32 whichPool, uint32 size)
+  {
+    void*   pMemory;
+    uint32    poolIndex;
+    /* Get memory from main region */
+    if (whichPool == 0)
+    {
+      pMemory = malloc(size);
+      
+      /* No memory protection */
+      if (pMemory == NULL)
+      {
+        /* No memory left in system */
+        return NULL;
+      }
+      
+      PORT_ASSERT_GOOD_WRITE_POINTER(pMemory);
+      *((unsigned long *)pMemory) = (whichPool << 27) + size;
+      return (unsigned long *)pMemory + 1;
+    }
+    
+    /* Allocate memory from the first available bin (partition) */
+    for (poolIndex = 0; poolIndex < memoryPool[whichPool].currentNumberOfPools; poolIndex++)
+    {
+      pMemory = AllocateFromPsos(whichPool, poolIndex, size);
+      if (pMemory != NULL)
+        return pMemory;
+    }
+    
+    /* Made it here because we ran out of memory in the pool, so try to add more pools */
+    if (AddPool(whichPool, memoryPool[whichPool].poolInfo[0].size >> 1) == FALSE)
+    {
+      /* All pools of this size have been consumed */
+      return NULL;
+    }
+    
+    /* Allocate memory from newly created pool */
+    pMemory = AllocateFromPsos(whichPool, memoryPool[whichPool].currentNumberOfPools - 1, size);
+    if (pMemory != NULL)
+      return pMemory;
+      
+    /* If we can't allocate from the newly created pool, then we have problems */
+    /* No memory protection */
+    
+    /* No memory left in system */
+    return NULL;
+  }
+  
+  void* PortMemBlockAllocateFromPool(uint32 size)
+  {
+    void*   pMemory = NULL;
+    int    poolIndex;
+    BOOL foundPool = FALSE;
+    uint32 whichPool;
+    
+    PORT_ASSERT((size & 0xff000000) == 0);
+    
+    size += 4;
+    whichPool = findBin(size); /* Add 4 so I can store info with data */
+    MemoryTrackingAdd(size);
+    
+    /* If pool exists for the size needed, then use it, else find next largest pool */
+    for (poolIndex = whichPool; poolIndex < 32; poolIndex++)
+      if (memoryPool[poolIndex].poolInfo[0].pMemory != NULL)
+      {
+        foundPool = TRUE;
+        whichPool = poolIndex;
+        break;
+      }
+      
+    /* If next largest pool doesn't exist, then use pool 0 (regions) */
+    if (!foundPool)
+      whichPool = 0;
+      
+    /* Allocate memory from the first available bin */
+    pMemory = SearchPoolsForMemory(whichPool, size);
+    PORT_ASSERT_GOOD_WRITE_POINTER(pMemory);
+    return pMemory;
+  }
+  
+  void PortMemBlockDeleteFromPool(void* pMemory)
+  {
+    unsigned long *pRealMemory = (unsigned long *)pMemory - 1;
+    
+    uint32 whichPool = (*pRealMemory >> 27) & 0x0000001f;
+    uint32 whichBin = (*pRealMemory >> 24) & 0x00000007;
+    
+    PORT_ASSERT_GOOD_WRITE_POINTER(pMemory);
+    MemoryTrackingDelete(*pRealMemory & 0x00ffffff);
+    
+    
+    if (whichPool == 0)
+    {
+      free(pRealMemory);
+    }
+    else
+    {
+      uint32 retval = pt_retbuf(memoryPool[whichPool].poolInfo[whichBin].poolId, pRealMemory);
+      PORT_ASSERT(retval == 0);
+    }
+  }
+  
+  /* PortMemGetPoolSize() : return size of portable memory pool, or 0 if
+   * unknown.
+   */
+  int  PortMemBlockGetPoolSize(void)
+  {
+    return 0; /* TODO: Find size of pool: 4Mar02 */
+  }
+  
+  /* PortMemBlockSetPoolSize() : set size of portable memory pool on PSOS.
+   * This must be called before PortMemoryInit(), which is called by PortInit().
+   */
+  void PortMemBlockSetPoolSize(size_t sizeInBytes)
+  {}
+  
+  int  PortMemBlockInit(void)
+  {
+    InitPools();
+    CreatePool(findBin(1 <<  3),  3000);
+    CreatePool(findBin(1 <<  4), 10000);
+    CreatePool(findBin(1 <<  5),  8000);
+    CreatePool(findBin(1 <<  6), 16000);
+    CreatePool(findBin(1 <<  7),  5000);
+    CreatePool(findBin(1 <<  8),  1000);
+    CreatePool(findBin(1 <<  9),  2000);
+    CreatePool(findBin(1 << 10),    50);
+    CreatePool(findBin(1 << 11),    20);
+    CreatePool(findBin(1 << 12),    24);
+    CreatePool(findBin(1 << 13),    16);
+    CreatePool(findBin(1 << 14),    10);
+    CreatePool(findBin(1 << 15),    16);
+    CreatePool(findBin(1 << 16),     4);
+    CreatePool(findBin(1 << 18),     6);
+    
+    MemoryTrackingInit();
+  }
+  
+  void PortMemBlockTerm(void)
+  {
+    TermPools();
+  }
+  
+  void PortMemBlockTrackDump(void)
+  {
+    int i;
+    
+    printf("\nCurrent Memory Usage = %d\nMaximum Memory Usage = %d\nTotal Memory Allocation = %d\n\n",
+           gMemoryTracking.sCurrentAllocationSize, gMemoryTracking.sMaximumAllocationSize, gMemoryTracking.sTotalAllocationSize);
+           
+    printf("\nCurrent Real Memory Usage = %d\nMaximum Real Memory Usage = %d\nTotal Real Memory Allocation = %d\n\n",
+           gMemoryTracking.sCurrentAllocRealSize, gMemoryTracking.sMaximumAllocRealSize, gMemoryTracking.sTotalAllocRealSize);
+           
+    for (i = 0; i < NUM_TRACKING_BINS; i++)
+      printf("Max size of 2^%2d byte objects = %d\n", i, gMemoryTracking.sMaximumAllocationSizeArray[i]);
+      
+    printf("\nCurrent Memory Objects = %d\nMaximum Memory Objects = %d\nTotal Memory Objects = %d\n\n",
+           gMemoryTracking.sCurrentAllocationNumber, gMemoryTracking.sMaximumAllocationNumber, gMemoryTracking.sTotalAllocationNumber);
+           
+    for (i = 0; i < NUM_TRACKING_BINS; i++)
+      printf("Max number for 2^%2d byte objects = %d\n", i, gMemoryTracking.sMaximumAllocationNumberArray[i]);
+  }
+  
+  /* PortMemBlockGetMaxMemUsed() : return the maximum real memory allocated.
+   * There is another function of the same name in pmalloc.c, for tracking
+   * non-psos block memory.
+   */
+  int PortMemBlockGetMaxMemUsed(void)
+  {
+    return gMemoryTracking.sMaximumAllocRealSize;
+  }
+  
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTABLE_MEM_MGR == PORTABLE_PSOS_BLOCK_SCHEME_MEM_MGR */
+
diff --git a/portable/src/pmemfixed.c b/portable/src/pmemfixed.c
new file mode 100644
index 0000000..4d16ac1
--- /dev/null
+++ b/portable/src/pmemfixed.c
@@ -0,0 +1,705 @@
+/*---------------------------------------------------------------------------*
+ *  pmemfixed.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "pmemory.h"
+#include "plog.h"
+
+#undef malloc
+#undef calloc
+#undef realloc
+#undef free
+
+
+#ifdef PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME
+
+/*
+    How does the Fixed Size Memory Block Manager Work?
+    The memory manager manages an unlimited number of pools, each containing a linked list
+    of free memory blocks of a fixed size.  The memory pools are ordered in increasing block
+    size, eg. pool # 0 contains 4 byte memory blocks, pool # 1 contains 8, etc.  Each memory
+    block consists of a header and body.  The header (which is currently 8 bytes long) is used
+    to store the address of the next free memory block in the linked list, and to store the
+    memory block's pool ID (this is used by the free function to determine which pool the block
+    originated from).  The body is simply the usable memory.  Whenever the application requests
+    memory of a given size, the memory manager selects the appropriate memory pool which contain
+    blocks large enough to satisfy the request.  The memory manager removes a block from the
+    linked list and returns the address of the memory block body.  If there are no blocks
+    available in the pool, then more blocks are created (if there is memory available); the
+    number created is configurable.  If it is not possible to create more blocks, then the
+    memory manager searches the  remaining pools in the sequence until it finds a free block or
+    it runs out of pools (in this case it will return a null pointer to the calling code).
+
+    How is the memory space allocated to the fixed block pools?
+    At start-up the memory manager requests one large memory block from the system (the size is
+    defined by #define MEM_SIZE).  This memory is used to a) create the fixed size memory pools
+    (each contain the initial number defined in the code) and b) to create extra memory blocks
+    each time a particular pool has been exhausted (the number created is configurable for each
+    memory pool also).  Once all of this memory has been used up it is also possible to make
+    further requests to the system for more memory (to create more fixed memory blocks); this
+    feature is switched on using the compilation flag ALLOW_ADDITIONAL_SYS_MEM_ALLOCS.  Note
+    that once memory blocks have been added to a memory pool they cannot be removed and reused
+    in another, eg a 0.5 MByte memory block could not be removed from its 0.5 Mbyte pool in
+    order to create smaller 4 byte blocks in the 4byte block pool.
+
+    How is the large memory block from the system allocated?
+    It can be allocated in one of three ways depending on compile time definitions.  If you define
+    STATIC_MEMORY_POOL, it's allocated as a static array.  If you define RTXC_PARTITION_MEMORY,
+    it's allocated from the HEAP_MAP memory partition.  If you don't define anything, it's allocated
+    using the system malloc call.  Of course, RTXC_PARTITION should only be defined on when you building
+    for the RTXC operating system.
+
+    If STATIC_MEMORY_POOL or RTXC_PARTITION is defined, you cannot define ALLOW_ADDITIONAL_SYS_MEM_ALLOCS.
+
+    Key Points:
+    1. Configurable memory block sizes (not restricted to power of 2 sizes).
+    2. Best fit algorith.
+    3. Dynamically increases the pool sizes (from an initial number).
+    4. Can limit the total heap size.
+    5. Configurable initial pool sizes.
+    6. Allow additional system memory allocations in order to increase the pool sizes when the
+       'heap' limit has been reached.
+    7. Doesn't support block consolidation, and reuse across pools.
+
+*/
+
+/*************************** Header Files *************************************/
+
+#ifdef RTXC_PARTITION_MEMORY
+#include <rtxcapi.h>
+/* TODO - When rtxcgen is run, it will create this header file that should contain
+ * identifiers for various memory partitions that we will be using.  For now, in order
+ * to get a compile, define a partition identifier.
+ */
+#define HEAP_MAP 1
+
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+
+  /*************************** Macros Definitions *******************************/
+  /* All of these should be defined on the command line
+   * #define MEM_MGR_STATS
+   * #define ALLOW_ADDITIONAL_SYS_MEM_ALLOCS
+   * #define ALLOW_POOL_GROWTHS
+   * #define MEM_SIZE
+   */
+  
+  /*
+  #if (defined(STATIC_MEMORY_POOL) || defined(RTXC_PARTITION_MEMORY)) && defined(ALLOW_ADDITIONAL_SYS_MEM_ALLOCS)
+  #error Can't allocate additional memory blocks from the system.
+  #endif
+  */
+  /* TODO: Need to figure out a good size for this. */
+  /* This had better be the same as the block in HEAP_MAP as defined when building RTXC. */
+  
+#ifndef MEM_SIZE
+  /* If not defined on the command line, use a default value of 10 megabytes for the heap. */
+#define MEM_SIZE       (10 * 1024 * 1024)      /* 10 MBytes */
+#endif
+  
+#define MEM_BLOCK_HDR           8   /* (bytes): 16 bit Pool ID, 16 bit signature, 32 bit next block pointer */
+#define MEM_POOL_ID_OFFSET      0
+#define NEXT_BLOCK_PTR_OFFSET   1   /* (no. of 4 byte words) */
+#define MEM_BLOCK_HDR_OFFSET    2   /* (no. of 4 byte words) */
+  
+#define MEM_POOL_ID_MASK        0x000000FF
+#define MEM_REQ_SIZE_MASK       0xFFFFFF00
+#define MEM_REQ_SIZE_BIT_SHIFT  8
+  
+  
+  
+  /*************************** Type Defs ****************************************/
+  
+  typedef struct
+  {
+    unsigned int accReqSize;
+    unsigned int maxReqSize;
+    unsigned int allocated;
+    unsigned int accAllocated;
+    unsigned int accFreed;
+    unsigned int max_alloc;
+  }
+  MEM_STATS;
+  
+  
+  
+  /*************************** Global Variables *********************************/
+  
+  int memPoolsInitialised = 0;
+  
+  unsigned int memBlockSize[]    = {     4,    8,    12,    16,    20,    24,    28,    32,    36,    40,    44,    48,    52,    56,    60,    64,  128,   256,   512,  1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288 };
+  /*unsigned int memBlockNum[]     = {   400, 1600, 17000,  8192, 13440,   512,   384,  4352,   900,  7000,   256,  2048,  1024,   128,   128,   256, 6000,  2500,   380,   170,   85,   40,   30,   120,    40,     2,      1,      2,      2 };*/
+  unsigned int memBlockNum[]     = {     0,    0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,    0,     0,     0,     0,    0,    0,    0,     0,     0,     0,      0,      0,      0 };
+  unsigned int memBlkGrowthNum[] = {   128,  128,   128,   128,   128,   128,   128,   128,   128,   128,   128,   128,   128,   128,   128,   128,  128,   128,     1,     1,    1,    1,    1,     1,     1,     1,      1,      1,      1 };
+  
+#define NUM_OF_POOLS        (sizeof( memBlockSize ) / sizeof( unsigned int ))
+  
+  static unsigned int memBlkGrowths[NUM_OF_POOLS];
+  
+#ifdef STATIC_MEMORY_POOL
+  static char pHeap[MEM_SIZE];
+#else
+  static char *pHeap;
+#endif
+  static char* pReservedHeapMem;
+  static char* pMemPools[NUM_OF_POOLS];
+  
+  static unsigned int initialHeapSize = MEM_SIZE;
+  static unsigned int usedHeapSize = 0;
+  static unsigned int reservedHeapSize = 0;
+  static unsigned int totalSystemAllocMem = 0;
+  static unsigned int numOfSystemAllocs = 0;
+  
+  static MEM_STATS memStats[NUM_OF_POOLS];
+  static unsigned int allocatedMem = 0;
+  static unsigned int maxAllocMem = 0;
+  
+  
+  
+  /*************************** Function Prototypes ******************************/
+  
+  void initAllMemPools(void);
+  char* initMemPool(int poolId, int memBlockSize, int numOfMemBlocks, char** startAddress);
+  void* myMalloc(size_t size);
+  void myFree(void* ptr);
+  void displayMemStats(void);
+  void increaseMemPoolSize(unsigned int poolId);
+  
+  
+  
+  /*************************** Function Definitions *****************************/
+  
+  /*******************************************************************************
+   *
+   * Function:    PortMallocInit
+   *
+   * Args:        void
+   *
+   * Returns:     void
+   *
+   * Description: API function which initialises the fixed size memory pools.  Can
+   *              be called multiple times in a session, but is only effective the
+   *              first time it is called.
+   *
+   *******************************************************************************/
+  
+  void PortMallocInit(void)
+  {
+    if (0 == memPoolsInitialised)
+    {
+      initAllMemPools();
+    }
+  }
+  
+  
+  
+  
+  
+  int PortMallocGetMaxMemUsed(void)
+  {
+    return (int)maxAllocMem;
+  }
+  
+  
+  
+  /*******************************************************************************
+   *
+   * Function:    PortMallocSetPoolSize
+   *
+   * Args:        Pool size (size_t)
+   *
+   * Returns:     void
+   *
+   * Description: API function used to set the initial heap size. Note this can be
+   *              called at any time, but is only effective if the memory manager
+   *              has not already been initialised.
+   *
+   *******************************************************************************/
+  
+  void PortMallocSetPoolSize(size_t size)
+  {
+#if !defined(STATIC_MEMORY_POOL) && !defined(RTXC_PARTITION_MEMORY)
+    if (!memPoolsInitialised)
+    {
+      initialHeapSize = (unsigned int)size;
+    }
+#else
+    (void)size;
+#endif
+  }
+  
+  
+  
+  /*******************************************************************************
+   *
+   * Function:    PortMallocGetPoolSize
+   *
+   * Args:        void
+   *
+   * Returns:     Pool Size (int)
+   *
+   * Description: API function to return the initial heap size.
+   *
+   *******************************************************************************/
+  
+  int PortMallocGetPoolSize(void)
+  {
+    return (int)initialHeapSize;
+  }
+  
+  
+  
+  /*******************************************************************************
+   *
+   * Function:    initAllMemPools
+   *
+   * Args:        void
+   *
+   * Returns:     void
+   *
+   * Description: Internal function which is used to initialise all of the
+   *              memory pools. Note it can be called many times but is only
+   *              effective the first time it is called.
+   *
+   *******************************************************************************/
+  
+  void initAllMemPools(void)
+  {
+    char *availableMemStartAddress;
+    
+    if (0 == memPoolsInitialised)
+    {
+      int ii;
+      
+      /* Calculate the required heap size */
+      for (ii = 0; ii < NUM_OF_POOLS; ii++)
+      {
+        usedHeapSize += (memBlockSize[ii] + MEM_BLOCK_HDR) * memBlockNum[ii];
+      }
+      
+      if (initialHeapSize < usedHeapSize)
+      {
+        /* Insuffucient heap memory; abort initialisation */
+        return;
+      }
+      
+      
+#if defined(STATIC_MEMORY_POOL)
+      /* pHead has already been allocated, statically.  Don't need to do anything. */
+#elif defined(RTXC_PARTITION_MEMORY)
+      /* Grab the one and only block in HEAP_MAP. */
+      pHeap = KS_alloc(HEAP_MAP);
+      /* MEM_SIZE has better equal the size of HEAP_MAP's block. */
+      PORT_ASSERT(MEM_SIZE == KS_inqmap(HEAP_MAP));
+#else
+      /* Use the system malloc for heap allocation. */
+      
+      pHeap = (char*)malloc(initialHeapSize);
+#endif
+      if (0 == pHeap)
+      {
+        /* Unable to get memory for heap; abort initialisation */
+        return;
+      }
+      
+      totalSystemAllocMem = initialHeapSize;
+      numOfSystemAllocs++;
+      reservedHeapSize = initialHeapSize - usedHeapSize;
+      
+      /* Initialise each memory pool */
+      availableMemStartAddress = pHeap;
+      
+      for (ii = 0; ii < NUM_OF_POOLS; ii++)
+      {
+        pMemPools[ii] = 0;
+        
+        if (0 != memBlockNum[ii])
+        {
+          pMemPools[ii] = initMemPool(ii, memBlockSize[ii] + MEM_BLOCK_HDR, memBlockNum[ii], &availableMemStartAddress);
+        }
+      }
+      
+      pReservedHeapMem = availableMemStartAddress;
+      
+      memPoolsInitialised = 1;
+    }
+  }
+  
+  
+  
+  /*******************************************************************************
+   *
+   * Function:    initMemPool
+   *
+   * Args:        Pool ID (int), Memory Block Size (int), Number of Memory Blocks
+   *              (int), Heap Memory Start Address (char**)
+   *
+   * Returns:     Memory Pool Start Address (char*)
+   *
+   * Description: Internal function used to fill a specified memory pool with a
+   *              specified number of memory blocks of a specified size.  The heap
+   *              memory start address is adjusted to point to the next available
+   *              memory following the newly created pool.
+   *
+   *******************************************************************************/
+  
+  char* initMemPool(int poolId, int memBlockSize, int numOfMemBlocks, char** startAddress)
+  {
+    char* pPrevMemBlock = 0;
+    char* pCurrMemBlock = 0;
+    char* pStartMemPool = 0;
+    int ii;
+    
+    for (ii = 0; ii < numOfMemBlocks; ii++)
+    {
+      pCurrMemBlock = &((*startAddress)[ii*memBlockSize]);
+      
+      *((unsigned int*)pCurrMemBlock) = poolId;
+      
+      if (0 != pPrevMemBlock)
+      {
+        ((unsigned int*)pPrevMemBlock)[NEXT_BLOCK_PTR_OFFSET] = (unsigned int)pCurrMemBlock;
+      }
+      
+      pPrevMemBlock = pCurrMemBlock;
+    }
+    
+    ((unsigned int*)pPrevMemBlock)[NEXT_BLOCK_PTR_OFFSET] = 0;
+    
+    pStartMemPool = *startAddress;
+    
+    *startAddress = (*startAddress) + (ii * memBlockSize);
+    
+    return pStartMemPool;
+  }
+  
+  
+  
+  /*******************************************************************************
+   *
+   * Function:    PortMalloc
+   *
+   * Args:        Size (size_t)
+   *
+   * Returns:     Pointer to memory block (void*)
+   *
+   * Description: API function which is used by the application to request memory.
+   *              A null pointer is returned if the memory manager is unable to
+   *              satisfy the request.
+   *
+   *******************************************************************************/
+  
+  void* PortMalloc(size_t size)
+  {
+    int poolId;
+    char *pMemBlock;
+    int ii;
+    
+    /* Make sure the memory manager has been initialised */
+    if (0 == memPoolsInitialised)
+    {
+      initAllMemPools();
+    }
+    
+    poolId = NUM_OF_POOLS;
+    pMemBlock = 0;
+    
+    /* Find the best fit memory block */
+    for (ii = 0; ii < NUM_OF_POOLS; ii++)
+    {
+      if (memBlockSize[ii] >= size)
+      {
+        poolId = ii;
+        
+        break;
+      }
+    }
+    
+    /* Ensure that the requested size is not larger than the largest block size */
+    if (NUM_OF_POOLS > poolId)
+    {
+      /* Search the selected memory pool for a memory block; if there are none
+         then try to create some more blocks.  If this is not possible then
+         search the next largest memory block pool.  Repeat until either a block
+         is found, or there are no pools left */
+      for (ii = poolId; ii < NUM_OF_POOLS; ii++)
+      {
+#ifdef ALLOW_POOL_GROWTHS
+        /* If there are no blocks left, try to create some more */
+        if (0 == pMemPools[ii])
+        {
+          increaseMemPoolSize(ii);
+        }
+#endif /* ALLOW_POOL_GROWTHS */
+        
+        if (0 != pMemPools[ii])
+        {
+          /* Remove the memory block from the pool linked-list */
+          pMemBlock = pMemPools[ii];
+          
+          pMemPools[ii] = (char*)(((unsigned int*)pMemBlock)[NEXT_BLOCK_PTR_OFFSET]);
+          
+#ifdef MEM_MGR_STATS
+          /* Record the requested size in the memory block header - this is used
+             by PortFree to determine how much requested memory has been free'd */
+          *((unsigned int*)pMemBlock) = ii | (size << MEM_REQ_SIZE_BIT_SHIFT);
+#endif /* MEM_MGR_STATS */
+          
+          /* Adjust the memory block pointer to point to the useful portion of the
+             memory block, ie beyond the header */
+          pMemBlock = pMemBlock + MEM_BLOCK_HDR;
+          
+#ifdef MEM_MGR_STATS
+          /* Update the memory statistics */
+          allocatedMem += size;
+          
+          if (allocatedMem > maxAllocMem)
+          {
+            maxAllocMem = allocatedMem;
+          }
+          
+          memStats[ii].accReqSize += size;
+          memStats[ii].accAllocated++;
+          memStats[ii].allocated++;
+          
+          if (memStats[ii].maxReqSize < size)
+          {
+            memStats[ii].maxReqSize = size;
+          }
+          
+          if (memStats[ii].allocated > memStats[ii].max_alloc)
+          {
+            memStats[ii].max_alloc = memStats[ii].allocated;
+          }
+#endif /* MEM_MGR_STATS */
+          break;
+        }
+      }
+    }
+    
+    return (void*)pMemBlock;
+  }
+  
+  
+#ifdef ALLOW_POOL_GROWTHS
+  /*******************************************************************************
+   *
+   * Function:    increaseMemPoolSize
+   *
+   * Args:        Pool ID (unsigned int)
+   *
+   * Returns:     void
+   *
+   * Description: Increases the number of blocks in a given pool by the number
+   *              specified in the array memBlkGrowthNum if there is memory
+   *              available.  Memory is allocated from the heap reserve if
+   *              availabe, else it is requested from the system (if the
+   *              compilation flag ALLOW_ADDITIONAL_SYS_MEM_ALLOCS is defined. If
+   *              there is insufficient memory then the operation is aborted
+   *              without notification to the calling code.
+   *
+   *******************************************************************************/
+  
+  void increaseMemPoolSize(unsigned int poolId)
+  {
+    unsigned int requiredMemSize = memBlkGrowthNum[poolId] * (memBlockSize[poolId] + MEM_BLOCK_HDR);
+    
+    /* See if there is enough heap reserve memory */
+    if (requiredMemSize <= reservedHeapSize)
+    {
+      /* We're in luck; there's enough space */
+      pMemPools[poolId] = initMemPool(poolId, memBlockSize[poolId] + MEM_BLOCK_HDR, memBlkGrowthNum[poolId], &pReservedHeapMem);
+      
+      memBlockNum[poolId] += memBlkGrowthNum[poolId];
+      
+      reservedHeapSize -= requiredMemSize;
+      usedHeapSize += requiredMemSize;
+      
+#ifdef MEM_MGR_STATS
+      memBlkGrowths[poolId]++;
+#endif /* MEM_MGR_STATS */
+    }
+#ifdef ALLOW_ADDITIONAL_SYS_MEM_ALLOCS
+    else
+    {
+      /* There's not enough memory in the heap reserve, so request it from the system */
+      char* pStartAddress = (char*)malloc(requiredMemSize);
+      
+      if (0 != pStartAddress)
+      {
+        /* The system has allocated some memory, so let's make some more blocks */
+        pMemPools[poolId] = initMemPool(poolId, memBlockSize[poolId] + MEM_BLOCK_HDR, memBlkGrowthNum[poolId], &pStartAddress);
+        
+        memBlockNum[poolId] += memBlkGrowthNum[poolId];
+        
+        totalSystemAllocMem += requiredMemSize;
+        numOfSystemAllocs++;
+        
+#ifdef MEM_MGR_STATS
+        memBlkGrowths[poolId]++;
+#endif /* MEM_MGR_STATS */
+      }
+    }
+#endif /* ALLOW_ADDITIONAL_SYS_MEM_ALLOCS */
+  }
+#endif /* ALLOW_POOL_GROWTHS */
+  
+  
+  
+  /*******************************************************************************
+   *
+   * Function:    PortFree
+   *
+   * Args:        Memory Block Pointer (void*)
+   *
+   * Returns:     void
+   *
+   * Description: API function used by the application code to return a memory
+   *              block to the appropriate pool.  Note that this function is not
+   *              able to handle null or stale memory block pointers; calling this
+   *              function under these conditions will result in unpredictable
+   *              behavior.
+   *
+   *******************************************************************************/
+  
+  void PortFree(void* pMem)
+  {
+    unsigned int tmpVal;
+    unsigned char poolId;
+    char* pCurrentHead;
+#ifdef MEM_MGR_STATS
+    unsigned int reqMemSize;
+#endif
+    
+    /* What is the memory block pool id ? */
+    tmpVal = ((unsigned int*)pMem)[-MEM_BLOCK_HDR_OFFSET+MEM_POOL_ID_OFFSET];
+    poolId = tmpVal & MEM_POOL_ID_MASK;
+    
+    /* Add the memory block to the appropriate pool */
+    pCurrentHead = pMemPools[poolId];
+    ((unsigned int*)pMem)[-MEM_BLOCK_HDR_OFFSET+NEXT_BLOCK_PTR_OFFSET] = (unsigned int)pCurrentHead;
+    pMemPools[poolId] = (char*) & (((unsigned int*)pMem)[-MEM_BLOCK_HDR_OFFSET]);
+    
+#ifdef MEM_MGR_STATS
+    /* What was the requested memory size ? */
+    reqMemSize = tmpVal >> MEM_REQ_SIZE_BIT_SHIFT;
+    
+    allocatedMem -= reqMemSize;
+    
+    PORT_ASSERT(allocatedMem >= 0);
+    
+    memStats[poolId].accFreed++;
+    memStats[poolId].allocated--;
+#endif /* MEM_MGR_STATS */
+  }
+  
+  
+  
+  /*******************************************************************************
+   *
+   * Function:    displayMemStats
+   *
+   * Args:        void
+   *
+   * Returns:     void
+   *
+   * Description: API function used to display the overall memory and individual
+   *              memory pool statistics to standard output.
+   *
+   *******************************************************************************/
+  
+  void displayMemStats(void)
+  {
+    unsigned int totBNum = 0;
+    unsigned int totGrowths = 0;
+    unsigned int totAlloc = 0;
+    unsigned int totAccAlloc = 0;
+    unsigned int totAccFreed = 0;
+    unsigned int totMaxAlloc = 0;
+    unsigned int totMemWithOH = 0;
+    unsigned int totMem = 0;
+    unsigned int bytesAllocWithOH = 0;
+    unsigned int bytesAlloc = 0;
+    unsigned int maxBytesAllocWithOH = 0;
+    unsigned int maxBytesAlloc = 0;
+    unsigned int ii;
+    
+    printf("\nPool ID   BlkSz AvReqSz MaxReqSz   NumBlk  Growths    Alloc AccAlloc AccFreed MaxAlloc Alloc(b)  MaxA(b)\n");
+    printf("--------------------------------------------------------------------------------------------------------\n");
+    
+    for (ii = 0; ii < NUM_OF_POOLS; ii++)
+    {
+      unsigned int avReqSize = 0;
+      
+      if (0 != memStats[ii].accAllocated)
+      {
+        avReqSize = memStats[ii].accReqSize / memStats[ii].accAllocated;
+      }
+      
+      printf("   %4i  %6i  %6i   %6i  %7i  %7i  %7i  %7i  %7i  %7i %8i %8i\n", ii, memBlockSize[ii], avReqSize, memStats[ii].maxReqSize, memBlockNum[ii], memBlkGrowths[ii], memStats[ii].allocated, memStats[ii].accAllocated, memStats[ii].accFreed, memStats[ii].max_alloc, (memBlockSize[ii]*memStats[ii].allocated), (memBlockSize[ii]*memStats[ii].max_alloc));
+      
+      totBNum += memBlockNum[ii];
+      totGrowths += memBlkGrowths[ii];
+      totAlloc += memStats[ii].allocated;
+      totAccAlloc += memStats[ii].accAllocated;
+      totAccFreed += memStats[ii].accFreed;
+      totMaxAlloc += memStats[ii].max_alloc;
+      
+      totMemWithOH += (memBlockSize[ii] + MEM_BLOCK_HDR) * memBlockNum[ii];
+      totMem += memBlockSize[ii] * memBlockNum[ii];
+      bytesAllocWithOH += memStats[ii].allocated * (memBlockSize[ii] + MEM_BLOCK_HDR);
+      bytesAlloc += memStats[ii].allocated * memBlockSize[ii];
+      maxBytesAllocWithOH += memStats[ii].max_alloc * (memBlockSize[ii] + MEM_BLOCK_HDR);
+      maxBytesAlloc += memStats[ii].max_alloc * memBlockSize[ii];
+    }
+    
+    printf("--------------------------------------------------------------------------------------------------------\n");
+    printf("Total                             %7i  %7i  %7i  %7i  %7i  %7i %8i %8i\n\n", totBNum, totGrowths, totAlloc, totAccAlloc, totAccFreed, totMaxAlloc, bytesAlloc, maxBytesAlloc);
+    printf("Total Memory     %9i bytes\n", totMemWithOH);
+    printf("Total Memory     %9i bytes (without overhead)\n", totMem);
+    printf("Allocated Memory %9i bytes\n", bytesAllocWithOH);
+    printf("Allocated Memory %9i bytes (without overhead)\n", bytesAlloc);
+    printf("Max Alloc Memory %9i bytes\n", maxBytesAllocWithOH);
+    printf("Max Alloc Memory %9i bytes (without overhead)\n", maxBytesAlloc);
+    printf("\nReq Alloc Memory %9i bytes\n", allocatedMem);
+    printf("Max Rq Alloc Mem %9i bytes\n\n", maxAllocMem);
+    
+    printf("Used Heap Size   %9i bytes\n", usedHeapSize);
+    printf("Reserved Heap    %9i bytes\n", reservedHeapSize);
+    printf("Total Sys Alloc  %9i bytes\n", totalSystemAllocMem);
+    printf("Num of Sys Alloc %9i\n", numOfSystemAllocs);
+    
+    printf("\n");
+  }
+  
+  
+  
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+
+#endif /* FIXED_SIZE_MEM_BLOCK_SCHEME */
diff --git a/portable/src/pmemory.c b/portable/src/pmemory.c
new file mode 100644
index 0000000..f00427d
--- /dev/null
+++ b/portable/src/pmemory.c
@@ -0,0 +1,956 @@
+/*---------------------------------------------------------------------------*
+ *  pmemory.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+#include "passert.h"
+#include "pcrc.h"
+#include "pmemory.h"
+#include "PFileSystem.h"
+#include "PStackTrace.h"
+#include "passert.h"
+#include "pmemory_ext.h"
+#include "pmutex.h"
+
+#undef malloc
+#undef calloc
+#undef realloc
+#undef free
+
+static unsigned int gNbInit = 0;
+static PFile* gFile = NULL;
+static ESR_BOOL isLogEnabled = ESR_TRUE;
+
+#ifdef PMEM_MAP_TRACE
+static asr_uint32_t gMaxAlloc = -1;
+static asr_uint32_t gCurAlloc = -1;
+#endif
+
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+static size_t   gMemPoolSize = (3*1024*1024); /* default value: 3M */
+#endif
+
+#ifdef USE_THREAD
+static MUTEX memMutex;
+#endif
+
+#define MAX_MEM_TAG 256
+
+/* Only PMEM_MAP_TRACE has been defined, could do other memory logging/debugging */
+#ifdef PMEM_MAP_TRACE
+
+#define PMEM_STACKTRACE 0
+/* If enabled, logs individual memory allocation, reallocation, free operations */
+#define PMEM_LOG_LOWLEVEL 0
+#elif defined(WIN32)
+#pragma message("No PMEM_MAP_TRACE")
+#endif
+
+typedef struct MemoryData_t
+{
+#ifdef PMEM_MAP_TRACE
+  int index;
+#endif
+  size_t size;
+#if PMEM_STACKTRACE
+  /**
+   * Stacktrace of where the memory was allocated from.
+   */
+  const LCHAR* stackTrace;
+  /**
+   * Pointer to next memory allocation associated with the same tag.
+   */
+  struct MemoryData_t* next;
+  /**
+   * Pointer to last memory allocation associated with the same tag.
+   */
+  struct MemoryData_t* last;
+#endif
+}
+MemoryData;
+
+#ifdef PMEM_MAP_TRACE
+typedef struct MemMapEntry_t
+{
+  /**
+   * Memory tag/ID associated with allocation.
+   */
+  const LCHAR* tag;
+  asr_uint32_t curAlloc;
+  asr_uint32_t maxAlloc;
+  unsigned int crc;
+  /**
+   * First memory allocation associated with this tag.
+   * Memory that has been deallocated will not show up on this list.
+   */
+  MemoryData* first;
+  /**
+   * Last memory allocation associated with this tag.
+   * Memory that has been deallocated will not show up on this list.
+   */
+  MemoryData* last;
+}
+MemMapEntry;
+
+static MemMapEntry gMemoryMap[MAX_MEM_TAG];
+#endif
+
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+extern ESR_ReturnCode memory_pool_creation_status; /* Verify that memory pool actually was created */
+#define malloc PortNew
+#define free PortDelete
+#endif
+
+
+#if PMEM_STACKTRACE
+static ESR_ReturnCode getStackTrace(LCHAR* stackTrace, size_t* len)
+{
+  ESR_BOOL isInit;
+  ESR_ReturnCode rc;
+  
+  rc = PStackTraceIsInitialized(&isInit);
+  if (rc == ESR_SUCCESS && isInit)
+  {
+    LCHAR* index;
+    size_t bufferLen = *len;
+    size_t i;
+    
+    rc = PStackTraceGetValue(stackTrace, &bufferLen);
+    if (rc == ESR_SUCCESS)
+    {
+      for (i = 0; i < 2; ++i)
+      {
+        rc = PStackTracePopLevel(stackTrace);
+        if (rc != ESR_SUCCESS)
+        {
+          pfprintf(PSTDERR, "[%s:%d] PStackTracePopLevel failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc));
+          goto CLEANUP;
+        }
+      }
+      index = stackTrace;
+      while (index)
+      {
+        index = LSTRSTR(index, L(" at\n"));
+        if (index != NULL)
+          *(index + 3) = L(' ');
+      }
+    }
+    else if (rc == ESR_NOT_SUPPORTED)
+      LSTRCPY(stackTrace, L(""));
+    else if (rc != ESR_SUCCESS)
+    {
+      pfprintf(PSTDERR, "[%s:%d] PStackTraceGetValue failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  else
+    LSTRCPY(stackTrace, L("(null)"));
+  *len = LSTRLEN(stackTrace);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+#endif /* PMEM_STACKTRACE */
+
+#ifdef PMEM_MAP_TRACE
+static int getIndex(const LCHAR *key)
+{
+  unsigned int crc = ~pcrcComputeString(key);
+  int initialIdx = (int)(crc % MAX_MEM_TAG);
+  int idx = initialIdx;
+  
+  for (;;)
+  {
+    if (gMemoryMap[idx].tag == NULL)
+    {
+      /* found an empty slot, use it. */
+      gMemoryMap[idx].tag = key;
+      gMemoryMap[idx].curAlloc = 0;
+      gMemoryMap[idx].maxAlloc = 0;
+      gMemoryMap[idx].crc = crc;
+      gMemoryMap[idx].first = NULL;
+      gMemoryMap[idx].last = NULL;
+#if PMEM_LOG_LOWLEVEL
+      if (gFile != NULL)
+        pfprintf(gFile, L("pmem|newtag|%s|%d|\n"), key, idx);
+#endif
+      return idx;
+    }
+    
+    if (gMemoryMap[idx].crc == crc &&
+        LSTRCMP(gMemoryMap[idx].tag, key) == 0)
+    {
+      /* found a matching slot, return it */
+      return idx;
+    }
+    
+    if (++idx == MAX_MEM_TAG)
+    {
+      /* Look at next slot and wrap around. */
+      idx = 0;
+    }
+    if (idx == initialIdx)
+      return -1;
+  }
+}
+#endif
+
+/* Not thread-safe. But do not expect user calls this function on different threads simultaneously */
+ESR_ReturnCode PMemorySetPoolSize(size_t size)
+{
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+  if (gNbInit > 0)
+    return ESR_INVALID_STATE;
+    
+  gMemPoolSize = size;
+  return ESR_SUCCESS;
+#else
+  return ESR_NOT_SUPPORTED;
+#endif
+}
+
+ESR_ReturnCode PMemoryGetPoolSize(size_t *size)
+{
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+  *size = gMemPoolSize;
+  return ESR_SUCCESS;
+#else
+  return ESR_NOT_SUPPORTED;
+#endif
+}
+
+/* it is not thread safe: hard to protect the createMutex()
+  * could fix it by using static mutex initialization in some OS,
+  * but does not work with our own pthread implementation for vxworks
+  * SUPPOSE the user just calls this function once
+  */
+ESR_ReturnCode PMemInit(void)
+{
+  ESR_ReturnCode init_status;
+  
+  if (gNbInit > 0)
+    return ESR_INVALID_STATE;
+    
+  init_status = createMutex(&memMutex, ESR_FALSE);
+  
+  if (init_status == ESR_SUCCESS)
+  {
+    ++gNbInit;
+#ifdef PMEM_MAP_TRACE
+    memset(gMemoryMap, 0, sizeof(gMemoryMap));
+#endif
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+    PortMemSetPoolSize(gMemPoolSize);
+    PortMemoryInit();
+    /* There is no friggin' way to pass the status of the memory initialization, because of the damn macros and all the other crap */
+    /* So I am checking the value of an external variable, this sucks, but I can't ignore something this important */
+    if (memory_pool_creation_status == ESR_SUCCESS)
+    {
+      /* Reset this because with all the layers of crap, I can't guarantee we'll get to the bottom layer on a re-init */
+      memory_pool_creation_status = ESR_FATAL_ERROR;
+    }
+    else
+    {
+      pfprintf(PSTDERR, L("ESR_INVALID_STATE: Memory Pool Could Not Be Created\n"));
+      PortMemoryTerm();
+      unlockMutex(&memMutex);
+      deleteMutex(&memMutex);
+      init_status = ESR_INVALID_STATE;
+    }
+#endif
+  }
+  else
+  {
+    deleteMutex(&memMutex);
+  }
+
+  // Initialize global static variables
+  gCurAlloc = 0;
+  gMaxAlloc = 0;
+  
+  return (init_status);
+}
+
+/* it is not thread safe: hard to protect the deleteMutex()
+  * could fix it by using static mutex initialization in some OS,
+  * but does not work with our own pthread implementation for vxworks
+  * SUPPOSE the user just calls this function once
+  */
+ESR_ReturnCode PMemShutdown(void)
+{
+#ifdef PMEM_MAP_TRACE
+  size_t i;
+#endif
+  
+  if (gNbInit == 0)
+    return ESR_INVALID_STATE;
+  if (gNbInit == 1)
+  {
+#ifdef PMEM_MAP_TRACE
+    for (i = 0; i < MAX_MEM_TAG; ++i)
+    {
+      free((LCHAR*) gMemoryMap[i].tag);
+      gMemoryMap[i].tag = NULL;
+    }
+#endif
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+    PortMemoryTerm();
+#endif
+    deleteMutex(&memMutex);
+  }
+  gNbInit--;
+  
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PMemSetLogFile(PFile* file)
+{
+  if (gNbInit == 0)
+    return ESR_INVALID_STATE;
+    
+  lockMutex(&memMutex);
+  gFile = file;
+  unlockMutex(&memMutex);
+  
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PMemDumpLogFile(void)
+{
+  ESR_ReturnCode rc;
+  
+  if (gNbInit == 0)
+    return ESR_INVALID_STATE;
+    
+  lockMutex(&memMutex);
+  if (gFile != NULL)
+  {
+    /* Hide gFile from memory report */
+/*    CHK(rc, gFile->hideMemoryAllocation(gFile));*/
+    
+    rc = PMemReport(gFile);
+    if (rc != ESR_SUCCESS)
+    {
+      pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__);
+      goto CLEANUP;
+    }
+    if (gFile != PSTDIN && gFile != PSTDOUT && gFile != PSTDERR)
+    {
+/*      rc = gFile->destroy(gFile);
+      if (rc != ESR_SUCCESS)
+      {
+        pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__);
+        goto CLEANUP;
+      }*/
+      pfclose ( gFile );
+    }
+    gFile = NULL;
+  }
+  unlockMutex(&memMutex);
+  return ESR_SUCCESS;
+CLEANUP:
+  unlockMutex(&memMutex);
+  return rc;
+}
+
+ESR_ReturnCode PMemSetLogEnabled(ESR_BOOL value)
+{
+  lockMutex(&memMutex);
+  isLogEnabled = value;
+  unlockMutex(&memMutex);
+  
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PMemLogFree(void* ptr)
+{
+  MemoryData* data;
+#ifdef PMEM_MAP_TRACE
+  MemMapEntry* e;
+#endif
+#if PMEM_STACKTRACE && PMEM_LOG_LOWLEVEL
+  ESR_ReturnCode rc;
+#endif
+  
+  if (ptr == NULL || gNbInit == 0)
+    return ESR_SUCCESS;
+    
+  lockMutex(&memMutex);
+  
+  data = (MemoryData*)(((unsigned char*) ptr) - sizeof(MemoryData));
+#ifdef PMEM_MAP_TRACE
+  e = gMemoryMap + data->index;
+  passert(data->index >= 0 && data->index <= MAX_MEM_TAG);
+  if (isLogEnabled)
+  {
+    passert(e->curAlloc >= data->size);
+    e->curAlloc -= data->size;
+    
+    passert(gCurAlloc >= data->size);
+    gCurAlloc -= data->size;
+    
+    data->size = 0;
+  }
+#if PMEM_STACKTRACE
+  if (e->first != NULL && e->first == data)
+    e->first = data->next;
+  if (e->last != NULL && e->last == data)
+    e->last = data->last;
+  if (data->last != NULL)
+    data->last->next = data->next;
+  if (data->next != NULL)
+  {
+    data->next->last = data->last;
+    data->next = NULL;
+  }
+  data->last = NULL;
+#endif
+#if PMEM_LOG_LOWLEVEL
+  if (gFile != NULL && isLogEnabled)
+  {
+#if PMEM_STACKTRACE
+    LCHAR stackTrace[P_MAX_STACKTRACE];
+    size_t len = P_MAX_STACKTRACE;
+    
+    rc = getStackTrace(stackTrace, &len);
+    if (rc != ESR_SUCCESS)
+    {
+      pfprintf(PSTDERR, "[%s:%d] getStackTrace failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    pfprintf(gFile, L("pmem|free|%s|%s|%d|0x%x|%s|\n"), e->tag, data->stackTrace, data->size, ptr, stackTrace);
+#else
+    pfprintf(gFile, L("pmem|free|%s|%d|0x%x\n"), e->tag, data->size, ptr);
+#endif /* PMEM_STACKTRACE */
+  }
+#endif /* PMEM_LOG_LOWLEVEL */
+#endif /* PMEM_MAP_TRACE */
+  
+  unlockMutex(&memMutex);
+  return ESR_SUCCESS;
+#if PMEM_STACKTRACE && PMEM_LOG_LOWLEVEL
+CLEANUP:
+  unlockMutex(&memMutex);
+  return rc;
+#endif
+}
+
+ESR_ReturnCode PMemReport(PFile* file)
+{
+#define TAG_SIZE 52
+#ifdef PMEM_MAP_TRACE
+  asr_uint32_t totalAlloc = 0;
+  size_t i;
+  MemMapEntry* e;
+  unsigned int crc;
+  LCHAR truncatedTag[TAG_SIZE];
+  size_t len;
+  LCHAR TAG_PREFIX[] = L("...");
+  const size_t TAG_PREFIX_SIZE = LSTRLEN(TAG_PREFIX);
+  const size_t countToCopy = (TAG_SIZE - 1) - TAG_PREFIX_SIZE;
+#endif
+#if PMEM_STACKTRACE
+  MemoryData* data;
+#endif
+  
+  if (gNbInit == 0)
+    return ESR_INVALID_STATE;
+  if (file == NULL)
+  {
+    file = gFile;
+    if (file == NULL)
+      return ESR_SUCCESS;
+  }
+  
+  lockMutex(&memMutex);
+#ifdef PMEM_MAP_TRACE
+  if (gFile != NULL)
+  {
+    for (i = 0, e = gMemoryMap; i < MAX_MEM_TAG; ++i, ++e)
+    {
+      if (e->tag == NULL)
+        continue;
+      crc = ~pcrcComputeString(e->tag);
+      if (crc != e->crc)
+        pfprintf(gFile, L("pmem|-|0|corrupt|%d|\n"), i);
+    }
+  }
+  
+  pfprintf(file, L("%-52s %10s %15s\n"), L("Memory tag"), L("Cur. Alloc"), L("Max. Alloc"));
+  
+  for (i = 0, e = gMemoryMap; i < MAX_MEM_TAG; ++i, ++e)
+  {
+    if (e->tag == NULL)
+      continue;
+    crc = ~pcrcComputeString(e->tag);
+    if (crc != e->crc)
+      pfprintf(file, L("**********%04d********** %38u %15u\n"), i, e->curAlloc, e->maxAlloc);
+    else
+    {
+      len = LSTRLEN(e->tag);
+      
+      if (len > TAG_SIZE - 1)
+      {
+        LSTRCPY(truncatedTag, TAG_PREFIX);
+        LSTRCPY(truncatedTag + TAG_PREFIX_SIZE, e->tag + (len - countToCopy));
+        passert(LSTRLEN(truncatedTag) == TAG_SIZE - 1);
+      }
+      else
+        LSTRCPY(truncatedTag, e->tag);
+      pfprintf(file, L("%-52s %10u %15u\n"), truncatedTag, e->curAlloc, e->maxAlloc);
+    }
+#if PMEM_STACKTRACE
+    data = gMemoryMap[i].first;
+    while (data)
+    {
+      if (data->size != 0 && data->stackTrace != NULL)
+      {
+        LCHAR stackTrace[P_MAX_STACKTRACE];
+        LCHAR* index;
+        
+        LSTRCPY(stackTrace, data->stackTrace);
+        index = stackTrace;
+        while (index)
+        {
+          index = LSTRSTR(index, L(" at "));
+          if (index != NULL)
+            *(index + 3) = L('\n');
+        }
+        pfprintf(file, L("StackTrace:\n%s\n\n"), stackTrace);
+      }
+      data = data->next;
+    }
+#endif
+    passert(e->curAlloc >= 0);
+    totalAlloc += e->curAlloc;
+  }
+  pfprintf(file, L("%-52s %10u %15u\n"), L("Total"), totalAlloc, gMaxAlloc);
+  passert(totalAlloc == gCurAlloc);
+#else
+  /* not support */
+#endif /* PMEM_MAP_TRACE */
+  unlockMutex(&memMutex);
+  
+  return ESR_SUCCESS;
+}
+/*
+DESCRIPTION
+  The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional. This volume of IEEE Std 1003.1-2001 defers to the ISO C standard.
+The malloc() function shall allocate unused space for an object whose size in bytes is specified by size and whose value is unspecified.
+
+The order and contiguity of storage allocated by successive calls to malloc() is unspecified. The pointer returned if the allocation succeeds shall be suitably aligned so that it may be assigned to a pointer to any type of object and then used to access such an object in the space allocated (until the space is explicitly freed or reallocated). Each such allocation shall yield a pointer to an object disjoint from any other object. The pointer returned points to the start (lowest byte address) of the allocated space. If the space cannot be allocated, a null pointer shall be returned. If the size of the space requested is 0, the behavior is implementation-defined: the value returned shall be either a null pointer or a unique pointer.
+
+RETURN VALUE
+Upon successful completion with size not equal to 0, malloc() shall return a pointer to the allocated space. If size is 0, either a null pointer or a unique pointer that can be successfully passed to free() shall be returned. Otherwise, it shall return a null pointer  and set errno to indicate the error.
+*/
+#ifdef PMEM_MAP_TRACE
+void *pmalloc(size_t nbBytes, const LCHAR* tag, const LCHAR* file, int line)
+#else
+void *pmalloc(size_t nbBytes)
+#endif
+{
+  MemoryData* data;
+  void* result = NULL;
+  size_t actualSize;
+#ifdef PMEM_MAP_TRACE
+  int idx;
+  MemMapEntry* e;
+#endif
+#if PMEM_STACKTRACE
+  size_t stackTraceSize = P_MAX_STACKTRACE;
+  LCHAR* stackTrace;
+  ESR_BOOL isInit;
+  ESR_ReturnCode rc;
+#endif
+  
+  if (gNbInit == 0)
+    return NULL;
+    
+  lockMutex(&memMutex);
+  
+#ifdef PMEM_MAP_TRACE
+  if (tag == NULL)
+    tag = file;
+  passert(tag != NULL);
+  
+  idx = getIndex(tag);
+  if (idx == -1)
+  {
+    pfprintf(PSTDERR, L("ESR_INVALID_STATE: pmalloc() ran out of slots"));
+    goto CLEANUP;
+  }
+  if (gMemoryMap[idx].tag == tag)
+  {
+    /* This is a new key, allocate memory for it */
+    gMemoryMap[idx].tag = malloc(sizeof(LCHAR) * (LSTRLEN(tag) + 1));
+    if (gMemoryMap[idx].tag == NULL)
+      goto CLEANUP;
+    LSTRCPY((LCHAR*) gMemoryMap[idx].tag, tag);
+  }
+#endif
+  actualSize = sizeof(MemoryData) + nbBytes;
+  
+  data = (MemoryData *) malloc(actualSize);
+  if (data == NULL)
+  {
+    /*
+     * printf("no space when alloc %d from file %s line %d\nmem usage: %d\n",
+     * nbBytes, file, line, PortMallocGetMaxMemUsed());
+     */
+    goto CLEANUP;
+  }
+  
+#ifdef PMEM_MAP_TRACE
+  data->index = idx;
+#if PMEM_STACKTRACE
+  rc = PStackTraceIsInitialized(&isInit);
+  if (rc != ESR_SUCCESS)
+    goto CLEANUP;
+  if (isInit)
+  {
+    stackTrace = malloc(sizeof(LCHAR) * (stackTraceSize + 1));
+    if (stackTrace == NULL)
+      goto CLEANUP;
+    rc = getStackTrace(stackTrace, &stackTraceSize);
+    if (rc != ESR_SUCCESS)
+      goto CLEANUP;
+    /* Shrink stackTrace buffer */
+    passert(LSTRLEN(stackTrace) < P_MAX_STACKTRACE);
+    data->stackTrace = realloc(stackTrace, sizeof(LCHAR) * (LSTRLEN(stackTrace) + 1));
+    if (data->stackTrace == NULL)
+    {
+      free(stackTrace);
+      goto CLEANUP;
+    }
+  }
+  else
+    data->stackTrace = NULL;
+#endif
+    
+  e = gMemoryMap + idx;
+  
+#if PMEM_STACKTRACE
+  if (e->last != NULL)
+    e->last->next = data;
+  data->last = e->last;
+  data->next = NULL;
+  e->last = data;
+  if (e->first == NULL)
+    e->first = data;
+#endif
+#endif
+    
+  if (isLogEnabled)
+  {
+    data->size = actualSize;
+#ifdef PMEM_MAP_TRACE
+    e->curAlloc += actualSize;
+    if (e->maxAlloc < e->curAlloc)
+      e->maxAlloc = e->curAlloc;
+      
+    gCurAlloc += actualSize;
+    if (gMaxAlloc < gCurAlloc)
+      gMaxAlloc = gCurAlloc;
+#endif
+  }
+  else
+    data->size = 0;
+    
+  result = (void*)(data + 1);
+  
+#if PMEM_LOG_LOWLEVEL
+  if (gFile != NULL && isLogEnabled)
+  
+    if (gFile != NULL)
+    {
+#if PMEM_STACKTRACE
+      pfprintf(gFile, L("pmem|alloc|%s|%d|0x%x|%s|\n"), tag, actualSize, result, data->stackTrace);
+#else
+      pfprintf(gFile, L("pmem|alloc|%s|%d|0x%x|\n"), tag, actualSize, result);
+#endif /* PMEM_STACKTRACE */
+    }
+#endif /* PMEM_LOG_LOWLEVEL */
+    
+CLEANUP:
+  unlockMutex(&memMutex);
+  return result;
+}
+
+#ifdef PMEM_MAP_TRACE
+void *pcalloc(size_t nbItems, size_t itemSize, const LCHAR* tag, const LCHAR* file, int line)
+#else
+void *pcalloc(size_t nbItems, size_t itemSize)
+#endif
+{
+  void* result = NULL;
+
+  if (gNbInit == 1)
+  {
+#ifdef PMEM_MAP_TRACE
+    result = (MemoryData *)pmalloc(nbItems * itemSize, tag, file, line);
+#else
+    result = (MemoryData *)pmalloc(nbItems * itemSize);
+#endif
+    if (result != NULL)
+      memset(result, 0, nbItems * itemSize);
+  }
+  return (result);
+}
+
+/*
+DESCRIPTION
+The realloc() function changes the size of the memory object pointed to by ptr to the size specified by size. The contents of the object will remain unchanged up to the lesser of the new and old sizes. If the new size of the memory object would require movement of the object, the space for the previous instantiation of the object is freed. If the new size is larger, the contents of the newly allocated portion of the object are unspecified. If size is 0 and ptr is not a null pointer, the object pointed to is freed. If the space cannot be allocated, the object remains unchanged.
+If ptr is a null pointer, realloc() behaves like malloc() for the specified size.
+
+If ptr does not match a pointer returned earlier by calloc(), malloc() or realloc() or if the space has previously been deallocated by a call to free() or realloc(), the behaviour is undefined.
+
+The order and contiguity of storage allocated by successive calls to realloc() is unspecified. The pointer returned if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object and then used to access such an object in the space allocated (until the space is explicitly freed or reallocated). Each such allocation will yield a pointer to an object disjoint from any other object. The pointer returned points to the start (lowest byte address) of the allocated space. If the space cannot be allocated, a null pointer is returned.
+
+ RETURN VALUE
+Upon successful completion with a size not equal to 0, realloc() returns a pointer to the (possibly moved) allocated space. If size is 0, either a null pointer or a unique pointer that can be successfully passed to free() is returned. If there is not enough available memory, realloc() returns a null pointer
+*/
+#ifdef PMEM_MAP_TRACE
+void *prealloc(void *ptr, size_t newSize, const LCHAR *file, int line)
+#else
+void *prealloc(void *ptr, size_t newSize)
+#endif
+{
+  MemoryData* oldData;
+  MemoryData* newData;
+  void *result = NULL;
+  size_t actualSize;
+#ifdef PMEM_MAP_TRACE
+  MemMapEntry* e;
+#endif
+  size_t oldSize;
+#if PMEM_STACKTRACE
+  const LCHAR* oldStackTrace;
+  MemoryData* oldNext;
+  MemoryData* oldLast;
+#endif
+  ESR_BOOL bMalloc = ESR_FALSE;
+  
+  if (gNbInit == 0)
+    return NULL;
+    
+  if (newSize == 0 && ptr != NULL)
+  {
+#ifdef PMEM_MAP_TRACE
+    pfree(ptr, file, line);
+#else
+    pfree(ptr);
+#endif
+    return NULL;
+  }
+  else if (ptr == NULL)
+  {
+#ifdef PMEM_MAP_TRACE
+    return pmalloc(newSize, NULL, file, line);
+#else
+    return pmalloc(newSize);
+#endif
+  }
+  
+  lockMutex(&memMutex);
+  
+  oldData = (MemoryData *)(((unsigned char *) ptr) - sizeof(MemoryData));
+  oldSize = oldData->size;
+  passert(oldSize >= 0);
+#if PMEM_STACKTRACE
+  oldStackTrace = oldData->stackTrace;
+  oldNext = oldData->next;
+  oldLast = oldData->last;
+#endif
+#ifdef PMEM_MAP_TRACE
+  e = gMemoryMap + oldData->index;
+#endif
+  
+  actualSize = newSize + sizeof(MemoryData);
+  if (oldSize != actualSize)
+  {
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+    newData = (MemoryData *) PortNew(actualSize);
+    if (newData == NULL)
+    {
+      pfprintf(PSTDERR, L("OUT_OF_MEMORY: prealloc() failed at %s:%d"), __FILE__, __LINE__);
+      return NULL;
+    }
+    bMalloc = ESR_TRUE;
+    if (oldSize >= actualSize)
+    {
+      memcpy(newData, oldData, actualSize);
+    }
+    else
+    {
+      memcpy(newData, oldData, oldSize);
+    }
+    PortDelete(oldData);
+#else
+    newData = (MemoryData *) realloc(oldData, actualSize);
+    bMalloc = ESR_TRUE;
+#endif
+  }
+  else /* No change */
+  {
+    newData = oldData;
+  }
+  
+#ifdef PMEM_MAP_TRACE
+  if (newData != NULL && bMalloc)
+  {
+    if (isLogEnabled)
+    {
+      e->curAlloc += actualSize - oldSize;
+      if (e->maxAlloc < e->curAlloc)
+        e->maxAlloc = e->curAlloc;
+        
+      gCurAlloc += actualSize - oldSize;
+      if (gMaxAlloc < gCurAlloc)
+        gMaxAlloc = gCurAlloc;
+    }
+    
+#if PMEM_STACKTRACE
+    newData->stackTrace = oldStackTrace;
+    newData->next = oldNext;
+    newData->last = oldLast;
+    if (newData->last != NULL)
+      newData->last->next = newData;
+    if (newData->next != NULL)
+      newData->next->last = newData;
+    if (e->first == oldData)
+      e->first = newData;
+    if (e->last == oldData)
+      e->last = newData;
+#endif
+  }
+#endif
+  
+  if (newData != NULL)
+  {
+    newData->size = actualSize;
+    result = (void*)(newData + 1);
+  }
+  
+#if PMEM_LOG_LOWLEVEL
+  if (gFile != NULL && isLogEnabled)
+  {
+#if PMEM_STACKTRACE
+    LCHAR stackTrace[P_MAX_STACKTRACE];
+    size_t len = P_MAX_STACKTRACE;
+    ESR_ReturnCode rc;
+    
+    rc = getStackTrace(stackTrace, &len);
+    if (rc != ESR_SUCCESS)
+    {
+      pfprintf(PSTDERR, "[%s:%d] getStackTrace failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    pfprintf(gFile, L("pmem|%s|%d|realloc|%d|0x%x|%s|\n"), e->tag, oldSize, actualSize, ptr, stackTrace);
+#else
+    pfprintf(gFile, L("pmem|%s|%d|realloc|%d|0x%x|\n"), e->tag, oldSize, actualSize, ptr);
+#endif /* PMEM_STACKTRACE */
+  }
+#endif /* PMEM_LOG_LOWLEVEL */
+  
+  unlockMutex(&memMutex);
+  return result;
+#if PMEM_STACKTRACE && PMEM_LOG_LOWLEVEL
+CLEANUP:
+  unlockMutex(&memMutex);
+  return NULL;
+#endif
+}
+
+#ifdef PMEM_MAP_TRACE
+void pfree(void* ptr, const LCHAR* file, int line)
+#else
+void pfree(void* ptr)
+#endif
+{
+  MemoryData* data;
+#ifdef PMEM_MAP_TRACE
+  MemMapEntry* e;
+#endif
+  if (ptr == NULL || gNbInit == 0)
+    return;
+    
+  lockMutex(&memMutex);
+  
+  data = (MemoryData*)(((unsigned char*) ptr) - sizeof(MemoryData));
+#ifdef PMEM_MAP_TRACE
+  passert(data->index >= 0 && data->index <= MAX_MEM_TAG);
+  e = gMemoryMap + data->index;
+  if (isLogEnabled)
+  {
+    passert(e->curAlloc >= data->size);
+    e->curAlloc -= data->size;
+    
+    passert(gCurAlloc >= data->size);
+    gCurAlloc -= data->size;
+  }
+#if PMEM_STACKTRACE
+  if (e->first != NULL && e->first == data)
+    e->first = data->next;
+  if (e->last != NULL && e->last == data)
+    e->last = data->last;
+  if (data->last != NULL)
+    data->last->next = data->next;
+  if (data->next != NULL)
+  {
+    data->next->last = data->last;
+    data->next = NULL;
+  }
+  data->last = NULL;
+#endif /* PMEM_STACKTRACE */
+#if PMEM_LOG_LOWLEVEL
+  if (gFile != NULL && isLogEnabled)
+  {
+#if PMEM_STACKTRACE
+    LCHAR stackTrace[P_MAX_STACKTRACE];
+    size_t len = P_MAX_STACKTRACE;
+    ESR_ReturnCode rc;
+    
+    rc = getStackTrace(stackTrace, &len);
+    if (rc != ESR_SUCCESS)
+    {
+      pfprintf(PSTDERR, "[%s:%d] getStackTrace failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    pfprintf(gFile, L("pmem|free|%s|%s|%d|0x%x|%s|\n"), e->tag, data->stackTrace, data->size, ptr, stackTrace);
+#else
+    pfprintf(gFile, L("pmem|free|%s|%d|0x%x\n"), e->tag, data->size, ptr);
+#endif /* PMEM_STACKTRACE */
+  }
+#endif /* PMEM_LOG_LOWLEVEL */
+#if PMEM_STACKTRACE
+  free((LCHAR*) data->stackTrace);
+  data->stackTrace = NULL;
+#endif /* PMEM_STACKTRACE */
+#endif
+  
+  free(data);
+  unlockMutex(&memMutex);
+#if PMEM_STACKTRACE && PMEM_LOG_LOWLEVEL
+CLEANUP:
+  unlockMutex(&memMutex);
+  return;
+#endif
+  
+}
diff --git a/portable/src/pmemory_ext.c b/portable/src/pmemory_ext.c
new file mode 100644
index 0000000..a30a6cb
--- /dev/null
+++ b/portable/src/pmemory_ext.c
@@ -0,0 +1,369 @@
+/*---------------------------------------------------------------------------*
+ *  pmemory_ext.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "pmemory.h"
+#include "ptrd.h"
+#include "pmutex.h"
+#include "passert.h"
+#include "pmemory_ext.h"
+#include "pmalloc.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#if defined(USE_THREAD) && defined(USE_DINKUM_LIB_DIRECT)
+  static MUTEX memextMutex;
+#endif
+  
+#ifdef RTXC
+  void* operator new(size_t size)
+  {
+    return (PortNew(size));
+  }
+  void  operator delete(void* ptr)
+  {
+    PortDelete(ptr);
+  }
+#endif
+  
+#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME)
+  
+  /* to assist with leak checking */
+static int portNewCount = 0;
+static int portDeleteCount = 0;
+
+  /* enable writing and checking of guard words if debugging is enabled */
+#ifdef _DEBUG
+  /* crash on Xanavi's board with this option on, do not know why */
+  /* #define DBG_GUARD_WORDS */
+#endif /* _DEBUG */
+  
+  /* ************************************************************************************
+   * PORTABLE_PSOS_BLOCK_SCHEME_MEM_MGR || PORTABLE_DINKUM_MEM_MGR || PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME
+   * ************************************************************************************/
+  
+  /* data ******************************************************************************/
+  
+  static BOOL  gMemoryInitted = FALSE; /* TODO: Temporary fix to PortTerm failure */
+  
+#define MEM_MGR_GetPoolSize()     PortMallocGetPoolSize()
+#define MEM_MGR_SetPoolSize(sizeInBytes)  PortMallocSetPoolSize(sizeInBytes)
+#define MEM_MGR_Init()       PortMallocInit()
+#define MEM_MGR_Term()              PortMallocTerm()
+#define MEM_MGR_Allocate(sizeInBytes)   PortMalloc(sizeInBytes)
+#define MEM_MGR_Free(objectPtr)     PortFree(objectPtr)
+#define MEM_MGR_Dump()
+#define MEM_MGR_GetMaxMemUsed()     PortMallocGetMaxMemUsed()
+  
+  /* guard word data ********************************************************/
+  
+#ifdef DBG_GUARD_WORDS
+#define GUARD_BEGIN  0xbbbbbbbb
+#define GUARD_END    0xeeeeeeee
+  
+#define GUARD_OFF_REQ_SIZE   0
+#define GUARD_OFF_START    sizeof(unsigned int)
+#define GUARD_OFF_PTR    (sizeof(unsigned int) + sizeof(unsigned int))
+#define GUARD_EXTRA     (sizeof(unsigned int) + sizeof(unsigned int) + sizeof(unsigned int))
+#define GUARD_OFF_END(allocSize)    ((allocSize) - sizeof(unsigned int))
+#define GUARD_ALLOC_SIZE(reqSize)   ((reqSize)+GUARD_EXTRA)
+  
+#define GUARD_PTR_FIELD(ptr,off) (unsigned int *)((char *)(ptr) + (off))
+#define GUARD_ALLOC_PTR(ptr)  (void*) ((char *)(ptr) - GUARD_OFF_PTR)
+#endif
+  
+  /* scan guard words data **************************************************/
+  
+  /* maintain a static list of allocated blocks (didn't want to perform any dynamic allocation).
+   * This list can be scanned by PortMemScan() to determine if any allocated blocks
+   * have overwritten their guard words.
+   * Calling PortDelete() will check guard words upon de-allocation, but many
+   * allocated blocks are only freed at program termination, which sometimes doesn't happen.
+   *
+   * This software is enabled separately with DBG_SCAN_GUARD_WORDS, because the performance
+   * overhead is severe.
+   */
+#ifdef DBG_SCAN_GUARD_WORDS
+#define MAX_ALLOCATED_BLOCKS  80000
+  static void *allocArray[MAX_ALLOCATED_BLOCKS+1];
+  static int allocArrayCount = 0;
+  
+  void AddToAllocList(void *memPtr);
+  void RemoveFromAllocList(void *memPtr);
+  
+#define ADD_TO_ALLOC_LIST(ptr)   AddToAllocList(ptr)
+#define REMOVE_FROM_ALLOC_LIST(ptr)  RemoveFromAllocList(ptr)
+  
+#else
+#define ADD_TO_ALLOC_LIST(ptr)
+#define REMOVE_FROM_ALLOC_LIST(ptr)
+#endif
+  
+  /* Guard Functions ********************************************************/
+  
+#ifdef DBG_SCAN_GUARD_WORDS
+  /* AddToAllocList() : maintain an array of allocated blocks that can be
+   * used by PortMemScan() to check for overwritten guard words.
+   */
+  void AddToAllocList(void *memPtr)
+  {
+    allocArray[allocArrayCount] = memPtr;
+    allocArrayCount++;
+    if (allocArrayCount >= MAX_ALLOCATED_BLOCKS)
+    {
+      char buf[256];
+      sprintf(buf, "AddToAllocList ERROR : MAX_ALLOCATED_BLOCKS is too small (%d)", allocArrayCount);
+      PORT_INTERNAL_ERROR(buf);
+    }
+  }
+  
+  /* RemoveFromAllocList() : maintain an array of allocated blocks that can be
+   * used by PortMemScan() to check for overwritten guard words.
+   */
+  void RemoveFromAllocList(void *memPtr)
+  {
+    int i;               /* loop index */
+    int j;               /* loop index */
+    int inList = FALSE;  /* TRUE when found in list */
+    
+    for (i = 0; i < allocArrayCount; i++)
+    {
+      if (allocArray[i] == memPtr)
+      {
+        inList = TRUE;
+        break;
+      }
+    }
+    PORT_ASSERT(inList == TRUE);  /* MUST be in list */
+    /* remove by sliding down all following entries */
+    for (j = i + 1; j < allocArrayCount; j++)
+      allocArray[j-1] = allocArray[j];
+    allocArrayCount--;
+    allocArray[allocArrayCount] = NULL; /* clear out end of list */
+  }
+  
+  /* PortMemScan() : scan the array of allocated blocks, confirming that no
+   * allocated block has overwritten its guard words.
+   */
+  void PortMemScan(void)
+  {
+    int          i;
+    
+    PortCriticalSectionEnter(&PortMemoryCriticalSection);
+    
+    /* scan the allocated memory list */
+    for (i = 0; i < allocArrayCount; i++)
+    {
+      /* verify that guard words have not been corrupted */
+      void   *memPtr   = allocArray[i];
+      void         *allocPtr      = GUARD_ALLOC_PTR(memPtr);
+      unsigned int *requestedSizePtr  = GUARD_PTR_FIELD(allocPtr, GUARD_OFF_REQ_SIZE);
+      unsigned int *guardStartPtr     = GUARD_PTR_FIELD(allocPtr, GUARD_OFF_START);
+      unsigned int *guardEndPtr       = GUARD_PTR_FIELD(allocPtr, GUARD_OFF_END(GUARD_ALLOC_SIZE(*requestedSizePtr)));
+      
+      if ((*guardStartPtr) != GUARD_BEGIN)
+      {
+        PLogError("PortMemScan : corrupted start guard from block 0x%08x \n", (int)memPtr);
+      }
+      if ((*guardEndPtr)   != GUARD_END)
+      {
+        PLogError("PortMemScan : corrupted end guard from block 0x%08x \n", (int)memPtr);
+      }
+    }
+    
+    PortCriticalSectionLeave(&PortMemoryCriticalSection);
+  }
+#endif /* DBG_SCAN_GUARD_WORDS */
+  
+  /* Port Memory Functions ******************************************************/
+  
+  /* PortMemGetPoolSize() : return size of portable memory pool, or 0 if
+   * unknown.
+   */
+  int  PortMemGetPoolSize(void)
+  {
+    return MEM_MGR_GetPoolSize();
+  }
+  
+  /* PortMemSetPoolSize() : set size of portable memory pool on PSOS.
+   * This must be called before PortMemoryInit(), which is called by PortInit().
+   */
+  void PortMemSetPoolSize(size_t sizeInBytes)
+  {
+    MEM_MGR_SetPoolSize(sizeInBytes);
+  }
+  
+  /* PortMemoryInit() :
+   */
+  
+  int  PortMemoryInit(void)
+  {
+#if defined(USE_THREAD) && defined(USE_DINKUM_LIB_DIRECT)
+    if (createMutex(&memextMutex) == ESR_SUCCESS)
+#endif
+    {
+      if (!gMemoryInitted)
+      {
+        MEM_MGR_Init();
+        gMemoryInitted = TRUE;
+      }
+    }
+    
+    return gMemoryInitted;
+  }
+  
+  /* PortMemoryTerm() :
+   */
+  
+  void  PortMemoryTerm(void)
+  {
+    /* TODO: MEM_PSOS_BLOCK_SCHEME
+     * Figure out why free memory causes rn#0 is get messed up! */
+    MEM_MGR_Term();
+#if defined(USE_THREAD) && defined(USE_DINKUM_LIB_DIRECT)
+    deleteMutex(&memextMutex);
+#endif
+    gMemoryInitted = FALSE;
+  }
+  
+  /* PortNew() :
+   */
+  
+  void* PortNew(size_t sizeInBytes)
+  {
+    if (gMemoryInitted)
+    {
+      void *pMemory = NULL;
+      
+#if defined(USE_THREAD) && defined(USE_DINKUM_LIB_DIRECT)
+      lockMutex(&memextMutex);
+#endif
+      portNewCount++;
+      
+#ifdef DBG_GUARD_WORDS
+      sizeInBytes += GUARD_EXTRA; /* space for: requestedSize,guardStart,guardEnd */
+#endif
+      
+      pMemory = MEM_MGR_Allocate(sizeInBytes);
+      
+#ifdef DBG_GUARD_WORDS
+      if (NULL != pMemory)
+      {
+        /* at the beginning of the buffer, store the requested size and a guard word.
+         * Store another guard word at the end of the buffer.
+         */
+        /* set guard words at either end of allocated buffer; will be checked at delete time */
+        unsigned int * requestedSizePtr  = GUARD_PTR_FIELD(pMemory, GUARD_OFF_REQ_SIZE);
+        unsigned int * guardStartPtr     = GUARD_PTR_FIELD(pMemory, GUARD_OFF_START);
+        unsigned int * guardEndPtr       = GUARD_PTR_FIELD(pMemory, GUARD_OFF_END(sizeInBytes));
+        
+        *requestedSizePtr = sizeInBytes - GUARD_EXTRA;
+        *guardStartPtr    = GUARD_BEGIN;
+        *guardEndPtr      = GUARD_END;
+        pMemory     = (void *) GUARD_PTR_FIELD(pMemory, GUARD_OFF_PTR);
+        ADD_TO_ALLOC_LIST(pMemory);
+      }
+#endif /* DBG_GUARD_WORDS */
+#if defined(USE_THREAD) && defined(USE_DINKUM_LIB_DIRECT)
+      unlockMutex(&memextMutex);
+#endif
+      return pMemory;
+    }
+#ifdef PSOSIM
+    /* PSOSIM's license manager calls new() before PSOS is running */
+    else
+    {
+      return(malloc(sizeInBytes));
+    }
+#else  /* PSOSIM */
+    /* Memory allocator not initialized when request for memory was made */
+    passert(FALSE && "Call PortInit() before calling any portable functions\r\n");
+    return NULL;
+#endif /* PSOSIM */
+  }
+  
+  void PortDelete(void* objectPtr)
+  {
+#if defined(USE_THREAD) && defined(USE_DINKUM_LIB_DIRECT)
+    lockMutex(&memextMutex);
+#endif
+    portDeleteCount++;
+    
+#ifdef DBG_GUARD_WORDS
+    {
+      /* verify that guard words have not been corrupted */
+      void *allocPtr     = GUARD_ALLOC_PTR(objectPtr);
+      unsigned int *requestedSizePtr  = GUARD_PTR_FIELD(allocPtr, GUARD_OFF_REQ_SIZE);
+      unsigned int *guardStartPtr     = GUARD_PTR_FIELD(allocPtr, GUARD_OFF_START);
+      unsigned int *guardEndPtr       = GUARD_PTR_FIELD(allocPtr, GUARD_OFF_END(GUARD_ALLOC_SIZE(*requestedSizePtr)));
+      
+      passert((*guardStartPtr) == GUARD_BEGIN);
+      passert((*guardEndPtr)   == GUARD_END);
+      REMOVE_FROM_ALLOC_LIST(allocPtr);
+      objectPtr = allocPtr;
+    }
+#endif
+    
+    MEM_MGR_Free(objectPtr);
+#if defined(USE_THREAD) && defined(USE_DINKUM_LIB_DIRECT)
+    unlockMutex(&memextMutex);
+#endif
+  }
+  
+  void PortMemTrackDump(void)
+  {
+    MEM_MGR_Dump();
+  }
+  
+  /* PortGetMaxMemUsed() : return the maximum real memory allocated.
+   * There is another function of the same name in pmalloc.c, for tracking
+   * non-psos block memory. It uses #ifndef MEM_PSOS_BLOCK_SCHEME to enable.
+   */
+  int PortGetMaxMemUsed(void)
+  {
+    return MEM_MGR_GetMaxMemUsed();
+  }
+  
+  /* PortMemCntReset() : reset the New/Delete count.
+   * This is useful for checking that each new has a corresponding delete once
+   * the system gets into a steady state.
+   */
+  void PortMemCntReset()
+  {
+    portNewCount = 0;
+    portDeleteCount = 0;
+  }
+  
+  
+  /* PortMemGetCount() : return the accumulated new & delete counts */
+  void PortMemGetCount(int *newCount, int *deleteCount)
+  {
+    *newCount    = portNewCount;
+    *deleteCount = portDeleteCount;
+  }
+  
+#endif /* (==PORTABLE_PSOS_BLOCK_SCHEME_MEM_MGR) || (==PORTABLE_DINKUM_MEM_MGR) || (==PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) */
+  
+#ifdef __cplusplus
+}
+#endif
diff --git a/portable/src/pmemory_ext.h b/portable/src/pmemory_ext.h
new file mode 100644
index 0000000..15db654
--- /dev/null
+++ b/portable/src/pmemory_ext.h
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*
+ *  pmemory_ext.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _PORTMEMORY_EXT_H
+#define _PORTMEMORY_EXT_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  /* TODO - removed PortNewAndTrace and PortDeleteAndTrace * Ian 06-March-2002 */
+  
+  int  PortMemoryInit(void);
+  void PortMemoryTerm(void);
+  void* PortNew(size_t sizeInBytes);
+  void PortDelete(void* objectPtr);
+  void PortMemTrackDump(void);
+  int   PortGetMaxMemUsed(void);
+  int  PortMemGetPoolSize(void);
+  void PortMemSetPoolSize(size_t sizeInBytes);
+  
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _PORTMEMORY_H */
diff --git a/portable/src/pstream.c b/portable/src/pstream.c
new file mode 100644
index 0000000..e75d403
--- /dev/null
+++ b/portable/src/pstream.c
@@ -0,0 +1,990 @@
+/*---------------------------------------------------------------------------*
+ *  pstream.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <string.h>
+#include "passert.h"
+#include "pstdio.h"
+#include "pmemory.h"
+#include "plog.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#ifdef PFILE_VIRTUAL_SUPPORT
+
+#define FILETEXTMODE    0x00
+#define FILEBINARYMODE   0x01
+#define FILEREADMODE    0x00
+#define FILEWRITEMODE    0x02
+
+  /* Open a existed writable file (i.e., the file is not closed yet).
+     At some cases user knows the filename only but does not know the file handle (1),
+     the user could call fopen to open this file again with another file handle (2).
+     He/She could get all the information before the last fflush was called via file handle (1).
+   */
+#define FILEREOPENMODE 0x08
+  
+#define ISWRITEMODE(mode)  (((mode)&FILEWRITEMODE)  == FILEWRITEMODE)
+  
+#define ISBINARYMODE(mode) (((mode)&FILEBINARYMODE) == FILEBINARYMODE)
+#define ISREOPENMODE(mode) (((mode)&FILEREOPENMODE) == FILEREOPENMODE)
+  
+  /*
+    use a double link list to store the data of the writable file.
+    Each entry has 4k space (FILEBUFFERSIZE).
+  */
+#define FILEBUFFERSIZE 4096     /* 4k for each file buffer entry */
+  
+  typedef struct FileBufferFrame
+  {
+    unsigned char          *buffer;       /* do not use pointer here and set it the first */
+    size_t                  size;
+    size_t                index;                        /* nth buffer, from 0, 1, ... */
+    struct FileBufferFrame  *prev;
+    struct FileBufferFrame  *next;
+    BOOL                    bMalloc;        /* flag, if the buffer malloced here ? */
+  }
+  FileBufferFrame;
+  
+  FileRecord pWritableFileRecTable[] =
+    {
+      {"", 0, 0, 0, 3},
+      {"", 0, 0, 0, 3},
+      {"", 0, 0, 0, 3},
+      {"", 0, 0, 0, 3},
+      {"", 0, 0, 0, 3},
+      {"", 0, 0, 0, 3},
+      {"", 0, 0, 0, 3}
+    };
+  const nWritableFiles = sizeof(pWritableFileRecTable) / sizeof(pWritableFileRecTable[0]);
+  
+#ifdef WIN32
+  extern const FileRecord pFileRecTable[];
+  extern const unsigned char pFileStart0[];
+#endif
+  
+  const FileRecord *pReadOnlyFileRecTable = NULL;
+  const unsigned char *g_pFirstFile = NULL;
+  
+  void SetFileTable(VirtualFileTable *table)
+  {
+#ifdef WIN32
+    pReadOnlyFileRecTable = pFileRecTable;
+    g_pFirstFile = pFileStart0;
+#else
+    if (table)
+    {
+      pReadOnlyFileRecTable = table->pFileTable;
+      g_pFirstFile = table->pFirstFile;
+    }
+#endif
+  }
+  
+  /*
+    size: size of buffer.
+    buffer: is NULL, allocate here and set bMalloc as TRUE; otherwise use the external buffer
+  */
+  FileBufferFrame* CreateFileBufferFrame(size_t size, unsigned char *buffer)
+  {
+    FileBufferFrame *fb = NULL;
+    
+    /* create FileBufferFrame */
+    fb = (FileBufferFrame *)MALLOC(sizeof(FileBufferFrame), "FileBufferFrame");
+    if (fb)
+    {
+      fb->next = NULL;
+      fb->prev = NULL;
+      fb->index = 0;
+      fb->size = size;
+      fb->bMalloc = FALSE;
+      
+      if (buffer)
+        fb->buffer = buffer;
+      else
+      {
+        /* create one buffer frame */
+        if ((fb->buffer = (unsigned char *)MALLOC(size, "FileBufferFrame Buffer")) == NULL)
+        {
+          FREE(fb);
+          return NULL;
+        }
+        fb->bMalloc = TRUE;
+      }
+    }
+    return fb;
+  }
+  
+  /* free FileBufferFrames
+     header should be the header of the FileBufferFrame link list
+   */
+  void DeleteFileBuffers(FileBufferFrame *header)
+  {
+    FileBufferFrame *next, *curr;
+    
+    passert(header && header->prev == NULL);    /* delete from the beginning */
+    
+    curr = header;
+    do
+    {
+      next = curr->next;
+      if (curr->bMalloc)
+        FREE(curr->buffer);
+      FREE(curr);
+      curr = next;
+    }
+    while (next != NULL);
+  }
+  
+  void PortFileInit(void)
+  {
+    /* No gPortStdin, gPortStdout, and gPortStderr to initialize. */
+#ifdef WIN32
+    pReadOnlyFileRecTable = pFileRecTable;
+    g_pFirstFile = pFileStart0;
+#endif
+  }
+  
+  /* Assume that all files have at least one byte in them, that is length is > 0. */
+  PORT_FILE PortFopen(const char *filename, const char *mode)
+  {
+    char *pfn;
+    const unsigned char *start;
+    int size;
+    int text_mode;
+    int access_mode;
+    int m = 0;
+    PORT_FILE PortFile;
+    FileBufferFrame *curFrame;
+    size_t end;
+    
+    passert(filename);
+    passert(mode);
+    
+    if (pReadOnlyFileRecTable == NULL)
+    {
+      passert("File Table is not initialized!" == NULL);
+      return NULL;
+    }
+    
+    /* support read and write. */
+    if (mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'R') /* w means w+, attaching text */
+    {
+      char fname[80];
+      FileRecord *pCurRec;
+      
+      access_mode  = (mode[0] == 'r') ? FILEREADMODE   : FILEWRITEMODE;
+      
+      /* access mode: b/t */
+      if (mode[1] == '+')
+        text_mode = (mode[2] == 'b') ? FILEBINARYMODE : FILETEXTMODE;
+      else
+        text_mode = (mode[1] == 'b') ? FILEBINARYMODE : FILETEXTMODE;
+        
+      /* Remove the directory path from the filename. */
+      if ((pfn = strrchr(filename, '/')) != NULL || (pfn = strrchr(filename, '\\')) != NULL)
+        strcpy(fname, pfn + 1);
+      else
+        strcpy(fname, filename);
+        
+        
+      /* Locate the start of the file, by looking through the file record table. */
+      if (access_mode == FILEREADMODE)
+      {
+        pCurRec = (FileRecord *)pReadOnlyFileRecTable;
+        start = g_pFirstFile;
+      }
+      else
+      {
+        pCurRec = (FileRecord *)pWritableFileRecTable;
+      }
+      
+      while (pCurRec->size > 0 && strcmp(pCurRec->name, fname) != 0)
+      {
+        /* have to count the read-only file address in order to be best portable */
+        start += pCurRec->size;
+        pCurRec++;
+#ifndef NDEBUG
+        /* just for our internal test for read-only files.
+        if (pCurRec->start != NULL)
+        passert(start == pCurRec->start);
+        */
+#endif
+      }
+      
+      m = access_mode | text_mode;
+      /* Do not support reopen the writable file now. */
+      if (access_mode == FILEREADMODE)
+      {
+        if (pCurRec->size == 0)
+        {
+          return NULL;
+        }
+        
+        /* Found the file, record it's starting offset and length. */
+        end = pCurRec->end;
+        size = pCurRec->size;
+      }
+      /* writable file, open it the first time; could be text or binary */
+      else if (ISWRITEMODE(access_mode))
+      {
+        /* set the name and mode */
+        strcpy(pCurRec->name, fname);
+        pCurRec->mode = m;
+        
+        start = pCurRec->start;
+        passert(start == NULL);
+        end = size = FILEBUFFERSIZE;
+      }
+      else
+      {
+        /* File doesn't exist. */
+        return NULL;
+      }
+      pfn = pCurRec->name;
+    }
+    else
+    {
+      /* Unknown mode */
+      return NULL;
+    }
+    
+    /* Open file */
+    /* Create new file handle */
+    PortFile = (PORT_FILE)MALLOC(sizeof(PORT_FILE_HANDLE), "PortFile");
+    if (PortFile == NULL)
+    {
+      return NULL;
+    }
+    
+    /* this mode is not tested yet */
+    if (ISREOPENMODE(m))
+    {
+      PortFile->startFrame = (FileBufferFrame *)start;
+    }
+    else
+    {
+      PortFile->startFrame = CreateFileBufferFrame(size, (unsigned char *)start);
+      if (ISWRITEMODE(m))
+      {
+        start = (const unsigned char *)PortFile->startFrame;
+      }
+    }
+    
+    if (PortFile->startFrame == NULL)
+    {
+      FREE(PortFile);
+      return NULL;
+    }
+    
+    PortFile->endFrame = PortFile->curFrame = PortFile->startFrame;
+    
+    /* Mark that this file handle is for flash memory */
+    PortFile->filename = pfn;
+    PortFile->curPos = PortFile->curFrame->buffer;
+    PortFile->endPos = PortFile->curPos + end;
+    
+    /* set the PortFile->endPos */
+    curFrame = PortFile->curFrame;
+    while (end > 0)
+    {
+      if (end > curFrame->size)
+      {
+        curFrame = curFrame->next;
+        passert(end > curFrame->size);
+        end -= curFrame->size;
+        passert(curFrame);
+      }
+      else
+      {
+        /* only reopen the writable file comes here */
+        PortFile->endPos = curFrame->buffer + end;
+        break;
+      }
+    }
+    
+    PortFile->eof = 0; /* File must have at least one byte in it. */
+    PortFile->size =  size;
+    PortFile->mode =  m;
+    
+    return PortFile;
+  }
+  
+  int PortFclose(PORT_FILE PortFile)
+  {
+    passert(PortFile);
+    
+    /* for reopen mode, do not delete the FileBufferFrame. Delete it by who created it */
+    if (ISWRITEMODE(PortFile->mode) && !ISREOPENMODE(PortFile->mode))  /* writable file */
+    {
+      int i = 0;
+      FileRecord *pCurRec = (FileRecord *)pWritableFileRecTable;
+      
+      /* find the file record in memory */
+      for (i = 0; i < nWritableFiles; i++)
+      {
+        if (PortFile->size > 0 &&
+            PortFile->filename[0] != '\0' &&
+            strcmp(pCurRec->name, PortFile->filename) == 0
+           )
+        {
+          /* The parameter SREC.Recognizer.osi_log_level in par file control the output
+            # BIT 0 -> BASIC logging
+            # BIT 1 -> AUDIO waveform logging
+            # BIT 2 -> ADD WORD logging
+            # e.g. value is 3 = BASIC+AUDIO logging, no ADDWORD
+            SREC.Recognizer.osi_log_level = 7;
+          
+            Do not control here       
+          */
+          /*
+          SaveFileToDisk(PortFile);
+          */
+          
+          pCurRec->name[0] = '\0';
+          pCurRec->start = NULL;
+          pCurRec->end = 0;
+          pCurRec->size = 0;
+          
+          break;
+        }
+        pCurRec++;
+      }
+    }
+    
+    DeleteFileBuffers(PortFile->startFrame);
+    FREE(PortFile);
+    return 0;
+  }
+  
+  /*
+   * Returns the number of items read
+   */
+  size_t PortFread(void *buffer, size_t size, size_t count, PORT_FILE PortFile)
+  {
+    unsigned char *bufferPtr = (unsigned char *)buffer;
+    int cbRemain = size * count;
+    int cbAvail, minSize;
+    FileBufferFrame *curFrame = PortFile->curFrame;
+    
+    passert(buffer);
+    passert(PortFile);
+    
+    if (PortFile->eof == 1)
+    {
+      return 0;
+    }
+    
+    while (cbRemain > 0)
+    {
+      if (PortFile->endPos == PortFile->curPos)  /* end of file */
+        break;
+        
+      if (PortFile->curPos == curFrame->buffer + curFrame->size) /* end of this frame */
+      {
+        /* go to next frame */
+        curFrame = PortFile->curFrame = curFrame->next;
+        PortFile->curPos = curFrame->buffer;
+      }
+      
+      if (curFrame == PortFile->endFrame)  /* last frame */
+        cbAvail = PortFile->endPos - PortFile->curPos;
+      else
+        cbAvail = curFrame->size - (PortFile->curPos - curFrame->buffer);
+        
+      minSize = cbRemain < cbAvail ? cbRemain : cbAvail;
+      passert(minSize >= 0);
+      
+      cbRemain -= minSize;
+      while (minSize-- > 0)
+        *bufferPtr++ = *PortFile->curPos++;
+    }
+    
+    if (PortFile->curPos == PortFile->endPos)
+    {
+      PortFile->eof = 1;
+    }
+    /*
+    #ifdef __BIG_ENDIAN
+     if (!bNativeEnding)
+     {
+      swap_byte_order((char *)buffer, count, size);
+     }
+    #endif
+    */
+    return count - cbRemain / size;
+  }
+  
+  /*
+   * Returns the number of items written
+   */
+  size_t PortFwrite(const void *data, size_t size, size_t count, PORT_FILE PortFile)
+  {
+    int cbWrite = size * count;
+    int cbAvail, minSize;
+    unsigned char *buffer = (unsigned char *)data;
+    FileBufferFrame *curFrame;
+    
+    if (PortFile == NULL)
+      return 0;
+      
+    curFrame = PortFile->curFrame;
+    
+    /* write data until the end of the internal buffer */
+    if (PortFile->eof == 1)
+    {
+      /* TODO: should return 0, but it will cause infinite loop */
+      return 0;
+    }
+    
+    /* why sub 1 ? */
+    while (cbWrite > 0)
+    {
+      if (PortFile->curPos == curFrame->buffer + curFrame->size) /* end of this frame */
+      {
+        if (curFrame->next == NULL)
+        {
+          /* assign a new space */
+          FileBufferFrame *nextFrame = CreateFileBufferFrame(FILEBUFFERSIZE, NULL);
+          if (nextFrame)
+          {
+            curFrame->next = nextFrame;
+            nextFrame->prev = curFrame;
+            nextFrame->index = curFrame->index + 1;
+            
+            curFrame = PortFile->curFrame = nextFrame;
+            PortFile->endFrame = nextFrame;
+            PortFile->curPos = PortFile->endPos = nextFrame->buffer;
+            
+            PortFile->size += FILEBUFFERSIZE;
+          }
+          else
+          {
+            return count -cbWrite / size;
+          }
+        }
+        else
+          curFrame = curFrame->next;
+      }
+      
+      /* available space in current frame */
+      cbAvail = curFrame->size - (PortFile->curPos - curFrame->buffer);
+      minSize = cbWrite < cbAvail ? cbWrite : cbAvail;
+      
+      memcpy((char *)PortFile->curPos, buffer, minSize);
+      buffer += minSize;
+      PortFile->curPos += minSize;
+      /* in case the write is not adding to the end */
+      if (curFrame == PortFile->endFrame && PortFile->endPos < PortFile->curPos)
+        PortFile->endPos = PortFile->curPos;
+      cbWrite -= minSize;
+    }
+    
+    return count;
+  }
+  
+  /*
+   * Returns 0 on success, non-zero on failure
+   */
+  int PortFseek(PORT_FILE PortFile, long offset, int origin)
+  {
+    int retval = 0;
+    int cbAvail, minSize;
+    FileBufferFrame *curFrame;
+    
+    passert(PortFile);
+    
+    /* Clear eof flag */
+    PortFile->eof = 0;
+    
+    switch (origin)
+    {
+      case SEEK_CUR:
+        break;
+      case SEEK_END:
+        PortFile->curFrame = PortFile->endFrame;
+        PortFile->curPos = PortFile->endPos;
+        break;
+      case SEEK_SET:
+        PortFile->curFrame = PortFile->startFrame;
+        PortFile->curPos = PortFile->startFrame->buffer;
+        break;
+      default:
+        retval = 0; /* Error, unknown origin type */
+        break;
+    }
+    
+    curFrame = PortFile->curFrame;
+    
+    while (offset != 0)
+    {
+      if (offset > 0)
+      {
+        if (PortFile->endPos <= PortFile->curPos)  /* end of file */
+          break;
+          
+        if (PortFile->curPos == curFrame->buffer + curFrame->size) /* end of this frame */
+        {
+          /* go to next frame */
+          curFrame = curFrame->next;
+          if (curFrame == NULL)
+            break;
+          PortFile->curFrame = curFrame->next;
+          PortFile->curPos = curFrame->buffer;
+        }
+        if (curFrame == PortFile->endFrame)  /* last frame */
+          cbAvail = PortFile->endPos - PortFile->curPos;
+        else
+          cbAvail = curFrame->size - (PortFile->curPos - curFrame->buffer);
+          
+        minSize = offset < cbAvail ? offset : cbAvail;
+        
+        PortFile->curPos += minSize;
+        offset -= minSize;
+      }
+      else
+      {
+        if (PortFile->startFrame->buffer == PortFile->curPos)  /* start of file */
+          break;
+          
+        if (PortFile->curPos <= curFrame->buffer) /* start of this frame */
+        {
+          /* go to next frame */
+          curFrame = curFrame->next;
+          if (curFrame == NULL)
+            break;
+          PortFile->curFrame = curFrame;
+          PortFile->curPos = curFrame->buffer + curFrame->size;
+        }
+        cbAvail = PortFile->curPos - curFrame->buffer;
+        
+        minSize = -offset < cbAvail ? -offset : cbAvail;
+        
+        PortFile->curPos -= minSize;
+        offset += minSize;
+      }
+    }
+    return retval;
+  }
+  
+  /*
+   * Returns current file position
+   */
+  long PortFtell(PORT_FILE PortFile)
+  {
+    int size;
+    FileBufferFrame *curFrame = PortFile->curFrame;
+    
+    passert(PortFile);
+    
+    /* current Frame size */
+    size = PortFile->curPos - curFrame->buffer;
+    
+    /* previous frame size */
+    while (curFrame = curFrame->prev)
+      size += curFrame->size;
+      
+    return size;
+  }
+  
+  int PortVfprintf(PORT_FILE PortFile, const char *format, va_list argptr)
+  {
+    char message[2*2048] = "";
+    
+    /* Print formatted message to buffer */
+    vsprintf(message, format, argptr);
+    
+    if (PortFile == NULL)
+    {
+      /* TODO: HECK to screen */
+#ifndef NDEBUG
+      printf(message);
+#endif
+      return 0;
+    }
+    
+    passert(strlen(message) < 2*2048);
+    /* TO DO, seems at case fprintf(pf, "whatever"), message is empty! */
+    if (strlen(message) == 0)
+      return 0;
+    else
+      return PortFwrite(message, sizeof(char), strlen(message), PortFile);
+  }
+  
+  /*
+   * Returns current file position
+   */
+  int PortFprintf(PORT_FILE PortFile, const char* format, ...)
+  {
+    va_list log_va_list;
+    int ret = 0;
+    
+    /* Start variable argument list */
+    va_start(log_va_list, format);
+    
+    /* Print formatted message to buffer */
+    ret = PortVfprintf(PortFile, format, log_va_list);
+    
+    /* End variable argument list */
+    va_end(log_va_list);
+    
+    return ret;
+  }
+  
+  /*
+   * Returns string or NULL if error
+   */
+  char *PortFgets(char *string, int n, PORT_FILE PortFile)
+  {
+    int cbToRead = n - 1;
+    BOOL done = FALSE;
+    char *retString = NULL;
+    int i;
+    
+    passert(string);
+    passert(n);
+    passert(PortFile);
+    
+    
+    if (PortFile->eof == 1)
+    {
+      return NULL;
+    }
+    
+    
+    /* Search for \n only! */
+    for (i = 0; i < cbToRead && !done; i++)
+    {
+      if (PortFile->curPos >= PortFile->endPos)
+      {
+        PortFile->eof = 1;
+        done = TRUE;
+        break;
+      }
+      else if (*PortFile->curPos == '\n')
+      {
+        if (retString == NULL)
+        {
+          retString = string;
+        }
+        retString[i] = '\n';
+        PortFile->curPos++;
+        done = TRUE;
+      }
+      else
+      {
+        if (retString == NULL)
+        {
+          retString = string;
+        }
+        retString[i] = *PortFile->curPos++;
+      }
+    }
+    if (retString != NULL)
+    {
+      retString[i] = '\0';
+    }
+    return retString;
+  }
+  
+  /*
+   * Returns string or NULL if error
+   */
+  int PortFflush(PORT_FILE PortFile)
+  {
+    if (PortFile == NULL)
+    {
+      return -1;
+    }
+    
+    
+    /* call fflush before reopen a writable file */
+    if (ISWRITEMODE(PortFile->mode))  /* writable file */
+    {
+      FileRecord *pCurRec = (FileRecord *)pWritableFileRecTable;
+      
+      /* find the file record in memory */
+      do
+      {
+        if (strcmp(pCurRec->name, PortFile->filename) == 0)
+        {
+          /* assgin it as startFrame, so others could get information when reopen it */
+          pCurRec->start = (unsigned char *)PortFile->startFrame;
+          pCurRec->end = PortFile->size - PortFile->endFrame->size +
+                         (PortFile->endPos - PortFile->endFrame->buffer);
+          pCurRec->size = PortFile->size;
+          pCurRec->mode = PortFile->mode;
+          
+          break;
+        }
+        pCurRec++;
+      }
+      while (pCurRec->size > 0);
+    }
+    return 0;
+  }
+  
+  
+  int PortFeof(PORT_FILE PortFile)
+  {
+    passert(PortFile);
+    
+    return PortFile->eof;
+  }
+  
+  /*
+   * Returns character or EOF
+   */
+  int PortFgetc(PORT_FILE PortFile)
+  {
+    int c;
+    
+    passert(PortFile);
+    
+    if (PortFile->eof == 1)
+    {
+      return EOF;
+    }
+    else
+    {
+      c = (int) * PortFile->curPos++;
+      
+      if (PortFile->curPos >= PortFile->endPos)
+      {
+        PortFile->eof = 1;
+      }
+    }
+    return c;
+  }
+  
+  /*
+   * Returns 0 if no error
+   */
+  int PortFerror(PORT_FILE PortFile)
+  {
+    passert(PortFile);
+    
+    return 0;
+  }
+  
+  void PortClearerr(PORT_FILE PortFile)
+  {
+    PortFile->eof = 0;
+  }
+  
+  /*
+   * Returns current file position
+   */
+  int PortFscanf(PORT_FILE PortFile, const char* format, ...)
+  {
+    passert(PortFile);
+    
+    (void)format;
+    
+    /* Not supported. */
+    passert(FALSE);
+    return 0;
+  }
+  
+  void PortRewind(PORT_FILE PortFile)
+  {
+    passert(PortFile);
+    
+    PortFile->curFrame = PortFile->startFrame;
+    PortFile->curPos = PortFile->startFrame->buffer;
+    
+    PortFile->eof = 0;
+  }
+  
+  /*
+   * NULL if it fails, otherwise a valid file pointer
+   */
+  PORT_FILE PortFreopen(const char *path, const char *mode, PORT_FILE PortFile)
+  {
+    /* does not support reopen writable file */
+    if (PortFclose(PortFile) == 0)
+    {
+      PortFile = PortFopen(path, mode);
+      return PortFile;
+    }
+    return NULL;
+  }
+  
+  char* PortGetcwd(char *buffer, int maxlen)
+  {
+    if (maxlen >= 1)
+      buffer[0] = '\0';
+    else
+      return NULL;
+      
+    return buffer;
+  }
+  
+  int PortMkdir(const char *dirname)
+  {
+    return 0;
+  }
+  
+#ifdef XANAVI_PROJECT
+  
+  int PortSaveFileToDisk(PORT_FILE PortFile, const char *path, const char *fname)
+  {
+    /* ### start mod */
+    
+    FILE *fp = NULL; /* real file handle */
+    char fullfname[256], data[256];
+    char mode[3];
+    const char *file;
+    int size;
+    
+    if (fname == NULL)
+      file = PortFile->filename;
+    else
+      file = fname;
+      
+    if (path == NULL)
+    {
+      PLogMessage("trying to save file %s...\n", file);
+      sprintf(fullfname, "%s", file);
+    }
+    else
+    {
+      PLogMessage("trying to save file %s to %s...\n", file, path);
+      sprintf(fullfname, "%s/%s", path, file);
+    }
+    
+    if (ISBINARYMODE(PortFile->mode))  /* binary file, the wav file */
+    {
+      sprintf(mode, "wb");
+    }
+    else
+    {
+      sprintf(mode, "w");
+    }
+    
+    if ((fp = fopen(fullfname, mode)) != NULL)
+    {
+      PortRewind(PortFile);
+      
+      while ((size = PortFread(data, 1, 256, PortFile)) > 0)
+      {
+        fwrite(data, 1, size, fp);
+      }
+      fclose(fp);
+    }
+    else
+    {
+      PLogError(L("Error to fopen %s with mode %s\n\n"), fullfname, mode);
+      return -1;
+    }
+    return 0;
+  }
+  
+  int PortLoadFileFromDisk(PORT_FILE PortFile, const char *filename, const char *mode)
+  {
+    FILE *fp;
+    int size;
+    char data[256];
+    
+    passert(PortFile);
+    
+    if (filename == NULL)
+      filename = PortFile->filename;
+      
+    if (mode == NULL)
+    {
+      data[0] = 'r';
+      if (ISBINARYMODE(PortFile->mode))
+        data[1] = 'b';
+      else
+        data[1] = '\0';
+      data[2] = '\0';
+      mode = data;
+    }
+    
+    fp = fopen(filename, mode);
+    
+    if (fp == NULL)   /* do not have the file, it is fine */
+      return 0;
+      
+    while ((size = fread(data, 1, 256, fp)) > 0)
+      PortFwrite(data, 1, size, PortFile);
+      
+    fclose(fp);
+    /* go to the beginning of the file */
+    PortFseek(PortFile, 0, SEEK_SET);
+    
+    return 0;
+  }
+  
+  int XanaviSaveFileToDisk(PORT_FILE PortFile)
+  {
+    const char *tail;
+    int lenny;
+    
+    passert(PortFile);
+    
+    /* UG has to be 8.3 format! */
+    lenny = strlen(PortFile->filename);
+    if (lenny > 10)
+      tail = PortFile->filename + (lenny - 11);
+    else
+      tail = PortFile->filename;
+    /* printf( "8.3 filename is %s.\n", tail ); */
+    
+    /* the 8.3 format has truncated the path in PortFile->filename,
+       should get the direcotry from par file
+       cmdline.DataCaptureDirectory                  = /CFC
+       TODO: here use /CFC directly to save time
+    */
+    return PortSaveFileToDisk(PortFile, "/CFC", tail);
+  }
+  
+  int XanaviLoadFileFromDisk(PORT_FILE PortFile)
+  {
+    char fname[256];
+    char mode[3];
+    
+    passert(PortFile);
+    
+    sprintf(fname, "/CFC/%s", PortFile->filename);
+    
+    mode[0] = 'r';
+    if (ISBINARYMODE(PortFile->mode))
+      mode[1] = 'b';
+    else
+      mode[1] = '\0';
+      
+    mode[2] = '\0';
+    
+    return PortLoadFileFromDisk(PortFile, fname, mode);
+  }
+  
+#endif
+#endif /* STATIC_FILE_SYSTME */
+  
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/portable/src/ptimer.c b/portable/src/ptimer.c
new file mode 100644
index 0000000..8cb72b9
--- /dev/null
+++ b/portable/src/ptimer.c
@@ -0,0 +1,264 @@
+/*---------------------------------------------------------------------------*
+ *  ptimer.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "pmemory.h"
+#include "ptimer.h"
+#include "pmutex.h"
+
+#ifdef _WIN32
+
+/*
+  Note that this implementation assumes that QueryPerformanceCounter is
+  available (requires NT 3.1 and above) and that 64 bit arithmetic is
+  available (requires VC)
+*/
+
+struct PTimer_t
+{
+  LARGE_INTEGER PerformanceFreq;
+  LARGE_INTEGER RefTime;
+  LARGE_INTEGER elapsed;
+};
+
+
+
+/**
+ * Creates a new timer object.
+ **/
+ESR_ReturnCode PTimerCreate(PTimer **timer)
+{
+  PTimer *tmp = NULL;
+  
+  if (timer == NULL)
+    return ESR_INVALID_ARGUMENT;
+  tmp = NEW(PTimer, "PTimer");
+  if (tmp == NULL)
+    return ESR_OUT_OF_MEMORY;
+    
+  if (QueryPerformanceFrequency(&tmp->PerformanceFreq) == 0)
+  {
+    FREE(tmp);
+    return ESR_NOT_SUPPORTED;
+  }
+  tmp->PerformanceFreq.QuadPart /= 1000;
+  
+  tmp->RefTime.QuadPart = 0;
+  tmp->elapsed.QuadPart = 0;
+  *timer = tmp;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PTimerDestroy(PTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  FREE(timer);
+  return ESR_SUCCESS;
+}
+
+/**
+ * Starts the timer. This sets the reference time from which all new elapsed
+ * time are computed.  This does not reset the elapsed time to 0.  This is
+ * useful to pause the timer.
+ **/
+ESR_ReturnCode PTimerStart(PTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  return (QueryPerformanceCounter(&timer->RefTime) ?
+          ESR_SUCCESS :
+          ESR_NOT_SUPPORTED);
+}
+
+/**
+ * Stops the timer.
+ **/
+ESR_ReturnCode PTimerStop(PTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  if (timer->RefTime.QuadPart != 0)
+  {
+    LARGE_INTEGER now;
+    if (!QueryPerformanceCounter(&now)) return ESR_NOT_SUPPORTED;
+    timer->elapsed.QuadPart += now.QuadPart - timer->RefTime.QuadPart;
+    timer->RefTime.QuadPart = 0;
+  }
+  return ESR_SUCCESS;
+}
+
+/**
+ * Returns the timer elapsed time.  If the Timer is in the stopped state,
+ * successive calls to getElapsed() will always return the same value.  If
+ * the Timer is in the started state, successive calls will return the
+ * elapsed time since the last time PTimerStart() was called.
+ */
+ESR_ReturnCode PTimerGetElapsed(PTimer *timer, asr_uint32_t* elapsed)
+{
+  if (timer == NULL || elapsed == NULL)
+    return ESR_INVALID_ARGUMENT;
+    
+  if (timer->RefTime.QuadPart != 0)
+  {
+    LARGE_INTEGER now;
+    if (!QueryPerformanceCounter(&now)) return ESR_NOT_SUPPORTED;
+    *elapsed = (asr_uint32_t) ((timer->elapsed.QuadPart + (now.QuadPart - timer->RefTime.QuadPart))
+                           / timer->PerformanceFreq.QuadPart);
+  }
+  else
+    *elapsed = (asr_uint32_t) (timer->elapsed.QuadPart / timer->PerformanceFreq.QuadPart);
+
+  return ESR_SUCCESS;
+}
+
+
+/**
+ * Resets the elapsed time to 0 and resets the reference time of the Timer.
+ * This effectively reset the timer in the same state it was right after creation.
+ **/
+ESR_ReturnCode PTimerReset(PTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  timer->RefTime.QuadPart = 0;
+  timer->elapsed.QuadPart = 0;
+  return ESR_SUCCESS;
+}
+
+#elif defined(POSIX)
+#include "ptrd.h"
+/*
+POSIX has a timer
+*/
+/* Clocks and timers: clock_settime, clock_gettime, clock_getres, timer_xxx and nanosleep */
+#ifndef _POSIX_TIMERS
+#ifndef __vxworks /* __vxworks does not define it! */
+#error "Timer is not defined!"
+#endif /* __vxworks */
+#endif /* _POSIX_TIMERS */
+
+#define TIMER_MAX_VAL 10000
+
+struct PTimer_t
+{
+  timer_t  timer;
+  asr_uint32_t elapsed;
+};
+
+/**
+* Creates a new timer object.
+**/
+ESR_ReturnCode PTimerCreate(PTimer **timer)
+{
+  PTimer *tmp = NULL;
+
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  tmp = NEW(PTimer, "PTimer");
+  if (tmp == NULL) return ESR_OUT_OF_MEMORY;
+
+  *timer = tmp;
+  if (timer_create(CLOCK_REALTIME, NULL, &(tmp->timer)) < 0)
+    return ESR_NOT_SUPPORTED;
+
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode PTimerDestroy(PTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  timer_delete(timer->timer);
+  FREE(timer);
+
+  return ESR_SUCCESS;
+}
+
+/**
+* Starts the timer. This sets the reference time from which all new elapsed
+* time are computed.  This does not reset the elapsed time to 0.  This is
+* useful to pause the timer.
+**/
+ESR_ReturnCode PTimerStart(PTimer *timer)
+{
+  struct itimerspec expire_time;
+
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+
+  expire_time.it_value.tv_sec = TIMER_MAX_VAL; /* set a large time for the timer */
+  expire_time.it_value.tv_nsec = 0;
+  return (timer_settime(timer->timer, 0, &expire_time, NULL) == 0 ?
+          ESR_SUCCESS :
+          ESR_NOT_SUPPORTED);
+}
+
+/**
+* Stops the timer.
+**/
+ESR_ReturnCode PTimerStop(PTimer *timer)
+{
+  struct itimerspec remaining;
+
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+
+  if (timer_gettime(timer->timer, &remaining) != 0) return ESR_NOT_SUPPORTED;
+#if defined(__vxworks)
+  timer_cancel(timer->timer);
+#endif
+  timer->elapsed = (asr_uint32_t) ((TIMER_MAX_VAL - remaining.it_value.tv_sec) * SECOND2MSECOND
+						- remaining.it_value.tv_nsec / MSECOND2NSECOND);
+
+  return ESR_SUCCESS;
+}
+
+/**
+* Returns the timer elapsed time.  If the Timer is in the stopped state,
+* successive calls to getElapsed() will always return the same value.  If
+* the Timer is in the started state, successive calls will return the
+* elapsed time since the last time PTimerStart() was called.
+*/
+ESR_ReturnCode PTimerGetElapsed(PTimer *timer, asr_uint32_t* elapsed)
+{
+  if (timer == NULL || elapsed == NULL)
+    return ESR_INVALID_ARGUMENT;
+
+  if (timer->elapsed == 0) /* stop is not called */
+  {
+    struct itimerspec remaining;
+    if (timer_gettime(timer->timer, &remaining) != 0) return ESR_NOT_SUPPORTED;
+    *elapsed = (asr_uint32_t) ((TIMER_MAX_VAL - remaining.it_value.tv_sec) * SECOND2MSECOND
+						- remaining.it_value.tv_nsec / MSECOND2NSECOND);
+  }
+  else
+    *elapsed = timer->elapsed;
+
+  return ESR_SUCCESS;
+}
+
+
+/**
+* Resets the elapsed time to 0 and resets the reference time of the Timer.
+* This effectively reset the timer in the same state it was right after creation.
+**/
+ESR_ReturnCode PTimerReset(PTimer *timer)
+{
+  if (timer == NULL) return ESR_INVALID_ARGUMENT;
+  timer->elapsed = 0;
+  return ESR_SUCCESS;
+}
+
+#else
+#error "Ptimer not implemented for this platform."
+#endif
diff --git a/portable/src/ptimestamp.c b/portable/src/ptimestamp.c
new file mode 100644
index 0000000..6211c31
--- /dev/null
+++ b/portable/src/ptimestamp.c
@@ -0,0 +1,56 @@
+/*---------------------------------------------------------------------------*
+ *  ptimestamp.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ptimestamp.h"
+#include "pmutex.h"
+
+#ifdef _WIN32
+#include "sys/timeb.h"
+#endif
+
+void PTimeStampSet(PTimeStamp *timestamp)
+{
+	
+#ifdef DISABLE_TIMESTAMPS
+  timestamp->secs  = 0;
+  timestamp->msecs = 0;
+#else
+	
+#ifdef _WIN32
+  struct _timeb now;
+  
+  _ftime(&now);
+  timestamp->secs = now.time;
+  timestamp->msecs = now.millitm;
+#elif defined(POSIX)
+  struct timespec now;
+  clock_gettime(CLOCK_REALTIME, &now);
+  timestamp->secs = now.tv_sec;
+  timestamp->msecs = now.tv_nsec / MSECOND2NSECOND;
+#else
+#error "PTimeStampSet not defined for this platform."
+#endif
+
+#endif
+}
+
+PINLINE int PTimeStampDiff(const PTimeStamp *a, const PTimeStamp *b)
+{
+  return (a->secs - b->secs) * 1000 + a->msecs - b->msecs;
+}
diff --git a/portable/src/ptypes.c b/portable/src/ptypes.c
new file mode 100644
index 0000000..095a625
--- /dev/null
+++ b/portable/src/ptypes.c
@@ -0,0 +1,38 @@
+/*---------------------------------------------------------------------------*
+ *  ptypes.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ptypes.h"
+
+PINLINE ESR_BOOL isNumber(const LCHAR* str)
+{
+  if (!str || !*str)
+    return ESR_FALSE;
+    
+  /* ignore minus sign */
+  if (*str == L('-'))
+    ++str;
+    
+  while (*str)
+  {
+    if (!isdigit(*str))
+      return ESR_FALSE;
+    ++str;
+  }
+  return ESR_TRUE;
+}
diff --git a/seti/Android.mk b/seti/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/seti/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/seti/setiUtils/include/platform_utils.h b/seti/setiUtils/include/platform_utils.h
new file mode 100644
index 0000000..69012a1
--- /dev/null
+++ b/seti/setiUtils/include/platform_utils.h
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------------*
+ *  platform_utils.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _PLATFORM_UTILS_H_
+#define _PLATFORM_UTILS_H_
+
+/* 
+  safe_strtok()
+  Use this in place of regular strtok. which is dangerous because it modifies
+  a global variable.  This function does not.
+  
+  Returns the position in NULL terminated input_str where seps are found, 
+  and the length of the token
+  Seps contains a NULL terminated string of separators
+  Returns NULL if error
+  
+  If no more tokens left, token_len is 0 
+*/
+char * safe_strtok(char *input_str, char *seps, int * token_len);
+
+/* C54 and WinCE does not have strdup */
+#if defined TI_DSP || defined UNDER_CE || defined __CC_ARM
+char * strdup(char *in_string);
+#endif
+
+#endif /* _PLATFORM_UTILS_H_ */
diff --git a/seti/setiUtils/include/port_fileio.h b/seti/setiUtils/include/port_fileio.h
new file mode 100644
index 0000000..5960c3c
--- /dev/null
+++ b/seti/setiUtils/include/port_fileio.h
@@ -0,0 +1,45 @@
+/*---------------------------------------------------------------------------*
+ *  port_fileio.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _PORT_FILEIO_H__
+#define _PORT_FILEIO_H__
+
+#ifdef TI_DSP
+#include <dsp_file.h>
+#define PORT_FILE DSP_FILE
+#define PORT_FOPEN dsp_fopen
+#define PORT_FCLOSE dsp_fclose
+#define PORT_FREAD_CHAR dsp_fread_char
+#define PORT_FREAD_INT16 dsp_fread_int16
+#define PORT_FGETS dsp_fgets
+#else
+#define uint16 int
+#include <stdio.h>
+#include "PFile.h"
+#define PORT_FILE PFile 
+#define PORT_FOPEN pfopen
+#define PORT_FCLOSE pfclose
+#define PORT_FREAD_CHAR pfread
+#define PORT_FREAD_INT16 pfread 
+#define PORT_FGETS pfgets
+#endif
+
+#endif /* _PORT_FILEIO_H__ */
diff --git a/seti/setiUtils/src/platform_utils.c b/seti/setiUtils/src/platform_utils.c
new file mode 100644
index 0000000..b26c332
--- /dev/null
+++ b/seti/setiUtils/src/platform_utils.c
@@ -0,0 +1,132 @@
+/*---------------------------------------------------------------------------*
+ *  platform_utils.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef NO_STDERR  
+#include <stdio.h>
+#endif
+
+#include <string.h>
+#include "pmemory.h"
+#include "platform_utils.h"
+
+
+/* 
+  safe_strtok()
+  Use this in place of regular strtok. which is dangerous because it modifies
+  a global variable.  This function does not.
+  
+  Returns the position in NULL terminated input_str where seps are found, 
+  and the length of the token
+  Seps contains a NULL terminated string of separators
+  Returns NULL if error
+  
+  If no more tokens left, token_len is 0 
+*/
+
+char * safe_strtok(char *input_str, char *seps, int * token_len)
+{
+  int i, j, k, n, m;
+  int sep_found;
+  char *pos;
+
+  m = strlen(seps);
+
+  if (!m || !input_str)
+    return NULL;
+
+  n = strlen(input_str);
+  pos = input_str;  
+
+  for (i=0, sep_found = 0; i<n; i++) {
+    for (j=0; j<m; j++) {
+      if (*pos == seps[j]) {
+        /* found seperator */
+        sep_found++;
+        break;
+      }
+    }
+    if (sep_found == i) {
+      /* found first non separator */ 
+      break;      
+    }
+    pos++;
+  }
+
+  *token_len = 0;
+
+  /* now find ending position of token */
+  for (k=i; k<n; k++) {
+    for (j=0; j<m; j++) {
+      if (pos[k-i] == seps[j]) {
+        /* first occurance equals separator*/
+        return pos;
+      }
+    }
+    (*token_len)++;
+  }
+
+  /* no more tokens */
+  return pos;
+}
+
+
+/* C54 and WinCE does not have strdup or stricmp */
+#if defined TI_DSP || defined UNDER_CE 
+int stricmp(const char *str1, const char *str2)
+{
+	if(str1 == NULL || str2 == NULL){
+#ifndef NO_STDERR      
+		PLogError(L("stricmp: str1 or str2 is NULL\n"));
+#endif		
+        exit (1);
+	}
+
+	for (; *str1 != '\0' && *str2 != '\0' && tolower(*str1) == tolower(*str2);
+		str1++, str2++)
+		;
+	if (*str1 == '\0')
+		return *str2 == '\0'? 0 : -1;
+	else if (*str2 == '\0')
+		return 1;
+	else
+		return tolower(*str1) < tolower(*str2)? -1 : 1;
+}
+
+char * strdup(char *in_string)
+{
+	char * new_string = NULL;	
+
+	if(in_string == NULL){
+#ifndef NO_STDERR
+		PLogError(L("strdup: input string is NULL\n"));
+#endif		
+        return NULL;
+	}
+
+	new_string = (char *)MALLOC(sizeof(char)*(strlen(in_string)+1), MTAG);
+	if(!new_string)
+		return NULL;
+	
+	strcpy(new_string, in_string);	
+	return new_string;	
+}
+#endif
+
diff --git a/seti/sltsEngine/Android.mk b/seti/sltsEngine/Android.mk
new file mode 100644
index 0000000..64e6c4c
--- /dev/null
+++ b/seti/sltsEngine/Android.mk
@@ -0,0 +1,59 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	../setiUtils/src/platform_utils.c \
+	src/linklist_impl.c \
+	src/run_seq_lts.c \
+	src/SWIslts.c \
+
+common_C_INCLUDES := \
+	$(LOCAL_PATH)/include \
+	$(LOCAL_PATH)/../setiUtils/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+
+common_TARGET:= libSR_G2P
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/seti/sltsEngine/include/CSWIslts.h b/seti/sltsEngine/include/CSWIslts.h
new file mode 100644
index 0000000..2bf1a96
--- /dev/null
+++ b/seti/sltsEngine/include/CSWIslts.h
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------------*
+ *  CSWIslts.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _CSWISLTS_H__
+#define _CSWISLTS_H__
+
+extern "C" {
+#include <SWIslts.h>
+}
+
+class CSWIslts{
+public:
+  CSWIslts();
+  ~CSWIslts();
+  SWIsltsResult init();
+  SWIsltsResult term();
+#ifdef USE_FSM_DICT
+  SWIsltsResult open(const char *data_filename, const char *dictionary_filename);
+#else
+  SWIsltsResult open(const char *data_filename);  
+#endif
+  SWIsltsResult close();
+  SWIsltsResult textToPhone(const char *text, 
+                             char **output_phone_string,
+                             int *output_phone_len,
+                             int max_phone_len);
+private:
+  SWIsltsWrapperHand m_sltsWrapHand;
+  SWIsltsHand m_sltsHand;
+};
+
+#endif  /* _SWI_SLTSWRAP_H__ */
+
+
diff --git a/seti/sltsEngine/include/SWIslts.h b/seti/sltsEngine/include/SWIslts.h
new file mode 100644
index 0000000..91ad40e
--- /dev/null
+++ b/seti/sltsEngine/include/SWIslts.h
@@ -0,0 +1,102 @@
+/*---------------------------------------------------------------------------*
+ *  SWIslts.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _SWI_SLTS_H__
+#define _SWI_SLTS_H__
+
+#ifdef SWISLTS_USE_STATIC_API
+  #define SWISLTS_FNDECLARE
+#else
+  #ifdef WIN32
+    #ifdef _IN_SWI_SLTS__
+      #define SWISLTS_FNDECLARE __declspec(dllexport)
+    #else
+      #define SWISLTS_FNDECLARE __declspec(dllimport)
+    #endif
+  #else
+    #define SWISLTS_FNDECLARE
+  #endif
+#endif
+
+typedef void * SWIsltsHand;
+
+typedef enum {
+  SWIsltsSuccess = 1,
+  SWIsltsErrAllocResource = 2,
+  SWIsltsInvalidParam = 3,
+  SWIsltsMaxInputExceeded = 4,
+  SWIsltsEmptyPhoneString = 5,
+  SWIsltsInternalErr = 6,
+  SSWIsltsUnknownInputChar = 7,
+  SWIsltsFileOpenErr = 8,
+  SWIsltsFileReadErr = 9,
+  SWIsltsFileWriteErr = 10
+}SWIsltsResult;
+
+typedef struct SWIsltsTranscription {
+  void  * pBuffer;
+  size_t  nSizeOfBuffer;
+} SWIsltsTranscription;
+
+typedef struct SWIsltsWrapper {
+  SWIsltsResult (*init) (void);
+  SWIsltsResult (*term) (void);
+  SWIsltsResult (*open) (SWIsltsHand *phLts, 
+                         const char *data_filename);  
+  SWIsltsResult (*close) (SWIsltsHand hLts);
+  SWIsltsResult (*textToPhone) (SWIsltsHand hLts,
+                                const char *text, 
+                                char **output_phone_string,
+                                int *output_phone_len,
+                                int max_phone_len);
+} SWIsltsWrapper;
+
+typedef SWIsltsWrapper * SWIsltsWrapperHand;
+
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsGetWrapper(SWIsltsWrapperHand *phLtsWrap);
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsReleaseWrapper(SWIsltsWrapperHand hLtsWrap);
+
+typedef SWIsltsResult (*pSWIsltsReleaseWrapper)(SWIsltsWrapperHand);              
+typedef SWIsltsResult (*pSWIsltsGetWrapper)(SWIsltsWrapperHand *);
+
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsInit(void);
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsTerm(void);
+
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsOpen(SWIsltsHand *phLts, 
+                                            const char *data_filename);
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsClose(SWIsltsHand hLts);
+
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsTextToPhone(SWIsltsHand hLts, 
+                                                   const char *text, 
+                                                   char **output_phone_string,
+                                                   int *output_phone_len,
+                                                   int max_phone_len);
+
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsG2PGetWordTranscriptions(SWIsltsHand hLts, 
+                                                               const char *text,
+                                                               SWIsltsTranscription **ppTranscriptions,
+                                                               int *pnNbrOfTranscriptions);
+
+SWISLTS_FNDECLARE SWIsltsResult SWIsltsG2PFreeWordTranscriptions(SWIsltsHand hLts, 
+                                                                 SWIsltsTranscription *pTranscriptions);
+#endif  /* _SWI_SLTS_H__ */
+
+
diff --git a/seti/sltsEngine/include/fsm_dictionary.h b/seti/sltsEngine/include/fsm_dictionary.h
new file mode 100644
index 0000000..0f1156c
--- /dev/null
+++ b/seti/sltsEngine/include/fsm_dictionary.h
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*
+ *  fsm_dictionary.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _FSM_DICTIONARY_H__
+#define _FSM_DICTIONARY_H__
+
+#include "lts_seq_internal.h"
+
+#define MAX_FSM_WORD_LEN 30
+#define MAX_FSM_PRON_LEN 100  
+
+typedef struct FSM_DICTIONARY {
+  PM *phone_mapping;
+  LM *letter_mapping;
+#ifdef TI_DSP
+	unsigned short *fsm_array;
+#else
+	unsigned char *fsm_array;  
+#endif
+
+	int fsm_size;
+} FSM_DICTIONARY;
+
+
+/* function declarations */
+SWIsltsResult load_fsm_dictionary(const char *dict_file, FSM_DICTIONARY ** pd);
+SWIsltsResult free_fsm_dictionary(FSM_DICTIONARY * d);
+int get_lts_pron(FSM_DICTIONARY *d, char *word, char **pron, int max_pron_len);
+
+#endif /* _FSM_DICTIONARY_H__ */
+
diff --git a/seti/sltsEngine/include/linklist.h b/seti/sltsEngine/include/linklist.h
new file mode 100644
index 0000000..3f5a328
--- /dev/null
+++ b/seti/sltsEngine/include/linklist.h
@@ -0,0 +1,64 @@
+/*---------------------------------------------------------------------------*
+ *  linklist.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+/* each node stores pointer to data, and pointer to next node */
+typedef struct LNode {
+  void *data;   
+  struct LNode *next;
+  struct LNode *prev;
+}LNode;
+
+typedef struct LList {
+  struct LNode *head;
+  struct LNode *curr;
+  struct LNode *tail;
+}LList;
+
+typedef enum{
+  LListSuccess = 1,
+  LListResourceAllocError,
+  LListEmpty,
+  LListInternalError
+}LListResult;
+
+/* Inserts after current element 
+   At return, current element will be point to newly created node
+
+   handle static allocation later - possibly using a pool of nodes?
+   For now, dynamically allocate a new list node with the data
+*/
+LListResult Insert(LList *list, void *data);
+
+
+/* Deletes at current element 
+   At return, current element will point to previous node
+
+   handle static deallocation later - possibly using a pool of nodes?
+   For now, dynamically free a new list node
+*/
+
+LListResult Delete(LList *list);
+
+/* If dynamic allocation is not allowed, provide small pool of nodes */
+#ifdef USE_STATIC_SLTS
+void ClearLNodeArray();
+#endif
+
diff --git a/seti/sltsEngine/include/lts.h b/seti/sltsEngine/include/lts.h
new file mode 100644
index 0000000..b66e72d
--- /dev/null
+++ b/seti/sltsEngine/include/lts.h
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*
+ *  lts.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _LTS_H__
+#define _LTS_H__
+
+#if defined (GEN_STATIC_SLTS) && defined (WIN32)
+#include <stdio.h>
+#endif
+
+#define MTAG NULL
+
+typedef void* FSM_DICT_HANDLE;
+
+typedef void* LTS_HANDLE;
+
+typedef void* PHONEMAP_TABLE_HANDLE;
+
+/*
+  creates an instance of the LTS and loads its data from file provided.
+  Returns NULL if error.
+*/
+SWIsltsResult create_lts(char *data_filename, LTS_HANDLE *phLts);
+
+/*
+  deallocates an instance of LTS
+*/
+SWIsltsResult free_lts(LTS_HANDLE hLts);
+
+/*
+  runs letter_to_sound rules.
+
+  Fills up phones in phone_string.  This needs to be allocated by calling 
+  function to max_length.  Each elements of phone string needs to be 4 
+  characters long (output can be 3 characters plus need room for
+  EOS)
+
+  return length of phone string.  
+  If max_phone_length is exceeded, truncates output and returns max_phone_length.
+  
+  Returns -1 if error
+*/
+SWIsltsResult run_lts(LTS_HANDLE h, FSM_DICT_HANDLE hdict, char *input_sentence, char **output_phone_string, int *phone_length);
+
+/* static code generator for LTS structure */
+#if defined (GEN_STATIC_SLTS) && defined (WIN32)
+void gen_static_lts(LTS_HANDLE h, const char *name, FILE *fp_out);
+#endif
+
+#if defined (GEN_STATIC_FSMD) && defined (WIN32)
+void gen_static_fsmd(FSM_DICT_HANDLE h, const char *name, FILE *fp_out);
+#endif
+
+typedef struct SWIsltsEngine {
+  LTS_HANDLE m_hLts;
+
+  FSM_DICT_HANDLE m_hDict;
+
+} SLTS_Engine;
+
+
+#endif /* _LTS_H__ */
diff --git a/seti/sltsEngine/include/lts_error.h b/seti/sltsEngine/include/lts_error.h
new file mode 100644
index 0000000..709452d
--- /dev/null
+++ b/seti/sltsEngine/include/lts_error.h
@@ -0,0 +1,39 @@
+/*---------------------------------------------------------------------------*
+ *  lts_error.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _LTS_ERROR_H__
+#define _LTS_ERROR_H__
+
+
+typedef enum {
+  SWIsltsSuccess = 1,
+  SWIsltsErrAllocResource = 2,
+  SWIsltsInvalidParam = 3,
+  SWIsltsMaxInputExceeded = 4,
+  SWIsltsEmptyPhoneString = 5,
+  SWIsltsInternalErr = 6,
+  SSWIsltsUnknownInputChar = 7,
+  SWIsltsFileOpenErr = 8,
+  SWIsltsFileReadErr = 9,
+  SWIsltsFileWriteErr = 10
+}SWIsltsResult;
+
+#endif /* _LTS_ERROR_H__ */
diff --git a/seti/sltsEngine/include/lts_seq_internal.h b/seti/sltsEngine/include/lts_seq_internal.h
new file mode 100644
index 0000000..5c69a82
--- /dev/null
+++ b/seti/sltsEngine/include/lts_seq_internal.h
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*
+ *  lts_seq_internal.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _LTS_SEQ_INTERNAL_H__
+#define _LTS_SEQ_INTERNAL_H__
+
+#define NO_NODE 10000
+#define MAX_WORD_LEN 50
+#define LTS_MAXCHAR 255
+#define MAX_CONS_COMB 100
+#define MAX_NUM_CONTEXT 5
+#define NUM_STRESS_LVL 3 /* SS1, SS2, SS0 */
+
+/*
+ * Question types:
+ * this enum cannot be changed for a given DATA file 
+ */
+
+typedef enum {
+  UnKnown = 0,
+  Left1,
+  Left2,
+  Left3,
+  Left4,
+  Left5,     /*5*/
+  Right1,
+  Right2,
+  Right3,
+  Right4,
+  Right5,    /*10*/
+  LeftPhone1,
+  LetInWord,
+  SylInWord,
+  WordLen,   
+  Syl2InWord, /*15*/
+  SylInRoot, 
+  Syl2InRoot,
+  LeftString,
+  RightString,
+  Left_DFRE,      /*20*/  /*DFRE = distance from root edge*/
+  Right_DFRE,      /*DFRE = distance from root edge*/
+  NumQuestionTypes
+} QuestionType;
+
+typedef struct LQUESTION {
+  unsigned char num_list;
+  unsigned char type;
+  unsigned char *list;	/*list of items to match against for question*/
+  unsigned short membership[16]; // UCHAR_MAX/sizeof(unsigned short)/8
+
+} LQUESTION;
+
+#ifdef SKIP_LDP_PROPERTIES
+typedef struct LDP {
+  unsigned char letter;
+  unsigned char left_context[MAX_NUM_CONTEXT];
+  unsigned char right_context[MAX_NUM_CONTEXT];
+  char left_phone1;
+  char let_in_word;
+  char syl_in_word;
+  char syl2_in_word;
+  char syl_in_root;
+  char syl2_in_root;
+  char word_len;
+  int left_string_index;
+  int right_string_index;
+  int left_DFRE;  /*DFRE = distance from root edge*/
+  int right_DFRE;
+} LDP;
+#else
+typedef struct LDP {
+  unsigned char letter;
+  int properties[ NumQuestionTypes];
+} LDP;
+#endif
+
+
+/*RT tree is the compact representations of the trees
+  Got rid of the NODE structures in order to save the overhead.
+
+  Instead, the two arrays below are indexed by node_index
+*/
+typedef struct RT_LTREE {
+  short *values_or_question1;  /*if leaf node, this is the value at the node.  If not, this
+				 is the index into the questions*/
+  short *question2;   /*also used to hold backoff_output for leaf nodes*/
+  short *left_nodes;   /*right_node_index is always left_nodex+1, so just store left.
+			 If = MAX_NODES, then this is a leaf node*/
+  int num_nodes;
+} RT_LTREE;
+
+
+typedef struct LM { /*letter mappings*/
+  char *letters;
+  char *type;
+  int num_letters;
+  int letter_index_for_letter[UCHAR_MAX+1];
+} LM;
+
+
+typedef struct PM { /*phone mappings*/
+  char **phones;
+  int num_phones;
+  void* phoneH; /* hash table if any */
+} PM;
+
+typedef struct LTS {
+  char **outputs;
+  char **input_for_output;
+  int num_outputs;
+
+  char **strings;
+  int num_strings;
+  char *string_lens;
+  unsigned short membership[16]; // UCHAR_MAX/sizeof(unsigned short)/8
+
+  RT_LTREE **trees;
+  LQUESTION **questions;
+
+  LM *letter_mapping;
+  PM *phone_mapping;
+  LDP dp;
+  char *allowable_cons_comb[MAX_CONS_COMB];
+  int num_cons_comb;
+  void* allowable_cons_combH; /* hash table */
+  int num_letters;
+  int num_questions;
+
+} LTS;
+
+
+/* check for combinations of LTS phones to substitute for ETI phones */
+/* LTS_ETI_PHONES are defined in a language specific header file slts_phone_def.h */
+void replace_eti_phones(char *dest, char *src);
+
+void *lts_alloc(int num, int size);
+
+
+#endif /* _LTS_SEQ_INTERNAL_H__ */
diff --git a/seti/sltsEngine/src/SWIslts.c b/seti/sltsEngine/src/SWIslts.c
new file mode 100644
index 0000000..6a24b00
--- /dev/null
+++ b/seti/sltsEngine/src/SWIslts.c
@@ -0,0 +1,415 @@
+/*---------------------------------------------------------------------------*
+ *  SWIslts.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#define _IN_SWI_SLTS__
+
+#ifdef SWISLTS_USE_STATIC_API
+#define SWISLTS_FNEXPORT
+#else
+#ifdef WIN32
+#include <windows.h>
+#define SWISLTS_FNEXPORT __declspec(dllexport)
+#else
+#define SWISLTS_FNEXPORT
+#endif
+#endif
+
+#include <stdlib.h>
+
+
+#include <string.h>
+
+#include "pmemory.h"
+#include "PFile.h"
+#include "plog.h"
+
+#include "SWIslts.h"
+#include "lts.h"
+
+/**
+ * Phone map table
+ */
+typedef struct SLTS_PhoneMap_t{
+    LCHAR *src;
+    LCHAR *des;
+} SLTS_PhoneMap;
+
+#define INF_SILENCE_OPTIONAL         (const char *)"&"
+
+const int g_numPhones = 5;
+const SLTS_PhoneMap g_aPhoneMap[] = {
+     {"PS", "&"},
+     {"SS0", ""},
+     {"SS1", ""},
+     {"SS2", ""},
+     {"WS", "&"}
+};
+
+#ifdef USE_STATIC_SLTS 
+#define MAX_INPUT_LEN 255
+static SLTS_Engine g_sltsEngine;
+static SWIsltsWrapper g_sltsWrapper;
+#endif
+
+#define MAX_PRON_LEN      255
+#define MAX_PHONE_LEN     4
+
+static SWIsltsResult GetPhoneStr(SLTS_Engine *pEng, char *apszPhones[], int num_phones, char *pszPhoneStr, size_t *len);
+
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsGetWrapper(SWIsltsWrapper **ppLtsWrap)
+{
+  if (ppLtsWrap != NULL) {
+#ifdef USE_STATIC_SLTS
+    *ppLtsWrap = &g_sltsWrapper;
+#else
+    *ppLtsWrap = MALLOC(sizeof(SWIsltsWrapper), MTAG);
+    if (*ppLtsWrap == NULL) {
+      return SWIsltsErrAllocResource;
+    }
+#endif
+    (*ppLtsWrap)->init = SWIsltsInit;
+    (*ppLtsWrap)->term = SWIsltsTerm;
+    (*ppLtsWrap)->open = SWIsltsOpen;
+    (*ppLtsWrap)->close = SWIsltsClose;
+    (*ppLtsWrap)->textToPhone = SWIsltsTextToPhone;
+  }
+  return SWIsltsSuccess;
+}
+
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsReleaseWrapper(SWIsltsWrapper *pLtsWrap)
+{
+#ifndef USE_STATIC_SLTS
+  if (pLtsWrap != NULL) {
+    FREE(pLtsWrap);
+    pLtsWrap = NULL;
+  }
+#endif
+  return SWIsltsSuccess;
+}
+
+/* External Core SLTS API implementation */
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsInit()
+{
+  return SWIsltsSuccess;
+}
+
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsTerm()
+{
+  return SWIsltsSuccess;
+}
+
+/* create a new instance of SLTS */
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsOpen(SWIsltsHand *phLts, 
+                                           const char *data_filename)     
+{
+  SLTS_Engine      * pEng;
+  SWIsltsResult      nRes = SWIsltsSuccess;
+
+  if ((phLts == NULL)
+#ifndef USE_STATIC_SLTS
+    || (data_filename == NULL)
+#endif 	
+    ) 
+  {
+    return SWIsltsInvalidParam;
+  }
+
+#ifdef USE_STATIC_SLTS 
+  pEng = &g_sltsEngine;
+#else
+  pEng = CALLOC(1, sizeof(SLTS_Engine), MTAG);
+  if (pEng == NULL) {
+    return SWIsltsErrAllocResource;
+  }
+#endif
+
+  /* initialize */
+  nRes = create_lts((char *)data_filename, &pEng->m_hLts);
+  if (nRes != SWIsltsSuccess) {
+    PLogError(L("create_lts with the model file (%s) fails with return code %d\n"), (char *)data_filename, nRes);
+    goto CLEAN_UP;
+  }
+
+  *phLts = (SWIsltsHand)pEng;
+  
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+  if (*phLts != NULL) {
+    SWIsltsClose(*phLts);
+  }
+  
+  return nRes;
+}
+
+/* deletes given instance of SLTS */
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsClose(SWIsltsHand hLts)
+{
+  SLTS_Engine *pEng = (SLTS_Engine *)hLts;
+  if (pEng == NULL) {
+    return SWIsltsInvalidParam;
+  }
+
+  /* clean up internal buffers and slts structure */
+  if (pEng->m_hLts) {
+    free_lts(pEng->m_hLts);
+  }
+  pEng->m_hLts = NULL;
+
+#ifndef USE_STATIC_SLTS 
+  FREE(pEng);
+#endif
+
+  pEng = NULL;
+
+  return SWIsltsSuccess;
+}
+
+/* send phones to internal buffer */
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsTextToPhone(SWIsltsHand hLts, 
+                                               const char *text, 
+                                               char **output_phone_string,
+                                               int *output_phone_len,
+                                               int max_phone_len)
+{
+  int i;
+  SWIsltsResult          nRes = SWIsltsSuccess;
+#ifdef USE_STATIC_SLTS  
+  char new_text[MAX_INPUT_LEN];
+#else
+  char *new_text;
+#endif
+
+  SLTS_Engine *pEng;
+  if (hLts == NULL) {
+    return SWIsltsInvalidParam;
+  }
+
+  if (text == NULL) {
+    return SWIsltsInvalidParam;
+  }
+  
+  /* check that the output phone string param is allocated */
+  for(i=0; i<max_phone_len; i++){
+    if(output_phone_string[i] == NULL)
+      return SWIsltsInvalidParam;
+  }
+
+  pEng = (SLTS_Engine *)hLts;
+
+  /* get rid newlines, tabs, and spaces, if any */
+#ifdef USE_STATIC_SLTS 
+  if((strlen(text)+1) > MAX_INPUT_LEN){  
+    return SWIsltsMaxInputExceeded;
+  }
+#else  
+  new_text = MALLOC((strlen(text)+1)*sizeof(char), MTAG);
+  if (new_text == NULL) {
+    PLogError(L("SWISLTS_OUT_OF_MEMORY"));
+    return SWIsltsErrAllocResource;        
+  }
+#endif
+
+  strcpy(new_text, text);
+  i = strlen(new_text)-1;
+  while(new_text[i] == '\n' || new_text[i] == ' ' || new_text[i] == '\t') i--;
+  new_text[i+1] = '\0'; 
+
+  /* now check if the input string is empty */
+  if(strlen(new_text) == 0){
+    *output_phone_len = 0;
+    nRes = SWIsltsEmptyPhoneString;
+    goto CLEAN_UP;
+  }
+
+  *output_phone_len = max_phone_len;
+  nRes = run_lts(pEng->m_hLts, pEng->m_hDict, new_text, output_phone_string, output_phone_len);
+  if (nRes != SWIsltsSuccess) {
+    goto CLEAN_UP;
+  }
+
+#ifndef USE_STATIC_SLTS 
+  if(new_text){
+    FREE(new_text);
+  }
+  new_text = NULL;
+#endif
+
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+
+#ifndef USE_STATIC_SLTS 
+  if(new_text){
+    FREE(new_text);
+  }
+  new_text = NULL;
+#endif
+
+  return nRes;
+}
+
+static LCHAR g_PHONE_STRING[MAX_PRON_LEN][MAX_PHONE_LEN];
+
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsG2PGetWordTranscriptions(SWIsltsHand hLts, 
+                                                               const char *text, 
+                                                               SWIsltsTranscription **ppTranscriptions,
+                                                               int *pnNbrOfTranscriptions)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  LCHAR                * phone_string[MAX_PRON_LEN];   
+  SLTS_Engine          * pEng = (SLTS_Engine *)hLts;
+  int                    i;
+  int                    num_phones = 0;
+  SWIsltsTranscription * pTranscription = NULL;
+  int                    nNbrOfTranscriptions = 0;
+  int                  * pnNbrOfTranscriptionsToSave = NULL;
+  LCHAR                * pBlock = NULL;
+
+  for( i = 0; i < MAX_PRON_LEN; i++ ) {
+    phone_string[i] = g_PHONE_STRING[i]; 
+  }
+
+  nRes = SWIsltsTextToPhone(hLts, text, phone_string, &num_phones, MAX_PRON_LEN);
+  if( nRes != SWIsltsSuccess ) {
+    PLogError(L("SWIsltsTextToPhone( ) fails with return code %d\n"), nRes);
+    goto CLEAN_UP;
+  }
+#if DEBUG
+  pfprintf(PSTDOUT,"number of phones: %d\n ", num_phones);
+  for( i = 0; i < num_phones; i++ ) {
+    pfprintf(PSTDOUT,"%s ", phone_string[i]);
+  }
+  pfprintf(PSTDOUT,"\n ");
+#endif
+
+  /* only one transcription available from seti */
+  nNbrOfTranscriptions = 1;
+  pBlock = (LCHAR *)CALLOC(sizeof(int) + nNbrOfTranscriptions * sizeof(SWIsltsTranscription), sizeof(LCHAR), MTAG);
+  if (pBlock == NULL) {
+    PLogError(L("SWISLTS_OUT_OF_MEMORY"));
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+  pnNbrOfTranscriptionsToSave = (int *)pBlock;
+  pTranscription = (SWIsltsTranscription *)(pBlock + sizeof(int));
+
+  *ppTranscriptions = pTranscription;
+  *pnNbrOfTranscriptions = *pnNbrOfTranscriptionsToSave = nNbrOfTranscriptions;
+
+  /* extra +1 for double-null at the end */
+  pTranscription->pBuffer = MALLOC(MAX_PHONE_LEN * (num_phones + 1+1), MTAG);
+  if( pTranscription->pBuffer == NULL ) {
+    PLogError(L("SWISLTS_OUT_OF_MEMORY"));
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  nRes = GetPhoneStr(pEng, phone_string, num_phones, (char *)pTranscription->pBuffer, &(pTranscription->nSizeOfBuffer));
+  if( nRes != SWIsltsSuccess ) {
+    PLogError(L("SWIsltsInternalErr: GetPhoneStr( ) fails with return code %d\n"), nRes);
+    goto CLEAN_UP;
+  }
+
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+
+  for( i = 0; i < MAX_PRON_LEN; i++ ) {
+    if( phone_string[i] != NULL ) {
+      FREE(phone_string[i]);
+    }
+  }
+
+  *ppTranscriptions = NULL;
+  *pnNbrOfTranscriptions = 0;  
+
+  for( i = 0; i < nNbrOfTranscriptions; i++ ) {
+    if(pTranscription[i].pBuffer) {
+      FREE(pTranscription[i].pBuffer);
+    }
+  }
+  FREE(pTranscription);
+
+  return nRes;
+}
+
+
+SWISLTS_FNEXPORT SWIsltsResult SWIsltsG2PFreeWordTranscriptions(SWIsltsHand hLts, 
+                                                                SWIsltsTranscription *pTranscriptions)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                    nNbrOfTranscriptions;
+  int                    i;
+  LCHAR                * pBuffer = NULL;
+
+  if( pTranscriptions == NULL ) {
+    return SWIsltsInvalidParam;
+  }
+
+  pBuffer = ((LCHAR *)pTranscriptions - sizeof(int));
+  nNbrOfTranscriptions = (int)*pBuffer;
+
+  for( i = 0; i < nNbrOfTranscriptions; i++ ) {
+    if( pTranscriptions[i].pBuffer ) {
+      FREE(pTranscriptions[i].pBuffer);
+    }
+  }
+  FREE(pBuffer);
+
+  return nRes;
+}
+
+static SWIsltsResult GetPhoneStr(SLTS_Engine *pEng, char *apszPhones[], int num_phones, char *pszPhoneStr, size_t *len)
+{
+  int                    i, j;
+  int                    nFound;
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  const char           * pszLastPhone = NULL;
+  
+  *pszPhoneStr = '\0';
+
+  for( i = 0; i < num_phones; i++ ) {
+    nFound = 0;
+    for ( j = 0; j <  g_numPhones && nFound == 0; j++ ) {
+      if( strcmp(apszPhones[i], g_aPhoneMap[j].src) == 0 ) {
+        nFound = 1;
+        if( strcmp(g_aPhoneMap[j].des, INF_SILENCE_OPTIONAL) == 0 ) {
+          if( *pszPhoneStr != '\0' && strcmp(pszLastPhone, INF_SILENCE_OPTIONAL) != 0 ) {
+            strcat(pszPhoneStr, g_aPhoneMap[j].des);
+          }
+        }
+        else if( g_aPhoneMap[j].des != '\0' ) {
+          strcat(pszPhoneStr, g_aPhoneMap[j].des);
+        }
+        pszLastPhone = g_aPhoneMap[j].des;
+      }
+    }
+    if( nFound == 0 ) {
+      strcat(pszPhoneStr, apszPhones[i]);
+      pszLastPhone = apszPhones[i];
+    }
+  }
+
+  *len = strlen(pszPhoneStr) + 1;
+  // add the double-null per SREC/Vocon convention
+  pszPhoneStr[ *len] = 0;
+
+  return nRes;
+}
diff --git a/seti/sltsEngine/src/linklist_impl.c b/seti/sltsEngine/src/linklist_impl.c
new file mode 100644
index 0000000..336ad5a
--- /dev/null
+++ b/seti/sltsEngine/src/linklist_impl.c
@@ -0,0 +1,247 @@
+/*---------------------------------------------------------------------------*
+ *  linklist_impl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include <stdlib.h>
+
+#include "pmemory.h"
+#include "plog.h"
+
+#include "linklist.h"
+
+extern void *lts_alloc(int num, int size);
+
+
+/* very simple static memory allocation:
+   1. pool of linked list nodes - from static allocated array  
+   2. each node is marked "used" when allocated; marked "unused" when deallocated
+   3. since the stress linked lists deal with single words, an array will suffice.
+*/
+
+#ifdef USE_STATIC_SLTS
+#define NUM_ALLOC_NODES 30  /* Max 30 syllables per word */
+
+typedef struct LNodeAllocElement
+{
+  LNode node;
+  short usedflag;
+} LNodeAllocElement;
+
+static LNodeAllocElement g_LNodeAllocArray[NUM_ALLOC_NODES];
+
+void ClearLNodeArray()
+{
+  int i;
+  LNode *n;
+
+  for(i=0; i<NUM_ALLOC_NODES; i++){
+    g_LNodeAllocArray[i].usedflag = 0;  
+    n = &(g_LNodeAllocArray[i].node);  
+    n->data = 0;   
+    n->next = n->prev = 0;
+  }
+}
+
+static LNode *AllocNode()
+{
+  int i;
+
+  /* return first unused element */
+  for(i=0; i<NUM_ALLOC_NODES; i++){
+    if(g_LNodeAllocArray[i].usedflag == 0){
+      g_LNodeAllocArray[i].usedflag = 1;
+
+	  /* zero out the node first*/
+	  (g_LNodeAllocArray[i].node).data = NULL;
+	  (g_LNodeAllocArray[i].node).prev = NULL;
+	  (g_LNodeAllocArray[i].node).next = NULL;
+		  
+      return &(g_LNodeAllocArray[i].node);
+    }
+  }
+  /* ran out of nodes */
+  return NULL;
+}
+
+static void FreeNode(LNode *n)
+{
+  int i;
+  long addr;
+
+  /* compare addresses of pointers */
+  for(i=0; i<NUM_ALLOC_NODES; i++){
+    addr = (long) (&(g_LNodeAllocArray[i].node));
+    if(addr == (long)n){
+      g_LNodeAllocArray[i].usedflag = 0;
+      return;
+    }
+  }
+
+  /* not found. don't do anything */
+   return;
+}
+
+
+#else /* !USE_STATIC_SLTS */
+
+static LNode *AllocNode()
+{
+  return (LNode *)lts_alloc(1, sizeof(LNode));
+}
+static void FreeNode(LNode *n)
+{
+  FREE(n);
+}
+
+#endif
+
+
+
+/* Inserts after current element 
+   At return, current element will be point to newly created node
+
+   handle static allocation later - possibly using a pool of nodes?
+   For now, dynamically allocate a new list node with the data
+*/
+LListResult Insert(LList *list, void *data)
+{
+  LNode *newnode = AllocNode();
+  if(newnode == NULL){
+     return LListResourceAllocError; 
+  }
+  newnode->data = data;
+
+  if(list->head == NULL){
+    /* if list is empty, assign to head */   
+    list->head = newnode;     
+    (list->head)->next = NULL;
+    (list->head)->prev = NULL;
+    
+    /* update curr to newly inserted node */
+    list->curr = list->head;
+    list->tail = list->head;
+    return LListSuccess;
+  }
+  
+    /* curr not specified, insert from the end */  
+  if(list->curr == NULL){
+    list->curr = list->tail;
+  }
+  
+  /* in cases with single node, default to insert at end */
+  if(list->curr == list->tail){
+    /* insert at the end */
+    newnode->prev = list->curr;
+    newnode->next = NULL;
+    (list->curr)->next = newnode;
+
+    /* update both curr and end */
+    list->curr = newnode;
+    list->tail = newnode;
+    return LListSuccess;
+    
+  }else if(list->curr == list->head){
+    /* insert at head */
+    newnode->next = list->head;
+    newnode->prev = NULL;
+    (list->head)->prev = newnode;
+
+    /* update curr to newly inserted node */
+    list->curr = list->head;
+    list->head = newnode;     
+    
+    return LListSuccess;
+  
+  }else{
+    /* insert somewhere in middle */
+    newnode->prev = list->curr;
+    newnode->next = (list->curr)->next;
+    (list->curr)->next = newnode;
+    (newnode->next)->prev = newnode;
+
+    /* update curr to newly inserted node */
+    list->curr = newnode;
+    return LListSuccess;
+  }
+}
+
+/* Deletes at current element 
+   At return, current element will point to previous node
+
+   handle static deallocation later - possibly using a pool of nodes?
+   For now, dynamically free a new list node
+*/
+
+LListResult Delete(LList *list)
+{
+  LNode *curr;
+
+  if(list->head == NULL){
+    return LListEmpty;
+  } 
+  
+  /* start deleting from the end if curr not specified */
+  if(list->curr == NULL){
+    list->curr = list->tail;
+  } 
+    
+  curr = list->curr;
+
+  if(curr == list->head){
+  /* delete from the head */
+    list->head = curr->next;
+
+    if(list->head != NULL){
+      (list->head)->prev = NULL;
+    }
+    
+    FreeNode(curr);
+    list->curr = list->head;
+    return LListSuccess;
+    
+  }else if(curr == list->tail){
+    /* delete from the end */
+    list->tail = curr->prev;
+
+    if(list->tail != NULL){
+      (list->tail)->next = NULL;
+    }
+        
+    FreeNode(curr);
+    list->curr = list->tail;
+    return LListSuccess;
+    
+  }else{
+    /* delete somewhere in the middle */
+    list->curr = curr->next;
+    
+    /* still check, just in case*/
+    if(curr->next != NULL){
+      (curr->next)->prev = curr->prev;
+    }
+    if(curr->prev != NULL){
+      (curr->prev)->next = curr->next;
+    }
+
+    FreeNode(curr);
+    return LListSuccess;
+  }    
+}
+
diff --git a/seti/sltsEngine/src/run_seq_lts.c b/seti/sltsEngine/src/run_seq_lts.c
new file mode 100644
index 0000000..255a296
--- /dev/null
+++ b/seti/sltsEngine/src/run_seq_lts.c
@@ -0,0 +1,1817 @@
+/*---------------------------------------------------------------------------*
+ *  run_seq_lts.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+
+#ifndef NO_STDERR   
+#include <stdio.h>
+#else
+extern void PrintError(char *msg, unsigned long p1, unsigned long p2, unsigned long p3);
+#endif
+
+#include "passert.h"
+#include "pmemory.h"
+#include "plog.h"
+#include "phashtable.h"
+#include "lts_error.h"
+#include "lts.h"
+#include "lts_seq_internal.h"
+#include "port_fileio.h"
+#include "platform_utils.h" /* strdup, safe_strtok, etc */
+
+#define ASSERT(x) passert(x)
+
+#ifdef TI_DSP
+#include "tidsp_defines.h"
+#endif
+
+#ifdef _DEBUG
+#define PRINT_LOAD_TREE_SUMMARY 0
+#define PRINT_LOAD_TREE 0
+#define PRINT_CONS_COMB 0
+#define PRINT_DP_LETTER 0
+#define PRINT_LTS_WORD 0
+#define PRINT_DICT_LOOKUP 0   
+#endif
+
+#define LTS_MARKER_WORD_START "WS"
+#define LTS_MARKER_PRON_START "PS"
+#define LTS_MARKER_SYLL_START "SS"
+#define LTS_MARKER_SYLL_START_DD "SS%d"
+#define LTS_MARKER_PIPESEP "|"
+#define LTS_MARKER_PIPESEP_CHAR '|'
+
+static int load_int(PORT_FILE *fp);
+static SWIsltsResult load_lquestions(LQUESTION ***pquestions, int *pnum_questions, PORT_FILE *fp);
+static SWIsltsResult free_lquestions(LQUESTION ** questions, int num_questions);
+static SWIsltsResult load_letter_mapping(PORT_FILE *fp, LM **ppLetterMap);
+static SWIsltsResult free_letter_mapping(LM *lm);
+static SWIsltsResult load_phone_mapping(PORT_FILE *fp, PM **ppPhoneMap);
+static SWIsltsResult free_phone_mapping(PM *pm);
+static SWIsltsResult load_outputs(char ***poutputs, char ***pinputs, int *pnum, PORT_FILE *fp);
+static SWIsltsResult free_outputs(char **outputs, char **inputs, int num);
+static SWIsltsResult load_trees(RT_LTREE ***ptrees, int *num_letters,
+                              LQUESTION ***pquestions, int *num_questions, LM **plm, PORT_FILE *fp);
+static SWIsltsResult free_trees(RT_LTREE **trees, int num_letters, LQUESTION **questions, int num_questions, LM *lm);
+static SWIsltsResult load_allowable_cons_comb(LTS *lts, PORT_FILE *fp);
+static SWIsltsResult free_allowable_cons_comb(LTS *lts);
+static SWIsltsResult load_question_strings(LTS* lts, PORT_FILE* fp); 
+static SWIsltsResult free_question_strings(LTS* lts);  
+#define find_letter_index( myLet, myLM) (myLM->letter_index_for_letter[ toupper(myLet)])
+int find_phone(const char *ph, PM *pm);
+int find_best_string(const char *str, LTS* lts);  
+int find_best_prefix_string(const char *str, LTS* lts);  
+int fill_up_dp_for_letter(LTS *lts, const char *input_word, int word_len, int index, int root_start, int root_end, int left_phone);
+#define in_list(myV, myQ)   (bitarray_read_bit( myQ->membership, myV))
+#define qmatches(myQ, myU)  (in_list( myU->properties[ myQ->type], myQ))
+int matches(LQUESTION *q1, LQUESTION *q2, int type, LDP *dp) ;
+int find_output_for_dp(LTS *lts, int *pbackoff_output);
+int add_output(char *output, char **output_phone_string, int out_len, int max_phone_length);
+int is_allowable_cons_comb(LTS *lts, const char *cons_string);
+void adjust_syllable_boundaries(LTS *lts, char **output_phone_string, int num_out, int max_phone_length);
+SWIsltsResult lts_for_word(LTS *lts, char *word, int word_len, char **output_phone_string, int max_phone_length, int *num_out);
+
+/*------------
+ *
+ * bitarray
+ *
+ *-----------*/
+
+#define bitarray_read_bit( biTs, iBiT) ( biTs[iBiT/16] & (1<<((iBiT)%16)) )  
+/* int bitarray_read_bit( unsigned short* bits, int iBit)
+   {  // ASSERT( iBit<256);
+   return bits[iBit/16] & (1<<((iBit)%16));  
+   } */
+
+void bitarray_write_bit( unsigned short* bits, int iBit, int iVal)
+{ 
+  unsigned short sect;
+  ASSERT( iBit<256);
+  sect = bits[iBit/16];
+  if(iVal) { sect |= (1<<(iBit%16)); }
+  else { sect &= ~(1<<(iBit%16)); }
+  bits[ iBit/16] = sect;
+}
+void bitarray_populate_from_list(unsigned short* bits, char* list, int listlen)
+{
+  unsigned int i;
+  for(i=0; i<UCHAR_MAX/sizeof(unsigned short)/8; i++) 
+    bits[i] = 0;
+  for(i=0; i<(unsigned int)listlen; i++) 
+    bitarray_write_bit( bits, list[i], 1);
+}
+
+/*-----------
+ * 
+ * PHashTable
+ *
+ *-----------*/
+
+static int HashCmpWord(const LCHAR *key1, const LCHAR *key2)
+{ return strcmp((const char*)key1,(const char*)key2); }
+static unsigned int HashGetCode(const void *key) 
+{
+  const char* k = (const char*)key;
+  unsigned int i, len, h = 0;
+  len = strlen(k);
+  for (i=0; i<len; i++) h = 31*h + (unsigned int)k[i];
+  return h;
+}
+void* my_PHashTableCreate_FromStrings( const char* strings[], int num_strings, 
+				       const LCHAR* hashName)
+{
+  PHashTable* table = NULL;
+  ESR_ReturnCode       rc = ESR_SUCCESS;
+  PHashTableArgs       hashArgs;
+  int i;
+  hashArgs.capacity = 63;
+  hashArgs.compFunction = HashCmpWord; // PHASH_TABLE_DEFAULT_COMP_FUNCTION;
+  hashArgs.hashFunction = HashGetCode; // PHASH_TABLE_DEFAULT_HASH_FUNCTION;
+  hashArgs.maxLoadFactor = PHASH_TABLE_DEFAULT_MAX_LOAD_FACTOR;
+  rc = PHashTableCreate( &hashArgs, hashName, &table);
+  for(i=0; i<num_strings; i++) {
+    void* old;
+    /* formerly the code used linear lookup, so let's avoid dups to match up */
+    rc = PHashTableGetValue( table, strings[i], (void**)&old);
+    if(rc != ESR_SUCCESS) {
+      rc = PHashTablePutValue( table, strings[i], (const void *)i, NULL );
+    }
+  }
+  return table;
+}
+
+/*---------
+ *
+ * i/o
+ *
+ *---------*/
+
+static int load_int(PORT_FILE *fp)
+{
+  int v;
+
+  PORT_FREAD_INT16((uint16 *)&v, sizeof(int), 1, fp);
+
+  return v;
+}
+
+static SWIsltsResult load_lquestions(LQUESTION ***pquestions, int *pnum_questions, PORT_FILE *fp)
+{
+  int                  i, num_questions;
+  LQUESTION         ** questions;
+  SWIsltsResult          nRes = SWIsltsSuccess;
+
+  num_questions = load_int(fp);
+
+#if PRINT_LOAD_TREE_SUMMARY
+  pfprintf(PSTDOUT,"loading %d questions\n", num_questions);
+#endif
+
+  *pquestions = questions = (LQUESTION**) lts_alloc(num_questions, sizeof(LQUESTION*));
+  if (questions == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  for (i=0;i<num_questions;i++) {
+    questions[i] = (LQUESTION*) lts_alloc(1, sizeof(LQUESTION));
+    if (questions[i] == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+#if PRINT_LOAD_TREE
+    pfprintf(PSTDOUT,"LOAD_TREE: loading question %d\n", i);
+#endif
+
+    PORT_FREAD_CHAR(&(questions[i]->type), sizeof(char), 1, fp);
+    PORT_FREAD_CHAR(&(questions[i]->num_list), sizeof(char), 1, fp);
+
+    questions[i]->list = (unsigned char*) lts_alloc(questions[i]->num_list, sizeof(unsigned char));
+    if (questions[i]->list == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+    PORT_FREAD_CHAR(questions[i]->list, sizeof(char), (questions[i]->num_list), fp);
+
+    bitarray_populate_from_list( questions[i]->membership, (char*) questions[i]->list, questions[i]->num_list);
+  }
+
+  *pnum_questions = num_questions;
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+  
+  free_lquestions(questions, num_questions);
+  *pnum_questions = 0;
+  *pquestions = NULL;
+  return nRes;
+}
+
+/* deallocate questions */
+static SWIsltsResult free_lquestions(LQUESTION ** questions, int num_questions)
+{ 
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  i;
+
+  if (questions) {
+    for (i=0; i<num_questions; i++) {
+      if (questions[i]->list) {
+        FREE(questions[i]->list);
+        questions[i]->list = NULL;
+      }
+      FREE(questions[i]);
+      questions[i] = NULL;
+    }
+    FREE(questions);
+  }
+  return nRes;
+}
+
+static SWIsltsResult load_letter_mapping(PORT_FILE *fp, LM **ppLetterMap)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  unsigned char        len;
+  LM                 * lm;
+  int                  i;
+
+  /*  pfprintf(PSTDOUT,"got len %d\n", len);*/
+  lm = (LM*) lts_alloc(1, sizeof(LM));
+  if (lm == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  PORT_FREAD_CHAR(&len, sizeof(char), 1, fp);
+  lm->num_letters = len;
+
+  lm->letters = (char*) lts_alloc(len, sizeof(char));
+  if (lm->letters == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  lm->type = (char*) lts_alloc(len, sizeof(char));
+  if (lm->type == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  PORT_FREAD_CHAR(lm->letters, sizeof(char), len, fp);
+  PORT_FREAD_CHAR(lm->type, sizeof(char), len, fp);
+
+  { 
+    unsigned int letter;
+    for (letter=0; letter <= UCHAR_MAX; letter++) 
+      lm->letter_index_for_letter[letter] = LTS_MAXCHAR;
+  }
+
+  for (i=0;i<len;i++) {
+    char letter = toupper(lm->letters[i]);
+    lm->letters[i] = letter;
+    lm->letter_index_for_letter[(unsigned char)letter] = i;
+  }
+  *ppLetterMap = lm;
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+  free_letter_mapping(lm);
+  *ppLetterMap = NULL;
+  return nRes;
+}
+
+/* deallocate letter mapping */
+static SWIsltsResult free_letter_mapping(LM *lm)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+
+  if (lm) {
+    if (lm->letters) {
+      FREE(lm->letters);
+      lm->letters = NULL;
+    }
+    if (lm->type) {
+      FREE(lm->type);
+      lm->type = NULL;
+    }
+    lm->num_letters = 0;
+    FREE(lm);
+  }
+  return nRes;
+}
+
+static SWIsltsResult load_phone_mapping(PORT_FILE *fp, PM **ppPhoneMap)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  PM                 * pm;
+  int                  i;
+  unsigned char        len;
+  char               * ph;
+
+  pm = (PM*) lts_alloc(1, sizeof(PM));
+  if (pm == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  pm->num_phones = load_int(fp);
+
+  pm->phones = (char**) lts_alloc(pm->num_phones, sizeof(char*));
+  if (pm->phones == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  for (i=0;i<pm->num_phones;i++) {
+    PORT_FREAD_CHAR(&len, sizeof(unsigned char), 1, fp);
+
+    pm->phoneH = NULL;
+    pm->phones[i] = ph = (char*) lts_alloc(len+1, sizeof(char));
+    if (ph == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+    PORT_FREAD_CHAR(ph, sizeof(char), len, fp);
+    ph[len] = '\0';
+  }
+  pm->phoneH = my_PHashTableCreate_FromStrings( (const char**)pm->phones, 
+						pm->num_phones, 
+						L("lts.phoneH"));
+  if(pm->phoneH == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+  *ppPhoneMap = pm;
+  return SWIsltsSuccess;
+  
+ CLEAN_UP:
+  free_phone_mapping(pm);
+  *ppPhoneMap = NULL;
+
+  return nRes;
+}
+
+/* deallocate phone mapping */
+static SWIsltsResult free_phone_mapping(PM *pm)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  i;
+
+  if (pm) {
+    if (pm->phones) {
+      for (i=0; i<pm->num_phones; i++) {
+        if (pm->phones[i]) {
+          FREE(pm->phones[i]);
+          pm->phones[i] = NULL;
+        }
+      }
+      FREE(pm->phones);
+      pm->phones = NULL;
+    }
+    if(pm->phoneH) 
+      PHashTableDestroy( (PHashTable*)pm->phoneH);
+    pm->phoneH = NULL;
+    FREE(pm);
+  }
+  return nRes;
+}
+
+
+static SWIsltsResult load_outputs(char ***poutputs, char ***pinputs, int *pnum, PORT_FILE *fp)
+{
+  SWIsltsResult        nRes = SWIsltsSuccess;
+  int                  i;
+  char              ** outputs = NULL;
+  char              ** inputs = NULL;
+  int                  num;
+  unsigned char        olen;
+  char               * out;
+  unsigned char        ilen;
+  char               * in;
+
+  num = load_int(fp);
+
+  *poutputs = outputs = (char **) lts_alloc(num, sizeof(char*));
+  if (outputs == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  *pinputs = inputs = (char **) lts_alloc(num, sizeof(char*));
+  if (inputs == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  for (i=0;i<num;i++) {
+    PORT_FREAD_CHAR(&olen, sizeof(char), 1, fp);
+    out = outputs[i] = lts_alloc(olen + 1, sizeof(char));
+    if (out == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+    if (olen > 0) {
+      PORT_FREAD_CHAR(out, sizeof(char), olen, fp);
+    }
+    out[olen] = '\0';
+    PORT_FREAD_CHAR(&ilen, sizeof(char), 1, fp);
+    in = inputs[i] = lts_alloc(ilen + 1, sizeof(char));
+    if (in == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+    if (ilen > 0) {
+      PORT_FREAD_CHAR(in, sizeof(char), ilen, fp);
+    }
+    in[ilen] = '\0';
+#if PRINT_LOAD_TREE
+    if (ilen > 0) pfprintf(PSTDOUT,"LOAD_TREE: got input %s out %s\n", in, outputs[i]);
+    pfprintf(PSTDOUT,"LOAD_TREE: outputs[%d] len %d out %x out %s\n", i, olen, outputs[i], outputs[i]);
+#endif
+  }
+
+  *pnum = num;
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+  
+  free_outputs(outputs, inputs, num);
+  *poutputs = NULL;
+  *pinputs = NULL;
+  *pnum = 0;
+
+  return nRes;
+}
+
+static SWIsltsResult free_outputs(char **outputs, char **inputs, int num)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  i;       
+
+  if (outputs) {
+    for (i=0; i<num; i++) {
+      if (outputs[i]) {
+        FREE(outputs[i]);
+        outputs[i] = NULL;
+      }
+    }
+    FREE(outputs);
+  }
+
+  if (inputs) {
+    for (i=0; i<num; i++) {
+      if (inputs[i]) {
+        FREE(inputs[i]);
+        inputs[i] = NULL;
+      }
+    }
+    FREE(inputs);
+  }
+  return nRes;
+}
+
+static SWIsltsResult load_trees(RT_LTREE ***ptrees, int *num_letters,
+                      LQUESTION ***pquestions, int *num_questions, LM **plm, PORT_FILE *fp)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  let, i;
+  RT_LTREE           * tree = NULL;
+  RT_LTREE          ** trees = NULL;
+
+#if PRINT_LOAD_TREE_SUMMARY
+  pfprintf(PSTDOUT,"loading letter mapping\n");
+#endif
+  *ptrees = NULL;
+  *pquestions = NULL;
+  *plm = NULL;
+
+  nRes = load_letter_mapping(fp, plm);
+  if (nRes != SWIsltsSuccess) {
+    goto CLEAN_UP;
+  }
+
+#if PRINT_LOAD_TREE_SUMMARY
+  pfprintf(PSTDOUT,"loading questions\n");
+#endif
+
+  nRes = load_lquestions(pquestions, num_questions, fp);
+  if (nRes != SWIsltsSuccess) {
+    goto CLEAN_UP;
+  }
+
+  *num_letters = load_int(fp);
+
+  if (*num_letters != (*plm)->num_letters) {
+#ifndef NO_STDERR      
+    PLogError(L("Error loading data, num_letters %d doesn't match num from mapping %d\n"), 
+            *num_letters, (*plm)->num_letters);
+#endif
+    nRes = SWIsltsInternalErr;
+    goto CLEAN_UP;
+  }
+
+  *ptrees = trees = (RT_LTREE**) lts_alloc(*num_letters, sizeof(RT_LTREE*));
+  if (trees == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  for (let=0;let<*num_letters;let++) {
+    /*    pfprintf(PSTDOUT,"loading for t %d\n", t);*/
+
+    trees[let] = tree = (RT_LTREE*) lts_alloc(1, sizeof(RT_LTREE));
+    if (tree == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+    tree->num_nodes = load_int(fp);
+
+    tree->values_or_question1 = (short*) lts_alloc(tree->num_nodes, sizeof(short));
+    if (tree->values_or_question1 == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+    tree->question2 = (short*) lts_alloc(tree->num_nodes, sizeof(short));
+    if (tree->question2 == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+    tree->left_nodes = (short *) lts_alloc(tree->num_nodes, sizeof(short));
+    if (tree->left_nodes == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+#if PRINT_LOAD_TREE
+    pfprintf(PSTDOUT,"LOAD_TREE: Tree for let %d num_nodes %d\n", let, tree->num_nodes);
+#endif
+
+    for (i=0;i<tree->num_nodes;i++) {
+      PORT_FREAD_INT16(&(tree->left_nodes[i]), sizeof(short), 1, fp);
+      PORT_FREAD_INT16(&(tree->values_or_question1[i]), sizeof(short), 1, fp);
+
+#if PRINT_LOAD_TREE
+      pfprintf(PSTDOUT,"LOAD_TREE:  node[%d] %d %d", i, tree->left_nodes[i], tree->values_or_question1[i]);
+#endif
+
+      PORT_FREAD_INT16(&(tree->question2[i]), sizeof(short), 1, fp);
+      if (tree->left_nodes[i] != NO_NODE) {
+        if (tree->question2[i] == -1) tree->question2[i] = 0;
+#if PRINT_LOAD_TREE
+        pfprintf(PSTDOUT," %x", (unsigned short) tree->question2[i]);
+#endif
+      }
+
+#if PRINT_LOAD_TREE
+      pfprintf(PSTDOUT,"\n");
+#endif
+    }
+  }
+
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+
+  free_trees(trees, *num_letters, *pquestions, *num_questions, *plm);
+  *ptrees = NULL;
+  *pquestions = NULL;
+  *plm = NULL;
+  *num_letters = 0;
+  *num_questions = 0;
+
+  return nRes;
+}
+
+/* deallocate trees */
+static SWIsltsResult free_trees(RT_LTREE **trees, int num_letters, 
+                       LQUESTION **questions, int num_questions, LM *lm)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  i;
+  RT_LTREE           * tree;
+
+  if (lm) {
+    free_letter_mapping(lm);
+  }
+  if (questions) {
+    free_lquestions(questions, num_questions);
+  }
+
+  if (trees) {
+    for (i=0; i<num_letters; i++) {
+      if (trees[i]) {
+        tree = trees[i];  
+        if (tree->values_or_question1) {
+          FREE(tree->values_or_question1);
+          tree->values_or_question1 = NULL;
+        }
+        if (tree->question2) {
+          FREE(tree->question2);
+          tree->question2 = NULL;
+        }
+        if (tree->left_nodes) {
+          FREE(tree->left_nodes);
+          tree->left_nodes = NULL;
+        }
+        FREE(trees[i]);
+        trees[i] = NULL;
+      }
+    }    
+    FREE(trees);
+  }
+  return nRes;
+}
+
+static SWIsltsResult load_allowable_cons_comb(LTS *lts, PORT_FILE *fp)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  char                line[50];
+  char                tempstr[50];
+  char              * tok;
+  int                 i, toklen;
+  int                 count;
+  char          seps[] = " 	\n";
+
+  lts->num_cons_comb = 0;
+  lts->allowable_cons_combH = NULL;
+
+  while (PORT_FGETS(line, 50, fp)) {
+
+#ifndef TI_DSP
+
+    /*need to get rid of sme crud at the end of the line because it is being read in binary mode*/
+    for (i=strlen(line)-1;i>=0;i--) {
+      if (!isalpha(line[i])) line[i] = ' ';
+    }
+#endif
+    count = 0;
+    tok = safe_strtok(line, seps, &toklen);    
+    tempstr[0] = '\0';
+
+    /* get all available sequence of tokens */
+    while(tok && toklen > 0){
+      count += toklen;  
+      strncat(tempstr, tok, toklen);
+      tempstr[count+1] = '\0';
+      strcat(tempstr, " ");
+      count++;
+
+      tok = safe_strtok(tok+toklen, seps, &toklen);
+    }
+    if (count > 0) {
+
+        /* delete the final space */
+        tempstr[count-1] = '\0';
+    
+        lts->allowable_cons_comb[lts->num_cons_comb] = (char*) lts_alloc(strlen(tempstr)+1, sizeof(char));
+        if (lts->allowable_cons_comb[lts->num_cons_comb] == NULL) {
+          nRes = SWIsltsErrAllocResource;
+          goto CLEAN_UP;
+        }
+    
+        strcpy(lts->allowable_cons_comb[lts->num_cons_comb], tempstr);
+    
+#if PRINT_CONS_COMB
+        pfprintf(PSTDOUT,"LOAD_TREE: allowable_cons_comb[%d]: %s\n", lts->num_cons_comb, tempstr);
+#endif
+    
+        lts->num_cons_comb++;
+        if (lts->num_cons_comb >= MAX_CONS_COMB) {
+#ifndef NO_STDERR      
+            PLogError(L("MAX_CONS_COMB %d exceeded\n"), MAX_CONS_COMB);
+#endif
+          nRes = SWIsltsInternalErr;
+          goto CLEAN_UP;
+        }
+    }
+  }
+  if (lts->num_cons_comb == 0) {
+#ifndef NO_STDERR
+    PLogError(L("Warning: the data file is missing consonant combinations - syllable boundaries will be incorrect\n"));
+#endif  
+  }
+  lts->allowable_cons_combH = my_PHashTableCreate_FromStrings( (const char**)lts->allowable_cons_comb, lts->num_cons_comb, L("lts.allowable_cons_combH"));
+  if(lts->allowable_cons_combH == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+#if PRINT_LOAD_TREE_SUMMARY
+  pfprintf(PSTDOUT,"loaded %d cons combinations\n", lts->num_cons_comb);
+#endif
+
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+
+  free_allowable_cons_comb(lts);
+
+  return nRes;
+}
+
+static SWIsltsResult free_allowable_cons_comb(LTS *lts)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  i;
+
+  for (i=0; i<lts->num_cons_comb; i++) {
+    if (lts->allowable_cons_comb[i]) {
+      FREE(lts->allowable_cons_comb[i]);
+      lts->allowable_cons_comb[i] = NULL;
+    }
+  }
+  if(lts->allowable_cons_combH) 
+    PHashTableDestroy( (PHashTable*)lts->allowable_cons_combH);
+  lts->allowable_cons_combH = NULL;
+  return nRes;
+}
+
+static SWIsltsResult load_question_strings(LTS* lts, PORT_FILE* fp) 
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  i;
+  int                  num;
+  unsigned char        len;
+  char              ** strings;
+  char               * str;
+
+  num = load_int(fp);
+
+  lts->strings = strings = (char **) lts_alloc(num, sizeof(char*));
+  lts->string_lens = (char*)lts_alloc(num, sizeof(char));
+
+  if (strings == NULL || lts->string_lens == NULL ) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  for (i=0;i<num;i++) {
+    PORT_FREAD_CHAR(&len, sizeof(char), 1, fp);
+
+    str = strings[i] = lts_alloc(len + 1, sizeof(char));
+    if (str == NULL) {
+      nRes = SWIsltsErrAllocResource;
+      goto CLEAN_UP;
+    }
+
+    if (len > 0) {
+      PORT_FREAD_CHAR(str, sizeof(char), len, fp);
+    }
+    str[len] = '\0';
+
+    bitarray_populate_from_list( lts->membership, lts->strings[i], len);
+    lts->string_lens[i] = strlen(lts->strings[i]);
+  }
+
+  // *pnum = num;
+  lts->num_strings = num; 
+
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+
+  free_question_strings(lts); 
+
+  return nRes;
+}
+
+/* deallocate question strings */
+static SWIsltsResult free_question_strings(LTS* lts) 
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  i;
+
+  if (lts->strings) {
+    for (i=0;i<lts->num_strings;i++) {
+      if (lts->strings[i]) {
+        FREE(lts->strings[i]);
+        lts->strings[i] = NULL;
+      }
+    }
+    FREE(lts->strings);
+    if(lts->string_lens) FREE(lts->string_lens);
+    lts->strings = NULL;
+    lts->string_lens = NULL;
+  }
+  return nRes;
+}
+
+
+SWIsltsResult create_lts(char *data_filename, LTS_HANDLE *phLts)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  LTS                * lts;
+
+#ifdef USE_STATIC_SLTS  
+  /* TODO: language-specific ID here? */
+  lts = &g_lts;
+
+#else /* !USE_STATIC_SLTS */
+  
+  PORT_FILE *fp;
+
+  lts = (LTS*) lts_alloc(1, sizeof(LTS));
+  if (lts == NULL) {
+    nRes = SWIsltsErrAllocResource;
+    goto CLEAN_UP;
+  }
+
+  fp = PORT_FOPEN(data_filename, "rb");
+  if (fp == NULL) {
+#ifndef NO_STDERR
+    PLogError(L("Cannot open %s\n"), data_filename);
+#endif    
+    nRes = SWIsltsFileOpenErr;
+    goto CLEAN_UP;
+  }
+   nRes = load_phone_mapping(fp, &lts->phone_mapping);
+   if (nRes != SWIsltsSuccess) {
+     PLogError(L("SWIsltsErr: load_phone_mapping() failed: Err_code = %d\n"), nRes);
+     goto CLEAN_UP;
+   }
+
+   nRes = load_question_strings(lts, fp); 
+   if (nRes != SWIsltsSuccess) {
+     PLogError(L("SWIsltsErr: load_question_strings() failed: Err_code = %d\n"), nRes);
+     goto CLEAN_UP;
+   }
+
+   nRes  = load_outputs(&(lts->outputs), &(lts->input_for_output), &lts->num_outputs, fp);
+   if (nRes != SWIsltsSuccess) {
+     PLogError(L("SWIsltsErr: load_outputs() failed: Err_code = %d\n"), nRes);
+     goto CLEAN_UP;
+   }
+
+#if PRINT_LOAD_TREE
+  pfprintf(PSTDOUT,"LOAD_TREE: got %d outputs, loading trees\n", lts->num_outputs);
+#endif
+
+  nRes = load_trees(&(lts->trees), &(lts->num_letters),
+                 &(lts->questions), &(lts->num_questions),
+                 &(lts->letter_mapping),
+                 fp);
+  if (nRes != SWIsltsSuccess) {
+    PLogError(L("SWIsltsErr: load_trees() failed: Err_code = %d\n"), nRes);
+    goto CLEAN_UP;
+  }
+
+  nRes = load_allowable_cons_comb(lts, fp);
+  if (nRes != SWIsltsSuccess) {
+    PLogError(L("SWIsltsErr: load_allowable_cons_comb() failed: Err_code = %d\n"), nRes);
+    goto CLEAN_UP;
+  }
+
+  PORT_FCLOSE(fp);
+
+#endif /* !USE_STATIC_SLTS */
+
+  *phLts = lts;
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+
+  free_lts(lts);
+  *phLts = NULL;
+  return nRes;
+}
+
+/* deallocates LTS */
+SWIsltsResult free_lts(LTS_HANDLE hlts)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  LTS                * lts = (LTS *)hlts;
+
+  if (lts) {
+
+#ifndef USE_STATIC_SLTS 
+    free_phone_mapping(lts->phone_mapping);
+    free_question_strings(lts); 
+    lts->strings = NULL;
+    lts->phone_mapping = NULL;
+
+    free_outputs(lts->outputs, lts->input_for_output, lts->num_outputs);
+    lts->input_for_output = lts->outputs = NULL;
+    
+    free_trees(lts->trees, lts->num_letters, 
+               lts->questions, lts->num_questions, 
+               lts->letter_mapping);
+    lts->trees = NULL;
+    lts->questions = NULL;
+    lts->letter_mapping = NULL;
+    
+    free_allowable_cons_comb(lts);
+    FREE(lts);
+#endif /* !USE_STATIC_LTS */
+  }
+
+  return nRes;
+}
+
+
+int find_phone(const char *ph, PM *pm)
+{
+  ESR_ReturnCode rc;
+  int iRet = -1;
+  rc = PHashTableGetValue((PHashTable*)pm->phoneH, ph, (void**)(void*)&iRet);
+  if (rc != ESR_SUCCESS) 
+    PLogError("error while in find_phone(%s,%x)\n", ph, pm);
+  return iRet;
+}
+
+int find_best_string(const char *str, LTS* lts) 
+{
+  int i, maxlen, maxi, len;
+  int len_str;
+
+  if(str[0] == '\0')   return -1;
+  len_str = strlen(str);
+
+  maxi = -1;
+  maxlen = 0;
+  
+  for (i=0;i<lts->num_strings;i++) {
+    len = lts->string_lens[i];
+    if( len > len_str) 
+      continue; /* no point in comparison */
+    if (strncmp(str, lts->strings[i], len) == 0) {
+      if (len > maxlen) {
+	maxlen = len;
+        maxi = i;
+      }
+    }
+  }
+  return maxi;
+}
+
+int find_best_prefix_string(const char *str, LTS* lts) 
+{
+  int i;
+  int maxlen;
+  int maxi;
+  int len;
+  int prelen;
+
+  maxi = -1;
+  maxlen = 0;
+
+  prelen = strlen(str);
+
+  for (i=0;i<lts->num_strings;i++) {
+    len = lts->string_lens[i];
+    if (len <= prelen) {
+      if (strncmp(str + (prelen - len), lts->strings[i], len) == 0) {
+        if (len > maxlen) {
+          maxlen = len;
+          maxi = i;
+        }
+      }
+    }
+  }
+  return maxi;
+}
+
+int fill_up_dp_for_letter(LTS *lts, const char *input_word, int word_len, int index, int root_start, int root_end, int left_phone)
+{
+  int i,j;
+  LDP *dp;
+  unsigned char letter;
+  int hit_wb;
+  LM *lm;
+  unsigned char word[MAX_WORD_LEN];
+  char tempstr[MAX_WORD_LEN];
+  int first_syl_end;
+  int last_syl_start;
+
+  dp = &(lts->dp);
+  lm = lts->letter_mapping;
+
+  /* the LTS decision tree does not seem to be well trained at all for 
+     the letter ' when followed by "s"  ... It seems to result in the 
+	 phoneme 'm', which is wrong.   "'t" seems to be OK though. 
+	 BAD: Kevin's : k6v6nmz ...  pal's : palmz ... paul's : p{lz
+	 BAD: janice's : jan6s6mz ... tom's house : t)mmz&h?s ... tonya's : t)ny6mz
+	 BAD: jake's house : jAk6mz&h?s
+	 Ignoring ' as below we get ...  
+     BETTER: Kevin's : kev6nz  ... pal's : palz ... paul's : p{lz  
+	 BETTER: janice's : jan6s6s ... tom's house : t)mz&h?s ... tonya's : t)ny6s
+	 BETTER: jake's house : jAk6s&h?s
+	 The proper solution requires a legitimate text normalizer with special 
+	 handling of cases like 's which would always put a "z" there, 
+	 except if preceded by an unvoiced stop (ptk) which requires a "s" there.
+	 For now let's just skip the ' letter, which testing shows to be generally
+	 safe (janice's, jake's etc are better but still not quite right). */
+
+  if(input_word[index] == '\'') 
+    return 1; // same as unknown character
+
+  letter = find_letter_index(input_word[index], lm); 
+
+  if (letter == LTS_MAXCHAR) {
+  /* lisa - we need to decide how to handle this case.  Do we just silently skip unknown 
+    characters or warn the app or user somehow*/
+#ifdef NO_STDERR
+    PrintError("unknown character on input %c - skipping\n", input_word[index], NULL, NULL);
+#else    
+    PLogError(L("unknown character on input %c - skipping\n"), input_word[index]);
+#endif    
+    return 1;
+  }
+
+  hit_wb = 0;
+
+  /*pfprintf(PSTDOUT,"left context\n");*/
+
+  for (j=0;j<5;j++) {
+    if (hit_wb) {
+      dp->properties[ Left1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm); 
+    } else {
+      i = index - (j+1);
+      if (i < 0) dp->properties[ Left1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm); 
+      else {
+        dp->properties[ Left1+j] = find_letter_index(input_word[i], lm); 
+        if (dp->properties[ Left1+j] == LTS_MAXCHAR) { /*assume an unknown character is a word boundary*/
+          dp->properties[ Left1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm); 
+          hit_wb = 1;
+        }
+      }
+    }
+  }
+
+  /*pfprintf(PSTDOUT,"right context\n");*/
+
+  hit_wb = 0;
+  for (j=0;j<5;j++) {
+    if (hit_wb) {
+      dp->properties[ Right1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm); 
+    } else {
+      i = index + (j+1);
+      if (i >= word_len) dp->properties[Right1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm); 
+      else {
+        dp->properties[ Right1+j] = find_letter_index(input_word[i], lm); 
+        if (dp->properties[ Right1+j] == LTS_MAXCHAR) { /*assume an unknown character is a word boundary*/
+          dp->properties[ Right1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm); 
+          hit_wb = 1;
+        }
+      }
+    }
+  }
+
+  dp->letter = letter; // properties[ Letter] = letter;
+
+  dp->properties[ LeftPhone1] = left_phone;
+
+  /*pfprintf(PSTDOUT,"word stuff\n"); */
+
+  /*find word start and end - use unknown character as word boundaries*/
+
+  dp->properties[ WordLen] = word_len;
+
+  if (index == 0) dp->properties[ LetInWord] = 0;
+  else if (index == word_len-1) dp->properties[ LetInWord] = 2;
+  else dp->properties[ LetInWord] = 1;
+
+  for (i=0;i<word_len;i++) {
+    word[i] = find_letter_index(input_word[i], lm);  
+  }
+
+  /*figure out syllable in word - not really syllables - just looks to see if is or at first or last vowel*/
+  /*  pfprintf(PSTDOUT,"syl stuff\n");*/
+
+  first_syl_end = word_len;
+  for (i=0;i<word_len;i++) {
+    if (lm->type[word[i]] == 1) {
+      for (j=i+1;j<word_len;j++) {
+        if (lm->type[word[j]] != 1) break;
+      }
+      first_syl_end = j;
+      break;
+    }
+  }
+  last_syl_start = 0;
+  for (i=word_len-1;i>=0;i--) {
+    if (lm->type[word[i]] == 1) {
+      for (j=i-1;j>=0;j--) {
+        if (lm->type[word[j]] != 1) break;
+      }
+      last_syl_start = j;
+      break;
+    }
+  }
+
+#if PRINT_DP_LETTER  
+  pfprintf(PSTDOUT,"first_syl_end %d last_syl_start %d\n", first_syl_end, last_syl_start);
+#endif
+
+  if (index > last_syl_start) dp->properties[ SylInWord] = 2;
+  else if (index < first_syl_end) dp->properties[ SylInWord] = 0;
+  else dp->properties[ SylInWord] = 1;
+
+  first_syl_end = word_len;
+  for (i=0;i<word_len;i++) {
+    if (lm->type[word[i]] == 1) {
+      for (j=i+1;j<word_len;j++) {
+        if (lm->type[word[j]] != 1) break;
+      }
+      for (;j<word_len;j++) {
+        if (lm->type[word[j]] == 1) break;
+      }
+      first_syl_end = j;
+      break;
+    }
+  }
+  last_syl_start = 0;
+  for (i=word_len-1;i>=0;i--) {
+    if (lm->type[word[i]] == 1) {
+      for (j=i-1;j>=0;j--) {
+        if (lm->type[word[j]] != 1) break;
+      }
+      for (;j>=0;j--) {
+        if (lm->type[word[j]] == 1) break;
+      }
+      last_syl_start = j;
+      break;
+    }
+  }
+
+#if PRINT_DP_LETTER
+  pfprintf(PSTDOUT,"first_syl_end %d last_syl_start %d\n", first_syl_end, last_syl_start);
+#endif
+
+  if (index > last_syl_start) dp->properties[ Syl2InWord] = 2;
+  else if (index  < first_syl_end) dp->properties[ Syl2InWord] = 0;
+  else dp->properties[Syl2InWord] = 1;
+
+
+  first_syl_end = word_len;
+  for (i=root_start;i<root_end;i++) {
+    if (lm->type[word[i]] == 1) {
+      for (j=i+1;j<word_len;j++) {
+        if (lm->type[word[j]] != 1) break;
+      }
+      first_syl_end = j;
+      break;
+    }
+  }
+  last_syl_start = 0;
+  for (i=root_end-1;i>=root_start;i--) {
+    if (lm->type[word[i]] == 1) {
+      for (j=i-1;j>=0;j--) {
+        if (lm->type[word[j]] != 1) break;
+      }
+      last_syl_start = j;
+      break;
+    }
+  }
+
+#if PRINT_DP_LETTER
+  pfprintf(PSTDOUT,"first_syl_end %d last_syl_start %d\n", first_syl_end, last_syl_start);
+#endif
+
+  if (index > last_syl_start) dp->properties[SylInRoot] = 2;
+  else if (index < first_syl_end) dp->properties[ SylInRoot] = 0;
+  else dp->properties[ SylInRoot] = 1;
+
+  first_syl_end = word_len;
+  for (i=root_start;i<root_end;i++) {
+    if (lm->type[word[i]] == 1) {
+      for (j=i+1;j<word_len;j++) {
+        if (lm->type[word[j]] != 1) break;
+      }
+      for (;j<word_len;j++) {
+        if (lm->type[word[j]] == 1) break;
+      }
+      first_syl_end = j;
+      break;
+    }
+  }
+  last_syl_start = 0;
+  for (i=root_end-1;i>=root_start;i--) {
+    if (lm->type[word[i]] == 1) {
+      for (j=i-1;j>=0;j--) {
+        if (lm->type[word[j]] != 1) break;
+      }
+      for (;j>=0;j--) {
+        if (lm->type[word[j]] == 1) break;
+      }
+      last_syl_start = j;
+      break;
+    }
+  }
+
+#if PRINT_DP_LETTER  
+  pfprintf(PSTDOUT,"first_syl_end %d last_syl_start %d\n", first_syl_end, last_syl_start);
+#endif
+
+  if (index > last_syl_start) dp->properties[Syl2InRoot] = 2;
+  else if (index  < first_syl_end) dp->properties[Syl2InRoot] = 0;
+  else dp->properties[Syl2InRoot] = 1;
+
+
+  dp->properties[Left_DFRE] = index - root_start;
+  dp->properties[Right_DFRE] = (root_end - index) - 1;
+
+
+  /*  pfprintf(PSTDOUT,"strings\n");*/
+#if PRINT_DP_LETTER
+  pfprintf(PSTDOUT,"input word %s num_strings %d\n", input_word, lts->num_strings);
+#endif
+
+  dp->properties[RightString] = find_best_string(input_word+index+1, lts); 
+  strcpy(tempstr, input_word);
+  tempstr[index] = '\0';
+
+  dp->properties[LeftString] = find_best_prefix_string(tempstr, lts);
+
+#if PRINT_DP_LETTER
+  pfprintf(PSTDOUT,"dp %c ", lm->letters[dp->letter]);
+
+  for (i=0;i<word_len;i++) {
+    pfprintf(PSTDOUT,"%c", lm->letters[word[i]]);
+  }
+  pfprintf(PSTDOUT," %c%c%c {%c} %c%c%c liw %d siw %d s2iw %d nw %d sir %d s2ir %d left_DFRE %d right_DFRE %d\n",
+         lm->letters[dp->left_context[2]],
+         lm->letters[dp->left_context[1]],
+         lm->letters[dp->left_context[0]],
+         lm->letters[dp->letter],
+         lm->letters[dp->right_context[0]],
+         lm->letters[dp->right_context[1]],
+         lm->letters[dp->right_context[2]],
+         dp->let_in_word,
+         dp->syl_in_word,
+         dp->syl2_in_word,
+         dp->word_len,
+         dp->syl_in_root,
+         dp->syl2_in_root,
+         dp->left_DFRE, dp->right_DFRE);
+#endif
+
+  return 0;
+}
+
+int matches(LQUESTION *q1, LQUESTION *q2, int type, LDP *dp) 
+{
+  int m1, m2;
+  switch(type) {
+  case 0:
+    return qmatches(q1, dp);
+  case 1:
+    m1 = qmatches(q1, dp);
+    m2 = qmatches(q2, dp);
+    return(m1 && m2);
+  case 2:
+    m1 = qmatches(q1, dp);
+    m2 = qmatches(q2, dp);
+    return(m1 && !m2);
+  case 3:
+    m1 = qmatches(q1, dp);
+    m2 = qmatches(q2, dp);
+    return(!m1 && m2);
+  case 4:
+    m1 = qmatches(q1, dp);
+    m2 = qmatches(q2, dp);
+    return(!m1 && !m2);
+  default:
+    return -1;
+  }
+  /* should not come here */
+  return -1;
+}
+
+int find_output_for_dp(LTS *lts, int *pbackoff_output)
+{
+  LDP *dp;
+  int index;
+  RT_LTREE *tree;
+  LQUESTION *q1;
+  LQUESTION *q2;
+  int comb_type;
+  int q2_index;
+  int left_index;
+
+  dp = &(lts->dp);
+  tree = lts->trees[dp->letter]; // properties[Letter]];
+
+  index = 0;
+
+  while (1) {
+    left_index = tree->left_nodes[index];
+
+    if (left_index == NO_NODE) { /*means its a leaf node*/
+      *pbackoff_output = tree->question2[index];
+      return tree->values_or_question1[index];
+    }
+    q1 = lts->questions[tree->values_or_question1[index]];
+    q2_index = tree->question2[index] & 0x1FFF;
+    comb_type = (tree->question2[index] & 0xE000) >> 13;
+
+    q2 = lts->questions[q2_index];
+
+    if (matches(q1, q2, comb_type, dp)) {
+      index = left_index;
+    } else {
+      index = left_index+1;
+    }
+  }
+}
+int add_output(char *output, char **output_phone_string, int out_len, int max_phone_length)
+{
+  char *tok;
+  int toklen;
+  char seps[] = " ";
+
+  if (strlen(output) == 0) return out_len;
+
+  tok = safe_strtok(output, seps, &toklen);
+  while (tok && toklen) {
+    if ((toklen > 0) && (strncmp(tok, "null", 4) != 0)) {
+
+      if (isdigit(tok[toklen-1])) {
+        /*means it's a vowel.  So, add a syllable boundary.  It's position 
+          gets adjusted later by adjust_syllable_boundaries()*/
+        strcpy(output_phone_string[out_len++], LTS_MARKER_SYLL_START);
+        if (out_len >= max_phone_length) return max_phone_length;
+      }      
+      strncpy(output_phone_string[out_len], tok, toklen);
+      output_phone_string[out_len++][toklen] = '\0';
+      if (out_len >= max_phone_length) return max_phone_length;
+    }
+    tok = safe_strtok(tok+toklen, seps, &toklen);
+  }
+  return out_len;
+}
+
+int is_allowable_cons_comb(LTS *lts, const char *cons_string)
+{
+  /* int i;
+     for (i=0;i<lts->num_cons_comb;i++) {
+     #if PRINT_CONS_COMB    
+     pfprintf(PSTDOUT,"checking {%s} vs c[%d] {%s}\n", cons_string, i, lts->allowable_cons_comb[i]);
+     #endif    
+     if (strcmp(cons_string, lts->allowable_cons_comb[i]) == 0) return 1;
+     }
+     return 0;
+  */
+  ESR_ReturnCode rc; 
+  void* iVal = NULL;
+  rc = PHashTableGetValue( (PHashTable*)lts->allowable_cons_combH, cons_string, &iVal);
+  if(rc == ESR_SUCCESS) 
+    return 1;
+  else 
+    return 0;
+}
+
+
+
+
+
+void adjust_syllable_boundaries(LTS *lts, char **output_phone_string, int num_out, int max_phone_length)
+{
+  char *out;
+  int i,j;
+  int syl_start;
+  int stress = 0;
+  int first_syl_bound;
+
+  char tempstr[20];
+
+  /*there should already be a syllable boundary before each vowel (add_output put one there)*/
+  /*so just find these, then shift back by allowable consonant combinations and move the syllable mark*/
+
+  for (i=0;i<num_out;i++) {
+    out = output_phone_string[i];
+    if (strcmp(out, LTS_MARKER_SYLL_START) == 0) { /*means there is a syllable boundary
+      														 find start of allowable sequence*/
+
+      syl_start = 0;
+
+      for (j=i-1;j>0;j--) {
+        out = output_phone_string[j];
+        if (isdigit(out[strlen(out)-1])) {
+          syl_start = j+1;
+          break; /*means it's a vowel*/
+        }
+        if (strcmp(out, LTS_MARKER_WORD_START) == 0) {
+          syl_start = j+1;
+          break; /*don't push syl boundaries before word boundaries*/
+        }
+        if (strcmp(out, LTS_MARKER_PRON_START) == 0) {
+          syl_start = j+1;
+          break; /*don't push syl boundaries before phrase boundaries*/
+        }
+
+        /* for sequences longer than 2,
+           check 3-syllable onset first, then check 2-syllable onset */
+        if(j > 1){
+          sprintf(tempstr, "%s %s %s", output_phone_string[j-2], output_phone_string[j-1], 
+            output_phone_string[j]);
+          if (!is_allowable_cons_comb(lts, tempstr)) {          
+            sprintf(tempstr, "%s %s", output_phone_string[j-1], output_phone_string[j]);
+            if (!is_allowable_cons_comb(lts, tempstr)) {
+#if PRINT_CONS_COMB	  
+              pfprintf(PSTDOUT,"cons comb %s %s not allowed\n", output_phone_string[j-1], 
+                output_phone_string[j]);
+#endif
+              syl_start = j;
+              break;        
+            }
+          }
+        }        
+        /* for sequences shorter than 2 */
+        else
+        {
+          sprintf(tempstr, "%s %s", output_phone_string[j-1], output_phone_string[j]);
+          if (!is_allowable_cons_comb(lts, tempstr)) {
+#if PRINT_CONS_COMB	  
+            pfprintf(PSTDOUT,"cons comb %s %s not allowed\n", output_phone_string[j-1], 
+              output_phone_string[j]);
+#endif
+            syl_start = j;
+            break;        
+          }
+        } 
+      } /* end for j=i-1 */
+
+      /*shift over stuff between syl_start a gap*/
+      for (j=i;j>syl_start;j--) {
+        strcpy(output_phone_string[j], output_phone_string[j-1]);
+      }
+      /*now find stress level from phone (and remove it) and add it to syl bound*/
+
+      if (i<num_out-1) {
+        out = output_phone_string[i+1];
+
+        if (isdigit(out[strlen(out)-1])) {
+          stress = atoi(out + strlen(out)-1);
+        } else {
+          stress = 0; /*should not happen*/
+        }
+      } else {
+        stress = 0; /*should not happen*/
+      }
+
+      sprintf(output_phone_string[syl_start], LTS_MARKER_SYLL_START_DD, stress);
+    } /* end if (strcmp(out, LTS_MARKER_SYLL_START) == 0) */
+  } /* end for i=0 */
+
+  /*remove all the stress marking from the vowels*/
+  for (i=0;i<num_out;i++) {
+    out = output_phone_string[i];
+    if ((strncmp(out, LTS_MARKER_SYLL_START, 2) != 0) && isdigit(out[strlen(out)-1])) {
+      out[strlen(out)-1] = '\0'; /*remove the stress from the vowel*/
+    }
+  }
+
+  /* word boundary must be followed by syllable boundary
+    if no syllable boundary exists after a word boundary, move the first
+    syllable boundary to after the word boundary */
+  first_syl_bound = -1;
+  syl_start = -1;
+  for (i=1;i<num_out;i++) {
+    if ((strcmp(output_phone_string[i-1], LTS_MARKER_WORD_START) == 0) && 
+      (strncmp(output_phone_string[i], LTS_MARKER_SYLL_START, 2) != 0)) {
+
+      syl_start = i;
+      /* search for first occurance of syllable boundary */
+      for(j=syl_start+1;j<num_out; j++){
+        out = output_phone_string[j];
+        if(strncmp(out, LTS_MARKER_SYLL_START, 2) == 0 && isdigit(out[strlen(out)-1])){
+            stress = atoi(out + strlen(out)-1);
+            first_syl_bound = j;
+            break;
+        }
+      }
+
+      /* swap entries until syl bound reaches word bound */
+      if(first_syl_bound >= 0){
+        for(; j>syl_start; j--){
+          strcpy(output_phone_string[j], output_phone_string[j-1]);
+        }  
+        /* put syllable boundary after word boundary */
+        sprintf(output_phone_string[syl_start], LTS_MARKER_SYLL_START_DD, stress);
+        
+        /* advance i, reset variables */        
+        i = first_syl_bound;
+        first_syl_bound = syl_start = -1;
+
+      }  
+    }
+  }
+
+}
+
+
+SWIsltsResult lts_for_word(LTS *lts, char *word, int word_len, char **output_phone_string, int max_phone_length, int *pnum_out)
+{
+  SWIsltsResult          nRes = SWIsltsSuccess;
+  int                  i,j;
+  int                  root_start;
+  int                  root_end;
+  int                  output_index;
+  int                  left_phone;
+  char               * input_seq;
+  int                  found_match;
+  int                  start_num_out;
+  int                  backoff_output;
+  int                  num_out;
+
+  start_num_out = num_out = *pnum_out;
+
+  root_start = 0;
+  root_end = word_len;
+
+  for (i=0;i<word_len;i++) {
+
+    if ((i == 0) || (num_out == 0)) {
+      /*      pfprintf(PSTDOUT,"about to call find_phone1\n");*/
+      left_phone = find_phone(LTS_MARKER_PIPESEP, lts->phone_mapping);
+
+#if PRINT_LTS_WORD
+      pfprintf(PSTDOUT,"got phone %d for initial | (LTS_MARKER_PIPESEP)\n", left_phone);
+#endif	
+      if (left_phone < 0) {
+
+#ifdef NO_STDERR
+        PrintError("Error, cannot find | in phone mappings\n", NULL, NULL, NULL);
+#else 
+        PLogError(L("Error, cannot find | in phone mappings\n"));
+#endif          
+        nRes = SWIsltsInternalErr;
+        goto CLEAN_UP;
+      }
+    } else {
+
+#if PRINT_LTS_WORD        
+      pfprintf(PSTDOUT,"about to call find_phone2 num_out %d\n", num_out);
+      pfprintf(PSTDOUT,"out[%d] %s\n", num_out-1, output_phone_string[num_out-1]);
+#endif
+
+      if (strcmp(output_phone_string[num_out-1], LTS_MARKER_PRON_START) == 0) left_phone = find_phone(LTS_MARKER_PIPESEP, lts->phone_mapping);
+      else if (strcmp(output_phone_string[num_out-1], LTS_MARKER_WORD_START) == 0) left_phone = find_phone(LTS_MARKER_PIPESEP, lts->phone_mapping);
+      else left_phone = find_phone(output_phone_string[num_out-1], lts->phone_mapping);
+
+#if PRINT_LTS_WORD    
+      pfprintf(PSTDOUT,"got phone %d for %s\n", left_phone, output_phone_string[num_out-1]);
+#endif
+
+      if (left_phone < 0) {
+          
+#ifdef NO_STDERR
+        PrintError("Error, cannot find %s in phone mappings\n", (unsigned long)output_phone_string[num_out-1], NULL, NULL);
+#else 
+        PLogError(L("Error, cannot find %s in phone mappings\n"), output_phone_string[num_out-1]);
+#endif          
+        nRes = SWIsltsInternalErr;
+        goto CLEAN_UP;
+      }
+    }
+
+    /*    pfprintf(PSTDOUT,"calling fill up dp\n");*/
+    if (fill_up_dp_for_letter(lts, word, word_len, i, root_start, root_end, left_phone)) continue;
+
+    /*    pfprintf(PSTDOUT,"calling find output\n");*/
+    output_index = find_output_for_dp(lts, &backoff_output);
+
+#if PRINT_LTS_WORD
+    pfprintf(PSTDOUT,"got output %d\n", output_index);
+#endif
+
+    found_match = 1;
+
+    if (strlen(lts->input_for_output[output_index]) > 0) {
+        /*some extra input string to use up*/
+#if PRINT_LTS_WORD	
+      pfprintf(PSTDOUT,"GOT INPUT %s for %s letter %c\n", lts->input_for_output[output_index], word, word[i]);
+#endif
+
+      input_seq = lts->input_for_output[output_index];
+      if (input_seq[0] == '=') {
+        root_end = i;
+        input_seq = input_seq+1; /*skip suffix indicator*/
+      }
+      for (j=i+1;;j++) {
+        if (input_seq[j-(i+1)] == '\0') break;
+        if (input_seq[j-(i+1)] == '-') {
+          root_start = j;
+          break;
+        }
+        if (j >= word_len) {
+          found_match = 0;
+          break;
+        }
+
+        if (input_seq[j-(i+1)] != word[j]) {
+          found_match = 0;
+          break;
+        }
+      }
+      if (found_match) {
+        i = j-1;
+      }
+    }
+
+    if (!found_match) {
+#if PRINT_LTS_WORD	
+      pfprintf(PSTDOUT,"using backoff output %s instead of regular %s\n", 
+               lts->outputs[backoff_output], 
+               ts->outputs[output_index]);
+#endif
+
+      num_out = add_output(lts->outputs[backoff_output], output_phone_string, num_out, max_phone_length);
+    } 
+    else {
+      num_out = add_output(lts->outputs[output_index], output_phone_string, num_out, max_phone_length);
+    }
+    if (num_out >= max_phone_length) {
+      nRes = SWIsltsMaxInputExceeded;
+      goto CLEAN_UP;
+    }
+  }
+
+  *pnum_out = num_out;
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+
+  *pnum_out = 0;
+  return nRes;
+}
+
+
+
+SWIsltsResult run_lts(LTS_HANDLE h, FSM_DICT_HANDLE hdict, char *input_sentence, char **output_phone_string, int *phone_length)
+{
+  SWIsltsResult            nRes = SWIsltsSuccess;
+  int                    i;
+  int                    len;
+  int                    num_out = 0;
+  LTS                  * lts;  
+  int                    was_in_phrase;
+  char                   word[MAX_WORD_LEN];
+  int                    num_in_word;
+  int                    max_phone_length;
+  int                    pron_len;
+
+  max_phone_length = *phone_length;
+
+  len = strlen(input_sentence);
+
+  lts = (LTS*) h;
+
+  was_in_phrase = 0;
+
+  /*add a phrase start then word start at beginning*/
+
+  strcpy(output_phone_string[num_out++], LTS_MARKER_PRON_START);
+  if (num_out >= max_phone_length) {
+    nRes = SWIsltsMaxInputExceeded;
+    goto CLEAN_UP;
+  }
+
+  num_in_word = 0;
+  pron_len = 1;    // for the first time through
+
+  for (i=0;i<=len;i++) {
+
+#if PRINT_LTS_WORD    
+    pfprintf(PSTDOUT,"WORKING on letter %d %c\n", i, input_sentence[i]);
+#endif
+	
+    /* Treat hyphen as word delimiter.  Not quite right for German 
+       hyphenated compounds, but still an improvement. */
+    if ((input_sentence[i] == ' ') || (input_sentence[i] == '-') || (input_sentence[i] == '\t') || (i == len)) {
+      if (num_in_word>0 ) {
+        strcpy(output_phone_string[num_out++], LTS_MARKER_WORD_START);
+        if (num_out >= max_phone_length) {
+          nRes = SWIsltsMaxInputExceeded;
+          goto CLEAN_UP;
+        }
+
+        word[num_in_word] = '\0';
+        
+        if (1) {
+
+#if PRINT_DICT_LOOKUP    
+          pfprintf(PSTDOUT,"Did not find %s in dictionary\n", word);
+#endif
+		  pron_len = -num_out;
+          nRes = lts_for_word(lts, word, num_in_word, output_phone_string, max_phone_length, &num_out);
+		  pron_len += num_out; // now pron_len is the number of phonemes/markers added
+		  if(pron_len == 0) 
+			  num_out--; // to backspace on the LTS_MARKER_WORD_START !!
+          if (nRes != SWIsltsSuccess) {
+            goto CLEAN_UP;
+          }
+        }        
+        num_in_word = 0;
+      }
+    } 
+    else if ( (input_sentence[i] == '.') 
+                || (input_sentence[i] == ',')
+                || (input_sentence[i] == '!')
+                || (input_sentence[i] == '?')
+                || (input_sentence[i] == '\n')) {
+      if (was_in_phrase) { 
+        /*add a phrase boundary after lts is called*/
+        if (num_in_word > 0) {
+          strcpy(output_phone_string[num_out++], LTS_MARKER_WORD_START);
+          if (num_out >= max_phone_length) {
+            nRes = SWIsltsMaxInputExceeded;
+            goto CLEAN_UP;
+          }
+
+          word[num_in_word] = '\0';
+          
+          if (1) {
+            nRes = lts_for_word(lts, word, num_in_word, output_phone_string, max_phone_length, &num_out);
+            if (nRes != SWIsltsSuccess) {
+              goto CLEAN_UP;
+            }
+          }
+          num_in_word = 0;
+        }
+        strcpy(output_phone_string[num_out++], LTS_MARKER_PRON_START);
+        if (num_out >= max_phone_length) {
+          nRes = SWIsltsMaxInputExceeded;
+          goto CLEAN_UP;
+        }
+        was_in_phrase = 0;
+      }
+    }
+    else {
+      if (num_in_word < MAX_WORD_LEN-1) {
+        word[num_in_word++] = toupper(input_sentence[i]);
+        was_in_phrase = 1;
+      }
+    }
+  }
+  /*adjust syllable boundaries*/
+  adjust_syllable_boundaries(lts, output_phone_string, num_out, max_phone_length);
+
+  *phone_length = num_out;
+  return SWIsltsSuccess;
+
+ CLEAN_UP:
+
+  *phone_length = 0;
+  return nRes;
+}
+
+#ifdef USE_STATIC_SLTS
+void *lts_alloc(int num, int size)
+{
+#ifdef NO_STDERR      
+    PrintError("USE_STATIC_SLTS: lts_alloc should not be called", NULL, NULL, NULL);
+#else    
+    PLogError(L("USE_STATIC_SLTS: lts_alloc should not be called"));
+#endif  
+  return NULL;
+}
+#else
+
+#ifndef __SYMBIAN32__
+static int total_alloc = 0;
+#endif
+void *lts_alloc(int num, int size)
+{
+  void *p;
+#ifndef __SYMBIAN32__
+  total_alloc += num * size;
+#endif
+  p = CALLOC(num, size, MTAG);
+  /*  
+#ifndef __SYMBIAN32__
+  pfprintf(PSTDOUT,"LTS Alloc %d X %d p %x tot %d\n", num, size, p, total_alloc);
+#endif  
+  */
+
+  return p;
+}
+#endif /* USE_STATIC_SLTS */
diff --git a/shared/Android.mk b/shared/Android.mk
new file mode 100644
index 0000000..7af1cdc
--- /dev/null
+++ b/shared/Android.mk
@@ -0,0 +1,67 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/CircularBuffer.c \
+	src/CommandLine.c \
+	src/ESR_Locale.c \
+	src/ESR_Session.c \
+	src/HashMap.c \
+	src/HashMapImpl.c \
+	src/Int8ArrayListImpl.c \
+	src/IntArrayList.c \
+	src/IntArrayListImpl.c \
+	src/lstring.c \
+	src/LStringImpl.c \
+	src/SessionTypeImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+
+common_CFLAGS := \
+	-DESR_SHARED_EXPORTS \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Portable \
+
+common_TARGET:= libESR_Shared
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/shared/include/CircularBuffer.h b/shared/include/CircularBuffer.h
new file mode 100644
index 0000000..4063770
--- /dev/null
+++ b/shared/include/CircularBuffer.h
@@ -0,0 +1,167 @@
+/*---------------------------------------------------------------------------*
+ *  CircularBuffer.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef CIRCULARBUFFER_H
+#define CIRCULARBUFFER_H
+
+
+
+/*
+ * This is implemented as a set of macros rather than functions with proper
+ * checking.  The reasons for doing so is that this is a non-public API that is
+ * used in the audio delivery component and we want it to be as fast as
+ * possible.
+ */
+
+#include "ESR_SharedPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup CircularBufferModule CircularBuffer API functions
+ * Generic Circular Buffer implementation.
+ *
+ * @{
+ */
+
+/**
+ * A circular buffer.
+ *
+ * @see list of functions used to operate on @ref CircularBufferModule "CircularBuffer" objects
+ */
+typedef struct CircularBuffer_t
+{
+  /**
+   * Total buffer capacity.
+   */
+  size_t capacity;
+  
+  /**
+   * Amount of data in buffer.
+   */
+  size_t size;
+  
+  /**
+   * Write index.
+   */
+  size_t writeIdx;
+  
+  /**
+   * Read index.
+   */
+  size_t readIdx;
+  
+}
+CircularBuffer;
+
+/**
+ * Creates a circular buffer of the specified capacity.
+ *
+ * @param capacity the capacity in number of bytes of the data buffer.
+ * @param mtag MALLOC allocation tag
+ * @param buffer The circular buffer to initialize.
+ */
+ESR_SHARED_API ESR_ReturnCode CircularBufferCreate(size_t capacity, const LCHAR* mtag, CircularBuffer** buffer);
+
+/**
+ * Returns the capacity of the buffer.
+ */
+#define CircularBufferGetCapacity(buffer) ((buffer)->capacity + 0)
+
+/**
+ * Returns the current size (number of bytes) in the buffer.
+ */
+#define CircularBufferGetSize(buffer) ((buffer)->size + 0)
+
+/**
+ * Returns whether buffer is empty or not.
+ */
+#define CircularBufferIsEmpty(buffer) ((buffer)->size == 0)
+
+/**
+ * Returns whether buffer is full or not.
+ **/
+#define CircularBufferIsFull(buffer) ((buffer)->size == (buffer)->capacity)
+
+/**
+ * Resets the buffer to the empty state.
+ */
+#define CircularBufferReset(buffer) ((buffer)->size = \
+                                     (buffer)->readIdx = \
+                                                         (buffer)->writeIdx = 0)
+
+/**
+ * Determines the residual capacity of the circular buffer.
+ */
+#define CircularBufferGetAvailable(buffer) ((buffer)->capacity - (buffer)->size)
+
+/**
+ * Reads requested number of bytes from the circular buffer.
+ *
+ * @param buffer The circular buffer to read from.
+ * @param data  Pointer to where to store read bytes.
+ * @param bufSize The number of bytes to read from the circular buffer.
+ *
+ * @return the number of bytes that were read.  A negative value indicates an
+ * error, while a value less than bufSize indicates that end-of-buffer is
+ * reached.
+ */
+ESR_SHARED_API int CircularBufferRead(CircularBuffer* buffer, void* data, size_t bufSize);
+
+/**
+ * Skips requested number of bytes from the circular buffer.
+ *
+ * @param buffer The circular buffer to skip from.
+ * @param bufSize The number of bytes to skip from the circular buffer.
+ *
+ * @return the number of bytes that were skipped.  A negative value indicates an
+ * error, while a value less than bufSize indicates that end-of-buffer is
+ * reached.
+ **/
+ESR_SHARED_API int CircularBufferSkip(CircularBuffer* buffer, size_t bufSize);
+
+/**
+ * Writes requested number of bytes from the circular buffer.
+ *
+ * @param buffer The circular buffer to write to
+ * @param data  Pointer to data to write.
+ * @param bufSize The number of bytes to write into the circular buffer.
+ *
+ * @return the number of bytes that were written.  A negative value indicates
+ * an error, while a value less than bufSize indicates that buffer capacity is
+ * reached.
+ */
+ESR_SHARED_API int CircularBufferWrite(CircularBuffer* buffer, const void* data, size_t bufSize);
+
+/**
+ * Removes the requested number of bytes from the end of the circular buffer.
+ *
+ * @param buffer The circular buffer to write to
+ * @param amoun tThe number of bytes to remove from end of circular buffer.
+ *
+ * @return the number of bytes that were unwritten. A negative value indicates
+ *         an error.
+ */
+ESR_SHARED_API int CircularBufferUnwrite(CircularBuffer* buffer, size_t amount);
+
+/**
+ * @}
+ */
+
+
+#endif 
diff --git a/shared/include/ESR_CommandLine.h b/shared/include/ESR_CommandLine.h
new file mode 100644
index 0000000..667d779
--- /dev/null
+++ b/shared/include/ESR_CommandLine.h
@@ -0,0 +1,57 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_CommandLine.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_COMMANDLINE_H
+#define __ESR_COMMANDLINE_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup ESR_CommandLineModule ESR_CommandLine API functions
+ * ESR_Session interface functions.
+ *
+ * @{
+ */
+
+/**
+ * Returns value of command-line argument.
+ *
+ * @param argc Number of arguments
+ * @param argv Value of arguments
+ * @param key Name of command-line argument to look up
+ * @param value [out] Value of the argument
+ * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *                     the required length is returned in this variable.
+ * @return ESR_BUFFER_OVERFLOW if value buffer is not large enough to contain result;
+ * ESR_NO_MATCH_ERROR if the specified command-line option could not be fonud
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_CommandLineGetValue(int argc, const LCHAR* argv[],
+    LCHAR* key, LCHAR* value,
+    size_t* len);
+    
+/**
+ * @}
+ */
+
+
+#endif /* __ESR_COMMANDLINE_H */
diff --git a/shared/include/ESR_Locale.h b/shared/include/ESR_Locale.h
new file mode 100644
index 0000000..9623653
--- /dev/null
+++ b/shared/include/ESR_Locale.h
@@ -0,0 +1,90 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_Locale.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_LOCALE_H
+#define __ESR_LOCALE_H
+
+
+
+#include "ESR_SharedPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup ESR_LocaleModule ESR_Locale API functions
+ * Locale support functions.
+ *
+ * @{
+ */
+
+/**
+ * List of locales.
+ */
+typedef enum
+{
+  /**
+   * US English
+   */
+  ESR_LOCALE_EN_US,
+  
+  /**
+   * France French
+   */
+  ESR_LOCALE_FR_FR,
+  
+  /**
+   * Germany German
+   */
+  ESR_LOCALE_DE_DE,
+  
+  /**
+   * UK English
+   */
+  ESR_LOCALE_EN_GB,
+  
+  /* others */
+  ESR_LOCALE_IT_IT,
+  ESR_LOCALE_NL_NL,
+  ESR_LOCALE_PT_PT,
+  ESR_LOCALE_ES_ES,
+  ESR_LOCALE_JA_JP
+  
+} ESR_Locale;
+
+/**
+ * Given a locale, returns its string representation.
+ *
+ * @param locale The locale to translate
+ * @return Locale string
+ */
+ESR_SHARED_API LCHAR* ESR_locale2str(const ESR_Locale locale);
+
+/**
+ * Given a locale's string representation, returns the associated ESR_Locale handle.
+ *
+ * @param str String representation of locale
+ * @param locale [out] Resulting locale
+ * @return ESR_INVALID_ARGUMENT if specified local was not recognized
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_str2locale(const LCHAR* str, ESR_Locale* locale);
+
+/**
+ * @}
+ */
+
+#endif /* __ESR_LOCALE_H */
diff --git a/shared/include/ESR_Session.h b/shared/include/ESR_Session.h
new file mode 100644
index 0000000..5782e3c
--- /dev/null
+++ b/shared/include/ESR_Session.h
@@ -0,0 +1,666 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_Session.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_SESSION_H
+#define __ESR_SESSION_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "pstdio.h"
+#include "ptypes.h"
+#include "ESR_SessionType.h"
+
+/**
+ * @addtogroup ESR_SessionModule ESR_Session API functions
+ * Manages ESR session information.
+ *
+ * @{
+ */
+
+/**
+ * Hashmap with helper functions for adding primitives and add-if-empty.
+ */
+typedef struct ESR_SessionSingleton_t
+{
+  /**
+   * Returns session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   * @param type Expected variable type (for strong-typing purposes)
+   */
+  ESR_ReturnCode(*getProperty)(const LCHAR* name, void** value, VariableTypes type);
+  /**
+   * Returns the type of a property value.
+   *
+   * @param name Property name
+   * @param type [out] Value type
+   */
+  ESR_ReturnCode(*getPropertyType)(const LCHAR* name, VariableTypes* type);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*getInt)(const LCHAR* name, int* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*getUint16_t)(const LCHAR* name, asr_uint16_t* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*getSize_t)(const LCHAR* name, size_t* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*getFloat)(const LCHAR* name, float* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*getBool)(const LCHAR* name, ESR_BOOL* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   * @param len Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+   */
+  ESR_ReturnCode(*getLCHAR)(const LCHAR* name, LCHAR* value, size_t* len);
+  /**
+   * Indicates if key exists in the session.
+   *
+   * @param name Property name
+   * @param exists True if key exists, false otherwise
+   */
+  ESR_ReturnCode(*contains)(const LCHAR* name, ESR_BOOL* exists);
+  /**
+   * Sets session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   * @param type Type of value being set
+   */
+  ESR_ReturnCode(*setProperty)(const LCHAR* name, void* value, VariableTypes type);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setInt)(const LCHAR* name, int value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setUint16_t)(const LCHAR* name, asr_uint16_t value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setSize_t)(const LCHAR* name, size_t value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setFloat)(const LCHAR* name, float value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setBool)(const LCHAR* name, ESR_BOOL value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setLCHAR)(const LCHAR* name, LCHAR* value);
+  /**
+   * If the key does not exist in the session, calls SessionSetInt().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setIntIfEmpty)(const LCHAR* name, int value);
+  /**
+   * If the key does not exist in the session, calls SessionSetUint16_t().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setUint16_tIfEmpty)(const LCHAR* name, asr_uint16_t value);
+  /**
+   * If the key does not exist in the session, calls SessionSetSize_t().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setSize_tIfEmpty)(const LCHAR* name, size_t value);
+  /**
+   * If the key does not exist in the session, calls SessionSetFloat().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setFloatIfEmpty)(const LCHAR* name, float value);
+  /**
+   * If the key does not exist in the session, calls SessionSetBool().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setBoolIfEmpty)(const LCHAR* name, ESR_BOOL value);
+  /**
+   * If the key does not exist in the session, calls SessionSetLCHAR().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param name Property name
+   * @param value Property value
+   */
+  ESR_ReturnCode(*setLCHARIfEmpty)(const LCHAR* name, LCHAR* value);
+  /**
+   * Removes property from session.
+   *
+   * @param name Property name
+   */
+  ESR_ReturnCode(*removeProperty)(const LCHAR* name);
+  /**
+   * Removes and deallocates property from session.
+   *
+   * @param name Property name
+   */
+  ESR_ReturnCode(*removeAndFreeProperty)(const LCHAR* name);
+  /**
+   * Imports commandline arguments into the system session.
+   *
+   * Keys are imported as "cmdline.[name]" where [name] is the name of the command-line argument
+   * Values are set in char* format.
+   *
+   * For example, given the argument "-timer=5", the following key will be added to the session:
+   * ["cmdline.timer", "5"]
+   *
+   * Validation is left up to the application.
+   *
+   * If the session contains a key that is clobbered by the parser, the old [key, value]
+   * pair will be deallocated. For example, if the session contained
+   * ["cmdline.timer", "value"] before the aforementioned example occured, then the old
+   * [key, value] pair will be allocated by the parser.
+   *
+   * @param argc Number of arguments
+   * @param argv Argument values
+   */
+  ESR_ReturnCode(*importCommandLine)(int argc, char* argv[]);
+  /**
+   * Returns the number of elements in the session.
+   *
+   * @param size [out] Session size
+   */
+  ESR_ReturnCode(*getSize)(size_t* size);
+  /**
+   * Returns the key associated with the specified index.
+   *
+   * @param index Element index
+   * @param key [out] Key name
+   */
+  ESR_ReturnCode(*getKeyAtIndex)(size_t index, LCHAR** key);
+  /**
+   * Convert the specified argument to int.
+   *
+   * @param key Property name
+   */
+  ESR_ReturnCode(*convertToInt)(const LCHAR* key);
+  /**
+   * Convert the specified argument to asr_uint16_t.
+   *
+   * @param key Property name
+   */
+  ESR_ReturnCode(*convertToUint16_t)(const LCHAR* key);
+  
+  /**
+   * Convert the specified argument to size_t.
+   *
+   * @param key Property name
+   */
+  ESR_ReturnCode(*convertToSize_t)(const LCHAR* key);
+  
+  /**
+   * Convert the specified argument to float.
+   *
+   * @param key Property name
+   */
+  ESR_ReturnCode(*convertToFloat)(const LCHAR* key);
+  
+  /**
+   * Convert the specified argument to bool.
+   *
+   * @param key Property name
+   */
+  ESR_ReturnCode(*convertToBool)(const LCHAR* key);
+  /**
+   * Destroys the system session.
+   */
+  ESR_ReturnCode(*destroy)(void);
+  /**
+   * Import PAR file into session.
+   *
+   * @param file File to read session from
+   */
+  ESR_ReturnCode(*importParFile)(const LCHAR* filename);
+  /**
+   * Import ARG file into session.
+   *
+   * @param file File to read arguments from
+   */
+  ESR_ReturnCode(*importArgFile)(const LCHAR* filename);
+  
+  /**
+   * Pointer to session data.
+   */
+  void* data;
+}
+ESR_SessionSingleton;
+
+/**
+ * Initializes the system session.
+ *
+ * @param filename File to read session information from
+ * @return ESR_OPEN_ERROR if file cannot be opened; ESR_READ_ERROR if file cannot be read;
+ * ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionCreate(const LCHAR* filename);
+/**
+ * Returns session property value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @param type Expected variable type (for strong-typing purposes)
+ * @return ESR_INVALID_RESULT_TYPE if the property is not of the specified type
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetProperty(const LCHAR* name, void** value,
+    VariableTypes type);
+/**
+ * Returns copy of session property value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_INVALID_RESULT_TYPE if the property is not an int
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetInt(const LCHAR* name, int* value);
+/**
+ * Returns copy of session property value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a asr_uint16_t
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetUint16_t(const LCHAR* name, asr_uint16_t* value);
+/**
+ * Returns copy of session property value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a size_t
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize_t(const LCHAR* name, size_t* value);
+/**
+ * Returns copy of session property value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a float
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetFloat(const LCHAR* name, float* value);
+/**
+ * Returns copy of session property value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a bool
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetBool(const LCHAR* name, ESR_BOOL* value);
+/**
+ * Returns copy of session property value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @param len Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetLCHAR(const LCHAR* name, LCHAR* value, size_t* len);
+/**
+ * Indicates if key exists in the session.
+ *
+ * @param name Property name
+ * @param exists True if key exists, false otherwise
+ * @return ESR_SUCCESS
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionContains(const LCHAR* name, ESR_BOOL* exists);
+/**
+ * Sets session property value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @param type Type of value being set
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetProperty(const LCHAR* name, void* value,
+    VariableTypes type);
+/**
+ * Sets session property value, storing a copy of the value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetInt(const LCHAR* name, int value);
+/**
+ * Sets session property value, storing a copy of the value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetUint16_t(const LCHAR* name, asr_uint16_t value);
+/**
+ * Sets session property value, storing a copy of the value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetSize_t(const LCHAR* name, size_t value);
+/**
+ * Sets session property value, storing a copy of the value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetFloat(const LCHAR* name, float value);
+/**
+ * Sets session property value, storing a copy of the value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetBool(const LCHAR* name, ESR_BOOL value);
+/**
+ * Sets session property value, storing a copy of the value.
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetLCHAR(const LCHAR* name, LCHAR* value);
+/**
+ * If the key does not exist in the session, calls SessionSetInt().
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetIntIfEmpty(const LCHAR* name, int value);
+/**
+ * If the key does not exist in the session, calls SessionSetSize_t().
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetUint16_tIfEmpty(const LCHAR* name, asr_uint16_t value);
+/**
+ * If the key does not exist in the session, calls SessionSetSize_t().
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetSize_tIfEmpty(const LCHAR* name, size_t value);
+/**
+ * If the key does not exist in the session, calls SessionSetFloat().
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetFloatIfEmpty(const LCHAR* name, float value);
+/**
+ * If the key does not exist in the session, calls SessionSetBool().
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetBoolIfEmpty(const LCHAR* name, ESR_BOOL value);
+/**
+ * If the key does not exist in the session, calls SessionSetLCHAR().
+ *
+ * @param name Property name
+ * @param value Property value
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetLCHARIfEmpty(const LCHAR* name, LCHAR* value);
+/**
+ * Removes property from session.
+ *
+ * @param name Property name
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveProperty(const LCHAR* name);
+/**
+ * Removes and deallocates property from session.
+ *
+ * @param name Property name
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveAndFreeProperty(const LCHAR* name);
+/**
+ * Destroys the system session.
+ *
+ * @return ESR_SUCCESS
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionDestroy(void);
+/**
+ * Imports commandline arguments into the system session.
+ *
+ * Keys are imported as "cmdline.[name]" where [name] is the name of the command-line argument
+ * Values are set in char* format.
+ *
+ * For example, given the argument "-timer=5", the following key will be added to the session:
+ * ["cmdline.timer", "5"]
+ *
+ * Validation is left up to the application.
+ *
+ * If the session contains a key that is clobbered by the parser, the old [key, value]
+ * pair will be deallocated. For example, if the session contained
+ * ["cmdline.timer", "value"] before the aforementioned example occured, then the old
+ * [key, value] pair will be allocated by the parser.
+ *
+ * @param argc Number of arguments
+ * @param argv Argument values
+ * @return ESR_OUT_OF_MEMORY if the system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionImportCommandLine(int argc, LCHAR* argv[]);
+
+/**
+ * Returns the number of elements in the session.
+ *
+ * @param size [out] Session size
+ * @return ESR_SUCCESS
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize(size_t* size);
+
+/**
+ * Returns the key associated with the specified index.
+ *
+ * @param index Element index
+ * @param key [out] Key name
+ * @return ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetKeyAtIndex(size_t index, LCHAR** key);
+
+/**
+ * Convert the specified argument to int.
+ *
+ * @param key Property name
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+ * ESR_INVALID_ARGUMENT if property cannot be converted to int
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToInt(const LCHAR* key);
+
+/**
+ * Convert the specified argument to int.
+ *
+ * @param key Property name
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+ * ESR_INVALID_ARGUMENT if property cannot be converted to asr_uint16_t
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToUint16_t(const LCHAR* key);
+
+/**
+ * Convert the specified argument to size_t.
+ *
+ * @param key Property name
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+ * ESR_INVALID_ARGUMENT if property cannot be converted to size_t
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToSize_t(const LCHAR* key);
+
+/**
+ * Convert the specified argument to float.
+ *
+ * @param key Property name
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+ * ESR_INVALID_ARGUMENT if property cannot be converted to float
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToFloat(const LCHAR* key);
+
+/**
+ * Convert the specified argument to bool.
+ *
+ * @param key Property name
+ * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+ * ESR_INVALID_ARGUMENT if property cannot be converted to bool
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToBool(const LCHAR* key);
+/**
+ * Returns the type of a property value.
+ *
+ * @param name Property name
+ * @param type [out] Value type
+ * @return ESR_INVALID_ARGUMENT if property cannot be found
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetPropertyType(const LCHAR* name, VariableTypes* type);
+/**
+ * Import PAR file into session.
+ *
+ * @param filename File to read session from
+ * @return ESR_OPEN_ERROR if file cannot be opened; ESR_READ_ERROR if file cannot be read;
+ * ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionImportParFile(const LCHAR* filename);
+/**
+ * Sets val to true if a session object exists (non-null), FALSE otherwise.
+ *
+ * @param val True if session is non-null, false otherwise
+ * @return ESR_SUCCESS
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionExists(ESR_BOOL* val);
+/**
+ * Prefixes relative paths with the PAR-file base directory. If the path is not relative,
+ * it is not changed.
+ *
+ * @param path Path to be prefixed
+ * @param len Length of path argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if path is null;
+ * ESR_NO_MATCH_ERROR if session property "parFile.baseDirectory" is undefined
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionPrefixWithBaseDirectory(LCHAR* path, size_t* len);
+/**
+ * Adds an event-listener.
+ *
+ * @param self ESR_SessionType handle
+ * @param listener The event-listener to add
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionAddListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener);
+
+/**
+ * Removes an event-listener.
+ *
+ * @param self ESR_SessionType handle
+ * @param listener The event-listener to remove
+ * @return ESR_SUCCESS
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener);
+
+
+
+/**
+ * @}
+ */
+
+
+
+#endif /* __ESR_SESSION_H */
diff --git a/shared/include/ESR_SessionImpl.h b/shared/include/ESR_SessionImpl.h
new file mode 100644
index 0000000..a0cb3ab
--- /dev/null
+++ b/shared/include/ESR_SessionImpl.h
@@ -0,0 +1,210 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_SessionImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_SESSIONIMPL_H
+#define __ESR_SESSIONIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_Session.h"
+#include "ESR_SharedPrefix.h"
+#include "HashMap.h"
+#include "pstdio.h"
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetPropertyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    void** value,
+    VariableTypes type);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetIntImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    int* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize_tImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    size_t* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetFloatImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    float* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetBoolImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    ESR_BOOL* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetLCHARImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    LCHAR* value, size_t* len);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionContainsImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    ESR_BOOL* exists);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetPropertyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    void* value,
+    VariableTypes type);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetIntImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    int value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetSize_tImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    size_t value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetFloatImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    float value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetBoolImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    ESR_BOOL value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetLCHARImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    LCHAR* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetIntIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    int value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetSize_tIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    size_t value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetFloatIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    float value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetBoolIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    ESR_BOOL value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionSetLCHARIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    LCHAR* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionRemovePropertyImpl(ESR_SessionType* self,
+    const LCHAR* name);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionImportCommandLineImpl(ESR_SessionType* self,
+    int argc,
+    LCHAR* argv[]);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionImportSessionImpl(ESR_SessionType* self,
+    ESR_SessionType* source);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSizeImpl(ESR_SessionType* self,
+    size_t* size);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetKeyAtIndexImpl(ESR_SessionType* self,
+    size_t index,
+    LCHAR** key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionDestroyImpl(ESR_SessionType* self);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToIntImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToSize_tImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToFloatImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToBoolImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetPropertyTypeImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    VariableTypes* type);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionImportParFileImpl(ESR_SessionType* self,
+    const LCHAR* filename);
+    
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionExists(ESR_BOOL* val);
+
+
+#endif /* __ESR_SESSIONIMPL_H */
diff --git a/shared/include/ESR_SessionType.h b/shared/include/ESR_SessionType.h
new file mode 100644
index 0000000..956dbb6
--- /dev/null
+++ b/shared/include/ESR_SessionType.h
@@ -0,0 +1,427 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_SessionType.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_SESSIONTYPE_H
+#define __ESR_SESSIONTYPE_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "ESR_VariableTypes.h"
+#include "ESR_SessionTypeListener.h"
+#include "pstdio.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup ESR_SessionTypeModule ESR_SessionType API functions
+ * ESR_Session interface functions.
+ *
+ * @{
+ */
+
+/**
+ * Hashmap with helper functions for adding primitives and add-if-empty.
+ */
+typedef struct ESR_SessionType_t
+{
+  /**
+   * Returns session property value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @param type Expected variable type (for strong-typing purposes)
+   * @return ESR_INVALID_RESULT_TYPE if the property is not of the specified type
+   */
+  ESR_ReturnCode(*getProperty)(struct ESR_SessionType_t* self, const LCHAR* name, void** value, VariableTypes type);
+  /**
+   * Returns the type of a property value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param type [out] Value type
+   * @return ESR_INVALID_ARGUMENT if self is null or property cannot be found
+   */
+  ESR_ReturnCode(*getPropertyType)(struct ESR_SessionType_t* self, const LCHAR* name, VariableTypes* type);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a int
+   */
+  ESR_ReturnCode(*getInt)(struct ESR_SessionType_t* self, const LCHAR* name, int* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a asr_uint16_t
+   */
+  ESR_ReturnCode(*getUint16_t)(struct ESR_SessionType_t* self, const LCHAR* name, asr_uint16_t* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a size_t
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a size_t
+   */
+  ESR_ReturnCode(*getSize_t)(struct ESR_SessionType_t* self, const LCHAR* name, size_t* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a float
+   */
+  ESR_ReturnCode(*getFloat)(struct ESR_SessionType_t* self, const LCHAR* name, float* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a bool
+   */
+  ESR_ReturnCode(*getBool)(struct ESR_SessionType_t* self, const LCHAR* name, ESR_BOOL* value);
+  /**
+   * Returns copy of session property value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @param len Size of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*
+   */
+  ESR_ReturnCode(*getLCHAR)(struct ESR_SessionType_t* self, const LCHAR* name, LCHAR* value, size_t* len);
+  /**
+   * Indicates if key exists in the session.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param exists True if key exists, false otherwise
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*contains)(struct ESR_SessionType_t* self, const LCHAR* name, ESR_BOOL* exists);
+  /**
+   * Sets session property value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @param type Type of value being set
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setProperty)(struct ESR_SessionType_t* self, const LCHAR* name, void* value, VariableTypes type);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setInt)(struct ESR_SessionType_t* self, const LCHAR* name, int value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setUint16_t)(struct ESR_SessionType_t* self, const LCHAR* name, asr_uint16_t value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setSize_t)(struct ESR_SessionType_t* self, const LCHAR* name, size_t value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setFloat)(struct ESR_SessionType_t* self, const LCHAR* name, float value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setBool)(struct ESR_SessionType_t* self, const LCHAR* name, ESR_BOOL value);
+  /**
+   * Sets session property value, storing a copy of the value.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setLCHAR)(struct ESR_SessionType_t* self, const LCHAR* name, LCHAR* value);
+  /**
+   * If the key does not exist in the session, calls SessionSetInt().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setIntIfEmpty)(struct ESR_SessionType_t* self, const LCHAR* name, int value);
+  /**
+   * If the key does not exist in the session, calls SessionSetUint16_t().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setUint16_tIfEmpty)(struct ESR_SessionType_t* self, const LCHAR* name, asr_uint16_t value);
+  /**
+   * If the key does not exist in the session, calls SessionSetSize_t().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setSize_tIfEmpty)(struct ESR_SessionType_t* self, const LCHAR* name, size_t value);
+  /**
+   * If the key does not exist in the session, calls SessionSetFloat().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setFloatIfEmpty)(struct ESR_SessionType_t* self, const LCHAR* name, float value);
+  /**
+   * If the key does not exist in the session, calls SessionSetBool().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setBoolIfEmpty)(struct ESR_SessionType_t* self, const LCHAR* name, ESR_BOOL value);
+  /**
+   * If the key does not exist in the session, calls SessionSetLCHAR().
+   *
+   * This helper function aids implementation of "default values", overwriting
+   * session values only if they have not been set already.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @param value Property value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*setLCHARIfEmpty)(struct ESR_SessionType_t* self, const LCHAR* name, LCHAR* value);
+  /**
+   * Removes property from session.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if key cannot be found
+   */
+  ESR_ReturnCode(*removeProperty)(struct ESR_SessionType_t* self, const LCHAR* name);
+  /**
+   * Removes and deallocates property from session.
+   *
+   * @param self ESR_SessionType handle
+   * @param name Property name
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if key cannot be found
+   */
+  ESR_ReturnCode(*removeAndFreeProperty)(struct ESR_SessionType_t* self, const LCHAR* name);
+  /**
+   * Imports commandline arguments into the system session.
+   *
+   * Keys are imported as "cmdline.[name]" where [name] is the name of the command-line argument
+   * Values are set in char* format.
+   *
+   * For example, given the argument "-timer=5", the following key will be added to the session:
+   * ["cmdline.timer", "5"]
+   *
+   * Validation is left up to the application.
+   *
+   * If the session contains a key that is clobbered by the parser, the old [key, value]
+   * pair will be deallocated. For example, if the session contained
+   * ["cmdline.timer", "value"] before the aforementioned example occured, then the old
+   * [key, value] pair will be allocated by the parser.
+   *
+   * @param self ESR_SessionType handle
+   * @param argc Number of arguments
+   * @param argv Argument values
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if the system is out of memory;
+   */
+  ESR_ReturnCode(*importCommandLine)(struct ESR_SessionType_t* self, int argc, char* argv[]);
+  /**
+   * Returns the number of elements in the session.
+   *
+   * @param self ESR_SessionType handle
+   * @param size [out] Session size
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*getSize)(struct ESR_SessionType_t* self, size_t* size);
+  /**
+   * Returns the key associated with the specified index.
+   *
+   * @param self ESR_SessionType handle
+   * @param index Element index
+   * @param key [out] Key name
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+   */
+  ESR_ReturnCode(*getKeyAtIndex)(struct ESR_SessionType_t* self, size_t index, LCHAR** key);
+  /**
+   * Convert the specified argument to int.
+   *
+   * @param self ESR_SessionType handle
+   * @param key Property name
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+   * ESR_INVALID_ARGUMENT if self is null or property cannot be converted to int
+   */
+  ESR_ReturnCode(*convertToInt)(struct ESR_SessionType_t* self, const LCHAR* key);
+  
+  /**
+   * Convert the specified argument to asr_uint16_t.
+   *
+   * @param self ESR_SessionType handle
+   * @param key Property name
+  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+  * ESR_INVALID_ARGUMENT if self is null or property cannot be converted to asr_uint16_t
+   */
+  ESR_ReturnCode(*convertToUint16_t)(struct ESR_SessionType_t* self, const LCHAR* key);
+  
+  /**
+   * Convert the specified argument to size_t.
+   *
+   * @param self ESR_SessionType handle
+   * @param key Property name
+  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+  * ESR_INVALID_ARGUMENT if self is null or property cannot be converted to size_t
+   */
+  ESR_ReturnCode(*convertToSize_t)(struct ESR_SessionType_t* self, const LCHAR* key);
+  
+  /**
+   * Convert the specified argument to float.
+   *
+   * @param self ESR_SessionType handle
+   * @param key Property name
+  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+  * ESR_INVALID_ARGUMENT if self is null or property cannot be converted to float
+   */
+  ESR_ReturnCode(*convertToFloat)(struct ESR_SessionType_t* self, const LCHAR* key);
+  
+  /**
+   * Convert the specified argument to bool.
+   *
+   * @param self ESR_SessionType handle
+   * @param key Property name
+   * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
+   * ESR_INVALID_ARGUMENT if self is null or property cannot be converted to bool
+   */
+  ESR_ReturnCode(*convertToBool)(struct ESR_SessionType_t* self, const LCHAR* key);
+  /**
+   * Destroys the Session.
+   *
+   * @param self ESR_SessionType handle
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*destroy)(struct ESR_SessionType_t* self);
+  /**
+   * Import PAR file into session.
+   *
+   * @param self ESR_SessionType handle
+   * @param file File to read session from
+   * @return ESR_INVALID_STATE if self is null; ESR_OPEN_ERROR if file cannot be opened; ESR_READ_ERROR if file cannot be
+  * read; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*importParFile)(struct ESR_SessionType_t* self, const LCHAR* filename);
+  /**
+   * Import ARG file into session.
+   *
+   * @param self ESR_SessionType handle
+   * @param file File to read arguments from
+   */
+  ESR_ReturnCode(*importArgFile)(struct ESR_SessionType_t* self, const LCHAR* filename);
+  
+  /**
+   * Adds an event-listener.
+   *
+   * @param self ESR_SessionType handle
+   * @param listener The event-listener to add
+    * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*addListener)(struct ESR_SessionType_t* self, ESR_SessionTypeListenerPair* listener);
+  
+  /**
+   * Removes an event-listener.
+   *
+   * @param self ESR_SessionType handle
+   * @param listener The event-listener to remove
+    * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*removeListener)(struct ESR_SessionType_t* self, ESR_SessionTypeListenerPair* listener);
+  
+  /**
+   * Pointer to session data.
+   */
+  void* data;
+}
+ESR_SessionType;
+
+/**
+ * Initializes the system session.
+ *
+ * @param self ESR_SessionType handle
+ * @return ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeCreate(ESR_SessionType** self);
+/**
+ * @}
+ */
+
+
+#endif /* __ESR_SESSIONTYPE_H */
diff --git a/shared/include/ESR_SessionTypeImpl.h b/shared/include/ESR_SessionTypeImpl.h
new file mode 100644
index 0000000..261d15a
--- /dev/null
+++ b/shared/include/ESR_SessionTypeImpl.h
@@ -0,0 +1,275 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_SessionTypeImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_SESSIONTYPEIMPL_H
+#define __ESR_SESSIONTYPEIMPL_H
+
+
+
+#include "ArrayList.h"
+#include "ESR_ReturnCode.h"
+#include "ESR_SessionType.h"
+#include "ESR_SharedPrefix.h"
+#include "HashMap.h"
+#include "pstdio.h"
+
+
+/**
+ * ESR_SessionType implementation data.
+ */
+typedef struct ESR_SessionTypeData_t
+{
+  /**
+   * [key, value] pairs.
+   */
+  HashMap* value;
+  
+  /**
+   * Event listeners.
+   */
+  ArrayList* listeners;
+}
+ESR_SessionTypeData;
+
+typedef struct ESR_SessionTypePair_t
+{
+  /**
+   * Pointer to value.
+   */
+  void* value;
+  /**
+   * Value type.
+   */
+  VariableTypes type;
+}
+ESR_SessionPair;
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetPropertyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    void** value,
+    VariableTypes type);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetIntImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    int* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetUint16_tImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    asr_uint16_t* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetSize_tImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    size_t* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetFloatImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    float* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetBoolImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    ESR_BOOL* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetLCHARImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    LCHAR* value, size_t* len);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeContainsImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    ESR_BOOL* exists);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetPropertyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    void* value, VariableTypes type);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetIntImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    int value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetUint16_tImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    asr_uint16_t value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetSize_tImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    size_t value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetFloatImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    float value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetBoolImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    ESR_BOOL value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetLCHARImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    LCHAR* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetIntIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    int value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetUint16_tIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    asr_uint16_t value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetSize_tIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    size_t value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetFloatIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    float value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetBoolIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    ESR_BOOL value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeSetLCHARIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    LCHAR* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeRemovePropertyImpl(ESR_SessionType* self,
+    const LCHAR* name);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeRemoveAndFreePropertyImpl(ESR_SessionType* self,
+    const LCHAR* name);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeImportCommandLineImpl(ESR_SessionType* self,
+    int argc,
+    LCHAR* argv[]);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeImportSessionImpl(ESR_SessionType* self,
+    ESR_SessionType* source);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetSizeImpl(ESR_SessionType* self,
+    size_t* size);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetKeyAtIndexImpl(ESR_SessionType* self,
+    size_t index,
+    LCHAR** key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeDestroyImpl(ESR_SessionType* self);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeConvertToIntImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeConvertToUint16_tImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeConvertToSize_tImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeConvertToFloatImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeConvertToBoolImpl(ESR_SessionType* self,
+    const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeGetPropertyTypeImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    VariableTypes* type);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeImportParFileImpl(ESR_SessionType* self,
+    const LCHAR* filename);
+    
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeAddListenerImpl(ESR_SessionType* self,
+    ESR_SessionTypeListenerPair* listener);
+    
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode ESR_SessionTypeRemoveListenerImpl(ESR_SessionType* self,
+    ESR_SessionTypeListenerPair* listener);
+    
+#endif /* __ESR_SESSIONTYPEIMPL_H */
diff --git a/shared/include/ESR_SessionTypeListener.h b/shared/include/ESR_SessionTypeListener.h
new file mode 100644
index 0000000..f0910d0
--- /dev/null
+++ b/shared/include/ESR_SessionTypeListener.h
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_SessionTypeListener.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_SESSIONTYPELISTENER_H
+#define __ESR_SESSIONTYPELISTENER_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "ESR_VariableTypes.h"
+#include "pstdio.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup ESR_SessionTypeListenerModule ESR_SessionTypeListener API functions
+ * ESR_Session event-listener interface functions.
+ *
+ * @{
+ */
+
+/**
+ * Listens for changes in ESR_SessionType.
+ */
+typedef struct ESR_SessionTypeListener_t
+{
+  /**
+   * A property value has changed.
+   *
+   * @param self ESR_SessionTypeListener handle
+  * @param name Name of property that changed
+   * @param oldValue Old property value
+   * @param newValue New property value
+  * @param variableType Type of property
+  * @param data User-data passed to listener.
+   */
+  ESR_ReturnCode(*propertyChanged)(struct ESR_SessionTypeListener_t* self, const LCHAR* name,
+                                   const void* oldValue, const void* newValue, VariableTypes variableType, void* data);
+                                   
+}
+ESR_SessionTypeListener;
+
+/**
+ * Associates a ESR_SessionTypeListener with user-data.
+ */
+typedef struct ESR_SessionTypeListenerPair_t
+{
+  /**
+   * Event-listener.
+   */
+  ESR_SessionTypeListener* listener;
+  /**
+   * User-data to pass to listener.
+   */
+  void* data;
+}
+ESR_SessionTypeListenerPair;
+
+/**
+ * @}
+ */
+
+
+#endif /* __ESR_SESSIONTYPELISTENER_H */
diff --git a/shared/include/ESR_SharedPrefix.h b/shared/include/ESR_SharedPrefix.h
new file mode 100644
index 0000000..ed5015d
--- /dev/null
+++ b/shared/include/ESR_SharedPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_SharedPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_SHAREDPREFIX_H
+#define __ESR_SHAREDPREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef ESR_SHARED_EXPORTS
+#define ESR_SHARED_API PORT_EXPORT_DECL
+#else
+#define ESR_SHARED_API PORT_IMPORT_DECL
+#endif
+
+#endif /* __ESR_SHAREDPREFIX_H */
diff --git a/shared/include/ESR_VariableTypes.h b/shared/include/ESR_VariableTypes.h
new file mode 100644
index 0000000..383f019
--- /dev/null
+++ b/shared/include/ESR_VariableTypes.h
@@ -0,0 +1,42 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_VariableTypes.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ESR_VARIABLETYPES_H
+#define __ESR_VARIABLETYPES_H
+
+/**
+ * Enumeration of all possible variable types. Used to add strong-typing capability to generic 
+ * containers like ArrayList.
+ */
+typedef enum VariableTypes_t
+{
+  TYPES_INT,
+  TYPES_FLOAT,
+  TYPES_BOOL,
+  TYPES_PLCHAR,       /* (LCHAR*)     */
+	TYPES_UINT16_T,
+  TYPES_SIZE_T,
+  TYPES_INTARRAYLIST,
+  TYPES_CONFIDENCESCORER,
+  TYPES_SR_ACOUSTICMODELS,
+  TYPES_SR_VOCABULARY,
+  TYPES_SR_EVENTLOG
+} VariableTypes;
+
+#endif /* __ESR_VARIABLETYPES_H */
diff --git a/shared/include/HashMap.h b/shared/include/HashMap.h
new file mode 100644
index 0000000..705a442
--- /dev/null
+++ b/shared/include/HashMap.h
@@ -0,0 +1,281 @@
+/*---------------------------------------------------------------------------*
+ *  HashMap.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __HASHMAP_H
+#define __HASHMAP_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "ptypes.h"
+#include <stdlib.h>
+
+
+/**
+ * @addtogroup HashMapModule HashMap API functions
+ * Hashed [key, value] mapping.
+ *
+ * @{
+ */
+
+/**
+ * Hashed [key, value] mapping.
+ */
+typedef struct HashMap_t
+{
+  /**
+   * Sets new mapping, storing a reference to the value.
+   * The key can be safely deallocated after this operation.
+   *
+   * @param self HashMap handle
+   * @param key Mapping key
+   * @param value Mapping value
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode(*put)(struct HashMap_t* self, const LCHAR* key, void* value);
+  
+  /**
+   * Removes the mapping for this key from this map if present.
+   *
+   * @param self HashMap handle
+   * @param key Key whose mapping is to be removed from the map.
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*remove)(struct HashMap_t* self, const LCHAR* key);
+  
+  /**
+   * Removes the mapping for this key from this map if present and frees the value.
+   *
+   * @param self HashMap handle
+   * @param key Key whose mapping is to be removed from the map.
+    * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*removeAndFree)(struct HashMap_t* self, const LCHAR* key);
+  
+  /**
+   * Removes the mappings for the key at the specified index.
+   *
+   * @param self HashMap handle
+   * @param index Index of element to be removed
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+   */
+  ESR_ReturnCode(*removeAtIndex)(struct HashMap_t* self, const size_t index);
+  
+  /**
+   * Removes all mappings from this map.
+   *
+   * @param self HashMap handle
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*removeAll)(struct HashMap_t* self);
+  
+  /**
+   * Removes all mappings from this map and frees the values.
+   *
+   * @param self HashMap handle
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*removeAndFreeAll)(struct HashMap_t* self);
+  
+  /**
+   * Indicates if element is contained within the list.
+   *
+   * @param self HashMap handle
+   * @param key Key to check for
+   * @param exists True if key was found
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*containsKey)(struct HashMap_t* self, const LCHAR* key, ESR_BOOL* exists);
+  
+  /**
+   * Returns the number of mappings contained in this map.
+   *
+   * @param self HashMap handle
+   * @param size Returned size
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*getSize)(struct HashMap_t* self, size_t* size);
+  
+  /**
+   * Returns the value to which the specified key is mapped in this identity hash map,
+   * or null if the map contains no mapping for this key.
+   *
+   * @param self HashMap handle
+   * @param key the key whose associated value is to be returned.
+   * @param value the value to which this map maps the specified key, or null if the
+   *              map contains no mapping for this key.
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if key cannot be found
+   */
+  ESR_ReturnCode(*get)(struct HashMap_t* self, const LCHAR* key, void** value);
+  /**
+   * Returns the key at the specified index.
+   *
+   * @param self HashMap handle
+   * @param index the key index
+   * @param key the key at the specified index
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+   */
+  ESR_ReturnCode(*getKeyAtIndex)(struct HashMap_t* self, const size_t index, LCHAR** key);
+  /**
+   * Returns the value at the specified index.
+   *
+   * @param self HashMap handle
+   * @param index the key index
+   * @param value the value at the specified index
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+   */
+  ESR_ReturnCode(*getValueAtIndex)(struct HashMap_t* self, const size_t index, void** value);
+  /**
+   * Destroys the HashMap.
+   *
+   * @param self HashMap handle
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*destroy)(struct HashMap_t* self);
+}
+HashMap;
+
+/**
+ * Creates a new HashMap.
+ *
+ * @param self HashMap handle
+ * @return ESR_INVALID_ARGUMENT if self or the value it points to are null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapCreate(HashMap** self);
+/**
+ * Creates a new HashMap.
+ *
+ * @param bins The number of hashing bins to be used.
+ * @param self HashMap handle
+ * @return ESR_INVALID_ARGUMENT if self or the value it points to are null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapCreateBins(size_t nbBins, HashMap** self);
+/**
+ * Sets new mapping, storing a reference to the value.
+ * The key can be safely deallocated after this operation.
+ *
+ * @param self HashMap handle
+ * @param key Mapping key
+ * @param value Mapping value
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapPut(HashMap* self, const LCHAR* key, void* value);
+/**
+ * Removes the mapping for this key from this map if present.
+ * The value can be safely deallocated after this operation.
+ * If the map previously contained a mapping for this key, the old value is replaced,
+ * but not deallocated.
+ *
+ * @param self HashMap handle
+ * @param key Key whose mapping is to be removed from the map.
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapRemove(HashMap* self, const LCHAR* key);
+/**
+ * Removes the mapping for this key from this map if present and frees the value.
+ * The value can be safely deallocated after this operation.
+ *
+ * @param self HashMap handle
+ * @param key Key whose mapping is to be removed from the map.
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapRemoveAndFree(HashMap* self, const LCHAR* key);
+/**
+ * Removes the mappings for the key at the specified index.
+ *
+ * @param self HashMap handle
+ * @param index Index of element to be removed
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapRemoveAtIndex(HashMap* self, const size_t index);
+/**
+ * Removes all mappings from this map.
+ *
+ * @param self HashMap handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapRemoveAll(HashMap* self);
+/**
+ * Removes all mappings from this map and frees the values.
+ *
+ * @param self HashMap handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapRemoveAndFreeAll(HashMap* self);
+/**
+ * Indicates if element is contained within the list.
+ *
+ * @param self HashMap handle
+ * @param key Key to check for
+ * @param exists True if key was found
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapContainsKey(HashMap* self, const LCHAR* key, ESR_BOOL* exists);
+/**
+ * Returns the number of mappings contained in this map.
+ *
+ * @param self HashMap handle
+ * @param size Returned size
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapGetSize(HashMap* self, size_t* size);
+/**
+ * Returns the value to which the specified key is mapped in this identity hash map,
+ * or null if the map contains no mapping for this key.
+ *
+ * @param self HashMap handle
+ * @param key the key whose associated value is to be returned.
+ * @param value the value to which this map maps the specified key, or null if the
+ *              map contains no mapping for this key.
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if key cannot be found
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapGet(HashMap* self, const LCHAR* key, void** value);
+/**
+ * Returns the key at the specified index.
+ *
+ * @param self HashMap handle
+ * @param index the key index
+ * @param key the key at the specified index
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapGetKeyAtIndex(HashMap* self, const size_t index, LCHAR** key);
+/**
+ * Returns the value at the specified index.
+ *
+ * @param self HashMap handle
+ * @param index the key index
+ * @param value the key at the specified index
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapGetValueAtIndex(HashMap* self, const size_t index, void** value);
+/**
+ * Destroys an HashMap.
+ *
+ * @param self HashMap handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+ESR_SHARED_API ESR_ReturnCode HashMapDestroy(HashMap* self);
+
+/**
+ * @}
+ */
+
+
+#endif /* __HASHMAP_H */
diff --git a/shared/include/HashMapImpl.h b/shared/include/HashMapImpl.h
new file mode 100644
index 0000000..aa09a4b
--- /dev/null
+++ b/shared/include/HashMapImpl.h
@@ -0,0 +1,96 @@
+/*---------------------------------------------------------------------------*
+ *  HashMapImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __HASHMAPIMPL_H
+#define __HASHMAPIMPL_H
+
+
+
+#include <assert.h>
+#include <stdlib.h>
+#include "ESR_ReturnCode.h"
+#include "phashtable.h"
+
+/**
+ * HashMap implementation.
+ */
+typedef struct HashMapImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  HashMap Interface;
+  
+  /**
+   * Actual hash table implementation.
+   **/
+  PHashTable *table;
+}
+HashMapImpl;
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_Put(HashMap* self, const LCHAR* key, void* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_Remove(HashMap* self, const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_RemoveAndFree(HashMap* self, const LCHAR* key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_RemoveAtIndex(HashMap* self, const size_t index);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_RemoveAll(HashMap* self);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_RemoveAndFreeAll(HashMap* self);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_ContainsKey(HashMap* self, const LCHAR* key, ESR_BOOL* exists);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_Get(HashMap* self, const LCHAR* key, void** value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_GetKeyAtIndex(HashMap* self, const size_t index, LCHAR** key);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_GetValueAtIndex(HashMap* self, const size_t index, void** value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_GetSize(HashMap* self, size_t* size);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode HashMap_Destroy(HashMap* self);
+
+#endif /* __HASHMAPIMPL_H */
diff --git a/shared/include/Int8ArrayList.h b/shared/include/Int8ArrayList.h
new file mode 100644
index 0000000..00390f0
--- /dev/null
+++ b/shared/include/Int8ArrayList.h
@@ -0,0 +1,230 @@
+/*---------------------------------------------------------------------------*
+ *  Int8ArrayList.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __INT8ARRAYLIST_H
+#define __INT8ARRAYLIST_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "ptypes.h"
+#include <stdlib.h>
+
+/**
+ * @addtogroup Int8ArrayListModule Int8ArrayList API functions
+ * List of Int8 elements.
+ *
+ * @{
+ */
+
+/**
+ * List of elements.
+ */
+typedef struct Int8ArrayList_t
+{
+  /**
+   * Adds element to list.
+   *
+   * @param self Int8ArrayList handle
+   * @param element Element to be added
+   */
+  ESR_ReturnCode(*add)(struct Int8ArrayList_t* self, asr_int8_t element);
+  
+  /**
+  * Removes element from list.
+  *
+  * @param self Int8ArrayList handle
+  * @param element Element to be removed
+  */
+  ESR_ReturnCode(*remove)(struct Int8ArrayList_t* self, asr_int8_t element);
+  
+  /**
+  * Removes all elements from list.
+  *
+  * @param self Int8ArrayList handle
+  */
+  ESR_ReturnCode(*removeAll)(struct Int8ArrayList_t* self);
+  
+  /**
+  * Indicates if element is contained within the list.
+  *
+  * @param self Int8ArrayList handle
+  * @param element Element to check for
+  * @param exists True if element was found
+  */
+  ESR_ReturnCode(*contains)(struct Int8ArrayList_t* self, asr_int8_t element, ESR_BOOL* exists);
+  
+  /**
+  * Returns array size.
+  *
+  * @param self Int8ArrayList handle
+  * @param size Returned size
+  */
+  ESR_ReturnCode(*getSize)(struct Int8ArrayList_t* self, size_t* size);
+  
+  /**
+  * Returns the element at the specified index.
+  *
+  * @param self Int8ArrayList handle
+  * @param index Element index
+  * @param element Element being returned
+  */
+  ESR_ReturnCode(*get)(struct Int8ArrayList_t* self, size_t index, asr_int8_t* element);
+  
+  /**
+  * Sets the element at the specified index.
+  *
+  * NOTE: Does *not* deallocate the element being overwritten.
+  * @param self Int8ArrayList handle
+  * @param index Element index
+  * @param element Element's new value
+  */
+  ESR_ReturnCode(*set)(struct Int8ArrayList_t* self, size_t index, asr_int8_t element);
+  
+  /**
+  * Returns a clone of the Int8ArrayList.
+  * @param self Int8ArrayList handle
+   * @param clone [out] Clone of the Int8ArrayList (created externally, populated 
+   *                    internally)
+  */
+  ESR_ReturnCode(*clone)(struct Int8ArrayList_t* self, struct Int8ArrayList_t* clone);
+  
+  /**
+   * Converts the Int8ArrayList to a static array.
+   * The use of the Int8ArrayList handle is undefined past this point.
+   *
+   * @param self Int8ArrayList handle
+   * @param newArray Pointer to resulting array
+   */
+  ESR_ReturnCode(*toStaticArray)(struct Int8ArrayList_t* self, asr_int8_t** newArray);
+  
+  /**
+  * Destroys the Int8ArrayList.
+  * @param self Int8ArrayList handle
+  */
+  ESR_ReturnCode(*destroy)(struct Int8ArrayList_t* self);
+}
+Int8ArrayList;
+
+/**
+ * Creates a new Int8ArrayList.
+ *
+ * @param self ArrayList handle
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListCreate(Int8ArrayList** self);
+
+/**
+ * Creates a new Int8ArrayList from the supplied static array.
+ * The static array may not be used past this point.
+ *
+ * @param value Initial value
+ * @param self Int8ArrayList handle
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListImport(asr_int8_t* value, Int8ArrayList** self);
+
+/**
+ * Adds element to list.
+ *
+ * @param self Int8ArrayList handle
+ * @param element Element to be added
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListAdd(Int8ArrayList* self, asr_int8_t element);
+
+/**
+ * Removes element from list.
+ *
+ * @param self Int8ArrayList handle
+ * @param element Element to be removed
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListRemove(Int8ArrayList* self, asr_int8_t element);
+
+/**
+ * Removes all elements from list.
+ *
+ * @param self Int8ArrayList handle
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListRemoveAll(Int8ArrayList* self);
+
+/**
+ * Indicates if element is contained within the list.
+ *
+ * @param self Int8ArrayList handle
+ * @param element Element to check for
+ * @param exists True if element was found
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListContains(Int8ArrayList* self, asr_int8_t element, ESR_BOOL* exists);
+
+/**
+ * Returns array size.
+ *
+ * @param self Int8ArrayList handle
+ * @param size Returned size
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListGetSize(Int8ArrayList* self, size_t* size);
+
+/**
+ * Returns the element at the specified index.
+ *
+ * @param self Int8ArrayList handle
+ * @param index Element index
+ * @param element Element being returned
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListGet(Int8ArrayList* self, size_t index, asr_int8_t* element);
+
+/**
+ * Sets the element at the specified index.
+ *
+ * NOTE: Does *not* deallocate the element being overwritten.
+ * @param self Int8ArrayList handle
+ * @param index Element index
+ * @param element Element's new value
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListSet(Int8ArrayList* self, size_t index, asr_int8_t element);
+
+/**
+ * Converts the Int8ArrayList to a static array.
+ * The Int8ArrayList handle may not be used past this point.
+ *
+ * @param self Int8ArrayList handle
+ * @param newArray Pointer to resulting array
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListToStaticArray(Int8ArrayList* self, asr_int8_t** newArray);
+
+/**
+ * Returns a clone of the Int8ArrayList.
+ * @param self Int8ArrayList handle
+ * @param clone [out] Clone of the Int8ArrayList (created externally, populated
+ *                    internally)
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListClone(Int8ArrayList* self, Int8ArrayList* clone);
+
+/**
+ * Destroys an Int8ArrayList.
+ *
+ * @param self Int8ArrayList handle
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayListDestroy(Int8ArrayList* self);
+
+/**
+ * @}
+ */
+
+
+#endif /* __INT8ARRAYLIST_H */
diff --git a/shared/include/Int8ArrayListImpl.h b/shared/include/Int8ArrayListImpl.h
new file mode 100644
index 0000000..b96c8de
--- /dev/null
+++ b/shared/include/Int8ArrayListImpl.h
@@ -0,0 +1,103 @@
+/*---------------------------------------------------------------------------*
+ *  Int8ArrayListImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __INT8ARRAYLISTIMPL_H
+#define __INT8ARRAYLISTIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+
+/**
+ * Int8ArrayList implementation.
+ */
+typedef struct Int8ArrayListImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  Int8ArrayList Interface;
+  /**
+   * Int8ArrayList contents.
+   */
+  asr_int8_t* contents;
+  /**
+   * Virtual number of allocated element slots.
+   */
+  size_t virtualSize;
+  /**
+   * Actual number of allocated element slots.
+   */
+  size_t actualSize;
+}
+Int8ArrayListImpl;
+
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_Add(Int8ArrayList* self, const asr_int8_t element);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_Remove(Int8ArrayList* self, const asr_int8_t element);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_RemoveAll(Int8ArrayList* self);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_Contains(Int8ArrayList* self, const asr_int8_t element, ESR_BOOL* exists);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_Get(Int8ArrayList* self, size_t index, asr_int8_t* element);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_Set(Int8ArrayList* self, size_t index, const asr_int8_t element);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_GetSize(Int8ArrayList* self, size_t* size);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_ToStaticArray(Int8ArrayList* self, asr_int8_t** newArray);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_Clone(Int8ArrayList* self, Int8ArrayList* clone);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode Int8ArrayList_Destroy(Int8ArrayList* self);
+
+#endif /* __INT8ARRAYLISTIMPL_H */
diff --git a/shared/include/IntArrayList.h b/shared/include/IntArrayList.h
new file mode 100644
index 0000000..3f3559b
--- /dev/null
+++ b/shared/include/IntArrayList.h
@@ -0,0 +1,214 @@
+/*---------------------------------------------------------------------------*
+ *  IntArrayList.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __INTARRAYLIST_H
+#define __INTARRAYLIST_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "ptypes.h"
+#include <stdlib.h>
+
+/**
+ * @addtogroup IntArrayListModule IntArrayList API functions
+ * List of elements.
+ *
+ * @{
+ */
+
+/**
+ * List of elements.
+ */
+typedef struct IntArrayList_t
+{
+  /**
+   * Adds element to list.
+   *
+   * @param self IntArrayList handle
+   * @param element Element to be added
+   */
+  ESR_ReturnCode(*add)(struct IntArrayList_t* self, int element);
+  
+  /**
+  * Removes element from list.
+  *
+  * @param self IntArrayList handle
+  * @param element Element to be removed
+  */
+  ESR_ReturnCode(*remove)(struct IntArrayList_t* self, int element);
+  
+  /**
+  * Removes all elements from list.
+  *
+  * @param self IntArrayList handle
+  */
+  ESR_ReturnCode(*removeAll)(struct IntArrayList_t* self);
+  
+  /**
+  * Indicates if element is contained within the list.
+  *
+  * @param self IntArrayList handle
+  * @param element Element to check for
+  * @param exists True if element was found
+  */
+  ESR_ReturnCode(*contains)(struct IntArrayList_t* self, int element, ESR_BOOL* exists);
+  
+  /**
+  * Returns array size.
+  *
+  * @param self IntArrayList handle
+  * @param size Returned size
+  */
+  ESR_ReturnCode(*getSize)(struct IntArrayList_t* self, size_t* size);
+  
+  /**
+  * Returns the element at the specified index.
+  *
+  * @param self IntArrayList handle
+  * @param index Element index
+  * @param element Element being returned
+  */
+  ESR_ReturnCode(*get)(struct IntArrayList_t* self, size_t index, int* element);
+  
+  /**
+  * Sets the element at the specified index.
+  *
+  * NOTE: Does *not* deallocate the element being overwritten.
+  * @param self IntArrayList handle
+  * @param index Element index
+  * @param element Element's new value
+  */
+  ESR_ReturnCode(*set)(struct IntArrayList_t* self, size_t index, int element);
+  
+  /**
+   * Converts the IntArrayList to a static array.
+   * The use of the IntArrayList handle is undefined past this point.
+   *
+   * @param self IntArrayList handle
+   * @param newArray Pointer to resulting array
+   */
+  ESR_ReturnCode(*toStaticArray)(struct IntArrayList_t* self, int** newArray);
+  
+  /**
+  * Destroys the IntArrayList.
+  * @param self IntArrayList handle
+  */
+  ESR_ReturnCode(*destroy)(struct IntArrayList_t* self);
+}
+IntArrayList;
+
+/**
+ * Creates a new IntArrayList.
+ *
+ * @param self ArrayList handle
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListCreate(IntArrayList** self);
+
+/**
+ * Creates a new IntArrayList from the supplied static array.
+ * The static array may not be used past this point.
+ *
+ * @param value Initial value
+ * @param self IntArrayList handle
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListImport(int* value, IntArrayList** self);
+
+/**
+ * Adds element to list.
+ *
+ * @param self IntArrayList handle
+ * @param element Element to be added
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListAdd(IntArrayList* self, int element);
+
+/**
+ * Removes element from list.
+ *
+ * @param self IntArrayList handle
+ * @param element Element to be removed
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListRemove(IntArrayList* self, int element);
+
+/**
+ * Removes all elements from list.
+ *
+ * @param self IntArrayList handle
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListRemoveAll(IntArrayList* self);
+
+/**
+ * Indicates if element is contained within the list.
+ *
+ * @param self IntArrayList handle
+ * @param element Element to check for
+ * @param exists True if element was found
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListContains(IntArrayList* self, int element, ESR_BOOL* exists);
+
+/**
+ * Returns array size.
+ *
+ * @param self IntArrayList handle
+ * @param size Returned size
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListGetSize(IntArrayList* self, size_t* size);
+
+/**
+ * Returns the element at the specified index.
+ *
+ * @param self IntArrayList handle
+ * @param index Element index
+ * @param element Element being returned
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListGet(IntArrayList* self, size_t index, int* element);
+
+/**
+ * Sets the element at the specified index.
+ *
+ * NOTE: Does *not* deallocate the element being overwritten.
+ * @param self IntArrayList handle
+ * @param index Element index
+ * @param element Element's new value
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListSet(IntArrayList* self, size_t index, int element);
+
+/**
+ * Converts the IntArrayList to a static array.
+ * The IntArrayList handle may not be used past this point.
+ *
+ * @param self IntArrayList handle
+ * @param newArray Pointer to resulting array
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListToStaticArray(IntArrayList* self, int** newArray);
+
+/**
+ * Destroys an IntArrayList.
+ *
+ * @param self IntArrayList handle
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayListDestroy(IntArrayList* self);
+
+/**
+ * @}
+ */
+
+
+#endif /* __INTARRAYLIST_H */
diff --git a/shared/include/IntArrayListImpl.h b/shared/include/IntArrayListImpl.h
new file mode 100644
index 0000000..6361e3b
--- /dev/null
+++ b/shared/include/IntArrayListImpl.h
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------*
+ *  IntArrayListImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __INTARRAYLISTIMPL_H
+#define __INTARRAYLISTIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+
+/**
+ * IntArrayList implementation.
+ */
+typedef struct IntArrayListImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  IntArrayList Interface;
+  /**
+   * IntArrayList contents.
+   */
+  int* contents;
+  /**
+   * Virtual number of allocated element slots.
+   */
+  size_t virtualSize;
+  /**
+   * Actual number of allocated element slots.
+   */
+  size_t actualSize;
+}
+IntArrayListImpl;
+
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_Add(IntArrayList* self, const int element);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_Remove(IntArrayList* self, const int element);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_RemoveAll(IntArrayList* self);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_Contains(IntArrayList* self, const int element, ESR_BOOL* exists);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_Get(IntArrayList* self, size_t index, int* element);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_Set(IntArrayList* self, size_t index, const int element);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_GetSize(IntArrayList* self, size_t* size);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_ToStaticArray(IntArrayList* self, int** newArray);
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode IntArrayList_Destroy(IntArrayList* self);
+
+#endif /* __INTARRAYLIST_H */
diff --git a/shared/include/LStringImpl.h b/shared/include/LStringImpl.h
new file mode 100644
index 0000000..4996fdd
--- /dev/null
+++ b/shared/include/LStringImpl.h
@@ -0,0 +1,68 @@
+/*---------------------------------------------------------------------------*
+ *  LStringImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __LSTRINGIMPL_H
+#define __LSTRINGIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "ptypes.h"
+
+/**
+ * LString implementation.
+ */
+typedef struct LStringImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  LString Interface;
+  /**
+   * Underlying string value.
+   */
+  LCHAR* value;
+  /**
+   * Underlying string size.
+   */
+  size_t size;
+}
+LStringImpl;
+
+
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode LString_Append(LString* self, const LCHAR* value);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode LString_Reset(LString* self);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode LString_ToLCHAR(LString* self, LCHAR** result);
+/**
+ * Default implementation.
+ */
+ESR_SHARED_API ESR_ReturnCode LString_Destroy(LString* self);
+
+
+#endif /* __LSTRINGIMPL_H */
diff --git a/shared/include/lstring.h b/shared/include/lstring.h
new file mode 100644
index 0000000..32c59df
--- /dev/null
+++ b/shared/include/lstring.h
@@ -0,0 +1,113 @@
+/*---------------------------------------------------------------------------*
+ *  lstring.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __LSTRING_H
+#define __LSTRING_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "ESR_SharedPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup LStringModule LString API functions
+ *
+ * @{
+ */
+
+/**
+ * LString interface.
+ *
+ * @see list of functions used to operate on @ref LStringModule "LString" objects
+ */
+typedef struct LString_t
+{
+  /**
+   * Appends text to LString.
+   *
+   * @param self LString handle
+   * @param value Value to append.
+   */
+  ESR_ReturnCode(*append)(struct LString_t* self, const LCHAR* value);
+  /**
+   * Clears the string contents.
+   *
+   * @param self LString handle
+   */
+  ESR_ReturnCode(*reset)(struct LString_t* self);
+  /**
+   * Destroys LString in favour of static LCHAR* string.
+   * The LString object should not be used past this point.
+   *
+   * @param self LString handle
+   * @param result Resulting LCHAR*
+   */
+  ESR_ReturnCode(*toLCHAR)(struct LString_t* self, LCHAR** result);
+  /**
+   * Destroys LString object.
+   *
+   * @param self LString handle
+   */
+  ESR_ReturnCode(*destroy)(struct LString_t* self);
+}
+LString;
+
+
+
+/**
+ * Creates new LString.
+ *
+ * @param self LString handle
+ */
+ESR_SHARED_API ESR_ReturnCode LStringCreate(LString** self);
+/**
+ * Appends text to LString.
+ *
+ * @param self LString handle
+ * @param value Value to append.
+ */
+ESR_SHARED_API ESR_ReturnCode LStringAppend(LString* self, const LCHAR* value);
+/**
+ * Clears the string contents.
+ *
+ * @param self LString handle
+ */
+ESR_SHARED_API ESR_ReturnCode LStringReset(LString* self);
+/**
+ * Destroys LString in favour of static LCHAR* string.
+ * The LString object should not be used past this point.
+ *
+ * @param self LString handle
+ * @param result Resulting LCHAR*
+ */
+ESR_SHARED_API ESR_ReturnCode LStringToLCHAR(LString* self, LCHAR** result);
+/**
+ * Destroys LString object.
+ *
+ * @param self LString handle
+ */
+ESR_SHARED_API ESR_ReturnCode LStringDestroy(LString* self);
+
+/**
+ * @}
+ */
+
+
+#endif /* __LSTRING_H */
diff --git a/shared/src/CircularBuffer.c b/shared/src/CircularBuffer.c
new file mode 100644
index 0000000..11b6694
--- /dev/null
+++ b/shared/src/CircularBuffer.c
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*
+ *  CircularBuffer.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifdef _WIN32
+#if _MSC_VER >= 1100    // Visual C++ 5.x
+#pragma warning( disable : 4786 4503 )
+#endif
+#endif
+
+#include "CircularBuffer.h"
+#include "pmemory.h"
+#ifndef __vxworks
+#include <memory.h>
+#endif
+
+ESR_ReturnCode CircularBufferCreate(size_t capacity, const LCHAR* mtag, CircularBuffer** buffer)
+{
+  CircularBuffer* Interface;
+  if (buffer == NULL || capacity <= 0)
+    return ESR_INVALID_ARGUMENT;
+    
+  Interface = (CircularBuffer *) MALLOC(sizeof(CircularBuffer) + capacity, mtag);
+  if (Interface == NULL)
+    return ESR_OUT_OF_MEMORY;
+  Interface->capacity = capacity;
+  CircularBufferReset(Interface);
+  *buffer = Interface;
+  return ESR_SUCCESS;
+}
+
+
+int CircularBufferRead(CircularBuffer* buffer, void* data, size_t bufSize)
+{
+  size_t nbRead = 0;
+  unsigned char *bufferData = NULL;
+  
+  if (buffer == NULL || (data == NULL && bufSize > 0))
+    return -1;
+    
+  if (buffer->size < bufSize)
+    bufSize = buffer->size;
+    
+  if (bufSize == 0)
+    return 0;
+    
+  bufferData = ((unsigned char *) buffer) + sizeof(CircularBuffer);
+  
+  if (buffer->readIdx >= buffer->writeIdx)
+  {
+    nbRead = buffer->capacity - buffer-> readIdx;
+    if (nbRead > bufSize) nbRead = bufSize;
+    
+    memcpy(data, bufferData + buffer->readIdx, nbRead);
+    buffer->size -= nbRead;
+    buffer->readIdx += nbRead;
+    if (buffer->readIdx == buffer->capacity)
+      buffer->readIdx = 0;
+  }
+  
+  if (nbRead < bufSize)
+  {
+    int toRead = bufSize - nbRead;
+    memcpy(((unsigned char *) data) + nbRead, bufferData + buffer->readIdx, toRead);
+    buffer->size -= toRead;
+    buffer->readIdx += toRead;
+  }
+  
+  return bufSize;
+}
+
+int CircularBufferSkip(CircularBuffer* buffer, size_t bufSize)
+{
+  if ( buffer == NULL )
+    return -1;
+    
+  if (buffer->size < bufSize)
+    bufSize = buffer->size;
+    
+  if (bufSize == 0)
+    return 0;
+    
+  buffer->readIdx += bufSize;
+  if (buffer->readIdx >= buffer->capacity)
+    buffer->readIdx -= buffer->capacity;
+    
+  buffer->size -= bufSize;
+  
+  return bufSize;
+}
+
+int CircularBufferWrite(CircularBuffer* buffer, const void *data, size_t bufSize)
+{
+  size_t nbWritten = 0;
+  unsigned char *bufferData;
+  size_t available = buffer->capacity - buffer->size;
+  
+  if (data == NULL && bufSize > 0)
+    return -1;
+    
+  if (available < bufSize)	/* We need to force an error to be logged here */
+    return -1;
+/*    bufSize = available;	Throwing data on the floor with no notice is asking for trouble */
+    
+  if (bufSize == 0)
+    return 0;
+    
+  bufferData = ((unsigned char*) buffer) + sizeof(CircularBuffer);
+  
+  if (buffer->writeIdx >= buffer->readIdx)
+  {
+    nbWritten = buffer->capacity - buffer->writeIdx;
+    if (nbWritten > bufSize) nbWritten = bufSize;
+    memcpy(bufferData + buffer->writeIdx, data, nbWritten);
+    buffer->size += nbWritten;
+    buffer->writeIdx += nbWritten;
+    if (buffer->writeIdx == buffer->capacity)
+      buffer->writeIdx = 0;
+  }
+  
+  if (nbWritten < bufSize)
+  {
+    size_t toWrite = bufSize - nbWritten;
+    memcpy(bufferData + buffer->writeIdx, ((unsigned char*) data) + nbWritten, toWrite);
+    buffer->size += toWrite;
+    buffer->writeIdx += toWrite;
+  }
+  
+  return bufSize;
+}
+
+int CircularBufferUnwrite(CircularBuffer* buffer, size_t amount)
+{
+  size_t available = buffer->capacity - buffer->size;
+  
+  if (available < amount)
+    amount = available;
+  buffer->size -= amount;
+  return amount;
+}
diff --git a/shared/src/CommandLine.c b/shared/src/CommandLine.c
new file mode 100644
index 0000000..5be79fa
--- /dev/null
+++ b/shared/src/CommandLine.c
@@ -0,0 +1,73 @@
+/*---------------------------------------------------------------------------*
+ *  CommandLine.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ESR_CommandLine.h"
+
+ESR_ReturnCode ESR_CommandLineGetValue(int argc, const LCHAR * argv[],
+                                       LCHAR* key, LCHAR* value, size_t* len)
+{
+  const LCHAR* lastKeyFound = NULL;
+  
+  while (--argc > 0 && **++argv)
+  {
+    if (**argv != '-')
+    {
+      /* got value */
+      if (key == NULL)
+      {
+        /* but we don't have any key to associate it with */
+        continue;
+      }
+      else
+      {
+        if (lastKeyFound != NULL && LSTRCMP(lastKeyFound, key) == 0)
+        {
+          if (LSTRLEN(*argv) + 1 > *len)
+          {
+            *len = LSTRLEN(*argv) + 1;
+            return ESR_BUFFER_OVERFLOW;
+          }
+          *len = LSTRLEN(*argv) + 1;
+          LSTRCPY(value, *argv);
+          return ESR_SUCCESS;
+        }
+      }
+    }
+    else
+    {
+      /* got key */
+      if (lastKeyFound != NULL && LSTRCMP(lastKeyFound, key) == 0)
+      {
+        *len = 1;
+        LSTRCPY(value, L(""));
+        return ESR_SUCCESS;
+      }
+      lastKeyFound = *argv + 1;
+    }
+  }
+  
+  /* Handle case where last argument is a key with no value */
+  if (lastKeyFound != NULL && LSTRCMP(lastKeyFound, key) == 0)
+  {
+    *len = 1;
+    LSTRCPY(value, L(""));
+    return ESR_SUCCESS;
+  }
+  return ESR_NO_MATCH_ERROR;
+}
diff --git a/shared/src/ESR_Locale.c b/shared/src/ESR_Locale.c
new file mode 100644
index 0000000..2fb2680
--- /dev/null
+++ b/shared/src/ESR_Locale.c
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_Locale.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "ESR_Locale.h"
+#include "plog.h"
+#include "LCHAR.h"
+
+#define LOCALE_COUNT 9
+static LCHAR* localeStringMapping[LOCALE_COUNT+1] =
+  {
+    L("ESR_LOCALE_EN_US"),
+    L("ESR_LOCALE_FR_FR"),
+    L("ESR_LOCALE_DE_DE"),
+    L("ESR_LOCALE_EN_GB"),
+    L("ESR_LOCALE_IT_IT"),
+    L("ESR_LOCALE_NL_NL"),
+    L("ESR_LOCALE_PT_PT"),
+    L("ESR_LOCALE_ES_ES"),
+    L("ESR_LOCALE_JA_JP"),
+    L("invalid locale code") /* must remain last element for ESR_locale2str() to function */
+  };
+  
+LCHAR* ESR_locale2str(const ESR_Locale locale)
+{
+  if (locale >= LOCALE_COUNT)
+    return localeStringMapping[LOCALE_COUNT];
+  return localeStringMapping[locale];
+}
+
+
+ESR_ReturnCode ESR_str2locale(const LCHAR* str, ESR_Locale* locale)
+{
+  int result;
+  
+  if (lstrcasecmp(str, L("EN-US"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_EN_US;
+    return ESR_SUCCESS;
+  }
+  else if (lstrcasecmp(str, L("FR-FR"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_FR_FR;
+    return ESR_SUCCESS;
+  }
+  else if (lstrcasecmp(str, L("DE-DE"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_DE_DE;
+    return ESR_SUCCESS;
+  }
+  else if (lstrcasecmp(str, L("EN-GB"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_EN_GB;
+    return ESR_SUCCESS;
+  }
+  else if (lstrcasecmp(str, L("JA-JP"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_JA_JP;
+    return ESR_SUCCESS;
+  }
+  else if (lstrcasecmp(str, L("PT-PT"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_PT_PT;
+    return ESR_SUCCESS;
+  }
+  else if (lstrcasecmp(str, L("ES-ES"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_ES_ES;
+    return ESR_SUCCESS;
+  }
+  else if (lstrcasecmp(str, L("IT-IT"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_IT_IT;
+    return ESR_SUCCESS;
+  }
+  else if (lstrcasecmp(str, L("NL-NL"), &result) == ESR_SUCCESS && !result)
+  {
+    *locale = ESR_LOCALE_NL_NL;
+    return ESR_SUCCESS;
+  }
+  PLogError(L("no locale defined for %s"), str);
+  return ESR_INVALID_ARGUMENT;
+}
diff --git a/shared/src/ESR_Session.c b/shared/src/ESR_Session.c
new file mode 100644
index 0000000..1ca230c
--- /dev/null
+++ b/shared/src/ESR_Session.c
@@ -0,0 +1,306 @@
+/*---------------------------------------------------------------------------*
+ *  ESR_Session.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "ESR_Session.h"
+#include "ESR_SessionType.h"
+#include "ESR_SessionTypeImpl.h"
+#include <string.h>
+#include "HashMap.h"
+#include "IntArrayList.h"
+#include "LCHAR.h"
+#include "lstring.h"
+#include "passert.h"
+#include "plog.h"
+#include "ptrd.h"
+#include "pstdio.h"
+
+static ESR_SessionType* ESR_Session = NULL;
+#define CHECK_SESSION_OR_RETURN if(!ESR_Session) return ESR_INVALID_ARGUMENT
+
+ESR_ReturnCode ESR_SessionCreate(const LCHAR* filename)
+{
+  ESR_ReturnCode rc;
+  
+  CHKLOG(rc, ESR_SessionTypeCreate(&ESR_Session));
+  
+  /* Initialize default values here */
+  CHKLOG(rc, ESR_Session->setLCHAR(ESR_Session, L("cmdline.nametagPath"), L("")));
+#ifdef USE_THREAD
+  CHKLOG(rc, ESR_Session->setUint16_t(ESR_Session, L("thread.priority"), PtrdThreadNormalPriority));
+#endif
+  
+  /* End of default values */
+  CHKLOG(rc, ESR_Session->importParFile(ESR_Session, filename));
+  return ESR_SUCCESS;
+CLEANUP:
+  ESR_SessionDestroy();
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionGetProperty(const LCHAR* name, void** value, VariableTypes type)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getProperty(ESR_Session, name, value, type);
+}
+
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetInt(const LCHAR* name, int* value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getInt(ESR_Session, name, value);
+}
+
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetUint16_t(const LCHAR* name, asr_uint16_t* value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getUint16_t(ESR_Session, name, value);
+}
+
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize_t(const LCHAR* name,
+    size_t* value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getSize_t(ESR_Session, name, value);
+}
+
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetFloat(const LCHAR* name, float* value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getFloat(ESR_Session, name, value);
+}
+
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetBool(const LCHAR* name, ESR_BOOL* value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getBool(ESR_Session, name, value);
+}
+
+ESR_SHARED_API ESR_ReturnCode ESR_SessionGetLCHAR(const LCHAR* name, LCHAR* value, size_t* len)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getLCHAR(ESR_Session, name, value, len);
+}
+
+ESR_ReturnCode ESR_SessionContains(const LCHAR* name, ESR_BOOL* exists)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->contains(ESR_Session, name, exists);
+}
+
+ESR_ReturnCode ESR_SessionSetProperty(const LCHAR* name, void* value, VariableTypes type)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setProperty(ESR_Session, name, value, type);
+}
+
+ESR_ReturnCode ESR_SessionSetInt(const LCHAR* name, int value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setInt(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetUint16_t(const LCHAR* name, asr_uint16_t value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setUint16_t(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetSize_t(const LCHAR* name, size_t value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setSize_t(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetFloat(const LCHAR* name, float value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setFloat(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetBool(const LCHAR* name, ESR_BOOL value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setBool(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetLCHAR(const LCHAR* name, LCHAR* value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setLCHAR(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetIntIfEmpty(const LCHAR* name, int value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setIntIfEmpty(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetUint16_tIfEmpty(const LCHAR* name, asr_uint16_t value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setUint16_tIfEmpty(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetSize_tIfEmpty(const LCHAR* name, size_t value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setSize_tIfEmpty(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetFloatIfEmpty(const LCHAR* name, float value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setFloatIfEmpty(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetBoolIfEmpty(const LCHAR* name, ESR_BOOL value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setBoolIfEmpty(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionSetLCHARIfEmpty(const LCHAR* name, LCHAR* value)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->setLCHARIfEmpty(ESR_Session, name, value);
+}
+
+ESR_ReturnCode ESR_SessionRemoveProperty(const LCHAR* name)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->removeProperty(ESR_Session, name);
+}
+
+ESR_ReturnCode ESR_SessionRemoveAndFreeProperty(const LCHAR* name)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->removeAndFreeProperty(ESR_Session, name);
+}
+
+ESR_ReturnCode ESR_SessionImportCommandLine(int argc, LCHAR* argv[])
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->importCommandLine(ESR_Session, argc, argv);
+}
+
+ESR_ReturnCode ESR_SessionGetSize(size_t* size)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getSize(ESR_Session, size);
+}
+
+ESR_ReturnCode ESR_SessionGetKeyAtIndex(size_t index, LCHAR** key)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getKeyAtIndex(ESR_Session, index, key);
+}
+
+ESR_ReturnCode ESR_SessionConvertToInt(const LCHAR* key)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->convertToInt(ESR_Session, key);
+}
+
+ESR_ReturnCode ESR_SessionConvertToUint16_t(const LCHAR* key)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->convertToUint16_t(ESR_Session, key);
+}
+
+ESR_ReturnCode ESR_SessionConvertToSize_t(const LCHAR* key)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->convertToSize_t(ESR_Session, key);
+}
+
+ESR_ReturnCode ESR_SessionConvertToFloat(const LCHAR* key)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->convertToFloat(ESR_Session, key);
+}
+
+ESR_ReturnCode ESR_SessionConvertToBool(const LCHAR* key)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->convertToBool(ESR_Session, key);
+}
+
+ESR_ReturnCode ESR_SessionGetPropertyType(const LCHAR* name, VariableTypes* type)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->getPropertyType(ESR_Session, name, type);
+}
+
+ESR_ReturnCode ESR_SessionImportParFile(const LCHAR* filename)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->importParFile(ESR_Session, filename);
+}
+
+ESR_ReturnCode ESR_SessionDestroy()
+{
+  ESR_ReturnCode rc;
+  
+  if (ESR_Session != NULL)
+  {
+    CHKLOG(rc, ESR_Session->destroy(ESR_Session));
+    ESR_Session = NULL;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionExists(ESR_BOOL* val)
+{
+  *val = (ESR_Session != NULL);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ESR_SessionPrefixWithBaseDirectory(LCHAR* path, size_t* len)
+{
+  ESR_ReturnCode rc;
+  LCHAR baseDirectory[P_PATH_MAX];
+  ESR_BOOL isAbsolute;
+  size_t len2 = P_PATH_MAX;
+  
+  /* Skip absolute paths. */
+  CHKLOG(rc, pf_convert_backslashes_to_forwardslashes (path));
+  CHKLOG(rc, pf_is_path_absolute (path, &isAbsolute));
+  if (isAbsolute)
+    return ESR_SUCCESS;
+    
+  CHKLOG(rc, ESR_SessionGetLCHAR(L("parFile.baseDirectory"), baseDirectory, &len2));
+  CHKLOG(rc, lstrinsert(baseDirectory, path, 0, len));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_SHARED_API ESR_ReturnCode ESR_SessionAddListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->addListener(ESR_Session, listener);
+}
+
+ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener)
+{
+  CHECK_SESSION_OR_RETURN;
+  return ESR_Session->removeListener(ESR_Session, listener);
+}
diff --git a/shared/src/HashMap.c b/shared/src/HashMap.c
new file mode 100644
index 0000000..cb87ac2
--- /dev/null
+++ b/shared/src/HashMap.c
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*
+ *  HashMap.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "HashMap.h"
+#include "HashMapImpl.h"
+#include "pmemory.h"
+#include <string.h>
+
+ESR_ReturnCode HashMapPut(HashMap* self, const LCHAR* key, void* value)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->put(self, key, value);
+}
+
+ESR_ReturnCode HashMapRemove(HashMap* self, const LCHAR* key)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->remove(self, key);
+}
+
+ESR_ReturnCode HashMapRemoveAndFree(HashMap* self, const LCHAR* key)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->removeAndFree(self, key);
+}
+
+ESR_ReturnCode HashMapRemoveAtIndex(HashMap* self, const size_t index)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->removeAtIndex(self, index);
+}
+
+ESR_ReturnCode HashMapRemoveAll(HashMap* self)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->removeAll(self);
+}
+
+ESR_ReturnCode HashMapRemoveAndFreeAll(HashMap* self)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->removeAndFreeAll(self);
+}
+
+ESR_ReturnCode HashMapContainsKey(HashMap* self, const LCHAR* key, ESR_BOOL* exists)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->containsKey(self, key, exists);
+}
+
+ESR_ReturnCode HashMapGetSize(HashMap* self, size_t* size)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->getSize(self, size);
+}
+
+ESR_ReturnCode HashMapGet(HashMap* self, const LCHAR* key, void** value)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->get(self, key, value);
+}
+
+ESR_ReturnCode HashMapGetKeyAtIndex(HashMap* self, const size_t index, LCHAR** key)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->getKeyAtIndex(self, index, key);
+}
+
+ESR_ReturnCode HashMapGetValueAtIndex(HashMap* self, const size_t index, void** value)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->getValueAtIndex(self, index, value);
+}
+
+ESR_ReturnCode HashMapDestroy(HashMap* self)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->destroy(self);
+}
diff --git a/shared/src/HashMapImpl.c b/shared/src/HashMapImpl.c
new file mode 100644
index 0000000..326b43d
--- /dev/null
+++ b/shared/src/HashMapImpl.c
@@ -0,0 +1,293 @@
+/*---------------------------------------------------------------------------*
+ *  HashMapImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "HashMap.h"
+#include "HashMapImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "string.h"
+
+#define MTAG NULL
+
+static ESR_ReturnCode HashMapCreate_Internal(PHashTableArgs *hashArgs,
+    HashMap **self)
+{
+  HashMapImpl* impl;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  impl = NEW(HashMapImpl, MTAG);
+  if (impl == NULL)
+    return ESR_OUT_OF_MEMORY;
+    
+  if ((rc = PHashTableCreate(hashArgs, MTAG, &impl->table)) != ESR_SUCCESS)
+  {
+    FREE(impl);
+    return rc;
+  }
+  
+  impl->Interface.put = &HashMap_Put;
+  impl->Interface.remove = &HashMap_Remove;
+  impl->Interface.removeAndFree = &HashMap_RemoveAndFree;
+  impl->Interface.removeAll = &HashMap_RemoveAll;
+  impl->Interface.removeAndFreeAll = &HashMap_RemoveAndFreeAll;
+  impl->Interface.removeAtIndex = &HashMap_RemoveAtIndex;
+  impl->Interface.containsKey = &HashMap_ContainsKey;
+  impl->Interface.getKeyAtIndex = &HashMap_GetKeyAtIndex;
+  impl->Interface.get = &HashMap_Get;
+  impl->Interface.getValueAtIndex = &HashMap_GetValueAtIndex;
+  impl->Interface.getSize = &HashMap_GetSize;
+  impl->Interface.destroy = &HashMap_Destroy;
+  
+  *self = (HashMap*) impl;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode HashMapCreate(HashMap** self)
+{
+  return HashMapCreate_Internal(NULL, self);
+}
+
+ESR_ReturnCode HashMapCreateBins(size_t nbBins, HashMap** self)
+{
+  PHashTableArgs hashArgs;
+  hashArgs.capacity = nbBins;
+  hashArgs.maxLoadFactor = PHASH_TABLE_DEFAULT_MAX_LOAD_FACTOR;
+  hashArgs.hashFunction = PHASH_TABLE_DEFAULT_HASH_FUNCTION;
+  hashArgs.compFunction = PHASH_TABLE_DEFAULT_COMP_FUNCTION;
+  return HashMapCreate_Internal(&hashArgs, self);
+}
+
+ESR_ReturnCode HashMap_Put(HashMap* self, const LCHAR* key, void* value)
+{
+  HashMapImpl* impl = (HashMapImpl*) self;
+  PHashTableEntry *entry = NULL;
+  ESR_ReturnCode rc;
+  ESR_BOOL exists;
+  
+  CHKLOG(rc, PHashTableContainsKey(impl->table, key, &exists));
+  if (!exists)
+  {
+    /* Not found, clone the key and insert it. */
+    LCHAR *clone = (LCHAR *) MALLOC(sizeof(LCHAR) * (LSTRLEN(key) + 1), MTAG);
+    if (clone == NULL) return ESR_OUT_OF_MEMORY;
+    LSTRCPY(clone, key);
+    if ((rc = PHashTablePutValue(impl->table, clone, value, NULL)) != ESR_SUCCESS)
+    {
+      FREE(clone);
+    }
+  }
+  else
+  {
+    /* Key already present in table, just change the value. */
+    CHKLOG(rc, PHashTableGetEntry(impl->table, key, &entry));
+    rc = PHashTableEntrySetValue(entry, value, NULL);
+  }
+  return rc;
+CLEANUP:
+  return rc;
+}
+
+static ESR_ReturnCode HashMap_Remove_Internal(HashMapImpl* impl, const LCHAR* key, ESR_BOOL freeValue)
+{
+  PHashTableEntry *entry = NULL;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  LCHAR *clonedKey = NULL;
+  void *value = NULL;
+  
+  CHK(rc, PHashTableGetEntry(impl->table, key, &entry));
+  CHK(rc, PHashTableEntryGetKeyValue(entry, (void **)&clonedKey, (void **)&value));
+  
+  if (clonedKey)
+    FREE(clonedKey);
+  if (freeValue && value)
+    FREE(value);
+    
+  return PHashTableEntryRemove(entry);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode HashMap_Remove(HashMap* self, const LCHAR* key)
+{
+  return HashMap_Remove_Internal((HashMapImpl*) self, key, ESR_FALSE);
+}
+
+ESR_ReturnCode HashMap_RemoveAndFree(HashMap* self, const LCHAR* key)
+{
+  return HashMap_Remove_Internal((HashMapImpl*) self, key, ESR_TRUE);
+}
+
+static ESR_ReturnCode HashMap_RemoveAll_Internal(HashMapImpl *impl, ESR_BOOL freeValues)
+{
+  PHashTableEntry *entry1 = NULL;
+  PHashTableEntry *entry2 = NULL;
+  
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  LCHAR *key = NULL;
+  void *value = NULL;
+  
+  if ((rc = PHashTableEntryGetFirst(impl->table, &entry1)) != ESR_SUCCESS)
+    goto end;
+    
+  while (entry1 != NULL)
+  {
+    if ((rc = PHashTableEntryGetKeyValue(entry1, (void **)&key, (void **)&value)) != ESR_SUCCESS)
+      goto end;
+    if (key) FREE(key);
+    if (freeValues && value) FREE(value);
+    entry2 = entry1;
+    if ((rc = PHashTableEntryAdvance(&entry1)) != ESR_SUCCESS)
+      goto end;
+    if ((rc =  PHashTableEntryRemove(entry2)) != ESR_SUCCESS)
+      goto end;
+  }
+end:
+  return rc;
+}
+
+ESR_ReturnCode HashMap_RemoveAll(HashMap* self)
+{
+  return HashMap_RemoveAll_Internal((HashMapImpl *) self, ESR_FALSE);
+}
+
+ESR_ReturnCode HashMap_RemoveAndFreeAll(HashMap* self)
+{
+  return HashMap_RemoveAll_Internal((HashMapImpl *) self, ESR_TRUE);
+}
+
+ESR_ReturnCode HashMap_ContainsKey(HashMap* self, const LCHAR* key, ESR_BOOL* exists)
+{
+  HashMapImpl* impl = (HashMapImpl*) self;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  CHKLOG(rc, PHashTableContainsKey(impl->table, key, exists));
+  return rc;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode HashMap_Get(HashMap* self, const LCHAR* key, void** value)
+{
+  HashMapImpl* impl = (HashMapImpl*) self;
+  PHashTableEntry *entry = NULL;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  CHK(rc, PHashTableGetEntry(impl->table, key, &entry));
+  CHK(rc, PHashTableEntryGetKeyValue(entry, (void **)NULL, (void **)value));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+static ESR_ReturnCode HashMap_GetEntryAtIndex(HashMapImpl *impl, const size_t index,
+    PHashTableEntry **entry)
+{
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  size_t i = 0;
+  
+  if ((rc = PHashTableEntryGetFirst(impl->table, entry)) != ESR_SUCCESS)
+    goto end;
+    
+  while (*entry != NULL && i < index)
+  {
+    ++i;
+    if ((rc = PHashTableEntryAdvance(entry)) != ESR_SUCCESS)
+      goto end;
+  }
+  if (*entry == NULL)
+    rc = ESR_ARGUMENT_OUT_OF_BOUNDS;
+end:
+  return rc;
+}
+
+
+ESR_ReturnCode HashMap_GetKeyAtIndex(HashMap* self, const size_t index, LCHAR** key)
+{
+  HashMapImpl* impl = (HashMapImpl*) self;
+  PHashTableEntry *entry = NULL;
+  ESR_ReturnCode rc;
+  
+  if ((rc = HashMap_GetEntryAtIndex(impl, index, &entry)) != ESR_SUCCESS)
+    goto end;
+    
+  rc = PHashTableEntryGetKeyValue(entry, (void **) key, (void **) NULL);
+  
+end:
+  return rc;
+}
+
+ESR_ReturnCode HashMap_GetValueAtIndex(HashMap* self, const size_t index, void** value)
+{
+  HashMapImpl* impl = (HashMapImpl*) self;
+  PHashTableEntry *entry = NULL;
+  ESR_ReturnCode rc;
+  
+  if ((rc = HashMap_GetEntryAtIndex(impl, index, &entry)) != ESR_SUCCESS)
+    goto end;
+    
+  rc = PHashTableEntryGetKeyValue(entry, (void **)NULL, (void **)value);
+  
+end:
+  return rc;
+}
+
+ESR_ReturnCode HashMap_RemoveAtIndex(HashMap* self, const size_t index)
+{
+  HashMapImpl* impl = (HashMapImpl*) self;
+  PHashTableEntry *entry = NULL;
+  ESR_ReturnCode rc;
+  void *key;
+  
+  if ((rc = HashMap_GetEntryAtIndex(impl, index, &entry)) != ESR_SUCCESS)
+    goto end;
+    
+  if ((rc = PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)NULL)) != ESR_SUCCESS)
+    goto end;
+    
+  if (key != NULL) FREE(key);
+  
+  rc = PHashTableEntryRemove(entry);
+  
+end:
+  return rc;
+}
+
+ESR_ReturnCode HashMap_GetSize(HashMap* self, size_t* size)
+{
+  HashMapImpl* impl = (HashMapImpl*) self;
+  return PHashTableGetSize(impl->table, size);
+}
+
+ESR_ReturnCode HashMap_Destroy(HashMap* self)
+{
+  HashMapImpl* impl = (HashMapImpl*) self;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  if ((rc = self->removeAll(self)) != ESR_SUCCESS)
+    goto end;
+    
+  if (impl->table != NULL)
+    rc = PHashTableDestroy(impl->table);
+  FREE(impl);
+end:
+  return rc;
+}
diff --git a/shared/src/Int8ArrayList.c b/shared/src/Int8ArrayList.c
new file mode 100644
index 0000000..4bc8140
--- /dev/null
+++ b/shared/src/Int8ArrayList.c
@@ -0,0 +1,124 @@
+/*---------------------------------------------------------------------------*
+ *  Int8ArrayList.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "Int8ArrayList.h"
+#include "Int8ArrayListImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+ESR_ReturnCode Int8ArrayListAdd(Int8ArrayList* self, asr_int8_t element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->add(self, element);
+}
+
+ESR_ReturnCode Int8ArrayListRemove(Int8ArrayList* self, asr_int8_t element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->remove(self, element);
+}
+
+ESR_ReturnCode Int8ArrayListRemoveAll(Int8ArrayList* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->removeAll(self);
+}
+
+ESR_ReturnCode Int8ArrayListContains(Int8ArrayList* self, asr_int8_t element, ESR_BOOL* exists)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->contains(self, element, exists);
+}
+
+ESR_ReturnCode Int8ArrayListGetSize(Int8ArrayList* self, size_t* size)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getSize(self, size);
+}
+
+ESR_ReturnCode Int8ArrayListGet(Int8ArrayList* self, size_t index, asr_int8_t* element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->get(self, index, element);
+}
+
+ESR_ReturnCode Int8ArrayListSet(Int8ArrayList* self, size_t index, asr_int8_t element)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->set(self, index, element);
+}
+
+ESR_ReturnCode Int8ArrayListToStaticArray(Int8ArrayList* self, asr_int8_t** newArray)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->toStaticArray(self, newArray);
+}
+
+ESR_ReturnCode Int8ArrayListClone(Int8ArrayList* self, Int8ArrayList* clone)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->clone(self, clone);
+}
+
+ESR_ReturnCode Int8ArrayListDestroy(Int8ArrayList* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
diff --git a/shared/src/Int8ArrayListImpl.c b/shared/src/Int8ArrayListImpl.c
new file mode 100644
index 0000000..d779eb3
--- /dev/null
+++ b/shared/src/Int8ArrayListImpl.c
@@ -0,0 +1,210 @@
+/*---------------------------------------------------------------------------*
+ *  Int8ArrayListImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "Int8ArrayList.h"
+#include "Int8ArrayListImpl.h"
+#include "pmemory.h"
+#include "passert.h"
+
+#define MTAG NULL
+#define INITIAL_SIZE 32
+
+
+ESR_ReturnCode Int8ArrayListCreate(Int8ArrayList** self)
+{
+  Int8ArrayListImpl* impl;
+  
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  impl = NEW(Int8ArrayListImpl, MTAG);
+  if (impl == NULL)
+    return ESR_OUT_OF_MEMORY;
+  impl->Interface.add = &Int8ArrayList_Add;
+  impl->Interface.contains = &Int8ArrayList_Contains;
+  impl->Interface.destroy = &Int8ArrayList_Destroy;
+  impl->Interface.get = &Int8ArrayList_Get;
+  impl->Interface.getSize = &Int8ArrayList_GetSize;
+  impl->Interface.remove = &Int8ArrayList_Remove;
+  impl->Interface.removeAll = &Int8ArrayList_RemoveAll;
+  impl->Interface.set = &Int8ArrayList_Set;
+  impl->Interface.toStaticArray = &Int8ArrayList_ToStaticArray;
+  impl->Interface.clone = &Int8ArrayList_Clone;
+  impl->contents = MALLOC((INITIAL_SIZE + 1) * sizeof(asr_int8_t), MTAG);
+  if (impl->contents == NULL)
+  {
+    FREE(impl);
+    return ESR_OUT_OF_MEMORY;
+  }
+  impl->actualSize = INITIAL_SIZE;
+  impl->virtualSize = 0;
+  *self = (Int8ArrayList*) impl;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode Int8ArrayListImport(asr_int8_t* value, Int8ArrayList** self)
+{
+  ESR_ReturnCode rc;
+  Int8ArrayListImpl* impl;
+  
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  CHK(rc, Int8ArrayListCreate(self));
+  impl = (Int8ArrayListImpl*) self;
+  impl->contents = value;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode Int8ArrayList_Add(Int8ArrayList* self, const asr_int8_t element)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  
+  if (impl->virtualSize >= impl->actualSize)
+  {
+    /* enlarge buffer */
+    asr_int8_t* temp = REALLOC(impl->contents, (impl->actualSize * 2 + 1) * sizeof(asr_int8_t));
+    if (temp == NULL)
+      return ESR_OUT_OF_MEMORY;
+    impl->contents = temp;
+    impl->actualSize *= 2;
+  }
+  impl->contents[impl->virtualSize] = element;
+  ++impl->virtualSize;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode Int8ArrayList_Remove(Int8ArrayList* self, const asr_int8_t element)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  asr_int8_t* contents = impl->contents; /* cache pointer */
+  size_t virtualSize = impl->virtualSize; /* cache value */
+  size_t i;
+  
+  for (i = 0; i < virtualSize; ++i)
+  {
+    if (contents[i] == element)
+    {
+      --virtualSize;
+      break;
+    }
+  }
+  /* shift remaining elements back */
+  for (; i < virtualSize; ++i)
+    contents[i] = contents[i+1];
+    
+  impl->virtualSize = virtualSize; /* flush cache */
+  if (virtualSize <= impl->actualSize / 4)
+  {
+    /* shrink buffer */
+    impl->contents = REALLOC(contents, (impl->actualSize / 2 + 1) * sizeof(asr_int8_t));
+    passert(impl->contents != NULL); /* should never fail */
+    impl->actualSize /= 2;
+  }
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode Int8ArrayList_RemoveAll(Int8ArrayList* self)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  
+  impl->virtualSize = 0;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode Int8ArrayList_Contains(Int8ArrayList* self, const asr_int8_t element, ESR_BOOL* exists)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  size_t i;
+  size_t virtualSize = impl->virtualSize; /* cache value */
+  asr_int8_t* contents = impl->contents; /* cache value */
+  
+  for (i = 0; i < virtualSize; ++i)
+  {
+    if (contents[i] == element)
+    {
+      *exists = ESR_TRUE;
+      return ESR_SUCCESS;
+    }
+  }
+  *exists = ESR_FALSE;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode Int8ArrayList_Get(Int8ArrayList* self, size_t index, asr_int8_t* element)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  
+  passert(index >= 0 && index <= impl->virtualSize);
+  *element = impl->contents[index];
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode Int8ArrayList_Set(Int8ArrayList* self, size_t index, const asr_int8_t element)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  
+  passert(index >= 0 && index <= impl->virtualSize);
+  impl->contents[index] = element;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode Int8ArrayList_GetSize(Int8ArrayList* self, size_t* size)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  
+  *size = impl->virtualSize;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode Int8ArrayList_ToStaticArray(Int8ArrayList* self, asr_int8_t** newArray)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  
+  *newArray = impl->contents;
+  impl->contents = NULL; /* prevent free() from deallocating buffer */
+  return Int8ArrayList_Destroy(self);
+}
+
+ESR_ReturnCode Int8ArrayList_Clone(Int8ArrayList* self, Int8ArrayList* clone)
+{
+  size_t size, i;
+  asr_int8_t element;
+  ESR_ReturnCode rc;
+  
+  CHK(rc, clone->removeAll(clone));
+  CHK(rc, self->getSize(self, &size));
+  for (i = 0; i < size; ++i)
+  {
+    CHK(rc, self->get(self, i, &element));
+    CHK(rc, clone->add(clone, element));
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode Int8ArrayList_Destroy(Int8ArrayList* self)
+{
+  Int8ArrayListImpl* impl = (Int8ArrayListImpl*) self;
+  
+  FREE(impl->contents);
+  FREE(impl);
+  return ESR_SUCCESS;
+}
diff --git a/shared/src/IntArrayList.c b/shared/src/IntArrayList.c
new file mode 100644
index 0000000..d2f3ec7
--- /dev/null
+++ b/shared/src/IntArrayList.c
@@ -0,0 +1,85 @@
+/*---------------------------------------------------------------------------*
+ *  IntArrayList.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "IntArrayList.h"
+#include "IntArrayListImpl.h"
+#include "pmemory.h"
+
+ESR_ReturnCode IntArrayListAdd(IntArrayList* self, int element)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->add(self, element);
+}
+
+ESR_ReturnCode IntArrayListRemove(IntArrayList* self, int element)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->remove(self, element);
+}
+
+ESR_ReturnCode IntArrayListRemoveAll(IntArrayList* self)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->removeAll(self);
+}
+
+ESR_ReturnCode IntArrayListContains(IntArrayList* self, int element, ESR_BOOL* exists)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->contains(self, element, exists);
+}
+
+ESR_ReturnCode IntArrayListGetSize(IntArrayList* self, size_t* size)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->getSize(self, size);
+}
+
+ESR_ReturnCode IntArrayListGet(IntArrayList* self, size_t index, int* element)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->get(self, index, element);
+}
+
+ESR_ReturnCode IntArrayListSet(IntArrayList* self, size_t index, int element)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->set(self, index, element);
+}
+
+ESR_ReturnCode IntArrayListToStaticArray(IntArrayList* self, int** newArray)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->toStaticArray(self, newArray);
+}
+
+ESR_ReturnCode IntArrayListDestroy(IntArrayList* self)
+{
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  return self->destroy(self);
+}
diff --git a/shared/src/IntArrayListImpl.c b/shared/src/IntArrayListImpl.c
new file mode 100644
index 0000000..96e6e4f
--- /dev/null
+++ b/shared/src/IntArrayListImpl.c
@@ -0,0 +1,191 @@
+/*---------------------------------------------------------------------------*
+ *  IntArrayListImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "IntArrayList.h"
+#include "IntArrayListImpl.h"
+#include "pmemory.h"
+#include "passert.h"
+
+#define MTAG NULL
+#define INITIAL_SIZE 32
+
+
+ESR_ReturnCode IntArrayListCreate(IntArrayList** self)
+{
+  IntArrayListImpl* impl;
+  
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  impl = NEW(IntArrayListImpl, MTAG);
+  if (impl == NULL)
+    return ESR_OUT_OF_MEMORY;
+  impl->Interface.add = &IntArrayList_Add;
+  impl->Interface.contains = &IntArrayList_Contains;
+  impl->Interface.destroy = &IntArrayList_Destroy;
+  impl->Interface.get = &IntArrayList_Get;
+  impl->Interface.getSize = &IntArrayList_GetSize;
+  impl->Interface.remove = &IntArrayList_Remove;
+  impl->Interface.removeAll = &IntArrayList_RemoveAll;
+  impl->Interface.set = &IntArrayList_Set;
+  impl->Interface.toStaticArray = &IntArrayList_ToStaticArray;
+  impl->contents = MALLOC((INITIAL_SIZE + 1) * sizeof(int), MTAG);
+  if (impl->contents == NULL)
+  {
+    FREE(impl);
+    return ESR_OUT_OF_MEMORY;
+  }
+  impl->actualSize = INITIAL_SIZE;
+  impl->virtualSize = 0;
+  *self = (IntArrayList*) impl;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode IntArrayListImport(int* value, IntArrayList** self)
+{
+  ESR_ReturnCode rc;
+  IntArrayListImpl* impl;
+  
+  if (self == NULL)
+    return ESR_INVALID_ARGUMENT;
+  CHK(rc, IntArrayListCreate(self));
+  impl = (IntArrayListImpl*) self;
+  impl->contents = value;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode IntArrayList_Add(IntArrayList* self, const int element)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  
+  if (impl->virtualSize >= impl->actualSize)
+  {
+    /* enlarge buffer */
+    int* temp = REALLOC(impl->contents, (impl->actualSize * 2 + 1) * sizeof(int));
+    if (temp == NULL)
+      return ESR_OUT_OF_MEMORY;
+    impl->contents = temp;
+    impl->actualSize *= 2;
+  }
+  impl->contents[impl->virtualSize] = element;
+  ++impl->virtualSize;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode IntArrayList_Remove(IntArrayList* self, const int element)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  int* contents = impl->contents; /* cache pointer */
+  size_t virtualSize = impl->virtualSize; /* cache value */
+  size_t i;
+  
+  for (i = 0; i < virtualSize; ++i)
+  {
+    if (contents[i] == element)
+    {
+      --virtualSize;
+      break;
+    }
+  }
+  /* shift remaining elements back */
+  for (; i < virtualSize; ++i)
+    contents[i] = contents[i+1];
+    
+  impl->virtualSize = virtualSize; /* flush cache */
+  if (virtualSize <= impl->actualSize / 4)
+  {
+    /* shrink buffer */
+    impl->contents = REALLOC(contents, (impl->actualSize / 2 + 1) * sizeof(int));
+    passert(impl->contents != NULL); /* should never fail */
+    impl->actualSize /= 2;
+  }
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode IntArrayList_RemoveAll(IntArrayList* self)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  
+  impl->virtualSize = 0;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode IntArrayList_Contains(IntArrayList* self, const int element, ESR_BOOL* exists)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  size_t i;
+  size_t virtualSize = impl->virtualSize; /* cache value */
+  int* contents = impl->contents; /* cache value */
+  
+  for (i = 0; i < virtualSize; ++i)
+  {
+    if (contents[i] == element)
+    {
+      *exists = ESR_TRUE;
+      return ESR_SUCCESS;
+    }
+  }
+  *exists = ESR_FALSE;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode IntArrayList_Get(IntArrayList* self, size_t index, int* element)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  
+  passert(index >= 0 && index <= impl->virtualSize);
+  *element = impl->contents[index];
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode IntArrayList_Set(IntArrayList* self, size_t index, const int element)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  
+  passert(index >= 0 && index <= impl->virtualSize);
+  impl->contents[index] = element;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode IntArrayList_GetSize(IntArrayList* self, size_t* size)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  
+  *size = impl->virtualSize;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode IntArrayList_ToStaticArray(IntArrayList* self, int** newArray)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  
+  *newArray = impl->contents;
+  impl->contents = NULL; /* prevent free() from deallocating buffer */
+  return IntArrayList_Destroy(self);
+}
+
+ESR_ReturnCode IntArrayList_Destroy(IntArrayList* self)
+{
+  IntArrayListImpl* impl = (IntArrayListImpl*) self;
+  
+  FREE(impl->contents);
+  FREE(impl);
+  return ESR_SUCCESS;
+}
diff --git a/shared/src/LStringImpl.c b/shared/src/LStringImpl.c
new file mode 100644
index 0000000..a93051d
--- /dev/null
+++ b/shared/src/LStringImpl.c
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------*
+ *  LStringImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "lstring.h"
+#include "LStringImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+#define MTAG NULL
+#define INITIAL_SIZE 32
+
+ESR_ReturnCode LStringCreate(LString** self)
+{
+  LStringImpl* impl;
+  
+  impl = NEW(LStringImpl, MTAG);
+  if (impl == NULL)
+    return ESR_OUT_OF_MEMORY;
+  impl->Interface.append = &LString_Append;
+  impl->Interface.toLCHAR = &LString_ToLCHAR;
+  impl->Interface.reset = &LString_Reset;
+  impl->Interface.destroy = &LString_Destroy;
+  impl->size = INITIAL_SIZE;
+  impl->value = MALLOC(sizeof(LCHAR) * INITIAL_SIZE, MTAG);
+  if (impl->value == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  LSTRCPY(impl->value, L(""));
+  if (impl->value == NULL)
+    return ESR_OUT_OF_MEMORY;
+  *self = (LString*) impl;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode LString_Append(LString* self, const LCHAR* value)
+{
+  LStringImpl* impl = (LStringImpl*) self;
+  size_t needed;
+  
+  needed = LSTRLEN(impl->value) + LSTRLEN(value) + 1;
+  
+  if (needed > impl->size)
+  {
+    LCHAR* temp = REALLOC(impl->value, sizeof(LCHAR) * (needed + (impl->size / 2)));
+    if (temp == NULL)
+      return ESR_OUT_OF_MEMORY;
+    impl->size = sizeof(LCHAR) * (needed + (impl->size / 2));
+    impl->value = temp;
+  }
+  LSTRCAT(impl->value, value);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode LString_Reset(LString* self)
+{
+  LStringImpl* impl = (LStringImpl*) self;
+  
+  LSTRCPY(impl->value, L(""));
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode LString_ToLCHAR(LString* self, LCHAR** result)
+{
+  LStringImpl* impl = (LStringImpl*) self;
+  
+  if (result == NULL)
+    return ESR_INVALID_ARGUMENT;
+  *result = impl->value;
+  impl->value = NULL;
+  return self->destroy(self);
+}
+
+ESR_ReturnCode LString_Destroy(LString* self)
+{
+  LStringImpl* impl = (LStringImpl*) self;
+  
+  FREE(impl->value);
+  FREE(impl);
+  return ESR_SUCCESS;
+}
diff --git a/shared/src/SessionTypeImpl.c b/shared/src/SessionTypeImpl.c
new file mode 100644
index 0000000..44f0a44
--- /dev/null
+++ b/shared/src/SessionTypeImpl.c
@@ -0,0 +1,1414 @@
+/*---------------------------------------------------------------------------*
+ *  SessionTypeImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "ESR_SessionType.h"
+#include "ESR_SessionTypeImpl.h"
+#include "HashMap.h"
+#include "IntArrayList.h"
+#include "LCHAR.h"
+#include "lstring.h"
+#include "passert.h"
+#include "pendian.h"
+#include "PFile.h"
+#include "PFileSystem.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "pstdio.h"
+#include "string.h"
+#include "ESR_SessionTypeListener.h"
+
+#define MTAG NULL
+
+ESR_ReturnCode ESR_SessionTypeCreate(ESR_SessionType** self)
+{
+  ESR_SessionType* Interface;
+  ESR_SessionTypeData* data;
+  ESR_ReturnCode rc;
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  Interface = NEW(ESR_SessionType, MTAG);
+  if (Interface == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  data = NEW(ESR_SessionTypeData, MTAG);
+  if (data == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+
+
+  Interface->addListener = &ESR_SessionTypeAddListenerImpl;
+  Interface->contains = &ESR_SessionTypeContainsImpl;
+  Interface->convertToBool = &ESR_SessionTypeConvertToBoolImpl;
+  Interface->convertToFloat = &ESR_SessionTypeConvertToFloatImpl;
+  Interface->convertToInt = &ESR_SessionTypeConvertToIntImpl;
+  Interface->convertToUint16_t = &ESR_SessionTypeConvertToUint16_tImpl;
+  Interface->convertToSize_t = &ESR_SessionTypeConvertToSize_tImpl;
+  Interface->destroy = &ESR_SessionTypeDestroyImpl;
+  Interface->getBool = &ESR_SessionTypeGetBoolImpl;
+  Interface->getFloat = &ESR_SessionTypeGetFloatImpl;
+  Interface->getInt = &ESR_SessionTypeGetIntImpl;
+  Interface->getUint16_t = &ESR_SessionTypeGetUint16_tImpl;
+  Interface->getKeyAtIndex = &ESR_SessionTypeGetKeyAtIndexImpl;
+  Interface->getLCHAR = &ESR_SessionTypeGetLCHARImpl;
+  Interface->getProperty = &ESR_SessionTypeGetPropertyImpl;
+  Interface->getPropertyType = &ESR_SessionTypeGetPropertyTypeImpl;
+  Interface->getSize = &ESR_SessionTypeGetSizeImpl;
+  Interface->getSize_t = &ESR_SessionTypeGetSize_tImpl;
+  Interface->importCommandLine = &ESR_SessionTypeImportCommandLineImpl;
+  Interface->importParFile = &ESR_SessionTypeImportParFileImpl;
+  Interface->removeProperty = &ESR_SessionTypeRemovePropertyImpl;
+  Interface->removeAndFreeProperty = &ESR_SessionTypeRemoveAndFreePropertyImpl;
+  Interface->setBool = &ESR_SessionTypeSetBoolImpl;
+  Interface->setBoolIfEmpty = &ESR_SessionTypeSetBoolIfEmptyImpl;
+  Interface->setFloat = &ESR_SessionTypeSetFloatImpl;
+  Interface->setFloatIfEmpty = &ESR_SessionTypeSetFloatIfEmptyImpl;
+  Interface->setInt = &ESR_SessionTypeSetIntImpl;
+  Interface->setIntIfEmpty = &ESR_SessionTypeSetIntIfEmptyImpl;
+  Interface->setUint16_t = &ESR_SessionTypeSetUint16_tImpl;
+  Interface->setUint16_tIfEmpty = &ESR_SessionTypeSetUint16_tIfEmptyImpl;
+  Interface->setLCHAR = &ESR_SessionTypeSetLCHARImpl;
+  Interface->setLCHARIfEmpty = &ESR_SessionTypeSetLCHARIfEmptyImpl;
+  Interface->setProperty = &ESR_SessionTypeSetPropertyImpl;
+  Interface->setSize_t = &ESR_SessionTypeSetSize_tImpl;
+  Interface->setSize_tIfEmpty = &ESR_SessionTypeSetSize_tIfEmptyImpl;
+  Interface->removeListener = &ESR_SessionTypeRemoveListenerImpl;
+
+  Interface->data = data;
+  data->value = NULL;
+  data->listeners = NULL;
+
+  CHK(rc, HashMapCreate(&data->value));
+  CHK(rc, ArrayListCreate(&data->listeners));
+  *self = Interface;
+  return ESR_SUCCESS;
+CLEANUP:
+  Interface->destroy(Interface);
+  return rc;
+}
+
+/*
+ * Because there are no functions to set and get int size_t parameters and because most if not
+ * all int parameters should be size_t anyway, I am adding code to allow size_t and int parameters
+ * to be considered equal. Besides, this check is kind of overkill anyway. SteveR
+ */
+
+ESR_ReturnCode ESR_SessionTypeGetPropertyImpl(ESR_SessionType* self,
+    const LCHAR* name, void** value,
+    VariableTypes type)
+{
+  ESR_SessionTypeData* data = self->data;
+  ESR_SessionPair* pair;
+  ESR_ReturnCode rc;
+
+  CHK(rc, HashMapGet(data->value, name, (void **)&pair));
+  if ( ( pair->type != type) && ( ( ( pair->type != TYPES_INT ) && ( type != TYPES_SIZE_T ) ) ||
+      ( ( type != TYPES_INT ) && ( pair->type != TYPES_SIZE_T ) ) ) )
+  {
+    PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), type, pair->type);
+    return ESR_INVALID_RESULT_TYPE;
+  }
+  *value = pair->value;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetIntImpl(ESR_SessionType* self,
+    const LCHAR* name, int* value)
+{
+  ESR_ReturnCode rc;
+  ESR_SessionTypeData* data;
+  ESR_SessionPair* pair;
+
+  data = self->data;
+  CHK(rc, HashMapGet(data->value, name, (void **)&pair));
+  if ( ( pair->type != TYPES_INT ) && ( pair->type != TYPES_SIZE_T ) )
+  {
+    PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_INT, pair->type);
+    return ESR_INVALID_RESULT_TYPE;
+  }
+  *value = *((int*) pair->value);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetUint16_tImpl(ESR_SessionType* self,
+    const LCHAR* name, asr_uint16_t* value)
+{
+  ESR_ReturnCode rc;
+  ESR_SessionTypeData* data;
+  ESR_SessionPair* pair;
+
+  data = self->data;
+  CHK(rc, HashMapGet(data->value, name, (void **)&pair));
+  if (pair->type != TYPES_UINT16_T)
+  {
+    PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_UINT16_T, pair->type);
+    return ESR_INVALID_RESULT_TYPE;
+  }
+  *value = *((asr_uint16_t*) pair->value);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetSize_tImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    size_t* value)
+{
+  ESR_ReturnCode rc;
+  ESR_SessionTypeData* data;
+  ESR_SessionPair* pair;
+
+  data = self->data;
+  CHKLOG(rc, HashMapGet(data->value, name, (void **)&pair));
+  if ( ( pair->type != TYPES_INT ) && ( pair->type != TYPES_SIZE_T ) )
+  {
+    PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_SIZE_T, pair->type);
+    return ESR_INVALID_RESULT_TYPE;
+  }
+  *value = *((size_t*) pair->value);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetFloatImpl(ESR_SessionType* self,
+    const LCHAR* name, float* value)
+{
+  ESR_ReturnCode rc;
+  ESR_SessionTypeData* data;
+  ESR_SessionPair* pair;
+
+  data = self->data;
+  CHK(rc, HashMapGet(data->value, name, (void **)&pair));
+  if (pair->type != TYPES_FLOAT)
+  {
+    PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_FLOAT, pair->type);
+    return ESR_INVALID_RESULT_TYPE;
+  }
+  *value = *((float*) pair->value);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetBoolImpl(ESR_SessionType* self,
+    const LCHAR* name, ESR_BOOL* value)
+{
+  ESR_ReturnCode rc;
+  ESR_SessionTypeData* data;
+  ESR_SessionPair* pair;
+
+  data = self->data;
+  CHK(rc, HashMapGet(data->value, name, (void **)&pair));
+  if (pair->type != TYPES_BOOL)
+  {
+    PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_BOOL, pair->type);
+    return ESR_INVALID_RESULT_TYPE;
+  }
+  *value = *((ESR_BOOL*) pair->value);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetLCHARImpl(ESR_SessionType* self,
+    const LCHAR* name,
+    LCHAR* value, size_t* len)
+{
+  LCHAR* lValue;
+  ESR_ReturnCode rc;
+  ESR_SessionTypeData* data;
+  ESR_SessionPair* pair;
+
+  if (name == NULL || value == NULL || len == NULL)
+    return ESR_INVALID_ARGUMENT;
+  data = self->data;
+
+  CHK(rc, HashMapGet(data->value, name, (void **)&pair));
+  if (pair->type != TYPES_PLCHAR)
+  {
+    PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_PLCHAR, pair->type);
+    return ESR_INVALID_RESULT_TYPE;
+  }
+  lValue = (LCHAR*) pair->value;
+  if (LSTRLEN(pair->value) + 1 > *len)
+  {
+    *len = LSTRLEN(lValue) + 1;
+    return ESR_BUFFER_OVERFLOW;
+  }
+  LSTRCPY(value, lValue);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeContainsImpl(ESR_SessionType* self,
+    const LCHAR* name, ESR_BOOL* exists)
+{
+  ESR_SessionTypeData* data = self->data;
+
+  return HashMapContainsKey(data->value, name, exists);
+}
+
+static ESR_ReturnCode firePropertyChanged(ESR_SessionType* self, const LCHAR* name,
+    const void* oldValue, const void* newValue,
+    enum VariableTypes_t type)
+{
+  ESR_SessionTypeData* data = self->data;
+  ArrayList* list = data->listeners;
+  size_t size, i;
+  ESR_SessionTypeListenerPair* listener;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, list->getSize(list, &size));
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, list->get(list, i, (void **)&listener));
+    CHKLOG(rc, listener->listener->propertyChanged(listener->listener, name, oldValue, newValue, type, listener->data));
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeSetPropertyImpl(ESR_SessionType* self,
+    const LCHAR* name, void* value,
+    VariableTypes type)
+{
+  ESR_SessionTypeData* data = self->data;
+  ESR_SessionPair* pair = NULL;
+  ESR_BOOL exists;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, HashMapContainsKey(data->value, name, &exists));
+  if ( exists )
+  {
+/* We allow change of parameters through the recognizer and we rely on the recognizer to do
+ * all of the needed validation. SteveR
+ */
+/* Deleting the old entry seems stupid, but it's the only way to prevent a memory leak,
+ * since the old data is not returned when you add the new data. SteveR
+ */
+    CHKLOG ( rc, ESR_SessionTypeRemoveAndFreePropertyImpl ( self, name ) );
+  }
+  pair = NEW(ESR_SessionPair, MTAG);
+  if (pair == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  pair->value = value;
+  pair->type = type;
+
+  CHKLOG(rc, firePropertyChanged(self, name, NULL, value, type));
+  CHKLOG(rc, HashMapPut(data->value, name, pair));
+  return ESR_SUCCESS;
+CLEANUP:
+/* The cleanup potentially leaks memory which could be cleard up with  FREE ( pair->value );
+ * but you can't guarantee that the value was allocated. A leak is better than a crash. SteveR
+ */
+  FREE(pair);
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeSetIntImpl(ESR_SessionType* self,
+    const LCHAR* name, int value)
+{
+  ESR_SessionTypeData* data;
+  int* clone;
+
+  data = self->data;
+  clone = MALLOC(sizeof(int), MTAG);
+  if (clone == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  *clone = value;
+  return self->setProperty(self, name, clone, TYPES_INT);
+}
+
+ESR_ReturnCode ESR_SessionTypeSetUint16_tImpl(ESR_SessionType* self,
+    const LCHAR* name, asr_uint16_t value)
+{
+  ESR_SessionTypeData* data;
+  asr_uint16_t* clone;
+
+  data = self->data;
+  clone = MALLOC(sizeof(asr_uint16_t), MTAG);
+  if (clone == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  *clone = value;
+  return self->setProperty(self, name, clone, TYPES_UINT16_T);
+}
+
+ESR_ReturnCode ESR_SessionTypeSetSize_tImpl(ESR_SessionType* self,
+    const LCHAR* name, size_t value)
+{
+  ESR_SessionTypeData* data;
+  int* clone;
+
+  data = self->data;
+  clone = MALLOC(sizeof(size_t), MTAG);
+  if (clone == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  *clone = value;
+  return self->setProperty(self, name, clone, TYPES_SIZE_T);
+}
+
+ESR_ReturnCode ESR_SessionTypeSetFloatImpl(ESR_SessionType* self,
+    const LCHAR* name, float value)
+{
+  ESR_SessionTypeData* data;
+  float* clone;
+
+  data = self->data;
+  clone = MALLOC(sizeof(float), MTAG);
+  if (clone == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  *clone = value;
+  return self->setProperty(self, name, clone, TYPES_FLOAT);
+}
+
+ESR_ReturnCode ESR_SessionTypeSetBoolImpl(ESR_SessionType* self,
+    const LCHAR* name, ESR_BOOL value)
+{
+  ESR_SessionTypeData* data;
+  ESR_BOOL* clone;
+
+  data = self->data;
+  clone = MALLOC(sizeof(ESR_BOOL), MTAG);
+  if (clone == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  *clone = value;
+  return self->setProperty(self, name, clone, TYPES_BOOL);
+}
+
+ESR_ReturnCode ESR_SessionTypeSetLCHARImpl(ESR_SessionType* self,
+    const LCHAR* name, LCHAR* value)
+{
+  ESR_SessionTypeData* data;
+  LCHAR* clone;
+
+  data = self->data;
+  clone = MALLOC(sizeof(LCHAR) * (LSTRLEN(value) + 1), MTAG);
+  if (clone == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  LSTRCPY(clone, value);
+  return self->setProperty(self, name, clone, TYPES_PLCHAR);
+}
+
+ESR_ReturnCode ESR_SessionTypeSetIntIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name, int value)
+{
+  ESR_BOOL exists;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->contains(self, name, &exists));
+  if (exists)
+    return ESR_SUCCESS;
+  return self->setInt(self, name, value);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeSetUint16_tIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name, asr_uint16_t value)
+{
+  ESR_BOOL exists;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->contains(self, name, &exists));
+  if (exists)
+    return ESR_SUCCESS;
+  return self->setInt(self, name, value);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeSetSize_tIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name, size_t value)
+{
+  ESR_BOOL exists;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->contains(self, name, &exists));
+  if (exists)
+    return ESR_SUCCESS;
+  return self->setSize_t(self, name, value);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeSetFloatIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name, float value)
+{
+  ESR_BOOL exists;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->contains(self, name, &exists));
+  if (exists)
+    return ESR_SUCCESS;
+  return self->setFloat(self, name, value);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeSetBoolIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name, ESR_BOOL value)
+{
+  ESR_BOOL exists;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->contains(self, name, &exists));
+  if (exists)
+    return ESR_SUCCESS;
+  return self->setBool(self, name, value);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeSetLCHARIfEmptyImpl(ESR_SessionType* self,
+    const LCHAR* name, LCHAR* value)
+{
+  ESR_BOOL exists;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->contains(self, name, &exists));
+  if (exists)
+    return ESR_SUCCESS;
+  return self->setLCHAR(self, name, value);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeRemovePropertyImpl(ESR_SessionType* self,
+    const LCHAR* name)
+{
+  ESR_ReturnCode rc;
+  ESR_SessionTypeData* data = self->data;
+  ESR_SessionPair* pair;
+
+  CHK(rc, HashMapGet(data->value, name, (void **)&pair));
+  CHKLOG(rc, firePropertyChanged(self, name, pair->value, NULL, pair->type));
+  CHK(rc, HashMapRemove(data->value, name));
+  FREE(pair);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeRemoveAndFreePropertyImpl(ESR_SessionType* self,
+    const LCHAR* name)
+{
+  ESR_ReturnCode rc;
+  ESR_SessionTypeData* data = self->data;
+  ESR_SessionPair* pair;
+  ESR_SessionPair temp;
+  IntArrayList* intList;
+
+  CHK(rc, data->value->get(data->value, name, (void **)&pair));
+  temp = *pair;
+  CHK(rc, self->removeProperty(self, name));
+  if (temp.value)
+  {
+    if (temp.type == TYPES_INTARRAYLIST)
+    {
+      intList = temp.value;
+      intList->destroy(intList);
+    }
+    else
+      FREE(temp.value);
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeImportCommandLineImpl(ESR_SessionType* self,
+    int argc, LCHAR* argv[])
+{
+  char* key = NULL;
+  char* value = NULL;
+  VariableTypes type;
+  ESR_ReturnCode rc;
+
+  while (--argc > 0 && **++argv)
+  {
+    if (**argv != '-')
+    {
+      /* got value */
+      if (key == NULL)
+      {
+        /* but we don't have any key to associate it with */
+        pfprintf(PSTDERR, "Options must be prefixed by '-'%s\n", *argv);
+      }
+      else
+      {
+        rc = self->getPropertyType(self, key, &type);
+        if (rc == ESR_SUCCESS)
+        {
+          CHKLOG(rc, self->getProperty(self, key, (void **)&value, type));
+          CHKLOG(rc, self->removeProperty(self, key));
+          FREE(value);
+          value = NULL;
+        }
+        else if (rc != ESR_NO_MATCH_ERROR)
+        {
+          PLogError(ESR_rc2str(rc));
+          goto CLEANUP;
+        }
+        value = MALLOC(sizeof(LCHAR) * (strlen(*argv) + 1), MTAG);
+        if (value == NULL)
+        {
+          rc = ESR_OUT_OF_MEMORY;
+          PLogError(L("ESR_OUT_OF_MEMORY"));
+          goto CLEANUP;
+        }
+        LSTRCPY(value, *argv);
+        CHKLOG(rc, self->setProperty(self, key, value, TYPES_PLCHAR));
+        FREE(key);
+        key = NULL;
+        value = NULL;
+      }
+    }
+    else
+    {
+      /* got key */
+      if (key != NULL)
+      {
+        /* But we already have a key without a value, so set the old key's value to "" */
+        rc = self->getPropertyType(self, key, &type);
+        if (rc == ESR_SUCCESS)
+        {
+          CHKLOG(rc, self->getProperty(self, key, (void **)&value, type));
+          CHKLOG(rc, self->removeProperty(self, key));
+          FREE(value);
+          value = NULL;
+        }
+        else if (rc != ESR_NO_MATCH_ERROR)
+        {
+          PLogError(ESR_rc2str(rc));
+          goto CLEANUP;
+        }
+        value = MALLOC(sizeof(LCHAR) + 1, MTAG);
+        strcpy(value, "");
+        CHKLOG(rc, self->setProperty(self, key, value, TYPES_PLCHAR));
+        FREE(key);
+        value = NULL;
+      }
+      key = MALLOC(sizeof(LCHAR) * (LSTRLEN("cmdline.") + LSTRLEN(*argv) + 1), MTAG);
+      if (key == NULL)
+      {
+        rc = ESR_OUT_OF_MEMORY;
+        PLogError(L("ESR_OUT_OF_MEMORY"));
+        goto CLEANUP;
+      }
+      LSTRCPY(key, "cmdline.");
+      LSTRCAT(key, *argv + 1);
+    }
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  if (key != NULL)
+    FREE(key);
+  if (value != NULL)
+    FREE(value);
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetSizeImpl(ESR_SessionType* self, size_t* size)
+{
+  ESR_SessionTypeData* data = self->data;
+  ESR_ReturnCode rc;
+
+  CHK(rc, HashMapGetSize(data->value, size));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetKeyAtIndexImpl(ESR_SessionType* self,
+    size_t index, LCHAR** key)
+{
+  ESR_SessionTypeData* data = self->data;
+  ESR_ReturnCode rc;
+
+  CHK(rc, HashMapGetKeyAtIndex(data->value, index, key));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeConvertToIntImpl(ESR_SessionType* self,
+    const LCHAR* key)
+{
+  LCHAR* value;
+  int *newValue = NULL;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
+  if (value == NULL)
+    return ESR_SUCCESS;
+  newValue = MALLOC(sizeof(long), MTAG);
+  if (newValue == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  CHKLOG(rc, lstrtoi(value, newValue, 10));
+  CHKLOG(rc, self->setProperty(self, key, newValue, TYPES_INT));
+  FREE(value);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (newValue != NULL)
+    FREE(newValue);
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeConvertToUint16_tImpl(ESR_SessionType* self,
+    const LCHAR* key)
+{
+  LCHAR* value;
+  int *newValue = NULL;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
+  if (value == NULL)
+    return ESR_SUCCESS;
+  newValue = MALLOC(sizeof(long), MTAG);
+  if (newValue == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  CHKLOG(rc, lstrtoi(value, newValue, 10));
+  CHKLOG(rc, self->setProperty(self, key, newValue, TYPES_UINT16_T));
+  FREE(value);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (newValue != NULL)
+    FREE(newValue);
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeConvertToSize_tImpl(ESR_SessionType* self,
+    const LCHAR* key)
+{
+  LCHAR* value;
+  size_t* newValue = NULL;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
+  if (value == NULL)
+    return ESR_SUCCESS;
+  newValue = MALLOC(sizeof(size_t), MTAG);
+  if (newValue == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  CHKLOG(rc, lstrtoui(value, (unsigned int *)newValue, 10));
+  CHKLOG(rc, self->setProperty(self, key, newValue, TYPES_SIZE_T));
+  FREE(value);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (newValue != NULL)
+    FREE(newValue);
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeConvertToFloatImpl(ESR_SessionType* self,
+    const LCHAR* key)
+{
+  LCHAR* value;
+  float *newValue = NULL;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
+  if (value == NULL)
+    return ESR_SUCCESS;
+  newValue = MALLOC(sizeof(double), MTAG);
+  if (newValue == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  CHKLOG(rc, lstrtof(value, newValue));
+  CHKLOG(rc, self->setProperty(self, key, newValue, TYPES_FLOAT));
+  FREE(value);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (newValue != NULL)
+    FREE(newValue);
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeConvertToBoolImpl(ESR_SessionType* self,
+    const LCHAR* key)
+{
+  LCHAR* value;
+  ESR_BOOL *newValue = NULL;
+  ESR_ReturnCode rc;
+
+  CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
+  if (value == NULL)
+    return ESR_SUCCESS;
+  newValue = MALLOC(sizeof(ESR_BOOL), MTAG);
+  if (newValue == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  rc = lstrtob(value, newValue);
+  if (rc != ESR_SUCCESS)
+  {
+    FREE(newValue);
+    return rc;
+  }
+  rc = self->setProperty(self, key, newValue, TYPES_BOOL);
+  if (rc != ESR_SUCCESS)
+  {
+    FREE(newValue);
+    return rc;
+  }
+  FREE(value);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (newValue != NULL)
+    FREE(newValue);
+  return rc;
+}
+
+/**
+ * Imports file containing [key, value] pairs into session.
+ *
+ * @param self ESR_SessionType handle
+ * @param filename File to read session from
+ * @param addMapping Function used to map keys to their type and add them to the session
+ * @param data Data used by the mapping function
+ */
+static ESR_ReturnCode importKeyValueFile(ESR_SessionType* self,
+    const LCHAR* filename,
+    ESR_ReturnCode(*addMapping)(ESR_SessionType* self, const LCHAR* key, LCHAR* value, void* data),
+    void* data)
+{
+  const size_t LINE_SIZE = 512;
+  LCHAR key[512];
+  LCHAR buffer[512];
+  LCHAR* value;
+  LCHAR* ending;
+  LCHAR* line;
+  PFile* file = NULL;
+  ESR_BOOL lineSpan = ESR_FALSE;
+  LString* valueBuffer = NULL;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+
+  if (filename == NULL)
+    return ESR_INVALID_ARGUMENT;
+
+  file = pfopen ( filename, L("r") );
+/*  CHKLOG(rc, PFileSystemCreatePFile(filename, ESR_TRUE, &file));
+  CHKLOG(rc, PFileOpen(file, L("r")));*/
+
+  if (file == NULL)
+  {
+    LCHAR msg[2 * P_PATH_MAX + 30];
+    LCHAR cwd[P_PATH_MAX];
+    size_t len;
+
+    len = P_PATH_MAX;
+    CHKLOG(rc, pf_get_cwd (cwd, &len));
+    psprintf(msg, L("ESR_OPEN_FILE_ERROR(filename=%s, cwd=%s)"), filename, cwd);
+    rc = ESR_OPEN_ERROR;
+    PLogError(msg);
+    goto CLEANUP;
+  }
+
+  rc = LStringCreate(&valueBuffer);
+  if (rc != ESR_SUCCESS)
+    goto CLEANUP;
+
+  line = buffer;
+  while (ESR_TRUE)
+  {
+    line = pfgets(line, LINE_SIZE, file);
+    if (line == NULL)
+    {
+      if (pfeof(file))
+        break;
+      rc = ESR_READ_ERROR;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    if (LSTRLEN(line) == LINE_SIZE)
+    {
+      PLogError(L("%s: line surpasses %d character limit: '%s'"), filename, line);
+      continue;
+    }
+    lstrtrim(line);
+    if (LSTRLEN(line) == 0 || line[0] == '#')
+      continue;
+
+    if (!lineSpan)
+    {
+      if (rc != ESR_SUCCESS) goto CLEANUP;
+
+      /* locate the key and value pair */
+      ending = LSTRCHR(line, '=');
+      if (ending == NULL)
+      {
+        fprintf(stderr, "Missing equal sign on line '%s'\n", line);
+        continue;
+      }
+      *ending = L('\0');
+      value = ending + 1;
+    }
+    else
+      value = line;
+
+    /* Optionally use ';' to denote end of value */
+    ending = LSTRCHR(value, L(';'));
+    if (ending != NULL)
+      *ending = L('\0');
+    else
+    {
+      ending = LSTRCHR(value, L('\n'));
+      if (ending != NULL)
+        *ending = L('\0');
+    }
+    if (!lineSpan)
+    {
+      LSTRCPY(key, line);
+      lstrtrim(key);
+    }
+    if (LSTRLEN(value) == 0)
+    {
+      pfprintf(PSTDERR, L("Missing value for '%s'\n"), key);
+      continue;
+    }
+    lstrtrim(value);
+    if ((ending = LSTRCHR(value, '\\')) == (value + LSTRLEN(value) - 1))
+    {
+      /* found '\\' at end of line which means data will span to the next line */
+      lineSpan = ESR_TRUE;
+      *ending = L('\0');
+    }
+    else
+      lineSpan = ESR_FALSE;
+    rc = LStringAppend(valueBuffer, value);
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    if (!lineSpan)
+    {
+      rc = LStringToLCHAR(valueBuffer, &value);
+      valueBuffer = NULL;
+      if (rc != ESR_SUCCESS)
+      {
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      rc = addMapping(self, key, value, data);
+      if (value != NULL)
+      {
+        FREE(value);
+        value = NULL;
+      }
+      if (rc != ESR_SUCCESS)
+      {
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      rc = LStringCreate(&valueBuffer);
+      if (rc != ESR_SUCCESS)
+      {
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+    }
+  }
+
+  if (pferror(file))
+  {
+    rc = ESR_READ_ERROR;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (pfclose(file) != 0)
+  {
+    rc = ESR_CLOSE_ERROR;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (valueBuffer != NULL)
+    LStringDestroy(valueBuffer);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (file != NULL)
+    pfclose(file);
+  if (valueBuffer != NULL)
+    LStringDestroy(valueBuffer);
+  return rc;
+}
+
+/**
+ * Appends a collection of integers stored in string format to an IntArrayList.
+ *
+ * @param self ESR_SessionType handle
+ * @param text Text containing integers
+ * @param list List to be populated
+ */
+static ESR_ReturnCode parseIntList(ESR_SessionType* self,
+                                   LCHAR* text, IntArrayList* list)
+{
+  size_t size, pos, beginning;
+  int value;
+  ESR_ReturnCode rc;
+
+  size = LSTRLEN(text);
+  pos = 0;
+  while (ESR_TRUE)
+  {
+    /* Scan for beginning of next token */
+    for (; pos < size && LISSPACE(text[pos]); ++pos);
+
+    if (pos >= size)
+    {
+      /* Reached end of string while looking for beginning of next token */
+      break;
+    }
+    beginning = pos;
+
+    /* Scan for ending of current token */
+    for (; pos < size && !LISSPACE(text[pos]); ++pos);
+    text[pos] = L('\0');
+    CHKLOG(rc, lstrtoi(text + beginning, &value, 10));
+    CHKLOG(rc, IntArrayListAdd(list, value));
+    ++pos;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeGetPropertyTypeImpl(ESR_SessionType* self,
+    const LCHAR* name, VariableTypes* type)
+{
+  ESR_SessionTypeData* data = self->data;
+  ESR_SessionPair* pair;
+  ESR_ReturnCode rc;
+
+  CHK(rc, HashMapGet(data->value, name, (void **)&pair));
+  *type = pair->type;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Maps key -> type for PAR files.
+ *
+ * @param self ESR_Session handle
+ * @param key Key name
+ * @param value The value
+ */
+static ESR_ReturnCode addParMapping(ESR_SessionType* self,
+                                    const LCHAR* key, LCHAR* value, void* data)
+{
+  IntArrayList* iList;
+  ESR_ReturnCode rc;
+  HashMap* map;
+  VariableTypes* type;
+  int iValue;
+  size_t size_tValue;
+  float fValue;
+  ESR_BOOL bValue;
+  ESR_BOOL exists;
+
+  map = (HashMap*) data;
+  rc = HashMapGet(data, key, (void **)&type);
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    /* If type is unknown, assume LCHAR* */
+    PLogMessage(L("Unknown parfile key '%s'"), key);
+    CHKLOG(rc, self->setLCHAR(self, key, value));
+  }
+  else if (rc == ESR_SUCCESS)
+  {
+    switch (*type)
+    {
+      case TYPES_INT:
+        CHKLOG(rc, lstrtoi(value, &iValue, 10));
+        CHKLOG(rc, self->contains(self, key, &exists));
+        if (exists)
+          CHKLOG(rc, self->removeAndFreeProperty(self, key));
+        CHKLOG(rc, self->setInt(self, key, iValue));
+        break;
+      case TYPES_UINT16_T:
+        CHKLOG(rc, lstrtoui(value, (unsigned int *)&size_tValue, 10));
+        passert(size_tValue >= UINT16_TMIN && size_tValue <= UINT16_TMAX);
+        CHKLOG(rc, self->contains(self, key, &exists));
+        if (exists)
+          CHKLOG(rc, self->removeAndFreeProperty(self, key));
+        CHKLOG(rc, self->setUint16_t(self, key, (asr_uint16_t) size_tValue));
+        break;
+      case TYPES_SIZE_T:
+        CHKLOG(rc, lstrtoui(value, (unsigned int *)&size_tValue, 10));
+        CHKLOG(rc, self->contains(self, key, &exists));
+        if (exists)
+          CHKLOG(rc, self->removeAndFreeProperty(self, key));
+        CHKLOG(rc, self->setSize_t(self, key, size_tValue));
+        break;
+      case TYPES_FLOAT:
+        CHKLOG(rc, lstrtof(value, &fValue));
+        CHKLOG(rc, self->contains(self, key, &exists));
+        if (exists)
+          CHKLOG(rc, self->removeAndFreeProperty(self, key));
+        CHKLOG(rc, self->setFloat(self, key, fValue));
+        break;
+      case TYPES_BOOL:
+        CHKLOG(rc, lstrtob(value, &bValue));
+        CHKLOG(rc, self->contains(self, key, &exists));
+        if (exists)
+          CHKLOG(rc, self->removeAndFreeProperty(self, key));
+        CHKLOG(rc, self->setBool(self, key, bValue));
+        break;
+      case TYPES_INTARRAYLIST:
+        CHKLOG(rc, self->contains(self, key, &exists));
+        if (exists)
+        {
+          CHKLOG(rc, self->getProperty(self, key, (void **)&iList, TYPES_INTARRAYLIST));
+          CHKLOG(rc, self->removeProperty(self, key));
+          CHKLOG(rc, iList->destroy(iList));
+        }
+        CHKLOG(rc, IntArrayListCreate(&iList));
+        CHKLOG(rc, parseIntList(self, value, iList));
+        CHKLOG(rc, self->setProperty(self, key, iList, TYPES_INTARRAYLIST));
+        break;
+      default:
+        passert(0); /* Unknown variable type. Assuming LCHAR* */
+      case TYPES_PLCHAR:
+        CHKLOG(rc, self->contains(self, key, &exists));
+        if (exists)
+          CHKLOG(rc, self->removeAndFreeProperty(self, key));
+        CHKLOG(rc, self->setLCHAR(self, key, value));
+        break;
+    }
+  }
+  return rc;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeImportParFileImpl(ESR_SessionType* self,
+    const LCHAR* filename)
+{
+  ESR_ReturnCode rc;
+  HashMap* parameterList;
+  VariableTypes Int = TYPES_INT;
+  VariableTypes UInt16_t = TYPES_UINT16_T;
+  VariableTypes Float = TYPES_FLOAT;
+  VariableTypes Bool = TYPES_BOOL;
+  VariableTypes IntArrayList = TYPES_INTARRAYLIST;
+  VariableTypes PLChar = TYPES_PLCHAR;
+  VariableTypes Size_t = TYPES_SIZE_T;
+
+  /* Create [key, type] lookup table */
+  CHKLOG(rc, HashMapCreate(&parameterList));
+
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.arbfile", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.bgsniff", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.channel", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.datapath", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.DataCaptureDirectory", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.detail_res", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.lda", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.modelfiles", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.modelfiles11", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.modelfiles8", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.lda11", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.lda8", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.results", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.rules", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.tcp", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.multable", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.parfile", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.vocabulary", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.use_image", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.semproc_verbose", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.nametagPath", &PLChar));
+
+  /* Beginning of speech detection stuff */
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.bgsniff_min", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.silence_duration_in_frames", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.end_of_utterance_hold_off_in_frames", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "cmdline.gatedmode", &Bool));
+
+  /* new param from SREC that did not exist in CREC */
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Recognizer.utterance_timeout", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Recognizer.osi_log_level", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.voice_enroll.bufsz_kB", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.voice_enroll.eos_comfort_frames", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.voice_enroll.bos_comfort_frames", &Size_t));
+
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.gdiff.one_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.gdiff.many_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.sd.one_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.sd.many_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.sd13.one_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.sd13.many_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.spf.one_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.spf.many_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.abs.one_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.abs.many_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.gdiffpf.one_nbest", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.gdiffpf.many_nbest", &PLChar));
+
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.ParVersion", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.useCREClogger", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.dimen", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.skip", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.stay", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.durscale", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.minvar", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.maxvar", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.frame_period", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.load_models", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.mel_dim", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.samplerate", &Size_t));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.premel", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.lowcut", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.highcut", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.window_factor", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.offset", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.ddmel", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.peakdecayup", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.peakdecaydown", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.do_skip_even_frames", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.do_smooth_c0", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.melA", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.melB", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.dmelA", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.dmelB", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.ddmelA", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.ddmelB", &IntArrayList));
+
+  /* new for S2G 3 (read from parfile instead of hardcoding) */
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.cmn", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.cmn8", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.cmn11", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.tmn", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.adjust", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.debug", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.sbindex", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.forget_factor", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.cache_resolution", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.inutt.forget_factor2", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.inutt.disable_after", &IntArrayList));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.inutt.enable_after", &IntArrayList));
+
+
+  /* zwz */
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.do_VN", &Bool));
+
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.speech_detect", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.ambient_within", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.speech_above", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.start_windback", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.utterance_allowance", &Int));
+
+
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.dimen", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.whole_dimen", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.mix_score_scale", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.start", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.chelt_imelda", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.vfrlimit", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.vfrthresh", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.mix_score_scale", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.imelda_scale", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.uni_score_scale", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.uni_score_offset", &Float));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.forget_speech", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.forget_background", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.rel_low", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.rel_high", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.gap_period", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.click_period", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.breath_period", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.extend_annotation", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.min_initial_quiet_frames", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.min_annotation_frames", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.min_initial_quiet_frames", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.max_annotation_frames", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.delete_leading_segments", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.leading_segment_min_frames", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.leading_segment_max_frames", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.leading_segment_min_silence_gap_frames", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.leading_segment_accept_if_not_found", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.snr_holdoff", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.min_acceptable_snr", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.param", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.beep_size", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.beep_threshold", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.partial_distance_dim", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.partial_distance_threshold", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.partial_distance_offset", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.global_model_means", &IntArrayList));
+
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.NBest", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.reject", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.often", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.partial_results", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.wordpen", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.viterbi_prune_thresh", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_hmm_tokens", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_fsmnode_tokens", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_word_tokens", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_altword_tokens", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.num_wordends_per_frame", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_fsm_nodes", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_fsm_arcs", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_searches", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.terminal_timeout", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.optional_terminal_timeout", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.non_terminal_timeout", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.eou_threshold", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_frames", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_model_states", &Int));
+  CHKLOG(rc, parameterList->put(parameterList, "thread.priority", &UInt16_t));
+  /* for G2P */
+  CHKLOG(rc, parameterList->put(parameterList, "G2P.Available", &Bool));
+  CHKLOG(rc, parameterList->put(parameterList, "G2P.Data", &PLChar));
+  CHKLOG(rc, parameterList->put(parameterList, "G2P.Dictionary", &PLChar));
+
+  rc = importKeyValueFile(self, filename, addParMapping, parameterList);
+  if (rc != ESR_SUCCESS)
+    goto CLEANUP;
+  CHKLOG(rc, HashMapDestroy(parameterList));
+  return ESR_SUCCESS;
+CLEANUP:
+  HashMapDestroy(parameterList);
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeAddListenerImpl(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener)
+{
+  ESR_SessionTypeData* data = self->data;
+  ArrayList* listeners = data->listeners;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, listeners->add(listeners, listener));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeRemoveListenerImpl(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener)
+{
+  ESR_SessionTypeData* data = self->data;
+  ArrayList* listeners = data->listeners;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, listeners->remove(listeners, listener));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ESR_SessionTypeDestroyImpl(ESR_SessionType* self)
+{
+  ESR_SessionTypeData* data = self->data;
+  size_t hashSize;
+  ESR_SessionPair* pair;
+  ESR_ReturnCode rc;
+
+  if (data != NULL)
+  {
+    if (data->value != NULL)
+    {
+      CHKLOG(rc, HashMapGetSize(data->value, &hashSize));
+      while (hashSize > 0)
+      {
+        CHKLOG(rc, HashMapGetValueAtIndex(data->value, 0, (void **)&pair));
+
+        if (pair->value)
+        {
+          if (pair->type == TYPES_INTARRAYLIST)
+            CHKLOG(rc, IntArrayListDestroy((IntArrayList*) pair->value));
+          else
+            FREE(pair->value);
+        }
+        CHKLOG(rc, HashMapRemoveAtIndex(data->value, 0));
+        --hashSize;
+        FREE(pair);
+      }
+
+      CHKLOG(rc, HashMapDestroy(data->value));
+      data->value = NULL;
+    }
+    if (data->listeners != NULL)
+    {
+      CHKLOG(rc, data->listeners->destroy(data->listeners));
+      data->listeners = NULL;
+    }
+    FREE(data);
+  }
+
+  FREE(self);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/shared/src/lstring.c b/shared/src/lstring.c
new file mode 100644
index 0000000..f643444
--- /dev/null
+++ b/shared/src/lstring.c
@@ -0,0 +1,63 @@
+/*---------------------------------------------------------------------------*
+ *  lstring.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "lstring.h"
+#include "plog.h"
+
+#define MTAG NULL
+
+ESR_ReturnCode LStringAppend(LString* self, const LCHAR* value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->append(self, value);
+}
+
+ESR_ReturnCode LStringToLCHAR(LString* self, LCHAR** result)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->toLCHAR(self, result);
+}
+
+ESR_ReturnCode LStringReset(LString* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->reset(self);
+}
+
+ESR_ReturnCode LStringDestroy(LString* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
diff --git a/srec/AcousticModels/Android.mk b/srec/AcousticModels/Android.mk
new file mode 100644
index 0000000..ca605cf
--- /dev/null
+++ b/srec/AcousticModels/Android.mk
@@ -0,0 +1,70 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/AcousticModels.c \
+	src/AcousticModelsImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+common_CFLAGS := \
+	-DSREC_ACOUSTICMODELS_EXPORTS \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_EventLog \
+	libSR_Core \
+
+common_TARGET:= libSR_AcousticModels
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/AcousticModels/include/SR_AcousticModels.h b/srec/AcousticModels/include/SR_AcousticModels.h
new file mode 100644
index 0000000..34b7522
--- /dev/null
+++ b/srec/AcousticModels/include/SR_AcousticModels.h
@@ -0,0 +1,197 @@
+/*---------------------------------------------------------------------------*
+ *  SR_AcousticModels.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_ACOUSTICMODELS_H
+#define __SR_ACOUSTICMODELS_H
+
+
+
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "SR_AcousticModelsPrefix.h"
+#include "pstdio.h"
+#include "ptypes.h"
+#include "ESR_ReturnCode.h"
+
+/**
+ * AcousticModel ID.
+ */
+typedef asr_uint8_t SR_AcousticModelID;
+
+/**
+ * @addtogroup SR_AcousticModelsModule SR_AcousticModels API functions
+ * Acoustic model collection.
+ *
+ * @{
+ */
+
+/**
+ * Acoustic model collection.
+ */
+typedef struct SR_AcousticModels_t
+{
+  /**
+   * Destroys an AcousticModel collection.
+   *
+   * @param self SR_AcousticModels handle
+   */
+  ESR_ReturnCode(*destroy)(struct SR_AcousticModels_t* self);
+  /**
+   * Saves an AcousticModel collection to file.
+   *
+   * @param self SR_AcousticModels handle
+   * @param filename File to write to
+   * @deprecated Not supported
+   */
+  ESR_ReturnCode(*save)(struct SR_AcousticModels_t* self, const LCHAR* filename);
+  /**
+   * Sets AcousticModels parameter, overriding session defaults.
+   *
+   * @param self SR_AcousticModels handle
+   * @param key Parameter name
+   * @param value Parameter value
+   */
+  ESR_ReturnCode(*setParameter)(struct SR_AcousticModels_t* self, const LCHAR* key, LCHAR* value);
+  /**
+   * Returns AcousticModels parameter value.
+   *
+   * @param self SR_AcousticModels handle
+   * @param key Parameter name
+   * @param value [in/out] Parameter value
+   * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+   */
+  ESR_ReturnCode(*getParameter)(struct SR_AcousticModels_t* self, const LCHAR* key, LCHAR* value, size_t* len);
+  /**
+   * Returns the number of AcousticModels in the collection.
+   *
+   * @param self SR_AcousticModels handle
+   * @param size The result
+   */
+  ESR_ReturnCode(*getCount)(struct SR_AcousticModels_t* self, size_t* size);
+  /**
+   * Returns modelID of a component.
+   *
+   * @param self SR_AcousticModels handle
+   * @param index Index of model within collection (0-based)
+   * @param id [out] Resulting model ID
+   * @param size [in/out] Length of id argument. If the return code is ESR_BUFFER_OVERFLOW, 
+   *             the required length is returned in this variable.
+   */
+  ESR_ReturnCode(*getID)(struct SR_AcousticModels_t* self, size_t index, SR_AcousticModelID* id, size_t* size);
+  /**
+   * Sets the modelID of a component.
+   *
+   * @param self SR_AcousticModels handle
+   * @param index Index of model within collection (0-based)
+   * @param id New model ID
+   */
+  ESR_ReturnCode(*setID)(struct SR_AcousticModels_t* self, size_t index, SR_AcousticModelID* id);
+  /**
+   * Returns the arbdata (CA_Arbdata*) of a component.
+   *
+   * @param self SR_AcousticModels handle
+   */
+  void* (*getArbdata)(struct SR_AcousticModels_t* self);
+
+}
+SR_AcousticModels;
+
+/**
+ * @name Models operations
+ *
+ * @{
+ */
+
+/**
+ * Destroys an AcousticModel collection.
+ *
+ * @param self SR_AcousticModels handle
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModelsDestroy(SR_AcousticModels* self);
+/**
+ * Loads an AcousticModel collection from file.
+ *
+ * @param filename File to read from
+ * @param self SR_AcousticModels handle
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModelsLoad(const LCHAR* filename, 
+                                                             SR_AcousticModels** self);
+/**
+ * Saves an AcousticModel collection to file.
+ *
+ * @param self SR_AcousticModels handle
+ * @param filename File to write to
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModelsSave(SR_AcousticModels* self, const LCHAR* filename);
+/**
+ * Sets AcousticModel parameter, overriding session defaults.
+ *
+ * @param self SR_AcousticModels handle
+ * @param key Parameter name
+ * @param value Parameter value
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModelsSetParameter(SR_AcousticModels* self, const LCHAR* key, LCHAR* value);
+/**
+ * Returns AcousticModel parameter value.
+ *
+ * @param self SR_AcousticModels handle
+ * @param key Parameter name
+ * @param value [out] Parameter value
+ * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModelsGetParameter(SR_AcousticModels* self, const LCHAR* key, LCHAR* value, size_t* len);
+/**
+ * Returns the number of AcousticModels in the collection.
+ *
+ * @param self SR_AcousticModels handle
+ * @param size The result
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModelsGetCount(SR_AcousticModels* self, size_t* size);
+/**
+ * Returns modelID of a component.
+ *
+ * @param self SR_AcousticModels handle
+ * @param index Index of model within collection (0-based)
+ * @param id [out] Resulting model ID
+ * @param idLen [in/out] Length of id argument. If the return code is ESR_BUFFER_OVERFLOW, the
+ *              required length is returned in this variable.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModelsGetID(SR_AcousticModels* self, size_t index, SR_AcousticModelID* id,  size_t* idLen);
+/**
+ * Sets the modelID of a component.
+ *
+ * @param self SR_AcousticModels handle
+ * @param index Index of model within collection (0-based)
+ * @param id New model ID
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModelsSetID(SR_AcousticModels* self, size_t index, SR_AcousticModelID* id);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+
+#endif /* __SR_ACOUSTICMODELS_H */
diff --git a/srec/AcousticModels/include/SR_AcousticModelsImpl.h b/srec/AcousticModels/include/SR_AcousticModelsImpl.h
new file mode 100644
index 0000000..d04f902
--- /dev/null
+++ b/srec/AcousticModels/include/SR_AcousticModelsImpl.h
@@ -0,0 +1,162 @@
+/*---------------------------------------------------------------------------*
+ *  SR_AcousticModelsImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_ACOUSTICMODELSIMPL_H
+#define __SR_ACOUSTICMODELSIMPL_H
+
+
+
+#ifndef __vxworks
+#include <memory.h>
+#endif
+#include "SR_AcousticModels.h"
+#include "SR_RecognizerImpl.h"
+#include "ESR_ReturnCode.h"
+
+/* Legacy CREC headers */
+#include "simapi.h"
+
+/**
+ * AcousticModels implementation.
+ */
+typedef struct SR_AcousticModelsImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_AcousticModels Interface;
+  
+  /**
+   * When AcousticModels are associated with a Recognizer, they initialize their 
+   * Pattern objects using that Recognizer.
+   *
+   * @param self SR_AcousticModels handle
+   * @param recognizer The recognizer
+   */
+  ESR_ReturnCode(*setupPattern)(SR_AcousticModels* self, SR_Recognizer* recognizer);
+  /**
+   * When AcousticModels are deassociated with a Recognizer, they deinitialize their 
+   * Pattern objects.
+   *
+   * @param self SR_AcousticModels handle
+   */
+  ESR_ReturnCode(*unsetupPattern)(SR_AcousticModels* self);
+  /**
+   * Generate legacy AcousticModels parameter structure from ESR_Session.
+   *
+   * @param params Resulting structure
+   */
+  ESR_ReturnCode(*getLegacyParameters)(CA_AcoustInputParams* params);
+  
+  /**
+   * AcousticModels parameters.
+   */
+  HashMap* parameters;
+  /**
+   * Legacy CREC pattern.
+   */
+  CA_Pattern* pattern;
+  /**
+   * ArrayList of legacy CREC acoustic models.
+   */
+  ArrayList* acoustic;
+  /**
+   * Legacy Arbdata structure.
+   */
+  CA_Arbdata* arbdata;
+  /**
+   * Contents of AcousticModels.
+   */
+  void* contents;
+  /**
+   * Size of contents.
+   */
+  int size;
+}
+SR_AcousticModelsImpl;
+
+
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModels_Destroy(SR_AcousticModels* self);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModels_Save(SR_AcousticModels* self,
+    const LCHAR* filename);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModels_SetParameter(SR_AcousticModels* self,
+    const LCHAR* key,
+    LCHAR* value);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModels_GetParameter(SR_AcousticModels* self,
+    const LCHAR* key,
+    LCHAR* value, size_t* len);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModels_GetCount(SR_AcousticModels* self,
+    size_t* size);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModels_GetID(SR_AcousticModels* self,
+    size_t index,
+    SR_AcousticModelID* id,
+    size_t* size);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICMODELS_API ESR_ReturnCode SR_AcousticModels_SetID(SR_AcousticModels* self,
+    size_t index,
+    SR_AcousticModelID* id);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICMODELS_API void* SR_AcousticModels_GetArbdata(SR_AcousticModels* self);
+
+/**
+ * When AcousticModels are associated with a Recognizer, they initialize their
+ * Pattern objects using that Recognizer.
+ *
+ * @param self SR_AcousticModels handle
+ * @param recognizer The recognizer
+ */
+ESR_ReturnCode SR_AcousticModels_SetupPattern(SR_AcousticModels* self, SR_Recognizer* recognizer);
+/**
+ * When AcousticModels are deassociated with a Recognizer, they deinitialize their
+ * Pattern objects.
+ *
+ * @param self SR_AcousticModels handle
+ */
+ESR_ReturnCode SR_AcousticModels_UnsetupPattern(SR_AcousticModels* self);
+/**
+ * Generate legacy AcousticModels parameter structure from ESR_Session.
+ *
+ * @param params Resulting structure
+ */
+ESR_ReturnCode SR_AcousticModels_GetLegacyParameters(CA_AcoustInputParams* params);
+
+
+#endif /* __SR_ACOUSTICMODELSIMPL_H */
diff --git a/srec/AcousticModels/include/SR_AcousticModelsPrefix.h b/srec/AcousticModels/include/SR_AcousticModelsPrefix.h
new file mode 100644
index 0000000..a799198
--- /dev/null
+++ b/srec/AcousticModels/include/SR_AcousticModelsPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_AcousticModelsPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef SR_ACOUSTICMODELSPREFIX_H
+#define SR_ACOUSTICMODELSPREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_ACOUSTICMODELS_EXPORTS
+#define SREC_ACOUSTICMODELS_API PORT_EXPORT_DECL
+#else
+#define SREC_ACOUSTICMODELS_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/AcousticModels/src/AcousticModels.c b/srec/AcousticModels/src/AcousticModels.c
new file mode 100644
index 0000000..40f2869
--- /dev/null
+++ b/srec/AcousticModels/src/AcousticModels.c
@@ -0,0 +1,94 @@
+/*---------------------------------------------------------------------------*
+ *  AcousticModels.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_AcousticModels.h"
+#include "SR_AcousticModelsImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+ESR_ReturnCode SR_AcousticModelsDestroy(SR_AcousticModels* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
+
+ESR_ReturnCode SR_AcousticModelsSave(SR_AcousticModels* self, const LCHAR* filename)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->save(self, filename);
+}
+
+ESR_ReturnCode SR_AcousticModelsSetParameter(SR_AcousticModels* self, const LCHAR* key, LCHAR* value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setParameter(self, key, value);
+}
+
+ESR_ReturnCode SR_AcousticModelsGetParameter(SR_AcousticModels* self, const LCHAR* key, LCHAR* value, size_t* len)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getParameter(self, key, value, len);
+}
+
+ESR_ReturnCode SR_AcousticModelsGetCount(SR_AcousticModels* self, size_t* size)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getCount(self, size);
+}
+
+ESR_ReturnCode SR_AcousticModelsGetID(SR_AcousticModels* self, size_t index, SR_AcousticModelID* id, size_t* size)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getID(self, index, id, size);
+}
+
+ESR_ReturnCode SR_AcousticModelsSetID(SR_AcousticModels* self, size_t index, SR_AcousticModelID* id)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setID(self, index, id);
+}
diff --git a/srec/AcousticModels/src/AcousticModelsImpl.c b/srec/AcousticModels/src/AcousticModelsImpl.c
new file mode 100644
index 0000000..50eac6a
--- /dev/null
+++ b/srec/AcousticModels/src/AcousticModelsImpl.c
@@ -0,0 +1,673 @@
+/*---------------------------------------------------------------------------*
+ *  AcousticModelsImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef lint
+#endif /* lint */
+
+#include "ESR_Session.h"
+#include "IntArrayList.h"
+#include "LCHAR.h"
+#include "passert.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "SR_AcousticModels.h"
+#include "SR_AcousticModelsImpl.h"
+#include "pstdio.h"
+#include "SR_EventLog.h"
+
+#define MTAG NULL
+
+#define CHKINTARRAY(rc, list, operation) rc = operation; \
+  if (rc!=ESR_SUCCESS) \
+  { \
+    IntArrayListDestroy(list); \
+    list = NULL; \
+    PLogError(ESR_rc2str(rc)); \
+    return rc; \
+  }
+
+
+
+
+/**
+ * Initializes acoustic-models properties to default values.
+ *
+ * Replaces setup_acoustic_parameters()
+ */
+ESR_ReturnCode SR_AcousticModels_ToSession()
+{
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.dimen", 16));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.skip", 5));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.stay", 5));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.whole_skip", 10));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.whole_stay", 10));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.durscale", 5));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.frame_period", 10));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.minvar", 1));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.maxvar", 64000));
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Acoustic.load_all_at_once", ESR_FALSE));
+  CHKLOG(rc, ESR_SessionSetLCHARIfEmpty("CREC.Acoustic.load_models", L("all")));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Initializes pattern properties to default values.
+ *
+ * Replaces setup_pattern_parameters()
+ */
+ESR_ReturnCode SR_AcousticModels_PatternToSession()
+{
+  ESR_ReturnCode rc;
+
+  /* Old comment: Remember to keep "ca_pip.h" up to date with these parameters... */
+
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.dimen", 16));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.whole_dimen", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.start", 0));
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Pattern.chelt_imelda", ESR_FALSE));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.vfrlimit", 100));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.vfrthresh", 0));
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Pattern.mix_score_scale", 0.46f));
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Pattern.imelda_scale", 16));
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Pattern.uni_score_scale", 0.46f));
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Pattern.uni_score_offset", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.forget_speech", 40));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.forget_background", 100));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.rel_low", 15));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.rel_high", 30));
+
+  /* Gap: longest stop gap */
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.gap_period", 16));
+
+  /* Click: longest isolated high-amplitude insert in silence */
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.click_period", 6));
+
+  /* Breath: longest isolated medium amplitude */
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.breath_period", 50));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.extend_annotation", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.min_initial_quiet_frames", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.min_annotation_frames", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.max_annotation_frames", 800));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.min_segment_rel_c0", 800));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.delete_leading_segments", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.leading_segment_min_frames", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.leading_segment_max_frames", 20));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.leading_segment_min_silence_gap_frames", 20));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.leading_segment_accept_if_not_found", 0));
+
+#if DO_SUBTRACTED_SEGMENTATION
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.snr_holdoff", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.min_acceptable_snr", 0));
+#endif
+
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.param", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.beep_size", 0));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.beep_threshold", 0));
+
+  return ESR_SUCCESS;
+
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Populates legacy pattern parameters from the session.
+ *
+ * Replaces setup_pattern_parameters()
+ */
+ESR_ReturnCode SR_AcousticModels_LoadLegacyPatternParameters(CA_PatInputParams* params)
+{
+  ESR_ReturnCode rc;
+
+  passert(params != NULL);
+  params->is_loaded = ESR_FALSE;
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.dimen", &params->dimen));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.whole_dimen", &params->whole_dimen));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.start", &params->feat_start));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Pattern.mix_score_scale", &params->mix_score_scale));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Pattern.imelda_scale", &params->imelda_scale));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Pattern.uni_score_scale", &params->uni_score_scale));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Pattern.uni_score_offset", &params->uni_score_offset));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.forget_speech", &params->forget_speech));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.forget_background", &params->forget_background));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.rel_low", &params->rel_low));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.rel_high", &params->rel_high));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.gap_period", &params->gap_period));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.click_period", &params->click_period));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.breath_period", &params->breath_period));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.extend_annotation", &params->extend_annotation));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.min_initial_quiet_frames", &params->min_initial_quiet_frames));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.min_annotation_frames", &params->min_annotation_frames));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.max_annotation_frames", &params->max_annotation_frames));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.min_segment_rel_c0", &params->min_segment_rel_c0));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.delete_leading_segments", &params->delete_leading_segments));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.leading_segment_min_frames", &params->leading_segment_min_frames));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.leading_segment_max_frames", &params->leading_segment_max_frames));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.leading_segment_min_silence_gap_frames", &params->leading_segment_min_silence_gap_frames));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.leading_segment_accept_if_not_found", &params->leading_segment_accept_if_not_found));
+
+#if DO_SUBTRACTED_SEGMENTATION
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.snr_holdoff", &params->snr_holdoff));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.min_acceptable_snr", &params->min_acceptable_snr));
+#endif
+
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.param", &params->param));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.beep_size", &params->beep_size));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.beep_threshold", &params->beep_threshold));
+
+  params->is_loaded = ESR_TRUE;
+  return ESR_SUCCESS;
+
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Generate legacy AcousticModels parameter structure from ESR_Session.
+ *
+ * @param params Resulting structure
+ */
+ESR_ReturnCode SR_AcousticModels_GetLegacyParameters(CA_AcoustInputParams* params)
+{
+  ESR_ReturnCode rc;
+  size_t maxLabel = MAX_LABEL;
+
+  passert(params != NULL);
+  params->is_loaded = ESR_FALSE;
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.dimen", &params->dimen));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.skip", &params->skip_penalty));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.stay", &params->stay_penalty));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.whole_skip", &params->whole_skip_penalty));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.whole_stay", &params->whole_stay_penalty));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.durscale", &params->dur_scale));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.frame_period", &params->frame_period));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.minvar", &params->min_var));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.maxvar", &params->max_var));
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Acoustic.load_all_at_once", &params->load_all));
+  CHKLOG(rc, ESR_SessionGetLCHAR("CREC.Acoustic.load_models", params->load_models, &maxLabel));
+  params->is_loaded = ESR_TRUE;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+int LogArbdataVersion(unsigned int ver)
+{
+  ESR_ReturnCode rc;
+  SR_EventLog* eventLog;
+  size_t osi_log_level = 0;
+  ESR_BOOL exists = ESR_FALSE;
+
+  CHKLOG(rc, ESR_SessionExists(&exists));
+  if (exists)
+  {
+    rc = ESR_SessionGetProperty(L("eventlog"), (void **)&eventLog, TYPES_SR_EVENTLOG);
+    if ((rc != ESR_NO_MATCH_ERROR) && (rc != ESR_SUCCESS))
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    if (eventLog)
+    {
+      rc = ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &osi_log_level);
+      if ((rc != ESR_NO_MATCH_ERROR) && (rc != ESR_SUCCESS))
+      {
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      if (osi_log_level > 0)
+      {
+        rc = SR_EventLogTokenSize_t(eventLog, L("VER"), ver);
+        rc = SR_EventLogEvent(eventLog, L("ESRarbd"));
+      }
+    }
+  }
+CLEANUP:
+  return 0;
+}
+
+
+
+ESR_ReturnCode SR_AcousticModelsLoad(const LCHAR* filename, SR_AcousticModels** self)
+{
+  int use_image;
+  LCHAR arbfile[P_PATH_MAX];
+  CA_AcoustInputParams* acousticParams;
+  CA_Acoustic* acoustic;
+  LCHAR modelFilename[P_PATH_MAX];
+  SR_AcousticModelsImpl* impl;
+  size_t len;
+  ESR_ReturnCode rc;
+
+  impl = NEW(SR_AcousticModelsImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  impl->Interface.destroy = &SR_AcousticModels_Destroy;
+  impl->Interface.save = &SR_AcousticModels_Save;
+  impl->Interface.setParameter = &SR_AcousticModels_SetParameter;
+  impl->Interface.getParameter = &SR_AcousticModels_GetParameter;
+  impl->Interface.getCount = &SR_AcousticModels_GetCount;
+  impl->Interface.getID = &SR_AcousticModels_GetID;
+  impl->Interface.setID = &SR_AcousticModels_SetID;
+  impl->Interface.getArbdata = &SR_AcousticModels_GetArbdata;
+  impl->setupPattern = &SR_AcousticModels_SetupPattern;
+  impl->unsetupPattern = &SR_AcousticModels_UnsetupPattern;
+  impl->getLegacyParameters = &SR_AcousticModels_GetLegacyParameters;
+  impl->parameters = NULL;
+  impl->pattern = NULL;
+  impl->acoustic = NULL;
+  impl->arbdata = NULL;
+  impl->contents = NULL;
+  impl->size = 0;
+  acousticParams = NULL;
+  acoustic = NULL;
+
+  rc = SR_AcousticModels_PatternToSession();
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  rc = SR_AcousticModels_ToSession();
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  rc = ArrayListCreate(&impl->acoustic);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  acousticParams = CA_AllocateAcousticParameters();
+  if (acousticParams == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  rc = impl->getLegacyParameters(acousticParams);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  rc = ESR_SessionGetInt(L("cmdline.use_image"), &use_image);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  while (ESR_TRUE)
+  {
+    int i;
+    // skip space to next relative pathname
+    while (LISSPACE(*filename)) filename++;
+    if (*filename == L('\0')) break;
+    // copy the relative pathname
+    for (i = 0; *filename != L('\0') && !LISSPACE(*filename); i++)
+    {
+      modelFilename[i] = *filename++;
+    }
+    modelFilename[i] = L('\0');
+    
+    if (LSTRLEN(modelFilename) == 0 || modelFilename[0] == '#')
+      continue;
+    rc = lstrtrim(modelFilename);
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+    len = P_PATH_MAX;
+    CHKLOG(rc, ESR_SessionPrefixWithBaseDirectory(modelFilename, &len));
+    acoustic = CA_AllocateAcoustic();
+    if (acoustic == NULL)
+    {
+      rc = ESR_OUT_OF_MEMORY;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    if (use_image == 1)
+    {
+      rc = ESR_INVALID_STATE;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    else if (use_image == 2)
+    {
+      if (!CA_LoadAcousticSub(acoustic, modelFilename, 0))
+      {
+        rc = ESR_INVALID_STATE;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+    }
+    else
+    {
+            /* TODO: Is this being used? */
+      if (!CA_LoadAcousticSub(acoustic, modelFilename, acousticParams))
+      {
+        rc = ESR_INVALID_STATE;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+    }
+    rc = ArrayListAdd(impl->acoustic, acoustic);
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+  }
+  len = P_PATH_MAX;
+  rc = ESR_SessionGetLCHAR(L("cmdline.arbfile"), (LCHAR*) & arbfile, &len);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  len = P_PATH_MAX;
+  CHKLOG(rc, ESR_SessionPrefixWithBaseDirectory(arbfile, &len));
+  impl->arbdata = CA_LoadArbdata(arbfile);
+  if (impl->arbdata == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  len = CA_ArbdataGetModelVersionID(impl->arbdata);
+  LogArbdataVersion(len);
+
+  CA_FreeAcousticParameters(acousticParams);
+  *self = (SR_AcousticModels*) impl;
+
+  return ESR_SUCCESS;
+CLEANUP:
+  if (acousticParams != NULL)
+    CA_FreeAcousticParameters(acousticParams);
+  impl->Interface.destroy(&impl->Interface);
+  return rc;
+}
+
+ESR_ReturnCode SR_AcousticModels_Destroy(SR_AcousticModels* self)
+{
+  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
+  CA_Acoustic* acoustic;
+  ESR_ReturnCode rc;
+  size_t size, i;
+
+  if (impl->pattern != NULL)
+  {
+    CHKLOG(rc, impl->acoustic->getSize(impl->acoustic, &size));
+    for (i = 0; i < size; ++i)
+    {
+      CHKLOG(rc, impl->acoustic->get(impl->acoustic, i, (void **)&acoustic));
+      CA_ClearPatternForAcoustic(impl->pattern, acoustic);
+    }
+    CA_UnloadPattern(impl->pattern);
+    CA_FreePattern(impl->pattern);
+    impl->pattern = NULL;
+  }
+
+  if (impl->acoustic != NULL)
+  {
+    CHKLOG(rc, impl->acoustic->getSize(impl->acoustic, &size));
+    for (i = 0; i < size; ++i)
+    {
+      CHKLOG(rc, impl->acoustic->get(impl->acoustic, 0, (void **)&acoustic));
+      CHKLOG(rc, impl->acoustic->removeAtIndex(impl->acoustic, 0));
+
+      /* Free acoustic models */
+      CA_UnloadAcoustic(acoustic);
+      CA_FreeAcoustic(acoustic);
+    }
+
+    CHKLOG(rc, impl->acoustic->destroy(impl->acoustic));
+    impl->acoustic = NULL;
+  }
+
+  if (impl->arbdata != NULL)
+  {
+    CA_FreeArbdata(impl->arbdata);
+    impl->arbdata = NULL;
+  }
+
+  FREE(impl);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_AcousticModels_Save(SR_AcousticModels* self, const LCHAR* filename)
+{
+  /*SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;*/
+
+  /* CA_WriteAcousticImage(impl->acoustic, filename, 0); */
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_AcousticModels_SetParameter(SR_AcousticModels* self, const LCHAR* key, LCHAR* value)
+{
+  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
+  LCHAR* temp;
+  ESR_ReturnCode rc;
+
+  rc = HashMapGet(impl->parameters, key, (void **)&temp);
+  if (rc == ESR_SUCCESS)
+  {
+    /* Key already exists, remove old value if necessary */
+    if (LSTRCMP(temp, value) == 0)
+      return ESR_SUCCESS;
+    CHKLOG(rc, HashMapRemove(impl->parameters, key));
+    FREE(temp);
+  }
+  else if (rc != ESR_NO_MATCH_ERROR)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  /* Allocate and put new key */
+  temp = MALLOC(sizeof(LCHAR) * (LSTRLEN(value) + 1), MTAG);
+  if (temp == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CHKLOG(rc, impl->parameters->put(impl->parameters, key, temp));
+  return ESR_SUCCESS;
+CLEANUP:
+  FREE(temp);
+  return rc;
+}
+
+ESR_ReturnCode SR_AcousticModels_GetParameter(SR_AcousticModels* self, const LCHAR* key, LCHAR* value, size_t* len)
+{
+  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
+  LCHAR* temp;
+  ESR_ReturnCode rc;
+
+  rc = HashMapGet(impl->parameters, key, (void **)&temp);
+  if (rc == ESR_NO_MATCH_ERROR)
+    CHKLOG(rc, ESR_SessionGetLCHAR(key, value, len));
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    return rc;
+  }
+  if (LSTRLEN(temp) + 1 > *len)
+  {
+    *len = LSTRLEN(temp) + 1;
+    PLogError(L("ESR_BUFFER_OVERFLOW"));
+    return ESR_BUFFER_OVERFLOW;
+  }
+  *len = LSTRLEN(temp) + 1;
+  LSTRCPY(value, temp);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_AcousticModels_GetCount(SR_AcousticModels* self, size_t* size)
+{
+  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, ArrayListGetSize(impl->acoustic, size));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_AcousticModels_GetID(SR_AcousticModels* self, size_t index,
+                                       SR_AcousticModelID* id, size_t* size)
+{
+  /* TODO: complete */
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_AcousticModels_SetID(SR_AcousticModels* self, size_t index,
+                                       SR_AcousticModelID* id)
+{
+  /* TODO: complete */
+  return ESR_SUCCESS;
+}
+
+void* SR_AcousticModels_GetArbdata(SR_AcousticModels* self)
+{
+	SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*)self;
+	return impl? (void*)impl->arbdata : NULL;
+}
+
+/**
+ * When AcousticModels are associated with a Recognizer, they initialize their
+ * Pattern objects using that Recognizer.
+ *
+ * @param self SR_AcousticModels handle
+ * @param recognizer The recognizer
+ */
+ESR_ReturnCode SR_AcousticModels_SetupPattern(SR_AcousticModels* self,
+    SR_Recognizer* recognizer)
+{
+  CA_PatInputParams* patternParams = NULL;
+  LCHAR mulname[P_PATH_MAX];
+  LCHAR ldaname[P_PATH_MAX];
+  SR_RecognizerImpl* recog;
+  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
+  CA_Acoustic* acoustic;
+  size_t i, size, len;
+  int dimen;
+  ESR_ReturnCode rc;
+  ESR_BOOL isPatternLoaded = ESR_FALSE;
+
+  if (recognizer == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  recog = (SR_RecognizerImpl*) recognizer;
+
+  impl->pattern = CA_AllocatePattern();
+  if (impl->pattern == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  patternParams = CA_AllocatePatternParameters();
+  if (patternParams == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  CHKLOG(rc, SR_AcousticModels_LoadLegacyPatternParameters(patternParams));
+  dimen = CA_GetFrontendUtteranceDimension(recog->frontend);
+
+  LSTRCPY(mulname, L(""));
+
+  len = P_PATH_MAX;
+  CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.lda"), (LCHAR*) &ldaname, &len));
+  len = P_PATH_MAX;
+  CHKLOG(rc, ESR_SessionPrefixWithBaseDirectory(ldaname, &len));
+
+  CA_LoadPattern(impl->pattern, patternParams, dimen, mulname, ldaname);
+  isPatternLoaded = ESR_TRUE;
+  CHKLOG(rc, impl->acoustic->getSize(impl->acoustic, &size));
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, impl->acoustic->get(impl->acoustic, i, (void **)&acoustic));
+    CA_SetupPatternForAcoustic(impl->pattern, acoustic);
+  }
+  CA_FreePatternParameters(patternParams);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (impl->pattern != NULL)
+  {
+    if (isPatternLoaded == ESR_TRUE)
+      CA_UnloadPattern(impl->pattern);
+    CA_FreePattern(impl->pattern);
+  }
+  if (patternParams != NULL)
+    CA_FreePatternParameters(patternParams);
+  return rc;
+}
+
+/**
+ * When AcousticModels are deassociated with a Recognizer, they deinitialize their
+ * Pattern objects.
+ *
+ * @param self SR_AcousticModels handle
+ */
+ESR_ReturnCode SR_AcousticModels_UnsetupPattern(SR_AcousticModels* self)
+{
+  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
+  CA_Acoustic* acoustic;
+  size_t i, size;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, impl->acoustic->getSize(impl->acoustic, &size));
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, impl->acoustic->get(impl->acoustic, i, (void **)&acoustic));
+    CA_ClearPatternForAcoustic(impl->pattern, acoustic);
+  }
+  CA_UnloadPattern(impl->pattern);
+  CA_FreePattern(impl->pattern);
+  impl->pattern = NULL;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/srec/AcousticState/Android.mk b/srec/AcousticState/Android.mk
new file mode 100644
index 0000000..fc10bf3
--- /dev/null
+++ b/srec/AcousticState/Android.mk
@@ -0,0 +1,69 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/AcousticState.c \
+	src/AcousticStateImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+common_CFLAGS := \
+	-DSREC_ACOUSTICSTATE_EXPORTS \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_Core \
+
+common_TARGET:= libSR_AcousticState
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/AcousticState/include/SR_AcousticState.h b/srec/AcousticState/include/SR_AcousticState.h
new file mode 100644
index 0000000..5b8e57d
--- /dev/null
+++ b/srec/AcousticState/include/SR_AcousticState.h
@@ -0,0 +1,159 @@
+/*---------------------------------------------------------------------------*
+ *  SR_AcousticState.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_ACOUSTICSTATE_H
+#define __SR_ACOUSTICSTATE_H
+
+
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "SR_AcousticModels.h"
+#include "SR_AcousticStatePrefix.h"
+#include "SR_Recognizer.h"
+#include "pstdio.h"
+#include "ESR_ReturnCode.h"
+
+
+/**
+ * @addtogroup SR_AcousticStateModule SR_AcousticState API functions
+ * Contains Acoustic state information.
+ *
+ * @{
+ */
+
+/**
+ * Contains Acoustic state information.
+ */
+typedef struct SR_AcousticState_t
+{
+  /**
+   * Resets the acoustic state object.
+   * The recognizer adapts to the acoustic state of the caller and calling environment
+   * during a call in order to improve recognition accuracy. The platform must reset
+   * the AcousticState either at the beginning of a new call or at the end of a call in
+   * order to reset acoustic state information for a new caller.
+   *
+   * @param recognizer SR_Recognizer handle
+  * @return ESR_INVALID_ARGUMENT if recognizer is null
+   */
+  ESR_ReturnCode(*reset)(SR_Recognizer* recognizer);
+  /**
+   * Loads an AcousticState from file.
+   *
+   * @param recognizer SR_Recognizer handle
+   * @param file File to read from
+   * @return ESR_INVALID_ARGUMENT if recognizer is null
+   */
+  ESR_ReturnCode(*load)(SR_Recognizer* recognizer, const LCHAR* filename);
+  /**
+   * Saves an AcousticState to a file.
+   *
+   * @param recognizer SR_Recognizer handle
+   * @param file File to write into
+   * @return ESR_INVALID_ARGUMENT if recognizer is null
+   */
+  ESR_ReturnCode(*save)(SR_Recognizer* recognizer, const LCHAR* filename);
+  /**
+   * Gets an AcousticState into a string.
+   *
+   * @param recognizer SR_Recognizer handle
+   * @param param_string contains data from the recognizer
+   * @return ESR_INVALID_ARGUMENT if recognizer is null
+   */
+  ESR_ReturnCode(*get)(SR_Recognizer* recognizer, const LCHAR **param_string );
+  /**
+   * Sets an AcousticState from a string.
+   *
+   * @param recognizer SR_Recognizer handle
+   * @param param_string contains data to set
+   * @return ESR_INVALID_ARGUMENT if recognizer is null
+   */
+  ESR_ReturnCode(*set)(SR_Recognizer* recognizer, const LCHAR *param_string );
+  /**
+   * Destrroys the acoustic state of a recognizer
+   *
+   * @param recognizer SR_Recognizer handle
+  * @return ESR_INVALID_ARGUMENT if recognizer is null
+   */
+  ESR_ReturnCode(*destroy)(SR_Recognizer* recognizer);
+}
+SR_AcousticState;
+
+/**
+ * @name AcousticState
+ *
+ * An AcousticState is a container for the configurations of several items used in recognition:
+ *
+ * - What models are in use (where there is more than one available). E.g. M/F or adapted models.
+ * - Properties of the channels (microphone, environment, speaker). These properties are updated
+ * during recognition. E.g. There may be more than one microphone in use, offering zone-based
+ * input. Each zone may require the maintenance of its own channel settings.
+ *
+ * AcousticState must offer persistence to reflect optimal settings and preferred use on start-up.
+ *
+ * @{
+ */
+
+/**
+ * Loads an AcousticState from file.
+ *
+ * @param recognizer SR_Recognizer handle
+ * @param filename File to read from
+ * @return ESR_INVALID_ARGUMENT if recognizer is null
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateLoad(SR_Recognizer* recognizer, const LCHAR* filename);
+/**
+ * Saves an AcousticState to a file.
+ *
+ * @param recognizer SR_Recognizer handle
+ * @param filename File to write into
+ * @return ESR_NOT_IMPLEMENTED
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateSave(SR_Recognizer* recognizer, const LCHAR* filename);
+/**
+ * @}
+ *
+ * @name Possible AcousticState <-> Model operations
+ *
+ * @{
+ */
+
+/**
+ * Resets the acoustic state object.
+ * The recognizer adapts to the acoustic state of the caller and calling environment
+ * during a call in order to improve recognition accuracy. The platform must reset
+ * the AcousticState either at the beginning of a new call or at the end of a call in
+ * order to reset acoustic state information for a new caller.
+ *
+ * @param recognizer SR_Recognizer handle
+ * @return ESR_INVALID_ARGUMENT if recognizer is null
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateReset(SR_Recognizer* recognizer);
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateSet ( SR_Recognizer* recognizer, const LCHAR *param_string );
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateGet ( SR_Recognizer* recognizer, const LCHAR **param_string );
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#endif /* __SR_ACOUSTICSTATE_H */
diff --git a/srec/AcousticState/include/SR_AcousticStateImpl.h b/srec/AcousticState/include/SR_AcousticStateImpl.h
new file mode 100644
index 0000000..5c4d7b0
--- /dev/null
+++ b/srec/AcousticState/include/SR_AcousticStateImpl.h
@@ -0,0 +1,84 @@
+/*---------------------------------------------------------------------------*
+ *  SR_AcousticStateImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_ACOUSTICSTATEIMPL_H
+#define __SR_ACOUSTICSTATEIMPL_H
+
+
+
+#ifndef __vxworks
+#include <memory.h>
+#endif
+#include "SR_AcousticModels.h"
+#include "SR_AcousticState.h"
+#include "SR_RecognizerImpl.h"
+#include "ESR_ReturnCode.h"
+
+/**
+ * SR_AcousticState implementation.
+ */
+typedef struct SR_AcousticStateImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_AcousticState Interface;
+}
+SR_AcousticStateImpl;
+
+
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateCreateImpl(SR_Recognizer* recognizer);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateDestroyImpl(SR_Recognizer* recognizer);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateResetImpl(SR_Recognizer* recognizer);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateLoadImpl(SR_Recognizer* recognizer, const LCHAR* filename);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateSaveImpl(SR_Recognizer* recognizer, const LCHAR* filename);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateSetImpl(SR_Recognizer* recognizer, const LCHAR *param_string );
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateGetImpl(SR_Recognizer* recognizer, const LCHAR **param_string );
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateActivateModelImpl(SR_Recognizer* recognizer, SR_AcousticModelID id);
+/**
+ * Default implementation.
+ */
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateDeactivateModelImpl(SR_Recognizer* recognizer, SR_AcousticModelID id);
+
+
+#endif /* __SR_ACOUSTICSTATEIMPL_H */
diff --git a/srec/AcousticState/include/SR_AcousticStatePrefix.h b/srec/AcousticState/include/SR_AcousticStatePrefix.h
new file mode 100644
index 0000000..707efff
--- /dev/null
+++ b/srec/AcousticState/include/SR_AcousticStatePrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_AcousticStatePrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef SR_ACOUSTICSTATEPREFIX_H
+#define SR_ACOUSTICSTATEPREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_ACOUSTICSTATE_EXPORTS
+#define SREC_ACOUSTICSTATE_API PORT_EXPORT_DECL
+#else
+#define SREC_ACOUSTICSTATE_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/AcousticState/src/AcousticState.c b/srec/AcousticState/src/AcousticState.c
new file mode 100644
index 0000000..b9eb6e2
--- /dev/null
+++ b/srec/AcousticState/src/AcousticState.c
@@ -0,0 +1,97 @@
+/*---------------------------------------------------------------------------*
+ *  AcousticState.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_Recognizer.h"
+#include "SR_RecognizerImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateReset(SR_Recognizer* recognizer)
+{
+  SR_RecognizerImpl* impl;
+  
+  if (recognizer == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = (SR_RecognizerImpl*) recognizer;
+  
+  return impl->acousticState->reset(recognizer);
+}
+
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateLoad(SR_Recognizer* recognizer, const LCHAR* filename)
+{
+  SR_RecognizerImpl* impl;
+  
+  if (recognizer == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = (SR_RecognizerImpl*) recognizer;
+  
+  return impl->acousticState->load(recognizer, filename);
+}
+
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateSave(SR_Recognizer* recognizer, const LCHAR* filename)
+{
+  SR_RecognizerImpl* impl;
+  
+  if (recognizer == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = (SR_RecognizerImpl*) recognizer;
+  
+  return impl->acousticState->save(recognizer, filename);
+}
+
+
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateSet ( SR_Recognizer* recognizer, const LCHAR *param_string )
+{
+  SR_RecognizerImpl* impl;
+  
+  if (recognizer == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = (SR_RecognizerImpl*) recognizer;
+  
+  return impl->acousticState->set ( recognizer, param_string );
+}
+
+
+SREC_ACOUSTICSTATE_API ESR_ReturnCode SR_AcousticStateGet ( SR_Recognizer* recognizer, const LCHAR **param_string )
+{
+  SR_RecognizerImpl* impl;
+  
+  if (recognizer == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = (SR_RecognizerImpl*) recognizer;
+  
+  return impl->acousticState->get ( recognizer, param_string );
+}
+
+
diff --git a/srec/AcousticState/src/AcousticStateImpl.c b/srec/AcousticState/src/AcousticStateImpl.c
new file mode 100644
index 0000000..c9359ee
--- /dev/null
+++ b/srec/AcousticState/src/AcousticStateImpl.c
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*
+ *  AcousticStateImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_AcousticState.h"
+#include "SR_AcousticStateImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+#define MTAG __FILE__
+
+ESR_ReturnCode SR_AcousticStateCreateImpl(SR_Recognizer* recognizer)
+{
+  SR_AcousticStateImpl* impl;
+  SR_RecognizerImpl* recogImpl = (SR_RecognizerImpl*) recognizer;
+  
+  if (recogImpl == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = NEW(SR_AcousticStateImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  
+  impl->Interface.load = &SR_AcousticStateLoadImpl;
+  impl->Interface.save = &SR_AcousticStateSaveImpl;
+  impl->Interface.destroy = &SR_AcousticStateDestroyImpl;
+  impl->Interface.reset = &SR_AcousticStateResetImpl;
+  impl->Interface.set = &SR_AcousticStateSetImpl;
+  impl->Interface.get = &SR_AcousticStateGetImpl;
+  
+  recogImpl->acousticState = &impl->Interface;
+  return ESR_SUCCESS;
+}
+
+
+ESR_ReturnCode SR_AcousticStateGetImpl(SR_Recognizer* self, const LCHAR **param_string )
+{
+  SR_RecognizerImpl* recogImpl = (SR_RecognizerImpl*) self;
+  
+  return CA_GetCMSParameters(recogImpl->wavein, param_string );
+}
+
+
+ESR_ReturnCode SR_AcousticStateSetImpl(SR_Recognizer* self, const LCHAR *param_string )
+{
+  SR_RecognizerImpl* recogImpl = (SR_RecognizerImpl*) self;
+  
+  return CA_SetCMSParameters(recogImpl->wavein, param_string );
+}
+
+
+ESR_ReturnCode SR_AcousticStateDestroyImpl(SR_Recognizer* recognizer)
+{
+  SR_RecognizerImpl* recogImpl = (SR_RecognizerImpl*) recognizer;
+  SR_AcousticStateImpl* impl = (SR_AcousticStateImpl*) recogImpl->acousticState;
+  
+  FREE(impl);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_AcousticStateResetImpl(SR_Recognizer* recognizer)
+{
+  SR_RecognizerImpl* recogImpl = (SR_RecognizerImpl*) recognizer;
+  CA_ReLoadCMSParameters(recogImpl->wavein, NULL);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_AcousticStateLoadImpl(SR_Recognizer* self, const LCHAR* filename)
+{
+  SR_RecognizerImpl* recogImpl = (SR_RecognizerImpl*) self;
+  
+  CA_ReLoadCMSParameters(recogImpl->wavein, filename);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_AcousticStateSaveImpl(SR_Recognizer* recognizer, const LCHAR* filename)
+{
+  return ESR_NOT_IMPLEMENTED;
+}
diff --git a/srec/Android.mk b/srec/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/srec/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/srec/EventLog/Android.mk b/srec/EventLog/Android.mk
new file mode 100644
index 0000000..babdf6f
--- /dev/null
+++ b/srec/EventLog/Android.mk
@@ -0,0 +1,61 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/EventLog.c \
+	src/EventLogImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+
+common_CFLAGS := \
+	-DSREC_EVENTLOG_EXPORTS \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+
+common_TARGET:= libSR_EventLog
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/EventLog/include/SR_EventLog.h b/srec/EventLog/include/SR_EventLog.h
new file mode 100644
index 0000000..bfa1770
--- /dev/null
+++ b/srec/EventLog/include/SR_EventLog.h
@@ -0,0 +1,369 @@
+/*---------------------------------------------------------------------------*
+ *  SR_EventLog.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_EventLog_H
+#define __SR_EventLog_H
+
+
+
+#include "SR_EventLogPrefix.h"
+#include "ptypes.h"
+#include "ESR_ReturnCode.h"
+
+
+/**
+ * @addtogroup SR_EventLogModule SR_EventLog API functions
+ * Provides OSI logging.
+ *
+ * @{
+ */
+
+/**
+ * OSI Event Log levels
+ */
+
+/**
+ * Basic logging level.
+ */
+#define OSI_LOG_LEVEL_BASIC 0x01
+/**
+ * Log audio data.
+ */
+#define OSI_LOG_LEVEL_AUDIO 0x02
+/**
+ * Log ADDWORD commands.
+ */
+#define OSI_LOG_LEVEL_ADDWD 0x04
+
+/**
+ * Log a string token using the basic logging level.
+ */
+#define SR_EventLogToken_BASIC(log, loglevel, tokenName, value) \
+  ((loglevel & OSI_LOG_LEVEL_BASIC) ? \
+   log->token(log, tokenName, value) : ESR_SUCCESS ) \
+
+/**
+ * Log an integer token using the basic logging level.
+ */
+#define SR_EventLogTokenInt_BASIC(log, loglevel, tokenName, value)  \
+  ((loglevel & OSI_LOG_LEVEL_BASIC) ? \
+   log->tokenInt(log, tokenName, value) : ESR_SUCCESS ) \
+
+/**
+ * Log a uint16 token using the basic logging level.
+ */
+#define SR_EventLogTokenUint16_t_BASIC(log, loglevel, tokenName, value)  \
+  ((loglevel & OSI_LOG_LEVEL_BASIC) ? \
+   log->tokenUint16_t(log, tokenName, value) : ESR_SUCCESS ) \
+
+/**
+ * Log a size_t token using the basic logging level.
+ */
+#define SR_EventLogTokenSize_t_BASIC(log, loglevel, tokenName, value)  \
+  ((loglevel & OSI_LOG_LEVEL_BASIC) ? \
+   log->tokenSize_t(log, tokenName, value) : ESR_SUCCESS ) \
+
+/**
+ * Log a boolean token using the basic logging level.
+ */
+#define SR_EventLogTokenBool_BASIC(log, loglevel, tokenName, value)  \
+  ((loglevel & OSI_LOG_LEVEL_BASIC) ? \
+   log->tokenBool(log, tokenName, value) : ESR_SUCCESS ) \
+
+/**
+ * Log a float token using the basic logging level.
+ */
+#define SR_EventLogTokenFloat_BASIC(log, loglevel, tokenName, value)  \
+  ((loglevel & OSI_LOG_LEVEL_BASIC) ? \
+   log->tokenFloat(log, tokenName, value) : ESR_SUCCESS ) \
+
+/**
+ * Log an event using the basic logging level.
+ */
+#define SR_EventLogEvent_BASIC(log, loglevel, eventName) \
+  ((loglevel & OSI_LOG_LEVEL_BASIC) ? \
+   log->event(log, eventName) : ESR_SUCCESS ) \
+
+/**
+ * Log a string token using the audio logging level.
+ */
+#define SR_EventLogToken_AUDIO(log, loglevel, tokenName, value) \
+  ((loglevel & OSI_LOG_LEVEL_AUDIO) ? \
+   log->token(log, tokenName, value) : ESR_SUCCESS ) \
+
+/**
+ * Log an integer token using the audio logging level.
+ */
+#define SR_EventLogTokenInt_AUDIO(log, loglevel, tokenName, value)  \
+  ((loglevel & OSI_LOG_LEVEL_AUDIO) ? \
+   log->tokenInt(log, tokenName, value) : ESR_SUCCESS ) \
+
+/**
+ * Log an event using the audio logging level.
+ */
+#define SR_EventLogEvent_AUDIO(log, loglevel, eventName) \
+  ((loglevel & OSI_LOG_LEVEL_AUDIO) ? \
+   log->event(log, eventName) : ESR_SUCCESS ) \
+
+/**
+ * Represents a EventLog.
+ */
+typedef struct SR_EventLog_t
+{
+	/**
+	 * Destroys a EventLog.
+	 *
+	 * @param self EventLog handle
+	 */
+	ESR_ReturnCode(*destroy)(struct SR_EventLog_t* self);
+
+	/**
+	 * Logs an OSI log token.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param token Token name
+	 * @param value Token value
+	 */
+	ESR_ReturnCode(*token)(struct SR_EventLog_t* self, const LCHAR* token, const LCHAR *value);
+
+	/**
+	 * Logs an OSI log token.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param token Token name
+	 * @param value Token value
+	 */
+	ESR_ReturnCode(*tokenInt)(struct SR_EventLog_t* self, const LCHAR* token, int value);
+
+	/**
+	 * Logs an OSI log token.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param token Token name
+	 * @param value Token value
+	 */
+	ESR_ReturnCode(*tokenUint16_t)(struct SR_EventLog_t* self, const LCHAR* token, asr_uint16_t value);
+
+	/**
+	 * Logs an OSI log token.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param token Token name
+	 * @param value Token value
+	 */
+	ESR_ReturnCode(*tokenSize_t)(struct SR_EventLog_t* self, const LCHAR* token, size_t value);
+
+	/**
+	 * Logs an OSI log token.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param token Token name
+	 * @param value Token value
+	 */
+        ESR_ReturnCode(*tokenBool)(struct SR_EventLog_t* self, const LCHAR* token, ESR_BOOL value);
+
+	/**
+	 * Logs an OSI log token.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param token Token name
+	 * @param value Token value
+	 */
+	ESR_ReturnCode(*tokenFloat)(struct SR_EventLog_t* self, const LCHAR* token, float value);
+
+	/**
+	 * Commits all previously accumulated log tokens.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param eventName Name of the event associated with the tokens
+	 */
+	ESR_ReturnCode(*event)(struct SR_EventLog_t* self, const LCHAR* eventName);
+
+
+	/**
+	 * Log the contents of the ESR_Session.
+	 *
+	 * @param self SR_EventLog handle
+	 */
+	ESR_ReturnCode(*eventSession)(struct SR_EventLog_t* self);
+
+	/**
+	 * Opens a new file for recording a waveform of audio. Filename is automatically generated. Opened file
+	 * becomes the current one where data is written to until closed.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param audio_type String identifying type of audio e.g. L("audio/L16")
+	 * @param sample_rate Sampling rate
+	 * @param sample_size Size of sampling in bytes.
+	 */
+	ESR_ReturnCode(*audioOpen)(struct SR_EventLog_t* self, const LCHAR* audio_type, size_t sample_rate, size_t sample_size);
+
+	/**
+	 * Closes the current file.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param eventName Name of the event associated with the tokens
+	 */
+	ESR_ReturnCode(*audioClose)(struct SR_EventLog_t* self);
+
+	/**
+	 * Writes datat to the current audio file.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param buffer Buffer holding the data to write
+	 * @param num_bytes The number of bytes in the buffer.
+	 */
+	ESR_ReturnCode(*audioWrite)(struct SR_EventLog_t* self, void* buffer, size_t num_bytes);
+
+	/**
+	 * Returns the filename of the current audio file used for logging.
+	 *
+	 * @param self SR_EventLog handle
+	 * @param waveformFilename Name of the current audio file.
+	 * @param len Length of buffer.
+	 */
+	ESR_ReturnCode(*audioGetFilename)(struct SR_EventLog_t* self, LCHAR* waveformFilename, size_t* len);
+}
+SR_EventLog;
+
+/**
+ * Create a new EventLog
+ *
+ * @param self EventLog handle
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogCreate(SR_EventLog** self);
+
+/**
+ * Destroys a EventLog.
+ *
+ * @param self EventLog handle
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogDestroy(SR_EventLog* self);
+
+/**
+ * Logs an OSI log token.
+ *
+ * @param self SR_EventLog handle
+ * @param token Token name
+ * @param value Token value
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogToken(SR_EventLog* self, const LCHAR* token, const LCHAR *value);
+
+/**
+ * Logs an OSI log token.
+ *
+ * @param self SR_EventLog handle
+ * @param token Token name
+ * @param value Token value
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogTokenInt(SR_EventLog* self, const LCHAR* token, int value);
+
+/**
+ * Logs an OSI log token.
+ *
+ * @param self SR_EventLog handle
+ * @param token Token name
+ * @param value Token value
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogTokenUint16_t(SR_EventLog* self, const LCHAR* token, asr_uint16_t value);
+
+/**
+ * Logs an OSI log token.
+ *
+ * @param self SR_EventLog handle
+ * @param token Token name
+ * @param value Token value
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogTokenSize_t(SR_EventLog* self, const LCHAR* token, size_t value);
+
+/**
+ * Logs an OSI log token.
+ *
+ * @param self SR_EventLog handle
+ * @param token Token name
+ * @param value Token value
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogTokenBool(SR_EventLog* self, const LCHAR* token, ESR_BOOL value);
+
+/**
+ * Logs an OSI log token.
+ *
+ * @param self SR_EventLog handle
+ * @param token Token name
+ * @param value Token value
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogTokenFloat(SR_EventLog* self, const LCHAR* token, float value);
+
+/**
+ * Log the contents of the ESR_Session.
+ *
+ * @param self SR_EventLog handle
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogEventSession(SR_EventLog* self);
+
+/**
+ * Commits all previously accumulated log tokens.
+ *
+ * @param self SR_EventLog handle
+ * @param eventName Name of the event associated with the tokens
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogEvent(SR_EventLog* self, const LCHAR* eventName);
+
+/**
+ * Opens a new file for recording a waveform of audio. Filename is automatically generated. Opened file
+ * becomes the current one where data is written to until closed.
+ *
+ * @param self SR_EventLog handle
+ * @param audio_type String identifying type of audio e.g. L("audio/L16")
+ * @param sample_rate Sampling rate
+ * @param sample_size Size of sampling in bytes.
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogAudioOpen(SR_EventLog* self, const LCHAR* audio_type, size_t sample_rate, size_t sample_size);
+
+/**
+ * Closes the current file.
+ *
+ * @param self SR_EventLog handle
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogAudioClose(SR_EventLog* self);
+
+/**
+ * Writes datat to the current audio file.
+ *
+ * @param self SR_EventLog handle
+ * @param buffer Buffer holding the data to write
+ * @param num_bytes The number of bytes in the buffer.
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogAudioWrite(SR_EventLog* self, void* buffer, size_t num_bytes);
+
+/**
+ * Returns the filename of the current audio file used for logging.
+ *
+ * @param self SR_EventLog handle
+ * @param waveformFilename Name of the current audio file.
+ * @param len Length of buffer.
+ */
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogAudioGetFilename(SR_EventLog* self, LCHAR* waveformFilename, size_t* len);
+
+/**
+* @}
+*/
+
+
+#endif /* __SR_EventLog_H */
diff --git a/srec/EventLog/include/SR_EventLogImpl.h b/srec/EventLog/include/SR_EventLogImpl.h
new file mode 100644
index 0000000..00840e9
--- /dev/null
+++ b/srec/EventLog/include/SR_EventLogImpl.h
@@ -0,0 +1,100 @@
+/*---------------------------------------------------------------------------*
+ *  SR_EventLogImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_EventLogIMPL_H
+#define __SR_EventLogIMPL_H
+
+
+
+#include <stdlib.h>
+#include "ESR_ReturnCode.h"
+#include "ESR_SessionTypeListener.h"
+
+#define TOK_BUFLEN (2*P_PATH_MAX)
+#define MAX_LOG_RECORD (16*1024)
+
+/**
+ * EventLog implementation.
+ */
+
+typedef enum
+{
+  FILE_OK,
+  SPACE_SETTING,
+  UNINITIALIZED,
+  NO_FILE,
+  FILE_ERROR,
+  SEEK_ERROR
+} EventLogFileState;
+
+typedef struct SR_EventLogImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_EventLog Interface;
+  
+  LCHAR tokenBuf[MAX_LOG_RECORD];
+  
+  long serviceStartUserCPU;
+  long serviceStartKernelCPU;
+  
+  EventLogFileState logFile_state;
+  ESR_SessionTypeListener sessionListener;
+  ESR_SessionTypeListenerPair sessionListenerPair;
+  
+  PFile* logFile;
+  size_t logLevel;
+  LCHAR logFilename[P_PATH_MAX];
+  LCHAR waveformFilename[P_PATH_MAX];
+  PFile* waveformFile;
+  size_t waveformCounter;
+  size_t waveform_num_bytes;
+  size_t waveform_sample_rate;
+  size_t waveform_bytes_per_sample;
+}
+SR_EventLogImpl;
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_Destroy(SR_EventLog* self);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_Token(SR_EventLog* self, const LCHAR* token, const LCHAR *value);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_TokenInt(SR_EventLog* self, const LCHAR* token, int value);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_TokenUint16_t(SR_EventLog* self, const LCHAR* token, asr_uint16_t value);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_TokenSize_t(SR_EventLog* self, const LCHAR* token, size_t value);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_TokenBool(SR_EventLog* self, const LCHAR* token, ESR_BOOL value);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_TokenFloat(SR_EventLog* self, const LCHAR* token, float value);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLogEventSessionImpl(SR_EventLog* self);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_Event(SR_EventLog* self, const LCHAR* eventName);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_AudioOpen(SR_EventLog* self, const LCHAR* audio_type, size_t sample_rate, size_t sample_size);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_AudioClose(SR_EventLog* self);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_AudioWrite(SR_EventLog* self, void* buffer, size_t num_bytes);
+
+SREC_EVENTLOG_API ESR_ReturnCode SR_EventLog_AudioGetFilename(SR_EventLog* self, LCHAR* waveformFilename, size_t* len);
+
+#endif /* __SR_EventLogIMPL_H */
diff --git a/srec/EventLog/include/SR_EventLogPrefix.h b/srec/EventLog/include/SR_EventLogPrefix.h
new file mode 100644
index 0000000..f48c45e
--- /dev/null
+++ b/srec/EventLog/include/SR_EventLogPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_EventLogPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_EVENTLOG_PREFIX_H
+#define __SR_EVENTLOG_PREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_EVENTLOG_EXPORTS
+#define SREC_EVENTLOG_API PORT_EXPORT_DECL
+#else
+#define SREC_EVENTLOG_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/EventLog/include/riff.h b/srec/EventLog/include/riff.h
new file mode 100644
index 0000000..80d6f16
--- /dev/null
+++ b/srec/EventLog/include/riff.h
@@ -0,0 +1,254 @@
+/*---------------------------------------------------------------------------*
+ *  riff.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef RIFF_H
+#define RIFF_H
+
+#include "ESR_ReturnCode.h"
+#include "plog.h"
+#include "passert.h"
+#include "pmemory.h"
+#include "SR_EventLogPrefix.h"
+
+#define AURORA_BYTES_SEC 5600
+
+/* standard codec IDs */
+#define WAVEFORMAT_PCM      0x01
+#define WAVEFORMAT_ALAW     0x06
+#define WAVEFORMAT_MULAW    0x07
+
+/* swi-specific codec ID */
+#define WAVEFORMAT_AURORA   0x99
+#define WAVEFORMAT_ES_202_050   0x9A
+
+/**
+ * WAV file format.
+ */
+typedef struct
+{
+	/**
+	 * Codec ID.
+	 */
+  unsigned short nFormatTag;
+	/**
+	 * The number of channels.
+	 */
+  unsigned short nChannels;
+	/**
+	 * sampling rate: sample frames per sec.
+	 */
+  unsigned int   nSamplesPerSec;
+	/**
+	 * sampling rate * block alignment
+	 */
+  unsigned int   nAvgBytesPerSec;
+	/**
+	 * number of channels * bytes_per_sample
+	 */
+  unsigned short nBlockAlign;
+	/**
+	 * bytes_per_sample * 8 (PCM-specific field)
+	 */
+  unsigned short wBitsPerSample;
+}
+WaveFormat;
+
+/**
+ * Generic start of every RIFF chunk.
+ */
+typedef struct
+{
+  /**
+	 * 4-byte signature
+	 */
+  char ckString[4];
+	/**
+	 * Chunk length.
+	 */
+  int ckLength;
+}
+ChunkInfoStruct;
+
+/**
+ * RIFF Header.
+ */
+typedef struct
+{
+	/**
+	 * "RIFF"
+	 */
+  char riffString[4];
+	/**
+	 * The length of the RIFF chunk.
+	 */
+  unsigned int riffChunkLength;
+	/**
+	 * "WAVE"
+	 */
+  char waveString[4];  
+	/**
+	 * "fmt "
+	 */
+  char fmtString[4];
+	/**
+	 * The length of the format chunk.
+	 */
+  unsigned int fmtChunkLength;
+	/**
+	 * The audio format.
+	 */
+  WaveFormat waveinfo;
+	/**
+	 * "data"
+	 */
+  char dataString[4];
+	/**
+	 * The length of the audio data section.
+	 */
+  unsigned int dataLength;
+}
+RiffHeaderStruct;
+
+/**
+ * An audio segment.
+ */
+typedef struct
+{
+	/**
+	 * Position (byte #) where audio segment begins.
+	 */
+  int pos;
+	/**
+	 * Length of audio segment.
+	 */
+  int len;
+	/**
+	 * SWIrec_PACKET_SUPPRESSED or SWIrec_PACKET_LOST.
+	 */
+  int type;
+}
+RiffAudioTuple;
+
+/**
+ * For "supp" or "lost" chunk.
+ */
+typedef struct
+{
+	/**
+	 * The number of audio tuples.
+	 */
+  int num_tuples;
+	/**
+	 * The audio tuples.
+	 */
+  RiffAudioTuple *tuples;
+}
+SwiRiffAudio;
+
+/**
+ * Key-value pair.
+ */
+typedef struct
+{
+	/**
+	 * e.g. "encoding"
+	 */
+  char *key;
+	/**
+	 * e.g. "g723"
+	 */
+  char *value;
+}
+RiffKVPair;
+
+/**
+ * For "kval" chunk.
+ */
+typedef struct
+{
+	/**
+	 * The number of key-value pairs.
+	 */
+  int num_pairs;
+	/**
+	 * The key-value pairs.
+	 */
+  RiffKVPair *kvpairs;
+}
+SwiRiffKeyVals;
+
+/**
+ * A RIFF audio segment.
+ */
+typedef struct
+{
+	/**
+	 * Special audio segments, lost or suppressed
+	 */
+  SwiRiffAudio segs;
+	/**
+	 * Key-value pairs.
+	 */
+  SwiRiffKeyVals kvals;
+}
+SwiRiffStruct;
+
+
+SREC_EVENTLOG_API int isLittleEndian(void);
+
+SREC_EVENTLOG_API ESR_ReturnCode riffReadWave2L16(
+  FILE *f,
+  double from,
+  double to,
+  short **samples,
+  int *rate,
+  int *length,
+  SwiRiffStruct *swichunk);
+  
+SREC_EVENTLOG_API ESR_ReturnCode convertBuf2Riff(
+  unsigned char *waveform,
+  unsigned int num_bytes,
+  wchar_t *audio_type,
+  int rate,
+  int bytes_per_sample,
+  SwiRiffStruct *swichunk,
+  unsigned char **buf,
+  unsigned int *buflen);
+  
+SREC_EVENTLOG_API ESR_ReturnCode readRiff2Buf(
+  FILE *f,
+  void **waveform,
+  unsigned int *num_bytes,
+  const wchar_t **audio_type,
+  SwiRiffStruct *swichunk);
+  
+SREC_EVENTLOG_API int isRiffFile(FILE *fp);
+SREC_EVENTLOG_API void free_swiRiff(SwiRiffStruct *swichunk);
+SREC_EVENTLOG_API char *getSwiRiffKVal(SwiRiffStruct *swichunk, char *key);
+#endif
+
+
+
+
+
+
+
+
+
+
diff --git a/srec/EventLog/src/EventLog.c b/srec/EventLog/src/EventLog.c
new file mode 100644
index 0000000..6760132
--- /dev/null
+++ b/srec/EventLog/src/EventLog.c
@@ -0,0 +1,154 @@
+/*---------------------------------------------------------------------------*
+ *  EventLog.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_EventLog.h"
+#include "SR_EventLogImpl.h"
+#include "pmemory.h"
+#include "plog.h"
+
+
+ESR_ReturnCode SR_EventLogDestroy(SR_EventLog* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
+
+ESR_ReturnCode SR_EventLogToken(SR_EventLog* self, const LCHAR* token, const LCHAR *value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->token(self, token, value);
+}
+
+ESR_ReturnCode SR_EventLogTokenInt(SR_EventLog* self, const LCHAR* token, int value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->tokenInt(self, token, value);
+}
+
+ESR_ReturnCode SR_EventLogTokenUint16_t(SR_EventLog* self, const LCHAR* token, asr_uint16_t value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->tokenUint16_t(self, token, value);
+}
+
+ESR_ReturnCode SR_EventLogTokenSize_t(SR_EventLog* self, const LCHAR* token, size_t value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->tokenSize_t(self, token, value);
+}
+
+ESR_ReturnCode SR_EventLogTokenBool(SR_EventLog* self, const LCHAR* token, ESR_BOOL value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->tokenBool(self, token, value);
+}
+
+ESR_ReturnCode SR_EventLogTokenFloat(SR_EventLog* self, const LCHAR* token, float value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->tokenFloat(self, token, value);
+}
+
+ESR_ReturnCode SR_EventLogEventSession(SR_EventLog* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->eventSession(self);
+}
+
+ESR_ReturnCode SR_EventLogEvent(SR_EventLog* self, const LCHAR *eventName)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->event(self, eventName);
+}
+
+ESR_ReturnCode SR_EventLogAudioOpen(SR_EventLog* self, const LCHAR* audio_type, size_t sample_rate, size_t sample_size)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->audioOpen(self, audio_type, sample_rate, sample_size);
+}
+
+ESR_ReturnCode SR_EventLogAudioClose(SR_EventLog* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->audioClose(self);
+}
+
+ESR_ReturnCode SR_EventLogAudioWrite(SR_EventLog* self, void* buffer, size_t num_bytes)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->audioWrite(self, buffer, num_bytes);
+}
+
+ESR_ReturnCode SR_EventLogAudioGetFilename(SR_EventLog* self, LCHAR* waveformFilename, size_t* len)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->audioGetFilename(self, waveformFilename, len);
+}
diff --git a/srec/EventLog/src/EventLogImpl.c b/srec/EventLog/src/EventLogImpl.c
new file mode 100644
index 0000000..c5150fb
--- /dev/null
+++ b/srec/EventLog/src/EventLogImpl.c
@@ -0,0 +1,805 @@
+/*---------------------------------------------------------------------------*
+ *  EventLogImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifdef ANDROID
+#include <sys/time.h>
+#endif
+
+#include "errno.h"
+#include "ESR_Session.h"
+#include "ESR_SessionType.h"
+#include "IntArrayList.h"
+#include "LCHAR.h"
+#include "PFileSystem.h"
+#include "SR_EventLog.h"
+#include "SR_EventLogImpl.h"
+#include "SR_Session.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "ptimestamp.h"
+#include "riff.h"
+#include "pstdio.h"
+
+#define MTAG NULL
+
+#define localtime_r(clock, result) ((result)->tm_sec = 0, localtime(clock))
+
+
+/*********************************************************************/
+/* move this to portable lib */
+#ifdef _WIN32
+#include <windows.h>
+#include <direct.h>
+#else
+#include <time.h> /* For CLK_TCK / CLOCKS_PER_SEC */
+#include <sys/times.h>  /* for times() */
+#ifndef CLK_TCK
+#define CLK_TCK CLOCKS_PER_SEC
+#endif
+#endif
+
+/**
+ *
+ * @param userTime milliseconds spent in user mode
+ * @param kernelTime milliseconds spent in kernel mode
+ */
+ESR_ReturnCode PGetCPUTimes(long* userTime, long* kernelTime)
+{
+#ifdef _WIN32
+  FILETIME dummy;
+  FILETIME k, u;
+  LARGE_INTEGER lk, lu;
+
+  if ((! userTime) || (! kernelTime))
+    return -1;
+
+  if (GetThreadTimes(GetCurrentThread(), &dummy, &dummy, &k, &u) == ESR_FALSE)
+    return -1;
+
+  lk.LowPart  = k.dwLowDateTime;
+  lk.HighPart = k.dwHighDateTime;
+  *kernelTime = (long)(lk.QuadPart / 10000);
+
+  lu.LowPart  = u.dwLowDateTime;
+  lu.HighPart = u.dwHighDateTime;
+  *userTime   = (long)(lu.QuadPart / 10000);
+
+
+#elif !defined(__vxworks)
+  struct tms timeBuf;
+
+  if ((! userTime) || (! kernelTime))
+    return -1;
+
+  times(&timeBuf);
+  *userTime = (long)timeBuf.tms_utime * 1000 / CLK_TCK;
+  *kernelTime = (long)timeBuf.tms_stime * 1000 / CLK_TCK;
+#endif
+  return 0;
+}
+/*********************************************************************/
+
+ESR_ReturnCode propertyChanged(ESR_SessionTypeListener* self, const LCHAR* name, const void* oldValue, const void* newValue, VariableTypes variableType, void* data)
+{
+  SR_EventLog* eventLog = (SR_EventLog*) data;
+  IntArrayList* list;
+  size_t len, i, lValueSize = 10;
+  int iValue;
+  LCHAR lValue[10];
+  ESR_ReturnCode rc;
+
+  switch (variableType)
+  {
+    case TYPES_INT:
+      CHKLOG(rc, SR_EventLogTokenInt(eventLog, name, *((int*) newValue)));
+      break;
+    case TYPES_UINT16_T:
+      CHKLOG(rc, SR_EventLogTokenUint16_t(eventLog, name, *((asr_uint16_t*) newValue)));
+      break;
+    case TYPES_SIZE_T:
+      CHKLOG(rc, SR_EventLogTokenSize_t(eventLog, name, *((size_t*) newValue)));
+      break;
+    case TYPES_BOOL:
+      CHKLOG(rc, SR_EventLogTokenBool(eventLog, name, *((ESR_BOOL*) newValue)));
+      break;
+    case TYPES_FLOAT:
+      CHKLOG(rc, SR_EventLogTokenFloat(eventLog, name, *((float*) newValue)));
+      break;
+    case TYPES_PLCHAR:
+      CHKLOG(rc, SR_EventLogToken(eventLog, name, (LCHAR*) newValue));
+      break;
+
+    case TYPES_INTARRAYLIST:
+      CHKLOG(rc, ESR_SessionGetProperty(name, (void **)&list, TYPES_INTARRAYLIST));
+      CHKLOG(rc, list->getSize(list, &len));
+      CHKLOG(rc, SR_EventLogTokenInt(eventLog, name, len));
+      for (i = 0; i < len; ++i)
+      {
+        CHKLOG(rc, list->get(list, i, &iValue));
+        lValueSize = sizeof(lValue);
+        CHKLOG(rc, litostr(i, lValue, &lValueSize, 10));
+        CHKLOG(rc, SR_EventLogTokenInt(eventLog, lValue, iValue));
+      }
+      break;
+
+    default:
+      /* do nothing */
+      ;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Implementation copied from original Ian Fox implementation of ALTsleeLog
+ */
+
+ESR_ReturnCode SR_EventLogCreate(SR_EventLog** self)
+{
+  SR_EventLogImpl *impl, *any_existing_eventlog;
+  ESR_ReturnCode rc;
+  LCHAR* dataCaptureDir;
+#define TIMESTAMP_LENGTH 18
+  LCHAR timeStr[TIMESTAMP_LENGTH];
+  struct tm *ct, ct_r;
+  PTimeStamp timestamp;
+#ifdef ANDROID
+  struct timeval dir_stamp;
+#endif
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  any_existing_eventlog = NULL;
+  rc = ESR_SessionGetProperty(L("eventlog"), (void **)&any_existing_eventlog, TYPES_SR_EVENTLOG);
+  if (rc == ESR_SUCCESS && any_existing_eventlog)
+  {
+    *self = (SR_EventLog*)any_existing_eventlog;
+    PLogError("eventlog was already created");
+    return ESR_SUCCESS;
+  }
+
+  impl = NEW(SR_EventLogImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  impl->Interface.destroy = &SR_EventLog_Destroy;
+  impl->Interface.event = &SR_EventLog_Event;
+  impl->Interface.token = &SR_EventLog_Token;
+  impl->Interface.tokenInt = &SR_EventLog_TokenInt;
+  impl->Interface.tokenUint16_t = &SR_EventLog_TokenUint16_t;
+  impl->Interface.tokenSize_t = &SR_EventLog_TokenSize_t;
+  impl->Interface.tokenBool = &SR_EventLog_TokenBool;
+  impl->Interface.tokenFloat = &SR_EventLog_TokenFloat;
+  impl->Interface.eventSession = &SR_EventLogEventSessionImpl;
+  impl->Interface.audioOpen = &SR_EventLog_AudioOpen;
+  impl->Interface.audioClose = &SR_EventLog_AudioClose;
+  impl->Interface.audioWrite = &SR_EventLog_AudioWrite;
+  impl->Interface.audioGetFilename = &SR_EventLog_AudioGetFilename;
+  impl->sessionListenerPair.data = NULL;
+  impl->sessionListenerPair.listener = &impl->sessionListener;
+  impl->sessionListener.propertyChanged = &propertyChanged;
+  impl->waveformCounter = 0;
+  impl->logFile = NULL;
+  impl->tokenBuf[0] = 0;
+  impl->logFile_state = NO_FILE;
+  impl->logLevel = 0;
+  impl->waveformFile = NULL;
+  LSTRCPY(impl->logFilename, L(""));
+
+  CHKLOG(rc, ESR_SessionSetProperty(L("eventlog"), impl, TYPES_SR_EVENTLOG));
+  rc = ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &impl->logLevel);
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    impl->logLevel = 7;
+    CHKLOG(rc, ESR_SessionSetSize_t(L("SREC.Recognizer.osi_log_level"), impl->logLevel));
+  }
+  else if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  if (impl->logLevel > 0)
+  {
+    CHKLOG(rc, ESR_SessionGetProperty(L("cmdline.DataCaptureDirectory"), (void**) &dataCaptureDir, TYPES_PLCHAR));
+
+    LSTRCPY(impl->logFilename, dataCaptureDir);
+#ifdef ANDROID
+/*
+ * The existing functions did not work on the desired platform, hence this code for the device.
+ */
+    gettimeofday ( &dir_stamp, NULL );
+    sprintf(timeStr, "%lu", (unsigned long) dir_stamp.tv_sec );
+#else
+    PTimeStampSet(&timestamp);
+    ct = localtime_r(&timestamp.secs, &ct_r);
+    sprintf(timeStr, "%04d%02d%02d%02d%02d%02d",
+            ct->tm_year + 1900, ct->tm_mon + 1, ct->tm_mday, ct->tm_hour,
+            ct->tm_min, ct->tm_sec);
+#endif
+    /* create capture directory if it doesn't already exist */
+    rc = pf_make_dir (impl->logFilename);
+    if (rc != ESR_SUCCESS && rc != ESR_IDENTIFIER_COLLISION)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+    /* create the directory for today's log if it doesn't already exist */
+    LSTRCAT(impl->logFilename, L("/"));
+    LSTRCAT(impl->logFilename, timeStr);
+/*
+ * There used to be a while forever loop here with a break, but that caused an infinite loop
+ * for the customer. With 1 second resolution, a pre-existing directory probably means a bug.
+ * It's not worth trying to handle this.
+ */
+    rc = pf_make_dir (impl->logFilename);
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+    /* create the log file */
+    LSTRCAT(impl->logFilename, L("/SWIevent-"));
+    LSTRCAT(impl->logFilename, timeStr);
+    LSTRCAT(impl->logFilename, L(".log"));
+
+    impl->logFile = pfopen ( impl->logFilename, L("w") );
+/*    CHKLOG(rc, PFileSystemCreatePFile(impl->logFilename, ESR_TRUE, &impl->logFile));
+    CHKLOG(rc, PFileOpen(impl->logFile, L("w")));*/
+
+    if ( impl->logFile != NULL )
+        impl->logFile_state = FILE_OK;
+    else
+        goto CLEANUP;
+  }
+
+  *self = (SR_EventLog*) impl;
+  return ESR_SUCCESS;
+CLEANUP:
+  if (impl->logFile)
+    pfclose (impl->logFile);
+  return rc;
+}
+
+ESR_ReturnCode SR_EventLog_Destroy(SR_EventLog* self)
+{
+  SR_EventLogImpl* impl = (SR_EventLogImpl*) self;
+  ESR_ReturnCode rc;
+
+  if (impl->logFile_state == FILE_OK)
+  {
+    pfflush(impl->logFile);
+
+    pfclose(impl->logFile);
+    impl->logFile = NULL;
+    impl->logFile_state = NO_FILE;
+  }
+  CHKLOG(rc, ESR_SessionRemoveProperty(L("eventlog")));
+  FREE(impl);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+
+static int quote_delimiter(LCHAR *record, size_t len)
+{
+  LCHAR qrecord[TOK_BUFLEN * 2];
+  LCHAR *s, *d;
+
+  s = record;
+  d = qrecord;
+  while (*s)
+  {
+    if (*s == '|')
+      *d++ = '|';
+    *d++ = *s++;
+  }
+  *d = L('\0');
+
+  if (LSTRLEN(qrecord) >= len)
+    return -1;
+
+  LSTRCPY(record, qrecord);
+
+  return 0;
+}
+
+
+ESR_ReturnCode SR_EventLog_Token(SR_EventLog* self, const LCHAR* token, const LCHAR *value)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl *)self;
+  LCHAR buf[TOK_BUFLEN];
+
+  if (self == NULL || token == NULL || value == NULL)
+    return ESR_INVALID_ARGUMENT;
+  if (impl->logLevel == 0)
+    return ESR_SUCCESS;
+
+  /* token cannot contain '=' */
+  if (LSTRCHR(token, L('=')) != NULL)
+  {
+    PLogError(L("SLEE: Token '%s' contains illegal '=' character"), token);
+    return ESR_INVALID_ARGUMENT;
+  }
+  /* value cannot contain newline */
+  if (value && LSTRCHR(value, L('\n')) != NULL)
+  {
+    PLogError(L("SLEE: Value for token '%s' contains illegal newline character"), token);
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  /* the number 2 in this if statement refers to the '=' and the '|'. */
+  if (LSTRLEN(token) + LSTRLEN(value) + 2 +
+      LSTRLEN(impl->tokenBuf) < MAX_LOG_RECORD)
+  {
+    if (LSTRLEN(token) + LSTRLEN(value) + 3 > TOK_BUFLEN)
+    {
+      PLogError(L("ESR_BUFFER_OVERFLOW: SLEE '|%s=%s'"), token, value);
+      return ESR_BUFFER_OVERFLOW;
+    }
+    sprintf(buf, "%s=%s", token, value);
+    if (quote_delimiter(buf, TOK_BUFLEN - 2) != 0)
+    {
+      PLogError(L("ESR_BUFFER_OVERFLOW: SLEE '|%s'"), buf);
+      return ESR_BUFFER_OVERFLOW;
+    }
+    if (LSTRLEN(buf) + 1 + LSTRLEN(impl->tokenBuf) >= MAX_LOG_RECORD)
+    {
+      PLogError(L("ESR_BUFFER_OVERFLOW: SLEE '|%s'"), buf);
+      return ESR_BUFFER_OVERFLOW;
+    }
+    strcat(impl->tokenBuf, "|");
+    strcat(impl->tokenBuf, buf);
+  }
+  else
+  {
+    PLogError(L("ESR_BUFFER_OVERFLOW: SLEE '|%s=%s'"), token, value);
+    return ESR_BUFFER_OVERFLOW;
+  }
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_EventLog_TokenInt(SR_EventLog* self, const LCHAR* token, int value)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl *)self;
+  ESR_ReturnCode rc;
+  LCHAR alpha[MAX_INT_DIGITS+1];
+  size_t size = MAX_INT_DIGITS+1;
+
+  if (impl->logLevel == 0)
+    return ESR_SUCCESS;
+  CHK(rc, litostr(value, alpha, &size, 10));
+  return self->token(self, token, alpha);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_EventLog_TokenUint16_t(SR_EventLog* self, const LCHAR* token, asr_uint16_t value)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl *)self;
+  ESR_ReturnCode rc;
+  LCHAR alpha[MAX_INT_DIGITS+1];
+  size_t size = MAX_INT_DIGITS+1;
+
+  if (impl->logLevel == 0)
+    return ESR_SUCCESS;
+  CHK(rc, lultostr(value, alpha, &size, 10));
+  return self->token(self, token, alpha);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_EventLog_TokenSize_t(SR_EventLog* self, const LCHAR* token, size_t value)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl *)self;
+  ESR_ReturnCode rc;
+  LCHAR alpha[MAX_UINT_DIGITS+1];
+  size_t size = MAX_INT_DIGITS+1;
+
+  if (impl->logLevel == 0)
+    return ESR_SUCCESS;
+  CHK(rc, lultostr(value, alpha, &size, 10));
+  return self->token(self, token, alpha);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_EventLog_TokenBool(SR_EventLog* self, const LCHAR* token, ESR_BOOL value)
+{
+  if (value)
+    return self->token(self, token, L("TRUE"));
+  else
+    return self->token(self, token, L("FALSE"));
+}
+
+ESR_ReturnCode SR_EventLog_TokenFloat(SR_EventLog* self, const LCHAR* token, float value)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl *)self;
+  LCHAR alpha[MAX_INT_DIGITS+1];
+
+  if (impl->logLevel == 0)
+    return ESR_SUCCESS;
+  sprintf(alpha, "%.2f", value);
+  return self->token(self, token, alpha);
+}
+
+ESR_ReturnCode logIt(SR_EventLogImpl *impl, LCHAR* evtt, LCHAR* log_record, size_t* writtenSize)
+{
+  struct tm *ct, ct_r;
+  LCHAR header[128], header2[64];
+  PTimeStamp timestamp;
+  static size_t sizeof_LCHAR = sizeof(LCHAR);
+  static LCHAR* bar = "|";
+  static LCHAR* nl = "\n";
+  size_t i, len;
+  LCHAR* toWrite[5];
+
+  toWrite[0] = header;
+  toWrite[1] = bar;
+  toWrite[2] = evtt;
+  toWrite[3] = log_record;
+  toWrite[4] = nl;
+
+  ct = &ct_r;
+  memset(ct, 0, sizeof(struct tm));
+
+  switch (impl->logFile_state)
+  {
+    case FILE_OK:
+    case SPACE_SETTING:
+      PTimeStampSet(&timestamp);
+      ct = localtime_r(&timestamp.secs, &ct_r);
+
+      sprintf(header, "TIME=%04d%02d%02d%02d%02d%02d%03d",
+              ct->tm_year + 1900, ct->tm_mon + 1, ct->tm_mday, ct->tm_hour,
+              ct->tm_min, ct->tm_sec, timestamp.msecs);
+      quote_delimiter(header, 128);
+
+      sprintf(header2, "CHAN=%s", L("0")); /* default is channel 0 in ESR */
+      quote_delimiter(header2, 128);
+
+      LSTRCAT(header, bar);
+      LSTRCAT(header, header2);
+
+      /* write the header,bar,evtt, and record */
+      for (*writtenSize = 0, i = 0; i < 5; i++)
+      {
+        len = LSTRLEN(toWrite[i]);
+        if (pfwrite(toWrite[i], sizeof_LCHAR, len, impl->logFile))
+          *writtenSize += len;
+      }
+
+      if (*writtenSize <= 0)
+      {
+        PLogError(L("Could not write to log file; logging halted"));
+        impl->logFile_state = FILE_ERROR;
+        break;
+      }
+      else
+      {
+        pfflush(impl->logFile);
+      }
+
+      break;
+
+      /* If couldn't open file or error previously, just return */
+    case UNINITIALIZED:
+    case NO_FILE:
+    case FILE_ERROR:
+    case SEEK_ERROR:
+    default:
+      return ESR_INVALID_STATE;
+
+  }
+
+  return ESR_SUCCESS;
+}
+
+
+ESR_ReturnCode SR_EventLog_Event(SR_EventLog* self, const LCHAR* event)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl *)self;
+  ESR_ReturnCode rc;
+  long userTime, kernelTime;
+  long cpuTime;
+  LCHAR buf[P_PATH_MAX];  /* allow space for EVNT=<blah> */
+  size_t writtenSize;
+
+  if (impl == NULL || event == NULL)
+    return ESR_INVALID_ARGUMENT;
+  if (impl->logLevel == 0)
+    return ESR_SUCCESS;
+
+  /* event cannot contain '=' */
+  if (LSTRCHR(event, L('=')) != NULL)
+  {
+    PLogError(L("SLEE: SR_EventLog_Event: warning: "
+                "SR_EventLog_Event failed.  Event '%s' contains illegal '=' "
+                "character\n"), event);
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  CHKLOG(rc, PGetCPUTimes(&userTime, &kernelTime));
+
+  if (!LSTRCMP(event, "SWIrcst"))
+  {
+    impl->serviceStartUserCPU = userTime;
+    impl->serviceStartKernelCPU = kernelTime;
+  }
+
+  LSTRCPY(buf, event);
+  if (quote_delimiter(buf, LSTRLEN(buf) + 1) != 0)
+  {
+    PLogError(L("ESR_BUFFER_OVERFLOW: '%s' exceeds 8 characters when '|' characters are quoted"), buf);
+    return ESR_BUFFER_OVERFLOW;
+  }
+
+  /* if this event is an end-of-recognition event then check to see if we
+     want to capture this waveform. */
+
+  if (!LSTRCMP(event, "SWIrcnd"))
+  {
+    /* what to do ??? ALTsleeLogCheckWaveCapture(data); */
+  }
+
+  cpuTime = userTime - impl->serviceStartUserCPU;
+  SR_EventLogTokenInt(self, L("UCPU"), cpuTime);
+  cpuTime = kernelTime - impl->serviceStartKernelCPU;
+  SR_EventLogTokenInt(self, L("SCPU"), cpuTime);
+
+
+  sprintf(buf, "EVNT=%s", event);
+  /* This call will set writtenSize to be some value >= 0 */
+  logIt(impl, buf, impl->tokenBuf, &writtenSize);
+  impl->tokenBuf[0] = 0;
+
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode writeRiffHeader(SR_EventLog* self)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl *)self;
+  unsigned int total_buflen;
+  int num_samples;
+  unsigned int bytes_sec;
+
+  RiffHeaderStruct header;
+
+  num_samples = impl->waveform_num_bytes / impl->waveform_bytes_per_sample;
+
+  strncpy(header.riffString, "RIFF", 4);
+  strncpy(header.waveString, "WAVE", 4);
+  strncpy(header.fmtString, "fmt ", 4);
+  strncpy(header.dataString, "data", 4);
+
+  total_buflen = sizeof(RiffHeaderStruct) + impl->waveform_num_bytes;
+  bytes_sec = impl->waveform_sample_rate * impl->waveform_bytes_per_sample;
+
+  header.riffChunkLength = total_buflen - sizeof(ChunkInfoStruct);
+  header.fmtChunkLength = sizeof(WaveFormat);
+  header.waveinfo.nFormatTag = WAVEFORMAT_PCM;  /* codec */
+  header.waveinfo.nChannels = 1;
+  header.waveinfo.nSamplesPerSec = impl->waveform_sample_rate;
+  header.waveinfo.nAvgBytesPerSec = bytes_sec;
+  header.waveinfo.nBlockAlign = (unsigned short) impl->waveform_bytes_per_sample;
+  header.waveinfo.wBitsPerSample = (unsigned short)((bytes_sec * 8) / impl->waveform_sample_rate);
+  header.dataLength = (unsigned int) impl->waveform_num_bytes;
+
+  pfseek(impl->waveformFile, 0, SEEK_SET);
+
+  /* RiffHeaderStruct */
+  pfwrite(&header.riffString, 1, sizeof(header.riffString), impl->waveformFile);
+  pfwrite(&header.riffChunkLength, sizeof(header.riffChunkLength), 1, impl->waveformFile);
+  pfwrite(&header.waveString, 1, sizeof(header.waveString), impl->waveformFile);
+  pfwrite(&header.fmtString, 1, sizeof(header.fmtString), impl->waveformFile);
+  pfwrite(&header.fmtChunkLength, sizeof(header.fmtChunkLength), 1, impl->waveformFile);
+
+  /* WaveFormat */
+  pfwrite(&header.waveinfo.nFormatTag, sizeof(header.waveinfo.nFormatTag), 1, impl->waveformFile);
+  pfwrite(&header.waveinfo.nChannels, sizeof(header.waveinfo.nChannels), 1, impl->waveformFile);
+  pfwrite(&header.waveinfo.nSamplesPerSec, sizeof(header.waveinfo.nSamplesPerSec), 1, impl->waveformFile);
+  pfwrite(&header.waveinfo.nAvgBytesPerSec, sizeof(header.waveinfo.nAvgBytesPerSec), 1, impl->waveformFile);
+  pfwrite(&header.waveinfo.nBlockAlign, sizeof(header.waveinfo.nBlockAlign), 1, impl->waveformFile);
+  pfwrite(&header.waveinfo.wBitsPerSample, sizeof(header.waveinfo.wBitsPerSample), 1, impl->waveformFile);
+
+  /* Continuation of RiffHeaderStruct */
+  pfwrite(&header.dataString, 1, sizeof(header.dataString), impl->waveformFile);
+  pfwrite(&header.dataLength, sizeof(header.dataLength), 1, impl->waveformFile);
+
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_EventLog_AudioOpen(SR_EventLog* self, const LCHAR* audio_type, size_t sample_rate, size_t sample_size)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl*) self;
+  LCHAR *p;
+
+  LSTRCPY(impl->waveformFilename, impl->logFilename);
+  p = LSTRSTR(impl->waveformFilename, L(".log"));
+  if (p == NULL)
+  {
+    PLogError(L("ESR_OPEN_ERROR: %s"), impl->waveformFilename);
+    return ESR_OPEN_ERROR;
+  }
+  *p = 0; /* trunc the name */
+
+  psprintf(impl->waveformFilename, L("%s-%04lu.wav"), impl->waveformFilename, (unsigned long) ++impl->waveformCounter);
+
+  impl->waveformFile = pfopen ( impl->waveformFilename, L("wb+") );
+
+  if (impl->waveformFile == NULL)
+  {
+    PLogError(L("ESR_OPEN_ERROR: %s"), impl->waveformFilename);
+    return ESR_OPEN_ERROR;
+  }
+  impl->waveform_num_bytes = 0;
+  impl->waveform_bytes_per_sample = sample_size;
+  impl->waveform_sample_rate = sample_rate;
+  return writeRiffHeader(self);
+}
+
+ESR_ReturnCode SR_EventLog_AudioClose(SR_EventLog* self)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl*) self;
+  ESR_ReturnCode rc;
+
+  /* impl->waveform_num_bytes has likely grown so we need to update the header before closing the file */
+  CHKLOG(rc, writeRiffHeader(self));
+  if (pfclose(impl->waveformFile))
+  {
+    rc = ESR_CLOSE_ERROR;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  impl->waveformFile = NULL;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_EventLog_AudioWrite(SR_EventLog* self, void* buffer, size_t num_bytes)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl*) self;
+  ESR_ReturnCode rc;
+  size_t size = num_bytes / impl->waveform_bytes_per_sample;
+
+  if (num_bytes > 0 && pfwrite(buffer, impl->waveform_bytes_per_sample, size, impl->waveformFile) != size)
+  {
+    LCHAR cwd[P_PATH_MAX];
+    size_t len;
+
+    len = P_PATH_MAX;
+    CHKLOG(rc, pf_get_cwd (cwd, &len));
+    PLogError(L("ESR_WRITE_ERROR: %s, cwd=%s"), impl->waveformFilename, cwd);
+    return ESR_WRITE_ERROR;
+  }
+
+  impl->waveform_num_bytes += num_bytes;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_EventLog_AudioGetFilename(SR_EventLog* self, LCHAR* waveformFilename, size_t* len)
+{
+  SR_EventLogImpl *impl = (SR_EventLogImpl*) self;
+
+  if (waveformFilename == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  if (*len < LSTRLEN(impl->waveformFilename))
+  {
+    PLogError(L("ESR_BUFFER_OVERFLOW"));
+    return ESR_BUFFER_OVERFLOW;
+  }
+
+  LSTRCPY(waveformFilename, impl->waveformFilename);
+  *len = LSTRLEN(waveformFilename);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_EventLogEventSessionImpl(SR_EventLog* self)
+{
+  size_t size, i, j;
+  ESR_ReturnCode rc;
+  LCHAR* key;
+  LCHAR lValue[256];
+  int iValue;
+  float fValue;
+  size_t size_tValue;
+  asr_uint16_t asr_uint16_tValue;
+  ESR_BOOL bValue;
+  IntArrayList* list;
+  VariableTypes type;
+  size_t lValueSize = 256;
+  size_t len;
+
+  CHKLOG(rc, ESR_SessionGetSize(&size));
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, ESR_SessionGetKeyAtIndex(i, &key));
+    CHKLOG(rc, ESR_SessionGetPropertyType(key, &type));
+
+    switch (type)
+    {
+      case TYPES_INT:
+        CHKLOG(rc, ESR_SessionGetInt(key, &iValue));
+        CHKLOG(rc, SR_EventLogTokenInt(self, key, iValue));
+        break;
+      case TYPES_UINT16_T:
+        CHKLOG(rc, ESR_SessionGetUint16_t(key, &asr_uint16_tValue));
+        CHKLOG(rc, SR_EventLogTokenUint16_t(self, key, asr_uint16_tValue));
+        break;
+      case TYPES_SIZE_T:
+        CHKLOG(rc, ESR_SessionGetSize_t(key, &size_tValue));
+        CHKLOG(rc, SR_EventLogTokenSize_t(self, key, size_tValue));
+        break;
+      case TYPES_BOOL:
+        CHKLOG(rc, ESR_SessionGetBool(key, &bValue));
+        CHKLOG(rc, SR_EventLogTokenBool(self, key, bValue));
+        break;
+      case TYPES_FLOAT:
+        CHKLOG(rc, ESR_SessionGetFloat(key, &fValue));
+        CHKLOG(rc, SR_EventLogTokenFloat(self, key, fValue));
+        break;
+      case TYPES_PLCHAR:
+        len = 256;
+        CHKLOG(rc, ESR_SessionGetLCHAR(key, (LCHAR*) &lValue, &len));
+        CHKLOG(rc, SR_EventLogToken(self, key, (LCHAR*) lValue));
+        break;
+
+      case TYPES_INTARRAYLIST:
+        CHKLOG(rc, ESR_SessionGetProperty(key, (void **)&list, TYPES_INTARRAYLIST));
+        CHKLOG(rc, list->getSize(list, &len));
+        CHKLOG(rc, SR_EventLogTokenInt(self, key, len));
+        for (j = 0; j < len; ++j)
+        {
+          CHKLOG(rc, list->get(list, j, &iValue));
+          lValueSize = sizeof(lValue);
+          CHKLOG(rc, litostr(j, lValue, &lValueSize, 10));
+          CHKLOG(rc, SR_EventLogTokenInt(self, lValue, iValue));
+        }
+        break;
+
+      default:
+        /* do nothing */
+        ;
+    }
+  }
+  CHKLOG(rc, SR_EventLogEvent(self, L("ESRsession")));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/srec/EventLog/src/riff.c b/srec/EventLog/src/riff.c
new file mode 100644
index 0000000..93ca930
--- /dev/null
+++ b/srec/EventLog/src/riff.c
@@ -0,0 +1,1107 @@
+/*---------------------------------------------------------------------------*
+ *  riff.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "plog.h"
+#include "riff.h"
+
+#define MTAG NULL
+
+typedef struct ChunkContext_t
+{
+  char tag[4];
+  long  start;
+  int  length;
+}
+ChunkContext;
+
+typedef enum
+{
+  FIND_RIFF,
+  FIND_CHUNK,
+  FIND_LIST
+} DescendType;
+
+int isLittleEndian()
+{
+  char b[4];
+  
+  *(int *)b = 1;
+  return (int)b[0];
+}
+
+/* waveReadFunc
+ * - converts data to an array of signed shorts
+ * - fills in *length with the number of samples converted
+ * - allocates memory for *samples
+ * - returns GS_OK if conversion was successful or GS_ERROR and an error
+ *    message in res if not.  If the conversion fails the function must free
+ *    all the memory it had allocated before returning.
+ * On entry
+ *  wf   - points to the WaveFormat structure that describes the data format
+ *  cb   - data read from the RIFF file
+ *  data - descriptor for the "data" chunk
+ */
+typedef ESR_ReturnCode(waveReadFunc)(WaveFormat *wf, ChunkContext *data,
+                                     char *cb, short **samples, int *length, int doSwap);
+                                     
+static ESR_ReturnCode readPCMWave(WaveFormat *wf, ChunkContext *data,
+                                  char *cb, short **samples, int *length, int doSwap);
+static ESR_ReturnCode readMulawWave(WaveFormat *wf, ChunkContext *data,
+                                    char *cb, short **samples, int *length, int doSwap);
+static ESR_ReturnCode readAlawWave(WaveFormat *wf, ChunkContext *data,
+                                   char *cb, short **samples, int *length, int doSwap);
+                                   
+static struct
+{
+  int id;
+  waveReadFunc *func;
+}
+WaveCodecs[] = {
+                 {WAVEFORMAT_PCM, readPCMWave},
+                 {WAVEFORMAT_MULAW, readMulawWave},
+                 {WAVEFORMAT_ALAW, readAlawWave},
+                 {0, 0},
+               };
+               
+/************* FIXME: regroup all swap routines outahere;
+ *                    ditto for audio conversion routines
+ */
+
+static void swapInt(int *i)
+{
+  char *a = (char *)i, t;
+  t = a[0];
+  a[0] = a[3];
+  a[3] = t;
+  t = a[1];
+  a[1] = a[2];
+  a[2] = t;
+}
+
+static void swapShort(short *s)
+{
+  char *a = (char *)s, t;
+  t = a[0];
+  a[0] = a[1];
+  a[1] = t;
+}
+
+static int swapConstInt(const int value)
+{
+  int converted = value;
+  unsigned char *cp = (unsigned char *) & converted;
+  
+  *cp ^= *(cp + 3);
+  *(cp + 3) ^= *cp;
+  *cp ^= *(cp + 3);
+  *(cp + 1) ^= *(cp + 2);
+  *(cp + 2) ^= *(cp + 1);
+  *(cp + 1) ^= *(cp + 2);
+  
+  return converted;
+}
+
+static short swapConstShort(const short value)
+{
+  short converted = value;
+  unsigned char *cp = (unsigned char *) & converted;
+  unsigned char tmp = *cp;
+  
+  *cp = *(cp + 1);
+  *++cp = tmp;
+  
+  return converted;
+}
+
+/* len == number of bytes to swap
+ */
+static void short_byte_swap(short *buf, int len)
+{
+  char *cp, *end, tmp;
+  
+  end = ((char *)buf) + (len << 1);
+  for (cp = (char *)buf; cp < end; cp++)
+  {
+    tmp = *cp;
+    *cp = *(cp + 1);
+    *++cp = tmp;
+  }
+}
+
+/* len == number of bytes to swap
+ */
+static void int_byte_swap(int *buf, int len)
+{
+  char *cp, *end;
+  
+  end = ((char *)buf) + (len << 2);
+  for (cp = (char *)buf; cp < end; cp += 4)
+  {
+    *cp ^= *(cp + 3);
+    *(cp + 3) ^= *cp;
+    *cp ^= *(cp + 3);
+    *(cp + 1) ^= *(cp + 2);
+    *(cp + 2) ^= *(cp + 1);
+    *(cp + 1) ^= *(cp + 2);
+  }
+}
+
+static void swapWaveFormat(WaveFormat *wf)
+{
+  swapShort(&wf->nFormatTag);
+  swapShort(&wf->nChannels);
+  swapInt(&wf->nSamplesPerSec);
+  swapInt(&wf->nAvgBytesPerSec);
+  swapShort(&wf->nBlockAlign);
+  swapShort(&wf->wBitsPerSample);
+  //swapShort(&wf->cbSize);
+}
+
+static int ulaw2linear(unsigned char ulawbyte)
+{
+  static int exp_lut[8] =
+    {
+      0, 132, 396, 924, 1980, 4092, 8316, 16764
+    };
+  int sign, exponent, mantissa, sample;
+  
+  ulawbyte = ~ulawbyte;
+  sign = (ulawbyte & 0x80);
+  exponent = (ulawbyte >> 4) & 0x07;
+  mantissa = ulawbyte & 0x0F;
+  sample = exp_lut[exponent] + (mantissa << (exponent + 3));
+  if (sign != 0) sample = -sample;
+  return sample;
+}
+
+static int alaw2linear(unsigned char alawbyte)
+{
+
+  int sign, achord, astep, delta, sample;
+  unsigned char alawcode;
+  static int exp_lut[8] =
+    {
+      1, 1, 2, 4, 8, 16, 32, 64
+    };
+  alawcode = alawbyte ^ 0x55;
+  sign = (alawcode & 0x80);
+  achord = (alawcode >> 4) & 0x07;
+  astep = alawcode & 0x0F;
+  delta = ((achord == 0) ? 1 : 0);
+  sample = ((2 * astep + 33) * exp_lut[achord]) - 32 * delta;
+  if (sign != 0) sample = -sample;
+  sample = sample * 8;
+  
+  return sample;
+}
+
+/* Converts PCM wave data
+ *  cb: input :1
+
+ */
+static ESR_ReturnCode readPCMWave(WaveFormat *wf, ChunkContext *data,
+                                  char *cb, short **samples, int *length, int doSwap)
+{
+  int i;
+  if (wf->nChannels != 1)
+  {
+    //GS_SetResult(res,"PCM WAVE file contains more than one data channel",
+    //GS_STATIC);
+    return ESR_FATAL_ERROR;
+  }
+  if (wf->wBitsPerSample != 16 && wf->wBitsPerSample != 8)
+  {
+    //GS_SetResult(res,GS_Spf(0,"%d bits per sample PCM format not supported",
+    //wf->wBitsPerSample),GS_VOLATILE);
+    return ESR_FATAL_ERROR;
+  }
+  *length = data->length * 8 / wf->wBitsPerSample;
+  *samples = MALLOC(*length * sizeof(short), MTAG);
+  if (wf->wBitsPerSample == 16)
+  {
+    memcpy(*samples, cb, *length*sizeof(short));
+    if (doSwap)
+      for (i = 0;i < *length;i++) swapShort(*samples + i);
+  }
+  else
+  {
+    for (i = 0;i < *length;i++)(*samples)[i] = (short)((unsigned)(cb[i]) - 128) << 8;
+  }
+  return ESR_SUCCESS;
+}
+
+/* Converts CCITT u-law wave data
+ */
+static ESR_ReturnCode readMulawWave(WaveFormat *wf, ChunkContext *data,
+                                    char *cb, short **samples, int *length, int doSwap)
+{
+  int i;
+  if (wf->nChannels != 1)
+  {
+    //GS_SetResult(res,"u-law WAVE file contains more than one data channel",
+    //GS_STATIC);
+    return ESR_FATAL_ERROR;
+  }
+  if (wf->wBitsPerSample != 8)
+  {
+    //GS_SetResult(res,GS_Spf(0,"%d bits per sample u-law format not supported",
+    //wf->wBitsPerSample),GS_VOLATILE);
+    return ESR_FATAL_ERROR;
+  }
+  *length = data->length;
+  *samples = MALLOC(*length * sizeof(short), MTAG);
+  for (i = 0;i < *length;i++)
+    (*samples)[i] = (short) ulaw2linear(cb[i]);
+  return ESR_SUCCESS;
+}
+
+/* Converts a-law wave data
+ */
+static ESR_ReturnCode readAlawWave(WaveFormat *wf, ChunkContext *data,
+                                   char *cb, short **samples, int *length, int doSwap)
+{
+  int i;
+  if (wf->nChannels != 1)
+  {
+    //GS_SetResult(res,"u-law WAVE file contains more than one data channel",
+    //GS_STATIC);
+    return ESR_FATAL_ERROR;
+  }
+  if (wf->wBitsPerSample != 8)
+  {
+    //GS_SetResult(res,GS_Spf(0,"%d bits per sample u-law format not supported",
+    //wf->wBitsPerSample),GS_VOLATILE);
+    return ESR_FATAL_ERROR;
+  }
+  *length = data->length;
+  samples = MALLOC(*length * sizeof(short), MTAG);
+  for (i = 0;i < *length;i++)(*samples)[i] = alaw2linear(cb[i]);
+  return ESR_SUCCESS;
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* RIFF INTERFACE UTILS  */
+
+void free_swiRiff(SwiRiffStruct *swichunk)
+{
+  if (swichunk->segs.num_tuples)
+  {
+    FREE(swichunk->segs.tuples);
+    swichunk->segs.num_tuples = 0;
+  }
+  if (swichunk->kvals.num_pairs)
+  {
+    FREE(swichunk->kvals.kvpairs[0].key);
+    FREE(swichunk->kvals.kvpairs);
+    swichunk->kvals.num_pairs = 0;
+  }
+}
+
+char *getSwiRiffKVal(SwiRiffStruct *swichunk, char *key)
+{
+  int i;
+  
+  for (i = 0; i < swichunk->kvals.num_pairs; i++)
+    if (! strcmp(swichunk->kvals.kvpairs[i].key, key))
+      return swichunk->kvals.kvpairs[i].value;
+      
+  return NULL;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int riffDescend(FILE *f, ChunkContext *c, ChunkContext *parent, DescendType t, int doSwap)
+{
+  char form[4], tag[4];
+  int len;
+  long start, end;
+  
+  end = 0;
+  if (!parent) start = 0;
+  else
+  {
+    start = parent->start;
+    end = start + parent->length;
+  }
+  if (fseek(f, start, SEEK_SET) < 0)
+  {
+    //GS_SetResult(res,"seek failed",GS_STATIC);
+    return ESR_FATAL_ERROR;
+  }
+  
+  switch (t)
+  {
+  
+    case FIND_RIFF:
+      while (1)
+      {
+        if (fread(form, 1, 4, f) != 4) break;
+        if (fread(&len, sizeof(int), 1, f) != 1)
+          return ESR_FATAL_ERROR;
+        if (doSwap)
+          swapInt(&len);
+        if (strncmp(form, "RIFF", 4))
+        {  /* skip this non-RIFF chunk */
+          if (fseek(f, (long)len, SEEK_CUR) < 0) break;
+          start += len + 8;
+          if (end && start >= end)
+          {
+            //GS_SetResult(res,"RIFF form type not found",GS_STATIC);
+            return ESR_FATAL_ERROR;
+          }
+          continue;
+        }
+        if (fread(tag, 1, 4, f) != 4) break;
+        if (!strncmp(tag, c->tag, 4))
+        {
+          c->start = start + 12;
+          c->length = len - 4;
+          return ESR_SUCCESS;
+        }
+      }
+      //if(feof(f)) GS_SetResult(res,"RIFF form type not found",GS_STATIC);
+      //else GS_SetResult(res,"Corrupt RIFF file",GS_STATIC);
+      return ESR_FATAL_ERROR;
+      
+    case FIND_CHUNK:
+      while (1)
+      {
+        if (fread(tag, 1, 4, f) != 4) break;
+        if (fread(&len, sizeof(int), 1, f) != 1)
+          return ESR_FATAL_ERROR;
+        if (doSwap)
+          swapInt(&len);
+        if (!strncmp(tag, c->tag, 4))
+        {
+          c->start = start + 8;
+          c->length = len;
+          return ESR_SUCCESS;
+        }
+        if (fseek(f, (long)len, SEEK_CUR) < 0) break;
+        start += len + 8;
+        if (end && start >= end)
+        {
+          //GS_SetResult(res,"RIFF chunk not found",GS_STATIC);
+          return ESR_FATAL_ERROR;
+        }
+      }
+      //if(feof(f)) GS_SetResult(res,"RIFF chunk not found",GS_STATIC);
+      //else GS_SetResult(res,"corrupt RIFF file",GS_STATIC);
+      return ESR_FATAL_ERROR;
+      
+    case FIND_LIST:
+      while (1)
+      {
+        if (fread(form, 1, 4, f) != 4) break;
+        if (fread(&len, sizeof(int), 1, f) != 1)
+          return ESR_FATAL_ERROR;
+        if (doSwap)
+          swapInt(&len);
+        if (strncmp(form, "LIST", 4))
+        {  /* skip this non-LIST chunk */
+          if (fseek(f, (long)len, SEEK_CUR) < 0) break;
+          start += len + 8;
+          if (end && start >= end)
+          {
+            //GS_SetResult(res,"RIFF form type not found",GS_STATIC);
+            return ESR_FATAL_ERROR;
+          }
+          continue;
+        }
+        if (fread(tag, 1, 4, f) != 4) break;
+        if (!strncmp(tag, c->tag, 4))
+        {
+          c->start = start + 12;
+          c->length = len - 4;
+          return ESR_SUCCESS;
+        }
+      }
+      
+      //if(feof(f)) GS_SetResult(res,"RIFF form type not found",GS_STATIC);
+      //else GS_SetResult(res,"Corrupt RIFF file",GS_STATIC);
+      return ESR_FATAL_ERROR;
+  }
+  
+  //GS_AppendResult(res,"bad search flag",GS_STATIC);
+  return ESR_FATAL_ERROR;
+}
+
+static int riffAscend(FILE *f, ChunkContext *c)
+{
+  if (fseek(f, c->start + c->length, SEEK_SET) < 0)
+  {
+    //GS_SetResult(res,"seek failed",GS_STATIC);
+    return ESR_FATAL_ERROR;
+  }
+  return ESR_SUCCESS;
+}
+
+
+static ESR_ReturnCode readSwiChunk(FILE *f,  ChunkContext *parent, SwiRiffStruct *swichunk, int doSwap)
+{
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  ChunkContext chunk, list_chunk;
+  int sub_length;
+  swichunk->segs.num_tuples = 0;
+  swichunk->kvals.num_pairs = 0;
+  
+  strncpy(chunk.tag, "swi ", 4);
+  if (riffDescend(f, &chunk, parent, FIND_LIST, doSwap) == ESR_SUCCESS)
+  {
+    /* is it as "swi " list? */
+    strncpy(list_chunk.tag, "segs", 4);
+    if (riffDescend(f, &list_chunk, &chunk, FIND_CHUNK, doSwap) == ESR_SUCCESS)
+    {
+      fread(&swichunk->segs.num_tuples, 1, sizeof(int), f);
+      if (doSwap) swapInt(&swichunk->segs.num_tuples);
+      
+      sub_length = list_chunk.length - sizeof(int);
+      if (sub_length)
+      {
+        swichunk->segs.tuples = MALLOC(sub_length, MTAG);
+        if (!swichunk->segs.tuples)
+        {
+          swichunk->segs.num_tuples = 0;  /* so that the free routine will work */
+          rc = ESR_OUT_OF_MEMORY;
+        }
+        else if (fread(swichunk->segs.tuples, 1, sub_length, f) != (size_t)sub_length)
+        {
+          rc = ESR_FATAL_ERROR;
+        }
+        if (rc != ESR_SUCCESS)
+          goto swichunk_cleanup;
+          
+      }
+      else
+        swichunk->segs.tuples = NULL;
+    }
+    strncpy(list_chunk.tag, "kvs ", 4);
+    /* start searching from after "swi" */
+    if (riffDescend(f, &list_chunk, &chunk, FIND_CHUNK, doSwap) == ESR_SUCCESS)
+    {
+      int i, num_pairs;
+      
+      fread(&num_pairs, 1, sizeof(int), f);
+      if (doSwap) swapInt(&num_pairs);
+      swichunk->kvals.num_pairs = num_pairs;
+      
+      sub_length = list_chunk.length - sizeof(int);
+      if (sub_length)
+      {
+        char *kvpair_buf = NULL;
+        RiffKVPair *pairs;
+        
+        swichunk->kvals.kvpairs = (RiffKVPair *)CALLOC(num_pairs, sizeof(RiffKVPair), MTAG);
+        kvpair_buf = CALLOC(sub_length, sizeof(char), MTAG);
+        if (!swichunk->kvals.kvpairs || !kvpair_buf)
+        {
+          if (kvpair_buf) FREE(kvpair_buf);
+          if (swichunk->kvals.kvpairs) FREE(swichunk->kvals.kvpairs);
+          swichunk->kvals.num_pairs = 0;
+          rc = ESR_OUT_OF_MEMORY;
+          goto swichunk_cleanup;
+        }
+        
+        swichunk->kvals.kvpairs[0].key = kvpair_buf;
+        if (fread(kvpair_buf, 1, sub_length, f) != (size_t)sub_length)
+        {
+          rc = ESR_FATAL_ERROR;
+          goto swichunk_cleanup;
+        }
+        for (pairs = swichunk->kvals.kvpairs, i = 0; i < swichunk->kvals.num_pairs; i++, pairs++)
+        {
+          pairs->key = kvpair_buf;
+          kvpair_buf +=  strlen(kvpair_buf) + 1;
+          pairs->value = kvpair_buf;
+          kvpair_buf +=  strlen(kvpair_buf) + 1;
+        }
+      }
+      else
+        swichunk->kvals.kvpairs = NULL;
+    }
+  }
+  /* no matter what was found or not found, return with the file pointer in
+   * the state that it was upon entering this function */
+  if (riffAscend(f, parent) != ESR_SUCCESS)
+  {
+    rc = ESR_FATAL_ERROR;
+    goto swichunk_cleanup;
+  }
+  
+swichunk_cleanup:
+  if (rc == ESR_FATAL_ERROR) free_swiRiff(swichunk);
+  return rc;
+}
+
+
+/* Reads RIFF format WAVE files
+ */
+ESR_ReturnCode riffReadWave2L16(FILE *f, double from, double to,
+                                short **samples, int *rate, int *length, SwiRiffStruct *swichunk)
+{
+  ChunkContext chunk, parent;
+  WaveFormat *wf;
+  char *cb;
+  ESR_ReturnCode rc;
+  int i, ifrom, ito;
+  int doSwap = ! isLittleEndian();
+  
+  /* find the WAVE chunk */
+  strncpy(parent.tag, "WAVE", 4);
+  if (riffDescend(f, &parent, NULL, FIND_RIFF, doSwap) != ESR_SUCCESS)
+  {
+    //GS_AppendResult(res,"\nnot a RIFF waveform audio file",NULL);
+    return ESR_FATAL_ERROR;
+  }
+  
+  /* Wave format */
+  strncpy(chunk.tag, "fmt ", 4);
+  if (riffDescend(f, &chunk, &parent, FIND_CHUNK, doSwap) != ESR_SUCCESS)
+  {
+    //GS_AppendResult(res,"\nwaveform audio file has no \"fmt \" chunk.",NULL);
+    return ESR_FATAL_ERROR;
+  }
+  if (chunk.length < sizeof(WaveFormat))
+    wf = MALLOC(sizeof(WaveFormat), MTAG);
+  else
+    wf = MALLOC(chunk.length, MTAG);
+    
+  if (fread(wf, 1, chunk.length, f) != (size_t)chunk.length)
+  {
+    FREE((char *)wf);
+    //GS_SetResult(res,"fmt chunk read failed.",GS_STATIC);
+    return ESR_FATAL_ERROR;
+  }
+  if (doSwap) swapWaveFormat(wf);
+  *rate = wf->nSamplesPerSec;
+  
+  /* data chunk */
+  if (riffAscend(f, &chunk) != ESR_SUCCESS)
+  {
+    return ESR_FATAL_ERROR;
+  }
+  strncpy(chunk.tag, "data", 4);
+  if (riffDescend(f, &chunk, &parent, FIND_CHUNK, doSwap) != ESR_SUCCESS)
+  {
+    //GS_AppendResult(res,"\nwaveform audio file has no \"data\" chunk.",NULL);
+    return ESR_FATAL_ERROR;
+  }
+  cb = MALLOC(chunk.length, MTAG); /* waveform */
+  if (fread(cb, 1, chunk.length, f) != (size_t)chunk.length)
+  {
+    FREE((char *)wf);
+    FREE((char *)cb);
+    //GS_SetResult(res,"truncated \"data\" chunk",GS_STATIC);
+    return ESR_FATAL_ERROR;
+  }
+  
+  if (swichunk)
+  {
+    rc = readSwiChunk(f, &parent, swichunk, doSwap);
+    if (rc != ESR_SUCCESS)
+    {
+      FREE((char *)wf);
+      FREE((char *)cb);
+      return rc;
+    }
+  }
+  
+  for (i = 0;WaveCodecs[i].func;i++)
+  
+    if (wf->nFormatTag == WaveCodecs[i].id)
+    {
+      rc = (WaveCodecs[i].func)(wf, &chunk, cb, samples, length, doSwap);
+      FREE((char *)wf);
+      FREE((char *)cb);
+      if (rc != ESR_SUCCESS)
+      {
+        if (swichunk) free_swiRiff(swichunk);
+        return rc;
+      }
+      /* handle 'from' and 'to' - this isn't very efficient, but
+       * saves all the format conversion routines the trouble of doing so
+       */
+      if (from == 0 && to == -1) return ESR_SUCCESS;
+      if (from > 0)
+        ifrom = (int)(from * (*rate) / 1000.0);
+      else
+        ifrom = 0;
+        
+      if (to >= 0)
+      {
+        ito = (int)(to * (*rate) / 1000.0 + 0.5);
+        if (ito > *length)
+          ito = *length;
+      }
+      else
+        ito = *length;
+        
+      *length = ito - ifrom;
+      if (ifrom > 0) memmove(*samples, (*samples) + ifrom, (*length)*sizeof(short));
+      return ESR_SUCCESS;
+    }
+    
+  //GS_SetResult(res,GS_Spf(0,"WAVE format (id 0x%x) not supported",
+  //wf->nFormatTag),GS_VOLATILE);
+  //
+  if (swichunk) free_swiRiff(swichunk);
+  FREE((char *)cb);
+  return ESR_FATAL_ERROR;
+}
+
+
+
+/* Reads RIFF format WAVE files and returns:
+ *   waveform: allocated with size num_bytes
+ *   audio_type is a constant string (not allocated)
+ * If swichunk==NULL, does not look for swi-specific chunk,
+ * Returns ESR_FATAL_ERROR if num_channels != 1
+ * If and only if ESR_SUCCESS, caller must free waveform, and swichunk contents (if any)
+ */
+ESR_ReturnCode readRiff2Buf(FILE *f, void **waveform, unsigned int *num_bytes,
+                            const wchar_t **audio_type, SwiRiffStruct *swichunk)
+{
+  ChunkContext chunk, parent;
+  WaveFormat *wf = NULL;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  int doSwap = ! isLittleEndian();
+  *waveform = NULL;
+  
+  *audio_type = NULL;  /* for error recovery higher up */
+  
+  if (swichunk)
+  { /* for error recovery */
+    swichunk->segs.num_tuples = 0;
+    swichunk->kvals.num_pairs = 0;
+  }
+  
+  /* find the WAVE chunk */
+  strncpy(parent.tag, "WAVE", 4);
+  if (riffDescend(f, &parent, NULL, FIND_RIFF, doSwap) != ESR_SUCCESS)
+  {
+    return ESR_FATAL_ERROR;
+  }
+  
+  /* Wave format */
+  strncpy(chunk.tag, "fmt ", 4);
+  if (riffDescend(f, &chunk, &parent, FIND_CHUNK, doSwap) != ESR_SUCCESS)
+  {
+    return ESR_FATAL_ERROR;
+  }
+  if (chunk.length < sizeof(WaveFormat))
+    wf = MALLOC(sizeof(WaveFormat), MTAG);
+  else
+    wf = MALLOC(chunk.length, MTAG);
+    
+  if (fread(wf, 1, chunk.length, f) != (size_t)chunk.length)
+  {
+    FREE((char *)wf);
+    return ESR_FATAL_ERROR;
+  }
+  if (doSwap) swapWaveFormat(wf);
+  
+  if (wf->nChannels != 1)
+  {
+    FREE((char *)wf);
+    return ESR_FATAL_ERROR;
+  }
+  if (doSwap)
+  {
+    swapShort(&wf->nBlockAlign);  /* usually == blockAlign / nChannels */
+    swapInt(&wf->nSamplesPerSec);
+    swapShort(&wf->nFormatTag);
+  }
+  
+  /* data chunk */
+  if (riffAscend(f, &chunk) != ESR_SUCCESS)
+  {
+    rc = ESR_FATAL_ERROR;
+    goto cleanup;
+  }
+  
+  strncpy(chunk.tag, "data", 4);
+  if (riffDescend(f, &chunk, &parent, FIND_CHUNK, doSwap) != ESR_SUCCESS)
+  {
+    rc =  ESR_FATAL_ERROR;
+    goto cleanup;
+  }
+  
+  *num_bytes = chunk.length;  /* already swapped, if need be */
+  *waveform = CALLOC(chunk.length, 1, MTAG);
+  if (fread(*waveform, 1, chunk.length, f) != (size_t)chunk.length)
+  {
+    rc = ESR_FATAL_ERROR;
+    goto cleanup;
+  }
+  if (doSwap)
+  {
+    if (wf->nBlockAlign == 2)
+      short_byte_swap((short *)*waveform, chunk.length);
+    else if (wf->nBlockAlign == 4)
+      int_byte_swap((int *)*waveform, chunk.length);
+  }
+  
+  if (swichunk)
+  {
+    rc = readSwiChunk(f, &parent, swichunk, doSwap);
+    goto cleanup;
+  }
+  
+  *audio_type = NULL;
+  
+  /* assuming nchannels = 1, usually bytes_per_sample==blockAlign / nchannels (not aurora!) */
+  if (wf->nFormatTag == WAVEFORMAT_PCM)
+  {
+    if (wf->nBlockAlign == 2)
+    {/* can only be L16 */
+      if (wf->nSamplesPerSec == 8000)
+        *audio_type = L"audio/L16;rate=8000";
+      else if (wf->nSamplesPerSec == 16000)
+        *audio_type = L"audio/L16;rate=16000";
+    }
+  }
+  else if (wf->nFormatTag == WAVEFORMAT_ALAW)
+  {
+    if (wf->nSamplesPerSec == 8000)
+      *audio_type = L"audio/x-alaw-basic;rate=8000";
+  }
+  else if (wf->nFormatTag == WAVEFORMAT_MULAW)
+  {
+    if (wf->nSamplesPerSec == 8000)
+    {
+      if (swichunk)
+      {
+        char *encoding = getSwiRiffKVal(swichunk, "orig-encoding");
+        if (!encoding)
+          *audio_type = L"audio/basic;rate=8000";
+        else  if (! strcmp(encoding, "g723"))
+          *audio_type = L"audio/basic;rate=8000;orig-encoding=g723";
+        else if (! strcmp(encoding, "g729"))
+          *audio_type = L"audio/basic;rate=8000;orig-encoding=g729";
+        else
+        {
+          // FIXME: warning because unknown orig-encoding??
+          // rec_test will never get here cuz already checked validity of audiotype
+          // but to be careful pour l'avenir, should handle this
+          *audio_type = L"audio/basic;rate=8000";
+        }
+      }
+      else
+        *audio_type = L"audio/basic;rate=8000";
+    }
+    else if (wf->nSamplesPerSec == 16000)
+      *audio_type = L"audio/basic;rate=16000";
+      
+  }
+  else if (wf->nFormatTag == WAVEFORMAT_AURORA)
+  {
+    if (wf->nSamplesPerSec == 8000)
+      *audio_type = L"application/x-feature;rate=8000;encoding=swifeature_aurora";
+    else if (wf->nSamplesPerSec == 11000)
+      *audio_type = L"application/x-feature;rate=11000;encoding=swifeature_aurora";
+    else if (wf->nSamplesPerSec == 16000)
+      *audio_type = L"application/x-feature;rate=16000;encoding=swifeature_aurora";
+  }
+  else if (wf->nFormatTag == WAVEFORMAT_ES_202_050)
+  {
+    if (wf->nSamplesPerSec == 8000)
+      *audio_type = L"application/x-feature;rate=8000;encoding=ES_202_050";
+    else if (wf->nSamplesPerSec == 11000)
+      *audio_type = L"application/x-feature;rate=11000;encoding=ES_202_050";
+    else if (wf->nSamplesPerSec == 16000)
+      *audio_type = L"application/x-feature;rate=16000;encoding=ES_202_050";
+  }
+  
+  if (*audio_type == NULL)
+  {
+    rc = ESR_FATAL_ERROR;
+    goto cleanup;
+  }
+  
+cleanup:
+  if (wf) FREE((char *)wf);
+  if (rc != ESR_SUCCESS)
+  {
+    if (swichunk)
+      free_swiRiff(swichunk);
+    if (*waveform)
+    {
+      FREE((char *)*waveform);
+      *waveform = NULL;
+    }
+  }
+  return rc;
+}
+
+static int getFormatTag(wchar_t *audio_type)
+{
+  if (!wcsncmp(audio_type, L"audio/basic", 11))
+  {
+    return WAVEFORMAT_MULAW;
+  }
+  if (!wcsncmp(audio_type, L"application/x-feature;", 14) &&
+      wcsstr(audio_type, L"encoding=swifeature_aurora"))
+  {
+    return WAVEFORMAT_AURORA;
+  }
+  else if (!wcsncmp(audio_type, L"application/x-feature;", 14) &&
+           wcsstr(audio_type, L"encoding=ES_202_050"))
+  {
+    return WAVEFORMAT_ES_202_050;
+  }
+  else if (!wcsncmp(audio_type, L"audio/x-alaw-basic", 18))
+  {
+    return WAVEFORMAT_ALAW;
+  }
+  else if (!wcsncmp(audio_type, L"audio/L16", 9))
+  {
+    return WAVEFORMAT_PCM;
+  }
+  return -1;
+}
+
+/* we are assuming that riffaudio->num_tuples!=0, and hence riffaudio->tuples!=NULL
+ */
+static unsigned char *writeSwiAudioChunk(int doSwap, int chunk_len, SwiRiffAudio *riffaudio,
+    unsigned char *workbuf)
+{
+  ChunkInfoStruct ck;
+  int chunkinfosize = sizeof(ChunkInfoStruct);
+  
+  strncpy(ck.ckString, "segs", 4);
+  ck.ckLength = chunk_len;
+  if (doSwap)
+  {
+    swapInt(&ck.ckLength);
+    memcpy(workbuf, &ck, chunkinfosize);
+    workbuf += chunkinfosize;
+    
+    memcpy(workbuf, &riffaudio->num_tuples, sizeof(int));
+    workbuf += sizeof(int);
+    chunk_len -= sizeof(int);
+    
+    memcpy(workbuf, riffaudio->tuples, chunk_len);
+    int_byte_swap((int *)workbuf, riffaudio->num_tuples*3 + 1);
+    /* count every tuple (3) + num_tuples itself */
+    return workbuf + chunk_len;
+  }
+  else
+  {
+    memcpy(workbuf, &ck, chunkinfosize);
+    workbuf += chunkinfosize;
+    memcpy(workbuf, &riffaudio->num_tuples, sizeof(int));
+    workbuf += sizeof(int);
+    chunk_len -= sizeof(int);
+    
+    memcpy(workbuf, riffaudio->tuples, chunk_len);
+    return workbuf + chunk_len;
+  }
+}
+
+/* WARNING:  returns with file pointer past the 4 first chars
+ *
+ * If the first 4 bytes of the specified file are "RIFF",
+ * then we assume it's a RIFF file
+ */
+int isRiffFile(FILE *fp)
+{
+  char tmpbuf[4];
+  fseek(fp, 0, SEEK_SET);
+  fread(tmpbuf, 4, sizeof(char), fp);
+  return !strncmp(tmpbuf, "RIFF", 4);
+  
+}
+
+/*
+ * WARNING: assuming num_channels = 1
+ * INPUT: waveform, num_bytes (waveform length), audio_type, 
+ *        swichunk (it returns unmodified, including not swapped)
+ * OUTPUT: buf (entire riff chunk) and buflen
+ *
+ * AURORA special case:
+ *   sampling rate = bytes_per_sample = -1; other fields of WaveFormat undefined
+ */
+ESR_ReturnCode convertBuf2Riff(
+  unsigned char *waveform,
+  unsigned int num_bytes,
+  wchar_t *audio_type,
+  int rate,
+  int bytes_per_sample,
+  SwiRiffStruct *swichunk,
+  unsigned char **buf,
+  unsigned int *buflen)
+{
+  unsigned int total_buflen;
+  unsigned char *ptr, *workbuf;
+  short num_channels = 1;
+  int num_samples;
+  int bytes_sec;
+  short block_align;
+  int doSwap;
+  ChunkInfoStruct ck;
+  RiffHeaderStruct header;
+  int headerSize = sizeof(RiffHeaderStruct);
+  int chunkInfoSize = sizeof(ChunkInfoStruct);
+  int listChunkSize = 0;
+  int segs_chunk_size, kvals_chunk_size;
+  short format_tag = (short) getFormatTag(audio_type);
+  
+  if (format_tag == -1 ||
+      (bytes_per_sample == -1 && format_tag != WAVEFORMAT_AURORA &&
+       format_tag != WAVEFORMAT_ES_202_050))
+  {
+    PLogError(L("audio type not supported for RIFF conversion"));
+    return ESR_FATAL_ERROR;
+    
+  }
+  if (bytes_per_sample > 0)
+    num_samples = num_bytes / bytes_per_sample;
+  else
+    num_samples = num_bytes;
+    
+  strncpy(header.riffString, "RIFF", 4);
+  strncpy(header.waveString, "WAVE", 4);
+  strncpy(header.fmtString, "fmt ", 4);
+  strncpy(header.dataString, "data", 4);
+  
+  total_buflen = headerSize + num_bytes;
+  
+  if (swichunk->segs.num_tuples || swichunk->kvals.num_pairs)
+  {
+    listChunkSize = chunkInfoSize  /* LIST chunk info */ + 4 * sizeof(char);  /* "swi " */
+    if (swichunk->segs.num_tuples)
+    {
+      segs_chunk_size = sizeof(int) + (swichunk->segs.num_tuples) * sizeof(RiffAudioTuple);
+      listChunkSize += chunkInfoSize + segs_chunk_size;
+    }
+    if (swichunk->kvals.num_pairs)
+    {
+      int i;
+      kvals_chunk_size = 0;
+      for (i = 0; i < swichunk->kvals.num_pairs; i++)
+      {
+        kvals_chunk_size += (strlen(swichunk->kvals.kvpairs[i].key) + 1
+                             + strlen(swichunk->kvals.kvpairs[i].value) + 1) * sizeof(char);
+      }
+      kvals_chunk_size += sizeof(int);  /* num_pairs */
+      listChunkSize += chunkInfoSize + kvals_chunk_size;
+    }
+    total_buflen += listChunkSize;
+  }
+  if (total_buflen > *buflen)
+  {
+    PLogError(L("ESR_BUFFER_OVERFLOW"));
+    return ESR_BUFFER_OVERFLOW;
+  }
+  workbuf = *buf;
+  
+  *buflen = total_buflen;
+  ptr = workbuf;
+  if (format_tag == WAVEFORMAT_AURORA || format_tag == WAVEFORMAT_ES_202_050)
+  {
+    bytes_sec = AURORA_BYTES_SEC;
+    block_align = 4;
+  }
+  else
+  {
+    bytes_sec = (short)(rate * num_channels * bytes_per_sample);
+    block_align = bytes_per_sample * num_channels;
+  }
+  doSwap = !isLittleEndian();
+  if (doSwap)
+  {
+    header.riffChunkLength = swapConstInt(*buflen - chunkInfoSize);
+    header.fmtChunkLength = swapConstInt(sizeof(WaveFormat));
+    header.waveinfo.nFormatTag = swapConstShort(format_tag);  /* codec */
+    header.waveinfo.nChannels = swapConstShort(num_channels);
+    header.waveinfo.nSamplesPerSec = swapConstInt(rate);
+    header.waveinfo.nAvgBytesPerSec = swapConstInt(bytes_sec);
+    header.waveinfo.nBlockAlign = swapConstShort(block_align);
+    header.waveinfo.wBitsPerSample = swapConstShort((short)((bytes_sec * 8) / rate));
+    header.dataLength = swapConstInt(num_bytes);
+    memcpy(ptr, &header, headerSize);
+    
+    memcpy(ptr + headerSize, waveform, header.dataLength);
+    if (bytes_per_sample == 2)
+      short_byte_swap((short *)(ptr + headerSize), num_samples);
+  }
+  else
+  {
+    header.riffChunkLength = total_buflen - chunkInfoSize;
+    header.fmtChunkLength = sizeof(WaveFormat);
+    header.waveinfo.nFormatTag = format_tag;  /* codec */
+    header.waveinfo.nChannels = num_channels;
+    header.waveinfo.nSamplesPerSec = rate;
+    header.waveinfo.nAvgBytesPerSec = bytes_sec;
+    header.waveinfo.nBlockAlign = (short) block_align;
+    header.waveinfo.wBitsPerSample = (bytes_sec * 8) / rate;
+    header.dataLength = num_bytes;
+    
+    memcpy(ptr, &header, headerSize);
+    memcpy(ptr + headerSize, waveform, header.dataLength);
+  }
+  ptr += headerSize + header.dataLength;
+  
+  if (swichunk->segs.num_tuples || swichunk->kvals.num_pairs)
+  {
+    strncpy(ck.ckString, "LIST", 4);
+    ck.ckLength = listChunkSize - chunkInfoSize;
+    if (doSwap) swapInt(&ck.ckLength);
+    memcpy(ptr, &ck, chunkInfoSize);   /* copy LIST */
+    ptr += chunkInfoSize;
+    
+    strncpy((char *)ptr, "swi ", 4);
+    ptr += 4;
+    
+    if (swichunk->segs.num_tuples)
+    {
+      ptr = writeSwiAudioChunk(doSwap, segs_chunk_size, &swichunk->segs, ptr);
+    }
+    if (swichunk->kvals.num_pairs)
+    {
+      int i, num_pairs;
+      RiffKVPair *pairs;
+      
+      strncpy(ck.ckString, "kvs ", 4);
+      ck.ckLength = kvals_chunk_size;   /* num_pairs and pairs themselves */
+      if (doSwap) swapInt(&ck.ckLength);
+      memcpy(ptr, &ck, chunkInfoSize);
+      ptr += chunkInfoSize;
+      
+      num_pairs = (doSwap) ? swapConstInt(swichunk->kvals.num_pairs) : swichunk->kvals.num_pairs;
+      memcpy(ptr, &num_pairs, sizeof(int));
+      ptr += sizeof(int);
+      
+      for (pairs = swichunk->kvals.kvpairs, i = 0; i < num_pairs; i++, pairs++)
+      {
+        strcpy((char *)ptr, pairs->key);
+        ptr += strlen(pairs->key) + 1;
+        
+        strcpy((char *)ptr, pairs->value);
+        ptr += strlen(pairs->value) + 1;
+      }
+    }
+  }
+  passert((unsigned int)(ptr - workbuf) == *buflen);
+  
+  return ESR_SUCCESS;
+}
+
+
diff --git a/srec/Grammar/Android.mk b/srec/Grammar/Android.mk
new file mode 100644
index 0000000..b217e61
--- /dev/null
+++ b/srec/Grammar/Android.mk
@@ -0,0 +1,74 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/SR_Grammar.c \
+	src/SR_GrammarImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+	$(ASR_ROOT_DIR)/seti/sltsEngine/include \
+
+common_CFLAGS := \
+	-DSREC_GRAMMAR_EXPORTS \
+	-DUSE_TTP \
+	-DUSE_FSM_DICT \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_Core \
+	libSR_Semproc \
+	libSR_Vocabulary \
+
+common_TARGET:= libSR_Grammar
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/Grammar/include/SR_Grammar.h b/srec/Grammar/include/SR_Grammar.h
new file mode 100644
index 0000000..f0c89b8
--- /dev/null
+++ b/srec/Grammar/include/SR_Grammar.h
@@ -0,0 +1,520 @@
+/*---------------------------------------------------------------------------*
+ *  SR_Grammar.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_GRAMMAR_H
+#define __SR_GRAMMAR_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "pstdio.h"
+#include "ptypes.h"
+#include "SR_GrammarPrefix.h"
+#include "SR_NametagDefs.h"
+#include "SR_Vocabulary.h"
+#include "SR_AcousticModels.h"
+#include "SR_Recognizer.h"
+#include "SR_SemanticResult.h"
+
+/* forward decl needed because of SR_Recognizer.h <-> SR_Grammar.h include loop */
+struct SR_Recognizer_t;
+
+/**
+ * @addtogroup SR_GrammarModule SR_Grammar API functions
+ * Contains recognition grammar.
+ *
+ * A grammar consists of a list of rules.
+ *
+ * A rule consists of a list of words and slots. For example:
+ * MY_RULE = "My name is $name" where "name" is a slot
+ *
+ * Words, Nametags may be added or removed from slots.
+ * Upon adding and removing words, the grammar needs to be recompiled for the changes to
+ * take place. However, the original CompiledGrammar remains valid even if compilation never
+ * takes place.
+ *
+ * Two types of slots exist: word slots and nametag slots
+ *
+ * @{
+ */
+
+/**
+ * Grammar dispatch function. Used for symantic processing.
+ *
+ * @param functionName Name of function that was invoked
+ * @param argv Argument values passed to function
+ * @param argc Number of arguments passed to function
+ * @param value Dispatch value (specified using SR_GrammarSetDispatchValue)
+ * @param result Result of function operation. Caller passes in this buffer, function fills it.
+ * @param resultSize Size of result buffer. If the passed in buffer was not large enough to hold
+ *                   the result, this value is updated with the required length.
+ */
+typedef ESR_ReturnCode(*SR_GrammarDispatchFunction)(LCHAR* functionName, LCHAR** argv, size_t argc, void* value, LCHAR* result, size_t* resultSize);
+
+/**
+ * Contains recognition grammar.
+ *
+ * A grammar consists of a list of rules.
+ *
+ * A rule consists of a list of words and slots. For example:
+ * MY_RULE = "My name is $name" where "name" is a slot
+ *
+ * Words, Nametags may be added or removed from slots.
+ * Upon adding and removing words, the grammar needs to be recompiled for the changes to
+ * take place. However, the original CompiledGrammar remains valid even if compilation never
+ * takes place.
+ *
+ * Two types of slots exist: word slots and nametag slots
+ */
+typedef struct SR_Grammar_t
+{
+  /**
+   * Compiles the grammar.
+   * In the case of a precompiled grammar, the function compiles those portions of the grammar 
+   * that were dynamically added since the last compilation.
+   *
+   * @param self SR_Grammar handle
+  * @return ESR_SUCCESS if compilation succeeded, ESR_FATAL_ERROR otherwise.
+   */
+  ESR_ReturnCode(*compile)(struct SR_Grammar_t* self);
+  
+  /**
+  * Saves a compiled grammar to a file.
+  *
+  * @param self SR_Grammar handle
+  * @param filename File to write grammar into
+  * @return ESR_INVALID_ARGUMENT if self or filename are null; ESR_INVALID_STATE if could not save the grammar
+  */
+  ESR_ReturnCode(*save)(struct SR_Grammar_t* self, const LCHAR* filename);
+  
+  /**
+   * Indicates if a transcription is a valid result of a Grammar rule.
+   *
+   * @param self SR_Grammar handle
+   * @param transcription Transcription value
+   * @param result [in/out] Array of semantic results to be populated
+   * @param resultCount [in/out] Length of result array
+  * @return ESR_INVALID_ARGUMENT if self or transcription are null; ESR_INVALID_STATE if an internal error has occured.
+   */
+  ESR_ReturnCode(*checkParse)(struct SR_Grammar_t* self, const LCHAR* transcription, SR_SemanticResult** result, size_t* resultCount);
+  
+  /**
+   * Adds word to rule slot.
+   *
+   * @param self SR_Grammar handle
+   * @param slot Slot name
+   * @param word Word to be added to the slot
+   * @param pronunciation Word pronunciation (optional). Pass NULL to omit.
+   * @param weight value to associate with word when adding to grammar; use to determine cost when parsing
+   * @param tag eScript semantic expression (tag) for the word  
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if the vocabulary is missing, 
+   * if OSI logging fails; ESR_OUT_OF_MEMORY if word cannot be added to the grammar 
+   * (addWords=X is too small); ESR_NOT_SUPPORTED if homonyms are added to the grammar
+   */
+  ESR_ReturnCode(*addWordToSlot)(struct SR_Grammar_t* self, const LCHAR* slot, const LCHAR* word, 
+		const LCHAR* pronunciation, int weight, const LCHAR* tag);
+  
+  /**
+   * Removes all elements from all slots.
+   *
+   * @param self SR_Grammar handle
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if resetting the slots or OSI logging fails
+   */
+  ESR_ReturnCode(*resetAllSlots)(struct SR_Grammar_t* self);
+  
+  /**
+   * Adds nametag to rule slot.
+   *
+   * @param self SR_Grammar handle
+   * @param slot Slot name
+   * @param nametag Nametag to be added to the grammar
+   * @param weight value to associate with nametag when adding to grammar; use to determine cost when parsing
+   * @param tag eScript semantic expression (tag) for the nametag
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if the grammar is active, 
+   * if the vocabulary is missing, if OSI logging fails; ESR_OUT_OF_MEMORY if word cannot be added to 
+   * the grammar (addWords=X is too small); ESR_NOT_SUPPORTED if homonyms are added to the grammar
+   */
+  ESR_ReturnCode(*addNametagToSlot)(struct SR_Grammar_t* self, const LCHAR* slot, 
+    const SR_Nametag* nametag, int weight, const LCHAR* tag);
+  
+  /**
+   * Sets user dispatch function (used for parsed callback, etc)
+   *
+   * @param self SR_Grammar handle
+   * @param name The name of the function which will trigger this callback when encountered during grammar parsing.
+   * @param userData The user data to be referenced in the callback implementation later on.
+   * @param function The dispatch function
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_SUCCESS
+   */
+  ESR_ReturnCode(*setDispatchFunction)(struct SR_Grammar_t* self, const LCHAR* name, void* userData, SR_GrammarDispatchFunction function);
+  
+  /**
+   * Sets grammar parameter, overriding session defaults.
+   *
+   * @param self SR_Grammar handle
+   * @param key Parameter name
+   * @param value Parameter value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_NOT_IMPLEMENTED
+   */
+  ESR_ReturnCode(*setParameter)(struct SR_Grammar_t* self, const LCHAR* key, void* value);
+  
+  /**
+   * Sets grammar parameters.
+   * This is a convenience function.
+   *
+   * @param self SR_Grammar handle
+   * @param key Parameter name
+   * @param value Parameter value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the property is already set and its type is size_t
+   */
+  ESR_ReturnCode(*setSize_tParameter)(struct SR_Grammar_t* self, const LCHAR* key, size_t value);
+  
+  /**
+   * Returns grammar parameter value.
+   *
+   * @param self SR_Grammar handle
+   * @param key Parameter name
+   * @param value Parameter value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_NOT_IMPLEMENTED
+   */
+  ESR_ReturnCode(*getParameter)(struct SR_Grammar_t* self, const LCHAR* key, void** value);
+  
+  /**
+   * Return copy of unsigned int grammar parameter.
+   * This is a convenience function.
+   *
+   * @param self SR_Grammar handle
+   * @param key Parameter name
+   * @param value [out] Used to hold the parameter value
+   * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the property type is not size_t; ESR_NO_MATCH_ERROR if property is not set
+   */
+  ESR_ReturnCode(*getSize_tParameter)(struct SR_Grammar_t* self, const LCHAR* key, size_t* value);
+  
+  /**
+   * Configures a vocabulary with the grammar.
+   *
+   * @param self SR_Grammar handle
+   * @param vocabulary The vocabulary to associate with
+  * @return ESR_INVALID_ARGUMENT if self or vocabulary are null
+   */
+  ESR_ReturnCode(*setupVocabulary)(struct SR_Grammar_t *self, SR_Vocabulary *vocabulary);
+  
+  /**
+   * Associates Recognizer with the grammar.
+   *
+   * @param self SR_Grammar handle
+   * @param recognizer The recognizer to associate
+   * @return ESR_INVALID_ARGUMENT if self or recognizer are null
+   */
+  // ESR_ReturnCode(*setupModels)(struct SR_Grammar_t* self, SR_AcousticModels* models);
+  ESR_ReturnCode(*setupRecognizer)(struct SR_Grammar_t* self, struct SR_Recognizer_t* recognizer);
+  /**
+   * Dissociates Recognizer with the grammar.
+   *
+   * @param self SR_Grammar handle
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*unsetupRecognizer)(struct SR_Grammar_t* self);
+  
+  /**
+   * Returns AcousticModels associated with the grammar.
+   *
+   * @param self SR_Grammar handle
+   * @param models Associated models
+  * @return ESR_INVALID_ARGUMENT if self or models are null
+   */
+  // ESR_ReturnCode(*getModels)(struct SR_Grammar_t* self, SR_AcousticModels** models);
+  
+  /**
+   * Destroys a grammar.
+   *
+   * @param self SR_Grammar handle
+  * @return ESR_INVALID_ARGUMENT if self is null, ESR_INVALID_STATE if OSI logging fails
+   */
+  ESR_ReturnCode(*destroy)(struct SR_Grammar_t* self);
+}
+SR_Grammar;
+
+/**
+ * @name Grammar compilation
+ *
+ * Categories:
+ * - Initialization
+ * - Compile from expressions (not supported by SREC) or load pre-compiled grammars
+ * - Dynamic modification; slots
+ * - Support functions (isExtant, etc)
+ * - Use in recognition; activation
+ *
+ * IMPORTANT NOTE: There are two main approaches to grammar activation in a recognizer.
+ * - 1. Load a pre-compiler grammar setup. This is not just the set of expressions but is also
+ *      an image of the actual model components network that fully describes the recognizer
+ *      task. This type of Grammar can be extended with single arcs at pre-defined points
+ *      called slots.
+ *
+ * - 2. Create a network dynamically from a set of regular expressions.
+ *
+ * SREC supports 1. but not 2. CREC supports 2 but not 1. Both approaches are covered by
+ * this interface. Pre-compiled grammars inherently refer to models. It is therefore
+ * important to ensure consistency of model usage between all activated grammars. This can
+ * be done prior to grammar rule activation in the Recognizer
+ * (see SR_RecognizerCheckGrammarConsistency()).
+ *
+ * A Grammar may consist of one or more rules. Rules are given as expressions (this interface is
+ * independent of the format). A rule may contain other rules. Before a rule can be used in
+ * recognition it must be compiled (or loaded), setup by a recognizer and activated.
+ * -  The Grammar_CompileRule() step combines all sub-rule expressions into a single underlying
+ *    member of Grammar.
+ * -  The Recognizer_ActivateRule() step simply raises a flat to make a compiled rule available
+ *    for recognition.
+ *
+ * Once a Grammar is setup by a recognizer it is not permissible to modify its rules  Thus, in
+ * order to be able to support a combination of a static rule and one that requires changing, it
+ * is most efficient to separate these rules into two Grammar objects.
+ *
+ * NOTE: The modification/setup constraint ensures consistency between the rule definitions
+ * in the Grammar and the setup rules. It would be possible to remove this constraint and
+ * allow rules that had no dependents to be modified while the grammar was setup. This makes
+ * the API freer but also less consistent and more susceptible to error. There would be no
+ * footprint cost with having two grammars in place of one grammar with two rules unless the
+ * rules overlapped. If there was overlap then it might have been possible to minimize the
+ * shared parts
+ * @{
+ */
+
+/**
+ * Compiles the grammar.
+ * In the case of a precompiled grammar, the function compiles those portions of the grammar
+ * that were dynamically added since the last compilation.
+ *
+ * @param self SR_Grammar handle
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_SUCCESS if compilation succeeded, ESR_FATAL_ERROR otherwise.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarCompile(SR_Grammar* self);
+/**
+ * @}
+ *
+ * @name Special "Slot"-based Grammar functions
+ *
+ * Slots are points in a pre-compiled grammar where a simple extension of the grammar may
+ * be made. They support the insertion of words or nametags into a pr-defined position in
+ * the Grammar. Slots are first declared in an expression which is compiled and saved for
+ * re-loading. The names of these slots are used in a similar way as rule names.
+ *
+ * @{
+ */
+/**
+ * Adds word to rule slot.
+ *
+ * @param self SR_Grammar handle
+ * @param slot Slot name
+ * @param word Word to be added to the slot
+ * @param pronunciation Word pronunciation (optional). Pass NULL to omit.
+ * @param weight value to associate with word when adding to grammar; use to determine cost when parsing
+ * @param tag eScript semantic expression for the word. In other words, eScript will execute
+ *            "MEANING=<tag>"
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if the grammar is active,
+ * if the vocabulary is missing, if OSI logging fails; ESR_OUT_OF_MEMORY if word cannot be added to
+ * the grammar (addWords=X is too small); ESR_NOT_SUPPORTED if homonyms are added to the grammar
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarAddWordToSlot(SR_Grammar* self, const LCHAR* slot, 
+																												const LCHAR* word, const LCHAR* pronunciation, 
+																												int weight, const LCHAR* tag);
+/**
+ * Removes all elements from all slots.
+ *
+ * @param self SR_Grammar handle
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if resetting the slots or 
+ * OSI logging fails
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarResetAllSlots(SR_Grammar* self);
+/**
+ * Adds word to rule slot.
+ *
+ * @param self SR_Grammar handle
+ * @param slot Slot name
+ * @param nametag Nametag to be added to the slot
+ * @param weight value to associate with nametag when adding to grammar; use to determine cost when parsing
+ * @param tag eScript semantic expression (tag) for the nametag
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if the grammar is active, if the
+ * vocabulary is missing, if OSI logging fails; ESR_OUT_OF_MEMORY if word cannot be added to the
+ * grammar (addWords=X is too small); ESR_NOT_SUPPORTED if homonyms are added to the grammar
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarAddNametagToSlot(SR_Grammar* self, const LCHAR* slot, 
+const struct SR_Nametag_t* nametag, int weight, const LCHAR* tag);
+/**
+ * @}
+ *
+ * @name Grammar Setup functions
+ *
+ * The Grammar object needs an association with several objects:
+ * - A Grammar object must use one and only one Vocabulary object.
+ * - A Grammar object may use one and only one Nametags object. (The Nametags object can
+ *   however be used by more than one Grammar. A Nametags collection object must be used
+ *   before nametags can be added to Grammar slots.)
+ *
+ * @see Nametags_Add() and associated functions for Nametags management.
+ *
+ * @{
+ */
+
+/**
+ * Configures a vocabulary with the grammar.
+ *
+ * @param self SR_Grammar handle
+ * @param vocabulary The vocabulary to associate with
+ * @return ESR_INVALID_ARGUMENT if self or vocabulary are null
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarSetupVocabulary(SR_Grammar *self, SR_Vocabulary *vocabulary);
+/**
+ * Associates Grammar with a Recognizer (eg. such that word additions can take place).
+ *
+ * @param self SR_Grammar handle
+ * @param models The recognizer to associate
+ * @return ESR_INVALID_ARGUMENT if self or recognizer are null
+ */
+// SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarSetupModels(SR_Grammar* self, SR_AcousticModels* models);
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarSetupRecognizer(SR_Grammar* self, struct SR_Recognizer_t* recognizer);
+/**
+ * Dissociate Grammar from a Recognizer.
+ *
+ * @param self SR_Grammar handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarUnsetupRecognizer(SR_Grammar* self);
+/**
+ * Returns AcousticModels associated with a Grammar.
+ *
+ * @param self SR_Grammar handle
+ * @param models Associated models
+ * @return ESR_INVALID_ARGUMENT if self or models are null
+ */
+// SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarGetModels(SR_Grammar* self, SR_AcousticModels** models);
+
+/**
+ * @}
+ *
+ * @name  Basic Grammar functions
+ *
+ * @{
+ */
+
+/**
+ * Create a new grammar.
+ *
+ * @param self SR_Grammar handle
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarCreate(SR_Grammar** self);
+/**
+ * Destroys a grammar.
+ *
+ * @param self SR_Grammar handle
+ * @return ESR_INVALID_ARGUMENT if self is null, ESR_INVALID_STATE if OSI logging fails
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarDestroy(SR_Grammar* self);
+/**
+ * Loads a compiled grammar from a file or an image. If the filename has extention .g2g
+ * then it will be loaded as an image. Otherwise, provide only a basename (i.e. without
+ * file extensions), and a set of text-based grammar files will be loaded.
+ *
+ * @param filename File to read grammar from
+ * @param self SR_Grammar handle
+ * @return ESR_INVALID_ARGUMENT if self or the value it points to are null. If the filename load property
+ * (i.e. addWords=X) is unknown; ESR_OUT_OF_MEMORY if system is out of memory; ESR_READ_ERROR if grammar file be read
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarLoad(const LCHAR* filename, SR_Grammar** self);
+/**
+ * Saves a compiled grammar to a file.
+ *
+ * @param self SR_Grammar handle
+ * @param filename File to write grammar into
+ * @return ESR_INVALID_ARGUMENT if self or filename are null; ESR_INVALID_STATE if could not save the grammar
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarSave(SR_Grammar* self, const LCHAR* filename);
+/**
+ * Sets user dispatch function (used for parsed callback, etc)
+ *
+ * @param self SR_Grammar handle
+ * @param name The name of the function which will trigger this callback when encountered during grammar parsing.
+ * @param userData The user data to be referenced in the callback implementation later on.
+ * @param function The dispatch function
+ * @return ESR_SUCCESS
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarSetDispatchFunction(SR_Grammar* self, const LCHAR* name, void* userData, SR_GrammarDispatchFunction function);
+/**
+ * Sets grammar parameter, overriding session defaults.
+ *
+ * @param self SR_Grammar handle
+ * @param key Parameter name
+ * @param value Parameter value
+ * @return ESR_NOT_IMPLEMENTED
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarSetParameter(SR_Grammar* self, const LCHAR* key, void* value);
+/**
+ * Sets grammar parameters.
+ * This is a convenience function.
+ *
+ * @param self SR_Grammar handle
+ * @param key Parameter name
+ * @param value Parameter value
+ * @return ESR_INVALID_RESULT_TYPE if the property is already set and its type is size_t
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarSetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t value);
+/**
+ * Returns grammar parameter value.
+ *
+ * @param self SR_Grammar handle
+ * @param key Parameter name
+ * @param value Parameter value
+ * @return ESR_NOT_IMPLEMENTED
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarGetParameter(SR_Grammar* self, const LCHAR* key, void** value);
+/**
+ * Return copy of unsigned int grammar parameter.
+ * This is a convenience function.
+ *
+ * @param self SR_Grammar handle
+ * @param key Parameter name
+ * @param value [out] Used to hold the parameter value
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the property type is not size_t; ESR_NO_MATCH_ERROR if property is not set
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarGetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t* value);
+/**
+ * Checks if transcription is parsable by the grammar.
+ *
+ * @param self SR_Grammar handle
+ * @param transcription transcription to be checked
+ * @param result should be NULL
+ * @param resultCount used to return the number of valid parses
+ * @return ESR_INVALID_ARGUMENT if self, transcription are null; ESR_INVALID_STATE if an internal error has occured.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarCheckParse(SR_Grammar* self, const LCHAR* transcription, SR_SemanticResult** result, size_t* resultCount);
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarAllowOnly(SR_Grammar* self, const char* transcription);
+SREC_GRAMMAR_API ESR_ReturnCode SR_GrammarAllowAll(SR_Grammar* self);
+
+#endif /* __SR_GRAMMAR_H */
diff --git a/srec/Grammar/include/SR_GrammarImpl.h b/srec/Grammar/include/SR_GrammarImpl.h
new file mode 100644
index 0000000..8357ade
--- /dev/null
+++ b/srec/Grammar/include/SR_GrammarImpl.h
@@ -0,0 +1,206 @@
+/*---------------------------------------------------------------------------*
+ *  SR_GrammarImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_GRAMMARIMPL_H
+#define __SR_GRAMMARIMPL_H
+
+
+
+#include "ArrayList.h"
+#include "HashMap.h"
+#include "SR_Grammar.h"
+#include "SR_Nametags.h"
+#include "ESR_ReturnCode.h"
+#include "ESR_SessionType.h"
+#include "SR_EventLog.h"
+#include "SR_Recognizer.h"
+
+/* Semproc stuff */
+#include "SR_SemanticGraph.h"
+#include "SR_SemanticProcessor.h"
+
+
+
+#include "simapi.h"
+
+/**
+ * SR_Grammar implementation.
+ */
+typedef struct SR_GrammarImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_Grammar Interface;
+  
+  /**
+   * Associates a grammar with a Recognizer.
+   *
+   * @param self SR_Grammar handle
+   * @param recognizer The recognizer
+   */
+  // ESR_ReturnCode(*setupAcousticModels)(SR_Grammar* self, SR_AcousticModels* models);
+  ESR_ReturnCode(*setupRecognizer)(SR_Grammar* self, SR_Recognizer* recognizer);
+  /**
+   * Dissociates a grammar from a Recognizer.
+   *
+   * @param self SR_Grammar handle
+   */
+  ESR_ReturnCode(*unsetupRecognizer)(SR_Grammar* self);
+  
+  /**
+   * Legacy CREC syntax.
+   */
+  CA_Syntax* syntax;
+  /**
+   * Recognizer associated with SR_Grammar.
+   */
+  // SR_AcousticModels* models;
+  SR_Recognizer* recognizer;
+  
+  /**
+   * Vocabulary.
+   */
+  SR_Vocabulary* vocabulary;
+  
+  /**
+   * Semantic Graph
+   */
+  SR_SemanticGraph* semgraph;
+  
+  /**
+   * Semantic Processor
+   */
+  SR_SemanticProcessor* semproc;
+  
+  /**
+   * Grammar-specific parameters.
+   */
+  ESR_SessionType* parameters;
+  
+  /**
+   * Event Log reference set internally by regognizer during its association with this grammar
+   */
+  SR_EventLog* eventLog;
+  
+  /**
+   * Event log, logging level.
+   */
+  size_t logLevel;
+  
+  /**
+   * Indicates if the grammar has been activated.
+   */
+  ESR_BOOL isActivated;
+}
+SR_GrammarImpl;
+
+
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_CompileRule(SR_Grammar* self, const LCHAR* name);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_AddRuleFromList(SR_Grammar* self, SR_Vocabulary* vocabulary, const LCHAR* name);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_Compile(SR_Grammar* self);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_AddRule(SR_Grammar* self, const LCHAR* name, const LCHAR* value);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_DeleteRule(SR_Grammar* self, const LCHAR* name);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_ContainsRule(SR_Grammar* self, const LCHAR* name, ESR_BOOL* result);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_AddWordToSlot(SR_Grammar* self, const LCHAR* slot, 
+																												 const LCHAR* word, const LCHAR* pronunciation, 
+																												 int weight, const LCHAR* tag);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_ResetAllSlots(SR_Grammar* self);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_AddNametagToSlot(SR_Grammar* self, const LCHAR* slot, 
+																														const SR_Nametag* nametag, int weight, 
+																														const LCHAR* tag);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_Create(SR_Grammar** self);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_Destroy(SR_Grammar* self);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_Save(SR_Grammar* self, const LCHAR* filename);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_CheckParse(SR_Grammar* self, const LCHAR* transcription, SR_SemanticResult** result, size_t* resultCount);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetDispatchFunction(SR_Grammar* self, const LCHAR* name, void* userData, SR_GrammarDispatchFunction function);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetParameter(SR_Grammar* self, const LCHAR* key, void* value);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t value);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_GetParameter(SR_Grammar* self, const LCHAR* key, void** value);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_GetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t* value);
+/**
+ * Default implementation.
+ */
+// SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetupModels(SR_Grammar* self, SR_AcousticModels* models);
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetupRecognizer(SR_Grammar* self, SR_Recognizer* recognizer);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_UnsetupRecognizer(SR_Grammar* self);
+/**
+ * Default implementation.
+ */
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetupVocabulary(SR_Grammar *self, SR_Vocabulary *vocabulary);
+
+
+#endif /* __SR_GRAMMARIMPL_H */
diff --git a/srec/Grammar/include/SR_GrammarPrefix.h b/srec/Grammar/include/SR_GrammarPrefix.h
new file mode 100644
index 0000000..b8676e0
--- /dev/null
+++ b/srec/Grammar/include/SR_GrammarPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_GrammarPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_GRAMMARPREFIX_H
+#define __SR_GRAMMARPREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_GRAMMAR_EXPORTS
+#define SREC_GRAMMAR_API PORT_EXPORT_DECL
+#else
+#define SREC_GRAMMAR_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/Grammar/src/SR_Grammar.c b/srec/Grammar/src/SR_Grammar.c
new file mode 100644
index 0000000..2e941e0
--- /dev/null
+++ b/srec/Grammar/src/SR_Grammar.c
@@ -0,0 +1,192 @@
+/*---------------------------------------------------------------------------*
+ *  SR_Grammar.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "SR_Grammar.h"
+#include "SR_GrammarImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+ESR_ReturnCode SR_GrammarCompile(SR_Grammar* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->compile(self);
+}
+
+ESR_ReturnCode SR_GrammarAddWordToSlot(SR_Grammar* self, const LCHAR* slot, const LCHAR* word, 
+				        const LCHAR* pronunciation, int weight, const LCHAR* tag)
+    {
+
+    if ( self == NULL )
+        {
+        PLogError(L("ESR_INVALID_ARGUMENT : Grammar Is Null"));
+        return ESR_INVALID_ARGUMENT;
+        }
+    return self->addWordToSlot(self, slot, word, pronunciation, weight, tag);
+    }
+
+
+ESR_ReturnCode SR_GrammarResetAllSlots(SR_Grammar* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->resetAllSlots(self);
+}
+
+ESR_ReturnCode SR_GrammarAddNametagToSlot(SR_Grammar* self, const LCHAR* slot, 
+                                          const SR_Nametag* nametag,  int weight, const LCHAR* tag)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->addNametagToSlot(self, slot, nametag, weight, tag);
+}
+
+ESR_ReturnCode SR_GrammarSetDispatchFunction(SR_Grammar* self, const LCHAR* name, void* userData, SR_GrammarDispatchFunction function)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setDispatchFunction(self, name, userData, function);
+}
+
+ESR_ReturnCode SR_GrammarSave(SR_Grammar* self, const LCHAR* filename)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->save(self, filename);
+}
+
+ESR_ReturnCode SR_GrammarSetParameter(SR_Grammar* self, const LCHAR* key, void* value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setParameter(self, key, value);
+}
+
+ESR_ReturnCode SR_GrammarSetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setSize_tParameter(self, key, value);
+}
+
+ESR_ReturnCode SR_GrammarGetParameter(SR_Grammar* self, const LCHAR* key, void** value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getParameter(self, key, value);
+}
+
+ESR_ReturnCode SR_GrammarGetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t* value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getSize_tParameter(self, key, value);
+}
+
+// ESR_ReturnCode SR_GrammarSetupModels(SR_Grammar* self, SR_AcousticModels* models)
+ESR_ReturnCode SR_GrammarSetupRecognizer(SR_Grammar* self, struct SR_Recognizer_t* recognizer)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  // retgurn self->setupModels( self, models);
+  return self->setupRecognizer(self, recognizer);
+}
+ESR_ReturnCode SR_GrammarUnsetupRecognizer(SR_Grammar* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->unsetupRecognizer(self);
+}
+
+ESR_ReturnCode SR_GrammarSetupVocabulary(SR_Grammar *self, SR_Vocabulary *vocabulary)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setupVocabulary(self, vocabulary);
+}
+
+/* ESR_ReturnCode SR_GrammarGetModels(SR_Grammar* self, SR_AcousticModels** models)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getModels(self, models);
+}
+*/
+ESR_ReturnCode SR_GrammarCheckParse(SR_Grammar* self, const LCHAR* transcription, SR_SemanticResult** result_void, size_t* resultCount)
+{
+  SR_SemanticResult** result = (SR_SemanticResult**)result_void;
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->checkParse(self, transcription, result, resultCount);
+}
+
+ESR_ReturnCode SR_GrammarDestroy(SR_Grammar* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
diff --git a/srec/Grammar/src/SR_GrammarImpl.c b/srec/Grammar/src/SR_GrammarImpl.c
new file mode 100644
index 0000000..0406d66
--- /dev/null
+++ b/srec/Grammar/src/SR_GrammarImpl.c
@@ -0,0 +1,771 @@
+/*---------------------------------------------------------------------------*
+ *  SR_GrammarImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ESR_Session.h"
+#include "SR_AcousticModels.h"
+#include "SR_AcousticModelsImpl.h"
+#include "SR_Grammar.h"
+#include "SR_GrammarImpl.h"
+#include "SR_SemanticGraphImpl.h"
+#include "SR_SemanticProcessorImpl.h"
+#include "SR_VocabularyImpl.h"
+#include "SR_NametagImpl.h"
+#include "passert.h"
+#include "plog.h"
+#include "pmemory.h"
+
+#define MTAG NULL
+
+ESR_ReturnCode SR_Grammar_Create(SR_Grammar** self)
+{
+  SR_GrammarImpl* impl;
+  ESR_ReturnCode rc;
+  ESR_BOOL exists;
+  
+  impl = NEW(SR_GrammarImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  
+  impl->Interface.addNametagToSlot = &SR_Grammar_AddNametagToSlot;
+  impl->Interface.addWordToSlot = &SR_Grammar_AddWordToSlot;
+  impl->Interface.checkParse = &SR_Grammar_CheckParse;
+  impl->Interface.compile = &SR_Grammar_Compile;
+  impl->Interface.destroy = &SR_Grammar_Destroy;
+  impl->Interface.getParameter = &SR_Grammar_GetParameter;
+  impl->Interface.getSize_tParameter = &SR_Grammar_GetSize_tParameter;
+  impl->Interface.resetAllSlots = &SR_Grammar_ResetAllSlots;
+  impl->Interface.save = &SR_Grammar_Save;
+  impl->Interface.setDispatchFunction = &SR_Grammar_SetDispatchFunction;
+  impl->Interface.setParameter = &SR_Grammar_SetParameter;
+  impl->Interface.setSize_tParameter = &SR_Grammar_SetSize_tParameter;
+  impl->Interface.setupRecognizer = &SR_Grammar_SetupRecognizer;
+  impl->Interface.unsetupRecognizer = &SR_Grammar_UnsetupRecognizer;
+  impl->Interface.setupVocabulary = &SR_Grammar_SetupVocabulary;
+  impl->syntax = NULL;
+  impl->recognizer = NULL;
+  impl->vocabulary = NULL;
+  impl->eventLog = NULL;
+  impl->logLevel = 0;
+  impl->isActivated = ESR_FALSE;
+  
+  CHKLOG(rc, ESR_SessionTypeCreate(&impl->parameters));
+  
+  /**
+   * Create the Semantic Graph and Processor to support CheckParse function
+   * (Since this function gets called by 'New', a semgraph and semproc are always
+   * created when the grammar is created)
+   */
+  rc = SR_SemanticGraphCreate(&impl->semgraph);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  rc = SR_SemanticProcessorCreate(&impl->semproc);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  CHKLOG(rc, ESR_SessionExists(&exists));
+  if (exists)
+  {
+    rc = ESR_SessionGetProperty(L("eventlog"), (void **)&impl->eventLog, TYPES_SR_EVENTLOG);
+    if (rc != ESR_NO_MATCH_ERROR && rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    rc = ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &impl->logLevel);
+    if (rc != ESR_NO_MATCH_ERROR && rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  
+  *self = (SR_Grammar*) impl;
+  return ESR_SUCCESS;
+CLEANUP:
+  FREE(impl);
+  return rc;
+}
+
+ESR_ReturnCode SR_GrammarCreate(SR_Grammar** self)
+{
+  ESR_ReturnCode rc;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  CHKLOG(rc, SR_Grammar_Create(self));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_Grammar_Compile(SR_Grammar* self)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  
+  if (!CA_CompileSyntax(impl->syntax))
+    return ESR_SUCCESS;
+  PLogError(L("ESR_FATAL_ERROR"));
+  return ESR_FATAL_ERROR;
+}
+
+/*
+ * The buffer for the pron is set very large because the real size is lost later on
+ * and all that is checked is whether a single phoneme will fit in the buffer. There
+ * is no concept of decrementing the bytes left. Because that code is one big monolithic
+ * piece of crap, it is very difficult to fix correctly. This kludge is appropriate
+ * because we don't have time to fix this correctly and there are probably dozens of
+ * similar problems in other parts of the code.
+ */
+
+ESR_ReturnCode SR_Grammar_AddWordToSlot(SR_Grammar* self, const LCHAR* slot, const LCHAR* word, 
+																				const LCHAR* pronunciation, int weight, const LCHAR* tag)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  SR_Vocabulary* vocab;
+  LCHAR buffer[4096];
+  const LCHAR* input_pronunciation = pronunciation;
+  size_t len = 4096;
+  ESR_ReturnCode rc = ESR_SUCCESS, logrc;
+  int ca_rc = -99;
+
+  if ( slot != NULL )
+  {
+    if ( strlen ( slot ) >= MAX_STRING_LEN )
+    {
+    PLogError ( "SR_Grammar_AddWordToSlot slot : %s too long : Max %d", slot, MAX_STRING_LEN - 1 );
+    return ( ESR_INVALID_ARGUMENT );
+    }
+  }
+  if ( word != NULL )
+  {
+    if ( strlen ( word ) >= MAX_STRING_LEN )
+    {
+    PLogError ( "SR_Grammar_AddWordToSlot word : %s too long : Max %d", word, MAX_STRING_LEN - 1 );
+    return ( ESR_INVALID_ARGUMENT );
+    }
+  }
+  if ( pronunciation != NULL )
+  {
+    if ( strlen ( pronunciation ) >= MAX_STRING_LEN )
+    {
+    PLogError ( "SR_Grammar_AddWordToSlot pronunciation : %s too long : Max %d", pronunciation, MAX_STRING_LEN  - 1 );
+    return ( ESR_INVALID_ARGUMENT );
+    }
+  }
+  if ( tag != NULL )
+  {
+    if ( strlen ( tag ) >= MAX_STRING_LEN )
+    {
+    PLogError ( "SR_Grammar_AddWordToSlot tag : %s too long : Max %d", tag, MAX_STRING_LEN - 1 );
+    return ( ESR_INVALID_ARGUMENT );
+    }
+  }
+#if 0
+  /* make sure to have the latest arbdata to add words, however since
+     the arbdata is known to be constant for all acoustic models we 
+	 have (ie for the different sample rates), then there is no need
+	 to do this, it slows down addition anyways */
+  CA_Arbdata* ca_arbdata; 
+  SR_AcousticModels* models;
+  impl->recognizer->getModels( impl->recognizer, &models);
+  ca_arbdata = models->GetArbdata(models);
+  CA_AttachArbdataToSyntax( impl->syntax , ca_arbdata);
+#endif
+
+  /* yw HACK: Xanavi's application has bug. remove this check to let it work */
+  /* TODO: add this word to the semantic graph with associated script tag */
+  if (impl->vocabulary == NULL)
+  {
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  
+  /* tag may be NULL which means no script (no-op denoted by a simple semi-colon) */
+  if (!tag || !*tag)
+    tag = L(";");
+    
+  if (!pronunciation || !(*pronunciation) || !LSTRCMP(pronunciation, L("NULL")))
+  {
+    vocab = (SR_Vocabulary*) impl->vocabulary;
+    CHKLOG(rc, vocab->getPronunciation(vocab, word, buffer, &len));
+    pronunciation = buffer;
+  }
+  
+  /*
+   * 'buffer' contains a list of null-terminated pronunciations.
+   * Two consecutive null characters denote the end of the list.
+   *
+   * (In theory yes, but right now, only one pron is supported)
+   */
+  if (impl->eventLog != NULL)
+  {
+    CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl));
+    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("SLOT"), slot));
+    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("WORD"), word));
+    if (input_pronunciation)
+      CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("PRON"), pronunciation));
+    else
+      CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("GPRON"), pronunciation));
+    CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("WEIGHT"), weight));
+    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("TAG"), tag));
+  }
+  
+  /* add word to syntax first */
+  /*
+   *
+   * if word already exists and pron is same (i.e. as if no action)               returns FST_SUCCESS
+   * if word already exists and pron is different (e.g. read-rEd and read-red)    returns FST_SUCCESS
+   * if word does not exist and no duplicate pron exists (homonyms not supported) returns FST_SUCCESS
+   *                                                                                 else FST_FAILED
+   */
+  ca_rc = CA_AddWordToSyntax(impl->syntax, slot, word, pronunciation, weight);
+  switch (ca_rc)
+  {
+    case FST_SUCCESS:
+      /* successful, now add word & tag to semgraph */
+      CHKLOG(rc, impl->semgraph->addWordToSlot(impl->semgraph, slot, word, tag, 1));
+      break;
+    case FST_SUCCESS_ON_OLD_WORD:
+    case FST_FAILED_ON_HOMOGRAPH:
+      /* successful, now add word & tag to semgraph */
+      CHKLOG(rc, impl->semgraph->addWordToSlot(impl->semgraph, slot, word, tag, 0));
+      break;
+    case FST_FAILED_ON_MEMORY:
+      rc = ESR_OUT_OF_MEMORY;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    case FST_FAILED_ON_INVALID_ARGS:
+      rc = ESR_INVALID_ARGUMENT;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    case FST_FAILED_ON_HOMONYM:
+      rc = ESR_NOT_SUPPORTED;
+      /* remove this message from product */
+#if !defined(NDEBUG) || defined(_WIN32)
+      PLogError(L("%s: Homonym '%s' could not be added"), ESR_rc2str(rc), word);
+#endif
+      goto CLEANUP;
+    default:
+      rc = ESR_INVALID_STATE;
+      PLogError(L("%s|%s|%s|ca_rc=%d"), word, pronunciation, ESR_rc2str(rc), ca_rc);
+      goto CLEANUP;
+  }
+  
+  if (impl->eventLog != NULL && (impl->logLevel & OSI_LOG_LEVEL_ADDWD))
+  {
+    CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("caRC"), (int) ca_rc));
+    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("ok")));
+    CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRaddWd")));
+  }
+  return rc;
+CLEANUP:
+  PLogError(L("failed on |%s|%s|%s|\n"), slot, word, pronunciation);
+  if (impl->eventLog != NULL && (impl->logLevel & OSI_LOG_LEVEL_ADDWD))
+  {
+    CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("caRC"), (int) ca_rc));
+    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("err1")));
+    CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRaddWd")));
+  }
+  return rc;
+}
+
+ESR_ReturnCode SR_Grammar_ResetAllSlots(SR_Grammar* self)
+{
+  ESR_ReturnCode rc, logrc;
+  int irc;
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  
+  rc = impl->semgraph->reset(impl->semgraph);
+  if (rc == ESR_SUCCESS)
+  {
+    irc = CA_ResetSyntax(impl->syntax);
+    rc = irc ? ESR_INVALID_STATE : ESR_SUCCESS;
+  }
+  
+  if (impl->eventLog != NULL)
+  {
+    CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl));
+    if (rc == ESR_SUCCESS)
+      CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("ok")));
+    else
+      CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("fail")));
+    CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRrstSlot")));
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_Grammar_AddNametagToSlot(SR_Grammar* self, const LCHAR* slot, 
+                                           const SR_Nametag* nametag, int weight, const LCHAR* tag)
+{
+  SR_NametagImpl* nametagImpl = (SR_NametagImpl*) nametag;
+  ESR_ReturnCode rc;
+  
+  CHKLOG(rc, self->addWordToSlot(self, slot, nametagImpl->id, nametagImpl->value, weight, tag));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_Grammar_SetDispatchFunction(SR_Grammar* self, const LCHAR* functionName, void* userData, SR_GrammarDispatchFunction function)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  ESR_ReturnCode rc;
+  SR_SemanticProcessorImpl* semprocImpl = (SR_SemanticProcessorImpl*) impl->semproc;
+  
+  CHKLOG(rc, EP_RegisterFunction(semprocImpl->parser, functionName, userData, function));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_GrammarLoad(const LCHAR* grammar, SR_Grammar** self)
+{
+  SR_Grammar* Interface = NULL;
+  SR_GrammarImpl* impl;
+  LCHAR* tok;
+  ESR_ReturnCode rc;
+  LCHAR filename[P_PATH_MAX];
+  int addWords;
+  
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  CHKLOG(rc, SR_Grammar_Create(&Interface));
+  impl = (SR_GrammarImpl*) Interface;
+  
+  /**
+   * Our filename (referring to the grammar to load, may have associated grammar properties
+   * appended to the end of it. We need to split up the properties from the filename
+   * example:
+   *  recog_nm/namesnnumsSC_dyn,addWords=2000 becomes
+   *    filename: recog_nm/namesnnumsSC_dyn
+   *    property: addWords=2000
+   */
+  
+  /* init */
+  LSTRCPY(filename, grammar);
+  addWords = 0;
+  
+  for (tok = strtok(filename, ","); tok; tok = strtok(NULL, ","))
+  {
+    if (LSTRSTR(tok, "addWords"))
+    {
+      addWords = atoi(LSTRCHR(tok, L('=')) + sizeof(LCHAR));
+    }
+    else if (tok != filename)
+    {
+      PLogError(L("UNKNOWN grammar load property %s"), tok);
+      rc = ESR_INVALID_STATE;
+      goto CLEANUP;
+    }
+  }
+  
+  /**
+   * Based on the filename, determine if you are loading from image or loading from text files.
+   * If from image, then the filename will have extension .g2g. If from file, then only a basename
+   * will be provided (i.e. without extension)
+   */
+  
+  impl->syntax = CA_AllocateSyntax();
+  if (impl->syntax == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  
+  if (LSTRSTR(filename, L(".g2g")))
+  {
+    /* if the filename ends with .g2g, then we have a binary image */
+    if (CA_LoadSyntaxFromImage(impl->syntax, (LCHAR*) filename))
+    {
+      rc = ESR_READ_ERROR;
+      PLogError(L("ESR_READ_ERROR: Problem loading syntax from image"));
+      goto CLEANUP;
+    }
+  }
+  else
+  {
+    if (CA_LoadSyntaxAsExtensible(impl->syntax, (LCHAR*) filename, addWords))
+    {
+      rc = ESR_READ_ERROR;
+      PLogError(L("ESR_READ_ERROR: Problem loading syntax from text"));
+      goto CLEANUP;
+    }
+  }
+  
+  /*
+   * Semantic Graph Loading
+   *
+   * - it was already created in Grammar_Create()
+   * - reuse the same input labels from the recognition context
+   * - load knows how to load from base filename or .g2g image
+   */
+  rc = impl->semgraph->load(impl->semgraph, impl->syntax->synx->olabels, filename, addWords);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(L("%s: loading semgraph from image %s"), ESR_rc2str(rc), filename);
+    impl->semgraph = NULL;
+    goto CLEANUP;
+  }
+  
+  *self = Interface;
+  if (impl->eventLog)
+  {
+    CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl));
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("name"), filename));
+    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRldgrm")));
+  }
+  
+  return ESR_SUCCESS;
+CLEANUP:
+  if (Interface != NULL)
+    Interface->destroy(Interface);
+  *self = NULL;
+  return rc;
+}
+
+ESR_ReturnCode SR_Grammar_Save(SR_Grammar* self, const LCHAR* filename)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  int version_number = 2;  
+
+  if (filename == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  if (CA_DumpSyntaxAsImage(impl->syntax, filename, version_number)) /* returns 1 on failure */
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_STATE;
+  }
+  if (SR_SemanticGraph_Save(impl->semgraph, filename, version_number) != ESR_SUCCESS)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_STATE;
+  }
+  
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Grammar_SetParameter(SR_Grammar* self, const LCHAR* key, void* value)
+{
+  /*TODO: complete with logging*/
+  return ESR_NOT_IMPLEMENTED;
+}
+
+ESR_ReturnCode SR_Grammar_SetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t value)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  size_t temp;
+  ESR_ReturnCode rc;
+  
+  rc = impl->parameters->getSize_t(impl->parameters, key, &temp);
+  if (rc == ESR_SUCCESS)
+  {
+    if (temp == value)
+      return ESR_SUCCESS;
+    CHKLOG(rc, impl->parameters->removeAndFreeProperty(impl->parameters, key));
+  }
+  else if (rc != ESR_NO_MATCH_ERROR)
+    return rc;
+    
+  CHKLOG(rc, impl->parameters->setSize_t(impl->parameters, key, value));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_Grammar_GetParameter(SR_Grammar* self, const LCHAR* key, void** value)
+{
+
+  /*TODO: complete with logging*/
+  return ESR_NOT_IMPLEMENTED;
+}
+
+ESR_ReturnCode SR_Grammar_GetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t* value)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  ESR_ReturnCode rc;
+  
+  if (!LSTRCMP(key, "locale"))
+  {
+    ESR_Locale locale;
+    rc = SR_VocabularyGetLanguage(impl->vocabulary, &locale);
+    if (rc != ESR_SUCCESS)
+      return rc;
+      
+    *value = locale;
+    return ESR_SUCCESS;
+  }
+  else
+  {
+    rc = impl->parameters->getSize_t(impl->parameters, key, value);
+    if (rc == ESR_NO_MATCH_ERROR)
+    {
+      CHKLOG(rc, ESR_SessionGetSize_t(key, value));
+      return ESR_SUCCESS;
+    }
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      return rc;
+    }
+    return ESR_SUCCESS;
+  }
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_Grammar_Destroy(SR_Grammar* self)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  ESR_ReturnCode rc;
+  
+  if (impl->parameters != NULL)
+  {
+    CHKLOG(rc, impl->parameters->destroy(impl->parameters));
+    impl->parameters = NULL;
+  }
+  
+  if (impl->syntax != NULL)
+  {
+    CA_FreeSyntax(impl->syntax);
+    impl->syntax = NULL;
+  }
+  
+  if (impl->semgraph != NULL)
+  {
+    CHKLOG(rc, impl->semgraph->unload(impl->semgraph));
+    CHKLOG(rc, impl->semgraph->destroy(impl->semgraph));
+    impl->semgraph = NULL;
+  }
+  
+  if (impl->semproc != NULL)
+  {
+    CHKLOG(rc, impl->semproc->destroy(impl->semproc));
+    impl->semproc = NULL;
+  }
+  
+  if (impl->eventLog)
+  {
+    CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl));
+    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRklgrm")));
+  }
+  
+  FREE(self);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_Grammar_SetupRecognizer(SR_Grammar* self, SR_Recognizer* recognizer)
+{
+  ESR_ReturnCode rc;
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  CA_Arbdata* ca_arbdata;
+  SR_AcousticModels* models = NULL;
+  
+  if (impl == NULL || recognizer == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl->recognizer  = recognizer;
+  recognizer->setWordAdditionCeiling( recognizer, self);
+
+  rc = recognizer->getModels( recognizer, &models);
+  if(rc != ESR_SUCCESS || models == NULL) {
+	  impl->recognizer = NULL;
+	  CA_AttachArbdataToSyntax( impl->syntax, NULL);
+	  return ESR_INVALID_STATE;
+  } 
+  ca_arbdata = (CA_Arbdata*)(models->getArbdata( models));
+  rc = CA_AttachArbdataToSyntax( impl->syntax, ca_arbdata);
+  if(rc != 0) 
+	  return ESR_INVALID_STATE;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Grammar_UnsetupRecognizer(SR_Grammar* self)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  if(impl == NULL) return ESR_INVALID_ARGUMENT;
+  impl->recognizer  = NULL;
+  CA_AttachArbdataToSyntax( impl->syntax, NULL);
+  return ESR_SUCCESS;
+}
+
+SREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetupVocabulary(SR_Grammar *self, SR_Vocabulary *vocabulary)
+{
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  
+  if (vocabulary == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl->vocabulary = vocabulary;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Grammar_CheckParse(SR_Grammar* self, const LCHAR* transcription, SR_SemanticResult** result, size_t* resultCount)
+{
+  ESR_ReturnCode rc;
+  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
+  size_t resultCountIn = *resultCount;
+  
+  if (transcription == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  /* NULL for special implementation when CheckParse is called by application that does not know
+     about the hidden data structure SR_SemanticResult */
+  if (result == NULL)
+  {
+    if (CA_CheckTranscription(impl->syntax, transcription, 0) == 0)
+      *resultCount = 1;
+    else
+      *resultCount = 0;
+    return ESR_SUCCESS;
+  } 
+  rc = impl->semproc->checkParse(impl->semproc, impl->semgraph, transcription, result, resultCount);
+  if (*resultCount == 0)
+  {
+    /* get the literal that did parse from the text_parser.c code */
+    char copy_of_trans[512];
+    strcpy(copy_of_trans, transcription);
+    *resultCount = resultCountIn;
+    if (CA_CheckTranscription(impl->syntax, (LCHAR*)copy_of_trans, 0) == 0)
+      rc = impl->semproc->checkParse(impl->semproc, impl->semgraph, copy_of_trans, result, resultCount);
+  }
+  return rc;
+}
+
+#define DISABLEcostdata 8192
+
+ESR_ReturnCode SR_GrammarAllowOnly(SR_Grammar* self, const char* transcription)
+{
+  char copy_of[512], *word;
+  int i, j;
+  wordID wdids[32], nw = 0;
+  SR_GrammarImpl* impl = (SR_GrammarImpl*)self;
+  CA_Syntax* ca_syntax = impl->syntax;
+  srec_context* fst = ca_syntax->synx;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  strcpy(copy_of, transcription);
+  
+  for (word = strtok(copy_of, " "); word; nw++, word = strtok(NULL, " "))
+  {
+    wdids[nw] =   wordmap_find_index(fst->olabels, word);
+    if (wdids[nw] == MAXwordID)
+      rc = ESR_NO_MATCH_ERROR;
+  }
+  
+  for (i = 0; i < fst->num_arcs; i++)
+  {
+    wordID wdid = fst->FSMarc_list[i].olabel;
+    if (wdid < EPSILON_OFFSET) ;
+    else if (wdid == fst->beg_silence_word) ;
+    else if (wdid == fst->end_silence_word) ;
+    else
+    {
+      for (j = nw; --j >= 0;)
+        if (wdid == wdids[j]) break;
+      if (j < 0)
+      {
+        fst->FSMarc_list[i].cost |= DISABLEcostdata; /* disable this arc */
+      }
+      else
+      {
+        /* pfprintf(PSTDOUT, "enabling arc %d for %d %s\n",
+           i, wdid, transcription); */
+        fst->FSMarc_list[i].cost &= ~(DISABLEcostdata); /* enable this arc */
+      }
+    }
+  }
+  /* added, this way we prevent more failures due to dead ends */
+  for (; ;)
+  {
+    FSMarc* arc;
+    arcID j, counter = 0;
+    nodeID node;
+    costdata mincost;
+    
+    for (i = 0; i < fst->num_arcs; i++)
+    {
+      if (fst->FSMarc_list[i].cost < DISABLEcostdata)
+      {
+        node = fst->FSMarc_list[i].to_node;
+        if (node == fst->end_node) continue;
+        mincost = DISABLEcostdata;
+        for (j = fst->FSMnode_list[node].un_ptr.first_next_arc; j != MAXarcID; j = arc->linkl_next_arc)
+        {
+          arc = &fst->FSMarc_list[j];
+          if (arc->cost < mincost) mincost = arc->cost;
+        }
+        if (mincost >= DISABLEcostdata)
+        {
+          fst->FSMarc_list[i].cost |= DISABLEcostdata;
+          counter++;
+        }
+      }
+    }
+    if (counter == 0) break;
+  }
+  
+  return rc;
+}
+
+ESR_ReturnCode SR_GrammarAllowAll(SR_Grammar* self)
+{
+  int i;
+  SR_GrammarImpl* impl = (SR_GrammarImpl*)self;
+  CA_Syntax* ca_syntax = impl->syntax;
+  srec_context* fst = ca_syntax->synx;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  for (i = 0; i < fst->num_arcs; i++)
+  {
+    fst->FSMarc_list[i].cost &= ~(DISABLEcostdata); /* enable this arc */
+  }
+  return rc;
+}
+
diff --git a/srec/Nametag/Android.mk b/srec/Nametag/Android.mk
new file mode 100644
index 0000000..3ddbc54
--- /dev/null
+++ b/srec/Nametag/Android.mk
@@ -0,0 +1,74 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/Nametag.c \
+	src/NametagImpl.c \
+	src/Nametags.c \
+	src/NametagsImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+	$(ASR_ROOT_DIR)/seti/sltsEngine/include \
+
+common_CFLAGS := \
+	-DSREC_NAMETAG_EXPORTS \
+	-DUSE_TTP \
+	-DUSE_FSM_DICT \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_Vocabulary \
+
+common_TARGET:= libSR_Nametag
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/Nametag/include/SR_Nametag.h b/srec/Nametag/include/SR_Nametag.h
new file mode 100644
index 0000000..12606d5
--- /dev/null
+++ b/srec/Nametag/include/SR_Nametag.h
@@ -0,0 +1,103 @@
+/*---------------------------------------------------------------------------*
+ *  SR_Nametag.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_NAMETAG_H
+#define __SR_NAMETAG_H
+
+
+
+#include "SR_NametagDefs.h"
+#include "SR_Recognizer.h"
+#include "SR_RecognizerResult.h"
+
+/**
+ * Create a new Nametag from the last recognition result.
+ *
+ * @param result RecognizerResult handle
+ * @param id Nametag id
+ * @param self Nametag handle
+ * @return ESR_OUT_OF_MEMORY if the system is out of memory; ESR_INVALID_ARGUMENT if result, self or the
+ * value pointed to by value are null; ESR_INVALID_STATE if the nametag value is invalid
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagCreate(const SR_RecognizerResult* result,
+    const LCHAR* id,
+    SR_Nametag** self);
+
+/**
+ * Create a new Nametag from the persistent storage
+ *
+ * @param id Nametag id
+ * @param value Transcription content (opaque)
+ * @param len length of the value (number of opaque bytes)
+ * @param self Nametag handle
+ * @return ESR_OUT_OF_MEMORY if the system is out of memory; ESR_INVALID_ARGUMENT if result, self or the
+ * value pointed to by value are null; ESR_INVALID_STATE if the nametag value is invalid
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagCreateFromValue(const LCHAR* id, const char* value, size_t len, SR_Nametag** self);
+  
+/**
+ * Gets the nametag ID.
+ *
+ * @param self Nametag handle
+ * @param id Nametag id
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagGetID(const SR_Nametag* self, LCHAR** id);
+
+/**
+ * Gets the nametag transcription.
+ *
+ * @param self Nametag handle
+ * @param id Nametag id
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagGetValue(const SR_Nametag* self, const char** pvalue, size_t *plen);
+
+/**
+ * Sets the nametag ID.
+ *
+ * @param self Nametag handle
+ * @param id Nametag id
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagSetID(SR_Nametag* self, const LCHAR* id);
+
+/**
+ * Clones a nametag.
+ *
+ * @param self Nametag handle
+ * @param result the resulting Nametag
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagClone(const SR_Nametag* self, SR_Nametag** result);
+
+/**
+ * Destroys a Nametag.
+ *
+ * @param self Nametag handle
+ * @return ESR_SUCCESS
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagDestroy(SR_Nametag* self);
+
+/**
+ * @}
+ */
+
+
+#endif /* __SR_NAMETAG_H */
diff --git a/srec/Nametag/include/SR_NametagDefs.h b/srec/Nametag/include/SR_NametagDefs.h
new file mode 100644
index 0000000..07bcd0b
--- /dev/null
+++ b/srec/Nametag/include/SR_NametagDefs.h
@@ -0,0 +1,97 @@
+/*---------------------------------------------------------------------------*
+ *  SR_NametagDefs.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_NAMETAGDEFS_H
+#define __SR_NAMETAGDEFS_H
+
+
+
+#include "SR_NametagPrefix.h"
+#include "ESR_Locale.h"
+#include "ptypes.h"
+#include "ESR_ReturnCode.h"
+
+
+/**
+ * @addtogroup SR_NametagModule SR_Nametag API functions
+ * Nametags are user-added words. These words are created using the audio that has been collected
+ * during a recognition phase. The Recognizer stores the audio in the RecognizerResult object.
+ * The result is passed to NametagCreate() to create the nametag. The Nametags object is a 
+ * collection of nametags. The nametag will consist of the speech parts of the audio. The
+ * silence from the ends of the utterance, and any long pause between speech chunks, is removed.
+ *
+ * @{
+ */
+
+/**
+ * Represents a nametag.
+ */
+typedef struct SR_Nametag_t
+{
+	/**
+	 * Returns the Nametag ID.
+	 *
+	 * @param self Nametag handle
+	 * @param id Nametag ID
+	 * @return ESR_INVALID_ARGUMENT if self is null
+	 */
+  ESR_ReturnCode (*getID)(const struct SR_Nametag_t* self, LCHAR** id);
+
+  	/**
+	 * Returns the Nametag ID.
+	 *
+	 * @param self Nametag handle
+	 * @param pvalue pointer to the transcription, SR_Nametag retains ownership
+	 * @param plen pointer to the length of the transcription
+	 * @return ESR_NO_MATCH_ERROR if self is null or bad voice tag
+	 */
+  ESR_ReturnCode (*getValue)(const struct SR_Nametag_t* self, const char** pvalue, size_t* plen);
+
+	/**
+	 * Sets the Nametag ID.
+	 *
+	 * @param self Nametag handle
+	 * @param id Nametag ID
+	 * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+	 */
+	ESR_ReturnCode (*setID)(struct SR_Nametag_t* self, const LCHAR* id);
+
+  /**
+   * Clones a nametag.
+   *
+   * @param self Nametag handle
+   * @param result the resulting Nametag
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
+   */
+  ESR_ReturnCode (*clone)(const struct SR_Nametag_t* self, struct SR_Nametag_t** result);
+
+  /**
+	 * Destroys a nametag.
+	 *
+	 * @param self Nametag handle
+	 * @return ESR_SUCCESS
+	 */
+	ESR_ReturnCode (*destroy)(struct SR_Nametag_t* self);
+} SR_Nametag;
+
+/**
+ * @}
+ */
+
+#endif /* __SR_NAMETAGDEFS_H */
diff --git a/srec/Nametag/include/SR_NametagImpl.h b/srec/Nametag/include/SR_NametagImpl.h
new file mode 100644
index 0000000..bb87733
--- /dev/null
+++ b/srec/Nametag/include/SR_NametagImpl.h
@@ -0,0 +1,71 @@
+/*---------------------------------------------------------------------------*
+ *  SR_NametagImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_NAMETAGIMPL_H
+#define __SR_NAMETAGIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "SR_Nametag.h"
+
+/**
+ * Nametag implementation.
+ */
+typedef struct SR_NametagImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_Nametag Interface;
+  /**
+   * Nametag ID.
+   */
+  LCHAR* id;
+  /**
+   * Nametag phoneme value.
+   */
+  LCHAR* value;
+  size_t value_len;
+}
+SR_NametagImpl;
+
+
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_Nametag_GetID(const SR_Nametag* self, LCHAR** id);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_Nametag_GetValue(const SR_Nametag* self, const char** pvalue, size_t *plen);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_Nametag_SetID(SR_Nametag* self, const LCHAR* id);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_Nametag_Clone(const SR_Nametag* self, SR_Nametag** clone);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_Nametag_Destroy(SR_Nametag* self);
+
+#endif /* __SR_NAMETAGIMPL_H */
diff --git a/srec/Nametag/include/SR_NametagPrefix.h b/srec/Nametag/include/SR_NametagPrefix.h
new file mode 100644
index 0000000..e0970af
--- /dev/null
+++ b/srec/Nametag/include/SR_NametagPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_NametagPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_NAMETAG_PREFIX_H
+#define __SR_NAMETAG_PREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_NAMETAG_EXPORTS
+#define SREC_NAMETAG_API PORT_EXPORT_DECL
+#else
+#define SREC_NAMETAG_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/Nametag/include/SR_Nametags.h b/srec/Nametag/include/SR_Nametags.h
new file mode 100644
index 0000000..9fd73fa
--- /dev/null
+++ b/srec/Nametag/include/SR_Nametags.h
@@ -0,0 +1,220 @@
+/*---------------------------------------------------------------------------*
+ *  SR_Nametags.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_NAMETAGS_H
+#define __SR_NAMETAGS_H
+
+
+
+#include "SR_NametagsPrefix.h"
+#include "ptypes.h"
+#include "pstdio.h"
+//#include "SR_Recognizer.h"
+#include "SR_NametagDefs.h"
+#include "ESR_ReturnCode.h"
+
+
+/**
+ * @addtogroup SR_NametagsModule SR_Nametags API functions
+ * Represents a Nametag collection.
+ *
+ * @{
+ */
+
+/**
+ * Represents a Nametag collection.
+ */
+typedef struct SR_Nametags_t
+{
+  /**
+   * Loads a nametag collection.
+   *
+   * @param self Nametags handle
+   * @param filename File to read from
+   */
+  ESR_ReturnCode(*load)(struct SR_Nametags_t* self, const LCHAR* filename);
+  
+  /**
+   * Saves a nametag collection.
+   *
+   * @param self Nametags handle
+   * @param filename File to write to
+   */
+  ESR_ReturnCode(*save)(struct SR_Nametags_t* self, const LCHAR* filename);
+  
+  /**
+   * Adds nametag to collection.
+   *
+   * @param self Nametags handle
+   * @param nametag Nametag to be added
+   */
+  ESR_ReturnCode(*add)(struct SR_Nametags_t* self, SR_Nametag* nametag);
+  
+  /**
+   * Removes nametag from collection.
+   *
+   * @param self Nametags handle
+   * @param id ID of nametag to be removed
+   */
+  ESR_ReturnCode(*remove)(struct SR_Nametags_t* self, const LCHAR* id);
+  
+  /**
+   * Returns the number of nametags within the collection.
+   *
+   * @param self Nametags handle
+   * @param result Resulting value
+   */
+  ESR_ReturnCode(*getSize)(struct SR_Nametags_t* self, size_t* result);
+  
+  /**
+   * Returns Nametag with the specified ID. It is illegal to destroy the returned Nametag
+   * until it is removed from the Nametags collection.
+   *
+   * @param self Nametags handle
+   * @param ud Nametag id
+   * @param nametag Nametag at index
+   */
+  ESR_ReturnCode(*get)(struct SR_Nametags_t* self, const LCHAR* id, SR_Nametag** nametag);
+  
+  /**
+   * Returns Nametag at the specified index. It is illegal to destroy the returned Nametag
+   * until it is removed from the Nametags collection.
+   *
+   * @param self Nametags handle
+   * @param index Nametag index
+   * @param nametag Nametag at index
+   */
+  ESR_ReturnCode(*getAtIndex)(struct SR_Nametags_t* self, size_t index, SR_Nametag** nametag);
+  
+  /**
+   * Indicates if collection contains specified nametag.
+   *
+   * @param self Nametags handle
+   * @param id Nametag ID to search for
+    * @param result True if nametag was found
+   */
+  ESR_ReturnCode(*contains)(struct SR_Nametags_t* self, const LCHAR* id, ESR_BOOL* result);
+  
+  /**
+  * Destroys a nametag collection.
+  *
+  * @param self Nametags handle
+  */
+  ESR_ReturnCode(*destroy)(struct SR_Nametags_t* self);
+}
+SR_Nametags;
+
+/**
+ * @name Nametags operations
+ *
+ * @{
+ */
+
+/**
+ * Create a new Nametag collection.
+ *
+ * @param self Nametags handle
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsCreate(SR_Nametags** self);
+
+/**
+ * Loads a nametag collection.
+ *
+ * @param self Nametags handle
+ * @param filename File to read from
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsLoad(SR_Nametags* self, const LCHAR* filename);
+
+/**
+ * Saves a nametag collection.
+ *
+ * @param self Nametags handle
+ * @param filename File to write to
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsSave(SR_Nametags* self, const LCHAR* filename);
+
+/**
+ * Adds nametag to collection.
+ *
+ * @param self Nametags handle
+ * @param nametag Nametag to be added
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsAdd(SR_Nametags* self, SR_Nametag* nametag);
+
+/**
+ * Removes nametag from collection.
+ *
+ * @param self Nametags handle
+ * @param id ID of nametag to be removed
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsRemove(SR_Nametags* self, const LCHAR* id);
+
+/**
+ * Returns the number of nametags within the collection.
+ *
+ * @param self Nametags handle
+ * @param result Resulting value
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsGetSize(SR_Nametags* self, size_t* result);
+
+/**
+ * Returns Nametag with the specified ID. It is illegal to destroy the returned Nametag
+ * until it is removed from the Nametags collection.
+ *
+ * @param self Nametags handle
+ * @param id Nametag ID
+ * @param nametag Nametag at index
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsGet(SR_Nametags* self, const LCHAR* id, SR_Nametag** nametag);
+
+/**
+ * Returns Nametag at the specified index. It is illegal to destroy the returned Nametag
+ * until it is removed from the Nametags collection.
+ *
+ * @param self Nametags handle
+ * @param index Nametag index
+ * @param nametag Nametag at index
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsGetAtIndex(SR_Nametags* self, size_t index, SR_Nametag** nametag);
+
+/**
+ * Indicates if collection contains specified nametag.
+ *
+ * @param self Nametags handle
+ * @param id Nametag ID to search for
+ * @param result True if nametag was found
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsContains(SR_Nametags* self, const LCHAR* id, ESR_BOOL* result);
+
+/**
+ * Destroys a Nametag collection.
+ *
+ * @param self Nametag handle
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsDestroy(SR_Nametags* self);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#endif /* __SR_NAMETAGS_H */
diff --git a/srec/Nametag/include/SR_NametagsImpl.h b/srec/Nametag/include/SR_NametagsImpl.h
new file mode 100644
index 0000000..fd94d38
--- /dev/null
+++ b/srec/Nametag/include/SR_NametagsImpl.h
@@ -0,0 +1,94 @@
+/*---------------------------------------------------------------------------*
+ *  SR_NametagsImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_NAMETAGSIMPL_H
+#define __SR_NAMETAGSIMPL_H
+
+
+
+#include "ArrayList.h"
+#include "ESR_ReturnCode.h"
+#include "HashMap.h"
+#include "SR_EventLog.h"
+#include "SR_Nametag.h"
+#include "SR_Nametags.h"
+
+/**
+ * Nametags implementation.
+ */
+typedef struct SR_NametagsImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_Nametags Interface;
+  /**
+   * Nametag collection.
+   */
+  HashMap* value;
+  /**
+   * OSI event-log.
+   */
+  SR_EventLog* eventLog;
+  /**
+   * Eventlog logging level.
+   */
+  size_t logLevel;
+}
+SR_NametagsImpl;
+
+
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsLoadImpl(SR_Nametags* self, const LCHAR* filename);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsSaveImpl(SR_Nametags* self, const LCHAR* filename);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsAddImpl(SR_Nametags* self, SR_Nametag* nametag);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsRemoveImpl(SR_Nametags* self, const LCHAR* id);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsGetSizeImpl(SR_Nametags* self, size_t* result);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsGetImpl(SR_Nametags* self, const LCHAR* id, SR_Nametag** nametag);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsGetAtIndexImpl(SR_Nametags* self, size_t index, SR_Nametag** nametag);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsContainsImpl(SR_Nametags* self, const LCHAR* id, ESR_BOOL* result);
+/**
+ * Default implementation.
+ */
+SREC_NAMETAG_API ESR_ReturnCode SR_NametagsDestroyImpl(SR_Nametags* self);
+
+#endif /* __SR_NAMETAGSIMPL_H */
diff --git a/srec/Nametag/include/SR_NametagsPrefix.h b/srec/Nametag/include/SR_NametagsPrefix.h
new file mode 100644
index 0000000..16dadee
--- /dev/null
+++ b/srec/Nametag/include/SR_NametagsPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_NametagsPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef SR_NAMETAGS_PREFIX_H
+#define SR_NAMETAGS_PREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_NAMETAGS_EXPORTS
+#define SREC_NAMETAGS_API PORT_EXPORT_DECL
+#else
+#define SREC_NAMETAGS_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/Nametag/src/Nametag.c b/srec/Nametag/src/Nametag.c
new file mode 100644
index 0000000..485e2b8
--- /dev/null
+++ b/srec/Nametag/src/Nametag.c
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*
+ *  Nametag.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_Nametag.h"
+#include "SR_NametagImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+ESR_ReturnCode SR_NametagGetID(const SR_Nametag* self, LCHAR** id)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getID(self, id);
+}
+
+ESR_ReturnCode SR_NametagGetValue(const SR_Nametag* self, const char** pvalue, size_t* plen)
+{
+    if (self == NULL || pvalue == NULL || plen == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getValue(self, pvalue, plen);
+}
+
+ESR_ReturnCode SR_NametagSetID(SR_Nametag* self, const LCHAR* id)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setID(self, id);
+}
+
+ESR_ReturnCode SR_NametagClone(const SR_Nametag* self, SR_Nametag** result)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->clone(self, result);
+}
+
+ESR_ReturnCode SR_NametagDestroy(SR_Nametag* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
diff --git a/srec/Nametag/src/NametagImpl.c b/srec/Nametag/src/NametagImpl.c
new file mode 100644
index 0000000..78b0b42
--- /dev/null
+++ b/srec/Nametag/src/NametagImpl.c
@@ -0,0 +1,242 @@
+
+/*---------------------------------------------------------------------------*
+ *  NametagImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_Nametag.h"
+#include "SR_NametagImpl.h"
+#include "SR_RecognizerImpl.h"
+#include "SR_VocabularyImpl.h"
+#include "plog.h"
+#include "pmemory.h"
+
+#define MTAG NULL
+#define MAX_STRING_LEN P_PATH_MAX
+
+ESR_ReturnCode SR_NametagCreate(const SR_RecognizerResult* result, const LCHAR* id, SR_Nametag** self)
+{
+  ESR_Locale locale;
+  ESR_ReturnCode rc;
+  size_t len;
+  LCHAR transcription[MAX_STRING_LEN];
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  rc = result->getSize(result, &len);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (len < 1)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT (recognition result nbest-list size=0)"));
+    rc = ESR_INVALID_ARGUMENT;
+    goto CLEANUP;
+  }
+  rc = result->getLocale(result, &locale);
+  
+  len = MAX_STRING_LEN;
+
+  rc = result->getValue(result, 0, L("meaning"), transcription, &len);
+
+  if (rc != ESR_SUCCESS && rc != ESR_BUFFER_OVERFLOW)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+#if USE_HMM_BASED_ENROLLMENT /* srec_context.h */
+  len = LSTRLEN(transcription)+1;
+  rc = SR_NametagCreateFromValue(id, transcription, (int)len, self);
+  if(rc ) goto CLEANUP;
+#else
+  
+  if(1) {
+    LCHAR short_pron[MAX_STRING_LEN], *short_pron_ptr;
+    LCHAR* long_pron = transcription;
+    LCHAR* multichar;
+    LCHAR* p;
+    LCHAR singlechar[2];
+    
+    *short_pron = 0;
+    short_pron_ptr = short_pron;
+    len = LSTRLEN(L("ph_"));
+    for (multichar = strtok(long_pron, L(" \t\n\r")); multichar; multichar = strtok(NULL, L(" \t\n\r")))
+      {
+	p = multichar;
+	if (LSTRNCMP(p, L("ph_"), len) != 0)
+	  {
+	    PLogError(L("Expecting 'ph_' prefix, got=%s"), p);
+	    rc = ESR_INVALID_STATE;
+	    goto CLEANUP;
+	  }
+	p += len;
+	multichar = p;
+	while (*p)
+	  {
+	    if (isdigit(*p))
+	      {
+		*p = L('\0');
+		break;
+	      }
+	    ++p;
+	  }
+	if ((rc = SR_Vocabulary_etiinf_conv_from_multichar(locale, multichar, singlechar)) != ESR_SUCCESS)
+	  {
+	    PLogError(L("Could not convert long to short pron (input=%s, locale=%s)"), multichar, ESR_locale2str(locale));
+	    goto CLEANUP;
+	  }
+	singlechar[1] = 0;
+	if((short_pron_ptr - short_pron + 3) >= MAX_STRING_LEN) {
+	  PLogError(L("Chopping too long pron in SR_NametagCreate()\n"));
+	  break; // just cut if off
+	}
+	*short_pron_ptr++ = *singlechar;
+      }
+    *short_pron_ptr++ = 0; // null-term
+    *short_pron_ptr++ = 0; // double-null-term!
+
+    /* +2 = +1 for null, +1 for double-null */
+    rc = SR_NametagCreateFromValue(id, short_pron, (short_pron_ptr-short_pron), self);
+    if(rc ) goto CLEANUP;
+  }
+#endif
+
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagCreateFromValue(const LCHAR* id, const char* value, size_t len, SR_Nametag** self)
+{
+  SR_NametagImpl* impl;
+  ESR_ReturnCode rc;
+  
+  passert(self != NULL);
+  impl = NEW(SR_NametagImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  
+  impl->Interface.setID = &SR_Nametag_SetID;
+  impl->Interface.getID = &SR_Nametag_GetID;
+  impl->Interface.getValue = &SR_Nametag_GetValue;
+  impl->Interface.clone = &SR_Nametag_Clone;
+  impl->Interface.destroy = &SR_Nametag_Destroy;
+  impl->id = NULL;
+  impl->value = NULL;
+  impl->value = (LCHAR*) MALLOC(sizeof(LCHAR) * (len), MTAG);
+
+  if (impl->value == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  impl->value_len = len;
+  // make sure we have a double-null term
+  memcpy( (void*)impl->value, value, len); 
+  LSTRNCPY(impl->value, value, len); 
+  
+  rc = SR_NametagSetID(&impl->Interface, id);
+  if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  *self = (SR_Nametag*) impl;
+  return ESR_SUCCESS;
+CLEANUP:
+  impl->Interface.destroy(&impl->Interface);
+  return rc;
+}
+
+ESR_ReturnCode SR_Nametag_Destroy(SR_Nametag* self)
+{
+  SR_NametagImpl* impl = (SR_NametagImpl*) self;
+  if (impl->value != NULL)
+  {
+    FREE(impl->value);
+    impl->value = NULL;
+  }
+  if (impl->id != NULL)
+  {
+    FREE(impl->id);
+    impl->id = NULL;
+  }
+  FREE(impl);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Nametag_GetID(const SR_Nametag* self, LCHAR** id)
+{
+  SR_NametagImpl* impl = (SR_NametagImpl*) self;
+  
+  *id = impl->id;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Nametag_GetValue(const SR_Nametag* self, const char** pvalue, size_t* plen)
+{
+  SR_NametagImpl* impl = (SR_NametagImpl*) self;
+  
+  *pvalue = (const char*)impl->value;
+  if(!impl->value) 
+      return ESR_NO_MATCH_ERROR;
+  *plen = impl->value_len;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Nametag_SetID(SR_Nametag* self, const LCHAR* id)
+{
+  SR_NametagImpl* impl = (SR_NametagImpl*) self;
+  ESR_ReturnCode rc;
+  
+  FREE(impl->id);
+  impl->id = (LCHAR*) MALLOC(sizeof(LCHAR) * (LSTRLEN(id) + 1), MTAG);
+  if (impl->id == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(impl->id, id);
+  
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_Nametag_Clone(const SR_Nametag* self, SR_Nametag** result)
+{
+  SR_NametagImpl* impl = (SR_NametagImpl*) self;
+  ESR_ReturnCode rc;
+  
+  CHKLOG(rc, SR_NametagCreateFromValue(impl->id, impl->value, LSTRLEN(impl->value)+1, result));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/srec/Nametag/src/Nametags.c b/srec/Nametag/src/Nametags.c
new file mode 100644
index 0000000..7332ce5
--- /dev/null
+++ b/srec/Nametag/src/Nametags.c
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*
+ *  Nametags.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "plog.h"
+#include "SR_Nametags.h"
+
+ESR_ReturnCode SR_NametagsLoad(SR_Nametags* self, const LCHAR* filename)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->load(self, filename);
+}
+
+ESR_ReturnCode SR_NametagsSave(SR_Nametags* self, const LCHAR* filename)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->save(self, filename);
+}
+
+ESR_ReturnCode SR_NametagsAdd(SR_Nametags* self, SR_Nametag* nametag)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->add(self, nametag);
+}
+
+ESR_ReturnCode SR_NametagsRemove(SR_Nametags* self, const LCHAR* id)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->remove(self, id);
+}
+
+ESR_ReturnCode SR_NametagsGetSize(SR_Nametags* self, size_t* result)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getSize(self, result);
+}
+
+ESR_ReturnCode SR_NametagsGet(SR_Nametags* self, const LCHAR* id, SR_Nametag** nametag)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->get(self, id, nametag);
+}
+
+ESR_ReturnCode SR_NametagsGetAtIndex(SR_Nametags* self, size_t index, SR_Nametag** nametag)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getAtIndex(self, index, nametag);
+}
+
+ESR_ReturnCode SR_NametagsContains(SR_Nametags* self, const LCHAR* id, ESR_BOOL* result)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->contains(self, id, result);
+}
+
+ESR_ReturnCode SR_NametagsDestroy(SR_Nametags* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
diff --git a/srec/Nametag/src/NametagsImpl.c b/srec/Nametag/src/NametagsImpl.c
new file mode 100644
index 0000000..d3d4943
--- /dev/null
+++ b/srec/Nametag/src/NametagsImpl.c
@@ -0,0 +1,410 @@
+/*---------------------------------------------------------------------------*
+ *  NametagsImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ESR_Session.h"
+#include "HashMap.h"
+#include "LCHAR.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "SR_NametagImpl.h"
+#include "SR_NametagsImpl.h"
+
+#define MTAG NULL
+
+ESR_ReturnCode SR_NametagsCreate(SR_Nametags** self)
+{
+  SR_NametagsImpl* impl;
+  ESR_ReturnCode rc;
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = NEW(SR_NametagsImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  impl->Interface.load = &SR_NametagsLoadImpl;
+  impl->Interface.save = &SR_NametagsSaveImpl;
+  impl->Interface.add = &SR_NametagsAddImpl;
+  impl->Interface.remove = &SR_NametagsRemoveImpl;
+  impl->Interface.getSize = &SR_NametagsGetSizeImpl;
+  impl->Interface.get = &SR_NametagsGetImpl;
+  impl->Interface.getAtIndex = &SR_NametagsGetAtIndexImpl;
+  impl->Interface.contains = &SR_NametagsContainsImpl;
+  impl->Interface.destroy = &SR_NametagsDestroyImpl;
+  impl->value = NULL;
+  impl->eventLog = NULL;
+
+  CHKLOG(rc, HashMapCreate(&impl->value));
+  CHKLOG(rc, ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &impl->logLevel));
+  if (impl->logLevel > 0)
+    CHKLOG(rc, ESR_SessionGetProperty(L("eventlog"), (void **)&impl->eventLog, TYPES_SR_EVENTLOG));
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("pointer"), (int) self));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsCreate")));
+  *self = (SR_Nametags*) impl;
+  return ESR_SUCCESS;
+CLEANUP:
+  impl->Interface.destroy(&impl->Interface);
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsLoadImpl(SR_Nametags* self, const LCHAR* filename)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  ESR_ReturnCode rc;
+  PFile* file = NULL;
+  LCHAR line[256];
+  LCHAR* result = NULL;
+  LCHAR* id;
+  LCHAR* value;
+  SR_Nametag* newNametag = NULL;
+  SR_Nametag* oldNametag;
+  HashMap* nametags = impl->value;
+  size_t size, len, i;
+  LCHAR devicePath[P_PATH_MAX];
+  LCHAR number[MAX_UINT_DIGITS+1];
+#define NAMETAGID_LENGTH 20
+  /* strlen("token\0") == 6 */
+#define TOKEN_LENGTH 6 + NAMETAGID_LENGTH
+  LCHAR tokenName[TOKEN_LENGTH];
+
+  if (filename == NULL)
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  size = P_PATH_MAX;
+  CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.nametagPath"), devicePath, &size));
+  /* check if the filename has the path */
+  if (LSTRNCMP(filename, devicePath, LSTRLEN(devicePath)) != 0)
+    LSTRCAT(devicePath, filename);
+  else
+    LSTRCPY(devicePath, filename);
+  file = pfopen ( devicePath, L("r"));
+/*  CHKLOG(rc, PFileSystemCreatePFile(devicePath, ESR_TRUE, &file));
+  CHKLOG(rc, file->open(file, L("r")));*/
+
+  if ( file == NULL )
+    goto CLEANUP;
+
+  /* Flush collection */
+  CHKLOG(rc, nametags->getSize(nametags, &size));
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, nametags->getValueAtIndex(nametags, 0, (void **)&oldNametag));
+    CHKLOG(rc, nametags->removeAtIndex(nametags, 0));
+    CHKLOG(rc, oldNametag->destroy(oldNametag));
+  }
+  len = MAX_UINT_DIGITS + 1;
+  CHKLOG(rc, lultostr(size, number, &len, 10));
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("removeCount"), number));
+
+  while (ESR_TRUE)
+  {
+    result = pfgets ( line, 256, file );
+    if (result == NULL)
+      break;
+    if (LSTRLEN(line) == 255)
+    {
+      rc = ESR_BUFFER_OVERFLOW;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    lstrtrim(line);
+
+    /* Get the Nametag ID */
+    id = line;
+
+    /* Find next whitespace */
+    for (value = id + 1; *value != L('\0') && !LISSPACE(*value); ++value);
+    if (*value == L('\0'))
+    {
+      rc = ESR_INVALID_STATE;
+      PLogError(L("%s: Cannot find end of Nametag id"), ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    /* Delimit end of nametag ID */
+    *value = L('\0');
+
+    /* Find next non-whitespace */
+    for (++value; *value != L('\0') && LISSPACE(*value); ++value);
+    if (*value == L('\0'))
+    {
+      rc = ESR_INVALID_STATE;
+      PLogError(L("%s: Cannot find Nametag value"), ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+    /* We now have both the Nametag ID and value */
+	len = (LSTRLEN(value)+1) * sizeof(LCHAR) ;
+    CHKLOG(rc, SR_NametagCreateFromValue(id, (const char*)value, len, &newNametag));
+    /* Add Nametag to collection */
+    CHKLOG(rc, impl->value->put(impl->value, id, newNametag));
+
+    if (LSTRLEN(id) > NAMETAGID_LENGTH)
+    {
+      rc = ESR_BUFFER_OVERFLOW;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    psprintf(tokenName, L("nametag[%s]"), id);
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, tokenName, value));
+    newNametag = NULL;
+  }
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("filename"), filename));
+  CHKLOG(rc, nametags->getSize(nametags, &size));
+  len = MAX_UINT_DIGITS + 1;
+  CHKLOG(rc, lultostr(size, number, &len, 10));
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("addCount"), number));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsLoad")));
+  pfclose (file);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (file != NULL)
+    pfclose (file);
+  if (newNametag != NULL)
+    newNametag->destroy(newNametag);
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsSaveImpl(SR_Nametags* self, const LCHAR* filename)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  ESR_ReturnCode rc;
+  PFile* file = NULL;
+  size_t size, i;
+  HashMap* nametags = impl->value;
+  SR_NametagImpl* nametag;
+  LCHAR* id;
+  size_t len;
+  LCHAR devicePath[P_PATH_MAX];
+#define NAMETAG_LENGTH 200
+  LCHAR nametagBuffer[NAMETAG_LENGTH];
+  LCHAR number[MAX_UINT_DIGITS+1];
+#define NAMETAGID_LENGTH 20
+  /* "token\0" == 6 */
+#define TOKEN_LENGTH 6 + NAMETAGID_LENGTH
+  LCHAR tokenName[TOKEN_LENGTH];
+  size_t num_written;
+
+  if (filename == NULL)
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  size = P_PATH_MAX;
+  CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.nametagPath"), devicePath, &size));
+
+  if (LSTRNCMP(filename, devicePath, LSTRLEN(devicePath)) != 0)
+    LSTRCAT(devicePath, filename);
+  else
+    LSTRCPY(devicePath, filename);
+
+  file = pfopen ( devicePath, L("w"));
+/*  CHKLOG(rc, PFileSystemCreatePFile(devicePath, ESR_TRUE, &file));
+  CHKLOG(rc, file->open(file, L("w")));*/
+  CHKLOG(rc, nametags->getSize(nametags, &size));
+
+  if ( file == NULL )
+    goto CLEANUP;
+
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, nametags->getValueAtIndex(nametags, i, (void **)&nametag));
+
+    CHKLOG(rc, nametag->Interface.getID(&nametag->Interface, &id));
+
+    if (LSTRLEN(id) + 1 + LSTRLEN(nametag->value) + 2 >= NAMETAG_LENGTH)
+    {
+      rc = ESR_BUFFER_OVERFLOW;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    psprintf(nametagBuffer, L("%s %s\n"), id, nametag->value);
+    len = LSTRLEN(nametagBuffer);
+/*    CHKLOG(rc, file->write(file, nametagBuffer, sizeof(LCHAR), &len));*/
+    num_written = pfwrite ( nametagBuffer, sizeof ( LCHAR ), len, file );
+
+    if ( num_written != len )
+        goto CLEANUP;
+
+    if (LSTRLEN(id) > NAMETAGID_LENGTH)
+    {
+      rc = ESR_BUFFER_OVERFLOW;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    psprintf(tokenName, L("nametag[%s]"), id);
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, tokenName, nametag->value));
+  }
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("filename"), filename));
+  len = MAX_UINT_DIGITS + 1;
+  CHKLOG(rc, lultostr(size, (LCHAR*) &number, &len, 10));
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("saveCount"), number));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsSave")));
+  pfclose (file);
+  return ESR_SUCCESS;
+CLEANUP:
+  if (file != NULL)
+    pfclose (file);
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsAddImpl(SR_Nametags* self, SR_Nametag* nametag)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  HashMap* nametags = impl->value;
+  LCHAR* id;
+  ESR_BOOL exists;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, nametag->getID(nametag, &id));
+  CHKLOG(rc, nametags->containsKey(nametags, id, &exists));
+  if (exists)
+  {
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
+    rc = ESR_IDENTIFIER_COLLISION;
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("rc"), ESR_rc2str(rc)));
+    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsAdd")));
+    rc = ESR_IDENTIFIER_COLLISION;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CHKLOG(rc, nametags->put(nametags, id, nametag));
+
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsAdd")));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsRemoveImpl(SR_Nametags* self, const LCHAR* id)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  HashMap* nametags = impl->value;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, nametags->remove(nametags, id));
+
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsRemove")));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsGetSizeImpl(SR_Nametags* self, size_t* result)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  HashMap* nametags = impl->value;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, nametags->getSize(nametags, result));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsGetImpl(SR_Nametags* self, const LCHAR* id, SR_Nametag** nametag)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  HashMap* nametags = impl->value;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, nametags->get(nametags, id, (void **)nametag));
+
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsGet")));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsGetAtIndexImpl(SR_Nametags* self, size_t index, SR_Nametag** nametag)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  HashMap* nametags = impl->value;
+  LCHAR* id;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, nametags->getValueAtIndex(nametags, index, (void **)nametag));
+
+  CHKLOG(rc, (*nametag)->getID(*nametag, &id));
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsGetAtIndex")));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsContainsImpl(SR_Nametags* self, const LCHAR* id, ESR_BOOL* result)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  HashMap* nametags = impl->value;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, nametags->containsKey(nametags, id, result));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_NametagsDestroyImpl(SR_Nametags* self)
+{
+  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
+  LCHAR number[MAX_UINT_DIGITS+1];
+  ESR_ReturnCode rc;
+
+  if (impl->value != NULL)
+  {
+    size_t size, i, len;
+    HashMap* list = impl->value;
+    SR_Nametag* nametag;
+
+    CHKLOG(rc, list->getSize(list, &size));
+    for (i = 0; i < size; ++i)
+    {
+      CHKLOG(rc, list->getValueAtIndex(list, 0, (void **)&nametag));
+      CHKLOG(rc, list->removeAtIndex(list, 0));
+      CHKLOG(rc, nametag->destroy(nametag));
+    }
+
+    len = MAX_UINT_DIGITS + 1;
+    CHKLOG(rc, lultostr(size, (LCHAR*) &number, &len, 10));
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("removeCount"), number));
+    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsDestroy")));
+    list->destroy(list);
+    impl->value = NULL;
+  }
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("pointer"), (int) self));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsDestroy")));
+  impl->eventLog = NULL;
+  FREE(self);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/srec/Recognizer/Android.mk b/srec/Recognizer/Android.mk
new file mode 100644
index 0000000..23247e9
--- /dev/null
+++ b/srec/Recognizer/Android.mk
@@ -0,0 +1,77 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/Recognizer.c \
+	src/RecognizerImpl.c \
+	src/RecognizerResult.c \
+	src/RecognizerResultImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+common_CFLAGS := \
+	-DSREC_RECOGNIZER_EXPORTS \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_Core \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_EventLog \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Semproc \
+
+common_TARGET:= libSR_Recognizer
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/Recognizer/include/SR_Recognizer.h b/srec/Recognizer/include/SR_Recognizer.h
new file mode 100644
index 0000000..164f876
--- /dev/null
+++ b/srec/Recognizer/include/SR_Recognizer.h
@@ -0,0 +1,991 @@
+/*---------------------------------------------------------------------------*
+ *  SR_Recognizer.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_RECOGNIZER_H
+#define __SR_RECOGNIZER_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "SR_RecognizerPrefix.h"
+#include "SR_AcousticModels.h"
+#include "SR_Grammar.h"
+#include "SR_RecognizerResult.h"
+#include "SR_Nametags.h"
+#include "pstdio.h"
+#include "ptypes.h"
+
+/* forward decl needed because of SR_Recognizer.h <-> SR_Grammar.h include loop */
+struct SR_Grammar_t;
+
+/**
+ * Recognizer status.
+ */
+typedef enum SR_RecognizerStatus_t
+{
+  /**
+   * Reserved value.
+   */
+  SR_RECOGNIZER_EVENT_INVALID,
+  /**
+   * Recognizer could not find a match for the utterance.
+   */
+  SR_RECOGNIZER_EVENT_NO_MATCH,
+  /**
+   * Recognizer processed one frame of audio.
+   */
+  SR_RECOGNIZER_EVENT_INCOMPLETE,
+  /**
+   * Recognizer has just been started.
+   */
+  SR_RECOGNIZER_EVENT_STARTED,
+  /**
+   * Recognizer is stopped.
+   */
+  SR_RECOGNIZER_EVENT_STOPPED,
+  /**
+   * Beginning of speech detected.
+   */
+  SR_RECOGNIZER_EVENT_START_OF_VOICING,
+  /**
+   * End of speech detected.
+   */
+  SR_RECOGNIZER_EVENT_END_OF_VOICING,
+  /**
+   * Beginning of utterance occured too soon.
+   */
+  SR_RECOGNIZER_EVENT_SPOKE_TOO_SOON,
+  /**
+   * Recognition match detected.
+   */
+  SR_RECOGNIZER_EVENT_RECOGNITION_RESULT,
+  /**
+   * Timeout occured before beginning of utterance.
+   */
+  SR_RECOGNIZER_EVENT_START_OF_UTTERANCE_TIMEOUT,
+  /**
+   * Timeout occured before speech recognition could complete.
+   */
+  SR_RECOGNIZER_EVENT_RECOGNITION_TIMEOUT,
+  /**
+   * Not enough samples to process one frame.
+   */
+  SR_RECOGNIZER_EVENT_NEED_MORE_AUDIO,
+  /**
+   * More audio encountered than is allowed by 'swirec_max_speech_duration'.
+   */
+  SR_RECOGNIZER_EVENT_MAX_SPEECH,
+} SR_RecognizerStatus;
+
+/**
+ * Type of RecognizerResult returned by SR_RecognizerAdvance().
+ */
+typedef enum SR_RecognizerResultType_t
+{
+  /**
+   * Reserved value.
+   */
+  SR_RECOGNIZER_INVALID,
+  /**
+   * The result is complete from a full recognition of audio.
+   */
+  SR_RECOGNIZER_RESULT_TYPE_COMPLETE,
+  /**
+   * No results at this time.
+   */
+  SR_RECOGNIZER_RESULT_TYPE_NONE,
+} SR_RecognizerResultType;
+
+/**
+ * SR_Utterance stubbed out.
+ */
+typedef void* SR_Utterance;
+
+typedef enum
+{
+  ESR_LOCK,
+  ESR_UNLOCK
+} ESR_LOCKMODE;
+
+/**
+ * Function which will be invoked before accessing internal variables.
+ */
+typedef ESR_ReturnCode(*SR_RecognizerLockFunction)(ESR_LOCKMODE mode, void* data);
+
+/**
+ * @addtogroup SR_RecognizerModule SR_Recognizer API functions
+ * Synchronous speech recognizer.
+ *
+ * @{
+ */
+
+/**
+ * Synchronous speech recognizer.
+ */
+typedef struct SR_Recognizer_t
+{
+  /**
+   * Starts recognition.
+   *
+   * @param self SR_Recognizer handle
+  * @return ESR_INVALID_ARGUMENT if self is null, if no acoustic models have been associated with the recognizer,
+  * if no grammars have been activated, or if the recognizer cannot be started for an unknown reason
+   */
+  ESR_ReturnCode(*start)(struct SR_Recognizer_t* self);
+  /**
+   * Stops the recognizer and invalidates the recognition result object.
+   * Calling this function before the recognizer receives the last frame causes the recognition
+   * to abort.
+   *
+   * @param self SR_Recognizer handle
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if an internal error has occured
+   */
+  ESR_ReturnCode(*stop)(struct SR_Recognizer_t* self);
+  /**
+   * Destroy a recognizer.
+   *
+   * @param self SR_Recognizer handle
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if an internal error has occured
+   */
+  ESR_ReturnCode(*destroy)(struct SR_Recognizer_t* self);
+  /**
+   * Associates a set of models with the recognizer. 
+   *
+   * @param self SR_Recognizer handle
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*setup)(struct SR_Recognizer_t* self);
+  /**
+   * Unconfigures recognizer.
+   *
+   * @param self SR_Recognizer handle
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*unsetup)(struct SR_Recognizer_t* self);
+  /**
+   * Indicates whether recognizer is configured for use.
+   *
+   * @param self SR_Recognizer handle
+   * @param isSetup True if recognizer is configured
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isSetup)(struct SR_Recognizer_t* self, ESR_BOOL* isSetup);
+
+  /**
+   * Returns copy of LCHAR recognition parameter.
+   *
+   * @param self SR_Recognizer handle
+   * @param key Parameter name
+   * @param value [out] Used to hold the parameter value
+   * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the specified property is not of
+  * type LCHAR*
+   */
+  ESR_ReturnCode(*getParameter)(struct SR_Recognizer_t* self, const LCHAR* key, LCHAR* value, size_t* len);
+  /**
+   * Return copy of size_t recognition parameter.
+   *
+   * @param self SR_Recognizer handle
+   * @param key Parameter name
+   * @param value [out] Used to hold the parameter value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the specified property is not of
+  * type size_t
+   */
+  ESR_ReturnCode(*getSize_tParameter)(struct SR_Recognizer_t* self, const LCHAR* key, size_t* value);
+  /**
+   * Return copy of BOOL recognition parameter.
+   *
+   * @param self SR_Recognizer handle
+   * @param key Parameter name
+   * @param value [out] Used to hold the parameter value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the specified property is not of
+  * type bool
+   */
+  ESR_ReturnCode(*getBoolParameter)(struct SR_Recognizer_t* self, const LCHAR* key, ESR_BOOL* value);
+  /**
+   * Sets recognition parameters.
+   *
+   * Key:             Description of associated value
+   *
+   * VoiceEnrollment       If "true", the next recognition will produce data required
+   *                              for Nametag support (i.e. Aurora bitstream).
+   *
+   * @param self SR_Recognizer handle
+   * @param key Parameter name
+   * @param value Parameter value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+   */
+  ESR_ReturnCode(*setParameter)(struct SR_Recognizer_t* self, const LCHAR* key, LCHAR* value);
+  /**
+   * Sets recognition parameters.
+   *
+   * @param self SR_Recognizer handle
+   * @param key Parameter name
+   * @param value Parameter value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+   */
+  ESR_ReturnCode(*setSize_tParameter)(struct SR_Recognizer_t* self, const LCHAR* key, size_t value);
+  /**
+   * Sets recognition parameters.
+   *
+   * @param self SR_Recognizer handle
+   * @param key Parameter name
+   * @param value Parameter value
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+   */
+  ESR_ReturnCode(*setBoolParameter)(struct SR_Recognizer_t* self, const LCHAR* key, ESR_BOOL value);
+
+  /**
+   * Recognizer may be set up with multiple Grammars and multiple rules. All grammars
+   * must be unsetup before the recognizer can be destroy.
+   * A pre-compiled Grammar should have undergone a model consistency check with the
+   * recognizer prior to this call.
+   *
+   * @param self SR_Recognizer handle
+   * @param grammar Grammar containing rule
+   * @param ruleName Name of rule to associate with recognizer
+   * @see SR_GrammarCheckModelConsistency
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode (*setupRule)(struct SR_Recognizer_t* self, struct SR_Grammar_t* grammar, const LCHAR* ruleName);
+  /**
+   * Indicates if Recognizer is configured with any rules within the specified Grammar.
+   *
+   * @param self SR_Recognizer handle
+   * @param hasSetupRules True if the Recognizer is configured for the Grammar
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*hasSetupRules)(struct SR_Recognizer_t* self, ESR_BOOL* hasSetupRules);
+  /**
+   * Activates rule in recognizer.
+   *
+   * @param self SR_Recognizer handle
+   * @param grammar Grammar containing rule
+   * @param ruleName Name of rule
+   * @param weight Relative weight to assign to self grammar vs. other activated grammars.
+   *               Values: Integers 0-2^31.
+  * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if no models are associated with the recognizer,
+  * or if the rule could not be setup, or if the acoustic models could not be setup;
+  * ESR_BUFFER_OVERFLOW if ruleName is too long
+   */
+  ESR_ReturnCode (*activateRule)(struct SR_Recognizer_t* self, struct SR_Grammar_t* grammar,
+                                const LCHAR* ruleName, unsigned int weight);
+  /**
+   * Deactivates rule in recognizer.
+   *
+   * @param self SR_Recognizer handle
+   * @param grammar Grammar containing rule
+   * @param ruleName Name of root rule
+   * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if grammar is not activated
+   */
+  ESR_ReturnCode (*deactivateRule)(struct SR_Recognizer_t* self, struct SR_Grammar_t* grammar,
+                                  const LCHAR* ruleName);
+
+  /**
+   * Deactivates all grammar rules in recognizer.
+   *
+   * @param self SR_Recognizer handle
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*deactivateAllRules)(struct SR_Recognizer_t* self);
+
+  /**
+   * Indicates if rule is active in recognizer.
+   *
+   * @param self SR_Recognizer handle
+   * @param grammar Grammar containing rule
+   * @param ruleName Name of rule
+   * @param isActiveRule True if rule is active
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode (*isActiveRule)(struct SR_Recognizer_t* self, struct SR_Grammar_t* grammar,
+                                const LCHAR* ruleName, ESR_BOOL* isActiveRule);
+   /**
+   * Configures the grammar for maximum amount of word addition
+   *
+   * @param self SR_Recognizer handle
+   * @param grammar Grammar whose ceiling to be set
+   * @return ESR_INVALID_ARGUMENT if self or grammar are null
+   */
+  ESR_ReturnCode (*setWordAdditionCeiling)(struct SR_Recognizer_t* self, struct SR_Grammar_t* grammar );
+  /**
+   * Ensure the model usage in a pre-compiled grammar is consistent with the models
+   * that are associated with the Recognizer. You must first have called Recognizer_Setup().
+   *
+   * @param self SR_Recognizer handle
+   * @param grammar Grammar to check against
+   * @param isConsistent True if rule is consistent
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode (*checkGrammarConsistency)(struct SR_Recognizer_t* self, struct SR_Grammar_t* grammar,
+      ESR_BOOL* isConsistent);
+
+ /**
+   * Ensure the model usage in a pre-compiled grammar is consistent with the models
+   * that are associated with the Recognizer. You must first have called Recognizer_Setup().
+   *
+   * @param self SR_Recognizer handle
+   * @param grammar Grammar to check against
+   * @param isConsistent True if rule is consistent
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode (*getModels)(struct SR_Recognizer_t* self, SR_AcousticModels** pmodels);
+
+  /**
+   * Get audio into the recognizer.
+   *
+   * We decouple the Audio and frontend processing from the Recognizer processing via an
+   * internal FIFO frame buffer (aka utterance buffer). This ensures that this call is at least
+   * as fast as real time so that voicing events are not unduly delayed. The audio buffer size
+   * must be at least one frame buffer's worth and some reasonable maximum size for synchronous
+   * behaviour. This function may be called independently of Recognizer_Advance.
+   *
+   * @param self SR_Recognizer handle
+   * @param buffer Buffer containing audio data
+   * @param bufferSize [in/out] Size of buffer in samples. In case of a buffer overflow,
+   *                            ESR_BUFFER_OVERFLOW is returned and this value holds the actual
+   *                            amount of samples that were pushed.
+   * @param isLast Indicates if the audio frame is the last one in this recognition
+  * @return ESR_INVALID_ARGUMENT if self, buffer, or bufferSize are null; ESR_INVALID_STATE if the recognizer isn't
+  * started, or the recognizer has already received the last frame; ESR_BUFFER_OVERFLOW if the recognizer buffer is
+  * full
+   */
+  ESR_ReturnCode (*putAudio)(struct SR_Recognizer_t* self, asr_int16_t* buffer, size_t* bufferSize,
+                            ESR_BOOL isLast);
+  /**
+   * Advance the recognizer by at least one utterance frame. The number of frames advanced
+   * depends on the underlying definition. We anticipate that the recognizer will keep up with
+   * the supplied audio buffers when waiting for voicing. After this point, the number of frames
+   * may be one (for our default frame-advance mode) or it may be more if the synchronous nature
+   * of this operation is not considered a problem. The recognizer may be advanced independently
+   * of the Recognizer_PutAudio call. It is permissible to advance when there is no further data.
+   * A stop condition could be an appropriate consequence.
+   *
+   * @param self Recognizer handle
+   * @param status Resulting recognizer status
+   * @param type Resulting recognition result type
+   * @param result Resulting recognizer result
+  * @return ESR_INVALID_ARGUMENT if self, status, or type are null; ESR_INVALID_STATE if an internal error occurs
+   */
+  ESR_ReturnCode(*advance)(struct SR_Recognizer_t* self, SR_RecognizerStatus* status,
+                           SR_RecognizerResultType* type, SR_RecognizerResult** result);
+
+
+  /**
+   * Loads utterance from file.
+   *
+   * @param self SR_Recognizer handle
+   * @param filename File to read from
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*loadUtterance)(struct SR_Recognizer_t* self, const LCHAR* filename);
+  /**
+   * Loads utterance from WAVE file.
+   *
+   * @param self SR_Recognizer handle
+   * @param filename WAVE file to read from
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*loadWaveFile)(struct SR_Recognizer_t* self, const LCHAR* filename);
+
+  /**
+   * Log recognizer-related event token.
+   *
+   * @param self SR_Recognizer handle
+   * @param event Token name
+   * @param value Value to be logged
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*logToken)(struct SR_Recognizer_t* self, const LCHAR* token, const LCHAR* value);
+
+  /**
+   * Log recognizer-related event token integer.
+   *
+   * @param self SR_Recognizer handle
+   * @param event Token name
+   * @param value Value to be logged
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*logTokenInt)(struct SR_Recognizer_t* self, const LCHAR* token, int value);
+
+  /**
+   * Log recognizer-related event and dump all previously accumulated tokens since last event to
+   * log.
+   *
+   * @param self SR_Recognizer handle
+   * @param event Event name
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*logEvent)(struct SR_Recognizer_t* self, const LCHAR* event);
+
+  /**
+   * Log the beginning of a new log session. A log session contains zero or more recognitions (transactions)
+   * and it is up to the application to decided when the session ends and a new one begins (e.g.
+   * timeout, number of recognitions, etc.)
+   *
+   * @param self SR_Recognizer handle
+   * @param sessionName Session name
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*logSessionStart)(struct SR_Recognizer_t* self, const LCHAR* sessionName);
+
+  /**
+   * Log the end of a log session.
+   *
+   * @param self SR_Recognizer handle
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*logSessionEnd)(struct SR_Recognizer_t* self);
+
+  /**
+   * Log data about a waveform obtained from a TCP file. This function is not called
+   * when doing live recognition.
+   *
+   * @param self SR_Recognizer handle
+   * @param waveformFilename Session name
+   * @param transcription Transcription for the utterance
+   * @param bos Beginning of speech (seconds)
+   * @param eos End of speech (seconds)
+   * @param isInvocab True if the transcription is accepted by the grammar, False otherwise
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*logWaveformData)(struct SR_Recognizer_t* self,
+                                   const LCHAR* waveformFilename,
+                                   const LCHAR* transcription,
+                                   const double bos,
+                                   const double eos,
+                                   ESR_BOOL isInvocab);
+
+  /**
+   * Associates a locking function with the recognizer. This function is used to
+   * protect internal data from multithreaded access.
+   *
+   * @param self SR_Recognizer handle
+   * @param function Locking function
+   * @param data Function data
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*setLockFunction)(struct SR_Recognizer_t *self, SR_RecognizerLockFunction function, void* data);
+  /**
+   * Indicates if signal is getting clipped.
+   *
+   * @param self SR_Recognizer handle
+   * @param isClipping [out] Result value
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isSignalClipping)(struct SR_Recognizer_t* self, ESR_BOOL* isClipping);
+  /**
+   * Indicates if signal has a DC-offset component.
+   *
+   * @param self SR_Recognizer handle
+   * @param isDCOffset [out] Result value
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isSignalDCOffset)(struct SR_Recognizer_t* self, ESR_BOOL* isDCOffset);
+  /**
+   * Indicates if signal is noisy.
+   *
+   * @param self SR_Recognizer handle
+   * @param isNoisy [out] Result value
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isSignalNoisy)(struct SR_Recognizer_t* self, ESR_BOOL* isNoisy);
+  /**
+   * Indicates if speech contained within the signal is too quiet.
+   *
+   * @param self SR_Recognizer handle
+   * @param isTooQuiet [out] Result value
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isSignalTooQuiet)(struct SR_Recognizer_t* self, ESR_BOOL* isTooQuiet);
+  /**
+   * Indicates if there are too few samples in the signal for a proper recognition.
+   *
+   * @param self SR_Recognizer handle
+   * @param isTooFewSamples [out] Result value
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isSignalTooFewSamples)(struct SR_Recognizer_t* self, ESR_BOOL* isTooFewSamples);
+  /**
+   * Indicates if there are too many samples in the signal for a proper recognition.
+   *
+   * @param self SR_Recognizer handle
+   * @param isTooManySamples [out] Result value
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*isSignalTooManySamples)(struct SR_Recognizer_t* self, ESR_BOOL* isTooManySamples);
+}
+SR_Recognizer;
+
+/**
+ * Starts recognition.
+ *
+ * @param self SR_Recognizer handle
+ * @return ESR_INVALID_ARGUMENT if self is null, if no acoustic models have been associated with the recognizer,
+ * if no grammars have been activated, or if the recognizer cannot be started for an unknown reason
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerStart(SR_Recognizer* self);
+/**
+ * Stops the recognizer and invalidates the recognition result object.
+ * Calling this function before the recognizer receives the last frame causes the recognition
+ * to abort.
+ *
+ * @param self SR_Recognizer handle
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if an internal error has occured
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerStop(SR_Recognizer* self);
+
+/**
+ * @name Recognizer Setup operations
+ *
+ * @{
+ */
+
+/**
+ * Create a new recognizer.
+ *
+ * @param self SR_Recognizer handle
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory; 
+ * ESR_INVALID_STATE if an internal error occurs
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerCreate(SR_Recognizer** self);
+/**
+ * Destroy a recognizer.
+ *
+ * @param self SR_Recognizer handle
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if an internal error has occured
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerDestroy(SR_Recognizer* self);
+/**
+ * Associates a set of models with the recognizer. All grammars must use models consistently.
+ *
+ * @param self SR_Recognizer handle
+ * @see SR_RecognizerCheckGrammarConsistency
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetup(SR_Recognizer* self);
+/**
+ * Unconfigures recognizer.
+ *
+ * @param self SR_Recognizer handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerUnsetup(SR_Recognizer* self);
+/**
+ * Indicates whether recognizer is configured for use.
+ *
+ * @param self SR_Recognizer handle
+ * @param isSetup True if recognizer is configured
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSetup(SR_Recognizer* self, ESR_BOOL* isSetup);
+
+/**
+ * @}
+ *
+ * @name Recognizer parameter operations
+ *
+ * @{
+ */
+
+/**
+ * Returns copy of LCHAR recognition parameter.
+ *
+ * @param self SR_Recognizer handle
+ * @param key Parameter name
+ * @param value [out] Used to hold the parameter value
+ * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the specified property is not of
+ * type LCHAR*
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerGetParameter(SR_Recognizer* self, const LCHAR* key, LCHAR* value, size_t* len);
+/**
+ * Return copy of size_t recognition parameter.
+ *
+ * @param self SR_Recognizer handle
+ * @param key Parameter name
+ * @param value Used to hold the parameter value
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the specified property is not of
+ * type size_t
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerGetSize_tParameter(SR_Recognizer* self, const LCHAR* key, size_t* value);
+/**
+ * Return copy of BOOL recognition parameter.
+ *
+ * @param self SR_Recognizer handle
+ * @param key Parameter name
+ * @param value Used to hold the parameter value
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_RESULT_TYPE if the specified property is not of
+ * type bool
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerGetBoolParameter(SR_Recognizer* self, const LCHAR* key, ESR_BOOL* value);
+/**
+ * Sets LCHAR* recognition parameters.
+ *
+ * Key:             Description of associated value
+ *
+ * VoiceEnrollment       If "true", the next recognition will produce data required
+ *                              for Nametag support (i.e. Aurora bitstream).
+ *
+ * @param self SR_Recognizer handle
+ * @param key Parameter name
+ * @param value Parameter value
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetParameter(SR_Recognizer* self, const LCHAR* key, LCHAR* value);
+/**
+ * Sets size_t recognition parameter.
+ *
+ * @param self SR_Recognizer handle
+ * @param key Parameter name
+ * @param value Parameter value
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetSize_tParameter(SR_Recognizer* self, const LCHAR* key, size_t value);
+/**
+ * Sets BOOL recognition parameter.
+ *
+ * @param self SR_Recognizer handle
+ * @param key Parameter name
+ * @param value Parameter value
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetBoolParameter(SR_Recognizer* self, const LCHAR* key, ESR_BOOL value);
+
+/**
+ * @}
+ *
+ * @name Recognizer rule Setup/Activation operations
+ *
+ * @{
+ */
+
+/**
+ * Recognizer may be set up with multiple Grammars and multiple rules. All grammars
+ * must be unsetup before the recognizer can be destroyed.
+ * A pre-compiled Grammar should have undergone a model consistency check with the
+ * recognizer prior to this call.
+ *
+ * @param self SR_Recognizer handle
+ * @param grammar Grammar containing rule
+ * @param ruleName Name of rule to associate with recognizer
+ * @see SR_GrammarCheckModelConsistency
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetupRule(SR_Recognizer* self,
+                                                          struct SR_Grammar_t* grammar,
+    const LCHAR* ruleName);
+/**
+ * Indicates if Recognizer is configured with any rules within the specified Grammar.
+ *
+ * @param self SR_Recognizer handle
+ * @param hasSetupRules True if the Recognizer is configured for the Grammar
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerHasSetupRules(SR_Recognizer* self,
+    ESR_BOOL* hasSetupRules);
+/**
+ * Activates rule in recognizer.
+ *
+ * @param self SR_Recognizer handle
+ * @param grammar Grammar containing rule
+ * @param ruleName Name of rule
+ * @param weight Relative weight to assign to self grammar vs. other activated grammars.
+ *               Values: Integers 0-2^31.
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if no models are associated with the recognizer,
+ * or if the rule could not be setup, or if the acoustic models could not be setup;
+ * ESR_BUFFER_OVERFLOW if ruleName is too long
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerActivateRule(SR_Recognizer* self,
+                                                             struct SR_Grammar_t* grammar,
+    const LCHAR* ruleName,
+    unsigned int weight);
+/**
+ * Deactivates rule in recognizer.
+ *
+ * @param self SR_Recognizer handle
+ * @param grammar Grammar containing rule
+ * @param ruleName Name of rule
+ * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if grammar is not activated
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerDeactivateRule(SR_Recognizer* self,
+                                                               struct SR_Grammar_t* grammar,
+    const LCHAR* ruleName);
+
+/**
+ * Deactivates all grammar rule in recognizer.
+ *
+ * @param self SR_Recognizer handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerDeactivateAllRules(SR_Recognizer* self);
+
+/**
+ * Indicates if rule is active in recognizer.
+ *
+ * @param self SR_Recognizer handle
+ * @param grammar Grammar containing rule
+ * @param ruleName Name of rule
+ * @param isActiveRule True if rule is active
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsActiveRule(SR_Recognizer* self,
+                                                             struct SR_Grammar_t* grammar,
+    const LCHAR* ruleName,
+    ESR_BOOL* isActiveRule);
+/**
+ * Ensure the model usage in a pre-compiled grammar is consistent with the models
+ * that are associated with the Recognizer. You must first have called Recognizer_Setup().
+ *
+ * @param self SR_Recognizer handle
+ * @param grammar Grammar to check against
+ * @param isConsistent True if rule is consistent
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerCheckGrammarConsistency(SR_Recognizer* self,
+                                                                        struct SR_Grammar_t* grammar,
+    ESR_BOOL* isConsistent);
+/**
+ * @}
+ *
+ * @name Recognizer Advance operations
+ *
+ * @{
+ */
+
+/**
+ * Get audio into the recognizer.
+ *
+ * We decouple the Audio and frontend processing from the Recognizer processing via an
+ * internal FIFO frame buffer (aka utterance buffer). This ensures that this call is at least
+ * as fast as real time so that voicing events are not unduly delayed. The audio buffer size
+ * must be at least one frame buffer's worth and some reasonable maximum size for synchronous
+ * behaviour. This function may be called independently of Recognizer_Advance.
+ *
+ * @param self SR_Recognizer handle
+ * @param buffer Buffer containing audio data
+ * @param bufferSize [in/out] Size of buffer in samples. In case of a buffer overflow,
+ *                            ESR_BUFFER_OVERFLOW is returned and this value holds the actual
+ *                            amount of samples that were pushed.
+ * @param isLast Indicates if the audio frame is the last one in this recognition
+ * @return ESR_INVALID_ARGUMENT if self, buffer, or bufferSize are null; ESR_INVALID_STATE if the recognizer isn't
+ * started, or the recognizer has already received the last frame; ESR_BUFFER_OVERFLOW if the recognizer buffer is
+ * full
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerPutAudio(SR_Recognizer* self, asr_int16_t* buffer,
+    size_t* bufferSize, ESR_BOOL isLast);
+/**
+ * Advance the recognizer by at least one utterance frame. The number of frames advanced
+ * depends on the underlying definition. We anticipate that the recognizer will keep up with
+ * the supplied audio buffers when waiting for voicing. After this point, the number of frames
+ * may be one (for our default frame-advance mode) or it may be more if the synchronous nature
+ * of this operation is not considered a problem. The recognizer may be advanced independently
+ * of the Recognizer_PutAudio call. It is permissible to advance when there is no further data.
+ * A stop condition could be an appropriate consequence.
+ *
+ * @param self Recognizer handle
+ * @param status Resulting recognizer status
+ * @param type Resulting recognition result type
+ * @param result Resulting recognizer result
+ * @return ESR_INVALID_ARGUMENT if self, status, or type are null; ESR_INVALID_STATE if an internal error occurs
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerAdvance(SR_Recognizer* self,
+    SR_RecognizerStatus* status,
+    SR_RecognizerResultType* type,
+    SR_RecognizerResult** result);
+/**
+ * @}
+ */
+
+/**
+ * Log recognizer-related event token.
+ *
+ * @param self SR_Recognizer handle
+ * @param token Token name
+ * @param value Value to be logged
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogToken(SR_Recognizer* self, const LCHAR* token, const LCHAR* value);
+
+/**
+ * Log recognizer-related event token integer.
+ *
+ * @param self SR_Recognizer handle
+ * @param token Token name
+ * @param value Value to be logged
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogTokenInt(SR_Recognizer* self, const LCHAR* token, int value);
+
+/**
+ * Log recognizer-related event and dump all previously accumulated tokens since last event to
+ * log.
+ *
+ * @param self SR_Recognizer handle
+ * @param event Event name
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogEvent(SR_Recognizer* self, const LCHAR* event);
+
+/**
+ * Log the beginning of a new log session. A log session contains zero or more recognitions (transactions)
+ * and it is up to the application to decided when the session ends and a new one begins (e.g.
+ * timeout, number of recognitions, etc.)
+ *
+ * @param self SR_Recognizer handle
+ * @param sessionName Session name
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogSessionStart(SR_Recognizer* self, const LCHAR* sessionName);
+
+/**
+ * Log the end of a log session.
+ *
+ * @param self SR_Recognizer handle
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogSessionEnd(SR_Recognizer* self);
+
+/**
+ * Log data about a waveform obtained from a TCP file. This function is not called
+ * when doing live recognition.
+ *
+ * @param self SR_Recognizer handle
+ * @param waveformFilename Session name
+ * @param transcription Transcription for the utterance
+ * @param bos Beginning of speech (seconds)
+ * @param eos End of speech (seconds)
+ * @param isInvocab True if the transcription is accepted by the grammar, False otherwise
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogWaveformData(SR_Recognizer* self,
+    const LCHAR* waveformFilename,
+    const LCHAR* transcription,
+    const double bos,
+    const double eos,
+    ESR_BOOL isInvocab);
+
+
+/**
+ * Loads utterance from file.
+ *
+ * @param self SR_Recognizer handle
+ * @param filename File to read from
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLoadUtterance(SR_Recognizer* self, const LCHAR* filename);
+/**
+ * Loads utterance from WAVE file.
+ *
+ * @param self SR_Recognizer handle
+ * @param filename WAVE file to read from
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLoadWaveFile(SR_Recognizer* self, const LCHAR* filename);
+
+/**
+ * Associates a locking function with the recognizer. This function is used to
+ * protect internal data from multithreaded access.
+ *
+ * @param self SR_Recognizer handle
+ * @param function Locking function
+ * @param data Function data
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetLockFunction(SR_Recognizer* self,
+    SR_RecognizerLockFunction function,
+    void* data);
+
+/**
+ *
+ * @name Signal quality metrics
+ *
+ * @{
+ */
+
+/**
+ * Indicates if signal is getting clipped.
+ *
+ * @param self SR_Recognizer handle
+ * @param isClipping [out] Result value
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalClipping(SR_Recognizer* self, ESR_BOOL* isClipping);
+/**
+ * Indicates if signal has a DC-offset component.
+ *
+ * @param self SR_Recognizer handle
+ * @param isDCOffset [out] Result value
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalDCOffset(SR_Recognizer* self, ESR_BOOL* isDCOffset);
+/**
+ * Indicates if signal is noisy.
+ *
+ * @param self SR_Recognizer handle
+ * @param isNoisy [out] Result value
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalNoisy(SR_Recognizer* self, ESR_BOOL* isNoisy);
+/**
+ * Indicates if speech contained within the signal is too quiet.
+ *
+ * @param self SR_Recognizer handle
+ * @param isTooQuiet [out] Result value
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalTooQuiet(SR_Recognizer* self, ESR_BOOL* isTooQuiet);
+/**
+ * Indicates if there are too few samples in the signal for a proper recognition.
+ *
+ * @param self SR_Recognizer handle
+ * @param isTooFewSamples [out] Result value
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalTooFewSamples(SR_Recognizer* self, ESR_BOOL* isTooFewSamples);
+/**
+ * Indicates if there are too many samples in the signal for a proper recognition.
+ *
+ * @param self SR_Recognizer handle
+ * @param isTooManySamples [out] Result value
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalTooManySamples(SR_Recognizer* self, ESR_BOOL* isTooManySamples);
+
+/**
+ * Changes the sample rate of audio.
+ *
+ * @param self SR_Recognizer handle
+ * @param new_sample_rate [in] New Sample Rate
+ * @return ESR_ReturnCode if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_Recognizer_Change_Sample_Rate ( SR_Recognizer *self, size_t new_sample_rate );
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+
+#endif /* __SR_RECOGNIZER_H */
diff --git a/srec/Recognizer/include/SR_RecognizerImpl.h b/srec/Recognizer/include/SR_RecognizerImpl.h
new file mode 100644
index 0000000..16860c9
--- /dev/null
+++ b/srec/Recognizer/include/SR_RecognizerImpl.h
@@ -0,0 +1,558 @@
+/*---------------------------------------------------------------------------*
+ *  SR_RecognizerImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_RECOGNIZERIMPL_H
+#define __SR_RECOGNIZERIMPL_H
+
+
+
+#include "ArrayList.h"
+#include "CircularBuffer.h"
+#include "ESR_ReturnCode.h"
+#include "ESR_SessionType.h"
+#include "HashMap.h"
+#include "SR_AcousticState.h"
+#include "SR_Recognizer.h"
+#include "SR_EventLog.h"
+#include "ptimestamp.h"
+#include "SR_Grammar.h"
+#include "SR_Nametag.h"
+
+
+#include "frontapi.h"
+#include "simapi.h"
+
+/***
+ * Recognizer timings to be written to OSI logs
+ */
+
+typedef struct RecogLogTimings_t
+{
+  size_t BORT;    /* beginning of recognition time (millisec) */
+  size_t DURS;    /* amount of speech processed (millisec) */
+  size_t EORT;    /* end of recognition time (millisec) */
+  size_t EOSD;    /* num of frames of speech before EOSS (frames) */
+  size_t EOSS;    /* frame where end of speech signal occurred (frames) */
+  size_t BOSS;    /* frame where start of speech signal occurred (frames) */
+  size_t EOST;    /* instant where end of speech signal occurred (millisec) */
+}
+RecogLogTimings;
+
+
+typedef enum
+{
+  /**
+   * Initial state.
+   */
+  SR_RECOGNIZER_INTERNAL_BEGIN,
+  /**
+   * Timeout before beginning of speech.
+   */
+  SR_RECOGNIZER_INTERNAL_BOS_TIMEOUT,
+  /**
+   * Got end of input before beginning of speech.
+   */
+  SR_RECOGNIZER_INTERNAL_BOS_NO_MATCH,
+  /**
+   * Waiting for beginning of speech.
+   */
+  SR_RECOGNIZER_INTERNAL_BOS_DETECTION,
+  /**
+   * Waiting for end of speech or input.
+   */
+  SR_RECOGNIZER_INTERNAL_EOS_DETECTION,
+  /**
+   * Got end of input.
+   */
+  SR_RECOGNIZER_INTERNAL_EOI,
+  /**
+   * Detected end of speech (not due to end of input).
+   */
+  SR_RECOGNIZER_INTERNAL_EOS,
+  /**
+   * Final state.
+   */
+  SR_RECOGNIZER_INTERNAL_END,
+} SR_RecognizerInternalStatus;
+
+
+/**
+ * Waveform Buffering stuff (for Nametags)
+ **/
+
+#define DEFAULT_WAVEFORM_BUFFER_MAX_SIZE       65  /* kBytes, will not grow */
+#define DEFAULT_WAVEFORM_WINDBACK_FRAMES       50  /* will convert frames to bytes, will not grow */
+#define DEFAULT_BOS_COMFORT_FRAMES              2
+#define DEFAULT_EOS_COMFORT_FRAMES              2
+
+typedef enum
+{
+  WAVEFORM_BUFFERING_OFF,             /* no buffering */
+  WAVEFORM_BUFFERING_ON_CIRCULAR,     /* buffer but, do not grow past a certain upper bound, just loop & overwrite */
+  WAVEFORM_BUFFERING_ON_LINEAR,       /* buffer and report overflow if necessary */
+} waveform_buffering_state_t;
+
+/* audio buffer which supports windback */
+
+typedef struct WaveformBuffer_t
+{
+  void   *windback_buffer;        /* a temp buffer used for windback functionality (malloc only at init)*/
+  size_t windback_buffer_sz;      /* sizeof buffer */
+  waveform_buffering_state_t state; /* state of the buffer (considered only when writing to buffer) */
+  CircularBuffer* cbuffer;        /* the actual buffer */
+  size_t   overflow_count;        /* indicates the total number of bytes the overflowed */
+  size_t read_size;
+  size_t eos_comfort_frames;
+  size_t bos_comfort_frames;
+}
+WaveformBuffer;
+
+
+/* create the buffer */
+ESR_ReturnCode WaveformBuffer_Create(WaveformBuffer** waveformBuffer, size_t frame_size);
+
+/* reset the buffer... do not release memeory */
+ESR_ReturnCode WaveformBuffer_Reset(WaveformBuffer* waveformBuffer);
+
+/* get size */
+ESR_ReturnCode WaveformBuffer_GetSize(WaveformBuffer* waveformBuffer, size_t* size);
+
+/* write to buffer. will grow only if buffering state is set to allow it */
+ESR_ReturnCode WaveformBuffer_Write(WaveformBuffer* waveformBuffer, void *data, size_t num_bytes);
+
+/* read the whole buffer (starting from start offset, up to read_size) into a chunk allocated outside */
+ESR_ReturnCode WaveformBuffer_Read(WaveformBuffer* waveformBuffer, void *data, size_t* num_bytes);
+
+/* does the windback after bos detected */
+ESR_ReturnCode WaveformBuffer_WindBack(WaveformBuffer* waveformBuffer, const size_t num_bytes);
+
+/* sets the start offset and read_size at the end of recognition when endpointed transcription is known */
+ESR_ReturnCode WaveformBuffer_ParseEndPointedResultAndTrim(WaveformBuffer* waveformBuffer, const LCHAR* end_pointed_result, const size_t bytes_per_frame);
+
+/* free the memory allocated for blocks and for windback */
+ESR_ReturnCode WaveformBuffer_Destroy(WaveformBuffer* waveformBuffer);
+
+/* sets the state of buffer */
+ESR_ReturnCode WaveformBuffer_SetBufferingState(WaveformBuffer* waveformBuffer, waveform_buffering_state_t state);
+
+/* gets the state of buffer */
+ESR_ReturnCode WaveformBuffer_GetBufferingState(WaveformBuffer* waveformBuffer, waveform_buffering_state_t* state);
+
+/* skip the first few bytes (moves read pointer forward */
+ESR_ReturnCode WaveformBuffer_Skip(WaveformBuffer* waveformBuffer, const size_t bytes);
+
+
+
+/**
+ * Speech recognizer.
+ */
+typedef struct SR_RecognizerImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_Recognizer Interface;
+
+  /**
+   * Legacy CREC frontend.
+   */
+  CA_Frontend* frontend;
+  /**
+   * Legacy CREC Input waveform object.
+   */
+  CA_Wave* wavein;
+  /**
+   * Legacy CREC Utterance object.
+   */
+  CA_Utterance* utterance;
+  /**
+   * Legacy CREC confidence score calculator.
+   */
+  CA_ConfidenceScorer* confidenceScorer;
+  /**
+   * Legacy CREC recognizer.
+   */
+  CA_Recog* recognizer;
+  /**
+   * AcousticModels associated with Recognizer.
+   */
+  SR_AcousticModels* models;
+  /**
+  * Active Recognizer grammars.
+  */
+  HashMap* grammars;
+  /**
+   * Recognition result.
+   */
+  SR_RecognizerResult* result;
+  /**
+   * Recognizer parameters.
+   */
+  ESR_SessionType* parameters;
+  /**
+   * AcousticState associated with Recognizer.
+   */
+  SR_AcousticState* acousticState;
+  /**
+   * Total number of frames pushed by SR_RecognizerPutAudio().
+   */
+  size_t frames;
+  /**
+   * Number of processed frames.
+   */
+  size_t processed;
+  /**
+   * The number of frames up until the windback point (where -pau- starts).
+   */
+  size_t beginningOfSpeechOffset;
+  /**
+   * Internal recognizer state.
+   */
+  SR_RecognizerInternalStatus internalState;
+  /**
+   * Indicates if SR_RecognizerStart() was called.
+   */
+  ESR_BOOL isStarted;
+  /**
+   * Indicates if PutAudio() was called with the last audio frame.
+   */
+  ESR_BOOL gotLastFrame;
+  /**
+   * Audio buffer used by PutAudio().
+   */
+  CircularBuffer* buffer;
+  /**
+   * Temporary buffer used to transfer audio data (PutAudio).
+   **/
+  asr_int16_t *audioBuffer;
+  /**
+   * Recognizer sample rate.
+   */
+  size_t sampleRate;
+  /**
+   * Whether reconition has begun after begiing of speech detection
+   */
+  ESR_BOOL isRecognizing;
+  /**
+   * Max number of frames to process before BOS timeout
+   */
+  size_t utterance_timeout;
+  /**
+   * Locking function associated.
+   */
+  SR_RecognizerLockFunction lockFunction;
+  /**
+   * Locking function data.
+   */
+  void* lockData;
+
+  /**
+   * OSI logging level
+   * if bit0 (OSI_LOG_LEVEL_BASIC) is set: do basic logging
+   * if bit1 (OSI_LOG_LEVEL_AUDIO) is set: do audio waveform logging
+   * if bit2 (OSI_LOG_LEVEL_ADDWD) is set: do dynamic grammar addword logging
+   */
+  size_t osi_log_level;
+
+  /**
+   * EventLog pointer
+   */
+  SR_EventLog* eventLog;
+  /**
+   * Data that should be logged in OSI
+   */
+  RecogLogTimings recogLogTimings;
+  /**
+   * Timestamp reference used for calculating timings
+   */
+  PTimeStamp timestamp;
+
+  /**
+   * Waveform buffer (for nametags) .
+   */
+  WaveformBuffer* waveformBuffer;
+
+  /**
+   * Reason for eos detected
+   */
+  LCHAR* eos_reason;
+
+  /**
+   * Indicates if signal quality variables have been initialized.
+   */
+  ESR_BOOL isSignalQualityInitialized;
+  /**
+   * True if signal is being clipped.
+   */
+  ESR_BOOL isSignalClipping;
+  /**
+   * True if DCOffset is present in signal.
+   */
+  ESR_BOOL isSignalDCOffset;
+  /**
+   * True if signal is noisy.
+   */
+  ESR_BOOL isSignalNoisy;
+  /**
+   * True if signal is too quiet.
+   */
+  ESR_BOOL isSignalTooQuiet;
+  /**
+   * True if signal contains too few samples.
+   */
+  ESR_BOOL isSignalTooFewSamples;
+  /**
+   * True if signal contains too many samples.
+   */
+  ESR_BOOL isSignalTooManySamples;
+
+  /**
+   * Number of bytes in a frame.
+   **/
+  size_t FRAME_SIZE;
+
+  /**
+   * If TRUE, beginning of speech detection is enabled.
+   */
+  ESR_BOOL gatedMode;
+
+  /**
+   * The minimum number of frames to sniff before beginning recognition.
+   */
+  size_t bgsniff;
+  /**
+   * Indicates if we've skipped holdOffPeriod frames at the beginning of the waveform.
+   */
+  ESR_BOOL holdOffPeriodSkipped;
+}
+SR_RecognizerImpl;
+
+/**
+ * Groups grammar with meta-data.
+ */
+typedef struct GrammarBag_t
+{
+  /**
+   * Grammar object.
+   */
+  SR_Grammar* grammar;
+  /**
+   * Grammar weight.
+   */
+  unsigned int weight;
+  /**
+   * Grammar ID.
+   */
+  LCHAR* grammarID;
+}
+GrammarBag;
+
+
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerStartImpl(SR_Recognizer* self);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerStopImpl(SR_Recognizer* self);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerDestroyImpl(SR_Recognizer* self);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetupImpl(SR_Recognizer* self);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerUnsetupImpl(SR_Recognizer* self);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSetupImpl(SR_Recognizer* self, ESR_BOOL* isSetup);
+
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerGetParameterImpl(SR_Recognizer* self, const LCHAR* key, LCHAR* value, size_t* len);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerGetSize_tParameterImpl(SR_Recognizer* self, const LCHAR* key, size_t* value);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerGetBoolParameterImpl(SR_Recognizer* self, const LCHAR* key, ESR_BOOL* value);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetParameterImpl(SR_Recognizer* self, const LCHAR* key, LCHAR* value);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetSize_tParameterImpl(SR_Recognizer* self, const LCHAR* key, size_t value);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetBoolParameterImpl(SR_Recognizer* self, const LCHAR* key, ESR_BOOL value);
+
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerHasSetupRulesImpl(SR_Recognizer* self,
+    ESR_BOOL* hasSetupRules);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerActivateRuleImpl(SR_Recognizer* self,
+    SR_Grammar* grammar,
+    const LCHAR* ruleName,
+    unsigned int weight);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerDeactivateRuleImpl(SR_Recognizer* self,
+    SR_Grammar* grammar,
+    const LCHAR* ruleName);
+
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerDeactivateAllRulesImpl(SR_Recognizer* self);
+
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsActiveRuleImpl(SR_Recognizer* self,
+    SR_Grammar* grammar,
+    const LCHAR* ruleName,
+    ESR_BOOL* isActiveRule);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetWordAdditionCeilingImpl(SR_Recognizer* self,
+    SR_Grammar* grammar);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerCheckGrammarConsistencyImpl(SR_Recognizer* self,
+    SR_Grammar* grammar,
+    ESR_BOOL* isConsistent);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerGetModelsImpl(SR_Recognizer* self,
+															  SR_AcousticModels** models);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerPutAudioImpl(SR_Recognizer* self,
+    asr_int16_t* buffer,
+    size_t* bufferSize,
+    ESR_BOOL isLast);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerAdvanceImpl(SR_Recognizer* self,
+    SR_RecognizerStatus* status,
+    SR_RecognizerResultType* type,
+    SR_RecognizerResult** result);
+
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerClearAcousticStateImpl(SR_Recognizer* self);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLoadAcousticStateImpl(SR_Recognizer* self,
+    const LCHAR* filename);
+
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLoadUtteranceImpl(SR_Recognizer* self, const LCHAR* filename);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLoadWaveFileImpl(SR_Recognizer* self, const LCHAR* filename);
+
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogTokenImpl(SR_Recognizer* self, const LCHAR* token, const LCHAR* value);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogTokenIntImpl(SR_Recognizer* self, const LCHAR* token, int value);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogEventImpl(SR_Recognizer* self, const LCHAR* event);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogSessionStartImpl(SR_Recognizer* self, const LCHAR* sessionName);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogSessionEndImpl(SR_Recognizer* self);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerLogWaveformDataImpl(SR_Recognizer* self,
+    const LCHAR* waveformFilename,
+    const LCHAR* transcription,
+    const double bos,
+    const double eos,
+    ESR_BOOL isInvocab);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerSetLockFunctionImpl(SR_Recognizer *self, SR_RecognizerLockFunction function, void* data);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalClippingImpl(SR_Recognizer* self, ESR_BOOL* isClipping);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalDCOffsetImpl(SR_Recognizer* self, ESR_BOOL* isDCOffset);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalNoisyImpl(SR_Recognizer* self, ESR_BOOL* isNoisy);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalTooQuietImpl(SR_Recognizer* self, ESR_BOOL* isTooQuiet);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalTooFewSamplesImpl(SR_Recognizer* self, ESR_BOOL* isTooFewSamples);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerIsSignalTooManySamplesImpl(SR_Recognizer* self, ESR_BOOL* isTooManySamples);
+
+SREC_RECOGNIZER_API ESR_ReturnCode SR_Recognizer_Change_Sample_RateImpl ( SR_Recognizer *self, size_t new_sample_rate );
+
+#endif /* __SR_RECOGNIZERIMPL_H */
diff --git a/srec/Recognizer/include/SR_RecognizerPrefix.h b/srec/Recognizer/include/SR_RecognizerPrefix.h
new file mode 100644
index 0000000..5f3ff5e
--- /dev/null
+++ b/srec/Recognizer/include/SR_RecognizerPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_RecognizerPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef SR_RECOGNIZERPREFIX_H
+#define SR_RECOGNIZERPREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_RECOGNIZER_EXPORTS
+#define SREC_RECOGNIZER_API PORT_EXPORT_DECL
+#else
+#define SREC_RECOGNIZER_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/Recognizer/include/SR_RecognizerResult.h b/srec/Recognizer/include/SR_RecognizerResult.h
new file mode 100644
index 0000000..afb2948
--- /dev/null
+++ b/srec/Recognizer/include/SR_RecognizerResult.h
@@ -0,0 +1,192 @@
+/*---------------------------------------------------------------------------*
+ *  SR_RecognizerResult.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_RECOGNIZERRESULT_H
+#define __SR_RECOGNIZERRESULT_H
+
+
+
+#include <stddef.h>
+#include "ESR_Locale.h"
+#include "ESR_ReturnCode.h"
+#include "SR_RecognizerPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup SR_RecognizerResultModule SR_RecognizerResult API functions
+ * Recognition result.
+ *
+ * @{
+ */
+
+/**
+ * Recognition result.
+ */
+typedef struct SR_RecognizerResult_t
+{
+  /**
+   * Returns the endpointed waveform that was used for recognition. This returns a read-only buffer,
+   * and may not be modified externally.
+   *
+   * @param self RecognizerResult handler
+   * @param waveform [out] Waveform buffer
+   * @param size [out] Size of waveform buffer (in bytes)
+   * @return ESR_INVALID_ARGUMENT if self, or waveform are null
+   */
+  ESR_ReturnCode(*getWaveform)(const struct SR_RecognizerResult_t* self, const asr_int16_t** waveform,
+                               size_t* size);
+  /**
+   * Returns number of entries in the n-best list.
+   *
+   * @param self RecognizerResult handler
+    * @param resultSize [out] Number of entries
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*getSize)(const struct SR_RecognizerResult_t* self, size_t* resultSize);
+  /**
+   * Returns number of [key, value] pairs in the current results.
+   *
+   * @param self SR_RecognizerResult handler
+    * @param nbest Index of n-best list element (0-based)
+   * @param count The number keys
+   * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*getKeyCount)(const struct SR_RecognizerResult_t* self, const size_t nbest,
+                               size_t* count);
+  /**
+   * Given an array of pointers to <code>LCHAR*</code>, populates that array with pointers
+    * to the keys used internally by the recognition result. These keys should not be modified!
+   *
+   * @param self SemanticResult handler
+    * @param nbest Index of n-best list element (0-based)
+   * @param list [out] List of keys associated with n-best list entry.
+    * @param listSize [in/out] Size of list. If the return code is ESR_BUFFER_OVERFLOW, the required size 
+    *                 is returned in this variable.
+   * @return ESR_INVALID_ARGUMENT if self or list are null; ESR_OUT_OF_BOUNDS if nbest entry does not exist;
+   * ESR_BUFFER_OVERFLOW if the list that was passed in was too small
+   */
+  ESR_ReturnCode(*getKeyList)(const struct SR_RecognizerResult_t* self, const size_t nbest,
+                              LCHAR** list, size_t* listSize);
+  /**
+   * Returns copy of semantic value.
+   *
+   * @param self SemanticResult handler
+    * @param nbest Index of n-best list element (0-based)
+    * @param key The key to look up
+   * @param value [out] The buffer used to hold the resulting value
+   * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+   * @return ESR_INVALID_ARGUMENT if self or list are null; ESR_OUT_OF_BOUNDS if nbest entry does not exist;
+   * ESR_BUFFER_OVERFLOW if the buffer that was passed in was too small
+   */
+  ESR_ReturnCode(*getValue)(const struct SR_RecognizerResult_t* self, const size_t nbest,
+                            const LCHAR* key, LCHAR* value, size_t* len);
+                            
+  /**
+   * Returns locale of the grammar that produced this recognition result
+   *
+   * @param self SR_RecognizerResult handle
+   * @param locale The locale associated with the result
+  * @return ESR_INVALID_ARGUMENT if self is null
+   */
+  ESR_ReturnCode(*getLocale)(const struct SR_RecognizerResult_t* self,  ESR_Locale* locale);
+  
+}
+SR_RecognizerResult;
+
+/**
+ * Returns the endpointed waveform that was used for recognition. This returns a read-only buffer,
+ * and may not be modified externally.
+ *
+ * @param self RecognizerResult handler
+ * @param waveform [out] Waveform buffer
+ * @param size [out] Size of waveform buffer (in bytes)
+ * @return ESR_INVALID_ARGUMENT if self, or waveform are null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResultGetWaveform(const SR_RecognizerResult* self,
+    const asr_int16_t** waveform, size_t* size);
+/**
+ * Returns number of entries in the n-best list.
+ *
+ * @param self RecognizerResult handler
+ * @param resultSize [out] Number of entries
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResultGetSize(const SR_RecognizerResult* self,
+    size_t* resultSize);
+/**
+ * Returns number of [key, value] pairs in the current results.
+ *
+ * @param nbest Index of n-best list element (0-based)
+ * @param self SemanticResult handler
+ * @param count The number keys
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResultGetKeyCount(const SR_RecognizerResult* self,
+    const size_t nbest,
+    size_t* count);
+/**
+ * Given an array of pointers to <code>LCHAR*</code>, populates that array with pointers
+ * to the keys used internally by the recognition result. These keys should not be modified!
+ *
+ * @param self SemanticResult handler
+ * @param nbest Index of n-best list element (0-based)
+ * @param list [out] List of keys associated with n-best list entry.
+ * @param listSize [in/out] Size of list. If the return code is ESR_BUFFER_OVERFLOW, the required size
+ *                 is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if self or list are null; ESR_OUT_OF_BOUNDS if nbest entry does not exist;
+ * ESR_BUFFER_OVERFLOW if the list that was passed in was too small
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResultGetKeyList(const SR_RecognizerResult* self,
+    const size_t nbest,
+    LCHAR** list,
+    size_t* listSize);
+/**
+ * Returns copy of semantic value.
+ *
+ * @param self SemanticResult handler
+ * @param nbest Index of n-best list element (0-based)
+ * @param key The key to look up
+ * @param value [out] The buffer used to hold the resulting value
+ * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ * @return ESR_INVALID_ARGUMENT if self or list are null; ESR_OUT_OF_BOUNDS if nbest entry does not exist;
+ * ESR_BUFFER_OVERFLOW if the buffer that was passed in was too small
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResultGetValue(const SR_RecognizerResult* self,
+    const size_t nbest,
+    const LCHAR* key,
+    LCHAR* value, size_t* len);
+    
+/**
+ * Returns locale of grammar that produced this result
+ *
+ * @param self SR_RecognizerResult handle
+ * @param locale The locale associated with the result
+ * @return ESR_INVALID_ARGUMENT if self is null
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResultGetLocale(const SR_RecognizerResult* self,
+    ESR_Locale* locale);
+    
+/**
+ * @}
+ */
+
+
+#endif /* __SR_RECOGNIZERRESULT_H */
diff --git a/srec/Recognizer/include/SR_RecognizerResultImpl.h b/srec/Recognizer/include/SR_RecognizerResultImpl.h
new file mode 100644
index 0000000..39e65d9
--- /dev/null
+++ b/srec/Recognizer/include/SR_RecognizerResultImpl.h
@@ -0,0 +1,122 @@
+/*---------------------------------------------------------------------------*
+ *  SR_RecognizerResultImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_RECOGNIZERRESULTIMPL_H
+#define __SR_RECOGNIZERRESULTIMPL_H
+
+
+
+#include <string.h>
+#include "ESR_ReturnCode.h"
+#include "ArrayList.h"
+#include "HashMap.h"
+#include "SR_RecognizerImpl.h"
+
+
+#include "simapi.h"
+
+/**
+ * RecognitionResult implementation.
+ */
+typedef struct SR_RecognizerResultImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_RecognizerResult Interface;
+  
+  /**
+   * N-best list.
+   */
+  CA_NBestList* nbestList;
+  /**
+   * Size of n-best list.
+   */
+  size_t nbestListSize;
+  
+  /**
+   * Locale of grammar that produced this result
+   */
+  ESR_Locale locale;
+  
+  /**
+   * Pointer to regognizer which owns this object.
+   */
+  SR_RecognizerImpl* recogImpl;
+  
+  /**
+   * N-best list. ArrayList of ArrayLists of SR_SemanticResult.
+   * The first ArrayList denotes the nbest-list.
+   * The second ArrayList denotes the collection of semantic results per nbest list entry.
+   */
+  ArrayList* results;
+}
+SR_RecognizerResultImpl;
+
+/**
+ * Create a new recognizer result.
+ *
+ * @param self RecognizerResult handle
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResult_Create(SR_RecognizerResult** self, SR_RecognizerImpl* recogImpl);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResult_GetWaveform(const SR_RecognizerResult* self,
+    const asr_int16_t** waveform,
+    size_t* size);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResult_GetSize(const SR_RecognizerResult* self,
+    size_t* resultSize);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResult_GetKeyCount(const SR_RecognizerResult* self,
+    const size_t nbest,
+    size_t* count);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResult_GetKeyList(const SR_RecognizerResult* self,
+    const size_t nbest,
+    LCHAR** list,
+    size_t* listSize);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResult_GetValue(const SR_RecognizerResult* self,
+    const size_t nbest,
+    const LCHAR* key,
+    LCHAR* value,
+    size_t* len);
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResult_GetLocale(const SR_RecognizerResult* self,
+    ESR_Locale* locale);
+    
+    
+/**
+ * Default implementation.
+ */
+SREC_RECOGNIZER_API ESR_ReturnCode SR_RecognizerResult_Destroy(SR_RecognizerResult* self);
+
+#endif /* __SR_RECOGNIZERRESULTIMPL_H */
diff --git a/srec/Recognizer/src/Recognizer.c b/srec/Recognizer/src/Recognizer.c
new file mode 100644
index 0000000..9de2777
--- /dev/null
+++ b/srec/Recognizer/src/Recognizer.c
@@ -0,0 +1,440 @@
+/*---------------------------------------------------------------------------*
+ *  Recognizer.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_Recognizer.h"
+#include "SR_RecognizerImpl.h"
+#include "ESR_Session.h"
+#include "plog.h"
+#include "pmemory.h"
+
+#define COUNT_INTERVAL      20
+
+ESR_ReturnCode SR_RecognizerStart(SR_Recognizer* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+#ifdef SREC_ENGINE_TRACK_RECOGNITION
+  PLogMessage ( "Entering Recognizer Start\n" );
+#endif
+  return self->start(self);
+}
+
+ESR_ReturnCode SR_RecognizerStop(SR_Recognizer* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+#ifdef SREC_ENGINE_TRACK_RECOGNITION
+  PLogMessage ( "Entering Recognizer Stop\n" );
+#endif
+  return self->stop(self);
+}
+
+ESR_ReturnCode SR_RecognizerDestroy(SR_Recognizer* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
+
+ESR_ReturnCode SR_RecognizerSetup(SR_Recognizer* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setup(self);
+}
+
+ESR_ReturnCode SR_RecognizerUnsetup(SR_Recognizer* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->unsetup(self);
+}
+
+ESR_ReturnCode SR_RecognizerIsSetup(SR_Recognizer* self, ESR_BOOL* isSetup)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isSetup(self, isSetup);
+}
+
+ESR_ReturnCode SR_RecognizerGetParameter(SR_Recognizer* self, const LCHAR* name, LCHAR* value, size_t* len)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getParameter(self, name, value, len);
+}
+
+ESR_ReturnCode SR_RecognizerGetSize_tParameter(SR_Recognizer* self, const LCHAR* name, size_t* value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getSize_tParameter(self, name, value);
+}
+
+ESR_ReturnCode SR_RecognizerGetBoolParameter(SR_Recognizer* self, const LCHAR* name, ESR_BOOL* value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getBoolParameter(self, name, value);
+}
+
+ESR_ReturnCode SR_RecognizerSetParameter(SR_Recognizer* self, const LCHAR* name, LCHAR* value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setParameter(self, name, value);
+}
+
+ESR_ReturnCode SR_RecognizerSetSize_tParameter(SR_Recognizer* self, const LCHAR* name, size_t value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  if ( LSTRCMP( L("CREC.Frontend.samplerate"), name ) == 0 )
+    return SR_Recognizer_Change_Sample_Rate ( self, value );
+  else
+    return self->setSize_tParameter(self, name, value);
+}
+
+ESR_ReturnCode SR_RecognizerSetBoolParameter(SR_Recognizer* self, const LCHAR* name, ESR_BOOL value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setBoolParameter(self, name, value);
+}
+
+ESR_ReturnCode SR_RecognizerHasSetupRules(SR_Recognizer* self,
+    ESR_BOOL* hasSetupRules)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->hasSetupRules(self, hasSetupRules);
+}
+
+ESR_ReturnCode SR_RecognizerActivateRule(SR_Recognizer* self, SR_Grammar* grammar,
+    const LCHAR* ruleName, unsigned int weight)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->activateRule(self, grammar, ruleName, weight);
+}
+
+ESR_ReturnCode SR_RecognizerDeactivateRule(SR_Recognizer* self, SR_Grammar* grammar,
+    const LCHAR* ruleName)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->deactivateRule(self, grammar, ruleName);
+}
+
+ESR_ReturnCode SR_RecognizerIsActiveRule(SR_Recognizer* self, SR_Grammar* grammar,
+    const LCHAR* ruleName, ESR_BOOL* isActiveRule)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isActiveRule(self, grammar, ruleName, isActiveRule);
+}
+
+ESR_ReturnCode SR_RecognizerCheckGrammarConsistency(SR_Recognizer* self, SR_Grammar* grammar,
+    ESR_BOOL* isConsistent)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->checkGrammarConsistency(self, grammar, isConsistent);
+}
+
+ESR_ReturnCode SR_RecognizerGetModels(SR_Recognizer* self, SR_AcousticModels** pmodels)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getModels(self, pmodels);
+}
+
+ESR_ReturnCode SR_RecognizerPutAudio(SR_Recognizer* self, asr_int16_t* buffer, size_t* bufferSize,
+                                     ESR_BOOL isLast)
+{
+#ifdef SREC_ENGINE_TRACK_RECOGNITION
+  static int counter = 0;
+#endif
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+#ifdef SREC_ENGINE_TRACK_RECOGNITION
+  if ( ( counter % COUNT_INTERVAL ) == 0 )
+    PLogMessage ( "Entering Recognizer Put Audio %d Times\n", counter );
+  counter++;
+#endif
+  return self->putAudio(self, buffer, bufferSize, isLast);
+}
+
+ESR_ReturnCode SR_RecognizerAdvance(SR_Recognizer* self, SR_RecognizerStatus* status,
+                                    SR_RecognizerResultType* type,
+                                    SR_RecognizerResult** result)
+{
+#ifdef SREC_ENGINE_TRACK_RECOGNITION
+  static int counter = 0;
+#endif
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+#ifdef SREC_ENGINE_TRACK_RECOGNITION
+  if ( ( counter % COUNT_INTERVAL ) == 0 )
+    PLogMessage ( "Entering Recognizer Advance %d Times\n", counter );
+  counter++;
+#endif
+  return self->advance(self, status, type, result);
+}
+
+ESR_ReturnCode SR_RecognizerLoadUtterance(SR_Recognizer* self, const LCHAR* filename)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->loadUtterance(self, filename);
+}
+
+ESR_ReturnCode SR_RecognizerLoadWaveFile(SR_Recognizer* self, const LCHAR* filename)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->loadWaveFile(self, filename);
+}
+
+ESR_ReturnCode SR_RecognizerLogEvent(SR_Recognizer* self, const LCHAR* event)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->logEvent(self, event);
+}
+
+ESR_ReturnCode SR_RecognizerLogToken(SR_Recognizer* self, const LCHAR* token, const LCHAR* value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->logToken(self, token, value);
+}
+
+ESR_ReturnCode SR_RecognizerLogTokenInt(SR_Recognizer* self, const LCHAR* token, int value)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->logTokenInt(self, token, value);
+}
+
+
+ESR_ReturnCode SR_RecognizerLogSessionStart(SR_Recognizer* self, const LCHAR* sessionName)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->logSessionStart(self, sessionName);
+}
+
+
+ESR_ReturnCode SR_RecognizerLogSessionEnd(SR_Recognizer* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->logSessionEnd(self);
+}
+
+
+ESR_ReturnCode SR_RecognizerLogWaveformData(SR_Recognizer* self,
+    const LCHAR* waveformFilename,
+    const LCHAR* transcription,
+    const double bos,
+    const double eos,
+    ESR_BOOL isInvocab)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->logWaveformData(self, waveformFilename, transcription, bos, eos, isInvocab);
+}
+
+
+ESR_ReturnCode SR_RecognizerSetLockFunction(SR_Recognizer* self, SR_RecognizerLockFunction function, void* data)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->setLockFunction(self, function, data);
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalClipping(SR_Recognizer* self, ESR_BOOL* isClipping)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isSignalClipping(self, isClipping);
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalDCOffset(SR_Recognizer* self, ESR_BOOL* isDCOffset)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isSignalDCOffset(self, isDCOffset);
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalNoisy(SR_Recognizer* self, ESR_BOOL* isNoisy)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isSignalNoisy(self, isNoisy);
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalTooQuiet(SR_Recognizer* self, ESR_BOOL* isTooQuiet)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isSignalTooQuiet(self, isTooQuiet);
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalTooFewSamples(SR_Recognizer* self, ESR_BOOL* isTooFewSamples)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isSignalTooFewSamples(self, isTooFewSamples);
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalTooManySamples(SR_Recognizer* self, ESR_BOOL* isTooManySamples)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->isSignalTooManySamples(self, isTooManySamples);
+}
+
+
+
+ESR_ReturnCode SR_Recognizer_Change_Sample_Rate ( SR_Recognizer *recognizer, size_t new_sample_rate )
+    {
+    ESR_ReturnCode  change_status;
+
+    if ( recognizer != NULL )
+        {
+        change_status = SR_Recognizer_Change_Sample_RateImpl ( recognizer, new_sample_rate );
+        }
+    else
+        {
+        change_status = ESR_INVALID_ARGUMENT;
+        PLogError ( L("ESR_INVALID_ARGUMENT") );
+        }
+    return ( change_status );
+    }
+
+
diff --git a/srec/Recognizer/src/RecognizerImpl.c b/srec/Recognizer/src/RecognizerImpl.c
new file mode 100644
index 0000000..d85216f
--- /dev/null
+++ b/srec/Recognizer/src/RecognizerImpl.c
@@ -0,0 +1,4286 @@
+/*---------------------------------------------------------------------------*
+ *  RecognizerImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*#define SREC_MEASURE_LATENCY    1*/
+ 
+#ifdef SREC_MEASURE_LATENCY
+#include <sys/time.h>
+ 
+struct timeval latency_start;
+#endif
+
+
+#include "ESR_Session.h"
+#include "ESR_SessionTypeImpl.h"
+#include "IntArrayList.h"
+#include "LCHAR.h"
+#include "passert.h"
+#include "plog.h"
+#include "pstdio.h"
+#include "pmemory.h"
+#include "ptimestamp.h"
+#include "SR_AcousticModelsImpl.h"
+#include "SR_AcousticStateImpl.h"
+#include "SR_GrammarImpl.h"
+#include "SR_SemprocDefinitions.h"
+#include "SR_SemanticResult.h"
+#include "SR_SemanticResultImpl.h"
+#include "SR_Recognizer.h"
+#include "SR_RecognizerImpl.h"
+#include "SR_RecognizerResultImpl.h"
+#include "SR_SemanticResultImpl.h"
+#include "SR_EventLog.h"
+#include "srec.h"
+
+#define MTAG NULL
+#define FILTER_NBEST_BY_SEM_RESULT 1
+#define AUDIO_CIRC_BUFFER_SIZE 20000
+#define SEMPROC_ACTIVE 1
+#define SAMPLE_SIZE (16 / CHAR_BIT) /* 16-bits / sample */
+
+/* milliseconds per FRAME = 1/FRAMERATE * 1000 */
+/* We multiple by 2 because we skip even frames */
+#define MSEC_PER_FRAME (2000/FRAMERATE)
+#define MAX_ENTRY_LENGTH 512
+#define PREFIX_WORD     "-pau-"
+#define PREFIX_WORD_LEN 5
+#define SUFFIX_WORD     "-pau2-"
+#define SUFFIX_WORD_LEN 6
+
+#ifdef MEASURE_SAMPLE_TIMES
+#include <sys/time.h>
+#include <stdio.h>
+ 
+#define MAX_SAMPLES_TO_MEASURE      500
+ 
+static long sample_buffers_received = 0;
+static long total_samples_received = 0;
+static long samples_in_buffer [MAX_SAMPLES_TO_MEASURE];
+static long seconds_buffer_received [MAX_SAMPLES_TO_MEASURE];
+static long micro_seconds_buffer_received [MAX_SAMPLES_TO_MEASURE];
+static struct timeval buffer_received_time;
+ 
+static void SR_Recognizer_Log_Samples_Received ( void );
+ 
+static void SR_Recognizer_Log_Samples_Received ( void )
+{
+    FILE *log_file;
+    char file_name [256];
+    char log_buffer [256];
+    long loop_counter;
+ 
+    if ( sample_buffers_received > 0 )
+        {	
+        gettimeofday ( &buffer_received_time, NULL );
+        sprintf ( file_name, "reco_recvd_%ld_%ld.txt", buffer_received_time.tv_sec, buffer_received_time.tv_usec );
+        log_file = fopen ( file_name, "w" );
+						 
+        if ( log_file != NULL )
+            {
+            for ( loop_counter = 0; loop_counter < sample_buffers_received; loop_counter++ )
+                {
+                sprintf ( log_buffer, "%ld %ld  %ld  %ld\n", loop_counter + 1, samples_in_buffer [loop_counter],
+                seconds_buffer_received [loop_counter], micro_seconds_buffer_received [loop_counter] );
+                fwrite ( log_buffer, 1, strlen ( log_buffer ), log_file );
+                }
+            fclose ( log_file );
+	    }
+	sample_buffers_received = 0;
+        }
+    }
+#endif
+
+
+static ESR_ReturnCode SR_Recognizer_Reset_Buffers ( SR_RecognizerImpl *impl );
+
+/**
+ * Initializes recognizer properties to default values.
+ *
+ * Replaces setup_recognition_parameters()
+ */
+ESR_ReturnCode SR_RecognizerToSessionImpl()
+{
+  ESR_ReturnCode rc;
+
+  /* Old comment: remember to keep "ca_rip.h" up to date with these parameters... */
+
+  /* CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_acoustic_models", 2)); */
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Recognizer.partial_results", ESR_FALSE));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.NBest", 1));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.eou_threshold", 100));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_altword_tokens", 400));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_frames", 1000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_fsm_arcs", 3000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_fsm_nodes", 3000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_fsmnode_tokens", 1000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_hmm_tokens", 1000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_model_states", 1000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_searches", 2));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_word_tokens", 1000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.non_terminal_timeout", 50));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.num_wordends_per_frame", 10));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.often", 10));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.optional_terminal_timeout", 30));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.reject", 500));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.terminal_timeout", 10));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.viterbi_prune_thresh", 5000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.wordpen", 0));
+
+  CHKLOG(rc, ESR_SessionSetSize_tIfEmpty("SREC.Recognizer.utterance_timeout", 400));
+
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Initializes frontend properties to default values.
+ *
+ * Replaces load_up_parameter_list()
+ */
+ESR_ReturnCode SR_RecognizerFrontendToSessionImpl()
+{
+  IntArrayList* intList = NULL;
+  ESR_ReturnCode rc;
+  ESR_BOOL exists;
+  size_t i;
+
+  /* Old comment: Remember to keep "ca_pip.h" up to date with these parameters... */
+
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.mel_dim", 12));
+  CHKLOG(rc, ESR_SessionSetSize_tIfEmpty("CREC.Frontend.samplerate", 8000));
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.premel", 0.98f));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.lowcut", 260));  /* Hz */
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.highcut", 4000)); /* Hz */
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.window_factor", 2.0)); /* times the frame size */
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.do_skip_even_frames", ESR_FALSE)); /* 10/20 ms rate */
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.offset", 0)); /* additional */
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.ddmel", ESR_FALSE)); /* delta-delta mel pars */
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.forgetfactor", 40));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.sv6_margin", 10));
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.rasta", ESR_FALSE));
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.rastac0", ESR_FALSE));
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.spectral_subtraction", ESR_FALSE));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.spec_sub_dur", 0));
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.spec_sub_scale", 1.0));
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.do_filterbank_dump", ESR_FALSE)); /* Output is filterbank (30 floats) */
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.do_filterbank_input", ESR_FALSE)); /* Input is filterbank (30 floats) in place of audio samples */
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.do_smooth_c0", ESR_TRUE));
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.plp", ESR_FALSE)); /* Do PLP instead of MEL */
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.lpcorder", 12)); /* order of lpc analysis in plp processing */
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.warp_scale", 1.0));
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.piecewise_start", 1.0));
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.peakdecayup", -1.0)); /* If +ve, decay factor on peakpicker (low to high) */
+  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.peakdecaydown", -1.0)); /* If +ve, decay factor on peakpicker (high to low) */
+  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.cuberoot", ESR_FALSE)); /* Use cube root instead of log */
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.mel_offset", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    for (i = 0; i < 32; ++i)
+      CHKLOG(rc, IntArrayListAdd(intList, 0));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.mel_offset", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.mel_loop", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    for (i = 0; i < 32; ++i)
+      CHKLOG(rc, IntArrayListAdd(intList, 1));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.mel_loop", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.melA", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 13.2911));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 47.2229));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 79.2485));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 92.1967));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 136.3855));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 152.2896));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 183.3601));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 197.4200));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 217.8278));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 225.6556));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 263.3073));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 277.193));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.melA", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.melB", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 37.0847));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 91.3289));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 113.9995));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 123.0336));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 131.2704));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 128.9942));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 120.5267));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 132.0079));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 129.8076));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 126.5029));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 121.8519));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.melB", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.dmelA", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 91.6305));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 358.3790));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 527.5946));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 536.3163));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 731.2385));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 757.8382));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 939.4460));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 1028.4136));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 1071.3193));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 1183.7922));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 1303.1014));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 1447.7766));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.dmelA", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.dmelB", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4785));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.3878));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4029));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.3182));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.3706));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5394));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5150));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4270));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4871));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4088));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4361));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5449));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.dmelB", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.ddmelA", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 10.7381));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 32.6775));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 46.2301));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 51.5438));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 57.6636));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 57.0581));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 65.3696));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 70.1910));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 71.6751));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 78.2364));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 83.2440));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 89.6261));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.ddmelA", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.ddmelB", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5274));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5098));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5333));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5963));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5132));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5282));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5530));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5682));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4662));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4342));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5235));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4061));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.ddmelB", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.rastaA", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 7.80));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 37.0));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 54.0));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 57.0));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 84.0));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 86.5));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 98.1));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.0));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 153.0));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 160.0));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 188.0));
+    CHKLOG(rc, IntArrayListAdd(intList, (int) 199.0));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.rastaA", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.rastaB", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, IntArrayListAdd(intList, 117));
+    CHKLOG(rc, IntArrayListAdd(intList, 121));
+    CHKLOG(rc, IntArrayListAdd(intList, 114));
+    CHKLOG(rc, IntArrayListAdd(intList, 111));
+    CHKLOG(rc, IntArrayListAdd(intList, 113));
+    CHKLOG(rc, IntArrayListAdd(intList, 126));
+    CHKLOG(rc, IntArrayListAdd(intList, 134));
+    CHKLOG(rc, IntArrayListAdd(intList, 130));
+    CHKLOG(rc, IntArrayListAdd(intList, 135));
+    CHKLOG(rc, IntArrayListAdd(intList, 129));
+    CHKLOG(rc, IntArrayListAdd(intList, 139));
+    CHKLOG(rc, IntArrayListAdd(intList, 138));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.rastaB", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.speech_detect", 18));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.speech_above", 18));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.ambient_within", 12));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.start_windback", 50));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.utterance_allowance", 40));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.speech_duration", 6));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.quiet_duration", 20));
+
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.high_clip", 32767));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.low_clip", -32768));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.max_per10000_clip", 10));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.max_dc_offset", 1000));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.high_noise_level_bit", 11));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.low_speech_level_bit", 11));
+  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.min_samples", 10000));
+
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.spectrum_filter_freq", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.spectrum_filter_freq", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.spectrum_filter_spread", &exists));
+  if (!exists)
+  {
+    CHKLOG(rc, IntArrayListCreate(&intList));
+    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.spectrum_filter_spread", intList, TYPES_INTARRAYLIST));
+    intList = NULL;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  if (intList != NULL)
+    intList->destroy(intList);
+  return rc;
+}
+
+/**
+ * Generate legacy frontend parameter structure from ESR_Session.
+ *
+ * @param impl SR_RecognizerImpl handle
+ * @param params Resulting structure
+ */
+ESR_ReturnCode SR_RecognizerGetFrontendLegacyParametersImpl(CA_FrontendInputParams* params)
+{
+  ESR_ReturnCode rc;
+  IntArrayList* intList;
+  size_t size, i, size_tValue;
+  int iValue;
+
+  passert(params != NULL);
+  params->is_loaded = ESR_FALSE;
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.mel_dim", &params->mel_dim));
+  CHKLOG(rc, ESR_SessionGetSize_t("CREC.Frontend.samplerate", &size_tValue));
+  params->samplerate = (int) size_tValue;
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.premel", &params->pre_mel));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.lowcut", &params->low_cut));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.highcut", &params->high_cut));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.window_factor", &params->window_factor));
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.do_skip_even_frames", &params->do_skip_even_frames));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.offset", &params->offset));
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.ddmel", &params->do_dd_mel));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.forgetfactor", &params->forget_factor));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.sv6_margin", &params->sv6_margin));
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.rastac0", &params->do_rastac0));
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.spectral_subtraction", &params->do_spectral_sub));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.spec_sub_dur", &params->spectral_sub_frame_dur));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.spec_sub_scale", &params->spec_sub_scale));
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.do_filterbank_dump", &params->do_filterbank_input));
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.do_filterbank_input", &params->do_filterbank_input));
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.do_smooth_c0", &params->do_smooth_c0));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.lpcorder", &params->lpc_order));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.warp_scale", &params->warp_scale));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.piecewise_start", &params->piecewise_start));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.peakdecayup", &params->peakpickup));
+  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.peakdecaydown", &params->peakpickdown));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.mel_offset", (void **)&intList, TYPES_INTARRAYLIST));
+  if (intList == NULL)
+  {
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->mel_offset[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.mel_loop", (void **)&intList, TYPES_INTARRAYLIST));
+  if (intList == NULL)
+  {
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->mel_loop[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.melA", (void **)&intList, TYPES_INTARRAYLIST));
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->melA_scale[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.melB", (void **)&intList, TYPES_INTARRAYLIST));
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->melB_scale[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.dmelA", (void **)&intList, TYPES_INTARRAYLIST));
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->dmelA_scale[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.dmelB", (void **)&intList, TYPES_INTARRAYLIST));
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->dmelB_scale[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.ddmelA", (void **)&intList, TYPES_INTARRAYLIST));
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->ddmelA_scale[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.ddmelB", (void **)&intList, TYPES_INTARRAYLIST));
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->ddmelB_scale[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.rastaA", (void **)&intList, TYPES_INTARRAYLIST));
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->rastaA_scale[i]));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.rastaB", (void **)&intList, TYPES_INTARRAYLIST));
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+    CHKLOG(rc, IntArrayListGet(intList, i, &params->rastaB_scale[i]));
+
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.speech_detect", &params->voice_margin));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.speech_above", &params->fast_voice_margin));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.ambient_within", &params->tracker_margin));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.start_windback", &params->start_windback));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.utterance_allowance", &params->unsure_duration));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.speech_duration", &params->voice_duration));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.quiet_duration", &params->quiet_duration));
+
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.high_clip", &params->high_clip));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.low_clip", &params->low_clip));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.max_per10000_clip", &params->max_per10000_clip));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.max_dc_offset", &params->max_dc_offset));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.high_noise_level_bit", &params->high_noise_level_bit));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.low_speech_level_bit", &params->low_speech_level_bit));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.min_samples", &params->min_samples));
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.spectrum_filter_freq", (void **)&intList, TYPES_INTARRAYLIST));
+  if (intList == NULL)
+  {
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, IntArrayListGet(intList, i, &iValue));
+    params->spectrum_filter_freq[i] = iValue;
+  }
+
+  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.spectrum_filter_spread", (void **)&intList, TYPES_INTARRAYLIST));
+  if (intList == NULL)
+  {
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  CHKLOG(rc, IntArrayListGetSize(intList, &size));
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, IntArrayListGet(intList, i, &iValue));
+    params->spectrum_filter_spread[i] = iValue;
+  }
+  params->is_loaded = ESR_TRUE;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Creates frontend components of SR_Recognizer.
+ *
+ * @param impl SR_RecognizerImpl handle
+ */
+ESR_ReturnCode SR_RecognizerCreateFrontendImpl(SR_RecognizerImpl* impl)
+{
+  ESR_ReturnCode rc;
+  CA_FrontendInputParams* frontendParams;
+
+  /* Create a frontend object */
+  impl->frontend = CA_AllocateFrontend(1, 0, 1);
+  frontendParams = CA_AllocateFrontendParameters();
+  CHKLOG(rc, SR_RecognizerGetFrontendLegacyParametersImpl(frontendParams));
+
+  CA_ConfigureFrontend(impl->frontend, frontendParams);
+
+  /* Create a wave object */
+  impl->wavein = CA_AllocateWave('N');
+  if (impl->wavein == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CA_ConfigureWave(impl->wavein, impl->frontend);
+  CA_ConfigureVoicingAnalysis(impl->wavein, frontendParams);
+
+  CA_LoadCMSParameters(impl->wavein, NULL, frontendParams);
+
+  /* Create an utterance object */
+  impl->utterance = CA_AllocateUtterance();
+  if (impl->utterance == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CA_InitUtteranceForFrontend(impl->utterance, frontendParams);
+  CA_AttachCMStoUtterance(impl->wavein, impl->utterance);
+  CA_FreeFrontendParameters(frontendParams);
+  return ESR_SUCCESS;
+
+CLEANUP:
+  if (impl->frontend != NULL)
+  {
+    CA_UnconfigureFrontend(impl->frontend);
+    CA_FreeFrontend(impl->frontend);
+    impl->frontend = NULL;
+  }
+  if (impl->wavein != NULL)
+  {
+    CA_UnconfigureWave(impl->wavein);
+    CA_FreeWave(impl->wavein);
+    impl->wavein = NULL;
+  }
+  if (impl->utterance != NULL)
+  {
+    CA_ClearUtterance(impl->utterance);
+    CA_FreeUtterance(impl->utterance);
+    impl->utterance = NULL;
+  }
+  if (frontendParams != NULL)
+    CA_FreeFrontendParameters(frontendParams);
+  return rc;
+}
+
+/**
+ * Populates legacy recognizer parameters from the session.
+ *
+ * Replaces setup_pattern_parameters()
+ */
+ESR_ReturnCode SR_AcousticModels_LoadLegacyRecognizerParameters(CA_RecInputParams* params)
+{
+  ESR_ReturnCode rc;
+
+  passert(params != NULL);
+  params->is_loaded = ESR_FALSE;
+  CHKLOG(rc, ESR_SessionGetBool("CREC.Recognizer.partial_results", &params->do_partial));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.NBest", &params->top_choices));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.eou_threshold", &params->eou_threshold));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_altword_tokens", &params->max_altword_tokens));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_frames", &params->max_frames));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_fsm_arcs", &params->max_fsm_arcs));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_fsm_nodes", &params->max_fsm_nodes));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_fsmnode_tokens", &params->max_fsmnode_tokens));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_hmm_tokens", &params->max_hmm_tokens));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_model_states", &params->max_model_states));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_searches", &params->max_searches));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_word_tokens", &params->max_word_tokens));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.non_terminal_timeout", &params->non_terminal_timeout));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.num_wordends_per_frame", &params->num_wordends_per_frame));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.often", &params->traceback_freq));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.optional_terminal_timeout", &params->optional_terminal_timeout));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.reject", &params->reject_score));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.terminal_timeout", &params->terminal_timeout));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.viterbi_prune_thresh", &params->viterbi_prune_thresh));
+  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.wordpen", &params->word_penalty));
+  params->is_loaded = ESR_TRUE;
+
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerCreate(SR_Recognizer** self)
+{
+  SR_RecognizerImpl* impl;
+  CA_RecInputParams* recogParams = NULL;
+  ESR_ReturnCode rc;
+  LCHAR recHandle[20] = { 0 };
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = NEW(SR_RecognizerImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  impl->Interface.start = &SR_RecognizerStartImpl;
+  impl->Interface.stop = &SR_RecognizerStopImpl;
+  impl->Interface.destroy = &SR_RecognizerDestroyImpl;
+  impl->Interface.setup = &SR_RecognizerSetupImpl;
+  impl->Interface.unsetup = &SR_RecognizerUnsetupImpl;
+  impl->Interface.isSetup = &SR_RecognizerIsSetupImpl;
+  impl->Interface.getParameter = &SR_RecognizerGetParameterImpl;
+  impl->Interface.getSize_tParameter = &SR_RecognizerGetSize_tParameterImpl;
+  impl->Interface.getBoolParameter = &SR_RecognizerGetBoolParameterImpl;
+  impl->Interface.setParameter = &SR_RecognizerSetParameterImpl;
+  impl->Interface.setSize_tParameter = &SR_RecognizerSetSize_tParameterImpl;
+  impl->Interface.setBoolParameter = &SR_RecognizerSetBoolParameterImpl;
+  impl->Interface.setLockFunction = &SR_RecognizerSetLockFunctionImpl;
+  impl->Interface.hasSetupRules = &SR_RecognizerHasSetupRulesImpl;
+  impl->Interface.activateRule = &SR_RecognizerActivateRuleImpl;
+  impl->Interface.deactivateRule = &SR_RecognizerDeactivateRuleImpl;
+  impl->Interface.deactivateAllRules = &SR_RecognizerDeactivateAllRulesImpl;
+  impl->Interface.isActiveRule = &SR_RecognizerIsActiveRuleImpl;
+  impl->Interface.setWordAdditionCeiling = &SR_RecognizerSetWordAdditionCeilingImpl;
+  impl->Interface.checkGrammarConsistency = &SR_RecognizerCheckGrammarConsistencyImpl;
+  impl->Interface.getModels = &SR_RecognizerGetModelsImpl;
+  impl->Interface.putAudio = &SR_RecognizerPutAudioImpl;
+  impl->Interface.advance = &SR_RecognizerAdvanceImpl;
+  impl->Interface.loadUtterance = &SR_RecognizerLoadUtteranceImpl;
+  impl->Interface.loadWaveFile = &SR_RecognizerLoadWaveFileImpl;
+  impl->Interface.logEvent = &SR_RecognizerLogEventImpl;
+  impl->Interface.logToken = &SR_RecognizerLogTokenImpl;
+  impl->Interface.logTokenInt = &SR_RecognizerLogTokenIntImpl;
+  impl->Interface.logSessionStart = &SR_RecognizerLogSessionStartImpl;
+  impl->Interface.logSessionEnd = &SR_RecognizerLogSessionEndImpl;
+  impl->Interface.logWaveformData = &SR_RecognizerLogWaveformDataImpl;
+  impl->Interface.isSignalClipping = &SR_RecognizerIsSignalClippingImpl;
+  impl->Interface.isSignalDCOffset = &SR_RecognizerIsSignalDCOffsetImpl;
+  impl->Interface.isSignalNoisy = &SR_RecognizerIsSignalNoisyImpl;
+  impl->Interface.isSignalTooFewSamples = &SR_RecognizerIsSignalTooFewSamplesImpl;
+  impl->Interface.isSignalTooManySamples = &SR_RecognizerIsSignalTooManySamplesImpl;
+  impl->Interface.isSignalTooQuiet = &SR_RecognizerIsSignalTooQuietImpl;
+
+  impl->frontend = NULL;
+  impl->wavein = NULL;
+  impl->utterance = NULL;
+  impl->confidenceScorer = NULL;
+  impl->recognizer = NULL;
+  impl->models = NULL;
+  impl->grammars = NULL;
+  impl->result = NULL;
+  impl->parameters = NULL;
+  impl->acousticState = NULL;
+  impl->audioBuffer = NULL;
+  impl->buffer = NULL;
+  impl->frames = impl->processed;
+  impl->internalState = SR_RECOGNIZER_INTERNAL_BEGIN;
+  impl->isStarted = ESR_FALSE;
+  impl->isRecognizing = ESR_FALSE;
+  impl->gotLastFrame = ESR_FALSE;
+  impl->sampleRate = 0;
+  impl->lockFunction = NULL;
+  impl->lockData = NULL;
+  impl->eventLog = NULL;
+  impl->osi_log_level = 0;
+  impl->waveformBuffer = NULL;
+  impl->isSignalQualityInitialized = ESR_FALSE;
+  impl->beginningOfSpeechOffset = 0;
+  impl->gatedMode = ESR_TRUE;
+  impl->bgsniff = 0;
+  impl->isSignalClipping       = ESR_FALSE;
+  impl->isSignalDCOffset       = ESR_FALSE;
+  impl->isSignalNoisy          = ESR_FALSE;
+  impl->isSignalTooFewSamples  = ESR_FALSE;
+  impl->isSignalTooManySamples = ESR_FALSE;
+  impl->isSignalTooQuiet       = ESR_FALSE;
+
+  CHKLOG(rc, ESR_SessionTypeCreate(&impl->parameters));
+  CHKLOG(rc, SR_RecognizerToSessionImpl());
+  CHKLOG(rc, ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &impl->osi_log_level));
+
+  /* create the event log */
+  if (impl->osi_log_level) /* do some logging if non-zero val */
+    CHKLOG(rc, ESR_SessionGetProperty(L("eventlog"), (void **)&impl->eventLog, TYPES_SR_EVENTLOG));
+
+  /* Record the OSI log event */
+  psprintf(recHandle, L("%p"), impl);
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIcrst")));
+
+  CHKLOG(rc, SR_RecognizerFrontendToSessionImpl());
+  CHKLOG(rc, SR_RecognizerCreateFrontendImpl(impl));
+  rc = ESR_SessionGetProperty("recognizer.confidenceScorer", (void **)&impl->confidenceScorer, TYPES_CONFIDENCESCORER);
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    impl->confidenceScorer = CA_AllocateConfidenceScorer();
+
+    if (!CA_LoadConfidenceScorer(impl->confidenceScorer)) {
+      rc = ESR_INVALID_STATE;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    CHKLOG(rc, ESR_SessionSetProperty("recognizer.confidenceScorer", impl->confidenceScorer, TYPES_CONFIDENCESCORER));
+  }
+  else if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  recogParams = CA_AllocateRecognitionParameters();
+  if (recogParams == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CHKLOG(rc, SR_AcousticModels_LoadLegacyRecognizerParameters(recogParams));
+  impl->recognizer = CA_AllocateRecognition();
+  if (impl->recognizer == NULL)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  CA_ConfigureRecognition(impl->recognizer, recogParams);
+  CA_FreeRecognitionParameters(recogParams);
+  CHKLOG(rc, HashMapCreate(&impl->grammars));
+  CHKLOG(rc, CircularBufferCreate(sizeof(asr_int16_t) * AUDIO_CIRC_BUFFER_SIZE, MTAG, &impl->buffer));
+  CHKLOG(rc, ESR_SessionGetSize_t("CREC.Frontend.samplerate", &impl->sampleRate));
+
+  impl->FRAME_SIZE = impl->sampleRate / FRAMERATE * SAMPLE_SIZE;
+
+  if ((impl->audioBuffer = MALLOC(impl->FRAME_SIZE, MTAG)) == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+
+  /* create the waveform buffer */
+  CHKLOG(rc, WaveformBuffer_Create(&impl->waveformBuffer, impl->FRAME_SIZE));
+
+  CHKLOG(rc, ESR_SessionGetSize_t("SREC.Recognizer.utterance_timeout", &impl->utterance_timeout));
+
+  /* OSI logging (SUCCESS) */
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle));
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("SUCCESS"), L("ESR_SUCCESS")));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIcrnd")));
+
+  CHKLOG(rc, SR_AcousticStateCreateImpl(&impl->Interface));
+
+  CHKLOG(rc, ESR_SessionGetSize_t(L("cmdline.bgsniff"), &impl->bgsniff));
+  /* gated mode == beginning of speech detection */
+  CHKLOG(rc, ESR_SessionGetBool(L("cmdline.gatedmode"), &impl->gatedMode));
+
+  *self = (SR_Recognizer*) impl;
+  return ESR_SUCCESS;
+CLEANUP:
+  /* OSI logging (FAILURE) */
+  if (impl->eventLog != NULL)
+  {
+    SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle);
+    SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("FAILURE"), ESR_rc2str(rc));
+    SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIcrnd"));
+  }
+
+  if (recogParams != NULL)
+    CA_FreeRecognitionParameters(recogParams);
+  impl->Interface.destroy(&impl->Interface);
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerDestroyImpl(SR_Recognizer* self)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_BOOL exists; // isSetup;
+  ESR_ReturnCode rc;
+  LCHAR recHandle[20] = { 0 };
+
+  if (impl->result != NULL)
+  {
+    SR_RecognizerResult_Destroy(impl->result);
+    impl->result = NULL;
+  }
+
+  if (impl->eventLog != NULL)
+  {
+    /* Record the OSI log event */
+    psprintf(recHandle, L("%p"), impl);
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle));
+    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIdesst")));
+  }
+
+  /* Clean session */
+  CHKLOG(rc, ESR_SessionContains("recognizer.confidenceScorer", &exists));
+  if (exists)
+    CHKLOG(rc, ESR_SessionRemoveProperty("recognizer.confidenceScorer"));
+
+  if (impl->confidenceScorer != NULL)
+  {
+    CA_FreeConfidenceScorer(impl->confidenceScorer);
+    impl->confidenceScorer = NULL;
+  }
+
+  /* Clear CMS, CRS_RecognizerClose() */
+  if (impl->wavein != NULL)
+  {
+    ESR_BOOL isAttached, isConfigured;
+
+    CHKLOG(rc, CA_IsCMSAttachedtoUtterance(impl->wavein, &isAttached));
+    if (isAttached)
+      CA_DetachCMSfromUtterance(impl->wavein, impl->utterance);
+
+    CHKLOG(rc, CA_IsConfiguredForAgc(impl->wavein, &isConfigured));
+    if (isConfigured)
+      CA_ClearCMSParameters(impl->wavein);
+  }
+
+  /* Free Utterance */
+  if (impl->utterance != NULL)
+  {
+    CA_ClearUtterance(impl->utterance);
+    CA_FreeUtterance(impl->utterance);
+    impl->utterance = NULL;
+  }
+
+  /* Free WaveformBuffer */
+  if (impl->waveformBuffer != NULL)
+  {
+    WaveformBuffer_Destroy(impl->waveformBuffer);
+    impl->waveformBuffer = NULL;
+  }
+
+  /* Free recognizer */
+/*  CHKLOG(rc, self->isSetup(self, &isSetup));
+  if (isSetup)
+    CHKLOG(rc, self->unsetup(self));*/
+  if (impl->grammars != NULL)
+    CHKLOG(rc, self->deactivateAllRules(self));
+  if (impl->recognizer != NULL)
+  {
+    CA_UnloadRecognitionModels(impl->recognizer);
+    CA_UnconfigureRecognition(impl->recognizer);
+    CA_FreeRecognition(impl->recognizer);
+    impl->recognizer = NULL;
+  }
+
+  if (impl->grammars != NULL)
+  {
+    CHKLOG(rc, HashMapDestroy(impl->grammars));
+    impl->grammars = NULL;
+  }
+
+  if (impl->buffer != NULL)
+  {
+    FREE(impl->buffer);
+    impl->buffer = NULL;
+  }
+
+  if (impl->audioBuffer != NULL)
+  {
+    FREE(impl->audioBuffer);
+    impl->audioBuffer = NULL;
+  }
+
+  /* Free frontend */
+  if (impl->frontend)
+  {
+    CA_UnconfigureFrontend(impl->frontend);
+    CA_FreeFrontend(impl->frontend);
+    impl->frontend = NULL;
+  }
+
+  /* Free wave */
+  if (impl->wavein)
+  {
+    CA_UnconfigureWave(impl->wavein);
+    CA_FreeWave(impl->wavein);
+    impl->wavein = NULL;
+  }
+
+  if (impl->parameters != NULL)
+    CHKLOG(rc, impl->parameters->destroy(impl->parameters));
+
+  if (impl->eventLog != NULL)
+  {
+    /* OSI logging (SUCCESS) */
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle));
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("SUCCESS"), L("ESR_SUCCESS")));
+    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIdesnd")));
+    impl->eventLog = NULL;
+  }
+
+  if (impl->acousticState != NULL)
+  {
+    impl->acousticState->destroy(self);
+    impl->acousticState = NULL;
+  }
+  FREE(impl);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode beginRecognizing(SR_RecognizerImpl* impl)
+{
+  CA_RecInputParams* recogParams;
+  LCHAR tok[80];
+  LCHAR* val;
+  PTimeStamp BORT;
+  size_t i, grammarSize;
+  ESR_ReturnCode rc;
+
+  /* Setup recognizer for new utterance */
+  recogParams = CA_AllocateRecognitionParameters();
+  if (recogParams == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  SR_AcousticModels_LoadLegacyRecognizerParameters(recogParams);
+  CA_BeginRecognition(impl->recognizer, NULL, 1, recogParams);
+  CA_FreeRecognitionParameters(recogParams);
+  impl->isRecognizing = ESR_TRUE;
+
+  /* OSI log the  grammars */
+  CHKLOG(rc, HashMapGetSize(impl->grammars, &grammarSize));
+  for (i = 0; i < grammarSize; ++i)
+  {
+    psprintf(tok, L("GURI%d"), i);
+    /* use the key as the grammar URI */
+    CHKLOG(rc, HashMapGetKeyAtIndex(impl->grammars, i, &val));
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, tok, val));
+  }
+  /* OSI ACST acoustic state reset */
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("ACST"), 0));
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("LANG"), L("en-us")));
+
+  /* OSI log the start of recognition */
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIrcst")));
+
+  /* save the BORT timing (begin of recog) */
+  PTimeStampSet(&BORT);
+  impl->recogLogTimings.BORT = PTimeStampDiff(&BORT, &impl->timestamp);
+
+  return ESR_SUCCESS;
+CLEANUP:
+  if (recogParams != NULL)
+    CA_FreeRecognitionParameters(recogParams);
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerStartImpl(SR_Recognizer* self)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  size_t silence_duration_in_frames;
+  size_t end_of_utterance_hold_off_in_frames;
+  size_t grammarCount;
+  ESR_ReturnCode rc;
+  ESR_BOOL enableGetWaveform = ESR_FALSE;
+
+  CHKLOG(rc, impl->grammars->getSize(impl->grammars, &grammarCount));
+  if (impl->models == NULL)
+  {
+    PLogError("ESR_INVALID_STATE: No rule has been set up");
+    return ESR_INVALID_STATE;
+  }
+  if (grammarCount < 1)
+  {
+    PLogError("ESR_INVALID_STATE: No rule has been activated");
+    return ESR_INVALID_STATE;
+  }
+
+  if (!CA_OpenWaveFromDevice(impl->wavein, DEVICE_RAW_PCM, impl->frontend->samplerate, 0, WAVE_DEVICE_RAW))
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  /* Setup utterance */
+  CA_UnlockUtteranceForInput(impl->utterance);
+
+  /* Setup utterance */
+  CHKLOG(rc, ESR_SessionGetSize_t(L("cmdline.silence_duration_in_frames"), &silence_duration_in_frames));
+  CHKLOG(rc, ESR_SessionGetSize_t(L("cmdline.end_of_utterance_hold_off_in_frames"), &end_of_utterance_hold_off_in_frames));
+  CA_SetEndOfUtteranceByLevelTimeout(impl->utterance, silence_duration_in_frames, end_of_utterance_hold_off_in_frames);
+
+  CA_ResetVoicing(impl->utterance);
+
+  /*
+   * NOTE: We don't actually begin the recognizer here, the beginning of speech
+   * detector will do that.
+   */
+
+  impl->gotLastFrame = ESR_FALSE;
+  impl->isStarted = ESR_TRUE;
+  impl->isRecognizing = ESR_FALSE;
+  impl->isSignalQualityInitialized = ESR_FALSE;
+  impl->internalState = SR_RECOGNIZER_INTERNAL_BEGIN;
+  PTimeStampSet(&impl->timestamp);
+
+  /* reset waveform buffer at start of every recognition */
+  CHKLOG(rc, WaveformBuffer_Reset(impl->waveformBuffer));
+
+  /* is waveform buffering active? */
+  rc = impl->parameters->getBool(impl->parameters, L("enableGetWaveform"), &enableGetWaveform);
+  if (rc != ESR_SUCCESS && rc != ESR_NO_MATCH_ERROR)
+  {
+    PLogError(L("%s: could determine whether VoiceEnrollment active or not"), ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (enableGetWaveform)
+    CHKLOG(rc, WaveformBuffer_SetBufferingState(impl->waveformBuffer, WAVEFORM_BUFFERING_ON_CIRCULAR));
+  else
+    CHKLOG(rc, WaveformBuffer_SetBufferingState(impl->waveformBuffer, WAVEFORM_BUFFERING_OFF));
+
+  /* I am going to try to open the audio waveform file here */
+  if (impl->osi_log_level & OSI_LOG_LEVEL_AUDIO)
+  {
+    /* open a new audio waveform file */
+    rc = SR_EventLogAudioOpen(impl->eventLog, L("audio/L16"), impl->sampleRate, SAMPLE_SIZE);
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(L("%s: could not open the RIFF audio file"), ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  impl->frames = impl->processed = 0;
+  return ESR_SUCCESS;
+CLEANUP:
+/*  self->stop(self);*/
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerStopImpl(SR_Recognizer* self)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  SR_AcousticModelsImpl* modelsImpl;
+  ESR_ReturnCode rc;
+
+#ifdef MEASURE_SAMPLE_TIMES
+    SR_Recognizer_Log_Samples_Received ( );
+#endif
+
+  PLOG_DBG_API_ENTER();
+  if (!impl->isStarted)
+  {
+    /* In case the user calls stop() twice */
+    return ESR_SUCCESS;
+  }
+  modelsImpl = (SR_AcousticModelsImpl*) impl->models;
+
+  /* Clean-up recognizer and utterance */
+  switch (impl->internalState)
+  {
+    case SR_RECOGNIZER_INTERNAL_BEGIN:
+      /* Recognizer was never started */
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("BEGIN")));
+      CA_LockUtteranceFromInput(impl->utterance);
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_BEGIN -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      break;
+
+    case SR_RECOGNIZER_INTERNAL_BOS_TIMEOUT:
+      /* Recognizer was never started */
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("BOS_TIMEOUT")));
+      CA_LockUtteranceFromInput(impl->utterance);
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_BOS_TIMEOUT -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      break;
+
+    case SR_RECOGNIZER_INTERNAL_BOS_NO_MATCH:
+      /* Recognizer was never started */
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("BOS_NO_MATCH")));
+      CA_LockUtteranceFromInput(impl->utterance);
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_BOS_NO_MATCH -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      break;
+
+    case SR_RECOGNIZER_INTERNAL_BOS_DETECTION:
+      /* Recognizer was never started */
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("BOS_DETECTION")));
+      CA_LockUtteranceFromInput(impl->utterance);
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_BOS_DETECTION -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      break;
+
+    case SR_RECOGNIZER_INTERNAL_EOS_DETECTION:
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("EOS_DETECTION")));
+      CA_LockUtteranceFromInput(impl->utterance);
+      if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
+      {
+        rc = ESR_INVALID_STATE;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_EOS_DETECTION -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      break;
+
+    case SR_RECOGNIZER_INTERNAL_EOI:
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("EOI")));
+      CA_LockUtteranceFromInput(impl->utterance);
+      if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
+      {
+        rc = ESR_INVALID_STATE;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_EOI -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      break;
+
+    case SR_RECOGNIZER_INTERNAL_EOS:
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("EOS")));
+      CA_LockUtteranceFromInput(impl->utterance);
+      if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
+      {
+        rc = ESR_INVALID_STATE;
+        PLogError(ESR_rc2str(rc));
+        goto CLEANUP;
+      }
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_EOS -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      break;
+
+    case SR_RECOGNIZER_INTERNAL_END:
+      /* Recognizer already shut down */
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("END")));
+      break;
+
+    default:
+      /* Shut down recognizer */
+      CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), impl->internalState));
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("unknown state -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      CA_LockUtteranceFromInput(impl->utterance);
+      if (impl->isRecognizing)
+      {
+        if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
+        {
+          rc = ESR_INVALID_STATE;
+          PLogError(ESR_rc2str(rc));
+          goto CLEANUP;
+        }
+      }
+      rc = ESR_INVALID_STATE;
+      PLogError(L("%s: %d"), ESR_rc2str(rc), impl->internalState);
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      goto CLEANUP;
+  }
+  if (impl->eventLog != NULL)
+  {
+    int n;
+    LCHAR result[MAX_ENTRY_LENGTH];
+    result[0] = L('\0');
+
+    n = CA_GetUnprocessedFramesInUtterance(impl->utterance);
+    CHKLOG(rc, SR_EventLogTokenInt(impl->eventLog, L("CA_GetUnprocessedFramesInUtterance() (x10ms)"), n));
+    CA_FullResultLabel(impl->recognizer, result, MAX_ENTRY_LENGTH - 1);
+    CHKLOG(rc, SR_EventLogToken(impl->eventLog, L("CA_FullResultLabel() (x20ms)"), result));
+    n = CircularBufferGetSize(impl->buffer);
+    CHKLOG(rc, SR_EventLogTokenInt(impl->eventLog, L("CircularBufferGetSize() (samples)"), n / SAMPLE_SIZE));
+  }
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_LOCK, impl->lockData);
+  CircularBufferReset(impl->buffer);
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_UNLOCK, impl->lockData);
+  if (CA_RecognitionHasResults(impl->recognizer))
+    CA_ClearResults(impl->recognizer);
+  CA_FlushUtteranceFrames(impl->utterance);
+  CA_CalculateCMSParameters(impl->wavein);
+  CA_CloseDevice(impl->wavein);
+
+  /* record the OSI event */
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIstop")));
+
+  if (impl->result != NULL)
+  {
+    CHKLOG(rc, SR_RecognizerResult_Destroy(impl->result));
+    impl->result = NULL;
+  }
+
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_LOCK, impl->lockData);
+  impl->gotLastFrame = ESR_TRUE;
+  PLOG_DBG_TRACE((L("SR_Recognizer shutdown occured")));
+  impl->isStarted = ESR_FALSE;
+  impl->isRecognizing = ESR_FALSE;
+  if (impl->osi_log_level & OSI_LOG_LEVEL_AUDIO)
+    SR_EventLogAudioClose(impl->eventLog);
+
+  impl->recogLogTimings.BORT = 0;
+  impl->recogLogTimings.DURS = 0;
+  impl->recogLogTimings.EORT = 0;
+  impl->recogLogTimings.EOSD = 0;
+  impl->recogLogTimings.EOSS = 0;
+  impl->recogLogTimings.BOSS = 0;
+  impl->recogLogTimings.EOST = 0;
+  impl->eos_reason = L("undefined");
+
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_UNLOCK, impl->lockData);
+  PLOG_DBG_API_EXIT(rc);
+  return rc;
+CLEANUP:
+  PLOG_DBG_API_EXIT(rc);
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerSetupImpl(SR_Recognizer* self)
+{
+  ESR_ReturnCode rc;
+  CA_AcoustInputParams* acousticParams = NULL;
+  SR_AcousticModelsImpl* modelsImpl;
+  SR_AcousticModels* models;
+  SR_RecognizerImpl* recogImpl = NULL;
+  CA_Acoustic* acoustic;
+  size_t size, i;
+  LCHAR           filenames[P_PATH_MAX];
+  size_t          len;
+
+  len = P_PATH_MAX;
+  CHKLOG(rc, ESR_SessionGetLCHAR ( L("cmdline.modelfiles"), filenames, &len ));
+
+  CHKLOG(rc, SR_AcousticModelsLoad ( filenames, &models ));
+
+  if (models == NULL)
+    {
+      PLogError(L("ESR_INVALID_STATE while finding cmdline.modelfiles"));
+      return ESR_INVALID_STATE;
+    }
+  modelsImpl = (SR_AcousticModelsImpl*) models;
+  recogImpl = (SR_RecognizerImpl*) self;
+  acousticParams = NULL;
+
+  CHKLOG(rc, SR_AcousticModelsGetCount(models, &size));
+  acousticParams = CA_AllocateAcousticParameters();
+  if (acousticParams == NULL)
+      {
+      rc = ESR_OUT_OF_MEMORY;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+      }
+    CHKLOG(rc, modelsImpl->getLegacyParameters(acousticParams));
+    CHKLOG(rc, ArrayListGetSize(modelsImpl->acoustic, &size));
+    for (i = 0; i < size; ++i)
+      {
+      CHKLOG(rc, ArrayListGet(modelsImpl->acoustic, i, (void **)&acoustic));
+      CA_LoadModelsInAcoustic(recogImpl->recognizer, acoustic, acousticParams);
+      }
+  CA_FreeAcousticParameters(acousticParams);
+
+  recogImpl->models = models;
+  CHKLOG(rc, modelsImpl->setupPattern(recogImpl->models, self));
+  return ESR_SUCCESS;
+ CLEANUP:
+  if (acousticParams != NULL)
+    CA_FreeAcousticParameters(acousticParams);
+  if (recogImpl != NULL)
+    CA_UnloadRecognitionModels(recogImpl->recognizer);
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerUnsetupImpl(SR_Recognizer* self)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  SR_AcousticModelsImpl* modelsImpl = (SR_AcousticModelsImpl*) impl->models;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, modelsImpl->unsetupPattern(impl->models));
+  CA_UnloadRecognitionModels(impl->recognizer);
+  CHKLOG(rc, SR_AcousticModelsDestroy ( impl->models ));
+  impl->models = NULL;
+  return ESR_SUCCESS;
+ CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerIsSetupImpl(SR_Recognizer* self, ESR_BOOL* isSetup)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+
+  if (isSetup == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  *isSetup = impl->models != NULL;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_RecognizerGetParameterImpl(SR_Recognizer* self, const LCHAR* key,
+    LCHAR* value, size_t* len)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  rc = impl->parameters->getLCHAR(impl->parameters, key, value, len);
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    CHKLOG(rc, ESR_SessionGetLCHAR(key, value, len));
+    return ESR_SUCCESS;
+  }
+  else if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/*
+ * The get / set code is a mess. Since we only use size_t parameters, that's all
+ * that I am going to make work. The impl->parameters don't work so you always
+ * have to get them from the session. The impl always logs an error. SteveR
+ */
+
+ESR_ReturnCode SR_RecognizerGetSize_tParameterImpl(SR_Recognizer* self, const LCHAR* key,
+    size_t* value)
+{
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, ESR_SessionGetSize_t(key, value));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerGetBoolParameterImpl(SR_Recognizer* self, const LCHAR* key, ESR_BOOL* value)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  rc = impl->parameters->getBool(impl->parameters, key, value);
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    CHKLOG(rc, ESR_SessionGetBool(key, value));
+    return ESR_SUCCESS;
+  }
+  else if (rc != ESR_SUCCESS)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerSetParameterImpl(SR_Recognizer* self, const LCHAR* key,
+    LCHAR* value)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  LCHAR temp[256];
+  ESR_ReturnCode rc;
+  size_t len = 256;
+
+  rc = impl->parameters->getLCHAR(impl->parameters, key, temp, &len);
+  if (rc == ESR_SUCCESS)
+  {
+    if (LSTRCMP(temp, value) == 0)
+      return ESR_SUCCESS;
+    CHKLOG(rc, impl->parameters->removeAndFreeProperty(impl->parameters, key));
+  }
+  else if (rc != ESR_NO_MATCH_ERROR && rc != ESR_INVALID_RESULT_TYPE)
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  CHKLOG(rc, impl->parameters->setLCHAR(impl->parameters, key, value));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+/*
+ * The only set param function that is working is for the size_t parameters; and not
+ * all of them are working, only the ones specified in the function itself. There are
+ * two reasons for this: first most of the set functions just put the value in an unused
+ * table that has no effect; second many of the changes need to be propogated to a specific
+ * part of the code. This needs to be evaluated on a per parameter basis. SteveR
+ */
+
+/*
+ * This function will be used to set parameters in the session. We need to go through
+ * the recognizer so as to propogate the values into the recognizer. We will rely on
+ * the session to do the right thing. SteveR
+ */
+
+ESR_ReturnCode SR_RecognizerSetSize_tParameterImpl(SR_Recognizer* self, const LCHAR* key,
+    size_t value)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  rc = ESR_SessionSetSize_t ( key, value );
+
+  if (rc == ESR_SUCCESS)
+  {
+    if  ( LSTRCMP ( L("SREC.Recognizer.utterance_timeout"), key ) == 0 )
+    {
+      impl->utterance_timeout = value;
+    }
+    else if  ( LSTRCMP ( L("CREC.Recognizer.terminal_timeout"), key ) == 0 )
+    {
+      impl->recognizer->eosd_parms->endnode_timeout = value;
+    }
+    else if  ( LSTRCMP ( L("CREC.Recognizer.optional_terminal_timeout"), key ) == 0 )
+    {
+      impl->recognizer->eosd_parms->optendnode_timeout = value;
+    }
+    else if  ( LSTRCMP ( L("CREC.Recognizer.non_terminal_timeout"), key ) == 0 )
+    {
+      impl->recognizer->eosd_parms->internalnode_timeout = value;
+    }
+    else if  ( LSTRCMP ( L("CREC.Recognizer.eou_threshold"), key ) == 0 )
+    {
+      impl->recognizer->eosd_parms->eos_costdelta = (frameID)value;
+      impl->recognizer->eosd_parms->opt_eos_costdelta = (frameID)value;
+    }
+    else
+    {
+      PLogError(L("ESR_INVALID_ARGUMENT"));
+      rc = ESR_INVALID_ARGUMENT;
+    }
+  }
+  return rc;
+}
+
+
+ESR_ReturnCode SR_RecognizerSetBoolParameterImpl(SR_Recognizer* self, const LCHAR* key, ESR_BOOL value)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_BOOL temp;
+  ESR_ReturnCode rc;
+
+  rc = impl->parameters->getBool(impl->parameters, key, &temp);
+  if (rc == ESR_SUCCESS)
+  {
+    if (temp == value)
+      return ESR_SUCCESS;
+    CHKLOG(rc, impl->parameters->removeAndFreeProperty(impl->parameters, key));
+  }
+  else if (rc != ESR_NO_MATCH_ERROR && rc != ESR_INVALID_RESULT_TYPE)
+    return rc;
+
+  CHKLOG(rc, impl->parameters->setBool(impl->parameters, key, value));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerHasSetupRulesImpl(SR_Recognizer* self, ESR_BOOL* hasSetupRules)
+{
+  SR_RecognizerImpl* recogImpl = (SR_RecognizerImpl*) self;
+  size_t size;
+  ESR_ReturnCode rc;
+
+  if (hasSetupRules == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  CHKLOG(rc, HashMapGetSize(recogImpl->grammars, &size));
+  *hasSetupRules = size > 0;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerActivateRuleImpl(SR_Recognizer* self, SR_Grammar* grammar,
+    const LCHAR* ruleName, unsigned int weight)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  SR_GrammarImpl* grammarImpl = (SR_GrammarImpl*) grammar;
+  SR_AcousticModelsImpl* modelsImpl;
+  LCHAR grammarID[80];
+  ESR_ReturnCode rc;
+  char *failure_reason = NULL;
+
+  if (grammar == NULL)
+  {
+    if (impl->eventLog)
+      failure_reason = "badinput";
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    goto CLEANUP;
+  }
+
+  if (impl->models == NULL)
+  {
+    failure_reason = "nomodels";
+    rc = ESR_INVALID_STATE;
+    PLogError(L("acoustic models must be configured"));
+    goto CLEANUP;
+  }
+
+  modelsImpl = (SR_AcousticModelsImpl*) impl->models;
+
+  if (ruleName == NULL)
+    psprintf(grammarID, L("%p"), grammar);
+  else
+  {
+    if (LSTRLEN(ruleName) > 80)
+    {
+      rc = ESR_BUFFER_OVERFLOW;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    LSTRCPY(grammarID, ruleName);
+  }
+
+  CHKLOG(rc, HashMapPut(impl->grammars, grammarID, grammar));
+  if (CA_SetupSyntaxForRecognizer(grammarImpl->syntax, impl->recognizer))
+  {
+    failure_reason = "cafailed";
+    rc = ESR_INVALID_STATE;
+    PLogError(L("ESR_INVALID_STATE"));
+    goto CLEANUP;
+  }
+
+   CHKLOG(rc, SR_Grammar_SetupRecognizer(grammar, self));
+  grammarImpl->isActivated = ESR_TRUE;
+
+  /*
+   * If we want to log dynamically added words, then we must give the grammar a reference
+   * to our event log. The grammar logs word additions if and only if its reference to
+   * eventLog is non-null.
+   */
+  if (impl->osi_log_level & OSI_LOG_LEVEL_ADDWD)
+    grammarImpl->eventLog = impl->eventLog;
+  else
+    grammarImpl->eventLog = NULL;
+
+  rc = ESR_SUCCESS;
+
+CLEANUP:
+  if (impl->eventLog)
+  {
+    if (failure_reason)
+    {
+      SR_EventLogTokenInt(impl->eventLog, L("igrm"), (int) grammar);
+      SR_EventLogToken(impl->eventLog, L("rule"), ruleName);
+      SR_EventLogToken(impl->eventLog, L("rslt"), "fail");
+      SR_EventLogToken(impl->eventLog, L("reason"), failure_reason);
+      SR_EventLogEvent(impl->eventLog, L("ESRacGrm"));
+    }
+    else
+    {
+      SR_EventLogTokenInt(impl->eventLog, L("igrm"), (int) grammar);
+      SR_EventLogToken(impl->eventLog, L("rule"), ruleName);
+      SR_EventLogToken(impl->eventLog, L("rslt"), "ok");
+      SR_EventLogEvent(impl->eventLog, L("ESRacGrm"));
+    }
+  }
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerDeactivateRuleImpl(SR_Recognizer* self, SR_Grammar* grammar,
+    const LCHAR* ruleName)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  SR_GrammarImpl* grammarImpl = (SR_GrammarImpl*) grammar;
+  LCHAR grammarID[MAX_INT_DIGITS+1];
+  ESR_ReturnCode rc;
+
+  if (ruleName == NULL)
+  {
+    psprintf(grammarID, L("%p"), grammar);
+    CHKLOG(rc, HashMapRemove(impl->grammars, grammarID));
+  }
+  else
+    CHKLOG(rc, HashMapRemove(impl->grammars, ruleName));
+  grammarImpl->isActivated = ESR_FALSE;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerDeactivateAllRulesImpl(SR_Recognizer* self)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  CHKLOG(rc, HashMapRemoveAll(impl->grammars));
+  CA_ClearSyntaxForRecognizer(0, impl->recognizer);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerIsActiveRuleImpl(SR_Recognizer* self, SR_Grammar* grammar,
+    const LCHAR* ruleName, ESR_BOOL* isActiveRule)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  LCHAR grammarID[MAX_INT_DIGITS+1];
+  ESR_ReturnCode rc;
+
+  psprintf(grammarID, L("%p"), grammar);
+  CHKLOG(rc, HashMapContainsKey(impl->grammars, (LCHAR*) &grammarID, isActiveRule));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerSetWordAdditionCeilingImpl(SR_Recognizer* self, SR_Grammar* grammar)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  SR_GrammarImpl* grammarImpl = (SR_GrammarImpl*)grammar;
+  int iRc;
+
+  if(!impl || !grammarImpl)
+    return ESR_INVALID_ARGUMENT;
+  iRc = CA_CeilingSyntaxForRecognizer( grammarImpl->syntax, impl->recognizer);
+  if(iRc) return ESR_INVALID_STATE;
+
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_RecognizerCheckGrammarConsistencyImpl(SR_Recognizer* self, SR_Grammar* grammar,
+    ESR_BOOL* isConsistent)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  SR_GrammarImpl* grammarImpl;
+  SR_RecognizerImpl* impl2;
+
+
+  grammarImpl = (SR_GrammarImpl*) grammar;
+  impl2 = (SR_RecognizerImpl*)grammarImpl->recognizer;
+  // *isConsistent = grammarImpl->models == impl->models;
+  *isConsistent = (impl2->models == impl->models);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_RecognizerGetModelsImpl(SR_Recognizer* self, SR_AcousticModels** pmodels)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  *pmodels = impl->models;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_RecognizerPutAudioImpl(SR_Recognizer* self, asr_int16_t* buffer, size_t* bufferSize,
+    ESR_BOOL isLast)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+  int    rcBufWrite;
+  size_t nbWritten;
+
+#ifdef MEASURE_SAMPLE_TIMES
+    if ( sample_buffers_received < MAX_SAMPLES_TO_MEASURE )
+        {
+        gettimeofday ( &buffer_received_time, NULL );
+        seconds_buffer_received [sample_buffers_received] = buffer_received_time.tv_sec;
+        micro_seconds_buffer_received [sample_buffers_received] = buffer_received_time.tv_usec;
+        samples_in_buffer [sample_buffers_received] = *bufferSize;
+        total_samples_received += *bufferSize;
+        sample_buffers_received++;
+        }
+#endif
+
+  if (isLast == ESR_FALSE && (buffer == NULL || bufferSize == NULL))
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_LOCK, impl->lockData);
+  if (!impl->isStarted)
+  {
+    if (impl->lockFunction)
+      impl->lockFunction(ESR_UNLOCK, impl->lockData);
+    PLogMessage(L("ESR_INVALID_STATE: Tried pushing audio while recognizer was offline"));
+    return ESR_INVALID_STATE;
+  }
+  if (impl->gotLastFrame)
+  {
+    if (impl->lockFunction)
+      impl->lockFunction(ESR_UNLOCK, impl->lockData);
+    PLogMessage(L("ESR_INVALID_STATE: isLast=TRUE"));
+    return ESR_INVALID_STATE;
+  }
+  if (buffer == NULL && isLast == ESR_FALSE)
+  {
+    if (impl->lockFunction)
+      impl->lockFunction(ESR_UNLOCK, impl->lockData);
+    PLogError(L("ESR_INVALID_ARGUMENT: got NULL  buffer on non-terminal frame"));
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  rcBufWrite = CircularBufferWrite(impl->buffer, buffer, *bufferSize * SAMPLE_SIZE);
+  if (rcBufWrite < 0)
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(L("%s: error writing to buffer (buffer=%d, available=%u)"), ESR_rc2str(rc), (int) impl->buffer, CircularBufferGetAvailable(impl->buffer));
+    goto CLEANUP;
+  }
+
+  nbWritten = (size_t)rcBufWrite;
+  if (nbWritten % SAMPLE_SIZE != 0)
+  {
+    size_t amountUnwritten;
+
+    /* The buffer is byte-based while we're sample based. Make sure we write entire samples or not at all */
+    amountUnwritten = CircularBufferUnwrite(impl->buffer, nbWritten % SAMPLE_SIZE);
+    passert(amountUnwritten == nbWritten % SAMPLE_SIZE);
+    nbWritten -= amountUnwritten;
+  }
+  passert(nbWritten % 2 == 0); /* make sure CircularBufferSize is divisible by 2 */
+
+  if (nbWritten < *bufferSize * SAMPLE_SIZE)
+  {
+    rc = ESR_BUFFER_OVERFLOW;
+#ifndef NDEBUG
+    PLOG_DBG_TRACE((L("%s: writing to circular buffer"), ESR_rc2str(rc)));
+#endif
+    *bufferSize = nbWritten / SAMPLE_SIZE;
+    if (impl->lockFunction)
+      impl->lockFunction(ESR_UNLOCK, impl->lockData);
+    goto CLEANUP;
+  }
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_UNLOCK, impl->lockData);
+
+  if (isLast)
+    impl->gotLastFrame = ESR_TRUE;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/* utility function to sort the ArrayList of nbest list results by the score of the first
+   semantic result */
+ESR_ReturnCode SemanticResults_SortByScore(ArrayList *results, size_t nbestSize)
+{
+  ESR_ReturnCode rc;
+  ArrayList* semanticResultList;
+  ArrayList* semanticResultList_swap;
+  SR_SemanticResult* semanticResult_i;
+  SR_SemanticResult* semanticResult_j;
+  size_t i, j;
+  LCHAR scoreStr[MAX_ENTRY_LENGTH] ;
+  size_t scoreStrLen = MAX_ENTRY_LENGTH ;
+  int score_i, score_j;
+
+  /* bubble sort */
+  for (i = 0; i < (size_t)nbestSize; ++i)
+  {
+    for (j = i + 1; j < (size_t)nbestSize; ++j)
+    {
+      /* get for i */
+      CHKLOG(rc, ArrayListGet(results, i, (void **)&semanticResultList)); /* nbest index */
+      CHKLOG(rc, ArrayListGet(semanticResultList, 0, (void **)&semanticResult_i));      /* semresult 0 */
+
+      /* get for j */
+      CHKLOG(rc, ArrayListGet(results, j, (void **)&semanticResultList)); /* nbest index */
+      CHKLOG(rc, ArrayListGet(semanticResultList, 0, (void **)&semanticResult_j));      /* semresult 0 */
+
+      scoreStrLen = MAX_ENTRY_LENGTH ;
+      CHKLOG(rc, semanticResult_i->getValue(semanticResult_i, "raws", scoreStr, &scoreStrLen));
+      CHKLOG(rc, lstrtoi(scoreStr, &score_i, 10));
+      scoreStrLen = MAX_ENTRY_LENGTH ;
+      CHKLOG(rc, semanticResult_j->getValue(semanticResult_j, "raws", scoreStr, &scoreStrLen));
+      CHKLOG(rc, lstrtoi(scoreStr, &score_j, 10));
+
+      if (score_j < score_i)
+      {
+        /* need to swap */
+        CHKLOG(rc, ArrayListGet(results, i, (void **)&semanticResultList_swap)); /* put i in swap */
+        CHKLOG(rc, ArrayListSet(results, i, semanticResultList));       /* put j in i    */
+        CHKLOG(rc, ArrayListSet(results, j, semanticResultList_swap));  /* put swap in j */
+      }
+    }
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode filter_CA_FullResultLabel(const LCHAR* label, LCHAR *filtered_label, size_t* boss, size_t* eoss)
+{
+  ESR_ReturnCode rc;
+  enum
+  {
+    NO_COPY,
+    FRAME,
+    WORD,
+  } filter_state = WORD;
+  LCHAR *dst = filtered_label;
+  LCHAR eosBuf[16]; /* max 9999 + '\0' */
+  LCHAR bosBuf[16]; /* max 9999 + '\0' */
+  LCHAR* pBuf = NULL;
+
+  /**
+   * example: you want to filter this:
+   *
+   * "-pau-@23 clock@97 twenty_four@125 hour@145  "
+   *        ^boss = 23                       ^ eoss = 145
+   * and get this:
+   *
+   * "clock twenty_four hour"
+   */
+
+  passert(LSTRLEN(label) > 0);
+  while (*label)
+  {
+    switch (filter_state)
+    {
+      case NO_COPY:
+        if (*label == L(' '))
+          filter_state = WORD;
+        else if (*label == L('@'))
+        {
+          filter_state = FRAME;
+          if (pBuf == NULL)
+            pBuf = bosBuf;
+          else
+          {
+            *pBuf = 0;
+            pBuf = eosBuf;
+          }
+        }
+        break;
+      case WORD:
+        if (*label == L('@'))
+        {
+          *dst = L(' '); /* insert space */
+          dst++;
+          filter_state = FRAME;
+          if (pBuf == NULL)
+            pBuf = bosBuf;
+          else
+          {
+            *pBuf = 0;
+            pBuf = eosBuf;
+          }
+        }
+        else
+        {
+          *dst = *label;
+          dst++;
+        }
+        break;
+      case FRAME:
+        if (*label == L(' '))
+          filter_state = WORD;
+        else
+        {
+          *pBuf = *label;
+          pBuf++;
+        }
+        break;
+    }
+    label++;
+  }
+  *dst = 0; /* term the string */
+  *pBuf = 0; /* term the string */
+
+  /* trim the end spaces */
+  dst--;
+  while (*dst == ' ')
+    *dst-- = '\0';
+
+  /* set the eos signal indicated by the end pointed data */
+  if (eosBuf[0] != 0)
+    CHKLOG(rc, lstrtoui(eosBuf, eoss, 10));
+  else
+    eoss = 0;
+
+  if (bosBuf[0] != 0)
+    CHKLOG(rc, lstrtoui(bosBuf, boss, 10));
+  else
+    boss = 0;
+
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Populates the recognizer result if it can, otherwise it returns NO MATCH cuz no results exist
+ *
+ * INPUT STATE: SR_RECOGNIZER_INTERNAL_EOS
+ *
+ * @param self SR_Recognizer handle
+ * @todo break up into smaller functions
+ */
+ESR_ReturnCode SR_RecognizerCreateResultImpl(SR_Recognizer* self, SR_RecognizerStatus* status,
+    SR_RecognizerResultType* type)
+{
+  LCHAR label[MAX_ENTRY_LENGTH * 2];  /* run out of buffer */
+#define WORDID_COUNT 48 /* can be quite high for voice enrollment! */
+  wordID wordIDs[WORDID_COUNT];
+  LCHAR tok[80];
+  LCHAR waveformFilename[P_PATH_MAX];
+  LCHAR* pkey;
+  SR_GrammarImpl* pgrammar;
+  asr_int32_t raws; /* raw score */
+  size_t iBest, nbestSize, jBest, k, grammarSize, semanticResultsSize, grammarIndex_for_iBest;
+  LCHAR* lValue;
+  LCHAR* lValue2;
+  int confValue;
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  SR_RecognizerResultImpl* resultImpl = (SR_RecognizerResultImpl*) impl->result;
+  ESR_BOOL containsKey;
+  int valid, score, recogID;
+  LCHAR result[MAX_ENTRY_LENGTH];
+  size_t len, size;
+  size_t locale;
+  int current_choice;
+
+  /**
+   * Semantic result stuff
+   */
+  /* a temp buffer to hold semantic results of a parse (there may be several results) */
+  SR_SemanticResult* semanticResults[MAX_SEM_RESULTS];
+  ArrayList* semanticList;
+  ArrayList* semanticList2;
+  SR_SemanticResultImpl* semanticImpl;
+  SR_SemanticResultImpl* semanticImpl2;
+  SR_SemanticResult* semanticResult;
+  SR_SemanticResult* semanticResult2;
+  waveform_buffering_state_t buffering_state;
+
+  SR_AcousticModelsImpl* modelsImpl = (SR_AcousticModelsImpl*) impl->models;
+  ESR_ReturnCode rc;
+  PTimeStamp EORT;
+
+  CA_LockUtteranceFromInput(impl->utterance);
+  if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
+  {
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+
+  /* check if the forward search was successful */
+  valid = CA_FullResultLabel(impl->recognizer, result, MAX_ENTRY_LENGTH - 1);
+  CA_GetRecogID(impl->recognizer, &recogID);
+  CA_FullResultScore(impl->recognizer, &score, 1);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage(L("R: %s type %d score %d from recognizer%d"), result, type, score, valid, recogID);
+  PLogMessage(L("R: %s score %d from recognizer%d"), result, score, valid, recogID);
+#endif
+#ifdef _WIN32
+  //pfprintf(PSTDOUT, ("R: %s type %d score %d from recognizer%d\n"), result, type, score, valid, recogID);
+#endif
+
+
+  switch (valid)
+  {
+    case FULL_RESULT:
+      CHKLOG(rc, filter_CA_FullResultLabel(result, label, &impl->recogLogTimings.BOSS, &impl->recogLogTimings.EOSS));
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+      PLogMessage("R: %s", result);
+#endif
+      CA_FullResultScore(impl->recognizer, (int*) &raws, 0);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+      PLogMessage("S: %d", raws);
+#endif
+
+      /* now that we have an endpointed result, we can parse the result transcription
+         to see where speech started and ended. Then we can trim off excess parts of the
+         recorded audio waveform (if exists) so that nametags are just the right amount of
+         audio
+      */
+      CHKLOG(rc, WaveformBuffer_GetBufferingState(impl->waveformBuffer, &buffering_state));
+      if (buffering_state != WAVEFORM_BUFFERING_OFF)
+      {
+        CHKLOG(rc, WaveformBuffer_GetSize(impl->waveformBuffer, &size));
+        if (size > 0)
+        {
+          rc = WaveformBuffer_ParseEndPointedResultAndTrim(impl->waveformBuffer, result, impl->FRAME_SIZE);
+          if (rc == ESR_BUFFER_OVERFLOW)
+          {
+            /* Nametag EOS occured beyond end of buffer */
+          }
+          else if (rc != ESR_SUCCESS)
+          {
+            PLogError(ESR_rc2str(rc));
+            goto CLEANUP;
+          }
+        }
+      }
+      break;
+
+    case REJECT_RESULT:
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+      PLogMessage(L("R: <REJECTED>"));
+#endif
+      break;
+    default:
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+      PLogMessage(L("E: No results available"));
+      PLogMessage(L("R: <FAILED>"));
+#endif
+      break;
+  }
+
+
+  if (valid == FULL_RESULT)
+  {
+    /* Populate SR_RecognizerResult */
+    resultImpl->nbestList = CA_PrepareNBestList(impl->recognizer, 10, &raws);
+    if (resultImpl->nbestList == NULL)
+    {
+      /*
+       * This is not a failure. It simply means that I have not advanced far
+       * enough in recognition in order to obtain results (no paths in
+       * graph). This occurs, for instance, when a eof is reached (no more data)
+       * and I have not even created any paths in my graph.
+       */
+
+      *status = SR_RECOGNIZER_EVENT_NO_MATCH;
+      *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RecognizerCreateResultImpl() -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      passert(0);
+      return ESR_SUCCESS;
+    }
+
+    nbestSize = CA_NBestListCount(resultImpl->nbestList);
+  }
+  else
+    nbestSize = 0;
+
+  if (resultImpl->results != NULL)
+    ArrayListRemoveAll(resultImpl->results);
+  else
+    CHKLOG(rc, ArrayListCreate(&resultImpl->results));
+  if (nbestSize == 0)
+  {
+    /*
+     * Got empty n-best list even though the recognition was successful.
+     * We handle this in the same way that recog_startpt does... we consider it a no match.
+     * We could adjust the CREC.Recognizer.viterbi_prune_thresh to a higher level, but that
+     * may not fix the problem completely. We need to fix the bug in the astar search!!!
+     */
+    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
+    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+    if (impl->eventLog != NULL)
+    {
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RecognizerCreateResultImpl() -> SR_RECOGNIZER_INTERNAL_END")));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+    }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+    PLogMessage(L("ESR_INVALID_STATE: got empty n-best list even though the recognition was successful"));
+#endif
+    return ESR_SUCCESS; /* we do not want to halt the app in this case */
+  }
+  else
+  {
+    *status = SR_RECOGNIZER_EVENT_RECOGNITION_RESULT;
+    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+    if (impl->eventLog != NULL)
+    {
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RecognizerCreateResultImpl() -> SR_RECOGNIZER_INTERNAL_END")));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+    }
+  }
+
+  /**
+   * All grammars associated with the recognizer are considered to be active
+   * and therefore, I do a semantic parse on each. On the first grammar that
+   * gives one or more semantic results, I stop parsing the other grammars.
+   */
+  CHKLOG(rc, impl->grammars->getSize(impl->grammars, &grammarSize));
+  ASSERT( grammarSize == 1);
+
+  for (iBest = 0; iBest < nbestSize; ++iBest)
+  {
+    len = WORDID_COUNT;
+    if (CA_NBestListGetResultWordIDs(resultImpl->nbestList, iBest, wordIDs, &len, &raws) != ESR_SUCCESS)
+    {
+      *status = SR_RECOGNIZER_EVENT_NO_MATCH;
+      *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RecognizerCreateResultImpl() -> SR_RECOGNIZER_INTERNAL_END")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      PLogError(L("ESR_INVALID_STATE: got bad n-best list entry %d"), iBest);
+      return ESR_INVALID_STATE;
+    }
+
+    CHKLOG(rc, ArrayListCreate(&semanticList));
+    CHKLOG(rc, resultImpl->results->add(resultImpl->results, semanticList));
+
+    grammarIndex_for_iBest = 0;
+    CHKLOG(rc, impl->grammars->getKeyAtIndex(impl->grammars, grammarIndex_for_iBest, &pkey));
+    CHKLOG(rc, impl->grammars->get(impl->grammars, pkey, (void **)&pgrammar));
+    
+    CHKLOG(rc, SR_GrammarGetSize_tParameter((SR_Grammar*) pgrammar, L("locale"), &locale));
+    resultImpl->locale = locale;
+    
+    /* I need to manage my semantic results external to the check parse function */
+    for (k = 0; k < MAX_SEM_RESULTS; ++k)
+      SR_SemanticResultCreate(&semanticResults[k]);
+    
+    /* 
+       The code here tries to make the voice-enrollment more effective. 
+       The VE grammar decodes a sequence of best phonemes, but the nbest
+       processing may find a better score for an alternative choice than
+       the score of the viterbi best choice.  The reason for this is that 
+       alternative choices don't honor cross-word context-dependency quite
+       accurately.  If we choose an alternative choice then the sequence of 
+       phoneme decoded does not correspond to the sequence of models decoded.
+       To counter this, we FORCIBLY make sure the top choice here is the 
+       VITERBI top choice. 
+    */
+
+    if (iBest == 0) 
+      {
+        if (CA_IsEnrollmentSyntax( pgrammar->syntax)) {
+          /* this was voice enrollment, so let's try to replace */
+          // 	char* word1 = CA_NBestListGetResultWord(resultImpl->nbestList,wordIDs[0]);
+          // char* word2 = CA_NBestListGetResultWord(resultImpl->nbestList,wordIDs[1]);
+          // if (!strncmp(word1,voice_enroll_word_prefix,VEWPLEN)&&!strncmp(word2,voice_enroll_word_prefix,VEWPLEN))
+          len = WORDID_COUNT;
+          rc = CA_FullResultWordIDs(impl->recognizer, wordIDs, &len);
+          if (rc != ESR_SUCCESS)
+            {
+              /* in case of problem with viterbi path choice, we revert back */
+              len = WORDID_COUNT;
+              rc = CA_NBestListGetResultWordIDs(resultImpl->nbestList, iBest, wordIDs, &len, &raws) ;
+            }
+        }
+      }
+    
+    LSTRCPY(label, L(""));
+    for (k = 0; wordIDs[k] != MAXwordID; ++k)
+      {
+        LCHAR* wordk = NULL;
+        wordk = CA_NBestListGetResultWord(resultImpl->nbestList,wordIDs[k]);
+        LSTRCAT(label, wordk);
+        LSTRCAT(label, L(" "));
+      }
+    CHKLOG(rc, CA_ResultStripSlotMarkers(label));
+    passert(LSTRCMP(label, L("")) != 0);
+    
+    /* strip the trailing blank */
+    k = LSTRLEN(label) - 1;
+    if (k > 0 && label[k] == L(' '))
+      label[k] = 0;
+    
+    semanticResultsSize = MAX_SEM_RESULTS;
+    
+#if SEMPROC_ACTIVE
+    
+    /* set the literal prior to processing so that semproc can read the value
+       during processing */
+    CHKLOG(rc, pgrammar->semproc->flush(pgrammar->semproc));
+    CHKLOG(rc, pgrammar->semproc->setParam(pgrammar->semproc, L("literal"), label));
+    
+    rc = pgrammar->semproc->checkParseByWordID(pgrammar->semproc, pgrammar->semgraph,
+                                               wordIDs, semanticResults, &semanticResultsSize);
+    
+    /* rc = pgrammar->semproc->checkParse(pgrammar->semproc, pgrammar->semgraph,
+       label, semanticResults, &semanticResultsSize); */
+    
+    if (rc != ESR_SUCCESS)
+      {
+        for (k = 0; k < MAX_SEM_RESULTS; ++k)
+          {
+            semanticResults[k]->destroy(semanticResults[k]);
+            semanticResults[k] = NULL;
+          }
+        goto CLEANUP;
+      }
+#else
+    semanticResultsSize = 0;
+#endif
+    /* cleanup the empty ones */
+    for (k = semanticResultsSize; k < MAX_SEM_RESULTS; ++k)
+      {
+        CHKLOG(rc, semanticResults[k]->destroy(semanticResults[k]));
+        semanticResults[k] = NULL;
+      }
+    
+    /* save the good ones */
+    for (k = 0; k < semanticResultsSize; ++k)
+      {
+        /*
+         * Save the pointer to the semantic result that was created.
+         * Remember that the semantic result array only holds pointers
+         * and for each time that the function is called, new semantic results
+         * are created, and the pointers overwrite old values in the array
+         */
+        CHKLOG(rc, semanticList->add(semanticList, semanticResults[k]));
+      }
+    
+#if SEMPROC_ACTIVE
+    if (semanticResultsSize > 0)
+      {
+        /* OSI log the grammar(s) that was used in recognizing */
+        psprintf(tok, L("GURI%d"), grammarIndex_for_iBest);
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("GRMR"), tok));
+      }
+#else
+    /* OSI log the grammar(s) that was used in recognizing */
+    psprintf(tok, L("GURI%d"), grammarIndex_for_iBest);
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("GRMR"), tok));
+#endif
+
+    /* Populate semantic results for each nbest list entry */
+    CHKLOG(rc, semanticList->getSize(semanticList, &semanticResultsSize));
+    if (semanticResultsSize == 0)
+    {
+      /*
+       * If there was no semantic result... then I need to create one so that I can store
+       * literal, conf, meaning which are default keys that must ALWAYS exist
+       */
+      CHKLOG(rc, SR_SemanticResultCreate(&semanticResult));
+      CHKLOG(rc, semanticList->add(semanticList, semanticResult));
+      semanticResultsSize = 1;
+    }
+
+    for (k = 0; k < semanticResultsSize;++k)
+    {
+      CHKLOG(rc, semanticList->get(semanticList, k, (void **)&semanticResult));
+      if (semanticResult == NULL)
+      {
+        PLogError(L("nbest entry contained NULL semanticResult"), ESR_INVALID_STATE);
+        return ESR_INVALID_STATE;
+      }
+
+      semanticImpl = (SR_SemanticResultImpl*) semanticResult;
+
+      /* put in the literal */
+      lValue = MALLOC(sizeof(LCHAR) * (LSTRLEN(label) + 1), MTAG);
+      if (lValue == NULL)
+      {
+        PLogError(L("ESR_OUT_OF_MEMORY"));
+        return ESR_OUT_OF_MEMORY;
+      }
+      LSTRCPY(lValue, label);
+      CHKLOG(rc, semanticImpl->results->put(semanticImpl->results, L("literal"), lValue));
+
+      /* if the meaning is not set, then put in the meaning which will be the literal */
+      CHKLOG(rc, semanticImpl->results->containsKey(semanticImpl->results, L("meaning"), &containsKey));
+      if (!containsKey)
+      {
+        lValue = MALLOC(sizeof(LCHAR) * (LSTRLEN(label) + 1), MTAG);
+        if (lValue == NULL)
+        {
+          PLogError(L("ESR_OUT_OF_MEMORY"));
+          return ESR_OUT_OF_MEMORY;
+        }
+        LSTRCPY(lValue, label);
+        CHKLOG(rc, semanticImpl->results->put(semanticImpl->results, L("meaning"), lValue));
+      }
+
+      /* put in the raw score */
+      psprintf(label, L("%d"), raws);
+      lValue = MALLOC(sizeof(LCHAR) * (LSTRLEN(label) + 1), MTAG);
+      if (lValue == NULL)
+      {
+        PLogError(L("ESR_OUT_OF_MEMORY"));
+        return ESR_OUT_OF_MEMORY;
+      }
+      LSTRCPY(lValue, label);
+      CHKLOG(rc, semanticImpl->results->put(semanticImpl->results, L("raws"), lValue));
+    }
+  }
+
+  /* Now I have an nBest list where each entry has at least one semantic result */
+  /* What I need to do is filter out the nBest list entries which have matching
+     semantic results for 'meaning' */
+  /* Once I have filtered out the nBest list based on this criteria, I can calculate the confidence
+     score and populate the result of the first entry with the raw score */
+
+#if FILTER_NBEST_BY_SEM_RESULT
+
+  for (iBest = nbestSize-1; iBest>0; iBest--) /* do not filter out nBest entry 0 */
+  {
+    /**
+     * This is the entry (indexed by i) targeted for removal
+     *
+     */
+
+    /* get the nBest entry which you wish to remove (if duplicate found) */
+    CHKLOG(rc, ArrayListGet(resultImpl->results, iBest, (void **)&semanticList));
+
+    /* get the first sem_result for the entry */
+    CHKLOG(rc, ArrayListGet(semanticList, 0, (void **)&semanticResult));
+    semanticImpl = (SR_SemanticResultImpl*) semanticResult;
+
+    /* get the meaning */
+    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("meaning"), (void **)&lValue));
+
+    /* get the other entries to check against (start with 0, end on the current i entry) */
+    for (jBest = 0; jBest < iBest; ++jBest)
+    {
+      /*
+       * This is the entry (indexed by jBest) that we will compare with
+       */
+
+      /* get the nBest entry which you wish to compare with */
+      CHKLOG(rc, ArrayListGet(resultImpl->results, jBest, (void **)&semanticList2));
+
+      CHKLOG(rc, ArrayListGet(semanticList2, 0, (void **)&semanticResult2));
+      semanticImpl2 = (SR_SemanticResultImpl*) semanticResult2;
+
+      CHKLOG(rc, semanticImpl2->results->get(semanticImpl2->results, L("meaning"), (void **)&lValue2));
+      if (LSTRCMP(lValue, lValue2) == 0)
+      {
+        /* pfprintf(PSTDOUT,"duplicate sem result found %d == %d\n", iBest, jBest);
+        pfprintf(PSTDOUT,"removing %d\n", iBest); */
+
+        /* removing from the list indexed by iBest */
+        CHKLOG(rc, semanticList->remove(semanticList, semanticResult));
+        CHKLOG(rc, semanticResult->destroy(semanticResult));
+
+        CHKLOG(rc, resultImpl->results->remove(resultImpl->results, semanticList));
+        CHKLOG(rc, semanticList->destroy(semanticList));
+
+        if (!CA_NBestListRemoveResult(resultImpl->nbestList, iBest))
+          return ESR_ARGUMENT_OUT_OF_BOUNDS;
+        break;
+      }
+    }
+  }
+  nbestSize = CA_NBestListCount(resultImpl->nbestList);
+#endif
+
+  CHKLOG(rc, ArrayListGetSize(resultImpl->results, &nbestSize));
+
+  if (nbestSize)
+  {
+   if(CA_ComputeConfidenceValues(impl->confidenceScorer, impl->recognizer, resultImpl->nbestList))
+        return ESR_INVALID_STATE;
+
+   for(current_choice=nbestSize-1;current_choice>=0;current_choice--)
+   {
+    /* get the nBest entry you want to deal with */
+    CHKLOG(rc, ArrayListGet(resultImpl->results, current_choice, (void **)&semanticList));
+    /* get the first sem_result for that entry */
+    CHKLOG(rc, ArrayListGet(semanticList, 0, (void **)&semanticResult));
+    semanticImpl = (SR_SemanticResultImpl*) semanticResult;
+
+    /* put in the conf value for that nBest entry */
+    if(!CA_NBestListGetResultConfidenceValue( resultImpl->nbestList, current_choice, &confValue))
+      return ESR_ARGUMENT_OUT_OF_BOUNDS;
+
+    psprintf(label, L("%d"), confValue);
+    lValue = MALLOC(sizeof(LCHAR) * (LSTRLEN(label) + 1), MTAG);
+      if (lValue == NULL)
+      {
+        PLogError(L("ESR_OUT_OF_MEMORY"));
+        return ESR_OUT_OF_MEMORY;
+      }
+      LSTRCPY(lValue, label);
+      CHKLOG(rc, semanticImpl->results->put(semanticImpl->results, L("conf"),lValue));
+    }
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("CMPT"), 0));
+  }
+
+  /* OSI log the end of recognition and all bufferred tokens */
+
+  /* OSI log end of recognition time */
+  PTimeStampSet(&EORT);
+  impl->recogLogTimings.EORT = PTimeStampDiff(&EORT, &impl->timestamp);
+  impl->recogLogTimings.DURS = impl->processed * MSEC_PER_FRAME;
+
+  /*****************************************/
+  /* OSI Logging stuff */
+  /*****************************************/
+if( impl->osi_log_level != 0)
+ {
+  /* get the nBest size (this size may have changed since previous set cuz of nbest list filtering) */
+  CHKLOG(rc, ArrayListGetSize(resultImpl->results, &nbestSize));
+  /* OSI log the nBest list size */
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("NBST"), nbestSize));
+
+
+  for (iBest = 0; iBest < nbestSize; iBest++) /* loop */
+  {
+    /* get the nBest entry */
+    CHKLOG(rc, ArrayListGet(resultImpl->results, iBest, (void**)&semanticList));
+
+    /* get the first sem_result for the entry (ther emay be many, but ignore others) */
+    CHKLOG(rc, ArrayListGet(semanticList, 0, (void **)&semanticResult));
+    semanticImpl = (SR_SemanticResultImpl*) semanticResult;
+
+    /* get the meaning and OSI log it */
+    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("meaning"), (void **)&lValue));
+    /* OSI log RSLT (meaning) for nbest item */
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RSLT"), lValue));
+
+    /* get the literal and OSI log it */
+    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("literal"), (void **)&lValue));
+    /* OSI log RAWT SPOK (literal) for nbest item */
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RAWT"), lValue));
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("SPOK"), lValue));
+
+    /* get the score and OSI log it */
+    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("raws"), (void **)&lValue));
+    /* OSI log RAWS (score) for nbest item */
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RAWS"), lValue));
+    /* get the confidence value and OSI log it */
+    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("conf"), (void **)&lValue));
+    /* OSI log CONF (values) for nbest item */
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("CONF"), lValue));
+  }
+
+  /* log the values */
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BORT"), impl->recogLogTimings.BORT));
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("DURS"), impl->recogLogTimings.DURS));
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("EORT"), impl->recogLogTimings.EORT));
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("EOSD"), impl->recogLogTimings.EOSD));
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("EOSS"), impl->recogLogTimings.EOSS));
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("EOST"), impl->recogLogTimings.EOST));
+  if (impl->osi_log_level & OSI_LOG_LEVEL_AUDIO)
+  {
+    len = P_PATH_MAX;
+    CHKLOG(rc, SR_EventLogAudioGetFilename(impl->eventLog, waveformFilename, &len));
+    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("WVNM"), waveformFilename));
+  }
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RSTT"), L("ok")));
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RENR"), L("ok")));
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("ENDR"), impl->eos_reason));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIrcnd")));
+
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BOSS"), impl->recogLogTimings.BOSS)); /* extra not in OSI spec */
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("ESRboss")));
+
+  /*
+   * Record which recognizer was the successful one (male or female)
+   * this index refers to the order in the swimdllist file.
+   */
+  CHKLOG(rc, CA_GetRecogID(impl->recognizer, &recogID));
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("RECOG"), recogID));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("ESRrcid")));
+
+  /* Record semantic results returned by top nbestlist entry */
+  if (1)
+  {
+#define MAX_SEMANTIC_KEYS 50
+    LCHAR* semanticKeys[MAX_SEMANTIC_KEYS];
+#define SEMANTIC_VALUE_SIZE 512
+    LCHAR semanticValue[SEMANTIC_VALUE_SIZE];
+    size_t num_semanticKeys;
+
+    rc = resultImpl->results->getSize(resultImpl->results, &nbestSize);
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto DONE;
+    }
+    for (iBest = 0; iBest < nbestSize; ++iBest) /* loop2 */
+    {
+      rc = resultImpl->results->get(resultImpl->results, iBest, (void **)&semanticList);
+      if (rc != ESR_SUCCESS)
+      {
+        PLogError(ESR_rc2str(rc));
+        goto DONE;
+      }
+
+	  /* semanticResultsSize is the number of semantic meanings, although
+		 ambiguous parses are not entirely supported 
+		 num_semanticKeys    is associated to a particular parse         */
+	 
+      rc = semanticList->getSize(semanticList, &semanticResultsSize);
+      if (rc != ESR_SUCCESS)
+      {
+        PLogError(ESR_rc2str(rc));
+        goto DONE;
+      }
+      for (k = 0; k < semanticResultsSize; ++k)
+      {
+		size_t iKey;
+        rc = semanticList->get(semanticList, k, (void **)&semanticResult);
+        if (rc != ESR_SUCCESS)
+        {
+          PLogError(ESR_rc2str(rc));
+          goto DONE;
+        }
+        num_semanticKeys = MAX_SEMANTIC_KEYS;
+        rc = semanticResult->getKeyList(semanticResult, (LCHAR**) & semanticKeys, &num_semanticKeys);
+        if (rc != ESR_SUCCESS)
+        {
+          PLogError(ESR_rc2str(rc));
+          goto DONE;
+        }
+
+        for (iKey=0; iKey<num_semanticKeys; ++iKey)
+        {
+          len = SEMANTIC_VALUE_SIZE;
+          rc = semanticResult->getValue(semanticResult, semanticKeys[iKey], (LCHAR*) &semanticValue, &len);
+          if (rc != ESR_SUCCESS)
+          {
+            PLogError(ESR_rc2str(rc));
+            goto DONE;
+          }
+
+          rc = SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, semanticKeys[iKey], semanticValue);
+          if (rc != ESR_SUCCESS)
+          {
+            PLogError(ESR_rc2str(rc));
+            goto DONE;
+          }
+        }
+      }
+    }
+    rc = SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("ESR_SemanticResult[0]"));
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto DONE;
+    }
+  }
+}
+DONE:
+  return ESR_SUCCESS;
+CLEANUP:
+  impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+  return rc;
+}
+
+/**
+ * Indicates if it is possible to push data from SREC into the internal recognizer.
+ * If data can be pushed, ESR_CONTINUE_PROCESSING is returned.
+ *
+ * INPUT STATES: SR_RECOGNIZER_INTERNAL_BOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOS_DETECTION
+ * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOI
+ */
+PINLINE ESR_ReturnCode canPushAudioIntoRecognizer(SR_RecognizerImpl* impl)
+{
+  ESR_ReturnCode rc;
+
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_LOCK, impl->lockData);
+
+  /* do I have enough to make a frame ? */
+  if (CircularBufferGetSize(impl->buffer) < impl->FRAME_SIZE)
+  {
+    /* Not enough data */
+    if (!impl->gotLastFrame)
+    {
+      /* not last frame, so ask for more audio */
+      if (impl->lockFunction)
+        impl->lockFunction(ESR_UNLOCK, impl->lockData);
+      return ESR_SUCCESS;
+    }
+    else
+    {
+      /* last frame, make do with what you have */
+      if (impl->lockFunction)
+        impl->lockFunction(ESR_UNLOCK, impl->lockData);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+      PLogMessage("L: Voicing END (EOI) at %d frames (%d processed)", impl->frames, impl->processed);
+#endif
+      impl->isRecognizing = ESR_FALSE;
+      impl->recogLogTimings.EOSD = impl->frames;
+      impl->eos_reason = L("EOI");
+      impl->internalState = SR_RECOGNIZER_INTERNAL_EOI;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("canPushAudioIntoRecognizer() -> SR_RECOGNIZER_INTERNAL_EOI")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      return ESR_CONTINUE_PROCESSING;
+    }
+  }
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_UNLOCK, impl->lockData);
+  return ESR_CONTINUE_PROCESSING;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Pushes data from SREC into the internal recognizer.
+ *
+ * INPUT STATES: SR_RECOGNIZER_INTERNAL_BOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOS_DETECTION
+ * OUTPUT STATES: same
+ */
+PINLINE ESR_ReturnCode pushAudioIntoRecognizer(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
+    SR_RecognizerResultType* type,
+    SR_RecognizerResult* result)
+{
+  size_t count;
+  ESR_ReturnCode rc;
+
+  if (CA_GetUnprocessedFramesInUtterance(impl->utterance) > 0 && impl->frames >= impl->bgsniff)
+  {
+    /* Don't push frames unless they're needed */
+
+    /* Check for leaked state */
+    passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_INVALID);
+    return ESR_CONTINUE_PROCESSING;
+  }
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_LOCK, impl->lockData);
+  count = CircularBufferRead(impl->buffer, impl->audioBuffer, impl->FRAME_SIZE);
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_UNLOCK, impl->lockData);
+
+  WaveformBuffer_Write(impl->waveformBuffer, impl->audioBuffer, count);
+  if (impl->osi_log_level & OSI_LOG_LEVEL_AUDIO)
+  {
+    rc = SR_EventLogAudioWrite(impl->eventLog, impl->audioBuffer, count);
+    if (rc == ESR_BUFFER_OVERFLOW)
+      rc = ESR_INVALID_STATE;
+    if (rc != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      if (impl->lockFunction)
+        impl->lockFunction(ESR_UNLOCK, impl->lockData);
+      goto CLEANUP;
+    }
+  }
+  if (count < impl->FRAME_SIZE)
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(L("%s: error reading buffer data (count=%d, frameSize=%d)"), ESR_rc2str(rc), count, impl->FRAME_SIZE);
+    goto CLEANUP;
+  }
+  if (!CA_LoadSamples(impl->wavein, impl->audioBuffer, impl->sampleRate / FRAMERATE))
+  {
+    PLogError(L("ESR_INVALID_STATE"));
+    rc = ESR_INVALID_STATE;
+    goto CLEANUP;
+  }
+
+  CA_ConditionSamples(impl->wavein);
+  /* Check for leaked state */
+  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_INVALID);
+  return ESR_CONTINUE_PROCESSING;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * INPUT STATES: SR_RECOGNIZER_INTERNAL_BOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOS_DETECTION
+ * OUTPUT STATES: same
+ */
+PINLINE ESR_ReturnCode generateFrameFromAudio(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
+    SR_RecognizerResultType* type,
+    SR_RecognizerResult* result)
+{
+  if (CA_GetUnprocessedFramesInUtterance(impl->utterance) > 0 && impl->frames >= impl->bgsniff)
+  {
+    /* Don't create frames unless they're needed */
+
+    /* Check for leaked state */
+    passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_INVALID);
+    return ESR_CONTINUE_PROCESSING;
+  }
+
+  /* Try processing one frame */
+  if (!CA_MakeFrame(impl->frontend, impl->utterance, impl->wavein))
+  {
+    /*
+    * One of three cases occured:
+    *
+    * - We don't have enough samples to process one frame. This should be impossible because
+    * pushAudioIntoRecognizer() is always called before us and will not continue if we don't
+    * have enough samples.
+    *
+    * - The internal recognizer needs a minimum amount of audio before it'll begin generating
+    *   frames. This is normal and we return with a success value.
+    *
+    * - The recognizer skips every even frame number (for performance reasons). This is normal
+    *   and we return with a success value.
+    */
+    *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
+    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+    return ESR_SUCCESS;
+  }
+  ++impl->frames;
+  /* Check for leaked state */
+  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_INVALID);
+  return ESR_CONTINUE_PROCESSING;
+}
+
+/**
+ * INPUT STATES: SR_RECOGNIZER_INTERNAL_EOS_DETECTION
+ * OUTPUT STATES: same
+ */
+PINLINE ESR_ReturnCode generateFrameStats(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
+                           SR_RecognizerResultType* type,
+                           SR_RecognizerResult* result)
+{
+  if (impl->frames < impl->bgsniff)
+  {
+    /* Wait until we have enough frames to estimate background stats */
+    *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
+    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+    return ESR_SUCCESS;
+  }
+  else if (impl->frames == impl->bgsniff)
+    CA_CalculateUtteranceStatistics(impl->utterance, 0, impl->bgsniff);
+
+  /* Check for leaked state */
+  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_INVALID);
+  return ESR_CONTINUE_PROCESSING;
+}
+
+/**
+ * INPUT STATES: SR_RECOGNIZER_INTERNAL_EOS_DETECTION
+ * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOI, SR_RECOGNIZER_INTERNAL_EOS
+ */
+PINLINE ESR_ReturnCode generatePatternFromFrame(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
+    SR_RecognizerResultType* type,
+    SR_RecognizerResult* result)
+{
+  SR_AcousticModelsImpl* modelsImpl;
+  ESR_ReturnCode rc;
+
+  /* Run the search */
+  modelsImpl = (SR_AcousticModelsImpl*) impl->models;
+  if (!CA_MakePatternFrame(modelsImpl->pattern, impl->utterance))
+  {
+    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
+    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+    if (impl->eventLog != NULL)
+    {
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrame() -> SR_RECOGNIZER_INTERNAL_END")));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+    }
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  if (!CA_AdvanceUtteranceFrame(impl->utterance))
+  {
+    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
+    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+    if (impl->eventLog != NULL)
+    {
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("canPushAudioIntoRecognizer() -> SR_RECOGNIZER_INTERNAL_END")));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+    }
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  CA_AdvanceRecognitionByFrame(impl->recognizer, modelsImpl->pattern, impl->utterance);
+  ++impl->processed;
+
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_LOCK, impl->lockData);
+  if (impl->gotLastFrame && CircularBufferGetSize(impl->buffer) < impl->FRAME_SIZE)
+  {
+    /*
+     * SREC have run out of data but the underlying recognizer might have some frames
+     * queued for processing.
+     */
+    if (CA_GetUnprocessedFramesInUtterance(impl->utterance) > 0)
+    {
+      /* EOI means end of input */
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+      PLogMessage("L: Voicing END (EOI) at %d frames (%d processed)", impl->frames, impl->processed);
+#endif
+      impl->isRecognizing = ESR_FALSE;
+      impl->recogLogTimings.EOSD = impl->frames;
+      impl->eos_reason = L("EOI");
+      impl->internalState = SR_RECOGNIZER_INTERNAL_EOI;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrame() -> SR_RECOGNIZER_INTERNAL_EOI")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+    }
+    else
+    {
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+      PLogMessage("L: Voicing END (EOF) at %d frames (%d processed)", impl->frames, impl->processed);
+#endif
+
+      impl->isRecognizing = ESR_FALSE;
+      impl->recogLogTimings.EOSD = impl->frames;
+      impl->eos_reason = L("EOF");
+      impl->internalState = SR_RECOGNIZER_INTERNAL_EOS;
+      if (impl->eventLog != NULL)
+      {
+        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrame() -> SR_RECOGNIZER_INTERNAL_EOS")));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+      }
+      *status = SR_RECOGNIZER_EVENT_END_OF_VOICING;
+      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+      passert(impl->processed == impl->frames);
+      if (impl->lockFunction)
+        impl->lockFunction(ESR_UNLOCK, impl->lockData);
+      return ESR_SUCCESS;
+    }
+  }
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_UNLOCK, impl->lockData);
+
+  /* Check for leaked state */
+  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_INVALID);
+  return ESR_CONTINUE_PROCESSING;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Same as generatePatternFromFrame() only the buffer is known to be empty.
+ *
+ * INPUT STATES: SR_RECOGNIZER_INTERNAL_EOI
+ * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOS
+ */
+PINLINE ESR_ReturnCode generatePatternFromFrameEOI(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
+    SR_RecognizerResultType* type,
+    SR_RecognizerResult* result)
+{
+  SR_AcousticModelsImpl* modelsImpl;
+  ESR_ReturnCode rc;
+
+  /* Run the search */
+  modelsImpl = (SR_AcousticModelsImpl*) impl->models;
+
+  if (CA_GetUnprocessedFramesInUtterance(impl->utterance) <= 0)
+  {
+    passert(impl->processed == impl->frames);
+    *status = SR_RECOGNIZER_EVENT_END_OF_VOICING;
+    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_EOS;
+    return ESR_SUCCESS;
+  }
+
+  if (!CA_MakePatternFrame(modelsImpl->pattern, impl->utterance))
+  {
+    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
+    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+    if (impl->eventLog != NULL)
+    {
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrameEOI() -> SR_RECOGNIZER_INTERNAL_END")));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+    }
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  if (!CA_AdvanceUtteranceFrame(impl->utterance))
+  {
+    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
+    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+    if (impl->eventLog != NULL)
+    {
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrameEOI() -> SR_RECOGNIZER_INTERNAL_END")));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+    }
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+  CA_AdvanceRecognitionByFrame(impl->recognizer, modelsImpl->pattern, impl->utterance);
+  ++impl->processed;
+
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_LOCK, impl->lockData);
+
+  if (CA_GetUnprocessedFramesInUtterance(impl->utterance) <= 0)
+  {
+    passert(impl->processed == impl->frames);
+    *status = SR_RECOGNIZER_EVENT_END_OF_VOICING;
+    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_EOS;
+    if (impl->eventLog != NULL)
+    {
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrameEOI() -> SR_RECOGNIZER_INTERNAL_EOS")));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+    }
+    if (impl->lockFunction)
+      impl->lockFunction(ESR_UNLOCK, impl->lockData);
+    return ESR_SUCCESS;
+  }
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_UNLOCK, impl->lockData);
+
+  /* Check for leaked state */
+  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_INVALID);
+  return ESR_CONTINUE_PROCESSING;
+CLEANUP:
+  if (impl->lockFunction)
+    impl->lockFunction(ESR_UNLOCK, impl->lockData);
+  return rc;
+}
+
+
+/**
+ * INPUT STATES: SR_RECOGNIZER_INTERNAL_EOI, SR_RECOGNIZER_INTERNAL_EOS_DETECTION
+ * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOS
+ */
+ESR_ReturnCode detectEndOfSpeech(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
+                                 SR_RecognizerResultType* type,
+                                 SR_RecognizerResult* result)
+{
+  EOSrc eos; /* eos means end of speech */
+  int eos_by_level; /* eos means end of speech */
+  PTimeStamp timestamp;
+  ESR_ReturnCode rc;
+  ESR_BOOL enableGetWaveform = ESR_FALSE;
+
+  eos_by_level = CA_UtteranceHasEnded(impl->utterance);
+  if (eos_by_level)
+  {
+    eos = SPEECH_ENDED_BY_LEVEL_TIMEOUT;
+  }
+  else
+  {
+    eos = CA_IsEndOfUtteranceByResults(impl->recognizer);
+  }
+
+  impl->parameters->getBool(impl->parameters, L("enableGetWaveform"), &enableGetWaveform);
+
+  if (eos == VALID_SPEECH_CONTINUING && enableGetWaveform && impl->waveformBuffer->overflow_count > 0)
+  {
+    size_t bufferSize;
+    CHKLOG(rc, WaveformBuffer_GetSize(impl->waveformBuffer, &bufferSize));
+    PLogMessage("Forcing EOS due to wfbuf overflow (fr=%d,sz=%d,of=%d)", impl->frames, bufferSize, impl->waveformBuffer->overflow_count);
+    eos = SPEECH_TOO_LONG;
+  }
+
+  if (eos != VALID_SPEECH_CONTINUING)
+  {
+    switch (eos)
+    {
+      case SPEECH_ENDED:
+        /* normal */
+        impl->eos_reason = L("itimeout");
+        break;
+
+      case SPEECH_ENDED_WITH_ERROR:
+        /* error */
+        impl->eos_reason = L("err");
+        break;
+
+      case SPEECH_TOO_LONG:
+        /* timeout*/
+        impl->eos_reason = L("ctimeout");
+        break;
+
+      case SPEECH_MAYBE_ENDED:
+        /* normal */
+        impl->eos_reason = L("itimeout");
+        break;
+      case SPEECH_ENDED_BY_LEVEL_TIMEOUT:
+        /* normal */
+        impl->eos_reason = L("levelTimeout");
+        break;
+
+      default:
+        /* error */
+        impl->eos_reason = L("err");
+    }
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+    PLogMessage("L: Voicing END (EOS) at %d frames, %d processed (reason: %s)\n", impl->frames, impl->processed, impl->eos_reason);
+#endif
+
+    impl->recogLogTimings.EOSD = impl->frames; /* how many frames have been sent prior to detect EOS */
+    PTimeStampSet(&timestamp); /* time it took to detect EOS (in millisec) */
+    impl->recogLogTimings.EOST = PTimeStampDiff(&timestamp, &impl->timestamp);
+
+    *status = SR_RECOGNIZER_EVENT_END_OF_VOICING;
+    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+    impl->internalState = SR_RECOGNIZER_INTERNAL_EOS;
+    if (impl->eventLog != NULL)
+    {
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("detectEndOfSpeech() -> SR_RECOGNIZER_INTERNAL_EOS")));
+      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("reason"), impl->eos_reason));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
+      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
+      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
+    }
+    impl->isRecognizing = ESR_FALSE;
+    return ESR_SUCCESS;
+  }
+
+  /* Check for leaked state */
+  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_INVALID);
+  return ESR_CONTINUE_PROCESSING;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * INPUT STATES: SR_RECOGNIZER_INTERNAL_BOS_DETECTION
+ * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOI
+ */
+ESR_ReturnCode detectBeginningOfSpeech(SR_RecognizerImpl* impl,
+                                       SR_RecognizerStatus* status,
+                                       SR_RecognizerResultType* type,
+                                       SR_RecognizerResult* result)
+{
+  ESR_ReturnCode rc;
+  ESR_BOOL gatedMode;
+  size_t num_windback_bytes, num_windback_frames;
+  waveform_buffering_state_t buffering_state;
+
+  CHKLOG(rc, ESR_SessionGetBool(L("cmdline.gatedmode"), &gatedMode));
+
+  if (gatedMode || (!gatedMode && impl->frames < impl->bgsniff))
+  {
+    ESR_BOOL pushable = ESR_FALSE;
+
+    rc = canPushAudioIntoRecognizer(impl);
+    if (rc == ESR_SUCCESS)
+    {
+      /* Not enough samples to process one frame */
+      if (CA_GetUnprocessedFramesInUtterance(impl->utterance) <= 0)
+      {
+        *status = SR_RECOGNIZER_EVENT_NEED_MORE_AUDIO;
+        *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+        return ESR_SUCCESS;
+      }
+    }
+    else if (rc != ESR_CONTINUE_PROCESSING)
+      return rc;
+    else if (impl->internalState == SR_RECOGNIZER_INTERNAL_EOI)
+    {
+      /* Got end of input before beginning of speech */
+      *status = SR_RECOGNIZER_EVENT_NO_MATCH;
+      *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+      impl->internalState = SR_RECOGNIZER_INTERNAL_BOS_NO_MATCH;
+      CHKLOG(rc, impl->Interface.stop(&impl->Interface));
+      return ESR_SUCCESS;
+    }
+    else
+      pushable = ESR_TRUE;
+    if (pushable)
+    {
+      rc = pushAudioIntoRecognizer(impl, status, type, result);
+      /* OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOI */
+      if (rc != ESR_CONTINUE_PROCESSING)
+      {
+        /* Not enough samples to process one frame */
+        return rc;
+      }
+      rc = generateFrameFromAudio(impl, status, type, result);
+      /* OUTPUT STATES: same */
+      if (rc != ESR_CONTINUE_PROCESSING)
+      {
+        /*
+         * The internal recognizer needs a minimum amount of audio before
+         * it begins generating frames.
+         */
+        return rc;
+      }
+    }
+    if (!CA_AdvanceUtteranceFrame(impl->utterance))
+    {
+      PLogError(L("ESR_INVALID_STATE: Failed Advancing Utt Frame %d"), impl->frames);
+      return ESR_INVALID_STATE;
+    }
+    if (CA_UtteranceHasVoicing(impl->utterance))
+    {
+      /* Utterance stats for Lombard if enough frames */
+      if (impl->frames > impl->bgsniff)
+      {
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+        PLogMessage("L:  Voicing START at %d frames", impl->frames);
+#endif
+        /* OSI log the endpointed data */
+
+        CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BTIM"), impl->frames * MSEC_PER_FRAME));
+        CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BRGN"), 0)); /* Barge-in not supported */
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIendp")));
+
+        CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BOSD"), impl->frames));
+        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("ESRbosd")));
+
+        if (gatedMode)
+          CA_CalculateUtteranceStatistics(impl->utterance, (int)(impl->frames * -1), 0);
+        else
+          CA_CalculateUtteranceStatistics(impl->utterance, 0, impl->frames);
+      }
+
+      /* OK, we've got voicing or the end of input has occured
+      ** (or both, I suppose).  If we had voicing then progress
+      ** the recognizer, otherwise skip to the end.
+      ** Of course, we could be running outside 'Gated Mode'
+      ** so we won't have any frames processed at all yet -
+      ** in this case start the recognizer anyway.
+      */
+
+      /*************************************
+       ** Run recognition until endOfInput **
+       *************************************/
+
+      /*
+       * Initialize both recognizers first
+       * and disable reporting of results
+       */
+      if (gatedMode)
+      {
+        /*
+         * We're in Gated Mode -
+         * Because we'll have had voicing we wind-back
+         * until the start of voicing (unsure region)
+         */
+        num_windback_frames = CA_SeekStartOfUtterance(impl->utterance);
+        impl->beginningOfSpeechOffset = impl->frames - num_windback_frames;
+        num_windback_bytes = num_windback_frames * impl->FRAME_SIZE * 2 /* due to skip even frames */;
+
+        /* pfprintf(PSTDOUT,L("audio buffer windback %d frames == %d bytes\n"), num_windback_frames, num_windback_bytes); */
+        CHKLOG(rc, WaveformBuffer_GetBufferingState(impl->waveformBuffer, &buffering_state));
+        if (buffering_state != WAVEFORM_BUFFERING_OFF)
+          CHKLOG(rc, WaveformBuffer_WindBack(impl->waveformBuffer, num_windback_bytes));
+
+        /*
+         * Only transition to linear if it was previously circular (in other words if
+         * buffering was active in the first place)
+         */
+        if (buffering_state == WAVEFORM_BUFFERING_ON_CIRCULAR)
+          CHKLOG(rc, WaveformBuffer_SetBufferingState(impl->waveformBuffer, WAVEFORM_BUFFERING_ON_LINEAR));
+        impl->frames = CA_GetUnprocessedFramesInUtterance(impl->utterance);
+      }
+      else
+        impl->frames = 0;
+      /* reset the frames */
+      impl->processed = 0;
+      CHKLOG(rc, beginRecognizing(impl));
+      impl->internalState = SR_RECOGNIZER_INTERNAL_EOS_DETECTION;
+      *status = SR_RECOGNIZER_EVENT_START_OF_VOICING;
+      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+      return ESR_SUCCESS;
+    }
+    else
+    {
+      if (impl->frames > impl->utterance_timeout)
+      {
+        /* beginning of speech timeout */
+        impl->internalState = SR_RECOGNIZER_INTERNAL_BOS_TIMEOUT;
+        *status = SR_RECOGNIZER_EVENT_START_OF_UTTERANCE_TIMEOUT;
+        *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+        CHKLOG(rc, impl->Interface.stop(&impl->Interface));
+        return ESR_SUCCESS;
+      }
+    }
+  }
+  else if (!gatedMode && impl->frames >= impl->bgsniff)
+  {
+    /*
+    * If not gated mode and I have processed enough frames, then start the recognizer
+    * right away.
+    */
+    impl->internalState = SR_RECOGNIZER_INTERNAL_EOS_DETECTION;
+    *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
+    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+
+    /* reset the frames */
+    impl->frames = impl->processed = 0;
+    CHKLOG(rc, beginRecognizing(impl));
+    return ESR_SUCCESS;
+  }
+  *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
+  *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+  return ESR_SUCCESS;
+
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerAdvanceImpl(SR_Recognizer* self, SR_RecognizerStatus* status,
+                                        SR_RecognizerResultType* type,
+                                        SR_RecognizerResult** result)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_BOOL pushable;
+  ESR_ReturnCode rc;
+
+  if (status == NULL || type == NULL || result == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  /* create the result holder and save the pointer */
+  /* creation only happens once (due to the if condition) */
+  if (impl->result == NULL)
+    CHKLOG(rc, SR_RecognizerResult_Create(&impl->result, impl));
+  *result = impl->result;
+
+  /*
+   * The following two lines are used to detect bugs whereby we forget to set
+   * status or type before returning
+   */
+  *status = SR_RECOGNIZER_EVENT_INVALID;
+  *type = SR_RECOGNIZER_INVALID;
+
+MOVE_TO_NEXT_STATE:
+  switch (impl->internalState)
+  {
+    case SR_RECOGNIZER_INTERNAL_BEGIN:
+      impl->internalState = SR_RECOGNIZER_INTERNAL_BOS_DETECTION;
+      *status = SR_RECOGNIZER_EVENT_STARTED;
+      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+      return ESR_SUCCESS;
+
+    case SR_RECOGNIZER_INTERNAL_BOS_DETECTION:
+      rc = detectBeginningOfSpeech(impl, status, type, impl->result);
+      if (rc != ESR_CONTINUE_PROCESSING)
+      {
+        /*
+         * SR_RECOGNIZER_INTERNAL_BOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOS_DETECTION, or
+         * SR_RECOGNIZER_INTERNAL_EOI
+         */
+        return rc;
+      }
+      /* Leaked state */
+      passert(0);
+      break;
+
+    case SR_RECOGNIZER_INTERNAL_EOS_DETECTION:
+      pushable = ESR_FALSE;
+      rc = canPushAudioIntoRecognizer(impl);
+      if (rc == ESR_SUCCESS)
+      {
+        /* Not enough samples to process one frame */
+        if (CA_GetUnprocessedFramesInUtterance(impl->utterance) <= 0)
+        {
+          *status = SR_RECOGNIZER_EVENT_NEED_MORE_AUDIO;
+          *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+          return ESR_SUCCESS;
+        }
+      }
+      else if (rc != ESR_CONTINUE_PROCESSING)
+        return rc;
+      else if (impl->internalState == SR_RECOGNIZER_INTERNAL_EOI)
+        goto MOVE_TO_NEXT_STATE;
+      else
+        pushable = ESR_TRUE;
+      if (pushable)
+      {
+        rc = pushAudioIntoRecognizer(impl, status, type, impl->result);
+        if (rc != ESR_CONTINUE_PROCESSING)
+        {
+          /* Not enough samples to process one frame */
+          return rc;
+        }
+        if (impl->internalState == SR_RECOGNIZER_INTERNAL_EOI)
+          goto MOVE_TO_NEXT_STATE;
+        rc = generateFrameFromAudio(impl, status, type, impl->result);
+        if (rc != ESR_CONTINUE_PROCESSING)
+        {
+          /*
+           * The internal recognizer needs a minimum amount of audio before
+           * it begins generating frames.
+           */
+          return rc;
+        }
+      }
+      rc = generateFrameStats(impl, status, type, impl->result);
+      if (rc != ESR_CONTINUE_PROCESSING)
+      {
+        /* Not enough frames to calculate stats */
+        return rc;
+      }
+      rc = generatePatternFromFrame(impl, status, type, impl->result);
+      if (rc != ESR_CONTINUE_PROCESSING)
+      {
+        /* End of speech detected */
+        return rc;
+      }
+      if (impl->internalState == SR_RECOGNIZER_INTERNAL_END)
+        goto MOVE_TO_NEXT_STATE;
+      rc = detectEndOfSpeech(impl, status, type, impl->result);
+      if (rc != ESR_CONTINUE_PROCESSING)
+      {
+#ifdef SREC_MEASURE_LATENCY
+        gettimeofday ( &latency_start, NULL );
+        printf ( "Start Time :  %ld Seconds  %ld Microseconds\n", latency_start.tv_sec, latency_start.tv_usec );
+#endif
+
+        /* End of speech detected */
+        return rc;
+      }
+      *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
+      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+      return ESR_SUCCESS;
+
+    case SR_RECOGNIZER_INTERNAL_EOI:
+      /*
+       * On EOI (end of input), we need to process the remaining frames that had not
+       * been processed when PutAudio set the gotLastFrame flag
+       */
+      rc = generatePatternFromFrameEOI(impl, status, type, impl->result);
+      if (rc != ESR_CONTINUE_PROCESSING)
+      {
+        /* End of speech detected */
+        return rc;
+      }
+      rc = detectEndOfSpeech(impl, status, type, impl->result);
+      if (rc != ESR_CONTINUE_PROCESSING)
+      {
+#ifdef SREC_MEASURE_LATENCY
+        gettimeofday ( &latency_start, NULL );
+        printf ( "Start Time :  %ld Seconds  %ld Microseconds\n", latency_start.tv_sec, latency_start.tv_usec );
+#endif
+        /* End of speech detected */
+        return rc;
+      }
+      *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
+      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
+      return ESR_SUCCESS;
+
+    case SR_RECOGNIZER_INTERNAL_EOS:
+      /* On EOS (end of speech detected - not due to end of input), create the result */
+      if (impl->lockFunction)
+        impl->lockFunction(ESR_LOCK, impl->lockData);
+      CircularBufferReset(impl->buffer);
+      if (impl->lockFunction)
+        impl->lockFunction(ESR_UNLOCK, impl->lockData);
+      CHKLOG(rc, SR_RecognizerCreateResultImpl((SR_Recognizer*) impl, status, type));
+      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
+      return ESR_SUCCESS;
+
+    case SR_RECOGNIZER_INTERNAL_END:
+      return ESR_SUCCESS;
+    default:
+      PLogError(L("ESR_INVALID_STATE"));
+      return ESR_INVALID_STATE;
+  }
+CLEANUP:
+  return rc;
+}
+
+
+
+ESR_ReturnCode SR_RecognizerLoadUtteranceImpl(SR_Recognizer* self, const LCHAR* filename)
+{
+  /* TODO: complete */
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_RecognizerLoadWaveFileImpl(SR_Recognizer* self, const LCHAR* filename)
+{
+  /* TODO: complete */
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_RecognizerLogEventImpl(SR_Recognizer* self, const LCHAR* event)
+{
+  ESR_ReturnCode rc;
+  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, event));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerLogTokenImpl(SR_Recognizer* self, const LCHAR* token, const LCHAR* value)
+{
+  ESR_ReturnCode rc;
+  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, token, value));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerLogTokenIntImpl(SR_Recognizer* self, const LCHAR* token, int value)
+{
+  ESR_ReturnCode rc;
+  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
+  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, token, value));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerLogSessionStartImpl(SR_Recognizer* self, const LCHAR* sessionName)
+{
+  ESR_ReturnCode rc;
+  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
+  /**
+  * OSI Platform logging.
+  * In OSR, these events are logged by the platform. We have no platform in ESR, so we
+   * log them here.
+  */
+
+  /* call (session) start, tokens optional */
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIclst")));
+
+  /* service start, in this case SRecTest service */
+  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("SVNM"), sessionName));
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIsvst")));
+  if (impl->osi_log_level & OSI_LOG_LEVEL_BASIC)
+    CHKLOG(rc, SR_EventLogEventSession(impl->eventLog));
+
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerLogSessionEndImpl(SR_Recognizer* self)
+{
+  ESR_ReturnCode rc;
+  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
+
+  /* OSI log end of call (session) */
+  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIclnd")));
+  if (impl->osi_log_level & OSI_LOG_LEVEL_BASIC)
+    CHKLOG(rc, SR_EventLogEventSession(impl->eventLog));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+
+ESR_ReturnCode SR_RecognizerLogWaveformDataImpl(SR_Recognizer* self, const LCHAR* waveformFilename,
+    const LCHAR* transcription, const double bos,
+    const double eos, ESR_BOOL isInvocab)
+{
+  ESR_ReturnCode rc;
+  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
+  LCHAR num[P_PATH_MAX];
+  int frame;
+
+  CHKLOG(rc, SR_EventLogToken_AUDIO(impl->eventLog, impl->osi_log_level, L("FILE"), waveformFilename));
+  CHKLOG(rc, SR_EventLogToken_AUDIO(impl->eventLog, impl->osi_log_level, L("TRANS"), transcription));
+  sprintf(num, L("%.2f"), bos);
+  CHKLOG(rc, SR_EventLogToken_AUDIO(impl->eventLog, impl->osi_log_level, L("BOS_SEC"), num));
+  sprintf(num, L("%.2f"), eos);
+  CHKLOG(rc, SR_EventLogToken_AUDIO(impl->eventLog, impl->osi_log_level, L("EOS_SEC"), num));
+  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("FRAMESIZE"), impl->FRAME_SIZE));
+  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("SAMPLERATE"), impl->sampleRate));
+  frame = (int)(bos * impl->sampleRate * 2 /* 2 bytes per sample */) / impl->FRAME_SIZE;
+  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("BOS_FR"), frame));
+  frame = (int)(eos * impl->sampleRate * 2 /* 2 bytes per sample */) / impl->FRAME_SIZE;
+  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("EOS_FR"), frame));
+  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("INVOCAB"), isInvocab));
+  CHKLOG(rc, SR_EventLogEvent_AUDIO(impl->eventLog, impl->osi_log_level, L("ESRwfrd")));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerSetLockFunctionImpl(SR_Recognizer* self, SR_RecognizerLockFunction function, void* data)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+
+  impl->lockFunction = function;
+  impl->lockData = data;
+  return ESR_SUCCESS;
+}
+
+static ESR_ReturnCode doSignalQualityInit(SR_RecognizerImpl* impl)
+{
+  CA_DoSignalCheck(impl->wavein, &impl->isSignalClipping, &impl->isSignalDCOffset,
+                   &impl->isSignalNoisy, &impl->isSignalTooQuiet, &impl->isSignalTooFewSamples,
+                   &impl->isSignalTooManySamples);
+  impl->isSignalQualityInitialized = ESR_TRUE;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalClippingImpl(SR_Recognizer* self, ESR_BOOL* isClipping)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  if (isClipping == NULL)
+  {
+    PLogError("SR_RecognizerIsSignalClippingImpl", ESR_INVALID_ARGUMENT);
+    return ESR_INVALID_ARGUMENT;
+  }
+  if (!impl->isSignalQualityInitialized)
+    CHKLOG(rc, doSignalQualityInit(impl));
+  *isClipping = impl->isSignalClipping;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalDCOffsetImpl(SR_Recognizer* self, ESR_BOOL* isDCOffset)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  if (isDCOffset == NULL)
+  {
+    PLogError("SR_RecognizerIsSignalDCOffsetImpl", ESR_INVALID_ARGUMENT);
+    return ESR_INVALID_ARGUMENT;
+  }
+  if (!impl->isSignalQualityInitialized)
+    CHKLOG(rc, doSignalQualityInit(impl));
+  *isDCOffset = impl->isSignalDCOffset;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalNoisyImpl(SR_Recognizer* self, ESR_BOOL* isNoisy)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  if (isNoisy == NULL)
+  {
+    PLogError("SR_RecognizerIsSignalNoisyImpl", ESR_INVALID_ARGUMENT);
+    return ESR_INVALID_ARGUMENT;
+  }
+  if (!impl->isSignalQualityInitialized)
+    CHKLOG(rc, doSignalQualityInit(impl));
+  *isNoisy = impl->isSignalNoisy;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalTooQuietImpl(SR_Recognizer* self, ESR_BOOL* isTooQuiet)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  if (isTooQuiet == NULL)
+  {
+    PLogError("SR_RecognizerIsSignalTooQuietImpl", ESR_INVALID_ARGUMENT);
+    return ESR_INVALID_ARGUMENT;
+  }
+  if (!impl->isSignalQualityInitialized)
+    CHKLOG(rc, doSignalQualityInit(impl));
+  *isTooQuiet = impl->isSignalTooQuiet;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalTooFewSamplesImpl(SR_Recognizer* self, ESR_BOOL* isTooFewSamples)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  if (isTooFewSamples == NULL)
+  {
+    PLogError("SR_RecognizerIsSignalTooFewSamplesImpl", ESR_INVALID_ARGUMENT);
+    return ESR_INVALID_ARGUMENT;
+  }
+  if (!impl->isSignalQualityInitialized)
+    CHKLOG(rc, doSignalQualityInit(impl));
+  *isTooFewSamples = impl->isSignalTooFewSamples;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerIsSignalTooManySamplesImpl(SR_Recognizer* self, ESR_BOOL* isTooManySamples)
+{
+  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
+  ESR_ReturnCode rc;
+
+  if (isTooManySamples == NULL)
+  {
+    PLogError("SR_RecognizerIsSignalTooManySamplesImpl", ESR_INVALID_ARGUMENT);
+    return ESR_INVALID_ARGUMENT;
+  }
+  if (!impl->isSignalQualityInitialized)
+    CHKLOG(rc, doSignalQualityInit(impl));
+  *isTooManySamples = impl->isSignalTooManySamples;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+
+
+/**************************************/
+/* Waveform Buffer stuff              */
+/**************************************/
+ESR_ReturnCode WaveformBuffer_Create(WaveformBuffer** waveformBuffer, size_t frame_size)
+{
+  ESR_ReturnCode rc;
+  WaveformBuffer *buf;
+  size_t val_size_t;
+  int    val_int;
+  ESR_BOOL   exists;
+
+  buf = NEW(WaveformBuffer, L("SR_RecognizerImpl.wvfmbuf"));
+  if (buf == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(L("%s: could not create WaveformBuffer"), ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  ESR_SessionContains(L("SREC.voice_enroll.bufsz_kB"), &exists);
+  if (exists)
+    ESR_SessionGetSize_t(L("SREC.voice_enroll.bufsz_kB"), &val_size_t);
+  else
+    val_size_t = DEFAULT_WAVEFORM_BUFFER_MAX_SIZE;
+  val_size_t *= 1024; /* convert to kB*/
+  CHKLOG(rc, CircularBufferCreate(val_size_t, L("SR_RecognizerImpl.wvfmbuf.cbuffer"), &buf->cbuffer));
+
+  ESR_SessionContains(L("CREC.Frontend.start_windback"), &exists);
+  if (exists)
+    ESR_SessionGetInt(L("CREC.Frontend.start_windback"), &val_int);
+  else
+    val_int = DEFAULT_WAVEFORM_WINDBACK_FRAMES;
+  val_int *= frame_size; /* convert frames to bytes */
+  buf->windback_buffer_sz = (size_t) val_int;
+  buf->windback_buffer = MALLOC(buf->windback_buffer_sz, L("SR_RecognizerImpl.wvfmbuf.windback"));
+  if (buf->windback_buffer == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(L("%s: could not create Waveform windback buffer"), ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+
+  ESR_SessionContains(L("SREC.voice_enroll.eos_comfort_frames"), &exists);
+  if (exists)
+    ESR_SessionGetSize_t(L("SREC.voice_enroll.eos_comfort_frames"), &val_size_t);
+  else
+    val_size_t = DEFAULT_EOS_COMFORT_FRAMES;
+  buf->eos_comfort_frames = val_size_t;
+
+  ESR_SessionContains(L("SREC.voice_enroll.bos_comfort_frames"), &exists);
+  if (exists)
+    ESR_SessionGetSize_t(L("SREC.voice_enroll.bos_comfort_frames"), &val_size_t);
+  else
+    val_size_t = DEFAULT_BOS_COMFORT_FRAMES;
+  buf->bos_comfort_frames = val_size_t;
+
+  /* initially off */
+  buf->state = WAVEFORM_BUFFERING_OFF;
+
+  *waveformBuffer = buf;
+  return ESR_SUCCESS;
+CLEANUP:
+  WaveformBuffer_Destroy(buf);
+  return rc;
+}
+
+ESR_ReturnCode WaveformBuffer_Write(WaveformBuffer* waveformBuffer, void *data, size_t num_bytes)
+{
+  size_t available_bytes;
+  size_t done_bytes;
+
+  /* do nothing if not active */
+  switch (waveformBuffer->state)
+  {
+    case WAVEFORM_BUFFERING_OFF:
+      return ESR_SUCCESS;
+
+    case WAVEFORM_BUFFERING_ON_CIRCULAR:
+      available_bytes = CircularBufferGetAvailable(waveformBuffer->cbuffer);
+      if (available_bytes < num_bytes)
+      {
+        done_bytes = CircularBufferSkip(waveformBuffer->cbuffer, num_bytes - available_bytes);
+        if (done_bytes != num_bytes - available_bytes)
+        {
+          PLogError("WaveformBuffer_Write: error when skipping bytes");
+          return ESR_INVALID_STATE;
+        }
+      }
+      done_bytes = CircularBufferWrite(waveformBuffer->cbuffer, data, num_bytes);
+      if (done_bytes != num_bytes)
+      {
+        PLogError("WaveformBuffer_Write: error when writing bytes");
+        return ESR_INVALID_STATE;
+      }
+      return ESR_SUCCESS;
+
+    case WAVEFORM_BUFFERING_ON_LINEAR:
+      available_bytes = CircularBufferGetAvailable(waveformBuffer->cbuffer);
+      if (available_bytes < num_bytes)
+      {
+        waveformBuffer->overflow_count += num_bytes;
+        return ESR_BUFFER_OVERFLOW;
+      }
+      done_bytes = CircularBufferWrite(waveformBuffer->cbuffer, data, num_bytes);
+      if (done_bytes != num_bytes)
+      {
+        PLogError("WaveformBuffer_Write: error when writing bytes");
+        return ESR_INVALID_STATE;
+      }
+      return ESR_SUCCESS;
+
+    default:
+      PLogError("WaveformBuffer_Write: bad control path");
+      return ESR_INVALID_STATE;
+  }
+}
+
+ESR_ReturnCode WaveformBuffer_Read(WaveformBuffer* waveformBuffer, void *data, size_t* num_bytes)
+{
+  size_t bytes_to_read;
+  ESR_ReturnCode rc;
+
+  if (num_bytes == NULL)
+  {
+    rc = ESR_INVALID_ARGUMENT;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  if (waveformBuffer->overflow_count > 0)
+  {
+    memset(data, 0, *num_bytes);
+    *num_bytes = 0;
+    PLogError(L("WaveformBuffer_Read: previous overflow causes read to return NULL"));
+    return ESR_SUCCESS;
+  }
+
+  if (waveformBuffer->read_size != 0 && *num_bytes > waveformBuffer->read_size)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY: waveform buffer too small for read, increase from %d to %d"), *num_bytes, waveformBuffer->read_size);
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  if (waveformBuffer->read_size == 0)
+    bytes_to_read = *num_bytes;
+  else
+    bytes_to_read = MIN(waveformBuffer->read_size, *num_bytes);
+  waveformBuffer->read_size -= bytes_to_read;
+  *num_bytes = CircularBufferRead(waveformBuffer->cbuffer, data, bytes_to_read);
+  if (*num_bytes != bytes_to_read)
+  {
+    PLogError("WaveformBuffer_Read: error reading buffer");
+    return ESR_INVALID_STATE;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/* WindBack will save the last num_bytes recorded, reset the buffer, and then load the
+   saved bytes at the beginning of the buffer */
+ESR_ReturnCode WaveformBuffer_WindBack(WaveformBuffer* waveformBuffer, const size_t num_bytes)
+{
+  ESR_ReturnCode rc;
+  size_t bufferSize;
+
+  if (num_bytes <= 0)
+  {
+    CHKLOG(rc, WaveformBuffer_Reset(waveformBuffer));
+    return ESR_SUCCESS;
+  }
+
+  /* make sure windback buffer is big enough */
+  if (num_bytes > waveformBuffer->windback_buffer_sz)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(L("%s: windback buffer is too small (needed=%d, had=%d)"), ESR_rc2str(rc), num_bytes, waveformBuffer->windback_buffer_sz);
+    goto CLEANUP;
+  }
+
+  CHKLOG(rc, WaveformBuffer_GetSize(waveformBuffer, &bufferSize));
+  /* skip the first few bytes written */
+  if (bufferSize < num_bytes)
+  {
+    PLogError("bufferSize %d num_bytes %d (ESR_INVALID_STATE)\n", bufferSize, num_bytes);
+    bufferSize = 0;
+  }
+  else
+  {
+    bufferSize -= num_bytes;
+  }
+  CHKLOG(rc, WaveformBuffer_Skip(waveformBuffer, bufferSize));
+  /* read the last few bytes written */
+  bufferSize = num_bytes;
+  CHKLOG(rc, WaveformBuffer_Read(waveformBuffer, waveformBuffer->windback_buffer, &bufferSize));
+
+  /* reset buffer */
+  CHKLOG(rc, WaveformBuffer_Reset(waveformBuffer));
+
+  /* rewrite the saved bytes at the beginning */
+  CHKLOG(rc, WaveformBuffer_Write(waveformBuffer, waveformBuffer->windback_buffer, bufferSize));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode WaveformBuffer_Destroy(WaveformBuffer* waveformBuffer)
+{
+  if (waveformBuffer->cbuffer)
+    FREE(waveformBuffer->cbuffer);
+  if (waveformBuffer->windback_buffer)
+    FREE(waveformBuffer->windback_buffer);
+  if (waveformBuffer)
+    FREE(waveformBuffer);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode WaveformBuffer_SetBufferingState(WaveformBuffer* waveformBuffer, waveform_buffering_state_t state)
+{
+  waveformBuffer->state = state;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode WaveformBuffer_GetBufferingState(WaveformBuffer* waveformBuffer, waveform_buffering_state_t* state)
+{
+  *state = waveformBuffer->state;
+  return ESR_SUCCESS;
+}
+
+/**
+ * @return ESR_BUFFER_OVERFLOW if nametag EOS occured beyond end of buffer
+ */
+ESR_ReturnCode WaveformBuffer_ParseEndPointedResultAndTrim(WaveformBuffer* waveformBuffer, const LCHAR* end_pointed_result, const size_t bytes_per_frame)
+{
+  const LCHAR *p;
+  size_t bos_frame, eos_frame, bufferSize, read_start_offset;
+  ESR_ReturnCode rc;
+
+  /* potential end pointed results
+
+     -pau-@19 tape@36 scan@64 down@88 -pau2-@104
+     -pau-@19 tape@34 off@55 -pau2-@78
+     -pau-@19 tape@47 help@66 -pau2-@80
+     -pau-@16 tape@36 reverse@71 -pau2-@91
+     -pau-@21 tape@42 scan@59 down@80 -pau2-@91
+
+     what I need to extract is the integer between "-pau-@" and ' '
+     and the integer between '@' and " -pau2-"
+  */
+  
+
+  p = LSTRSTR( end_pointed_result, PREFIX_WORD);
+  if(p) p+=PREFIX_WORD_LEN; while(p && *p == '@') p++;
+  rc = p ? lstrtoui(p, &bos_frame, 10) : ESR_INVALID_ARGUMENT;
+  if (rc == ESR_INVALID_ARGUMENT)
+  {
+    PLogError(L("%s: extracting bos from text=%s"), ESR_rc2str(rc), end_pointed_result);
+    goto CLEANUP;
+  }
+  else if (rc != ESR_SUCCESS)
+    goto CLEANUP;
+
+  p = LSTRSTR( end_pointed_result, SUFFIX_WORD);
+  while(p && p>end_pointed_result && p[-1]!='@') --p;
+  rc = p ? lstrtoui(p, &eos_frame, 10) : ESR_INVALID_ARGUMENT;
+  if (rc == ESR_INVALID_ARGUMENT)
+  {
+    PLogError(L("%s: extracting eos from text=%s"), ESR_rc2str(rc), end_pointed_result);
+    goto CLEANUP;
+  }
+  else if (rc != ESR_SUCCESS)
+    goto CLEANUP;
+
+  bos_frame -= (bos_frame > waveformBuffer->bos_comfort_frames ? waveformBuffer->bos_comfort_frames : 0);
+  eos_frame += waveformBuffer->eos_comfort_frames;
+
+  /*
+   * I know where speech started, so I want to skip frames 0 to bos_frame.
+   * I also know where speech ended so I want to set the amount of frames(bytes) to read for
+   * the nametag audio buffer (i.e. the read_size)
+   */
+
+  read_start_offset = bos_frame * bytes_per_frame * 2 /* times 2 because of skip even frames */;
+  waveformBuffer->read_size = (eos_frame - bos_frame) * bytes_per_frame * 2 /* times 2 because of skip even frames */;
+
+  CHKLOG(rc, WaveformBuffer_GetSize(waveformBuffer, &bufferSize));
+  if (read_start_offset + waveformBuffer->read_size > bufferSize)
+  {
+    waveformBuffer->overflow_count += read_start_offset + waveformBuffer->read_size - bufferSize;
+    passert(waveformBuffer->overflow_count > 0);
+    PLogMessage(L("Warning: Voice Enrollment audio buffer overflow (spoke too much, over by %d bytes)"),
+                waveformBuffer->overflow_count);
+    return ESR_BUFFER_OVERFLOW;
+  }
+  CHKLOG(rc, WaveformBuffer_Skip(waveformBuffer, read_start_offset));
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage(L("Voice Enrollment: bos@%d, eos@%d, therefore sizeof(waveform) should be %d"), bos_frame, eos_frame, waveformBuffer->read_size);
+#endif
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+
+ESR_ReturnCode WaveformBuffer_Reset(WaveformBuffer* waveformBuffer)
+{
+  CircularBufferReset(waveformBuffer->cbuffer);
+  waveformBuffer->overflow_count = 0;
+  waveformBuffer->read_size = 0;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode WaveformBuffer_GetSize(WaveformBuffer* waveformBuffer, size_t* size)
+{
+  *size = CircularBufferGetSize(waveformBuffer->cbuffer);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode WaveformBuffer_Skip(WaveformBuffer* waveformBuffer, const size_t bytes)
+{
+  if (CircularBufferSkip(waveformBuffer->cbuffer, bytes) != (int) bytes)
+    return ESR_INVALID_STATE;
+  return ESR_SUCCESS;
+}
+
+
+
+static ESR_ReturnCode SR_Recognizer_Reset_Buffers ( SR_RecognizerImpl *impl )
+    {
+    ESR_ReturnCode  reset_status;
+
+    FREE ( impl->audioBuffer );
+    impl->audioBuffer = NULL;
+    impl->audioBuffer = MALLOC ( impl->FRAME_SIZE, MTAG );
+
+    if ( impl->audioBuffer != NULL )
+        {
+        WaveformBuffer_Destroy ( impl->waveformBuffer );
+        impl->waveformBuffer = NULL;
+        reset_status = WaveformBuffer_Create ( &impl->waveformBuffer, impl->FRAME_SIZE );
+        }
+    else
+        {
+        reset_status = ESR_OUT_OF_MEMORY;
+        }
+    return ( reset_status );
+    }
+
+
+
+static ESR_ReturnCode SR_Recognizer_Validate_Sample_Rate ( size_t sample_rate )
+    {
+    ESR_ReturnCode  validate_status;
+
+    switch ( sample_rate )
+        {
+        case 8000:
+        case 11025:
+        case 16000:
+        case 22050:
+            validate_status = ESR_SUCCESS;
+            break;
+
+        default:
+            validate_status = ESR_INVALID_ARGUMENT;
+            break;
+        }
+    return ( validate_status );
+    }
+
+
+
+static ESR_ReturnCode SR_Recognizer_Sample_Rate_Needs_Change ( size_t new_sample_rate, ESR_BOOL *needs_changing )
+    {
+    ESR_ReturnCode  validate_status;
+    size_t          current_sample_rate;
+
+    validate_status = ESR_SessionGetSize_t ( "CREC.Frontend.samplerate", &current_sample_rate );
+
+    if ( validate_status == ESR_SUCCESS )
+        {
+        if ( new_sample_rate != current_sample_rate )
+            *needs_changing = ESR_TRUE;
+        else
+            *needs_changing = ESR_TRUE;
+        }
+    return ( validate_status );
+    }
+
+
+
+static ESR_ReturnCode SR_Recognizer_Change_Sample_Rate_Session_Params_8K ( void )
+    {
+    ESR_ReturnCode  change_status;
+    LCHAR           model_filenames [P_PATH_MAX];
+    LCHAR           lda_filename [P_PATH_MAX];
+    size_t          filename_length;
+
+    filename_length = P_PATH_MAX;
+    change_status = ESR_SessionGetLCHAR ( L("cmdline.modelfiles8"), model_filenames, &filename_length );
+
+    if ( change_status == ESR_SUCCESS )
+        {
+        filename_length = P_PATH_MAX;
+        change_status = ESR_SessionGetLCHAR ( L("cmdline.lda8"), lda_filename, &filename_length );
+
+/* From this point on, if an error occurs, we're screwed and recovery is probably impossible */
+        if ( change_status == ESR_SUCCESS )
+            {
+            change_status = ESR_SessionSetSize_t ( "CREC.Frontend.samplerate", 8000 );
+            if ( change_status == ESR_SUCCESS )
+                {
+                change_status = ESR_SessionSetInt ( "CREC.Frontend.highcut", 4000 );
+
+                if ( change_status == ESR_SUCCESS )
+                    {
+                    change_status =  ESR_SessionSetLCHAR ( L("cmdline.modelfiles"), model_filenames );
+
+                    if ( change_status == ESR_SUCCESS )
+                        change_status = ESR_SessionSetLCHAR ( L("cmdline.lda"), lda_filename );
+                    }
+                }
+            }
+        else
+            {
+            PLogError (L("\nMissing Parameter lda8\n"));
+            }
+        }
+    else
+        {
+        PLogError (L("\nMissing Parameter models8\n"));
+        }
+    return ( change_status );
+    }
+
+
+
+static ESR_ReturnCode SR_Recognizer_Change_Sample_Rate_Session_Params_11K_to_22K ( size_t sample_rate )
+    {
+    ESR_ReturnCode  change_status;
+    LCHAR           model_filenames [P_PATH_MAX];
+    LCHAR           lda_filename [P_PATH_MAX];
+    size_t          filename_length;
+
+    filename_length = P_PATH_MAX;
+    change_status = ESR_SessionGetLCHAR ( L("cmdline.modelfiles11"), model_filenames, &filename_length );
+
+    if ( change_status == ESR_SUCCESS )
+        {
+        filename_length = P_PATH_MAX;
+        change_status = ESR_SessionGetLCHAR ( L("cmdline.lda11"), lda_filename, &filename_length );
+
+/* From this point on, if an error occurs, we're screwed and recovery is probably impossible */
+        if ( change_status == ESR_SUCCESS )
+            {
+            change_status = ESR_SessionSetSize_t ( "CREC.Frontend.samplerate", sample_rate );
+
+            if ( change_status == ESR_SUCCESS )
+                {
+                change_status = ESR_SessionSetInt ( "CREC.Frontend.highcut", 5500 );
+
+                if ( change_status == ESR_SUCCESS )
+                    {
+                    change_status =  ESR_SessionSetLCHAR ( L("cmdline.modelfiles"), model_filenames );
+
+                    if ( change_status == ESR_SUCCESS )
+                        change_status = ESR_SessionSetLCHAR ( L("cmdline.lda"), lda_filename );
+                    }
+                }
+            }
+        else
+            {
+            PLogError (L("\nMissing Parameter lda11\n"));
+            }
+        }
+    else
+        {
+        PLogError (L("\nMissing Parameter models11\n"));
+        }
+    return ( change_status );
+    }
+
+
+
+static ESR_ReturnCode SR_Recognizer_Change_Sample_Rate_Session_Params ( size_t new_sample_rate )
+    {
+    ESR_ReturnCode  change_status;
+
+    if ( new_sample_rate == 8000 )
+        change_status = SR_Recognizer_Change_Sample_Rate_Session_Params_8K ( );
+    else
+        change_status = SR_Recognizer_Change_Sample_Rate_Session_Params_11K_to_22K ( new_sample_rate );
+
+    return ( change_status );
+    }
+
+
+
+ESR_ReturnCode SR_Recognizer_Change_Sample_RateImpl ( SR_Recognizer *recognizer, size_t new_sample_rate )
+    {
+    ESR_ReturnCode          change_status;
+    ESR_BOOL                rate_needs_changing;
+    SR_RecognizerImpl       *impl;
+    CA_FrontendInputParams  *frontendParams;
+
+    change_status = SR_Recognizer_Validate_Sample_Rate ( new_sample_rate );
+
+    if ( change_status == ESR_SUCCESS )
+        {
+        change_status = SR_Recognizer_Sample_Rate_Needs_Change ( new_sample_rate, &rate_needs_changing );
+
+        if ( change_status == ESR_SUCCESS )
+            {
+            if ( rate_needs_changing == ESR_TRUE )
+                {
+                change_status = SR_Recognizer_Change_Sample_Rate_Session_Params ( new_sample_rate );
+
+                if ( change_status == ESR_SUCCESS )
+                    { // SR_RecognizerCreateFrontendImpl
+                    impl = (SR_RecognizerImpl *)recognizer;
+                    change_status = SR_RecognizerUnsetupImpl( recognizer );
+
+                    if ( change_status == ESR_SUCCESS )
+                        {
+                        CA_UnconfigureFrontend ( impl->frontend );
+                        frontendParams = CA_AllocateFrontendParameters ( );
+
+                        if ( frontendParams != NULL )
+                            {
+                            change_status = SR_RecognizerGetFrontendLegacyParametersImpl ( frontendParams );
+
+                            if ( change_status == ESR_SUCCESS )
+                                {
+                                CA_ConfigureFrontend ( impl->frontend, frontendParams );
+                                CA_UnconfigureWave ( impl->wavein );
+                                CA_ConfigureWave ( impl->wavein, impl->frontend );
+                                impl->sampleRate = new_sample_rate;
+                                impl->FRAME_SIZE = impl->sampleRate / FRAMERATE * SAMPLE_SIZE;
+                                change_status = SR_Recognizer_Reset_Buffers ( impl );
+
+                                if ( change_status == ESR_SUCCESS )
+                                    {
+                                    change_status = SR_RecognizerSetupImpl( recognizer );
+
+                                    if ( change_status == ESR_SUCCESS )
+                                        change_status = SR_AcousticStateReset ( recognizer );
+                                    }
+                                else
+                                    {
+                                    SR_RecognizerSetupImpl( recognizer );   /* Otherwise recognizer is in bad state */
+                                    }
+                                }
+                            CA_FreeFrontendParameters ( frontendParams );
+                            }
+                        else
+                            {
+                            SR_RecognizerSetupImpl( recognizer );   /* Otherwise recognizer is in bad state */
+                            change_status = ESR_OUT_OF_MEMORY;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    return ( change_status );
+    }
+
+
diff --git a/srec/Recognizer/src/RecognizerResult.c b/srec/Recognizer/src/RecognizerResult.c
new file mode 100644
index 0000000..568c68b
--- /dev/null
+++ b/srec/Recognizer/src/RecognizerResult.c
@@ -0,0 +1,84 @@
+/*---------------------------------------------------------------------------*
+ *  RecognizerResult.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "plog.h"
+#include "SR_RecognizerResult.h"
+#include "SR_RecognizerResultImpl.h"
+
+
+ESR_ReturnCode SR_RecognizerResultGetWaveform(const SR_RecognizerResult* self, 
+																							const asr_int16_t** waveform, size_t* size)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getWaveform(self, waveform, size);
+}
+
+ESR_ReturnCode SR_RecognizerResultGetSize(const SR_RecognizerResult* self, size_t* count)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getSize(self, count);
+}
+
+ESR_ReturnCode SR_RecognizerResultGetKeyCount(const SR_RecognizerResult* self, const size_t nbest, size_t* count)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getKeyCount(self, nbest, count);
+}
+
+ESR_ReturnCode SR_RecognizerResultGetKeyList(const SR_RecognizerResult* self, const size_t nbest, LCHAR** list, size_t* size)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getKeyList(self, nbest, list, size);
+}
+
+ESR_ReturnCode SR_RecognizerResultGetValue(const SR_RecognizerResult* self, const size_t nbest, const LCHAR* key, LCHAR* value, size_t* len)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getValue(self, nbest, key, value, len);
+}
+
+ESR_ReturnCode SR_RecognizerResultGetLocale(const SR_RecognizerResult* self, ESR_Locale* locale)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getLocale(self, locale);
+}
diff --git a/srec/Recognizer/src/RecognizerResultImpl.c b/srec/Recognizer/src/RecognizerResultImpl.c
new file mode 100644
index 0000000..644bc0c
--- /dev/null
+++ b/srec/Recognizer/src/RecognizerResultImpl.c
@@ -0,0 +1,276 @@
+/*---------------------------------------------------------------------------*
+ *  RecognizerResultImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_RecognizerResult.h"
+#include "SR_RecognizerResultImpl.h"
+#include "SR_SemanticResult.h"
+#include "SR_SemanticResultImpl.h"
+#include "SR_SemprocDefinitions.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "ESR_Locale.h"
+
+#define MTAG NULL
+
+ESR_ReturnCode SR_RecognizerResult_Create(SR_RecognizerResult** self, SR_RecognizerImpl* recogImpl)
+{
+  SR_RecognizerResultImpl* impl;
+  
+  if (self == NULL || recogImpl == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = NEW(SR_RecognizerResultImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  impl->Interface.getWaveform = &SR_RecognizerResult_GetWaveform;
+  impl->Interface.getSize = &SR_RecognizerResult_GetSize;
+  impl->Interface.getKeyCount = &SR_RecognizerResult_GetKeyCount;
+  impl->Interface.getKeyList = &SR_RecognizerResult_GetKeyList;
+  impl->Interface.getValue = &SR_RecognizerResult_GetValue;
+  impl->Interface.getLocale = &SR_RecognizerResult_GetLocale;
+  
+  impl->nbestList = NULL;
+  impl->nbestListSize = 0;
+  impl->results = NULL;
+  impl->recogImpl = recogImpl;
+  *self = (SR_RecognizerResult*) impl;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_RecognizerResult_GetWaveform(const SR_RecognizerResult* self, 
+																							 const asr_int16_t** waveform, size_t* size)
+{
+  SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self;
+  
+  if (waveform == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  // just point to the circular buffer read start point
+  if (impl->recogImpl->waveformBuffer->overflow_count == 0)
+  {
+    *waveform = (asr_int16_t*)(((unsigned char *) impl->recogImpl->waveformBuffer->cbuffer) + 
+      sizeof(CircularBuffer) + impl->recogImpl->waveformBuffer->cbuffer->readIdx);
+    
+    *size = impl->recogImpl->waveformBuffer->read_size;
+    return ESR_SUCCESS;
+  }
+  else
+  {
+    PLogMessage(L("Warning: Voice Enrollment audio buffer overflow (spoke too much, over by %d bytes)\n"),
+                impl->recogImpl->waveformBuffer->overflow_count);
+                
+    *waveform = (asr_int16_t*)(((unsigned char *) impl->recogImpl->waveformBuffer->cbuffer) + sizeof(CircularBuffer) + impl->recogImpl->waveformBuffer->cbuffer->readIdx);
+    *size = impl->recogImpl->waveformBuffer->read_size;
+    return ESR_SUCCESS;
+  }
+}
+
+ESR_ReturnCode SR_RecognizerResult_GetSize(const SR_RecognizerResult* self, size_t* count)
+{
+  SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self;
+  ESR_ReturnCode rc;
+  
+  CHKLOG(rc, ArrayListGetSize(impl->results, count));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerResult_GetKeyCount(const SR_RecognizerResult* self, 
+																							 const size_t nbest, size_t* count)
+{
+  SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self;
+  ESR_ReturnCode rc;
+  ArrayList* results;
+	SR_SemanticResult* result;
+
+	/* Choose nbest-list entry */
+	CHKLOG(rc, impl->results->get(impl->results, nbest, (void **)&results));
+  /*
+   * Currently we only support one semantic result per nbestlist entry,
+   * so we grab the first available one.
+   */
+  CHKLOG(rc, results->get(results, 0, (void **)&result));
+  CHKLOG(rc, result->getKeyCount(result , count));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerResult_GetKeyList(const SR_RecognizerResult* self, 
+																							const size_t nbest, LCHAR** list, size_t* listSize)
+{
+  SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self;
+  ArrayList* results;
+  SR_SemanticResult* result;
+  ESR_ReturnCode rc;
+    
+  /* Choose nbest-list entry */
+  CHKLOG(rc, impl->results->get(impl->results, nbest, (void **)&results));
+  
+  /*
+   * Currently we only support one semantic result per nbestlist entry,
+   * so we grab the first available one.
+   */
+  CHKLOG(rc, results->get(results, 0, (void **)&result));
+  CHKLOG(rc, result->getKeyList(result, list, listSize));
+  
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerResult_GetValue(const SR_RecognizerResult* self, const size_t nbest, 
+																						const LCHAR* key, LCHAR* value, size_t* len)
+{
+  SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self;
+  ArrayList* results;
+  SR_SemanticResult* result;
+  SR_SemanticResultImpl* resultImpl;
+  LCHAR* lValue;
+  size_t actualLen = 0, i, resultCount;
+  ESR_ReturnCode rc;
+  ESR_BOOL noMatch = ESR_TRUE;
+  
+  /* Choose nbest-list entry */
+  CHKLOG(rc, impl->results->get(impl->results, nbest, (void **)&results));
+  /* Get the number of semantic results for the entry */
+  CHKLOG(rc, results->getSize(results, &resultCount));
+  
+  for (i = 0; i < resultCount; ++i)
+  {
+    /* Choose semantic result */
+    CHKLOG(rc, results->get(results, i, (void **)&result));
+    resultImpl = (SR_SemanticResultImpl*) result;
+    rc = resultImpl->results->get(resultImpl->results, key, (void**) & lValue);
+    if (rc == ESR_SUCCESS)
+    {
+      noMatch = ESR_FALSE;
+      actualLen += LSTRLEN(lValue);
+    }
+    else if (rc != ESR_NO_MATCH_ERROR)
+      return rc;
+  }
+  if (noMatch)
+    return ESR_NO_MATCH_ERROR;
+  ++actualLen;
+  
+  /* Check for overflow */
+  if (actualLen + 1 > *len)
+  {
+/* Unfortunately some people are using get value functions to get the size of the value by
+ * passing a zero length buffer which causes errors to be logged. I am adding code so
+ * that the error is not logged when the length is zero, thus preventing lots of logs from
+ * flooding the system.  SteveR
+ */
+    if ( ( *len ) != 0 )
+      PLogError(L("Buffer Overflow while fetching value for %s of choice %d Len %d"),
+		key, nbest, *len );
+    *len = actualLen + 1;
+    return ESR_BUFFER_OVERFLOW;
+  }
+  *len = actualLen;
+  
+  LSTRCPY(value, L(""));
+  for (i = 0; i < resultCount; ++i)
+  {
+    /* Choose semantic result */
+    CHKLOG(rc, results->get(results, i, (void **)&result));
+    resultImpl = (SR_SemanticResultImpl*) result;
+    rc = resultImpl->results->get(resultImpl->results, key, (void **) & lValue);
+    if (rc == ESR_SUCCESS)
+      LSTRCAT(value, lValue);
+    else if (rc != ESR_NO_MATCH_ERROR)
+      return rc;
+      
+    /* Separate semantic results with '#' token */
+	if (i < resultCount - 1) {
+		int len = LSTRLEN(value);
+		value[len] = MULTIPLE_MEANING_JOIN_CHAR;
+        value[len+1] = 0;
+	}
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerResult_Destroy(SR_RecognizerResult* self)
+{
+  SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self;
+  ArrayList* semanticList;
+  SR_SemanticResult* semanticResult;
+  size_t nbest, i, j, num_semanticResults;
+  ESR_ReturnCode rc;
+  
+  /* each nbest list entry has an ArrayList of Semantic Results... need to destroy them too */
+  if (impl->results != NULL)
+  {
+    CHKLOG(rc, impl->results->getSize(impl->results, &nbest));
+    for (i = 0; i < nbest; ++i)
+    {
+      CHKLOG(rc, impl->results->get(impl->results, 0, (void **)&semanticList));
+      if (semanticList == NULL)
+        continue;
+        
+      CHKLOG(rc, semanticList->getSize(semanticList, &num_semanticResults));
+      for (j = 0; j < num_semanticResults; ++j)
+      {
+        LCHAR literal[256];
+        size_t len;
+        
+        CHKLOG(rc, semanticList->get(semanticList, 0, (void **)&semanticResult));
+        CHKLOG(rc, semanticList->remove(semanticList, semanticResult));
+        len = sizeof(literal) / sizeof(LCHAR);
+        CHKLOG(rc, semanticResult->getValue(semanticResult, "literal", (LCHAR*) &literal, &len));
+        CHKLOG(rc, semanticResult->destroy(semanticResult));
+      }
+      CHKLOG(rc, impl->results->remove(impl->results, semanticList));
+      CHKLOG(rc, semanticList->destroy(semanticList));
+    }
+    CHKLOG(rc, impl->results->destroy(impl->results));
+    impl->results = NULL;
+  }
+  
+  if (impl->nbestList != NULL)
+  {
+    CA_DeleteNBestList(impl->nbestList);
+    impl->nbestList = NULL;
+  }
+  FREE(impl);
+  return ESR_SUCCESS;
+CLEANUP:
+  passert(rc != ESR_BUFFER_OVERFLOW);
+  return rc;
+}
+
+ESR_ReturnCode SR_RecognizerResult_GetLocale(const SR_RecognizerResult* self, ESR_Locale* locale)
+{
+  SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self;
+  *locale = impl->locale;
+  return ESR_SUCCESS;
+}
diff --git a/srec/Semproc/Android.mk b/srec/Semproc/Android.mk
new file mode 100644
index 0000000..ee99cde
--- /dev/null
+++ b/srec/Semproc/Android.mk
@@ -0,0 +1,77 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/ExpressionParser.c \
+	src/ExpressionEvaluator.c \
+	src/SymbolTable.c \
+	src/LexicalAnalyzer.c \
+	src/SemanticResult.c \
+	src/SemanticResultImpl.c \
+	src/SemanticGraph.c \
+	src/SemanticGraphImpl.c \
+	src/SemanticProcessor.c \
+	src/SemanticProcessorImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+common_CFLAGS := \
+	-DSREC_SEMPROC_EXPORTS \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_Core \
+
+common_TARGET:= libSR_Semproc
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/Semproc/include/SR_ExpressionEvaluator.h b/srec/Semproc/include/SR_ExpressionEvaluator.h
new file mode 100644
index 0000000..9676585
--- /dev/null
+++ b/srec/Semproc/include/SR_ExpressionEvaluator.h
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------*
+ *  SR_ExpressionEvaluator.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_EXPRESSION_EVALUATOR_H
+#define __SR_EXPRESSION_EVALUATOR_H
+
+
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemprocDefinitions.h"
+
+#include "ESR_ReturnCode.h"
+
+#include "ptypes.h"
+#include "pmemory.h"
+#include "pstdio.h"
+
+
+/**
+ * Stub for the Expression Evaluator.
+ * In the future this may be replaced by an actual data structure.
+ */
+typedef void ExpressionEvaluator;
+
+/**
+ * Create and Initialize.
+ *
+ * @param self pointer to the newly created expression evaluator
+ */
+SREC_SEMPROC_API ESR_ReturnCode EE_Init(ExpressionEvaluator** self);
+
+/**
+ * Free memory.
+ *
+ * @param self pointer to the expression evaluator to destroy
+ *
+ */
+SREC_SEMPROC_API ESR_ReturnCode EE_Free(ExpressionEvaluator* self);
+
+/**
+ * Built-in function to concatenate strings.
+ *
+ * @param data user data reference used in callback function
+ * @param operands array of strings holding operands to concatenate
+ * @param opCount number of operands
+ * @param resultBuf pointer to string buffer where result will be stored
+ * @param resultLen the length of the result
+ *
+ */
+SREC_SEMPROC_API ESR_ReturnCode EE_concat(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen);
+
+/**
+ * Built-in function to support conditional expressions (with 3 operands only!!!)
+ * @param data user data reference used in callback function
+ * @param operands first op is the condition, second is the true val, third is the false val
+ * @param opCount number of operands
+ * @param resultBuf pointer to string buffer where result will be stored
+ * @param resultLen the length of the result
+ */
+SREC_SEMPROC_API ESR_ReturnCode EE_conditional(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen);
+
+/**
+ * Built-in function to support string value addition
+ * @param data user data reference used in callback function
+ * @param operands strings to interpret as integers and then add together
+ * @param opCount number of operands
+ * @param resultBuf pointer to string buffer where result will be stored
+ * @param resultLen the length of the result
+ */
+SREC_SEMPROC_API ESR_ReturnCode EE_add(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen);
+
+/**
+ * Built-in function to support string value substraction
+ * @param data user data reference used in callback function
+ * @param operands strings to interpret as integers and then subtract from the first operand
+ * @param opCount number of operands
+ * @param resultBuf pointer to string buffer where result will be stored
+ * @param resultLen the length of the result
+ */
+SREC_SEMPROC_API ESR_ReturnCode EE_subtract(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen);
+
+#endif /* __EXPRESSION_EVALUATOR_H */
diff --git a/srec/Semproc/include/SR_ExpressionParser.h b/srec/Semproc/include/SR_ExpressionParser.h
new file mode 100644
index 0000000..cd65ee7
--- /dev/null
+++ b/srec/Semproc/include/SR_ExpressionParser.h
@@ -0,0 +1,213 @@
+/*---------------------------------------------------------------------------*
+ *  SR_ExpressionParser.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_EXPRESSION_PARSER_H
+#define __SR_EXPRESSION_PARSER_H
+
+
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemprocDefinitions.h"
+
+#include "SR_LexicalAnalyzer.h"
+#include "SR_SymbolTable.h"
+#include "SR_ExpressionEvaluator.h"
+
+#include "ptypes.h"
+#include "pstdio.h"
+#include "pmemory.h"
+
+#include "ESR_ReturnCode.h"
+#include "ESR_Session.h"
+#include "SR_Grammar.h"
+
+#define SR_SemprocFunctionPtr SR_GrammarDispatchFunction
+
+/**
+ * States in the finite state machine used for parsing.
+ */
+enum
+{
+  /**
+   * Initial state for a new expression
+   */
+  LHS_REQUIRED,
+  
+  /**
+   * Equal sign required next
+   */
+  OP_ASSIGN_REQUIRED,
+  
+  /**
+   * Identifier (const or rule property reference) required next
+   */
+  IDENTIFIER_REQUIRED,
+  
+  /**
+   * Any operand other than equal sign required next
+   */
+  OP_ANY_REQUIRED,
+};
+
+/**
+ * Structure for holding function callbacks which may be registered by the programmer from the
+ * application, or internally as built-in functions (see ExpressionEvaluator.h)
+ */
+typedef struct FunctionCallback_t
+{
+  /**
+   * The pointer to the function
+   */
+  SR_SemprocFunctionPtr pfunction;
+  
+  /**
+   * User data
+   */
+  void* userData;
+  
+}
+FunctionCallback;
+
+
+/**
+ * The Parser.
+ */
+typedef struct ExpressionParser_t
+{
+  /**
+   * The current state 
+   */
+  int    state;
+  
+  /**
+   * buffer for holding the token on the lhs of equal sign
+   */
+  LCHAR  lhs[MAX_STRING_LEN];
+  
+  /**
+   * buffer for holding the operator (which may be more than 1 char in the future!!!)
+   */
+  LCHAR  op[MAX_STRING_LEN];
+  
+  /**
+   * buffers for holding the idetifiers encountered on the rhs of this expression
+   */
+  LCHAR  identifiers[MAX_RHS_IDENTIFIERS][MAX_STRING_LEN];
+  
+  /**
+   * the number of identifiers encountered
+   */
+  size_t idCount;
+  
+  /**
+   * pointer to the appropriate buffer (above) for storing the next token encountered
+   * which may be an operator, identifier, etc...
+   */
+  LCHAR  *ptokenBuf;
+  
+  
+  /***************************/
+  /* function callback stuff */
+  /***************************/
+  
+  /**
+   * hashtable used for keeping track of registered function callbacks
+   */
+  HashMap *pfunctions;
+  
+  /**
+   * Array storing all the function callbacks
+   */
+  FunctionCallback functions[MAX_FUNCTION_CALLBACKS];
+  
+  /**
+   * Pointer to the next available function callback slot in the array
+   */
+  FunctionCallback *next;
+  
+  /**
+   * Pointer to the current function to carry out in this expression (only one per expression !!!)
+   * Nesting of functions is NOT SUPPORTED
+   */
+  SR_SemprocFunctionPtr pfunction;
+  
+  /**
+   * Reference to current user data
+   */
+  void* userData;
+  
+  /**
+   * The current function name 
+   */
+  LCHAR  functionName[MAX_STRING_LEN];
+  
+  /**
+   * Indicates when a function needs to be executed at the end of a statement.
+   */
+  ESR_BOOL needToExecuteFunction;
+}
+ExpressionParser;
+
+
+/**
+ * Create and Initialize.
+ *
+ * @param self pointer to the newly created parser
+ */
+SREC_SEMPROC_API ESR_ReturnCode EP_Init(ExpressionParser **self);
+
+/**
+ * Free.
+ *
+ * @param self pointer to the parser
+ */
+SREC_SEMPROC_API ESR_ReturnCode EP_Free(ExpressionParser *self);
+
+/**
+ * Do the parsing of the script.
+ * @param self pointer to the parser
+ * @param lexAnalyzer pointer to the lexical analyzer where the parser gets tokens from
+ * @param symtable pointer to the symbol table where the parser gets/sets key-value pairs
+ * @param evaluator pointer to the expression evaluator where calls functiosn to evaulate expressions
+ * @param hashmap pointer to a hashmap used to store the results of processing
+ */
+SREC_SEMPROC_API ESR_ReturnCode EP_parse(ExpressionParser* self, LexicalAnalyzer* lexAnalyzer,
+    SymbolTable* symtable, ExpressionEvaluator* evaluator,
+    HashMap** hashmap);
+    
+/**
+ * Register a function.
+ * @param self pointer to the parser
+ * @param name name of the function, as it will appear in the script
+ * @param data User data
+ * @param pfunction pointer to the function
+ * @return ESR_SUCCESS
+ */
+SREC_SEMPROC_API ESR_ReturnCode EP_RegisterFunction(ExpressionParser* self, const LCHAR* name, void* data, SR_SemprocFunctionPtr pfunction);
+
+/**
+ * Lookup pointer to a registered function.
+ * @param self pointer to the parser
+ * @param name name of the function, as it will appear in the script
+ * @param pfunction pointer to the function
+ */
+SREC_SEMPROC_API ESR_ReturnCode EP_LookUpFunction(ExpressionParser* self, LCHAR* name, void** data, SR_SemprocFunctionPtr* pfunction);
+
+
+#endif
diff --git a/srec/Semproc/include/SR_LexicalAnalyzer.h b/srec/Semproc/include/SR_LexicalAnalyzer.h
new file mode 100644
index 0000000..e29cce5
--- /dev/null
+++ b/srec/Semproc/include/SR_LexicalAnalyzer.h
@@ -0,0 +1,79 @@
+/*---------------------------------------------------------------------------*
+ *  SR_LexicalAnalyzer.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_LEXICAL_ANALYZER_H
+#define __SR_LEXICAL_ANALYZER_H
+
+
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemprocDefinitions.h"
+
+#include "ptypes.h"
+#include "pstdio.h"
+
+#include "ESR_ReturnCode.h"
+
+/**
+ * The Lexical Analyzer
+ */
+typedef struct LexicalAnalyzer_t
+{
+  /**
+   * Pointer to the script to analyze .
+   */
+  LCHAR* script;
+  
+  /**
+   * Pointer to the next token in the script. 
+   */
+  LCHAR* nextToken;
+  
+}
+LexicalAnalyzer;
+
+/**
+ * Create and Initialize
+ * @param self pointer to the newly created object
+ */
+SREC_SEMPROC_API ESR_ReturnCode LA_Init(LexicalAnalyzer **self);
+
+/**
+ * Startup the analysis
+ * @param self pointer to Lexical Analyzer
+ * @param script pointer to the script to analyze
+ */
+SREC_SEMPROC_API ESR_ReturnCode LA_Analyze(LexicalAnalyzer *self, LCHAR *script);
+
+/**
+ * Free
+ * @param self pointer to Lexical Analyzer
+ */
+SREC_SEMPROC_API ESR_ReturnCode LA_Free(LexicalAnalyzer *self);
+
+/**
+ * Gets the next token.
+ * @param self pointer to Lexical Analyzer
+ * @param token buffer to hold the next token
+ * @param tokenLen length of token
+ */
+SREC_SEMPROC_API ESR_ReturnCode LA_nextToken(LexicalAnalyzer *self, LCHAR* token, size_t* tokenLen);
+
+
+#endif /* __LEXICAL_ANALYZER_H */
diff --git a/srec/Semproc/include/SR_SemanticGraph.h b/srec/Semproc/include/SR_SemanticGraph.h
new file mode 100644
index 0000000..18c02cc
--- /dev/null
+++ b/srec/Semproc/include/SR_SemanticGraph.h
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SemanticGraph.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SEMANTICGRAPH_H
+#define __SR_SEMANTICGRAPH_H
+
+
+
+#include "SR_SemprocPrefix.h"
+#include "pstdio.h"
+#include "ptypes.h"
+#include "srec_context.h" /* for wordmap */
+#include "ESR_ReturnCode.h"
+
+
+/**
+ * A Semantic Graph is a data structure representing acceptable phrases and their associated
+ * meaning. A graph is made up of nodes and arcs. Arcs are associated with input symbols and
+ * output symbols. Input symbols are words that may be spoken, and output symbols are symbols
+ * which allow for semantic interpretation. For example, certain output symbols are actually
+ * labels which map to script expressions (eScript expressions, similar to JavaScript).
+ * These expressions are interpreted by a Semantic Processor in order to determine meaning, such as
+ * spoken input symbol: "one", expression: "DIGIT.V='1'", semantic interpretation: "1".
+ *
+ * Refer to the SR_SemanticProcessor.h documentation to find out more about parsing, and about
+ * semantic interpretation (eScript).
+ */
+typedef struct SR_SemanticGraph_t
+{
+  /**
+   * Destroys a semantic graph.
+   *
+   * @param self SR_SemanticGraph handle
+   */
+  ESR_ReturnCode(*destroy)(struct SR_SemanticGraph_t* self);
+  /**
+   * Loads a semantic graph from disk.
+   *
+   * @param self SR_SemanticGraph handle
+   * @param ilabels Input word labels to be used when building the graph (The should be the same as
+   * the output word labels from the recognition graph/context.)
+   * @param basename File to read graph from (.g2g image or basename for text files)
+   * @param num_words_to_add Number of words to add dynamically (only applies when loading from text files)
+   * @todo complete documentation
+   */
+  ESR_ReturnCode(*load)(struct SR_SemanticGraph_t* self, wordmap* ilabels, const LCHAR* basename, int num_words_to_add);
+  /**
+   * Unloads a semantic graph.
+   *
+   * @param self SR_SemanticGraph handle
+  * @return ESR_SUCCESS
+   */
+  ESR_ReturnCode(*unload)(struct SR_SemanticGraph_t* self);
+  
+  /**
+   * Saves the semantic graph as a binary image. 
+   *
+   * @param self SR_SemanticGraph handle
+   * @param filename Name of the binary image file.
+   * @param version_number Target file format version.
+   */
+  ESR_ReturnCode(*save)(struct SR_SemanticGraph_t* self, const LCHAR* filename, int version_number);
+  
+  /**
+   * Adds a word to the semantic graph at the specified slot. Tag may be defined or NULL.
+   *
+   * @param self SR_SemanticGraph handle
+   * @param slot Where to insert in graph (only ROOT supported right now)
+   * @param word Word to add.
+   * @param word Semantic Tag for the word.
+   * @param maybeMultiMeaning Indicates that we MAY be adding alternate multiple meanings a previously added word
+   */
+  ESR_ReturnCode(*addWordToSlot)(struct SR_SemanticGraph_t* self, const LCHAR* slot, const LCHAR* word, const LCHAR* tag, const ESR_BOOL maybeMultiMeaning);
+	/**
+	 * Removes all words from the semantic graph.
+	 *
+	 * @param self SR_SemanticGraph handle
+	 */
+  ESR_ReturnCode(*reset)(struct SR_SemanticGraph_t* self);
+}
+SR_SemanticGraph;
+
+
+/**
+ * Create a new Semantic Graph
+ *
+ * @param self SR_SemanticGraph handle
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticGraphCreate(SR_SemanticGraph** self);
+
+#endif /* __SR_SEMANTICGRAPH_H */
diff --git a/srec/Semproc/include/SR_SemanticGraphImpl.h b/srec/Semproc/include/SR_SemanticGraphImpl.h
new file mode 100644
index 0000000..d1edc57
--- /dev/null
+++ b/srec/Semproc/include/SR_SemanticGraphImpl.h
@@ -0,0 +1,144 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SemanticGraphImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SEMANTICGRAPHIMPL_H
+#define __SR_SEMANTICGRAPHIMPL_H
+
+
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemanticGraph.h"
+#include "pstdio.h"
+#include "ptypes.h"
+#include "ESR_ReturnCode.h"
+
+/**
+ * SREC stuff
+ */
+#include "srec_context.h"
+
+
+/**
+ * SR_SemanticGraph implementation.
+ */
+typedef struct SR_SemanticGraphImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_SemanticGraph Interface;
+  
+  /**
+   * Input labels are  words in a spoken utterance.
+   * These words are the SAME as those used by the recogizer graph, so I want to
+   * reuse that data rather than duplicate it.
+   * Withing this module, ilabls are constant... they are owned and may only be changed
+   * externally by AddWordToSlot() for example
+   */
+  wordmap* ilabels;
+  
+  /**
+   * The word map containing the actual scripts. The index of teh script in the wordmap
+   * corresponds to the index found in the graph minus the script_olabel_offset
+   */
+  wordmap* scripts;
+  
+  /**
+   * Integer offset for referencing script output labels when mapping between
+   * integer ids, and their respective string values.
+   */
+  labelID script_olabel_offset;     /* starts at SEMGRAPH_SCRIPT_OFFSET */
+  
+  /**
+   * Output labels for end of scope markers. These are of the form
+   * "rule_name}"
+   * This is pretty static doesen't change
+   */
+  wordmap* scopes_olabels;
+  
+  /**
+   * Integer offset for referencing end of scope output labels when mapping between
+   * integer ids, and their respective string values.
+   */
+  size_t scopes_olabel_offset;     /* starts at SEMGRAPH_SCOPE_OFFSET */
+  
+  /**
+   * Double linked list of arcs forming graph
+   * ilables are integers which map to words in the word maps
+   * olabels are integers which map to words in the word maps
+   */
+  arc_token* arc_token_list;
+  
+  /**
+   * The arc where additional words may be added on to (see addWordToSlot)
+   * Only Root slot supported for now.
+   */
+  arc_token* arc_token_insert_start;
+  
+  /**
+   * The end node for dynamically added words.
+   */
+  arc_token* arc_token_insert_end;
+  
+  /**
+   * Free list of arcs for dynamic add word to slot.
+   */
+  arc_token* arc_token_freelist;
+  
+  /**
+   * The number of arcs in the graph
+   */
+  arcID arc_token_list_len;
+  
+  /* slot addition */
+  arc_token* arcs_for_slot[MAX_NUM_SLOTS];
+  
+}
+SR_SemanticGraphImpl;
+
+/* internal functions */
+arc_token* arc_tokens_find_ilabel(arc_token* base, arc_token* arc_token_list, wordID wdid);
+arc_token* arc_tokens_get_free(arc_token* base, arc_token** arc_token_freelist);
+
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticGraph_Destroy(SR_SemanticGraph* self);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticGraph_Load(SR_SemanticGraph* self, wordmap* ilabels, const LCHAR* basename, int num_words_to_add);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticGraph_Unload(SR_SemanticGraph* self);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticGraph_Save(SR_SemanticGraph* self, const LCHAR* filename, int version_number);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticGraph_AddWordToSlot(SR_SemanticGraph* self, const LCHAR* slot, const LCHAR* word, const LCHAR* tag, const ESR_BOOL maybeMultiMeaning);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticGraph_Reset(SR_SemanticGraph* self);
+
+#endif /* __SR_SEMANTICGRAPHIMPL_H */
diff --git a/srec/Semproc/include/SR_SemanticProcessor.h b/srec/Semproc/include/SR_SemanticProcessor.h
new file mode 100644
index 0000000..5a53a2c
--- /dev/null
+++ b/srec/Semproc/include/SR_SemanticProcessor.h
@@ -0,0 +1,112 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SemanticProcessor.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SEMANTICPROCESSOR_H
+#define __SR_SEMANTICPROCESSOR_H
+
+
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemanticGraph.h"
+#include "SR_SemanticResult.h"
+#include "pstdio.h"
+#include "ptypes.h"
+#include "ESR_ReturnCode.h"
+
+
+
+
+/**
+ * Wrapper for the eScript Semantic Processor Implementation.
+ */
+typedef struct SR_SemanticProcessor_t
+{
+  /**
+   * Parse a graph with the processor provided as argument. Store semantic results in the objects pointed to by each 
+   * element in the array provided. In other words, each element of the array is a pointer to a SemanticResult object 
+   * created (and destroyed) by the caller of the function.
+   * The size of the array must be SWIrecResultData **result_dataindicated in resultCount. If the array is not big enough, ESR_BUFFER_OVERFLOW 
+   * is returned with resultCount set to the size required. 
+   */
+  ESR_ReturnCode(*checkParse)(struct SR_SemanticProcessor_t* self, SR_SemanticGraph* semgraph, const LCHAR* transcription, SR_SemanticResult** result, size_t* resultCount);
+  /**
+   * Parse a graph with the processor provided as argument. Store semantic results in the objects pointed to by each 
+   * element in the array provided. In other words, each element of the array is a pointer to a SemanticResult object 
+   * created (and destroyed) by the caller of the function.
+   * The size of the array must be SWIrecResultData **result_dataindicated in resultCount. If the array is not big enough, ESR_BUFFER_OVERFLOW 
+   * is returned with resultCount set to the size required. 
+   */
+  ESR_ReturnCode(*checkParseByWordID)(struct SR_SemanticProcessor_t* self, SR_SemanticGraph* semgraph, wordID* wordIDs, SR_SemanticResult** result, size_t* resultCount);
+  /**
+   * Frees the memory used by the Semantic Processor.
+   *
+   * @param self SR_SemanticProcessor handle
+   */
+  ESR_ReturnCode(*destroy)(struct SR_SemanticProcessor_t* self);
+  
+  /**
+   * Set a param to be read by Semantic Processor during processing.
+   *
+   * @param self SR_SemanticProcessor handle
+   * @param key The name of the param
+   * @param value The value of the param
+   */
+  ESR_ReturnCode(*setParam)(struct SR_SemanticProcessor_t* self, const LCHAR* key, const LCHAR* value);
+  
+  /**
+   * Flush the internals of the semantic processor 
+   *
+   * @param self SR_SemanticProcessor handle
+   */
+  ESR_ReturnCode(*flush)(struct SR_SemanticProcessor_t* self);
+  
+}
+SR_SemanticProcessor;
+
+
+/**
+ * Create a new Semantic Processor.
+ *
+ * @param self SR_SemanticProcessor handle
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessorCreate(SR_SemanticProcessor** self);
+/**
+ * Create a new Semantic Processor.
+ *
+ * @param self SR_SemanticProcessor handle
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessorDestroy(SR_SemanticProcessor* self);
+/**
+* Set a param to be read by Semantic Processor during processing.
+*
+* @param self SR_SemanticProcessor handle
+* @param key The name of the param
+* @param value The value of the param
+*/
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessorSetParam(SR_SemanticProcessor* self, const LCHAR* key, const LCHAR* value);
+/**
+* Flush the internals of the Semantic Processor
+*
+* @param self SR_SemanticProcessor handle
+*/
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessorFlush(SR_SemanticProcessor* self);
+
+
+
+#endif /* __SR_SEMANTICPROCESSOR_H */
diff --git a/srec/Semproc/include/SR_SemanticProcessorImpl.h b/srec/Semproc/include/SR_SemanticProcessorImpl.h
new file mode 100644
index 0000000..ac2e327
--- /dev/null
+++ b/srec/Semproc/include/SR_SemanticProcessorImpl.h
@@ -0,0 +1,87 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SemanticProcessorImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SEMANTICPROCESSORIMPL_H
+#define __SR_SEMANTICPROCESSORIMPL_H
+
+
+
+#include "SR_SemanticGraph.h"
+#include "SR_SemanticProcessor.h"
+#include "SR_SemanticResult.h"
+#include "ESR_ReturnCode.h"
+
+
+/**
+ * eScript Semantic Processor stuff
+ */
+#include "SR_ExpressionParser.h"
+#include "SR_ExpressionEvaluator.h"
+#include "SR_LexicalAnalyzer.h"
+#include "SR_SymbolTable.h"
+
+/**
+ * SR_SemanticProcessor implementation.
+ */
+typedef struct SR_SemanticProcessorImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_SemanticProcessor Interface;
+  
+  ExpressionParser* parser;
+  ExpressionEvaluator* eval;
+  SymbolTable* symtable;
+  LexicalAnalyzer* analyzer;
+  /* the accumulated scripts */
+  LCHAR* acc_scripts;
+}
+SR_SemanticProcessorImpl;
+
+
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessor_Destroy(SR_SemanticProcessor* self);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessor_CheckParse(SR_SemanticProcessor* self, SR_SemanticGraph* semgraph, const LCHAR* transcription, SR_SemanticResult** result, size_t* resultCount);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessor_CheckParseByWordID(SR_SemanticProcessor* self, SR_SemanticGraph* semgraph, wordID* wordIDs, SR_SemanticResult** result, size_t* resultCount);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessor_SetParam(SR_SemanticProcessor* self, const LCHAR* key, const LCHAR* value);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticProcessor_Flush(SR_SemanticProcessor* self);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API PINLINE ESR_BOOL isnum(const LCHAR* str);
+
+
+
+
+#endif /* __SR_SEMANTICPROCESSORIMPL_H */
diff --git a/srec/Semproc/include/SR_SemanticResult.h b/srec/Semproc/include/SR_SemanticResult.h
new file mode 100644
index 0000000..c6e26e4
--- /dev/null
+++ b/srec/Semproc/include/SR_SemanticResult.h
@@ -0,0 +1,112 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SemanticResult.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SEMANTICRESULT_H
+#define __SR_SEMANTICRESULT_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "SR_SemprocPrefix.h"
+
+/**
+ * Semantic result.
+ */
+typedef struct SR_SemanticResult_t
+{
+  /**
+   * Returns number of [key, value] pairs in the current results.
+   *
+   * @param self SemanticResult handler
+   * @param count The number keys
+   */
+  ESR_ReturnCode(*getKeyCount)(struct SR_SemanticResult_t* self, size_t* count);
+  /**
+   * Given an array of pointers to <code>LCHAR*</code>, populates that array with pointers
+    * to the keys used internally by the recognition result. These keys should not be modified!
+   *
+   * @param self SemanticResult handler
+   * @param list [out] List of keys associated with n-best list entry.
+    * @param size [in/out] Size of list. If the return code is ESR_BUFFER_OVERFLOW, the required size 
+    *             is returned in this variable.
+   */
+  ESR_ReturnCode(*getKeyList)(struct SR_SemanticResult_t* self, LCHAR** list, size_t* size);
+  /**
+   * Returns copy of semantic value.
+   *
+   * @param self SemanticResult handler
+    * @param key The key to look up
+   * @param value [out] The buffer used to hold the resulting value
+   * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+   */
+  ESR_ReturnCode(*getValue)(struct SR_SemanticResult_t* self, const LCHAR* key, LCHAR* value, size_t* len);
+  /**
+   * Destroys a semantic result.
+   *
+   * @param self SemanticResult handler
+   */
+  ESR_ReturnCode(*destroy)(struct SR_SemanticResult_t* self);
+}
+SR_SemanticResult;
+
+
+/**
+ * Create a new semantic result.
+ *
+ * @param self SemanticResult handle
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResultCreate(SR_SemanticResult** self);
+/**
+ * Returns number of [key, value] pairs in the current results.
+ *
+ * @param self SemanticResult handler
+ * @param count The number keys
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResultGetKeyCount(SR_SemanticResult* self, size_t* count);
+/**
+ * Given an array of pointers to <code>LCHAR*</code>, populates that array with pointers
+ * to the keys used internally by the recognition result. These keys should not be modified!
+ *
+ * @param self SemanticResult handler
+ * @param list [out] List of keys associated with n-best list entry.
+ * @param size [in/out] Size of list. If the return code is ESR_BUFFER_OVERFLOW, the required size
+ *             is returned in this variable.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResultGetKeyList(SR_SemanticResult* self, LCHAR** list,
+    size_t* size);
+/**
+ * Returns value component of [key, value] pair.
+ *
+ * @param self SemanticResult handler
+ * @param key The key to look up
+ * @param value [out] The buffer used to hold the resulting value
+ * @param len [in/out] Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResultGetValue(SR_SemanticResult* self, const LCHAR* key, LCHAR* value, size_t* len);
+/**
+ * Destroys a semantic result.
+ *
+ * @param self SemanticResult handler
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResultDestroy(SR_SemanticResult* self);
+
+
+#endif /* __SR_SEMANTICRESULT_H */
diff --git a/srec/Semproc/include/SR_SemanticResultImpl.h b/srec/Semproc/include/SR_SemanticResultImpl.h
new file mode 100644
index 0000000..7ac7328
--- /dev/null
+++ b/srec/Semproc/include/SR_SemanticResultImpl.h
@@ -0,0 +1,63 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SemanticResultImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SEMANTICRESULTIMPL_H
+#define __SR_SEMANTICRESULTIMPL_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "HashMap.h"
+
+
+/**
+ * SemanticResult implementation.
+ */
+typedef struct SR_SemanticResultImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_SemanticResult Interface;
+  
+  /**
+   * Semantic [key, value] pairs.
+   */
+  HashMap* results;
+}
+SR_SemanticResultImpl;
+
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResult_GetKeyCount(SR_SemanticResult* self, size_t* count);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResult_GetKeyList(SR_SemanticResult* self, LCHAR** list, size_t* size);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResult_GetValue(SR_SemanticResult* self, const LCHAR* key, LCHAR* value, size_t* len);
+/**
+ * Default implementation.
+ */
+SREC_SEMPROC_API ESR_ReturnCode SR_SemanticResult_Destroy(SR_SemanticResult* self);
+
+#endif /* __SR_SEMANTICRESULTIMPL_H */
diff --git a/srec/Semproc/include/SR_SemprocDefinitions.h b/srec/Semproc/include/SR_SemprocDefinitions.h
new file mode 100644
index 0000000..48f28f9
--- /dev/null
+++ b/srec/Semproc/include/SR_SemprocDefinitions.h
@@ -0,0 +1,231 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SemprocDefinitions.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SEMPROCDEFINITIONS_H
+#define __SR_SEMPROCDEFINITIONS_H
+
+
+
+#include "ptypes.h"
+#include "pstdio.h"
+
+/**
+ * Whether to display verbose error message when parse fails.
+ */
+#define SEMPROC_VERBOSE_PARSE_ERROR 1
+
+/**
+* Max number of semantic results
+*/
+#define MAX_SEM_RESULTS         1
+
+/**
+ * Maximum number of symbols allowed in the Symbol table when parsing a single script
+ */
+#define MAX_SYMBOLS            40
+
+/**
+ * Maximum number of special symbols allowed in the Symbol table set before parsing and read during
+ */
+#define MAX_SPECIAL_SYMBOLS     1
+
+
+/**
+ * Maximum size of strings
+ */
+#define MAX_STRING_LEN        350
+
+/**
+ * Maximum length of accumulated scripts
+ */
+#define MAX_SCRIPT_LEN       8192
+
+/**
+ * Maximum number of identifiers allowed on the RHS of equal sign
+ */
+#define MAX_RHS_IDENTIFIERS    10
+
+/**
+ * Maximum number of function callbacks the may be registered
+ * fix: 2004-05-20, this was limiting the number of concurrently
+ * loaded grammars, now patched but source problem not repaired
+ */
+#define MAX_FUNCTION_CALLBACKS 32
+
+/**
+ * Max depth of a graph (tokens including scope markers, scripts, words etc)
+ */
+#define MAX_SEM_GRAPH_DEPTH       128
+
+/**
+ * Maximum number of partial paths which will be used when parsing
+ */
+#define MAX_SEM_PARTIAL_PATHS     512
+
+/**
+ * Maximum number of tokens encountered on all partial paths combined
+ */
+#define MAX_PATH_OLABELS          2048
+
+/**
+ * Maximum number of scripts accumulated on a path through grammar
+ */
+#define MAX_SCRIPTS                512
+
+/**
+ * Offset used for denoting scripts (since integer used as label in graph)
+ */
+#define SEMGRAPH_SCRIPT_OFFSET  30000
+
+/**
+ * Offset used for denoting scope markers (since integer used as label in graph)
+ */
+#define SEMGRAPH_SCOPE_OFFSET   40000
+
+/**
+ * Assignment operator
+ */
+#define OP_ASSIGN        L('=')
+
+/**
+ * String concatenation operator
+ */
+#define OP_CONCAT        L('+')
+
+/**
+ * Left bracket
+ */
+#define LBRACKET         L('(')
+
+/**
+ * Delimiter for parameters in a function call
+ */
+#define PARAM_DELIM      L(',')
+
+/**
+ * Right bracket
+ */
+#define RBRACKET         L(')')
+
+/**
+ * Question mark used in conditional expressions to signify end of condition part
+ */
+#define OP_CONDITION_IFTRUE  L('?')
+
+/**
+ * Colon used in conditional expressions to signify the alternative (false) return value
+ */
+#define OP_CONDITION_ELSE    L(':')
+
+/**
+ * End of statement operator
+ */
+#define EO_STATEMENT     L(';')
+
+/**
+ * Delimiter for constant string identifiers
+ */
+#define STRING_DELIM     L('\'')
+
+/**
+ * Dot used for rule property referencing
+ */
+#define DOT              L('.')
+
+/**
+ * Underscore sometimes used in identifiers
+ */
+#define USCORE           L('_')
+
+/**
+ * Newline character
+ */
+#define NL               L('\n')
+
+/**
+ * End of string character
+ */
+#define EO_STRING        L('\0')
+
+/**
+ * Escape character.
+ **/
+#define ESC_CHAR L('\\')
+/**
+ * CHAR used for joining (union) multiple meanings for same word
+ */
+#define MULTIPLE_MEANING_JOIN_CHAR L('#')
+
+/**
+ * String used for undefined string variables
+ */
+#define UNDEFINED_SYMBOL L("undefined")
+
+/**
+ * Boolean symbol true
+ */
+#define TRUE_SYMBOL      L("true")
+
+/**
+* Boolean symbol false
+*/
+#define FALSE_SYMBOL     L("false")
+
+/** 
+ * markers
+ */
+#define BEGIN_SCOPE_MARKER L('{')
+#define END_SCOPE_MARKER   L('}')
+#define IS_BEGIN_SCOPE(wW) (wW[0] == BEGIN_SCOPE_MARKER && wW[1] == 0)
+#define IS_END_SCOPE(wW) ((_tMp=LSTRCHR(wW,END_SCOPE_MARKER))!=0 && _tMp[1]==0)
+#define IS_SCOPE_MARKER(wW) ( IS_BEGIN_SCOPE(wW) || IS_END_SCOPE(wW))
+#define IS_SCRIPT_MARKER(wW) (wW[0] == '_' && isnum(&wW[1]))
+#define IS_OPERATOR(p) ((*p)==','|| (*p)=='+' || (*p)=='=' || (*p)=='(' || (*p)==')' || (*p)==':' || (*p)=='?')
+#define IS_LOCAL_IDENTIFIER(p, len) ( (*p)!=';' && !IS_OPERATOR(p) && *p!='\'' && !LSTRNCHR2(p,'.','(',len))
+
+
+/**
+ * This macro checks if memory allocation is possible (against internal limit values)
+ * and returns ESR_OUT_OF_MEMORY otherwise.
+ */
+#define MEMCHK(rc, val, threshold) \
+  do { \
+    if(val > threshold) \
+    { \
+      rc = ESR_OUT_OF_MEMORY; \
+      PLogError(L("%s: %d > %d\n"), ESR_rc2str(rc), (val), (threshold)); \
+      goto CLEANUP; \
+    } \
+  } while(0);
+#define LENCHK(rc, val, threshold) \
+  do { \
+    if(LSTRLEN(val) > threshold) \
+    { \
+      rc = ESR_OUT_OF_MEMORY; \
+      PLogError(L("%s: %s > %d\n"), ESR_rc2str(rc), (val), (threshold)); \
+      goto CLEANUP; \
+    } \
+  } while(0);
+
+/**
+ * Base 10 used for ITOA macro
+ */
+#define BASE_10 10
+
+#endif /* __DEFINTIONS_H */
diff --git a/srec/Semproc/include/SR_SemprocPrefix.h b/srec/Semproc/include/SR_SemprocPrefix.h
new file mode 100644
index 0000000..94cc869
--- /dev/null
+++ b/srec/Semproc/include/SR_SemprocPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SemprocPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef __SR_SEMPROCPREFIX_H
+#define __SR_SEMPROCPREFIX_H
+
+#include "PortExport.h"
+
+#ifdef SREC_SEMPROC_EXPORTS
+#define SREC_SEMPROC_API PORT_EXPORT_DECL
+#else
+#define SREC_SEMPROC_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/Semproc/include/SR_SymbolTable.h b/srec/Semproc/include/SR_SymbolTable.h
new file mode 100644
index 0000000..392f5a4
--- /dev/null
+++ b/srec/Semproc/include/SR_SymbolTable.h
@@ -0,0 +1,151 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SymbolTable.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SYMBOLTABLE_H
+#define __SR_SYMBOLTABLE_H
+
+
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemprocDefinitions.h"
+
+#include "ESR_ReturnCode.h"
+
+#include "HashMap.h"
+
+#include "ptypes.h"
+#include "pstdio.h"
+
+#define MAX_SEMPROC_KEY   128 /* was 350 */
+#define MAX_SEMPROC_VALUE 512 /* was 300 */
+
+/**
+ * Entries in the Symbol table are symbols i.e. key-value pairs.
+ */
+typedef struct Symbol_t
+{
+  /**
+   * key string
+   */
+  LCHAR key[MAX_SEMPROC_KEY];
+  /**
+   * value string
+   */
+  LCHAR value[MAX_SEMPROC_VALUE];
+}
+Symbol;
+
+/**
+ * The Symbol Table
+ */
+typedef struct SymbolTable_t
+{
+  /**
+   * Keep track of symbols using a hashmap of pointers 
+   */
+  HashMap* hashmap;
+  
+  /**
+   * The symbols stored as an array
+   */
+  Symbol Symbols[MAX_SYMBOLS];
+  
+  /**
+   * Pointer to the next available symbol slot for storing a symbol in the array 
+   */
+  Symbol *next;
+  
+  /**
+   * Any special symbols that are set prior to semantic processing and read by the semantic processor
+   */
+  Symbol SpecialSymbols[MAX_SPECIAL_SYMBOLS];
+  
+  /**
+   * The number of special symbols set.
+   */
+  size_t num_special_symbols;
+  
+}
+SymbolTable;
+
+/**
+ * The "undefined" symbol value
+ */
+//static LCHAR undefined_symbol[] = UNDEFINED_SYMBOL;
+
+/**
+ * Create and Initialize
+ * @param self pointer to the newly created object
+ */
+SREC_SEMPROC_API ESR_ReturnCode ST_Init(SymbolTable** self);
+
+/**
+ * Free
+ * @param self pointer to the symbol table
+ */
+SREC_SEMPROC_API ESR_ReturnCode ST_Free(SymbolTable* self);
+
+/**
+ * Copies the symbols to a new hashmap (creates values dynamically)
+ * @param self pointer to the symbol table
+ * @param dst destination hashmap
+ */
+ESR_ReturnCode ST_Copy(SymbolTable* self, HashMap* dst);
+
+/**
+ * Store a key value pair
+ * @param self pointer to the symbol table
+ * @param key the key for the entry
+ * @param value the value for the entry (associated with key)
+ */
+SREC_SEMPROC_API ESR_ReturnCode ST_putKeyValue(SymbolTable* self, LCHAR* key, LCHAR* value);
+
+/**
+ * Retrieve a value associated with the key
+ * @param self pointer to the symbol table
+ * @param key the key for the entry
+ * @param value pointer to buffer for the storing result
+ */
+SREC_SEMPROC_API ESR_ReturnCode ST_getKeyValue(SymbolTable* self, LCHAR* key, LCHAR** value);
+
+/**
+ * Ask for a new sot in the symbol table
+ * @param self pointer to the symbol table
+ * @param slot pointer to the slot given (NULL if none available)
+ */
+SREC_SEMPROC_API ESR_ReturnCode ST_getSymbolSlot(SymbolTable* self, Symbol** slot);
+
+/**
+ * Reset and clear the Symbol Table for a new script
+ * @param self pointer to the symbol table
+ */
+SREC_SEMPROC_API ESR_ReturnCode ST_reset(SymbolTable* self);
+SREC_SEMPROC_API ESR_ReturnCode ST_reset_all(SymbolTable* self);
+
+/**
+ * Store a "special" key value pair. These are special symbols that are set prior to semantic
+ * processing and are ONLY read by the semantic processor during processing.
+ * @param self pointer to the symbol table
+ * @param key the key for the entry
+ * @param value the value for the entry (associated with key)
+ */
+SREC_SEMPROC_API ESR_ReturnCode ST_putSpecialKeyValue(SymbolTable* self, const LCHAR* key, const LCHAR* value);
+
+
+#endif /* __SYMBOL_TABLE_H */
diff --git a/srec/Semproc/src/ExpressionEvaluator.c b/srec/Semproc/src/ExpressionEvaluator.c
new file mode 100644
index 0000000..e68be30
--- /dev/null
+++ b/srec/Semproc/src/ExpressionEvaluator.c
@@ -0,0 +1,127 @@
+/*---------------------------------------------------------------------------*
+ *  ExpressionEvaluator.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_ExpressionEvaluator.h"
+#include "LCHAR.h"
+#include "plog.h"
+
+
+
+//static const char* MTAG = __FILE__;
+
+
+ESR_ReturnCode EE_Init(ExpressionEvaluator** self)
+{
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode EE_Free(ExpressionEvaluator* self)
+{
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode EE_concat(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen)
+{
+  size_t i, opLen;
+  ESR_ReturnCode rc;
+  
+  if (operands == NULL || resultBuf == NULL || resultLen == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  *resultLen = 0;
+  for (i = 0; i < opCount; ++i)
+  {
+    opLen = LSTRLEN(operands[i]);
+    MEMCHK(rc, (*resultLen + opLen), MAX_STRING_LEN);
+    LSTRCAT(resultBuf, operands[i]);
+    *resultLen += opLen;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode EE_conditional(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen)
+{
+  if (operands == NULL || resultBuf == NULL || resultLen == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  if (!LSTRCMP(operands[0], UNDEFINED_SYMBOL) || !operands[0] ||
+      !LSTRCMP(operands[0], FALSE_SYMBOL))
+  {
+    if (strlen(operands[2]) >= *resultLen)
+    {
+      PLogError("EE_conditional overflow error %d<%d\n", *resultLen, strlen(operands[2]));
+      *resultLen = strlen(operands[2]);
+      return ESR_BUFFER_OVERFLOW;
+    }
+    LSTRCPY(resultBuf, operands[2]);
+  }
+  else
+  {
+    if (strlen(operands[1]) >= *resultLen)
+    {
+      PLogError("EE_conditional overflow error %d<%d\n", *resultLen, strlen(operands[1]));
+      *resultLen = strlen(operands[1]);
+      return ESR_BUFFER_OVERFLOW;
+    }
+    LSTRCPY(resultBuf, operands[1]);
+  }
+  *resultLen = LSTRLEN(resultBuf);
+  return ESR_SUCCESS;
+}
+
+
+ESR_ReturnCode EE_add(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen)
+{
+  size_t i, sum;
+  
+  if (operands == NULL || resultBuf == NULL || resultLen == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  sum = 0;
+  for (i = 0; i < opCount; ++i)
+    sum += atoi(operands[i]);
+    
+  return litostr(sum, resultBuf, resultLen, BASE_10);
+}
+
+ESR_ReturnCode EE_subtract(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen)
+{
+  size_t i;
+  int diff;
+  
+  if (operands == NULL || resultBuf == NULL || resultLen == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  diff = atoi(operands[0]);
+  for (i = 1; i < opCount; ++i)
+    diff -= atoi(operands[i]);
+    
+  return litostr(diff, resultBuf, resultLen, BASE_10);
+}
diff --git a/srec/Semproc/src/ExpressionParser.c b/srec/Semproc/src/ExpressionParser.c
new file mode 100644
index 0000000..071ed2b
--- /dev/null
+++ b/srec/Semproc/src/ExpressionParser.c
@@ -0,0 +1,464 @@
+/*---------------------------------------------------------------------------*
+ *  ExpressionParser.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_ExpressionParser.h"
+#include "plog.h"
+
+
+
+static const char* MTAG = __FILE__;
+
+
+/**
+ * These are handlers for tokens. They modify state of the parser
+ */
+ESR_ReturnCode handle_NewStatement(ExpressionParser *self);
+ESR_ReturnCode handle_Identifier(ExpressionParser *self);
+ESR_ReturnCode handle_OpAssign(ExpressionParser *self);
+ESR_ReturnCode handle_OpConcat(ExpressionParser *self);
+ESR_ReturnCode handle_LBracket(ExpressionParser *self);
+ESR_ReturnCode handle_ParamDelim(ExpressionParser *self);
+ESR_ReturnCode handle_RBracket(ExpressionParser *self);
+ESR_ReturnCode handle_ConditionalExpression_IfTrue(ExpressionParser *self);
+ESR_ReturnCode handle_ConditionalExpression_Else(ExpressionParser *self);
+ESR_ReturnCode handle_EndOfStatement(ExpressionParser *self, SymbolTable *st, ExpressionEvaluator *ee);
+
+
+ESR_ReturnCode EP_Init(ExpressionParser** self)
+{
+  ESR_ReturnCode rc;
+  ExpressionParser* Interface;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  Interface = NEW(ExpressionParser, MTAG);
+  if (Interface == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  
+  /* create the hashtable for looking up the function callbacks */
+  CHKLOG(rc, HashMapCreate(&Interface->pfunctions));
+  
+  /* register the built-in callbacks */
+  Interface->next = &Interface->functions[0];
+  CHKLOG(rc, EP_RegisterFunction(Interface, L("concat"), NULL, EE_concat));
+  CHKLOG(rc, EP_RegisterFunction(Interface, L("conditional"), NULL, EE_conditional));
+  CHKLOG(rc, EP_RegisterFunction(Interface, L("add"), NULL, EE_add));
+  CHKLOG(rc, EP_RegisterFunction(Interface, L("subtract"), NULL, EE_subtract));
+  Interface->needToExecuteFunction = ESR_FALSE;
+  *self = Interface;
+  return ESR_SUCCESS;
+CLEANUP:
+  EP_Free(Interface);
+  return rc;
+}
+
+ESR_ReturnCode EP_Free(ExpressionParser* self)
+{
+  ESR_ReturnCode rc;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  CHKLOG(rc, HashMapRemoveAll(self->pfunctions));
+  
+  /* free all the memory lots by simply resetting the next pointer */
+  self->next = &self->functions[0];
+  
+  /* delete the hash table */
+  CHKLOG(rc, HashMapDestroy(self->pfunctions));
+  FREE(self);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode EP_parse(ExpressionParser* parser, LexicalAnalyzer* lexAnalyzer,
+                        SymbolTable* symtable, ExpressionEvaluator* evaluator,
+                        HashMap** hashmap)
+{
+  ESR_ReturnCode rc;
+  size_t tokenLen;
+  ESR_BOOL verbose = ESR_FALSE;
+  ESR_BOOL sessionExists = ESR_FALSE;
+  
+  /* init */
+  CHKLOG(rc, ST_reset(symtable)); /* reset the symbol table, for a new set of keys and values */
+  CHKLOG(rc, handle_NewStatement(parser));
+  
+  while (ESR_TRUE)
+  {
+    CHKLOG(rc, LA_nextToken(lexAnalyzer, parser->ptokenBuf, &tokenLen));
+    if (!tokenLen)
+      break; /* no more tokens */
+      
+    switch (parser->ptokenBuf[0])
+    {
+      case OP_ASSIGN:
+        CHKLOG(rc, handle_OpAssign(parser));
+        break;
+      case OP_CONCAT:
+        CHKLOG(rc, handle_OpConcat(parser));
+        break;
+      case LBRACKET:
+        CHKLOG(rc, handle_LBracket(parser));
+        break;
+      case PARAM_DELIM:
+        CHKLOG(rc, handle_ParamDelim(parser));
+        break;
+      case RBRACKET:
+        CHKLOG(rc, handle_RBracket(parser));
+        break;
+      case OP_CONDITION_IFTRUE:
+        CHKLOG(rc, handle_ConditionalExpression_IfTrue(parser));
+        break;
+      case OP_CONDITION_ELSE:
+        CHKLOG(rc, handle_ConditionalExpression_Else(parser));
+        break;
+      case EO_STATEMENT:
+        CHKLOG(rc, handle_EndOfStatement(parser, symtable, evaluator));
+        break;
+      default:
+        CHKLOG(rc, handle_Identifier(parser));
+        break;
+    }
+  }
+  
+  if (rc == ESR_SUCCESS)
+    CHKLOG(rc, ST_Copy(symtable, *hashmap));
+  else
+    *hashmap = NULL; /* don't give access to hashtable if something went wrong */
+  return ESR_SUCCESS;
+  
+CLEANUP:
+  CHKLOG(rc, ESR_SessionExists(&sessionExists));
+  
+  if (sessionExists)
+    rc = ESR_SessionGetBool(L("cmdline.semproc_verbose"), &verbose);
+  else
+    verbose = ESR_TRUE; /* apps like parseStringTest will not init session, but I want a
+                         descriptive error message regardless */
+  
+  if (rc == ESR_NO_MATCH_ERROR)
+    rc = ESR_SUCCESS;
+    
+  if (verbose)
+  {
+    PLogError(L("\n\nSemproc: error parsing symbol '%s'\nbefore: '%s'\nin script:\n%s\n\n"),
+              parser->ptokenBuf,
+              (lexAnalyzer->nextToken ? lexAnalyzer->nextToken : L("<end-of-script>")),
+              lexAnalyzer->script);
+  }
+  return rc;
+}
+
+ESR_ReturnCode handle_NewStatement(ExpressionParser* self)
+{
+  /* initially I want ptokenBuf to point to the lhs */
+  self->ptokenBuf = self->lhs;
+  self->state = LHS_REQUIRED;
+  self->idCount = 0;
+  self->pfunction = 0;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode handle_Identifier(ExpressionParser* self)
+{
+  ESR_ReturnCode rc;
+  
+  switch (self->state)
+  {
+    case LHS_REQUIRED:
+      self->ptokenBuf = self->op;
+      self->state = OP_ASSIGN_REQUIRED;
+      return ESR_SUCCESS;
+    case IDENTIFIER_REQUIRED:
+      self->ptokenBuf = self->op;
+      self->state = OP_ANY_REQUIRED;
+      self->idCount++; /* index to the next id slot */
+      return ESR_SUCCESS;
+    default:
+      rc = ESR_INVALID_STATE;
+      PLogError(L("%s: state=%d - are there reserved chars in the tag?"), ESR_rc2str(rc), self->state);
+      return rc;
+  }
+}
+
+ESR_ReturnCode handle_OpAssign(ExpressionParser* self)
+{
+  ESR_ReturnCode rc;
+  
+  if (self->state == OP_ASSIGN_REQUIRED)
+  {
+    MEMCHK(rc, self->idCount, MAX_RHS_IDENTIFIERS - 1);
+    self->ptokenBuf = self->identifiers[self->idCount];
+    self->state = IDENTIFIER_REQUIRED;
+    return ESR_SUCCESS;
+  }
+  return ESR_INVALID_STATE;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode handle_OpConcat(ExpressionParser* self)
+{
+  ESR_ReturnCode rc;
+  
+  if (self->state == OP_ANY_REQUIRED)
+  {
+    MEMCHK(rc, self->idCount, MAX_RHS_IDENTIFIERS - 1);
+    /* pointer to function to carry out in the Expression Evaluator */
+    CHKLOG(rc, EP_LookUpFunction(self, "concat", &self->userData, &self->pfunction));
+    self->needToExecuteFunction = ESR_TRUE;
+    self->ptokenBuf = self->identifiers[self->idCount];
+    self->state = IDENTIFIER_REQUIRED;
+    return ESR_SUCCESS;
+  }
+  return ESR_INVALID_STATE;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode handle_LBracket(ExpressionParser* self)
+{
+  ESR_ReturnCode rc;
+  
+  switch (self->state)
+  {
+    case IDENTIFIER_REQUIRED :
+      MEMCHK(rc, self->idCount, MAX_RHS_IDENTIFIERS - 1);
+      self->ptokenBuf = self->identifiers[self->idCount];
+      self->state = IDENTIFIER_REQUIRED;
+      return ESR_SUCCESS;
+      
+    case OP_ANY_REQUIRED :
+      MEMCHK(rc, self->idCount, MAX_RHS_IDENTIFIERS - 1);
+      
+      /* the name of the function is stored as the most recent identifier encountered */
+      rc = EP_LookUpFunction(self, self->identifiers[self->idCount-1], &self->userData, &self->pfunction);
+      if (rc == ESR_NO_MATCH_ERROR)
+      {
+        self->pfunction = NULL;
+        /*
+        PLogError(L("%s: Function '%s' is undefined"), ESR_rc2str(rc), self->identifiers[self->idCount-1]);
+        return rc;
+        */
+      }
+      self->needToExecuteFunction = ESR_TRUE;
+      /* save the function name for future reference */
+      LSTRCPY(self->functionName, self->identifiers[self->idCount-1]);
+      /* now reuse old identifier slot */
+      --self->idCount;
+      self->ptokenBuf = self->identifiers[self->idCount];
+      
+      self->state = IDENTIFIER_REQUIRED;
+      return ESR_SUCCESS;
+    default:
+      return ESR_INVALID_STATE;
+  }
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode handle_ParamDelim(ExpressionParser* self)
+{
+  switch (self->state)
+  {
+    case OP_ANY_REQUIRED :
+      self->ptokenBuf = self->identifiers[self->idCount];
+      self->state = IDENTIFIER_REQUIRED;
+      return ESR_SUCCESS;
+    default:
+      return ESR_INVALID_STATE;
+  }
+}
+
+
+ESR_ReturnCode handle_RBracket(ExpressionParser* self)
+{
+  switch (self->state)
+  {
+    case OP_ANY_REQUIRED :
+      self->ptokenBuf = self->op;
+      self->state = OP_ANY_REQUIRED;
+      return ESR_SUCCESS;
+    default:
+      return ESR_INVALID_STATE;
+  }
+}
+
+ESR_ReturnCode handle_ConditionalExpression_IfTrue(ExpressionParser* self)
+{
+  ESR_ReturnCode rc;
+  
+  switch (self->state)
+  {
+    case OP_ANY_REQUIRED :
+      self->ptokenBuf = self->identifiers[self->idCount];
+      CHKLOG(rc, EP_LookUpFunction(self, "conditional", &self->userData, &self->pfunction));
+      self->needToExecuteFunction = ESR_TRUE;
+      self->state = IDENTIFIER_REQUIRED;
+      return ESR_SUCCESS;
+    default:
+      return ESR_INVALID_STATE;
+  }
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode handle_ConditionalExpression_Else(ExpressionParser* self)
+{
+  switch (self->state)
+  {
+    case OP_ANY_REQUIRED :
+      self->ptokenBuf = self->identifiers[self->idCount];
+      self->state = IDENTIFIER_REQUIRED;
+      return ESR_SUCCESS;
+    default:
+      return ESR_INVALID_STATE;
+  }
+}
+
+
+ESR_ReturnCode handle_EndOfStatement(ExpressionParser* self, SymbolTable* symtable, ExpressionEvaluator* evaluator)
+{
+  size_t i;
+  LCHAR *operands[MAX_RHS_IDENTIFIERS];
+  LCHAR result[MAX_SEMPROC_VALUE];
+  size_t resultLen;
+  LCHAR *p;
+  size_t offset;
+  ESR_ReturnCode rc;
+  
+  switch (self->state)
+  {
+    case OP_ANY_REQUIRED:
+      /* LHS cannot be a constant!!! */
+      if (self->lhs[0] == STRING_DELIM)
+      {
+        PLogError(L("ESR_INVALID_ARGUMENT: %s"), self->lhs);
+        return ESR_INVALID_ARGUMENT;
+      }
+      
+      
+      /* check to see whether identifiers are constants or variables
+       and remap to the value of variable when necessary */
+      for (i = 0; i < self->idCount; i++)
+      {
+        if (self->identifiers[i][0] != STRING_DELIM)
+          CHKLOG(rc, ST_getKeyValue(symtable, self->identifiers[i], &operands[i]));
+        else
+        {
+          /* be sure to remove the string delimiters before I work with identifiers */
+          
+          /* remove leading delim */
+          p = operands[i] = &self->identifiers[i][1];
+          offset = 0;
+          
+          /* replace all \' by ' */
+          while (*p != '\'')
+          {
+            if (*p == '\\')
+            {
+              ++offset;
+              ++p;
+            }
+            if (offset > 0)
+            {
+              *(p - offset) = *p;
+            }
+            ++p;
+          }
+          *(p - offset) = '\0';
+        }
+      }
+      
+      /* if expression has to be evaluated */
+      if (self->needToExecuteFunction)
+      {
+        if (self->pfunction)
+        {
+          result[0] = EO_STRING; /* empty it by default */
+          resultLen = sizeof(result);
+          CHKLOG(rc, (*self->pfunction)(self->functionName, operands, self->idCount, self->userData, result, &resultLen));
+          CHKLOG(rc, ST_putKeyValue(symtable, self->lhs, result));
+        }
+        else
+          CHKLOG(rc, ST_putKeyValue(symtable, self->lhs, L("undefined")));
+        self->needToExecuteFunction = ESR_FALSE;
+      }
+      else
+      {
+        /* if there is no function to execute */
+        CHKLOG(rc, ST_putKeyValue(symtable, self->lhs, operands[0]));
+      }
+      return handle_NewStatement(self);
+      
+    case LHS_REQUIRED : /* for handling empty statements e.g. ";;;;" */
+      return ESR_SUCCESS;
+      
+    default:
+      PLogError(L("ESR_INVALID_ARGUMENT: %d"), self->state);
+      return ESR_INVALID_STATE;
+  }
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode EP_RegisterFunction(ExpressionParser* self,
+                                   const LCHAR* name,
+                                   void* userData,
+                                   SR_SemprocFunctionPtr pfunction)
+{
+  FunctionCallback* callback = self->next++;
+  ESR_ReturnCode rc;
+  
+  MEMCHK(rc, self->next, &self->functions[MAX_FUNCTION_CALLBACKS-1]);
+  
+  callback->pfunction = pfunction;
+  callback->userData = userData;
+  /* creates a new entry if it does not already exist */
+  return HashMapPut(self->pfunctions, name, callback);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode EP_LookUpFunction(ExpressionParser* self,
+                                 LCHAR* name,
+                                 void** userData,
+                                 SR_SemprocFunctionPtr* pfunction)
+{
+  ESR_ReturnCode rc;
+  FunctionCallback* callback;
+  
+  CHK(rc, HashMapGet(self->pfunctions, name, (void**) &callback));
+  *userData = callback->userData;
+  *pfunction = callback->pfunction;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/srec/Semproc/src/LexicalAnalyzer.c b/srec/Semproc/src/LexicalAnalyzer.c
new file mode 100644
index 0000000..80247cc
--- /dev/null
+++ b/srec/Semproc/src/LexicalAnalyzer.c
@@ -0,0 +1,136 @@
+/*---------------------------------------------------------------------------*
+ *  LexicalAnalyzer.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_LexicalAnalyzer.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+static const char* MTAG = __FILE__;
+
+ESR_BOOL isIdentifierChar(LCHAR p);
+
+ESR_ReturnCode LA_Init(LexicalAnalyzer** self)
+{
+  LexicalAnalyzer* Interface;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  Interface = NEW(LexicalAnalyzer, MTAG);
+  if (Interface == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  *self = Interface;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode LA_Analyze(LexicalAnalyzer *lex, LCHAR *script)
+{
+  if (lex == NULL || script == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  /* point to the first char */
+  lex->nextToken = lex->script = script;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode LA_Free(LexicalAnalyzer *lex)
+{
+  if (lex == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  FREE(lex);
+  return ESR_SUCCESS;
+}
+
+
+ESR_ReturnCode LA_nextToken(LexicalAnalyzer *lex, LCHAR *tokenBuf, size_t* tokenLen)
+{
+  LCHAR *p;
+  LCHAR *q;
+  
+  while (LISSPACE(*lex->nextToken))
+    ++lex->nextToken;
+    
+  switch (*lex->nextToken)
+  {
+    case OP_ASSIGN:
+    case OP_CONCAT:
+    case LBRACKET:
+    case PARAM_DELIM:
+    case RBRACKET:
+    case OP_CONDITION_IFTRUE:
+    case OP_CONDITION_ELSE:
+    case EO_STATEMENT:
+      tokenBuf[0] = *lex->nextToken;
+      tokenBuf[1] = EO_STRING;
+      *tokenLen = 1;
+      break;
+    case STRING_DELIM:
+      p = lex->nextToken;
+      q = tokenBuf;
+      *q++ = *p++;
+/* finds the end of the constant string also protects against going past end of string
+ * The parser above will handle the incomplete string. SteveR
+ */ 
+      while ( ( *p != STRING_DELIM ) && ( *p != '\0' ) )
+      {
+        if (*p == ESC_CHAR)
+          *q++ = *p++;
+        *q++ = *p++;
+      }
+      
+      *q++ = *p++; 
+      *tokenLen = q - tokenBuf;
+      tokenBuf[*tokenLen] = EO_STRING; /* make sure its there */
+      break;
+    default:
+      p = lex->nextToken;
+      while (isIdentifierChar(*p))  /* finds the end of the name of this identifier */
+        ++p;
+      *tokenLen = p - lex->nextToken;
+      LSTRNCPY(tokenBuf, lex->nextToken, *tokenLen);
+      tokenBuf[*tokenLen] = EO_STRING; /* make sure its there */
+  }
+  lex->nextToken += *tokenLen;
+  return ESR_SUCCESS;
+}
+
+/**
+ * Indicates if character is in range [a-z] or [A-Z] or [0-9] or ['.'].
+ **/
+ESR_BOOL isIdentifierChar(LCHAR p)
+{
+  return (p == DOT ||                     /* the dot */
+         p == USCORE ||                  /* the underscore */
+         (p <= L('z') && p >= L('a')) || /* lowercase alpha */
+         (p <= L('Z') && p >= L('A')) || /* uppercase alpha */
+         (p <= L('9') && p >= L('0'))) ? ESR_TRUE : ESR_FALSE;   /* numbers */
+}
diff --git a/srec/Semproc/src/SemanticGraph.c b/srec/Semproc/src/SemanticGraph.c
new file mode 100644
index 0000000..6a1dd78
--- /dev/null
+++ b/srec/Semproc/src/SemanticGraph.c
@@ -0,0 +1,29 @@
+/*---------------------------------------------------------------------------*
+ *  SemanticGraph.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemanticGraph.h"
+#include "ESR_ReturnCode.h"
+#include "plog.h"
+
+//static const char* MTAG = __FILE__;
+
+/**
+ * SR_SemanticGraphCreate is implemented in the SR_SemanticGraphCreateImpl.c file
+ */
diff --git a/srec/Semproc/src/SemanticGraphImpl.c b/srec/Semproc/src/SemanticGraphImpl.c
new file mode 100644
index 0000000..6ef5dad
--- /dev/null
+++ b/srec/Semproc/src/SemanticGraphImpl.c
@@ -0,0 +1,1368 @@
+/*---------------------------------------------------------------------------*
+ *  SemanticGraphImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemprocDefinitions.h"
+#include "SR_SemanticGraph.h"
+#include "SR_SemanticGraphImpl.h"
+#include "SR_SemanticProcessorImpl.h"
+#include "ESR_ReturnCode.h"
+#include "passert.h"
+#include "pendian.h"
+#include "plog.h"
+
+static const char* MTAG = __FILE__;
+#define AVG_SCRIPTS_PER_WORD 2.5
+#define SLOTNAME_INDICATOR "__"
+#define SLOTNAME_INDICATOR_LEN 2
+
+#define PTR_TO_IDX(ptr, base) ((asr_uint32_t) (ptr == NULL ? 0xFFFFFFFFu : \
+                               (asr_uint32_t)(ptr - base)))
+#define IDX_TO_PTR(idx, base) (idx == 0xFFFFFFFFu ? NULL : base + idx)
+
+ESR_ReturnCode SR_SemanticGraphCreate(SR_SemanticGraph** self)
+{
+  SR_SemanticGraphImpl* impl;
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = NEW(SR_SemanticGraphImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  /* do not assume NEW initialize impl as zero, do it here */
+  memset(impl, 0, sizeof(SR_SemanticGraphImpl));
+
+  impl->Interface.destroy = &SR_SemanticGraph_Destroy;
+  impl->Interface.unload = &SR_SemanticGraph_Unload;
+  impl->Interface.load = &SR_SemanticGraph_Load;
+  impl->Interface.save = &SR_SemanticGraph_Save;
+  impl->Interface.addWordToSlot = &SR_SemanticGraph_AddWordToSlot;
+  impl->Interface.reset = &SR_SemanticGraph_Reset;
+  impl->script_olabel_offset = SEMGRAPH_SCRIPT_OFFSET;
+  impl->scopes_olabel_offset = SEMGRAPH_SCOPE_OFFSET;
+
+  *self = (SR_SemanticGraph*) impl;
+  return ESR_SUCCESS;
+}
+
+
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_SemanticGraph_Destroy(SR_SemanticGraph* self)
+{
+  SR_SemanticGraphImpl* impl = (SR_SemanticGraphImpl*) self;
+
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  FREE(impl);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode sr_semanticgraph_loadV2(SR_SemanticGraphImpl* impl, wordmap* ilabels, PFile* fp);
+
+
+/* private function */
+ESR_ReturnCode SR_SemanticGraph_LoadFromImage(SR_SemanticGraph* self, wordmap* ilabels, const LCHAR* g2g)
+{
+  SR_SemanticGraphImpl* impl = (SR_SemanticGraphImpl*) self;
+  PFile* fp = NULL;
+  struct
+  {
+    asr_uint32_t rec_context_image_size;
+    /*  image data size of the recognition graph */
+    asr_uint32_t format;
+  }
+  header;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  ESR_BOOL isLittleEndian;
+  /*
+    #if __BYTE_ORDER==__LITTLE_ENDIAN
+    isLittleEndian = ESR_TRUE;
+    #else
+    isLittleEndian = ESR_FALSE;
+    #endif
+  */
+  isLittleEndian = ESR_TRUE;
+
+  fp = pfopen ( g2g, L("rb"));
+/*  CHKLOG(rc, PFileSystemCreatePFile(g2g, isLittleEndian, &fp));
+  CHKLOG(rc, PFileOpen(fp, L("rb")));*/
+
+  if ( fp == NULL )
+    goto CLEANUP;
+
+  /* header */
+  if (pfread(&header, 4, 2, fp) != 2)
+  {
+    rc = ESR_READ_ERROR;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  if (pfseek(fp, header.rec_context_image_size, SEEK_SET))
+  {
+    rc = ESR_READ_ERROR;
+    PLogError(L("ESR_READ_ERROR: could not seek to semgraph data"));
+    goto CLEANUP;
+  }
+
+  if (header.format == IMAGE_FORMAT_V2)
+  {
+    rc = sr_semanticgraph_loadV2(impl, ilabels, fp);
+  }
+  else
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError("PCLG.txt P.txt inconsistency");
+    goto CLEANUP;
+  }
+
+CLEANUP:
+  if (fp)
+    pfclose (fp);
+  if (rc != ESR_SUCCESS)
+  {
+    if (impl->arc_token_list != NULL)
+    {
+      FREE(impl->arc_token_list);
+      impl->arc_token_list = NULL;
+    }
+  }
+  return rc;
+}
+
+static ESR_ReturnCode deserializeArcTokenInfoV2(SR_SemanticGraphImpl *impl,
+    PFile* fp);
+
+static ESR_ReturnCode serializeArcTokenInfoV2(SR_SemanticGraphImpl *impl,
+    PFile* fp);
+
+ESR_ReturnCode sr_semanticgraph_loadV2(SR_SemanticGraphImpl* impl, wordmap* ilabels, PFile* fp)
+{
+  unsigned int i, nfields;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  struct
+  {
+    asr_uint32_t format;
+    asr_uint32_t sgtype;
+  }
+  header;
+  asr_uint32_t tmp[32];
+
+  if (pfread(&header, 4/*sz*/, 2/*ni*/, fp) != 2)
+  {
+    rc = ESR_READ_ERROR;
+    PLogError(L("ESR_READ_ERROR: could not read V2"));
+    goto CLEANUP;
+  }
+
+  if (header.sgtype == GrammarTypeItemList)
+  {
+    /*
+      tmp = new unsigned short[num_words];
+      if( pfread( tmp, sizeof(tmp[0]), num_words, fp) != num_words) {
+      rc = ESR_READ_ERROR;
+      PLogMessage("can't read %d word script assocs\n", num_words);
+      goto CLEANUP;
+      }
+    */
+    /* convert these to an arc_token_list or whatever */
+    PLogError("not supported v2 itemlist type");
+    rc = ESR_INVALID_STATE;
+    goto CLEANUP;
+
+  }
+  else
+  {
+
+    nfields = 2;
+    if (pfread(tmp, sizeof(tmp[0]), nfields, fp) != nfields)
+    {
+      rc = ESR_WRITE_ERROR;
+      PLogError(L("ESR_WRITE_ERROR: could not write script_olabel_offset"));
+      goto CLEANUP;
+    }
+    i = 0;
+    impl->script_olabel_offset = (wordID)tmp[i++];
+    impl->scopes_olabel_offset = (wordID)tmp[i++];
+    ASSERT(i == nfields);
+
+    /* word arcs */
+    if ((rc = deserializeArcTokenInfoV2(impl, fp)) != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+    /* use the ilabels provided externally (from recog graph ilabels) */
+    impl->ilabels = ilabels;
+
+    /* scopes */
+    if ((rc = deserializeWordMapV2(&impl->scopes_olabels, fp)) != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+    /* scripts */
+    if ((rc = deserializeWordMapV2(&impl->scripts, fp)) != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+CLEANUP:
+  return rc;
+}
+
+
+static arc_token_lnk get_first_arc_leaving_node1(arc_token* arc_token_list,
+    arcID num_arcs,
+    nodeID node)
+{
+  arcID i;
+  for (i = 0; i < num_arcs; i++)
+  {
+    if ((nodeID)(int)arc_token_list[i].next_token_index == node)
+      return ARC_TOKEN_LNK(arc_token_list, i);
+  }
+  return ARC_TOKEN_NULL;
+}
+
+static int strlen_with_null(const char* word) 
+{ /* from srec_context.c */
+  int len = strlen(word) + 1;
+  if (len % 2 == 1) len++;
+  return len;
+}
+/* private function */
+ESR_ReturnCode SR_SemanticGraph_LoadFromTextFiles(SR_SemanticGraph* self, wordmap* ilabels, const LCHAR* basename, int num_words_to_add)
+{
+  ESR_ReturnCode rc = ESR_FATAL_ERROR;
+  arcID num_scripts;
+  int isConstString = 0;
+  LCHAR filename[MAX_STRING_LEN];
+  LCHAR line[MAX_SCRIPT_LEN];
+  LCHAR iword[MAX_STRING_LEN];
+  LCHAR oword[MAX_SCRIPT_LEN];
+  LCHAR *p;
+  unsigned int max_num_arc_tokens;
+  nodeID from_node, into_node;
+  wordID ilabel = 0;
+  labelID olabel = 0;
+  arc_token *atoken;
+  arc_token *last_atoken;
+  costdata cost = 0;
+  arcID num_arcs;
+  arc_token* arc_token_list;
+  long fpos;
+  PFile* p_text_file = NULL;
+  PFile* scripts_file;
+  SR_SemanticGraphImpl* semgraph = (SR_SemanticGraphImpl*) self;
+  size_t lineNo;
+  unsigned int i;
+  wordID num_scope_words;
+  asr_int32_t num_scope_chars;
+  LCHAR* _tMp;    /* used by IS_SCOPE_MARKER() below */
+
+  /* use the ilables that are provided externally (from recog graph ilabels) */
+  semgraph->ilabels = ilabels;
+
+
+
+  /* try to open the .script file */
+  LSTRCPY(filename, basename);
+  LSTRCAT(filename, ".script");
+  scripts_file = pfopen ( filename, L("r") );
+/*  CHKLOG(rc, PFileSystemCreatePFile(filename, TRUE, &scripts_file));
+  CHKLOG(rc, PFileOpen(scripts_file, L("r")));*/
+
+  if ( scripts_file == NULL )
+  {
+    rc = ESR_OPEN_ERROR;
+    goto CLEANUP;
+  }
+
+  /* Load the scripts file
+    assumptions:
+
+  - the scripts file has each line ordered starting from 0 as such
+  <integer><space><script>
+
+  - the integer MUST become the index of the script in the wordmap
+
+  - output labels referenced in the semgraph are the integers (wordmap index) prepending with '_'
+
+  - output labels stored in the semgraph are actually integers which are equal to
+    script_olabel_offset + <integer>
+  */
+
+  /* determine number of words/chars to allocate */
+  fpos = pftell(scripts_file);
+  for (i = num_scripts = 0; pfgets(line, MAX_SCRIPT_LEN, scripts_file); num_scripts++)
+  {
+    size_t len = LSTRLEN(line) + 1;
+    if (len % 2) len++;
+    i = i + len; /* count the chars */
+  }
+  pfseek(scripts_file, fpos, SEEK_SET);
+
+  /* on each line I will have 1 big word */
+  /* figure that each script for dynamically added words will be a simple assignment
+     like myVar='someVal' ... which looks like almost 2.5 words, hence *2.5 */
+  wordmap_create(&semgraph->scripts, i, num_scripts, (int)AVG_SCRIPTS_PER_WORD*num_words_to_add);
+
+  /* load up all the information */
+  lineNo = 0;
+  while (pfgets(line, MAX_SCRIPT_LEN, scripts_file))
+  {
+    ASSERT( sizeof( iword[0]) == sizeof(char)); // else more code to write!
+    if (sscanf(line, "%s ", iword) == 1)
+    {
+      LSTRCPY(oword, line + LSTRLEN(iword) + 1);
+      /* may actually have spaces in it and this is messing me up ... here is the fix */
+      /* copy the line starting after the iword */
+      for (i = 0, p = line + LSTRLEN(iword) + 1; *p; p++)
+      {
+        if (*p == '\\')
+        {
+          if (isConstString)
+            oword[i++] = *p;
+          ++p;
+        }
+        else if (*p == '\'')
+          isConstString = (isConstString ? 0 : 1) ; /* toggle */
+        if (isConstString || !isspace(*p))
+          oword[i++] = *p;
+      }
+      oword[i] = '\0';
+
+      /* make sure that the index in the wordmap matches the line number */
+      if (wordmap_add_word(semgraph->scripts, oword) != lineNo)
+      {
+        PLogError(L("ESR_READ_ERROR: internal error adding script (%d)"), num_words_to_add);
+        return ESR_NO_MATCH_ERROR;
+      }
+      lineNo++;
+    }
+    else
+    {
+      PLogMessage(L("can't parse line %s"), line);
+      passert(0);
+    }
+  }
+  pfclose (scripts_file);
+
+  /* try to open the P.txt file */
+  LSTRCPY(filename, basename);
+  LSTRCAT(filename, ".P.txt");
+  p_text_file = pfopen ( filename, L("r"));
+/*  CHKLOG(rc, PFileSystemCreatePFile(filename, TRUE, &p_text_file));
+  CHKLOG(rc, PFileOpen(p_text_file, L("r")));*/
+
+  if ( p_text_file == NULL )
+    goto CLEANUP;
+
+  /* determine number of word arcs to allocate */
+  fpos = pftell(p_text_file);
+  num_scope_words = 0;
+  num_scope_chars = 0;
+  for (num_arcs = 0; pfgets(line, MAX_STRING_LEN, p_text_file); ++num_arcs)
+  {
+    if (num_arcs == MAXarcID)
+      break; /* error */
+	if (sscanf(line, "%hu\t%hu\t%[^\t]\t%[^\t\n\r]", &from_node, &into_node, iword, oword) == 4)
+    {
+		if (IS_SCOPE_MARKER(oword)) {
+			num_scope_words++;
+			num_scope_chars += strlen_with_null( oword);
+			if(num_scope_chars) num_scope_chars++ ;
+  }
+	}
+  }
+  max_num_arc_tokens = num_arcs + (arcID)num_words_to_add;
+  MEMCHK(rc, max_num_arc_tokens, MAXarcID);
+  pfseek(p_text_file, fpos, SEEK_SET);
+
+  semgraph->arc_token_list = NEW_ARRAY(arc_token,max_num_arc_tokens, L("semgraph.wordgraph"));
+  arc_token_list = semgraph->arc_token_list;
+  /* need to initialize my wordmap */
+  wordmap_create(&semgraph->scopes_olabels, num_scope_chars, num_scope_words,0); // max_num_arc_tokens);
+
+  /* 1. first load up all the information */
+  i = 0;
+  while (pfgets(line, MAX_STRING_LEN, p_text_file))
+  {
+    if (sscanf(line, "%hu\t%hu\t%[^\t]\t%[^\t\n\r]", &from_node, &into_node, iword, oword) == 4)
+    {
+      /* the cost is 0 by default */
+      cost = 0;
+      /* since I am reading strings, and I want to store integers, I need to get
+      the index of the string by looking up in the ilabels wordmap */
+      ilabel = wordmap_find_index(ilabels, iword);
+
+      /* now for the olabels, depending on the type of the label, I either use the index directly
+      or save the index in a wordmap which will eventually give me the right index.
+      Remember that the index must be offset by a certain value depending on which wordmap I'm using */
+
+      if (IS_SCRIPT_MARKER(oword)) /* olabel type: script */
+      {
+        olabel = (labelID) atoi(&oword[1]);
+        olabel = (wordID)(olabel + semgraph->script_olabel_offset); /* the offset */
+      }
+      else if (IS_SCOPE_MARKER(oword)) /* olabel type: scope marker */
+      {
+        /* check if the label is already in the wordmap, and reuse index */
+        olabel = wordmap_find_index(semgraph->scopes_olabels, oword);
+
+        if (olabel == MAXwordID) /* not found so add to wordmap and get new index */
+          olabel = wordmap_add_word(semgraph->scopes_olabels, oword);
+        olabel = (wordID)(olabel + semgraph->scopes_olabel_offset); /* the offset */
+      }
+      else /* olabel type: input symbols hopefully !!! */
+      {
+	/* if oword does not have a \t in the end, add a \t*/
+
+        /* check if the label is already in the wordmap, and reuse index */
+        olabel = wordmap_find_index(ilabels, oword);
+
+        if (olabel == MAXwordID) /* not found so add to wordmap and get new index */
+          PLogMessage(L("output label not found: %s"), oword);
+      }
+
+    }
+    else if (sscanf(line, "%hu", &from_node) == 1)
+    {
+      into_node = MAXnodeID;
+      ilabel = MAXwordID;
+      olabel = MAXwordID;
+      cost = 0;
+    }
+    else
+    {
+      PLogMessage(L("can't parse line %s"), line);
+      passert(0);
+    }
+
+    /* okay, now that I have the data for the current arc, save it to the arc_token data structure*/
+    atoken = &arc_token_list[i];
+    ++i;
+
+    atoken->ilabel = ilabel;
+    atoken->olabel = olabel;
+    /* atoken->cost = cost; not used for now */
+
+    /* initially this stores INTEGERS !!! , I need to cross-reference the integers with the
+    appropriate arc_token pointers (in the next steps for the algorithm) */
+    atoken->first_next_arc = (arc_token_lnk)into_node;
+    atoken->next_token_index = (arc_token_lnk)from_node;
+  }
+  num_arcs = (arcID) i;
+
+  pfclose(p_text_file);
+  p_text_file = NULL;
+
+  wordmap_setbase(semgraph->scopes_olabels);
+  wordmap_ceiling(semgraph->scopes_olabels); /* we won't be adding scopes! */
+  wordmap_setbase(semgraph->scripts);
+
+  /* 2. now do the internal cross references */
+  /* in this pass we build the 1-to-1 links, and n-to-1 links in a graph */
+  /* in other words... first_next_arc points to the first arc leaving the node */
+  for (i = 0; i < num_arcs; ++i)
+  {
+    atoken = &arc_token_list[i];
+    into_node = (nodeID)(int)atoken->first_next_arc; /* get the integer */
+    atoken->first_next_arc = /* converts the integer id to a arc_token pointer */
+      get_first_arc_leaving_node1(arc_token_list, num_arcs, (nodeID)(int)atoken->first_next_arc);
+  }
+
+  /* 3. now do more internal cross refs */
+  /* in this pass we build the 1-to-n links */
+  /* in other words ... setup the linked list of all arc leaving from the same node */
+  last_atoken = &arc_token_list[0];
+  for (i = 1; i < num_arcs; ++i)
+  {
+    atoken = &arc_token_list[i];
+    /* if this arc and the last one do NOT leave the same node (i.e. from_node, see above),
+    then the next_token_index is not used */
+    if (atoken->next_token_index != last_atoken->next_token_index)
+      last_atoken->next_token_index = ARC_TOKEN_NULL;
+    else
+      last_atoken->next_token_index = ARC_TOKEN_LNK(arc_token_list, i);
+    last_atoken = atoken;
+  }
+  last_atoken->next_token_index = ARC_TOKEN_NULL;
+
+#if DEBUG_ASTAR
+  /* under debug, it's nice to be able to see the words leaving the
+     destination node, they are stored sequentially in the debug ary */
+  for (i = 0; i < num_arcs; i++)
+  {
+    LCHAR * p;
+    arc_token* tmp;
+    atoken = &arc_token_list[i];
+    atoken->debug[0] = 0;
+    tmp = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc);
+    for (; tmp; tmp = ARC_TOKEN_PTR(arc_token_list, tmp->next_token_index))
+    {
+      if (tmp->first_next_arc == ARC_TOKEN_NULL)
+        p = "END";
+      else if (!tmp->label)
+        p = "NULL";
+      else
+        p = tmp->label;
+      if (strlen(atoken->debug) + strlen(p) + 6 < 64)
+      {
+        strcat(atoken->debug, p);
+        strcat(atoken->debug, " ");
+      }
+      else
+      {
+        strcat(atoken->debug, "...");
+        break;
+      }
+    }
+  }
+#endif
+  semgraph->arc_token_list_len = (arcID)max_num_arc_tokens;
+  /* initialize the freelist */
+  if (num_arcs < max_num_arc_tokens)
+  {
+    semgraph->arc_token_freelist = &semgraph->arc_token_list[num_arcs];
+    for (i = num_arcs; i < max_num_arc_tokens - 1; i++)
+    {
+      semgraph->arc_token_list[i].first_next_arc = ARC_TOKEN_NULL;
+      semgraph->arc_token_list[i].next_token_index = ARC_TOKEN_LNK(semgraph->arc_token_list, (i + 1));
+    }
+    semgraph->arc_token_list[i].first_next_arc = ARC_TOKEN_NULL;
+    semgraph->arc_token_list[i].next_token_index = ARC_TOKEN_NULL;
+  }
+  else
+    semgraph->arc_token_freelist = NULL;
+
+  /* for dynamic addition */
+  for (i = 0; i < MAX_NUM_SLOTS; i++)
+    semgraph->arcs_for_slot[i] = NULL;
+
+	semgraph->arc_token_insert_start = semgraph->arc_token_list + num_arcs;
+    semgraph->arc_token_insert_end = NULL;
+  return ESR_SUCCESS;
+CLEANUP:
+  if (p_text_file)
+    pfclose (p_text_file);
+  return rc;
+}
+
+ESR_ReturnCode SR_SemanticGraph_Load(SR_SemanticGraph* self, wordmap* ilabels, const LCHAR* basename, int num_words_to_add)
+{
+  ESR_ReturnCode rc;
+
+  if (LSTRSTR(basename, L(".g2g")))
+  {
+    rc = SR_SemanticGraph_LoadFromImage(self, ilabels, basename);
+  }
+  else
+  {
+    rc = SR_SemanticGraph_LoadFromTextFiles(self, ilabels, basename, num_words_to_add);
+  }
+  return rc;
+}
+
+/**
+ * Unload Sem graph
+ */
+ESR_ReturnCode SR_SemanticGraph_Unload(SR_SemanticGraph* self)
+{
+  SR_SemanticGraphImpl* semgraph = (SR_SemanticGraphImpl*) self;
+
+  /* see the wordmap_create in the Load function */
+  wordmap_destroy(&semgraph->scopes_olabels);
+  wordmap_destroy(&semgraph->scripts);
+
+  FREE(semgraph->arc_token_list);
+  semgraph->arc_token_list = 0;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode sr_semanticgraph_saveV1(SR_SemanticGraphImpl* impl, const LCHAR* g2g);
+ESR_ReturnCode sr_semanticgraph_saveV2(SR_SemanticGraphImpl* impl, const LCHAR* g2g);
+
+ESR_ReturnCode SR_SemanticGraph_Save(SR_SemanticGraph* self, const LCHAR* g2g, int version_number)
+{
+  SR_SemanticGraphImpl* impl = (SR_SemanticGraphImpl*) self;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+
+  if (version_number == 2)
+  {
+    rc = sr_semanticgraph_saveV2(impl,  g2g);
+  }
+  else
+  {
+    PLogError("invalid version_number %d\n", version_number);
+    rc = ESR_INVALID_ARGUMENT;
+  }
+  return rc;
+}
+
+
+int sr_semanticgraph_get_type(SR_SemanticGraphImpl* impl)
+{
+  arc_token *atoken, *arc_token_list = impl->arc_token_list;
+  arc_token_lnk mergept;
+  int expected_ilabel;
+  atoken = impl->arc_token_list;
+
+  /* 0 1 eps {
+     1 2 13e_avenue myRoot}
+     ...
+     1 2 13e_avenue myRoot}
+     2 */
+  if (atoken->ilabel != WORD_EPSILON_LABEL)
+    return GrammarTypeBNF;
+  atoken = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc);
+  if (!atoken)
+    return GrammarTypeBNF;
+  mergept = atoken->first_next_arc;
+  expected_ilabel = NUM_ITEMLIST_HDRWDS;
+  for (; atoken; atoken = ARC_TOKEN_PTR(arc_token_list, atoken->next_token_index))
+  {
+    if (atoken->first_next_arc != mergept)
+      return GrammarTypeBNF;
+    if (atoken->ilabel != expected_ilabel)
+      return GrammarTypeBNF;
+    expected_ilabel++;
+  }
+  if (expected_ilabel != impl->ilabels->num_words)
+    return GrammarTypeBNF;
+  atoken = ARC_TOKEN_PTR(arc_token_list, mergept);
+  for (; atoken; atoken = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc))
+  {
+    if (atoken->next_token_index != ARC_TOKEN_NULL)
+      return GrammarTypeBNF;
+    if (atoken->ilabel != WORD_EPSILON_LABEL &&
+        !(atoken->ilabel == MAXwordID && atoken->olabel == MAXwordID))
+      return GrammarTypeBNF;
+  }
+  return GrammarTypeItemList;
+}
+
+#define SEMGR_OUTPUT_FORMAT_V2 478932784
+
+ESR_ReturnCode sr_semanticgraph_saveV2(SR_SemanticGraphImpl* impl, const LCHAR* g2g)
+{
+  ESR_ReturnCode rc;
+  PFile* fp;
+  asr_uint32_t tmp[32];
+  struct
+  {
+    asr_uint32_t format;
+    asr_uint32_t sgtype;
+  }
+  header;
+  unsigned int i, nfields;
+
+  fp = pfopen ( g2g, L("r+b"));
+/*  CHKLOG(rc, PFileSystemCreatePFile(g2g, isLittleEndian, &fp));
+  CHKLOG(rc, PFileOpen(fp, L("r+b")));*/
+
+  if ( fp == NULL )
+  {
+  	rc = ESR_OPEN_ERROR;
+    goto CLEANUP;
+  }
+
+  pfseek(fp, 0, SEEK_END);
+
+  header.format = IMAGE_FORMAT_V2;
+  header.sgtype = sr_semanticgraph_get_type(impl);
+  header.sgtype = GrammarTypeBNF;
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("sr_semanticgraph_saveV2() semgraphtype %d", header.sgtype);
+#endif
+  if (pfwrite(&header, 4 /*sz*/, 2/*ni*/, fp) != 2)
+  {
+    rc = ESR_WRITE_ERROR;
+    PLogError(L("ESR_WRITE_ERROR: could not write V2"));
+    goto CLEANUP;
+  }
+
+  if (header.sgtype == GrammarTypeItemList)
+  {
+    arc_token *parser, *atok;
+
+    /* write num_words size array of short script ids
+       this might be just a y=x array, but it could be there
+       are synonyms, eg. NEW_YORK NEW_YORK_CITY -> same script
+    */
+    parser = impl->arc_token_list;
+    parser = ARC_TOKEN_PTR(impl->arc_token_list, parser->first_next_arc);
+    for (i = NUM_ITEMLIST_HDRWDS; i < impl->ilabels->num_words; i++)
+    {
+      for (atok = parser; atok; atok = ARC_TOKEN_PTR(impl->arc_token_list, atok->next_token_index))
+      {
+        if (atok->ilabel == i) break;
+      }
+      if (!atok)
+      {
+        rc = ESR_INVALID_STATE;
+        PLogError("Can't find word %d in semgraph\n", i);
+        goto CLEANUP;
+      }
+      tmp[0] = atok->olabel;
+      if (pfwrite(tmp, sizeof(tmp[0]), 1, fp) != 1)
+      {
+        rc = ESR_WRITE_ERROR;
+        PLogError(L("ESR_WRITE_ERROR: could not write V2"));
+        goto CLEANUP;
+      }
+    }
+    if ((rc = serializeWordMapV2(impl->scripts, fp)) != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  else
+  {
+
+    i = 0;
+    tmp[i++] = impl->script_olabel_offset;
+    tmp[i++] = impl->scopes_olabel_offset;
+    nfields = i;
+
+    if (pfwrite(tmp, sizeof(tmp[0]), nfields, fp) != nfields)
+    {
+      rc = ESR_WRITE_ERROR;
+      PLogError(L("ESR_WRITE_ERROR: could not write script_olabel_offset"));
+      goto CLEANUP;
+    }
+
+    /* word arcs */
+    if ((rc = serializeArcTokenInfoV2(impl, fp)) != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+    /* do not WRITE ilabels... this is a ref to the olabels from rec context */
+
+    /* scopes */
+    if ((rc = serializeWordMapV2(impl->scopes_olabels, fp)) != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+    if ((rc = serializeWordMapV2(impl->scripts, fp)) != ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+    PLogMessage("G2G done WR semg %d", pftell(fp));
+#endif
+  }
+  rc = ESR_SUCCESS;
+CLEANUP:
+  if (fp)
+    pfclose (fp);
+  return rc;
+}
+
+arc_token* arc_tokens_find_ilabel(arc_token* base, arc_token* arc_token_list, wordID ilabel)
+{
+  arc_token* p;
+  for (p = arc_token_list; p != NULL; p = ARC_TOKEN_PTR(base, p->next_token_index))
+    if (p->ilabel == ilabel) return p;
+  return NULL;
+}
+
+arc_token* arc_tokens_get_free(arc_token* base, arc_token** arc_token_freelist)
+{
+  arc_token* tmp = (*arc_token_freelist);
+  if (tmp == NULL)
+    return NULL;
+  (*arc_token_freelist) = ARC_TOKEN_PTR(base, tmp->next_token_index);
+  tmp->ilabel = tmp->olabel = 0;
+  tmp->next_token_index = ARC_TOKEN_NULL;
+  tmp->first_next_arc = ARC_TOKEN_NULL;
+  return tmp;
+}
+
+int arc_tokens_list_size(arc_token* base, arc_token* head)
+{
+  arc_token* tmp = head;
+  int count = 0;
+  for (; tmp; tmp = ARC_TOKEN_PTR(base, tmp->next_token_index))
+  {
+    count++;
+  }
+  return count;
+}
+
+void arc_tokens_free_list(arc_token* base, arc_token** arc_token_freelist, arc_token* head)
+{
+  arc_token *tail, *next = (arc_token*)1;
+  if (head == NULL)
+    return;
+  for (tail = head; ; tail = next)
+  {
+    next = ARC_TOKEN_PTR(base, tail->next_token_index);
+    if (next == NULL) break;
+  }
+  tail->next_token_index = ARC_TOKEN_PTR2LNK(base, (*arc_token_freelist));
+  *arc_token_freelist = head;
+}
+
+ESR_ReturnCode find_in_union_of_scripts(const LCHAR* union_script, const LCHAR* script, ESR_BOOL* isFound)
+{
+  const LCHAR* start;
+  const LCHAR* end;
+  const LCHAR* p;
+  const LCHAR* q;
+
+  if (union_script == NULL || script == NULL)
+    return ESR_INVALID_ARGUMENT;
+
+  start = LSTRCHR(union_script, L('\''));
+  if (start == NULL)
+    return ESR_INVALID_ARGUMENT;
+
+  start++; /* point to first char after \' */
+
+  end = LSTRCHR(start, L('\'')); /* point to last \' */
+  if (end == NULL)
+    return ESR_INVALID_ARGUMENT;
+
+  p = start;
+
+  start = LSTRCHR(script, L('\''));
+  if (start == NULL)
+    return ESR_INVALID_ARGUMENT;
+  start++; /* point to first char after \' */
+
+  q = start;
+
+  while (p < end)
+  {
+    if (*p == MULTIPLE_MEANING_JOIN_CHAR) /* if at the end of a meaning (not end of union)
+                                                  and p matched q all the way up to join char then found! */
+    {
+      *isFound = ESR_TRUE;
+      return ESR_SUCCESS;
+    }
+    else if (*p == *q) /* while same keep going */
+    {
+      if (*p == *(end - 1)) /* if at the end and p matched q all the way then found! */
+      {
+        *isFound = ESR_TRUE;
+        return ESR_SUCCESS;
+      }
+      q++;
+    }
+    else /* skip to next meaning after join char */
+    {
+      while (*p != MULTIPLE_MEANING_JOIN_CHAR && p < end)
+        p++;
+      /* reset q */
+      q = start;
+    }
+    p++;
+  }
+
+  *isFound = ESR_FALSE;
+  return ESR_SUCCESS;
+}
+
+#define QUOTE_CHAR L('\'')
+int count_num_literals(const LCHAR* a, const LCHAR** start_points, int max_num_start_points)
+{
+  int num = 0;
+  const LCHAR *p, *q = a;
+  const LCHAR *end = a + LSTRLEN(a);
+  while (1)
+  {
+    /* look for starting QUOTE_CHAR */
+    for (p = q; p < end; p++)
+    {
+      if (*p == ESC_CHAR) p++;
+      else if (*p == QUOTE_CHAR) break;
+    }
+    if (p == end) break;
+    if (num > max_num_start_points) break; /* just abort the counting! */
+    start_points[num] = p;
+    /* look for ending QUOTE_CHAR */
+    for (q = p + 1; q < end; q++)
+    {
+      if (*q == ESC_CHAR) q++;
+      else if (*q == QUOTE_CHAR) break;
+    }
+    if (q == end) /* does not close! */
+      return -1;
+    p = ++q;
+    num++;
+  }
+  return num;
+}
+int union_literal_pair(LCHAR* o, LCHAR* a, LCHAR* b, LCHAR** pptra)
+{
+  LCHAR *enda, *ptra, *endb, *ptrb;
+  LCHAR *p, *ptro;
+  enda = a + LSTRLEN(a);
+  endb = b + LSTRLEN(b);
+  /* capture the data from a to ptra */
+  for (ptra = a + 1; ptra < enda; ptra++)
+  {
+    if (*ptra == ESC_CHAR) ptra++;
+    else if (*ptra == QUOTE_CHAR) break;
+  }
+  /* capture the data from b to ptrb */
+  for (ptrb = b + 1; ptrb < endb; ptrb++)
+  {
+    if (*ptrb == ESC_CHAR) ptrb++;
+    else if (*ptrb == QUOTE_CHAR) break;
+  }
+  /* now make the output */
+  ptro = o;
+  *ptro++ = QUOTE_CHAR;
+  for (p = a + 1; p < ptra; p++) *ptro++ = *p;
+  *ptro++ = MULTIPLE_MEANING_JOIN_CHAR;
+  for (p = b + 1; p < ptrb; p++) *ptro++ = *p;
+  *ptro++ = QUOTE_CHAR;
+  *ptro++ = 0;
+  *pptra = ptra + 1;
+  return 0;
+}
+
+/* now handles n1='52';n2='62'; UNION n1='53';nx='63'; */
+
+ESR_ReturnCode make_union_of_scripts(LCHAR* union_script, const size_t max_len, const LCHAR* a, const LCHAR* b)
+{
+  int i, num_literals_in_a, num_literals_in_b;
+  LCHAR *spa[8], *spb[8], *spo[8], *ptra;
+
+  if (a == NULL || b == NULL)
+    return ESR_INVALID_ARGUMENT;
+
+  num_literals_in_a = count_num_literals(a, (const LCHAR **)spa, 8);
+  num_literals_in_b = count_num_literals(b, (const LCHAR **)spb, 8);
+
+  if (num_literals_in_a == 0 && num_literals_in_b == 0)
+  {
+    if (LSTRLEN(a) > max_len) return ESR_BUFFER_OVERFLOW;
+    else
+    {
+      LSTRCPY(union_script, a);
+      return ESR_SUCCESS;
+    }
+  }
+  else if (num_literals_in_a != num_literals_in_b)
+  {
+    return ESR_INVALID_ARGUMENT;
+  }
+
+  /* V='Springfield_IL' union V='Springfield_MA' is V='Springfield_IL#Springfield_MA' */
+  /* 18               +       18          -2     =  33 + 1 for NULL             */
+  if ((LSTRLEN(a) + LSTRLEN(b) - 2) > max_len)
+  {
+    PLogError("Temp buffer (size %d) to hold union of multiple meanings (size %d) is too small", max_len, (LSTRLEN(a) + LSTRLEN(b) - 2));
+    return ESR_BUFFER_OVERFLOW;
+  }
+
+  LSTRCPY(union_script, a);
+  for (i = 0; i < num_literals_in_a; i++)
+  {
+    count_num_literals(union_script, (const LCHAR **)spo, 8);
+    /* here union_script is n0='52';n1='62'; */
+    union_literal_pair(spo[i], spa[i], spb[i], &ptra);
+#ifdef _WIN32
+    if (LSTRLEN(spo[i]) > MAX_SEMPROC_VALUE)
+      pfprintf(PSTDOUT, "Warning: won't be able to parse this script! len %d>%d %s\n", LSTRLEN(spo[i]), MAX_SEMPROC_VALUE, spo[i]);
+#endif
+    /* here union_script is n0='52#53' */
+    LSTRCAT(union_script, ptra);
+    /* here union_script is n0='52#53';n1='62'; */
+  }
+  return ESR_SUCCESS;
+}
+
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_SemanticGraph_AddWordToSlot(SR_SemanticGraph* self, const LCHAR* _slot, const LCHAR* word, const LCHAR* script, const ESR_BOOL newWordAddedToFST)
+{
+  struct SR_SemanticGraphImpl_t *impl = (struct SR_SemanticGraphImpl_t*) self;
+  arc_token *token, *tmp;
+  arc_token *tmp_arc_token_list;
+  wordID wdID, scriptID, old_scriptID;
+  wordID slotID;
+  LCHAR union_script[1280]; /* sizeof used elsewhere */
+  ESR_ReturnCode rc; int i;
+  int tmp_arc_token_list_len;
+  int offset;
+#define MAX_WORD_LEN 128
+  char veslot[MAX_WORD_LEN];
+
+  if (script == NULL || *script == L('\0') || !LSTRCMP(script, L("NULL")))
+    return ESR_SUCCESS; /* no script to add so keep going */
+  
+  /* find out if the word I am adding already exists. If it already exists, then that means that I
+     potentially am adding an alternate meaning for the word */
+  /* the slotname in .PCLG.txt and .map files use __ as the indicator. Xufang */
+  if(_slot[0] == '@') {
+    strcpy(veslot,SLOTNAME_INDICATOR);
+    strcat(veslot,_slot+1);
+    strcat(veslot,SLOTNAME_INDICATOR);
+  } else 
+    strcpy(veslot, _slot);
+
+  slotID = wordmap_find_rule_index(impl->ilabels, veslot);
+  if (slotID == MAXwordID)
+  {
+    PLogError(L("ESR_NO_MATCH_ERROR: Could not find slotID in wordmap %s"), _slot);
+    return ESR_NO_MATCH_ERROR;
+  }
+  wdID = wordmap_find_index_in_rule(impl->ilabels, word, slotID);
+  if (wdID == MAXwordID)
+  {
+    PLogError(L("ESR_NO_MATCH_ERROR: Could not find wordID/slotID in wordmap %s/%d"), word, slotID);
+    return ESR_NO_MATCH_ERROR;
+  }
+
+  /* **this is an optimization step** */
+  /* Is word already added in this slot? if so, get the token pointer, else, token is NULL
+   *
+   * the assumption is that FST_AddWordToGrammar will tell us if this word was newly added in the FST, or
+   * if the word was added at least 1 iteration ago, meaning that I have already added it to my
+   * semgraph slot at some earlier point
+   */
+  if (newWordAddedToFST)
+    token = NULL;
+  else
+    token = arc_tokens_find_ilabel(impl->arc_token_list, impl->arcs_for_slot[slotID], wdID);
+
+#define FST_GROW_FACTOR   12/10
+#define FST_GROWARCS_MIN    100  
+  if (token == NULL) /* new word to add to slot */
+  {
+    /* add the script if new  */
+    scriptID = wordmap_find_index(impl->scripts, script);
+    if (scriptID == MAXwordID)
+      scriptID = wordmap_add_word(impl->scripts, script);
+    if (scriptID == MAXwordID)
+    {
+      PLogError(L("ESR_OUT_OF_MEMORY: Could not add script to wordmap"));
+      return ESR_OUT_OF_MEMORY;
+    }
+
+    token = impl->arcs_for_slot[slotID];
+    tmp = arc_tokens_get_free(impl->arc_token_list, &(impl->arc_token_freelist));
+    if (tmp == NULL)
+      {
+#if defined (FST_GROW_FACTOR)
+	tmp_arc_token_list_len = impl->arc_token_list_len * FST_GROW_FACTOR;
+	if(tmp_arc_token_list_len - impl->arc_token_list_len <=FST_GROWARCS_MIN)
+	  tmp_arc_token_list_len+=FST_GROWARCS_MIN;
+	
+	tmp_arc_token_list= NEW_ARRAY(arc_token,tmp_arc_token_list_len, L("semgraph.wordgraph"));
+	if(!tmp_arc_token_list) {
+	  PLogError(L("ESR_OUT_OF_MEMORY: Could not extend allocation of semgraph.wordgraph"));
+	  return ESR_OUT_OF_MEMORY;
+	}
+	memcpy(tmp_arc_token_list,impl->arc_token_list, impl->arc_token_list_len*sizeof(arc_token));
+	
+	for(i=0; i<MAX_NUM_SLOTS;i++)
+	  {
+	    if(impl->arcs_for_slot[i] != NULL) { 
+	      offset = impl->arcs_for_slot[i] - impl->arc_token_list;
+	      impl->arcs_for_slot[i] = tmp_arc_token_list + offset;
+	    }
+	  }
+	token = impl->arcs_for_slot[slotID];
+	
+	ASSERT( impl->arc_token_freelist == NULL);
+	
+	impl->arc_token_freelist = tmp_arc_token_list + impl->arc_token_list_len;
+	
+	FREE(impl->arc_token_list);
+	impl->arc_token_insert_start = tmp_arc_token_list + (impl->arc_token_insert_start - impl->arc_token_list); //Rabih fix
+	impl->arc_token_list = tmp_arc_token_list;
+
+	for (i = impl->arc_token_list_len; i < tmp_arc_token_list_len - 1; i++)
+	  {
+	    impl->arc_token_list[i].first_next_arc = ARC_TOKEN_NULL;
+	    impl->arc_token_list[i].next_token_index = ARC_TOKEN_LNK(impl->arc_token_list, (i + 1));
+	  }
+	impl->arc_token_list[i].first_next_arc = ARC_TOKEN_NULL;
+	impl->arc_token_list[i].next_token_index = ARC_TOKEN_NULL;
+	
+	impl->arc_token_list_len = tmp_arc_token_list_len;
+	tmp = arc_tokens_get_free(impl->arc_token_list, &(impl->arc_token_freelist));
+      }
+#endif
+    if(tmp == NULL) {
+      PLogError(L("ESR_OUT_OF_MEMORY: Error adding more arcs to graph\n"));
+      return ESR_OUT_OF_MEMORY;
+    }
+    impl->arcs_for_slot[slotID] = tmp;
+    tmp->next_token_index = ARC_TOKEN_PTR2LNK(impl->arc_token_list, token);
+    tmp->ilabel = wdID;
+    tmp->olabel = (wordID)(impl->script_olabel_offset + scriptID);
+  }
+  else
+  {
+    old_scriptID = token->olabel - impl->script_olabel_offset;
+
+    if (!LSTRCMP(impl->scripts->words[old_scriptID], script))
+    {
+      /* nothing to do, we have the word, same meaning again so do nothing */
+    }
+    else
+    {
+
+      CHKLOG(rc, make_union_of_scripts(union_script, sizeof(union_script), impl->scripts->words[old_scriptID], script));
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+      PLogMessage(L("Adding alternate meaning %s for word %s (%s) in slot %s\n"), script, word,
+                  impl->scripts->words[old_scriptID], impl->ilabels->words[slotID]);
+#endif
+      /* add the union as if new (if not already there) */
+      scriptID = wordmap_find_index(impl->scripts, union_script);
+      if (scriptID == MAXwordID)
+        scriptID = wordmap_add_word(impl->scripts, union_script);
+      if (scriptID == MAXwordID)
+      {
+        PLogError(L("ESR_OUT_OF_MEMORY: Could not add script to wordmap"));
+        return ESR_OUT_OF_MEMORY;
+      }
+
+      /* make the olabel point to the union */
+      token->olabel = (wordID)(impl->script_olabel_offset + scriptID);
+    }
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_SemanticGraph_Reset(SR_SemanticGraph* self)
+{
+  struct SR_SemanticGraphImpl_t *impl = (struct SR_SemanticGraphImpl_t*) self;
+  wordID slotid;
+  arc_token* tmp;
+  arc_token *tmp_arc_token_list;
+
+  wordmap_reset(impl->scopes_olabels);
+  wordmap_reset(impl->scripts);
+  wordmap_reset(impl->ilabels);   //Rabih: I added this
+  for (slotid = 1; slotid < impl->ilabels->num_slots; slotid++)
+  {
+    tmp = impl->arcs_for_slot[slotid];
+    arc_tokens_free_list(impl->arc_token_list, &(impl->arc_token_freelist), tmp);
+    impl->arcs_for_slot[slotid] = NULL;
+#if defined(SANITY_CHECK)
+    int count;
+    for (count = 0, tmp = impl->arc_token_freelist; tmp != NULL;
+         tmp = ARC_TOKEN_PTR(impl->arc_token_list, tmp->next_token_index))
+    {
+      ASSERT(tmp->ilabel != 79324);
+      tmp->ilabel = 79324;
+      count++;
+    }
+    PLogError("after reset freelist size is %d", count);
+#endif
+  }
+  
+  // Rabih : Reset the arc_token_list
+  if(impl->ilabels->num_words == impl->ilabels->num_base_words)
+  {}
+  else{
+  impl->arc_token_list_len = (size_t)(impl->arc_token_insert_start - impl->arc_token_list);
+  tmp_arc_token_list= NEW_ARRAY(arc_token,impl->arc_token_list_len, L("semgraph.wordgraph"));
+  memcpy(tmp_arc_token_list,impl->arc_token_list, impl->arc_token_list_len*sizeof(arc_token)); 
+  
+  impl->arc_token_freelist = NULL;
+  
+  FREE(impl->arc_token_list);
+  impl->arc_token_list = tmp_arc_token_list; 
+  }
+  return ESR_SUCCESS;
+}
+
+static ESR_ReturnCode serializeArcTokenInfoV2(SR_SemanticGraphImpl *impl,
+    PFile* fp)
+{
+  int i;
+  asr_uint32_t idx;
+  arcID tmp[32];
+
+  if (pfwrite(&impl->arc_token_list_len, 2, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  idx = PTR_TO_IDX(impl->arc_token_freelist, impl->arc_token_list);
+
+  if (pfwrite(&idx, 4, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  idx = PTR_TO_IDX(impl->arc_token_insert_start, impl->arc_token_list);
+  
+  if (pfwrite(&idx, 4, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  idx = 0;
+  if (pfwrite(&idx, 4, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  for (i = 0; i < impl->arc_token_list_len; ++i)
+  {
+    arc_token* token = &impl->arc_token_list[i];
+    tmp[0] = token->ilabel;
+    tmp[1] = token->olabel;
+    tmp[2] = ARC_TOKEN_IDX(impl->arc_token_list, token->first_next_arc);
+    tmp[3] = ARC_TOKEN_IDX(impl->arc_token_list, token->next_token_index);
+    if (pfwrite(tmp, sizeof(tmp[0]), 4, fp) != 4)
+      return ESR_WRITE_ERROR;
+  }
+
+  /* new, fixes load/save bug 2007 July 31 
+	todo: change 4 to sizeof(asr_uint32) */
+  if(1) {
+	asr_uint32_t idx[MAX_NUM_SLOTS];
+	for(i=0; i<MAX_NUM_SLOTS; i++) 
+		idx[i] = PTR_TO_IDX(impl->arcs_for_slot[i], impl->arc_token_list);
+	if (pfwrite(&idx, 4, MAX_NUM_SLOTS, fp) != MAX_NUM_SLOTS)
+			return ESR_WRITE_ERROR;
+  }
+
+  return ESR_SUCCESS;
+}
+
+static ESR_ReturnCode deserializeArcTokenInfoV2(SR_SemanticGraphImpl *impl,
+    PFile* fp)
+{
+  int i;
+  asr_uint32_t idx;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  arcID tmp[32];
+
+  if (pfread(&impl->arc_token_list_len, 2, 1, fp) != 1)
+  {
+    rc = ESR_READ_ERROR;
+    PLogError(L("ESR_READ_ERROR: could not read arc_token_list_len"));
+    return rc;
+  }
+
+  impl->arc_token_list = NEW_ARRAY(arc_token,
+                                   impl->arc_token_list_len,
+                                   L("semgraph.wordgraph"));
+
+  if (impl->arc_token_list == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    return ESR_OUT_OF_MEMORY;
+  }
+
+  if (pfread(&idx, 4, 1, fp) != 1)
+  {
+    rc = ESR_READ_ERROR;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  impl->arc_token_freelist = IDX_TO_PTR(idx, impl->arc_token_list);
+
+  if (pfread(&idx, 4, 1, fp) != 1)
+  {
+    rc = ESR_READ_ERROR;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  impl->arc_token_insert_start = IDX_TO_PTR(idx, impl->arc_token_list);
+  // impl->arc_token_insert_start = impl->arc_token_list + impl->arc_token_list_len; // Rabih's fix
+
+  if (pfread(&idx, 4, 1, fp) != 1)
+  {
+    rc = ESR_READ_ERROR;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  impl->arc_token_insert_end = 0;
+
+  for (i = 0; i < impl->arc_token_list_len; ++i)
+  {
+    arc_token* token = &impl->arc_token_list[i];
+    if (pfread(tmp, sizeof(tmp[0]), 4, fp) != 4)
+    {
+      rc = ESR_READ_ERROR;
+      goto CLEANUP;
+    }
+    token->ilabel = tmp[0];
+    token->olabel = tmp[1];
+    if (tmp[2] == MAXarcID)
+      token->first_next_arc = ARC_TOKEN_NULL;
+    else
+      token->first_next_arc = ARC_TOKEN_LNK(impl->arc_token_list, tmp[2]);
+    if (tmp[3] == MAXarcID)
+      token->next_token_index = ARC_TOKEN_NULL;
+    else
+      token->next_token_index = ARC_TOKEN_LNK(impl->arc_token_list, tmp[3]);
+  }
+
+  /* new, fixes load/save bug 2007 July 31 
+	todo: change 4 to sizeof(asr_uint32) */
+  if(1) {
+		asr_uint32_t idx[MAX_NUM_SLOTS];
+		if (pfread(&idx[0], 4, MAX_NUM_SLOTS, fp) != MAX_NUM_SLOTS) {
+			rc = ESR_READ_ERROR;
+			PLogError(ESR_rc2str(rc));
+			goto CLEANUP;
+		}
+		for(i=0; i<MAX_NUM_SLOTS; i++) 
+			impl->arcs_for_slot[i] = IDX_TO_PTR(idx[i], impl->arc_token_list);
+   }
+
+  return ESR_SUCCESS;
+
+CLEANUP:
+  FREE(impl->arc_token_list);
+  impl->arc_token_list =
+    impl->arc_token_freelist =
+      impl->arc_token_insert_start =
+        impl->arc_token_insert_end = NULL;
+  return rc;
+}
diff --git a/srec/Semproc/src/SemanticProcessor.c b/srec/Semproc/src/SemanticProcessor.c
new file mode 100644
index 0000000..57e3249
--- /dev/null
+++ b/srec/Semproc/src/SemanticProcessor.c
@@ -0,0 +1,29 @@
+/*---------------------------------------------------------------------------*
+ *  SemanticProcessor.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_SemprocPrefix.h"
+#include "SR_SemanticProcessor.h"
+#include "ESR_ReturnCode.h"
+#include "plog.h"
+
+//static const char* MTAG = __FILE__;
+
+/**
+ * SR_SemanticProcessorCreate is implemented in the SR_SemanticProcessorImpl.c file
+ */
diff --git a/srec/Semproc/src/SemanticProcessorImpl.c b/srec/Semproc/src/SemanticProcessorImpl.c
new file mode 100644
index 0000000..f44a3aa
--- /dev/null
+++ b/srec/Semproc/src/SemanticProcessorImpl.c
@@ -0,0 +1,1326 @@
+/*---------------------------------------------------------------------------*
+ *  SemanticProcessorImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_SemanticProcessor.h"
+#include "SR_SemanticProcessorImpl.h"
+#include "SR_SemanticGraphImpl.h"
+#include "SR_SemanticResultImpl.h"
+#include "ESR_ReturnCode.h"
+#include "plog.h"
+static const char* MTAG = __FILE__;
+
+/**************************************************
+
+    Internal data structures and functions
+
+  ************************************************/
+
+/**
+ * A partial path holds olables from a start arc, until it reaches a
+ * fork (i.e. multiple next arc possiblities). For each possibility
+ * a new partial path is created and concatenated to this one.
+ */
+typedef struct sem_partial_path_t
+{
+  struct sem_partial_path_t* next; /* linked list */
+  arc_token* arc_for_pp;           /* which arc was taken */
+}
+sem_partial_path;
+
+static sem_partial_path  sem_partial_paths[MAX_SEM_PARTIAL_PATHS];
+static sem_partial_path* sem_partial_path_freelist;
+#define DEBUG_CPF 0
+#if DEBUG_CPF
+static arc_token* debug_base_arc_token = 0;
+static int debug_depth = 0;
+const char* spaces(int n) { static char sp[1280]; int i; for(i=0;i<n;i++) sp[i]=' '; sp[i]=0;  return &sp[0]; }
+#endif
+
+/**
+ * A holder for accumulated scripts
+ */
+typedef struct script_t
+{
+  const LCHAR* expression;
+  const LCHAR* ruleName;
+}
+script;
+
+/**
+ * A list of accumulated scripts
+ */
+typedef struct script_list_t
+{
+  script list[MAX_SCRIPTS];
+  size_t num_scripts;
+}
+script_list;
+
+static const LCHAR* WORD_NOT_FOUND = L("word_not_found");
+
+/**
+ * Initialize the list of partial paths
+ */
+ESR_ReturnCode sem_partial_path_list_init();
+sem_partial_path* sem_partial_path_create();
+ESR_ReturnCode sem_partial_path_free(sem_partial_path* path);
+void sem_partial_path_print(sem_partial_path* path, sem_partial_path* paths, int npaths, wordmap* ilabels);
+
+/**
+ * Look up the word string given the id
+ */
+const LCHAR* lookUpWord(SR_SemanticGraphImpl* semgraph, wordID wdid);
+
+/**
+ * Look up the actual script string given the label
+ */
+const LCHAR* lookUpScript(SR_SemanticGraphImpl* semgraph, const LCHAR* script_label);
+
+/**
+ * Recursively accumulate the scripts
+ */
+ESR_ReturnCode accumulate_scripts(SR_SemanticGraphImpl* semgraph, script_list* scripts, sem_partial_path* path_root);
+
+ESR_ReturnCode interpretScripts(SR_SemanticProcessorImpl* semproc, LCHAR* scripts, SR_SemanticResult** result);
+
+
+ESR_ReturnCode SR_SemanticProcessorCreate(SR_SemanticProcessor** self)
+{
+  SR_SemanticProcessorImpl* impl;
+  ESR_ReturnCode rc;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = NEW(SR_SemanticProcessorImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  if ((rc = LA_Init(&impl->analyzer)) != ESR_SUCCESS)
+    goto CLEANUP;
+  if ((rc = EP_Init(&impl->parser)) != ESR_SUCCESS)
+    goto CLEANUP;
+  if ((rc = ST_Init(&impl->symtable)) != ESR_SUCCESS)
+    goto CLEANUP;
+  if ((rc = EE_Init(&impl->eval)) != ESR_SUCCESS)
+    goto CLEANUP;
+  impl->acc_scripts = MALLOC(sizeof(LCHAR) * MAX_SCRIPT_LEN, NULL);
+  if (impl->acc_scripts == NULL)
+  {
+    rc = ESR_OUT_OF_MEMORY;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  
+  impl->Interface.destroy = &SR_SemanticProcessor_Destroy;
+  impl->Interface.checkParse = &SR_SemanticProcessor_CheckParse;
+  impl->Interface.checkParseByWordID = &SR_SemanticProcessor_CheckParseByWordID;
+  impl->Interface.setParam = &SR_SemanticProcessor_SetParam;
+  impl->Interface.flush = &SR_SemanticProcessor_Flush;
+  
+  
+  *self = (SR_SemanticProcessor*) impl;
+  return ESR_SUCCESS;
+CLEANUP:
+  impl->Interface.destroy(&impl->Interface);
+  return rc;
+}
+
+ESR_ReturnCode SR_SemanticProcessor_Destroy(SR_SemanticProcessor* self)
+{
+  SR_SemanticProcessorImpl* impl = (SR_SemanticProcessorImpl*) self;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  LA_Free(impl->analyzer);
+  EP_Free(impl->parser);
+  ST_Free(impl->symtable);
+  EE_Free(impl->eval);
+  if (impl->acc_scripts != NULL)
+  {
+    FREE(impl->acc_scripts);
+    impl->acc_scripts = NULL;
+  }
+  FREE(impl);
+  
+  return ESR_SUCCESS;
+}
+
+
+ESR_ReturnCode append_with_check(LCHAR** dst, const LCHAR src, const LCHAR* end)
+{
+  if (*dst < end)
+  {
+    **dst = src;
+    ++(*dst);
+    return ESR_SUCCESS;
+  }
+  PLogError(L("ESR_BUFFER_OVERFLOW"));
+  return ESR_BUFFER_OVERFLOW;
+}
+
+const LCHAR* LSTRNCHR2(const LCHAR* text, LCHAR c, LCHAR c2, size_t len)
+{
+  for (; *text != c && *text != c2 && len > 0 && *text; text++, len--)
+    ;
+  if (len) return text;
+  else return NULL;
+}
+
+size_t get_next_token_len(const char* expr)
+{
+  const char *p;
+  
+  if (IS_OPERATOR(expr))
+  {
+    return 1;
+  }
+  else if (*expr == ';')
+  {
+    return 1;
+  }
+  else if (*expr == '\'')
+  {
+    /* a literal */
+    for (p = expr; *p != '\0'; p++)
+    {
+      if (*p == '\\' && *(p + 1) == '\'')
+      {
+        ++p;
+        continue;
+      }
+      if (p > expr && *p == '\'')
+      {
+        ++p;
+        break;
+      }
+    }
+    return p -expr;
+  }
+  else
+  {
+    for (p = expr; *p != '\0'; p++)
+    {
+      if (*p == '(')
+      {
+        ++p;
+        break;
+      }
+      else if (IS_OPERATOR(p) || *p == ';')
+      {
+        break;
+      }
+    }
+    return p -expr;
+  }
+}
+
+#define firstWord(transcription) transcription
+#define nextWord(transcription)  (transcription && *transcription ? &transcription[LSTRLEN(transcription)+1] : transcription)
+/* assumption is that transcription has been prepared (word split by NULL,
+   transcription ends with double NULL */
+
+ESR_ReturnCode checkpath_forwardByWordID(SR_SemanticGraphImpl* semgraph,
+    arc_token* atoken_start,
+    sem_partial_path *pp,
+    const wordID* wordIDs)
+{
+  // This is a recursive function that could go 10 levels deep on the stack so we save memory by making sure
+  // we place as few variables as possible on the stack.
+  union saveMemory_t
+  {
+    ESR_ReturnCode rc;
+    arc_token* atok_use;
+  } saveMemory;
+  
+  sem_partial_path* pp_branch;
+  arc_token* atok;
+  const wordID* currentWord = wordIDs;
+  
+  /*****************
+   * Recursive Part (operate on the next arc or the branch)
+   *****************/
+  for (atok = atoken_start; atok; atok = ARC_TOKEN_PTR(semgraph->arc_token_list, atok->next_token_index))
+  {
+#if DEBUG_CPF
+      printf("%strying arc %d %p ilabel%d(%s) olabel %d\n", spaces(debug_depth), atok-debug_base_arc_token, atok, 
+		  atok->ilabel, atok->ilabel!=MAXwordID?semgraph->ilabels->words[atok->ilabel]:"max",   atok->olabel);
+#endif
+    saveMemory.atok_use = NULL;
+    currentWord = wordIDs;
+    
+    if (atok->ilabel < semgraph->ilabels->num_slots && atok->ilabel != WORD_EPSILON_LABEL &&
+        wordmap_whether_in_rule(semgraph->ilabels, *currentWord, atok->ilabel))
+    {
+      /* atok->ilabel is the slotid */
+      saveMemory.atok_use = arc_tokens_find_ilabel(semgraph->arc_token_list, semgraph->arcs_for_slot[atok->ilabel], *currentWord);
+      if (!saveMemory.atok_use)
+      {
+        arc_token* a;
+        PLogError(L("ESR_INVALID_STATE: finding wdid %d in slot %d"), *currentWord, atok->ilabel);
+        for (a = semgraph->arcs_for_slot[atok->ilabel]; 0 && a; a = ARC_TOKEN_PTR(semgraph->arc_token_list, a->next_token_index))
+        {
+          PLogError(L("a %x ilabel %d olabel %d"), a, a->ilabel, a->olabel);
+        }
+        return ESR_INVALID_STATE;
+      }
+      else
+        ++currentWord;
+    }
+    else if (*currentWord != MAXwordID && atok->ilabel == *currentWord)
+    {
+      ++currentWord;
+      saveMemory.atok_use = atok;
+    }
+    else if (atok->ilabel == WORD_EPSILON_LABEL) /* more eps transitions */
+      saveMemory.atok_use = atok;
+      
+    if (saveMemory.atok_use == NULL)
+	continue;
+    else {
+      arc_token* atokfna = ARC_TOKEN_PTR(semgraph->arc_token_list, atok->first_next_arc);
+      pp_branch = sem_partial_path_create();
+      
+#if DEBUG_CPF
+      printf("%smatched arc %d %p ilabel%d(%s) olabel %d\n", spaces(debug_depth), atok-debug_base_arc_token, atok, 
+	     atok->ilabel, semgraph->ilabels->words[atok->ilabel],   atok->olabel); 
+#endif
+      
+      if (!pp_branch)
+        return ESR_INVALID_STATE;
+      pp->next = pp_branch;
+      pp->arc_for_pp = saveMemory.atok_use;
+      
+      if (atok->first_next_arc == ARC_TOKEN_NULL && *currentWord == MAXwordID)
+        return ESR_SUCCESS;
+      else if (atokfna && atokfna->ilabel==MAXwordID && atokfna->olabel==MAXwordID && *currentWord==MAXwordID)
+	return ESR_SUCCESS;
+      else 
+	{
+#if DEBUG_CPF
+	  sem_partial_path_print(pp_branch, &sem_partial_paths[0], MAX_SEM_PARTIAL_PATHS, semgraph->ilabels);
+	  debug_depth += 2;
+#endif
+	  saveMemory.rc = checkpath_forwardByWordID(semgraph, atokfna, pp_branch, currentWord);
+#if DEBUG_CPF
+	  debug_depth -= 2;
+#endif
+	  if (saveMemory.rc == ESR_SUCCESS) 
+	    return saveMemory.rc;
+	  else if (saveMemory.rc == ESR_INVALID_STATE)
+	    {
+	      /* if out-of-memory of other problem, then just abort */
+	      return ESR_INVALID_STATE;
+	    }
+	  else 
+	    {
+	      /* need to uncharge through epsilons, until pp->next==pp_branch */
+	      // sem_partial_path* qq = pp->next;
+	      sem_partial_path_free(pp->next);
+	      pp->arc_for_pp = NULL;
+	      // for (qq = pp->next; qq != pp_branch; qq = qq->next)  sem_partial_path_free(qq);
+	      pp->next = NULL;
+	    }
+	}
+    }
+#if DEBUG_CPF
+    printf("%sdone trying arc %d %p ilabel%d(%s) olabel %d\n", spaces(debug_depth), atok-debug_base_arc_token, atok, 
+	   atok->ilabel, semgraph->ilabels->words[atok->ilabel],   atok->olabel);
+#endif
+  } /* end for atok .. */
+  return ESR_NO_MATCH_ERROR;
+}
+
+
+ESR_ReturnCode checkpath_forward(SR_SemanticGraphImpl* semgraph,
+                                 arc_token* atoken_start,
+                                 sem_partial_path *pp,
+                                 const LCHAR* transcription)
+{
+  union saveMemory_t
+  {
+    ESR_ReturnCode rc;
+    arc_token* atok_use;
+  } saveMemory;
+  wordID wdID;
+  sem_partial_path* pp_branch;
+  arc_token* atok;
+  const LCHAR* transp;
+  
+  /*****************/
+  /* Recursive Part (operate on the next arc or the branch)*/
+  /*****************/
+  for (atok = atoken_start; atok; atok = ARC_TOKEN_PTR(semgraph->arc_token_list, atok->next_token_index))
+    {
+#if DEBUG_CPF
+      printf("%strying arc %d %p ilabel%d(%s) olabel %d\n", spaces(debug_depth), atok-debug_base_arc_token, atok, 
+		  atok->ilabel, atok->ilabel!=MAXwordID?semgraph->ilabels->words[atok->ilabel]:"max",   atok->olabel);
+#endif
+
+      saveMemory.atok_use = NULL;
+      transp = transcription;
+      wdID = wordmap_find_index(semgraph->ilabels, firstWord(transp));
+      
+      if (atok->ilabel < semgraph->ilabels->num_slots && atok->ilabel != WORD_EPSILON_LABEL &&
+	  wordmap_whether_in_rule(semgraph->ilabels, wdID, atok->ilabel))
+	{
+	  /* atok->ilabel is the slotid */
+	  saveMemory.atok_use = arc_tokens_find_ilabel(semgraph->arc_token_list, semgraph->arcs_for_slot[atok->ilabel], wdID);
+	  if (!saveMemory.atok_use)
+	    {
+	      arc_token* a;
+	      PLogError(L("ESR_INVALID_STATE: finding wdid %d in slot %d"), wdID, atok->ilabel);
+	      for (a = semgraph->arcs_for_slot[atok->ilabel]; 0 && a; a = ARC_TOKEN_PTR(semgraph->arc_token_list, a->next_token_index))
+		{
+		  PLogError(L("a %x ilabel %d olabel %d"), a, a->ilabel, a->olabel);
+		}
+	      return ESR_INVALID_STATE;
+	    }
+	  else {
+	    transp = nextWord(transp);
+	    wdID = wordmap_find_index(semgraph->ilabels, firstWord(transp));
+	  }
+	}
+      else if (wdID != MAXwordID && atok->ilabel == wdID)
+	{
+	  transp = nextWord(transp);
+	  wdID = wordmap_find_index(semgraph->ilabels, firstWord(transp));
+	  saveMemory.atok_use = atok;
+	}
+      else if (atok->ilabel == WORD_EPSILON_LABEL) /* more eps transitions */
+	saveMemory.atok_use = atok;
+      
+      if (saveMemory.atok_use == NULL)
+	continue;
+      else {
+	arc_token* atokfna = ARC_TOKEN_PTR(semgraph->arc_token_list, atok->first_next_arc);
+	pp_branch = sem_partial_path_create();
+
+#if DEBUG_CPF
+	 printf("%smatched arc %d %p ilabel%d(%s) olabel %d\n", spaces(debug_depth), atok-debug_base_arc_token, atok, 
+		atok->ilabel, semgraph->ilabels->words[atok->ilabel],   atok->olabel); 
+#endif
+
+	if (!pp_branch)
+	  return ESR_INVALID_STATE;
+	pp->next = pp_branch;
+	pp->arc_for_pp = saveMemory.atok_use;
+	if (atok->first_next_arc==ARC_TOKEN_NULL && *transp==0)
+	  return ESR_SUCCESS;
+	else if (atokfna && atokfna->ilabel==MAXwordID && atokfna->olabel==MAXwordID && *transp==0)
+	  return ESR_SUCCESS;
+	else 
+	  {
+#if DEBUG_CPF
+	    sem_partial_path_print(pp_branch, &sem_partial_paths[0], MAX_SEM_PARTIAL_PATHS, semgraph->ilabels);
+	    debug_depth += 2;
+#endif
+	    saveMemory.rc = checkpath_forward(semgraph, atokfna, pp_branch, transp);
+#if DEBUG_CPF
+	    debug_depth -= 2;
+#endif
+	    if (saveMemory.rc == ESR_SUCCESS) 
+	      return saveMemory.rc;
+	    else if (saveMemory.rc == ESR_INVALID_STATE)
+	      {
+		/* if out-of-memory of other problem, then just abort */
+		return ESR_INVALID_STATE;
+	      }
+	    else 
+	      {
+		/* need to uncharge through epsilons, until pp->next==pp_branch */
+		// sem_partial_path* qq = pp->next;
+		sem_partial_path_free(pp->next);
+		pp->arc_for_pp = NULL;
+		// for (qq = pp->next; qq != pp_branch; qq = qq->next)  sem_partial_path_free(qq);
+		pp->next = NULL;
+	      }
+	  }
+      }
+#if DEBUG_CPF
+      printf("%sdone trying arc %d %p ilabel%d(%s) olabel %d\n", spaces(debug_depth), atok-debug_base_arc_token, atok, 
+	     atok->ilabel, semgraph->ilabels->words[atok->ilabel],   atok->olabel);
+#endif
+    } /* end for atok .. */
+  return ESR_NO_MATCH_ERROR;
+}
+
+/**
+ * Parse the graph
+ */
+ESR_ReturnCode SR_SemanticProcessor_CheckParseByWordID(SR_SemanticProcessor* self,
+    SR_SemanticGraph* graph,
+    wordID* wordIDs,
+    SR_SemanticResult** results,
+    size_t* resultCount)
+{
+  sem_partial_path *path_root;
+  script_list raw_scripts_buf;
+  LCHAR lhs[MAX_STRING_LEN];
+  LCHAR meaning[MAX_STRING_LEN];      /* special key */
+  LCHAR ruleName[32];
+  size_t i, j, size, resultIdx;
+  LCHAR* dst = NULL;
+  LCHAR* p;
+  size_t tokenLen = 0;
+  const LCHAR* src;
+  HashMap* hashmap = NULL;
+  ESR_ReturnCode rc;
+  ESR_BOOL containsKey;
+  SR_SemanticProcessorImpl* semproc  = (SR_SemanticProcessorImpl*) self;
+  SR_SemanticGraphImpl* semgraph = (SR_SemanticGraphImpl*) graph;
+  
+  LSTRCPY(ruleName, L(""));
+  CHKLOG(rc, sem_partial_path_list_init());
+  path_root = sem_partial_path_create();
+  if (!path_root)
+  {
+    rc = ESR_INVALID_STATE;
+    goto CLEANUP;
+  }
+  
+  /**
+   * Parse the graph
+   */
+  rc = checkpath_forwardByWordID(semgraph, &semgraph->arc_token_list[0], path_root,
+                                 wordIDs);
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    *resultCount = 0;
+    return ESR_SUCCESS; /* did not parse */
+  }
+  else if (rc == ESR_SUCCESS)
+  {
+    if (*resultCount > 0)
+      *resultCount = 1;
+    else
+    {
+      /**
+       * If the array to hold the results is not big enough,
+       * then tell the user right away by returning ESR_BUFFER_OVERFLOW
+       with the size required returned in resultCount */
+      rc = ESR_BUFFER_OVERFLOW;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  else if (rc == ESR_INVALID_STATE)
+    goto CLEANUP;
+    
+#if DEBUG_CPF
+  sem_partial_path_print(path_root, &sem_partial_paths[0], MAX_SEM_PARTIAL_PATHS,semgraph->ilabels);
+#endif
+  
+  /* create the array of Semantic Result Pointers */
+  for (resultIdx = 0; resultIdx < *resultCount; resultIdx++)
+  {
+    raw_scripts_buf.num_scripts = 0;
+    for (i = 0; i < MAX_SCRIPTS; i++)
+    {
+      raw_scripts_buf.list[i].expression = 0;
+      raw_scripts_buf.list[i].ruleName = 0;
+    }
+    
+    /*
+    * Go through the partial paths which were successful and accumulate the scripts
+    * that you encountered (BUGGY)
+    */
+    CHKLOG(rc, accumulate_scripts(semgraph, &raw_scripts_buf, path_root));
+    CHKLOG(rc, sem_partial_path_free(path_root));
+    
+    /*pfprintf(PSTDOUT,"Accumulated scripts\n");*/
+    
+    /*
+    * Prepare the scripts for processing, in other words, make them "nice".
+    * What I mean by making them nice is to do stuff like:
+     *
+     * if ruleName is:   root}
+     *    expression is: meaning='hello';meaning=meaning+' '+'world';
+     *
+     * what I want to accumulate is
+     *    root.meaning='hello';root.meaning=root.meaning+' '+'world';
+     *
+     * I am basically replacing END_SCOPE_MARKER with '.'  and inserting 'root.'
+     * before every lhs identifier.
+     *
+     */
+    for (dst = &semproc->acc_scripts[0], semproc->acc_scripts[0] = '\0', i = 0; i < raw_scripts_buf.num_scripts; ++i)
+    {
+      if (raw_scripts_buf.list[i].ruleName && raw_scripts_buf.list[i].expression &&
+          raw_scripts_buf.list[i].ruleName != WORD_NOT_FOUND &&
+          raw_scripts_buf.list[i].expression != WORD_NOT_FOUND)
+      {
+        if (!LSTRCMP(raw_scripts_buf.list[i].expression, L(";")))
+          continue;
+        /* set the rule name in a temporary buffer and in the dst */
+        src = raw_scripts_buf.list[i].ruleName;
+        p = ruleName;
+        while (*src && *src != END_SCOPE_MARKER) /* trim off the trailing closing brace END_SCOPE_MARKER */
+        {
+          CHKLOG(rc, append_with_check(&dst, *src, &semproc->acc_scripts[MAX_SCRIPT_LEN-1]));
+          CHKLOG(rc, append_with_check(&p, *src, &ruleName[31]));
+          ++src;
+        }
+        
+        
+        /* put a dot after the rule name, and before the lhs */
+        CHKLOG(rc, append_with_check(&dst, L('.'), &semproc->acc_scripts[MAX_SCRIPT_LEN-1]));
+        CHKLOG(rc, append_with_check(&p, L('.'), &ruleName[31]));
+        
+        /* terminate the ruleName string */
+        CHKLOG(rc, append_with_check(&p, 0, &ruleName[31]));
+        
+        /* append the rest of the expression */
+        src = raw_scripts_buf.list[i].expression;
+        
+        while (ESR_TRUE)
+        {
+          /* get the LHS identifier, append to dst, and store temporarily
+            in lhs buffer*/
+          p = lhs;
+          while (*src && *src != '=')
+          {
+            CHKLOG(rc, append_with_check(&dst, *src, &semproc->acc_scripts[MAX_SCRIPT_LEN-1]));
+            CHKLOG(rc, append_with_check(&p, *src, &lhs[MAX_STRING_LEN-1]));
+            ++src;
+          }
+          /* terminate the lhs string */
+          CHKLOG(rc, append_with_check(&p, 0, &lhs[MAX_STRING_LEN-1]));
+          
+          /* prepend every occurrence of the LHS identifier with 'ruleName.'*/
+          for (; *src && *src != ';'; src += tokenLen)
+          {
+            const LCHAR* p2;
+            
+            tokenLen = get_next_token_len(src);
+            if (IS_LOCAL_IDENTIFIER(src, tokenLen)  /* || !LSTRCMP(token, lhs) */)
+            {
+              /* use p to copy stuff now */
+              p = ruleName;
+              while (*p)
+              {
+                /* prepend the rule name to the identifier */
+                CHKLOG(rc, append_with_check(&dst, *p, &semproc->acc_scripts[MAX_SCRIPT_LEN-1]));
+                ++p;
+              }
+            }
+            for (p2 = src; p2 < src + tokenLen; ++p2)
+              CHKLOG(rc, append_with_check(&dst, *p2, &semproc->acc_scripts[MAX_SCRIPT_LEN-1]));
+              
+          }
+          
+          /*
+          * In an expression there may be several statements, each perhaps with a
+          * new LHS identifier
+          */
+          
+          /* skip extra semicolons */
+          while (*src == ';')
+            ++src;
+          /* skip whitespace */
+          while (isspace(*src))
+            ++src;
+            
+          if (!*src)
+          {
+            /* if end of the expression */
+            /* terminate the eScript expression properly */
+            CHKLOG(rc, append_with_check(&dst, L(';'), &semproc->acc_scripts[MAX_SCRIPT_LEN-1]));
+            *dst = '\0';/* terminate the string, DO NOT DO ++ !!! possibility of next loop iteration
+                                       which will concatenate to the dst string */
+            break;
+          }
+          else
+          {
+            /* concat a single semi-colon */
+            CHKLOG(rc, append_with_check(&dst, L(';'), &semproc->acc_scripts[MAX_SCRIPT_LEN-1]));
+            p = ruleName;
+            while (*p)
+            {
+              /* prepend the rule name for the new statement */
+              CHKLOG(rc, append_with_check(&dst, *p, &semproc->acc_scripts[MAX_SCRIPT_LEN-1]));
+              ++p;
+            }
+          }
+        }
+      }
+    }
+    if (0) PLogMessage( L("Accumulated Scripts for:\n%s"), semproc->acc_scripts);
+    if (&results[resultIdx] != NULL) /* SemanticResultImpl assumed to have been created externally */
+      interpretScripts(semproc, semproc->acc_scripts, &results[resultIdx]);
+      
+    /**
+     * Fill in the 'meaning', if it is not there
+     *  map 'ROOT.meaning' to 'meaning'
+     *
+     * NOTE: I am reusing some vars even though the names are a little bit inappropriate.
+     */
+    hashmap = ((SR_SemanticResultImpl*)results[resultIdx])->results;
+    
+    LSTRCPY(meaning, L("meaning"));
+    CHKLOG(rc, hashmap->containsKey(hashmap, meaning, &containsKey));
+    if (!containsKey)
+    {
+      LSTRCPY(meaning, ruleName); /* the last rule name encountered is always the root */
+      LSTRCAT(meaning, L("meaning"));
+      CHKLOG(rc, hashmap->containsKey(hashmap, meaning, &containsKey));
+      
+      if (containsKey)
+      {
+        CHKLOG(rc, hashmap->get(hashmap, meaning, (void **)&p));
+        /* create a new memory location to hold the meaning... not the same as the other cause
+         I do not want memory destroy problems */
+        /* add one more space */
+        dst = MALLOC(sizeof(LCHAR) * (LSTRLEN(p) + 1), L("semproc.meaning"));
+        if (dst == NULL)
+        {
+          rc = ESR_OUT_OF_MEMORY;
+          PLogError(ESR_rc2str(rc));
+          goto CLEANUP;
+        }
+        LSTRCPY(dst, p);
+        rc = hashmap->put(hashmap, L("meaning"), dst);
+        if (rc != ESR_SUCCESS)
+        {
+          FREE(dst);
+          PLogError(ESR_rc2str(rc));
+          goto CLEANUP;
+        }
+        dst = NULL;
+      }
+      else
+      {
+        /*
+         * No meaning was provided, so just concat all the values that are associated with the ROOT rule
+         * (key name begins with ROOT)
+        */
+        meaning[0] = 0;
+        CHKLOG(rc, hashmap->getSize(hashmap, &size));
+        for (j = 0; j < size; j++)
+        {
+          CHKLOG(rc, hashmap->getKeyAtIndex(hashmap, j, &p));
+          if (LSTRSTR(p, ruleName) == p) /* key name begins with root ruleName */
+          {
+            CHKLOG(rc, hashmap->get(hashmap, p, (void **)&dst));
+            if (meaning[0] != 0) /* separate vals with space */
+            {
+              if (LSTRLEN(meaning) + 1 < MAX_STRING_LEN)
+                LSTRCAT(meaning, L(" "));
+              /* chopping the meaning is harmless */
+            }
+            if (LSTRLEN(meaning) + LSTRLEN(dst) < MAX_STRING_LEN)
+            {
+              /* strcat a max of 32 chars */
+              LCHAR* p, *pp;
+              for (pp = &meaning[0]; *pp != 0; pp++) ; /* scan to the end */
+              for (p = dst; *p != 0 && p - dst < 32;) *pp++ = *p++; /* catenate up to 32 chars */
+              *pp++ = 0; /* null terminate */
+              /* LSTRCAT(meaning,dst); */
+            }
+            /* chopping the meaning is harmless */
+          }
+        }
+        if (meaning[0] != 0)
+        {
+          dst = MALLOC(sizeof(LCHAR) * (LSTRLEN(meaning) + 1), L("semproc.meaning"));
+          if (dst == NULL)
+          {
+            rc = ESR_OUT_OF_MEMORY;
+            PLogError(ESR_rc2str(rc));
+            goto CLEANUP;
+          }
+          LSTRCPY(dst, meaning);
+          rc = hashmap->put(hashmap, L("meaning"), dst);
+          if (rc != ESR_SUCCESS)
+          {
+            FREE(dst);
+            PLogError(ESR_rc2str(rc));
+            goto CLEANUP;
+          }
+          dst = NULL;
+        }
+      }
+    }
+  }
+  
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+/**
+ * Parse the graph
+ */
+ESR_ReturnCode SR_SemanticProcessor_CheckParse(SR_SemanticProcessor* self,
+    SR_SemanticGraph* graph,
+    const LCHAR* transcription,
+    SR_SemanticResult** results,
+    size_t* resultCount)
+{
+  sem_partial_path *path_root;
+  script_list raw_scripts_buf;
+  LCHAR acc_scripts[MAX_SCRIPT_LEN];  /* the accumulated scripts */
+  LCHAR lhs[MAX_STRING_LEN];
+  LCHAR meaning[MAX_STRING_LEN];      /* special key */
+  LCHAR ruleName[MAX_STRING_LEN];
+  LCHAR prepared_transcription[MAX_STRING_LEN+1]; /*for final double null */
+  size_t i, j, size, resultIdx;
+  LCHAR* dst = NULL;
+  LCHAR* p = NULL;
+  size_t tokenLen = 0;
+  const LCHAR* src;
+  HashMap* hashmap = NULL;
+  ESR_ReturnCode rc;
+  ESR_BOOL containsKey;
+  SR_SemanticProcessorImpl* semproc  = (SR_SemanticProcessorImpl*) self;
+  SR_SemanticGraphImpl* semgraph = (SR_SemanticGraphImpl*) graph;
+  
+  LSTRCPY(ruleName, L(""));
+  CHKLOG(rc, sem_partial_path_list_init());
+  path_root = sem_partial_path_create();
+  if (!path_root)
+  {
+    rc = ESR_INVALID_STATE;
+    goto CLEANUP;
+  }
+  
+  /**
+   * prepare the transcription for processing
+   * split words by inserting NULL
+   * term by inserting double NULL at end
+   */
+  for (i = 0; transcription[i] && i < MAX_STRING_LEN - 2; i++)
+  {
+    if (transcription[i] == L(' '))
+      prepared_transcription[i] = 0;
+    else
+      prepared_transcription[i] = transcription[i];
+  }
+  prepared_transcription[i] = prepared_transcription[i+1] = 0; /* double null */
+  
+  /**
+   * Parse the graph
+   */
+#if DEBUG_CPF
+  debug_base_arc_token = &semgraph->arc_token_list[0];
+  debug_depth = 0;
+#endif
+  rc = checkpath_forward(semgraph, &semgraph->arc_token_list[0], path_root, prepared_transcription);
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    *resultCount = 0;
+    return ESR_SUCCESS; /* did not parse */
+  }
+  else if (rc == ESR_SUCCESS)
+  {
+    if (*resultCount > 0)
+      *resultCount = 1;
+    else
+    {
+      /**
+       * If the array to hold the results is not big enough,
+       * then tell the user right away by returning ESR_BUFFER_OVERFLOW
+       with the size required returned in resultCount */
+      rc = ESR_BUFFER_OVERFLOW;
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+  }
+  else if (rc == ESR_INVALID_STATE)
+    goto CLEANUP;
+    
+  /* create the array of Semantic Result Pointers */
+  for (resultIdx = 0; resultIdx < *resultCount; resultIdx++)
+  {
+    raw_scripts_buf.num_scripts = 0;
+    for (i = 0; i < MAX_SCRIPTS; i++)
+    {
+      raw_scripts_buf.list[i].expression = 0;
+      raw_scripts_buf.list[i].ruleName = 0;
+    }
+    
+    /*
+    * Go through the partial paths which were successful and accumulate the scripts
+    * that you encountered (BUGGY)
+    */
+    CHKLOG(rc, accumulate_scripts(semgraph, &raw_scripts_buf, path_root));
+    CHKLOG(rc, sem_partial_path_free(path_root));
+    
+    /*pfprintf(PSTDOUT,"Accumulated scripts\n");*/
+    
+    /*
+    * Prepare the scripts for processing, in other words, make them "nice".
+    * What I mean by making them nice is to do stuff like:
+     *
+     * if ruleName is:   root}
+     *    expression is: meaning='hello';meaning=meaning+' '+'world';
+     *
+     * what I want to accumulate is
+     *    root.meaning='hello';root.meaning=root.meaning+' '+'world';
+     *
+     * I am basically replacing END_SCOPE_MARKER with '.'  and inserting 'root.'
+     * before every lhs identifier.
+     *
+     */
+    for (dst = &acc_scripts[0], acc_scripts[0] = '\0', i = 0; i < raw_scripts_buf.num_scripts; ++i)
+    {
+      if (raw_scripts_buf.list[i].ruleName && raw_scripts_buf.list[i].expression &&
+          raw_scripts_buf.list[i].ruleName != WORD_NOT_FOUND &&
+          raw_scripts_buf.list[i].expression != WORD_NOT_FOUND)
+      {
+        if (!LSTRCMP(raw_scripts_buf.list[i].expression, L(";")))
+          continue;
+        /* set the rule name in a temporary buffer and in the dst */
+        src = raw_scripts_buf.list[i].ruleName;
+        p = ruleName;
+	/* trim off the trailing closing brace END_SCOPE_MARKER */
+        while (*src && *src != END_SCOPE_MARKER) 
+        {
+          CHKLOG(rc, append_with_check(&dst, *src, &acc_scripts[MAX_SCRIPT_LEN-1]));
+          CHKLOG(rc, append_with_check(&p, *src, &ruleName[MAX_STRING_LEN-1]));
+          ++src;
+        }
+        
+        
+        /* put a dot after the rule name, and before the lhs */
+        CHKLOG(rc, append_with_check(&dst, L('.'), &acc_scripts[MAX_SCRIPT_LEN-1]));
+        CHKLOG(rc, append_with_check(&p, L('.'), &ruleName[MAX_STRING_LEN-1]));
+        
+        /* terminate the ruleName string */
+        CHKLOG(rc, append_with_check(&p, 0, &ruleName[MAX_STRING_LEN-1]));
+        
+        /* append the rest of the expression */
+        src = raw_scripts_buf.list[i].expression;
+        
+        while (ESR_TRUE)
+        {
+          /* get the LHS identifier, append to dst, and store temporarily
+            in lhs buffer*/
+          p = lhs;
+          while (*src && *src != '=')
+          {
+            CHKLOG(rc, append_with_check(&dst, *src, &acc_scripts[MAX_SCRIPT_LEN-1]));
+            CHKLOG(rc, append_with_check(&p, *src, &lhs[MAX_STRING_LEN-1]));
+            ++src;
+          }
+          /* terminate the lhs string */
+          CHKLOG(rc, append_with_check(&p, 0, &lhs[MAX_STRING_LEN-1]));
+          
+          /* prepend every occurrence of the LHS identifier with 'ruleName.'*/
+          for (; *src && *src != ';'; src += tokenLen)
+          {
+            const LCHAR* p2;
+            
+            tokenLen = get_next_token_len(src);
+            if (IS_LOCAL_IDENTIFIER(src, tokenLen)  /* || !LSTRCMP(token, lhs) */)
+            {
+              /* use p to copy stuff now */
+              p = ruleName;
+              while (*p)
+              {
+                /* prepend the rule name to the identifier */
+                CHKLOG(rc, append_with_check(&dst, *p, &acc_scripts[MAX_SCRIPT_LEN-1]));
+                ++p;
+              }
+            }
+            for (p2 = src; p2 < src + tokenLen; ++p2)
+              CHKLOG(rc, append_with_check(&dst, *p2, &acc_scripts[MAX_SCRIPT_LEN-1]));
+          }
+          
+          /*
+          * In an expression there may be several statements, each perhaps with a
+          * new LHS identifier
+          */
+          
+          while (*src == ';')
+            ++src; /* skip the double triple... semi-colons*/
+            
+          if (!*src)
+          {
+            /* if end of the expression */
+            /* terminate the eScript expression properly */
+            CHKLOG(rc, append_with_check(&dst, L(';'), &acc_scripts[MAX_SCRIPT_LEN-1]));
+            *dst = '\0';/* terminate the string, DO NOT DO ++ !!! possibility of next loop iteration
+                                       which will concatenate to the dst string */
+            break;
+          }
+          else
+          {
+            /* concat a single semi-colon */
+            CHKLOG(rc, append_with_check(&dst, L(';'), &acc_scripts[MAX_SCRIPT_LEN-1]));
+            p = ruleName;
+            while (*p)
+            {
+              /* prepend the rule name for the new statement */
+              CHKLOG(rc, append_with_check(&dst, *p, &acc_scripts[MAX_SCRIPT_LEN-1]));
+              ++p;
+            }
+          }
+        }
+      }
+    }
+#if defined( SREC_ENGINE_VERBOSE_LOGGING)
+    PLogMessage(L("Accumulated Scripts for (%s):\n%s"), transcription, acc_scripts);
+#endif
+    if (&results[resultIdx] != NULL) /* SemanticResultImpl assumed to have been created externally */
+      interpretScripts(semproc, acc_scripts, &results[resultIdx]);
+      
+    /**
+     * Fill in the 'meaning', if it is not there
+     *  map 'ROOT.meaning' to 'meaning'
+     *
+     * NOTE: I am reusing some vars even though the names are a little bit inappropriate.
+     */
+    hashmap = ((SR_SemanticResultImpl*)results[resultIdx])->results;
+    
+    LSTRCPY(meaning, L("meaning"));
+    CHKLOG(rc, hashmap->containsKey(hashmap, meaning, &containsKey));
+    if (!containsKey)
+    {
+      LSTRCPY(meaning, ruleName); /* the last rule name encountered is always the root */
+      LSTRCAT(meaning, L("meaning"));
+      CHKLOG(rc, hashmap->containsKey(hashmap, meaning, &containsKey));
+      
+      if (containsKey)
+      {
+        CHKLOG(rc, hashmap->get(hashmap, meaning, (void **)&p));
+        /* create a new memory location to hold the meaning... not the same as the other cause
+         I do not want memory destroy problems */
+        /* add one more space */
+        dst = MALLOC(sizeof(LCHAR) * (LSTRLEN(p) + 1), L("semproc.meaning"));
+        if (dst == NULL)
+        {
+          rc = ESR_OUT_OF_MEMORY;
+          PLogError(ESR_rc2str(rc));
+          goto CLEANUP;
+        }
+        LSTRCPY(dst, p);
+        CHKLOG(rc, hashmap->put(hashmap, L("meaning"), dst));
+        dst = NULL;
+      }
+      else
+        /* absolutely no meaning was provided, so just concat all the values that are associated
+         * with the ROOT rule (key name begins with ROOT) */
+      {
+        meaning[0] = 0;
+        CHKLOG(rc, hashmap->getSize(hashmap, &size));
+        for (j = 0; j < size; j++)
+        {
+          CHKLOG(rc, hashmap->getKeyAtIndex(hashmap, j, &p));
+          if (LSTRSTR(p, ruleName) == p) /* key name begins with root ruleName */
+          {
+            CHKLOG(rc, hashmap->get(hashmap, p, (void **)&dst));
+            if (meaning[0] != 0) /* separate vals with space */
+              LSTRCAT(meaning, L(" "));
+            LSTRCAT(meaning, dst);
+          }
+        }
+        if (meaning[0] != 0)
+        {
+          dst = MALLOC(sizeof(LCHAR) * (LSTRLEN(meaning) + 1), L("semproc.meaning"));
+          if (dst == NULL)
+          {
+            rc = ESR_OUT_OF_MEMORY;
+            PLogError(ESR_rc2str(rc));
+            goto CLEANUP;
+          }
+          LSTRCPY(dst, meaning);
+          CHKLOG(rc, hashmap->put(hashmap, L("meaning"), dst));
+          dst = NULL;
+        }
+      }
+    }
+  }
+  
+  return ESR_SUCCESS;
+CLEANUP:
+  if (dst != NULL) FREE(dst);
+  return rc;
+}
+
+/**
+ * After parsing, interpret the acumulated scripts
+ */
+ESR_ReturnCode interpretScripts(SR_SemanticProcessorImpl* semproc, LCHAR* scripts, SR_SemanticResult** result)
+{
+  ESR_ReturnCode rc;
+  SR_SemanticResultImpl** impl = (SR_SemanticResultImpl**) result;
+  
+  if ((rc = LA_Analyze(semproc->analyzer, scripts)) == ESR_SUCCESS)
+  {
+    /****************************
+    * If all goes well, then the result
+     * will be written to the HashMap provided
+     ****************************/
+    if ((rc = EP_parse(semproc->parser, semproc->analyzer, semproc->symtable, semproc->eval, &((*impl)->results))) != ESR_SUCCESS)
+      pfprintf(PSTDOUT, "Semantic Result: Error (%s) could not interpret\n", ESR_rc2str(rc));
+  }
+  return rc;
+}
+
+
+
+
+
+/***************************************************************/
+/* PartialPath stuff                                           */
+/***************************************************************/
+
+ESR_ReturnCode sem_partial_path_list_init()
+{
+  /* nobody refers to me, therefore I am free */
+  int i;
+  for (i = 0; i < MAX_SEM_PARTIAL_PATHS - 1; i++)
+    sem_partial_paths[i].next = &sem_partial_paths[i+1];
+  sem_partial_paths[i].next = 0;
+  sem_partial_path_freelist = &sem_partial_paths[0];
+  return ESR_SUCCESS;
+}
+
+sem_partial_path* sem_partial_path_create()
+{
+  sem_partial_path* path;
+  if (sem_partial_path_freelist == NULL)
+  {
+    /* PLogError() is dangerous here, because the stack is very deep */
+    pfprintf(PSTDERR, "sem_partial_path_create() no more partial paths available (limit=%d)\n", MAX_SEM_PARTIAL_PATHS);
+    return NULL;
+  }
+  
+  path = sem_partial_path_freelist;
+  sem_partial_path_freelist = sem_partial_path_freelist->next;
+  
+  path->next = NULL;
+  path->arc_for_pp = NULL;
+  return path;
+}
+
+#if DEBUG_CPF
+void sem_partial_path_print(sem_partial_path* path, sem_partial_path* paths, int npaths, wordmap* ilabels)
+{
+  int i;
+  sem_partial_path* frompath = 0;
+  arc_token* a;
+  
+  if (!path)
+  {
+    printf("--- END ---\n");
+    return;
+  }
+  printf("path %p arc %d %p ", path, (path->arc_for_pp-debug_base_arc_token),
+         path->arc_for_pp);
+  if ((a = path->arc_for_pp) != NULL)
+  {
+    printf(" ilabel %d(%s) olabel %d\n",
+           a->ilabel, ilabels->words[a->ilabel],
+           a->olabel);
+  }
+  else
+  {
+    printf("\n");
+  }
+  printf(" from ");
+  for (i = 0; i < npaths; i++)
+  {
+    if (paths[i].next == path)
+    {
+      frompath = &paths[i];
+      break;
+    }
+  }
+  if (1)sem_partial_path_print(frompath, paths, npaths, ilabels);
+}
+#endif
+
+ESR_ReturnCode sem_partial_path_free(sem_partial_path* path)
+{
+  path->next = sem_partial_path_freelist;
+  sem_partial_path_freelist = path;
+  return ESR_SUCCESS;
+}
+
+/***********************************************************************/
+
+
+const LCHAR* lookUpWord(SR_SemanticGraphImpl* semgraph, wordID wdid)
+{
+  int wdID = wdid;
+  int mid_offset, upper_offset;
+  wordmap* mid_words;
+  wordmap* upper_words;
+  
+  if (wdID < 0 || wdID >= MAXwordID)
+    return WORD_NOT_FOUND;
+    
+  if (semgraph->scopes_olabel_offset < semgraph->script_olabel_offset)
+  {
+    mid_offset   = semgraph->scopes_olabel_offset;
+    mid_words    = semgraph->scopes_olabels;
+    upper_offset = semgraph->script_olabel_offset;
+    upper_words  = semgraph->scripts;
+  }
+  else
+  {
+    mid_offset   = semgraph->script_olabel_offset;
+    mid_words    = semgraph->scripts;
+    upper_offset = semgraph->scopes_olabel_offset;
+    upper_words  = semgraph->scopes_olabels;
+  }
+  
+  if (wdID < mid_offset && wdID < semgraph->ilabels->num_words)
+  {
+    return semgraph->ilabels->words[wdID];
+  }
+  else if (wdID >= mid_offset && wdID < upper_offset)
+  {
+    wdID -= mid_offset;
+    if (wdID >= 0 && wdID < mid_words->num_words)
+      return mid_words->words[wdID];
+  }
+  else if (wdID >= upper_offset && wdID < MAXwordID)
+  {
+    wdID -= upper_offset;
+    if (wdID >= 0 && wdID < upper_words->num_words)
+      return upper_words->words[wdID];
+  }
+  
+  return WORD_NOT_FOUND;
+}
+
+const LCHAR* lookUpScript(SR_SemanticGraphImpl* semgraph, const LCHAR* script_label)
+{
+  size_t index;
+  
+  index = atoi(&script_label[1]); /* skip the prepended '_' */
+  
+  if (index > semgraph->scripts->num_words)
+    return WORD_NOT_FOUND;
+  else
+    return semgraph->scripts->words[index];
+}
+
+PINLINE ESR_BOOL isnum(const LCHAR* str)
+{
+  if (!str || !*str)
+    return ESR_FALSE;
+    
+  while (*str)
+  {
+    if (!isdigit(*str))
+      return ESR_FALSE;
+    str++;
+  }
+  return ESR_TRUE;
+}
+
+
+ESR_ReturnCode accumulate_scripts(SR_SemanticGraphImpl* semgraph, script_list* scripts, sem_partial_path* path)
+{
+  size_t scope = 0;
+  arc_token* atok;
+  sem_partial_path* p;
+  const LCHAR* word;
+  size_t j;
+  ESR_ReturnCode rc;
+  
+  for (p = path; p != NULL; p = p->next)
+  {
+    atok = p->arc_for_pp;
+    if (atok == NULL)
+      continue;
+    else if (atok->ilabel == WORD_EPSILON_LABEL && atok->olabel == WORD_EPSILON_LABEL)
+      continue;
+    else if (atok->olabel != WORD_EPSILON_LABEL)
+    {
+      LCHAR* _tMp;
+      word = lookUpWord(semgraph, atok->olabel);
+      
+      if ( IS_BEGIN_SCOPE(word)) 
+        ++scope;
+      else if ( IS_END_SCOPE(word) ) 
+      {
+        j = scripts->num_scripts;
+        do
+        {
+          if (scripts->list[j].ruleName == (LCHAR*) scope) /* just an ID */
+            scripts->list[j].ruleName = word;
+          --j;
+        }
+        while (j != (size_t) - 1);
+        if (scope > 0)
+          --scope;
+        else
+        {
+          rc = ESR_INVALID_STATE;
+          PLogError(L("ESR_INVALID_STATE: Tried popping scope when it was zero"));
+          goto CLEANUP;
+        }
+      }
+      else
+      {
+        /* make sure it is actually a script */
+        if (wordmap_find_index(semgraph->scripts, word) != MAXwordID)
+        {
+          MEMCHK(rc, scripts->num_scripts, MAX_SCRIPTS);
+          scripts->list[scripts->num_scripts].expression = word;
+          scripts->list[scripts->num_scripts].ruleName = (LCHAR*) scope; /* just an ID */
+          ++scripts->num_scripts;
+        }
+        /* else ignore */
+      }
+    }
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_SemanticProcessor_SetParam(SR_SemanticProcessor* self, const LCHAR* key, const LCHAR* value)
+{
+  SR_SemanticProcessorImpl* impl = (SR_SemanticProcessorImpl*) self;
+  
+  if (self == NULL || key == NULL || value == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  return ST_putSpecialKeyValue(impl->symtable, key, value);
+  
+}
+
+ESR_ReturnCode SR_SemanticProcessor_Flush(SR_SemanticProcessor* self)
+{
+  SR_SemanticProcessorImpl* impl = (SR_SemanticProcessorImpl*) self;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return ST_reset_all(impl->symtable);
+}
diff --git a/srec/Semproc/src/SemanticResult.c b/srec/Semproc/src/SemanticResult.c
new file mode 100644
index 0000000..963ac5d
--- /dev/null
+++ b/srec/Semproc/src/SemanticResult.c
@@ -0,0 +1,66 @@
+/*---------------------------------------------------------------------------*
+ *  SemanticResult.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_SemanticResult.h"
+#include "SR_SemanticResultImpl.h"
+#include "plog.h"
+
+
+//static const char* MTAG = __FILE__;
+
+
+ESR_ReturnCode SR_SemanticResultGetKeyCount(SR_SemanticResult* self, size_t* count)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getKeyCount(self, count);
+}
+
+ESR_ReturnCode SR_SemanticResultGetKeyList(SR_SemanticResult* self, LCHAR** list, size_t* size)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getKeyList(self, list, size);
+}
+
+ESR_ReturnCode SR_SemanticResultGetValue(SR_SemanticResult* self, const LCHAR* key, LCHAR* value, size_t* len)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getValue(self, key, value, len);
+}
+
+ESR_ReturnCode SR_SemanticResultDestroy(SR_SemanticResult* self)
+{
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
diff --git a/srec/Semproc/src/SemanticResultImpl.c b/srec/Semproc/src/SemanticResultImpl.c
new file mode 100644
index 0000000..a801486
--- /dev/null
+++ b/srec/Semproc/src/SemanticResultImpl.c
@@ -0,0 +1,134 @@
+/*---------------------------------------------------------------------------*
+ *  SemanticResultImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_SemanticResult.h"
+#include "SR_SemanticResultImpl.h"
+#include <pmemory.h>
+#include "plog.h"
+
+
+static const char* MTAG = __FILE__;
+
+
+ESR_ReturnCode SR_SemanticResultCreate(SR_SemanticResult** self)
+{
+  SR_SemanticResultImpl* impl;
+  ESR_ReturnCode rc;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  impl = NEW(SR_SemanticResultImpl, MTAG);
+  if (impl == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  
+  impl->Interface.destroy = &SR_SemanticResult_Destroy;
+  impl->Interface.getKeyCount = &SR_SemanticResult_GetKeyCount;
+  impl->Interface.getKeyList = &SR_SemanticResult_GetKeyList;
+  impl->Interface.getValue = &SR_SemanticResult_GetValue;
+  impl->results = NULL;
+  
+  rc = HashMapCreate(&impl->results);
+  if (rc != ESR_SUCCESS)
+    goto CLEANUP;
+  *self = (SR_SemanticResult*) impl;
+  return ESR_SUCCESS;
+CLEANUP:
+  impl->Interface.destroy(&impl->Interface);
+  return rc;
+}
+
+ESR_ReturnCode SR_SemanticResult_GetKeyCount(SR_SemanticResult* self, size_t* count)
+{
+  SR_SemanticResultImpl* impl = (SR_SemanticResultImpl*) self;
+  ESR_ReturnCode rc;
+  
+  CHKLOG(rc, impl->results->getSize(impl->results, count));
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_SemanticResult_GetKeyList(SR_SemanticResult* self, LCHAR** list, size_t* count)
+{
+  SR_SemanticResultImpl* impl = (SR_SemanticResultImpl*) self;
+  LCHAR* theKey;
+  ESR_ReturnCode rc;
+  size_t size, i;
+    
+  CHKLOG(rc, HashMapGetSize(impl->results, &size));
+  
+  if (size > *count)
+  {
+    PLogError(L("ESR_BUFFER_OVERFLOW"));
+    *count = size;
+    return ESR_BUFFER_OVERFLOW;
+  }  
+  else if (list == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  *count = size;
+  for (i = 0; i < size; ++i)
+  {
+    CHKLOG(rc, HashMapGetKeyAtIndex(impl->results, i, &theKey));
+    list[i] = theKey;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_SemanticResult_GetValue(SR_SemanticResult* self, const LCHAR* key, LCHAR* value, size_t* len)
+{
+  SR_SemanticResultImpl* impl = (SR_SemanticResultImpl*) self;
+  LCHAR* theValue;
+  ESR_ReturnCode rc;
+  
+  CHKLOG(rc, impl->results->get(impl->results, key, (void **)&theValue));
+  if (LSTRLEN(theValue) + 1 > *len)
+  {
+    *len = LSTRLEN(theValue) + 1;
+    PLogError(L("ESR_BUFFER_OVERFLOW, requires len>=%d"), LSTRLEN(theValue) + 1);
+    return ESR_BUFFER_OVERFLOW;
+  }
+  LSTRCPY(value, theValue);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode SR_SemanticResult_Destroy(SR_SemanticResult* self)
+{
+  SR_SemanticResultImpl* impl = (SR_SemanticResultImpl*) self;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  
+  CHKLOG(rc, HashMapRemoveAndFreeAll(impl->results));
+  CHKLOG(rc, HashMapDestroy(impl->results));
+  FREE(impl);
+  return rc;
+CLEANUP:
+  return rc;
+}
diff --git a/srec/Semproc/src/SymbolTable.c b/srec/Semproc/src/SymbolTable.c
new file mode 100644
index 0000000..9d37877
--- /dev/null
+++ b/srec/Semproc/src/SymbolTable.c
@@ -0,0 +1,295 @@
+/*---------------------------------------------------------------------------*
+ *  SymbolTable.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SR_SymbolTable.h"
+#include "plog.h"
+#include "pmemory.h"
+
+
+static const char* MTAG = __FILE__;
+
+static LCHAR undefined_symbol[] = UNDEFINED_SYMBOL;
+
+ESR_ReturnCode ST_Init(SymbolTable **ptr)
+{
+  ESR_ReturnCode rc;
+  
+  if (ptr == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  *ptr = NEW(SymbolTable, MTAG);
+  
+  if (*ptr == NULL)
+  {
+    PLogError(L("ESR_OUT_OF_MEMORY"));
+    return ESR_OUT_OF_MEMORY;
+  }
+  CHKLOG(rc, HashMapCreate(&(*ptr)->hashmap));
+  
+  (*ptr)->num_special_symbols = 0;
+  
+  /* init the memory for the hashtable */
+  return ST_reset(*ptr);
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ST_Free(SymbolTable *self)
+{
+  ESR_ReturnCode rc;
+  
+  if (self == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  /* free all the slots that were used
+     and remove all hashtable entries */
+  ST_reset(self);
+  
+  /* delete the hash table */
+  if (self->hashmap)
+    CHKLOG(rc, HashMapDestroy(self->hashmap));
+    
+  /* delete the symbol table */
+  if (self != NULL)
+    FREE(self);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ST_putKeyValue(SymbolTable* self, LCHAR* key, LCHAR* value)
+{
+  Symbol* symbol;
+  LCHAR* buf;
+  ESR_ReturnCode rc;
+  
+  if (self == NULL || key == NULL || value == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  /* reuse the old entry if it exists
+   but if no old entry exists for this key then I need to create a new one */
+  rc = HashMapGet(self->hashmap, key, (void**) & buf);
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    CHKLOG(rc, ST_getSymbolSlot(self, &symbol));
+    
+    /* copy the key */
+    MEMCHK(rc, LSTRLEN(key), MAX_SEMPROC_KEY);
+    LSTRCPY(symbol->key, key);
+    
+    /* creates a new entry if it does not already exist */
+    CHKLOG(rc, HashMapPut(self->hashmap, symbol->key, symbol->value));
+    
+    /* for later */
+    buf = symbol->value;
+  }
+  else if (rc != ESR_SUCCESS)
+    return rc;
+    
+  if (LSTRLEN(value) >= MAX_SEMPROC_VALUE)
+    PLogError("Warning: chopping length of value len %d > %d (%s)\n", LSTRLEN(value), MAX_SEMPROC_VALUE, value);
+  LSTRNCPY(buf, value, MAX_SEMPROC_VALUE);
+  buf[MAX_SEMPROC_VALUE-1] = 0;
+  /* MEMCHK(rc, LSTRLEN(value), MAX_SEMPROC_VALUE);
+     LSTRCPY(buf, value); */
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ST_Copy(SymbolTable* self, HashMap* dst)
+{
+  static const LCHAR* _MTAG = L("semproc.st.copy");
+  size_t i, size;
+  LCHAR *pkey;
+  LCHAR *pvalue;
+  LCHAR *copyValue;
+  
+  if (!dst) return ESR_INVALID_ARGUMENT;
+  
+  HashMapGetSize(self->hashmap, &size);
+  for (i = 0;i < size;i++)
+  {
+    HashMapGetKeyAtIndex(self->hashmap, i, &pkey);
+    HashMapGet(self->hashmap, pkey, (void **)&pvalue);
+    /* add one more space */
+    copyValue = (LCHAR*) CALLOC(LSTRLEN(pvalue) + 1, sizeof(LCHAR), _MTAG);
+    if (!copyValue)
+    {
+      PLogError(L("ESR_OUT_OF_MEMORY"));
+      return ESR_OUT_OF_MEMORY;
+    }
+    LSTRCPY(copyValue, pvalue);
+    HashMapPut(dst, pkey, copyValue);
+  }
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ST_getKeyValue(SymbolTable* self, LCHAR* key, LCHAR** value)
+{
+  ESR_ReturnCode rc;
+  LCHAR *dot;
+  size_t i;
+  
+  if (self == NULL || key == NULL || value == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  rc = HashMapGet(self->hashmap, key, (void**)value);
+  
+  if (rc == ESR_SUCCESS || rc != ESR_NO_MATCH_ERROR)
+    return rc;
+    
+  if (rc == ESR_NO_MATCH_ERROR)
+  {
+    /* handle SPECIAL CASEs */
+    for (i = 0;i < self->num_special_symbols; i++)
+    {
+      /* try as is */
+      if (!LSTRCMP(key, self->SpecialSymbols[i].key))
+      {
+        *value = self->SpecialSymbols[i].value;
+        return ESR_SUCCESS;
+      }
+      
+      /* try without dot */
+      dot = LSTRCHR(key, L('.'));
+      if (dot)
+        key = ++dot;
+        
+      /* is it a match? */
+      if (!LSTRCMP(key, self->SpecialSymbols[i].key))
+      {
+        *value = self->SpecialSymbols[i].value;
+        return ESR_SUCCESS;
+      }
+    }
+  }
+  
+  *value = undefined_symbol;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode ST_getSymbolSlot(SymbolTable* ptr, Symbol** slot)
+{
+  ESR_ReturnCode rc;
+  
+  if (ptr == NULL || slot == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  *slot = ptr->next++;
+  MEMCHK(rc, ptr->next, &ptr->Symbols[MAX_SYMBOLS-1]);
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ST_reset(SymbolTable *ptr)
+{
+  int i;
+  ESR_ReturnCode rc;
+  
+  if (ptr == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  CHKLOG(rc, HashMapRemoveAll(ptr->hashmap));
+  ptr->next = &ptr->Symbols[0];
+  for (i = 0; i < MAX_SYMBOLS; i++)
+  {
+    ptr->Symbols[i].key[0] = 0;
+    ptr->Symbols[i].value[0] = 0;
+  }
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ST_reset_all(SymbolTable *ptr)
+{
+  int i;
+  ESR_ReturnCode rc;
+  
+  if (ptr == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  CHKLOG(rc, HashMapRemoveAll(ptr->hashmap));
+  ptr->next = &ptr->Symbols[0
+                           ];
+  for (i = 0; i < MAX_SYMBOLS; i++)
+  {
+    ptr->Symbols[i].key[0] = 0;
+    ptr->Symbols[i].value[0] = 0;
+  }
+  for (i = 0; i < MAX_SPECIAL_SYMBOLS; i++)
+  {
+    ptr->SpecialSymbols[i].key[0] = 0;
+    ptr->SpecialSymbols[i].value[0] = 0;
+  }
+  ptr->num_special_symbols = 0;
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode ST_putSpecialKeyValue(SymbolTable* self, const LCHAR* key, const LCHAR* value)
+{
+  size_t i;
+  
+  if (self == NULL || key == NULL || value == NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  /* see if already there, and overwrite */
+  for (i = 0;i < self->num_special_symbols;i++)
+  {
+    if (!LSTRCMP(self->SpecialSymbols[i].key, key))
+    {
+      LSTRCPY(self->SpecialSymbols[i].value, value);
+      return ESR_SUCCESS;
+    }
+  }
+  
+  if (self->num_special_symbols < MAX_SPECIAL_SYMBOLS)
+  {
+    LSTRCPY(self->SpecialSymbols[self->num_special_symbols].key, key);
+    LSTRCPY(self->SpecialSymbols[self->num_special_symbols].value, value);
+    ++self->num_special_symbols;
+    return ESR_SUCCESS;
+  }
+  PLogError(L("Semproc: Symbol table has too many special symbols"));
+  return ESR_BUFFER_OVERFLOW;
+}
diff --git a/srec/Session/Android.mk b/srec/Session/Android.mk
new file mode 100644
index 0000000..635315d
--- /dev/null
+++ b/srec/Session/Android.mk
@@ -0,0 +1,71 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/SR_Session.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+common_CFLAGS := \
+	-DSREC_SESSION_EXPORTS \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_EventLog \
+	libSR_Grammar \
+	libSR_Nametag \
+		
+common_TARGET:= libSR_Session
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/Session/include/SR_Session.h b/srec/Session/include/SR_Session.h
new file mode 100644
index 0000000..bbb1e72
--- /dev/null
+++ b/srec/Session/include/SR_Session.h
@@ -0,0 +1,59 @@
+/*---------------------------------------------------------------------------*
+ *  SR_Session.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SESSION_H
+#define __SR_SESSION_H
+
+
+
+#include "ESR_ReturnCode.h"
+#include "SR_SessionPrefix.h"
+#include "ptypes.h"
+
+/**
+ * @addtogroup SR_SessionModule SR_Session API functions
+ * - SR_Session inherits from @ref ESR_SessionTypeModule "ESR_SessionType." As a consequence,
+ *   you may invoke any @ref ESR_SessionTypeModule "ESR_SessionType" functions on it.
+ *   For example: @ref ESR_SessionGetSize "ESR_SessionGetSize(size)" is legal
+ *
+ * @{
+ */
+
+/**
+ * Initializes the SREC session.
+ *
+ * @param filename File to read session information from
+ * @return ESR_OPEN_ERROR if file cannot be opened; ESR_READ_ERROR if file cannot be read;
+ * ESR_OUT_OF_MEMORY if system is out of memory
+ */
+SREC_SESSION_API ESR_ReturnCode SR_SessionCreate(const LCHAR* filename);
+
+/**
+ * Destroys the SREC session.
+ *
+ * @return ESR_SUCCESS
+ */
+SREC_SESSION_API ESR_ReturnCode SR_SessionDestroy(void);
+
+/**
+ * @}
+ */
+
+
+#endif /* __SR_SESSION_H */
diff --git a/srec/Session/include/SR_SessionPrefix.h b/srec/Session/include/SR_SessionPrefix.h
new file mode 100644
index 0000000..a1efcec
--- /dev/null
+++ b/srec/Session/include/SR_SessionPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_SessionPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_SESSIONPREFIX_H
+#define __SR_SESSIONPREFIX_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_SESSION_EXPORTS
+#define SREC_SESSION_API PORT_EXPORT_DECL
+#else
+#define SREC_SESSION_API PORT_IMPORT_DECL
+#endif
+
+#endif /* __SR_SESSIONPREFIX_H */
diff --git a/srec/Session/src/SR_Session.c b/srec/Session/src/SR_Session.c
new file mode 100644
index 0000000..17dd04c
--- /dev/null
+++ b/srec/Session/src/SR_Session.c
@@ -0,0 +1,86 @@
+/*---------------------------------------------------------------------------*
+ *  SR_Session.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "ESR_Session.h"
+#include "SR_EventLog.h"
+#include "SR_Session.h"
+#include "plog.h"
+
+
+ESR_ReturnCode SR_SessionCreate(const LCHAR* filename)
+{
+  ESR_ReturnCode rc;
+  LCHAR baseDirectory[P_PATH_MAX];
+  LCHAR* fwdSlash;
+  LCHAR* backSlash;
+  ESR_BOOL exists;
+  SR_EventLog* eventLog = NULL;
+  size_t logLevel;
+  
+  CHKLOG(rc, ESR_SessionCreate(filename));
+  rc = ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &logLevel);
+  if (rc == ESR_SUCCESS)
+    CHKLOG(rc, SR_EventLogCreate(&eventLog));
+  else if (rc == ESR_NO_MATCH_ERROR)
+    CHKLOG(rc, ESR_SessionSetSize_t(L("SREC.Recognizer.osi_log_level"), 0));
+  else
+  {
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  LSTRCPY(baseDirectory, filename);
+  fwdSlash = LSTRRCHR(baseDirectory, '\\');
+  backSlash = LSTRRCHR(baseDirectory, '/');
+  
+  if (fwdSlash == NULL && backSlash == NULL)
+    LSTRCPY(baseDirectory, "");
+  else if (fwdSlash != NULL && fwdSlash > backSlash)
+    *(fwdSlash + 1) = L('\0');
+  else
+    *(backSlash + 1) = L('\0');
+  CHKLOG(rc, ESR_SessionSetLCHAR(L("parFile.baseDirectory"), baseDirectory));
+  return ESR_SUCCESS;
+CLEANUP:
+  if (ESR_SessionExists(&exists) == ESR_SUCCESS)
+  {
+    if (exists)
+      ESR_SessionDestroy();
+  }
+  return rc;
+}
+
+ESR_ReturnCode SR_SessionDestroy()
+{
+  ESR_ReturnCode rc;
+  SR_EventLog* eventLog = NULL;
+  
+  ESR_SessionGetProperty(L("eventlog"), (void **)&eventLog, TYPES_SR_EVENTLOG);
+  if (eventLog != NULL)
+  {
+    CHKLOG(rc, eventLog->destroy(eventLog));
+    ESR_SessionRemoveProperty(L("eventlog")); /* failure is ok */
+  }
+  
+  
+  CHKLOG(rc, ESR_SessionDestroy());
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
diff --git a/srec/Vocabulary/Android.mk b/srec/Vocabulary/Android.mk
new file mode 100644
index 0000000..5b3907c
--- /dev/null
+++ b/srec/Vocabulary/Android.mk
@@ -0,0 +1,71 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	src/Vocabulary.c \
+	src/VocabularyImpl.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+	$(ASR_ROOT_DIR)/seti/sltsEngine/include \
+
+common_CFLAGS := \
+	-DSREC_VOCABULARY_EXPORTS \
+	-DUSE_TTP \
+	-DUSE_FSM_DICT \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_G2P \
+	libSR_Core \
+
+common_TARGET:= libSR_Vocabulary
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/Vocabulary/include/SR_Vocabulary.h b/srec/Vocabulary/include/SR_Vocabulary.h
new file mode 100644
index 0000000..1a499f3
--- /dev/null
+++ b/srec/Vocabulary/include/SR_Vocabulary.h
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*
+ *  SR_Vocabulary.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_VOCABULARY_H
+#define __SR_VOCABULARY_H
+
+
+
+#include "ESR_Locale.h"
+#include "ESR_ReturnCode.h"
+#include "pstdio.h"
+#include "SR_VocabularyPrefix.h"
+
+
+/**
+ * @addtogroup SR_VocabularyModule SR_Vocabulary API functions
+ * A vocabulary maps words to their phonetic representation.
+ *
+ * @{
+ */
+
+/**
+ * A vocabulary maps words to their phonetic representation.
+ */
+typedef struct SR_Vocabulary_t
+{
+  /**
+  * Saves a vocabulary to file.
+  *
+  * @param self SR_Vocabulary handle
+  * @param filename File to write to
+  */
+  ESR_ReturnCode(*save)(struct SR_Vocabulary_t* self, const LCHAR* filename);
+  
+  /**
+   * Returns phonetic representation of word.
+   *
+   * @param self SR_Vocabulary handle
+   * @param word Word to check for
+	 * @param pronunciation [out] Phonetic representation of word
+	 * @param len [in/out] Length of value argument. If the return code is
+	 *            ESR_BUFFER_OVERFLOW, the required length is returned in this variable.
+   */
+  ESR_ReturnCode(*getPronunciation)(struct SR_Vocabulary_t* self, const LCHAR* word, LCHAR* pronunciation, size_t* len);
+  
+  /**
+   * Returns vocabulary locale.
+   *
+   * @param self SR_Vocabulary handle
+   * @param locale [out] Vocabulary locale
+   */
+  ESR_ReturnCode(*getLanguage)(struct SR_Vocabulary_t* self, ESR_Locale* locale);
+  
+  /**
+  * Destroys a Vocabulary.
+  *
+  * @param self SR_Vocabulary handle
+  */
+  ESR_ReturnCode(*destroy)(struct SR_Vocabulary_t* self);
+}
+SR_Vocabulary;
+
+/**
+ * @name Vocabulary creation
+ *
+ * There are two ways to generate a vocabulary:
+ *
+ * 1. Load a vocabulary from disk. Phonemes are retrieved from a lookup table,
+ *    and fall back on a TTP engine if necessary.
+ * 2. Create an empty vocabulary. Phonemes are retrieved exclusively from a TTP engine.
+ *
+ * @{
+ */
+
+/**
+ * Creates an empty Vocabulary using the specified language.
+ *
+ * @param locale
+ * @param self SR_Vocabulary handle
+ */
+SREC_VOCABULARY_API ESR_ReturnCode SR_VocabularyCreate(ESR_Locale locale, SR_Vocabulary** self);
+
+/**
+ * Loads a vocabulary from file.
+ *
+ * @param self SR_Vocabulary handle
+ * @param filename File to read from
+ * @todo In the future, read language from the underlying vocabulary file
+ */
+SREC_VOCABULARY_API ESR_ReturnCode SR_VocabularyLoad(const LCHAR* filename, SR_Vocabulary** self);
+
+/**
+ * @}
+ */
+
+/**
+ * Saves a vocabulary to file.
+ *
+ * @param self SR_Vocabulary handle
+ * @param filename File to write to
+ */
+SREC_VOCABULARY_API ESR_ReturnCode SR_VocabularySave(SR_Vocabulary* self, const LCHAR* filename);
+
+/**
+ * Adds word to vocabulary.
+ *
+ * @param self SR_Vocabulary handle
+ * @param word Word to be added
+ * @todo Function purpose is unclear
+ */
+SREC_VOCABULARY_API ESR_ReturnCode SR_VocabularyAddWord(SR_Vocabulary* self, const LCHAR* word);
+
+
+/**
+ * Returns vocabulary locale.
+ *
+ * @param self SR_Vocabulary handle
+ * @param locale [out] Vocabulary locale
+ */
+SREC_VOCABULARY_API ESR_ReturnCode SR_VocabularyGetLanguage(SR_Vocabulary* self, ESR_Locale* locale);
+
+/**
+ * Destroys a Vocabulary.
+ *
+ * @param self SR_Vocabulary handle
+ */
+SREC_VOCABULARY_API ESR_ReturnCode SR_VocabularyDestroy(SR_Vocabulary* self);
+
+/**
+ * Looks up a word to vocabulary.
+ *
+ * @param self SR_Vocabulary handle
+ * @param word Word to be added
+ * @param pronunciation resulting pronunication
+ * @param len [in/out] Length of phoeme argument. If the return code is ESR_BUFFER_OVERFLOW,
+ *            the required length is returned in this variable.
+ */
+SREC_VOCABULARY_API ESR_ReturnCode SR_VocabularyGetPronunciation(SR_Vocabulary* self, const LCHAR* word, LCHAR* pronunciation, size_t* len);
+
+/**
+ * @}
+ */
+
+/* To-Do: the following functions need to be removed.  The functions are still used in SR_NameTag.dll  */
+SREC_VOCABULARY_API ESR_ReturnCode SR_Vocabulary_etiinf_conv_multichar(ESR_Locale locale, const LCHAR* i, LCHAR* output, size_t max_len);
+SREC_VOCABULARY_API ESR_ReturnCode SR_Vocabulary_etiinf_conv_from_multichar(ESR_Locale locale, LCHAR* input, LCHAR* output);
+SREC_VOCABULARY_API ESR_ReturnCode SR_Vocabulary_etiinf_init_multichar(ESR_Locale locale);
+
+#endif /* __SR_VOCABULARY_H */
diff --git a/srec/Vocabulary/include/SR_VocabularyImpl.h b/srec/Vocabulary/include/SR_VocabularyImpl.h
new file mode 100644
index 0000000..a12cac6
--- /dev/null
+++ b/srec/Vocabulary/include/SR_VocabularyImpl.h
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*
+ *  SR_VocabularyImpl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SR_VOCABULARYIMPL_H
+#define __SR_VOCABULARYIMPL_H
+
+
+
+#include <stdlib.h>
+#include "ESR_ReturnCode.h"
+#include "HashMap.h"
+#ifdef USE_TTP
+#include "SWIslts.h"
+#endif /* USE_TTP */
+
+
+#include "simapi.h"
+
+/**
+ * Vocabulary implementation.
+ */
+typedef struct SR_VocabularyImpl_t
+{
+  /**
+   * Interface functions that must be implemented.
+   */
+  SR_Vocabulary Interface;
+  /**
+   * Legacy CREC vocabulary.
+   */
+  LCHAR* filename;
+  CA_Vocab* vocabulary;
+  /**
+   * Vocabulary locale.
+   */
+  ESR_Locale locale;
+  /**
+   * String to identify TTP language associated with locale.
+   */
+  LCHAR *ttp_lang;
+  
+#ifdef USE_TTP
+  /**
+   * Handle to a TTP engine.
+   */
+  SWIsltsHand hSlts;
+#endif /* USE_TTP */
+}
+SR_VocabularyImpl;
+
+
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularyCreateImpl(SR_Vocabulary** self);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularyLoadImpl(const LCHAR* filename, SR_Vocabulary** self);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularySaveImpl(SR_Vocabulary* self, const LCHAR* filename);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularyAddWordImpl(SR_Vocabulary* self, const LCHAR* word);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularyDeleteWordImpl(SR_Vocabulary* self, const LCHAR* word);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularyContainsWordImpl(SR_Vocabulary* self, const LCHAR* word, ESR_BOOL* result);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularyGetPronunciationImpl(SR_Vocabulary* self, const LCHAR* word, LCHAR* phoneme, size_t* len);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularyGetLanguageImpl(SR_Vocabulary* self, ESR_Locale* locale);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_VocabularyDestroyImpl(SR_Vocabulary* self);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_CreateG2P(SR_Vocabulary* self);
+/**
+ * Default implementation.
+ */
+ESR_ReturnCode SR_DestroyG2P(SR_Vocabulary* self);
+
+/* TODO change this later if we get other languages to support*/
+#define TTP_LANG(locale) locale == ESR_LOCALE_EN_US ? L("enu") : \
+                         locale == ESR_LOCALE_FR_FR ? L("fra") : \
+                         locale == ESR_LOCALE_DE_DE ? L("deu") : \
+                         locale == ESR_LOCALE_EN_GB ? L("eng") : \
+                         locale == ESR_LOCALE_JA_JP ? L("jpn") : \
+                         locale == ESR_LOCALE_NL_NL ? L("nln") : \
+                         locale == ESR_LOCALE_IT_IT ? L("ita") : \
+                         locale == ESR_LOCALE_ES_ES ? L("esp") : \
+                         locale == ESR_LOCALE_PT_PT ? L("ptp") : \
+                         L("enu")  /* en-us is default */
+
+#endif /* __SR_VOCABULARYIMPL_H */
diff --git a/srec/Vocabulary/include/SR_VocabularyPrefix.h b/srec/Vocabulary/include/SR_VocabularyPrefix.h
new file mode 100644
index 0000000..8ae220b
--- /dev/null
+++ b/srec/Vocabulary/include/SR_VocabularyPrefix.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  SR_VocabularyPrefix.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef NRVOCABULARYHEADER_H
+#define NRVOCABULARYHEADER_H
+
+
+
+#include "PortExport.h"
+
+#ifdef SREC_VOCABULARY_EXPORTS
+#define SREC_VOCABULARY_API PORT_EXPORT_DECL
+#else
+#define SREC_VOCABULARY_API PORT_IMPORT_DECL
+#endif
+
+#endif 
diff --git a/srec/Vocabulary/src/Vocabulary.c b/srec/Vocabulary/src/Vocabulary.c
new file mode 100644
index 0000000..6ae252c
--- /dev/null
+++ b/srec/Vocabulary/src/Vocabulary.c
@@ -0,0 +1,384 @@
+/*---------------------------------------------------------------------------*
+ *  Vocabulary.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "plog.h"
+#include "SR_Vocabulary.h"
+#include "SR_VocabularyImpl.h"
+
+
+ESR_ReturnCode SR_VocabularyCreate(ESR_Locale locale, SR_Vocabulary** self)
+{
+     SR_Vocabulary* Interface;
+     SR_VocabularyImpl* impl;
+     ESR_ReturnCode rc;
+
+     CHK(rc, SR_VocabularyCreateImpl(&Interface));
+     impl = (SR_VocabularyImpl*) Interface;
+     impl->locale = locale;
+     impl->ttp_lang = TTP_LANG(locale);
+
+#ifdef USE_TTP
+     /* impl->ttp_lang should be set to the current language before G2P is created */
+     rc = SR_CreateG2P(Interface);
+     if (rc != ESR_SUCCESS) 
+     {
+          SR_VocabularyDestroyImpl(Interface);
+          goto CLEANUP;
+     }
+#endif
+
+     *self = Interface;
+     return ESR_SUCCESS;
+ CLEANUP:
+     return rc;
+}
+
+ESR_ReturnCode SR_VocabularyLoad(const LCHAR* filename, SR_Vocabulary** self)
+{
+     SR_Vocabulary* Interface;
+     ESR_ReturnCode rc;
+
+     CHK(rc, SR_VocabularyLoadImpl(filename, &Interface));
+
+     *self = Interface;
+     return ESR_SUCCESS;
+ CLEANUP:
+     return rc;
+}
+
+ESR_ReturnCode SR_VocabularySave(SR_Vocabulary* self, const LCHAR* filename)
+{
+  if (self==NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->save(self, filename);
+}
+
+ESR_ReturnCode SR_VocabularyGetLanguage(SR_Vocabulary* self, ESR_Locale* locale)
+{
+  if (self==NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getLanguage(self, locale);
+}
+
+ESR_ReturnCode SR_VocabularyDestroy(SR_Vocabulary* self)
+{
+  if (self==NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->destroy(self);
+}
+
+ESR_ReturnCode SR_VocabularyGetPronunciation(SR_Vocabulary* self, const LCHAR* word, LCHAR* phoneme, size_t* len)
+{
+  if (self==NULL)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return self->getPronunciation(self, word, phoneme, len);
+}
+
+/****************************
+ * ETI to INFINITIVE Phoneme conversion stuff
+ */
+#define DICTIONARY_HANDLE void
+#define MAX_ESR_LOCALES 16
+#define MAX_LENGTH P_PATH_MAX
+static SR_Vocabulary* g_etiinf_pronguesser[MAX_ESR_LOCALES];
+const char*    g_etiinf_multichar[MAX_ESR_LOCALES][256];
+static int initted = 0;
+static int portable_initted = 0;
+
+ESR_ReturnCode SR_Vocabulary_etiinf_conv_multichar(ESR_Locale locale, const LCHAR* i, LCHAR* output, size_t max_len)
+{
+     const LCHAR** m;
+
+     //if (locale < 0) 
+     //     return ESR_INVALID_ARGUMENT;
+  
+     m = g_etiinf_multichar[locale];
+
+     for (*output='\0'; *i; ++i)
+     {
+          strcat(output, m[(int)*i]);
+          if (*(i+1)) 
+               strcat(output, " ");
+     }
+     return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Vocabulary_etiinf_conv_from_multichar(ESR_Locale locale, LCHAR* input, LCHAR* output)
+{
+
+     ESR_ReturnCode rc;
+     size_t i;
+     const LCHAR** m;
+
+     //if (locale < 0) 
+     //     return 1;
+
+     CHKLOG(rc, SR_Vocabulary_etiinf_init_multichar(locale));
+     m = g_etiinf_multichar[locale];
+
+     for (i=0; i<256; ++i)
+     {
+          if (m[i] && !LSTRCMP(m[i], input))
+          {
+               *output = (LCHAR) i;
+               return ESR_SUCCESS;
+          }
+     }
+     return ESR_NO_MATCH_ERROR;
+ CLEANUP:
+     return rc;
+}
+
+ESR_ReturnCode SR_Vocabulary_etiinf_init_multichar(ESR_Locale locale)
+{
+     size_t i;
+     const LCHAR** m;
+
+     //if (locale<0) 
+     //     return 1;
+  
+     m = &g_etiinf_multichar[locale][0];
+     for(i=0;i<255;i++)    m[i] = "";
+  
+     switch (locale)
+     {
+     case ESR_LOCALE_EN_US:
+     case ESR_LOCALE_EN_GB:
+          /* enu_d2f_fray_g.pht */
+          m['}']="um";  m['?']="OW";  m['~']="un";  m['@']="uh";  m['A']="EY";
+          m['C']="ch";  m['D']="dh";  m['E']="EE";  m['I']="AY";  m['J']="jnk";
+          m['L']="ul";  m['N']="ng";  m['O']="OH";  m['P']="ur";  m['S']="sh";
+          m['T']="th";  m['U']="OOH"; m['V']="UR";  m['Z']="zh";  m[']']="oh";
+          m['^']="ENV"; m['#']="sil"; m['a']="AA";  m['b']="b";   m['c']="eh";
+          m['d']="d";   m['e']="EH";  m['f']="f";   m[')']="AH";  m['g']="g";
+          m['h']="h";   m['i']="IH";  m['j']="j";   m[',']="AE";  m['k']="k";
+          m['l']="l";   m['m']="m";   m['/']="ee";  m['n']="n";   m['o']="AW";
+          m['p']="p";   m['q']="OO";  m['r']="r";   m['s']="s";   m['t']="t";
+          m['6']="ih";  m['u']="UH";  m['v']="v";   m['w']="w";   m['y']="y";
+          m['z']="z";   m['<']="OY";  m['{']="AWH";
+          break;
+     case ESR_LOCALE_FR_FR:
+          /* fra_t22_m.pht */
+          m['A']="ACI"; m[3]="OEE";   m[6]="OEN";   m['E']="EAC"; m['J']="jnk";
+          m['M']="gn";  m[16]="QQ";   m['N']="ng";  m['O']="OCI"; m[19]="AE";
+          m['S']="sh";  m['U']="UY";  m['W']="yw";  m['Y']="EN";  m['Z']="ge";
+          m[31]="OE";   m['^']="ENV"; m['#']="sil"; m['a']="AGR"; m['b']="b";
+          m['d']="d";   m['e']="ECI"; m['f']="f";   m[')']="AN";  m['g']="g";
+          m['i']="II";  m['k']="k";   m['l']="l";   m['m']="m";   m['n']="n";
+          m['o']="OO";  m['p']="p";   m['r']="r";   m['s']="s";   m['t']="t";
+          m['u']="UGR"; m['v']="v";   m['w']="w";   m['y']="y";   m['z']="z";
+          m['{']="ON";
+          break;
+
+     case ESR_LOCALE_DE_DE:
+          m['@']="utt"; m['A']="AH";  m[4]="eu";    m['C']="ich"; m[6]="EU";
+          m['E']="EH";  m['H']="ue";  m['I']="IH";  m['J']="jnk"; m['K']="ach";
+          m['N']="ng";  m['O']="OH";  m['S']="sch"; m['T']="hr";  m['U']="UH";
+          m['V']="UEH"; m['W']="wu";  m['Z']="zh";  m['[']="ott"; m['^']="ENV";
+          m['!']="att"; m['#']="sil"; m['a']="ATT"; m['b']="b";   m['c']="ett";
+          m['d']="d";   m['e']="ETT"; m['f']="f";   m['g']="g";   m['h']="h";
+          m['i']="ITT"; m['j']="j";   m[',']="AEH"; m['k']="k";   m['l']="l";
+          m['m']="m";   m['n']="n";   m['o']="OTT"; m['p']="p";   m['q']="UE";
+          m['r']="r";   m['s']="s";   m['t']="t";   m['6']="itt"; m['u']="UTT";
+          m['w']="w";   m['x']="@@";  m[':']="oe";  m['z']="z";   m['<']="OE";
+          m['{']="OEH";
+          break;
+     case ESR_LOCALE_ES_ES:
+          m['@']="uu";  m['C']="ch";  m['D']="rr";  m['E']="EY";  m['J']="jnk";
+          m['M']="ks";  m['N']="nn";  m['T']="Z";   m['[']="oo";  m['^']="ENV";
+          m['!']="aa";  m['#']="sil"; m['a']="AA";  m['b']="b";   m['c']="ee";
+          m['d']="d";   m['e']="EE";  m['f']="f";   m[')']="AU";  m['g']="g";
+          m['i']="II";  m['j']="j";   m['k']="k";   m['l']="l";   m['m']="m";
+          m['n']="n";   m['o']="OO";  m['p']="p";   m['r']="r";   m['s']="s";
+          m['6']="ii";  m['t']="t";   m['u']="UU";  m['w']="w";   m['y']="y";
+          break;
+     case ESR_LOCALE_NL_NL:
+          m['S']="S";   m['a']="a";   m['N']="nK";  m['d']="d";   m['E']="E";   
+          m['2']="ep";  m['j']="j";   m['y']="y";   m['Z']="Z";   m['u']="u";   
+          m['1']="AA";  m['k']="k";   m['g']="g";   m['t']="t";   m['e']="e";   
+          m['J']="jnk"; m['v']="v";   m['s']="s";   m['^']="ENV"; m['b']="b";   
+          m['I']="I";   m['G']="G";   m['z']="z";   m['w']="w";   m['$']="$";   
+          m['r']="r";   m['x']="x";   m['h']="h";   m['f']="f";   m['i']="i";   
+          m['A']="A";   m['6']="A%t"; m['O']="O";   m['n']="n";   m['3']="Ei";  
+          m['#']="sil"; m['m']="m";   m['8']="O%t"; m['l']="l";   m['4']="yy";  
+          m['p']="p";   m['5']="Au";  m['o']="o";   
+          break;
+     case ESR_LOCALE_IT_IT:
+          m['@']="uu";  m['A']="AI";  m['C']="ci";  m['E']="EI";  m['J']="jnk";
+          m['K']="rr";  m['M']="gi";  m['N']="gn";  m['O']="OI";  m[21]="gl";
+          m['S']="sci"; m['Y']="ETT"; m['[']="oo";  m['^']="ENV"; m['!']="aa";
+          m['#']="sil"; m['a']="AA";  m['b']="b";   m['c']="ee";  m['d']="d";
+          m['e']="EE";  m['f']="f";   m[')']="AU";  m['g']="g";   m['i']="II";
+          m['j']="j";   m['k']="k";   m['l']="l";   m['m']="m";   m['n']="n";
+          m['o']="OO";  m['p']="p";   m['r']="r";   m['s']="s";   m['t']="t";
+          m['6']="ii";  m['u']="UU";  m['v']="v";   m['w']="w";   m['z']="z";
+          m['{']="OTT";
+          break;
+     case ESR_LOCALE_PT_PT:
+          m['A']="ao";  m['B']="ojn"; m['E']="eh";  m['I']="ix";  m['J']="jnk";
+          m['L']="lj";  m['N']="nj";  m['O']="on";  m['R']="rr";  m['S']="sh";
+          m['U']="un";  m['Z']="zh";  m['^']="ENV"; m['#']="sil"; m['a']="a";
+          m['b']="b";   m['c']="ew";  m['d']="d";   m['e']="e";   m['f']="f";
+          m['g']="g";   m['h']="in";  m['i']="i";   m['j']="j";   m['k']="k";
+          m['l']="l";   m['m']="m";   m['n']="n";   m['1']="aj";  m['o']="o";
+          m['p']="p";   m['2']="ajn"; m['3']="an";  m['q']="iw";  m['r']="r";
+          m['4']="aw";  m['s']="s";   m['5']="awn"; m['t']="t";   m['6']="ax";
+          m['u']="u";   m['7']="axn"; m['v']="v";   m['8']="ej";  m['w']="w";
+          m['9']="en";  m['x']="ls";  m['y']="oj";  m['z']="z";
+          break;
+     case ESR_LOCALE_JA_JP:
+          return ESR_NOT_SUPPORTED;
+          break;
+     }
+     m['#']="iwt"; m['&']="&";
+  
+     return ESR_SUCCESS;
+}
+
+ESR_Locale SR_Vocabulary_etiinf_get_locale_or_exit(const LCHAR* language)
+    {
+    LCHAR local_chars[4];
+
+    /* language string comes from userdict/language.c, eg: en.us */
+    local_chars [0] = (char)tolower(language[0]);
+    local_chars [1] = (char)tolower(language[1]);
+    local_chars [2] = (char)tolower(language[2]);
+    local_chars [3] = (char)tolower(language[3]);
+
+    if ( memcmp ( local_chars, "enus", 4 ) == 0 )
+        return ESR_LOCALE_EN_US;
+    else if ( ( memcmp ( local_chars, "enuk", 4 ) == 0 ) || ( memcmp ( local_chars, "engb", 4 ) == 0 ) )
+        return ESR_LOCALE_EN_GB;
+    else if ( memcmp ( local_chars, "frfr", 4 ) == 0 )
+        return ESR_LOCALE_FR_FR;
+    else if ( memcmp ( local_chars, "dede", 4 ) == 0 )
+        return ESR_LOCALE_DE_DE;
+    else if ( memcmp ( local_chars, "ptpt", 4 ) == 0 )
+        return ESR_LOCALE_PT_PT;
+    else if ( memcmp ( local_chars, "nlnl", 4 ) == 0 )
+        return ESR_LOCALE_NL_NL;
+    else if ( memcmp ( local_chars, "itit", 4 ) == 0 )
+        return ESR_LOCALE_IT_IT;
+    else if ( memcmp ( local_chars, "eses", 4 ) == 0 )
+        return ESR_LOCALE_ES_ES;
+    else
+        {
+        PLogError(L("ESR_NOT_IMPLEMENTED (error getting locale for language '%s')"), language);
+        return ESR_NOT_IMPLEMENTED;
+        }
+    }
+
+ESR_ReturnCode SR_Vocabulary_etiinf_get_phonemes(const char *input, /* word to generate pronunciations for */
+                                                 const char* language,
+                                                 DICTIONARY_HANDLE *h,  	/* dictionary to search, in addition to table above */
+                                                 char **output_array, 		/* buffer to store pronunciations */
+                                                 unsigned int *num_prons, 	/* number of prounciations to be returned */
+                                                 unsigned int max_len, 	/* the length of each buffer line */
+                                                 unsigned int max_prons,	/* maximum number of pronunciations allowed */
+                                                 void *text_to_phoneme_data)	/* text to phoneme data */			  
+{
+     LCHAR raw_output[MAX_LENGTH];
+     size_t len;
+     int stat;
+     LCHAR *output = output_array[0]; /* will only generate one pronunciation from the rules */
+     ESR_ReturnCode rc;
+     ESR_Locale locale;
+  
+     locale = SR_Vocabulary_etiinf_get_locale_or_exit(language);
+
+     raw_output[0] = '\0';
+     *num_prons = 1;
+
+     if (initted == 0)
+     {
+          PLogError(L("DICT: NAV rules called but not initialized"));
+          *output = '\0';
+          return ESR_FATAL_ERROR;
+     }
+
+     /*PTHREAD_INIT_PRIVATE( pthread_key, pglobals, sizeof (GLOBALS), NULL );*/
+
+     len = MAX_LENGTH;
+     stat = (int)SR_VocabularyGetPronunciation( g_etiinf_pronguesser[locale], input, 
+                                                raw_output, &len);
+     if(stat != 0)
+     {
+          PLogError(L("DICT: SR_VocabularyGetPronunciation() failed"));
+          return ESR_FATAL_ERROR;
+     }
+     else 
+     {
+          /* convert the phoneme to multi char representation */
+          rc = SR_Vocabulary_etiinf_conv_multichar(locale, raw_output, output, max_len);
+          if (rc!=ESR_SUCCESS)
+          {
+               PLogError(L("DICT: failed to multichar output of SR_VocabularyGetPronounciation() %s"), raw_output);
+               return rc;
+          }
+     }
+     return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Vocabulary_etiinf_destroy_pronguesser( const char* language) 
+{
+     if (portable_initted == 1) 
+          PMemShutdown();
+     portable_initted = 0;
+     return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_Vocabulary_etiinf_init_pronguesser( const char* language)
+{
+     size_t i,j;
+     ESR_ReturnCode rc;
+     ESR_Locale locale;
+
+     if (!portable_initted)
+     {
+          rc = PMemInit();
+          if (rc!=ESR_SUCCESS)
+               return rc;
+          for (i=0; i<MAX_ESR_LOCALES; ++i)
+               g_etiinf_pronguesser[i] = 0;
+          for (i=0; i<MAX_ESR_LOCALES; ++i)
+               for (j=0; j<255; ++j)
+                    g_etiinf_multichar[i][j] = 0;
+          portable_initted = 1;
+     }
+  
+     locale = SR_Vocabulary_etiinf_get_locale_or_exit(language);
+  
+     CHKLOG(rc, SR_VocabularyCreate(locale, &g_etiinf_pronguesser[locale]));
+     CHKLOG(rc, SR_Vocabulary_etiinf_init_multichar(locale));
+     return ESR_SUCCESS;
+ CLEANUP:
+     return rc;
+}
diff --git a/srec/Vocabulary/src/VocabularyImpl.c b/srec/Vocabulary/src/VocabularyImpl.c
new file mode 100644
index 0000000..159ac4d
--- /dev/null
+++ b/srec/Vocabulary/src/VocabularyImpl.c
@@ -0,0 +1,639 @@
+/*---------------------------------------------------------------------------*
+ *  VocabularyImpl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ESR_Session.h"
+#include "SR_Vocabulary.h"
+#include "SR_VocabularyImpl.h"
+#include "passert.h"
+#include "plog.h"
+#include "ptypes.h"
+#include "pmemory.h"
+
+//#define DEBUG 1
+#define MAX_PRON_LEN 256
+#define MAX_WORD_LEN    40
+#define MTAG NULL
+#define MAX_PHONE_LEN 4
+#define DO_DEFER_LOADING_UNTIL_LOOKUPS 1
+
+static PINLINE LCHAR* get_first_word(LCHAR* curr, LCHAR* end);
+static PINLINE LCHAR* get_next_word(LCHAR* curr, LCHAR* end);
+static ESR_ReturnCode run_ttt(const LCHAR *input_sentence, LCHAR *output_sentence, int *text_length);
+
+#define MAX_NUM_PRONS 4
+LCHAR* LSTRDUP(const LCHAR* src)
+{
+  int len = LSTRLEN(src);
+  LCHAR* dst = CALLOC( (len+1), sizeof(LCHAR), "srec.Vocabulary.LSTRDUP");
+  LSTRCPY( dst,src);
+  return dst;
+}
+void LSTRFREE( LCHAR* src)
+{
+	FREE(src);
+}
+
+/**
+ * Creates a new vocabulary but does not set the locale.
+ *
+ * @param self SR_Vocabulary handle
+ */
+#ifdef USE_TTP
+ESR_ReturnCode SR_CreateG2P(SR_Vocabulary* self)
+{
+  ESR_ReturnCode      rc = ESR_SUCCESS;
+  SWIsltsResult       res = SWIsltsSuccess;
+  SR_VocabularyImpl * impl = (SR_VocabularyImpl*) self;
+  LCHAR               szG2PDataFile[P_PATH_MAX];
+  size_t              len = P_PATH_MAX;
+  ESR_BOOL                bG2P = ESR_TRUE;
+  
+     rc = ESR_SessionGetBool ( L("G2P.Available"), &bG2P );
+     if ( rc != ESR_SUCCESS )
+       {
+	 PLogError(L("ESR_FATAL_ERROR: ESR_SessionGetBool() - G2P.Available fails with return code %d\n"), rc);
+	 return rc;
+       }
+     if ( bG2P == ESR_FALSE )
+       {
+	 impl->hSlts = NULL;
+	 return ESR_SUCCESS;
+       }
+     
+     rc = ESR_SessionGetLCHAR ( L("G2P.Data"), szG2PDataFile, &len );
+     if ( rc != ESR_SUCCESS )
+       {
+	 PLogError(L("ESR_FATAL_ERROR: ESR_SessionGetLCHAR() - G2P.Data fails with return code %d\n"), rc);
+	 return rc;
+     }
+     rc = ESR_SessionPrefixWithBaseDirectory(szG2PDataFile, &len);
+     if ( rc != ESR_SUCCESS )
+       {
+	 PLogError(L("ESR_FATAL_ERROR: ESR_SessionPrefixWithBaseDirectory() - G2P.Data fails with return code %d\n"), rc);
+	 return rc;
+       }
+     
+     res = SWIsltsInit();
+     if (res == SWIsltsSuccess) 
+       {
+	 /* data_file: en-US-ttp.data */
+	 res = SWIsltsOpen(&(impl->hSlts), szG2PDataFile);
+	 if (res != SWIsltsSuccess) 
+	   {
+	     PLogError(L("ESR_FATAL_ERROR: SWIsltsOpen( ) fails with return code %d\n"), res);
+	     FREE(impl);
+	     return ESR_FATAL_ERROR;
+	   }
+       }
+     else 
+     {
+       PLogError(L("ESR_FATAL_ERROR: SWIsltsInit( ) fails with return code %d\n"), res);
+       FREE(impl);
+       return ESR_FATAL_ERROR;
+     }
+     return rc;
+}    
+
+ESR_ReturnCode SR_DestroyG2P(SR_Vocabulary* self)
+{
+  ESR_ReturnCode      rc = ESR_SUCCESS;
+  SWIsltsResult       res = SWIsltsSuccess;
+  SR_VocabularyImpl * impl = (SR_VocabularyImpl*) self;
+  ESR_BOOL                bG2P = ESR_TRUE;
+  
+  rc = ESR_SessionGetBool ( L("G2P.Available"), &bG2P );
+  if ( rc != ESR_SUCCESS )
+     {
+       PLogError(L("ESR_FATAL_ERROR: ESR_SessionGetBool() - G2P.Available fails with return code %d\n"), rc);
+       return rc;
+     }
+  if ( bG2P == ESR_FALSE || impl->hSlts == NULL)
+    {
+      return ESR_SUCCESS;
+    }
+  
+  res = SWIsltsClose(impl->hSlts);
+  if (res == SWIsltsSuccess) 
+    {
+      res = SWIsltsTerm();
+      if (res != SWIsltsSuccess) 
+	{
+	  PLogError(L("ESR_FATAL_ERROR: SWIsltsTerm( ) fails with return code %d\n"), res);
+	  rc = ESR_FATAL_ERROR;
+          }
+    }
+  else 
+    {
+      PLogError(L("ESR_FATAL_ERROR: SWIsltsClose( ) fails with return code %d\n"), res);
+      rc = ESR_FATAL_ERROR;
+    }
+  return rc;
+}
+#endif /* USE_TTP */
+
+/**
+ * Creates a new vocabulary but does not set the locale.
+ *
+ * @param self SR_Vocabulary handle
+ */
+ESR_ReturnCode SR_VocabularyCreateImpl(SR_Vocabulary** self)
+{
+  SR_VocabularyImpl* impl;
+  
+  if (self==NULL)
+    {
+      PLogError(L("ESR_INVALID_ARGUMENT"));
+      return ESR_INVALID_ARGUMENT;
+    }
+  impl = NEW(SR_VocabularyImpl, MTAG);
+  if (impl==NULL)
+    {
+      PLogError(L("ESR_OUT_OF_MEMORY"));
+      return ESR_OUT_OF_MEMORY;
+    }
+  
+  impl->Interface.save = &SR_VocabularySaveImpl;
+  impl->Interface.getPronunciation = &SR_VocabularyGetPronunciationImpl;
+     impl->Interface.getLanguage = &SR_VocabularyGetLanguageImpl;
+     impl->Interface.destroy = &SR_VocabularyDestroyImpl;
+     impl->vocabulary = NULL;
+     
+     *self = (SR_Vocabulary*) impl;
+     impl->hSlts = NULL;
+     return ESR_SUCCESS;
+}
+
+ESR_ReturnCode SR_VocabularyDestroyImpl(SR_Vocabulary* self)
+{
+  SR_VocabularyImpl* impl = (SR_VocabularyImpl*) self;
+  
+#ifdef USE_TTP
+  SR_DestroyG2P(self);
+#endif
+  
+     if (impl->vocabulary!=NULL)
+       {
+	 CA_UnloadDictionary(impl->vocabulary);
+	 CA_FreeVocabulary(impl->vocabulary);
+	 impl->vocabulary = NULL;
+       }
+	   LSTRFREE(impl->filename);
+     FREE(impl);
+     return ESR_SUCCESS;
+}
+
+ESR_ReturnCode sr_vocabularyloadimpl_for_real(SR_VocabularyImpl* impl)
+{
+	ESR_ReturnCode rc = ESR_SUCCESS;
+	ESR_BOOL sessionExists = ESR_FALSE;
+  LCHAR vocabulary[P_PATH_MAX];
+  size_t len;
+
+     impl->vocabulary = CA_AllocateVocabulary();
+     if (impl->vocabulary==NULL)
+       {
+	 rc = ESR_OUT_OF_MEMORY;
+	 PLogError(ESR_rc2str(rc));
+	 goto CLEANUP;
+       }
+     
+     CHKLOG(rc, ESR_SessionExists(&sessionExists));
+     
+     if (sessionExists)
+       {
+          LSTRCPY(vocabulary, impl->filename);
+          len = P_PATH_MAX;
+          CHKLOG(rc, ESR_SessionPrefixWithBaseDirectory(vocabulary, &len));
+       }
+     else 
+       LSTRCPY(vocabulary, impl->filename);
+     
+     CA_LoadDictionary(impl->vocabulary, vocabulary, L(""), &impl->locale);
+     if(impl->vocabulary->is_loaded == False /*(booldata)*/ ) {
+       CHKLOG(rc, ESR_INVALID_ARGUMENT);
+     }
+     impl->ttp_lang = TTP_LANG(impl->locale);
+
+#ifdef USE_TTP
+     rc = SR_CreateG2P((SR_Vocabulary*)impl);
+	 if (rc != ESR_SUCCESS) {
+          goto CLEANUP;
+     }
+#endif
+
+CLEANUP:
+	 return rc;
+}
+
+ESR_ReturnCode SR_VocabularyLoadImpl(const LCHAR* filename, SR_Vocabulary** self)
+{
+  SR_Vocabulary* Interface;
+  SR_VocabularyImpl* impl;
+  ESR_ReturnCode rc;
+     
+     CHK(rc, SR_VocabularyCreateImpl(&Interface));
+     impl = (SR_VocabularyImpl*) Interface;
+#if DO_DEFER_LOADING_UNTIL_LOOKUPS
+	 impl->vocabulary = NULL;
+	 impl->ttp_lang = NULL;
+	 impl->filename = LSTRDUP( filename); 
+	 impl->locale = ESR_LOCALE_EN_US; // default really
+	 impl->hSlts = NULL;
+#else
+	 impl->filename = LSTRDUP( filename);
+	 CHKLOG( rc, sr_vocabularyloadimpl_for_real( impl)); 
+#endif
+     
+     *self = Interface;
+     return ESR_SUCCESS;
+ CLEANUP:
+     Interface->destroy(Interface);
+     return rc;
+}
+
+ESR_ReturnCode SR_VocabularySaveImpl(SR_Vocabulary* self, const LCHAR* filename)
+{
+  /* TODO: complete */
+  return ESR_SUCCESS;
+}
+
+/* internal util function prototype */
+/* we split the string on all non-alphanum and "'" which
+is handled below */
+#define LSINGLEQUOTE L('\'')
+int split_on_nonalphanum(LCHAR* toSplit, LCHAR** end, const ESR_Locale locale) 
+{
+  int nsplits = 0;
+  LCHAR* _next = toSplit; 
+    while(*_next) 
+    { 
+		do {
+			if(*_next == LSINGLEQUOTE && locale == ESR_LOCALE_EN_US) {
+				if(_next[1] != 't' && _next[1] != 's') break;
+				else if( LISALNUM(_next[2])) break; // LISDIGIT
+				else { *_next++; continue; }
+			}
+			if(!*_next || !LISALNUM(*_next)) break;
+			*_next++;
+		} while(1);
+      // FORMERLY:  while(*_next && LISALNUM(*_next))     _next++; 
+
+      /* check if I am at the last word or not */ 
+      if(*_next) 
+      { 
+        *_next = 0; /* replace split_char with '\0' the word */ 
+		nsplits++;
+        _next++;    /* point to first char of next word */ 
+		*end = _next; /* we'll be push forward later, if there's content here!*/
+      } 
+      else 
+        *end = _next; 
+    } 
+	return nsplits;
+}
+
+void join(LCHAR* toJoin, LCHAR* end, LCHAR join_char) 
+{
+  LCHAR* _next;
+    for(_next = toJoin; _next<end; _next++) 
+		if(*_next == 0) *_next = join_char; 
+}
+
+size_t get_num_prons( const LCHAR* word_prons, const LCHAR** word_pron_ptr, int max_num_prons)
+{
+  int num_prons = 0;
+  while(word_prons && *word_prons) {
+    word_pron_ptr[ num_prons++] = word_prons;
+    if(num_prons >= max_num_prons) break;
+    while( *word_prons) word_prons++;
+    word_prons++;
+  }
+  return num_prons;
+}
+
+/* This function is used from multi-word phrases, such as "mike smith".  We 
+   build up the pronunication of the phrase, by appending the pronunciation 
+   of each word.  We need to handle the cases of multiple prons for "mike"
+   and multiple prons for "smith".  For simple cases we try to run faster 
+   code. */
+
+int append_to_each_with_joiner( LCHAR* phrase_prons, const LCHAR* word_prons, const LCHAR joiner, size_t max_len, size_t* len)
+{
+  LCHAR* word_pron_ptr[MAX_NUM_PRONS];
+  LCHAR* phrase_pron_ptr[MAX_NUM_PRONS];
+  LCHAR *dst, *max_dst;
+  const LCHAR *src;
+  size_t nphrase_prons = get_num_prons( phrase_prons, (const LCHAR**)phrase_pron_ptr, MAX_NUM_PRONS);
+  size_t nword_prons = get_num_prons( word_prons, (const LCHAR**)word_pron_ptr, MAX_NUM_PRONS);
+  max_dst = phrase_prons+max_len-3;
+
+  if( nword_prons == 0) 
+    return 0;
+  else if(nphrase_prons == 0) {
+	for(src=word_prons,dst=phrase_prons; src && *src; ) {
+		for( ; *src && dst<max_dst; ) {
+			*dst++ = *src++;
+		}
+      *dst++ = *src++; // copy the null
+    }
+    *dst = 0; // add a double-null
+	*len = dst-phrase_prons;
+    return 0;
+  }
+  else if(nphrase_prons == 1 && nword_prons == 1) {
+    for(dst=phrase_prons; *dst; ) dst++;
+    if(joiner!=L('\0')) *dst++ = joiner;
+    for(src=word_prons; *src && dst<max_dst; ) *dst++ = *src++;
+    *dst++ = 0;
+    *dst = 0; // add a double-null
+	*len = dst-phrase_prons;
+    return 0;
+  }
+  else  {
+    size_t i,j;
+    LCHAR *phrase_pron_dups[MAX_NUM_PRONS];
+    LCHAR *dst_good_end = phrase_prons+1;
+    for(i=0;i<nphrase_prons; i++) 
+      phrase_pron_dups[i] = LSTRDUP( phrase_pron_ptr[i]);
+    dst = phrase_prons;
+    for(i=0;i<nphrase_prons; i++) {
+      for(j=0; j<nword_prons; j++) {
+	for(src=phrase_pron_dups[i]; *src && dst<max_dst; ) *dst++=*src++;
+	if(dst>max_dst) break;
+	if(joiner!=L('\0')) *dst++ = joiner;
+	for(src=word_pron_ptr[j]; *src && dst<max_dst; ) *dst++=*src++;
+	if(dst>max_dst) break;
+	*dst++ = 0;
+	dst_good_end = dst;
+      }
+    }
+    *dst_good_end++ = 0; // double-null terminator
+    for(i=0; i<nphrase_prons; i++) LSTRFREE( phrase_pron_dups[i]);
+    return 0;
+  }
+}
+
+PINLINE LCHAR* get_first_word(LCHAR* curr, LCHAR* end)
+{
+  while(*curr==L('\0') && curr<end) curr++;
+  return curr;
+}
+
+PINLINE LCHAR* get_next_word(LCHAR* curr, LCHAR* end)
+{
+  while(*curr) curr++;
+  if(curr<end)  curr++;
+  while( !*curr && curr<end) curr++;
+  return curr;
+}
+
+/*
+  For each word in a phrase (words separated by spaces)
+  
+  if the complete word is in the dictionary
+  return pron
+  else 
+  if the word contains '_', split the word into parts
+  and check if parts are in the dictionary. 
+  if none of the parts are in the dictionary,
+  reassemble the parts and pass the whole thing to TTP
+  else
+  build the pron by concat of TTP pron and dictionary pron for individual parts
+*/
+ESR_ReturnCode SR_VocabularyGetPronunciationImpl(SR_Vocabulary* self, const LCHAR* phrase, LCHAR* pronunciation, size_t* pronunciation_len)
+{
+  SR_VocabularyImpl* impl = (SR_VocabularyImpl*) self;
+  /* copy of phrase */
+  LCHAR copy_of_phrase[MAX_PRON_LEN];
+  
+  /* pointer to curr phoneme output */
+  LCHAR* curr_phoneme = pronunciation;
+  // size_t pronunciation_len = *len;
+  
+  ESR_ReturnCode nEsrRes = ESR_SUCCESS;
+  int text_length;
+  size_t len;
+  int nsplits;
+  
+#ifdef USE_TTP
+  SWIsltsResult      res = SWIsltsSuccess;
+  SWIsltsTranscription  *pTranscriptions = NULL;
+  int nNbrOfTranscriptions = 0;
+#endif /* USE_TTP */
+  /* full inf pron after conversion */
+  LCHAR infpron[MAX_PRON_LEN];
+  LCHAR* p_infpron;
+  LCHAR* curr;     /* pointer to current word */
+  LCHAR* end = 0;   /* pointer to end of phrase */
+  
+  if(self == NULL || phrase == NULL)
+    {
+      PLogError(L("ESR_INVALID_ARGUMENT"));
+      return ESR_INVALID_ARGUMENT;
+    }
+  
+  if( LSTRLEN(phrase) >= MAX_PRON_LEN)
+	return ESR_ARGUMENT_OUT_OF_BOUNDS;
+
+#if DO_DEFER_LOADING_UNTIL_LOOKUPS
+  if( impl->vocabulary == NULL) {
+    CHKLOG( nEsrRes, sr_vocabularyloadimpl_for_real( impl)); 
+  }
+#endif
+    
+  /* by default, check the whole word entry first (regardless of underscores) */         
+  if( CA_GetEntryInDictionary(impl->vocabulary, phrase, pronunciation, (int*)&len, MAX_PRON_LEN)) {
+    // len includes the final null, but not the double-null
+    *pronunciation_len = LSTRLEN(pronunciation)+1; 
+    // look for double-null terminator
+    while( pronunciation[ (*pronunciation_len)] != L('\0')) 
+      *pronunciation_len += LSTRLEN( pronunciation + (*pronunciation_len)) + 1;
+    
+    return ESR_SUCCESS;
+  }
+  
+  /*************************/
+  /* split digit strings */
+  text_length = MAX_PRON_LEN;
+  nEsrRes = run_ttt(phrase, copy_of_phrase, &text_length);
+  if (nEsrRes != ESR_SUCCESS)
+    {
+      PLogError(L("ESR_FATAL_ERROR: run_ttt( ) fails with return code %d\n"), nEsrRes);
+      return nEsrRes;
+    }
+  
+  len = 0;  
+  *curr_phoneme = L('\0');
+  if( *pronunciation_len>=12) curr_phoneme[1] = L('\0');
+  else return ESR_INVALID_ARGUMENT;
+  
+  /*************************/
+  /* split into word parts */
+  nsplits = split_on_nonalphanum(copy_of_phrase, &end, impl->locale);
+  
+  /******************************************************/
+  /* if none of the words are found in the dictionary, then 
+     reassemble and get the TTP pron for the whole thing */
+  curr=get_first_word(copy_of_phrase,end);
+  /* check if there are any valid characters at all */
+  if(!curr || !*curr) 
+    return ESR_INVALID_ARGUMENT;
+  /* now loop over all words in the phrase */
+  for(   ; *curr; curr = get_next_word(curr,end))
+    { 
+      LCHAR* squote = NULL;
+      p_infpron = infpron;
+      
+      /* by default, check the whole word entry first (regardless of LSINGLEQUOTE) */         
+      if(CA_GetEntryInDictionary(impl->vocabulary, curr, p_infpron, (int*)&len, MAX_PRON_LEN))
+        {
+          /* concatenate, and insert join_char between words */
+          append_to_each_with_joiner( pronunciation, p_infpron, OPTSILENCE_CODE, MAX_PRON_LEN, &len);
+        }
+      else { 
+        p_infpron[0] = 0; 
+        /* if this is English AND we're dealing with a quote (possessive or a 
+           contraction), then we use the dictionary for the stuff before the
+           quote, and use the TTP to find out what single phoneme should 
+           correspond the the thing after the quote ('s' or 't').  This keeps
+           the code clean (no phoneme codes here), and maps 's' to 's' or 'z' 
+           with the intelligence of the G2P engine */
+        if( impl->locale == ESR_LOCALE_EN_US) { 
+          if( (squote=LSTRCHR(curr,LSINGLEQUOTE))==NULL) {}
+          else {
+            *squote = L('\0');   // temporary
+            if( CA_GetEntryInDictionary(impl->vocabulary, curr, p_infpron, (int*)&len, MAX_PRON_LEN)) {
+            } else 
+              p_infpron[0] = 0;
+            *squote = LSINGLEQUOTE; // undo temporary
+          }
+        }
+#ifdef USE_TTP
+        pTranscriptions = NULL;
+        if (impl->hSlts) 
+          {
+            res = SWIsltsG2PGetWordTranscriptions(impl->hSlts, curr, &pTranscriptions, &nNbrOfTranscriptions);
+            if (res != SWIsltsSuccess) {
+              PLogError(L("ESR_FATAL_ERROR: SWIsltsG2PGetWordTranscriptions( ) fails with return code %d\n"), res);
+              return ESR_FATAL_ERROR;
+            }
+            if( impl->locale == ESR_LOCALE_EN_US && p_infpron[0] && squote!=L('\0')) {
+              const LCHAR* lastPhoneme = pTranscriptions[0].pBuffer;
+              while(lastPhoneme && *lastPhoneme && lastPhoneme[1]!=L('\0'))
+                lastPhoneme++;
+              append_to_each_with_joiner( pronunciation, p_infpron, OPTSILENCE_CODE, MAX_PRON_LEN, &len);
+              append_to_each_with_joiner( pronunciation, lastPhoneme, L('\0'), MAX_PRON_LEN, &len);
+            } else {
+              /* only one transcription available from seti */
+              p_infpron = pTranscriptions[0].pBuffer;
+              append_to_each_with_joiner( pronunciation, p_infpron, OPTSILENCE_CODE, MAX_PRON_LEN, &len);
+#if defined(SREC_ENGINE_VERBOSE_LOGGING)
+              PLogError("L: used G2P for %s", curr);
+#endif
+              
+            }
+            if (pTranscriptions) {
+              res = SWIsltsG2PFreeWordTranscriptions(impl->hSlts, pTranscriptions);
+              pTranscriptions = NULL;
+              if (res != SWIsltsSuccess) {
+                PLogError(L("ESR_FATAL_ERROR: SWIsltsG2PFreeWordTranscriptions( ) fails with return code %d\n"), res);
+                return ESR_FATAL_ERROR;
+              }
+            }
+          } else {
+            nEsrRes = ESR_INVALID_ARGUMENT;
+            PLogError(L("ESR_INVALID_ARGUMENT: impl->hSlts was not configured!"));
+            return nEsrRes;
+          }
+#else /* USE_TTP */
+        nEsrRes = ESR_INVALID_ARGUMENT;
+        PLogError(L("ESR_INVALID_ARGUMENT: need USE_TTP build to guess pronunciations!"));
+        return nEsrRes;
+#endif
+      } /* multi-word phrase */
+    } /* loop over words in phrase */
+  len = LSTRLEN(pronunciation)+1; 
+  // look for double-null terminator
+  while( pronunciation[ len] != L('\0')) 
+    len += LSTRLEN( pronunciation + len) + 1;
+  *pronunciation_len = len;
+  nEsrRes = ESR_SUCCESS;
+ CLEANUP:
+  return nEsrRes;
+}
+
+ESR_ReturnCode SR_VocabularyGetLanguageImpl(SR_Vocabulary* self, ESR_Locale* locale)
+{
+  SR_VocabularyImpl* impl = (SR_VocabularyImpl*) self;
+  
+  *locale = impl->locale;
+  return ESR_SUCCESS;
+}
+
+/* simple text normalization rountine for splitting up any digit string */ 
+static ESR_ReturnCode run_ttt(const LCHAR *input_sentence, LCHAR *output_sentence, int *text_length)
+{
+  ESR_ReturnCode         nRes = ESR_SUCCESS;
+  int                    num_out = 0;
+  int                    max_text_length = *text_length / sizeof(LCHAR) - 1;
+  ESR_BOOL                   bDigit = False;
+  
+  while (*input_sentence != L('\0')) {
+    if (num_out + 2 >= max_text_length) {
+      nRes = ESR_FATAL_ERROR;
+      goto CLEAN_UP;
+    }
+    
+    if (L('0') <= *input_sentence && *input_sentence <= L('9')) {
+      if (num_out > 0 && !LISSPACE(output_sentence[num_out-1]) ) {
+		  // put 1 space before digits
+        output_sentence[num_out] = L(' ');
+        num_out++;
+		while( LISSPACE(*input_sentence) ) input_sentence++;
+      }
+      output_sentence[num_out] = *input_sentence;
+      num_out++;
+      bDigit = True;
+    }
+    else {
+      if (bDigit == True && !LISSPACE(output_sentence[num_out-1])) {
+		// put 1 space after digits
+        output_sentence[num_out] = L(' ');
+        num_out++;
+		while( LISSPACE(*input_sentence)) input_sentence++;
+      }
+		output_sentence[num_out] = *input_sentence;
+		num_out++;
+      bDigit = False;
+    }
+    input_sentence++;
+	if( LISSPACE(output_sentence[num_out-1])) 
+		while(LISSPACE(*input_sentence )) input_sentence++; // remove repeated spaces
+  }
+  
+  output_sentence[num_out] = L('\0');
+  *text_length = num_out * sizeof(LCHAR);
+  return ESR_SUCCESS;
+  
+ CLEAN_UP:
+  
+  *output_sentence = L('\0');
+  *text_length = 0;
+  return nRes;
+}
diff --git a/srec/ca/Android.mk b/srec/ca/Android.mk
new file mode 100644
index 0000000..829e9d3
--- /dev/null
+++ b/srec/ca/Android.mk
@@ -0,0 +1,123 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+common_SRC_FILES:= \
+	acc_basi.c \
+	cnfd_scr.c \
+	par_basi.c \
+	pat_basi.c \
+	rec_basi.c \
+	rec_load.c \
+	rec_nbes.c \
+	rec_resu.c \
+	syn_srec.c \
+	utt_basi.c \
+	utt_data.c \
+	utt_proc.c \
+	voc_basi.c \
+	\
+	../cfront/ca_cms.c \
+	../cfront/ca_front.c \
+	../cfront/ca_wave.c \
+	../cfront/cheldsp4.c \
+	../cfront/chelfep.c \
+	../cfront/chelmel4.c \
+	../cfront/frontobj.c \
+	../cfront/frontpar.c \
+	../cfront/log_tabl.c \
+	../cfront/sp_fft.c \
+	../cfront/spec_anl.c \
+	../cfront/wav_acc.c \
+	\
+	../clib/cnorm_tr.c \
+	../clib/fpi_tgt.c \
+	../clib/imeld_rd.c \
+	../clib/imeld_tr.c \
+	../clib/jacobi.c \
+	../clib/log_add.c \
+	../clib/matrix_i.c \
+	../clib/matx_ops.c \
+	../clib/specnorm.c \
+	../clib/srec_arb.c \
+	../clib/swicms.c \
+	../clib/swimodel.c \
+	../clib/voc_read.c \
+	../clib/voicing.c \
+	\
+	../crec/astar.c \
+	../crec/astar_pphash.c \
+	../crec/c47mulsp.c \
+	../crec/get_fram.c \
+	../crec/priority_q.c \
+	../crec/rec_norm.c \
+	../crec/srec.c \
+	../crec/srec_context.c \
+	../crec/srec_debug.c \
+	../crec/srec_eosd.c \
+	../crec/srec_initialize.c \
+	../crec/srec_results.c \
+	../crec/srec_stats.c \
+	../crec/srec_tokens.c \
+	../crec/text_parser.c \
+	../crec/word_lattice.c \
+#	../crec/comp_stats.c \
+
+common_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/clib \
+	$(ASR_ROOT_DIR)/srec/cfront \
+
+common_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+common_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+
+common_STATIC_LIBRARIES := \
+	libzipfile \
+	libunz \
+
+common_TARGET:= libSR_Core
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+LOCAL_STATIC_LIBRARIES := $(common_STATIC_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# For the device
+# =====================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_SRC_FILES)
+LOCAL_C_INCLUDES := $(common_C_INCLUDES)
+LOCAL_CFLAGS += $(common_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := $(common_SHARED_LIBRARIES)
+LOCAL_STATIC_LIBRARIES := $(common_STATIC_LIBRARIES)
+
+LOCAL_MODULE := $(common_TARGET)
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/srec/ca/acc_basi.c b/srec/ca/acc_basi.c
new file mode 100644
index 0000000..b3be53e
--- /dev/null
+++ b/srec/ca/acc_basi.c
@@ -0,0 +1,108 @@
+/*---------------------------------------------------------------------------*
+ *  acc_basi.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#include "simapi.h"
+#include "portable.h"
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid :
+                           "$Id: acc_basi.c,v 1.4.6.11 2008/03/07 19:46:45 dahan Exp $";
+#endif
+                           
+CA_Acoustic *CA_AllocateAcoustic(void)
+{
+  CA_Acoustic *hAcoust = NULL;
+  
+  TRY_CA_EXCEPT;
+  
+  hAcoust = (CA_Acoustic *) CALLOC_CLR(1,
+            sizeof(CA_Acoustic), "ca.hAcoust");
+  hAcoust->is_loaded = False;
+  hAcoust->pattern_setup_count = 0;
+  hAcoust->ca_rtti = CA_ACOUSTIC_SIGNATURE;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hAcoust);
+  return (hAcoust);
+}
+
+
+void CA_FreeAcoustic(CA_Acoustic *hAcoust)
+{
+  TRY_CA_EXCEPT
+  
+  ASSERT(hAcoust);
+  FREE((char *) hAcoust);
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAcoust)
+}
+
+int CA_LoadAcousticSub(CA_Acoustic *hAcoust, char *subname, CA_AcoustInputParams *hAcoustInp)
+{
+//#ifndef _RTT
+//  int     load_genome = 0;
+//#endif
+  
+  if (hAcoustInp == 0)
+  {
+    /* SpeechWorks image format! */
+    hAcoust->swimodel = load_swimodel(subname);
+    hAcoust->is_loaded = ESR_TRUE;
+    return 1; 
+  }
+  else
+  {
+    SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
+    return 0; 
+  }
+}
+
+void CA_UnloadAcoustic(CA_Acoustic *hAcoust)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hAcoust);
+  
+  if (hAcoust->is_loaded == False)
+    SERVICE_ERROR(ACOUSTIC_NOT_LOADED);
+  if (hAcoust->swimodel)
+  {
+    free_swimodel(hAcoust->swimodel);
+    hAcoust->swimodel = 0;
+    hAcoust->is_loaded = False;
+    return;
+  }
+	else
+		SERVICE_ERROR(ACOUSTIC_NOT_LOADED);
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAcoust)
+}
diff --git a/srec/ca/ann_api.c b/srec/ca/ann_api.c
new file mode 100644
index 0000000..2380361
--- /dev/null
+++ b/srec/ca/ann_api.c
@@ -0,0 +1,759 @@
+/*---------------------------------------------------------------------------*
+ *  ann_api.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#include "duk_args.h"
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+
+#include "simapi.h"
+#include "portable.h"
+#include "fpi_tgt.h"
+#include "fronttyp.h"
+#include "sh_down.h"
+
+#define REMOVE_QUIET_CHUNKS 1
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+CA_Annotation* CA_AllocateAnnotation(void)
+{
+  CA_Annotation* hAnnotation = NULL;
+
+  TRY_CA_EXCEPT
+
+  hAnnotation = (CA_Annotation*) VAR_ALLOCATE_CLR(1, sizeof(CA_Annotation), "ca.CA_Annotation");
+  hAnnotation->data = allocate_annotation();
+  hAnnotation->has_segments = False;
+  hAnnotation->ca_rtti = CA_ANNOTATION_SIGNATURE;
+  hAnnotation->label = NULL;
+  hAnnotation->data->snr = 0;
+  return hAnnotation;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hAnnotation);
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+void CA_FreeAnnotation(CA_Annotation* hAnnotation)
+{
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+
+  if (hAnnotation->has_segments)
+  {
+    SERVICE_ERROR(ANNOTATE_SEGMENTS_EXIST);
+  }
+
+  free_annotation(hAnnotation->data);
+  VAR_FREE(hAnnotation, "hAnnotation");
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+void CA_ClearAnnotation(CA_Annotation* hAnnotation)
+{
+  TRY_CA_EXCEPT
+
+  /*    if( !hAnnotation->has_segments )
+      {
+   SERVICE_ERROR ( ANNOTATE_NO_SEGMENTS );
+      }
+  */
+  annotation_delete_segment_info(hAnnotation->data);
+  if (hAnnotation->label)
+    VAR_FREE(hAnnotation->label, "annotation_label");
+  hAnnotation->label = NULL;
+  hAnnotation->has_segments = False;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+int CA_AnnotateFromResults(CA_Annotation* hAnnotation, CA_Recog *hRecog)
+{
+  TRY_CA_EXCEPT
+
+  int seg_cnt = 0;
+
+  ASSERT(hRecog);
+  ASSERT(hAnnotation);
+
+  if (hAnnotation->has_segments)
+  {
+    SERVICE_ERROR(ANNOTATE_SEGMENTS_EXIST);
+  }
+  seg_cnt =  annotation_from_results(hAnnotation->data, &hRecog->rec);
+
+  if (hAnnotation->data->numWords > 0)
+  {
+    annotation_decorate_labels(hAnnotation->data, hAnnotation->label);
+    hAnnotation->has_segments = True;
+  }
+
+  return (hAnnotation->data->numWords);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+int CA_AnnotateFromVoicing(CA_Annotation* hAnnotation, CA_Utterance *hUtterance, CA_Pattern *hPattern)
+{
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+  ASSERT(hUtterance);
+  ASSERT(hPattern);
+
+  if (hAnnotation->has_segments)
+  {
+    SERVICE_ERROR(ANNOTATE_SEGMENTS_EXIST);
+  }
+
+  annotation_from_voicing(hAnnotation->data, &hUtterance->data, hPattern->data.prep);
+
+  if (hAnnotation->data->numWords > 0)
+  {
+    hAnnotation->has_segments = True;
+  }
+
+  return (hAnnotation->data->numWords);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+void CA_SaveAnnotation(CA_Annotation* hAnnotation, char* FileName)
+{
+  TRY_CA_EXCEPT
+#ifndef _RTT
+
+  ASSERT(hAnnotation);
+
+  if (!hAnnotation->has_segments)
+  {
+    SERVICE_ERROR(ANNOTATE_NO_SEGMENTS);
+  }
+  save_annotations(hAnnotation->data, FileName);
+  return;
+#else
+  log_report("RTT not in module\n");
+  SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
+  return;
+#endif
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+void CA_SetAnnotationLabel(CA_Annotation *hAnnotation, char *label)
+{
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+  ASSERT(label);
+
+  if ((strchr(label, '<') || (strchr(label, '>'))))
+    SERVICE_ERROR(BAD_LABEL);
+  if (hAnnotation->label)
+    VAR_FREE(hAnnotation, "annotation_label");
+  hAnnotation->label = NULL;
+  hAnnotation->label = (char *) VAR_ALLOCATE(strlen(label) + 1, sizeof(char), "ca.annotation_label");
+  strcpy(hAnnotation->label, label);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+
+int CA_GetAnnotationLabel(CA_Annotation *hAnnotation, char *label, int length)
+{
+  int required_length;
+
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+  ASSERT(label);
+
+  if (length <= 0)
+    SERVICE_ERROR(BAD_ARGUMENT);
+  if (hAnnotation->label)
+  {
+    required_length = strlen(hAnnotation->label) + 1;
+    if (required_length > length)
+    {
+      if (length > 1)
+      {
+        strncpy(label, hAnnotation->label, length - 2);
+        label[length - 1] = '\0';
+      }
+      else
+        *label = '\0';
+      return (required_length);
+    }
+    else
+      strcpy(label, hAnnotation->label);
+    return (0);
+  }
+  *label = '\0';
+  return (0);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+int CA_CompareAnnotations(CA_Annotation *testAnnotation, CA_Annotation *refAnnotation)
+{
+  TRY_CA_EXCEPT
+
+  int score;
+
+  ASSERT(testAnnotation);
+  ASSERT(refAnnotation);
+
+  if ((!testAnnotation->has_segments) || (!refAnnotation->has_segments))
+  {
+    SERVICE_ERROR(ANNOTATE_NO_SEGMENTS);
+  }
+
+  score = annotation_compare(testAnnotation->data, refAnnotation->data);
+
+  return (score);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(testAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+int CA_GetAnnotationSegmentCount(CA_Annotation *hAnnotation)
+{
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+
+  if (!hAnnotation->has_segments)
+    return (0);
+  ASSERT(hAnnotation->data);
+  return (hAnnotation->data->numWords);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+int CA_SegmentUtterance(CA_Annotation* hAnnotation, CA_Utterance* hUtt,
+                        CA_Pattern* hPattern)
+{
+  TRY_CA_EXCEPT
+  int seg_cnt = 0;
+  int ii;
+  int total_length;
+  int num_segments_to_keep = 0;
+  int no_beep = False;
+  int has_trailing_silence = False;
+#if REMOVE_QUIET_CHUNKS
+  int jj;
+  featdata *peakC0;
+  int max_peak;
+#endif
+  ASSERT(hAnnotation);
+  ASSERT(hUtt);
+  ASSERT(hPattern);
+  ASSERT(hPattern->data.prep);
+
+#if DO_SUBTRACTED_SEGMENTATION
+  if (hPattern->data.prep->is_setup_for_noise == False)
+  {
+    SERVICE_ERROR(PATTERN_NOT_SETUP_FOR_NOISE);
+  }
+#endif
+  if (hUtt->data.utt_type == FILE_OUTPUT)
+    SERVICE_ERROR(UTTERANCE_INVALID);
+  if (hUtt->data.utt_type != FILE_INPUT &&
+      hUtt->data.utt_type != LIVE_INPUT)
+  {
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+  }
+  if (isFrameBufferActive(hUtt->data.gen_utt.frame))
+  {
+    SERVICE_ERROR(FB_INVALID_STATE);
+  }
+  if (!hAnnotation->label)
+  {
+    SERVICE_ERROR(ANNOTATE_NO_LABEL);
+  }
+  if (hAnnotation->has_segments)
+  {
+    SERVICE_ERROR(ANNOTATE_SEGMENTS_EXIST);
+  }
+
+  hAnnotation->has_segments = False;
+  /* Segment the utterance using DP on c0 */
+  seg_cnt =  annotation_segment_utterance(hAnnotation->data,
+                                          &hUtt->data,
+                                          hPattern->data.prep,
+                                          hAnnotation->label, &has_trailing_silence);
+  if (seg_cnt <= 0)
+  {
+    if (seg_cnt < 0)
+      return (seg_cnt);
+    return (NO_SEGMENTS_FOUND);
+  }
+  /*  SPECIAL OPERATIONS:
+  **  Now manipulate the segmentation to order:
+  1. Remove parts of a multi-segment utt that are % below some energy
+   measure of the "loudest" segment. NB this may remove a final chunk
+   that previously caused a NO_TRAILING_SILENCE
+      2. Declare it invalid if the first chunk is within n frames of the start.
+      3. Delete unwanted leading segment(s). The criteria are:
+          3a. Min/max segment duration.
+          3b. Min silence gap to next chunk
+      4. Check min/max overall length.
+   NB check MAX then look for trailing silence.
+  */
+#if REMOVE_QUIET_CHUNKS
+  /* 1. Remove parts of a multi-segment utt that are % below some energy
+  measure of the "loudest" segment. */
+  /* TODO :Add par hPattern->data.prep->end.min_segment_rel_c0  */
+  if ((hPattern->data.prep->end.min_segment_rel_c0  > 0) && (seg_cnt > 1))
+  {
+    peakC0 = (featdata*) VAR_ALLOCATE_CLR(seg_cnt, sizeof(featdata), "ca.peakC0");
+    max_peak = 0;
+    for (ii = 0; ii < seg_cnt; ii++)
+    {
+      peakC0[ii] = get_c0_peak_over_range(hUtt->data.gen_utt.frame,
+                                          hAnnotation->data->tcp[ii].begin,
+                                          hAnnotation->data->tcp[ii].begin
+                                          + hAnnotation->data->tcp[ii].end);
+      if (peakC0[ii] > max_peak)
+      {
+        max_peak = peakC0[ii];
+      }
+    }
+    max_peak = max_peak - hPattern->data.prep->end.min_segment_rel_c0;
+    for (ii = 0; ii < seg_cnt; ii++)
+    {
+      if (peakC0[ii] < max_peak)
+      {
+        annotation_delete_segment(hAnnotation->data, ii);
+        /* reset flag if last seg is deleted */
+        if (!has_trailing_silence && (ii == seg_cnt - 1))
+        {
+          has_trailing_silence = True;
+        }
+        for (jj = ii; jj < seg_cnt - 1; jj++)
+        {
+          peakC0[jj] = peakC0[jj+1];
+        }
+        seg_cnt--;
+        ii--;
+      }
+    }
+    VAR_FREE((char *) peakC0, "peakC0");
+    if (seg_cnt < 1)
+    {
+
+      return (seg_cnt);
+    }
+  }
+#endif
+
+  /*
+  **  2. Declare it invalid if the first chunk is within n frames of the start.
+  */
+  if (hAnnotation->data->tcp[0].begin
+      < hPattern->data.prep->end.min_initial_quiet_frames)
+  {
+    annotation_delete_segment_info(hAnnotation->data);
+    hAnnotation->has_segments = False;
+    return (INITIAL_SILENCE_NOT_FOUND) ;
+  }
+
+  /*
+  **  3. Delete unwanted leading segment(s) - a beep, for example.
+  */
+  if (hPattern->data.prep->end.delete_leading_segments > 0)
+  {
+    if (hPattern->data.prep->end.leading_segment_accept_if_not_found)
+      num_segments_to_keep = 1;
+    else
+      num_segments_to_keep = 0;
+    if (!annotation_delete_leading_segments(hAnnotation->data,
+                                            hPattern->data.prep->end.delete_leading_segments,
+                                            num_segments_to_keep,
+                                            hPattern->data.prep->end.leading_segment_min_frames,
+                                            hPattern->data.prep->end.leading_segment_max_frames,
+                                            hPattern->data.prep->end.leading_segment_min_silence_gap_frames))
+    {
+      if (hPattern->data.prep->end.leading_segment_accept_if_not_found)
+        no_beep = True;
+      else
+      {
+        annotation_delete_segment_info(hAnnotation->data);
+        hAnnotation->has_segments = False;
+        return (INITIAL_SEGMENT_NOT_IDENTIFIED) ;
+      }
+    }
+  }
+
+  /*
+  **  4. Check min/max overall length. "Beep" has already been deleted.
+  */
+  total_length = 0;
+  for (ii = 0; ii < hAnnotation->data->numWords; ii++)
+    total_length += hAnnotation->data->tcp[ii].end;
+  if (total_length > hPattern->data.prep->end.max_annotation_frames)
+  {
+    annotation_delete_segment_info(hAnnotation->data);
+    hAnnotation->has_segments = False;
+    return (ANNOTATION_TOO_LONG);
+  }
+  /* Check for TOO LONG before checking for trailing silence - recognizer gernerally
+  terminates on speech when it runs out of hypos. BP */
+  if (!has_trailing_silence)
+  {
+    annotation_delete_segment_info(hAnnotation->data);
+    hAnnotation->has_segments = False;
+    return (NO_TRAILING_SILENCE);
+  }
+  if (total_length < hPattern->data.prep->end.min_annotation_frames)
+  {
+    annotation_delete_segment_info(hAnnotation->data);
+    hAnnotation->has_segments = False;
+    return (ANNOTATION_TOO_SHORT);
+  }
+
+  if (hAnnotation->data->numWords > 0)
+  {
+    annotation_decorate_labels(hAnnotation->data, hAnnotation->label);
+    hAnnotation->has_segments = True;
+  }
+#if DEBUG
+  if (no_beep)
+    log_report("W: Initial segment not found\n");
+#endif
+  ASSERT(hAnnotation->data->numWords > 0);
+  return (hAnnotation->data->numWords);
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+int CA_GetAnnotationSNR(CA_Annotation* hAnnotation)
+{
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+#if DO_SUBTRACTED_SEGMENTATION
+  return hAnnotation->data->snr;
+#endif
+  /* SERVICE_ERROR (FEATURE_NOT_SUPPORTED); */
+  log_report("W: CA_GetAnnotationSNR - function not supported.\n");
+  return 0;
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+
+}
+
+/*****************************************************************************************
+ * TODO : wrap this into a lower level function
+ *****************************************************************************************/
+void CA_GetAnnotationData(CA_Annotation* hAnnotation, int id,
+                          int* begin, int* end, char* buff, int buffLen)
+{
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+
+  if ((id < 0) || (id >= hAnnotation->data->numWords))
+    SERVICE_ERROR(BAD_INDEX);
+  if (!hAnnotation->has_segments)
+  {
+    SERVICE_ERROR(ANNOTATE_NO_SEGMENTS);
+  }
+
+  annotation_get_data(hAnnotation->data, id, begin, end, buff, buffLen);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAnnotation)
+}
+
+
+/*****************************************************************************************
+ *
+ *****************************************************************************************/
+int CA_AddUttSegmentsToAcousticWhole(CA_Acoustic  *hAcoust, CA_Pattern *hPattern,
+                                     CA_Utterance *hUtt, CA_Annotation *hAnnotation)
+{
+  int retCode;
+  TRY_CA_EXCEPT
+
+  ASSERT(hAcoust);
+  ASSERT(hPattern);
+  ASSERT(hUtt);
+  ASSERT(hAnnotation);
+  if (hPattern->setup_whole)
+    SERVICE_ERROR(PATTERN_ALREADY_SETUP);
+
+  if (!hAnnotation->has_segments)
+  {
+    SERVICE_ERROR(ANNOTATE_NO_SEGMENTS);
+  }
+  if (!hAnnotation->label)
+    SERVICE_ERROR(ANNOTATE_NO_LABEL);
+  if (CA_IsAcousticWholeModelExtant(hAcoust, hAnnotation->label))
+    return (0); /* TODO: ERROR CODE? */
+
+  if (!hAcoust->acc.base_model)
+  {
+    hAcoust->acc.base_model = allocate_hmm(0, &hAcoust->acc.base_sort);
+    hAcoust->acc.base_model->dim = hPattern->data.prep->dim;
+    hAcoust->acc.num_pars = hAcoust->acc.base_model->dim;
+    hAcoust->acc.mod_type = SEGM;
+    hAcoust->acc.mod_style = SEG_STYLE;
+#if USE_CONTEXT_MASK
+    construct_context_groups_for_wholeword(&hAcoust->acc);
+#endif
+
+  }
+  else
+    if (hAcoust->acc.base_model->dim != hPattern->data.prep->dim)
+      SERVICE_ERROR(UTTERANCE_DIMEN_MISMATCH);
+  /* Redundant. We now add the whole set of segments.
+  if ((id < 0) || (id >= hAnnotation->data->numWords))
+  SERVICE_ERROR ( BAD_INDEX );
+  */
+  /* This fn now returns number of models added */
+  retCode = annotation_add_utt_segment_to_acoustic(&hAcoust->acc,
+            hPattern->data.prep,
+            &hUtt->data,
+            hAnnotation->data,
+            hAnnotation->label,
+            hAcoust->has_backup_means);
+  if (retCode > 0)
+  {
+    hAcoust->is_loaded = True;
+  }
+  return retCode;
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAcoust)
+}
+
+
+
+int CA_LocateBeepInUtterance(CA_Annotation* hAnnotation,
+                             CA_Utterance* hUtterance,
+                             CA_Utterance* hBeepUtterance,
+                             CA_Pattern *hPattern,
+                             int beep_start_point)
+{
+  int start, end;
+  int success;
+  TRY_CA_EXCEPT
+
+  ASSERT(hUtterance);
+  ASSERT(hBeepUtterance);
+  ASSERT(hAnnotation);
+  ASSERT(hAnnotation->data);
+  ASSERT(hPattern->data.prep);
+
+  start = end = 0;
+  annotation_create_tcp_entry(hAnnotation->data, NULL); /* null label avoids alloc */
+  success = detect_beep_by_shape(hPattern->data.prep, &hBeepUtterance->data,  &hUtterance->data,
+                                 &start, &end);
+  if (success >= 0)
+  {
+    hAnnotation->data->tcp[0].begin = start;
+    hAnnotation->data->tcp[0].end = end - start;
+  }
+  /* If beep detection fails, back off to a fixed speech start point */
+  else
+  {
+    hAnnotation->data->tcp[0].begin = beep_start_point;
+    hAnnotation->data->tcp[0].end = hPattern->data.prep->end.beep_size;
+  }
+  annotation_decorate_labels(hAnnotation->data, hAnnotation->label);
+  hAnnotation->has_segments = True;
+  /*
+  ** Call fn to diff the utts' c0 profiles here.
+  ** Stuff the annotation object with the beep start and end points.
+  */
+  if (success >= 0)
+    return (True);
+  else
+    return (False);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAcoust)
+}
+
+
+int CA_CorrectAnnotationForBeep(CA_Annotation* hAnnotation,
+                                CA_Annotation* hBeepAnnotation)
+{
+  int beep_start;
+  int beep_end;
+  int chopped_frames;
+
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+  ASSERT(hBeepAnnotation);
+  ASSERT(hAnnotation->data);
+  ASSERT(hBeepAnnotation->data);
+  ASSERT(hAnnotation->label);
+  /*
+  ** Correct annotation's start point if necessary by moving it
+  ** forward of the end of the beep.
+  */
+  if ((hAnnotation->data->numWords <= 0) || (hBeepAnnotation->data->numWords <= 0))
+    return (hAnnotation->data->numWords);
+  ASSERT(hBeepAnnotation->data->numWords == 1); /* valid? */
+
+  /* NB speech end is length, not endpoint! */
+  beep_start = hBeepAnnotation->data->tcp[0].begin;
+  beep_end = hBeepAnnotation->data->tcp[hBeepAnnotation->data->numWords-1].begin
+             + hBeepAnnotation->data->tcp[hBeepAnnotation->data->numWords-1].end;
+
+#if DEBUG && 0
+  printf("Speech1 begin %d, Speech1 end %d\nBeep begin %d\tBeep end\n",
+         hAnnotation->data->tcp[0].begin,
+         hAnnotation->data->tcp[0].begin + hAnnotation->data->tcp[0].end,
+         beep_start, beep_end);
+
+
+#endif
+
+
+  /* Delete all speech segments that finish before or at the end of beep.
+  WARNING: You must re-label the annotation segments so that they begin
+  at 0! i.e. {Name[0] ~Name[1] }Name[2]
+  */
+  while ((hAnnotation->data->numWords > 0)
+         && ((hAnnotation->data->tcp[0].begin + hAnnotation->data->tcp[0].end) <= beep_end))
+  {
+    annotation_delete_segment(hAnnotation->data, 0);
+  }
+  if (hAnnotation->data->numWords == 0)
+    return (hAnnotation->data->numWords);
+
+  /* Speech before end of beep? - chop it out.
+  */
+  if (beep_end > hAnnotation->data->tcp[0].begin)
+  {
+    ASSERT(beep_end <= (hAnnotation->data->tcp[hAnnotation->data->numWords-1].begin
+                        + hAnnotation->data->tcp[hAnnotation->data->numWords-1].end)); /* valid? */
+    chopped_frames = beep_end - hAnnotation->data->tcp[0].begin;
+    hAnnotation->data->tcp[0].begin += chopped_frames;
+    hAnnotation->data->tcp[0].end -= chopped_frames;
+    ASSERT(hAnnotation->data->tcp[0].end >= 0);
+  }
+  annotation_decorate_labels(hAnnotation->data, hAnnotation->label);
+  return (hAnnotation->data->numWords);
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAcoust)
+}
+
+int CA_TruncateAnnotation(CA_Annotation* hAnnotation,
+                          int start)
+{
+  int speech_end;
+  TRY_CA_EXCEPT
+
+  ASSERT(hAnnotation);
+  ASSERT(hAnnotation->data);
+  /*
+  ** Correct annotation's start point if necessary by moving it
+  ** forward of "start".
+  */
+  if (hAnnotation->data->numWords <= 0)
+    return (hAnnotation->data->numWords);
+  /* NB speech end is length, not endpoint! */
+  speech_end = hAnnotation->data->tcp[hAnnotation->data->numWords-1].begin
+               + hAnnotation->data->tcp[hAnnotation->data->numWords-1].end;
+  /* Delete all speech segments that finish before end of beep
+  */
+  while ((hAnnotation->data->numWords > 0)
+         && (hAnnotation->data->tcp[0].begin + hAnnotation->data->tcp[0].end < start))
+  {
+    annotation_delete_segment(hAnnotation->data, 0);
+  }
+  if (hAnnotation->data->numWords == 0)
+    return (hAnnotation->data->numWords);
+  /* Speech before end of beep? - chop it out.
+  */
+  if (start > hAnnotation->data->tcp[0].begin)
+  {
+    ASSERT(start <= hAnnotation->data->tcp[hAnnotation->data->numWords-1].begin
+           + hAnnotation->data->tcp[hAnnotation->data->numWords-1].end); /* valid? */
+    hAnnotation->data->tcp[0].begin = start;
+  }
+  return (hAnnotation->data->numWords);
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hAcoust)
+}
diff --git a/srec/ca/catrans.c b/srec/ca/catrans.c
new file mode 100644
index 0000000..7dd7486
--- /dev/null
+++ b/srec/ca/catrans.c
@@ -0,0 +1,318 @@
+/*---------------------------------------------------------------------------*
+ *  catrans.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+static const char pat_tran[] = "$Id: catrans.c,v 1.3.10.2 2007/08/31 17:44:51 dahan Exp $";
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#include"simapi.h"
+
+CA_Transform *CA_AllocateTransform(void)
+{
+  CA_Transform *hTransform = NULL;
+  TRY_CA_EXCEPT
+  
+  
+  hTransform = (CA_Transform *) VAR_ALLOCATE_CLR(1, sizeof(CA_Transform), "ca.hTransform");
+  hTransform->is_loaded = False;
+  hTransform->is_setup = False;
+  
+  return (hTransform);
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hTransform)
+}
+
+
+void CA_FreeTransform(CA_Transform *hTransform)
+{
+  TRY_CA_EXCEPT
+  
+  ASSERT(hTransform);
+  VAR_FREE((char *) hTransform, "hTransform");
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hTransform)
+}
+
+
+int CA_LoadTransform(CA_Transform *hTransform, int dimen)
+{
+  TRY_CA_EXCEPT
+  
+  ASSERT(hTransform);
+  ASSERT(dimen > 0);
+  
+  if (hTransform->is_loaded == True)
+    SERVICE_ERROR(PATTERN_ALREADY_LOADED);
+    
+  hTransform->dim = dimen;
+  
+  hTransform->imelda_acc.between = create_accumulate_matrix(hTransform->dim);
+  hTransform->imelda_acc.bmean = (accdata *) VAR_ALLOCATE(hTransform->dim,
+                                 sizeof(accdata), "ca.hTransform->imelda_acc.bmean");
+  hTransform->imelda_acc.within = create_accumulate_matrix(dimen);
+  hTransform->imelda_acc.wmean = (accdata *) VAR_ALLOCATE(hTransform->dim,
+                                 sizeof(accdata), "ca.hTransform->imelda_acc.wmean");
+  hTransform->mllr_acc.between = create_accumulate_matrix(hTransform->dim + 1);
+  hTransform->mllr_acc.within = create_accumulate_matrix(hTransform->dim + 1);
+  
+  hTransform->is_loaded = True;
+  
+  return (True);
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hTransform)
+}
+
+
+void CA_ConfigureTransform(CA_Transform *hTransform, int do_mllr, int do_imelda)
+{
+  TRY_CA_EXCEPT
+  
+  ASSERT(hTransform);
+  
+  hTransform->do_mllr = do_mllr;
+  hTransform->do_imelda = do_imelda;
+  
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hTransform)
+}
+
+
+void CA_UnloadTransform(CA_Transform *hTransform)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hTransform);
+  if (hTransform->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+    
+  delete_accumulate_matrix(hTransform->imelda_acc.between, hTransform->dim);
+  delete_accumulate_matrix(hTransform->imelda_acc.within, hTransform->dim);
+  delete_accumulate_matrix(hTransform->mllr_acc.between, hTransform->dim + 1);
+  delete_accumulate_matrix(hTransform->mllr_acc.within, hTransform->dim + 1);
+  VAR_FREE(hTransform->imelda_acc.bmean, "hTransform->imelda_acc.bmean");
+  VAR_FREE(hTransform->imelda_acc.wmean, "hTransform->imelda_acc.wmean");
+  
+  hTransform->is_loaded = False;
+  
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hTransform)
+}
+
+
+void CA_ClearTransform(CA_Transform *hTransform)
+{
+  TRY_CA_EXCEPT
+  int ii, jj;
+  
+  if (hTransform->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+    
+  ASSERT(hTransform->imelda_acc.within);
+  ASSERT(hTransform->imelda_acc.between);
+  ASSERT(hTransform->imelda_acc.wmean);
+  ASSERT(hTransform->imelda_acc.bmean);
+  ASSERT(hTransform->mllr_acc.within);
+  ASSERT(hTransform->mllr_acc.between);
+  
+  for (ii = 0; ii <= hTransform->dim; ii++)
+  {
+    for (jj = 0; jj <= hTransform->dim; jj++)
+    {
+      hTransform->mllr_acc.between[ii][jj] = 0;
+      hTransform->mllr_acc.within[ii][jj] = 0;
+    }
+  }
+  
+  for (ii = 0; ii < hTransform->dim; ii++)
+  {
+    hTransform->imelda_acc.wmean[ii] = 0;
+    hTransform->imelda_acc.bmean[ii] = 0;
+    for (jj = 0; jj < hTransform->dim; jj++)
+    {
+      hTransform->imelda_acc.between[ii][jj] = 0;
+      hTransform->imelda_acc.within[ii][jj] = 0;
+    }
+  }
+  hTransform->imelda_acc.num = 0;
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hTransform)
+}
+
+
+void CA_InheritAccumulates(CA_Transform *hTransform, CA_Pattern *hPattern)
+{
+  TRY_CA_EXCEPT
+  int ii, jj;
+  
+  ASSERT(hPattern);
+  if (hPattern->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+  ASSERT(hTransform);
+  if (hTransform->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+    
+  ASSERT(hTransform->dim == hPattern->data.dim);
+  
+  if (hTransform->do_mllr)
+  {
+  
+    ASSERT(hPattern->true_accumulates);
+    ASSERT(hPattern->data.do_mllr);
+    ASSERT(hPattern->data.mllr_acc.between);
+    ASSERT(hTransform->mllr_acc.between);
+    
+    for (ii = 0; ii <= hTransform->dim; ii++)
+      for (jj = 0; jj <= hTransform->dim; jj++)
+      {
+      
+        hTransform->mllr_acc.between[ii][jj] +=
+          hPattern->data.mllr_acc.between[ii][jj];
+        hTransform->mllr_acc.within[ii][jj] +=
+          hPattern->data.mllr_acc.within[ii][jj];
+          
+      }
+      
+    log_report("\nCA_InheritAccumulates MLLR inheriting %f frames (total now %f)\n\n", hPattern->data.mllr_acc.within[hTransform->dim][hTransform->dim], hTransform->mllr_acc.within[hTransform->dim][hTransform->dim]);
+  }
+  
+  if (hTransform->do_imelda)
+  {
+  
+    ASSERT(hPattern->data.do_imelda);
+    ASSERT(hPattern->data.mllr_acc.between);
+    ASSERT(hTransform->mllr_acc.between);
+    
+    for (ii = 0; ii < hTransform->dim; ii++)
+      for (jj = 0; jj < hTransform->dim; jj++)
+      {
+      
+        hTransform->imelda_acc.between[ii][jj] +=
+          hPattern->data.imelda_acc.between[ii][jj];
+        hTransform->imelda_acc.within[ii][jj] +=
+          hPattern->data.imelda_acc.within[ii][jj];
+      }
+      
+    for (ii = 0; ii < hTransform->dim; ii++)
+    {
+    
+      hTransform->imelda_acc.bmean[ii] +=
+        hPattern->data.imelda_acc.bmean[ii];
+      hTransform->imelda_acc.wmean[ii] +=
+        hPattern->data.imelda_acc.wmean[ii];
+    }
+    
+    hTransform->imelda_acc.num += hPattern->data.imelda_acc.num;
+    
+    log_report("\nCA_InheritAccumulates Imelda inheriting %d frames (total now %d)\n\n", hPattern->data.imelda_acc.num, hTransform->imelda_acc.num);
+  }
+  
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+}
+
+
+void CA_LoadTransformAccumulates(CA_Pattern *hPattern,
+                                 CA_Transform *hTransform)
+{
+  TRY_CA_EXCEPT
+  int ii, jj;
+  
+  ASSERT(hPattern);
+  if (hPattern->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+  ASSERT(hTransform);
+  if (hTransform->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+    
+  ASSERT(hTransform->dim == hPattern->data.dim);
+  
+  if (hTransform->do_mllr)
+  {
+  
+    ASSERT(hPattern->data.do_mllr);
+    ASSERT(hPattern->data.mllr_acc.between);
+    ASSERT(hTransform->mllr_acc.between);
+    
+    for (ii = 0; ii <= hTransform->dim; ii++)
+      for (jj = 0; jj <= hTransform->dim; jj++)
+      {
+      
+        hPattern->data.mllr_acc.between[ii][jj] =
+          hTransform->mllr_acc.between[ii][jj];
+        hPattern->data.mllr_acc.within[ii][jj] =
+          hTransform->mllr_acc.within[ii][jj];
+      }
+  }
+  
+  if (hTransform->do_imelda)
+  {
+  
+    ASSERT(hPattern->data.do_imelda);
+    ASSERT(hPattern->data.mllr_acc.between);
+    ASSERT(hTransform->mllr_acc.between);
+    
+    for (ii = 0; ii < hTransform->dim; ii++)
+      for (jj = 0; jj < hTransform->dim; jj++)
+      {
+      
+        hPattern->data.imelda_acc.between[ii][jj] =
+          hTransform->imelda_acc.between[ii][jj];
+        hPattern->data.imelda_acc.within[ii][jj] =
+          hTransform->imelda_acc.within[ii][jj];
+      }
+      
+    for (ii = 0; ii < hTransform->dim; ii++)
+    {
+    
+      hPattern->data.imelda_acc.bmean[ii] =
+        hTransform->imelda_acc.bmean[ii];
+      hPattern->data.imelda_acc.wmean[ii] =
+        hTransform->imelda_acc.wmean[ii];
+    }
+    
+    hPattern->data.imelda_acc.num = hTransform->imelda_acc.num;
+    
+  }
+  
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+}
+
+
diff --git a/srec/ca/cnfd_scr.c b/srec/ca/cnfd_scr.c
new file mode 100644
index 0000000..ec7bbd3
--- /dev/null
+++ b/srec/ca/cnfd_scr.c
@@ -0,0 +1,301 @@
+/*---------------------------------------------------------------------------*
+ *  cnfd_scr.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/* Mark - Jan 2002 */
+
+#include "math.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "simapi.h"
+#include "pendian.h"
+#include "portable.h"
+#include "srec_results.h"
+#include "ESR_Session.h"
+
+#if USE_CONFIDENCE_SCORER
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+static const char* conf_feature_names[12] =
+  { "gdiff", "sd", "sd13", "spf", "abs", "gdiffpf", "gv" };
+#endif
+
+#define CONF_FEATURE_GDIFF           0
+#define CONF_FEATURE_SCORE_DIFF      1
+#define CONF_FEATURE_SCORE_DIFF13    2
+#define CONF_FEATURE_SCORE_PER_FRAME 3
+#define CONF_FEATURE_ABSOLUTE_SCORE  4
+#define CONF_FEATURE_GDIFF_PER_FRAME 5
+#define NUM_CONF_FEATURES            6
+#if NUM_CONF_FEATURES != NCONFPARS
+#error allocate difference in simapi.h
+#endif
+
+CA_ConfidenceScorer* CA_AllocateConfidenceScorer(void)
+{
+  CA_ConfidenceScorer *hConfidenceScorer;
+  hConfidenceScorer = NULL;
+
+  TRY_CA_EXCEPT
+
+  hConfidenceScorer = (CA_ConfidenceScorer *) CALLOC_CLR(1,
+                      sizeof(CA_ConfidenceScorer), "ca.hConfidenceScorer");
+
+  return (hConfidenceScorer);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hConfidenceScorer)
+
+}
+
+
+void CA_FreeConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer)
+{
+  TRY_CA_EXCEPT
+
+  ASSERT(hConfidenceScorer);
+
+  CA_UnloadConfidenceScorer(hConfidenceScorer);
+
+  FREE((char *) hConfidenceScorer);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hConfidenceScorer);
+}
+
+
+int CA_LoadConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer)
+{
+  static const char* names[NUM_CONF_FEATURES] = {
+      "gdiff",
+      "sd",
+      "sd13",
+      "spf",
+      "abs",
+      "gdiffpf",
+  };
+  int i, j;
+  
+  for (j = 0; j < 2; j++) {
+    for (i = 0; i < NUM_CONF_FEATURES; i++) {
+      char name[256];
+      char value[256];
+      Confidence_model_parameters* params;
+      size_t len;
+
+      if (j == 0) {
+        params = &hConfidenceScorer->one_nbest;
+        sprintf(name, "SREC.Confidence.sigmoid_param.%s.one_nbest", names[i]);
+      }
+      else {
+        params = &hConfidenceScorer->many_nbest;
+        sprintf(name, "SREC.Confidence.sigmoid_param.%s.many_nbest", names[i]);
+      }
+      len = P_PATH_MAX;
+      if (ESR_SUCCESS != ESR_SessionGetLCHAR(name, (LCHAR*) value, &len)) {
+        return ESR_FALSE;
+      }
+      if (3 != sscanf(value, "%lg %lg %lg",
+          &params->scale[i], &params->offset[i], &params->weight[i])) {
+        return ESR_FALSE;
+      }
+    }
+  }
+  return ESR_TRUE;
+}
+
+
+void CA_UnloadConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer)
+{
+  ASSERT(hConfidenceScorer);
+}
+
+
+
+static int CA_ConfScorerGetFeatures(CA_Recog* recog, CA_NBestList *nbestlist, float* features, int *num_features,
+									int choice_number, int num_choices_left);
+
+int CA_ComputeConfidenceValues(CA_ConfidenceScorer* hConfidenceScorer, CA_Recog* recog,
+                                                            CA_NBestList *nbestlist)
+{
+  float features[12];
+  double value=1.0, final_value, confidence_value;
+  double confidence_feature, confidence_feature_weighted;
+  int i, num_features,current_choice;
+  int rc, error_check;
+  int num_choices,num_choices_left;
+
+  confidence_value = 1.0;
+  num_choices_left = num_choices = srec_nbest_get_num_choices(nbestlist);
+
+  for(current_choice=0;current_choice<num_choices;current_choice++)
+    {
+      confidence_value = 1.0;
+      rc = CA_ConfScorerGetFeatures(recog, nbestlist, features, &num_features, current_choice, num_choices_left);
+      if (rc)
+        {
+          PLogError("confscor failed\n");
+          error_check = srec_nbest_put_confidence_value(nbestlist, current_choice, 0);
+          if(error_check)
+            return 1;
+          num_choices_left--;
+          continue;
+        }
+
+      if (num_choices_left == 1)
+        {
+          for (i=0;i<NUM_CONF_FEATURES;i++) {
+            if(i==CONF_FEATURE_SCORE_DIFF || i==CONF_FEATURE_SCORE_DIFF13) {
+              confidence_feature_weighted = 1.0;
+            }
+            else {
+              confidence_feature = 1.0/(1.0 + exp((hConfidenceScorer->one_nbest.scale[i] *
+                                                   features[i]) + hConfidenceScorer->one_nbest.offset[i]));
+              confidence_feature_weighted = pow(confidence_feature,hConfidenceScorer->one_nbest.weight[i]);
+            }
+            confidence_value = confidence_value * confidence_feature_weighted;
+          }
+        }
+      else
+        {
+          for (i=0;i<NUM_CONF_FEATURES;i++) {
+            confidence_feature = 1.0/(1.0 + exp((hConfidenceScorer->many_nbest.scale[i] *
+                                                 features[i]) + hConfidenceScorer->many_nbest.offset[i]));
+            confidence_value = confidence_value * pow(confidence_feature, hConfidenceScorer->many_nbest.weight[i]);
+          }
+        }
+
+      value *= confidence_value;
+      final_value = 1000.0 * value;
+      error_check = srec_nbest_put_confidence_value(nbestlist, current_choice, (int)final_value);
+      if(error_check)
+        return 1;
+      num_choices_left--;
+	}
+	num_choices_left = srec_nbest_fix_homonym_confidence_values( nbestlist);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("confidence %d features ", (int)final_value);
+  for (i = 0; i < num_features; i++)
+    PLogMessage(" %s %f", conf_feature_names[i], features[i]);
+#endif
+
+  return 0;
+}
+
+int CA_ConfScorerGetFeatures(CA_Recog* recog, CA_NBestList *nbestlist, float* features, int *num_features,
+							 int choice_number, int num_choices_left)
+{
+  //static char* rejfeat_type = (char*) - 1;
+  int rc;
+  asr_int32_t num_speech_frames = 400;
+#define MAX_ENTRY_LENGTH 512
+  char label0[MAX_ENTRY_LENGTH];
+  char label1[MAX_ENTRY_LENGTH];
+  asr_int32_t cost0, cost1, cost2;
+  asr_int32_t speech_cost0;
+  asr_int32_t gsm_cost = 0, am_index = 0, num_words = 0;
+
+  if (!nbestlist)
+    return 1;
+
+  ASSERT(features);
+  ASSERT(num_features);
+  ASSERT(nbestlist);
+  ASSERT(recog);
+
+  /* @F=(,"gdiff","sdiff12","sdiff13","spf1","speechcost0","gdiffpf");
+            0       1          2        3         4           5      */
+ if (num_choices_left > 0)
+  {
+    rc = srec_nbest_get_result(nbestlist, choice_number, label0, MAX_ENTRY_LENGTH, &cost0, choice_number);
+    if (rc) return rc;
+    rc = srec_nbest_get_choice_info(nbestlist, choice_number, &num_speech_frames, "num_speech_frames");
+    if (rc) return rc;
+    rc = srec_nbest_get_choice_info(nbestlist, choice_number, &speech_cost0, "speech_frames_cost");
+    if (rc) return rc;
+    ASSERT(!rc);
+    features[CONF_FEATURE_ABSOLUTE_SCORE] = ((float)(speech_cost0));
+    features[CONF_FEATURE_SCORE_PER_FRAME] = ((float)(speech_cost0)) / (float)num_speech_frames;
+    if (num_choices_left> 1)
+    {
+      rc = srec_nbest_get_result(nbestlist, choice_number+1, label1, MAX_ENTRY_LENGTH, &cost1, choice_number);
+      if (rc) return rc;
+      features[CONF_FEATURE_SCORE_DIFF] = ((float)cost1 - (float)cost0);
+      if (num_choices_left > 2)
+      {
+        rc = srec_nbest_get_result(nbestlist, choice_number+2, label1, MAX_ENTRY_LENGTH, &cost2, choice_number);
+        if (rc) return rc;
+        features[CONF_FEATURE_SCORE_DIFF13] = ((float)cost2 - (float)cost0);
+      }
+      else
+      {
+        cost2 = (-1);
+        features[CONF_FEATURE_SCORE_DIFF13] = ((float)cost1 - (float)cost0);
+      }
+    }
+    else
+    {
+      features[CONF_FEATURE_SCORE_DIFF] = 400;
+      features[CONF_FEATURE_SCORE_DIFF13] = 400;
+      cost1 = cost2 = (-1);
+    }
+
+
+    srec_nbest_get_choice_info(nbestlist, choice_number, &gsm_cost, "gsm_cost");
+    srec_nbest_get_choice_info(nbestlist, choice_number, &am_index, "acoustic_model_index");
+    srec_nbest_get_choice_info(nbestlist, choice_number, &num_words, "num_words");
+
+    features[CONF_FEATURE_GDIFF] = (float)(speech_cost0 - gsm_cost);
+    /* should never happen */
+    if (num_speech_frames == 0) num_speech_frames = 1;
+    features[CONF_FEATURE_GDIFF_PER_FRAME] = ((float)(speech_cost0 - gsm_cost)) / (float)num_speech_frames;
+    // features[CONF_FEATURE_GENDER_VALUE] = (float)am_index;
+    *num_features = NUM_CONF_FEATURES;
+    rc = 0;
+  }
+  else
+  {
+    *num_features = 0;
+    rc = 1;
+  }
+
+#define DUMP_FEATURES_FOR_RETRAIN 0
+#if DUMP_FEATURES_FOR_RETRAIN
+  srec_nbest_get_choice_info(nbestlist, 0, &gsm_cost, "gsm_cost");
+  srec_nbest_get_choice_info(nbestlist, 0, &am_index, "acoustic_model_index");
+  srec_nbest_get_choice_info(nbestlist, 0, &num_words, "num_words");
+
+  printf("REJFEATS:");
+  printf(" cost0(%d)", cost0);
+  printf(" cost1(%d)", cost1);
+  printf(" cost2(%d)", cost2);
+  printf(" speechcost0(%d)", speech_cost0);
+  printf(" nframes0(%d)", num_speech_frames);
+  printf(" nwords0(%d)", num_words);
+  printf(" gsmcost(%d)", gsm_cost);
+  printf(" amindex(%d)", am_index);
+  /* printf(" glmcost(%d)", glm_cost);*/
+  printf("\n");
+#endif
+  return rc; /* no error reported */
+}
+
+
+#endif /* #if USE_CONFIDENCE_SCORER */
+
diff --git a/srec/ca/par_basi.c b/srec/ca/par_basi.c
new file mode 100644
index 0000000..488ec80
--- /dev/null
+++ b/srec/ca/par_basi.c
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------------*
+ *  par_basi.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "simapi.h"
+#include "portable.h"
+
+static const char par_basi[] = "$Id: par_basi.c,v 1.3.10.4 2007/10/15 18:06:24 dahan Exp $";
+
+
+CA_AcoustInputParams *CA_AllocateAcousticParameters(void)
+{
+  CA_AcoustInputParams *hAcoustInp = NULL;
+  TRY_CA_EXCEPT
+
+  hAcoustInp = (CA_AcoustInputParams *) CALLOC_CLR(1,
+               sizeof(CA_AcoustInputParams), "ca.hAcoustInp");
+
+  hAcoustInp->is_loaded = False;
+  hAcoustInp->ca_rtti = CA_ACOUSTIC_PARAMETERS_SIGNATURE;
+
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hAcoustInp);
+
+  return (hAcoustInp);
+
+}
+
+
+void CA_FreeAcousticParameters(CA_AcoustInputParams *hAcoustInp)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hAcoustInp);
+  FREE((char *)hAcoustInp);
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hAcoustInp);
+
+}
+
+
+CA_PatInputParams *CA_AllocatePatternParameters(void)
+{
+  CA_PatInputParams *hPatInp = NULL;
+
+  TRY_CA_EXCEPT
+
+  hPatInp = (CA_PatInputParams *) CALLOC_CLR(1,
+            sizeof(CA_PatInputParams), "ca.hPatInp");
+
+  hPatInp->is_loaded = False;
+  hPatInp->ca_rtti = CA_PATTERN_PARAMETERS_SIGNATURE;
+
+  return (hPatInp);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hPatInp);
+
+}
+
+
+void CA_FreePatternParameters(CA_PatInputParams *hPatInp)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hPatInp);
+  FREE((char *)hPatInp);
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hPatInp);
+
+}
+
+
+CA_RecInputParams *CA_AllocateRecognitionParameters(void)
+{
+  CA_RecInputParams *hRecInp = NULL;
+  TRY_CA_EXCEPT
+  hRecInp = (CA_RecInputParams *) CALLOC_CLR(1,
+            sizeof(CA_RecInputParams), "ca.hRecInp");
+
+  if ( hRecInp != NULL )
+    {
+    hRecInp->is_loaded = False;
+    hRecInp->ca_rtti = CA_RECOGNIZER_PARAMETERS_SIGNATURE;
+    }
+  return (hRecInp);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hRecInp);
+
+}
+
+
+void CA_FreeRecognitionParameters(CA_RecInputParams *hRecInp)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hRecInp);
+  FREE((char *)hRecInp);
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hRecInp);
+
+}
+
+
diff --git a/srec/ca/pat_basi.c b/srec/ca/pat_basi.c
new file mode 100644
index 0000000..947c46a
--- /dev/null
+++ b/srec/ca/pat_basi.c
@@ -0,0 +1,288 @@
+/*---------------------------------------------------------------------------*
+ *  pat_basi.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "simapi.h"
+#include "portable.h"
+#include "swicms.h"
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid :
+                           "$Id: pat_basi.c,v 1.9.6.11 2008/03/07 18:49:28 dahan Exp $";
+#endif
+
+extern const float   root_pi_over_2;
+
+CA_Pattern *CA_AllocatePattern(void)
+{
+  TRY_CA_EXCEPT
+  CA_Pattern *hPattern = NULL;
+
+  hPattern = (CA_Pattern *) CALLOC_CLR(1,
+             sizeof(CA_Pattern), "ca.hPattern");
+  hPattern->is_loaded = False;
+  //hPattern->setup_whole = NULL;
+  //hPattern->setup_sub = NULL;
+  hPattern->ca_rtti = CA_PATTERN_SIGNATURE;
+  return (hPattern);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+}
+
+
+void CA_FreePattern(CA_Pattern *hPattern)
+{
+  TRY_CA_EXCEPT
+
+  ASSERT(hPattern);
+  FREE((char *) hPattern);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+}
+
+
+int CA_LoadPattern(CA_Pattern *hPattern, CA_PatInputParams *hPatInput,
+                   int dimen , char *multable , char *imelda)
+{
+
+  TRY_CA_EXCEPT
+#ifndef _RTT
+  int ii, ret_code;
+
+  ASSERT(hPattern);
+  ASSERT(hPatInput);
+  if (hPattern->is_loaded == True)
+    SERVICE_ERROR(PATTERN_ALREADY_LOADED);
+  if (hPatInput->is_loaded == False)
+    SERVICE_ERROR(PATTERN_INPUT_NOT_LOADED);
+
+  hPattern->data.prep = (preprocessed *) CALLOC_CLR(1,
+                        sizeof(preprocessed), "ca.hPattern->data.prep");
+
+  /*  Load the Imelda transform if specified */
+  if (imelda && strlen(imelda) > 0)
+  {
+    ret_code = init_newton_transform(hPattern->data.prep, 0, imelda, hPatInput->dimen);
+    if (ret_code > 0)
+      SERVICE_ERROR(PATTERN_NOT_LOADED);
+  }
+  else
+  {
+    hPattern->data.prep->use_dim = hPatInput->dimen;
+    hPattern->data.prep->use_from = hPatInput->feat_start;
+  }
+
+  if (hPatInput->whole_dimen == 0)
+    hPattern->data.prep->whole_dim = hPatInput->dimen;
+  else
+    hPattern->data.prep->whole_dim = hPatInput->whole_dimen;
+  if (hPattern->data.prep->whole_dim > hPattern->data.prep->use_dim)
+    SERVICE_ERROR(BAD_PARAMETER);
+
+  hPattern->data.prep->mix_score_scale = (prdata)(128 * hPatInput->mix_score_scale + 0.5)
+                                         - (prdata)0.5;
+  hPattern->data.prep->uni_score_scale = (prdata)(128 * hPatInput->uni_score_scale + 0.5)
+                                         - (prdata)0.5;      
+  hPattern->data.prep->uni_score_offset = (prdata) hPatInput->uni_score_offset;
+  hPattern->data.prep->imelda_scale = (prdata)hPatInput->imelda_scale;
+  init_preprocessed(hPattern->data.prep, dimen, hPatInput->imelda_scale); /* TODO: move this to Setup */
+
+
+  /* Annotation parameters */
+  hPattern->data.prep->end.rel_low  = hPatInput->rel_low;
+  hPattern->data.prep->end.rel_high  = hPatInput->rel_high;
+  hPattern->data.prep->end.gap_period  = hPatInput->gap_period;
+  hPattern->data.prep->end.click_period = hPatInput->click_period;
+  hPattern->data.prep->end.breath_period = hPatInput->breath_period;
+  hPattern->data.prep->end.extend_annotation = hPatInput->extend_annotation;
+  hPattern->data.prep->end.min_annotation_frames = hPatInput->min_annotation_frames;
+  hPattern->data.prep->end.max_annotation_frames = hPatInput->max_annotation_frames;
+  hPattern->data.prep->end.min_segment_rel_c0 = hPatInput->min_segment_rel_c0;
+  hPattern->data.prep->end.min_initial_quiet_frames = hPatInput->min_initial_quiet_frames;
+  hPattern->data.prep->end.delete_leading_segments = hPatInput->delete_leading_segments;
+  hPattern->data.prep->end.leading_segment_min_frames = hPatInput->leading_segment_min_frames;
+  hPattern->data.prep->end.leading_segment_max_frames = hPatInput->leading_segment_max_frames;
+  hPattern->data.prep->end.leading_segment_min_silence_gap_frames
+  = hPatInput->leading_segment_min_silence_gap_frames;
+  hPattern->data.prep->end.leading_segment_accept_if_not_found
+  = hPatInput->leading_segment_accept_if_not_found;
+#if DO_SUBTRACTED_SEGMENTATION
+  hPattern->data.prep->end.snr_holdoff = hPatInput->snr_holdoff;
+  hPattern->data.prep->end.min_acceptable_snr = hPatInput->min_acceptable_snr;
+#endif
+  hPattern->data.prep->end.param  = hPatInput->param;
+  hPattern->data.prep->end.beep_size = hPatInput->beep_size;
+  hPattern->data.prep->end.beep_threshold = hPatInput->beep_threshold;
+
+
+  /* log-lookup table */
+  create_lookup_logadd(&hPattern->data.prep->add, (float)MUL_SCALE);
+
+  /* Build the weights conversion table */
+  for (ii = 0; ii < MAX_WTS; ii++)
+    hPattern->data.prep->exp_wt[ii] =
+      (prdata)(WEIGHT_SCALE * exp((double)(0x01 << WT_ADJUST) *
+                                  (double) - ii / (MUL_SCALE * hPattern->data.prep->add.scale)) +
+               0.5) - (prdata)0.5;
+
+  hPattern->data.prep->ref_count = 1;
+  hPattern->is_loaded = True;
+
+  return (True);
+#else
+  log_report("RTT not in module\n");
+  SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
+  return (False);
+#endif
+
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+
+}
+
+void CA_UnloadPattern(CA_Pattern *hPattern)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hPattern);
+  if (hPattern->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+
+  if (--hPattern->data.prep->ref_count == 0)
+  {
+    if (hPattern->data.prep->matrix)
+      free_linear_transform(hPattern->data.prep);
+
+    if (hPattern->data.prep->add.table)
+      destroy_lookup_logadd(&hPattern->data.prep->add);
+
+    clear_preprocessed(hPattern->data.prep);
+
+    FREE((char *) hPattern->data.prep);
+    hPattern->data.prep = NULL;
+  }
+
+  hPattern->is_loaded = False;
+  return;
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+}
+
+
+void CA_SetupPatternForAcoustic(CA_Pattern *hPattern, CA_Acoustic *hAcoust)
+{
+  TRY_CA_EXCEPT
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("in SetupPatternForAcoustic\n");
+#endif
+  /*  Setup for mul-table if necessary
+  */
+  ASSERT(hPattern);
+  ASSERT(hAcoust);
+  if (hPattern->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+  if (hAcoust->is_loaded == False)
+    SERVICE_ERROR(ACOUSTIC_NOT_LOADED);
+  /* Check that if the Acoustic object is already set up then
+  the pattern objects must have certain similarities. */
+  if (hAcoust->pattern_setup_count > 0)
+  {
+    if (hPattern->data.prep->imelda_scale != hAcoust->imelda_scale)
+      SERVICE_ERROR(ACOUSTIC_PATTERN_MISMATCH);
+    if (hPattern->data.prep->use_dim != hAcoust->use_dim)
+      SERVICE_ERROR(ACOUSTIC_PATTERN_MISMATCH);
+  }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  //PLogMessage("mod_style %d\n", hAcoust->acc.mod_style);
+#endif
+
+  hAcoust->pattern_setup_count++;
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+}
+
+void CA_ClearPatternForAcoustic(CA_Pattern *hPattern, CA_Acoustic *hAcoust)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hPattern);
+  ASSERT(hAcoust);
+  if (hPattern->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+  if (hAcoust->pattern_setup_count == 0)
+    SERVICE_ERROR(ACOUSTIC_HAS_NO_PATTERN);
+  hAcoust->pattern_setup_count--;
+
+  return;
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+}
+
+
+int CA_MakePatternFrame(CA_Pattern *hPattern, CA_Utterance *hUtt)
+{
+
+  TRY_CA_EXCEPT
+  int status_code;
+  swicms_norm_info* swicms;
+
+  ASSERT(hPattern);
+  ASSERT(hUtt);
+
+  if (hPattern->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+
+  status_code = get_data_frame(hPattern->data.prep, &hUtt->data);
+
+  /* swicms_cache_frame() must be here because get_data_frame() is called from
+     backtracing.  Is the caching at the front-end even necessary any more?
+  */
+  swicms = hUtt->data.gen_utt.swicms;
+  if (!swicms->is_valid)
+    swicms_lda_process(swicms, hPattern->data.prep);
+
+  swicms_cache_frame(swicms, hPattern->data.prep->seq_unnorm,
+                     hUtt->data.gen_utt.channorm->dim);
+  apply_channel_normalization_in_swicms(swicms, hPattern->data.prep->seq,
+                                        hPattern->data.prep->seq_unnorm,
+                                        hUtt->data.gen_utt.channorm->dim);
+
+  /* prepare is fairly useless and should be removed */
+  prepare_data_frame(hPattern->data.prep);
+  return (status_code);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hPattern)
+}
+
diff --git a/srec/ca/rec_basi.c b/srec/ca/rec_basi.c
new file mode 100644
index 0000000..0773fda
--- /dev/null
+++ b/srec/ca/rec_basi.c
@@ -0,0 +1,236 @@
+/*---------------------------------------------------------------------------*
+ *  rec_basi.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "simapi.h"
+#include "portable.h"
+
+static const char rec_basi[] = "$Id: rec_basi.c,v 1.13.6.7 2007/10/15 18:06:24 dahan Exp $";
+
+/*chopped - chopped a lot of stuff out of this file - all the references to the
+stuff within the rec structure.  It seems like this should not be at this level.  If
+we leave it below here, we can change the search (with a new rec type) without
+having to change this level*/
+
+CA_Recog *CA_AllocateRecognition()
+{
+  CA_Recog *hRecog = NULL;
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("in CA_AllocateRecognition\n");
+#endif
+
+  TRY_CA_EXCEPT
+
+
+  /* CREC_SET_SIGNATURE must be 'tied' to the
+   * actual creation of the recog_info structure.
+   * Any methods which take 'recog_info' as an argument,
+   * even 'destroy_recognition()' will test the signature!
+   */
+  hRecog = (CA_Recog *) CALLOC_CLR(1, sizeof(CA_Recog), "ca.hRecog");
+
+  hRecog->setup_count = 0;
+  hRecog->is_running = False;
+  hRecog->is_configured = False;
+  hRecog->is_resultBlocked = False;
+  hRecog->ca_rtti = CA_RECOGNIZER_SIGNATURE;
+
+  hRecog->recm = (multi_srec*)CALLOC_CLR(1, sizeof(multi_srec), "ca.hRecog.srec");
+  return (hRecog);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+int CA_ConfigureRecognition(CA_Recog *hRecog, CA_RecInputParams *hRecInput)
+{
+  int rc = 0;
+  TRY_CA_EXCEPT
+
+  if (hRecog->is_configured == True)
+    SERVICE_ERROR(RECOGNIZER_ALREADY_CONFIGURED);
+
+  rc = allocate_recognition(hRecog->recm,
+                            hRecInput->viterbi_prune_thresh,
+                            hRecInput->max_hmm_tokens,
+                            hRecInput->max_fsmnode_tokens,
+                            hRecInput->max_word_tokens,
+                            hRecInput->max_altword_tokens,
+                            hRecInput->num_wordends_per_frame,
+                            hRecInput->max_fsm_nodes,
+                            hRecInput->max_fsm_arcs,
+                            hRecInput->max_frames,
+                            hRecInput->max_model_states,
+                            hRecInput->max_searches);
+  if (rc) return rc;
+
+  /*rc =*/
+  srec_eosd_allocate(&hRecog->eosd_parms,
+                     hRecInput->eou_threshold,
+                     hRecInput->eou_threshold,
+                     hRecInput->terminal_timeout,
+                     hRecInput->optional_terminal_timeout,
+                     hRecInput->non_terminal_timeout,
+                     hRecInput->max_frames);
+  if (rc) return rc;
+
+  hRecog->is_configured = True;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+  return 0;
+}
+
+void CA_UnconfigureRecognition(CA_Recog *hRecog)
+{
+  TRY_CA_EXCEPT
+
+  if (hRecog->is_configured == False)
+    SERVICE_ERROR(RECOGNIZER_NOT_CONFIGURED);
+
+  if (hRecog->is_running == True)
+    SERVICE_ERROR(RECOGNIZER_ALREADY_STARTED);
+
+  srec_eosd_destroy(hRecog->eosd_parms);
+  free_recognition(hRecog->recm);
+  hRecog->is_configured = False;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+
+
+void CA_FreeRecognition(CA_Recog *hRecog)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hRecog);
+
+  if (hRecog->is_configured == True)
+    SERVICE_ERROR(RECOGNIZER_ALREADY_CONFIGURED);
+
+  /* CREC_CLEAR_SIGNATURE must be 'tied' to the
+   * actual destruction of the recog_info structure.
+   * Any methods which take 'recog_info' as an argument,
+   * even 'destroy_recognition()' will test the signature!
+   */
+  FREE(hRecog->recm);
+  FREE(hRecog);
+
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+
+void CA_BeginRecognition(CA_Recog *hRecog, CA_Syntax *hSyntax,
+                         int first_syntax_node, CA_RecInputParams *hRecInput)
+{
+  TRY_CA_EXCEPT
+  /*ASSERT (hSyntax);*/
+  ASSERT(hRecog);
+  ASSERT(hRecInput);
+  if (hRecog->is_running == True)
+    SERVICE_ERROR(RECOGNIZER_ALREADY_STARTED);
+
+  if (hRecog->is_configured == False)
+    SERVICE_ERROR(RECOGNIZER_NOT_CONFIGURED);
+
+  begin_recognition(hRecog->recm, first_syntax_node);
+  hRecog->is_running = True;
+
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+
+void CA_AdvanceRecognitionByFrame(CA_Recog *hRecog, CA_Pattern *hPattern,
+                                  CA_Utterance *hUtterance)
+{
+  int rc;
+  TRY_CA_EXCEPT
+  ASSERT(hRecog);
+  ASSERT(hPattern);
+  ASSERT(hUtterance);
+  if (hRecog->is_running == False)
+    SERVICE_ERROR(RECOGNIZER_NOT_STARTED);
+  if (hPattern->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+  //if (0 && hPattern->setup_sub == NULL && hPattern->setup_whole == NULL)
+    //SERVICE_ERROR(PATTERN_NOT_SETUP);
+
+  rc = multi_srec_viterbi(hRecog->recm,
+                          hRecog->eosd_parms,
+                          &hPattern->data,
+                          &hUtterance->data);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+
+int CA_EndRecognition(CA_Recog *hRecog, CA_Pattern *hPattern,
+                      CA_Utterance *hUtterance)
+{
+  TRY_CA_EXCEPT
+  int terminated;
+
+  ASSERT(hRecog);
+  ASSERT(hPattern);
+  ASSERT(hUtterance);
+  if (hRecog->is_running == False)
+    SERVICE_ERROR(RECOGNIZER_NOT_STARTED);
+  if (hPattern->is_loaded == False)
+    SERVICE_ERROR(PATTERN_NOT_LOADED);
+  //if (0 && hPattern->setup_sub == NULL && hPattern->setup_whole == NULL)
+    //SERVICE_ERROR(PATTERN_NOT_SETUP);
+
+  terminated = 1;
+  end_recognition(hRecog->recm);
+
+  if (terminated && hUtterance->data.gen_utt.do_channorm)
+  {
+    if (!inherit_recognition_statistics(&hUtterance->data, hRecog->recm,
+                                        hUtterance->data.gen_utt.channorm->dim))
+      SERVICE_ERROR(UNEXPECTED_DATA_ERROR); /* TODO: find a suitable error code */
+  }
+
+  if (terminated) hPattern->recog_terminated = True;
+  hRecog->is_running = False;
+  return (terminated);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
diff --git a/srec/ca/rec_load.c b/srec/ca/rec_load.c
new file mode 100644
index 0000000..61d9b63
--- /dev/null
+++ b/srec/ca/rec_load.c
@@ -0,0 +1,72 @@
+/*---------------------------------------------------------------------------*
+ *  rec_load.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+
+#include "simapi.h"
+#include "portable.h"
+
+#define CROSSWORD 1
+
+static const char rec_load[] = "$Id: rec_load.c,v 1.8.6.7 2007/10/15 18:06:24 dahan Exp $";
+
+
+void CA_LoadModelsInAcoustic(CA_Recog *hRecog, CA_Acoustic *hAcoust,
+                             CA_AcoustInputParams *hAcoustInp)
+{
+  int rc;
+  TRY_CA_EXCEPT
+  ASSERT(hRecog);
+  ASSERT(hAcoust);
+  ASSERT(hAcoustInp);
+  
+  if (hAcoust->is_loaded == False)
+    SERVICE_ERROR(ACOUSTIC_NOT_LOADED);
+  if (hAcoustInp->is_loaded == False)
+    SERVICE_ERROR(ACOUSTIC_INPUT_NOT_LOADED);
+    // returns 1 for OK, 0 if not OK
+  rc = add_acoustic_model_for_recognition(hRecog->recm, hAcoust->swimodel); 
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+
+void CA_UnloadRecognitionModels(CA_Recog *hRecog)
+{
+  TRY_CA_EXCEPT
+  int rc;
+  rc = clear_acoustic_models_for_recognition(hRecog->recm);
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
diff --git a/srec/ca/rec_nbes.c b/srec/ca/rec_nbes.c
new file mode 100644
index 0000000..84e8488
--- /dev/null
+++ b/srec/ca/rec_nbes.c
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*
+ *  rec_nbes.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#include "simapi.h"
+#include "srec.h"
+#include "portable.h"
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid :
+                           "$Id: rec_nbes.c,v 1.6.6.7 2007/11/13 22:18:02 rabih_majzoub Exp $";
+#endif
+                           
+                           
+CA_NBestList *CA_PrepareNBestList(CA_Recog *hRecog, int num, asr_int32_t *bestScore)
+{
+  CA_NBestList    *newList;
+  
+  TRY_CA_EXCEPT
+  ASSERT(hRecog);
+  
+  newList = (CA_NBestList*)srec_nbest_prepare_list(hRecog->recm, num, bestScore);
+  return newList;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+
+void CA_DeleteNBestList(CA_NBestList *nbest)
+{
+  if (nbest)
+    srec_nbest_destroy_list(nbest);
+  return;
+
+	BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(nbest)
+}
+
+
+int CA_NBestListCount(CA_NBestList *nbest)
+{
+  TRY_CA_EXCEPT
+  if (nbest)
+    return srec_nbest_get_num_choices(nbest);
+  else
+    return 0;
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(nbest)
+}
+
+int CA_NBestListGetResultConfidenceValue(CA_NBestList *nbest, size_t choice, int *value)
+{
+  if (nbest)
+  {
+	  *value =srec_nbest_get_confidence_value(nbest, choice);
+      return 1; 
+  }
+  else
+      return 0;
+}
+
+int CA_NBestListRemoveResult(CA_NBestList *nbest, int index)
+{
+  return srec_nbest_remove_result(nbest,index);	
+}
+
+LCHAR* CA_NBestListGetResultWord(CA_NBestList* nbest, size_t iChoice)
+{
+  return srec_nbest_get_word(nbest,iChoice);
+}
+
+ESR_ReturnCode CA_NBestListGetResultWordIDs(CA_NBestList* nbest, size_t index, wordID* wordIDs, size_t* len, asr_int32_t* cost)
+{
+  if (!nbest)
+  {
+    PLogError(L("ESR_INVALID_ARGUMENT"));
+    return ESR_INVALID_ARGUMENT;
+  }
+  return srec_nbest_get_resultWordIDs(nbest, index, wordIDs, len, cost);
+}
diff --git a/srec/ca/rec_resu.c b/srec/ca/rec_resu.c
new file mode 100644
index 0000000..e013d81
--- /dev/null
+++ b/srec/ca/rec_resu.c
@@ -0,0 +1,117 @@
+/*---------------------------------------------------------------------------*
+ *  rec_resu.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "simapi.h"
+#include "portable.h"
+#include "word_lattice.h"
+
+#define USE_PREDICT   0
+#define FRAME_KNEE    100
+#define FRAME_SCALE   13  /* 23 for c32 */
+#define JUNK_SCALE    0.87  /* 0.8 for c32 */
+
+static const char rec_resu[] = "$Id: rec_resu.c,v 1.7.6.7 2007/10/15 18:06:24 dahan Exp $";
+
+int CA_FullResultScore(CA_Recog *hRecog, int *score, int do_incsil)
+{
+  bigcostdata cost;
+  
+  srec_get_top_choice_score(hRecog->recm, &cost, do_incsil);
+  
+  *score = cost;
+  return 0;
+}
+
+
+int CA_FullResultLabel(CA_Recog *hRecog, char *label, int len)
+{
+  int rc;
+  TRY_CA_EXCEPT
+  
+  rc = srec_get_top_choice_transcription(hRecog->recm, label, len, 1);
+  if (rc != 0)
+    return REJECT_RESULT;
+    
+  return FULL_RESULT;
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+ESR_ReturnCode CA_ResultStripSlotMarkers(char *text)
+{
+  srec_result_strip_slot_markers(text);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode CA_GetRecogID(CA_Recog *hRecog, int *id)
+{
+  srec_get_bestcost_recog_id(hRecog->recm, id);
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode CA_FullResultWordIDs(CA_Recog *hRecog, wordID *wordIDs, size_t* len)
+{
+  return srec_get_top_choice_wordIDs(hRecog->recm, wordIDs, len);
+}
+
+void CA_ClearResults(CA_Recog *hRecog)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hRecog);
+  
+  srec_clear_results(hRecog->recm);
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
+
+
+int CA_RecognitionHasResults(CA_Recog *hRecog)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hRecog);
+  
+  if (!srec_has_results(hRecog->recm))
+    return False;
+  else
+    return True;
+}
+
+int CA_IsEndOfUtteranceByResults(CA_Recog *hRecog)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hRecog);
+  return multi_srec_get_eos_status(hRecog->recm);
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hRecog)
+}
diff --git a/srec/ca/syn_srec.c b/srec/ca/syn_srec.c
new file mode 100644
index 0000000..c02021f
--- /dev/null
+++ b/srec/ca/syn_srec.c
@@ -0,0 +1,359 @@
+/*---------------------------------------------------------------------------*
+ *  syn_srec.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+
+#include "simapi.h"
+#include "pendian.h"
+#include "portable.h"
+#include "srec_context.h"
+#include "ESR_Session.h"
+
+static void free_buffer(char* buffer, const char* allocname)
+{
+  FREE(buffer);
+}
+
+int CA_AttachArbdataToSyntax(CA_Syntax* syntax, CA_Arbdata* allotree)
+{
+  int rc;
+  rc = FST_AttachArbdata(syntax->synx, (srec_arbdata*)allotree);
+  return rc;
+}
+
+int CA_AddWordToSyntax(CA_Syntax* syntax, const char* slot,
+                       const char *phrase, const char* pronunciation,
+                       const int weight)
+{
+  int rc;
+  rc = FST_AddWordToGrammar(syntax->synx, slot, phrase, pronunciation, weight);
+  return rc;
+}
+
+int CA_ResetSyntax(CA_Syntax* syntax)
+{
+  int rc;
+  rc = FST_ResetGrammar(syntax->synx);
+  return rc;
+}
+
+int  CA_CompileSyntax(CA_Syntax *hSyntax)
+{
+  return FST_PrepareContext(hSyntax->synx);
+}
+
+int CA_LoadSyntaxAsExtensible(CA_Syntax *hSyntax, /*CA_Arbdata* arbdata,*/
+                              char *synbase, int num_words_to_add)
+{
+  int rc;
+  TRY_CA_EXCEPT
+  ASSERT(hSyntax);
+  if (hSyntax->setup_count > 0)
+    SERVICE_ERROR(SYNTAX_ALREADY_SETUP);
+
+  rc = FST_LoadContext(synbase, &hSyntax->synx, num_words_to_add);
+  return rc ? 1 : 0;
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hSyntax)
+}
+
+/* this belongs part of the srec_context! */
+/**
+ * @todo document
+ */
+typedef struct
+{
+  asr_int32_t image_format;
+  asr_int32_t image_size;
+  asr_int32_t sizes_signature;
+}
+context_image_header;
+
+int CA_LoadSyntaxFromImage(CA_Syntax *hSyntax, const LCHAR* filename)
+{
+  int result;
+  PFile* fp = NULL;
+  ESR_BOOL isLittleEndian;
+
+  /*
+#if __BYTE_ORDER==__LITTLE_ENDIAN
+   isLittleEndian = ESR_TRUE;
+#else
+   isLittleEndian = ESR_FALSE;
+#endif
+  */
+  isLittleEndian = ESR_TRUE;
+
+  fp = pfopen ( filename, L("rb") );
+/*  CHKLOG(rc, PFileSystemCreatePFile(filename, isLittleEndian, &fp));
+  CHKLOG(rc, PFileOpen(fp, L("rb")));*/
+
+  if ( fp == NULL )
+    goto CLEANUP;
+
+  result = FST_LoadContextFromImage(&hSyntax->synx, fp);
+  pfclose(fp);
+  return result ? 1 : 0;
+CLEANUP:
+  if (fp)
+    pfclose (fp);
+  return 1;
+}
+
+int CA_DumpSyntax(CA_Syntax* hSyntax, const char* basename)
+{
+  int result, totrc = 0;
+  PFile* fp;
+  char buf[256];
+  /*ESR_ReturnCode rc;*/
+
+  sprintf(buf, "%s.PCLG.txt", basename);
+  fp = pfopen ( buf, L("wb") );
+/*  CHKLOG(rc, PFileSystemCreatePFile(buf, ESR_TRUE, &fp));
+  CHKLOG(rc, PFileOpen(fp, L("wb")));*/
+
+  if ( fp == NULL )
+    goto CLEANUP;
+
+  result = FST_DumpGraph(hSyntax->synx, fp);
+  pfclose(fp);
+  totrc += result;
+
+  sprintf(buf, "%s.map", basename);
+  fp = pfopen ( buf, L("wb") );
+/*  CHKLOG(rc, PFileSystemCreatePFile(buf, ESR_TRUE, &fp));
+  CHKLOG(rc, PFileOpen(fp, L("wb")));*/
+
+  if ( fp == NULL )
+    goto CLEANUP;
+
+  result = FST_DumpWordMap(fp, hSyntax->synx->olabels);
+  pfclose(fp);
+  totrc += result;
+
+  sprintf(buf, "%s.Grev2.det.txt", basename);
+  fp = pfopen ( buf, L("wb") );
+/*  CHKLOG(rc, PFileSystemCreatePFile(buf, ESR_TRUE, &fp));
+  CHKLOG(rc, PFileOpen(fp, L("wb")));*/
+
+  if ( fp == NULL )
+    goto CLEANUP;
+
+  if (0)
+    result = FST_DumpReverseWordGraph(hSyntax->synx, fp);
+  pfclose(fp);
+  totrc += result;
+
+  return totrc ? 1 : 0;
+CLEANUP:
+  return 0;
+}
+
+int CA_DumpSyntaxAsImage(CA_Syntax* hSyntax, const char* imagename, int version_number)
+{
+  int result;
+  PFile* fp;
+  /*ESR_ReturnCode rc;*/
+  ESR_BOOL isLittleEndian;
+
+  isLittleEndian = ESR_TRUE;
+
+  fp = pfopen ( imagename, L("wb") );
+/*  CHKLOG(rc, PFileSystemCreatePFile(imagename, isLittleEndian, &fp));
+  CHKLOG(rc, PFileOpen(fp, L("wb")));*/
+
+  if ( fp == NULL )
+    goto CLEANUP;
+
+  if (version_number == 2)
+  {
+    result = FST_DumpContextAsImageV2(hSyntax->synx, fp);
+  }
+  else
+  {
+    PLogError("invalid version number %d\n", version_number);
+    result = FST_FAILED_ON_INVALID_ARGS;
+  }
+  pfclose(fp);
+  return result ? 1 : 0;
+CLEANUP:
+  return 0;
+}
+
+/* from syn_file.c */
+
+CA_Syntax *CA_AllocateSyntax(void)
+{
+  CA_Syntax *hSyntax = NULL;
+  TRY_CA_EXCEPT
+  hSyntax = (CA_Syntax *) CALLOC_CLR(1, sizeof(CA_Syntax), "ca.hSyntax");
+  hSyntax->has_groups = False;
+  hSyntax->has_rules = False;
+  hSyntax->setup_count = 0;
+  hSyntax->ca_rtti = CA_SYNTAX_SIGNATURE;
+  hSyntax->synx = 0;
+  return (hSyntax);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hSyntax)
+}
+
+void CA_FreeSyntax(CA_Syntax *hSyntax)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hSyntax);
+  if (hSyntax->setup_count > 0)
+    SERVICE_ERROR(SYNTAX_ALREADY_SETUP);
+  /* todo: free hSyntax internals */
+  FST_UnloadContext((srec_context*)(hSyntax->synx));
+  hSyntax->synx = 0;
+  FREE((char *) hSyntax);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hSyntax)
+}
+
+CA_Arbdata* CA_LoadArbdata(const char* filename)
+{
+  CA_Arbdata* ca_arbdata = NULL;
+  int rc;
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage(L("CA_LoadArbdata ... from file %s"), filename);
+#endif
+  rc = read_arbdata_from_stream((srec_arbdata**) & ca_arbdata, (char *)filename, 0);
+  return ca_arbdata;
+}
+
+unsigned int CA_ArbdataGetModelVersionID(CA_Arbdata* ca_arbdata)
+{
+  return version_arbdata_models((srec_arbdata*)ca_arbdata);
+}
+
+int CA_ArbdataGetModelIdsForPron(CA_Arbdata* ca_arbdata, 
+								 const char* pronunciation,  /* WB assumed at the edges */
+								 int pronunciation_len,
+								 modelID* pmodelIds)
+{
+	srec_arbdata *allotree = (srec_arbdata*)ca_arbdata;
+	return get_modelids_for_pron( allotree,
+                         pronunciation, pronunciation_len,
+                          pmodelIds);
+}
+
+int CA_ArbdataGetModelIdsForPIC(CA_Arbdata* ca_arbdata, const char lphon, 
+								const char cphon, 
+								const char rphon)
+{
+  phonemeID lphon_ID, cphon_ID, rphon_ID;
+  srec_arbdata *allotree = (srec_arbdata*)ca_arbdata;
+  if(lphon==WBPHONEME_CODE){
+#if !USE_WWTRIPHONE
+    lphon_ID = (phonemeID)allotree->phoneme_index[ SILENCE_CODE];
+#else
+    lphon_ID = WBPHONEME_CODE; //(phonemeID)allotree->phoneme_index[ WBPHONEME_CODE];
+#endif
+  }
+  else
+    lphon_ID = (phonemeID)allotree->phoneme_index[(const unsigned char)lphon];
+  cphon_ID = (phonemeID)allotree->phoneme_index[(const unsigned char)cphon];
+  if(rphon==WBPHONEME_CODE){
+#if !USE_WWTRIPHONE
+    rphon_ID = (phonemeID)allotree->phoneme_index[ SILENCE_CODE];
+#else
+    rphon_ID = WBPHONEME_CODE; //(phonemeID)allotree->phoneme_index[ WBPHONEME_CODE];
+#endif
+  }
+  else
+    rphon_ID = (phonemeID)allotree->phoneme_index[(const unsigned char)rphon];
+  return (modelID)get_modelid_for_pic(allotree, lphon_ID, cphon_ID, rphon_ID);
+}
+
+void CA_FreeArbdata(CA_Arbdata* ca_arbdata)
+{
+  free_buffer((char*)ca_arbdata, "srec.arbdata");
+}
+/* from syn_basi.c */
+
+int CA_SetupSyntaxForRecognizer(CA_Syntax *hSyntax, CA_Recog *hRecog)
+{
+  int rc;
+  const char* rule = "ROOT";
+  rc = activate_grammar_for_recognition(hRecog->recm, hSyntax->synx, rule);
+  return rc;
+}
+
+int CA_IsEnrollmentSyntax(CA_Syntax *hSyntax)
+{
+  return FST_IsVoiceEnrollment( hSyntax->synx);
+}
+
+int CA_CeilingSyntaxForRecognizer(CA_Syntax *hSyntax, CA_Recog *hRecog)
+{
+  if(!hSyntax || !hRecog) 
+	  return 1;
+  if(!hSyntax->synx || !hRecog->recm) 
+	  return 1;
+  hSyntax->synx->max_searchable_nodes = hRecog->recm->max_fsm_nodes;
+  hSyntax->synx->max_searchable_arcs  = hRecog->recm->max_fsm_arcs;
+  return 0;
+}
+
+/* checks if the phrase is in the grammar node, 0=in 1=not.in */
+int CA_CheckTranscription(CA_Syntax *hSyntax, const char *transcription, int no)
+{
+  int rc;
+  char literal[512];
+  size_t max_literal_len = 512;
+  srec_context* context = hSyntax->synx;
+  rc = FST_CheckPath(context, transcription, literal, max_literal_len);
+  if (rc == 0) strcpy((char*)transcription, literal);
+  return rc;
+}
+
+/*---------------------------------------------------------------------------*
+ *                                                                           *
+ * do nothing functions                                                      *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/* from syn_basi.c */
+
+
+void CA_ClearSyntaxForRecognizer(CA_Syntax *hSyntax, CA_Recog *hRecog)
+{
+  int rc;
+  hSyntax = NULL; /* not used */
+  rc = clear_grammars_for_recognition(hRecog->recm);
+  return;
+}
diff --git a/srec/ca/utt_basi.c b/srec/ca/utt_basi.c
new file mode 100644
index 0000000..0256107
--- /dev/null
+++ b/srec/ca/utt_basi.c
@@ -0,0 +1,245 @@
+/*---------------------------------------------------------------------------*
+ *  utt_basi.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "simapi.h"
+#include "portable.h"
+
+#include "../clib/fpi_tgt.inl"
+
+static const char utt_basi[] = "$Id: utt_basi.c,v 1.6.6.8 2007/10/15 18:06:24 dahan Exp $";
+
+
+CA_Utterance *CA_AllocateUtterance(void)
+{
+  CA_Utterance *hUtt = NULL;
+  TRY_CA_EXCEPT
+
+  hUtt = (CA_Utterance *) CALLOC_CLR(1, sizeof(CA_Utterance), "ca.hUtt");
+  hUtt->ca_rtti = CA_UTTERANCE_SIGNATURE;
+  return (hUtt);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+void CA_FreeUtterance(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+
+  FREE((char *) hUtt);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+int CA_InitUtteranceForFrontend(CA_Utterance *hUtt,
+                                CA_FrontendInputParams *hFrontPar)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  ASSERT(hFrontPar > 0);
+  if (hUtt->data.utt_type != 0)
+    SERVICE_ERROR(UTTERANCE_ALREADY_INITIALISED);
+
+  init_utterance(&hUtt->data, LIVE_INPUT, 3*hFrontPar->mel_dim,  /* TODO: change to proper function */
+                 DEFAULT_BUFFER_SIZE, KEEP_FRAMES,
+                 hFrontPar->mel_dim, 1);
+  if (hFrontPar->do_skip_even_frames)
+    set_voicing_durations(&hUtt->data, hFrontPar->voice_duration / 2,
+                          hFrontPar->quiet_duration / 2,
+                          hFrontPar->unsure_duration / 2,
+                          hFrontPar->start_windback / 2);
+  else
+    set_voicing_durations(&hUtt->data, hFrontPar->voice_duration,
+                          hFrontPar->quiet_duration,
+                          hFrontPar->unsure_duration,
+                          hFrontPar->start_windback);
+  return (0);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+
+}
+
+
+void CA_ClearUtterance(CA_Utterance *hUtt)
+{
+
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type == 0)
+  {
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+  }
+
+  if (hUtt->data.utt_type == LIVE_INPUT)
+  {
+    free_utterance(&hUtt->data);
+    hUtt->data.utt_type = 0;
+  }
+  else
+  {
+    SERVICE_ERROR(UTTERANCE_UNKNOWN);
+  }
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+int CA_AdvanceUtteranceFrame(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  int status_code;
+
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+
+  status_code = advance_utterance_frame(&hUtt->data);
+  return (status_code);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+int CA_UtteranceHasVoicing(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+
+  return (hUtt->data.gen_utt.frame->voicingDetected);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+void CA_UnlockUtteranceForInput(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+  ASSERT(!isFrameBufferActive(hUtt->data.gen_utt.frame));
+  startFrameCollection(hUtt->data.gen_utt.frame);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+void CA_LockUtteranceFromInput(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+  ASSERT(isFrameBufferActive(hUtt->data.gen_utt.frame));
+
+
+  stopFrameCollection(hUtt->data.gen_utt.frame);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+void CA_ResetVoicing(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+
+  clearEndOfUtterance(hUtt->data.gen_utt.frame);
+  clearC0Entries(hUtt->data.gen_utt.frame);
+  startFrameCollection(hUtt->data.gen_utt.frame);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+void CA_FlushUtteranceFrames(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+
+  setRECframePtr(hUtt->data.gen_utt.frame, 0, 0);
+  releaseBlockedFramesInBuffer(hUtt->data.gen_utt.frame);
+  hUtt->data.gen_utt.last_push = NULL;
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+void CA_SetEndOfUtteranceByLevelTimeout(CA_Utterance *hUtt, long timeout, long holdOff)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+
+  setupEndOfUtterance(hUtt->data.gen_utt.frame, timeout, holdOff);
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
+int CA_UtteranceHasEnded(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
+
+  return (utterance_ended(&hUtt->data));
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
diff --git a/srec/ca/utt_data.c b/srec/ca/utt_data.c
new file mode 100644
index 0000000..367f9b0
--- /dev/null
+++ b/srec/ca/utt_data.c
@@ -0,0 +1,84 @@
+/*---------------------------------------------------------------------------*
+ *  utt_data.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "simapi.h"
+#include "portable.h"
+#include "../clib/fpi_tgt.inl"
+
+static const char utt_data[] = "$Id: utt_data.c,v 1.8.6.6 2007/10/15 18:06:24 dahan Exp $";
+
+
+int CA_SeekStartOfUtterance(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  int gap = 0;
+
+  ASSERT(hUtt);
+
+  if (utterance_started(&hUtt->data))
+  {
+    if ((gap = getBlockGap(hUtt->data.gen_utt.frame)) > 0)
+      (void) setRECframePtr(hUtt->data.gen_utt.frame, gap, 1);
+    if (hUtt->data.gen_utt.frame->holdOffPeriod > 0)
+      setRECframePtr(hUtt->data.gen_utt.frame, -MIN(hUtt->data.gen_utt.frame->holdOffPeriod, getFrameGap(hUtt->data.gen_utt.frame)), 1);
+    while (!(rec_frame_voicing_status(hUtt->data.gen_utt.frame) & VOICE_BIT))
+    {
+      incRECframePtr(hUtt->data.gen_utt.frame);
+      if (getFrameGap(hUtt->data.gen_utt.frame) == 0)
+        break;
+    }
+    setRECframePtr(hUtt->data.gen_utt.frame, MIN(hUtt->data.gen_utt.start_windback, getBlockGap(hUtt->data.gen_utt.frame)), 1);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+    PLogMessage("L:  Frame start rewound to %d (%d, %d)", hUtt->data.gen_utt.frame->pullTime,
+                hUtt->data.gen_utt.start_windback,
+                getBlockGap(hUtt->data.gen_utt.frame));
+#endif
+    hUtt->data.gen_utt.last_push = NULL;
+    return hUtt->data.gen_utt.start_windback;
+  }
+  else
+    return 0;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+int CA_GetUnprocessedFramesInUtterance(CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  return (getFrameGap(hUtt->data.gen_utt.frame));
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
+
+
diff --git a/srec/ca/utt_proc.c b/srec/ca/utt_proc.c
new file mode 100644
index 0000000..92f6f16
--- /dev/null
+++ b/srec/ca/utt_proc.c
@@ -0,0 +1,58 @@
+/*---------------------------------------------------------------------------*
+ *  utt_proc.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "simapi.h"
+#include "portable.h"
+
+static const char utt_proc[] = "$Id: utt_proc.c,v 1.4.6.6 2007/10/15 18:06:24 dahan Exp $";
+
+int CA_CalculateUtteranceStatistics(CA_Utterance *hUtt, int start, int end)
+{
+  TRY_CA_EXCEPT
+  int ii, frames = 0;
+  
+  frames = get_background_statistics(hUtt->data.gen_utt.frame,
+                                      -start, -end,
+                                      hUtt->data.gen_utt.backchan,
+                                      hUtt->data.gen_utt.num_chan, 1);
+  
+  /* log_report ("UTT (%d): ", frames); */
+  for (ii = 0; ii < hUtt->data.gen_utt.num_chan; ii++)
+  {
+    evaluate_parameters(hUtt->data.gen_utt.backchan[ii]);
+    /* log_report ("%d ", hUtt->data.gen_utt.backchan[ii]->mean); */
+  }
+  /* log_report ("\n");*/
+  return (frames);
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hUtt)
+}
diff --git a/srec/ca/voc_basi.c b/srec/ca/voc_basi.c
new file mode 100644
index 0000000..c8f0ab7
--- /dev/null
+++ b/srec/ca/voc_basi.c
@@ -0,0 +1,180 @@
+/*---------------------------------------------------------------------------*
+ *  voc_basi.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "simapi.h"
+#include "portable.h"
+
+static const char voc_basi[] = "$Id: voc_basi.c,v 1.11.6.14 2008/01/21 20:30:05 dahan Exp $";
+
+#define ADD_SUNDRY_LABELS 0
+#define ALLOW_UNDERSCORES       1
+#define MAX_WORD_LEN 128
+
+CA_Vocab *CA_AllocateVocabulary(void)
+{
+  CA_Vocab *hVocab = NULL;
+  
+  TRY_CA_EXCEPT
+  
+  hVocab = (CA_Vocab *) CALLOC_CLR(1, sizeof(CA_Vocab), "ca.hVocab");
+  hVocab->is_loaded = False;
+  hVocab->ca_rtti = CA_VOCABULARY_SIGNATURE;
+  return (hVocab);
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hVocab)
+}
+
+
+void CA_FreeVocabulary(CA_Vocab *hVocab)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hVocab);
+  FREE((char *) hVocab);
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hVocab)
+}
+
+void CA_LoadDictionary(CA_Vocab *hVocab, const LCHAR *vocname, char *phtname, ESR_Locale* locale)
+{
+  TRY_CA_EXCEPT
+#ifndef _RTT
+  
+  ASSERT(hVocab);
+//  if (phtname != NULL && strlen(phtname) > 0)
+//  hVocab->voc.pht_table= read_phoneme_table (phtname);
+
+  if (0 <= read_word_transcription(vocname, &hVocab->voc, locale)) {
+    hVocab->is_loaded = True;
+  } else {
+    hVocab->is_loaded = False;
+  }
+  return;
+#else
+  log_report("RTT not in module\n");
+  SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
+  return;
+#endif
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hVocab)
+}
+
+void CA_UnloadDictionary(CA_Vocab *hVocab)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hVocab);
+  if (hVocab->is_loaded == False)
+    SERVICE_ERROR(VOCAB_NOT_LOADED);
+    
+  delete_word_transcription(&hVocab->voc);
+  
+  hVocab->is_loaded = False;
+  return;
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hVocab)
+}
+
+
+int CA_CheckEntryInDictionary(CA_Vocab *hVocab, const char *label)
+{
+  int pronCount;
+  char prons[256];
+  TRY_CA_EXCEPT
+  ASSERT(hVocab);
+  
+  pronCount = get_prons(&hVocab->voc, label, prons, sizeof(prons));
+
+  if (pronCount <= 0) {
+    /* try lower case, the general convention for dictionaries */
+    unsigned i;
+    char lower[128];
+    for (i = 0; label[i]; i++) {
+      if (i >= sizeof(lower) - 1) return -1;
+      lower[i] = tolower(label[i]);
+    }
+    lower[i] = 0;
+    pronCount = get_prons(&hVocab->voc, lower, prons, sizeof(prons));
+    if (pronCount <= 0) return False;
+  }
+   
+  return (True);
+  
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hVocab)
+}
+
+int CA_GetFullEntryInDictionary(CA_Vocab *hVocab, const char *label, char *pron, int *pronSize, int pronMaxSize);
+
+int CA_GetEntryInDictionary(CA_Vocab *hVocab, const char *label, char *pron, int *pronSize, int pronMaxSize)
+{
+  int rc;
+  TRY_CA_EXCEPT
+  ASSERT(hVocab);
+  rc = CA_GetFullEntryInDictionary(hVocab, label, pron, pronSize, pronMaxSize);
+  return rc;
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hVocab)
+}
+
+/* this looks up the entry entire, underscores and all, eg "good_bye" */
+
+int CA_GetFullEntryInDictionary(CA_Vocab *hVocab, const char *label, char *pron, int *pronSize, int pronMaxSize)
+{
+  TRY_CA_EXCEPT
+  int pronCount;
+  
+  ASSERT(hVocab);
+  
+  pronCount = get_prons(&hVocab->voc, label, pron, pronMaxSize);
+  if (pronCount <= 0)
+  {
+    /* try lower case, the general convention for dictionaries */
+    unsigned i;
+    char lower[128];
+    for (i = 0; label[i]; i++) {
+      if (i >= sizeof(lower) - 1) return -1;
+      lower[i] = tolower((unsigned char)label[i]);
+    }
+    lower[i] = 0;
+    pronCount = get_prons(&hVocab->voc, lower, pron, pronMaxSize);
+    if (pronCount <= 0) return False;
+  }
+  //*pronSize = pronCount;
+  
+  return (True);
+  
+  BEG_CATCH_CA_EXCEPT
+    END_CATCH_CA_EXCEPT(hVocab)
+}
diff --git a/srec/cfront/ca_cms.c b/srec/cfront/ca_cms.c
new file mode 100644
index 0000000..c21d284
--- /dev/null
+++ b/srec/cfront/ca_cms.c
@@ -0,0 +1,250 @@
+/*---------------------------------------------------------------------------*
+ *  ca_cms.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/************************************************************************
+ * CA_Wave Methods
+ ************************************************************************/
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "frontapi.h"
+#include "portable.h"
+#include "swicms.h"
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid :
+                           "$Id: ca_cms.c,v 1.7.6.11 2008/05/27 16:08:28 dahan Exp $";
+#endif
+
+
+ESR_ReturnCode CA_SetCMSParameters ( CA_Wave *hWave, const LCHAR *param_string )
+{
+  ESR_ReturnCode set_status;
+
+  if ( hWave != NULL )
+    set_status = swicms_set_cmn ( hWave->data.channel->swicms, param_string );
+  else
+    set_status = ESR_INVALID_STATE;
+  return ( set_status );
+}
+
+
+ESR_ReturnCode CA_GetCMSParameters ( CA_Wave *hWave, const LCHAR **param_string )
+{
+  ESR_ReturnCode get_status;
+
+  if ( hWave != NULL )
+    get_status = swicms_get_cmn ( hWave->data.channel->swicms, param_string );
+  else
+    get_status = ESR_INVALID_STATE;
+  return ( get_status );
+}
+
+
+void CA_ReLoadCMSParameters(CA_Wave *hWave, const char *basename)
+{
+  ASSERT(hWave);
+  if (hWave->is_configuredForAgc == False)
+    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
+  if (!basename) {
+    if( swicms_init(hWave->data.channel->swicms) )
+      SERVICE_ERROR(UNEXPECTED_DATA_ERROR);
+  }
+  else
+    SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
+}
+
+
+void CA_SaveCMSParameters(CA_Wave *hWave, const char *basename)
+{
+	SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
+}
+
+
+void CA_LoadCMSParameters(CA_Wave *hWave, char *basename,
+                          CA_FrontendInputParams *hFrontArgs)
+{
+  TRY_CA_EXCEPT
+#if !defined(_RTT)
+  ASSERT(hWave);
+  /* ASSERT (basename); */
+  ASSERT(hFrontArgs);
+  
+  if (hWave->is_configuredForAgc == True)
+    SERVICE_ERROR(CONFIGURED_CMS_AND_AGC);
+  if (hWave->is_attached == True)
+    SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
+    
+  hWave->data.channel->channorm = create_channel_normalization();
+  /* load_channel_parameters (basename, hWave->data.channel->channorm);
+     not used anymore, rather we spec this is the parfile directly */
+  hWave->data.channel->channorm->dim = MAX_CHAN_DIM;
+  setup_channel_normalization(hWave->data.channel->channorm,
+                              hWave->data.channel->spchchan,
+#if NORM_IN_IMELDA
+                              hFrontArgs->mel_dim * 3, /* TODO: find appropriate number */
+#else
+                              hFrontArgs->mel_dim,
+#endif
+                              hFrontArgs->forget_factor);
+  hWave->data.channel->mel_dim = hFrontArgs->mel_dim; /* TODO: more checks */
+  
+  hWave->data.channel->swicms = (swicms_norm_info*)CALLOC(1, sizeof(swicms_norm_info), "cfront.swicms");
+  if( swicms_init(hWave->data.channel->swicms) )
+    SERVICE_ERROR(UNEXPECTED_DATA_ERROR);
+  hWave->is_configuredForAgc = True;
+#else
+  log_report("Channel normalization or RTT not in module\n");
+  SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
+#endif
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hFrontend);
+}
+
+void CA_ClearCMSParameters(CA_Wave *hWave)
+{
+  TRY_CA_EXCEPT
+#if NORM_IN_IMELDA
+  int dim = hWave->data.channel->mel_dim * 3;
+#else
+  int dim = hWave->data.channel->mel_dim;
+#endif
+  
+  ASSERT(hWave);
+  if (hWave->is_configuredForAgc == False)
+    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
+  if (hWave->is_attached == True)
+    SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
+    
+  clear_channel_normalization(hWave->data.channel->spchchan, dim);
+  destroy_channel_normalization(hWave->data.channel->channorm);
+  hWave->data.channel->channorm = NULL;
+  hWave->is_configuredForAgc = False;
+  
+  FREE(hWave->data.channel->swicms);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
+
+void CA_AttachCMStoUtterance(CA_Wave *hWave, CA_Utterance *hUtt)
+{
+  /* Link the utt's spchchan to the wave object's. This is checked in AGC fn
+      to ensure that the correct Utt & Wave objects have been supplied.
+  */
+  
+  TRY_CA_EXCEPT
+  ASSERT(hUtt);
+  ASSERT(hWave);
+  if (hWave->is_configuredForAgc == False)
+    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
+  if (hWave->is_attached == True)
+    SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
+    
+  ASSERT(hWave->data.channel->channorm);
+  hUtt->data.gen_utt.spchchan = hWave->data.channel->spchchan;
+  hUtt->data.gen_utt.channorm = hWave->data.channel->channorm;
+  hUtt->data.gen_utt.swicms  = hWave->data.channel->swicms;
+  hUtt->data.gen_utt.do_channorm = True;
+#if NORM_IN_IMELDA       /* TODO: find appropriate number */
+  hUtt->data.gen_utt.num_chan = 3 * hWave->data.channel->mel_dim;
+#else
+  hUtt->data.gen_utt.num_chan = hWave->data.channel->mel_dim;
+#endif
+  hWave->is_configuredForAgc = True;
+  hWave->is_attached = True;
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hFrontend);
+}
+
+ESR_ReturnCode CA_IsCMSAttachedtoUtterance(CA_Wave* hWave, ESR_BOOL* isAttached)
+{
+  if (hWave == NULL || isAttached == NULL)
+    return ESR_INVALID_ARGUMENT;
+  *isAttached = hWave->is_attached;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode CA_IsConfiguredForAgc(CA_Wave* hWave, ESR_BOOL* isConfigured)
+{
+  if (hWave == NULL || isConfigured == NULL)
+    return ESR_INVALID_ARGUMENT;
+  *isConfigured = hWave->is_configuredForAgc;
+  return ESR_SUCCESS;
+}
+
+void CA_DetachCMSfromUtterance(CA_Wave *hWave, CA_Utterance *hUtt)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hWave);
+  
+  if (hWave->is_configuredForAgc == False)
+    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
+  if (hUtt && hUtt->data.gen_utt.do_channorm == False)
+    SERVICE_ERROR(UTTERANCE_INVALID);
+  if (hWave->is_attached == False)
+    SERVICE_ERROR(UNATTACHED_CMS_AND_AGC);
+  if (hWave->data.channel->spchchan && hUtt->data.gen_utt.spchchan
+      && hWave->data.channel->spchchan != hUtt->data.gen_utt.spchchan)
+  {
+    log_report("Mismatched channel and utterance\n");
+    SERVICE_ERROR(BAD_CHANNEL);
+  } /* TODO: find a better code */
+  
+  hUtt->data.gen_utt.channorm = NULL;
+  hUtt->data.gen_utt.spchchan = NULL;
+  hUtt->data.gen_utt.do_channorm = False;
+  hWave->is_attached = False;
+  
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave)
+}
+
+void CA_CalculateCMSParameters(CA_Wave *hWave)
+{
+  TRY_CA_EXCEPT
+  
+  if (hWave->is_configuredForAgc == False)
+    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
+  if (hWave->is_attached == False)
+    SERVICE_ERROR(UNATTACHED_CMS_AND_AGC);
+    
+  estimate_normalization_parameters(hWave->data.channel->channorm,
+                                    hWave->data.channel->spchchan,
+#if NORM_IN_IMELDA       /* TODO: find appropriate number */
+                                    hWave->data.channel->mel_dim * 3);
+#else
+                                    hWave->data.channel->mel_dim);
+#endif
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
diff --git a/srec/cfront/ca_front.c b/srec/cfront/ca_front.c
new file mode 100644
index 0000000..4c6f662
--- /dev/null
+++ b/srec/cfront/ca_front.c
@@ -0,0 +1,200 @@
+/*---------------------------------------------------------------------------*
+ *  ca_front.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/************************************************************************
+ * CA_Frontend Methods
+ ************************************************************************/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#include "frontapi.h"
+
+#include "portable.h"
+
+#ifdef USE_COMP_STATS
+void stop_front_end_clock(void);
+void start_front_end_clock(void);
+#endif
+
+/*  These are front-end functions
+*/
+
+CA_Frontend *CA_AllocateFrontend(float srcscale, int offset,
+                                 float sinkscale)
+{
+  CA_Frontend *hFrontend = NULL;
+  TRY_CA_EXCEPT
+  hFrontend = (CA_Frontend *) CALLOC_CLR(1, sizeof(CA_Frontend), "ca.hFrontend");
+  hFrontend->src_scale = srcscale;
+  hFrontend->sink_scale = sinkscale;
+  hFrontend->offset = offset;
+  
+  hFrontend->is_configured = False;
+  hFrontend->is_filter_loaded = False;
+  
+  hFrontend->ca_rtti = CA_FRONTEND_SIGNATURE;
+  return (hFrontend);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hFrontend)
+}
+
+void CA_FreeFrontend(CA_Frontend *hFrontend)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hFrontend);
+  if (hFrontend->is_configured == True)
+    SERVICE_ERROR(CONFIGURED_FRONTEND);
+  if (hFrontend->is_filter_loaded == True)
+    SERVICE_ERROR(SPEC_FILTER_CONFIGURED);
+    
+  FREE((char *) hFrontend);
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hFrontend);
+}
+
+
+void CA_ConfigureFrontend(CA_Frontend *hFrontend,
+                          CA_FrontendInputParams *hFrontArgs)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hFrontend);
+  ASSERT(hFrontArgs);
+  
+  if (hFrontArgs->is_loaded == False)
+    SERVICE_ERROR(FRONTEND_INPUT_NOT_LOADED);
+  if (hFrontend->is_configured == True)
+    SERVICE_ERROR(CONFIGURED_FRONTEND);
+    
+  hFrontend->config = create_config_object() ;
+  setup_config_object(hFrontend->config, hFrontArgs);
+  hFrontend->is_configured = True;
+  
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hFrontend);
+}
+
+void CA_UnconfigureFrontend(CA_Frontend *hFrontend)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hFrontend);
+  if (hFrontend->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_FRONTEND);
+    
+  clear_config_object(hFrontend->config);
+  delete_config_object(hFrontend->config);
+  hFrontend->config = NULL;
+  
+  hFrontend->is_configured = False;
+  
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hFrontend);
+}
+
+
+int CA_MakeFrame(CA_Frontend *hFrontend, CA_Utterance *hUtt, CA_Wave *hWave)
+{
+  /* Note: samdata has already been loaded
+  */
+  int valid;
+  TRY_CA_EXCEPT
+  featdata framdata[MAX_CHAN_DIM], voicedata = 0;
+  
+  ASSERT(hFrontend);
+  ASSERT(hUtt);
+  ASSERT(hWave);
+  
+  ASSERT(hUtt->data.gen_utt.frame->uttDim <= MAX_CHAN_DIM);
+  
+  if (hFrontend->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_FRONTEND);
+  if (hUtt->data.utt_type != LIVE_INPUT)
+    SERVICE_ERROR(UTTERANCE_INVALID);
+    
+#ifdef USE_COMP_STATS
+  start_front_end_clock();
+#endif
+  
+  
+  if (hUtt->data.gen_utt.frame->haveVoiced)
+    valid = make_frame(hWave->data.channel, hFrontend->config->waveobj,
+                       hFrontend->config->freqobj, hFrontend->config->cepobj,
+                       &hWave->voice, hWave->data.income, hWave->data.outgo,
+                       hWave->data.num_samples,
+                       framdata, &voicedata);
+  else
+    valid = make_frame(hWave->data.channel, hFrontend->config->waveobj,
+                       hFrontend->config->freqobj,
+                       hFrontend->config->cepobj,
+                       NULL, hWave->data.income, hWave->data.outgo,
+                       hWave->data.num_samples,
+                       framdata, &voicedata);
+                       
+  /*  Ignore first 3 frames. This prevents a spike due to dc offset.
+  **  This effect would normally be removed by loading the window
+  **  overhang but we are not doing that (tricky).
+  */
+  if (valid > 0 && hWave->data.channel->frame_count > (DELTA + 3))
+  {
+    if (pushSingleFEPframe(hUtt->data.gen_utt.frame,
+                           framdata, voicedata) != False)
+      valid = False;
+  }
+  else valid = False;
+  
+#ifdef USE_COMP_STATS
+  stop_front_end_clock();
+#endif
+  
+  return (valid);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hFrontend);
+}
+
+int CA_GetFrontendUtteranceDimension(CA_Frontend *hFrontend)
+{
+  int dim;
+  TRY_CA_EXCEPT
+  ASSERT(hFrontend);
+  ASSERT(hFrontend->config);
+  
+  if (hFrontend->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_FRONTEND);
+    
+  /* TODO: Determine the dim exactly */
+  dim = 2 * hFrontend->config->cepobj->mel_dim;
+  if (hFrontend->config->cepobj->do_dd_mel)
+    dim += hFrontend->config->cepobj->mel_dim;
+  return (dim);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hFrontend);
+}
diff --git a/srec/cfront/ca_wave.c b/srec/cfront/ca_wave.c
new file mode 100644
index 0000000..8d697df
--- /dev/null
+++ b/srec/cfront/ca_wave.c
@@ -0,0 +1,306 @@
+/*---------------------------------------------------------------------------*
+ *  ca_wave.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/************************************************************************
+ * CA_Wave Methods
+ ************************************************************************/
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+
+#include "frontapi.h"
+#include "portable.h"
+
+/* CA_Wave functions. See simpars.c for frontend params */
+
+CA_Wave *CA_AllocateWave(char type)
+{
+  CA_Wave *hWave = NULL;
+  TRY_CA_EXCEPT
+  hWave = (CA_Wave *) CALLOC_CLR(1, sizeof(CA_Wave), "cfront.hWave");
+#ifndef _RTT
+  hWave->data.device.file.typ = type;
+#endif
+  hWave->data.channel = create_channel_object();
+  hWave->is_configured = False;
+  hWave->is_configuredForVoicing = False;
+  hWave->ca_rtti = CA_WAVE_SIGNATURE;
+  return (hWave);
+
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
+
+void CA_ConfigureWave(CA_Wave *hWave, CA_Frontend *hFrontend)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hWave);
+  ASSERT(hFrontend);
+  ASSERT(FRAMERATE > 0);
+
+  if (hFrontend->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_FRONTEND);
+  if (hWave->is_configured == True)
+    SERVICE_ERROR(CONFIGURED_WAVE);
+
+  ASSERT(hFrontend->config->waveobj->samplerate);
+
+  hWave->data.scale  = hFrontend->src_scale;
+  hWave->data.offset = hFrontend->offset;
+  setup_channel_object(hWave->data.channel, hFrontend->config->waveobj,
+                       hFrontend->config->freqobj,
+                       hFrontend->config->cepobj);
+
+  hWave->data.samplerate = hFrontend->config->waveobj->samplerate;
+
+  /* Buffer size is set to one frame's worth of data */
+  create_sample_buffer(&hWave->data,
+                       hFrontend->config->waveobj->samplerate / FRAMERATE,
+                       hFrontend->config->freqobj->window_length);
+
+  hWave->data.stats.highclip_level = hFrontend->config->waveobj->high_clip;
+  hWave->data.stats.lowclip_level  = hFrontend->config->waveobj->low_clip;
+  hWave->data.stats.max_per10000_clip =
+    hFrontend->config->waveobj->max_per10000_clip;
+  hWave->data.stats.max_dc_offset =
+    hFrontend->config->waveobj->max_dc_offset;
+  hWave->data.stats.high_noise_level_bit =
+    hFrontend->config->waveobj->high_noise_level_bit;
+  hWave->data.stats.low_speech_level_bit =
+    hFrontend->config->waveobj->low_speech_level_bit;
+  hWave->data.stats.min_samples =
+    hFrontend->config->waveobj->min_samples;
+
+  hWave->is_configured = True;
+  return;
+
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
+
+void CA_ConfigureVoicingAnalysis(CA_Wave *hWave, CA_FrontendInputParams *hFrontPar)
+{
+  TRY_CA_EXCEPT
+
+  hWave->voice.margin = hFrontPar->voice_margin;
+  hWave->voice.fast_margin = hFrontPar->fast_voice_margin;
+  hWave->voice.quiet_margin = hFrontPar->tracker_margin;
+  hWave->voice.voice_duration = hFrontPar->voice_duration;
+  hWave->voice.quiet_duration = hFrontPar->quiet_duration;
+  hWave->is_configuredForVoicing = True;
+  return;
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hWave)
+}
+
+void CA_UnconfigureWave(CA_Wave *hWave)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hWave);
+  if (hWave->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_WAVE);
+
+  clear_channel_object(hWave->data.channel);
+  free_sample_buffer(&hWave->data);
+  hWave->data.samplerate = 0;
+
+  hWave->is_configured = False;
+
+/* The following is not correct in this place as it does not match where it is set to TRUE.
+ * This is needed for the sample rate change function.
+ * hWave->is_configuredForVoicing = False;
+ */
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
+
+void CA_FreeWave(CA_Wave *hWave)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hWave);
+
+  if (hWave->is_configured == True)
+    SERVICE_ERROR(CONFIGURED_WAVE);
+
+  delete_channel_object(hWave->data.channel);
+  FREE((char *) hWave);
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
+
+int CA_OpenWaveFromDevice(CA_Wave *hWave,
+                          int wave_type,
+                          int samplerate,
+                          int device_id,
+                          int device_type)
+{
+  TRY_CA_EXCEPT
+  ASSERT(hWave);
+  ASSERT(device_id >= 0);
+  ASSERT(device_type == WAVE_DEVICE_RAW);
+
+  if (hWave->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_WAVE);
+  if (hWave->is_configuredForVoicing == False)
+    SERVICE_ERROR(UNCONFIGURED_WAVE);
+
+  reset_channel_object(hWave->data.channel);
+  hWave->data.wave_type = wave_type;
+  hWave->data.device_type = device_type;
+  hWave->data.device.ext.op = WAVE_DEVICE_INPUT;
+  hWave->data.samplerate = samplerate;
+  init_voicing_analysis(&hWave->voice);
+
+  reset_sig_check(&hWave->data.stats);
+  hWave->data.do_stats = ESR_TRUE;
+
+  return (True);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
+
+
+ESR_BOOL CA_DoSignalCheck(CA_Wave *hWave,
+                     ESR_BOOL *clipping,
+                     ESR_BOOL *dcoffset,
+                     ESR_BOOL *highnoise,
+                     ESR_BOOL *quietspeech,
+                     ESR_BOOL *too_few_samples,
+                     ESR_BOOL *too_many_samples)
+{
+  TRY_CA_EXCEPT
+
+  int nsam;
+  int pclowclip;
+  int pchighclip;
+  int dc_offset;
+  int amp;
+  int pc5;
+  int pc95;
+  int overflow;
+  ESR_BOOL error;
+  wave_stats *ws;
+
+  ASSERT(hWave);
+
+  ws = &hWave->data.stats;
+  get_sig_check(ws, &nsam, &pclowclip, &pchighclip, &dc_offset, &amp,
+                &pc5, &pc95, &overflow);
+
+  if ((pclowclip + pchighclip) > ws->max_per10000_clip)
+    *clipping = ESR_TRUE;
+  else     *clipping = ESR_FALSE;
+  if (abs(dc_offset) > ws->max_dc_offset) *dcoffset = ESR_TRUE;
+  else     *dcoffset = ESR_FALSE;
+  if (pc5 >= ws->high_noise_level_bit) *highnoise = ESR_TRUE;
+  else     *highnoise = ESR_FALSE;
+  if (pc95 < ws->low_speech_level_bit) *quietspeech = ESR_TRUE;
+  else     *quietspeech = ESR_FALSE;
+  if (nsam < ws->min_samples)  *too_few_samples = ESR_TRUE;
+  else     *too_few_samples = ESR_FALSE;
+  if (overflow)    *too_many_samples = ESR_TRUE;
+  else     *too_many_samples = ESR_FALSE;
+
+  /* This is better than casting the logical expression to ESR_BOOL */
+  if (*clipping || *dcoffset || *highnoise || *quietspeech || *too_few_samples || *too_many_samples)
+  	error = ESR_TRUE;
+  else
+  	error = ESR_FALSE;
+
+  return(error);
+
+  BEG_CATCH_CA_EXCEPT
+  END_CATCH_CA_EXCEPT(hWave)
+}
+
+void CA_CloseDevice(CA_Wave *hWave)
+{
+  TRY_CA_EXCEPT
+  if (hWave->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_WAVE);
+
+  ASSERT(hWave->data.device.ext.op == WAVE_DEVICE_INPUT);  /* because I don't have output yet! */
+
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
+
+
+int CA_LoadSamples(CA_Wave *hWave,
+                   samdata *pPCMData,
+                   int sampleCount)
+{
+  ASSERT(hWave);
+  ASSERT(pPCMData);
+
+  TRY_CA_EXCEPT
+  if (hWave->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_WAVE);
+  if (hWave->data.device_type != WAVE_DEVICE_RAW)
+    SERVICE_ERROR(BAD_WAV_DEVICE);
+  if (hWave->data.window_size < sampleCount)
+    SERVICE_ERROR(INCORRECT_SAMPLERATE);
+
+  memcpy(hWave->data.income,
+         pPCMData,
+         sampleCount * sizeof(samdata));
+
+  hWave->data.num_samples = sampleCount;
+
+  if (hWave->data.do_stats)
+    acc_wave_stats(&hWave->data);
+
+  return (True);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
+
+void CA_ConditionSamples(CA_Wave *hWave)
+{
+  TRY_CA_EXCEPT
+  int ii;
+
+  if (hWave->is_configured == False)
+    SERVICE_ERROR(UNCONFIGURED_WAVE);
+
+  if (hWave->data.offset != 0)
+    for (ii = 0; ii < hWave->data.num_samples; ii++)
+      hWave->data.income[ii] = RANGE(hWave->data.income[ii] +
+                                     hWave->data.offset, SHRT_MIN, SHRT_MAX);
+  if (hWave->data.scale != 1.0)
+    for (ii = 0; ii < hWave->data.num_samples; ii++)
+      hWave->data.income[ii] = (short) RANGE(hWave->data.income[ii] *
+                                             hWave->data.scale, SHRT_MIN, SHRT_MAX);
+  return;
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(hWave);
+}
diff --git a/srec/cfront/cheldsp4.c b/srec/cfront/cheldsp4.c
new file mode 100644
index 0000000..c94db42
--- /dev/null
+++ b/srec/cfront/cheldsp4.c
@@ -0,0 +1,256 @@
+/*---------------------------------------------------------------------------*
+ *  cheldsp4.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include <stdlib.h>
+#include <limits.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <string.h>
+#include <math.h>
+#include <assert.h>
+
+
+#include "hmm_desc.h"
+#include "voicing.h"
+#include "specnorm.h"
+#include "portable.h"
+#include "front.h"
+#include "portable.h"
+
+#include "sh_down.h"
+#include "memmove.h"
+
+
+#define DEBUG  0
+#define LOG_AS_PRINT 0
+
+
+#if LOG_AS_PRINT /* BP temp debug mode */
+#define log_report printf
+#endif
+
+
+
+/* Rasta */
+#define RASTA_SOFT_START   1   /* if this is not 1, rasta initialization is weighted */
+
+#if RASTA_SOFT_START
+#define RASTA_CONSTANT  0.92
+#define RASTA_SOFT_CONST (RASTA_CONSTANT/(1-RASTA_CONSTANT))
+#else
+#define RASTA_CONSTANT  0.85
+#endif
+
+static void regress(cepdata *rg, cepdata *cp_buf, unsigned short frmind,
+                    int mel_dim);
+static void dd_regress(cepdata *dd, cepdata *cp_buf, unsigned short frmind,
+                       int mel_dim);
+static void scale_data(front_cep *cepobj, featdata *rpram,  featdata *pram1,
+                       featdata *pram2, featdata *ddpram, cepdata *rast,
+                       cepdata *cep, cepdata *rcep, cepdata *ddcep);
+static void pack_frame(front_cep *cepobj, featdata *dest_frame,
+                       featdata *rasta_data, featdata *mel_data,
+                       featdata *del_data, featdata *deldel_data);
+
+
+
+static void regress(cepdata *rg, cepdata*cp_buf, unsigned short frmind,
+                    int mel_dim)
+{
+  int     i, j, d;
+  cepdata val, *cpt;
+  static cepdata a = (cepdata) 0.0;
+
+  if (a == (cepdata) 0.0)
+  {
+    for (j = 1; j <= DELTA; j++)
+      a += j * j;
+    a *= (cepdata) 2.0;
+  }
+  d = DELTA;
+  if (frmind < Q2 - 1)
+  {
+    cpt = cp_buf + (d - 1) * (mel_dim + 1);
+    for (i = 0; i <= mel_dim; i++, cpt++)
+      rg[i] = (cepdata) SHIFT_DOWN((*cpt - *(cpt + mel_dim + 1)), 1 + COSINE_TABLE_SHIFT);  /* Shift does rounding. */
+  } /* reversed */
+  else
+    /* regression coefficients */
+    for (i = 0; i <= mel_dim; i++)
+    {
+      cpt = cp_buf + i;
+			val = (cepdata) 0.;
+			for (j = 0; j < Q2; j++, cpt += (mel_dim + 1))
+				val += (d - j) * SHIFT_DOWN(*cpt, 5);          /* note d-j from j-d */
+			rg[i] = (cepdata) SHIFT_DOWN((bigdata)(val / a), COSINE_TABLE_SHIFT - 5); /* scale down the deltas here */
+		}
+  return;
+}
+cepdata deldel[] = {2, 0, -1, -2, -1, 0, 2};  /* delta - delta */
+void dd_regress(cepdata *dd, cepdata *cp_buf, unsigned short frmind, int mel_dim)
+/*
+**  Computes ALL delta delta mel cep pars. BP 8/96 */
+{
+  int i, j, d;
+  cepdata val, *cpt;
+
+  d = DELTA;
+  if (frmind < Q2 - 1)
+  {
+    cpt = cp_buf + (mel_dim + 1);
+    for (i = 0;i <= mel_dim;i++)
+    {
+      dd[i] = (*(cpt + 2 * (mel_dim + 1) + i)
+               + *(cpt + i)
+               - 2 * (*(cpt + (mel_dim + 1) + i)));
+      /* Undo cosine table shifting */
+      dd[i] = (cepdata) SHIFT_DOWN((bigdata)(dd[i]), COSINE_TABLE_SHIFT);
+    }
+  }
+  else
+  {
+    /* DD coefficient*/
+    for (i = 0; i <= mel_dim; i++)
+    {
+      cpt = cp_buf + i;
+      val = (cepdata) 0.;
+      for (j = 0; j < Q2; j++, cpt += (mel_dim + 1))
+        val += deldel[j] * SHIFT_DOWN((*cpt), 4);    /* Q2 frames forward, not around...? */
+      /* Watch out for overflows here */
+      dd[i] = (cepdata) SHIFT_DOWN((bigdata)(val), COSINE_TABLE_SHIFT - 4);
+    }
+  }
+  return;
+}
+
+
+static void scale_data(front_cep *cepobj, featdata *rpram,  featdata *pram1,
+                       featdata *pram2, featdata *ddpram, cepdata *rast,
+                       cepdata *cep, cepdata *rcep, cepdata *ddcep)
+{
+  size_t   i;
+  bigdata a;
+
+  if (pram1)
+    for (i = 0; i <= cepobj->mel_dim; i++)
+    {
+      /* Now take the costable scaling off the ceps. */
+      ASSERT((cepobj->melA_scale[i] *(float)SHIFT_DOWN(cep[i], COSINE_TABLE_SHIFT))
+             < LONG_MAX);
+      ASSERT((cepobj->melA_scale[i] *(float)SHIFT_DOWN(cep[i], COSINE_TABLE_SHIFT))
+             > -LONG_MAX);
+      a = (bigdata)(SHIFT_DOWN((bigdata)cepobj->melA_scale[i]
+                               * (bigdata) SHIFT_DOWN(cep[i], COSINE_TABLE_SHIFT)
+                               + (bigdata)cepobj->melB_scale[i], BYTERANGE_SHIFT + LOG_SCALE_SHIFT));
+      pram1[i] = (featdata) MAKEBYTE(a);
+    }
+  if (pram2)
+    for (i = 0; i <= cepobj->mel_dim; i++)
+    {
+      ASSERT((cepobj->dmelA_scale[i] *(float)rcep[i]) < LONG_MAX);
+      ASSERT((cepobj->dmelA_scale[i] *(float)rcep[i]) > -LONG_MAX);
+      a = (bigdata) SHIFT_DOWN((bigdata)cepobj->dmelA_scale[i] * (bigdata)rcep[i] +
+                               (bigdata)cepobj->dmelB_scale[i], BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
+      pram2[i] = (featdata) MAKEBYTE(a);
+    }
+
+  /* Double-deltas parameter scaling */
+  if (cepobj->do_dd_mel && ddpram)
+    for (i = 0; i <= cepobj->mel_dim; i++)
+    {
+      ASSERT((cepobj->ddmelA_scale[i] *(float)ddcep[i]) < LONG_MAX);
+      ASSERT((cepobj->ddmelA_scale[i] *(float)ddcep[i]) > -LONG_MAX);
+      a = (bigdata) SHIFT_DOWN((bigdata)cepobj->ddmelA_scale[i] * (bigdata)ddcep[i] +
+                               (bigdata)cepobj->ddmelB_scale[i], BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
+      ddpram[i] = (featdata) MAKEBYTE(a); /* sort out scaling of deldel? */
+    }
+  return;
+}
+
+static void pack_frame(front_cep *cepobj, featdata *dest_frame,
+                       featdata *rasta_data, featdata *mel_data,
+                       featdata *del_data, featdata *deldel_data)
+{
+  size_t ii, cnt;
+
+  cnt = 0;
+  for (ii = 0; ii < cepobj->mel_dim; ii++, cnt++)
+    dest_frame[cnt] = (featdata) mel_data[ii];
+  for (ii = 0; ii < cepobj->mel_dim; ii++, cnt++)
+    dest_frame[cnt] = (featdata) del_data[ii];
+  if (cepobj->do_dd_mel)
+    for (ii = 0; ii < cepobj->mel_dim; ii++, cnt++)
+      dest_frame[cnt] = (featdata) deldel_data[ii];
+
+#if DEBUG
+  log_report("Frame: ");
+  for (ii = 0; ii < 24; ii++)
+    log_report("%d ", dest_frame[ii]);
+  if (cepobj->do_dd_mel)
+    for (ii = 0; ii < cepobj->mel_dim; ii++)
+      log_report("%d ", dest_frame[2*cepobj->mel_dim+ii]);
+  log_report("\n");
+#endif
+  return;
+}
+
+int make_std_frame(front_channel *channel, front_cep *cepobj, featdata *hFrame)
+{
+  featdata rpram[MAX_CEP_DIM+1], spram1[MAX_CEP_DIM+1], spram2[MAX_CEP_DIM+1], ddpram[MAX_CEP_DIM+1];
+  cepdata  rgmcep[MAX_CEP_DIM+1];     /*regression MCEP coef. */
+  cepdata  ddmcep[MAX_CEP_DIM+1];     /*del-del-MCEP coef. */
+  cepdata  rastapar[MAX_CEP_DIM+1];     /*del-del-MCEP coef. */
+
+  channel->frame_valid = False;
+  if (channel->frame_count >= channel->frame_delay)
+  {
+    /*  Part III.   Delta Cepstrum calculations
+    */
+    regress(rgmcep, channel->cep, (unsigned short) channel->frame_count, channel->mel_dim);
+    if (cepobj->do_dd_mel)
+      dd_regress(ddmcep, channel->cep, (unsigned short) channel->frame_count, channel->mel_dim);
+#if DEBUG
+    log_report("Cep before scaling: ");
+    write_scaled_frames(channel->mel_dim + 1, 1,
+                        channel->cep  + (DELTA) *(channel->mel_dim + 1),
+                        D_FIXED, (float)1 / (0x01 << (LOG_SCALE_SHIFT + COSINE_TABLE_SHIFT)));
+    log_report("Delta Cep before scaling: ");
+    write_scaled_frames(channel->mel_dim + 1, 1, rgmcep, D_FIXED, (float)1 / (0x01 << LOG_SCALE_SHIFT));
+    log_report("DeltaDelta Cep before scaling: ");
+    write_scaled_frames(channel->mel_dim + 1, 1, ddmcep, D_FIXED, (float)1 / (0x01 << LOG_SCALE_SHIFT));
+#endif
+    scale_data(cepobj, rpram, spram1, spram2, ddpram, rastapar,
+               channel->cep  + (DELTA) *(channel->mel_dim + 1),  rgmcep, ddmcep);
+#if DEBUG
+    log_report("Cep after scaling: ");
+    write_frames(channel->mel_dim + 1, 1, spram1, D_CHAR);
+    log_report("Delta Cep after scaling: ");
+    write_frames(channel->mel_dim + 1, 1, spram2, D_CHAR);
+    log_report("DeltaDelta Cep after scaling: ");
+    write_frames(channel->mel_dim + 1, 1, ddpram, D_CHAR);
+#endif
+    channel->frame_valid = True;     /* True even if do_skip_even_frames, */
+    pack_frame(cepobj, hFrame, rpram, spram1, spram2, ddpram);
+  } /* >=DELTA */
+
+  channel->frame_count++;
+  return (channel->frame_valid);
+}
diff --git a/srec/cfront/chelfep.c b/srec/cfront/chelfep.c
new file mode 100644
index 0000000..dbd26c4
--- /dev/null
+++ b/srec/cfront/chelfep.c
@@ -0,0 +1,139 @@
+/*---------------------------------------------------------------------------*
+ *  chelfep.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+#include "voicing.h"
+#include "front.h"
+#include "portable.h"
+
+
+#include "../clib/memmove.h"
+#include "sh_down.h"
+
+#define SMOOTH_C0_FOR_VOICING 1
+
+#if SMOOTH_C0_FOR_VOICING
+static featdata smoothed_c0(front_cep *cepobj, front_channel *channel);
+#endif
+
+int make_frame(front_channel *channel, front_wave *waveobj,
+               front_freq *freqobj, front_cep *cepobj,
+               voicing_info *voice,
+               samdata *inFramesWorth, samdata *refFramesWorth,
+               int num_samples,
+               featdata *framdata, featdata *voicedata)
+{
+#if SMOOTH_C0_FOR_VOICING
+  featdata smooth_c0;
+#endif
+  if (freqobj->do_filterbank_input)
+    /* This memmove is in filterbank_emulation  */
+    MEMMOVE(channel->cep + (channel->mel_dim + 1), channel->cep,
+            (Q2 - 1) *(channel->mel_dim + 1), sizeof(float));
+  else
+  {
+		/* not fb input */
+
+    /*  JFR data processing is no longer supported. BP 21-Jul98. */
+
+    /* 2. CEP data processing */
+    filterbank_emulation(channel, waveobj, freqobj, cepobj,
+                         inFramesWorth, refFramesWorth, num_samples);
+    /* if doing fb dump then skip frame making. A top level will
+        read channel->fbo and dump it. */
+    if (freqobj->do_filterbank_dump)
+      return True;
+  }
+  cepstrum_params(channel, waveobj, freqobj, cepobj);
+
+  /* 4. Delta CEP data processing */
+  (void) make_std_frame(channel,  cepobj, framdata);
+  if (!channel->frame_valid)
+    return (channel->frame_valid);
+
+
+  /* 5. Voicing analysis */
+  if (channel->frame_valid)
+  {
+    if (voice != NULL)
+    {
+#if SMOOTH_C0_FOR_VOICING
+      if (cepobj->do_smooth_c0)
+      {
+        smooth_c0 = smoothed_c0(cepobj, channel);
+        *voicedata = (featdata) voicing_analysis(voice, smooth_c0, NULL);
+      }
+      else
+        *voicedata = (featdata) voicing_analysis(voice, framdata[0], NULL);
+
+#else
+      *voicedata = (featdata) voicing_analysis(voice, framdata[0], NULL);
+#endif
+    }
+    if (cepobj->do_skip_even_frames)
+      channel->frame_valid = (channel->frame_count) % 2;
+  }
+  return (channel->frame_valid);
+}
+
+static featdata smoothed_c0(front_cep *cepobj, front_channel *channel)
+{
+  cepdata  val;
+  featdata fval;
+  bigdata  scval;
+
+  if (channel->frame_count <= 1)
+    val = channel->cep[DELTA * (channel->mel_dim+1)];
+  else
+  {
+    val = (channel->cep[(DELTA-1) * (channel->mel_dim+1)] >> 2)
+          + (channel->cep[DELTA * (channel->mel_dim+1)] >> 1)
+          + (channel->cep[(DELTA+1) * (channel->mel_dim+1)] >> 2);
+  }
+
+  /*  Now scaling and byteranging
+  */
+  /* Now take the costable scaling off the ceps. */
+  ASSERT((cepobj->melA_scale[0] *(float)SHIFT_DOWN(val, COSINE_TABLE_SHIFT))
+         < LONG_MAX);
+  ASSERT((cepobj->melA_scale[0] *(float)SHIFT_DOWN(val, COSINE_TABLE_SHIFT))
+         > -LONG_MAX);
+
+  scval = (bigdata)(SHIFT_DOWN((bigdata)cepobj->melA_scale[0]
+                               * (bigdata) SHIFT_DOWN(val, COSINE_TABLE_SHIFT)
+                               + (bigdata)cepobj->melB_scale[0], BYTERANGE_SHIFT + LOG_SCALE_SHIFT));
+  fval = (featdata) MAKEBYTE(scval);
+  return (fval);
+}
+
diff --git a/srec/cfront/chelmel4.c b/srec/cfront/chelmel4.c
new file mode 100644
index 0000000..0ba2930
--- /dev/null
+++ b/srec/cfront/chelmel4.c
@@ -0,0 +1,230 @@
+/*---------------------------------------------------------------------------*
+ *  chelmel4.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include <stdlib.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <string.h>
+#include <math.h>
+#include <limits.h>
+#include <assert.h>
+
+#include "hmm_desc.h"
+#include "front.h"
+#include "portable.h"
+
+#define DEBUG           0
+#define LOG_AS_PRINT 0
+
+#define LPCMAX 100
+
+
+#if LOG_AS_PRINT /* BP temp hack */
+#define log_report printf
+#endif
+
+#include "sh_down.h"
+
+
+/* cepstrum_params has been broken into three functions:
+ filterbank_emulation    - does preemp, window, fft and filtbank
+ gain_adjustment                 - estimates gain
+ cepstrum_params                 - does gain adj.(if on), spec corr and cos transform
+   This enables us to bypass gain adjustment.
+*/
+
+//static void mel_cuberoot_offset(cepdata *fbo, cepdata *ch_off, int nf);
+#if SPEC_CORRECT
+static void mel_spectrum_correction(cepdata *fbo, cepdata *ch_gain, int nf);
+#endif
+static void mel_loglookup_with_offset(front_cep *cepobj,
+                                      front_channel *channel);
+//static void mel_exp(cepdata *fbo, int nf);
+//static void durbin(cepdata *a, cepdata *r, int n);
+//static void lpc_to_cepstral_recursion(cepdata *c, cepdata *a, int nc, int n);
+static void icostrans(cepdata *cs, cepdata fb[], cepdata cep[], int nf, int nc);
+
+
+void cepstrum_params(front_channel *channel, front_wave *waveobj,
+                     front_freq *freqobj, front_cep *cepobj)
+{
+#if SPEC_CORRECT
+  /*  2.30 Apply a spectrum correction */
+  if (cepobj->mel_loop)
+    mel_spectrum_correction(freqobj->filterbank, cepobj->mel_loop, channel->num_freq);
+#endif
+  /*  2.33 Calculate log dB energy values */
+    mel_loglookup_with_offset(cepobj, channel);
+#if DEBUG
+  log_report("Filterbank output: ");
+  write_scaled_frames(freqobj->nf, 1, channel->filterbank, D_FIXED, 1 / (float)LOG_SCALE);
+#endif
+
+  /*  2.34 Cosine transformation */
+  icostrans(cepobj->cs, channel->filterbank, channel->cep,
+            channel->num_freq, cepobj->mel_dim);
+
+#if DEBUG
+  log_report("Cepstrum coefficients: ");
+  write_scaled_frames((cepobj->mel_dim + 1), 1, channel->cep, D_FIXED, (float)1 / (0x01 << (LOG_SCALE_SHIFT + COSINE_TABLE_SHIFT)));
+#endif
+  return;
+}
+
+static void icostrans(cepdata *cs, cepdata fb[], cepdata cep[], int nf, int nc)
+/*
+**  inv rotated-cosine transform
+**  ref Davis and Mermelstein, ASSP 1980 */
+{
+  int   i, j;
+  cepdata *cp;
+  cepdata temp;
+
+  for (i = 0; i <= nc; i++)
+  {
+    cp = &cs[i*nf];
+    for (j = 0, temp = 0; j < nf; j++)
+      temp += fb[j] * cp[j];
+    cep[i] = temp;
+  }
+  return;
+}
+
+#if SPEC_CORRECT
+static void mel_spectrum_correction(cepdata *fbo, cepdata *ch_gain, int nf)
+/*
+**  pwr spect -> filter bank output */
+{
+  int i;
+
+  for (i = 0;i < nf; i++)
+    fbo[i] = fbo[i] * ch_gain[i]; /* TODO: Fixedpt scale up and down */
+  return;
+}
+#endif
+
+static void mel_loglookup_with_offset(front_cep *cepobj,
+                                      front_channel *channel)
+/*
+**  pwr spect -> filter bank output */
+{
+  int ii;
+
+  if (channel->shift > 0)
+    for (ii = 0; ii < channel->num_freq; ii++)
+    {
+      channel->filterbank[ii] = (cepdata) log_lookup(&cepobj->logtab,
+                                (int)(channel->filterbank[ii] +
+                                      SHIFT_DOWN(cepobj->mel_offset[ii], channel->shift)),
+                                channel->shift);
+    }
+  else
+    for (ii = 0; ii < channel->num_freq; ii++)
+    {
+      channel->filterbank[ii] = (cepdata) log_lookup(&cepobj->logtab,
+                                (int)(channel->filterbank[ii] +
+                                      SHIFT_UP(cepobj->mel_offset[ii], -channel->shift)),
+                                channel->shift);
+    }
+
+  return;
+}
+
+//static void mel_exp(cepdata *fbo, int nf)
+///*
+//**  pwr spect -> filter bank output */
+//{
+//  int i;
+//  for (i = 0; i < nf; i++)
+//  {
+//    fbo[i] = (cepdata) exp((double) fbo[i]);
+//  }
+//  return;
+//}
+//
+//static void durbin(
+//  cepdata *a,   /* lpc coefficients           */
+//  cepdata *r,   /* autocorrelation coefficients       */
+//  int n)     /* order of lpc analysis        */
+//{
+//  int i, j;
+//  cepdata A[LPCMAX+1][LPCMAX+1], sum;
+//  cepdata k[LPCMAX+1];
+//  cepdata e[LPCMAX+1];
+//
+//  e[0] = r[0];
+//  for (i = 1; i <= n; i++)
+//  {
+//    sum = 0;
+//    for (j = 1; j <= (i - 1); j++)
+//    {
+//      sum += A[j][i-1] * r[i-j];
+//    }
+//    k[i] = -(r[i] + sum) / e[i-1];
+//    A[i][i] = k[i] ;
+//    for (j = 1; j <= (i - 1); j++)
+//    {
+//      A[j][i] = A[j][i-1] + k[i] * A[i-j][i-1];
+//    }
+//    e[i] = (1 - k[i] * k[i]) * e[i-1];
+//  }
+//  for (j = 1 ; j <= n; j++)
+//  {
+//    a[j] = A[j][n];
+//  }
+//
+//  a[0] = (cepdata) 1.0 ;
+//  return;
+//}
+//
+//static void lpc_to_cepstral_recursion(
+//  cepdata *c,     /* cepstral coefficients        */
+//  cepdata *a,     /* lpc coeffiecients            */
+//  int nc,         /* order of cepstra             */
+//  int n)          /* order of lpc                 */
+//{
+//  int k, i;
+//  cepdata sum;
+//
+//  ASSERT(nc < LPCMAX);
+//
+//  for (i = n + 1; i <= nc; i++)
+//  {
+//    a[i] = (cepdata) 0.0;
+//  }
+//  /* if lpc order less    */
+//  /* than cepstral order  */
+//  /* define higher lpccos */
+//
+//  for (i = 1; i <= nc; i++)
+//  {
+//    sum = (cepdata) 0.0;
+//    for (k = 1; k <= (i - 1); k++)
+//    {
+//      sum = sum + k * c[k] * a[i-k]; /* TODO: fixedpt range for mult */
+//    }
+//    c[i] = -a[i] - (sum / i);               /* cepstral calculated  */
+//    /* to <=nc in icostrans */
+//    /* so I shall do the    */                                                      /* same here            */
+//  }
+//}
+
diff --git a/srec/cfront/frontobj.c b/srec/cfront/frontobj.c
new file mode 100644
index 0000000..4151b33
--- /dev/null
+++ b/srec/cfront/frontobj.c
@@ -0,0 +1,686 @@
+/*---------------------------------------------------------------------------*
+ *  frontobj.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+
+#include <stdlib.h>
+#if defined(__cplusplus) && defined(_MSC_VER)
+extern "C"
+{
+#include <string.h>
+}
+#else
+#include <string.h>
+#endif
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#ifdef unix
+#include <unistd.h>
+#endif
+#ifndef POSIX
+#include <memory.h>
+#endif
+#include <assert.h>
+
+#include "front.h"
+
+#include "portable.h"
+
+#include "sh_down.h"
+
+#define DEBUG       0
+
+
+static void hamming_window(fftdata *ham, int win_len);
+
+static front_wave *create_wave_object(void);
+static void delete_wave_object(front_wave *waveobj);
+static void setup_wave_object(front_wave *waveobj, front_parameters *parameters);
+static void clear_wave_object(front_wave *waveobj);
+
+static front_freq *create_freq_object(void);
+static void delete_freq_object(front_freq *freqobj);
+static void setup_freq_object(front_freq *freqobj, front_parameters *parameters, int mel_dim);
+static void reset_freq_object(front_freq *freqobj);
+static void clear_freq_object(front_freq *freqobj);
+
+static front_cep *create_cep_object(void);
+static void delete_cep_object(front_cep *cepobj);
+static void setup_cep_object(front_cep *cepobj, front_parameters *parameters,
+                             size_t num_fb, size_t mel_dim);
+static void reset_cep_object(front_cep *cepobj);
+static void clear_cep_object(front_cep *cepobj);
+
+
+
+front_config *create_config_object(void)
+{
+  front_config  *config;
+  config = (front_config *) CALLOC_CLR(1,
+           sizeof(front_config), "cfront.front_config");
+  return config;
+}
+
+
+/*******************************************************************************
+**  FUNCTION: setup_config_object
+**
+**  DESCRIPTION: Set up the front end using the paramteters. This function
+**       configures the member Wave, Freq and Cep objects, by calling their
+**       create and setup
+**       functions.
+**
+**  ARGUMENTS:
+**
+**  RETURNS: pointer to config object
+**
+*******************************************************************************/
+
+void setup_config_object(front_config *config, front_parameters *parameters)
+{
+
+  ASSERT(config);
+  ASSERT(parameters);
+
+  /* Create and configure sub-components */
+  config->waveobj = create_wave_object();
+  config->freqobj = create_freq_object();
+  config->cepobj = create_cep_object();
+
+  setup_wave_object(config->waveobj, parameters);
+  setup_freq_object(config->freqobj, parameters, parameters->mel_dim);
+  setup_cep_object(config->cepobj, parameters, config->freqobj->nf,
+                   parameters->mel_dim);
+  return;
+}
+
+void clear_config_object(front_config *config)
+{
+
+  ASSERT(config);
+
+  clear_wave_object(config->waveobj);
+  clear_freq_object(config->freqobj);
+  clear_cep_object(config->cepobj);
+
+  delete_wave_object(config->waveobj);
+  config->waveobj = NULL;
+  delete_freq_object(config->freqobj);
+  config->freqobj = NULL;
+  delete_cep_object(config->cepobj);
+  config->cepobj = NULL;
+  return;
+}
+
+
+void delete_config_object(front_config *config)
+{
+  ASSERT(config);
+  FREE((char *) config);
+  return;
+}
+
+
+front_channel *create_channel_object(void)
+{
+  front_channel *channel;
+
+  channel = (front_channel *) CALLOC_CLR(1,
+            sizeof(front_channel), "cfront.channel");
+  return channel;
+}
+
+
+void delete_channel_object(front_channel *channel)
+{
+  ASSERT(channel);
+  FREE((char *) channel);
+}
+
+
+void setup_channel_object(
+  front_channel *channel, front_wave *waveobj,
+  front_freq *freqobj, front_cep *cepobj)
+{
+  ASSERT(channel);
+  ASSERT(waveobj);
+  ASSERT(freqobj);
+  ASSERT(cepobj);
+
+  channel->prebuff = (fftdata *) CALLOC(freqobj->window_length + 1,
+                     sizeof(fftdata), "cfront.prebuff");
+  channel->prerefbuff = (fftdata *) CALLOC(freqobj->window_length + 1,
+                        sizeof(fftdata), "cfront.prerefbuff");
+  channel->buff_size = freqobj->window_length + 1;
+
+  /* Create gain normalization object, and space for filter bank storage. BP */
+  channel->num_freq = freqobj->nf;
+  channel->filterbank = (cepdata *) CALLOC(channel->num_freq,
+                        sizeof(cepdata), "cfront.filterbank");
+  channel->filterbankref = (cepdata *) CALLOC(channel->num_freq,
+                           sizeof(cepdata), "cfront.filterbankref");
+
+  channel->mel_dim = cepobj->mel_dim;
+  channel->cep = (cepdata *) CALLOC((Q2 + 1) * (channel->mel_dim + 1),
+                                          sizeof(cepdata), "cfront.cep");
+  channel->rasta = (cepdata *) CALLOC((channel->mel_dim + 1),
+                   sizeof(cepdata), "cfront.rasta");
+  channel->framdata = (featdata *) CALLOC(3 * (channel->mel_dim + 1),
+                      sizeof(featdata), "cfront.chan_framdata");
+
+  if (freqobj->do_spectral_sub)
+  {
+    /*  Spectral subtraction requires estimate of BG levels. This is currently
+        estimated on the first config->spectral_sub_frame_dur frames, which are
+        assumed to be in silence. The channel means are estimated when the
+        frame count is reached, and is_valid is set, in
+        estimate_spectral_sub_means. Spectral subtraction is turned on with
+        config->do_spectral_sub.
+    */
+
+    channel->spectral_sub = (spectral_sub_info *) CALLOC_CLR(1,
+                            sizeof(spectral_sub_info), "cfront.spectral_sub_info");
+    channel->spectral_sub->sub_vector = (cepdata *) CALLOC(NUM_MEL_FREQS,
+                                        sizeof(cepdata), "cfront.spectral_sub_vector");
+    channel->spectral_sub->frame_dur = cepobj->spectral_sub_frame_dur;
+    channel->spectral_sub->scale = cepobj->spec_sub_scale;
+  }
+
+  ASSERT(freqobj->frame_period > 0);
+  channel->frame_delay = DELTA + (freqobj->window_length / freqobj->frame_period) - 1;
+  channel->forget_factor = cepobj->forget_factor;
+  reset_channel_object(channel);
+  return;
+}
+
+
+void clear_channel_object(front_channel *channel)
+{
+  ASSERT(channel);
+  FREE((char *) channel->prebuff);
+  channel->prebuff = NULL;
+  FREE((char *) channel->prerefbuff);
+  channel->prerefbuff = NULL;
+  FREE((char *) channel->filterbank);
+  channel->filterbank = NULL;
+  FREE((char *) channel->filterbankref);
+  channel->filterbankref = NULL;
+  FREE((char *) channel->cep);
+  channel->cep = NULL;
+  FREE((char *) channel->rasta);
+  channel->rasta = NULL;
+  FREE((char *) channel->framdata);
+  channel->framdata = NULL;
+  if (channel->spectral_sub)
+  {
+    FREE((char *) channel->spectral_sub->sub_vector);
+    FREE((char *) channel->spectral_sub);
+    channel->spectral_sub = NULL;
+  }
+  channel->buff_size = 0;
+  return;
+}
+
+
+/* Replacement fns for reset_std_channel */
+void reset_channel_object(front_channel *channel)
+{
+  size_t ii;
+
+  ASSERT(channel);
+
+#if DEBUG
+  log_report("Channel reset\n");
+#endif
+  memset(channel->cep, 0x00, Q2 *(channel->mel_dim + 1) * sizeof(float));
+  memset(channel->prebuff, 0x00, channel->buff_size * sizeof(fftdata));
+  memset(channel->prerefbuff, 0x00, channel->buff_size * sizeof(fftdata));
+  channel->lastx = 0;
+
+  for (ii = 0; ii <= channel->mel_dim; ii++)
+    channel->rasta[ii] = 0;
+
+  if (channel->spectral_sub)
+  {
+    channel->spectral_sub->is_valid = False;
+    for (ii = 0; ii < NUM_MEL_FREQS; ii++)
+      channel->spectral_sub->sub_vector[ii] = (cepdata) 0.0;
+  }
+  channel->frame_count = 0;
+
+  return;
+}
+
+
+/******************************************************************************
+**  WAVE OBJECT
+*******************************************************************************/
+
+static front_wave *create_wave_object(void)
+{
+  front_wave *waveobj;
+
+  waveobj = (front_wave *) CALLOC_CLR(1, sizeof(front_wave), "cfront.waveobj");
+  return waveobj;
+}
+
+
+
+static void delete_wave_object(front_wave *waveobj)
+{
+  ASSERT(waveobj);
+  FREE((char *) waveobj);
+  return;
+}
+
+
+static void setup_wave_object(front_wave *waveobj, front_parameters *parameters)
+{
+  ASSERT(waveobj);
+  ASSERT(parameters);
+
+  waveobj->samplerate = parameters->samplerate;
+  /*  Be careful about the value of COEFDATA_SHIFT - it should be <16.
+      During preemphasis the data is shifted up by COEFDATA_SHIFT too.
+  */
+  waveobj->pre_mel = (coefdata) fixed_point_convert(parameters->pre_mel,
+                     COEFDATA_SHIFT);
+  waveobj->high_clip   = parameters->high_clip;
+  waveobj->low_clip    = parameters->low_clip;
+  waveobj->max_per10000_clip  = parameters->max_per10000_clip;
+  waveobj->max_dc_offset  = parameters->max_dc_offset;
+  waveobj->high_noise_level_bit = parameters->high_noise_level_bit;
+  waveobj->low_speech_level_bit = parameters->low_speech_level_bit;
+  waveobj->min_samples  = parameters->min_samples;
+
+  return;
+}
+
+
+static void clear_wave_object(front_wave *waveobj)
+{
+  ASSERT(waveobj);
+  return;
+}
+
+/******************************************************************************
+**  FREQUENCY OBJECT
+*******************************************************************************/
+static front_freq *create_freq_object(void)
+{
+  front_freq *freqobj;
+  freqobj = (front_freq *) CALLOC_CLR(1,
+            sizeof(front_freq), "cfront.freqobj");
+  freqobj->fc = &freqobj->fcb[1];
+  freqobj->lognp = 4;
+  reset_freq_object(freqobj);
+  return freqobj;
+}
+
+
+static void delete_freq_object(front_freq *freqobj)
+{
+  ASSERT(freqobj);
+  FREE((char *) freqobj);
+  return;
+}
+
+
+static void setup_freq_object(front_freq *freqobj,
+                              front_parameters *parameters, int mel_dim)
+{
+  int     fmax, i, j, high_cut, bandwidth;
+  float   t, finc, f;
+
+  ASSERT(freqobj);
+  ASSERT(parameters);
+  ASSERT(FRAMERATE > 0);
+  ASSERT(parameters->samplerate);
+
+  freqobj->framerate = FRAMERATE;
+  freqobj->frame_period = parameters->samplerate / freqobj->framerate;
+  freqobj->samplerate = parameters->samplerate;
+  freqobj->window_length = (int)(parameters->window_factor * freqobj->frame_period);
+  freqobj->low_cut = parameters->low_cut;
+  freqobj->high_cut = parameters->high_cut;
+  freqobj->do_spectral_sub = parameters->do_spectral_sub;
+  freqobj->do_filterbank_input = parameters->do_filterbank_input;
+  freqobj->do_filterbank_dump = parameters->do_filterbank_dump;
+  freqobj->num_fb_to_use = parameters->num_fb_to_use;
+  freqobj->do_nonlinear_filter = True;    /* on by default */
+  freqobj->spectrum_filter_num = 0;
+  freqobj->warp_scale = parameters->warp_scale; /*## */
+  freqobj->piecewise_start = parameters->piecewise_start; /*## */
+
+  if (freqobj->high_cut > 0)
+    high_cut = freqobj->high_cut;
+  else
+    high_cut = parameters->samplerate / 2;
+
+  bandwidth = parameters->samplerate / 2;
+  ASSERT(bandwidth != 0);
+
+  freqobj->np = 1 << freqobj->lognp;                            /* fft sizing */
+  while (freqobj->np < freqobj->window_length)
+    freqobj->np *= 2, freqobj->lognp++;
+  while (freqobj->np < 128)
+    freqobj->np *= 2, freqobj->lognp++;
+  if (freqobj->np > NP)
+    SERVICE_ERROR(FFT_TOO_SMALL);
+
+  /*  Change the values of the peakpick forward and backward coefficients
+  to compensate for sample rate. */
+  t = (float) exp(log((double)parameters->peakpickup)
+                  * ((double)parameters->samplerate / (double)11025)
+                  / ((double)freqobj->np / (double)256));
+  freqobj->peakpickup = (fftdata) fixed_point_convert(t, COEFDATA_SHIFT);
+  t = (float) exp(log((double)parameters->peakpickdown)
+                  * ((double)parameters->samplerate / (double)11025)
+                  / ((double)freqobj->np / (double)256));
+  freqobj->peakpickdown = (fftdata) fixed_point_convert(t, COEFDATA_SHIFT);
+
+#if BIGGER_WINDOW
+  freqobj->window_length = freqobj->np;
+#endif
+  configure_fft(&freqobj->fft, freqobj->np);
+  freqobj->ns = freqobj->np / 2 + 1;
+  fmax = bandwidth;
+  finc = (float)parameters->samplerate / (float)freqobj->np;
+  /*    finc= fmax/freqobj->ns; */
+  freqobj->cut_off_below = (int)(((long)freqobj->low_cut * freqobj->np) / (2.0 * bandwidth));
+  freqobj->cut_off_above = (int)(((long)high_cut * freqobj->np) / (2.0 * bandwidth));
+
+  freqobj->fc[-1] = (fftdata) freqobj->low_cut;                        /* 1st channel at cutoff */
+  i = ((int)freqobj->low_cut + 50) / 100 + 1;              /* other channels at x00Hz */
+  for (freqobj->nf = 0; i <= 10; i++, freqobj->nf++)
+    freqobj->fc[freqobj->nf] = (fftdata)(100 * i);          /* 100 Hz */
+  for (f = 1000.; f <= high_cut; freqobj->nf++)
+  {
+    f *= (float)1.1; /* 10% */
+    freqobj->fc[freqobj->nf] = (fftdata) fixed_round(f);        /* 10 % */
+  }
+  freqobj->nf--;
+
+  if ((freqobj->fc[freqobj->nf] + freqobj->fc[freqobj->nf-1]) / 2. > high_cut)
+    freqobj->nf--;
+  freqobj->fc[freqobj->nf] = (fftdata) high_cut;
+  freqobj->fc[freqobj->nf+1] = (fftdata) high_cut;
+
+#if DEBUG
+  write_frames(freqobj->nf + 1, 1, freqobj->fc, D_FLOAT);
+#endif
+
+  for (i = 0; i <= freqobj->cut_off_below; i++)
+    freqobj->framp[i] = 0;
+  freqobj->fcscl[0] = 0;
+  freqobj->fcmid[0] = freqobj->cut_off_below;
+  f = (freqobj->cut_off_below + 1) * finc;
+  for (i = 0, j = freqobj->cut_off_below + 1; i <= freqobj->nf; i++)
+  {
+    freqobj->fcscl[i+1] = (fftdata) 0.0;
+    for (; f < freqobj->fc[i] && f < (float) high_cut; f += finc, j++)
+    {
+      t = (f - freqobj->fc[i-1]) / (freqobj->fc[i] - freqobj->fc[i-1]);
+      freqobj->framp[j] = (fftdata) fixed_point_convert(t, RAMP_SHIFT); /* scale it up by 12 bits, (16 - 4) */
+      freqobj->fcscl[i] += (fftdata) SHIFT_UP(1, RAMP_SHIFT) - freqobj->framp[j];    /* scale it up by 12 bits as well () */
+      freqobj->fcscl[i+1] += freqobj->framp[j];       /* scale it up by 12 bits as well () */
+    }
+    if (j > freqobj->cut_off_above)
+      freqobj->fcmid[i+1] = freqobj->cut_off_above;
+    else
+      freqobj->fcmid[i+1] = j;
+  }
+  /*  Put in a check to validate the range of fcscl[] for fixed point f/e
+  */
+#if DEBUG
+  write_frames(freqobj->nf, 1, freqobj->fcmid, D_LONG);
+  write_frames(freqobj->nf, 1, freqobj->fcscl, D_LONG);
+  write_frames(freqobj->ns, 1, freqobj->framp, D_LONG);
+#endif
+
+  if (mel_dim > freqobj->nf)
+    SERVICE_ERROR(BAD_COSINE_TRANSFORM);
+
+  if (freqobj->nf > NF)
+    SERVICE_ERROR(BAD_COSINE_TRANSFORM);
+
+  /*  Weighting function construction */
+  freqobj->ham = (fftdata *) CALLOC(freqobj->window_length + 1,
+                                          sizeof(fftdata), "cfront.ham");
+  hamming_window(freqobj->ham, freqobj->window_length);
+
+  /*  Sine tables for FFT */
+
+#if DEBUG
+#define log_report printf
+  log_report("fc\n");
+  write_scaled_frames(freqobj->nf + 1, 1, freqobj->fc, D_FIXED, 1);
+
+  log_report("framp\n");
+  write_scaled_frames(freqobj->ns, 1, freqobj->framp, D_FIXED, 1);
+#endif
+
+  create_spectrum_filter(freqobj, parameters->spectrum_filter_freq,
+                         parameters->spectrum_filter_spread);
+  if (freqobj->spectrum_filter_num == 0)
+    clear_spectrum_filter(freqobj);
+  return;
+}
+
+static void hamming_window(fftdata *ham, int win_len)
+/*
+**  add Hamming window on speech data */
+{
+  int     i;
+  double  f;
+  double  coef;
+
+  f = (2 * M_PI) / win_len;
+  for (i = 0; i <= win_len; i++)
+  {
+    coef = 0.54 - 0.46 * cos(f * (double)i);
+    ham[i] = (fftdata) fixed_point_convert((float)coef,
+                                           HALF_FFTDATA_SIZE - 1);
+  }
+  return;
+}
+
+static void clear_freq_object(front_freq *freqobj)
+{
+  ASSERT(freqobj);
+  if (freqobj->ham)
+  {
+    FREE((char *)freqobj->ham);
+    freqobj->ham = NULL;
+  }
+  unconfigure_fft(&freqobj->fft);
+
+  if (freqobj->spectrum_filter_num > 0)
+    clear_spectrum_filter(freqobj);
+  return;
+}
+
+static void reset_freq_object(front_freq *freqobj)
+{
+  ASSERT(freqobj);
+  return;
+}
+
+
+/******************************************************************************
+**  CEPSTRAL OBJECT
+*******************************************************************************/
+static front_cep *create_cep_object(void)
+{
+  front_cep *cepobj;
+  cepobj = (front_cep *) CALLOC_CLR(1, sizeof(front_cep), "cfront.cepobj");
+  return cepobj;
+}
+
+
+static void delete_cep_object(front_cep *cepobj)
+{
+  ASSERT(cepobj);
+  FREE((char *) cepobj);
+  return;
+}
+
+static void setup_cep_object(front_cep *cepobj, front_parameters *parameters,
+                             size_t num_fb, size_t mel_dim)
+{
+  float f;
+  size_t i, j;
+
+  ASSERT(cepobj);
+  ASSERT(parameters);
+  cepobj->mel_dim = mel_dim;
+  cepobj->do_dd_mel = parameters->do_dd_mel;
+  cepobj->do_skip_even_frames = parameters->do_skip_even_frames;
+  cepobj->do_smooth_c0 = parameters->do_smooth_c0;
+  cepobj->sv6_margin = parameters->sv6_margin;
+  cepobj->forget_factor = parameters->forget_factor;
+  cepobj->spectral_sub_frame_dur = parameters->spectral_sub_frame_dur;
+  cepobj->spec_sub_scale = (coefdata) fixed_point_convert(
+                             parameters->spec_sub_scale, COEFDATA_SHIFT);
+  cepobj->lpc_order  = parameters->lpc_order;
+
+
+  cepobj->mel_offset = (cepdata *) CALLOC(MEL_FREQ_ARRAY_SIZE,
+                       sizeof(cepdata), "cfront.mel_offset");
+  cepobj->mel_loop = (cepdata *) CALLOC(MEL_FREQ_ARRAY_SIZE,
+                     sizeof(cepdata), "cfront.mel_loop");
+  cepobj->melA_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
+                       sizeof(cepdata), "cfront.melA_scale");
+  cepobj->dmelA_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
+                        sizeof(cepdata), "cfront.dmelA_scale");
+  cepobj->ddmelA_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
+                         sizeof(cepdata), "cfront.ddmelA_scale");
+  cepobj->melB_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
+                       sizeof(cepdata), "cfront.melB_scale");
+  cepobj->dmelB_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
+                        sizeof(cepdata), "cfront.dmelB_scale");
+  cepobj->ddmelB_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
+                         sizeof(cepdata), "cfront.ddmelB_scale");
+  cepobj->rastaA_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
+                         sizeof(cepdata), "cfront.rastaA_scale");
+  cepobj->rastaB_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
+                         sizeof(cepdata), "cfront.rastaB_scale");
+
+  cepobj->do_scales = True; /* Hack so default scalings are loaded */
+
+  for (i = 0; i < MEL_FREQ_ARRAY_SIZE; ++i)
+  {
+    cepobj->mel_offset[i] = (cepdata) parameters->mel_offset[i];
+    cepobj->mel_loop[i] = (cepdata) parameters->mel_loop[i];
+  }
+
+  for (i = 0; i <= cepobj->mel_dim; ++i)
+  {
+    cepobj->melA_scale[i] = (cepdata) parameters->melA_scale[i];
+    cepobj->dmelA_scale[i] = (cepdata) parameters->dmelA_scale[i];
+    cepobj->ddmelA_scale[i] = (cepdata) parameters->ddmelA_scale[i];
+    cepobj->melB_scale[i] = (cepdata) parameters->melB_scale[i];
+    cepobj->dmelB_scale[i] = (cepdata) parameters->dmelB_scale[i];
+    cepobj->ddmelB_scale[i] = (cepdata) parameters->ddmelB_scale[i];
+    cepobj->rastaA_scale[i] = (cepdata) parameters->rastaA_scale[i];
+    cepobj->rastaB_scale[i] = (cepdata) parameters->rastaB_scale[i];
+    cepobj->melA_scale[i] = (cepdata) fixed_point_convert((float) parameters->melA_scale[i],
+                            BYTERANGE_SHIFT);
+    cepobj->dmelA_scale[i] = (cepdata) fixed_point_convert((float) parameters->dmelA_scale[i],
+                             BYTERANGE_SHIFT);
+    cepobj->ddmelA_scale[i] = (cepdata) fixed_point_convert((float) parameters->ddmelA_scale[i],
+                              BYTERANGE_SHIFT);
+    cepobj->melB_scale[i] = (cepdata) fixed_point_convert((float) parameters->melB_scale[i],
+                            BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
+    cepobj->dmelB_scale[i] = (cepdata) fixed_point_convert((float) parameters->dmelB_scale[i],
+                             BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
+    cepobj->ddmelB_scale[i] = (cepdata) fixed_point_convert((float) parameters->ddmelB_scale[i],
+                              BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
+    cepobj->rastaA_scale[i] = (cepdata) fixed_point_convert((float) parameters->rastaA_scale[i],
+                              BYTERANGE_SHIFT);
+    cepobj->rastaB_scale[i] = (cepdata) fixed_point_convert((float) parameters->rastaB_scale[i],
+                              BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
+  }
+
+  /* Now allocate space for the cosine matrix. Previously fixed. */
+  f = (float)(M_PI / num_fb);
+  cepobj->cs = (cepdata *) CALLOC(num_fb * num_fb, sizeof(cepdata), "cfront.cosine_matrix");
+  for (i = 0; i < num_fb; ++i)
+  {
+    for (j = 0; j < num_fb; ++j) /* TODO: fixedpt cosine matrix */
+      cepobj->cs[i*(num_fb)+j] = (cepdata) fixed_point_convert(
+                                   (float)(cos((double)(i * (j + .5) * f)) / num_fb),
+                                   COSINE_TABLE_SHIFT); /* balanced after icostrans */
+  }
+  create_lookup_log(&cepobj->logtab, 12);   /* TODO: rename 12 as macro */
+  reset_cep_object(cepobj);
+  return;
+}
+
+
+static void reset_cep_object(front_cep *cepobj)
+{
+  ASSERT(cepobj);
+  return;
+}
+
+
+static void clear_cep_object(front_cep *cepobj)
+{
+  ASSERT(cepobj);
+  if (cepobj->melA_scale)
+    FREE((char*)cepobj->melA_scale);
+  cepobj->melA_scale = NULL; /* Set to null in either case, for simplicity */
+  if (cepobj->dmelA_scale)
+    FREE((char*)cepobj->dmelA_scale);
+  cepobj->dmelA_scale = NULL;
+  if (cepobj->ddmelA_scale)
+    FREE((char*)cepobj->ddmelA_scale);
+  cepobj->ddmelA_scale = NULL;
+  if (cepobj->melB_scale)
+    FREE((char*)cepobj->melB_scale);
+  cepobj->melB_scale = NULL;
+  if (cepobj->dmelB_scale)
+    FREE((char*)cepobj->dmelB_scale);
+  cepobj->dmelB_scale = NULL;
+  if (cepobj->ddmelB_scale)
+    FREE((char*)cepobj->ddmelB_scale);
+  cepobj->ddmelB_scale = NULL;
+  if (cepobj->rastaA_scale)
+    FREE((char*)cepobj->rastaA_scale);
+  cepobj->rastaA_scale = NULL;
+  if (cepobj->rastaB_scale)
+    FREE((char*)cepobj->rastaB_scale);
+  cepobj->rastaB_scale = NULL;
+  if (cepobj->cs)
+    FREE((char *) cepobj->cs);
+  cepobj->cs = NULL;
+  if (cepobj->mel_offset)
+    FREE((char*)cepobj->mel_offset);
+  cepobj->mel_offset = NULL;
+  if (cepobj->mel_loop)
+    FREE((char*)cepobj->mel_loop);
+  cepobj->mel_loop = NULL;
+  destroy_lookup_log(&cepobj->logtab);
+  return;
+}
diff --git a/srec/cfront/frontpar.c b/srec/cfront/frontpar.c
new file mode 100644
index 0000000..c5b6499
--- /dev/null
+++ b/srec/cfront/frontpar.c
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*
+ *  frontpar.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+
+#if defined(__cplusplus) && defined(_MSC_VER)
+extern "C"
+{
+#include <string.h>
+}
+#else
+#include <string.h>
+#endif
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#ifdef unix
+#include <unistd.h>
+#endif
+#include <assert.h>
+
+#include "duk_args.h"
+#include "frontapi.h"
+#include "portable.h"
+
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid :
+                           "$Id: frontpar.c,v 1.4.10.6 2007/10/15 18:06:24 dahan Exp $";
+#endif
+                           
+int load_up_parameter_list(arg_info *arglist, CA_FrontendInputParams *frontArgs);
+
+
+CA_FrontendInputParams *CA_AllocateFrontendParameters(void)
+{
+  CA_FrontendInputParams *frontArgs = NULL;
+  TRY_CA_EXCEPT
+  frontArgs = (CA_FrontendInputParams *) CALLOC_CLR(1,
+              sizeof(CA_FrontendInputParams), "cfront.hFrontArgs");
+              
+  frontArgs->is_loaded = False;
+  frontArgs->ca_rtti = CA_FRONTEND_PARAMETERS_SIGNATURE;
+  return (frontArgs);
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(frontArgs);
+}
+
+void  CA_FreeFrontendParameters(CA_FrontendInputParams *frontArgs)
+{
+  TRY_CA_EXCEPT
+  ASSERT(frontArgs);
+  
+  FREE((char *)frontArgs);
+  
+  BEG_CATCH_CA_EXCEPT;
+  END_CATCH_CA_EXCEPT(frontArgs);
+}
diff --git a/srec/cfront/himul32.h b/srec/cfront/himul32.h
new file mode 100644
index 0000000..f0a1477
--- /dev/null
+++ b/srec/cfront/himul32.h
@@ -0,0 +1,194 @@
+/*---------------------------------------------------------------------------*
+ *  himul32.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+////////////////////////////////////////////////////////////////////////////
+//
+//  FILE:         himul32.cpp
+//
+//  CREATED:   11-September-99
+//
+//  DESCRIPTION:  A multiplier returns most-significant 32 bits of the 64-bit
+//      product of its two signed 32-bit integers
+//
+//
+//
+//
+//  MODIFICATIONS:
+// Revision history log
+    VSS revision history.  Do not edit by hand.
+
+    $NoKeywords: $
+
+*/
+
+/* do not use PPC. VxWorks defines the PPC in vxcpu.h */
+#if defined(_PPC_)
+
+/* Reads timebase register for a higher precision clock */
+
+asm PINLINE int32 himul32(asr_int32_t factor1, asr_int32_T factor2)
+{
+  %   reg factor1;
+  reg factor2;
+  
+  mulhw   r3, factor1, factor2  # place the high order 32 bits of the product in the return register r3
+    }
+    
+#else
+    
+/******************************************************************
+himul32 returns the most-significant 32 bits of the 64-bit
+product of its two signed 32-bit integer arguments.
+In other words, it's the exact value of the mathematical expression
+floor( (factor1 * factor2) / 2**32 )
+This is a platform-independent definition that needs to be
+implemented in platform-specific ways.
+    
+Parameters:
+factor1 -- first signed 32 bit integer
+factor2 -- second signed 32 bit integer
+    
+Returns:
+the most-significant 32 bits of the multiplication results
+*********************************************************************/
+    
+#if COMPILER == C_MICROSOFT
+    
+#if TARGET_CPU == CPU_I86
+    
+PINLINE asr_int32_t himul32(asr_int32_t factor1, asr_int32_t factor2)
+{
+  asr_int32_t retval;
+  /*
+  // The x86 imul instruction, given a single 32-bit operand, computes
+  // the signed 64-bit product of register EAX and that operand, into
+  // the register pair EDX:EAX.  So we have to move the first factor into
+  // EAX, then IMUL, then take the high 32 bits (in EDX) and move them
+  // back to EAX (because that's where a function's return value is
+  // taken from).
+  */
+  __asm {
+    mov     eax, factor1
+    imul    factor2
+    mov     retval, edx
+  }
+  return retval;
+}
+    
+#else /* TARGET_CPU != CPU_I86 */
+    
+    PINLINE asr_int32_t himul32(asr_int32_t factor1, asr_int32_t factor2)
+    {
+      union {
+        __int64 full;
+        struct
+        {
+          asr_int32_t lo;
+          asr_int32_t hi;
+        }
+        pieces;
+      } result;
+    
+      __int64 x = factor1;
+      __int64 y = factor2;
+      result.full = x * y;
+      return result.pieces.hi;
+    }
+    
+#endif /* TARGET_CPU == CPU_I86 */
+    
+#else  /* ~ COMPILER != C_MICROSOFT */
+    
+    /*** ANSI C ***/
+    
+    PINLINE asr_int32_t himul32(asr_int32_t factor1, asr_int32_t factor2)
+    {
+    
+      asr_uint32_t x = (asr_uint32_t)factor1;
+      asr_uint32_t y = (asr_uint32_t)factor2;
+      asr_uint32_t xhi, xlo, yhi, ylo;
+      asr_uint32_t hi, lo, mid;
+      asr_uint32_t oldlo, carry;
+      int sign = 0;
+    
+      if (factor1 < 0)
+      {
+        x = (asr_uint32_t) - factor1;
+        sign = 1;
+      }
+      if (factor2 < 0)
+      {
+        y = (asr_uint32_t) - factor2;
+        sign = 1 - sign;
+      }
+      xhi = x >> 16;       /* <= 2**15 */
+      xlo = x & 0xffff;    /* <  2**16 */
+      yhi = y >> 16;       /* <= 2**15 */
+      ylo = y & 0xffff;    /* <  2**16 */
+    
+      lo = xlo * ylo;
+      /*
+      // xhi <= 2**15 and ylo <= 2**16-1, so
+      // xhi * ylo <= 2**31 - 2**15.
+      // Ditto for yhi * xlo, so their sum is
+      // <= 2*32 - 2**16, and so the next line can't overflow.
+      */
+      mid = xhi * ylo + yhi * xlo;
+      hi = xhi * yhi;
+    
+      /*
+      // Now add the low part of mid to the high part of lo, and the
+      // high part of mid to the low part of hi:
+      //                    xxxxxxxx xxxxxxxx     lo
+      //           xxxxxxxx xxxxxxxx              mid
+      //  xxxxxxxx xxxxxxxx                       hi
+      //  -----------------------------------
+      //                    xxxxxxxx xxxxxxxx     lo
+      //  xxxxxxxx xxxxxxxx                       hi
+      // Note that folding mid into lo can cause a carry.  An old trick
+      // for portable carry-detection applies:  if a and b are unsigned,
+      // their sum overflows if and only if it's less than a (or b; can
+      // check either one).
+      */
+    
+      oldlo = lo;
+      lo += mid << 16;
+      carry = lo < oldlo;
+    
+      hi += carry + (mid >> 16);
+    
+      if (sign)
+      {
+        /*
+        // Result must be negated, which is the same as taking the
+        // complement and adding 1.  So there's a carry out of the low
+        // half if and only if it's 0 now.
+        */
+        hi = ~hi;
+        hi += lo == 0;
+      }
+    
+      return (asr_int32_t)hi;
+    }
+    
+#endif  /* ~ COMPILER == C_MICROSOFT */
+    
+    
+#endif
diff --git a/srec/cfront/log_tabl.c b/srec/cfront/log_tabl.c
new file mode 100644
index 0000000..33239ae
--- /dev/null
+++ b/srec/cfront/log_tabl.c
@@ -0,0 +1,150 @@
+/*---------------------------------------------------------------------------*
+ *  log_tabl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include <stdlib.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <string.h>
+#include <math.h>
+#include <limits.h>
+#include <assert.h>
+
+#include "hmm_desc.h"
+#include "front.h"
+#include "portable.h"
+
+#include "sh_down.h"
+
+/* #define PRINT_SOME_CODE(fMt,aRg1) printf(fMt,aRg1) */
+#define PRINT_SOME_CODE(fMt,aRg1) 
+
+/* values for default case, num_bits 12 */
+#define DO_USE_LOGTAB__TABLE ( logtab->size == 4096 && LOG_SCALE == 1024)
+static  int logtab__table[4097] = {  0, 0, 710, 1125, 1420, 1648, 1835, 1993, 2129, 2250, 2358, 2455, 2545, 2627, 2702, 2773, 2839, 2901, 2960, 3015, 3068, 3118, 3165, 3211, 3254, 3296, 3336, 3375, 3412, 3448, 3483, 3516, 3549, 3580, 3611, 3641, 3670, 3698, 3725, 3751, 3777, 3803, 3827, 3851, 3875, 3898, 3921, 3943, 3964, 3985, 4006, 4026, 4046, 4066, 4085, 4104, 4122, 4140, 4158, 4175, 4193, 4210, 4226, 4243, 4259, 4275, 4290, 4306, 4321, 4336, 4350, 4365, 4379, 4393, 4407, 4421, 4435, 4448, 4461, 4474, 4487, 4500, 4512, 4525, 4537, 4549, 4561, 4573, 4585, 4596, 4608, 4619, 4630, 4641, 4652, 4663, 4674, 4685, 4695, 4705, 4716, 4726, 4736, 4746, 4756, 4766, 4775, 4785, 4795, 4804, 4813, 4823, 4832, 4841, 4850, 4859, 4868, 4876, 4885, 4894, 4902, 4911, 4919, 4928, 4936, 4944, 4952, 4960, 4968, 4976, 4984, 4992, 5000, 5008, 5015, 5023, 5031, 5038, 5046, 5053, 5060, 5068, 5075, 5082, 5089, 5096, 5103, 5110, 5117, 5124, 5131, 5138, 5144, 5151, 5158, 5164, 5171, 5178, 5184, 5191, 5197, 5203, 5210, 5216, 5222, 5228, 5235, 5241, 5247, 5253, 5259, 5265, 5271, 5277, 5283, 5289, 5295, 5300, 5306, 5312, 5318, 5323, 5329, 5335, 5340, 5346, 5351, 5357, 5362, 5368, 5373, 5378, 5384, 5389, 5394, 5400, 5405, 5410, 5415, 5420, 5425, 5431, 5436, 5441, 5446, 5451, 5456, 5461, 5466, 5471, 5475, 5480, 5485, 5490, 5495, 5500, 5504, 5509, 5514, 5518, 5523, 5528, 5532, 5537, 5542, 5546, 5551, 5555, 5560, 5564, 5569, 5573, 5577, 5582, 5586, 5591, 5595, 5599, 5604, 5608, 5612, 5616, 5621, 5625, 5629, 5633, 5637, 5642, 5646, 5650, 5654, 5658, 5662, 5666, 5670, 5674, 5678, 5682, 5686, 5690, 5694, 5698, 5702, 5706, 5710, 5714, 5718, 5721, 5725, 5729, 5733, 5737, 5740, 5744, 5748, 5752, 5755, 5759, 5763, 5766, 5770, 5774, 5777, 5781, 5785, 5788, 5792, 5795, 5799, 5802, 5806, 5809, 5813, 5816, 5820, 5823, 5827, 5830, 5834, 5837, 5841, 5844, 5847, 5851, 5854, 5858, 5861, 5864, 5868, 5871, 5874, 5878, 5881, 5884, 5887, 5891, 5894, 5897, 5900, 5904, 5907, 5910, 5913, 5916, 5919, 5923, 5926, 5929, 5932, 5935, 5938, 5941, 5944, 5948, 5951, 5954, 5957, 5960, 5963, 5966, 5969, 5972, 5975, 5978, 5981, 5984, 5987, 5990, 5993, 5996, 5999, 6001, 6004, 6007, 6010, 6013, 6016, 6019, 6022, 6025, 6027, 6030, 6033, 6036, 6039, 6041, 6044, 6047, 6050, 6053, 6055, 6058, 6061, 6064, 6066, 6069, 6072, 6075, 6077, 6080, 6083, 6085, 6088, 6091, 6093, 6096, 6099, 6101, 6104, 6107, 6109, 6112, 6115, 6117, 6120, 6122, 6125, 6128, 6130, 6133, 6135, 6138, 6140, 6143, 6145, 6148, 6151, 6153, 6156, 6158, 6161, 6163, 6166, 6168, 6170, 6173, 6175, 6178, 6180, 6183, 6185, 6188, 6190, 6193, 6195, 6197, 6200, 6202, 6205, 6207, 6209, 6212, 6214, 6216, 6219, 6221, 6224, 6226, 6228, 6231, 6233, 6235, 6238, 6240, 6242, 6244, 6247, 6249, 6251, 6254, 6256, 6258, 6260, 6263, 6265, 6267, 6269, 6272, 6274, 6276, 6278, 6281, 6283, 6285, 6287, 6289, 6292, 6294, 6296, 6298, 6300, 6303, 6305, 6307, 6309, 6311, 6313, 6316, 6318, 6320, 6322, 6324, 6326, 6328, 6330, 6333, 6335, 6337, 6339, 6341, 6343, 6345, 6347, 6349, 6351, 6353, 6356, 6358, 6360, 6362, 6364, 6366, 6368, 6370, 6372, 6374, 6376, 6378, 6380, 6382, 6384, 6386, 6388, 6390, 6392, 6394, 6396, 6398, 6400, 6402, 6404, 6406, 6408, 6410, 6412, 6414, 6416, 6418, 6420, 6421, 6423, 6425, 6427, 6429, 6431, 6433, 6435, 6437, 6439, 6441, 6443, 6444, 6446, 6448, 6450, 6452, 6454, 6456, 6458, 6459, 6461, 6463, 6465, 6467, 6469, 6471, 6472, 6474, 6476, 6478, 6480, 6482, 6483, 6485, 6487, 6489, 6491, 6493, 6494, 6496, 6498, 6500, 6502, 6503, 6505, 6507, 6509, 6510, 6512, 6514, 6516, 6518, 6519, 6521, 6523, 6525, 6526, 6528, 6530, 6532, 6533, 6535, 6537, 6538, 6540, 6542, 6544, 6545, 6547, 6549, 6550, 6552, 6554, 6556, 6557, 6559, 6561, 6562, 6564, 6566, 6567, 6569, 6571, 6572, 6574, 6576, 6577, 6579, 6581, 6582, 6584, 6586, 6587, 6589, 6591, 6592, 6594, 6596, 6597, 6599, 6600, 6602, 6604, 6605, 6607, 6609, 6610, 6612, 6613, 6615, 6617, 6618, 6620, 6621, 6623, 6625, 6626, 6628, 6629, 6631, 6632, 6634, 6636, 6637, 6639, 6640, 6642, 6643, 6645, 6647, 6648, 6650, 6651, 6653, 6654, 6656, 6657, 6659, 6660, 6662, 6663, 6665, 6667, 6668, 6670, 6671, 6673, 6674, 6676, 6677, 6679, 6680, 6682, 6683, 6685, 6686, 6688, 6689, 6691, 6692, 6694, 6695, 6697, 6698, 6699, 6701, 6702, 6704, 6705, 6707, 6708, 6710, 6711, 6713, 6714, 6716, 6717, 6718, 6720, 6721, 6723, 6724, 6726, 6727, 6729, 6730, 6731, 6733, 6734, 6736, 6737, 6739, 6740, 6741, 6743, 6744, 6746, 6747, 6748, 6750, 6751, 6753, 6754, 6755, 6757, 6758, 6760, 6761, 6762, 6764, 6765, 6767, 6768, 6769, 6771, 6772, 6773, 6775, 6776, 6778, 6779, 6780, 6782, 6783, 6784, 6786, 6787, 6788, 6790, 6791, 6793, 6794, 6795, 6797, 6798, 6799, 6801, 6802, 6803, 6805, 6806, 6807, 6809, 6810, 6811, 6813, 6814, 6815, 6816, 6818, 6819, 6820, 6822, 6823, 6824, 6826, 6827, 6828, 6830, 6831, 6832, 6833, 6835, 6836, 6837, 6839, 6840, 6841, 6842, 6844, 6845, 6846, 6848, 6849, 6850, 6851, 6853, 6854, 6855, 6856, 6858, 6859, 6860, 6862, 6863, 6864, 6865, 6867, 6868, 6869, 6870, 6872, 6873, 6874, 6875, 6877, 6878, 6879, 6880, 6882, 6883, 6884, 6885, 6886, 6888, 6889, 6890, 6891, 6893, 6894, 6895, 6896, 6897, 6899, 6900, 6901, 6902, 6904, 6905, 6906, 6907, 6908, 6910, 6911, 6912, 6913, 6914, 6916, 6917, 6918, 6919, 6920, 6921, 6923, 6924, 6925, 6926, 6927, 6929, 6930, 6931, 6932, 6933, 6934, 6936, 6937, 6938, 6939, 6940, 6941, 6943, 6944, 6945, 6946, 6947, 6948, 6950, 6951, 6952, 6953, 6954, 6955, 6957, 6958, 6959, 6960, 6961, 6962, 6963, 6965, 6966, 6967, 6968, 6969, 6970, 6971, 6972, 6974, 6975, 6976, 6977, 6978, 6979, 6980, 6981, 6983, 6984, 6985, 6986, 6987, 6988, 6989, 6990, 6991, 6993, 6994, 6995, 6996, 6997, 6998, 6999, 7000, 7001, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7015, 7016, 7017, 7018, 7019, 7020, 7021, 7022, 7023, 7024, 7025, 7026, 7027, 7029, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7046, 7047, 7048, 7049, 7050, 7051, 7052, 7053, 7054, 7055, 7056, 7057, 7058, 7059, 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, 7068, 7069, 7070, 7071, 7073, 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, 7084, 7085, 7086, 7087, 7088, 7089, 7090, 7091, 7092, 7093, 7094, 7095, 7096, 7097, 7098, 7099, 7100, 7101, 7102, 7103, 7104, 7105, 7106, 7107, 7108, 7109, 7110, 7111, 7112, 7113, 7114, 7115, 7116, 7117, 7118, 7119, 7120, 7121, 7122, 7123, 7124, 7124, 7125, 7126, 7127, 7128, 7129, 7130, 7131, 7132, 7133, 7134, 7135, 7136, 7137, 7138, 7139, 7140, 7141, 7142, 7143, 7144, 7145, 7146, 7147, 7148, 7149, 7150, 7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7158, 7159, 7160, 7161, 7162, 7163, 7164, 7165, 7166, 7166, 7167, 7168, 7169, 7170, 7171, 7172, 7173, 7174, 7175, 7176, 7177, 7178, 7179, 7179, 7180, 7181, 7182, 7183, 7184, 7185, 7186, 7187, 7188, 7189, 7190, 7191, 7191, 7192, 7193, 7194, 7195, 7196, 7197, 7198, 7199, 7200, 7201, 7201, 7202, 7203, 7204, 7205, 7206, 7207, 7208, 7209, 7210, 7210, 7211, 7212, 7213, 7214, 7215, 7216, 7217, 7218, 7218, 7219, 7220, 7221, 7222, 7223, 7224, 7225, 7226, 7226, 7227, 7228, 7229, 7230, 7231, 7232, 7233, 7233, 7234, 7235, 7236, 7237, 7238, 7239, 7240, 7240, 7241, 7242, 7243, 7244, 7245, 7246, 7246, 7247, 7248, 7249, 7250, 7251, 7252, 7253, 7253, 7254, 7255, 7256, 7257, 7258, 7259, 7259, 7260, 7261, 7262, 7263, 7264, 7264, 7265, 7266, 7267, 7268, 7269, 7270, 7270, 7271, 7272, 7273, 7274, 7275, 7275, 7276, 7277, 7278, 7279, 7280, 7281, 7281, 7282, 7283, 7284, 7285, 7286, 7286, 7287, 7288, 7289, 7290, 7291, 7291, 7292, 7293, 7294, 7295, 7295, 7296, 7297, 7298, 7299, 7300, 7300, 7301, 7302, 7303, 7304, 7304, 7305, 7306, 7307, 7308, 7309, 7309, 7310, 7311, 7312, 7313, 7313, 7314, 7315, 7316, 7317, 7317, 7318, 7319, 7320, 7321, 7322, 7322, 7323, 7324, 7325, 7326, 7326, 7327, 7328, 7329, 7330, 7330, 7331, 7332, 7333, 7334, 7334, 7335, 7336, 7337, 7337, 7338, 7339, 7340, 7341, 7341, 7342, 7343, 7344, 7345, 7345, 7346, 7347, 7348, 7348, 7349, 7350, 7351, 7352, 7352, 7353, 7354, 7355, 7356, 7356, 7357, 7358, 7359, 7359, 7360, 7361, 7362, 7362, 7363, 7364, 7365, 7366, 7366, 7367, 7368, 7369, 7369, 7370, 7371, 7372, 7372, 7373, 7374, 7375, 7376, 7376, 7377, 7378, 7379, 7379, 7380, 7381, 7382, 7382, 7383, 7384, 7385, 7385, 7386, 7387, 7388, 7388, 7389, 7390, 7391, 7391, 7392, 7393, 7394, 7394, 7395, 7396, 7397, 7397, 7398, 7399, 7400, 7400, 7401, 7402, 7403, 7403, 7404, 7405, 7406, 7406, 7407, 7408, 7409, 7409, 7410, 7411, 7411, 7412, 7413, 7414, 7414, 7415, 7416, 7417, 7417, 7418, 7419, 7420, 7420, 7421, 7422, 7422, 7423, 7424, 7425, 7425, 7426, 7427, 7428, 7428, 7429, 7430, 7430, 7431, 7432, 7433, 7433, 7434, 7435, 7435, 7436, 7437, 7438, 7438, 7439, 7440, 7441, 7441, 7442, 7443, 7443, 7444, 7445, 7446, 7446, 7447, 7448, 7448, 7449, 7450, 7450, 7451, 7452, 7453, 7453, 7454, 7455, 7455, 7456, 7457, 7458, 7458, 7459, 7460, 7460, 7461, 7462, 7462, 7463, 7464, 7465, 7465, 7466, 7467, 7467, 7468, 7469, 7469, 7470, 7471, 7472, 7472, 7473, 7474, 7474, 7475, 7476, 7476, 7477, 7478, 7478, 7479, 7480, 7481, 7481, 7482, 7483, 7483, 7484, 7485, 7485, 7486, 7487, 7487, 7488, 7489, 7489, 7490, 7491, 7491, 7492, 7493, 7494, 7494, 7495, 7496, 7496, 7497, 7498, 7498, 7499, 7500, 7500, 7501, 7502, 7502, 7503, 7504, 7504, 7505, 7506, 7506, 7507, 7508, 7508, 7509, 7510, 7510, 7511, 7512, 7512, 7513, 7514, 7514, 7515, 7516, 7516, 7517, 7518, 7518, 7519, 7520, 7520, 7521, 7522, 7522, 7523, 7524, 7524, 7525, 7526, 7526, 7527, 7528, 7528, 7529, 7530, 7530, 7531, 7532, 7532, 7533, 7533, 7534, 7535, 7535, 7536, 7537, 7537, 7538, 7539, 7539, 7540, 7541, 7541, 7542, 7543, 7543, 7544, 7545, 7545, 7546, 7546, 7547, 7548, 7548, 7549, 7550, 7550, 7551, 7552, 7552, 7553, 7554, 7554, 7555, 7555, 7556, 7557, 7557, 7558, 7559, 7559, 7560, 7561, 7561, 7562, 7562, 7563, 7564, 7564, 7565, 7566, 7566, 7567, 7568, 7568, 7569, 7569, 7570, 7571, 7571, 7572, 7573, 7573, 7574, 7574, 7575, 7576, 7576, 7577, 7578, 7578, 7579, 7579, 7580, 7581, 7581, 7582, 7583, 7583, 7584, 7584, 7585, 7586, 7586, 7587, 7588, 7588, 7589, 7589, 7590, 7591, 7591, 7592, 7593, 7593, 7594, 7594, 7595, 7596, 7596, 7597, 7597, 7598, 7599, 7599, 7600, 7601, 7601, 7602, 7602, 7603, 7604, 7604, 7605, 7605, 7606, 7607, 7607, 7608, 7608, 7609, 7610, 7610, 7611, 7611, 7612, 7613, 7613, 7614, 7614, 7615, 7616, 7616, 7617, 7618, 7618, 7619, 7619, 7620, 7621, 7621, 7622, 7622, 7623, 7624, 7624, 7625, 7625, 7626, 7626, 7627, 7628, 7628, 7629, 7629, 7630, 7631, 7631, 7632, 7632, 7633, 7634, 7634, 7635, 7635, 7636, 7637, 7637, 7638, 7638, 7639, 7640, 7640, 7641, 7641, 7642, 7642, 7643, 7644, 7644, 7645, 7645, 7646, 7647, 7647, 7648, 7648, 7649, 7650, 7650, 7651, 7651, 7652, 7652, 7653, 7654, 7654, 7655, 7655, 7656, 7656, 7657, 7658, 7658, 7659, 7659, 7660, 7661, 7661, 7662, 7662, 7663, 7663, 7664, 7665, 7665, 7666, 7666, 7667, 7667, 7668, 7669, 7669, 7670, 7670, 7671, 7671, 7672, 7673, 7673, 7674, 7674, 7675, 7675, 7676, 7677, 7677, 7678, 7678, 7679, 7679, 7680, 7681, 7681, 7682, 7682, 7683, 7683, 7684, 7684, 7685, 7686, 7686, 7687, 7687, 7688, 7688, 7689, 7690, 7690, 7691, 7691, 7692, 7692, 7693, 7693, 7694, 7695, 7695, 7696, 7696, 7697, 7697, 7698, 7698, 7699, 7700, 7700, 7701, 7701, 7702, 7702, 7703, 7703, 7704, 7705, 7705, 7706, 7706, 7707, 7707, 7708, 7708, 7709, 7710, 7710, 7711, 7711, 7712, 7712, 7713, 7713, 7714, 7715, 7715, 7716, 7716, 7717, 7717, 7718, 7718, 7719, 7719, 7720, 7721, 7721, 7722, 7722, 7723, 7723, 7724, 7724, 7725, 7725, 7726, 7726, 7727, 7728, 7728, 7729, 7729, 7730, 7730, 7731, 7731, 7732, 7732, 7733, 7733, 7734, 7735, 7735, 7736, 7736, 7737, 7737, 7738, 7738, 7739, 7739, 7740, 7740, 7741, 7742, 7742, 7743, 7743, 7744, 7744, 7745, 7745, 7746, 7746, 7747, 7747, 7748, 7748, 7749, 7749, 7750, 7751, 7751, 7752, 7752, 7753, 7753, 7754, 7754, 7755, 7755, 7756, 7756, 7757, 7757, 7758, 7758, 7759, 7759, 7760, 7761, 7761, 7762, 7762, 7763, 7763, 7764, 7764, 7765, 7765, 7766, 7766, 7767, 7767, 7768, 7768, 7769, 7769, 7770, 7770, 7771, 7771, 7772, 7773, 7773, 7774, 7774, 7775, 7775, 7776, 7776, 7777, 7777, 7778, 7778, 7779, 7779, 7780, 7780, 7781, 7781, 7782, 7782, 7783, 7783, 7784, 7784, 7785, 7785, 7786, 7786, 7787, 7787, 7788, 7788, 7789, 7789, 7790, 7790, 7791, 7791, 7792, 7792, 7793, 7794, 7794, 7795, 7795, 7796, 7796, 7797, 7797, 7798, 7798, 7799, 7799, 7800, 7800, 7801, 7801, 7802, 7802, 7803, 7803, 7804, 7804, 7805, 7805, 7806, 7806, 7807, 7807, 7808, 7808, 7809, 7809, 7810, 7810, 7811, 7811, 7812, 7812, 7813, 7813, 7814, 7814, 7815, 7815, 7816, 7816, 7817, 7817, 7818, 7818, 7819, 7819, 7820, 7820, 7821, 7821, 7822, 7822, 7823, 7823, 7823, 7824, 7824, 7825, 7825, 7826, 7826, 7827, 7827, 7828, 7828, 7829, 7829, 7830, 7830, 7831, 7831, 7832, 7832, 7833, 7833, 7834, 7834, 7835, 7835, 7836, 7836, 7837, 7837, 7838, 7838, 7839, 7839, 7840, 7840, 7841, 7841, 7842, 7842, 7843, 7843, 7843, 7844, 7844, 7845, 7845, 7846, 7846, 7847, 7847, 7848, 7848, 7849, 7849, 7850, 7850, 7851, 7851, 7852, 7852, 7853, 7853, 7854, 7854, 7855, 7855, 7855, 7856, 7856, 7857, 7857, 7858, 7858, 7859, 7859, 7860, 7860, 7861, 7861, 7862, 7862, 7863, 7863, 7864, 7864, 7864, 7865, 7865, 7866, 7866, 7867, 7867, 7868, 7868, 7869, 7869, 7870, 7870, 7871, 7871, 7872, 7872, 7873, 7873, 7873, 7874, 7874, 7875, 7875, 7876, 7876, 7877, 7877, 7878, 7878, 7879, 7879, 7880, 7880, 7880, 7881, 7881, 7882, 7882, 7883, 7883, 7884, 7884, 7885, 7885, 7886, 7886, 7886, 7887, 7887, 7888, 7888, 7889, 7889, 7890, 7890, 7891, 7891, 7892, 7892, 7892, 7893, 7893, 7894, 7894, 7895, 7895, 7896, 7896, 7897, 7897, 7898, 7898, 7898, 7899, 7899, 7900, 7900, 7901, 7901, 7902, 7902, 7903, 7903, 7903, 7904, 7904, 7905, 7905, 7906, 7906, 7907, 7907, 7908, 7908, 7908, 7909, 7909, 7910, 7910, 7911, 7911, 7912, 7912, 7913, 7913, 7913, 7914, 7914, 7915, 7915, 7916, 7916, 7917, 7917, 7917, 7918, 7918, 7919, 7919, 7920, 7920, 7921, 7921, 7922, 7922, 7922, 7923, 7923, 7924, 7924, 7925, 7925, 7926, 7926, 7926, 7927, 7927, 7928, 7928, 7929, 7929, 7930, 7930, 7930, 7931, 7931, 7932, 7932, 7933, 7933, 7934, 7934, 7934, 7935, 7935, 7936, 7936, 7937, 7937, 7938, 7938, 7938, 7939, 7939, 7940, 7940, 7941, 7941, 7941, 7942, 7942, 7943, 7943, 7944, 7944, 7945, 7945, 7945, 7946, 7946, 7947, 7947, 7948, 7948, 7948, 7949, 7949, 7950, 7950, 7951, 7951, 7952, 7952, 7952, 7953, 7953, 7954, 7954, 7955, 7955, 7955, 7956, 7956, 7957, 7957, 7958, 7958, 7958, 7959, 7959, 7960, 7960, 7961, 7961, 7961, 7962, 7962, 7963, 7963, 7964, 7964, 7964, 7965, 7965, 7966, 7966, 7967, 7967, 7967, 7968, 7968, 7969, 7969, 7970, 7970, 7970, 7971, 7971, 7972, 7972, 7973, 7973, 7973, 7974, 7974, 7975, 7975, 7976, 7976, 7976, 7977, 7977, 7978, 7978, 7979, 7979, 7979, 7980, 7980, 7981, 7981, 7981, 7982, 7982, 7983, 7983, 7984, 7984, 7984, 7985, 7985, 7986, 7986, 7987, 7987, 7987, 7988, 7988, 7989, 7989, 7989, 7990, 7990, 7991, 7991, 7992, 7992, 7992, 7993, 7993, 7994, 7994, 7994, 7995, 7995, 7996, 7996, 7997, 7997, 7997, 7998, 7998, 7999, 7999, 7999, 8000, 8000, 8001, 8001, 8002, 8002, 8002, 8003, 8003, 8004, 8004, 8004, 8005, 8005, 8006, 8006, 8006, 8007, 8007, 8008, 8008, 8009, 8009, 8009, 8010, 8010, 8011, 8011, 8011, 8012, 8012, 8013, 8013, 8013, 8014, 8014, 8015, 8015, 8016, 8016, 8016, 8017, 8017, 8018, 8018, 8018, 8019, 8019, 8020, 8020, 8020, 8021, 8021, 8022, 8022, 8022, 8023, 8023, 8024, 8024, 8024, 8025, 8025, 8026, 8026, 8026, 8027, 8027, 8028, 8028, 8028, 8029, 8029, 8030, 8030, 8030, 8031, 8031, 8032, 8032, 8033, 8033, 8033, 8034, 8034, 8035, 8035, 8035, 8036, 8036, 8037, 8037, 8037, 8038, 8038, 8039, 8039, 8039, 8040, 8040, 8040, 8041, 8041, 8042, 8042, 8042, 8043, 8043, 8044, 8044, 8044, 8045, 8045, 8046, 8046, 8046, 8047, 8047, 8048, 8048, 8048, 8049, 8049, 8050, 8050, 8050, 8051, 8051, 8052, 8052, 8052, 8053, 8053, 8054, 8054, 8054, 8055, 8055, 8056, 8056, 8056, 8057, 8057, 8057, 8058, 8058, 8059, 8059, 8059, 8060, 8060, 8061, 8061, 8061, 8062, 8062, 8063, 8063, 8063, 8064, 8064, 8065, 8065, 8065, 8066, 8066, 8066, 8067, 8067, 8068, 8068, 8068, 8069, 8069, 8070, 8070, 8070, 8071, 8071, 8071, 8072, 8072, 8073, 8073, 8073, 8074, 8074, 8075, 8075, 8075, 8076, 8076, 8077, 8077, 8077, 8078, 8078, 8078, 8079, 8079, 8080, 8080, 8080, 8081, 8081, 8081, 8082, 8082, 8083, 8083, 8083, 8084, 8084, 8085, 8085, 8085, 8086, 8086, 8086, 8087, 8087, 8088, 8088, 8088, 8089, 8089, 8089, 8090, 8090, 8091, 8091, 8091, 8092, 8092, 8093, 8093, 8093, 8094, 8094, 8094, 8095, 8095, 8096, 8096, 8096, 8097, 8097, 8097, 8098, 8098, 8099, 8099, 8099, 8100, 8100, 8100, 8101, 8101, 8102, 8102, 8102, 8103, 8103, 8103, 8104, 8104, 8105, 8105, 8105, 8106, 8106, 8106, 8107, 8107, 8108, 8108, 8108, 8109, 8109, 8109, 8110, 8110, 8111, 8111, 8111, 8112, 8112, 8112, 8113, 8113, 8114, 8114, 8114, 8115, 8115, 8115, 8116, 8116, 8116, 8117, 8117, 8118, 8118, 8118, 8119, 8119, 8119, 8120, 8120, 8121, 8121, 8121, 8122, 8122, 8122, 8123, 8123, 8123, 8124, 8124, 8125, 8125, 8125, 8126, 8126, 8126, 8127, 8127, 8128, 8128, 8128, 8129, 8129, 8129, 8130, 8130, 8130, 8131, 8131, 8132, 8132, 8132, 8133, 8133, 8133, 8134, 8134, 8134, 8135, 8135, 8136, 8136, 8136, 8137, 8137, 8137, 8138, 8138, 8138, 8139, 8139, 8140, 8140, 8140, 8141, 8141, 8141, 8142, 8142, 8142, 8143, 8143, 8143, 8144, 8144, 8145, 8145, 8145, 8146, 8146, 8146, 8147, 8147, 8147, 8148, 8148, 8149, 8149, 8149, 8150, 8150, 8150, 8151, 8151, 8151, 8152, 8152, 8152, 8153, 8153, 8154, 8154, 8154, 8155, 8155, 8155, 8156, 8156, 8156, 8157, 8157, 8157, 8158, 8158, 8158, 8159, 8159, 8160, 8160, 8160, 8161, 8161, 8161, 8162, 8162, 8162, 8163, 8163, 8163, 8164, 8164, 8165, 8165, 8165, 8166, 8166, 8166, 8167, 8167, 8167, 8168, 8168, 8168, 8169, 8169, 8169, 8170, 8170, 8170, 8171, 8171, 8172, 8172, 8172, 8173, 8173, 8173, 8174, 8174, 8174, 8175, 8175, 8175, 8176, 8176, 8176, 8177, 8177, 8177, 8178, 8178, 8179, 8179, 8179, 8180, 8180, 8180, 8181, 8181, 8181, 8182, 8182, 8182, 8183, 8183, 8183, 8184, 8184, 8184, 8185, 8185, 8185, 8186, 8186, 8187, 8187, 8187, 8188, 8188, 8188, 8189, 8189, 8189, 8190, 8190, 8190, 8191, 8191, 8191, 8192, 8192, 8192, 8193, 8193, 8193, 8194, 8194, 8194, 8195, 8195, 8195, 8196, 8196, 8196, 8197, 8197, 8197, 8198, 8198, 8199, 8199, 8199, 8200, 8200, 8200, 8201, 8201, 8201, 8202, 8202, 8202, 8203, 8203, 8203, 8204, 8204, 8204, 8205, 8205, 8205, 8206, 8206, 8206, 8207, 8207, 8207, 8208, 8208, 8208, 8209, 8209, 8209, 8210, 8210, 8210, 8211, 8211, 8211, 8212, 8212, 8212, 8213, 8213, 8213, 8214, 8214, 8214, 8215, 8215, 8215, 8216, 8216, 8216, 8217, 8217, 8217, 8218, 8218, 8218, 8219, 8219, 8219, 8220, 8220, 8220, 8221, 8221, 8221, 8222, 8222, 8222, 8223, 8223, 8223, 8224, 8224, 8224, 8225, 8225, 8225, 8226, 8226, 8226, 8227, 8227, 8227, 8228, 8228, 8228, 8229, 8229, 8229, 8230, 8230, 8230, 8231, 8231, 8231, 8232, 8232, 8232, 8233, 8233, 8233, 8234, 8234, 8234, 8235, 8235, 8235, 8236, 8236, 8236, 8237, 8237, 8237, 8238, 8238, 8238, 8239, 8239, 8239, 8240, 8240, 8240, 8241, 8241, 8241, 8242, 8242, 8242, 8243, 8243, 8243, 8244, 8244, 8244, 8245, 8245, 8245, 8246, 8246, 8246, 8247, 8247, 8247, 8248, 8248, 8248, 8248, 8249, 8249, 8249, 8250, 8250, 8250, 8251, 8251, 8251, 8252, 8252, 8252, 8253, 8253, 8253, 8254, 8254, 8254, 8255, 8255, 8255, 8256, 8256, 8256, 8257, 8257, 8257, 8258, 8258, 8258, 8259, 8259, 8259, 8259, 8260, 8260, 8260, 8261, 8261, 8261, 8262, 8262, 8262, 8263, 8263, 8263, 8264, 8264, 8264, 8265, 8265, 8265, 8266, 8266, 8266, 8267, 8267, 8267, 8267, 8268, 8268, 8268, 8269, 8269, 8269, 8270, 8270, 8270, 8271, 8271, 8271, 8272, 8272, 8272, 8273, 8273, 8273, 8274, 8274, 8274, 8274, 8275, 8275, 8275, 8276, 8276, 8276, 8277, 8277, 8277, 8278, 8278, 8278, 8279, 8279, 8279, 8280, 8280, 8280, 8280, 8281, 8281, 8281, 8282, 8282, 8282, 8283, 8283, 8283, 8284, 8284, 8284, 8285, 8285, 8285, 8286, 8286, 8286, 8286, 8287, 8287, 8287, 8288, 8288, 8288, 8289, 8289, 8289, 8290, 8290, 8290, 8291, 8291, 8291, 8291, 8292, 8292, 8292, 8293, 8293, 8293, 8294, 8294, 8294, 8295, 8295, 8295, 8295, 8296, 8296, 8296, 8297, 8297, 8297, 8298, 8298, 8298, 8299, 8299, 8299, 8300, 8300, 8300, 8300, 8301, 8301, 8301, 8302, 8302, 8302, 8303, 8303, 8303, 8304, 8304, 8304, 8304, 8305, 8305, 8305, 8306, 8306, 8306, 8307, 8307, 8307, 8308, 8308, 8308, 8308, 8309, 8309, 8309, 8310, 8310, 8310, 8311, 8311, 8311, 8312, 8312, 8312, 8312, 8313, 8313, 8313, 8314, 8314, 8314, 8315, 8315, 8315, 8315, 8316, 8316, 8316, 8317, 8317, 8317, 8318, 8318, 8318, 8319, 8319, 8319, 8319, 8320, 8320, 8320, 8321, 8321, 8321, 8322, 8322, 8322, 8322, 8323, 8323, 8323, 8324, 8324, 8324, 8325, 8325, 8325, 8325, 8326, 8326, 8326, 8327, 8327, 8327, 8328, 8328, 8328, 8328, 8329, 8329, 8329, 8330, 8330, 8330, 8331, 8331, 8331, 8331, 8332, 8332, 8332, 8333, 8333, 8333, 8334, 8334, 8334, 8334, 8335, 8335, 8335, 8336, 8336, 8336, 8337, 8337, 8337, 8337, 8338, 8338, 8338, 8339, 8339, 8339, 8340, 8340, 8340, 8340, 8341, 8341, 8341, 8342, 8342, 8342, 8343, 8343, 8343, 8343, 8344, 8344, 8344, 8345, 8345, 8345, 8345, 8346, 8346, 8346, 8347, 8347, 8347, 8348, 8348, 8348, 8348, 8349, 8349, 8349, 8350, 8350, 8350, 8351, 8351, 8351, 8351, 8352, 8352, 8352, 8353, 8353, 8353, 8353, 8354, 8354, 8354, 8355, 8355, 8355, 8355, 8356, 8356, 8356, 8357, 8357, 8357, 8358, 8358, 8358, 8358, 8359, 8359, 8359, 8360, 8360, 8360, 8360, 8361, 8361, 8361, 8362, 8362, 8362, 8362, 8363, 8363, 8363, 8364, 8364, 8364, 8365, 8365, 8365, 8365, 8366, 8366, 8366, 8367, 8367, 8367, 8367, 8368, 8368, 8368, 8369, 8369, 8369, 8369, 8370, 8370, 8370, 8371, 8371, 8371, 8371, 8372, 8372, 8372, 8373, 8373, 8373, 8373, 8374, 8374, 8374, 8375, 8375, 8375, 8376, 8376, 8376, 8376, 8377, 8377, 8377, 8378, 8378, 8378, 8378, 8379, 8379, 8379, 8380, 8380, 8380, 8380, 8381, 8381, 8381, 8382, 8382, 8382, 8382, 8383, 8383, 8383, 8384, 8384, 8384, 8384, 8385, 8385, 8385, 8386, 8386, 8386, 8386, 8387, 8387, 8387, 8387, 8388, 8388, 8388, 8389, 8389, 8389, 8389, 8390, 8390, 8390, 8391, 8391, 8391, 8391, 8392, 8392, 8392, 8393, 8393, 8393, 8393, 8394, 8394, 8394, 8395, 8395, 8395, 8395, 8396, 8396, 8396, 8397, 8397, 8397, 8397, 8398, 8398, 8398, 8399, 8399, 8399, 8399, 8400, 8400, 8400, 8400, 8401, 8401, 8401, 8402, 8402, 8402, 8402, 8403, 8403, 8403, 8404, 8404, 8404, 8404, 8405, 8405, 8405, 8405, 8406, 8406, 8406, 8407, 8407, 8407, 8407, 8408, 8408, 8408, 8409, 8409, 8409, 8409, 8410, 8410, 8410, 8411, 8411, 8411, 8411, 8412, 8412, 8412, 8412, 8413, 8413, 8413, 8414, 8414, 8414, 8414, 8415, 8415, 8415, 8415, 8416, 8416, 8416, 8417, 8417, 8417, 8417, 8418, 8418, 8418, 8419, 8419, 8419, 8419, 8420, 8420, 8420, 8420, 8421, 8421, 8421, 8422, 8422, 8422, 8422, 8423, 8423, 8423, 8423, 8424, 8424, 8424, 8425, 8425, 8425, 8425, 8426, 8426, 8426, 8426, 8427, 8427, 8427, 8428, 8428, 8428, 8428, 8429, 8429, 8429, 8429, 8430, 8430, 8430, 8431, 8431, 8431, 8431, 8432, 8432, 8432, 8432, 8433, 8433, 8433, 8434, 8434, 8434, 8434, 8435, 8435, 8435, 8435, 8436, 8436, 8436, 8437, 8437, 8437, 8437, 8438, 8438, 8438, 8438, 8439, 8439, 8439, 8440, 8440, 8440, 8440, 8441, 8441, 8441, 8441, 8442, 8442, 8442, 8442, 8443, 8443, 8443, 8444, 8444, 8444, 8444, 8445, 8445, 8445, 8445, 8446, 8446, 8446, 8446, 8447, 8447, 8447, 8448, 8448, 8448, 8448, 8449, 8449, 8449, 8449, 8450, 8450, 8450, 8451, 8451, 8451, 8451, 8452, 8452, 8452, 8452, 8453, 8453, 8453, 8453, 8454, 8454, 8454, 8455, 8455, 8455, 8455, 8456, 8456, 8456, 8456, 8457, 8457, 8457, 8457, 8458, 8458, 8458, 8458, 8459, 8459, 8459, 8460, 8460, 8460, 8460, 8461, 8461, 8461, 8461, 8462, 8462, 8462, 8462, 8463, 8463, 8463, 8463, 8464, 8464, 8464, 8465, 8465, 8465, 8465, 8466, 8466, 8466, 8466, 8467, 8467, 8467, 8467, 8468, 8468, 8468, 8468, 8469, 8469, 8469, 8470, 8470, 8470, 8470, 8471, 8471, 8471, 8471, 8472, 8472, 8472, 8472, 8473, 8473, 8473, 8473, 8474, 8474, 8474, 8475, 8475, 8475, 8475, 8476, 8476, 8476, 8476, 8477, 8477, 8477, 8477, 8478, 8478, 8478, 8478, 8479, 8479, 8479, 8479, 8480, 8480, 8480, 8480, 8481, 8481, 8481, 8482, 8482, 8482, 8482, 8483, 8483, 8483, 8483, 8484, 8484, 8484, 8484, 8485, 8485, 8485, 8485, 8486, 8486, 8486, 8486, 8487, 8487, 8487, 8487, 8488, 8488, 8488, 8488, 8489, 8489, 8489, 8490, 8490, 8490, 8490, 8491, 8491, 8491, 8491, 8492, 8492, 8492, 8492, 8493, 8493, 8493, 8493, 8494, 8494, 8494, 8494, 8495, 8495, 8495, 8495, 8496, 8496, 8496, 8496, 8497, 8497, 8497, 8497, 8498, 8498, 8498, 8498, 8499, 8499, 8499, 8499, 8500, 8500, 8500, 8501, 8501, 8501, 8501, 8502, 8502, 8502, 8502, 8503, 8503, 8503, 8503, 8504, 8504, 8504, 8504, 8505, 8505, 8505, 8505, 8506, 8506, 8506, 8506, 8507, 8507, 8507, 8507, 8508, 8508, 8508, 8508, 8509, 8509, 8509, 8509, 8510, 8510, 8510, 8510, 8511, 8511, 8511, 8511, 8512, 8512, 8512, 8512, 8513, 8513, 8513, 8513, 8514, 8514, 8514, 8514, 8515, 8515, 8515, 8515, 8516, 8516, 8516, 8516, 8517, 8517, 8517, 8517 }; /*0*/
+void create_lookup_log(log_table_info *logtab, int num_bits)
+{
+  int     ii;
+  double  val;
+
+  ASSERT(logtab);
+  
+  logtab->size = 0x01 << num_bits;
+  logtab->mask = 0x01;
+  for (ii = 0; ii < num_bits; ii++) /* one less than the table size in
+            order to do rounding off */
+    logtab->mask = (logtab->mask << 1) | 0x01;
+  logtab->mask = ~logtab->mask;
+
+  logtab->scale = LOG_SCALE;
+  val = LOG_SCALE * log((double)2.0);
+  logtab->shift = (int)(val + 0.5);
+  if( DO_USE_LOGTAB__TABLE  ) {
+	logtab->table = logtab__table;
+  } else {
+	logtab->table = (int *) CALLOC(logtab->size + 1, sizeof(int), "cfront.logtable");
+	PRINT_SOME_CODE("#define DO_USE_LOGTAB__TABLE ( (logtab->size == %d) \\\n", logtab->size);
+	PRINT_SOME_CODE("  && LOG_SCALE == %d ) \n", LOG_SCALE);
+	PRINT_SOME_CODE("int logtab__table[%d] = { 0, ", logtab->size); /* filler for pos 0 */
+	for (ii = 1; ii <= logtab->size; ii++)
+	{
+		val = LOG_SCALE * log((double) ii);
+		logtab->table[ii] = (int)(val + 0.5);
+	#if DEBUG
+		log_report("log table: %d %d\n", ii, logtab->table[ii]);
+	#endif
+		PRINT_SOME_CODE(" %i,", logtab->table[ii]);
+	}
+	PRINT_SOME_CODE(" }; /*%i*/\n", 0);
+  }
+  return;
+}
+
+int log_lookup(log_table_info *logtab, int operand, int shift)
+/*
+**  Log functioin, value scaled up LOG_SCALE */
+{
+  ASSERT(logtab);
+  if (operand <= 0)
+    operand = 1;
+  while ((operand & logtab->mask))
+  {
+    operand >>= 1;
+    shift++;
+  }
+  if (operand >= logtab->size)
+  {     /* rounding off */
+    shift++;
+    operand = (operand + 1) >> 1;
+  }
+#if DEBUG
+  log_report("tab: %d %d -> %d\n", operand, shift,
+             (int)((shift) *(logtab->shift) + logtab->table[operand]));
+#endif
+  return ((int)((shift) *(logtab->shift) + logtab->table[operand]));
+}
+
+void destroy_lookup_log(log_table_info *logtab)
+{
+  ASSERT(logtab);
+  ASSERT(logtab->table);
+  if( !DO_USE_LOGTAB__TABLE ) {
+	  FREE((char *)logtab->table);
+  }
+  return;
+}
+
+int integer_square_root(int operand)
+/*
+**  based on algorithm by Tony barrera amd Pelle Olsson */
+{
+  int ii, aa, bb, cc, value, shift;
+
+  if (operand <= 0)
+    return (0); /* TODO: is this a legal value for negatives */
+  value = 0x02;
+  shift = 0;
+  while (value < operand)
+  {
+    shift++;
+    value <<= 1;
+  }
+  shift >>= 1;
+
+  value = 0x01 << (2 * shift);
+  aa = value;
+  bb = value;
+  cc = value >> 2;
+  value = aa + bb + cc;
+
+  for (ii = 0; ii < shift; ii++)
+  {
+    bb = (bb >> 1);
+    if (value <= operand)
+    {
+      aa = value;
+      bb += cc;
+    }
+    cc >>= 2;
+    value = aa + bb + cc;
+  }
+  return (bb);
+}
diff --git a/srec/cfront/mulaw.h b/srec/cfront/mulaw.h
new file mode 100644
index 0000000..18832b0
--- /dev/null
+++ b/srec/cfront/mulaw.h
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------------*
+ *  mulaw.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+**  The mu-law decoding table
+**  Published internally by Alan Christie, Dragon UK.
+*/
+
+#ifdef SET_RCSID
+static const char mulaw_h[] = "$Id: mulaw.h,v 1.2.10.3 2007/08/31 17:44:52 dahan Exp $";
+#endif
+
+static const short u_law[256] =
+  {
+    -8031, -7775, -7519, -7263, -7007, -6751, -6495, -6239, /* u-Law Table */
+    -5983, -5727, -5471, -5215, -4959, -4703, -4447, -4191,
+    -3999, -3871, -3743, -3615, -3487, -3359, -3231, -3103, /* To Convert  */
+    -2975, -2847, -2719, -2591, -2463, -2335, -2207, -2079, /* PEB Data to */
+    -1983, -1919, -1855, -1791, -1727, -1663, -1599, -1535, /* Linear for  */
+    -1471, -1407, -1343, -1279, -1215, -1151, -1087, -1023, /* Subsequent  */
+    -975,  -943,  -911,  -879,  -847,  -815,  -783,  -751, /* Processing  */
+    -719,  -687,  -655,  -623,  -591,  -559,  -527,  -495,
+    -471,  -455,  -439,  -423,  -407,  -391,  -375,  -359,
+    -343,  -327,  -311,  -295,  -279,  -263,  -247,  -231,
+    -219,  -211,  -203,  -195,  -187,  -179,  -171,  -163,
+    -155,  -147,  -139,  -131,  -123,  -115,  -107,   -99,
+    -93,   -89,   -85,   -81,   -77,   -73,   -69,   -65,
+    -61,   -57,   -53,   -49,   -45,   -41,   -37,   -33,
+    -30,   -28,   -26,   -24,   -22,   -20,   -18,   -16,
+    -14,   -12,   -10,    -8,    -6,    -4,    -2,     0,
+    8031,  7775,  7519,  7263,  7007,  6751,  6495,  6239,
+    5983,  5727,  5471,  5215,  4959,  4703,  4447,  4191,
+    3999,  3871,  3743,  3615,  3487,  3359,  3231,  3103,
+    2975,  2847,  2719,  2591,  2463,  2335,  2207,  2079,
+    1983,  1919,  1855,  1791,  1727,  1663,  1599,  1535,
+    1471,  1407,  1343,  1279,  1215,  1151,  1087,  1023,
+    975,   943,   911,   879,   847,   815,   783,   751,
+    719,   687,   655,   623,   591,   559,   527,   495,
+    471,   455,   439,   423,   407,   391,   375,   359,
+    343,   327,   311,   295,   279,   263,   247,   231,
+    219,   211,   203,   195,   187,   179,   171,   163,
+    155,   147,   139,   131,   123,   115,   107,    99,
+    93,    89,    85,    81,    77,    73,    69,    65,
+    61,    57,    53,    49,    45,    41,    37,    33,
+    30,    28,    26,    24,    22,    20,    18,    16,
+    14,    12,    10,     8,     6,     4,     2,     0
+  };
+  
+#define MULAW_TO_LINEAR(X) u_law[(X)]
diff --git a/srec/cfront/nisthdr.h b/srec/cfront/nisthdr.h
new file mode 100644
index 0000000..c73b5f2
--- /dev/null
+++ b/srec/cfront/nisthdr.h
@@ -0,0 +1,245 @@
+/*---------------------------------------------------------------------------*
+ *  nisthdr.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef DO_CLEANUP_20070723
+#ifndef _NISTHDR_H_
+#define _NISTHDR_H_
+
+
+
+
+/**
+ * @todo document
+ */
+class Nist1AHeader
+{
+  public:
+    Nist1AHeader(void);
+    ~Nist1AHeader(void);
+
+    int read(PFile* pF);     /* returns number of chars read, errno is set
+        // Bug: Reading a header does not mean that you can write it, the read
+        // information does not automatically transfer to the writing data.*/
+
+    int write(PFile* pF);    /* returns number of chars written, errno is set*/
+    /*
+    // The fields are not constrained to contain values from these lists,
+    // but the existence of these lists makes it easy to use uniform naming.
+    // Use the enum to index into the matching array of strings.
+    */
+    enum SampleFormatEnum {LINEAR_8BITS, LINEAR_16BITS};
+    static char *mSampleFormatNames[];
+
+    enum SexEnum
+    {
+      FEMALE, MALE
+  };
+    static char *mSexNames[];
+
+    enum SpeakerAccentEnum
+    {
+      AE
+  };
+    static char *mSpeakerAccentNames[];
+
+    enum MicrophoneEnum
+    {
+      SM10, PRIMO, TELEX_STICK, AKG_Q_400
+  };
+    static char *mMicrophoneNames[];
+    /*
+    // The procedure for adding a field to the header is:
+    //   1. add a name in FieldId, make it uppercase version of header entry
+    //   2. add a set function by adding declaration and definition using
+    //      macro Nist1AHeaderSetDef
+    //   3. add a FieldDescription in mFieldsInit in .cpp file
+    // If you need a new data type (something besides d, l, f, or s) then
+    // you will also have to alter the union in field description and code
+    // in write() to size and print the type.  Please provide predefined
+    // names with matching enums wherever possible as is done for
+    // MicrophoneNames, etc.
+    */
+    enum FieldId
+    {
+      /* CAUTION: this order must match listing order in NistFields in cpp*/
+      WAVE_SIZE,
+      SAMPLE_RATE,
+      SAMPLE_FORMAT,
+      COEF_EMPHASIS,
+      SPEAKER_NAME,
+      SPEAKER_AGE,
+      SPEAKER_SEX,
+      SPEAKER_ACCENT,
+
+      SPEAKING_MODE,
+      CHANNEL_COUNT,
+      SAMPLE_COUNT,
+      SAMPLE_MIN,
+      SAMPLE_MAX,
+      SAMPLE_N_BYTES,
+      SAMPLE_BYTE_FORMAT,
+      RECORD_DATE,
+
+      MICROPHONE,
+      MICROPHONE_POSITION,
+      RECORD_SITE,
+      DOS_PROGRAM,
+      DSP_PROGRAM,
+      LANGUAGE,
+      RECORD_TIME,
+      UTTERANCE_ID,
+      CHECK_SUM,
+      ALL_BYTE_CHECK_SUM,
+      JIN0_FRAME0,
+      AVERAGE_BACKGROUND,
+      AVERAGE_SPEECH,
+      SIGNAL_TO_NOISE,
+      PROMPT_TEXT,
+      PRONUNCIATION_TEXT,
+      RECORDING_MODE,
+      FEP_BEGSIL,
+      FEP_ENDSIL,
+      FEP_XBADJ,
+      END_HEAD /* needed to mark the end of this list*/
+  };
+
+    /* remove a particular field from the header (for writing only)*/
+    void reset(FieldId id);
+
+    /* empties the header (for both reading and writing)*/
+    void reset(void);
+
+    /* CAUTION: strings are not copied, only the pointer is saved*/
+    void setWaveSize(long n); 
+    void setSampleRate(int r);/* shouldn't it be double?*/
+    void setSampleFormat(char *format);
+    void setCoefEmphasis(double c);
+    void setSpeakerName(char *name);
+    void setSpeakerAge(char *age);/*shouln't it be int?*/
+    void setSpeakerSex(char *sex);
+    void setSpeakerAccent(char *accent);
+
+    void setSpeakingMode(char *mode);
+    void setChannelCount(int c);
+    void setSampleCount(long c);
+    void setSampleMin(int m);
+    void setSampleMax(int m);
+    void setSampleNBytes(int n);
+    void setSampleByteFormat(char *format);
+    void setRecordDate(char *date);
+
+    void setMicrophone(char *mic);
+    void setMicrophonePosition(char *micPos);
+    void setRecordSite(char *site);
+    void setDosProgram(char *name);
+    void setDspProgram(char *name);
+    void setLanguage(char *lang);
+    void setRecordTime(char *time);
+    void setUtteranceId(int n);
+    void setCheckSum(long sum);
+    void setAllByteCheckSum(long sum);
+    void setJin0Frame0(int n);
+    void setAverageBackground(int n);
+    void setAverageSpeech(int n);
+    void setSignalToNoiseRatio(int n);
+    void setPromptText(char *text);
+    void setPronunciationText(char *text);
+    void setRecordingMode(char *text);
+    void setFepBegSil(int n);
+    void setFepEndSil(int n);
+    void setFepXbadj(int n);
+
+  protected:
+    char mpCurrentTime[32];
+
+    class FieldDescription
+    {
+      public:
+        char *mFormat;
+        char mType;
+        union
+        {
+          int d;
+          unsigned u;
+          long l;
+          double f;
+          char *s;
+        } mValue;
+        BOOL mbInUse;
+    };
+
+    static FieldDescription mFieldsInit[];
+
+    FieldDescription *mpFields;  /* each instance gets a copy of mFieldsInit*/
+};
+
+inline void
+Nist1AHeader::reset(FieldId id)
+{
+  mpFields[id].mbInUse = FALSE;
+}
+
+#define Nist1AHeaderSetDef(fname, argType, unionKey, fieldId)\
+  inline void Nist1AHeader::##fname(argType x) {\
+    mpFields[fieldId].mbInUse = TRUE;\
+    mpFields[fieldId].mValue.##unionKey = x;}
+
+Nist1AHeaderSetDef(setWaveSize, long, l, WAVE_SIZE)
+Nist1AHeaderSetDef(setSampleRate, int, d, SAMPLE_RATE)
+Nist1AHeaderSetDef(setSampleFormat, char*, s, SAMPLE_FORMAT)
+Nist1AHeaderSetDef(setCoefEmphasis, double, f, COEF_EMPHASIS)
+Nist1AHeaderSetDef(setSpeakerName, char*, s, SPEAKER_NAME)
+Nist1AHeaderSetDef(setSpeakerAge, char*, s, SPEAKER_AGE)
+Nist1AHeaderSetDef(setSpeakerSex, char*, s, SPEAKER_SEX)
+Nist1AHeaderSetDef(setSpeakerAccent, char*, s, SPEAKER_ACCENT)
+
+Nist1AHeaderSetDef(setSpeakingMode, char*, s, SPEAKING_MODE)
+Nist1AHeaderSetDef(setChannelCount, int, d, CHANNEL_COUNT)
+Nist1AHeaderSetDef(setSampleCount, long, l, SAMPLE_COUNT)
+Nist1AHeaderSetDef(setSampleMin, int, d, SAMPLE_MIN)
+Nist1AHeaderSetDef(setSampleMax, int, d, SAMPLE_MAX)
+Nist1AHeaderSetDef(setSampleNBytes, int, d, SAMPLE_N_BYTES)
+Nist1AHeaderSetDef(setSampleByteFormat, char*, s, SAMPLE_BYTE_FORMAT)
+Nist1AHeaderSetDef(setRecordDate, char*, s, RECORD_DATE)
+
+Nist1AHeaderSetDef(setMicrophone, char*, s, MICROPHONE)
+Nist1AHeaderSetDef(setMicrophonePosition, char*, s, MICROPHONE_POSITION)
+Nist1AHeaderSetDef(setRecordSite, char*, s, RECORD_SITE)
+Nist1AHeaderSetDef(setDosProgram, char*, s, DOS_PROGRAM)
+Nist1AHeaderSetDef(setDspProgram, char*, s, DSP_PROGRAM)
+Nist1AHeaderSetDef(setLanguage, char*, s, LANGUAGE)
+Nist1AHeaderSetDef(setRecordTime, char*, s, RECORD_TIME)
+Nist1AHeaderSetDef(setUtteranceId, int, d, UTTERANCE_ID)
+Nist1AHeaderSetDef(setCheckSum, long, l, CHECK_SUM)
+Nist1AHeaderSetDef(setAllByteCheckSum, long, l, ALL_BYTE_CHECK_SUM)
+Nist1AHeaderSetDef(setJin0Frame0, int, d, JIN0_FRAME0)
+Nist1AHeaderSetDef(setAverageBackground, int, d, AVERAGE_BACKGROUND)
+Nist1AHeaderSetDef(setAverageSpeech, int, d, AVERAGE_SPEECH)
+Nist1AHeaderSetDef(setSignalToNoiseRatio, int, d, SIGNAL_TO_NOISE)
+Nist1AHeaderSetDef(setPromptText, char*, s, PROMPT_TEXT)
+Nist1AHeaderSetDef(setPronunciationText, char*, s, PRONUNCIATION_TEXT)
+Nist1AHeaderSetDef(setRecordingMode, char*, s, RECORDING_MODE)
+Nist1AHeaderSetDef(setFepBegSil, int, d, FEP_BEGSIL)
+Nist1AHeaderSetDef(setFepEndSil, int, d, FEP_ENDSIL)
+Nist1AHeaderSetDef(setFepXbadj, int, d, FEP_XBADJ)
+
+#undef Nist1AHeaderSetDef
+
+#endif
+#endif // DO_CLEANUP_20070723
diff --git a/srec/cfront/sh_down.h b/srec/cfront/sh_down.h
new file mode 100644
index 0000000..3d73cb4
--- /dev/null
+++ b/srec/cfront/sh_down.h
@@ -0,0 +1,101 @@
+/*---------------------------------------------------------------------------*
+ *  sh_down.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _SH_DOWN_INL_
+#define _SH_DOWN_INL_
+
+#include <limits.h>
+
+#include "fronttyp.h"
+#include "setting.h"
+#include "portable.h"
+
+#define SHIFT_DOWN(X,S) ((S) > 0 ? shift_down_inline ((X), (S)) : (X))
+#define SHIFT_UP(X,S) ((S) > 0 ? shift_up_inline ((X), (S)) : (X))
+
+#define COND_SHIFT_DOWN(X,S) (SHIFT_DOWN(X,S))
+#define COND_SHIFT_UP(X,S) (SHIFT_UP(X,S))
+
+static PINLINE int fixed_point_convert(float xx, int shift);
+static PINLINE int shift_up_inline(int value, unsigned int shift);
+static PINLINE int shift_down_inline(int value, unsigned int shift);
+static PINLINE int fixed_round(float value);
+
+#define TRUNCATE_ON_SHIFT   1
+
+static PINLINE int shift_up_inline(int value, unsigned int shift)
+{
+  /* Shift up using bit operations with max limit */
+  int temp, retval;
+
+  ASSERT(shift > 0);
+  if (value > 0)
+    temp = value;
+  else
+    temp = -value;
+
+  retval = temp << shift;
+
+  if ((retval > (int)LONG_MAX) || (retval < temp)) /* TODO: max_val if LONG_MAX, overflow won't be detected */
+    retval = (int)LONG_MAX;
+  if (value > 0)
+    return retval;
+  else
+    return (-retval);
+}
+
+
+static PINLINE int shift_down_inline(int value, unsigned int shift)
+/* Shift down using bit operations with rounding */
+{
+  if (shift-- == 0)
+    return (value);
+  if (value >= 0)
+    return (((value >> shift) + 1) >> 1);
+  else
+    return (-((((-value) >> shift) + 1) >> 1));
+}
+
+static PINLINE int fixed_point_convert(float xx, int shift)
+{
+  float   scaled_val;
+
+  ASSERT(shift >= 0);
+  scaled_val = xx * (0x01 << shift);
+  if (scaled_val >= 0)
+    if (scaled_val > LONG_MAX)
+      return (LONG_MAX);
+    else
+      return ((int)(scaled_val + 0.5));
+  else
+    if (scaled_val < -LONG_MAX)
+      return (-LONG_MAX);
+    else
+      return ((int)(scaled_val - 0.5));
+}
+
+static PINLINE int fixed_round(float value)
+{
+  if (value > 0)
+    return ((int)(value + 0.5));
+  else
+    return ((int)(value - 0.5));
+}
+
+#endif
diff --git a/srec/cfront/sp_fft.c b/srec/cfront/sp_fft.c
new file mode 100644
index 0000000..ff5bc0f
--- /dev/null
+++ b/srec/cfront/sp_fft.c
@@ -0,0 +1,875 @@
+/*---------------------------------------------------------------------------*
+ *  sp_fft.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+****************************************************************************
+**
+**  FILE:         sp_fft.cpp
+**
+**  CREATED:   11-September-99
+**
+**  DESCRIPTION:  Split-Radix FFT
+**
+**
+**
+**
+**  MODIFICATIONS:
+** Revision history log
+** VSS revision history.  Do not edit by hand.
+**
+** $NoKeywords: $
+**
+*/
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <math.h>
+#include <assert.h>
+#include "front.h"
+#include "portable.h"
+
+#include "sp_fft.h"
+#include "himul32.h"
+/*extern "C" asr_int32_t himul32(asr_int32_t factor1, asr_int32_t factor2);*/
+
+/* >>>> Fixed Point, Floting Point, and Machine Specific Methods <<<<
+
+  We will localize all fixed point, floating point, and machine specific
+  operations into the following methods so that in the main body of the code
+  we would not need to worry these issues.
+*/
+
+/* convert trigonomy function data to its required representation*/
+static trigonomydata
+to_trigonomydata(double a)
+{
+  unsigned scale = (unsigned int)(1 << (8 * sizeof(trigonomydata) - 1));
+  return (trigonomydata)(a * scale);
+}
+
+/* Do a sign-extending right shift of x by i bits, and
+ * round the result based on the leftmost bit shifted out.
+ * Must have 1 <= i < 32.
+ * Note that C doesn't define whether right shift of signed
+ * ints sign-extends or zero-fills.
+ * On platforms that do sign-extend, use the native right shift.
+ * Else use a short branch-free sequence that forces in copies
+ * of the sign bit.
+ */
+static PINLINE asr_int32_t rshift(asr_int32_t x, int i)
+{
+  asr_int32_t xshift = x >> i;
+  ASSERT(i >= 1 && i < 32);
+
+#if -1 >> 31 != -1
+  asr_int32_t signbit = (asr_int32_t)(((asr_uint32_t)x & 0x80000000U) >> i);
+  xshift |= -signbit;
+#endif
+
+  xshift += (x >> (i - 1)) & 1;
+  return xshift;
+}
+
+
+/*  compute (a + jb)*(c + jd) = a*c - b*d + j(ad + bc) */
+static PINLINE void complex_multiplier(trigonomydata a, trigonomydata b,
+                                       fftdata c,   fftdata d,
+                                       fftdata* real,  fftdata* imag)
+{
+  /*
+      himul32(factor1, factor2) = floor( (factor1 * factor2) / 2**32 )
+      we need floor( (factor1 * factor2) / 2**31 )
+      retain one more bit of accuracy by left shifting first.
+  */
+  c <<= 1;
+  d <<= 1;
+  *real = himul32(a, c) - himul32(b, d);
+  *imag = himul32(a, d) + himul32(b, c);
+}
+
+/* determine the maximum number of bits required to represent the data */
+static PINLINE int data_bits(const int length, fftdata data[])
+{
+  asr_uint32_t  bits = 0;
+  int     d    = 0;
+  int     i;
+
+  ASSERT(sizeof(data[0]) == 4);
+
+  for (i = 0; i < length; i++)
+  {
+    d = data[i];
+    bits |= (d > 0) ? d : -d;
+  }
+
+  d = 0;
+  while (bits > 0)
+  {
+    bits >>= 1;
+    d++;
+  }
+
+  return d;
+}
+
+
+/* >>>> Fixed Point, Floting Point, and Machine Independent Methods <<<< */
+
+/* constructor */
+srfft* new_srfft(unsigned logLength)
+{
+  srfft* pthis;
+
+  /* cannot do smaller than 4 point FFT */
+  ASSERT(logLength >= 2);
+
+  pthis              = (srfft*) CALLOC(1, sizeof(srfft), "srfft");
+  pthis->m_logLength = logLength;
+  pthis->m_length    = 1 << logLength;
+
+  allocate_bitreverse_tbl(pthis);
+  allocate_butterfly_tbl(pthis);
+  allocate_trigonomy_tbl(pthis);
+
+  return pthis;
+}
+
+/* destructor */
+void delete_srfft(srfft* pSrfft)
+{
+  FREE((char*)pSrfft->m_sin3Tbl);
+  FREE((char*)pSrfft->m_cos3Tbl);
+  FREE((char*)pSrfft->m_sin2Tbl);
+  FREE((char*)pSrfft->m_cos2Tbl);
+  FREE((char*)pSrfft->m_sin1Tbl);
+  FREE((char*)pSrfft->m_cos1Tbl);
+  FREE((char*)pSrfft->m_butterflyIndexTbl);
+  FREE((char*)pSrfft->m_bitreverseTbl);
+  FREE((char*)pSrfft);
+}
+
+/*
+    allocate L shaped butterfly index lookup table
+*/
+void allocate_butterfly_tbl(srfft* pthis)
+{
+  unsigned butterflyLength, butterflies, *butterflyIndex;
+  unsigned m, n, n2, i, j, i0, is, id, ii, ib;
+
+
+  /* compute total number of L shaped butterflies */
+  m = pthis->m_logLength;
+  butterflyLength = 0;
+  butterflies  = 0;
+  for (i = 0; i < m; i++)
+  {
+    butterflies = (i % 2) ? butterflyLength : butterflyLength + 1;
+    butterflyLength += butterflies;
+  }
+
+  /*  Allocate m more spaces to store size information */
+  butterflyLength += m;
+  butterflyIndex = (unsigned*) CALLOC(butterflyLength, sizeof(unsigned), "srfft.butterflyIndex");
+
+  /* Compute and store L shaped butterfly indexes at each stage */
+  n = pthis->m_length;
+  n2  = n << 1;
+  butterflyLength = 0;
+  ib = 0;
+  for (i = 0; i < m; i++)
+  {
+    butterflies = (i % 2) ? butterflyLength : butterflyLength + 1;
+    butterflyLength += butterflies;
+
+    /* Store number of L butterflies at stage m-i*/
+    butterflyIndex[ib++] = butterflies;
+
+    /* Compute Sorensen, Heideman, and Burrus indexes for L shaped butterfiles */
+    id = n2;
+    is = 0;
+    n2 = n2 >> 1;
+    while (is < n)
+    {
+      for (i0 = is; i0 < n; i0 += id)
+      {
+        butterflyIndex[ib] = i0;
+        if (i0 != 0)
+        {
+          /* sort bufferfly index in increasing order to simplify look up */
+          ii = ib;
+          while (butterflyIndex[ii] < butterflyIndex[ii-1])
+          {
+            j = butterflyIndex[ii];
+            butterflyIndex[ii] = butterflyIndex[ii-1];
+            butterflyIndex[--ii] = j;
+          }
+        }
+        ib++;
+      }
+      is = 2 * id - n2;
+      id = id << 2;
+    }
+  }
+  pthis->m_butterflyIndexTbl = butterflyIndex;
+
+  /* move to stage 2 buffer index table */
+  for (i = 0; i < m - 2; i++)
+  {
+    butterflies = *butterflyIndex;
+    butterflyIndex += (butterflies + 1);
+  }
+
+  /*
+      Since we want to compute four point butterflies directly,
+      when we compute two point butterflieswe at the last stage
+      we must bypass those two point butterflies that are decomposed
+      from previous stage's four point butterflies .
+  */
+  butterflies = *butterflyIndex++; /* number of four point butterflies */
+  ii = butterflies + 1;   /* index to the two point butterflies*/
+  for (i = 0; i < butterflies; i++)
+  {
+    j = butterflyIndex[i];
+
+    /*
+        find those two point butterflies that are
+        decomposed from the four point butterflies
+    */
+    while (butterflyIndex[ii] != j) /* look up is sure so do not need worry over bound*/
+    {
+      ii++;
+    }
+    butterflyIndex[ii++] = 0;
+
+    ASSERT(ii <= butterflyLength + m);
+  }
+}
+
+
+/*
+    Allocate trigonoy function lookup tables
+*/
+void allocate_trigonomy_tbl(srfft* pthis)
+{
+  trigonomydata *pcos1, *psin1, *pcos2, *psin2, *pcos3, *psin3;
+  unsigned  m, n, n2, n4, i, j, ii, nt;
+  double   e, radias, radias3;
+
+  m  = pthis->m_logLength;
+  n  = pthis->m_length;
+  nt = (n >> 1) - 1;
+  pcos1 = (trigonomydata*) CALLOC(nt, sizeof(trigonomydata), "srfft.trigonomydata");
+  psin1 = (trigonomydata*) CALLOC(nt, sizeof(trigonomydata), "srfft.trigonomydata");
+  pcos2 = (trigonomydata*) CALLOC(nt, sizeof(trigonomydata), "srfft.trigonomydata");
+  psin2 = (trigonomydata*) CALLOC(nt, sizeof(trigonomydata), "srfft.trigonomydata");
+  pcos3 = (trigonomydata*) CALLOC(nt, sizeof(trigonomydata), "srfft.trigonomydata");
+  psin3 = (trigonomydata*) CALLOC(nt, sizeof(trigonomydata), "srfft.trigonomydata");
+
+  ii = 0;
+  n2 = n << 1;
+  for (i = 0; i < m - 1; i++)
+  {
+    n2 = n2 >> 1;
+    n4 = n2 >> 2;
+    e = 6.283185307179586 / n2;
+
+    for (j = 0; j < n4; j++)
+    {
+      if (j != 0) /* there is no need for radias zero trigonomy tables */
+      {
+        radias  = j * e;
+        radias3 = 3.0 * radias;
+
+        pcos1[ii]   = to_trigonomydata(cos(radias));
+        psin1[ii]   = to_trigonomydata(sin(radias));
+        pcos3[ii]   = to_trigonomydata(cos(radias3));
+        psin3[ii]   = to_trigonomydata(sin(radias3));
+      }
+      ii++;
+    }
+  }
+
+  for (i = 0; i < nt; i++)
+  {
+    radias = 3.141592653589793 * (i + 1) / n;
+
+    pcos2[i]  = to_trigonomydata(cos(radias));
+    psin2[i]  = to_trigonomydata(sin(radias));
+  }
+
+  pthis->m_cos1Tbl = pcos1;
+  pthis->m_sin1Tbl = psin1;
+  pthis->m_cos2Tbl = pcos2;
+  pthis->m_sin2Tbl = psin2;
+  pthis->m_cos3Tbl = pcos3;
+  pthis->m_sin3Tbl = psin3;
+
+}
+
+/*
+    Allocate bit reverse tables
+*/
+void allocate_bitreverse_tbl(srfft* pthis)
+{
+  unsigned forward, reverse, *tbl;
+  unsigned m, n, i, j;
+
+  n  = pthis->m_length;
+  tbl = (unsigned*) CALLOC(n, sizeof(unsigned), "srfft.bitreverseTbl");
+  for (j = 0; j < n; j++) tbl[j] = 0;
+
+  m  = pthis->m_logLength;
+  forward = 1;
+  reverse = n >> 1;
+  for (i = 0; i < m; i++)
+  {
+    for (j = 0; j < n; j++)
+    {
+      if (forward & j) tbl[j] |= reverse;
+    }
+    reverse >>= 1;
+    forward <<= 1;
+  }
+
+  pthis->m_bitreverseTbl = tbl;
+}
+
+
+/*
+    Compute a four point FFT that requires no multiplications
+*/
+static PINLINE void four_point_fft1(fftdata* data)
+{
+  fftdata r0, r1, r2;
+
+  r0  = data[0];
+  r1  = data[4];
+  data[0] = r0 + r1;
+  data[4] = r0 - r1;
+
+  r0  = data[2];
+  r1  = data[6];
+  data[2] = r0 + r1;
+  data[6] = r0 - r1;
+
+  r0  = data[1];
+  r1  = data[5];
+  data[1] = r0 + r1;
+  data[5] = r0 - r1;
+
+  r0  = data[3];
+  r1  = data[7];
+  data[3] = r0 + r1;
+  data[7] = r0 - r1;
+
+  r0 = data[0];
+  r1 = data[2];
+  data[0] = r0 + r1;
+  data[2] = r0 - r1;
+
+  r0 = data[1];
+  r1 = data[3];
+  data[1] = r0 + r1;
+  data[3] = r0 - r1;
+
+  r0 = data[4];
+  r1 = data[7];
+  r2 = data[6];
+  data[4] = r0 + r1;
+  data[6] = r0 - r1;
+
+  r0 = data[5];
+  data[5] = r0 - r2;
+  data[7] = r0 + r2;
+}
+
+/*
+    Compute a two point FFT that requires no multiplications
+*/
+static PINLINE void two_point_fft1(fftdata* data)
+{
+  fftdata r0, r1;
+
+  r0 = data[0];
+  r1 = data[2];
+  data[0] = r0 + r1;
+  data[2] = r0 - r1;
+
+  r0 = data[1];
+  r1 = data[3];
+  data[1] = r0 + r1;
+  data[3] = r0 - r1;
+}
+
+
+static PINLINE void comp_L_butterfly1(unsigned butteflyIndex, unsigned quarterLength,
+                                      trigonomydata  cc1,  trigonomydata ss1,
+                                      trigonomydata    cc3,  trigonomydata ss3,
+                                      fftdata* data)
+{
+  unsigned k1, k2, k3;
+  fftdata  r0, r1, r2, r3, i0, i1, i2, i3;
+
+  quarterLength <<= 1;
+
+  k1 = quarterLength;
+  k2 = k1 + quarterLength;
+  k3 = k2 + quarterLength;
+
+  r0 = data[0];
+  r1 = data[k1];
+  r2 = data[k2];
+  r3 = data[k3];
+  i0 = data[1];
+  i1 = data[k1+1];
+  i2 = data[k2+1];
+  i3 = data[k3+1];
+
+  /* compute the radix-2 butterfly */
+  data[0]    = r0 + r2;
+  data[k1]   = r1 + r3;
+  data[1]    = i0 + i2;
+  data[k1+1] = i1 + i3;
+
+  /* compute two radix-4 butterflies with twiddle factors */
+  r0 -= r2;
+  r1 -= r3;
+  i0 -= i2;
+  i1 -= i3;
+
+  r2 = r0 + i1;
+  i2 = r1 - i0;
+  r3 = r0 - i1;
+  i3 = r1 + i0;
+
+  /*
+      optimize the butterfly computation for zero's power twiddle factor
+      that does not need multimplications
+  */
+  if (butteflyIndex == 0)
+  {
+    data[k2] = r2;
+    data[k2+1] = -i2;
+    data[k3] = r3;
+    data[k3+1] = i3;
+  }
+  else
+  {
+    complex_multiplier(cc1, -ss1, r2, -i2, data + k2, data + k2 + 1);
+    complex_multiplier(cc3, -ss3, r3, i3,  data + k3, data + k3 + 1);
+  }
+}
+
+/**********************************************************************/
+void do_fft1(srfft* pthis, unsigned length2, fftdata* data)
+{
+  unsigned  *indexTbl, indexLength;
+  trigonomydata *cos1, *sin1, *cos3, *sin3;
+  trigonomydata cc1, ss1, cc3, ss3;
+  unsigned  n, m, n4, i, j, k, ii, k0;
+  fftdata   temp;
+
+  /* Load butterfly index table */
+  indexTbl = pthis->m_butterflyIndexTbl;
+  indexLength = 0;
+
+  /* Load cosine and sine tables */
+  cos1 = pthis->m_cos1Tbl;
+  sin1 = pthis->m_sin1Tbl;
+  cos3 = pthis->m_cos3Tbl;
+  sin3 = pthis->m_sin3Tbl;
+
+  /* stages of butterfly computation*/
+  n = pthis->m_length;
+  m = pthis->m_logLength;
+
+
+  /*
+      compute L shaped butterfies util only 4 and 2 point
+      butterfiles are left
+  */
+  n4 = n >> 1;
+  ii = 0;
+  for (i = 0; i < m - 2; i++)
+  {
+    n4 >>= 1;
+
+    /* read the number of L shaped butterfly nodes at the stage */
+    indexLength = *indexTbl++;
+
+    /*
+        compute one L shaped butterflies at each stage
+        j (time) and k (frequency) loops are reversed to minimize
+        trigonomy table lookups
+    */
+    for (j = 0; j < n4; j++)
+    {
+      cc1 = cos1[ii];
+      ss1 = sin1[ii];
+      cc3 = cos3[ii];
+      ss3 = sin3[ii++];
+      for (k = 0; k < indexLength; k++)
+      {
+        k0 = indexTbl[k] + j;
+        k0 <<= 1;
+        comp_L_butterfly1(j, n4, cc1, ss1, cc3, ss3, data + k0);
+      }
+    }
+
+    /* Move to the butterfly index table of the next stage*/
+    indexTbl += indexLength;
+  }
+
+  /* Compute 4 point butterflies at stage 2 */
+  indexLength = *indexTbl++;
+  for (k = 0; k < indexLength; k++)
+  {
+    k0 = indexTbl[k];
+    k0 <<= 1;
+    four_point_fft1(data + k0);
+  }
+  indexTbl += indexLength;
+
+  /* Compute 2 point butterflies of the last stage */
+  indexLength = *indexTbl++;
+  for (k = 0; k < indexLength; k++)
+  {
+    k0 = indexTbl[k];
+    k0 <<= 1;
+
+    /* k0 = 0 implies these nodes have been computed */
+    if (k0 != 0)
+    {
+      two_point_fft1(data + k0);
+    }
+  }
+
+  /* Bit reverse the data array */
+  indexTbl = pthis->m_bitreverseTbl;
+  for (i = 0; i < n; i++)
+  {
+    ii = indexTbl[i];
+    if (i < ii)
+    {
+      j = i << 1;
+      k = ii << 1;
+      temp = data[j];
+      data[j] = data[k];
+      data[k] = temp;
+
+      j++;
+      k++;
+      temp = data[j];
+      data[j] = data[k];
+      data[k] = temp;
+    }
+  }
+}
+
+void do_real_fft(srfft* pthis, unsigned n, fftdata* data)
+{
+  unsigned  n2;
+  unsigned  i, i1, i2, i3, i4;
+  fftdata   h1r, h1i, h2r, h2i, tr, ti;
+  trigonomydata *cos2, *sin2;
+
+  cos2  = pthis->m_cos2Tbl;
+  sin2  = pthis->m_sin2Tbl;
+
+  /* do a complex FFT of half size using the even indexed data
+  ** as real component and odd indexed data as imaginary data components
+  */
+
+  do_fft1(pthis, n, data);
+
+  /*
+  **  queeze the real valued first and last component of
+  **  the complex transform as elements data[0] and data[1]
+  */
+  tr = data[0];
+  ti = data[1];
+  data[0] = (tr + ti);
+  data[1] = (tr - ti);
+
+  /* do the rest of elements*/
+  n2  = n >> 2;
+  for (i = 1; i < n2; i++)
+  {
+    i1 = i << 1;
+    i2 = i1 + 1;
+    i3 = n - i1;
+    i4 = i3 + 1;
+
+    h1r = (data[i1] + data[i3]) / 2;
+    h1i = (data[i2] - data[i4]) / 2;
+    h2r = (data[i2] + data[i4]) / 2;
+    h2i = -(data[i1] - data[i3]) / 2;
+
+    complex_multiplier(cos2[i-1], -sin2[i-1], h2r, h2i, &tr, &ti);
+
+    data[i1] = h1r + tr;
+    data[i2] = h1i + ti;
+    data[i3] = h1r - tr;
+    data[i4] = -h1i + ti;
+  }
+  /* center one needs no multiplication, but has to reverse sign */
+  i = (n >> 1);
+  data[i+1] = -data[i+1];
+
+}
+
+/*****************************************************************************/
+
+int do_real_fft_magsq(srfft* pthis, unsigned n, fftdata* data)
+{
+  fftdata tr, ti, last;
+  unsigned i, ii, n1;
+  int  scale    = 0;
+  int  s        = 0;
+  unsigned maxval   = 0;
+
+
+  /*
+  **   Windowed fftdata has an unknown data length - determine this using
+  **   data_bits(), a maximum of:
+  **
+  **   fixed data = windowedData * 2**HAMMING_DATA_BITS
+  **
+  **   FFT will grow data log2Length. In order to avoid data overflow,
+  **   we can scale data by a factor
+  **
+  **   scale = 8*sizeof(fftdata) - data_bits() - log2Length
+  **
+  **   In other words, we now have
+  **
+  **   fixed data = windowedData * 2**HAMMING_DATA_BITS * 2**scale
+  **
+  */
+
+
+  scale = 8 * sizeof(fftdata) - 2 - pthis->m_logLength;
+  scale -= data_bits(n, data);
+
+  for (i = 0; i < n; i++)
+  {
+    if (scale < 0)
+    {
+      data[i] = rshift(data[i], -scale);
+    }
+    else
+    {
+      data[i] <<= scale;
+    }
+  }
+
+  /* compute the real input fft,  the real valued first and last component of
+  ** the complex transform is stored as elements data[0] and data[1]
+  */
+
+  do_real_fft(pthis, n, data);
+
+  /*  After fft, we now have the data,
+  **
+  **  fixed data = fftdata * 2**HAMMING_DATA_BITS * 2**scale
+  **
+  **  to get fft data, we then need to reverse-shift the fixed data by the
+  **  scale constant;
+  **
+  **  However, since our purpose is to compute magnitude, we can combine
+  **  this step into the magnitude computation. Notice that
+  **
+  **  fixed data = fftdata * 2**(8*sizeof(fftdata) - DATA_BITS - log2Length)
+  **
+  **  if we use himul32 to compute the magnitude, which gives us,
+  **
+  **  fixed magnitude = fftdata magnitude * 2**(2*(32 - 16 - log2Length)) - 2**32)
+  **                  = fftdata magnitude * 2**(-2*log2Length)
+  **
+  **  to get the fixed magnitude = fftdata magnitude * 2**(-log2Length-1)
+  **                             = fftdata magnitude/FFT length
+  **  we need to upscale fftdata to cancel out the log2Lenght-1 factor in
+  **  the fixed magnitude
+  **
+  **  Notice that upshift scale log2Lenght-1 is not a constant, but a
+  **  function of FFT length.
+  **  Funthermore, even and odd log2Length-1 must be handled differently.
+  **
+  */
+
+  /*
+  **  This bit is a lot simpler now, we just aim to get the pre-magsqu
+  **  values in a 30-bit range + sign.
+  **  This is the max val if we want r*r+i*i guarenteed < signed int64 range.
+  **  So shift the data up until it is ==30 bits (FFTDATA_SIZE-2)
+  */
+
+  s = (FFTDATA_SIZE - 2) - data_bits(n, data);
+  /* n is twice the size, so this */
+  
+
+  for (i = 0; i < n; i++)
+  {
+    if (s < 0)
+    {
+      data[i] = rshift(data[i], -s);
+    }
+    else
+    {
+      data[i] <<= s;
+    }
+  }
+
+  scale += s;
+
+  /*
+  **  OK, now we are in the 30bit range, we can do a magsq.
+  **  This magsq output must be less that 60bit plus sign.
+  */
+
+  /*
+  **  Special at start as DC and Nyquist freqs are in data[0] and data[1]
+  **  respectively.
+  */
+
+  tr = data[0];
+  data[0] = himul32(tr, tr);
+  maxval |= data[0];
+
+  tr = data[1];
+  last = himul32(tr, tr);
+  maxval |= last;
+
+  n1 = n >> 1;
+  for (i = 1; i < n1; i++)
+  {
+    ii = i << 1;
+    tr = data[ii];
+    data[i] = himul32(tr, tr);
+
+    ti = data[++ii];
+    data[i] += himul32(ti, ti);
+
+    maxval |= data[i];
+  }
+
+  data[n1] = last; /* now the Nyquist freq can be put in place */
+
+  /*
+  **  computing magnitude _squared_ means the scale is effectively
+  **  applied twice
+  */
+
+  scale *= 2;
+
+  /*
+  **  account for inherent scale of fft - we have do to this here as each
+  **  stage scales by sqrt(2), and we couldn't add this to scale until
+  **  after it had been multiplied by two (??)
+  **  TODO: The truth is we got here by trial and error
+  **   This should be checked.
+  */
+
+  scale += pthis->m_logLength + 1;
+
+  /*
+  **  doing the himul32() shift results in shifting down by 32(FFTDATA_SIZE) bits.
+  */
+
+  scale -= 32;
+
+  ASSERT(maxval >= 0);
+  ASSERT(!(maxval & 0xC0000000));
+  /* we've done something wrong if */
+  /* either of the top two bits  */
+  /* get used!    */
+
+  return(-scale);  /* return the amount we have shifted the */
+  /* data _down_ by    */
+
+}
+
+
+/*****************************************************************************/
+
+void configure_fft(fft_info *fft, int size)
+{
+  unsigned int log2Length, length;
+
+  log2Length = 0;
+  length = size / 2;
+  while (length > 1)
+  {
+    length = length >> 1;
+    log2Length++;
+  }
+
+  ASSERT(size == 1 << (log2Length + 1));
+  fft->size2 = size;
+  fft->size = size / 2;
+
+  fft->m_srfft = new_srfft(log2Length);
+  fft->real = (fftdata*) CALLOC(size + 2, sizeof(fftdata), "srfft.fft_data");
+  fft->imag = fft->real + size / 2 + 1;
+}
+
+int fft_perform_and_magsq(fft_info *fft)
+{
+  unsigned n = fft->size2;
+  fftdata     *real = fft->real;
+  srfft       *pSrfft = fft->m_srfft;
+  ;
+
+  return do_real_fft_magsq(pSrfft, n, real);
+}
+
+void unconfigure_fft(fft_info *fft)
+{
+  ASSERT(fft);
+  delete_srfft(fft->m_srfft);
+  FREE((char*)fft->real);
+}
+
+
+int place_sample_data(fft_info *fft, fftdata *seq, fftdata *smooth, int num)
+{
+  int ii, size2;
+  srfft * pSrfft;
+
+  pSrfft = fft->m_srfft;
+
+  ASSERT(fft);
+  ASSERT(seq);
+  ASSERT(smooth);
+  ASSERT(num <= (int)fft->size2);
+  size2 = fft->size2;
+
+  for (ii = 0; ii < num; ii++)
+  {
+    fft->real[ii] = (fftdata)(seq[ii] * smooth[ii]);
+  }
+
+  for (; ii < size2; ii++)
+  {
+    fft->real[ii] = 0;
+  }
+
+  return(-(HALF_FFTDATA_SIZE - 1));
+}
+
diff --git a/srec/cfront/spec_anl.c b/srec/cfront/spec_anl.c
new file mode 100644
index 0000000..aad5457
--- /dev/null
+++ b/srec/cfront/spec_anl.c
@@ -0,0 +1,479 @@
+/*---------------------------------------------------------------------------*
+ *  spec_anl.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include <stdlib.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <string.h>
+#include <math.h>
+#include <limits.h>
+#include <assert.h>
+
+#include "hmm_desc.h"
+#include "front.h"
+#include "pendian.h"
+#include "portable.h"
+#include "LCHAR.h"
+
+#include "../clib/memmove.h"
+
+#define DEBUG           0
+
+#include "sh_down.h"
+
+static int sort_ints_unique(int *list, int *num);
+//static void mask_fft_taps(fftdata *data, int num, front_freq *freqobj);
+
+void peakpick(front_freq *freqobj, fftdata *density, int num_freq);
+void magsq(fftdata *x, fftdata *y, fftdata *z, int ns);
+
+void preemph(fftdata *data, int window_len, samdata *wav_data,
+             int num_samples, coefdata pre_mel,
+             bigdata *last_sample);
+void filtbank(front_freq *freqobj, fftdata *density, cepdata *fbo);
+
+
+
+void filterbank_emulation(front_channel * channel, front_wave *waveobj,
+                          front_freq *freqobj, front_cep *cepobj, samdata *income,
+                          samdata *outgo, int num_samples)
+{
+  /*  Part II. Mel cepstrum coefficients
+  **
+  **  Maintain parameter queue */
+  MEMMOVE(channel->cep + (channel->mel_dim + 1), channel->cep,
+          (Q2 - 1) *(channel->mel_dim + 1), sizeof(cepdata));
+  channel->shift = 0;
+
+  /*  2.01 Pre-emphasize waveform
+  Only the new samples are preemphasized.  To carry on from the previous call,
+  the last sample value is stored in lastx.
+  */
+  preemph(channel->prebuff, freqobj->window_length, income, num_samples,
+          waveobj->pre_mel, &channel->lastx);
+
+#if DEBUG
+  log_report("preemphasized data\n");
+  write_scaled_frames(freqobj->window_length, 1, channel->prebuff, D_FIXED, (float) 1 / (0x01 << WAVE_SHIFT));
+#endif
+  /******************************************************************************
+  **  The "NEW" fft performs shifting operations in fixed point, to maximise
+  **  precision.
+  **
+  *******************************************************************************/
+  channel->shift += place_sample_data(&freqobj->fft, channel->prebuff,
+                                      freqobj->ham, freqobj->window_length);
+#if DEBUG
+  log_report("windowed data\n");
+  if (channel->shift >= 0)
+  {
+    write_scaled_frames(freqobj->fft.size, 1, freqobj->fft.real, D_FIXED, (float)(0x01 << channel->shift));
+    write_scaled_frames(freqobj->fft.size, 1, freqobj->fft.imag, D_FIXED, (float)(0x01 << channel->shift));
+  }
+  else
+  {
+    write_scaled_frames(freqobj->fft.size, 1, freqobj->fft.real, D_FIXED, (float)1 / (0x01 << -channel->shift));
+    write_scaled_frames(freqobj->fft.size, 1, freqobj->fft.imag, D_FIXED, (float)1 / (0x01 << -channel->shift));
+  }
+#endif
+  channel->shift *= 2;
+  channel->shift += fft_perform_and_magsq(&freqobj->fft);
+
+#if DEBUG
+  log_report("After magnitude squared (%d)\n", channel->frame_count);
+  if (channel->shift >= 0)
+    write_scaled_frames(freqobj->fft.size, 1, freqobj->fft.real, D_FIXED, (float)(0x01 << (channel->shift)));
+  else
+    write_scaled_frames(freqobj->fft.size, 1, freqobj->fft.real, D_FIXED, (float)1 / (0x01 << (- channel->shift)));
+#endif
+
+#if DEBUG
+  log_report("After magnitude squared: ");
+  if (channel->shift >= 0)
+    write_scaled_frames(freqobj->fft.size, 1, (void *)freqobj->fft.real, D_FIXED, (float)(0x01 <<  channel->shift));
+  else
+    write_scaled_frames(freqobj->fft.size, 1, (void *)freqobj->fft.real, D_FIXED, (float)1 / (0x01 <<  -channel->shift));
+#endif
+
+  if (freqobj->do_nonlinear_filter)
+    peakpick(freqobj, freqobj->fft.real, freqobj->fft.size + 1);
+
+#if DEBUG
+  log_report("After peakpick: ");
+  if (channel->shift >= 0)
+    write_scaled_frames(freqobj->fft.size + 1, 1, (void *)freqobj->fft.real, D_FIXED, (float)(0x01 << channel->shift));
+  else
+    write_scaled_frames(freqobj->fft.size + 1, 1, (void *)freqobj->fft.real, D_FIXED, (float)1 / (0x01 << -channel->shift));
+#endif
+
+  /*  2.23 Apply filterbank emulation */
+  channel->shift += RAMP_SHIFT;
+  filtbank(freqobj, freqobj->fft.real, channel->filterbank);
+#if DEBUG
+  log_report("After filterbanked: ");
+  if (channel->shift >= 0)
+    write_scaled_frames(freqobj->nf, 1, channel->filterbank, D_FIXED, (float)(0x01 << channel->shift));
+  else
+    write_scaled_frames(freqobj->nf, 1, channel->filterbank, D_FIXED, (float)1 / (0x01 << -channel->shift));
+#endif
+
+  return;
+}
+
+
+void preemph(fftdata *data, int window_len, samdata *wav_data,
+             int num_samples, coefdata pre_mel,
+             bigdata *last_sample)
+/*
+**  pre-emphasize on speech data, check for end of data */
+/*  SCALE: In this stage we're introducing a scale factor of 2 */
+{
+  int i;
+  bigdata temp;
+
+  ASSERT(data);
+  ASSERT(last_sample);
+  ASSERT(wav_data);
+  ASSERT(num_samples >= 0);
+  if (num_samples > window_len)
+    num_samples = window_len;
+
+  if (num_samples < window_len)
+    MEMMOVE(data, data + num_samples, (window_len - num_samples),
+            sizeof(fftdata));
+  data += window_len - num_samples;
+
+  /*  If no preemphasis to do
+  */
+  if (pre_mel == 0)
+  { /* dont't shift */
+    for (i = 0; i < num_samples; i++)
+      data[i] = (fftdata) wav_data[i];
+    return;
+  }
+
+  /*  Otherwise do the preemphasis
+  */
+  for (i = 0; i < num_samples; i++)
+  {
+    temp = SHIFT_UP((bigdata)wav_data[i], COEFDATA_SHIFT);
+    data[i] = (fftdata)(SHIFT_DOWN(temp - (*last_sample), COEFDATA_SHIFT));
+    *last_sample = (bigdata)pre_mel * wav_data[i];
+
+  }
+  return;
+}
+
+void magsq(fftdata *x, fftdata *y, fftdata *z, int ns)
+/*
+**  magnitude squared, tailored for TI FFT routines
+**  The dynamic range should fit 32 - RAMP_SHIFT */
+{
+  int i;
+
+  ASSERT((float)x[0] *(float)x[0] < LONG_MAX);
+  ASSERT((float)x[0] *(float)x[0] > LONG_MIN);
+  z[0] = (fftdata)((bigdata)x[0] * (bigdata)x[0]);
+  for (i = 1; i < ns; i++)
+  {
+    ASSERT(((fftdata)x[i] *(fftdata)x[i]) >= 0);
+    ASSERT(((fftdata)y[i] *(fftdata)y[i]) >= 0);
+    ASSERT((float)x[i] *(float)x[i] < LONG_MAX);
+    ASSERT((float)x[i] *(float)x[i] > LONG_MIN);
+    ASSERT((float)y[i] *(float)y[i] < LONG_MAX);
+    ASSERT((float)y[i] *(float)y[i] > LONG_MIN);
+    /*    z[i]= (fftdata) SHIFT_DOWN ((bigdata)x[i] * (bigdata)x[i] + (bigdata)y[i] * (bigdata)y[i], RAMP_SHIFT);
+    */
+    z[i] = (fftdata)(((bigdata)x[i] * (bigdata)x[i])
+                     + ((bigdata)y[i] * (bigdata)y[i]));
+    if (z[i] <= 0)
+      z[i] = (fftdata) 1;
+  }
+  return;
+}
+
+void peakpick(front_freq *freqobj, fftdata *density, int num_freq)
+{
+  int i;
+  fftdata peak;
+  fftdata bdecay;
+  fftdata fdecay;
+  int first;
+  int last;
+
+  ASSERT(freqobj);
+  /* Fixed pt requires scale up of COEFDATA_SHIFT on these pars (coefdata) */
+  bdecay = freqobj->peakpickdown;
+  fdecay = freqobj->peakpickup;
+
+  if ((bdecay <= (fftdata) 0.0) && (fdecay <= (fftdata) 0.0))
+    return;
+
+  first = freqobj->cut_off_below;
+  last  = freqobj->cut_off_above;
+  /* this filters from cut_off_below to       */
+  /* cut_off_above inclusive          */
+
+  if (last >= num_freq)
+    last = num_freq - 1;
+  /* as most routines seem to check both      */
+  /* limits                           */
+
+  if (bdecay > 0.0)
+  {
+    ASSERT(density[last] >= 0);
+    peak = density[last];
+    for (i = last - 1; i >= first; i--)
+    {
+      peak = (fftdata)(SHIFT_DOWN((bigdata)peak, COEFDATA_SHIFT) * (bigdata)bdecay);
+      ASSERT(peak >= 0);
+      if (density[i] > peak)
+        peak = density[i];
+      else
+        density[i] = peak;
+    }
+  }
+  if (fdecay > 0.0)
+  {
+    peak = density[first];
+    for (i = first + 1; i <= last; i++)
+    {
+      peak = (fftdata)(SHIFT_DOWN((bigdata)peak, COEFDATA_SHIFT) * (bigdata)fdecay);
+      if (density[i] > peak)
+        peak = density[i];
+      else
+        density[i] = peak;
+    }
+  }
+  return;
+}
+
+void filtbank(front_freq *freqobj, fftdata *density, cepdata *fbo)
+/*
+**  pwr spect -> filter bank output (linear) */
+{
+  int i, j, k;
+  bigdata t, sum, mom, nxt;
+
+  /*  Scale down before starting mel-filterbank operations
+  */
+  for (i = 0; i < freqobj->cut_off_above; i++)
+    density[i] = SHIFT_DOWN(density[i], RAMP_SHIFT);
+
+  j = MAX(freqobj->fcmid[0], freqobj->cut_off_below);
+  nxt = 0;
+  for (; j < freqobj->fcmid[1]; j++)
+  {
+    ASSERT(((float)nxt + (float)freqobj->framp[j] *(float)density[j]) < LONG_MAX);
+    ASSERT(((float)nxt + (float)freqobj->framp[j] *(float)density[j]) > -LONG_MAX);
+    nxt += (bigdata) SHIFT_DOWN((bigdata)freqobj->framp[j] * (bigdata)density[j], RAMP_SHIFT);
+  }
+  for (i = 0, k = 2; i < freqobj->nf; i++, k++)
+  {
+    sum = mom = 0;
+    for (; j < freqobj->fcmid[k]; j++)
+    {
+      /* TODO: Tidy up this fixed pt shifting. BP */
+
+      ASSERT((float) freqobj->framp[j] *(float) density[j] < LONG_MAX);
+      ASSERT((float) freqobj->framp[j] *(float) density[j] > LONG_MIN);
+      ASSERT((float) sum + (float)density[j] < LONG_MAX);
+      ASSERT((float) sum + (float)density[j] > LONG_MIN);
+      sum += (bigdata) density[j];
+      ASSERT((float) mom + (float) freqobj->framp[j] *(float) density[j] < LONG_MAX);
+      ASSERT((float) mom + (float) freqobj->framp[j] *(float) density[j] > LONG_MIN);
+
+      mom += (bigdata)(long) SHIFT_DOWN((bigdata)freqobj->framp[j] * (bigdata)density[j], RAMP_SHIFT);
+    }
+
+    ASSERT(((float)nxt + (float)sum - (float)mom) < LONG_MAX);
+    ASSERT(((float)nxt + (float)sum - (float)mom) > LONG_MIN);
+
+    /* TODO: refine this expression. Shift down fcscl in advance.  */
+    t = (bigdata)((SHIFT_UP(nxt + sum - mom, HALF_RAMP_SHIFT)
+                   + SHIFT_DOWN(freqobj->fcscl[i+1], HALF_RAMP_SHIFT + 1))
+                  / SHIFT_DOWN(freqobj->fcscl[i+1], HALF_RAMP_SHIFT));
+    /* TODO: cleanup and also check for division by zero */
+    nxt = mom;
+    fbo[i] = (cepdata) t;
+  }
+  return;
+}
+
+int create_spectrum_filter(front_freq *freqobj, int *freq, int *spread)
+{
+  int ii, jj, freq_step;
+  int lo, hi;
+  ASSERT(freqobj);
+  ASSERT(freqobj->spectrum_filter_num == 0);
+  ASSERT(freqobj->samplerate > 0);
+  /* Convert to FFT taps. Mark adjacent taps as well as taps within spread */
+  freq_step = (freqobj->samplerate << 12) / (2 * freqobj->fft.size);
+  freqobj->spectrum_filter = (int *) CALLOC_CLR(freqobj->fft.size + 1, sizeof(int), "cfront.spectrum_filter");
+  freqobj->spectrum_filter_num = 0;
+  for (ii = 0 ; ii < MAX_FILTER_NUM; ii++)
+  {
+    if (freq[ii] == 0)
+      continue;
+    lo = (((freq[ii] - spread[ii]) * 2 * freqobj->fft.size) + freqobj->samplerate / 2) / freqobj->samplerate;
+    hi = (((freq[ii] + spread[ii]) * 2 * freqobj->fft.size) + freqobj->samplerate / 2) / freqobj->samplerate;
+
+
+    for (jj = lo; jj <= hi;jj++)
+    {
+      if (freqobj->spectrum_filter_num >= (int) freqobj->fft.size)
+        SERVICE_ERROR(MAX_FILTER_POINTS_EXCEEDED);
+      freqobj->spectrum_filter[freqobj->spectrum_filter_num++] = jj;
+    }
+    /* jj=0;
+     while (((jj+1)*freq_step)>>12 <= freq[ii]-spread[ii])
+         jj++;
+     while (((jj-1)*freq_step>>12) < freq[ii]+spread[ii]){
+         if (freqobj->spectrum_filter_num >= (int) freqobj->fft.size)
+      SERVICE_ERROR (MAX_FILTER_POINTS_EXCEEDED);
+         freqobj->spectrum_filter[freqobj->spectrum_filter_num++]= jj;
+         jj++;
+     }
+    */
+  }
+  sort_ints_unique(freqobj->spectrum_filter, &freqobj->spectrum_filter_num);
+  return (freqobj->spectrum_filter_num);
+}
+
+void clear_spectrum_filter(front_freq *freqobj)
+{
+  ASSERT(freqobj->spectrum_filter);
+  if (freqobj->spectrum_filter)
+    FREE((char *) freqobj->spectrum_filter);
+  freqobj->spectrum_filter = NULL;
+  freqobj->spectrum_filter_num = 0;
+  return;
+}
+
+static int sort_ints_unique(int *list, int *num)
+{
+  /*  Sort a list of ints and make unique */
+  int ii, jj, temp;
+  for (ii = 1; ii < *num; ii++)
+  {
+    for (jj = 0; jj < ii; jj++)
+    {
+      temp = list[ii];
+      if (temp < list[jj])
+      {
+        MEMMOVE(&list[jj+1], &list[jj], (ii - jj), sizeof(int));
+        list[jj] = temp;
+        break;
+      }
+      if (temp == list[jj])
+      {
+        MEMMOVE(&list[ii], &list[ii+1], (*num - ii), sizeof(int));
+
+
+
+        (*num)--;
+      }
+    }
+  }
+  return *num;
+}
+
+//static void mask_fft_taps(fftdata *data, int num, front_freq *freqobj)
+//{
+//  for (int i = 0; i < freqobj->spectrum_filter_num; ++i)
+//  {
+//    ASSERT(freqobj->spectrum_filter[i] < num);
+//    data[freqobj->spectrum_filter[i]] = 0;
+//  }
+//}
+
+/* --------------------------------------------------
+ freq_warp will do pure linear warping if the warp
+ scale > 1.0. Otherwise it will do piecewise warp
+ which means warping the second part, from xstart
+ to the bandwidth with another scale which is
+ determined by b and c in the formulation.
+ In general, 0.7 < wscale < 1.4, and xstart <= 1
+ 08/15/01, Puming Zhan
+ --------------------------------------------------- */
+void freq_warp(front_freq *freqobj, fftdata *inbuf, int ns)
+{
+  int i;
+  int nsE;
+  float x1, y1, b, c, wscale;
+  fftdata *tmpbuf;
+
+  ASSERT(freqobj && inbuf);
+
+  ASSERT(freqobj->warp_scale != 0);
+
+  wscale = freqobj->warp_scale;
+  x1     = freqobj->piecewise_start;
+  tmpbuf = (fftdata *) CALLOC(ns, sizeof(fftdata), "cfront.tmpbuf");
+
+  if (wscale < MIN_WARP_SCALE || wscale > MAX_WARP_SCALE)
+  {
+    SERVICE_ERROR(WARP_SCALE);
+  }
+  if (x1 > 1.0 || x1 < 0.5)
+  {
+    SERVICE_ERROR(PIECEWISE_START);
+  }
+
+  y1 = x1 < wscale ? (float)x1 / wscale : (float)1.0;
+
+  b = y1 < 1.0 ? (float)((1.0 - x1) / (1.0 - y1)) : (float)0.0;
+
+  c = (float)((1.0 - b) * (ns - 1));
+
+  nsE = (int)(y1 * (ns - 1));
+
+  for (i = 0; i < ns; i++)
+  {
+    float x = i > nsE ? b * i + c : wscale * i;
+    int   u = (int)ceil((double)x);
+    int   l = (int)floor((double)x);
+    float w1 = x - l;
+    float w2 = 1 - w1;
+
+    if (u < ns)
+    {
+      tmpbuf[i] = (int)(w1 * inbuf[u] + w2 * inbuf[l]);
+    }
+    else
+    {
+      tmpbuf[i] = inbuf[ns-1];
+    }
+  }
+
+  /* need to copy the warped fft into inbuf    */
+  /* because the following function filtbank() */
+  /* will take inbuf as input                  */
+  /* considering that this function will be    */
+  /* for every frame, it may not be a good idea*/
+  /* to do malloc here                         */
+
+  for (i = 0; i < ns; i++)
+    inbuf[i] = tmpbuf[i];
+
+  FREE((char *) tmpbuf);
+}
diff --git a/srec/cfront/wav_acc.c b/srec/cfront/wav_acc.c
new file mode 100644
index 0000000..f96d5f5
--- /dev/null
+++ b/srec/cfront/wav_acc.c
@@ -0,0 +1,246 @@
+/*---------------------------------------------------------------------------*
+ *  wav_acc.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+static const char wav_acc_c[] = "$Id: wav_acc.c,v 1.6.6.7 2007/10/15 18:06:24 dahan Exp $";
+
+#ifndef _RTT
+#include "pstdio.h"
+#endif
+#include <stdlib.h>
+#include <limits.h>
+#include <math.h>
+#include <string.h>
+#include "passert.h"
+#include "pendian.h"
+#include "portable.h"
+
+
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+
+#include "sample.h"
+#include "mulaw.h"
+
+#include "portable.h"
+
+
+void create_sample_buffer(wave_info *wave, int frame_size, int window_size)
+{
+  ASSERT(wave);
+  ASSERT(frame_size > 0);
+  ASSERT(window_size >= frame_size);
+  wave->income = (samdata *) CALLOC(window_size, sizeof(samdata), "cfront.wave.income");
+  wave->outgo = (samdata *) CALLOC(window_size, sizeof(samdata), "cfront.wave.outgo");
+  wave->window_size = window_size;
+  wave->frame_size = frame_size;
+#if DEBUG
+  log_report("window %d frame %d\n", window_size, frame_size);
+#endif
+  return;
+}
+
+void free_sample_buffer(wave_info *wave)
+{
+  ASSERT(wave);
+  if (wave->income)
+    FREE((char *)wave->income);
+  if (wave->outgo)
+    FREE((char *)wave->outgo);
+  wave->income = NULL;
+  wave->outgo = NULL;
+  wave->window_size = 0;
+  wave->frame_size = 0;
+  return;
+}
+
+void reset_sig_check(wave_stats *ws)
+/*
+**  Resets the wave statistics
+*/
+{
+  int ii;
+
+  ASSERT(ws);
+
+  ws->sum  = 0;
+  ws->sum2 = 0;
+  ws->sumsqu = 0;
+  ws->sumsqu2 = 0;
+  ws->nsam = 0;
+  ws->highclip = 0;
+  ws->lowclip = 0;
+
+  for (ii = 0; ii < MAXHISTBITS; ii++)
+    ws->bithist[ii] = 0;
+}
+
+#define OVERFLOW_MASK 0x40000000
+
+void get_sig_check(wave_stats *ws, int *nsam, int *pclowclip, int *pchighclip,
+                   int *dc_offset, int *amp, int *pc5, int *pc95,
+                   int *overflow)
+/*
+**  Returns the wave statistics
+*/
+{
+  float mean;
+  int num;
+  int ntot;
+  int npc;
+  int ii;
+  float sqr_devn;
+
+  ASSERT(ws);
+
+  /* *nsam = ws->nsam / 100; */
+  *nsam = ws->nsam;
+
+  *overflow = 0;
+
+  if (ws->nsam == 0)
+  {
+    *pclowclip  = 0;
+    *pchighclip = 0;
+    *dc_offset  = 0;
+    *amp        = 0;
+    *pc5 = 0;
+    *pc95 = 0;
+    return;
+  }
+
+  if (ws->nsam > OVERFLOW_MASK) *overflow = 1;
+
+  *pclowclip  = (int)(((float)ws->lowclip  * 10000.0) / (float)ws->nsam);
+  *pchighclip = (int)(((float)ws->highclip * 10000.0) / (float)ws->nsam);
+
+  mean = ((float)ws->sum + (float)ws->sum2 * OVERFLOW_MASK) / ws->nsam;
+
+  *dc_offset = (int) mean;
+  sqr_devn = (((float)ws->sumsqu + (float)ws->sumsqu2 * OVERFLOW_MASK)
+              / (float)ws->nsam) - (mean * mean);
+  *amp = integer_square_root((int)sqr_devn);
+
+  /* now analyse the histogram */
+
+  num = 0;
+  for (ii = 0; ii < MAXHISTBITS; ii++)
+  {
+    num += ws->bithist[ii];
+  }
+
+  ntot = num;
+  npc = ntot / 20; /* 5% cutoff */
+
+  for (ii = num = 0; (ii < MAXHISTBITS) && (num < npc); ii++)
+  {
+    num += ws->bithist[ii];
+  }
+
+  *pc5 = ii;
+
+  npc = (int)(0.95 * ntot);  /* 95% cutoff */
+
+  for (ii = num = 0; (ii < MAXHISTBITS) && (num < npc); ii++)
+  {
+    num += ws->bithist[ii];
+  }
+
+  *pc95 = ii;
+  return;
+}
+
+void acc_wave_stats(wave_info* wave)
+/*
+**  Updates the wave statistics
+*/
+{
+  int ii;
+  int val;
+  samdata hclip;
+  samdata lclip;
+  wave_stats *ws;
+  int sumabs;
+  int num;
+
+  ASSERT(wave);
+
+  ws = &wave->stats;
+  hclip = ws->highclip_level;
+  lclip = ws->lowclip_level;
+
+  if (ws->nsam > OVERFLOW_MASK) return;
+  /* as soon as we have at least 1073741824 */
+  /* samples, stop accumulating.   */
+
+  sumabs = 0;
+  num = 0;
+
+  for (ii = 0; ii < wave->num_samples; ii++)
+  {
+    val = (int) wave->income[ii];
+    ws->sum += val;
+    ws->sumsqu += val * val;
+    if (ws->sumsqu > OVERFLOW_MASK)
+    {
+      ws->sumsqu -= OVERFLOW_MASK;
+      ws->sumsqu2++;
+    }
+    /* nasty bit here as ANSI C does not do >32bit */
+    /* Assumes that samples are no larger than */
+    /* signed shorts    */
+
+    ws->nsam++;
+
+    if (val >= hclip) ws->highclip++;
+    if (val <= lclip) ws->lowclip++;
+
+    sumabs += abs(val);
+    num++;
+  }
+
+  if (ws->sum >= OVERFLOW_MASK)
+  {
+    ws->sum -= OVERFLOW_MASK;
+    ws->sum2++;
+  }
+  else if (ws->sum < -OVERFLOW_MASK)
+  {
+    ws->sum += OVERFLOW_MASK;
+    ws->sum2--;
+  }
+  /* another >32bit workaround  */
+  /* assumes wave->num_samples < 32878 */
+  /* this is really overkill as we expect */
+  /* the mean to be around zero anyway */
+
+  if (num > 0) sumabs /= num;
+  ii = 0;
+  while (sumabs)
+  {
+    sumabs >>= 1;
+    ii++;
+  }
+
+  ASSERT(ii <= 16); /* unusual case i=16 if all samples -32678 */
+  ws->bithist[ii]++;
+  return;
+}
diff --git a/srec/clib/cnorm_tr.c b/srec/clib/cnorm_tr.c
new file mode 100644
index 0000000..4d1a693
--- /dev/null
+++ b/srec/clib/cnorm_tr.c
@@ -0,0 +1,192 @@
+/*---------------------------------------------------------------------------*
+ *  cnorm_tr.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <assert.h>
+
+#include "channorm.h"
+#include "prelib.h"
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+#include "portable.h"
+
+#define DEBUG   0
+
+#define ESTIMATE_PERIOD  -1
+#define BACK_ESTIMATE_PERIOD    1000
+#define ESTIMATE_PERCENTILE 50
+
+
+static const char cnorm_tr[] = "$Id: cnorm_tr.c,v 1.4.10.6 2007/10/15 18:06:24 dahan Exp $";
+
+norm_info *create_channel_normalization()
+{
+  norm_info *channorm;
+  
+  channorm = (norm_info *) CALLOC_CLR(1, sizeof(norm_info), "clib.channorm");
+  return (channorm);
+}
+
+void destroy_channel_normalization(norm_info *channorm)
+{
+  ASSERT(channorm);
+  FREE((char *)channorm);
+  return;
+}
+
+void apply_channel_normalization_in_imelda(norm_info *channorm,
+    imeldata *outframe, imeldata *frame,
+    int dimen)
+{
+  int ii;
+  
+  ASSERT(channorm);
+  ASSERT(frame);
+  ASSERT(outframe);
+  ASSERT(dimen <= channorm->dim);
+  for (ii = 0; ii < dimen; ii++)
+    outframe[ii] = MAKEBYTE(frame[ii] + channorm->imelda_adjust[ii]);
+  return;
+}
+
+void estimate_normalization_parameters(norm_info *channorm,
+                                       spect_dist_info **chandata, int dimen)
+{
+  int ii, adjust;
+  
+  ASSERT(channorm);
+  ASSERT(chandata);
+  ASSERT(dimen <= channorm->dim);
+  for (ii = 0; ii < dimen; ii++)
+    if (chandata[ii])
+    {
+      evaluate_parameters(chandata[ii]);
+      /*  The additive expression is due to
+      **  the normalization taking place before the
+      **  utterance object is created
+      */
+      adjust = mean_normalize_data(chandata[ii], 0);
+      /*     channorm->adjust[ii]= adjust; */
+#if USE_MEDIAN
+      shift_distribution_counts(chandata[ii], adjust);
+#endif
+      shift_parameters(chandata[ii], adjust);
+#if NORM_IN_IMELDA
+      channorm->imelda_adjust[ii] += adjust;
+#else
+      channorm->adjust[ii] += adjust;
+#endif
+    }
+#if NORM_IN_IMELDA
+  channorm->adj_valid = True;
+#if DEBUG
+  log_report("NORM IML: ");
+  for (ii = 0; ii < channorm->dim; ii++)
+    log_report("%d ", channorm->imelda_adjust[ii]);
+  log_report("\n");
+#endif
+#else
+  channorm->adj_valid = False;
+#if DEBUG
+  log_report("NORM ADJ: ");
+  for (ii = 0; ii < channorm->dim; ii++)
+    log_report("%d ", channorm->adjust[ii]);
+  log_report("\n");
+#endif
+#endif
+  return;
+}
+
+void setup_channel_normalization(norm_info *channorm,
+                                 spect_dist_info **chandata, int dimen,
+                                 int forget_factor)
+{
+  int ii;
+  
+  ASSERT(channorm);
+  ASSERT(chandata);
+  for (ii = 0; ii < dimen; ii++)
+  {
+#if MODEL_BASED || 1
+    chandata[ii] = create_spectrum_distribution(
+                     128, 128,
+                     0, 255, forget_factor, ESTIMATE_PERIOD,
+                     ESTIMATE_PERCENTILE, 10);
+#else
+    chandata[ii] = create_spectrum_distribution(
+                     channorm->chan_tgt[ii], channorm->chan_init[ii],
+                     0, 511, forget_factor, ESTIMATE_PERIOD,
+                     ESTIMATE_PERCENTILE, 10);
+#endif
+    channorm->adjust[ii] = channorm->target[ii]
+                           - channorm->init[ii];
+  }
+  channorm->adj_valid = False;
+  return;
+}
+
+void clear_channel_normalization(spect_dist_info **chandata, int dimen)
+{
+  int ii;
+  
+  ASSERT(chandata);
+  for (ii = 0; ii < dimen; ii++)
+    if (chandata[ii])
+    {
+      destroy_spectrum_distribution(chandata[ii]);
+      chandata[ii] = NULL;
+    }
+  return;
+}
+
+void setup_ambient_estimation(spect_dist_info **backchan, int dimen,
+                              int forget_factor)
+{
+  int ii;
+  
+  ASSERT(backchan);
+  for (ii = 0; ii < dimen; ii++)
+    backchan[ii] = create_spectrum_distribution(
+                     0, 0, 0, 255, forget_factor, BACK_ESTIMATE_PERIOD,
+                     ESTIMATE_PERCENTILE, 10);
+  return;
+}
+
+void clear_ambient_estimation(spect_dist_info **backchan, int dimen)
+{
+  int ii;
+  
+  ASSERT(backchan);
+  
+  for (ii = 0; ii < dimen; ii++)
+    if (backchan[ii])
+    {
+      destroy_spectrum_distribution(backchan[ii]);
+      backchan[ii] = NULL;
+    }
+  return;
+}
+
diff --git a/srec/clib/fpi_tgt.c b/srec/clib/fpi_tgt.c
new file mode 100644
index 0000000..1f0b5fa
--- /dev/null
+++ b/srec/clib/fpi_tgt.c
@@ -0,0 +1,897 @@
+/*---------------------------------------------------------------------------*
+ *  fpi_tgt.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <assert.h>
+
+#include "all_defs.h"
+#include "fpi_tgt.h"
+#include "voicing.h"
+#include "portable.h"
+
+#include "fpi_tgt.inl"
+
+#define DEBUG_REWIND 0
+
+/************************************************************************
+ * Create a Frame Buffer                                                *
+ ************************************************************************
+ *
+ * On the Real Time Target (_RTT) the caller of this function is
+ * responsible for publically declaring the location of the Frame Buffer
+ * so that the REC unit can locate it.  This is achived by use of the
+ * 'setPublicLocation()' and 'publicLocation()' functions.
+ *
+ ************************************************************************
+ *
+ * Arguments: "fCnt"       Size of Frame Stack
+ *            "dimen"      Size of Frame
+ *            "blockLen"   Blocking length (if Using)
+ *            "doVoice"    Reserve voicing parameter
+ *
+ * Returns:   fepFramePkt* Pointer to frame buffer
+ *                          NULL on error
+ *
+ ************************************************************************/
+
+static int  incThisFramePtr(fepFramePkt* frmPkt, featdata** parPtr);
+static int  decThisFramePtr(fepFramePkt* frmPkt, featdata** parPtr);
+
+
+
+fepFramePkt* createFrameBuffer(int fCnt, int dimen, int blockLen, int doVoice)
+{
+  fepFramePkt* frmPkt;
+#if QUICK
+  unsigned long frame_mask = 1, tmpsiz;
+#endif
+
+  ASSERT(fCnt > 0);
+  ASSERT(dimen > 0);
+
+  /* Allocate space for the Frame Packet  *
+   * and then accommodate the Frame Stack */
+
+  frmPkt = (fepFramePkt*) CALLOC_CLR(1, sizeof(fepFramePkt), "clib.Frame_Buffer");
+  if (frmPkt == NULL)
+    return NULL;
+
+#if QUICK
+  tmpsiz = blockLen;
+  frame_mask = 1;
+  tmpsiz >>= 1;
+  while (tmpsiz)
+  {
+    frame_mask = (frame_mask << 1) | 0x01;
+    tmpsiz >>= 1;
+  }
+  blockLen = frame_mask + 1;
+  frmPkt->stackMask = frame_mask;
+#endif
+
+  frmPkt->uttDim = dimen;
+  if (doVoice) dimen++;
+
+  frmPkt->frameStackSize  = fCnt;
+  frmPkt->frameSize       = dimen;
+  frmPkt->featuresInStack = fCnt * dimen;
+  frmPkt->blockLen = blockLen;
+  if (doVoice) frmPkt->haveVoiced = True;
+  else frmPkt->haveVoiced = False;
+
+  frmPkt->frameStack = (featdata *) CALLOC(fCnt,
+                       sizeof(featdata) * dimen, "clib.Frame_Stack");
+  if (frmPkt == NULL)
+    return NULL;
+  frmPkt->lastFrameInStack = frmPkt->frameStack + (fCnt - 1) * dimen;
+
+  /* Use standard function to clear the buffer,    *
+   * we don't care about the return code because   *
+   * we built it, others should care...            */
+
+  (void) clearFrameBuffer(frmPkt);
+
+  frmPkt->uttTimeout = 20;             /* default setting */
+
+  return frmPkt;
+}
+
+
+/************************************************************************
+ * Clear an existing Frame Buffer                                       *
+ ************************************************************************
+ *
+ * Given a pointer to a previously created frame buffer structure
+ * this funtion will reset its member components to their initial
+ * values.
+ *
+ ************************************************************************
+ *
+ * Arguments: "frmPkt"     Frame Buffer Structure Pointer
+ *
+ * Returns:   int          non-ZERO on Error
+ *
+ ************************************************************************/
+
+int clearFrameBuffer(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt != NULL);
+
+  /* Clear the frame stack to ZERO as  *
+   * this is done by model_allocate()  */
+
+  memset(frmPkt->frameStack, 0,  /*  TODO: do we need this? */
+         sizeof(featdata) * frmPkt->frameSize * frmPkt->frameStackSize);
+
+  /* Reset Structure Members           */
+
+  frmPkt->isCollecting = FB_IDLE;
+  frmPkt->pullp       = frmPkt->frameStack;
+
+  frmPkt->pushp       = frmPkt->frameStack;
+  frmPkt->pushBlkp    = frmPkt->frameStack;
+  frmPkt->pushBlocked = False;
+  frmPkt->blockTime   = 0;
+  frmPkt->pushTime    = 1;    /* 0 == invalid frame ID, 1 == first    */
+  frmPkt->pullTime    = 1;
+  frmPkt->startTime   = 0;    /* 0 == start hasn't been called        */
+  frmPkt->stopTime    = 0;    /* 0 == stop  hasn't been called        */
+
+  clearEndOfUtterance(frmPkt);
+  clearC0Entries(frmPkt);
+
+  return False;
+}
+
+/************************************************************************
+ * Destroy a Previously Created Frame Buffer                            *
+ ************************************************************************
+ *
+ * On the Real Time Target (_RTT) the caller of this function is
+ * responsible for publically declaring the location of the Frame Buffer
+ * so that the REC unit can locate it.  This is achived by use of the
+ * 'setPublicLocation()' and 'publicLocation()' functions.
+ *
+ ************************************************************************
+ *
+ * Arguments: fepFramePkt* Pointer to frame buffer to destroy
+ *
+ * Returns:   int          non-ZERO on error
+ *
+ ************************************************************************/
+
+int destroyFrameBuffer(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  /* De-allocate space for the Frame Stack *
+   * and then the Frame Packet             */
+
+  FREE(frmPkt->frameStack);
+  FREE(frmPkt);
+  return False;
+}
+
+/************************************************************************
+ * To Start Collecting Frames                                           *
+ ***********************************************************************/
+
+void startFrameCollection(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  if (frmPkt->isCollecting == FB_IDLE)
+  {
+    clearEndOfUtterance(frmPkt);
+    clearC0Entries(frmPkt);
+
+    frmPkt->startTime = frmPkt->pushTime;
+    frmPkt->stopTime = 0;
+    frmPkt->isCollecting = FB_ACTIVE;
+  }
+  return;
+}
+
+/************************************************************************
+ * To Stop Collecting Frames                                            *
+ ***********************************************************************/
+
+int stopFrameCollection(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  ASSERT(frmPkt->startTime != 0);
+
+  if (frmPkt->isCollecting == FB_ACTIVE)
+  {
+
+    /* Remember, pushTime is the ID of the next frame to arrive
+     * The buffer starts empty, with pushTime == 1.
+     * So if Stop occurs at this point, then the start and end frames
+     * will be
+     */
+
+    frmPkt->stopTime = frmPkt->pushTime;
+    frmPkt->isCollecting = FB_IDLE;
+
+    return (True);
+  }
+
+  return (False);
+}
+
+/************************************************************************
+ ***********************************************************************/
+
+void setupEndOfUtterance(fepFramePkt* frmPkt, long timeout, long holdOff)
+{
+  ASSERT(frmPkt);
+  ASSERT(timeout >= 0);
+  ASSERT(holdOff >= 0);
+  frmPkt->uttTimeout = timeout;
+  frmPkt->holdOffPeriod = holdOff;
+  frmPkt->holdOff = 0;
+  return;
+}
+
+/************************************************************************
+ ***********************************************************************/
+
+void clearEndOfUtterance(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  ASSERT(frmPkt->holdOffPeriod >= 0);
+  frmPkt->voicingDetected = 0;
+  frmPkt->quietFrames = 0;
+  frmPkt->utt_ended = False;
+  frmPkt->holdOff = frmPkt->holdOffPeriod;
+
+  return;
+}
+
+void releaseBlockedFramesInBuffer(fepFramePkt* frmPkt)
+{
+  frmPkt->pullp = frmPkt->pushp;     /*  Move the Blocker to pullp */
+  frmPkt->pushBlkp = frmPkt->pushp;     /*  Move the Blocker to pullp */
+  frmPkt->pullTime = frmPkt->pushTime;
+  frmPkt->blockTime = frmPkt->pushTime;
+
+  return;
+}
+
+/************************************************************************
+ * Push a Single Frame into Frame Buffer                                *
+ ************************************************************************
+ *
+ * Inserts a new frame into the frame buffer.
+ *
+ * If there is no room in the buffer (the frame maker has exhausted the
+ * space which is being slowly 'eaten' by the associated recognizer) then
+ * the data is not inserted and an error value is returned.  For this to
+ * happen, blockLen member must be set.  Otherwise pushBlkp will always
+ * point to the oldest valid frame in the buffer.
+ *
+ ************************************************************************
+ *
+ * Arguments: "frmPkt"  Frame Buffer Pointer
+ *            "parPtr"  Pointer to contiguous block of Frame Parameters
+ *
+ * Returns:   int       non-ZERO on ERROR
+ *
+ ************************************************************************/
+
+int pushSingleFEPframe(fepFramePkt* frmPkt, featdata* parPtr, int voiceData)
+{
+  featdata*   destFrmPtr;
+  featdata*   nextFrmPtr;
+
+  ASSERT(frmPkt);
+  ASSERT(parPtr);
+
+  /* 'pushp' must be either within the frame buffer or NULL. *
+   * If it is NULL then the frame is just discarded.         */
+
+  if (frmPkt->isCollecting != FB_ACTIVE) return True;
+  if ((destFrmPtr = nextFrmPtr = (featdata*) frmPkt->pushp) == NULL)
+    return (0);
+
+#if DEBUG_REWIND
+  log_report("U: voicing at %d was %x\n", frmPkt->pushTime, voiceData);
+#endif
+
+  /* Copy the frame into the buffer.  Once this is done     *
+   * advance 'pushp' (unless it is up against the 'blocker' *
+   * The frame consists of Parameters and Signal Data       */
+
+  memcpy(destFrmPtr, parPtr, frmPkt->uttDim * sizeof(featdata));
+  if (frmPkt->haveVoiced)
+    destFrmPtr[frmPkt->uttDim] = voiceData;
+
+  /* The following (vocing detection which triggers EOU),
+   * is only active when the 'holdOff' member is 0.
+   * The intension is to delay 'voicing' signal for at least
+  * 'holdOffPeriod' frames.
+   */
+  if (frmPkt->holdOff <= 0)
+  {
+    if (frmPkt->haveVoiced && frmPkt->utt_ended == False)
+    {
+      if (voiceData & VOICE_BIT)
+      {
+        frmPkt->voicingDetected = 1;
+      }
+      if (voiceData & QUIET_BIT)
+      {
+        frmPkt->quietFrames++;
+        if (frmPkt->voicingDetected
+            && frmPkt->quietFrames > frmPkt->uttTimeout)
+        {
+          log_report("Level based utterance ended at %d\n",
+                     frmPkt->pushTime);
+          frmPkt->utt_ended = True;
+        }
+      }
+      else
+        frmPkt->quietFrames = 0;
+    }
+  }
+  else
+  {
+    ASSERT(frmPkt->holdOff > 0);
+    frmPkt->holdOff--;
+  }
+
+  /*  Track C0 values
+  */
+  if (frmPkt->maxC0 < parPtr[0])      /* only works if the 0th entry - */
+    frmPkt->maxC0 = parPtr[0];       /* is C0 */
+
+  if (frmPkt->minC0 > parPtr[0])      /* only works if the 0th entry - */
+    frmPkt->minC0 = parPtr[0];       /* is C0 */
+
+  frmPkt->pushTime++;
+  if (frmPkt->pushTime == 0L)          /* Check for wrap - and ensure */
+    frmPkt->pushTime++;              /* ZERO is NEVER used          */
+
+  /* Try to move the push pointer on, if it meets the *
+   * push blocker it should not increment.            */
+
+  nextFrmPtr = (featdata *) NEXT_FRAME_POINTER(frmPkt, frmPkt->pushp);
+
+  if (nextFrmPtr == frmPkt->pullp)
+  {
+    /* Latest Frame was blocked, so record the fact and then *
+    * record the frame time that this occured (useful?)     */
+
+    frmPkt->pushBlocked++;
+    frmPkt->blockTime = frmPkt->pushTime;
+
+    return True;
+  }
+
+  else if (nextFrmPtr == frmPkt->pushBlkp)
+  {
+    if (frmPkt->blockLen == 0)
+    {
+      /* Simply move pushBlkp along */
+
+      frmPkt->pushBlkp = NEXT_FRAME_POINTER(frmPkt, frmPkt->pushBlkp);
+    }
+    else
+    {
+      /* Latest Frame was blocked, so record the fact and then *
+       * record the frame time that this occured (useful?)     */
+
+      frmPkt->pushBlocked++;
+      frmPkt->blockTime = frmPkt->pushTime;
+
+      return True;
+    }
+  }
+
+  /* Free to move ahead, so increment the push pointer     *
+   * and increase the frame-count between pull & push      */
+
+  frmPkt->pushp = nextFrmPtr;
+  /*      Increment semaphore count for each frame pushed.
+   Decrement is in waitforsinglefepframe */
+  return False;
+}
+
+/************************************************************************
+ * Sets oldest frame pointer (Use with caution)                         *
+ ************************************************************************
+ *
+ * NOTES
+ *
+ * If 'masterREC', 'pullp' is manipulated, otherwise one of the
+ * multiple recognition pointers, 'auxPullp[]' is used.
+ *
+ ************************************************************************
+ *
+ * CAUTION
+ *
+ * With multiple recognizers, the gap-test doesn't work !!!
+ *
+ ************************************************************************
+ *
+ * Arguments: "frmPkt"     Pointer to Frame Packet
+ *            "fCnt"       Frame offset from Newest Frame
+ *                              +ve == Increase Distance between oldest & newest
+ *                              -ve == Decrease Distance
+ *            "mode"           ZERO means movement wrt Newest Frame
+ *                         non-ZERO means movement wrt Current Oldest Frame
+ *
+ * Retunrs:   int          Status of operation
+ *                          No Problems: False
+ *                          No FEP     : DUKRC_NOFEP
+ *
+ * Critical section code!
+ *
+ ************************************************************************/
+
+int setRECframePtr(fepFramePkt* frmPkt, int fCnt, int mode)
+{
+  int   gap;
+
+  ASSERT(frmPkt);
+
+  if (mode != 0) /* wrt Current Oldest Frame */
+  {
+    /************
+    * Relative *
+    ************/
+
+    /* Can it go backwards? */
+
+    gap = POINTER_GAP(frmPkt, frmPkt->pullp, frmPkt->pushBlkp);
+    if (fCnt > gap)                         /* Limit movement      */
+      fCnt = gap;
+
+    /* Can it go forwards? */
+
+    gap = POINTER_GAP(frmPkt, frmPkt->pushp, frmPkt->pullp);
+    if (fCnt < -gap)                         /* Limit movement      */
+      fCnt = -gap;
+
+    frmPkt->pullp = FIX_FRAME_POINTER(frmPkt,
+                                      frmPkt->pullp - fCnt * frmPkt->frameSize);
+    frmPkt->pullTime -= fCnt;
+
+  }
+  else  /* wrt Newest Frame */
+  {
+    /************
+    * Absolute *
+    ************/
+
+    /* ASSERT(fCnt); moved from the above block, do we need this? */
+    ASSERT(frmPkt->isCollecting != FB_DEAD);
+
+    gap = POINTER_GAP(frmPkt, frmPkt->pushp, frmPkt->pushBlkp);
+
+    if (fCnt > gap)                         /* Limit movement      */
+      fCnt = gap;
+
+    frmPkt->pullp = FIX_FRAME_POINTER(frmPkt,
+                                      frmPkt->pushp - fCnt * frmPkt->frameSize);
+    frmPkt->pullTime = frmPkt->pushTime - fCnt;
+
+  }
+
+  return (fCnt);              
+  ;
+}
+
+/************************************************************************
+ * Returns Pointer to Oldest unread REC frame                           *
+ ************************************************************************
+ *
+ * Arguments: "frmPkt"  Frame Buffer Pointer
+ *
+ * Retunrs:   featdata*   Pointer to newest frame
+ *                          NULL on Error
+ *
+ ************************************************************************/
+
+featdata* currentRECframePtr(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  if (frmPkt->pushp == frmPkt->pushBlkp)            /* uninitialized? */
+    return NULL;
+  return ((featdata *)frmPkt->pullp);
+}
+
+/************************************************************************
+ * Returns Pointer to Newest Complete frame of given channel            *
+ ************************************************************************
+ *
+ * Arguments: "frmPkt"  Frame Buffer Pointer
+ *
+ * Retunrs:   featdata*   Pointer to newest frame
+ *                          NULL on Error.
+ *
+ ************************************************************************/
+
+featdata* currentFEPframePtr(fepFramePkt* frmPkt)
+{
+  featdata* frmPtr;
+
+  ASSERT(frmPkt);
+  frmPtr = frmPkt->pushp;  /* Where is FEP?    */
+  if (frmPtr == NULL)
+    return NULL;
+  (void) decThisFramePtr(frmPkt, &frmPtr);/* Move backwards   */
+  return frmPtr;
+}
+
+/************************************************************************
+ * Moves REC's Frame Pointer backwards one Frame (if it can)            *
+ ************************************************************************
+ *
+ * NOTES
+ *
+ * If 'masterREC', 'pullp' is manipulated, otherwise one of the
+ * multiple recognition pointers, 'auxPullp[]' is used. (not sure about this)
+ * The pushBlkp is also moved accordingly.
+ *
+ ************************************************************************
+ *
+ * Arguments: "n"      Channel Number of Selected Frame
+ *
+ * Retunrs:   int      Non-zero on error
+ *
+ ************************************************************************/
+
+int incRECframePtr(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+
+  /* Ensure that the frame buffer for *
+   * the channel specified exists     */
+
+  if (frmPkt->pullp == frmPkt->pushp)
+    return True;
+
+
+  frmPkt->pullp = NEXT_FRAME_POINTER(frmPkt, frmPkt->pullp);
+
+  frmPkt->pullTime++;
+  if (frmPkt->pullTime == 0)  /* Check for wrap and ensure */
+    frmPkt->pullTime++;     /* that it is never ZERO     */
+
+  /* New 'pushBlkp' */
+  if (frmPkt->blockLen > 0 && frmPkt->isCollecting == FB_ACTIVE)
+  {
+    if (POINTER_GAP(frmPkt, frmPkt->pullp, frmPkt->pushBlkp) >= frmPkt->blockLen)
+    {
+      frmPkt->pushBlkp = NEXT_FRAME_POINTER(frmPkt, frmPkt->pushBlkp);
+    }
+  }
+
+  return False;
+}
+
+/************************************************************************
+ * Moves REC's Frame Pointer backwards one Frame (if it can)            *
+ ************************************************************************
+ *
+ * NOTES
+ *
+ * If 'masterREC', 'pullp' is manipulated, otherwise one of the
+ * multiple recognition pointers, 'auxPullp[]' is used. (not sure about this)
+ * The pushBlkp is also moved accordingly.
+ *
+ ************************************************************************
+ *
+ * Arguments: "n"      Channel Number of Selected Frame
+ *
+ * Retunrs:   int      Non-zero on error
+ *
+ ************************************************************************/
+
+int decRECframePtr(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+
+  /* Ensure that the frame buffer for *
+   * the channel specified exists     */
+
+  /* New 'pullp' */
+
+  if (frmPkt->pullp == frmPkt->pushBlkp) return True;
+  frmPkt->pullp = PREV_FRAME_POINTER(frmPkt, frmPkt->pullp);
+  frmPkt->pullTime--;
+  return False;
+}
+
+/************************************************************************
+ * Moves a Frame Pointer forwards one Frame (if it can)                 *
+ ************************************************************************
+ *
+ * Arguments: "n"      Channel Number of Selected Frame
+ *            "parPtr" Current Frame Pointer
+ *
+ * Retunrs:   int      Non-zero on error
+ *                     "parPtr" and "sigPtr" may have changed
+ *
+ * Caution:            Does not test to see whether 'parPtr' lies
+ *                     legally within the appropriate buffer or on an
+ *                     appropriate valid frame boundary
+ *
+ *                     The caller should NEVER modify frame buffer
+ *                     pointers by hand, always call an RTT-supplied function
+ *
+ ************************************************************************/
+
+static int incThisFramePtr(fepFramePkt* frmPkt, featdata** parPtr)
+{
+  ASSERT(frmPkt);
+  ASSERT(parPtr);
+  if (*parPtr == frmPkt->pushp)
+    return True;
+  *parPtr = NEXT_FRAME_POINTER(frmPkt, *parPtr);
+  return False;
+}
+
+/************************************************************************
+ * Moves a Frame Pointer backwards one Frame (if it can)                *
+ ************************************************************************
+ *
+ * Arguments: "frmPkt" Frame Buffer Pointer
+ *            "parPtr" Current Frame Pointer
+ *            "sigPtr" Signal Pointer
+ *                          Set to NULL if not required
+ *
+ * Retunrs:   int      Non-zero on error
+ *                     "parPtr" may have changed
+ *
+ * Caution:            Checks for bound within pushBlkp.
+ *                     The caller should NEVER modify frame buffer
+ *                     pointers by hand, always call an RTT-supplied function
+ *
+ ************************************************************************/
+
+static int decThisFramePtr(fepFramePkt* frmPkt, featdata** parPtr)
+{
+  ASSERT(frmPkt);
+  ASSERT(parPtr);
+  if (*parPtr == frmPkt->pushBlkp)
+    return True;
+  *parPtr = PREV_FRAME_POINTER(frmPkt, *parPtr);
+  return False;
+}
+
+/************************************************************************
+ ************************************************************************/
+
+featdata getVoicingCode(fepFramePkt* frmPkt, featdata *frmptr)
+{
+  ASSERT(frmPkt);
+  frmptr = CHECK_BOUND(frmPkt, frmptr);
+  if (frmptr && frmPkt->haveVoiced)
+    return (frmptr[frmPkt->uttDim]);
+  else
+    return (0);
+}
+
+/************************************************************************
+ ************************************************************************/
+
+void setVoicingCode(fepFramePkt* frmPkt, featdata *frmptr, featdata vcode)
+{
+  ASSERT(frmPkt);
+  frmptr = CHECK_BOUND(frmPkt, frmptr);
+  if (frmptr && frmPkt->haveVoiced)
+    frmptr[frmPkt->uttDim] =
+      SET_VOICING_CODES(frmptr[frmPkt->uttDim], vcode);
+  return;
+}
+
+/************************************************************************
+ ************************************************************************/
+
+void clearC0Entries(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  frmPkt->maxC0 = 0;           /*  Assuming a normal range of 0 - 255 */
+  frmPkt->minC0 = 255;
+  return;
+}
+
+int get_background_statistics(fepFramePkt *frmPkt, int start, int end,
+                              spect_dist_info **spec, int num,
+                              int relative_to_pullp)
+{
+  int len, /* count= 0, */ num_frames = 0;
+  int ii, jj, got;
+  featdata  *frame_ptr;
+#ifndef NDEBUG
+  featdata  *base_ptr = NULL;
+#endif
+
+  ASSERT(frmPkt);
+  ASSERT(spec);
+  if (!frmPkt->haveVoiced) return(0);
+  if (start == end || (start == 0 && !relative_to_pullp))
+    return (0);
+
+  /*  Cannot access the frames
+  */
+  if (relative_to_pullp && getBlockGap(frmPkt) < start)
+    return (0);
+
+  ASSERT(base_ptr = frmPkt->pullp);
+  got = setRECframePtr(frmPkt, end, relative_to_pullp);
+  if (got != end)
+  {
+    (void) setRECframePtr(frmPkt, -got, relative_to_pullp);
+    ASSERT(base_ptr == currentRECframePtr(frmPkt));
+    return (0);
+  }
+  len = start - end;
+
+  for (ii = 0; ii < len; ii++)
+  {
+    decRECframePtr(frmPkt);
+    frame_ptr   = currentRECframePtr(frmPkt);
+#if DEBUG
+    log_report("%d %d %x\n", frame_ptr[0],
+               frame_ptr[frmPkt->uttDim], frame_ptr);
+#endif
+    if ((frame_ptr[frmPkt->uttDim] & BELOW_THRESHOLD_BIT))
+    {
+      num_frames++;
+      for (jj = 0; jj < num; jj++)
+      {
+        ASSERT(spec[jj]);
+        add_distribution_data(spec[jj], (int) frame_ptr[jj]);
+      }
+    }
+  }
+#if DEBUG
+  log_report("End of chunk\n");
+#endif
+
+  /* Put it back in the same place !
+  */
+  if (start != 0)
+    (void) setRECframePtr(frmPkt, -start, relative_to_pullp);
+  ASSERT(base_ptr == currentRECframePtr(frmPkt));
+  return (num_frames);
+}
+
+void utterance_detection_fixup(fepFramePkt *frmPkt, featdata **last_pushp,
+                               int voice_duration, int quite_duration, int unsure_duration)
+{
+  featdata  *fram;
+  long   gotstat, count, voistat;
+  featdata  *fepFrmPtr, *recFrmPtr, *last_push, voice_result;
+
+  /* Adjust for delay in decision making by voicing_analysis
+  */
+  ASSERT(frmPkt);
+  ASSERT(last_pushp);
+  fepFrmPtr = currentFEPframePtr(frmPkt);
+  last_push = *last_pushp;
+  if (last_push == fepFrmPtr)
+    return;
+
+  recFrmPtr = currentRECframePtr(frmPkt);
+  if (last_push == NULL)
+  {
+    last_push = recFrmPtr;
+    voistat = FAST_MATCH_DATA(getVoicingCode(frmPkt, last_push));
+  }
+  else if (decThisFramePtr(frmPkt, &last_push) == False)
+  {
+    voistat = FAST_MATCH_DATA(getVoicingCode(frmPkt, last_push));
+    (void) incThisFramePtr(frmPkt, &last_push);
+  }
+  else
+    voistat = FAST_MATCH_DATA(getVoicingCode(frmPkt, last_push));
+
+  while (last_push != fepFrmPtr)
+  {
+
+    gotstat = FAST_MATCH_DATA(getVoicingCode(frmPkt, last_push));
+    if (gotstat != voistat)
+    {
+      /*  Voicing status has changed
+      */
+      fram = last_push;
+      voice_result = getVoicingCode(frmPkt, fram);
+      if (FAST_BIT_SET(voice_result))
+      {
+        for (count = voice_duration; count > 0 && fram != recFrmPtr;
+             count--)
+        {
+          if (decThisFramePtr(frmPkt, &fram) != False)
+            break;
+#if DEBUG_REWIND
+          log_report("U: voice rewind at %d was %x\n", frmPkt->pullTime
+                     + POINTER_GAP(frmPkt, fram, recFrmPtr),
+                     getVoicingCode(frmPkt, fram));
+#endif
+          setVoicingCode(frmPkt, fram, REC_VOICE_BIT);
+        }
+
+        /* set to unsure for start period of voicing
+        */
+        for (count = 0; count < unsure_duration && fram != recFrmPtr;
+             count++)
+        {
+          if (decThisFramePtr(frmPkt, &fram) != False)
+            break;
+#if DEBUG_REWIND
+          log_report("U: unsure rewind at %d was %x\n", frmPkt->pullTime
+                     + POINTER_GAP(frmPkt, fram, recFrmPtr),
+                     getVoicingCode(frmPkt, fram));
+#endif
+          setVoicingCode(frmPkt, fram, REC_UNSURE_BIT);
+        }
+      }
+
+      else if (QUIET_BIT_SET(voice_result))
+      {
+        for (count = quite_duration; count > 0 && fram != recFrmPtr;
+             count--)
+        {
+          if (decThisFramePtr(frmPkt, &fram) != False)
+            break;
+#if DEBUG_REWIND
+          log_report("U: quiet rewind at %d was %x\n", frmPkt->pullTime
+                     + POINTER_GAP(frmPkt, fram, recFrmPtr),
+                     getVoicingCode(frmPkt, fram));
+#endif
+          setVoicingCode(frmPkt, fram, REC_QUIET_BIT);
+        }
+      }
+
+      voistat = gotstat;
+    }
+
+    /* copy to recognizer bits if status not changed */
+#if DEBUG_REWIND
+    log_report("U: copying at %d was %x\n", frmPkt->pullTime
+               + POINTER_GAP(frmPkt, last_push, recFrmPtr),
+               getVoicingCode(frmPkt, last_push));
+#endif
+    if (QUIET_BIT_SET(getVoicingCode(frmPkt, last_push)))
+      setVoicingCode(frmPkt, last_push, REC_QUIET_BIT);
+    else if (FAST_BIT_SET(getVoicingCode(frmPkt, last_push)))
+      setVoicingCode(frmPkt, last_push, REC_VOICE_BIT);
+    else
+      setVoicingCode(frmPkt, last_push, REC_UNSURE_BIT);
+
+    if (incThisFramePtr(frmPkt, &last_push) != False) break;
+  }
+
+  *last_pushp = last_push;
+  return;
+}
+
+int rec_frame_voicing_status(fepFramePkt *frmPkt)
+{
+  ASSERT(frmPkt);
+  return (getVoicingCode(frmPkt, (featdata *)frmPkt->pullp));
+}
diff --git a/srec/clib/fpi_tgt.inl b/srec/clib/fpi_tgt.inl
new file mode 100644
index 0000000..000a6ca
--- /dev/null
+++ b/srec/clib/fpi_tgt.inl
@@ -0,0 +1,132 @@
+/*---------------------------------------------------------------------------*
+ *  fpi_tgt.inl  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _fpi_tgt_inl_
+#define _fpi_tgt_inl_
+
+#include "fpi_tgt.h"
+#include "PortExport.h"
+
+static PINLINE int isFrameBufferActive(fepFramePkt* frmPkt);
+static PINLINE void setFrameBufferDead(fepFramePkt* frmPkt);
+static PINLINE int getFrameGap(fepFramePkt* frmPkt);
+static PINLINE int getBlockGap(fepFramePkt* frmPkt);
+
+
+static PINLINE int isFrameBufferActive(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  if (frmPkt->isCollecting == FB_ACTIVE)
+    return (True);
+  else
+    return (False);
+}
+
+static PINLINE void setFrameBufferDead(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  frmPkt->isCollecting = FB_DEAD;
+  return;
+}
+
+/************************************************************************
+ * Returns number of unread frames in buffer (Those not seen by REC)    *
+ ************************************************************************
+ *
+ *                 "FRAMES_IN_BUF"
+ *   <------------------------------------------>
+ *
+ *                            "pushp"
+ *                               |
+ *                               v
+ *  +--------------------------------------------+
+ *  |          |x|              |x|              |  <= Frame Buffer for
+ *  +--------------------------------------------+      Channel 'n'
+ *              |
+ *              v
+ *            "pullp"
+ *
+ *              <--------------->
+ *                 'frameGap()'
+ *
+ *               Scenario A:    If: FRAME_IN_BUFFER == 1000
+ *                                  pullp == frame 70
+ *                                  pushp == frame 900   Gap == 830
+ *
+ *               Scenario B:    If: FRAME_IN_BUFFER == 1000
+ *                                  pullp == frame 720
+ *                                  pushp == frame 600   Gap == 880
+ *
+ * HOW FAR CAN WE MOVE ? (for 'moveFramePtr()' function)
+ * ===================
+ *
+ * In Scenario A
+ *
+ *      Forward  = +830
+ *      Backward = -168
+ *
+ *      We can only move forward "830" frames from our
+ *          current 'pullp' position, as frame 899 is the newest
+ *          COMPLETE frame.
+ *      We can only move backwards safely
+ *          to frame number 902 (as 'pushp' may have changed during our
+ *          deliberation), i.e. "(830 - FRAMES_IN_BUF + FRAME_BACK_GUARD)"
+ *
+ * In Scenario B
+ *
+ *      Forward  = +880
+ *      Backward = -118
+ *
+ *      We can only move forward "880" frames from our
+ *      current 'pullp' position.  We can only move backwards safely
+ *      to frame number 602 (as 'pushp' may have changed during our
+ *      deliberation), i.e. "(880 - FRAMES_IN_BUF + FRAME_BACK_GUARD)"
+ *
+ ************************************************************************
+ *
+ * NOTES
+ *
+ * If 'masterREC', 'pullp' is manipulated, otherwise one of the
+ * multiple recognition pointers, 'auxPullp[]' is used.
+ *
+ ************************************************************************
+ *
+ * Arguments: "n"      Channel Number of Selected Frame
+ *
+ * Retunrs:   int      +ve (or ZERO) = Gap Between FEP and REC frame pointers
+ *                     -ve           = Error
+ *
+ ************************************************************************/
+
+static PINLINE int getFrameGap(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  return (POINTER_GAP(frmPkt, frmPkt->pushp, frmPkt->pullp));
+}
+
+/************************************************************************
+ ************************************************************************/
+
+static PINLINE int getBlockGap(fepFramePkt* frmPkt)
+{
+  ASSERT(frmPkt);
+  return (POINTER_GAP(frmPkt, frmPkt->pullp, frmPkt->pushBlkp));
+}
+
+#endif
diff --git a/srec/clib/imeld_rd.c b/srec/clib/imeld_rd.c
new file mode 100644
index 0000000..667f174
--- /dev/null
+++ b/srec/clib/imeld_rd.c
@@ -0,0 +1,187 @@
+/*---------------------------------------------------------------------------*
+ *  imeld_rd.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#ifdef unix
+#include <limits.h>
+#endif
+#include <assert.h>
+
+#include "prelib.h"
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+
+#include "pendian.h"
+#include "portable.h"
+
+static const char imeld_rd[] = "$Id: imeld_rd.c,v 1.5.6.7 2007/10/15 18:06:24 dahan Exp $";
+
+/* function prototypes */
+
+imeldata **create_fixed_matrix(int dimen);
+covdata **create_matrix(int dimen);
+void delete_matrix(covdata **matrix, int dimen);
+void delete_fixed_matrix(imeldata **matrix, int dimen);
+int scale_matrix_for_fixedpoint(imeldata **fixmat, covdata **matrix,int dimen);
+int     invert_matrix(covdata **mat, covdata **inv, int dim);
+
+
+void create_linear_transform(preprocessed *prep, int matdim,
+                             int with_offset)
+{
+  ASSERT(prep);
+  ASSERT(matdim > 0);
+  prep->dim = matdim;
+  prep->matrix = create_fixed_matrix(matdim);
+  if (with_offset)
+    prep->offset = (imeldata *) CALLOC(matdim,
+                   sizeof(imeldata), "clib.offset");
+  prep->imelda = create_matrix(matdim);
+  prep->invmat = create_fixed_matrix(matdim);
+  prep->inverse = create_matrix(matdim);
+  return;
+}
+
+void free_linear_transform(preprocessed *prep)
+{
+  ASSERT(prep);
+  ASSERT(prep->matrix);
+  delete_fixed_matrix(prep->matrix, prep->dim);
+  if (prep->offset)
+    FREE(prep->offset);
+  prep->matrix = NULL;
+  prep->offset = NULL;
+  ASSERT(prep->imelda);
+  delete_matrix(prep->imelda, prep->dim);
+  prep->imelda = NULL;
+  ASSERT(prep->invmat);
+  ASSERT(prep->inverse);
+  delete_fixed_matrix(prep->invmat, prep->dim);
+  delete_matrix(prep->inverse, prep->dim);
+  prep->invmat = NULL;
+  prep->inverse = NULL;
+  return;
+}
+
+#ifndef _RTT
+int init_newton_transform(preprocessed *prep, float reqscale,
+                          char *filename, int dimen)
+/*
+*/
+{
+  int  ii, jj;
+  unsigned short matdim;
+  double scale, onerow[MAX_DIMEN];
+  PFile* dfpt;
+  long foffset;
+  double xfp;
+  /* Open file
+  */
+  ASSERT(prep);
+  ASSERT(filename);
+  dfpt = file_must_open(NULL, filename, ("rb"), ESR_TRUE);
+  prep->post_proc |= LIN_TRAN;
+  prep->use_dim = dimen;
+  pfread(&matdim, sizeof(short), 1, dfpt);
+  if (matdim > MAX_DIMEN)
+    SERVICE_ERROR(BAD_IMELDA);
+
+  create_linear_transform(prep, matdim, 1);
+  pfread(&scale, sizeof(double), 1, dfpt);
+
+  if (reqscale != 0) scale = reqscale;
+#if DEBUG
+  PLogMessage("L: LDA Suggested scale is %.1f\n", scale);
+#endif
+  if (!prep->dim) prep->dim = matdim;
+  else if (prep->dim != matdim)
+  {
+    log_report("Data (%d) and LDA (%d) dimensions don't match\n",
+               prep->dim, matdim);
+    SERVICE_ERROR(BAD_IMELDA);
+  }
+
+  /*  Eigenvalues, ignored
+  */
+  pfread(onerow, sizeof(double), matdim, dfpt);
+
+  /*  Translation Vector
+  */
+  pfread(onerow, sizeof(double), matdim, dfpt);
+  for (ii = 0; ii < matdim; ii++)
+  {
+    xfp = scale * (onerow[ii] - UTB_MEAN) + UTB_MEAN;
+    if (xfp > 0.0)
+      xfp += 0.5;
+    else if (xfp < 0.0)
+      xfp -= 0.5;
+
+    prep->offset[ii] = (imeldata) xfp;
+  }
+
+  /*  The imelda matrix
+  */
+  for (ii = 0; ii < matdim; ii++)
+  {
+    pfread(onerow, sizeof(double), matdim, dfpt);
+    for (jj = 0; jj < matdim; jj++)
+      prep->imelda[ii][jj] = (covdata)(scale * onerow[jj]);
+  }
+
+  prep->imel_shift = scale_matrix_for_fixedpoint(prep->matrix,
+                     prep->imelda, matdim);
+
+  /* The inverse imelda matrix
+   */
+  foffset = pftell(dfpt);
+  pfread(onerow, sizeof(double), matdim, dfpt);
+
+  if (pfeof(dfpt) != 0)
+  {
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+    PLogMessage("W: Inverting imelda matrix");
+#endif
+    invert_matrix(prep->imelda, prep->inverse, prep->dim);
+  }
+  else
+  {
+    pfseek(dfpt, foffset, SEEK_SET);
+
+    for (ii = 0; ii < matdim; ii++)
+    {
+      pfread(onerow, sizeof(double), matdim, dfpt);
+      for (jj = 0; jj < matdim; jj++)
+        prep->inverse[ii][jj] = (covdata)(onerow[jj] / scale);
+    }
+  }
+
+  prep->inv_shift = scale_matrix_for_fixedpoint(prep->invmat,
+                    prep->inverse, matdim);
+
+  pfclose(dfpt);
+  return (0);
+}
+#endif
diff --git a/srec/clib/imeld_tr.c b/srec/clib/imeld_tr.c
new file mode 100644
index 0000000..0ef71c1
--- /dev/null
+++ b/srec/clib/imeld_tr.c
@@ -0,0 +1,112 @@
+/*---------------------------------------------------------------------------*
+ *  imeld_tr.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#ifdef unix
+#include <limits.h>
+#endif
+#include <assert.h>
+
+#include "prelib.h"
+#include "portable.h"
+
+#include "../cfront/sh_down.h"
+
+
+static const char imeld_tr[] = "$Id: imeld_tr.c,v 1.2.10.10 2008/04/01 18:23:20 dahan Exp $";
+
+void linear_transform_frame(preprocessed *prep, imeldata *fram, int do_shift)
+/*
+**  Note the matrix is the transpose of the transformation
+**  To transform a single frame in place */
+{
+  int      ii, jj;
+  imeldata vec[MAX_DIMEN];
+  int dim = prep->dim;
+
+  ASSERT(prep);
+  ASSERT(prep->dim < MAX_DIMEN);
+  ASSERT(fram);
+  for (ii = 0; ii < dim; ii++)
+  {
+    vec[ii] = 0;
+    for (jj = 0; jj < prep->dim; jj++)
+      vec[ii] += prep->matrix[ii][jj] * fram[jj];
+    ASSERT(prep->imel_shift > 0);
+    vec[ii] = (imeldata) SHIFT_DOWN((int)vec[ii],
+                                    (unsigned int)prep->imel_shift);
+  }
+
+  if (do_shift)
+  {
+    if (prep->offset)
+      for (ii = 0; ii < dim; ii++)
+        fram[ii] = RANGE(vec[ii] + prep->offset[ii], 0, 255);
+    else
+      for (ii = 0; ii < dim; ii++)
+        fram[ii] = RANGE(vec[ii], 0, 255);
+  }
+  else
+  {
+    for (ii = 0; ii < dim; ii++)
+      fram[ii] = vec[ii];
+  }
+  return;
+}
+
+void inverse_transform_frame (preprocessed *prep, imeldata *fram, int do_shift)
+/*
+**  Note the matrix is the transpose of the transformation
+**  To transform a single frame in place */
+{
+    int	     ii, jj;
+    imeldata vec[MAX_DIMEN];
+
+    ASSERT (prep);
+    ASSERT (prep->dim < MAX_DIMEN);
+    ASSERT (fram);
+
+    if (prep->offset && do_shift)
+	for (ii= 0; ii < prep->dim; ii++)
+	    fram[ii] -= prep->offset[ii];
+
+    for (ii= 0; ii < prep->dim; ii++) {
+	vec[ii]= 0;
+	for (jj= 0; jj < prep->dim; jj++)
+	    vec[ii] += prep->invmat[ii][jj] * fram[jj];
+	vec[ii]= SHIFT_DOWN (vec[ii], prep->inv_shift);
+    //floating pt // for (jj= 0; jj < prep->dim; jj++)
+	//floating pt // vec[ii] += (imeldata)(prep->inverse[ii][jj] * fram[jj]);
+    }
+    if (do_shift)
+	for (ii= 0; ii < prep->dim; ii++)
+	    fram[ii]= RANGE (vec[ii], 0, 255);
+    else
+	for (ii= 0; ii < prep->dim; ii++)
+	    fram[ii]= vec[ii];
+    return;
+}
+
+
diff --git a/srec/clib/jacobi.c b/srec/clib/jacobi.c
new file mode 100644
index 0000000..44335de
--- /dev/null
+++ b/srec/clib/jacobi.c
@@ -0,0 +1,218 @@
+/*---------------------------------------------------------------------------*
+ *  jacobi.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <assert.h>
+
+#include "hmmlib.h"
+#include "portable.h"
+
+#undef EPSILON
+#define EPSILON         0.00000001
+#define MAX_ITER      100
+#define DEFAULT_MAX_PC_DIFF     0.0001
+#define DEFAULT_MAX_OFF_DIAG 0.0001
+
+static void   Rotate(double **a, int dim, int i, int j, int k, int l, double s,
+                     double tau);
+                     
+static double SumOffDiag(double **mat, int dim);
+
+
+/* ------------------------------------------------------------------------ */
+
+void Jacobi(double **matrix, int dim, double *egval, double **egvec)
+/*
+//    Compute all eigenvalues and eigenvectors of the real symmetric matrix
+//    <mat>  of size  <dim>x<dim>.  Fills in <egval> with the eigenvalues
+//    and  <egvec[i]>  with the i-th normalized eignevector of  <mat>.
+*/
+{
+  int    i, j, k;
+  int    nRotations,  /* number of Jacobi rotations that are performed */
+  iter;
+  double g, thresh, sum, c, s, t, tau, h;
+  double *b, *d, *z;
+  double **v, **a;
+  
+  ASSERT(matrix);
+  ASSERT(egval);
+  ASSERT(egvec);
+  
+  b = (double *) CALLOC(dim, sizeof(double), "clib.jacobi.b");
+  d = (double *) CALLOC(dim, sizeof(double), "clib.jacobi.d");
+  z = (double *) CALLOC(dim, sizeof(double), "clib.jacobi.z");
+  a = (double **) CALLOC(dim, sizeof(double *), "clib.jacobi.input_jacobi");
+  v = (double **) CALLOC(dim, sizeof(double *), "clib.jacobi.input_jacobi");
+  for (i = 0; i < dim; i++)
+  {
+    a[i] = (double *) CALLOC(dim, sizeof(double), "clib.jacobi.input_jacobi[]");
+    v[i] = (double *) CALLOC(dim, sizeof(double), "clib.jacobi.input_jacobi[]");
+    for (j = 0; j < dim; j++)
+      a[i][j] = (float) matrix[i][j];
+  }
+  
+  /* initialize v to identity matrix, d and b to the diagonal of mat */
+  for (i = 0; i < dim; i++)
+  {
+    v[i][i] = 1.0;
+    b[i] = d[i] = a[i][i];
+  }
+  
+  nRotations = 0;
+  iter = 0;
+  
+  while (1)
+  {
+    sum = SumOffDiag(a, dim);
+    
+    if (sum < EPSILON)    /* normal convergence */
+    {
+      log_report("\nConverged after %u iterations", iter);
+      break;
+    }
+    if (iter >= MAX_ITER)
+    {
+      log_report("\nMax number %u of iterations reached",
+                 MAX_ITER);
+      break;
+    }
+    
+    if (iter < 3)
+      thresh = 20.0 * sum / (dim * dim);    /* .. first 3 iterations only */
+    else
+      thresh = 0.0;                    /* .. thereafter */
+      
+    for (i = 0; i < dim - 1; i++)
+    {
+      for (j = i + 1; j < dim; j++)
+      {
+        g = 100.0 * fabs(a[i][i]);
+        
+        /* after 4 iter's, skip rotation if off-diag elmt is small */
+        if ((iter >= 4) && (g < EPSILON*fabs(d[i]))
+            && (g < EPSILON*fabs(d[j])))
+        {
+          a[i][i] = 0.0;
+        }
+        else if (g > thresh)
+        {
+          h = d[j] - d[i];
+          
+          if (g < EPSILON*fabs(h))
+            t = a[i][j] / h;
+          else
+          {
+            double theta = 0.5 * h / a[i][j];
+            t = 1.0 / (fabs(theta) + sqrt(1.0 + theta * theta));
+            if (theta < 0.0)  t = -t;
+          }
+          
+          c = 1.0 / sqrt(1 + t * t);
+          s = t * c;
+          tau = s / (1.0 + c);
+          h = t * a[i][j];
+          
+          z[i] -= h;
+          z[j] += h;
+          d[i] -= h;
+          d[j] += h;
+          a[i][j] = 0.0;
+          
+          for (k = 0  ; k < i;   k++)  Rotate(a, dim, k, i, k, j, s, tau);
+          for (k = i + 1; k < j;   k++)  Rotate(a, dim, i, k, k, j, s, tau);
+          for (k = j + 1; k < dim; k++)  Rotate(a, dim, i, k, j, k, s, tau);
+          
+          for (k = 0;   k < dim; k++)  Rotate(v, dim, k, i, k, j, s, tau);
+          
+          nRotations++;
+        }
+      }
+    }
+    
+    for (i = 0; i < dim; i++)    /* update d[] and re-initialize z[] */
+    {
+      b[i] += z[i];
+      d[i] = b[i];
+      z[i] = 0.0;
+    }
+    
+    iter++;
+  }
+  
+  /* save eigenvectors and eigenvalues */
+  for (i = 0; i < dim; i++)
+  {
+    /* the i-th column of v is the i-th eigenvector */
+    for (j = 0; j < dim; j++)  egvec[i][j] = v[j][i]; /* TODO: should this be egvec[j][i] */
+    
+    /* the i-th entry of d is the i-th eigenvalue */
+    egval[i] = d[i];
+  }
+  
+  log_report("\nDiagonalization required %u Jacobi rotations",
+             nRotations);
+             
+  FREE((char *)b);
+  FREE((char *)d);
+  FREE((char *)z);
+  for (i = 0; i < dim; i++)
+  {
+    FREE((char *)a[i]);
+    FREE((char *)v[i]);
+  }
+  FREE((char *)a);
+  FREE((char *)v);
+  return;
+}
+
+/* ------------------------------------------------------------------------ */
+
+static void Rotate(double **a, int dim, int i, int j, int k, int l, double s,
+                   double tau)
+{
+  double g = a[i][j],
+             h = a[k][l];
+             
+  a[i][j] = g - s * (h + g * tau);
+  a[k][l] = h + s * (g - h * tau);
+  return;
+}
+
+static double SumOffDiag(double **mat, int dim)
+/*
+//    Compute the sum of the absolute values of the off-diagonal elements
+**/
+{
+  int    i, j;
+  double sum = 0.0;
+  
+  for (i = 0; i < dim - 1; i++)
+    for (j = i + 1; j < dim; j++)
+      sum += fabs(mat[i][j]);
+      
+  return (sum);
+}
+
diff --git a/srec/clib/log_add.c b/srec/clib/log_add.c
new file mode 100644
index 0000000..434f6ca
--- /dev/null
+++ b/srec/clib/log_add.c
@@ -0,0 +1,95 @@
+/*---------------------------------------------------------------------------*
+ *  log_add.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+
+#include "prelib.h"
+#include "portable.h"
+
+#define DEBUG  0
+
+#define TAB_ENTRIES     1024
+
+static const char logadd[] = "$Id: log_add.c,v 1.3.6.10 2008/01/29 06:36:39 dahan Exp $";
+
+// #define PRINT_SOME_CODE(fMt,aRg1) printf(fMt,aRg1) 
+#define PRINT_SOME_CODE(fMt,aRg1) 
+
+/* values for default case 0 */
+#define DO_USE_LOGTAB__TABLE ( logtab->scale == 61  \
+        && ( (int)(logtab->logscale*10000) == (int)(6.4f*10000)) \
+		&& ADD_LOG_LIMIT == 8) 
+static prdata logtab__table[3125] = { 271, 270, 270, 269, 269, 268, 268, 267, 267, 266, 266, 265, 265, 264, 264, 263, 263, 262, 262, 261, 261, 260, 260, 259, 259, 258, 258, 257, 257, 256, 256, 255, 255, 254, 254, 253, 253, 253, 252, 252, 251, 251, 250, 250, 249, 249, 248, 248, 247, 247, 246, 246, 245, 245, 245, 244, 244, 243, 243, 242, 242, 241, 241, 240, 240, 239, 239, 239, 238, 238, 237, 237, 236, 236, 235, 235, 234, 234, 234, 233, 233, 232, 232, 231, 231, 230, 230, 230, 229, 229, 228, 228, 227, 227, 226, 226, 226, 225, 225, 224, 224, 223, 223, 222, 222, 222, 221, 221, 220, 220, 219, 219, 219, 218, 218, 217, 217, 216, 216, 216, 215, 215, 214, 214, 214, 213, 213, 212, 212, 211, 211, 211, 210, 210, 209, 209, 208, 208, 208, 207, 207, 206, 206, 206, 205, 205, 204, 204, 204, 203, 203, 202, 202, 202, 201, 201, 200, 200, 200, 199, 199, 198, 198, 198, 197, 197, 196, 196, 196, 195, 195, 194, 194, 194, 193, 193, 192, 192, 192, 191, 191, 191, 190, 190, 189, 189, 189, 188, 188, 187, 187, 187, 186, 186, 186, 185, 185, 184, 184, 184, 183, 183, 183, 182, 182, 181, 181, 181, 180, 180, 180, 179, 179, 178, 178, 178, 177, 177, 177, 176, 176, 176, 175, 175, 174, 174, 174, 173, 173, 173, 172, 172, 172, 171, 171, 171, 170, 170, 169, 169, 169, 168, 168, 168, 167, 167, 167, 166, 166, 166, 165, 165, 165, 164, 164, 164, 163, 163, 163, 162, 162, 162, 161, 161, 161, 160, 160, 159, 159, 159, 158, 158, 158, 157, 157, 157, 157, 156, 156, 156, 155, 155, 155, 154, 154, 154, 153, 153, 153, 152, 152, 152, 151, 151, 151, 150, 150, 150, 149, 149, 149, 148, 148, 148, 147, 147, 147, 147, 146, 146, 146, 145, 145, 145, 144, 144, 144, 143, 143, 143, 143, 142, 142, 142, 141, 141, 141, 140, 140, 140, 139, 139, 139, 139, 138, 138, 138, 137, 137, 137, 137, 136, 136, 136, 135, 135, 135, 134, 134, 134, 134, 133, 133, 133, 132, 132, 132, 132, 131, 131, 131, 130, 130, 130, 130, 129, 129, 129, 128, 128, 128, 128, 127, 127, 127, 126, 126, 126, 126, 125, 125, 125, 125, 124, 124, 124, 123, 123, 123, 123, 122, 122, 122, 122, 121, 121, 121, 121, 120, 120, 120, 119, 119, 119, 119, 118, 118, 118, 118, 117, 117, 117, 117, 116, 116, 116, 116, 115, 115, 115, 115, 114, 114, 114, 114, 113, 113, 113, 113, 112, 112, 112, 112, 111, 111, 111, 111, 110, 110, 110, 110, 109, 109, 109, 109, 108, 108, 108, 108, 107, 107, 107, 107, 106, 106, 106, 106, 105, 105, 105, 105, 105, 104, 104, 104, 104, 103, 103, 103, 103, 102, 102, 102, 102, 102, 101, 101, 101, 101, 100, 100, 100, 100, 99, 99, 99, 99, 99, 98, 98, 98, 98, 97, 97, 97, 97, 97, 96, 96, 96, 96, 95, 95, 95, 95, 95, 94, 94, 94, 94, 94, 93, 93, 93, 93, 92, 92, 92, 92, 92, 91, 91, 91, 91, 91, 90, 90, 90, 90, 90, 89, 89, 89, 89, 89, 88, 88, 88, 88, 88, 87, 87, 87, 87, 87, 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 84, 84, 84, 84, 84, 83, 83, 83, 83, 83, 82, 82, 82, 82, 82, 82, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 78, 78, 78, 78, 78, 77, 77, 77, 77, 77, 77, 76, 76, 76, 76, 76, 76, 75, 75, 75, 75, 75, 74, 74, 74, 74, 74, 74, 73, 73, 73, 73, 73, 73, 72, 72, 72, 72, 72, 72, 71, 71, 71, 71, 71, 71, 70, 70, 70, 70, 70, 70, 69, 69, 69, 69, 69, 69, 68, 68, 68, 68, 68, 68, 67, 67, 67, 67, 67, 67, 67, 66, 66, 66, 66, 66, 66, 65, 65, 65, 65, 65, 65, 65, 64, 64, 64, 64, 64, 64, 63, 63, 63, 63, 63, 63, 63, 62, 62, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 60, 60, 60, 60, 60, 60, 60, 59, 59, 59, 59, 59, 59, 59, 58, 58, 58, 58, 58, 58, 58, 57, 57, 57, 57, 57, 57, 57, 57, 56, 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55, 55, 55, 55, 54, 54, 54, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 53, 53, 52, 52, 52, 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, 46, 46, 46, 45, 45, 45, 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /*0*/
+
+void create_lookup_logadd(logadd_table_info *logtab, float mul_scale)
+{
+  int ii;
+
+  ASSERT(logtab);
+  ASSERT(logtab->scale != 0);
+
+  logtab->logscale = mul_scale;
+  logtab->add_log_limit = (prdata)(ADD_LOG_LIMIT * mul_scale * logtab->scale);
+  if( DO_USE_LOGTAB__TABLE) {
+	  logtab->table = logtab__table;
+  } else {
+	logtab->table = (prdata *) CALLOC(logtab->add_log_limit + 2,
+											sizeof(prdata), "clib.logadd");
+	PRINT_SOME_CODE( "/* values for default case %d */\n", 0);
+	PRINT_SOME_CODE( "#define DO_USE_LOGTAB__TABLE (logtab->scale == %d  \\\n", logtab->scale);
+    PRINT_SOME_CODE( "    && ( (int)(logtab->logscale*10000) == (int)(%ff*10000) \\\n", logtab->logscale);
+	PRINT_SOME_CODE( "    && ADD_LOG_LIMIT == %d) \n", ADD_LOG_LIMIT);
+	PRINT_SOME_CODE( "static prdata logtab__table[%d] = {", logtab->add_log_limit + 2);
+	for (ii = 0; ii <= logtab->add_log_limit; ii++) {
+		logtab->table[ii] = (prdata)(logtab->scale * mul_scale * log(1
+									+ exp(-(float)ii / ((float)logtab->scale * mul_scale)))
+									+ 0.5) ;
+		PRINT_SOME_CODE(" %d,", logtab->table[ii]);
+	}
+	PRINT_SOME_CODE( ", 0 }; /*%i*/\n", 0); /*not sure why the +2 above, just append 0 for now*/
+  }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("L: log table scale is %f\n", (float)logtab->scale);
+  PLogMessage("L: log table has %d entries\n", (int)logtab->add_log_limit);
+#endif
+#if DEBUG
+  for (ii = 0; ii <= logtab->add_log_limit; ii++)
+    log_report("T: %d %f\n", ii, (float)logtab->table[ii]);
+#endif
+#if REPORT_USAGE
+  report_malloc_usage();
+#endif
+  return;
+}
+
+void destroy_lookup_logadd(logadd_table_info *logtab)
+{
+  ASSERT(logtab);
+  ASSERT(logtab->table);
+  if( !DO_USE_LOGTAB__TABLE ) {
+	FREE((char *)logtab->table);
+  }
+  return;
+}
diff --git a/srec/clib/log_add.h b/srec/clib/log_add.h
new file mode 100644
index 0000000..9f59cff
--- /dev/null
+++ b/srec/clib/log_add.h
@@ -0,0 +1,36 @@
+/*---------------------------------------------------------------------------*
+ *  log_add.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _inl_log_add_
+#define _inl_log_add_
+
+static PINLINE prdata log_increment_inline(prdata ival, logadd_table_info *logtab);
+
+static PINLINE prdata log_increment_inline(prdata ival, logadd_table_info *logtab)
+/*
+**  To add two numbers stored as their natural logarithms
+**  A more efficient implementation is to use lookup tables.
+*/
+{
+  ASSERT(logtab);
+  ASSERT(logtab->table);
+  
+  return (logtab->table[(int)(ival)]);
+}
+#endif
diff --git a/srec/clib/matrix_i.c b/srec/clib/matrix_i.c
new file mode 100644
index 0000000..358af56
--- /dev/null
+++ b/srec/clib/matrix_i.c
@@ -0,0 +1,204 @@
+/*---------------------------------------------------------------------------*
+ *  matrix_i.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include <stdlib.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <math.h>
+#include <string.h>
+#include <assert.h>
+
+#include "hmmlib.h"
+#include "prelib.h"
+#include "portable.h"
+
+#define PIVOT 1
+#define DEBUG 0
+
+#define TINY  1.0e-20
+#define SIGNIFICANT 0 /* 1.0e-20 */
+
+static const char matrix_i[] = "$Id: matrix_i.c,v 1.2.10.3 2007/10/15 18:06:24 dahan Exp $";
+
+void lubksb(double **mat, int dim, int *index, double *b);
+int  ludcmp(double **mat, int dim, int *index);
+
+int invert_matrix(covdata **mat, covdata **inv, int dim)
+{
+  double *col, **input;
+  int ii, jj, *index, err_code;
+#if DEBUG
+  double  sum;
+  int     kk;
+#endif
+  
+  ASSERT(mat);
+  ASSERT(inv);
+  index = (int *) CALLOC(dim, sizeof(int), "clib.index_imatrix");
+  col = (double *) CALLOC(dim, sizeof(double), "clib.col");
+  input = (double **) CALLOC(dim, sizeof(double *), "clib.input_imatrix");
+  for (ii = 0; ii < dim; ii++)
+  {
+    input[ii] = (double *) CALLOC(dim, sizeof(double), "clib.input_imatrix[]");
+    for (jj = 0; jj < dim; jj++)
+      input[ii][jj] = mat[ii][jj];
+  }
+  
+  if ((err_code = ludcmp(input, dim, index)) > 0) return(err_code);
+  for (jj = 0; jj < dim; jj++)
+  {
+    for (ii = 0; ii < dim; ii++)
+      col[ii] = 0;
+    col[jj] = 1;
+    lubksb(input, dim, index, col);
+    for (ii = 0; ii < dim; ii++)
+      inv[ii][jj] = col[ii];
+  }
+  for (ii = 0; ii < dim; ii++)
+    FREE((char *)input[ii]);
+  FREE((char *)input);
+  FREE((char *)col);
+  FREE((char *)index);
+  
+#if DEBUG
+  printf("Testing the inverse:\n");
+  for (ii = 0; ii < dim; ii++)
+  {
+    for (jj = 0; jj < dim; jj++)
+    {
+      sum = 0;
+      for (kk = 0; kk < dim; kk++)
+        sum += mat[ii][kk] * inv[kk][jj];
+      printf("%.2f ", sum);
+    }
+    printf("\n");
+  }
+#endif
+  
+  return (0);
+}
+
+int ludcmp(double **mat, int dim, int *index)
+/*
+**  This routine is straight out of the numerical recipes in C
+*/
+{
+  int ii, imax = 0, jj, kk;
+  double big, dumm, sum, temp;
+  double *vv;
+  
+  vv = (double *) CALLOC(dim + 5, sizeof(double), "clib.ludcmp.vv");
+#if PIVOT
+  for (ii = 0; ii < dim; ii++)
+  {
+    big = 0;
+    for (jj = 0; jj < dim; jj++)
+      if ((temp = (double) fabs(mat[ii][jj])) > big) big = temp;
+    if (big <= SIGNIFICANT)
+    {
+      log_report("Singular matrix in routine ludcmp\n");
+      return (SINGULAR_MATRIX);
+    }
+    vv[ii] = 1 / big;
+  }
+#endif
+  
+  for (jj = 0; jj < dim; jj++)
+  {
+    for (ii = 0; ii < jj; ii++)
+    {
+      sum = mat[ii][jj];
+      for (kk = 0; kk < ii; kk++)
+        sum -= mat[ii][kk] * mat[kk][jj];
+      mat[ii][jj] = sum;
+    }
+    big = 0;
+    for (ii = jj; ii < dim; ii++)
+    {
+      sum = mat[ii][jj];
+      for (kk = 0; kk < jj; kk++)
+        sum -= mat[ii][kk] * mat[kk][jj];
+      mat[ii][jj] = sum;
+      if ((dumm = (double)(vv[ii] * fabs(sum))) >= big)
+      {
+        big = dumm;
+        imax = ii;
+      }
+    }
+    
+#if PIVOT
+    if (jj != imax)
+    {
+      for (kk = 0; kk < dim; kk++)
+      {
+        dumm = mat[imax][kk];
+        mat[imax][kk] = mat[jj][kk];
+        mat[jj][kk] = dumm;
+      }
+      vv[imax] = vv[jj];
+    }
+    index[jj] = imax;
+#else
+    index[jj] = jj;
+#endif
+    
+    if (fabs(mat[jj][jj]) <= SIGNIFICANT) mat[jj][jj] = (double)TINY;
+    if (jj < (dim - 1))
+    {
+      dumm = 1 / mat[jj][jj];
+      for (ii = jj + 1; ii < dim; ii++)
+        mat[ii][jj] *= dumm;
+    }
+  }
+  
+  FREE((char *)vv);
+  return (0);
+}
+
+void lubksb(double **mat, int dim, int *index, double *b)
+{
+  int ii, ix = -1, ip, jj;
+  double sum;
+  
+  for (ii = 0; ii < dim; ii++)
+  {
+#if PIVOT
+    ip = index[ii];
+    sum = b[ip];
+    b[ip] = b[ii];
+#else
+    sum = b[ii];
+#endif
+    if (ix >= 0)
+      for (jj = ix; jj < ii; jj++)
+        sum -= mat[ii][jj] * b[jj];
+    else if (sum) ix = ii;
+    b[ii] = sum;
+  }
+  
+  for (ii = dim - 1; ii >= 0; ii--)
+  {
+    sum = b[ii];
+    for (jj = ii + 1; jj < dim; jj++)
+      sum -= mat[ii][jj] * b[jj];
+    b[ii] = sum / mat[ii][ii];
+  }
+}
diff --git a/srec/clib/matx_ops.c b/srec/clib/matx_ops.c
new file mode 100644
index 0000000..2f4536e
--- /dev/null
+++ b/srec/clib/matx_ops.c
@@ -0,0 +1,147 @@
+/*---------------------------------------------------------------------------*
+ *  matx_ops.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include <stdlib.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <math.h>
+#include <string.h>
+#include <assert.h>
+
+#include "hmmlib.h"
+#include "prelib.h"
+#include "duk_io.h"
+#include "duk_err.h"
+#include "pendian.h"
+#include "portable.h"
+
+static const char matx_ops[] = "$Id: matx_ops.c,v 1.5.6.6 2007/10/15 18:06:24 dahan Exp $";
+
+covdata **create_matrix(int dimen)
+{
+  int     ii;
+  covdata **matrix;
+  
+  matrix = (covdata **) CALLOC(dimen, sizeof(covdata *),
+                                     "clib.cov_matrix");
+  for (ii = 0; ii < dimen; ii++)
+    matrix[ii] = (covdata *) CALLOC(dimen, sizeof(covdata),
+                                          "clib.cov_matrix[]");
+  return (matrix);
+}
+
+void delete_matrix(covdata **matrix, int dimen)
+{
+  int ii;
+  
+  ASSERT(matrix);
+  for (ii = 0; ii < dimen; ii++)
+    FREE((char *)matrix[ii]);
+  FREE((char *)matrix);
+  return;
+}
+
+void diagonal_elements(covdata *vector, covdata **matrix, int dim)
+{
+  int ii;
+  
+  ASSERT(vector);
+  ASSERT(matrix);
+  for (ii = 0; ii < dim; ii++)
+    vector[ii] = (float) matrix[ii][ii];
+  return;
+}
+
+int scale_matrix_for_fixedpoint(imeldata **fixmat, covdata **matrix,
+                                int dimen)
+{
+  int ii, jj, shift;
+  long scale_coef;
+  double sum_coef, xfp;
+  double max_sum_coef = 0.0;
+  
+  ASSERT(matrix);
+  ASSERT(fixmat);
+  ASSERT(dimen > 0);
+  max_sum_coef = 0;
+  for (ii = 0; ii < dimen; ii++)
+  {
+    sum_coef = 0;
+    for (jj = 0; jj < dimen; jj++)
+      sum_coef += fabs(matrix[ii][jj]);
+    if (sum_coef > max_sum_coef)
+      max_sum_coef = sum_coef;
+  }
+  
+  scale_coef = (long)((double)FIXED_MAX / max_sum_coef);
+  if (scale_coef < 1)
+    SERVICE_ERROR(BAD_IMELDA); /* TODO: find a suitable code */
+    
+  shift = 0;
+  while (scale_coef > 1)
+  {
+    shift++;
+    scale_coef >>= 1;
+  }
+  
+  scale_coef = (1 << shift);
+  
+  /* read in again and scale up using prep->imel_shift
+  */
+  for (ii = 0; ii < dimen; ii++)
+    for (jj = 0; jj < dimen; jj++)
+    {
+      xfp = ((double)scale_coef) * matrix[ii][jj];
+      if (xfp > 0.0)
+        xfp += 0.5;
+      else if (xfp < 0.0)
+        xfp -= 0.5;
+      ASSERT(xfp < FIXED_MAX);
+      ASSERT(xfp > -FIXED_MAX);
+      fixmat[ii][jj] = (imeldata) xfp;
+    }
+  return (shift);
+}
+
+imeldata **create_fixed_matrix(int dimen)
+{
+  int     ii;
+  imeldata **matrix;
+  
+  matrix = (imeldata **) CALLOC(dimen, sizeof(imeldata *),
+                                      "clib.fixed_matrix");
+  for (ii = 0; ii < dimen; ii++)
+    matrix[ii] = (imeldata *) CALLOC(dimen, sizeof(imeldata),
+                                           "clib.fixed_matrix[]");
+  return (matrix);
+}
+
+void delete_fixed_matrix(imeldata **matrix, int dimen)
+{
+  int ii;
+  
+  ASSERT(matrix);
+  
+  for (ii = 0; ii < dimen; ii++)
+    FREE((char *)matrix[ii]);
+  FREE((char *)matrix);
+  return;
+}
diff --git a/srec/clib/matx_ops.h b/srec/clib/matx_ops.h
new file mode 100644
index 0000000..0a0e32d
--- /dev/null
+++ b/srec/clib/matx_ops.h
@@ -0,0 +1,43 @@
+/*---------------------------------------------------------------------------*
+ *  matx_ops.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "hmm_type.h"
+
+static PINLINE void matrix_fixed_multiply_frame(imeldata *outvec, imeldata **matrix,
+    imeldata *vector, int dimr, int dimc);
+    
+static PINLINE void matrix_fixed_multiply_frame(imeldata *outvec, imeldata **matrix,
+    imeldata *vector, int dimr, int dimc)
+{
+  int ii, jj;
+  imeldata sum;
+  
+  ASSERT(matrix);
+  ASSERT(vector);
+  ASSERT(outvec);
+  ASSERT(outvec != vector);
+  for (ii = 0; ii < dimr; ii++)
+  {
+    sum = 0;
+    for (jj = 0; jj < dimc; jj++)
+      sum += matrix[ii][jj] * vector[jj];
+    outvec[ii] = sum;
+  }
+  return;
+}
diff --git a/srec/clib/memmove.h b/srec/clib/memmove.h
new file mode 100644
index 0000000..40e5aa3
--- /dev/null
+++ b/srec/clib/memmove.h
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*
+ *  memmove.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _inl_memmove_
+#define _inl_memmove_
+
+#if USE_SYSTEM_MEMMOVE
+#define MEMMOVE(S,D,N,Z) memmove(S,D,(N)*(Z))
+#else
+#define MEMMOVE memmove_inline
+
+static void *memmove_inline(void *dest, const void *src, size_t count,
+                            size_t size);
+
+static void *memmove_inline(void *dest, const void *src, size_t count,
+                            size_t size)
+/*
+**  A more efficient implementation of memmove
+*/
+{
+  ASSERT(dest);
+  ASSERT(src);
+
+  while (count-- > 0)
+  {
+    memcpy(dest, src, size);
+    dest = (void *)(((char *)dest) + size);
+    src = (void *)(((char *)src) + size);
+  }
+  return (dest);  /* TODO: fix return */
+}
+#endif
+#endif
diff --git a/srec/clib/specnorm.c b/srec/clib/specnorm.c
new file mode 100644
index 0000000..41a3712
--- /dev/null
+++ b/srec/clib/specnorm.c
@@ -0,0 +1,365 @@
+/*---------------------------------------------------------------------------*
+ *  specnorm.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <assert.h>
+
+#include "duk_err.h"
+#include "specnorm.h"
+#include "portable.h"
+
+#define DEBUG   0
+
+static const char specnorm[] = "$Id: specnorm.c,v 1.2.10.7 2007/10/15 18:06:24 dahan Exp $";
+
+int copy_distribution_counts(spect_dist_info *spec, spect_dist_info *base);
+
+
+int add_distribution_data(spect_dist_info *spec, int spec_val)
+{
+  /*  Median calculations
+  */
+  ASSERT(spec);
+#if USE_MEDIAN
+  if (spec_val < spec->low_entry) spec->low_counts += UNIT_SIZE;
+  else if (spec_val > spec->high_entry) spec->high_counts += UNIT_SIZE;
+  else spec->hist[spec_val - spec->low_entry] += UNIT_SIZE;
+#endif
+  
+  /*  Mean calculations
+  */
+#if 1
+  spec->running_total += spec_val - spec->mean;
+  spec->running_total_devn += (spec_val - spec->mean)
+                              * (spec_val - spec->mean);
+#else
+  spec->running_total += spec_val;
+  spec->running_total_devn += spec_val * spec_val;
+#endif
+                              
+  spec->count++;
+  if (spec->estimate_period > 0 && spec->count >= spec->estimate_period)
+  {
+    evaluate_parameters(spec);
+    spec->gain_used = False;
+    spec->count = 0;
+    return (1);
+  }
+  return (0);
+}
+
+void evaluate_parameters(spect_dist_info *spec)
+{
+  ASSERT(spec);
+#if USE_MEDIAN
+  estimate_sv6(spec);
+  spec->median = estimate_percentile(spec, spec->estimate_percentile);
+  spec->perc_high = estimate_percentile(spec, 90);  /* check this value */
+#endif
+#if USE_MEAN
+  estimate_mean(spec, spec->forget_factor);
+#endif
+#if USE_MEDIAN
+  forget_distribution_counts(spec, spec->forget_factor);
+#endif
+  spec->count = 0;
+  return;
+}
+
+#if USE_MEDIAN
+int estimate_percentile(spect_dist_info *spec, int percentile)
+{
+  int ii, jj, count, cumval;
+  long    accum = 0;
+  
+  /*  Calculate the median
+  */
+  ASSERT(spec);
+  if (spec->count < MIN_COUNT) return(spec->median);
+  if (percentile == 0)
+    percentile = spec->estimate_percentile;
+  count = spec->low_counts + spec->high_counts;
+  for (ii = 0; ii <= (spec->high_entry - spec->low_entry); ii++)
+    count += spec->hist[ii];
+  count = (count * percentile) / 100;
+  
+  cumval = spec->low_counts;
+  for (ii = 0; ii <= (spec->high_entry - spec->low_entry)
+       && cumval < count; ii++)
+    cumval += spec->hist[ii];
+    
+  count = 0;
+  for (jj = ii; jj <= (spec->high_entry - spec->low_entry); jj++)
+  {
+    count += spec->hist[jj];
+    accum += spec->hist[jj] * (jj - ii);
+  }
+#if DEBUG
+  if (count > 0)
+    log_report("Median margin %d\n", accum / count);
+#endif
+  return (spec->low_entry + ii);
+}
+
+void estimate_sv6(spect_dist_info *spec)
+{
+  int ii, jj, count, span, totcount;
+  long    accum;
+  
+  /*  Calculate the median
+  */
+  ASSERT(spec);
+  if (spec->count < MIN_COUNT) return;
+  count = spec->high_counts;
+  accum = 0;
+  span = spec->high_entry - spec->low_entry;
+  for (ii = 0, jj = spec->high_entry - spec->low_entry;
+       ii <= span; ii++, jj--)
+  {
+    count += spec->hist[jj];
+    accum += spec->hist[jj] * ii;
+    if (count > 0 && (ii - accum / count) > spec->sv6_margin)
+      break;
+  }
+  
+  totcount = count;
+  for (; ii <= span; ii++, jj--)
+    totcount += spec->hist[jj];
+  totcount += spec->high_counts;
+  
+#if DEBUG
+  log_report("SV6 (%d) Percentage %d, %d, %d\n", spec->sv6_margin,
+             (count * 100) / totcount,
+             totcount, spec->count);
+#endif
+  if (count > 0)
+    spec->sv6 = spec->high_entry - accum / count;
+  return;
+}
+#endif
+
+void estimate_mean(spect_dist_info *spec, int forget_factor)
+{
+  /*  Calculate the mean and standard deviation
+  */
+  ASSERT(spec);
+  if (spec->count < MIN_COUNT) return;
+#if DEBUG
+  log_report("old mean= %d, ", spec->mean);
+#endif
+  spec->mean_count = (spec->mean_count * (100 - forget_factor)) / 100;
+  spec->mean_count += spec->count;
+  if (spec->mean_count > 0)
+  {
+    spec->devn = spec->running_total_devn / spec->mean_count
+                 - (spec->running_total * spec->running_total)
+                 / (spec->mean_count * spec->mean_count);
+    spec->devn = (int) sqrt((double)  spec->devn);
+    if (spec->running_total >= 0)
+      spec->mean += (spec->running_total + spec->mean_count / 2)
+                    / spec->mean_count;
+    else
+      spec->mean += (spec->running_total - spec->mean_count / 2)
+                    / spec->mean_count;
+  }
+#if DEBUG
+  log_report("accumulates= %d and %d (%d), ", spec->running_total,
+             spec->mean_count, spec->count);
+  log_report("new mean= %d\n", spec->mean);
+#endif
+  spec->running_total = 0;
+  spec->running_total_devn = 0;
+  
+  return;
+}
+
+#if USE_MEDIAN
+int median_normalize_data(spect_dist_info *spec, int spec_val)
+{
+  return (spec_val - spec->median + spec->offset);
+}
+
+int sv6_normalize_data(spect_dist_info *spec, int spec_val)
+{
+  return (spec_val - spec->sv6 + spec->offset);
+}
+#endif
+
+int mean_normalize_data(spect_dist_info *spec, int spec_val)
+{
+  return (spec_val - spec->mean + spec->offset);
+}
+
+spect_dist_info *create_spectrum_distribution(int offset, int initial_median,
+    int low_entry, int high_entry,
+    int forget_factor, int estimate_period,
+    int estimate_percentile,
+    int sv6_margin)
+{
+  spect_dist_info *spec;
+  
+  if (high_entry < low_entry) return(NULL);
+  
+  spec = (spect_dist_info *) CALLOC_CLR(1,
+         sizeof(spect_dist_info), "clib.spec");
+  if (estimate_period == 0) /* basically disable 0 as an estimate period */
+    spec->estimate_period = 1;
+  else
+    spec->estimate_period = estimate_period;
+  spec->forget_factor = forget_factor;
+  spec->offset = offset;
+  
+#if USE_MEDIAN
+  spec->hist = (long *) CALLOC_CLR(high_entry - low_entry + 1,
+                                         sizeof(int), "clib.spec.hist");
+  spec->low_entry = low_entry;
+  spec->high_entry = high_entry;
+  spec->median = initial_median;
+  spec->estimate_percentile = estimate_percentile;
+  spec->sv6_margin = sv6_margin;
+  clear_distribution_counts(spec);
+#endif
+#if USE_MEAN
+  spec->mean = initial_median;
+  spec->devn = 0;
+  clear_mean_counts(spec);
+#endif
+  spec->sv6 = initial_median;
+  
+  return (spec);
+}
+
+void destroy_spectrum_distribution(spect_dist_info *spec)
+{
+  ASSERT(spec);
+#if USE_MEDIAN
+  FREE((char *)spec->hist);
+#endif
+  FREE((char *)spec);
+  return;
+}
+
+#if USE_MEDIAN
+void clear_distribution_counts(spect_dist_info *spec)
+{
+  int ii;
+  
+  ASSERT(spec);
+  spec->high_counts = 0;
+  spec->low_counts = 0;
+  spec->count = 0;
+  for (ii = 0; ii <= (spec->high_entry - spec->low_entry); ii++)
+    spec->hist[ii] = 0;
+  return;
+}
+
+int copy_distribution_counts(spect_dist_info *spec, spect_dist_info *base)
+{
+  int ii;
+  
+  ASSERT(spec);
+  ASSERT(base);
+  ASSERT(spec->hist);
+  ASSERT(base->hist);
+  if (base->low_entry != spec->low_entry ||
+      base->high_entry != spec->high_entry)
+    return (False);
+  spec->high_counts = base->high_counts;
+  spec->low_counts = base->low_counts;
+  for (ii = 0; ii <= (spec->high_entry - spec->low_entry); ii++)
+    spec->hist[ii] = base->hist[ii];
+  return (True);
+}
+
+void forget_distribution_counts(spect_dist_info *spec, int forget_factor)
+{
+  int ii, remember;
+  
+  ASSERT(spec);
+  /*    remember= 100 - (forget_factor * spec->count)/spec->estimate_period; */
+  remember = 100 - forget_factor;
+  spec->high_counts = (spec->high_counts * remember) / 100;
+  spec->low_counts = (spec->low_counts * remember) / 100;
+  for (ii = 0; ii <= (spec->high_entry - spec->low_entry); ii++)
+    spec->hist[ii] = (spec->hist[ii] * remember) / 100;
+  return;
+}
+
+void shift_distribution_counts(spect_dist_info *spec, int shift)
+{
+  int ii;
+  
+  ASSERT(spec);
+  if (shift > 0)
+  {
+    if (shift > (spec->high_entry - spec->low_entry))
+      SERVICE_ERROR(UNEXPECTED_DATA_ERROR); /* TODO: find a new error code */
+    for (ii = 0; ii < shift; ii++)
+      spec->high_counts += spec->hist[spec->high_entry
+                                      - spec->low_entry - shift + ii];
+                                      
+    MEMMOVE(&spec->hist[shift], spec->hist,
+            (spec->high_entry - spec->low_entry - shift + 1),
+            sizeof(int));
+    for (ii = 0; ii < shift; ii++)
+      spec->hist[ii] = 0;
+  }
+  else if (shift < 0)
+  {
+    if (shift < (spec->low_entry - spec->high_entry))
+      SERVICE_ERROR(UNEXPECTED_DATA_ERROR); /* TODO: find a new error code */
+    for (ii = 0; ii < -shift; ii++)
+      spec->low_counts += spec->hist[ii];
+      
+    MEMMOVE(spec->hist, spec->hist - shift,
+            (spec->high_entry - spec->low_entry + shift + 1),
+            sizeof(int));
+    for (ii = shift; ii < 0; ii++)
+      spec->hist[ii + spec->high_entry - spec->low_entry + 1] = 0;
+  }
+  return;
+}
+#endif
+
+void clear_mean_counts(spect_dist_info *spec)
+{
+  ASSERT(spec);
+  spec->mean_count = 0;
+  spec->count = 0;
+  spec->running_total = 0;
+  spec->running_total_devn = 0;
+  return;
+}
+
+void shift_parameters(spect_dist_info *spec, int shift)
+{
+  ASSERT(spec);
+  spec->mean += shift;
+#if USE_MEDIAN
+  spec->median += shift;
+  spec->sv6 += shift;
+#endif
+  return;
+}
diff --git a/srec/clib/srec_arb.c b/srec/clib/srec_arb.c
new file mode 100644
index 0000000..246d722
--- /dev/null
+++ b/srec/clib/srec_arb.c
@@ -0,0 +1,474 @@
+/*---------------------------------------------------------------------------*
+ *  srec_arb.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "pstdio.h"
+#include "passert.h"
+#include "portable.h"
+
+#include<string.h>
+
+#include"portable.h"
+
+#include"sizes.h"
+#include"hmm_desc.h"
+#include"search_network.h"     /* for EPSILON_OFFSET */
+#include"srec_arb.h"
+
+#define DEBUG_PRONS       0
+#define IF_DEBUG_PRONS(X)
+
+static const char *rcsid = 0 ? (const char *) &rcsid :
+"$Id: srec_arb.c,v 1.27.4.15 2007/12/14 22:03:51 dahan Exp $";
+
+int question_check(srec_question* quest, phonemeID lphon, phonemeID cphon, phonemeID rphon)
+{
+  asr_int16_t a = 0, b = 0;
+  /* phon = a*16+b */
+  if (quest->qtype == QUESTION_LEFT)
+  {
+    BIT_ADDRESS(lphon, a, b);
+  }
+#if USE_WWTRIPHONE
+  else if(quest->qtype == QUESTION_WBLEFT) {
+    if( lphon == WBPHONEME_CODE) return ANSWER_PASS;
+    else return ANSWER_FAIL;
+  }
+  else if(quest->qtype == QUESTION_WBRIGHT) {
+    if( rphon == WBPHONEME_CODE) return ANSWER_PASS;
+    else return ANSWER_FAIL;
+  }
+#endif
+  else
+  {
+    ASSERT(quest->qtype == QUESTION_RIGHT);
+    BIT_ADDRESS(rphon, a, b);
+  }
+  return (quest->membership_bits[a] & b ? ANSWER_PASS : ANSWER_FAIL);
+}
+
+/* get model id for phoneme in context */
+int get_modelid_for_pic(srec_arbdata* allotree, phonemeID lphon, phonemeID cphon, phonemeID rphon)
+{
+  int ans;
+  tree_node* tnode = allotree->pdata[cphon].model_nodes;
+  while (tnode->node.quest_index >= 0)
+  {
+    ans = question_check(&allotree->questions[tnode->node.quest_index],
+                         lphon, cphon, rphon);
+    tnode = (ans == ANSWER_FAIL ? (tree_node*)tnode->node.fail : (tree_node*)tnode->node.pass);
+  }
+  return tnode->term.pelid;
+}
+
+void read_questions(srec_question** pquestions, asr_int16_t num_questions, char **buffer, PFile *fp)
+{
+  srec_question *q;
+
+  q = *pquestions = (srec_question*)(*buffer);
+
+  *buffer += num_questions * sizeof(srec_question);
+  while (num_questions-- > 0)
+  {
+    pfread(&(q->qtype), sizeof(asr_uint16_t), 1, fp);
+    pfread(&(q->membership_bits), sizeof(asr_uint16_t), PSET_BIT_ARRAY_SIZE, fp);
+    q++;
+  }
+}
+
+/* we need to handle the interword silence here somehow,
+   proposal:  we create one supermodel which combines the
+   the model preceding silence and that follows silence, so
+   "boston&mass" .. we'll have "n&m" as a single "supermodel",
+   we'll put that supermodel in the graph but then overlay the
+   actual models there on.   the overlay only needs to be done
+   once.  The number of possible supermodels is 113655 which is
+   larger than what an ilabel can hold, the solution to that is
+   to encode also on the "cost" of the supermodel arc.
+
+   /------SUPER(a&b)---\
+   o----a1---o----b1----o
+   \--a2--o--#--o--b2--/
+
+   cost is 16bits, ilabel is 16bits
+   on ilabel we encode the a1,(a2-a1)
+   on cost we encode b1,(b2-b1)
+   ... a1,b1 use 9 bits (400 models)
+   ... deltas use 6 bits (+/-31 range)
+   That leaves 1 bit left over, which is the top bit to signal this encoding,
+   and make sure the cost is very high.
+*/
+
+
+int get_modelids_for_pron(srec_arbdata* allotree,
+                          const char* phonemes, int num_phonemes,
+                          modelID* acoustic_model_ids)
+{
+  int i;
+  modelID modelid;
+  phonemeID lphon, cphon, rphon;
+
+  if( allotree == NULL) 
+	  return 1;
+
+  if (num_phonemes == 0)
+    return 0;
+
+  IF_DEBUG_PRONS(printf("%s get_modelids_for_pron pronunciation %s\n", __FILE__, (char*)phonemes));
+
+#if !USE_WWTRIPHONE
+  lphon = (phonemeID)allotree->phoneme_index[ SILENCE_CODE];
+  cphon = (phonemeID)allotree->phoneme_index[ (unsigned)phonemes[0]];
+#else
+  lphon = WBPHONEME_CODE; //(phonemeID)allotree->phoneme_index[ WBPHONEME_CODE];
+  cphon = (phonemeID)allotree->phoneme_index[ (unsigned)phonemes[0]];
+#endif
+  if(cphon == MAXphonemeID)
+    return 1; /* bad phoneme */
+  for(i=0; i<num_phonemes; i++) {
+#if !USE_WWTRIPHONE
+    rphon = (i==num_phonemes-1 ? 
+	     (phonemeID)allotree->phoneme_index[ SILENCE_CODE] :
+	     (phonemeID)allotree->phoneme_index[ (unsigned)phonemes[i+1] ] ) ;
+#else
+    rphon = (i==num_phonemes-1 ? 
+	     WBPHONEME_CODE /*(phonemeID)allotree->phoneme_index[ WBPHONEME_CODE] */ :
+	     (phonemeID)allotree->phoneme_index[ (unsigned)phonemes[i+1] ] ) ;
+#endif
+    if (rphon == MAXphonemeID)
+      return 1; /* bad phoneme */
+
+    modelid = (modelID) get_modelid_for_pic(allotree, lphon, cphon, rphon);
+    acoustic_model_ids[i] = modelid;
+#if DEBUG_PRONS
+    printf("%c%c%c hmm%d states", allotree->pdata[lphon].code,
+           allotree->pdata[cphon].code, allotree->pdata[rphon].code,
+           acoustic_model_ids[i]);
+    for (j = 0; j < allotree->hmm_infos[modelid].num_states; j++)
+      printf(" %d", allotree->hmm_infos[modelid].state_indices[j]);
+    printf("\n");
+#endif
+    lphon = cphon;
+    cphon = rphon;
+  }
+  return 0;
+}
+
+/*-----------------------------------------------------------------------*
+ *                                                                       *
+ * phoneme data stream functions                                         *
+ *                                                                       *
+ *-----------------------------------------------------------------------*/
+
+tree_node* read_tree_node_f(char **buffer, PFile *fp)
+{
+  tree_node* tnode = (tree_node*) * buffer;
+  pfread(&(tnode->node.quest_index), sizeof(asr_int16_t), 1, fp);
+  pfread(&(tnode->term.pelid), sizeof(asr_int16_t), 1, fp);
+  pfread(&(tnode->node.fail), sizeof(tree_branch_info*), 1, fp);
+  pfread(&(tnode->node.pass), sizeof(tree_branch_info*), 1, fp);
+
+  /* because tree_node is a union, the actual size maybe large than we have read */
+  ASSERT(sizeof(asr_int16_t)*2 + sizeof(tree_branch_info *)*2 == sizeof(tree_node));
+
+  *buffer += sizeof(tree_node);
+  if (tnode->node.quest_index >= 0)
+  {
+    tnode->node.fail = (struct tree_branch_info*)read_tree_node_f(buffer, fp);
+    tnode->node.pass = (struct tree_branch_info*)read_tree_node_f(buffer, fp);
+  }
+  return tnode;
+}
+
+void read_phoneme_data(phoneme_data** pdata, asr_int16_t num_phonemes, char **buffer,  PFile *fp)
+{
+  int i, ptr;
+  phoneme_data *pd;
+
+  pd = *pdata = (phoneme_data*)(*buffer);
+
+  for (i = 0; i < num_phonemes; i++)
+  {
+    pfread(&(pd->name), sizeof(char), MAX_PHONEME_NAME_LEN, fp);
+    pfread(&(pd->code), sizeof(asr_uint16_t), 1, fp);
+    pfread(&ptr, sizeof(asr_int16_t), 1, fp);
+    pfread(&(pd->model_nodes), sizeof(tree_node *), 1, fp);
+    pfread(&(pd->num_states), sizeof(asr_uint16_t), 1, fp);
+    pfread(&ptr, sizeof(asr_int16_t), 1, fp);
+    pfread(&(pd->state_nodes), sizeof(tree_node *), MAX_PHONE_STATES, fp);
+    pd++;
+  }
+  ASSERT(sizeof(phoneme_data) == MAX_PHONEME_NAME_LEN + sizeof(asr_int16_t)*4 + sizeof(tree_node *)*(1 + MAX_PHONE_STATES));
+  (*buffer) += num_phonemes * sizeof(phoneme_data) / BYTES_PER_ATOM;
+  ASSERT((char *)pd == *buffer);
+
+  for (i = 0; i < num_phonemes; i++)
+  {
+#if STATE_NODES_NEEDED_AT_RUNTIME
+    for (j = 0; j < (*pdata)[i].num_states; j++)
+      (*pdata)[i].state_nodes[j] = read_tree_node_f(buffer);
+#endif
+    (*pdata)[i].model_nodes = read_tree_node_f(buffer, fp);
+  }
+}
+
+/*-----------------------------------------------------------------------*
+ *                                                                       *
+ * hmm info stream functions                                             *
+ *                                                                       *
+ *-----------------------------------------------------------------------*/
+
+void read_hmminfos(srec_arbdata* allotree, char** buffer, PFile *fp)
+{
+  int i, offset, num_atoms, num_hmms = allotree->num_hmms, ptr;
+  HMMInfo* hmm_infos;
+  hmm_infos = (HMMInfo*) * buffer;
+  num_atoms = sizeof(HMMInfo) * num_hmms / BYTES_PER_ATOM;
+  (*buffer) += num_atoms;
+  for (i = 0; i < num_hmms; i++)
+  {
+    pfread(&hmm_infos[i].name[0], sizeof(char), MAX_PHONEME_NAME_LEN, fp);
+    pfread(&(hmm_infos[i].num_states), sizeof(asr_int16_t), 1, fp);
+    pfread(&ptr, sizeof(asr_int16_t), 1, fp);
+    pfread(&(hmm_infos[i].state_indices), sizeof(asr_int16_t*), 1, fp);
+  }
+
+  /* through this and comments below, I was trying to keep the state_indices
+     self-contained, to calculate offsets from saved pointers, but it doesn't
+     appear to work;  so we resort to recovering state offsets from num_states
+     state_indices = hmm_infos[0].state_indices; */
+  pfread(*buffer, sizeof(asr_int16_t), allotree->num_states, fp);
+
+  hmm_infos[0].state_indices = (asr_int16_t*) * buffer;
+  num_atoms = sizeof(hmm_infos[0].state_indices[0]) * allotree->num_states / BYTES_PER_ATOM;
+  (*buffer) += num_atoms;
+
+  for (i = 0, offset = 0; i < num_hmms; i++)
+  {
+    /* int j,offset2 = hmm_infos[i].state_indices - state_indices; */
+    hmm_infos[i].state_indices = hmm_infos[0].state_indices + offset;
+    if (i >= HMM_COUNTER_OFFSET + NUM_SILENCE_HMMS - 1)
+      offset += hmm_infos[i].num_states;
+    /* printf("offset %d %d offset2 %d\n", i, offset, offset2);
+       printf("hmm %d %x states", i, hmm_infos[i].state_indices);
+       for(j=0; j<hmm_infos[i].num_states; j++)
+       printf(" %d", hmm_infos[i].state_indices[j]);
+       printf("\n"); */
+
+  }
+  allotree->hmm_infos = hmm_infos;
+}
+
+/*-----------------------------------------------------------------------*
+ *                                                                       *
+ * top level stream functions                                            *
+ *                                                                       *
+ *-----------------------------------------------------------------------*/
+
+int read_arbdata_from_stream(srec_arbdata** pallotree, char* filename, int buffer_size)
+{
+  char* pbuf;
+  srec_arbdata* allotree;
+  int ptr;
+
+  PFile* fp;
+  long fpos;
+  char* buffer;
+
+  fp = file_must_open(NULL, (char*)filename, L("rb"), ESR_TRUE);
+  if(!fp) {
+    *pallotree = NULL;
+    return 0;
+  }
+  pfseek(fp, 0, SEEK_END);
+  fpos = pftell(fp);
+  buffer = (char*)CALLOC_CLR(fpos, sizeof(char), "srec.arbdata");
+  pfseek(fp, 0, SEEK_SET);
+
+  buffer_size = fpos;
+  pbuf = buffer;
+
+  allotree = (srec_arbdata*)buffer;
+  /* ASSERT(allotree->image_size == buffer_size); hack for now */
+
+  /* read structure arbdata from file */
+  pfread(&allotree->image, sizeof(char *), 1, fp);             /* image */
+  pfread(&allotree->image_size, sizeof(asr_uint16_t), 1, fp);       /* image_szie */
+  pfread(&allotree->num_phonemes, sizeof(asr_int16_t), 1, fp);      /* num_phonemes */
+  pfread(&allotree->pdata, sizeof(phoneme_data *), 1, fp);     /* pdate */
+  pfread(&allotree->num_questions, sizeof(asr_int16_t), 1, fp);     /* num_questions */
+
+  pfread(&ptr, sizeof(asr_int16_t), 1, fp);     /* alignment problem */
+
+  pfread(&allotree->questions, sizeof(srec_question *), 1, fp);/* questions */
+  pfread(&allotree->num_states, sizeof(asr_int16_t), 1, fp);        /* num_states */
+  pfread(&allotree->num_hmms, sizeof(asr_int16_t), 1, fp);          /* num_hmms */
+  pfread(&allotree->hmm_infos, sizeof(HMMInfo *), 1, fp);      /* hmm_infos */
+  pfread(allotree->phoneme_index, sizeof(asr_uint16_t), NUM_PHONEME_INDICES, fp); /* phoneme_index */
+
+  allotree->image = buffer;
+
+  pbuf += sizeof(*allotree) / BYTES_PER_ATOM;
+  pbuf -= sizeof(void*); // PCPinfo
+
+  ASSERT(pftell(fp) == pbuf - buffer);
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("read allotree done %d\n", (int)(pbuf - buffer));
+#endif
+
+  allotree->questions = (srec_question *)pbuf;
+  read_questions(&allotree->questions, allotree->num_questions, &pbuf, fp);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("read_questions done %d\n", (int)(pbuf - buffer));
+#endif
+  ASSERT(pftell(fp) == pbuf - buffer);
+
+  /* readme phoneme_data */
+  read_phoneme_data(&allotree->pdata, allotree->num_phonemes, &pbuf, fp);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("read_phoneme_data done %d\n", (int)(pbuf - buffer));
+#endif
+  ASSERT(pftell(fp) == pbuf - buffer);
+
+  read_hmminfos(allotree, &pbuf, fp);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("read_hmminfos done %d\n", (int)(pbuf - buffer));
+#endif
+  ASSERT(pftell(fp) == pbuf - buffer);
+
+  *pallotree = allotree;
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("read arbdata image size %d\n", allotree->image_size);
+#endif
+  ASSERT(pbuf - buffer == buffer_size);
+
+  pfclose(fp);
+
+  return 0;
+}
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  unsigned short nnodes;
+  unsigned long  size;
+  long    phoneme;
+  unsigned short node_pos;
+  unsigned long  node_off;
+  short    low_genone_no;
+  short    high_genone_no;
+  short    low_pel_no;
+  short    high_pel_no;
+}
+tree_head;
+
+static int traverse_tree(tree_node* node, tree_head *tree_topo, int *num_terminal_nodes)
+{
+  if (!node) return 0; /* should not happen */
+  if (!tree_topo) return 0; /* should not happen */
+  if (tree_topo->nnodes > 255)
+    return 0; /* should not happen, might indicate infinite looping */
+
+  tree_topo->nnodes++;
+
+  if (node->node.quest_index < 0)
+  {
+    if (num_terminal_nodes)
+    {
+      (*num_terminal_nodes)++;
+    }
+    if (node->term.pelid < tree_topo->low_pel_no)
+    {
+      tree_topo->low_pel_no = node->term.pelid;
+      tree_topo->low_genone_no = node->term.pelid;
+    }
+    if (node->term.pelid > tree_topo->high_pel_no)
+    {
+      tree_topo->high_pel_no = node->term.pelid;
+      tree_topo->high_genone_no = node->term.pelid;
+    }
+  }
+  else
+  {
+    traverse_tree((tree_node*)node->node.fail, tree_topo, num_terminal_nodes);
+    traverse_tree((tree_node*)node->node.pass, tree_topo, num_terminal_nodes);
+  }
+  return 0;
+
+}
+
+#if 0
+static int num_nodes_in_tree(tree_node* node, int *num_terminal_nodes)
+{
+  tree_head topo;
+  *num_terminal_nodes = 0;
+  topo.nnodes = 0;
+  traverse_tree(node, &topo, num_terminal_nodes);
+  return topo.nnodes;
+}
+#endif
+
+static unsigned int version_arbdata_add(unsigned int ics, int data)
+{
+  unsigned int ocs = ((ics << 3) | (ics >> 29)) + data;
+  /* if(debug)printf("ocs %d ics %d data %d\n", ocs, ics, data);*/
+  return ocs;
+}
+
+
+unsigned int version_arbdata_models(srec_arbdata* a)
+{
+  static unsigned int last_arbdata_modelid = 0;
+  static srec_arbdata*     last_arbdata;
+  int i, num_hmms_in_phoneme;
+
+  tree_head topo;
+  unsigned int checksum = 0;
+
+  if (a == last_arbdata)
+  {
+    checksum = last_arbdata_modelid;
+  }
+  else
+  {
+    /* if(debug)printf("num_hmms %d\n", a->num_hmms); */
+    /* if(debug)printf("num_phonemes %d\n", a->num_phonemes); */
+    for (i = 0; i < a->num_phonemes; i++)
+    {
+      num_hmms_in_phoneme = 0;
+      topo.low_pel_no  = 32567;
+      topo.high_pel_no = 0;
+      topo.nnodes = 0;
+      traverse_tree(a->pdata[i].model_nodes, &topo, &num_hmms_in_phoneme);
+      /* if(debug)printf("phoneme %d num_hmms %d (%d-%d)\n", i, num_hmms_in_phoneme,
+      topo.low_pel_no, topo.high_pel_no); */
+      if (topo.nnodes == 256) return(checksum = 0);
+      checksum = version_arbdata_add(checksum,  topo.low_pel_no);
+    }
+    last_arbdata_modelid = checksum;
+    last_arbdata         = a;
+  }
+  return checksum;
+}
+
+
+
+
diff --git a/srec/clib/swicms.c b/srec/clib/swicms.c
new file mode 100644
index 0000000..b1adc0b
--- /dev/null
+++ b/srec/clib/swicms.c
@@ -0,0 +1,692 @@
+/*---------------------------------------------------------------------------*
+ *  swicms.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <string.h>
+#include"swicms.h"
+#include"srec_sizes.h"
+#include"prelib.h"
+
+#include "passert.h"
+#include "ESR_Session.h"
+#include "ESR_SessionType.h"
+#include "IntArrayList.h"
+#include "portable.h"
+
+#define printf_vector(HEAD, FMT, PTR, NN) { int i; LCHAR buffer[256]; sprintf(buffer, HEAD); sprintf(buffer + LSTRLEN(buffer), " %x", (int)PTR); for (i=0; i<(NN); ++i) sprintf(buffer + LSTRLEN(buffer), FMT, PTR[i]); PLogMessage(buffer); }
+
+/* Cross-utterance CMN calculation:
+   We try to normalize the speech frames before they get to the recognizer.
+   The speech frames are LDA-processed mfcc-with-dynamic feature vectors.
+   We collect these speech frames during recognition. At the end of
+   recognition we exclude the silence frames from the collected data, and 
+   generate a new channel average based on the previous average and the new
+   data, using an exponential decay formula.  
+
+   In-utterance CMN calculation:
+   A new short-term average mechanism was introduced, with faster update,
+   to improve recognition on the very first recognition after init or reset.
+   We wait for a minimum number of new data frames to apply this. We also 
+   disable the fast updater after some frames, because we assume the 
+   cross-utterance estimator to be more reliable, particularly in its 
+   ability to exclude silence frames from the calculation.
+*/
+
+/* default settings for cross-utterance cms */
+#define SWICMS_FORGET_FACTOR_DEFAULT        400 /* effective frms of history */
+#define SWICMS_SBINDEX_DEFAULT              100 /* use speech frames only */
+/* #define SWICMS_CACHE_RESOLUTION_DEFAULT  see swicms.h */
+/* #define SWICMS_CACHE_SIZE_DEFAULT        see swicms.h */
+
+/* default settings for in-utterance cms */
+#define SWICMS_INUTT_FORGET_FACTOR2_DISABLE 65535 /* any large number */
+#define SWICMS_INUTT_FORGET_FACTOR2_DEFAULT SWICMS_INUTT_FORGET_FACTOR2_DISABLE
+/* disable this when cross-utt become more reliable */
+#define SWICMS_INUTT_DISABLE_AFTER_FRAMES   200 
+/* wait while the estimate is poor */
+#define SWICMS_INUTT_ENABLE_AFTER_FRAMES    10  
+
+/**
+ * Logging Stuff
+ */
+#define LOG_LEVEL 2
+#define MODULE_NAME L("swicms.c")
+//static const char* MTAG = MODULE_NAME;
+
+static const char *rcsid = 0 ? (const char *) &rcsid :
+                           "$Id: swicms.c,v 1.21.6.16 2008/06/05 19:00:55 stever Exp $";
+
+static ESR_BOOL SWICMS_DEBUG = ESR_FALSE;
+#define INT_STRING_MAX			11	/* 10 digits plus - sign */
+/* Delim per int string */
+#define CHAN_NORM_PARAMS_STRING_MAX	( MAX_CHAN_DIM * ( INT_STRING_MAX+1) )
+
+static char chan_norm_params [CHAN_NORM_PARAMS_STRING_MAX];
+
+/* these are good values from cmn/tmn files */
+static imeldata gswicms_cmn1_8 [MAX_CHAN_DIM] =
+  {
+    158, 141,  99, 125, 101, 162, 113, 138, 128, 143, 123, 141,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127
+  };
+
+static imeldata gswicms_cmn1_11 [MAX_CHAN_DIM] =
+  {
+    163, 121, 120, 114, 124, 139, 144, 108, 150, 119, 146, 124,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127
+  };
+
+static imeldata gswicms_tmn1_8 [MAX_CHAN_DIM] =
+  {
+    108, 138, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127
+  };
+
+static imeldata gswicms_tmn1_11 [MAX_CHAN_DIM] =
+  {
+    108, 138, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127
+  };
+
+static ESR_ReturnCode GetSomeIntsIfAny( const LCHAR* parname, imeldata* parvalue, size_t reqSize)
+{
+  size_t i, size;
+  ESR_ReturnCode rc;
+  ESR_BOOL exists;
+  IntArrayList* intList = 0;
+  
+  CHKLOG(rc, ESR_SessionContains(parname, &exists));
+  if (exists) {
+    rc = ESR_SessionGetProperty(parname, (void**)&intList, TYPES_INTARRAYLIST);
+    if (rc != ESR_SUCCESS && rc != ESR_NO_MATCH_ERROR) {
+      /* no match will revert to default data already in static array */
+      PLogError(L("Error reading %s from session: %s"), parname, ESR_rc2str(rc));
+      return ESR_FATAL_ERROR;
+    }
+    else if (rc == ESR_SUCCESS) {
+      CHKLOG(rc, IntArrayListGetSize(intList, &size));
+      if(size != reqSize) {
+	PLogError(L("Error reading %s from session, expected len %d: %s"), parname, reqSize, ESR_rc2str(rc));
+	return ESR_FATAL_ERROR;
+      } 
+      if(reqSize == 1)
+	CHKLOG(rc, IntArrayListGet(intList, 0, parvalue));
+      else {
+	for (i=0; i<size; ++i)
+	  CHKLOG(rc, IntArrayListGet(intList, i, &parvalue[i]));
+      }
+    }
+  }
+  return ESR_SUCCESS;
+ CLEANUP:
+  return rc;
+}
+
+int swicms_init(swicms_norm_info* swicms)
+{
+  ESR_ReturnCode    rc = ESR_SUCCESS;
+  size_t            i;
+  ESR_BOOL          exists, sessionExists;
+  size_t 	    sample_rate;
+
+  /* defaults */
+  swicms->sbindex          = SWICMS_SBINDEX_DEFAULT;
+  swicms->cached_num_frames = 0;
+  swicms->forget_factor    = SWICMS_FORGET_FACTOR_DEFAULT;
+  swicms->cache_resolution = SWICMS_CACHE_RESOLUTION_DEFAULT;
+  swicms->num_frames_in_cmn = 0;
+
+  CHKLOG(rc, ESR_SessionExists(&sessionExists));
+
+  if (sessionExists) 
+  {  /* We'll assume this rate is valid or someone else will be complaining.   SteveR */
+    rc = ESR_SessionGetSize_t ( L ( "CREC.Frontend.samplerate" ), &sample_rate );
+
+    if ( rc != ESR_SUCCESS )
+      return ( rc );
+  }
+  else
+    sample_rate = 11025;
+
+  /* init the data structures by copying the static data so that we can have a copy if we need to reset */
+  if ( sample_rate == 8000 )
+  {
+    for ( i = 0; i < MAX_CHAN_DIM; i++ )
+    {
+      swicms->cmn [i] = gswicms_cmn1_8 [i];
+      swicms->tmn [i] = gswicms_tmn1_8 [i];
+// _lda_*mn below are OK, but are recalculated in swicms_lda_process()
+      swicms->lda_cmn [i] = 0; /* calculated by swicms_lda_process() */
+      swicms->lda_tmn [i] = 0; /* calculated by swicms_lda_process() */
+    }
+  }
+  else
+  {
+    for ( i = 0; i < MAX_CHAN_DIM; i++ )
+    {
+      swicms->cmn [i] = gswicms_cmn1_11 [i];
+      swicms->tmn [i] = gswicms_tmn1_11 [i];
+// _lda_*mn below are OK, but are recalculated in swicms_lda_process()
+      swicms->lda_cmn [i] = 0; /* calculated by swicms_lda_process() */
+      swicms->lda_tmn [i] = 0; /* calculated by swicms_lda_process() */
+    }
+  }
+  CHKLOG(rc, ESR_SessionExists(&sessionExists));
+
+  if (sessionExists) 
+  {
+    const LCHAR* parname = L("CREC.Frontend.swicms.debug");
+    CHKLOG(rc, ESR_SessionContains(parname, &exists));
+    if (exists) {
+      rc = ESR_SessionGetBool(parname, &SWICMS_DEBUG);
+      if (rc != ESR_SUCCESS && rc != ESR_NO_MATCH_ERROR) {
+        PLOG_DBG_ERROR((L("Error reading %s from session: %s"), parname, ESR_rc2str(rc)));
+        return rc;
+      }
+    }
+    
+    rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.forget_factor"), 
+			   &swicms->forget_factor, 1);
+    if(rc != ESR_SUCCESS) return rc;
+    
+    rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.sbindex"), 
+			   &swicms->sbindex, 1);
+    if(rc != ESR_SUCCESS) return rc;
+    
+    rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn"), 
+			   &swicms->cmn[0], MAX_CHAN_DIM);
+    if(rc != ESR_SUCCESS) return rc;
+    
+    if ( sample_rate == 8000 )
+    {
+      rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn8"), &swicms->cmn[0], MAX_CHAN_DIM);
+
+      if(rc != ESR_SUCCESS)
+        return rc;
+    }
+    else
+    {
+      rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn11"), &swicms->cmn[0], MAX_CHAN_DIM);
+
+      if(rc != ESR_SUCCESS)
+        return rc;
+    }
+
+    rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.tmn"), 
+			   &swicms->tmn[0], MAX_CHAN_DIM);
+    if(rc != ESR_SUCCESS) return rc;
+  }
+  
+  swicms->is_valid = 0;
+  for (i = 0; i < MAX_CHAN_DIM; i++)
+    swicms->adjust[i] = 255;
+  
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("swicms->forget_factor    = %d\n", swicms->forget_factor);
+  PLogMessage("swicms->cache_resolution = %d\n", swicms->cache_resolution);
+  PLogMessage("swicms->sbindex          = %d\n", swicms->sbindex);
+#endif
+  
+  /* in-utt cms parameters */
+  swicms->inutt.forget_factor2 = SWICMS_INUTT_FORGET_FACTOR2_DEFAULT; 
+  swicms->inutt.disable_after  = 200;   
+  swicms->inutt.enable_after   = 10;    /* in-utt is less reliable       */
+  swicms->inutt.num_bou_frames_to_skip = 20; /* silence frames! see windback */
+  swicms->inutt.num_frames_since_bou = 0; 
+  swicms->inutt.num_frames_in_accum = 0;
+  for(i=0; i<MAX_CHAN_DIM; i++) swicms->inutt.accum[i] = 0;
+
+  if (sessionExists) {
+    rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.forget_factor2"), 
+			  &swicms->inutt.forget_factor2, 1);
+    if(rc != ESR_SUCCESS) return rc;
+    
+    rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.disable_after"), 
+			  &swicms->inutt.disable_after, 1);
+    if(rc != ESR_SUCCESS) return rc;
+    
+    rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.enable_after"), 
+			  &swicms->inutt.enable_after, 1);
+    if(rc != ESR_SUCCESS) return rc;
+    
+    /* we need to estimate the in-utt cmn from speech frames only! so let's
+       make sure to skip some frames before collecting data, */
+    ESR_SessionContains(L("CREC.Frontend.start_windback"), &exists);
+    if (exists) {
+      ESR_BOOL do_skip_even_frames = ESR_TRUE;
+      ESR_SessionGetBool(L("CREC.Frontend.do_skip_even_frames"), &do_skip_even_frames);
+      ESR_SessionGetInt(L("CREC.Frontend.start_windback"), &swicms->inutt.num_bou_frames_to_skip);
+      if( do_skip_even_frames) 
+	swicms->inutt.num_bou_frames_to_skip /= 2;
+      swicms->inutt.num_bou_frames_to_skip -= 5; /* ensure spch frames only */
+    }
+  }
+
+  return 0;
+ CLEANUP:
+  return rc;
+}
+
+
+ESR_ReturnCode swicms_get_cmn ( swicms_norm_info* swicms, const char **cmn_params )
+{
+  ESR_ReturnCode    get_status;
+  int               dim_count;
+  int               current_params_position;
+  int               bytes_printed;
+  imeldata          temp[MAX_CHAN_DIM];
+
+  get_status = ESR_SUCCESS;
+
+  if (  swicms->_prep != NULL )	/* lda exists give them transformed lda. */
+  {
+    for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ )
+      temp [dim_count] = swicms->lda_cmn [dim_count];
+    inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/);
+  }
+  else	/* lda does not exist give them raw cmn values */
+  {
+    for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ )
+      temp [dim_count] = swicms->cmn [dim_count];
+  }
+  current_params_position = 0;
+  
+  for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ )
+  {
+    if ( dim_count < ( MAX_CHAN_DIM - 1 ) )
+      bytes_printed = sprintf ( chan_norm_params + current_params_position, "%d,", temp [dim_count] );
+    else
+      bytes_printed = sprintf ( chan_norm_params + current_params_position, "%d", temp [dim_count] );
+    current_params_position += bytes_printed;
+  }
+  *cmn_params = chan_norm_params;
+
+  return ( get_status );
+}
+
+
+ESR_ReturnCode swicms_set_cmn ( swicms_norm_info* swicms, const char *cmn_params )
+{
+  ESR_ReturnCode    set_status;
+  int               length_of_params;
+  int               dim_count;
+  int               got_word;
+  int               current_position;
+  char              *copy_of_params;
+  char              *parsed_strings [MAX_CHAN_DIM];
+  int               temp_cmn [MAX_CHAN_DIM];
+
+  length_of_params = strlen ( cmn_params ) + 1;
+  copy_of_params = (char*)MALLOC ( length_of_params, NULL );
+
+  if ( copy_of_params != NULL )
+  {
+    set_status = ESR_SUCCESS;
+    memcpy ( copy_of_params, cmn_params, length_of_params );
+    dim_count = 0;
+    current_position = 0;
+    got_word = 0;
+    parsed_strings [dim_count] = copy_of_params + current_position;
+
+    while ( ( dim_count < MAX_CHAN_DIM ) && ( set_status == ESR_SUCCESS ) )
+    {
+      switch ( *( copy_of_params + current_position ) )
+      {
+        case '\0':
+          if ( got_word == 1 )
+          {
+            if ( dim_count == ( MAX_CHAN_DIM - 1 ) )
+              dim_count++;
+            else
+            {
+              PLogError ( "Channel Normalization : Missing Params Must Contain %d Params\n", MAX_CHAN_DIM );
+              set_status = ESR_INVALID_ARGUMENT;
+            }
+          }
+          else
+          {
+            PLogError ( "Channel Normalization : Missing Params Mus Contain %d Params\n", MAX_CHAN_DIM );
+            set_status = ESR_INVALID_ARGUMENT;
+          }
+          break;
+ 
+        case ',':
+          if ( got_word == 1 )
+          {
+            if ( dim_count < ( MAX_CHAN_DIM - 1 ) )
+            {
+              dim_count++;
+              *( copy_of_params + current_position) = '\0';
+              current_position++;
+
+              if ( current_position == length_of_params )
+              {
+                PLogError ( "Channel Normalization : Delimiter At End Of Param String\n" );
+                set_status = ESR_INVALID_ARGUMENT;
+              }
+              parsed_strings [dim_count] = copy_of_params + current_position;
+              got_word = 0;
+            } 
+            else
+            {
+              PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM );
+              set_status = ESR_INVALID_ARGUMENT;
+            }
+          }
+          else
+          {
+            PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM );
+            set_status = ESR_INVALID_ARGUMENT;
+          }
+          break;
+
+        case '0':
+        case '1':
+        case '2':
+        case '3':
+        case '4':
+        case '5':
+        case '6':
+        case '7':
+        case '8':
+        case '9':
+          got_word = 1;
+          current_position++;
+
+          if ( current_position == length_of_params )
+          {
+            PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM );
+            set_status = ESR_INVALID_ARGUMENT;
+          }
+          break;
+
+        default:
+          PLogError ( "Channel Normalization : Invalid Param : %c : Params Must Contain Only Digits\n" );
+          set_status = ESR_INVALID_ARGUMENT;
+          break;
+      }
+    }
+    if ( set_status == ESR_SUCCESS )
+    {
+      dim_count = 0;
+
+      while ( ( dim_count < MAX_CHAN_DIM ) && (  set_status == ESR_SUCCESS ) )
+      {
+        temp_cmn [dim_count] = atoi ( parsed_strings [dim_count] );
+
+        if ( ( temp_cmn [dim_count] < 0 ) || ( temp_cmn [dim_count] > 255 ) )
+        {
+          set_status = ESR_INVALID_ARGUMENT;
+        }
+      }
+      if ( set_status == ESR_SUCCESS )
+      {
+        for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ )
+          swicms->cmn [dim_count] = temp_cmn [dim_count];
+        if ( swicms->_prep != NULL )	/* Set now if NULL it will automatically be set on first utterance */
+          linear_transform_frame(swicms->_prep, swicms->lda_cmn, 1 /*do_shift*/);
+      }
+    }
+    FREE ( copy_of_params );
+  }
+  else
+  {
+    PLogError ( "Channel Normalization Out Of Memory Error\n" );
+    set_status = ESR_OUT_OF_MEMORY;
+  }
+  swicms->num_frames_in_cmn = 0;
+  return ( set_status );
+}
+
+
+int swicms_cache_frame(swicms_norm_info* swicms, imeldata* frame, int dimen)
+{
+  int i;
+  imeldata *pcache, *pframe;
+
+  ASSERT(dimen == MAX_CHAN_DIM);
+  i = swicms->cached_num_frames / swicms->cache_resolution;
+  if (i < SWICMS_CACHE_SIZE_DEFAULT)
+  {
+    pcache = swicms->cached_sections[ i];
+    if (swicms->cached_num_frames % swicms->cache_resolution == 0)
+    {
+      for (i = 0; i < MAX_CHAN_DIM; i++) *pcache++ = 0;
+      pcache -= MAX_CHAN_DIM;
+    }
+    pframe = frame;
+    for (i = 0; i < MAX_CHAN_DIM; i++) *pcache++ += *pframe++;
+    swicms->cached_num_frames++;
+  }
+
+  return 0;
+}
+
+int apply_channel_normalization_in_swicms(swicms_norm_info *swicms,
+    imeldata* oframe,
+    imeldata* iframe, int dimen)
+{
+  int ii;
+  ASSERT(dimen == MAX_CHAN_DIM);
+  
+  /* IF inutt is activated at all */
+  if(swicms->inutt.forget_factor2 != SWICMS_INUTT_FORGET_FACTOR2_DISABLE) {
+    /* AND IF we have not disabled it (due to x-utt more reliable) */
+    if(swicms->inutt.num_frames_in_accum < swicms->inutt.disable_after) {
+      /* AND IF we have skipped past the silence frames */
+      if( swicms->inutt.num_frames_since_bou >= swicms->inutt.num_bou_frames_to_skip){
+	swicms->inutt.num_frames_in_accum++;
+	for(ii=0;ii<dimen;ii++) swicms->inutt.accum[ii] += iframe[ii];
+	/* AND IF we've already seen at least 10 frames (presumably) of speech */
+	if(swicms->inutt.num_frames_in_accum>swicms->inutt.enable_after) { 
+	  /* THEN we update the adjustment in-line with the current utterance! */
+	  for(ii=0;ii<dimen;ii++) {
+	    imeldata denom = ( swicms->inutt.forget_factor2
+			       + swicms->inutt.num_frames_in_accum );
+	    /* tmp: weighted average of the old lda_cmn and the new accum */
+	    imeldata tmp=(swicms->lda_cmn[ii]*swicms->inutt.forget_factor2
+			  + swicms->inutt.accum[ii] + denom/2) / denom;
+	    swicms->adjust[ii] = swicms->lda_tmn[ii] - tmp;
+	  }
+	  //printf_vector("swicms->adjust2 "," %d",swicms->adjust, dimen);
+	}
+      }
+    }
+    swicms->inutt.num_frames_since_bou++;
+  }
+  
+  for (ii = 0; ii < dimen; ii++)
+    oframe[ii] = MAKEBYTE(iframe[ii] + swicms->adjust[ii]);
+  return 0;
+}
+
+int swicms_update(swicms_norm_info* swicms, int speech_start, int speech_end)
+{
+  int i, j;
+  asr_int32_t speech_avg[MAX_CHAN_DIM], backgr_avg[MAX_CHAN_DIM], avg[MAX_CHAN_DIM];
+  int ff;
+  int nn, speech_nn, backgr_nn;
+  int num_frames = swicms->cached_num_frames;
+  int cache_start, cache_end, backgr_cache_end;
+  int sbindex = swicms->sbindex;
+
+  /* init for utterance */
+  swicms->inutt.num_frames_since_bou = 0;
+
+  swicms->cached_num_frames = 0;
+  cache_start = speech_start;
+  cache_start -= (cache_start % swicms->cache_resolution);
+  cache_start /= swicms->cache_resolution;
+
+  if (speech_end == MAXframeID)
+  {
+    cache_end = SWICMS_CACHE_SIZE_DEFAULT;
+  }
+  else
+  {
+    if (speech_end < num_frames)
+      cache_end = speech_end;
+    else
+      cache_end = num_frames;
+    cache_end -= (cache_end % swicms->cache_resolution);
+    cache_end /= swicms->cache_resolution;
+  }
+
+  if (num_frames == 0 || speech_end == 0 || speech_start == speech_end || speech_end == MAXframeID)
+  {
+    if (speech_end != 0 || speech_start != 0)
+      PLogError("Warning: speech_bounds (%d,%d) swicms->cached_num_frames (%d)\n",
+                speech_start, speech_end, num_frames);
+	if (SWICMS_DEBUG) {
+      //printf_vector("swicms->adjust.rep", " %d", swicms->adjust, MAX_CHAN_DIM);
+    }
+    return 1;
+  }
+
+  backgr_cache_end = (num_frames - num_frames % swicms->cache_resolution) / swicms->cache_resolution;
+
+  speech_nn = (cache_end - cache_start) * swicms->cache_resolution;
+  backgr_nn = backgr_cache_end * swicms->cache_resolution - speech_nn;
+
+  for (i = 0; i < MAX_CHAN_DIM; i++)
+  {
+    speech_avg[i] = 0;
+    backgr_avg[i] = 0;
+    for (j = cache_start; j < cache_end; j++)
+      speech_avg[i] += swicms->cached_sections[j][i];
+    for (j = 0; j < cache_start; j++)
+      backgr_avg[i] += swicms->cached_sections[j][i];
+    for (j = cache_end; j < backgr_cache_end; j++)
+      backgr_avg[i] += swicms->cached_sections[j][i];
+    if (speech_nn == 0 && backgr_nn > 0)
+    {
+      backgr_avg[i] /= backgr_nn;
+      speech_avg[i] = backgr_avg[i];
+      speech_nn = backgr_nn;
+    }
+    else if (speech_nn > 0 && backgr_nn == 0)
+    {
+      speech_avg[i] /= speech_nn;
+      backgr_avg[i] = speech_avg[i];
+      backgr_nn = speech_nn;
+    }
+    else if (speech_nn > 0 && backgr_nn > 0)
+    {
+      speech_avg[i] /= speech_nn;
+      backgr_avg[i] /= backgr_nn;
+    }
+    else
+    {
+      return 0;
+    }
+
+    avg[i] = (sbindex * speech_avg[i] + (100 - sbindex) * backgr_avg[i] + 50) / 100;
+  }
+  nn = (sbindex * speech_nn + (100 - sbindex) * backgr_nn + 50) / 100;
+
+  for (i = 0, ff = 0; i < MAX_CHAN_DIM; i++)
+  {
+    ff += (swicms->lda_tmn[i] - avg[i]);
+  }
+  ff /= MAX_CHAN_DIM; /* sum is now the average offset from TMN */
+  if (ff > 5)
+  {
+    PLogError("Warning: bad utt mean during swicms_update() (moffs=%d)\n", ff);
+    //printf_vector("swicms->adjust.rep", " %d", swicms->adjust, MAX_CHAN_DIM);
+    return 1;
+  }
+  ff = swicms->forget_factor;
+  if (ff < 9999)
+  {
+    for (i = 0; i < MAX_CHAN_DIM; i++)
+    {
+      swicms->lda_cmn[i] = (swicms->lda_cmn[i] * ff + avg[i] * nn + (ff + nn) / 2)  / (ff + nn);
+      swicms->adjust[i] = swicms->lda_tmn[i] - swicms->lda_cmn[i];
+    }
+  }
+
+  if (SWICMS_DEBUG)
+    {
+      imeldata temp[MAX_CHAN_DIM];
+      PLogMessage("swicms_update() used %d frames (%d-%d)", nn, speech_start, speech_end);
+      
+      for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_cmn[i];
+      inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/);
+      /* use this dump, to put back into CREC.Frontend.swicms.cmn */
+      printf_vector("swicms.cmn(r)  ", " %d", temp, MAX_CHAN_DIM);
+      
+      //printf_vector("swicms.lda_cmn   ", " %d", &swicms.lda_cmn [0], MAX_CHAN_DIM);
+      //printf_vector("swicms.lda_tmn   ", " %d", &swicms.lda_tmn [0], MAX_CHAN_DIM);
+      //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM);
+      //printf_vector("avg.speech    ", " %d", avg, MAX_CHAN_DIM);
+    }
+  else
+    {
+#ifndef NDEBUG
+      //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM);
+#endif
+    }
+  swicms->num_frames_in_cmn += nn;
+  return 0;
+}
+
+int swicms_lda_process(swicms_norm_info* swicms, preprocessed* prep)
+{
+  int i;
+
+  for (i = 0; i < MAX_CHAN_DIM; i++) swicms->lda_tmn[i] = swicms->tmn[i];
+  for (i = 0; i < MAX_CHAN_DIM; i++) swicms->lda_cmn[i] = swicms->cmn[i];
+  linear_transform_frame(prep, swicms->lda_tmn, 1 /*do_shift*/);
+  linear_transform_frame(prep, swicms->lda_cmn, 1 /*do_shift*/);
+
+  for (i = 0; i < MAX_CHAN_DIM; i++)
+  {
+    swicms->adjust[i] = swicms->lda_tmn[i] - swicms->lda_cmn[i];
+  }
+
+#ifndef NDEBUG
+  //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM);
+#endif
+  swicms->is_valid = 1;
+  swicms->_prep = prep;
+  
+  if(SWICMS_DEBUG) { 
+    imeldata temp[MAX_CHAN_DIM];
+    printf_vector("swicms->cmn     ", " %d", swicms->cmn,     MAX_CHAN_DIM);
+    printf_vector("swicms->lda_cmn ", " %d", swicms->lda_cmn, MAX_CHAN_DIM);
+    //printf_vector("swicms->tmn     ", " %d", swicms->tmn,     MAX_CHAN_DIM);
+    //printf_vector("swicms->lda_tmn ", " %d", swicms->lda_tmn, MAX_CHAN_DIM);
+    //printf_vector("swicms->adjust  ", " %d", swicms->adjust,  MAX_CHAN_DIM);
+    
+    //for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_tmn[i];
+    //inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/);
+    //printf_vector("swicms->tmn(r)  ", " %d", temp, MAX_CHAN_DIM);
+    
+    for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_cmn[i];
+    inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/);
+    printf_vector("swicms->cmn(r)  ", " %d", temp, MAX_CHAN_DIM);
+  }
+  return 0;
+}
+
+
+
diff --git a/srec/clib/swimodel.c b/srec/clib/swimodel.c
new file mode 100644
index 0000000..8d1711c
--- /dev/null
+++ b/srec/clib/swimodel.c
@@ -0,0 +1,513 @@
+/*---------------------------------------------------------------------------*
+ *  swimodel.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <math.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "prelib.h"
+#include "hmmlib.h"
+#include "portable.h"
+#include "errhndl.h"
+
+#include "log_add.h"
+#include "swimodel.h"
+
+/* const float   root_pi_over_2= (float)1.2533141; */
+const prdata  max_log = (prdata) MAX_LOG;
+
+#define MTAG NULL
+
+/*--------------------------------------------------------------*
+ *                                                              *
+ *                                                              *
+ *                                                              *
+ *--------------------------------------------------------------*/
+
+costdata DURATION_PENALTY_UNIT = 1;
+int      NUM_FRAMES_PER_VALID_FRAME = 0;
+/* this is just for debugging, able to turn duration model off */
+
+void check_duration_penalty()
+{
+  char *p = getenv("DUR_PR");
+  if (p)
+  {
+    DURATION_PENALTY_UNIT = (costdata) atoi(p);
+  }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("DUR_PR %d\n", DURATION_PENALTY_UNIT);
+#endif
+}
+
+void duration_penalty_set_frames_per_valid_frame(int n)
+{
+  NUM_FRAMES_PER_VALID_FRAME = n;
+}
+
+/*--------------------------------------------------------------*
+ *                                                              *
+ *                                                              *
+ *                                                              *
+ *--------------------------------------------------------------*/
+
+/* the looping cost lookup table. This table was generated empirically
+   by looking at resulting residency distributions, trying to make them
+   look roughly like normal distributions centered at the average state
+   durations */
+
+char loop_cost_table [128][6] = {
+{0,0,0,0,0,0},
+{13,15,16,16,16,16},
+{12,13,14,14,14,14},
+{11,12,13,13,13,13},
+{10,12,12,12,12,12},
+{10,11,11,12,12,12},
+{10,11,11,11,11,11},
+{10,11,11,11,11,11},
+{9,11,11,11,11,11},
+{9,10,11,11,11,11},
+{9,10,10,10,10,10},
+{9,10,10,10,10,10},
+{9,10,10,10,10,10},
+{9,10,10,10,10,10},
+{9,10,10,10,10,10},
+{9,10,10,10,10,10},
+{9,10,10,10,10,10},
+{8,10,10,10,10,10},
+{8,10,10,10,10,10},
+{8,10,10,10,10,10},
+{8,10,10,10,10,10},
+{8,10,10,10,10,10},
+{8,10,10,10,10,10},
+{7,10,10,10,10,10},
+{7,10,10,10,10,10},
+{7,10,10,10,10,10},
+{6,10,10,10,10,10},
+{6,10,10,10,10,10},
+{6,10,10,10,10,10},
+{5,10,10,10,10,10},
+{5,10,10,10,10,10},
+{4,10,10,10,10,10},
+{4,9,10,10,10,10},
+{3,9,10,10,10,10},
+{2,9,10,10,10,10},
+{2,9,10,10,10,10},
+{2,9,10,10,10,10},
+{1,9,10,10,10,10},
+{1,9,10,10,10,10},
+{1,9,10,10,10,10},
+{0,9,10,10,10,10},
+{0,9,10,10,10,10},
+{0,9,10,10,10,10},
+{0,8,10,10,10,10},
+{0,8,10,10,10,10},
+{0,8,10,10,10,10},
+{0,7,10,10,10,10},
+{0,7,10,10,10,10},
+{0,6,10,10,10,10},
+{0,5,10,10,10,10},
+{0,5,10,10,10,10},
+{0,4,10,10,10,10},
+{0,3,10,10,10,10},
+{0,2,10,10,10,10},
+{0,2,10,10,10,10},
+{0,1,10,10,10,10},
+{0,1,9,10,10,10},
+{0,0,9,10,10,10},
+{0,0,9,10,10,10},
+{0,0,9,10,10,10},
+{0,0,9,10,10,10},
+{0,0,9,10,10,10},
+{0,0,9,10,10,10},
+{0,0,9,10,10,10},
+{0,0,9,10,10,10},
+{0,0,8,10,10,10},
+{0,0,8,10,10,10},
+{0,0,7,10,10,10},
+{0,0,6,10,10,10},
+{0,0,6,10,10,10},
+{0,0,5,10,10,10},
+{0,0,4,10,10,10},
+{0,0,3,10,10,10},
+{0,0,2,10,10,10},
+{0,0,1,10,10,10},
+{0,0,1,10,10,10},
+{0,0,0,10,10,10},
+{0,0,0,10,10,10},
+{0,0,0,9,10,10},
+{0,0,0,9,10,10},
+{0,0,0,9,10,10},
+{0,0,0,9,10,10},
+{0,0,0,9,10,10},
+{0,0,0,9,10,10},
+{0,0,0,9,10,10},
+{0,0,0,9,10,10},
+{0,0,0,8,10,10},
+{0,0,0,8,10,10},
+{0,0,0,7,10,10},
+{0,0,0,6,10,10},
+{0,0,0,5,10,10},
+{0,0,0,3,10,10},
+{0,0,0,2,10,10},
+{0,0,0,1,10,10},
+{0,0,0,1,10,10},
+{0,0,0,0,10,10},
+{0,0,0,0,10,10},
+{0,0,0,0,10,10},
+{0,0,0,0,10,10},
+{0,0,0,0,10,10},
+{0,0,0,0,9,10},
+{0,0,0,0,9,10},
+{0,0,0,0,9,10},
+{0,0,0,0,9,10},
+{0,0,0,0,9,10},
+{0,0,0,0,9,10},
+{0,0,0,0,9,10},
+{0,0,0,0,8,10},
+{0,0,0,0,7,10},
+{0,0,0,0,6,10},
+{0,0,0,0,5,10},
+{0,0,0,0,3,10},
+{0,0,0,0,2,10},
+{0,0,0,0,1,10},
+{0,0,0,0,0,10},
+{0,0,0,0,0,10},
+{0,0,0,0,0,10},
+{0,0,0,0,0,10},
+{0,0,0,0,0,10},
+{0,0,0,0,0,10},
+{0,0,0,0,0,10},
+{0,0,0,0,0,9},
+{0,0,0,0,0,9},
+{0,0,0,0,0,9},
+{0,0,0,0,0,9},
+{0,0,0,0,0,9},
+{0,0,0,0,0,9},
+{0,0,0,0,0,8}
+};
+
+/* the transition cost lookup table. This table was generated empirically
+   by looking at resulting residency distributions, trying to make them
+   look roughly like normal distributions centered at the average state
+   durations */
+
+char trans_cost_table [128][6] = {
+{0,0,0,0,0,0},
+{0,0,0,0,0,0},
+{0,0,0,0,0,0},
+{0,0,0,0,0,0},
+{0,0,0,0,0,0},
+{0,0,0,0,0,0},
+{0,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{1,0,0,0,0,0},
+{2,0,0,0,0,0},
+{2,0,0,0,0,0},
+{2,0,0,0,0,0},
+{2,0,0,0,0,0},
+{2,0,0,0,0,0},
+{2,0,0,0,0,0},
+{2,0,0,0,0,0},
+{3,0,0,0,0,0},
+{3,0,0,0,0,0},
+{3,0,0,0,0,0},
+{3,0,0,0,0,0},
+{4,0,0,0,0,0},
+{4,0,0,0,0,0},
+{4,0,0,0,0,0},
+{5,0,0,0,0,0},
+{5,0,0,0,0,0},
+{6,1,0,0,0,0},
+{6,1,0,0,0,0},
+{7,1,0,0,0,0},
+{7,1,0,0,0,0},
+{8,1,0,0,0,0},
+{8,1,0,0,0,0},
+{9,1,0,0,0,0},
+{10,1,0,0,0,0},
+{10,1,0,0,0,0},
+{11,2,0,0,0,0},
+{12,2,0,0,0,0},
+{13,2,0,0,0,0},
+{13,2,0,0,0,0},
+{14,3,0,0,0,0},
+{15,3,0,0,0,0},
+{15,3,0,0,0,0},
+{16,4,0,0,0,0},
+{17,4,0,0,0,0},
+{17,5,0,0,0,0},
+{18,6,0,0,0,0},
+{18,6,0,0,0,0},
+{19,7,0,0,0,0},
+{19,8,0,0,0,0},
+{19,9,0,0,0,0},
+{20,10,0,0,0,0},
+{20,11,0,0,0,0},
+{20,12,0,0,0,0},
+{20,13,0,0,0,0},
+{21,14,1,0,0,0},
+{21,15,1,0,0,0},
+{21,16,1,0,0,0},
+{21,17,1,0,0,0},
+{22,18,2,0,0,0},
+{22,19,2,0,0,0},
+{22,19,2,0,0,0},
+{22,20,3,0,0,0},
+{22,20,3,0,0,0},
+{23,21,4,0,0,0},
+{23,21,5,0,0,0},
+{23,22,6,0,0,0},
+{23,22,7,0,0,0},
+{23,23,8,0,0,0},
+{23,23,9,0,0,0},
+{23,23,10,0,0,0},
+{24,23,12,0,0,0},
+{24,24,13,0,0,0},
+{24,24,14,0,0,0},
+{24,24,16,0,0,0},
+{24,24,17,0,0,0},
+{24,24,18,0,0,0},
+{25,24,20,0,0,0},
+{25,25,21,1,0,0},
+{25,25,22,1,0,0},
+{25,25,22,1,0,0},
+{25,25,23,2,0,0},
+{25,25,24,2,0,0},
+{25,25,24,3,0,0},
+{25,25,25,3,0,0},
+{26,26,25,4,0,0},
+{26,26,25,5,0,0},
+{26,26,25,6,0,0},
+{26,26,26,8,0,0},
+{26,26,26,9,0,0},
+{26,26,26,11,0,0},
+{26,26,26,13,0,0},
+{27,27,26,15,0,0},
+{27,27,27,17,0,0},
+{27,27,27,18,0,0},
+{27,27,27,20,0,0},
+{27,27,27,22,0,0},
+{27,27,27,23,0,0},
+{27,27,27,24,0,0},
+{27,27,27,25,0,0},
+{27,27,27,26,1,0},
+{28,28,28,26,1,0},
+{28,28,28,27,1,0},
+{28,28,28,27,2,0},
+{28,28,28,27,3,0},
+{28,28,28,28,3,0},
+{28,28,28,28,5,0},
+{28,28,28,28,6,0},
+{28,28,28,28,8,0},
+{28,28,28,28,10,0},
+{29,29,29,29,12,0},
+{29,29,29,29,14,0},
+{29,29,29,29,16,0},
+{29,29,29,29,19,0},
+{29,29,29,29,21,0},
+{29,29,29,29,23,0},
+{29,29,29,29,24,0},
+{29,29,29,29,26,0},
+{29,29,29,29,27,0}
+};
+
+/*--------------------------------------------------------------*
+ *                                                              *
+ *                                                              *
+ *                                                              *
+ *--------------------------------------------------------------*/
+
+static short load_short(PFile* fp)
+{
+  short v;
+  pfread(&v, sizeof(short), 1, fp);
+  return v;
+}
+
+SWIModel* load_swimodel(char *filename)
+{
+  featdata *mean_ptr;
+  wtdata *weight_ptr;
+  int i;
+  PFile* fp = NULL;
+  short* num_pdfs_in_model;
+  int num_allocated;
+  SWIModel *swimodel;
+  int ni;
+
+  fp = pfopen ( filename, L("rb") );
+/*  CHKLOG(rc, PFileSystemCreatePFile(filename, ESR_TRUE, &fp));
+  CHKLOG(rc, PFileOpen(fp, L("rb")));*/
+
+  if ( fp == NULL )
+    goto CLEANUP;
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("load_swimodel: loaded %s", filename);
+#endif
+  swimodel = (SWIModel*) CALLOC(1, sizeof(SWIModel), "clib.models.base");
+  num_allocated = sizeof(SWIModel);
+  swimodel->num_hmmstates = load_short(fp);
+  swimodel->num_dims      = load_short(fp);
+  swimodel->num_pdfs      = load_short(fp);
+
+  swimodel->hmmstates     = (SWIhmmState*) CALLOC(swimodel->num_hmmstates, sizeof(SWIhmmState), "clib.models.states");
+  num_allocated += swimodel->num_hmmstates * sizeof(SWIhmmState);
+
+  swimodel->allmeans      = (featdata*) CALLOC(swimodel->num_pdfs * swimodel->num_dims, sizeof(featdata), "clib.models.means");
+  num_allocated += swimodel->num_pdfs * swimodel->num_dims * sizeof(featdata);
+  swimodel->allweights    = (wtdata*) CALLOC(swimodel->num_pdfs, sizeof(wtdata), "clib.models.weights");
+  num_allocated += swimodel->num_pdfs * sizeof(featdata);
+  swimodel->avg_state_durations = (featdata*) CALLOC(swimodel->num_hmmstates, sizeof(featdata), "clib.models.durs");
+
+  num_pdfs_in_model = (short*) MALLOC(sizeof(short) * swimodel->num_hmmstates, MTAG);
+  ni = pfread(num_pdfs_in_model, sizeof(short), swimodel->num_hmmstates, fp);
+  ASSERT(ni == swimodel->num_hmmstates);
+  ni = pfread(swimodel->allmeans, sizeof(featdata), swimodel->num_dims * swimodel->num_pdfs, fp);
+  ASSERT(ni == swimodel->num_pdfs*swimodel->num_dims);
+  ni = pfread(swimodel->allweights, sizeof(wtdata), swimodel->num_pdfs, fp);
+  ASSERT(ni == swimodel->num_pdfs);
+  ni = pfread(swimodel->avg_state_durations, sizeof(featdata), swimodel->num_hmmstates, fp);
+  ASSERT(ni == swimodel->num_hmmstates);
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("loaded models %s num_hmmstates %d num_dims %d num_pdfs %d allocated %d bytes weights[0] %d\n",
+              filename, swimodel->num_hmmstates, swimodel->num_dims, swimodel->num_pdfs, num_allocated,
+              *swimodel->allweights);
+#endif
+
+  mean_ptr = swimodel->allmeans;
+  weight_ptr = swimodel->allweights;
+
+  for (i = 0;i < swimodel->num_hmmstates;i++)
+  {
+    swimodel->hmmstates[i].num_pdfs = num_pdfs_in_model[i];
+    swimodel->hmmstates[i].means = mean_ptr;
+    swimodel->hmmstates[i].weights = weight_ptr;
+    mean_ptr += swimodel->num_dims * num_pdfs_in_model[i];
+    weight_ptr += num_pdfs_in_model[i];
+  }
+  FREE(num_pdfs_in_model);
+  num_pdfs_in_model = NULL;
+  pfclose(fp);
+  return swimodel;
+CLEANUP:
+  if (fp != NULL)
+    pfclose ( fp );
+  return NULL;
+}
+
+void free_swimodel(SWIModel* swimodel)
+{
+  FREE(swimodel->hmmstates);
+  FREE(swimodel->allmeans);
+  FREE(swimodel->allweights);
+  FREE(swimodel->avg_state_durations);
+  FREE(swimodel);
+}
+static PINLINE prdata Gaussian_Grand_Density_Swimodel(preprocessed *data, featdata *means)
+/*
+**  Observation probability function of a Gaussian pdf
+**  with diagonal covariance matrix.
+*/
+{
+  prdata pval;
+  prdata diff;
+  imeldata *dvec;
+  imeldata *dend;
+  int count;
+
+  dvec = data->seq + data->use_from;    /* Move to starting feature element */
+
+  pval = 0;
+  dend = dvec + data->use_dim;
+  count = 0;
+  while (dvec < dend)
+  {
+    diff = *(means++) - *(dvec++);
+    pval -= diff * diff;
+  }
+  pval = data->mul.multable_factor_gaussian
+         * (pval - data->mul.grand_mod_cov_gaussian);
+  return (pval);
+}
+
+scodata mixture_diagonal_gaussian_swimodel(preprocessed *prep,
+    SWIhmmState *spd, short num_dims)
+/*
+**  Observation probability function
+*/
+{
+  int ii;
+  prdata pval, gval;
+
+  prdata dval;
+  featdata *meanptr;
+  wtdata *weightptr;
+
+  ASSERT(prep);
+  ASSERT(spd);
+
+  pval = -max_log;
+  meanptr = spd->means;
+  weightptr = spd->weights;
+
+  for (ii = 0; ii < spd->num_pdfs; ii++)
+  {
+    gval = ((prdata) * (weightptr++) * prep->add.scale
+            + Gaussian_Grand_Density_Swimodel(prep, meanptr));
+
+    meanptr += num_dims;
+
+    if (pval > gval)
+    {
+      dval = pval - gval;
+      if (dval < prep->add.add_log_limit)
+        pval += log_increment_inline(dval, &prep->add);
+    }
+    else
+    {
+      dval = gval - pval;
+      if (dval < prep->add.add_log_limit)
+        pval = gval + log_increment_inline(dval, &prep->add);
+      else
+        pval = gval;
+    }
+  }
+  ASSERT(pval > ((0x01 << 31) / (prep->mix_score_scale * prep->add.inv_scale)));
+  pval = ((pval * prep->mix_score_scale - 64 * prep->add.scale)
+          * prep->add.inv_scale) >> 19;
+
+  return ((scodata)pval);
+}
diff --git a/srec/clib/voc_read.c b/srec/clib/voc_read.c
new file mode 100644
index 0000000..549b93b
--- /dev/null
+++ b/srec/clib/voc_read.c
@@ -0,0 +1,352 @@
+/*---------------------------------------------------------------------------*
+ *  voc_read.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+
+#if defined(__cplusplus) && defined(_MSC_VER)
+extern "C"
+{
+#include <string.h>
+}
+#else
+#include <string.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef _WIN32
+#define stat _stat
+#else
+#include <unistd.h>
+#endif
+
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#include <zipfile/zipfile.h>
+
+
+#include "hmmlib.h"
+#include "duk_io.h"
+#include "LCHAR.h"
+#include "portable.h"
+
+#include "memmove.h"
+
+static const char voc_read[] = "$Id: voc_read.c,v 1.14.6.18 2008/03/05 21:18:44 dahan Exp $";
+
+#define SORTED_WORD_LIST 1
+#define MAX_PRON_LEN      255
+
+#define cr_or_nl(ch) ((ch) == '\n' || (ch) == '\r')
+
+static int mmap_zip(const char* fname, void** buf, size_t* size);
+static int munmap_zip(void* buf, size_t size);
+
+
+#ifndef _RTT
+
+/**
+ *  Read word models and their phoneme transcriptions from .ok or .voc files.
+ *  returns -1 on error
+ */
+int read_word_transcription(const LCHAR* basename, vocab_info* voc, ESR_Locale* locale)
+{
+  const char *ok;
+  ESR_ReturnCode rc;
+  int result;
+  int i;
+  char token[256];
+
+  ASSERT(voc);
+  
+  //PLogError("read_word_transcription hello\n");
+
+  if (basename == NULL || strlen(basename) == 0) {
+    PLogError("Error: invalid arg to read_word_transcription()\n");
+    goto CLEANUP;
+  }
+
+  if (mmap_zip(basename, (void**)&voc->ok_file_data, (size_t*)&voc->ok_file_data_length)) {
+    PLogError("read_word_transcription: mmap_zip failed for %s\n", basename);
+    goto CLEANUP;
+  }
+  
+  /* this assumption eliminates simplifies bounds checking when parsing */
+  if (!cr_or_nl(voc->ok_file_data[voc->ok_file_data_length - 1])) {
+    PLogError(L("read_word_transcription: last character in %s not newline\n"), basename);
+    goto CLEANUP;
+  }
+  
+  /* set up point to walk the data */
+  ok = voc->ok_file_data;
+  
+  /* verify the header */
+  i = 0;
+  while (*ok != '=') {
+    if (cr_or_nl(*ok)) {
+      PLogError(L("%s was missing '=' in #LANG=en-us header"), basename);
+      goto CLEANUP;
+    }
+    token[i++] = *ok++;
+  }
+  token[i] = 0;
+  ok++;
+  CHKLOG(rc, lstrcasecmp(token, L("#lang"), &result));
+  if (result != 0)
+  {
+    PLogError(L("%s was missing #LANG=en-us header"), basename);
+    goto CLEANUP;
+  }
+  i = 0;
+  while (!cr_or_nl(*ok)) token[i++] = *ok++;
+  token[i] = 0;
+  ok++;
+  CHKLOG(rc, ESR_str2locale(token, locale));
+  
+  /* set up first and last entries */
+  voc->first_entry = strchr(voc->ok_file_data, '\n') + 1;
+  voc->last_entry = voc->ok_file_data + voc->ok_file_data_length - 2;
+  while (*voc->last_entry != '\n') voc->last_entry--; /* header forces termination */
+  voc->last_entry++;
+  
+  /* determine if there are any upper case entries */
+  voc->hasUpper = 1;
+  while (ok < voc->ok_file_data + voc->ok_file_data_length) {
+    int ch = *ok;
+    if ('A' <= ch && ch <= 'Z') {
+      voc->hasUpper = 1;
+      break;
+    }
+    else if ('Z' < ch) {
+      voc->hasUpper = 0;
+      break;
+    }
+    /* scan to the next entry */
+    while (*ok++ != '\n') ;
+  }
+
+  //PLogError("read_word_transcription goodbye %d", voc->hasUpper);
+  
+  return 0;
+  
+CLEANUP:
+  delete_word_transcription(voc);
+
+  PLogError(L("read_word_transcription: failed to read '%s'"), basename);
+  
+  return -1;
+}
+#endif
+
+/* the label is terminated with 0 and the entry terminated with ' ' */
+static int kompare(const char* label, const char* entry) {
+  while (*label == *entry) {
+    label++;
+    entry++;
+  }
+  return (*label ? *label : ' ') - *entry;
+}
+
+int get_prons(const vocab_info* voc, const char* label, char* prons, int prons_len) {
+  int num_prons;
+  const char* low;
+  const char* middle;
+  const char* high;
+
+  //PLogError(L("get_prons '%s'"), label);
+  
+  /* dictionaries are usually lower case, so do this for speed */
+  if (!voc->hasUpper && 'A' <= *label && *label <= 'Z') return 0;
+  
+  /* binary search to find matching entry */
+  low = voc->first_entry;
+  high = voc->last_entry;
+  while (1) {
+    /* pick a point in the middle and align to next entry */
+    middle = low + ((high - low) >> 1) - 1;
+    while (*middle++ != '\n') ;
+    
+    /* compare 'label' to 'middle' */
+    int diff = kompare(label, middle);
+    if (diff == 0) break;
+    
+    /* nothing found */
+    if (low == high) return 0;
+    
+    /* 'middle' aligned to 'high', so move 'high' down */
+    if (middle == high) {
+      high -= 2;
+      while (*high != '\n') high--;
+      high++;
+      continue;
+    }
+    
+    if (diff > 0) low = middle;
+    else high = middle;
+  }
+  
+  /* back up to find the first entry equal to 'label' */
+  low = middle;
+  while (voc->first_entry < low) {
+    char* lo;
+    for (lo = low - 2; *lo != '\n'; lo--) ;
+    lo++;
+    if (kompare(label, lo)) break;
+    low = lo;
+  }
+  
+  /* move forward to the last entry equal to 'label' */
+  high = middle;
+  while (high < voc->last_entry) {
+    char* hi;
+    for (hi = high; *hi != '\n'; hi++) ;
+    hi++;
+    if (kompare(label, hi)) break;
+    high = hi;
+  }
+  
+  /* loop over all the entries */
+  num_prons = 0;
+  while (low <= high) {
+    /* scan over the label */
+    while (*low++ != ' ') ;
+
+    /* skip the whitespace */
+    while (*low == ' ') low++;
+    
+    /* copy the pron */
+    while (*low != '\n') {
+      if (--prons_len <= 2) return -1;
+      *prons++ = *low++;
+    }
+    *prons++ = 0;
+    low++;
+    num_prons++;
+  }
+  *prons++ = 0;
+  
+  return num_prons;
+}
+
+void delete_word_transcription(vocab_info* voc)
+{
+  ASSERT(voc);
+
+  voc->first_entry = 0;
+  voc->last_entry = 0;
+  if (voc->ok_file_data) munmap_zip(voc->ok_file_data, voc->ok_file_data_length);
+  voc->ok_file_data = NULL;
+  voc->ok_file_data_length = 0;
+}
+
+
+/**************************************************/
+/* may want to move these functions to 'portable' */
+/**************************************************/
+
+static int endeql(const char* string, const char* end) {
+  return strlen(end) <= strlen(string) && !strcmp(string + strlen(string) - strlen(end), end);
+}
+
+/* decompress_entry requires an oversize destination buffer, so... */
+static size_t inflateSize(size_t size) {
+  return size + size / 1000 + 1;
+}
+
+static int mmap_zip(const char* fname, void** buf, size_t* size) {
+    int fd = -1;
+    struct stat statbuf;
+    zipfile_t zf = 0;
+    zipentry_t ze = 0;
+    char entryname[FILENAME_MAX];
+    size_t size2 = 0;
+    void* buf2 = 0;
+    
+    /* open data file, determine size, map it, and close fd */
+    fd = open(fname, O_RDONLY);
+    if (fd < 0) goto FAILED;
+   
+    /* determine length */
+    if (fstat(fd, &statbuf) < 0) goto FAILED;
+   
+    /* mmap it */
+    *size = statbuf.st_size;
+    *buf = mmap(0, inflateSize(statbuf.st_size), PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+    if (*buf == MAP_FAILED) goto FAILED;
+     
+    /* close fd, since we can */
+    close(fd);
+    fd = -1;
+    
+    /* if not a zip file, we are done! */
+    if (!endeql(fname, ".zip")) return 0;
+    
+    /* set up zipfiler */
+    zf = init_zipfile(*buf, *size);
+    if (!zf) goto FAILED;
+    
+    /* get entry */
+    strcpy(entryname, strrchr(fname, '/') ? strrchr(fname, '/') + 1 : fname);
+    entryname[strlen(entryname) - strlen(".zip")] = 0;
+    ze = lookup_zipentry(zf, entryname);
+    if (!ze) goto FAILED;
+    
+    /* mmap anon memory to hold unzipped entry */
+    size2 = get_zipentry_size(ze);
+    buf2 = mmap(0, inflateSize(size2), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+    if (buf2 == (void*)-1) goto FAILED;
+    
+    /* unzip entry */
+    if (decompress_zipentry(ze, buf2, size2)) goto FAILED;
+    
+    /* release unzipper */
+    release_zipfile(zf);
+    zf = 0;
+    
+    /* release mmapped file */
+    munmap(*buf, inflateSize(*size));
+    
+    /* set return values */
+    *buf = buf2;
+    *size = size2;
+    
+    return 0;
+    
+FAILED:
+    if (fd != -1) close(fd);
+    if (zf) release_zipfile(zf);
+    if (buf2) munmap(buf2, inflateSize(size2));
+    if (*buf && *buf != (void*)-1) munmap(*buf, inflateSize(*size));
+    *buf = 0;
+    *size = 0;
+    return -1;
+}
+
+static int munmap_zip(void* buf, size_t size) {
+    return munmap(buf, inflateSize(size));
+}
+
diff --git a/srec/clib/voicing.c b/srec/clib/voicing.c
new file mode 100644
index 0000000..f77d6ab
--- /dev/null
+++ b/srec/clib/voicing.c
@@ -0,0 +1,143 @@
+/*---------------------------------------------------------------------------*
+ *  voicing.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <assert.h>
+
+#include <limits.h>
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#include "all_defs.h"
+#include "voicing.h"
+
+#include "portable.h"
+
+#include "../cfront/sh_down.h"
+
+#define DEBUG        0
+
+
+static const char voicing[] = "$Id: voicing.c,v 1.1.10.5 2007/10/15 18:06:24 dahan Exp $";
+
+
+void init_voicing_analysis(voicing_info *chan)
+{
+  chan->count = -1;
+  chan->sil_count = 0;
+  chan->speech_count = 0;
+  chan->fast_count = 0;
+#if DEBUG
+  log_report("U: 255 255 255 -1 -1 -1 -1\n");
+#endif
+  return;
+}
+
+long voicing_analysis(voicing_info *chan, voicedata enval , int* log)
+{
+  long  retval;
+  int   threshold;
+
+  if (chan->count < 0)
+  {
+    chan->b1 = SHIFT_UP(enval, 8);
+    chan->b0 = SHIFT_UP(enval, 8);
+    chan->count = -1;
+  }
+
+  /*  background level
+  */
+  if (chan->b0 > SHIFT_UP(enval, 8))
+  {
+    chan->b0 = SHIFT_UP(enval, 8);
+    chan->count = 0;
+  }
+  if (chan->count > B0_HANG2)
+    chan->b0 += B0_RATE2;
+  else if (chan->count > B0_HANG1)
+    chan->b0 += B0_RATE1;
+
+  chan->count++;
+
+  /*  the second background level
+  */
+  if ((enval - chan->quiet_margin) < (chan->b0 >> 8))
+    chan->b1 += SHIFT_DOWN(B1_RATE * (SHIFT_UP(enval, 8) - chan->b1), 8);
+
+  /*  speech level
+  */
+  if (chan->s0 < SHIFT_UP(enval, 8))
+    chan->s0 = SHIFT_UP(enval, 8);
+  else
+    chan->s0 -= B0_RATE1;
+
+  /*  increase the range by 25% */
+  threshold = (chan->b1 + (SHIFT_DOWN(
+                             MAX(chan->s0 - chan->b0 - DYNAMIC_RANGE, 0), 2))) >> 8;
+
+  /*  Is it speech?
+  */
+  if (enval > (threshold + chan->margin))
+    chan->speech_count++;
+  else
+    chan->speech_count = 0;
+
+  /*  Is it Fast-match speech
+  */
+  if (enval > (threshold + chan->fast_margin))
+    chan->fast_count++;
+  else
+    chan->fast_count = 0;
+
+  if (enval <= (threshold + chan->quiet_margin))
+    chan->sil_count++;
+  else
+    chan->sil_count = 0;
+
+  /*******************
+   * Returning flags *
+   *******************/
+
+  retval = 0L;
+
+  if (chan->fast_count > chan->voice_duration)
+    retval = FAST_VOICE_BIT;
+  else if (chan->sil_count > chan->quiet_duration)
+    retval = QUIET_BIT;
+
+  if (chan->speech_count > chan->voice_duration)
+    retval |= VOICE_BIT;
+
+  if (chan->sil_count > 0)
+    retval |= BELOW_THRESHOLD_BIT;
+
+  chan->voice_status = retval;
+#if DEBUG
+  log_report("U: %d %.1f %.1f, %d %d %d %d\n", (int) enval,
+             chan->b0 / 256.0, chan->b1 / 256.0,
+             chan->speech_count, chan->fast_count,
+             chan->sil_count, chan->count);
+#endif
+  return (retval);
+}
diff --git a/srec/crec/astar.c b/srec/crec/astar.c
new file mode 100644
index 0000000..e67eb0d
--- /dev/null
+++ b/srec/crec/astar.c
@@ -0,0 +1,1356 @@
+/*---------------------------------------------------------------------------*
+ *  astar.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "pstdio.h"
+#include "passert.h"
+
+#include"srec_sizes.h"
+#include"search_network.h"
+#include"srec.h"
+#include"srec_context.h"
+#include"word_lattice.h"
+#include "portable.h"
+#include "srec_stats.h"
+#include "astar.h"
+#include "astar_pphash.h"
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid :
+                           "$Id: astar.c,v 1.19.4.9 2008/04/30 15:12:15 dahan Exp $";
+#endif
+                           
+#define PRINT_ASTAR_SOMEWHAT  0
+#define PRINT_ASTAR_DETAILS   0
+#define PRINT_ASTAR_QBT_DETAILS   0 /* Quick Back Trace */
+#define MAX_NBEST_LEN        32
+#define NBEST_LEN_MARGIN     10
+#define MAX_NUM_PARPS       400 /* 3*MAX_NBEST_LEN*MAX_WORDS_PER_COMPLETE_PATH need better dup 
+													         check on complete paths */
+#define ASTAR_PRUNE_DELTA 20000
+#define DEBUG_PARP_MANAGEMENT 0
+
+#if PRINT_ASTAR_DETAILS
+static int do_draw_as_dotty = 0;
+static int do_draw_file_idx = 0;
+
+int astar_draw_tree_as_dotty(const char* file, srec* rec, AstarStack* stack);
+#endif
+
+/*
+  The word graph is represented as an arc_token_list,
+  arc_token's are chained together 2 linked lists,
+  arc_token->first_next_arc ... like a "TO" node
+  arc_token->next_arc_index ... a linked list of arcs leaving the same node
+
+  get_arc_for_word() finds the arc_token for a particular extension
+  backward though the word graph (ie. forward through the reverse word graph)
+
+*/
+
+#define ARC_TOKEN_ONE (arc_token*)1
+arc_token* get_arc_for_word(arc_token* atoken, wordID word,
+                            void* context_void,
+                            wordID terminal_word)
+{
+  srec_context* context = (srec_context*)context_void;
+  arc_token* arc_token_list = context->arc_token_list;
+  arc_token* tmp;
+  wordmap* wmap = context->olabels;
+  
+  if (atoken == ARC_TOKEN_ONE)
+  {
+    /* log_report("Warning:  bad thing is happening word=%d\n", word); */
+    return 0;
+  }
+  else if (atoken == 0)
+  {
+    arc_token root_arc;
+    root_arc.first_next_arc = ARC_TOKEN_LNK(arc_token_list, 0);
+    root_arc.next_token_index = ARC_TOKEN_NULL;
+    root_arc.ilabel = root_arc.olabel = 0;
+    return get_arc_for_word(&root_arc, word, context_void, terminal_word);
+    
+    /* the arc token is NULL for partial paths just starting; but
+       the word graph has nasty epsilons at the beginning, we'll remove 
+       them later, but must handle them in the mean time. */
+    atoken = &arc_token_list[0];
+    for (; atoken; atoken = ARC_TOKEN_PTR(arc_token_list, atoken->next_token_index))
+    {
+      if (atoken->ilabel == word)
+        return atoken;
+      else if (atoken->ilabel == WORD_EPSILON_LABEL)
+      {
+        for (tmp = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc); tmp;
+             tmp = ARC_TOKEN_PTR(arc_token_list, tmp->next_token_index))
+          if (tmp->ilabel == word)
+            return tmp;
+      }
+      else if (atoken->ilabel < wmap->num_slots)
+      {
+        if (wordmap_whether_in_rule(wmap, word, atoken->ilabel))
+          return atoken;
+      }
+    }
+    return 0;
+  }
+  else if (word == terminal_word)
+  {
+    /* -pau- LABEL, the word graph does not seem to have them! */
+    tmp = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc);
+    if (!tmp)
+      return ARC_TOKEN_ONE;
+    else if (tmp->first_next_arc == ARC_TOKEN_NULL && (tmp->ilabel == MAXwordID || tmp->ilabel == terminal_word))
+      return ARC_TOKEN_ONE;
+    else
+    {
+      /* again more weirdness in the output graph format1
+      might be due to multiple endnodes? */
+      for (tmp = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc); tmp;
+           tmp = ARC_TOKEN_PTR(arc_token_list, tmp->next_token_index))
+        if (tmp->ilabel == MAXwordID && tmp->first_next_arc == ARC_TOKEN_NULL)
+          return ARC_TOKEN_ONE;
+      return 0;
+    }
+  }
+  else
+  {
+#if PRINT_ASTAR_DETAILS
+    printf("word %d allowed? ", word);
+#endif
+    if (atoken->first_next_arc == ARC_TOKEN_NULL)
+      return 0;
+    else
+      tmp = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc);
+    /* handle single epsilons */
+    if (tmp->ilabel == WORD_EPSILON_LABEL && tmp->next_token_index == ARC_TOKEN_NULL)
+      tmp = ARC_TOKEN_PTR(arc_token_list, tmp->first_next_arc);
+    for (; tmp; tmp = ARC_TOKEN_PTR(arc_token_list, tmp->next_token_index))
+    {
+#if PRINT_ASTAR_DETAILS
+      printf(" W%d(%s)", tmp->ilabel, tmp->ilabel != MAXwordID ? wmap->words[tmp->ilabel] : "");
+#endif
+      if (tmp->ilabel == word)
+      {
+#if PRINT_ASTAR_DETAILS
+        printf("\n");
+#endif
+        return tmp;
+      }
+      else if (tmp->ilabel < wmap->num_slots)
+      {
+        if (wordmap_whether_in_rule(wmap, word, tmp->ilabel))
+          return tmp;
+      }
+    }
+#if PRINT_ASTAR_DETAILS
+    printf("\n");
+#endif
+    return 0;
+  }
+}
+
+arc_token* get_arc_for_word_without_slot_annotation(arc_token* atoken, const char* word,
+    void* context_void,
+    wordID terminal_word)
+{
+  srec_context* context = (srec_context*)context_void;
+  arc_token* arc_token_list = context->arc_token_list;
+  arc_token* tmp;
+  wordmap* wmap = context->olabels;
+  wordID wdid = wordmap_find_index(wmap, word);
+  
+  if (atoken == ARC_TOKEN_ONE)
+  {
+    /* log_report("Warning:  bad thing is happening word=%d\n", word); */
+    return 0;
+  }
+  else if (atoken == NULL)
+  {
+    arc_token root_arc;
+    root_arc.first_next_arc = ARC_TOKEN_LNK(arc_token_list, 0);
+    root_arc.next_token_index = ARC_TOKEN_NULL;
+    root_arc.ilabel = root_arc.olabel = 0;
+    return get_arc_for_word_without_slot_annotation(&root_arc, word, context_void, terminal_word);
+  }
+  else if (word == NULL)
+  {
+    /* -pau- LABEL, the word graph does not seem to have them! */
+    tmp = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc);
+    if (!tmp)
+      return ARC_TOKEN_ONE;
+    else if (!tmp->first_next_arc && (tmp->ilabel == MAXwordID || tmp->ilabel == terminal_word))
+      return ARC_TOKEN_ONE;
+    else
+    {
+      /* again more weirdness in the output graph format1
+      might be due to multiple endnodes? */
+      for (tmp = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc); tmp;
+           tmp = ARC_TOKEN_PTR(arc_token_list, tmp->next_token_index))
+        if (tmp->ilabel == MAXwordID && tmp->first_next_arc == ARC_TOKEN_NULL)
+          return ARC_TOKEN_ONE;
+      return 0;
+    }
+  }
+  else
+  {
+    for (tmp = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc); tmp;
+         tmp = ARC_TOKEN_PTR(arc_token_list, tmp->next_token_index))
+    {
+      if (tmp->ilabel == wdid)
+      {
+        return tmp;
+      }
+      else if (tmp->ilabel < wmap->num_slots)
+      {
+        wdid = wordmap_find_index_in_rule(wmap, word, tmp->ilabel);
+        if (wdid != MAXwordID)
+          return tmp;
+      }
+      else if (tmp->ilabel == WORD_EPSILON_LABEL)
+      {
+        tmp = ARC_TOKEN_PTR(arc_token_list, tmp->first_next_arc);
+        tmp = get_arc_for_word_without_slot_annotation(tmp, word, context_void, terminal_word);
+        if (tmp) return tmp;
+      }
+    }
+    return 0;
+  }
+}
+
+/* protos */
+#if DEBUG_PARP_MANAGEMENT
+void list_free_parps(AstarStack* stack, char* msg);
+#else
+#define list_free_parps(stack,msg)
+#endif
+
+void print_partial_paths(partial_path** parps, int num_parps, srec* rec, const char* msg);
+void print_path(partial_path* path, srec* rec, char* msg);
+void sort_partial_paths(partial_path** parps, int num_parps);
+void insert_partial_path(partial_path** parps, int *pnum_parps,
+                         partial_path* insert_parp);
+partial_path* make_new_partial_path(AstarStack* stack);
+/*void free_partial_path(AstarStack* stack, partial_path* parp); put the proto in astar.h */
+
+/* functions */
+
+void append_arc_arriving(partial_path* path, partial_path* prev_path)
+{
+  partial_path** pprev;
+  for (pprev = &path->first_prev_arc; (*pprev); pprev = &(*pprev)->linkl_prev_arc)
+    ASSERT(*pprev != prev_path);
+  *pprev = prev_path;
+#if DEBUG_PARP_MANAGEMENT
+  if (1)
+  {
+    int i, j;
+    partial_path* path_list[256], *k;
+    memset(path_list, 0, sizeof(partial_path*)*32);
+    for (i = 0, k = path->first_prev_arc; k; k = k->linkl_prev_arc)
+    {
+      for (j = 0; j < i; j++)
+        if (k == path_list[j])
+          ASSERT(0);
+      path_list[i++] = k;
+    }
+  }
+#endif
+}
+
+static void remove_path_arriving(partial_path* path, partial_path* prev_path)
+{
+  partial_path** pprev;
+  if (!path) return;
+  for (pprev = &path->first_prev_arc; (*pprev); pprev = &(*pprev)->linkl_prev_arc)
+    if (*pprev == prev_path)
+    {
+      *pprev = (*pprev)->linkl_prev_arc;
+      return;
+    }
+  ASSERT(0);
+}
+
+partial_path* extend_path(AstarStack* stack,
+                          partial_path* parp,
+                          wtokenID extend_token_index,
+                          arc_token* arc_for_extend_token_index,
+                          bigcostdata max_cost,
+                          word_token* word_token_array,
+                          int* pwhether_complete)
+{
+  asr_int32_t netcost;
+  partial_path* extended_parp;
+  word_token* wtoken;
+  costdata best_cost_for_node;
+  wtokenID best_extend_token;
+  partial_path* alt_extension;
+  int sanity_count;
+  
+  wtoken = &word_token_array[ extend_token_index];
+  
+  if (wtoken->end_time > word_token_array[parp->token_index].end_time)
+  {
+    /* 20030921: this should never happen but we keep it for stop gap */
+    /* why does it happen: when in srec_process_word_boundary() we
+       occasionally kill_fsm_nodes_for_word_backtrace() but we did not kill the
+       stokens for this backtrace, neither did we kill the altword_tokens.  it 
+       would just take too long to go through all of them, and so occasionally 
+       there may leak some bad backtraces */
+    return 0;
+  }
+  
+  /* finding the netcost of this path extension */
+  best_extend_token = word_token_array[ parp->token_index].backtrace;
+  best_cost_for_node = word_token_array[ best_extend_token].cost;
+  wtoken = &word_token_array[ extend_token_index];
+  ASSERT(word_token_array[best_extend_token].end_time ==
+         word_token_array[extend_token_index].end_time);
+  netcost = wtoken->cost - best_cost_for_node;
+  /* ASSERT( netcost > 0); bug: sometimes this fails! fix: just use int32 */
+  if (netcost + parp->costsofar > max_cost)
+  {
+#if PRINT_ASTAR_DETAILS
+    printf("netcost %d (%d+%d) + parp->costsofar > max_cost %d\n",
+           netcost, wtoken->cost, best_cost_for_node, parp->costsofar, max_cost);
+#endif
+    return 0;
+  }
+  
+  /* check if we have a similar thing already extended */
+  sanity_count = 0;
+  for (alt_extension = parp->first_prev_arc; alt_extension;
+       alt_extension = alt_extension->linkl_prev_arc)
+  {
+    wtokenID alt_token_index = alt_extension->token_index;
+    wtokenID alt_bt_token_index;
+    wtokenID bt_token_index;
+    word_token* alt_wtoken;
+    int join_frame_diff; /* need a signed frameID */
+    
+    ASSERT(sanity_count++ < 30);
+    if (alt_token_index == MAXwtokenID)
+      continue;
+    alt_wtoken = &word_token_array[alt_token_index];
+    if (alt_wtoken->word != wtoken->word)
+      continue;
+      
+    alt_bt_token_index = alt_wtoken->backtrace;
+    bt_token_index = wtoken->backtrace;
+    if (alt_bt_token_index == MAXwtokenID && bt_token_index != MAXwtokenID)
+      continue;
+    else if (alt_bt_token_index != MAXwtokenID && bt_token_index == MAXwtokenID)
+      continue;
+    else if (alt_bt_token_index != MAXwtokenID && bt_token_index != MAXwtokenID)
+    {
+      word_token* alt_wtoken_bt;
+      word_token* wtoken_bt;
+      alt_wtoken_bt = &word_token_array[ alt_wtoken->backtrace];
+      wtoken_bt = &word_token_array[ wtoken->backtrace];
+      if (alt_wtoken_bt->word != wtoken_bt->word)
+        continue;
+    }
+    
+    join_frame_diff = alt_wtoken->end_time - wtoken->end_time;
+    if (join_frame_diff < 0) join_frame_diff = -join_frame_diff;
+    if (join_frame_diff > 5)
+      continue;
+      
+    /* the proposed extension is similar in "all" ways to an existing
+       extension, so let's not make this new extension */
+#if PRINT_ASTAR_DETAILS
+    printf("proposed extension already done elsewhere\n");
+#endif
+    return 0;
+  }
+  
+  /* this is a TRUE new extension, so let's extend for sure */
+  extended_parp = make_new_partial_path(stack);
+  if (!extended_parp)
+  {
+#if PRINT_ASTAR_DETAILS
+    printf("make_new_partial_path returned 0\n");
+#endif
+    return 0;
+  }
+  extended_parp->costsofar = parp->costsofar + netcost;
+  extended_parp->token_index = extend_token_index;
+  if (extend_token_index != MAXwtokenID)
+    extended_parp->word = word_token_array[ extend_token_index].word;
+  else
+    extended_parp->word = MAXwordID;
+  if (wtoken->backtrace == MAXwtokenID)
+  {
+    *pwhether_complete = 1;
+    extended_parp->first_prev_arc = PARP_TERMINAL;
+  }
+  else
+  {
+    *pwhether_complete = 0;
+  }
+  extended_parp->arc_for_wtoken = arc_for_extend_token_index;
+  
+  extended_parp->refcount = 1;
+  parp->refcount++;
+  
+  /* maintain the parp tree */
+  extended_parp->next = parp;
+  append_arc_arriving(parp, extended_parp);
+#if PRINT_ASTAR_DETAILS
+  printf("extend path returned %x\n", extended_parp);
+#endif
+  
+  return extended_parp;
+}
+
+void check_stack_root_sanity(AstarStack* stack)
+{
+  partial_path* parp1 = stack->root_path;
+  /* append_arc_arriving(stack->root_path, parp); */
+  for (; parp1->linkl_prev_arc != NULL; parp1 = parp1->linkl_prev_arc)
+    ASSERT(parp1 != parp1->linkl_prev_arc);
+}
+
+/*
+ * make a blank partial path, free one if necessary
+ */
+
+partial_path* make_new_partial_path(AstarStack* stack)
+{
+  partial_path* return_parp = stack->free_parp_list;
+  if (return_parp)
+  {
+    stack->free_parp_list = return_parp->next;
+    memset((void*)return_parp, 0, sizeof(*return_parp)); /* needed */
+  }
+  else
+  {
+    log_report("Warning: ran out of partial_paths, reprune\n");
+#if PRINT_ASTAR_DETAILS
+    printf("Warning: ran out of partial_paths, reprune\n");
+#endif
+    /* kill the last one, and return it, this may free more than one parp! */
+    if (stack->num_active_paths == 0)
+      return 0;
+    stack->num_active_paths--;
+    return_parp = stack->active_paths[stack->num_active_paths];
+    hash_del((FixedSizeHash*)stack->pphash, return_parp);
+    free_partial_path(stack, return_parp);
+    return_parp = stack->free_parp_list;
+    stack->free_parp_list = return_parp->next;
+    memset((void*)return_parp, 0, sizeof(*return_parp)); /* needed */
+  }
+  return return_parp;
+}
+
+/* free_partial_path
+   frees the path that was passed in, and also any backpointers.
+   refcount counts the number of parps that depend on this parp */
+void free_partial_path(AstarStack* stack, partial_path* parp)
+{
+  partial_path* next_parp;
+  for (; parp; parp = next_parp)
+  {
+    next_parp = parp->next;
+    parp->refcount--;
+    if (parp->refcount == 0)
+    {    /* first time around this always passes */
+      remove_path_arriving(parp->next, parp);
+      parp->next = stack->free_parp_list;
+      stack->free_parp_list = parp;
+    }
+    else break;
+  }
+}
+
+/*
+ * make a partial path from a single word at the very end of the graph
+ */
+
+partial_path* make_partial_path(AstarStack* stack,
+                                wtokenID token_index, srec* rec,
+                                int* pwhether_complete)
+{
+  partial_path* parp;
+  word_token* wtoken;
+  
+  /* todo: replace this with partial_path_tokens! */
+  parp = make_new_partial_path(stack);
+  if (!parp) return parp;
+  
+  wtoken = &rec->word_token_array[token_index];
+  parp->token_index = token_index;
+  if (token_index != MAXwtokenID)
+    parp->word = rec->word_token_array[ token_index].word;
+  else
+    parp->word = MAXwordID;
+  /* wtoken->end_time should be equal to rec->current_search_frame */
+  ASSERT(rec->accumulated_cost_offset[ wtoken->end_time] != 0);
+  parp->costsofar = rec->accumulated_cost_offset[ wtoken->end_time];
+  parp->costsofar += wtoken->cost;
+  /* BKWD: rec->word_token_array[ wtoken->backtrace].cost + acc[] */
+  /* FRWD: wtoken->cost + acc[] - rec->word_token_array[ wtoken->backtrace].cost + acc[] */
+  parp->next = 0;
+  parp->first_prev_arc = parp->linkl_prev_arc = 0;
+  if (wtoken->backtrace == MAXwtokenID)
+    *pwhether_complete = 1;
+  else
+    *pwhether_complete = 0;
+  parp->arc_for_wtoken = 0;
+  parp->refcount = 1;
+  return parp;
+}
+
+/* initialize astar search */
+
+AstarStack* astar_stack_make(srec* rec, int max_nbest_len)
+{
+  int i;
+  AstarStack *stack;
+  
+  /* allocations */
+  stack = (AstarStack*)CALLOC_CLR(1, sizeof(AstarStack), "search.astar.base");
+  stack->max_active_paths = max_nbest_len + NBEST_LEN_MARGIN * 3;
+  stack->max_complete_paths = max_nbest_len + NBEST_LEN_MARGIN;
+  stack->complete_paths = (partial_path**)CALLOC_CLR(stack->max_complete_paths, sizeof(partial_path*), "search.astar.cplist");
+  stack->complete_path_confidences = (int*)CALLOC_CLR(stack->max_complete_paths, sizeof(int), "search.astar.confvalues");
+  stack->active_paths = (partial_path**)CALLOC_CLR(stack->max_active_paths, sizeof(partial_path*), "search.astar.aplist");
+  stack->prune_delta = ASTAR_PRUNE_DELTA;
+  
+  stack->num_complete_paths = 0;
+  stack->num_active_paths = 0;
+  
+  stack->partial_path_array = (partial_path*)CALLOC_CLR(MAX_NUM_PARPS, sizeof(stack->partial_path_array[0]), "search.astar.pparray");
+  stack->partial_path_array_size = MAX_NUM_PARPS;
+  
+  stack->free_parp_list = &stack->partial_path_array[0];
+  for (i = 1; i < MAX_NUM_PARPS; i++)
+  {
+    stack->partial_path_array[i-1].next = &stack->partial_path_array[i];
+  }
+  stack->partial_path_array[i-1].next = 0;
+  stack->root_path = 0;
+  
+  stack->pphash = (void*)CALLOC_CLR(1, sizeof(FixedSizeHash), "search.astar.pphash");
+  astar_stack_clear(stack);
+  return stack;
+}
+
+int astar_stack_destroy(srec* rec)
+{
+  AstarStack *stack = rec->astar_stack;
+  FREE(stack->active_paths);
+  FREE(stack->complete_paths);
+  FREE(stack->complete_path_confidences);
+  FREE(stack->partial_path_array);
+  FREE(stack->pphash);
+  FREE(stack);
+  rec->astar_stack = 0;
+  return 0;
+}
+
+/* prepares for astar after forward search on an utterance */
+
+int astar_stack_prepare(AstarStack* stack, int request_nbest_len, srec* rec)
+{
+  wtokenID token_index;
+  word_token* wtoken;
+  partial_path* parp;
+  int whether_complete;
+  frameID end_frame = rec->current_search_frame;
+  int num_wordends;
+  
+  list_free_parps(stack, "astar_stack_prepare ");
+  
+  stack->num_active_paths = 0;
+  stack->num_complete_paths = 0;
+  
+  stack->root_path = make_new_partial_path(stack);
+  ASSERT(stack->root_path);
+  stack->root_path->refcount = 9999;
+  stack->root_path->token_index = MAXwtokenID;
+  stack->root_path->word = MAXwordID;
+  
+  num_wordends = 0;
+  for (token_index = rec->word_lattice->words_for_frame[end_frame];
+       token_index != MAXwtokenID;
+       token_index = wtoken->next_token_index)
+  {
+    num_wordends++;
+    wtoken = &rec->word_token_array[ token_index];
+    parp = make_partial_path(stack, token_index, rec, &whether_complete);
+    if (!parp)
+    {
+      log_report("Error: out-of-memory in astar_stack_prepare(), "
+                 "num_wordends %d\n", num_wordends);
+      stack->num_complete_paths = 0;
+      return 1;
+    }
+    append_arc_arriving(stack->root_path, parp);
+    
+    if (parp && whether_complete)
+    {
+      /* here .. check for dups ?? */
+      stack->complete_paths[ stack->num_complete_paths++] = parp;
+      if (stack->num_complete_paths == request_nbest_len)
+        return 0;
+    }
+    else if (parp)
+    {
+      stack->active_paths[ stack->num_active_paths++] = parp;
+    }
+  }
+  
+  list_free_parps(stack, "astar_stack_prepare ");
+  
+  return 0;
+}
+
+/* cleans up astar after an utterance */
+
+void astar_stack_clear(AstarStack* stack)
+{
+  int i;
+  
+  /* free the partial_path's that were allocated */
+  for (i = 0; i < stack->num_active_paths; i++)
+    free_partial_path(stack, stack->active_paths[i]);
+  for (i = 0; i < stack->num_complete_paths; i++)
+    free_partial_path(stack, stack->complete_paths[i]);
+  if (stack->root_path)
+    free_partial_path(stack, stack->root_path);
+    
+  /* this shouldn't be necessary, but there are a couple of bugs
+     in parp management, so let's leave it for now */
+  stack->free_parp_list = &stack->partial_path_array[0];
+  for (i = 1; i < MAX_NUM_PARPS; i++)
+    stack->partial_path_array[i-1].next = &stack->partial_path_array[i];
+  stack->partial_path_array[i-1].next = 0;
+  stack->num_active_paths = 0;
+  stack->num_complete_paths = 0;
+  stack->root_path = 0;
+  
+  list_free_parps(stack, "astar_stack_clear ");
+  
+}
+
+/* do the astar search */
+
+int astar_stack_do_backwards_search(srec* rec, int request_nbest_len)
+{
+  int i;
+  AstarStack *stack = rec->astar_stack;
+  word_token *wtoken, *btoken;
+  partial_path *parp, *extended_parp, *tparp;
+  wtokenID token_index, btoken_index;
+  int whether_complete = 0;
+  bigcostdata max_cost = 0;
+  arc_token* arc_for_token_index = NULL;
+  
+  arc_token* arc_token_list;   /* to skip graph constraints, just set this to NULL */
+  arcID arc_token_list_len;
+  srec_word_lattice* lattice;
+  
+  int max_complete_paths;
+  
+  if (!rec || !rec->context)
+  {
+    log_report("Error: bad arguments in astar_stack_do_backwards_search()\n");
+    return 1;
+  }
+  max_complete_paths = request_nbest_len < stack->max_complete_paths ?
+                       request_nbest_len : stack->max_complete_paths;
+                       
+  arc_token_list = rec->context->arc_token_list;
+  arc_token_list_len = rec->context->arc_token_list_len;
+  lattice = rec->word_lattice;
+  
+  /* initialization, now from calling function */
+  /* astar_stack_prepare(stack, request_nbest_len, rec); */
+  hash_init((FixedSizeHash*)stack->pphash, rec);
+  
+  /* search */
+  while (stack->num_active_paths > 0)
+  {
+  
+    list_free_parps(stack, "do_astar_back BEG");
+    
+    /* extend top path */
+    parp = stack->active_paths[0];
+    wtoken = &rec->word_token_array[parp->token_index];
+    token_index = wtoken->backtrace;
+    wtoken = &rec->word_token_array[token_index];
+    ASSERT(token_index != MAXwtokenID); /* should have been "complete" */
+    
+    
+#if PRINT_ASTAR_DETAILS
+    print_partial_paths(stack->complete_paths, stack->num_complete_paths,
+                        rec, "=== Complete Paths ===\n");
+    print_partial_paths(stack->active_paths, stack->num_active_paths,
+                        rec, "=== Active Paths ===\n");
+#endif
+                        
+    /* pop this one */
+    for (i = 0; i < stack->num_active_paths - 1; i++)
+      stack->active_paths[i] = stack->active_paths[i+1];
+    stack->num_active_paths--;
+    
+    if (wtoken->end_time != MAXframeID)
+    {
+      /* sort the word token array by score, so that we pick the best
+      scoring paths first */
+      /* later add a 'whether_sorted' flag to the lattice_at_frame information */
+      sort_word_lattice_at_frame(rec, (frameID)(wtoken->end_time + 1));
+      
+      /* extend this path, with every word ending where this word began */
+      /* #warning there appear to be duplicates */
+      
+      btoken_index = lattice->words_for_frame[ wtoken->end_time+1];
+    }
+    else
+    {
+      btoken_index = MAXwtokenID;
+    }
+    
+#if PRINT_ASTAR_DETAILS
+    print_path(parp, rec, "Now Processing Top of Stack(2): ");
+    printf("Frame %d\n", wtoken->end_time + 1);
+    print_word_token_list(rec, btoken_index, "List of Word at Frame\n");
+#endif
+    
+    for (; btoken_index != MAXwtokenID; btoken_index = btoken->next_token_index)
+    {
+      btoken = &rec->word_token_array[btoken_index];
+      
+      /* alternate choice must end at same frame */
+      //      ASSERT(btoken->end_time == wtoken->end_time);
+      
+#if PRINT_ASTAR_DETAILS
+      print_path(parp, rec, "Now Processing Top of Stack(3): ");
+      print_word_token(rec, btoken_index, "Extending word ");
+#endif
+      
+      /* check if this potential extension is allowed by the
+      word graph, if not just drop it! */
+      
+      if (arc_token_list)
+      {
+        arc_for_token_index = get_arc_for_word(parp->arc_for_wtoken,
+                                               btoken->word,
+                                               rec->context,
+                                               rec->context->beg_silence_word);
+        if (arc_for_token_index == NULL)
+        {
+#if PRINT_ASTAR_DETAILS
+          printf("Not allowed by graph!\n");
+#endif
+          continue;
+        }
+      }
+      
+      /* figure out the cost to beat ! */
+      if (stack->num_complete_paths)
+      {
+        max_cost = stack->complete_paths[0]->costsofar + stack->prune_delta;
+      }
+      else if (stack->num_active_paths == stack->max_active_paths)
+      {
+        max_cost = stack->active_paths[ stack->num_active_paths-1]->costsofar;
+      }
+      else if (stack->num_active_paths > 0)
+      {
+        max_cost = stack->active_paths[0]->costsofar + stack->prune_delta;
+      }
+      else
+      {
+        max_cost = MAXbcostdata;
+      }
+      
+      extended_parp = extend_path(stack, parp, btoken_index, arc_for_token_index, max_cost, rec->word_token_array, &whether_complete);
+      
+      if (extended_parp)
+      {
+        int fsh_rc = hash_set((FixedSizeHash*)stack->pphash, extended_parp);
+        if (fsh_rc == FSH_KEY_OCCUPIED)
+        {
+          /* seen this path before, let's not bother with it */
+#if PRINT_ASTAR_DETAILS
+          print_path(extended_parp, rec, "dup!! ");
+#endif
+          free_partial_path(stack, extended_parp);
+          extended_parp = 0;
+        }
+      }
+      
+      if (extended_parp && whether_complete)
+      {
+        ASSERT(stack->num_complete_paths < stack->max_complete_paths);
+        stack->complete_paths[ stack->num_complete_paths++] = extended_parp;
+        /*if(stack->num_complete_paths >= request_nbest_len)
+          return 0;*/
+        
+        
+#if PRINT_ASTAR_DETAILS
+        print_path(extended_parp, rec, "&&Extended, complete : ");
+#endif
+      }
+      else if (extended_parp)
+      {
+        /* todo: check if this extended_parp is already completed on the
+           stack->complete_paths, if so just rejoin with that guy somehow */
+        
+#if PRINT_ASTAR_DETAILS
+        print_path(extended_parp, rec, "&&Extended, incomplete : ");
+#endif
+        if (stack->num_active_paths == stack->max_active_paths)
+        {
+          /* kill the last one */
+          stack->num_active_paths--;
+          tparp = stack->active_paths[stack->num_active_paths];
+          hash_del((FixedSizeHash*)stack->pphash, tparp);
+          free_partial_path(stack, tparp);
+        }
+        insert_partial_path(stack->active_paths, &stack->num_active_paths,
+                            extended_parp);
+      }
+#if PRINT_ASTAR_DETAILS
+      else
+      {
+        printf("&&Extended, cost too high (>%d):\n", max_cost);
+      }
+#endif
+      if (stack->num_complete_paths == max_complete_paths)
+      {
+#if PRINT_ASTAR_DETAILS
+        printf("Complete paths are full %d, stopping\n", stack->num_complete_paths);
+#endif
+        break;
+      }
+    }
+#if PRINT_ASTAR_DETAILS
+    if (do_draw_as_dotty > 0)
+    {
+      char tmp[32];
+      sprintf(tmp, "astar.%.3d.dot", do_draw_file_idx++);
+      astar_draw_tree_as_dotty(tmp, rec, stack);
+      if (do_draw_as_dotty > 1)
+        system("C:/tools/graphviz/bin/dotty.exe astar.dot");
+    }
+#endif
+    
+    SREC_STATS_UPDATE_ASTAR(stack);
+    hash_del((FixedSizeHash*)stack->pphash, parp);
+    free_partial_path(stack, parp); /* done all extensions, now free */
+    if (stack->num_complete_paths == max_complete_paths)
+    {
+#if PRINT_ASTAR_DETAILS
+      printf("Complete paths are full %d, stopping\n", stack->num_complete_paths);
+#endif
+      break;
+    }
+    
+    list_free_parps(stack, "do_astar_back END");
+  }
+  sort_partial_paths(stack->complete_paths, stack->num_complete_paths);
+  /* if we're doing a search within a grammar, then print the complete choices
+     else we're likely just doing reprune_word_tokens() */
+#if PRINT_ASTAR_SOMEWHAT
+  if (rec->context->arc_token_list)
+    print_partial_paths(stack->complete_paths, stack->num_complete_paths,
+                        rec, "=== Complete paths ===\n");
+#endif
+  /* now the caller must call clear */
+  /* astar_stack_clear(stack); */
+  
+  return 0;
+}
+
+void sort_partial_paths(partial_path** parps, int num_parps)
+{
+  int i, j;
+  for (i = 0; i < num_parps; i++)
+  {
+    for (j = 0; j < num_parps - 1; j++)
+    {
+      if (parps[j]->costsofar > parps[j+1]->costsofar)
+      {
+        partial_path* parp = parps[j];
+        parps[j] = parps[j+1];
+        parps[j+1] = parp;
+      }
+    }
+  }
+}
+
+void insert_partial_path(partial_path** parps, int *pnum_parps, partial_path* insert_parp)
+{
+  int i, j, insert_index;
+  int num_parps = *pnum_parps;
+  
+  /* maintain the list sorted, search the list linearly for now,
+     do priority_q type heap later */
+  insert_index = num_parps;
+  for (i = 0; i < num_parps; i++)
+  {
+    if (insert_parp->costsofar < parps[i]->costsofar)
+    {
+      insert_index = i;
+      break;
+    }
+  }
+  for (j = num_parps; j > insert_index; --j)
+    parps[j] = parps[j-1];
+  parps[j] = insert_parp;
+  num_parps++;
+  *pnum_parps = num_parps;
+}
+
+void print_path(partial_path* ipath, srec* rec, char* msg)
+{
+  partial_path* path;
+  word_token* wtoken;
+  word_token* last_wtoken;
+  char* p;
+  char trans[256];
+  int max_trans_len = 255;
+  int rc;
+#ifndef NDEBUG
+  int sanity_count = 0;
+#endif
+  frameID end_time;
+  
+  PLogMessage("%spath score=%d ", msg, ipath->costsofar);
+  
+  rc = sprint_word_token_backtrace(trans, max_trans_len, rec, ipath->token_index);
+  ASSERT(rc == 0);
+  
+  last_wtoken = 0;
+  end_time = (ipath && ipath->token_index != MAXwtokenID) ? rec->word_token_array[ipath->token_index].end_time : MAXframeID;
+#if SHOW_END_TIMES
+  printf("%s@%d || ", trans, end_time);
+#else
+  printf("%s || ", trans);
+#endif
+  
+  path = ipath->next;  /* we've already printed this thing */
+  for (; path; path = path->next)
+  {
+    ASSERT(sanity_count++ < 256);
+    if (path->token_index == MAXwtokenID) break;
+    wtoken = &rec->word_token_array[ path->token_index];
+    p = "NULL";
+    if (rec->context->olabels->words[wtoken->word])
+      p = rec->context->olabels->words[wtoken->word];
+#if SHOW_END_TIMES
+    printf("%s@%d ", p, wtoken->end_time);
+#else
+    printf("%s ", p);
+#endif
+    if (last_wtoken != NULL)
+    {
+      if (wtoken->end_time < last_wtoken->end_time)
+      {
+        printf(" Error: wt%d < lwt%d\n", wtoken->end_time, last_wtoken->end_time);
+        pfflush(PSTDOUT);
+        ASSERT(0);
+      }
+    }
+    last_wtoken = wtoken;
+  }
+  printf("\n");
+}
+
+void print_partial_paths(partial_path** parps, int num_parps,
+                         srec* rec, const char* msg)
+{
+  int i;
+  char buf[32];
+  printf(msg);
+  for (i = 0; i < num_parps; i++)
+  {
+    sprintf(buf, "%.3d ", i);
+    print_path(parps[i], rec, buf);
+  }
+}
+
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ * visualization .. sometimes helps debugging                               *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+#if PRINT_ASTAR_DETAILS
+
+
+int astar_draw_arc_as_dotty(FILE* fp, partial_path* parp, int src_node, int *nodes_used, srec* rec)
+{
+  word_token* word_token_array = rec->word_token_array;
+  partial_path* parp1;
+  int sanity_count = 0;
+  int to_nodes[32], *pto_nodes, inode;
+  pto_nodes = to_nodes;
+  
+  fprintf(fp, "%d [label = \"%d\", shape = circle, style = solid]\n",
+          src_node, src_node);
+  for (parp1 = parp->first_prev_arc; parp1; parp1 = parp1->linkl_prev_arc)
+  {
+    arc_token* arc = parp1->arc_for_wtoken;
+    for (inode = 0; nodes_used[inode]; inode++) ;
+    nodes_used[inode] = 1;
+    *pto_nodes++ = inode;
+    fprintf(fp, "  %d -> %d [label = \"(%d).%d.%s@%d/%d\"];\n",
+            src_node, inode, parp1->refcount,
+            parp1->token_index,
+            (arc && arc != (arc_token*)1) ? rec->context->olabels->words[arc->ilabel] : "NULL",
+            word_token_array[ parp1->token_index].end_time,
+            parp1->costsofar);
+    if (sanity_count++  > 30) break;
+  }
+  
+  pto_nodes = to_nodes;
+  sanity_count = 0;
+  for (parp1 = parp->first_prev_arc; parp1; parp1 = parp1->linkl_prev_arc)
+  {
+    astar_draw_arc_as_dotty(fp, parp1, *pto_nodes, nodes_used, rec);
+    pto_nodes++;
+    if (sanity_count++  > 30) break;
+  }
+  return 0;
+}
+
+int astar_draw_tree_as_dotty(const char* file, srec* rec, AstarStack* stack)
+{
+  word_token* word_token_array = rec->word_token_array;
+  FILE* fp = fopen(file, "w");
+  partial_path* parp;
+  int nodes_used[1024];
+  memset(nodes_used, 0, 1024*sizeof(int));
+  
+  fprintf(fp,
+          "digraph FSM {\n"
+          "rankdir = LR;\n"
+          "size = \"8.5,11\";\n"
+          "fontsize = 14;\n"
+          "label = \"\\n\\naaron.PCLG\"\n"
+          "center = 1;\n"
+          "orientation = Landscape\n"
+         );
+  nodes_used[0] = 1;
+  for (parp = stack->root_path; parp; parp = parp->linkl_prev_arc)
+    astar_draw_arc_as_dotty(fp, parp, 0, nodes_used, rec);
+    
+  fprintf(fp, "}\n");
+  fclose(fp);
+  printf("....... dotty %s ......\n", file);
+  return 0;
+}
+
+#endif
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ * functions relating to in-recognition backtrace                           *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+int maybe_add_to_active_paths(AstarStack* stack, word_token* word_token_array, bigcostdata cost, wtokenID wtoken_index);
+int astar_stack_prepare_from_active_search(AstarStack* stack, int nbestlen, srec* rec)
+{
+  wtokenID wtoken_index;
+  ftokenID ftoken_index;
+  fsmnode_token* ftoken;
+  stokenID stoken_index;
+  fsmarc_token* stoken;
+  /* word_token* wtoken; */
+  frameID prune_frame = rec->current_search_frame;
+  int i, rc = 0, rc1 = 0;
+  bigcostdata parp_costsofar;
+  
+  stack->num_active_paths = 0;
+  stack->num_complete_paths = 0;
+  stack->root_path = 0;
+  
+  /* put it on the stack */
+  stack->root_path = make_new_partial_path(stack);
+  ASSERT(stack->root_path);
+  stack->root_path->refcount = 9999;
+  stack->root_path->token_index = MAXwtokenID;
+  stack->root_path->word = MAXwordID;
+  
+  ftoken_index = rec->active_fsmnode_tokens;
+  for (; ftoken_index != MAXftokenID; ftoken_index = ftoken->next_token_index)
+  {
+    ftoken = &rec->fsmnode_token_array[ ftoken_index];
+    wtoken_index = ftoken->word_backtrace;
+    if (wtoken_index == MAXwtokenID)
+      continue;
+      
+    /* fix the score */
+    parp_costsofar = ftoken->cost;
+    parp_costsofar += rec->accumulated_cost_offset[ prune_frame];
+    
+    rc += (rc1 = maybe_add_to_active_paths(stack, rec->word_token_array, parp_costsofar, wtoken_index));
+    /* we can handle that a path was not added for this ftoken because
+       we made sure to flag the wtokens along it's top backtrace */
+  }
+  
+  stoken_index = rec->active_fsmarc_tokens;
+  for (; stoken_index != MAXstokenID; stoken_index = stoken->next_token_index)
+  {
+    stoken = &rec->fsmarc_token_array[ stoken_index];
+    for (i = 0; i < stoken->num_hmm_states; i++)
+    {
+      wtoken_index = stoken->word_backtrace[i];
+      if (wtoken_index == MAXwtokenID)
+        continue;
+      parp_costsofar = stoken->cost[i];
+      parp_costsofar += rec->accumulated_cost_offset[ prune_frame];
+      
+      rc += (rc1 = maybe_add_to_active_paths(stack, rec->word_token_array, parp_costsofar, wtoken_index));
+      /* we can handle that a path was not added for this stoken because
+      we made sure to flag the wtokens along it's top backtrace */
+    }
+  }
+  
+#if PRINT_ASTAR_DETAILS
+  print_partial_paths(stack->active_paths, stack->num_active_paths,
+                      rec, "== active paths before sorting ==\n");
+  sort_partial_paths(stack->active_paths, stack->num_active_paths);
+  print_partial_paths(stack->active_paths, stack->num_active_paths,
+                      rec, "== active paths after sorting ==\n");
+#endif
+  list_free_parps(stack, "astar_prepare_from_active_search");
+  return 0;
+}
+
+int maybe_add_to_active_paths(AstarStack* stack, word_token* word_token_array, bigcostdata parp_costsofar, wtokenID wtoken_index)
+{
+  int i;
+  int replace_index;
+  int inserts_index;
+  partial_path* parp;
+  word_token* wtoken;
+  wtoken = &word_token_array[ wtoken_index];
+  
+  if (wtoken->backtrace == MAXwtokenID)
+  {
+    return 0;
+  }
+  
+  /* see if we already have this word token backtrace */
+  replace_index = -1;
+  inserts_index = -1;
+  for (i = 0; i < stack->num_active_paths; i++)
+  {
+    if (stack->active_paths[i]->token_index == wtoken_index)
+    {
+      if (parp_costsofar < stack->active_paths[i]->costsofar)
+      {
+        /* this one is better than another we already have! */
+        replace_index = i;
+        if (inserts_index < 0)
+          inserts_index = i;
+      }
+      break;
+    }
+    else if (parp_costsofar < stack->active_paths[i]->costsofar)
+    {
+      if (inserts_index < 0)
+        inserts_index = i;
+    }
+  }
+#if PRINT_ASTAR_QBT_DETAILS
+  printf("maybe_add replace %d insert %d\n", replace_index, inserts_index);
+#endif
+  
+  if (replace_index >= 0)
+  {
+    free_partial_path(stack, stack->active_paths[replace_index]);
+    /* stack->active_paths[replace_index] = 0; */
+    for (i = replace_index; i > inserts_index; --i)
+      stack->active_paths[i] = stack->active_paths[i-1];
+    stack->active_paths[inserts_index] = 0;
+  }
+  else if (inserts_index >= 0)
+  {
+    if (stack->num_active_paths == stack->max_active_paths)
+    {
+      free_partial_path(stack, stack->active_paths[ stack->num_active_paths-1]);
+      stack->num_active_paths--;
+    }
+    for (i = stack->num_active_paths; i > inserts_index; --i)
+      stack->active_paths[i] = stack->active_paths[i-1];
+    stack->active_paths[inserts_index] = 0;
+    stack->num_active_paths++;
+  }
+  else if (stack->num_active_paths < stack->max_active_paths)
+  {
+    /* append if there's space */
+    inserts_index = stack->num_active_paths;
+    stack->num_active_paths++;
+    stack->active_paths[inserts_index] = 0;
+  }
+  else
+  {
+    /* no space */
+    return 1;
+  }
+  
+  /* create a parp */
+#if PRINT_ASTAR_QBT_DETAILS
+  printf("maybe_add .. creating new parp %d\n", parp_costsofar);
+#endif
+  /* this should always succeed because of above frees */
+  ASSERT(stack->free_parp_list);
+  parp = make_new_partial_path(stack);
+  parp->token_index = wtoken_index;
+  if (wtoken_index != MAXwtokenID)
+    parp->word = word_token_array[ wtoken_index].word;
+  else
+    parp->word = MAXwordID;
+  parp->next = stack->root_path;
+  parp->first_prev_arc = parp->linkl_prev_arc = 0;
+  parp->arc_for_wtoken = 0;
+  parp->refcount = 1;
+  parp->costsofar = parp_costsofar;
+  
+  stack->active_paths[ inserts_index] = parp;
+  
+#if PRINT_ASTAR_QBT_DETAILS
+  printf("maybe_add .. appending to root\n");
+#endif
+  append_arc_arriving(stack->root_path, parp);
+  return 0;
+}
+
+
+int astar_stack_flag_word_tokens_used(AstarStack* stack, srec* rec)
+{
+  int i;
+  wtokenID wtoken_index;
+  partial_path* parp;
+  int num_flagged_by_path;
+  
+#if PRINT_ASTAR_QBT_DETAILS
+  print_partial_paths(stack->complete_paths, stack->num_complete_paths,
+                      rec, "=== Complete QBT paths ===\n");
+#endif
+                      
+  for (i = 0; i < stack->num_complete_paths; i++)
+  {
+    num_flagged_by_path = 0;
+    for (parp = stack->complete_paths[i]; parp; parp = parp->next)
+    {
+      wtoken_index = parp->token_index;
+      if (wtoken_index == MAXwtokenID) break;
+      rec->word_token_array_flags[ wtoken_index]++;
+      if (rec->word_token_array_flags[wtoken_index] > 0)
+      {
+        num_flagged_by_path++;
+#if PRINT_ASTAR_QBT_DETAILS
+        printf("%d ", wtoken_index);
+#endif
+      }
+    }
+    
+    /* also flag the main backtrace of every word token */
+    /* we do we need this?  I'm not sure, but it appears
+       that some backtrace tokens are not flagged for whatever
+       reason.  It's worth revisiting this when other bugs are
+       are resolved.  This is in a separate loop from the 
+       above because it allows us to detect that this is
+       happening in the first place */
+    for (parp = stack->complete_paths[i]; parp; parp = parp->next)
+    {
+      word_token *btoken, *last_btoken;
+      wtokenID btoken_index;
+      wtoken_index = parp->token_index;
+      if (wtoken_index == MAXwtokenID) break;
+      last_btoken = NULL;
+      btoken = &rec->word_token_array[ wtoken_index];
+      btoken_index = btoken->backtrace;
+      for (; btoken_index != MAXwtokenID; btoken_index = btoken->backtrace)
+      {
+        btoken = &rec->word_token_array[ btoken_index];
+        rec->word_token_array_flags[ btoken_index]++;
+        if (rec->word_token_array_flags[ btoken_index] == 1)
+        {
+          num_flagged_by_path++;
+#if PRINT_ASTAR_QBT_DETAILS
+          printf("%db ", btoken_index);
+#endif
+        }
+        if (last_btoken && last_btoken->end_time <= btoken->end_time)
+        {
+          PLogError("bad looping path encountered, breaking");
+          break;
+        }
+        last_btoken = btoken;
+      }
+    }
+    
+#if PRINT_ASTAR_QBT_DETAILS
+    printf("complete path %.3d flagged %d\n", i, num_flagged_by_path);
+#endif
+  }
+  return 0;
+}
+
+
+#if DEBUG_PARP_MANAGEMENT
+#define PARP_FREE 1
+#define PARP_USED 2
+void list_free_parps(AstarStack* stack, char* msg)
+{
+  partial_path* parp;
+  int i, num = 0;
+  char x[MAX_NUM_PARPS];
+  for (i = 0; i < MAX_NUM_PARPS; i++) x[i] = 0;
+  for (parp = stack->free_parp_list; parp; parp = parp->next)
+  {
+    num++;
+    x[(parp-stack->partial_path_array)] = PARP_FREE;
+  }
+  PLogMessage("%sstack->free_parp_list size %d ", msg, num);
+  PLogMessage("active %d complete %d\n", stack->num_active_paths, stack->num_complete_paths);
+  
+  for (i = 0; i < stack->num_active_paths; i++)
+  {
+    parp = stack->active_paths[i];
+    for (; parp; parp = parp->next) x[(parp-stack->partial_path_array)] = PARP_USED;
+  }
+  for (i = 0; i < stack->num_complete_paths; i++)
+  {
+    parp = stack->complete_paths[i];
+    for (; parp; parp = parp->next) x[(parp-stack->partial_path_array)] = PARP_USED;
+  }
+  if (stack->root_path)
+    x[(stack->root_path-stack->partial_path_array)] = PARP_USED;
+  printf("free: ");
+  for (i = 0; i < MAX_NUM_PARPS; i++) if (x[i] == PARP_FREE) printf(" %d", i);
+  printf("\n");
+  printf("used: ");
+  for (i = 0; i < MAX_NUM_PARPS; i++) if (x[i] == PARP_USED) printf(" %d", i);
+  printf("\n");
+  for (i = 0, num = 0; i < MAX_NUM_PARPS; i++) if (!x[i]) num++;
+  printf("unaccounted for %d\n", num);
+  ASSERT(num == 0);
+  
+}
+#endif
diff --git a/srec/crec/astar_pphash.c b/srec/crec/astar_pphash.c
new file mode 100644
index 0000000..22e838b
--- /dev/null
+++ b/srec/crec/astar_pphash.c
@@ -0,0 +1,172 @@
+/*---------------------------------------------------------------------------*
+ *  astar_pphash.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "pstdio.h"
+#include "passert.h"
+#include "portable.h"
+
+#include"duk_err.h"
+#include"srec.h"
+#include"astar.h"
+#include"astar_pphash.h"
+
+#define DEBUG_PPHASH 0
+
+
+/* initialize the hash with no elements defined */
+
+void hash_init(FixedSizeHash* hash, srec* rec_debug)
+{
+  int i;
+  hash->hashsize = FSH_HASHSIZE;
+  for (i = 0; i < hash->hashsize; i++)
+    hash->items[i] = FSH_NULL;
+  hash->rec = rec_debug;
+}
+
+/* compare a couple of paths,
+   ie see whether the word history is the same */
+
+int compare_parp(partial_path* parp1, partial_path* parp2, srec* rec)
+{
+  asr_int32_t diff = 0;
+  if (parp1->first_prev_arc != PARP_TERMINAL ||
+      parp2->first_prev_arc != PARP_TERMINAL)
+  {
+    diff = parp1->token_index - parp2->token_index;
+  }
+  else
+  {
+    while (parp1->next && parp2->next)
+    {
+      diff = parp1->word - parp2->word;
+      if (diff)
+      {
+        goto CPE;
+      }
+      parp1 = parp1->next;
+      parp2 = parp2->next;
+    }
+    diff = (int)parp1->next - (int)parp2->next;
+  }
+CPE:
+  if (diff)
+    diff = (diff < 0 ? -1 : 1);
+  return diff;
+}
+
+/* find the bin */
+
+unsigned int hashfunc(partial_path* parp)
+{
+  unsigned int hashval;
+  if (parp->first_prev_arc != PARP_TERMINAL)
+    hashval = parp->token_index;
+  else
+    hashval = 0;
+  hashval = (hashval << 10) + parp->word;
+  while ((parp = parp->next) != NULL)
+  {
+    if (parp->word != MAXwordID)
+      hashval = hashval * 64 + parp->word + hashval % 65536;
+  }
+  return hashval;
+}
+
+/* get a history same as this one */
+
+int hash_get(FixedSizeHash* hash, partial_path* parp, void** hval)
+{
+  unsigned int hkey_index = hashfunc(parp);
+  partial_path* p_return;
+  
+  hkey_index = hkey_index % hash->hashsize;
+  p_return = hash->items[hkey_index];
+  if (!p_return)
+    return FSH_NO_SUCH_KEY;
+  for (; p_return; p_return = p_return->hashlink)
+  {
+    if (compare_parp(p_return, parp, hash->rec) == 0)
+    {
+      *hval = p_return;
+      return FSH_SUCCESS;
+    }
+  }
+  return FSH_NO_SUCH_KEY;
+}
+
+/* set this, return error is same path already there */
+
+int hash_set(FixedSizeHash* hash, partial_path* parp)
+{
+  unsigned int hkey_index = hashfunc(parp);
+  partial_path** p_insert;
+  
+  hkey_index = hkey_index % hash->hashsize;
+  p_insert = &hash->items[hkey_index];
+  for (; *p_insert; p_insert = &((*p_insert)->hashlink))
+  {
+    if (*p_insert == parp)
+    {
+#if 1||DEBUG_PPHASH
+      print_path(parp, hash->rec, "problem in astar_pphash hash_set ");
+#endif
+      return FSH_SUCCESS;
+    }
+    else if (compare_parp(*p_insert, parp, hash->rec) == 0)
+    {
+#if DEBUG_PPHASH
+      print_path(*p_insert, hash->rec, "key taken in astar_pphash hash_set ");
+#endif
+      return FSH_KEY_OCCUPIED;
+    }
+  }
+  *p_insert = parp;
+#if DEBUG_PPHASH
+  printf("setting at %d ", hkey_index);
+  print_path(parp, hash->rec, "");
+#endif
+  parp->hashlink = FSH_NULL;
+  return FSH_SUCCESS;
+}
+
+/* delete an element */
+
+int hash_del(FixedSizeHash* hash, partial_path* parp)
+{
+  unsigned int hkey_index = hashfunc(parp);
+  partial_path** p_insert;
+  
+  hkey_index = hkey_index % hash->hashsize;
+  p_insert = &hash->items[hkey_index];
+  for (; *p_insert; p_insert = &((*p_insert)->hashlink))
+  {
+    if (compare_parp(*p_insert, parp, hash->rec) == 0)
+    {
+      *p_insert = parp->hashlink;
+#if DEBUG_PPHASH
+      printf("delhash at %d\n", hkey_index);
+      print_path(parp, hash->rec, "deleted ");
+#endif
+      return FSH_SUCCESS;
+    }
+  }
+  return FSH_NO_SUCH_KEY;
+}
+
diff --git a/srec/crec/astar_pphash.h b/srec/crec/astar_pphash.h
new file mode 100644
index 0000000..9bb4220
--- /dev/null
+++ b/srec/crec/astar_pphash.h
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*
+ *  astar_pphash.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ASTAR_PPHASH__
+#define __ASTAR_PPHASH__
+
+#define FSH_SUCCESS       0
+#define FSH_KEY_OCCUPIED  1
+#define FSH_NO_SUCH_KEY   2
+#define FSH_HASHSIZE     37
+#define FSH_NULL 0
+
+#include "astar.h"
+
+/**
+ * The FixedSizeHash is a hash that does not grow in size.
+ * In each bin there are a number of elements, which are maintained
+ * via a linked list.
+ * This is used to find out whether a path with the same word history
+ * as the one being expanded has already been search.  If yes, we can
+ * abort this one.
+ */
+typedef struct
+{
+  int hashsize;
+  partial_path* items[FSH_HASHSIZE];
+  srec* rec;
+}
+FixedSizeHash;
+
+void hash_init(FixedSizeHash* hash, srec* rec);
+int hash_del(FixedSizeHash* hash, partial_path* parp);
+unsigned int hashfunc(partial_path* parp);
+int compare_parp(partial_path* parp1, partial_path* parp2, srec* rec);
+int hash_get(FixedSizeHash* hash, partial_path* parp, void** hval);
+int hash_set(FixedSizeHash* hash, partial_path* parp);
+
+#endif
diff --git a/srec/crec/c47mulsp.c b/srec/crec/c47mulsp.c
new file mode 100644
index 0000000..084d70b
--- /dev/null
+++ b/srec/crec/c47mulsp.c
@@ -0,0 +1,134 @@
+/*---------------------------------------------------------------------------*
+ *  c47mulsp.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _RTT
+#include "pstdio.h"
+#endif
+#include "passert.h"
+
+#include "c42mul.h"
+#include "portable.h"
+#include "srec_context.h"
+#include "srec.h"
+
+int add_acoustic_model_for_recognition(multi_srec* recm, SWIModel* model)
+{
+  if (recm->num_swimodels >= MAX_ACOUSTIC_MODELS)
+  {
+    log_report("Error: recognizer can't hold any more acoustic models\n");
+    return 0;
+  }
+  if (recm->num_activated_recs >= recm->num_allocated_recs)
+  {
+    log_report("Error: too few recognizers allocated\n");
+    return 0;
+  }
+  
+  if (recm->rec[0].num_model_slots_allocated < model->num_hmmstates)
+  {
+    PLogError("recognizer max_model_states %d, acoustic model num states %d, set CREC.Recognizer.max_model_states higher\n",
+              recm->rec[0].num_model_slots_allocated,
+              model->num_hmmstates);
+    return 0;
+  }
+  
+  recm->swimodel[ recm->num_swimodels] = model;
+  recm->num_swimodels++;
+  
+  recm->num_activated_recs++;
+  return 1;
+}
+
+int clear_acoustic_models_for_recognition(multi_srec* recm)
+{
+  recm->num_swimodels = 0;
+  recm->num_activated_recs = 0;
+  return 0;
+}
+
+void begin_recognition(multi_srec *recm, int begin_syn_node)
+{
+  int i = 0;
+#if DO_ALLOW_MULTIPLE_MODELS
+  ASSERT(recm->num_activated_recs == recm->num_swimodels);
+  for (i = 0; i < recm->num_activated_recs; i++)
+#endif
+    srec_begin(&recm->rec[i], begin_syn_node);
+  for (i = 0;i < recm->max_fsm_nodes;i++)
+    recm->best_token_for_node[i] = MAXftokenID;
+  recm->eos_status = VALID_SPEECH_CONTINUING;
+}
+
+void end_recognition(multi_srec *recm)
+/*
+**  To free space allocated for recognizer variables
+*/
+{
+  int i = 0;
+#if DO_ALLOW_MULTIPLE_MODELS
+  for (i = 0; i < recm->num_activated_recs; i++)
+#endif
+		srec_no_more_frames(&recm->rec[i]);
+  /* srec_get_result(rec);  */
+}
+
+int activate_grammar_for_recognition(multi_srec* recm, srec_context* grammar, const char* rule)
+{
+  srec_context* context = (srec_context*)grammar;
+  
+  context->max_searchable_nodes = recm->max_fsm_nodes;
+  context->max_searchable_arcs  = recm->max_fsm_arcs;
+  
+  if (context->max_searchable_nodes < context->num_nodes || context->max_searchable_arcs < context->num_arcs)
+  {
+    PLogError(L("Error: context switch failed due to search limitations [arcs max=%d, actual=%d], [nodes max=%d, actual=%d]\n"),
+              context->max_searchable_arcs, context->num_arcs,
+              context->max_searchable_nodes, context->num_nodes);
+    return 1;
+  }
+  else
+  {
+    int i, rc = 0;
+    for (i = 0; i < recm->num_allocated_recs; i++)
+      recm->rec[i].context = context;
+    rc = FST_PrepareContext(context);
+    if (rc)
+      return rc;
+    else
+      return 0;
+  }
+}
+
+int clear_grammars_for_recognition(multi_srec* recm)
+{
+  int i;
+  for (i = 0; i < recm->num_allocated_recs; i++)
+  {
+    recm->rec[i].context = NULL;
+  }
+  return 0;
+}
+
+
+
+
+
+
+
+
diff --git a/srec/crec/comp_stats.c b/srec/crec/comp_stats.c
new file mode 100644
index 0000000..aacbac6
--- /dev/null
+++ b/srec/crec/comp_stats.c
@@ -0,0 +1,189 @@
+/*---------------------------------------------------------------------------*
+ *  comp_stats.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "buildopt.h"
+#include "pstdio.h"
+#include "passert.h"
+#include <time.h>
+#include "comp_stats.h"
+#include "portable.h"
+#include "PFile.h"
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid : "$Id: compstats now";
+#endif
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+  COMP_STATS *comp_stats = NULL;
+#if defined(__cplusplus)
+}
+#endif
+
+/* create COMP_STATS object */
+
+COMP_STATS *init_comp_stats(void)
+{
+  static COMP_STATS c;
+
+  /*c = (COMP_STATS *) calloc( 1, sizeof( COMP_STATS ));*/
+  /*c = (COMP_STATS *) NEW( COMP_STATS, L("crec.comp_stats")); */
+
+  init_cs_clock(&c.overall_search);
+  init_cs_clock(&c.models);
+  init_cs_clock(&c.fsm_to_hmm);
+  init_cs_clock(&c.internal_hmm);
+  init_cs_clock(&c.hmm_to_fsm);
+  init_cs_clock(&c.epsilon);
+  init_cs_clock(&c.astar);
+  init_cs_clock(&c.prune);
+  init_cs_clock(&c.front_end);
+  init_cs_clock(&c.word_lookup);
+  init_cs_clock(&c.word_addition);
+  c.total_time = 0;
+  return &c;
+}
+
+
+void dump_comp_stats(COMP_STATS *cs, PFile* fp)
+{
+  if (getenv("HIDE_COMP_STATS"))
+    return;
+#if !defined(_WIN32) && !defined(__vxworks)
+  if (clock() == (clock_t) - 1)
+  {
+    pfprintf(fp, "***WARNING: clock overrun!\n");
+  }
+#endif
+  if (!cs) cs = comp_stats;
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  pfprintf(fp, "Total Time %5.2f Seconds\n", cs->total_time);
+#endif
+  print_cs_clock(&cs->front_end, cs->total_time, fp, "Front end", "Frames");
+  print_cs_clock(&cs->overall_search, cs->total_time, fp, "Total Search", "Frames");
+  print_cs_clock(&cs->models, cs->total_time, fp, "   Models", "Models");
+  print_cs_clock(&cs->internal_hmm, cs->total_time, fp, "   Internal HMM", "HMMs");
+  print_cs_clock(&cs->fsm_to_hmm, cs->total_time, fp, "   FSM to HMM", "FSM_Nodes");
+  print_cs_clock(&cs->prune, cs->total_time, fp, "   Prune", "HMM States");
+  print_cs_clock(&cs->hmm_to_fsm, cs->total_time, fp, "   HMM to FSM", "HMMS");
+  print_cs_clock(&cs->epsilon, cs->total_time, fp, "   Epsilon", "FSM_Nodes");
+  print_cs_clock(&cs->astar, cs->total_time, fp, "   Astar", "Utterances");
+  print_cs_clock(&cs->word_lookup, cs->total_time, fp, "   WordLookup", "Words");
+  print_cs_clock(&cs->word_addition, cs->total_time, fp, "   WordAdd'tn", "Pronunciations");
+  pfflush(fp);
+}
+
+
+void print_cs_clock(CS_CLOCK *c, float num_seconds, PFile* fp, char *prompt, char *item_name)
+{
+  if (c == NULL) return;
+  /*  FPRINTF( fp, "%15.15s %8.2f.  Per Second of speech: %6.2f ms, %6.2f calls, %6.2f (%d) %s\n",
+             prompt ? prompt : "",
+             c->total_time/c->clocks_per_msec,
+             (c->total_time/c->clocks_per_msec) / num_seconds,
+      c->ncalls / num_seconds,
+      c->item_count / num_seconds,
+      c->item_count,
+      item_name);*/
+}
+
+
+void start_cs_clock(CS_CLOCK *c)
+{
+  if (c == NULL) return;
+#ifdef _WIN32
+  {
+    FILETIME dummy, kernelCPU, userCPU;
+    GetThreadTimes(GetCurrentThread(), &dummy, &dummy, &kernelCPU,
+                   &userCPU);
+    c->last = kernelCPU.dwLowDateTime + ((__int64)kernelCPU.dwHighDateTime << 32) +
+              userCPU.dwLowDateTime + ((__int64)userCPU.dwHighDateTime << 32);
+  }
+#elif defined(__vxworks)
+  /* Should use a portable clock() */
+  /* WxWorks: clock() always returns -1. VxWorks does not track per-task time or system idle time.
+  There is no method of determining how long a task or the entire system has been doing work.
+  tickGet( ) can be used to query the number of system ticks since system start.
+  clock_gettime( ) can be used to get the current clock time.
+  */
+  c->last = tickGet();
+#else
+  c->last = clock();
+#endif
+}
+
+
+
+void end_cs_clock(CS_CLOCK *c, int count)
+{
+  CS_TIME curr;
+  if (c == NULL) return;
+#ifdef _WIN32
+  {
+    FILETIME dummy, kernelCPU, userCPU;
+    GetThreadTimes(GetCurrentThread(), &dummy, &dummy, &kernelCPU,
+                   &userCPU);
+    curr = kernelCPU.dwLowDateTime + ((__int64)kernelCPU.dwHighDateTime << 32) +
+           userCPU.dwLowDateTime + ((__int64)userCPU.dwHighDateTime << 32);
+  }
+#elif defined(__vxworks)
+  curr = tickGet();
+#else
+  curr = clock();
+  if (curr == -1) return;     /* clock overrun */
+#endif
+  c->total_time += curr - c->last;
+  c->last = curr;
+  c->ncalls ++;
+  c->item_count += count;
+}
+
+
+void reset_cs_clock(CS_CLOCK *c)
+{
+  if (c == NULL) return;
+  c->ncalls = 0;
+  c->total_time = 0;
+  c->last = 0;
+  c->item_count = 0;
+}
+
+void init_cs_clock(CS_CLOCK *c)
+{
+  if (c == NULL) return;
+#if _WIN32
+  c->clocks_per_msec = 10000.0;
+#else
+  c->clocks_per_msec = (double) CLOCKS_PER_SEC / 1000.0;
+#endif
+  reset_cs_clock(c);
+}
+
+
+CS_CLOCK *make_cs_clock(void)
+{
+  CS_CLOCK *c = (CS_CLOCK *) NEW(CS_CLOCK, L("crec.cs_clock"));
+  init_cs_clock(c);
+  return c;
+}
diff --git a/srec/crec/get_fram.c b/srec/crec/get_fram.c
new file mode 100644
index 0000000..557f449
--- /dev/null
+++ b/srec/crec/get_fram.c
@@ -0,0 +1,464 @@
+/*---------------------------------------------------------------------------*
+ *  get_fram.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include <stdlib.h>
+#ifndef _RTT
+#include "pstdio.h"
+#endif
+#include <limits.h>
+#include <math.h>
+#include <string.h>
+#include "passert.h"
+
+#include "c42mul.h"
+#include "portable.h"
+
+#include "../clib/fpi_tgt.inl"
+
+#define DEBUG   0
+#define FUDGE_FACTOR 1.2f
+
+extern const prdata  max_log;
+
+const float root_pi_over_2 = (float) 1.2533141;
+
+static const char get_fram[] = "$Id: get_fram.c,v 1.7.6.13 2007/10/15 18:06:24 dahan Exp $";
+
+static void create_cepstrum_offsets(preprocessed *prep);
+static void destroy_cepstrum_offsets(preprocessed *prep);
+static void apply_channel_offset(preprocessed *prep);
+static int compare_cached_frame(preprocessed *prep, utterance_info *utt);
+
+void init_utterance(utterance_info *utt, int utt_type, int dimen,
+                    int buffer_size, int keep_frames, int num_chan, int do_voicing)
+/*
+**  To setup the utterance structure
+*/
+{
+  /*  Construct frame buffer  and voice buffer here
+  */
+  ASSERT(utt);
+  ASSERT(dimen > 0);
+  if (buffer_size < keep_frames)
+    SERVICE_ERROR(BAD_ARGUMENT);
+  utt->utt_type = utt_type;
+  utt->gen_utt.dim = dimen;
+  utt->gen_utt.frame = createFrameBuffer(buffer_size,
+                                         dimen, keep_frames, do_voicing);
+  utt->gen_utt.num_chan = num_chan;
+
+  setup_ambient_estimation(utt->gen_utt.backchan,
+                           utt->gen_utt.num_chan, 100);
+  return;
+}
+
+void set_voicing_durations(utterance_info *utt, int voice_duration,
+                           int quiet_duration, int unsure_duration,
+                           int start_windback)
+{
+  utt->gen_utt.voice_duration = voice_duration;
+  utt->gen_utt.quiet_duration = quiet_duration;
+  utt->gen_utt.unsure_duration = unsure_duration;
+  utt->gen_utt.start_windback = start_windback;
+  return;
+}
+
+void free_utterance(utterance_info *utt)
+/*
+**  To close data file pointers etc.
+*/
+{
+  /*  Destroy frame buffer
+  */
+  ASSERT(utt);
+
+  clear_ambient_estimation(utt->gen_utt.backchan, utt->gen_utt.dim);
+  if (utt->gen_utt.frame)
+  {
+    destroyFrameBuffer(utt->gen_utt.frame);
+    utt->gen_utt.frame = NULL;
+  }
+  return;
+}
+
+void init_preprocessed(preprocessed *prep, int dimen, float imelda_scale)
+/*
+**  To setup the preprocessed structure
+*/
+{
+
+  ASSERT(prep);
+  ASSERT(dimen > 0);
+  prep->dim = dimen;
+  prep->seq = (imeldata *) CALLOC(prep->dim, sizeof(imeldata),
+                                        "srec.prep->seq");
+  prep->seq_unnorm = (imeldata *) CALLOC(prep->dim, sizeof(imeldata),
+                     "srec.prep->seq_unnorm");
+  prep->last_frame = (featdata *) CALLOC(prep->dim, sizeof(featdata),
+                     "srec.prep->last_frame");
+
+  /*  Setup constants for distance calculation
+  */
+  /* TODO: check numbers for non-zero */
+  prep->add.scale = (prdata)((2 * imelda_scale * imelda_scale) / MUL_SCALE
+                             + 0.5) - (prdata)0.5;
+  prep->add.inv_scale = (prdata)(((float)(0x01 << 12) * MUL_SCALE) /
+                                 (2 * imelda_scale * imelda_scale) + 0.5) -
+                        (prdata)0.5;
+  prep->mul.multable_factor_gaussian = 1;
+  prep->mul.multable_factor = (prdata)(((MUL_SCALE * (0x01 << EUCLID_SHIFT)
+                                         * prep->uni_score_scale)
+                                        / (2 * (imelda_scale * imelda_scale
+                                                * FUDGE_FACTOR * FUDGE_FACTOR))) / 128 + 0.5)
+                              - (prdata)0.5;
+  prep->mul.grand_mod_cov = (prdata)((MUL_SCALE * prep->uni_score_scale *
+                                      prep->whole_dim *
+                                      log((imelda_scale * FUDGE_FACTOR) /
+                                          (SIGMA_BIAS * root_pi_over_2))) / 128 + 0.5)
+                            - (prdata)0.5 - prep->uni_score_offset;
+  prep->mul.grand_mod_cov_gaussian = (prdata)(2 * imelda_scale * imelda_scale *
+                                     prep->use_dim *
+                                     log(imelda_scale /
+                                         (SIGMA_BIAS * root_pi_over_2)) + 0.5)
+                                     - (prdata)0.5;
+#if DEBUG
+  log_report("grand_mod_cov %.1f, grand_mod_cov_gaussian %.1f\n",
+             (float)prep->mul.grand_mod_cov,
+             (float)prep->mul.grand_mod_cov_gaussian);
+  log_report("multable_factor %f, multable_factor_gaussian %f\n",
+             (float)prep->mul.multable_factor,
+             (float)prep->mul.multable_factor_gaussian);
+#endif
+
+
+  create_cepstrum_offsets(prep);
+  return;
+}
+
+void clear_preprocessed(preprocessed *prep)
+/*
+**  To setup the preprocessed structure
+*/
+{
+  ASSERT(prep);
+  destroy_cepstrum_offsets(prep);
+  prep->dim = 0;
+  FREE((char *)prep->last_frame);
+  FREE((char *)prep->seq);
+  FREE((char *)prep->seq_unnorm);
+  return;
+}
+
+int get_data_frame(preprocessed *prep, utterance_info *utt)
+/*
+**  To get a frame amount of data and perform preprocessing functions
+*/
+{
+  int status_code;
+
+  ASSERT(prep);
+  ASSERT(utt);
+  if (utt->gen_utt.channorm && !utt->gen_utt.channorm->adj_valid)
+    convert_adjustment_to_imelda(utt->gen_utt.channorm, prep);
+  if (utt->gen_utt.dim != prep->dim)
+    SERVICE_ERROR(UTTERANCE_DIMEN_MISMATCH);
+
+  if (prep->post_proc & VFR)
+  {
+    if ((status_code = get_utterance_frame(prep, utt)) <= 0)
+      return (status_code);
+
+    log_report("get_data_frame vfr not supported\n");
+    SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
+  }
+  else
+  {
+    status_code = get_utterance_frame(prep, utt);
+    if (status_code == 0) return(status_code);
+    else if (status_code == -1) return(1);
+  }
+
+  if (prep->chan_offset)
+    apply_channel_offset(prep);
+
+  /*  Apply linear transformation if necessary
+  */
+  if (prep->post_proc & LIN_TRAN)
+    linear_transform_frame(prep, prep->seq, True);
+
+  memcpy(prep->seq_unnorm, prep->seq, prep->dim * sizeof(imeldata));
+  if (utt->gen_utt.channorm)
+    apply_channel_normalization_in_imelda(utt->gen_utt.channorm,
+                                          prep->seq, prep->seq_unnorm,
+                                          utt->gen_utt.channorm->dim);
+  return (1);
+}
+
+int get_utterance_frame(preprocessed *prep, utterance_info *utt)
+/*
+**  To get a frame amount of data
+**  Maintains a single data buffer and passes the pointers to frame of data.
+**  Post-increments after copying
+*/
+{
+  featdata  *frame_ptr;
+  int ii;
+
+  ASSERT(prep);
+  ASSERT(utt);
+
+  /*  Get the next data frame in
+  */
+  if (getFrameGap(utt->gen_utt.frame) > 0)
+  {
+    /*  is it a cloned object */
+    if (prep->ref_count > 1 && compare_cached_frame(prep, utt))
+      return (-1);
+
+    frame_ptr = currentRECframePtr(utt->gen_utt.frame);
+    if (frame_ptr == NULL)
+      return (0);
+    if (prep->ref_count > 1)
+    {
+      ASSERT(prep->last_frame);
+      memcpy(prep->last_frame, frame_ptr,
+             prep->dim* sizeof(featdata));
+    }
+    for (ii = 0; ii < utt->gen_utt.dim; ii++)
+      prep->seq[ii] = (imeldata)frame_ptr[ii];
+    /*  Apply fast-voice corrections if necessary */
+    if (utt->gen_utt.frame->haveVoiced)
+    {
+      utterance_detection_fixup(utt->gen_utt.frame,
+                                &utt->gen_utt.last_push, utt->gen_utt.voice_duration,
+                                utt->gen_utt.quiet_duration, utt->gen_utt.unsure_duration);
+      /*     if (isFrameBufferActive (utt->gen_utt.frame)
+        && getFrameGap (utt->gen_utt.frame) <= utt->gen_utt.quiet_duration)
+            SERVICE_ERROR (INTERNAL_ERROR); */
+      prep->voicing_status =
+        rec_frame_voicing_status(utt->gen_utt.frame);
+    }
+    return (1);
+  }
+  return (0);
+}
+
+
+int advance_utterance_frame(utterance_info *utt)
+/*
+**  To get a frame amount of data
+*/
+{
+  ASSERT(utt);
+  /*  if more samples are needed then read from file if the type matched
+  */
+  /*  Get the next data frame in
+  */
+  if (getFrameGap(utt->gen_utt.frame) > 0)
+  {
+    if (incRECframePtr(utt->gen_utt.frame) != False)
+      return (0);
+    return (1);
+  }
+  return (0);
+}
+
+int retreat_utterance_frame(utterance_info *utt)
+/*
+**  To get a frame amount of data
+*/
+{
+  ASSERT(utt);
+
+  if (getBlockGap(utt->gen_utt.frame) > 0)
+  {
+    if (decRECframePtr(utt->gen_utt.frame) != False)
+      return (0);
+    return (1);
+  }
+  return (0);
+}
+
+void prepare_data_frame(preprocessed *prep)
+{
+  int ii;
+  prdata sum_sq;
+
+  sum_sq = 0;
+
+  for (ii = 0; ii < prep->whole_dim; ii++)
+    sum_sq += (prdata) SQR((prdata)prep->seq[ii]);
+  prep->seq_sq_sum_whole = -sum_sq;
+
+  ASSERT(prep->whole_dim <= prep->use_dim);
+  for (ii = 0; ii < prep->use_dim; ii++)
+    sum_sq += (prdata) SQR((prdata)prep->seq[ii]);
+  prep->seq_sq_sum = -sum_sq;
+
+  sum_sq = 0;
+
+  for (ii = 0; ii < prep->whole_dim; ii++)
+    sum_sq += (prdata) SQR((prdata)prep->seq_unnorm[ii]);
+  prep->seq_unnorm_sq_sum_whole = -sum_sq;
+
+  return;
+}
+
+int utterance_started(utterance_info *utt)
+{
+  ASSERT(utt);
+  if (utt->gen_utt.frame->haveVoiced
+      && utt->gen_utt.frame->voicingDetected)
+    return (True);
+  else
+    return (False);
+}
+
+int utterance_ended(utterance_info *utt)
+{
+  ASSERT(utt);
+  return (utt->gen_utt.frame->utt_ended);
+}
+
+int load_utterance_frame(utterance_info *utt, unsigned char* pUttFrame, int voicing)
+{
+  featdata framdata[MAX_DIMEN];
+  int      ii;
+
+  ASSERT(utt);
+  ASSERT(pUttFrame);
+
+  for (ii = 0; ii < utt->gen_utt.frame->uttDim; ii++)
+    framdata[ii] = (featdata) pUttFrame[ii];
+
+  if (pushSingleFEPframe(utt->gen_utt.frame, framdata, voicing) != False)
+    return (0);
+
+  return (1);
+}
+
+int copy_utterance_frame(utterance_info *oututt, utterance_info *inutt)
+{
+  int      voicedata;
+  featdata *framdata;
+
+  ASSERT(oututt);
+  ASSERT(inutt);
+
+  if ((framdata = currentRECframePtr(inutt->gen_utt.frame)) == NULL)
+    return (0);
+
+  voicedata = getVoicingCode(inutt->gen_utt.frame, framdata);
+
+  if (pushSingleFEPframe(oututt->gen_utt.frame, framdata, voicedata) != False)
+    return (0);
+
+  return (1);
+}
+
+int copy_pattern_frame(utterance_info *oututt, preprocessed *prep)
+{
+  int      ii;
+  featdata frame_ptr[MAX_DIMEN];
+
+  ASSERT(oututt);
+  ASSERT(prep);
+  ASSERT(oututt->gen_utt.dim < MAX_DIMEN);
+  for (ii = 0; ii < oututt->gen_utt.dim; ii++)
+    frame_ptr[ii] = (featdata) RANGE(prep->seq[ii], 0, 255);
+  if (pushSingleFEPframe(oututt->gen_utt.frame, frame_ptr,
+                         prep->voicing_status)
+      != False) return(0);
+  return (1);
+}
+
+static void create_cepstrum_offsets(preprocessed *prep)
+{
+  ASSERT(prep);
+  prep->chan_offset = (imeldata *) CALLOC_CLR(prep->dim,
+                      sizeof(imeldata), "srec.chan_offset");
+  return;
+}
+
+void set_cepstrum_offset(preprocessed *prep, int index, int value)
+{
+  ASSERT(prep);
+  ASSERT(prep->chan_offset);
+  ASSERT(index >= 0 && index < prep->dim);
+  prep->chan_offset[index] = (imeldata) value;
+  return;
+}
+
+static void destroy_cepstrum_offsets(preprocessed *prep)
+{
+  ASSERT(prep);
+  FREE((char *)prep->chan_offset);
+  prep->chan_offset = 0;
+  return;
+}
+
+static void apply_channel_offset(preprocessed *prep)
+{
+  int ii;
+
+  for (ii = 0; ii < prep->dim; ii++)
+    prep->seq[ii] += prep->chan_offset[ii];
+  return;
+}
+
+static int compare_cached_frame(preprocessed *prep, utterance_info *utt)
+{
+  int      ii;
+  featdata *frame_ptr;
+
+  frame_ptr = currentRECframePtr(utt->gen_utt.frame);
+  if (frame_ptr == NULL)
+    return (False);
+  for (ii = 0; ii < utt->gen_utt.dim; ii++)
+    if (prep->last_frame[ii] != frame_ptr[ii])
+      return (False);
+  return (True);
+}
+
+void convert_adjustment_to_imelda(norm_info *norm, preprocessed *prep)
+{
+  int      ii;
+  imeldata fram[MAX_DIMEN];
+
+  ASSERT(prep);
+  ASSERT(norm);
+  for (ii = 0; ii < 12; ii++)      /* TODO: fix dimension properly, and sort out rouding/type */
+    fram[ii] = (imeldata) norm->adjust[ii]; /* TODO: review types */
+  for (; ii < prep->dim; ii++)
+    fram[ii] = 0;
+
+  linear_transform_frame(prep, fram, False);
+
+  for (ii = 0; ii < prep->dim; ii++)
+    norm->imelda_adjust[ii] = fram[ii];
+#if DEBUG
+  log_report("NORM AUX: ");
+  for (ii = 0; ii < norm->dim; ii++)
+    log_report("%d ", (int)norm->imelda_adjust[ii]);
+  log_report("\n");
+#endif
+  norm->adj_valid = True;
+  return;
+}
diff --git a/srec/crec/priority_q.c b/srec/crec/priority_q.c
new file mode 100644
index 0000000..9311855
--- /dev/null
+++ b/srec/crec/priority_q.c
@@ -0,0 +1,335 @@
+/*---------------------------------------------------------------------------*
+ *  priority_q.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "passert.h"
+
+#include "portable.h"
+
+#include "hmm_desc.h"
+#include "utteranc.h"
+#include "hmmlib.h"
+
+#include "srec_sizes.h"
+#include "search_network.h"
+#include "srec.h"
+#include "word_lattice.h"
+
+#define PRINT_SEARCH_DETAILS 0
+
+/*this is just implemented as a list so far - FIX this!!*/
+
+/*allocates priority_q to han le max_n entries*/
+priority_q* allocate_priority_q(int max_n)
+{
+  priority_q *pq;
+  
+  pq = (priority_q*) CALLOC(1, sizeof(priority_q), "search.srec.priority_q");
+  pq->max_cost_in_q = MAXcostdata;
+  pq->word_token_list = MAXwordID;
+  pq->max_in_q = (miscdata)max_n;
+  pq->num_in_q = 0;
+  return pq;
+}
+
+void free_priority_q(priority_q* pq)
+{
+  FREE(pq);
+}
+
+/*empties out priority_q*/
+
+void clear_priority_q(priority_q *pq)
+{
+  pq->max_cost_in_q = MAXcostdata;
+  pq->word_token_list = MAXwordID;
+  pq->num_in_q = 0;
+  /* Jean: what about the list of free tokens? */
+}
+/* returns the head of a linked list of all words in the priority_q.
+   Return MAXwtokenID if list is empty */
+
+wtokenID get_word_token_list(priority_q *pq, word_token *word_token_array)
+{
+  return pq->word_token_list;
+}
+
+void remove_non_end_word_from_q(srec *rec, priority_q *pq, word_token *word_token_array, nodeID end_node)
+{
+  word_token *token;
+  wtokenID *ptoken_index;
+  wtokenID old_token_index;
+  
+  pq->max_cost_in_q = MAXcostdata;
+  pq->num_in_q = 0;
+  ptoken_index = &(pq->word_token_list);
+  
+  while (*ptoken_index != MAXwtokenID)
+  {
+    token = &(word_token_array[*ptoken_index]);
+    if (token->end_node != end_node)
+    {
+      old_token_index = *ptoken_index;
+      *ptoken_index = token->next_token_index;
+      free_word_token(rec, old_token_index);
+      pq->max_cost_in_q = MAXcostdata; /* fix: sep9 */
+    }
+    else
+    {
+      pq->num_in_q++;
+      if ((pq->max_cost_in_q == MAXcostdata) || (token->cost > pq->max_cost_in_q))
+      {
+        pq->max_cost_in_q = token->cost;
+      }
+      ptoken_index = &(token->next_token_index);
+    }
+  }
+}
+
+int compare_histories(word_token* token1, word_token* token2,
+                      word_token* word_token_array)
+{
+  int history_for_token1 = 0;
+  int history_for_token2 = 0;
+  
+  /* compare_histories() was an attempt to be smart about the priority_q,
+     in that we don't need to store two word_tokens when the two tokens 
+     are the same word (obviously ending at the same frame), and with the 
+     same word history.  This happens for a digit that has multiple end nodes
+     due to context-dependency.  When "history_for_token" ignores the end_node,
+     then we're all clear to save just 1 word_token, but continue propagating
+     all paths from the end nodes.  That bit of "continue propagating" is not 
+     done. THE OTHER PROBLEM is that the two nodes may NOT be
+     simply different CD end models, they may be different from digit shifting!
+     We're screwed if we drop the path, unless we compare all the way back to
+     the start of utterance. */
+  
+  if (token1->word != token2->word)
+    return 1;
+  if (token1->end_node != token2->end_node)
+    return 1;
+    
+  if (token1->backtrace != MAXwordID)
+  {
+    history_for_token1 += token1->end_node * 1000000;
+    history_for_token1 += word_token_array[token1->backtrace].word * 10000;
+    history_for_token1 += word_token_array[token1->backtrace].end_time;
+  }
+  
+  if (token2->backtrace != MAXwordID)
+  {
+    history_for_token2 += token2->end_node * 1000000;
+    history_for_token2 += word_token_array[token2->backtrace].word * 10000;
+    history_for_token2 += word_token_array[token2->backtrace].end_time;
+  }
+  
+#if PRINT_SEARCH_DETAILS
+  printf("comparing history_for_token1 %d history_for_token2 %d\n",
+         history_for_token1, history_for_token2);
+#endif
+         
+  if (history_for_token1 == history_for_token2)
+  {
+    return 0;
+  }
+  else
+  {
+    return 1;
+  }
+}
+
+#if PRINT_SEARCH_DETAILS
+void sanity_check_priority_q(priority_q* pq, word_token *word_token_array)
+{
+  int n = 0;
+  wtokenID token_index;
+  word_token* token;
+  n = 0;
+  token_index = pq->word_token_list;
+  while (token_index != MAXwordID)
+  {
+    token = &(word_token_array[token_index]);
+    token_index = token->next_token_index;
+    n++;
+  }
+  ASSERT(n == pq->num_in_q);
+  if (pq->num_in_q == pq->max_in_q)
+  {
+    token = &(word_token_array[pq->word_token_list]);
+    ASSERT(pq->max_cost_in_q == token->cost);
+  }
+}
+#endif
+
+/*adds a word token to the priority_q.  Returns the index of the word to
+  remove.
+  if nothing needs to be removed, returns MAXwtokenID.
+  if no room on priority_q, returns the one being put on */
+
+wtokenID add_word_token_to_priority_q(priority_q *pq, wtokenID token_index_to_add, word_token *word_token_array)
+{
+  word_token *token;
+  word_token *token_to_add;
+  wtokenID token_index, return_token_index;
+  wordID word_to_add;
+  costdata cost_to_add;
+  wtokenID *ptoken_index;
+  wtokenID *pplace_to_add;
+  wtokenID *pdelete_index;
+  word_token *token_to_delete;
+  
+  token_to_add = &(word_token_array[token_index_to_add]);
+  cost_to_add = token_to_add->cost;
+  
+#if PRINT_SEARCH_DETAILS
+  printf("WORDADD PQ tokenid %d cost %d\n", token_index_to_add, cost_to_add);
+  token_index = pq->word_token_list;
+  while (token_index != MAXwordID)
+  {
+    token = &(word_token_array[token_index]);
+    printf("WORDADD PQ token %d word %d cost %d\n", token_index, token->word, token->cost);
+    token_index = token->next_token_index;
+  }
+#endif
+  
+  if (cost_to_add >= pq->max_cost_in_q && pq->num_in_q >= pq->max_in_q)
+  {
+#if PRINT_SEARCH_DETAILS
+    printf("WORDADD PQ - rejecting because cost too high cost_to_add(%d) max_cost_in_q(%d) num_in_q(%d)\n",
+           cost_to_add, pq->max_cost_in_q, pq->num_in_q);
+#endif
+#if PRINT_SEARCH_DETAILS
+    printf("WORDADD PQ (D) returning %d\n", token_index_to_add);
+    sanity_check_priority_q(pq, word_token_array);
+#endif
+    return token_index_to_add;
+  }
+  
+  word_to_add = token_to_add->word;
+  /* search for duplicate words first */
+  ptoken_index = &(pq->word_token_list);
+  pplace_to_add = NULL;
+  pdelete_index = NULL;
+  while ((*ptoken_index) != MAXwordID)
+  {
+    token = &word_token_array[(*ptoken_index)];
+    
+    if (token->word == token_to_add->word
+        && !compare_histories(token, token_to_add, word_token_array))
+    {
+      if (token->cost < cost_to_add)
+      {
+        /* don't bother adding, there's another like it on the list!
+           with a better score! */
+#if PRINT_SEARCH_DETAILS
+        printf("WORDADD PQ - rejecting because another like it is on the list\n");
+#endif
+        /* TODO: when returning back on the basis that something else is better,
+           we should let the caller know what to use instead, ie, make the
+           distinction between no-space and something-else-better */
+        token = &word_token_array[ token_index_to_add];
+        token->next_token_index = (*ptoken_index);
+        return token_index_to_add;
+      }
+      else
+      {
+        /* ok, replace the one on the list with this better scoring one! */
+        pdelete_index = ptoken_index;
+      }
+    }
+    if (token->cost < cost_to_add && pplace_to_add == NULL)
+    {
+      pplace_to_add = ptoken_index;
+      /* do not break, 'cuz we're still searching for a possible duplicates */
+    }
+    ptoken_index = &(token->next_token_index);
+  }
+  if (!pplace_to_add)
+    pplace_to_add = ptoken_index;
+    
+  /* add the token by inserting in the linked list */
+  token_index = *pplace_to_add;
+  *pplace_to_add = token_index_to_add;
+  token_to_add->next_token_index = token_index;
+  pq->num_in_q++;
+  if (pplace_to_add == &pq->word_token_list && pq->num_in_q >= pq->max_in_q)
+    pq->max_cost_in_q = cost_to_add;
+    
+  /* now delete any duplicate that was found */
+  if (pdelete_index)
+  {
+    token_index = *pdelete_index;
+    token_to_delete = &word_token_array[  token_index];
+    *pdelete_index = token_to_delete->next_token_index;
+    pq->num_in_q--;
+#if PRINT_SEARCH_DETAILS
+    printf("WORDADD PQ (B) returning %d\n", token_index);
+#endif
+    return_token_index = token_index;
+  }
+  
+  /* now check for max length in the queue */
+  if (pq->num_in_q > pq->max_in_q)
+  { /* really expecting just 1 over */
+    token_index = pq->word_token_list;
+    token = &(word_token_array[ token_index]);
+    pq->num_in_q--;
+    pq->word_token_list = token->next_token_index;
+#if PRINT_SEARCH_DETAILS
+    printf("WORDADD PQ (C) returning %d\n", token_index);
+#endif
+    return_token_index = token_index;
+  }
+  else
+  {
+    return_token_index = MAXwtokenID;
+  }
+  if (pq->num_in_q >= pq->max_in_q)
+  {
+    token_index = pq->word_token_list;
+    token = &(word_token_array[token_index]);
+    pq->max_cost_in_q = token->cost;
+  }
+  else
+  { /* pq->num_in_q < pq->max_in_q, fixed sep9 */
+    pq->max_cost_in_q = MAXcostdata;
+  }
+#if PRINT_SEARCH_DETAILS
+  printf("WORDADD PQ (A) returning %d\n", token_index);
+  sanity_check_priority_q(pq, word_token_array);
+#endif
+  return return_token_index;
+}
+
+
+/*returns the cost threshold for the end of the priority queue.
+  If words have greater cost than this, no need to try to put them on the
+  queue*/
+
+costdata get_priority_q_threshold(priority_q *pq, word_token *word_token_array)
+{
+  return pq->max_cost_in_q;
+}
+
+
+
+
+
diff --git a/srec/crec/rec_norm.c b/srec/crec/rec_norm.c
new file mode 100644
index 0000000..ac582c6
--- /dev/null
+++ b/srec/crec/rec_norm.c
@@ -0,0 +1,43 @@
+/*---------------------------------------------------------------------------*
+ *  rec_norm.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include <stdlib.h>
+#ifndef _RTT
+#include "pstdio.h"
+#endif
+#include <limits.h>
+#include <math.h>
+#include <string.h>
+#include "passert.h"
+
+#include "c42mul.h"
+#include "portable.h"
+
+#include "../clib/fpi_tgt.inl"
+
+int inherit_recognition_statistics(utterance_info *utt, multi_srec *recm,
+                                   int norm_dim)
+{
+  /* inherit_recognition_stats use a callback function mechanism, */
+  frameID speech_start, speech_end;
+  multi_srec_get_speech_bounds(recm, &speech_start, &speech_end);
+  swicms_update(utt->gen_utt.swicms, speech_start, speech_end);
+  return (True);
+}
diff --git a/srec/crec/srec.c b/srec/crec/srec.c
new file mode 100644
index 0000000..9d4bdce
--- /dev/null
+++ b/srec/crec/srec.c
@@ -0,0 +1,2465 @@
+/*---------------------------------------------------------------------------*
+ *  srec.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "pstdio.h"
+#include "passert.h"
+#include "portable.h"
+
+#include "hmm_desc.h"
+#include "utteranc.h"
+#include "hmmlib.h"
+#include "srec_sizes.h"
+#include "search_network.h"
+#include "srec_context.h"
+#include "srec.h"
+#include "srec_stats.h"
+#include "srec_debug.h"
+#include "srec_tokens.h"
+#include "word_lattice.h"
+#include "swimodel.h"
+#if USE_COMP_STATS
+#include "comp_stats.h"
+#endif
+#include "c42mul.h"
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid :
+"$Id: srec.c,v 1.39.4.31 2008/06/23 17:20:39 dahan Exp $";
+#endif
+
+#define SILENCE_MODEL_INDEX 0
+#define PRUNE_TIGHTEN 0.9     /*if we run out of room in the state arrays,
+                                keep multiplying pruning thresh by this amount
+                                until there is room */
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ * protos                                                                   *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+static void reset_cost_offsets(multi_srec* rec, frameID current_search_frame,
+                               costdata current_best_cost);
+static void update_internal_hmm_states(srec *rec, costdata *pcurrent_prune_delta,
+                                       costdata *pcurrent_best_cost,
+                                       costdata *precomputed_model_scores);
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ * utils                                                                    *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+static void dump_core(char *msg)
+{
+  PLogError ( msg );
+  ASSERT(0);
+}
+
+static altword_token* reprune_altword_token_batch(srec* rec,
+    altword_token* batch,
+    bigcostdata costlimit)
+{
+  altword_token *awtoken, *next_awtoken;
+  altword_token **awtokenp;
+
+  /* look for previous invalidate, see below */
+  if (batch->costbasis == MAXcostdata / 2)
+  { /* was costdelta // costlimit */
+    free_altword_token(rec, batch);
+    return AWTNULL;
+  }
+  /* a flag to check whether we already pruned this batch would be nice */
+
+  /* first prune the CDR of the list, ie everything but the head */
+  awtokenp = &batch->next_token;
+  for (awtoken = batch->next_token; awtoken != AWTNULL; awtoken = next_awtoken)
+  {
+    next_awtoken = awtoken->next_token;
+    if ((bigcostdata)batch->costbasis + awtoken->costdelta > costlimit)
+    {
+      (*awtokenp) = awtoken->next_token;
+      awtoken->refcount = 1;             /* to make sure it frees */
+      free_altword_token(rec, awtoken);
+    }
+    else
+      awtokenp = &awtoken->next_token;
+  }
+
+  /* now see about the CAR of the list, ie the head */
+  if ((bigcostdata)(batch->costbasis) + batch->costdelta < costlimit)
+  {
+    /* head of list survives pruning => no problem */
+  }
+  else if (batch->next_token != AWTNULL)
+  {
+    /* head of list does not survive => since we can't change the pointer
+       we copy a survivor into it and free that original */
+    awtoken = batch->next_token;
+    batch->costdelta      = awtoken->costdelta;
+    batch->word           = awtoken->word;
+    batch->word_backtrace = awtoken->word_backtrace;
+    /*ASSERT( batch->refcount == awtoken->refcount); */
+    /* batch->refcount       = awtoken->refcount; */
+    batch->next_token     = awtoken->next_token;
+    awtoken->refcount = 1; /* to make sure it frees */
+    free_altword_token(rec, awtoken);
+  }
+  else
+  {
+    /* head of list does not survive, nothing survives, so invalidate it */
+    batch->costbasis = MAXcostdata / 2; /* was costdelta */
+    free_altword_token(rec, batch);
+    batch = AWTNULL;
+  }
+  return batch;
+}
+
+static void reprune_altword_tokens(srec* rec)
+{
+  stokenID i, j;
+  fsmarc_token* stoken;
+  fsmnode_token* ftoken;
+  bigcostdata current_prune_delta = rec->prune_delta;
+  altword_token* awtoken;
+
+  /* first clear the costbases */
+  for (i = rec->active_fsmarc_tokens; i != MAXstokenID; i = stoken->next_token_index)
+  {
+    stoken = &rec->fsmarc_token_array[i];
+    for (j = 0; j < stoken->num_hmm_states; j++)
+      if ((awtoken = stoken->aword_backtrace[j]) != AWTNULL)
+        awtoken->costbasis = MAXcostdata;
+  }
+  for (i = rec->active_fsmnode_tokens;i != MAXftokenID;i = ftoken->next_token_index)
+  {
+    ftoken = &rec->fsmnode_token_array[i];
+    if ((awtoken = ftoken->aword_backtrace) != AWTNULL)
+      awtoken->costbasis = MAXcostdata;
+  }
+  /* costbases for altword attached to stoken */
+  for (i = rec->active_fsmarc_tokens; i != MAXstokenID; i = stoken->next_token_index)
+  {
+    stoken = &rec->fsmarc_token_array[i];
+    for (j = 0; j < stoken->num_hmm_states; j++)
+      if ((awtoken = stoken->aword_backtrace[j]) != AWTNULL)
+        if (awtoken->costbasis > stoken->cost[j])
+          awtoken->costbasis = stoken->cost[j];
+  }
+  /* costbases for altword attached to ftokens */
+  for (i = rec->active_fsmnode_tokens;i != MAXftokenID;i = ftoken->next_token_index)
+  {
+    ftoken = &rec->fsmnode_token_array[i];
+    if ((awtoken = ftoken->aword_backtrace) != AWTNULL)
+      if (awtoken->costbasis > ftoken->cost)
+        awtoken->costbasis = ftoken->cost;
+  }
+
+  /* now reprune */
+  while (rec->altword_token_freelist_len < rec->altword_token_array_size / 4
+         || rec->altword_token_freelist_len < 2*rec->word_priority_q->max_in_q)
+  {
+    SREC_STATS_INC_AWTOKEN_REPRUNES(1);
+    current_prune_delta = (costdata)(PRUNE_TIGHTEN * PRUNE_TIGHTEN * current_prune_delta);
+    for (i = rec->active_fsmarc_tokens; i != MAXstokenID; i = stoken->next_token_index)
+    {
+      stoken = &rec->fsmarc_token_array[i];
+      for (j = 0; j < stoken->num_hmm_states; j++)
+      {
+        if (stoken->aword_backtrace[j] != AWTNULL)
+        {
+          stoken->aword_backtrace[j] =
+            reprune_altword_token_batch(rec, stoken->aword_backtrace[j],
+                                        current_prune_delta);
+        }
+      }
+    }
+    for (i = rec->active_fsmnode_tokens;i != MAXftokenID;i = ftoken->next_token_index)
+    {
+      ftoken = &rec->fsmnode_token_array[i];
+      if (ftoken->aword_backtrace != AWTNULL)
+      {
+        ftoken->aword_backtrace =
+          reprune_altword_token_batch(rec, ftoken->aword_backtrace,
+                                      current_prune_delta);
+      }
+    }
+    ASSERT(current_prune_delta > 0);
+  }
+}
+
+#define refcopy_altwords(rEc, aWtOkEn) (aWtOkEn?(aWtOkEn->refcount++,aWtOkEn):aWtOkEn)
+
+static altword_token* copy_altwords(srec* rec, altword_token* list1, costdata delta)
+{
+  altword_token *q2, dummy, *last_q2 = &dummy;
+  costdata q2_costdelta;
+
+  /* first check for space */
+#if BUILD & BUILD_DEBUG
+  int num = 0;
+
+  for (num = 0, q2 = list1; q2 != AWTNULL; q2 = q2->next_token)
+    num++;
+  if (num > rec->altword_token_freelist_len)
+  {
+    printf("warning: mid-copy reprune_altword_tokens()\n");
+    ASSERT(0);
+    reprune_altword_tokens(rec);
+  }
+#endif
+
+  /* now do the copy */
+  for (; list1 != AWTNULL; list1 = list1->next_token)
+  {
+    ASSERT(list1->refcount >= 1);
+
+    q2_costdelta = list1->costdelta + delta;
+    ASSERT(list1->costdelta != MAXcostdata);
+    if (q2_costdelta > rec->prune_delta)
+      continue;
+    q2 = get_free_altword_token(rec, NULL_IF_NO_TOKENS);
+    if (!q2) /* this should never happen */
+      break;
+    last_q2->next_token = q2;
+    q2->costdelta      = q2_costdelta;
+    q2->word           = list1->word;
+    q2->word_backtrace = list1->word_backtrace;
+    last_q2 = q2;
+  }
+  last_q2->next_token = AWTNULL;
+  return dummy.next_token;
+}
+
+#if 1
+/* sizewise_altwords just makes sure the list of altwords is no longer than
+   the number of possible word ends.  Any tokens beyond that length will get
+   ignored later anyways, so we may as well kill them here.
+   This also is related to the anticipated repruning.  This code currently
+   makes use of calloc/free and qsort, but can easily be rewritten to just
+   to a linear in-place sort, linear looking for the 10 best score should not
+   take too long. This is on the todo list!
+*/
+int altword_token_ptr_cmp(const void* a, const void* b)
+{
+  const altword_token** A = (const altword_token**)a, **B = (const altword_token**)b;
+  if ((*A)->costdelta > (*B)->costdelta) return 1;
+  else if ((*A)->costdelta < (*B)->costdelta) return -1;
+  else return 0;
+}
+static altword_token* sizewise_altwords(srec* rec, altword_token* awtoken_head)
+{
+#define SIZEWISE_THRESH (rec->word_priority_q->max_in_q)
+#define SIZEWISE_TARGET (rec->word_priority_q->max_in_q*4/5)
+  int i, num;
+  altword_token *awtoken, **list;
+
+  if( SIZEWISE_TARGET == 0) {
+	  free_altword_token(rec, awtoken_head);
+	  return NULL;
+  }
+  num = count_altword_token(rec, awtoken_head);
+  /* if the linked list is shorter than max_in_q we're fine */
+  if (num <= SIZEWISE_THRESH)
+    return awtoken_head;
+  else
+  {
+    list = (altword_token**)CALLOC(num, sizeof(altword_token*), L("search.srec.altword_tokens"));
+    ASSERT(awtoken_head->refcount == 1);
+    for (i = 0, awtoken = awtoken_head; i < num; i++, awtoken = awtoken->next_token)
+      list[i] = awtoken;
+    qsort(list, num, sizeof(altword_token*), altword_token_ptr_cmp);
+    for (i = 0; i < SIZEWISE_TARGET; i++)
+      list[i]->next_token = list[i+1];
+    if(i>0) list[i-1]->next_token = AWTNULL;
+    for (; i < num; i++)
+    {
+      list[i]->refcount = 1; /* make sure it frees */
+      free_altword_token(rec, list[i]);
+    }
+    awtoken_head = list[0];
+    awtoken_head->refcount = 1;
+    FREE(list);
+    return awtoken_head;
+  }
+}
+#else
+#define sizewise_altwords(ReC,hEad) hEad
+#endif
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ * acoustic scoring utils                                                   *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+#define DO_COMPUTE_MODEL     0
+#define DO_NOT_COMPUTE_MODEL MAXcostdata
+
+static asr_uint16_t best_uint16(asr_uint16_t* p, int n)
+{
+  asr_uint16_t rv = p[0];
+  for (;--n > 0;p++) if (rv > *p) rv = *p;
+  return rv;
+}
+static int compute_model_scores(costdata *current_model_scores, SWIModel *acoustic_models,
+                                pattern_info *pattern, frameID current_search_frame)
+{
+  int i;
+  int num_models_computed = 0;
+
+  for (i = 0; i < acoustic_models->num_hmmstates; i++)
+  {
+    SWIhmmState *hmmstate = &acoustic_models->hmmstates[i];
+
+    scodata score;
+
+    if (current_model_scores[i] == DO_COMPUTE_MODEL)
+    {
+      score = mixture_diagonal_gaussian_swimodel(pattern->prep, hmmstate, acoustic_models->num_dims);
+      ASSERT(score <= 0 && "model score out of range");
+
+      current_model_scores[i] = (costdata) - score;
+      num_models_computed++;
+    }
+  }
+  return num_models_computed;
+}
+
+
+
+/*precompute all needed models to be used by next frame of search*/
+
+static int find_which_models_to_compute(srec *rec, SWIModel *acoustic_models)
+{
+  int i;
+  modelID model_index;
+  stokenID current_token_index;
+  ftokenID current_ftoken_index;
+  fsmarc_token *current_token;
+  fsmnode_token *current_ftoken;
+  costdata *current_model_scores;
+  /* arcID arc_index; */
+  arcID fsm_arc_index;
+  HMMInfo* hmm_info;
+  FSMnode* fsm_node;
+  FSMarc* fsm_arc;
+  /*use the current_model_scores array both to tell the model computing stuff
+    what models to compute and to get the scores back.  This is a bit ugly, but
+    saves having another array to allocate*/
+
+  /* this belongs elsewhere at initialization,
+     eg. where we'll associate search to acoustic models
+  */
+  rec->avg_state_durations = acoustic_models->avg_state_durations;
+
+  current_model_scores = rec->current_model_scores;
+
+  for (model_index = 0; model_index < acoustic_models->num_hmmstates; model_index++)
+  {
+    current_model_scores[model_index] = DO_NOT_COMPUTE_MODEL;
+  }
+
+  current_token_index = rec->active_fsmarc_tokens;
+
+  while (current_token_index != MAXstokenID)
+  {
+    current_token = &(rec->fsmarc_token_array[current_token_index]);
+    /*need to compute all models needed within this HMM*/
+    fsm_arc = &rec->context->FSMarc_list[ current_token->FSMarc_index];
+    hmm_info = &rec->context->hmm_info_for_ilabel[fsm_arc->ilabel];
+
+    /*handle all states that are alive in this hmm*/
+    for (i = 0;i < hmm_info->num_states;i++)
+    {
+      if ((current_token->cost[i] != MAXcostdata) ||
+          ((i > 0) && current_token->cost[i-1] != MAXcostdata))
+      {
+        model_index = hmm_info->state_indices[i];
+        current_model_scores[model_index] = DO_COMPUTE_MODEL;
+      }
+    }
+    current_token_index = current_token->next_token_index;
+  }
+
+  /*for each active FSM node, find models which can come from node*/
+
+  current_ftoken_index = rec->active_fsmnode_tokens;
+
+  while (current_ftoken_index != MAXftokenID)
+  {
+    current_ftoken = &(rec->fsmnode_token_array[current_ftoken_index]);
+    fsm_node = &rec->context->FSMnode_list[current_ftoken->FSMnode_index];
+    fsm_arc = NULL;
+    for (fsm_arc_index = fsm_node->un_ptr.first_next_arc; fsm_arc_index != MAXarcID;
+        fsm_arc_index = fsm_arc->linkl_next_arc) {
+      fsm_arc = rec->context->FSMarc_list+fsm_arc_index;
+
+      if (fsm_arc->ilabel != MAXlabelID)
+      {
+        hmm_info = &rec->context->hmm_info_for_ilabel[fsm_arc->ilabel];
+        if (hmm_info->num_states > 0)
+        {
+
+          /* we should build in here a check that this arc has reasonable weight */
+          /* if(fsm_arc->cost < rec->prune_delta)  */
+          current_model_scores[hmm_info->state_indices[0]] = DO_COMPUTE_MODEL;
+        }
+      }
+    }
+    current_ftoken_index = current_ftoken->next_token_index;
+  }
+
+  /*compute the scores in a batch - this allows the model computing code to
+    chunk it up however it wants*/
+  return 0;
+}
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ * pruning utils                                                            *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+/*this is called at the end of the search*/
+static int prune_new_tokens(srec *rec, costdata current_prune_thresh)
+{
+  int i;
+  nodeID num_deleted;
+  stokenID token_index;
+  fsmarc_token *token;
+  stokenID next_token_index;
+  stokenID *list_head_pointer;
+  char any_alive;
+
+  num_deleted = 0;
+  list_head_pointer = &(rec->active_fsmarc_tokens);
+
+  for (token_index = rec->active_fsmarc_tokens; token_index != MAXstokenID;
+       token_index = next_token_index)
+  {
+
+    token = &(rec->fsmarc_token_array[token_index]);
+    next_token_index = token->next_token_index;
+
+    any_alive = 0;
+
+    for (i = 0;i < token->num_hmm_states;i++)
+    {
+      if (token->cost[i] < current_prune_thresh)
+      {
+        any_alive = 1;
+      }
+    }
+
+    if (!any_alive)
+    { /*everything pruned so recylce the token*/
+      *list_head_pointer = next_token_index;
+
+      rec->best_token_for_arc[rec->fsmarc_token_array[token_index].FSMarc_index] = MAXstokenID;
+
+      free_fsmarc_token(rec, token_index);
+
+      num_deleted++;
+      rec->num_new_states--;
+    }
+    else
+    {
+      list_head_pointer = &token->next_token_index;
+    }
+  }
+  return num_deleted;
+}
+
+static void reprune_word_tokens_if_necessary(srec *rec)
+{
+  word_token* wtoken;
+  wtokenID wtoken_index = rec->word_token_freelist;
+  wtokenID num_free_wtokens = 0;
+
+  for (; wtoken_index != MAXwtokenID; wtoken_index = wtoken->next_token_index)
+  {
+    wtoken = &rec->word_token_array[ wtoken_index];
+    num_free_wtokens++;
+  }
+  if (num_free_wtokens < 2*rec->word_priority_q->max_in_q)
+    reprune_word_tokens(rec, 0);
+}
+
+/*this is called when we run out of room in the state token arrays and need to make more room -
+ it only prunes in theh new time slice - we could also look at pruning the previous slice if needed*/
+
+
+static costdata reprune_new_states(srec *rec, costdata current_best_cost, costdata current_prune_delta)
+{
+  int num_deleted;
+  /*first check to see if current pruning thresholds make enough room
+    (because of better max)*/
+
+  prune_new_tokens(rec, current_best_cost + current_prune_delta);
+
+  ASSERT(((float)current_best_cost) + current_prune_delta < (float)SHRT_MAX);
+
+  while ((rec->num_new_states >= rec->max_new_states - 1)
+         || rec->fsmarc_token_freelist == MAXstokenID)
+  {
+
+    SREC_STATS_INC_STOKEN_REPRUNES(1);
+
+    current_prune_delta = (costdata)(PRUNE_TIGHTEN * current_prune_delta);
+
+    if (current_prune_delta <= 1)
+    {
+      /*this seems like an unlikely case, but if we can't prune enough to make room, give up
+      on the utterance (better than being stuck here forever!)*/
+
+      /*FIX replace with crec abort mechanism*/
+      PLogError ("reprune_new_states: can't seem to prune enough - best cost %d num_new_states %d\n",
+             current_best_cost, rec->num_new_states);
+
+      print_fsmarc_token_list(rec, rec->active_fsmarc_tokens, "CANNOT PRUNE");
+
+      dump_core("reprune died\n");
+    }
+
+    num_deleted = prune_new_tokens(rec, current_best_cost + current_prune_delta);
+
+    ASSERT(((float)current_best_cost + current_prune_delta) < (float)USHRT_MAX);
+  }
+  return current_prune_delta;
+}
+
+
+
+static void prune_fsmnode_tokens(srec *rec, costdata current_prune_thresh, ftokenID not_this_one)
+{
+  nodeID num_deleted;
+  ftokenID token_index;
+  fsmnode_token *token;
+  ftokenID next_token_index;
+  ftokenID *list_head_pointer;
+
+  num_deleted = 0;
+  token_index = rec->active_fsmnode_tokens;
+
+  token = &(rec->fsmnode_token_array[token_index]);
+  list_head_pointer = &(rec->active_fsmnode_tokens);
+
+  while (token_index != MAXftokenID)
+  {
+    next_token_index = token->next_token_index;
+    if( token_index!=not_this_one && token->cost >= current_prune_thresh)
+    {
+      /*pruned so recycle the token*/
+      *list_head_pointer = next_token_index;
+      rec->best_token_for_node[token->FSMnode_index] = MAXftokenID;
+      free_fsmnode_token(rec, token_index);
+      num_deleted++;
+    }
+    else
+    {
+      list_head_pointer = &token->next_token_index;
+    }
+    token_index = next_token_index;
+    token = &(rec->fsmnode_token_array[token_index]);
+  }
+}
+
+
+/*this is called when we run out of room in the state token arrays and need to make more room -
+ it only prunes in theh new time slice - we could also look at pruning the previous slice if needed*/
+
+
+static costdata reprune_fsmnode_tokens(srec *rec, costdata current_best_cost, costdata current_prune_delta,
+                                       ftokenID not_this_one)
+{
+
+  /*first check to see if current pruning thresholds make enough
+    room (because of better max)*/
+
+  prune_fsmnode_tokens(rec, current_best_cost+current_prune_delta, not_this_one);
+
+  ASSERT((float)current_best_cost + (float)current_prune_delta < (float)SHRT_MAX);
+
+  while (rec->fsmnode_token_freelist == MAXftokenID)
+  {
+    SREC_STATS_INC_FTOKEN_REPRUNES(1);
+
+    current_prune_delta = (costdata)(PRUNE_TIGHTEN * current_prune_delta);
+
+    if (current_prune_delta <= 1)
+    {
+      /*this seems like an unlikely case, but if we can't prune enough to make room, give up
+      on the utterance (better than being stuck here forever!)*/
+
+      /*FIX replace with crec abort mechanism*/
+      PLogError ("reprune_fsmnode_tokens: can't seem to prune enough - best cost %d\n",
+             current_best_cost);
+
+      print_fsmnode_token_list(rec, rec->active_fsmnode_tokens, "CANNOT PRUNE: ");
+
+      dump_core("reprune_fsmnode_tokens() died\n");
+    }
+
+    prune_fsmnode_tokens(rec, current_best_cost+current_prune_delta, not_this_one);
+    ASSERT((float)current_best_cost + (float)current_prune_delta < (float)USHRT_MAX);
+  }
+
+  return current_prune_delta;
+}
+
+
+void reset_best_cost_to_zero(srec* rec, costdata current_best_cost)
+{
+  fsmarc_token* stoken;
+  stokenID token_index;
+  short i, num_states;
+
+
+  /*do the state tokens*/
+  for (token_index = rec->active_fsmarc_tokens;
+       token_index != MAXstokenID;
+       token_index = stoken->next_token_index)
+  {
+
+    stoken = &rec->fsmarc_token_array[ token_index];
+    num_states = stoken->num_hmm_states;
+    for (i = 0; i < num_states; i++)
+    {
+      if (stoken->cost[i] < MAXcostdata)
+      {
+        ASSERT(stoken->cost[i]  >= current_best_cost);
+        stoken->cost[i] = (costdata)(stoken->cost[i] - (costdata) current_best_cost);
+      }
+    }
+  }
+}
+
+static void reset_cost_offsets(multi_srec* rec, frameID current_frame,
+                               costdata current_best_cost)
+{
+  rec->cost_offset_for_frame[current_frame] = current_best_cost;
+  if (current_frame == 0)
+    rec->accumulated_cost_offset[current_frame] = current_best_cost;
+  else
+    rec->accumulated_cost_offset[current_frame] = rec->accumulated_cost_offset[current_frame-1] + current_best_cost;
+}
+
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ * word_token functions                                                     *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+/*this function allocates a new word token and remembers it in a list in the srec structure (to be used for backtrace later on*/
+
+static wtokenID create_word_token(srec *rec)
+{
+  wtokenID word_token_index;
+  word_token *word_token;
+
+  word_token_index = get_free_word_token(rec, NULL_IF_NO_TOKENS);
+
+  if (0 && word_token_index == MAXwtokenID)
+  {
+    /*FIX - use crec error handling*/
+    dump_core("create_word_token: cannot allocate word token - we need"
+              " to figure out a word pruning strategy when this happens!\n");
+  }
+
+  word_token = &(rec->word_token_array[word_token_index]);
+
+  return word_token_index;
+}
+
+/* gets rid of fsmnode which trace back to this word since
+   the word is not goingto make it ono the word lattice */
+
+static int block_fsmnodes_per_backtrace(srec *rec, wtokenID wtoken_id)
+{
+  int num_ftokens_blocked = 0;
+  ftokenID current_token_index = rec->active_fsmnode_tokens;
+  while (current_token_index != MAXftokenID) {
+    fsmnode_token *token = &(rec->fsmnode_token_array[current_token_index]);
+	if (token->word_backtrace == wtoken_id) {
+      num_ftokens_blocked++;
+      token->cost = MAXcostdata;
+	}
+	current_token_index = token->next_token_index;
+  }
+  return num_ftokens_blocked;
+}
+
+/* processing a word boundary,
+   current_token is the fsmnode_token to the left of the boundary
+   cost is the cost through this frame
+   pcurrent_word_threshold is the worst score for words on the prio.q
+   returns the word_token index just created
+*/
+static wtokenID srec_process_word_boundary_nbest(srec* rec,
+    nodeID end_node,
+    wordID word,
+    wtokenID word_backtrace,
+    costdata cost,
+    costdata* pcurrent_word_threshold,
+    int *any_nodes_blocked)
+{
+  wtokenID wtoken_index;
+  wtokenID return_wtoken_index;
+  wtokenID token_id_to_remove;
+
+  word_token* wtoken;
+
+  if (word_backtrace != MAXwtokenID)
+  {
+    word_token* btoken = &rec->word_token_array[word_backtrace];
+    if (btoken->end_time >= rec->current_search_frame)
+    {
+      SREC_STATS_INC_BAD_BACKTRACES();
+      return MAXwtokenID;
+    }
+  }
+  /*make new word token*/
+  wtoken_index = create_word_token(rec);
+  //ASSERT(wtoken_index != MAXwtokenID);
+  if (wtoken_index == MAXwtokenID)
+  {
+    /* we could have called reprune_word_tokens() here, but we instead called it
+       at the beginning of do_epsilon_updates() to avoid complications of
+       re-pruning word tokens too deep in the search update */
+    return_wtoken_index = MAXwtokenID;
+    return return_wtoken_index;
+  }
+
+  wtoken = &(rec->word_token_array[wtoken_index]);
+  wtoken->word = word;
+  wtoken->_word_end_time = 0; // new
+  wtoken->end_time = rec->current_search_frame;
+  wtoken->end_node = end_node;
+  wtoken->backtrace = word_backtrace;
+  wtoken->cost = cost;
+
+  token_id_to_remove = add_word_token_to_priority_q(rec->word_priority_q, wtoken_index, rec->word_token_array);
+
+  if (token_id_to_remove == wtoken_index)
+    return_wtoken_index = MAXwtokenID;
+  else
+  {
+    /* the word was truly added to the priority q, so we must
+       get the new worst word on that list */
+    *pcurrent_word_threshold = get_priority_q_threshold(rec->word_priority_q, rec->word_token_array);
+    return_wtoken_index = wtoken_index;
+  }
+
+  if (token_id_to_remove != MAXwtokenID)
+  {
+    /* Jean: must allow for this word_token to be recycled */
+
+    /* ok, the word won't we maintained, so there's no point to
+       continue to search this path (as headed by this fsmarc_token) */
+
+      *any_nodes_blocked += block_fsmnodes_per_backtrace( rec, token_id_to_remove);
+
+    /* we killed the fsmnode token associated with the word being removed.
+       But, we didn't kill it's word backtrace, so there may be word tokens
+       in the backtrace which cannot connect.  But we can't really kill
+       the whole backtrace since it might be shared with other
+       active states, Mike's idea is to add a counter on the
+       word_tokens, which counts how many active paths are using
+       this word_token ... TODO */
+
+    /* print_word_token(rec, token_id_to_remove, "srec_process_word_boundary killed wtoken "); */
+    free_word_token(rec, token_id_to_remove);
+
+  }
+  return return_wtoken_index;
+}
+
+ftokenID* srec_get_parent_for_active_fsmnode(srec* rec, ftokenID ftoken_index)
+{
+  ftokenID* parent_ftoken_index = &rec->active_fsmnode_tokens;
+  while( (*parent_ftoken_index) != MAXftokenID) {
+    fsmnode_token* parent_ftoken = &rec->fsmnode_token_array[ *parent_ftoken_index];
+    if( *parent_ftoken_index == ftoken_index)
+		return parent_ftoken_index;
+    parent_ftoken_index = &parent_ftoken->next_token_index;
+  }
+  return NULL;
+}
+
+/*---------------------------------------------------------------------------*
+ *                                                                           *
+ * updates                                                                   *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+/*handles epsilon transitions (used for word boundaries).  Epsilons come from active
+  fsmnode tokens and maximize into new FSMnode tokens (finds the best path to an FSM
+  node).
+
+  When we hit an
+  epsilon, create a word token, put it in the path, and remember it in a
+  list of all word tokens*/
+
+static int do_epsilon_updates(srec *rec, costdata prune_delta,
+                              costdata best_cost)
+{
+  fsmnode_token *new_ftoken;
+  fsmnode_token *current_ftoken;
+  wtokenID wtoken_index;
+  FSMnode* fsm_node;
+  FSMarc* fsm_arc;
+  costdata cost, cost_with_wtw;
+  ftokenID new_ftoken_index;
+  ftokenID current_ftoken_index;
+  costdata current_word_threshold;
+  arcID fsm_arc_index;
+  wordID word_with_wtw;
+  int num_fsm_nodes_updated=0, num_fsm_nodes_blocked, num_fsm_nodes_blocked2;
+  int num_wtokens_maybe_homonyms;
+  costdata current_prune_delta;
+  costdata current_prune_thresh;
+  altword_token* awtoken;
+
+
+  // printf("FRAME %d\n", rec->current_search_frame);
+  // print_fsmnode_token_list(rec, rec->active_fsmnode_tokens, "BEFORE UPDATE_EPSILONS ACTIVE_FSMNODE_TOKENS: \n");
+
+  current_word_threshold = MAXcostdata;
+  current_prune_delta = prune_delta;
+  current_prune_thresh = best_cost + current_prune_delta;
+
+  current_ftoken_index = rec->active_fsmnode_tokens;
+  while (current_ftoken_index != MAXftokenID)
+  {
+	//  print_fsmnode_token(rec, current_ftoken_index, "processing ... ");
+    current_ftoken = &(rec->fsmnode_token_array[current_ftoken_index]);
+
+    cost = current_ftoken->cost; /*get last state of token*/
+    fsm_node = &rec->context->FSMnode_list[current_ftoken->FSMnode_index];
+    fsm_arc = NULL;
+
+    /* Jean: see below too, let's remember the wtoken_index we create in
+       case we need to re-use it.  All N epsilon updates, and all M
+       M outgoing arcs can share, cuz this is the same arriving arc@frame */
+
+    wtoken_index = MAXwtokenID;
+
+    if( cost >= current_prune_thresh) {
+      ftokenID* parent_ftoken_index;
+      // the srec_get_parent_for_active_fsmnode() functions can be
+      // gotten rid of if we use a doubly-linked list (fwd/bwd ptrs)
+      parent_ftoken_index = srec_get_parent_for_active_fsmnode( rec, current_ftoken_index);
+      if(!parent_ftoken_index) {
+	PLogError( ("Error: internal search error near %s %d, finding %d\n"), __FILE__, __LINE__, current_ftoken_index);
+	print_fsmnode_token_list(rec, rec->active_fsmnode_tokens, "in DO_UPDATE_EPSILONS ACTIVE_FSMNODE_TOKENS: \n");
+	exit(1);
+      }
+      *parent_ftoken_index = current_ftoken->next_token_index;
+      // effectively release this fsmnode_token and go to next one
+      rec->best_token_for_node[ current_ftoken->FSMnode_index] = MAXftokenID;
+      free_fsmnode_token( rec, current_ftoken_index);
+      current_ftoken_index = *parent_ftoken_index;
+      continue;
+    }
+
+    num_fsm_nodes_updated++;
+    num_fsm_nodes_blocked = 0;
+    num_wtokens_maybe_homonyms = 0;
+    for (fsm_arc_index = fsm_node->un_ptr.first_next_arc;
+	 fsm_arc_index != MAXarcID;
+	 fsm_arc_index = fsm_arc->linkl_next_arc)
+      {
+        fsm_arc = &rec->context->FSMarc_list[ fsm_arc_index];
+
+        /* consider only epsilon transitions */
+        if (fsm_arc->ilabel >= EPSILON_OFFSET)
+          continue;
+
+        /* can't loop to yourself on epsilon! */
+        ASSERT(fsm_arc->to_node != current_ftoken->FSMnode_index);
+
+        cost_with_wtw = current_ftoken->cost + fsm_arc->cost; /* WTW */
+        word_with_wtw = current_ftoken->word;
+        if(fsm_arc->olabel != WORD_EPSILON_LABEL)
+          word_with_wtw = fsm_arc->olabel ;
+
+        // we should compare cost_with_wtw but let's let the priority_q
+	// do the pruning
+	if (cost>=current_prune_thresh || fsm_arc->cost>=current_prune_thresh)
+	  continue;
+
+        /*if word boundary, see if it crosses the word end threshold*/
+        /* no room on the word priority_q, so not worth pursuing */
+        if (fsm_arc->ilabel == WORD_BOUNDARY && cost_with_wtw >= current_word_threshold) {
+          continue; // goto NEXT_FTOKEN;
+        }
+
+		new_ftoken = NULL;
+        new_ftoken_index = rec->best_token_for_node[ fsm_arc->to_node];
+        if(new_ftoken_index != MAXftokenID)
+          new_ftoken = &rec->fsmnode_token_array[ new_ftoken_index];
+        if( new_ftoken && (current_ftoken->cost+fsm_arc->cost)<new_ftoken->cost) {
+          /* clobber it */
+        } else if(new_ftoken) {
+          /* merge it */
+        } else if(rec->fsmnode_token_freelist == MAXftokenID) {
+	        /* create it? maybe  */
+			current_prune_delta = reprune_fsmnode_tokens(rec, best_cost, current_prune_delta, current_ftoken_index);
+		    current_prune_thresh = best_cost + current_prune_delta;
+        }
+
+        if (fsm_arc->ilabel == WORD_BOUNDARY) {
+          /* 20030920, for sure the backtrace will change! */
+          // token->word_backtrace = MAXwtokenID;
+
+          wtoken_index = srec_process_word_boundary_nbest(rec,
+						 current_ftoken->FSMnode_index,
+                                                 word_with_wtw,
+                                                 current_ftoken->word_backtrace,
+                                                 cost_with_wtw,
+                                                 &current_word_threshold,
+                                                 &num_fsm_nodes_blocked);
+		  if (wtoken_index != MAXwtokenID) {
+            WORD_TOKEN_SET_WD_ETIME( (rec->word_token_array+wtoken_index),
+              rec->word_token_array[wtoken_index].end_time - current_ftoken->silence_duration);
+		  }
+		  if( fsm_arc->olabel!=WORD_EPSILON_LABEL && wtoken_index != MAXwtokenID) {
+			  num_wtokens_maybe_homonyms++;
+			  if( num_wtokens_maybe_homonyms>1)
+				WORD_TOKEN_SET_HOMONYM( (rec->word_token_array+wtoken_index), 1);
+		  }
+          /* now drop alternative words, note the use of current_token
+             because token is on the other side already */
+          if (current_ftoken->aword_backtrace != AWTNULL) {
+            awtoken = current_ftoken->aword_backtrace;
+            for (; awtoken != AWTNULL; awtoken = awtoken->next_token) {
+              wtokenID wti;
+              wti = srec_process_word_boundary_nbest(rec,
+						     current_ftoken->FSMnode_index,
+                                                     awtoken->word,
+                                                     awtoken->word_backtrace,
+                                                     cost_with_wtw + awtoken->costdelta,
+                                                     &current_word_threshold,
+                                                     &num_fsm_nodes_blocked2);
+            }
+            /* if we don't free the altwords here, i had thought that
+               updates from stateN would make the altwords grow and grow,
+               but by that time all the fsmnodes are brand new */
+            /* leaving them alive allows them to propagate to state0 thru
+               other epsilons (eg non .wb) to new nodes but we don't
+               use such arcs.
+               the .wb would not get dropped again 'cuz we check
+               for that in wtoken_index above.
+               this is quite complex and the case for dropping word_tokens
+               from the node AFTER the .wb can be made
+               ie. would need a re-write of do_epsilon_updates() */
+			if( current_ftoken->aword_backtrace != AWTNULL)
+              free_altword_token_batch(rec, current_ftoken->aword_backtrace);
+            current_ftoken->aword_backtrace = AWTNULL;
+            /*print_fsmnode_token(rec, token-rec->fsmnode_token_array, "123a");*/
+          }
+
+          if( wtoken_index != MAXwtokenID) {
+
+            if( new_ftoken == NULL) {
+              /* create token for the other side */
+              new_ftoken_index = get_free_fsmnode_token(rec, NULL_IF_NO_TOKENS);
+				  // this should not happen because of the above check near
+				  // fsmnode_token_freelist == MAXftokenID
+              ASSERT(new_ftoken_index != MAXftokenID);
+              new_ftoken = &(rec->fsmnode_token_array[new_ftoken_index]);
+              new_ftoken->word_backtrace = wtoken_index;
+              new_ftoken->cost = cost_with_wtw;
+              new_ftoken->word = WORD_EPSILON_LABEL;
+              new_ftoken->FSMnode_index = fsm_arc->to_node;
+              new_ftoken->aword_backtrace = AWTNULL;
+              new_ftoken->next_token_index = current_ftoken->next_token_index;
+              current_ftoken->next_token_index = new_ftoken_index;
+              rec->best_token_for_node[fsm_arc->to_node] = new_ftoken_index;
+            } else if(new_ftoken && cost_with_wtw<new_ftoken->cost) {
+              /* update token on the other side */
+              ftokenID *parent_ftoken_index;
+              new_ftoken = &(rec->fsmnode_token_array[new_ftoken_index]);
+              new_ftoken->cost = cost_with_wtw;
+              new_ftoken->word_backtrace = wtoken_index;
+              new_ftoken->word = WORD_EPSILON_LABEL;
+              // unchanged token->FSMnode_index = fsm_arc->to_node;
+              // because this token was updated, we need to reprocess it, right after
+              parent_ftoken_index = srec_get_parent_for_active_fsmnode( rec, new_ftoken_index);
+              if(!parent_ftoken_index) {
+		PLogError( ("Error: internal search error near %s %d, finding %d\n"), __FILE__, __LINE__, new_ftoken_index);
+		print_fsmnode_token_list(rec, rec->active_fsmnode_tokens, "in DO_UPDATE_EPSILONS ACTIVE_FSMNODE_TOKENS: \n");
+		exit(1);
+              }
+              *parent_ftoken_index = new_ftoken->next_token_index;
+              new_ftoken->next_token_index = current_ftoken->next_token_index;
+              current_ftoken->next_token_index = new_ftoken_index;
+              rec->best_token_for_node[ fsm_arc->to_node] = new_ftoken_index;
+	      /* new_ftoken->aword_backtrace must be null, alts here were 
+		 processed and dropped in srec_process_word_boundary_nbest() */
+              if(new_ftoken->aword_backtrace != AWTNULL) {
+		PLogError( ("Error: internal search error near %s %d\n"), __FILE__, __LINE__);
+		continue;
+              }
+            } else {
+              /* token on other side is same or better, just leave it */
+            }
+          }
+        }
+        else if(fsm_arc->ilabel == EPSILON_LABEL) {
+          if( new_ftoken == NULL) {
+            /* create token for the other side */
+            new_ftoken_index = get_free_fsmnode_token(rec, NULL_IF_NO_TOKENS);
+			// this should not happen because of the above check near
+			// fsmnode_token_freelist == MAXftokenID
+            ASSERT(new_ftoken_index != MAXftokenID);
+            new_ftoken = &(rec->fsmnode_token_array[new_ftoken_index]);
+            new_ftoken->word_backtrace = current_ftoken->word_backtrace;
+            new_ftoken->cost = cost_with_wtw;
+            new_ftoken->word = word_with_wtw;
+            new_ftoken->FSMnode_index = fsm_arc->to_node;
+            new_ftoken->aword_backtrace = refcopy_altwords(rec, current_ftoken->aword_backtrace);
+            new_ftoken->next_token_index = current_ftoken->next_token_index;
+            current_ftoken->next_token_index = new_ftoken_index;
+            rec->best_token_for_node[fsm_arc->to_node] = new_ftoken_index;
+          } else if(new_ftoken && cost_with_wtw<new_ftoken->cost) {
+            /* update token on the other side */
+            ftokenID *parent_ftoken_index;
+            new_ftoken = &(rec->fsmnode_token_array[new_ftoken_index]);
+            new_ftoken->cost = cost_with_wtw;
+            new_ftoken->word_backtrace = current_ftoken->word_backtrace;
+            new_ftoken->word = word_with_wtw;
+	    /* here we are giving up the path and alternatives that existed at
+	       this node, which is not great! The new (better) top choice 
+	       coming in and it's alternatives are propagated instead. 
+	       TODO: merge the alternative lists and the previous top choice 
+	    */
+	    if(new_ftoken->aword_backtrace!=AWTNULL)
+              free_altword_token_batch( rec, new_ftoken->aword_backtrace);
+	    new_ftoken->aword_backtrace = AWTNULL;
+            new_ftoken->aword_backtrace = refcopy_altwords(rec, current_ftoken->aword_backtrace);
+            // unchanged token->FSMnode_index = fsm_arc->to_node;
+            // because this token was updated, we need to re-process it, right after
+            parent_ftoken_index = srec_get_parent_for_active_fsmnode( rec, new_ftoken_index);
+            if(!parent_ftoken_index) {
+	      PLogError( ("Error: internal search error near %s %d, finding %d\n"), __FILE__, __LINE__, new_ftoken_index);
+	      print_fsmnode_token_list(rec, rec->active_fsmnode_tokens, "in DO_UPDATE_EPSILONS ACTIVE_FSMNODE_TOKENS: \n");
+	      exit(1);
+            }
+            *parent_ftoken_index = new_ftoken->next_token_index;
+            new_ftoken->next_token_index = current_ftoken->next_token_index;
+            current_ftoken->next_token_index = new_ftoken_index;
+            rec->best_token_for_node[ fsm_arc->to_node] = new_ftoken_index;
+          } else {
+            /* token on other side is same or better, just leave it */
+	    /* todo: maybe merge alternative lists? */
+          }
+        }
+      } /* loop over arcs */
+
+      ASSERT( current_ftoken->cost != MAXcostdata);
+      if( num_fsm_nodes_blocked) {
+        /* we do not want to propagate fsm node tokens for paths that have
+           just been killed on the basis of no space for word propagation */
+        prune_fsmnode_tokens(rec, MAXcostdata/2, current_ftoken_index);
+      }
+
+    // NEXT_FTOKEN:
+      current_ftoken_index = current_ftoken->next_token_index;
+    }
+
+  // print_fsmnode_token_list(rec, rec->active_fsmnode_tokens, "AFTER UPDATE_EPSILONS ACTIVE_FSMNODE_TOKENS: \n");
+
+  sanity_check_altwords(rec, rec->altword_token_freelist);
+  return num_fsm_nodes_updated;
+}
+
+static void update_internal_hmm_states(srec *rec, costdata *pcurrent_prune_delta,
+                                       costdata *pcurrent_best_cost,
+                                       costdata *precomputed_model_scores)
+{
+  stokenID current_token_index;
+  fsmarc_token *current_token;
+  costdata current_best_cost;
+  costdata current_prune_thresh;
+  costdata current_prune_delta;
+  costdata model_cost;
+  asr_int16_t any_alive;
+  HMMInfo *hmm_info;
+  modelID model_index;
+  asr_int16_t internal_state, end_state;
+  arcID fsm_arc_index;
+  FSMarc* fsm_arc;
+
+  costdata prev_cost;
+  costdata self_loop_cost;
+
+  current_best_cost = *pcurrent_best_cost;
+  current_prune_delta = *pcurrent_prune_delta;
+  current_prune_thresh = current_best_cost + current_prune_delta;
+
+  ASSERT(((float)current_best_cost + current_prune_delta) < (float)USHRT_MAX);
+
+  /* best_token_for_arc must be reset here, cuz the same array might have
+     been used by another gender.  Alternatively we could have let each
+     recog use it's own array thereby save cpu at expense of memory */
+  for (fsm_arc_index = 0; fsm_arc_index < rec->context->num_arcs; fsm_arc_index++)
+    rec->best_token_for_arc[fsm_arc_index] = MAXstokenID;
+
+  current_token_index = rec->active_fsmarc_tokens;
+  while (current_token_index != MAXstokenID)
+  {
+    current_token = &(rec->fsmarc_token_array[current_token_index]);
+
+    fsm_arc_index = current_token->FSMarc_index;
+    fsm_arc = &rec->context->FSMarc_list[fsm_arc_index];
+
+    /* best_token_for_arc must be set here, cuz it was reset above */
+    rec->best_token_for_arc[fsm_arc_index] = current_token_index;
+
+    hmm_info = &rec->context->hmm_info_for_ilabel[ fsm_arc->ilabel];
+    any_alive = 0;
+    end_state = current_token->num_hmm_states - 1;
+
+    for (internal_state = end_state; internal_state >= 0; internal_state--)
+    {
+
+      model_index = hmm_info->state_indices[internal_state];
+      model_cost = precomputed_model_scores[model_index];
+
+      /*better to come from previous or self?*/
+
+      if (internal_state > 0)
+      {
+        prev_cost = current_token->cost[internal_state-1];
+                /* a duration model can be applied here,
+                   by changing the prev_cost according to some function of
+                     the current_token->duration[internal_state-1] rec->avg_state_durations[ prev_model_index] */
+        if (prev_cost < current_prune_thresh)
+        {
+	  modelID prev_model_index;
+          prev_cost = (costdata)(prev_cost + (costdata) model_cost);
+          /* apply duration model for "next" transition, note that it's nice
+             to access the duration model (avg_state_durations) somehwere
+             other than the acoustic models which could be far away in memory
+             arrive penalty would be applied here too if it was reqd */
+
+          prev_model_index = hmm_info->state_indices[internal_state-1];
+          prev_cost = (costdata)(prev_cost + (costdata) duration_penalty_depart(rec->avg_state_durations[ prev_model_index],
+                                 current_token->duration[internal_state-1]));
+
+        }
+      }
+      else
+      {
+        prev_cost = MAXcostdata;
+      }
+
+      self_loop_cost = current_token->cost[internal_state];
+                /* a duration model can be applied here,
+                   by changing the self_loop_cost according to some function of
+                     the current_token->duration[internal_state] rec->avg_state_durations[ prev_model_index] */
+      if (self_loop_cost < current_prune_thresh)
+      {
+        self_loop_cost = (costdata)(self_loop_cost + (costdata) model_cost);
+        /* apply duration model for "loop" transition */
+
+        self_loop_cost = (costdata)(self_loop_cost + (costdata) duration_penalty_loop(rec->avg_state_durations[ model_index],
+                                    current_token->duration[internal_state]));
+
+      }
+
+      if (prev_cost < self_loop_cost)
+      {
+        current_token->cost[internal_state] = prev_cost;
+        current_token->word_backtrace[internal_state] = current_token->word_backtrace[internal_state-1];
+        current_token->word[internal_state] = current_token->word[internal_state-1];
+                current_token->duration[internal_state] = 1;
+        if (current_token->word[internal_state-1] != MAXwordID)
+        {
+          if (current_token->aword_backtrace[internal_state] != AWTNULL)
+            free_altword_token_batch(rec,
+                                     current_token->aword_backtrace[internal_state]);
+          current_token->aword_backtrace[internal_state] = refcopy_altwords(rec, current_token->aword_backtrace[internal_state-1]);
+          /*print_fsmarc_token(rec, current_token_index, "123c");*/
+        }
+        else
+        {
+          /* if there's no top choice, there shouldn't be alternatives! */
+          ASSERT(current_token->aword_backtrace[internal_state] == AWTNULL);
+          ASSERT(current_token->aword_backtrace[internal_state-1] == AWTNULL);
+        }
+      }
+      else
+      {
+        current_token->cost[internal_state] = self_loop_cost;
+                current_token->duration[internal_state]++;
+      }
+
+      if (current_token->cost[internal_state] < current_prune_thresh)
+      {
+        any_alive = 1;
+        if (current_token->cost[internal_state] < current_best_cost)
+        {
+          current_best_cost = current_token->cost[internal_state];
+          current_prune_thresh = current_best_cost + current_prune_delta;
+        }
+      }
+    }
+    current_token_index = current_token->next_token_index;
+  }
+  *pcurrent_best_cost = current_best_cost;
+  *pcurrent_prune_delta = current_prune_delta;
+}
+
+
+
+
+static int GetNumArcsArrivingClip2(srec_context* context, FSMnode* fsm_node)
+{
+  arcID fpa = fsm_node->first_prev_arc;
+  FSMarc* arc;
+
+  if (fpa == MAXarcID)
+    return 0;
+  arc = &context->FSMarc_list[fpa];
+  if (arc->linkl_prev_arc == MAXarcID)
+    return 1;
+  else
+    return 2;
+}
+
+static int update_from_hmms_to_fsmnodes(srec *rec, costdata prune_delta, costdata best_cost)
+{
+  stokenID current_token_index;
+  fsmarc_token *current_token;
+  int end_state;
+  costdata end_cost;
+  costdata current_prune_thresh;
+  costdata current_prune_delta;  /*may get tighter to keep num fsmnodes under control*/
+  // vFSMarc vfsm_arc;
+  FSMarc* fsm_arc;
+  FSMnode* fsm_node;
+  // vFSMnode vfsm_node;
+  arcID fsm_arc_index;
+  nodeID to_node_index;
+  ftokenID new_ftoken_index;
+  fsmnode_token *ftoken;
+  modelID end_model_index;
+  labelID ilabel;
+  short end_cost_equality_hack;
+  HMMInfo* hmm_info;
+  altword_token *awtoken, *q;
+  int num_fsmnode_updates = 0;
+
+  current_prune_delta = prune_delta;
+  current_prune_thresh = best_cost + current_prune_delta;
+  current_token_index = rec->active_fsmarc_tokens;
+
+  for (ilabel = 0; ilabel < NODE_INFO_NUMS; ilabel++)
+  {
+    rec->current_best_ftoken_cost[ilabel] = MAXcostdata / 2;
+    rec->current_best_ftoken_index[ilabel] = MAXftokenID;
+  }
+  sanity_check_altwords(rec, rec->altword_token_freelist);
+
+  while (current_token_index != MAXstokenID)
+  {
+    current_token = &(rec->fsmarc_token_array[current_token_index]);
+
+    /*propagate from end of state token to new FSM node*/
+    end_state = (char) current_token->num_hmm_states - 1;
+
+    ASSERT((current_token->aword_backtrace[end_state] == AWTNULL)
+           || (current_token->word[end_state] != MAXwordID));
+    end_cost = current_token->cost[end_state];
+
+    /* anticipated repruning: make sure there is enough space before
+       beginning complex computation */
+    if (rec->word_priority_q->max_in_q>1 && rec->altword_token_freelist_len < 3*rec->word_priority_q->max_in_q)
+      reprune_altword_tokens(rec);
+
+    if (end_cost < current_prune_thresh)
+    {
+      num_fsmnode_updates++;
+      fsm_arc_index = current_token->FSMarc_index;
+      fsm_arc = &rec->context->FSMarc_list[ fsm_arc_index];
+
+      hmm_info = &rec->context->hmm_info_for_ilabel[ fsm_arc->ilabel];
+
+      end_model_index = hmm_info->state_indices[end_state];
+
+      end_cost = (costdata)(end_cost + (costdata) duration_penalty_depart(rec->avg_state_durations[end_model_index],
+                            current_token->duration[end_state]));
+      to_node_index = fsm_arc->to_node;
+      new_ftoken_index = rec->best_token_for_node[to_node_index];
+      if (new_ftoken_index == MAXftokenID)
+      {
+        /*we need to make sure there is room in the new_states array
+          and there are free state tokens*/
+        if (rec->fsmnode_token_freelist == MAXftokenID)
+        {
+          /*make sure there is room for another FSMnode token
+            - if not, prune until there is room*/
+          current_prune_delta = reprune_fsmnode_tokens(rec, best_cost, current_prune_delta, MAXftokenID);
+          current_prune_thresh = best_cost + current_prune_delta;
+        }
+
+        /*because of the above check, this should always succeed*/
+        new_ftoken_index = get_free_fsmnode_token(rec, EXIT_IF_NO_TOKENS);
+
+        ftoken = &(rec->fsmnode_token_array[new_ftoken_index]);
+        ftoken->FSMnode_index = to_node_index;
+        ftoken->next_token_index = rec->active_fsmnode_tokens;
+        ftoken->cost = end_cost;
+        ftoken->word_backtrace = current_token->word_backtrace[end_state];
+        ftoken->word = current_token->word[end_state];
+        if (end_model_index == SILENCE_MODEL_INDEX && ftoken->word != rec->context->beg_silence_word)
+        {
+          ftoken->silence_duration = current_token->duration[end_state];
+        }
+        else
+        {
+          ftoken->silence_duration = 0;
+        }
+        if (ftoken->word != MAXwordID)
+        {
+          arcID narr;
+          fsm_node = &rec->context->FSMnode_list[ fsm_arc->to_node];
+          /* when there is only one arc arriving, a refcopy is good enough
+             and saves memory */
+          narr = (arcID) GetNumArcsArrivingClip2(rec->context, fsm_node);
+          if (narr > 1)
+            ftoken->aword_backtrace = copy_altwords(rec, current_token->aword_backtrace[end_state], 0);
+          else
+            ftoken->aword_backtrace = refcopy_altwords(rec, current_token->aword_backtrace[end_state]);
+        }
+        else
+        {
+          /* if there's no top choice, there shouldn't be alternatives! */
+          ASSERT(current_token->aword_backtrace[end_state] == AWTNULL);
+          ftoken->aword_backtrace = AWTNULL;
+        }
+        rec->active_fsmnode_tokens = new_ftoken_index;
+        rec->best_token_for_node[to_node_index] = new_ftoken_index;
+      }
+      else /* a token already exists, use it! */
+      {
+
+        ftoken = &(rec->fsmnode_token_array[new_ftoken_index]);
+        ASSERT( ((current_token->word[end_state] == MAXwordID) && (ftoken->word == MAXwordID))
+             || ((current_token->word[end_state] != MAXwordID) && (ftoken->word != MAXwordID)) );
+
+        /* this is a hack for preferring the shorter of the backtrace words
+           when scores are equal, used to prefer longer pau2 word */
+        end_cost_equality_hack = 0;
+        if (end_cost == ftoken->cost)
+        {
+          if (current_token->word_backtrace[end_state] != ftoken->word_backtrace
+              && current_token->word_backtrace[end_state] != MAXwtokenID)
+          {
+            frameID ct_end_time = MAXframeID, et_end_time = 0;
+            if (current_token->word_backtrace[end_state] != MAXwtokenID)
+              ct_end_time = rec->word_token_array[current_token->word_backtrace[end_state]].end_time;
+            if (ftoken->word_backtrace != MAXwtokenID)
+              et_end_time = rec->word_token_array[ftoken->word_backtrace].end_time;
+            if (ct_end_time < et_end_time)
+              end_cost_equality_hack = 1;
+          }
+        }
+
+        if (end_cost < ftoken->cost || end_cost_equality_hack)
+        {
+          /* new one coming in is better, so push the current state down */
+          /* ftoken info goes into awtoken */
+          if (ftoken->word != MAXwordID)
+          {
+            /* copy_altwords() */
+            awtoken = get_free_altword_token(rec, NULL_IF_NO_TOKENS);
+            if (awtoken != AWTNULL)
+            {
+              awtoken->costdelta = ftoken->cost - end_cost;
+              awtoken->word_backtrace = ftoken->word_backtrace;
+              awtoken->word = ftoken->word;
+
+              /* ensure full ownership! */
+              q = ftoken->aword_backtrace;
+              if (q != AWTNULL && q->refcount > 1)
+              {
+                awtoken->next_token = copy_altwords(rec, ftoken->aword_backtrace, ftoken->cost - end_cost);
+                free_altword_token_batch(rec, ftoken->aword_backtrace);
+                /* reversed order above here !! */
+              }
+              else
+              {
+                awtoken->next_token = ftoken->aword_backtrace;
+				count_altword_token( rec, awtoken);
+                for (q = awtoken->next_token; q; q = q->next_token)
+                  q->costdelta += ftoken->cost - end_cost;
+              }
+              ftoken->aword_backtrace = awtoken;
+              ftoken->aword_backtrace = sizewise_altwords(rec, ftoken->aword_backtrace);
+			  if( (q=ftoken->aword_backtrace)!=AWTNULL) {
+                for (q = ftoken->aword_backtrace; q->next_token; q = q->next_token) ;
+                q->next_token = copy_altwords(rec, current_token->aword_backtrace[end_state], 0);
+                ftoken->aword_backtrace = sizewise_altwords(rec, ftoken->aword_backtrace);
+                /* awtoken->costbasis = &ftoken->cost; */
+                ftoken->aword_backtrace->refcount = 1;
+			  }
+            }
+          }
+          else
+          {
+            /* if there's no top choice, there shouldn't be alternatives! */
+            ASSERT(ftoken->aword_backtrace == AWTNULL);
+          }
+          /* and stoken info goes into ftoken */
+          ftoken->cost = end_cost;
+          ftoken->word_backtrace = current_token->word_backtrace[end_state];
+          ftoken->word = current_token->word[end_state];
+          if (end_model_index == SILENCE_MODEL_INDEX && ftoken->word != rec->context->beg_silence_word)
+          {
+            ftoken->silence_duration = current_token->duration[end_state];
+          }
+          else
+          {
+            ftoken->silence_duration = 0;
+          }
+        }
+        else
+        {
+                    /* new arc arriving is worse */
+          /* print_fsmarc_token(rec, current_token_index, "new_arc_arriving worse");
+             print_fsmnode_token(rec, new_ftoken_index, "new_arc_arriving tonode");*/
+          /* append it to the alt list */
+          /* stoken info goes into the awtoken, ftoken unchanged */
+          if (ftoken->word != MAXwordID)
+          {
+            /* copy_altwords() */
+            awtoken = get_free_altword_token(rec, NULL_IF_NO_TOKENS);
+            if (awtoken != AWTNULL)
+            {
+              awtoken->costdelta = end_cost - ftoken->cost;
+              awtoken->word = current_token->word[end_state];
+              awtoken->word_backtrace = current_token->word_backtrace[end_state];
+
+              if (current_token->aword_backtrace[end_state] != AWTNULL)
+                awtoken->next_token = copy_altwords(rec,
+                                                    current_token->aword_backtrace[end_state],
+                                                    awtoken->costdelta);
+              else
+                awtoken->next_token = AWTNULL;
+
+              /* ensure full ownership!, this is new here! */
+              q = ftoken->aword_backtrace;
+              if (q != AWTNULL && q->refcount > 1)
+              {
+                q = copy_altwords(rec, ftoken->aword_backtrace, 0);
+                free_altword_token_batch(rec, ftoken->aword_backtrace);
+                ftoken->aword_backtrace = q;
+              }
+            }
+            if (ftoken->aword_backtrace)
+            {
+              for (q = ftoken->aword_backtrace; q->next_token; q = q->next_token) ;
+              q->next_token = awtoken;
+            }
+            else
+            {
+              ftoken->aword_backtrace = awtoken;
+            }
+			if (ftoken->aword_backtrace!=AWTNULL) {
+				ftoken->aword_backtrace->refcount = 1;
+				ftoken->aword_backtrace = sizewise_altwords(rec, ftoken->aword_backtrace);
+			}
+          }
+        }
+        /*print_fsmnode_token(rec, new_ftoken_index, "123e reused-token ");*/
+      }
+      ilabel = rec->context->FSMnode_info_list[ ftoken->FSMnode_index];
+      ASSERT(ilabel < NODE_INFO_NUMS);
+      if (ftoken->cost < rec->current_best_ftoken_cost[ilabel])
+      {
+        rec->current_best_ftoken_cost[ilabel]  = ftoken->cost;
+        rec->current_best_ftoken_index[ilabel] = new_ftoken_index;
+      }
+      if (ftoken->cost < rec->current_best_ftoken_cost[NODE_INFO_UNKNOWN])
+      {
+        rec->current_best_ftoken_cost[NODE_INFO_UNKNOWN]  = ftoken->cost;
+        rec->current_best_ftoken_index[NODE_INFO_UNKNOWN] = new_ftoken_index;
+      }
+      ASSERT(ftoken->word != MAXwordID || ftoken->aword_backtrace == AWTNULL);
+    }
+    current_token_index = current_token->next_token_index;
+  }
+  sanity_check_altwords(rec, rec->altword_token_freelist);
+  return num_fsmnode_updates;
+}
+
+static int update_from_current_fsm_nodes_into_new_HMMs(srec* rec,
+    costdata *pcurrent_prune_delta,
+    costdata *pcurrent_best_cost,
+    costdata *precomputed_model_scores)
+{
+  costdata prev_cost;
+  FSMnode* fsm_node;
+  FSMarc*  fsm_arc;
+  arcID fsm_arc_index;
+  HMMInfo *hmm_info;
+  modelID model_index;
+  fsmarc_token *token;
+  stokenID new_token_index = MAXstokenID;
+  costdata cost;
+  costdata current_prune_thresh;
+  costdata current_prune_delta = *pcurrent_prune_delta;
+  costdata current_best_cost = *pcurrent_best_cost;
+  ftokenID ftoken_index;
+  ftokenID old_ftoken_index;
+  fsmnode_token *fsmnode_token;
+  int num_fsm_nodes_updated = 0;
+  costdata orig_prune_delta;
+
+  ftoken_index = rec->active_fsmnode_tokens;
+
+  current_prune_thresh = *pcurrent_best_cost + *pcurrent_prune_delta;
+  orig_prune_delta = *pcurrent_prune_delta;
+
+  sanity_check_altwords(rec, rec->altword_token_freelist);
+
+  while (ftoken_index != MAXftokenID)
+  {
+    fsmnode_token = &rec->fsmnode_token_array[ftoken_index];
+
+    prev_cost = fsmnode_token->cost; /*get last state of token*/
+    if (fsmnode_token->FSMnode_index == rec->context->end_node)
+    {
+      prev_cost = MAXcostdata;
+    }
+
+    if (prev_cost < current_prune_thresh)
+    {
+      num_fsm_nodes_updated++;
+
+      fsm_node = &rec->context->FSMnode_list[fsmnode_token->FSMnode_index];
+
+      /* loop over arcs leaving this fsm_node */
+      for (fsm_arc_index = fsm_node->un_ptr.first_next_arc;
+           fsm_arc_index != MAXarcID;
+           fsm_arc_index = fsm_arc->linkl_next_arc)
+      {
+        labelID ilabel;
+        wordID olabel;
+        nodeID nextnode;
+
+        fsm_arc = &rec->context->FSMarc_list[  fsm_arc_index];
+
+        ilabel = fsm_arc->ilabel;
+        olabel = fsm_arc->olabel;
+        nextnode = fsm_arc->to_node;
+
+        if (ilabel >= EPSILON_OFFSET)
+        {
+                    /*so, not an epsilon arc*/
+          hmm_info = &rec->context->hmm_info_for_ilabel[ilabel];
+
+          model_index = hmm_info->state_indices[0];
+
+          cost = prev_cost + precomputed_model_scores[model_index];
+          cost = (costdata)(cost + (costdata) fsm_arc->cost);
+
+          if (cost < current_prune_thresh)
+          {
+            /*new node to keep*/
+
+            /* look for the fsmarc_token* token, into which to maximize, else create new one */
+            if (rec->best_token_for_arc[fsm_arc_index] == MAXstokenID)
+            {
+
+              /*make sure there is room for another state token - if not, prune
+              until there is room*/
+              /*we need to make sure there is room in the new_states array and
+              there are free state tokens*/
+              if (rec->fsmarc_token_freelist == MAXstokenID)
+              {
+                current_prune_delta = reprune_new_states(rec, current_best_cost, current_prune_delta);
+              }
+
+              /* because of the above check, this should always succeed */
+              new_token_index = setup_free_fsmarc_token(rec, fsm_arc, fsm_arc_index, EXIT_IF_NO_TOKENS);
+
+              token = &(rec->fsmarc_token_array[new_token_index]);
+
+              token->next_token_index = rec->active_fsmarc_tokens;
+              rec->active_fsmarc_tokens = new_token_index;
+              rec->num_new_states++;
+
+              rec->best_token_for_arc[fsm_arc_index] = new_token_index;
+              token->cost[0] = MAXcostdata;
+            }
+            else
+            {
+              new_token_index = rec->best_token_for_arc[fsm_arc_index];
+              token = &(rec->fsmarc_token_array[ new_token_index]);
+            }
+
+            if (cost < token->cost[0])
+            {
+              token->cost[0] = cost;
+                            token->duration[0] = 1;
+              token->word_backtrace[0] = fsmnode_token->word_backtrace;
+              if (token->aword_backtrace[0] != AWTNULL)
+                free_altword_token_batch(rec, token->aword_backtrace[0]);
+              token->aword_backtrace[0] = AWTNULL;
+              token->aword_backtrace[0] = refcopy_altwords(rec, fsmnode_token->aword_backtrace);
+
+              if (olabel != WORD_EPSILON_LABEL)
+              {
+                token->word[0] = olabel;
+                //ASSERT(token->aword_backtrace[0] == AWTNULL);
+              }
+              else
+              {
+                token->word[0] = fsmnode_token->word;
+              }
+              ASSERT(token->word[0] != MAXwordID
+                     || token->aword_backtrace[0] == AWTNULL);
+              if (cost < current_best_cost)
+              {
+                current_best_cost = cost;
+                current_prune_delta = orig_prune_delta;  /*if we have a new best cost, the prune delta could go back up*/
+                current_prune_thresh = cost + current_prune_delta;
+                ASSERT((float)cost + (float)current_prune_delta < (float)USHRT_MAX);
+              }
+            }
+          }
+        }
+      }
+    }
+    rec->best_token_for_node[fsmnode_token->FSMnode_index] = MAXftokenID; /*done with this node - remove it from the array*/
+    old_ftoken_index = ftoken_index;
+
+    ftoken_index = fsmnode_token->next_token_index;
+    free_fsmnode_token(rec, old_ftoken_index); /*done with this node - free the token*/
+    rec->active_fsmnode_tokens = ftoken_index; /*needed for sanity_check_altwords*/
+  }
+  /*done with all the tokens, set active tokens to NULL*/
+  rec->active_fsmnode_tokens = MAXftokenID;
+  sanity_check_altwords(rec, rec->altword_token_freelist);
+
+  *pcurrent_best_cost = current_best_cost;
+  *pcurrent_prune_delta = current_prune_delta;
+
+  return num_fsm_nodes_updated;
+}
+
+#if USE_COMP_STATS
+void start_front_end_clock(void)
+{
+  if (!comp_stats)
+    comp_stats = init_comp_stats();
+  start_cs_clock(&comp_stats->front_end);
+}
+void stop_front_end_clock(void)
+{
+  end_cs_clock(&comp_stats->front_end, 1);
+}
+#endif
+
+
+/*---------------------------------------------------------------------------*
+ *                                                                           *
+ * begin and end                                                             *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*gets things started for the viterbi search - sets up things for frame 0*/
+
+int srec_begin(srec *rec, int begin_syn_node)
+{
+  FSMnode* fsm_node;
+  fsmnode_token *token;
+  stokenID new_token_index;
+  nodeID node_index;
+  arcID arc_index;
+
+  if (!rec || !rec->context)
+  {
+    log_report("Error: bad inputs to srec_begin()\n");
+    return 1;
+  }
+  if (!rec->context->whether_prepared)
+  {
+    log_report("srec_begin: Grammar not prepared. Compiling!\n");
+    FST_PrepareContext(rec->context);
+
+    if (!rec->context->whether_prepared)
+    {
+      PLogError("ESR_INVALID_STATE: Grammar can not be compiled (FST_PrepareContext failed)");
+      return ESR_INVALID_STATE ;
+    }
+  }
+
+#if USE_COMP_STATS
+  if (comp_stats == NULL)
+    comp_stats = init_comp_stats();
+#endif
+  /*initialize token storage - not clear we really need this - as long as they
+  are managed correctly, we should be able to do this on startup - not each utt*/
+  initialize_free_fsmarc_tokens(rec);
+  initialize_free_word_tokens(rec);
+  initialize_free_fsmnode_tokens(rec);
+  initialize_word_lattice(rec->word_lattice);
+  initialize_free_altword_tokens(rec);
+
+  if (rec->context->num_nodes > rec->max_fsm_nodes)
+  {
+    log_report("Error: srec_begin failing due to too many grammar nodes\n");
+    return 1;
+  }
+  for (node_index = 0;node_index < rec->context->num_nodes;node_index++)
+  {
+    rec->best_token_for_node[node_index] = MAXftokenID;
+  }
+  if (rec->context->num_arcs > rec->max_fsm_arcs)
+  {
+    log_report("Error: srec_begin failing due to too many grammar arcs\n");
+    return 1;
+  }
+  for (arc_index = 0;arc_index < rec->context->num_arcs;arc_index++)
+  {
+    rec->best_token_for_arc[arc_index] = MAXstokenID;
+  }
+  rec->srec_ended = 0;
+  rec->num_new_states = 0;
+  rec->current_best_cost = 0;
+  rec->current_prune_delta = rec->prune_delta;
+
+  /*need help from johan - does ths FSM only have one start node?
+  Which one is it?   assume just one and it is node 0*/
+
+  fsm_node =  &rec->context->FSMnode_list[ rec->context->start_node];
+  node_index = (nodeID) rec->context->start_node;
+  /* node_index is still 0 at this point */
+
+  /*now we just need to setup an initial fsmnode token (for begin FSM node) and then do epsilon updates*/
+
+  rec->active_fsmarc_tokens = MAXstokenID;
+
+  new_token_index = get_free_fsmnode_token(rec, EXIT_IF_NO_TOKENS);
+
+  token = &(rec->fsmnode_token_array[new_token_index]);
+  token->word_backtrace = MAXwtokenID; /* real value set below*/
+  token->cost = 0;
+  token->word = MAXwordID;
+  token->FSMnode_index = node_index;
+  token->next_token_index = MAXftokenID;
+  token->aword_backtrace = AWTNULL;
+
+  rec->best_token_for_node[node_index] = new_token_index;
+  rec->active_fsmnode_tokens = new_token_index;
+  rec->current_search_frame = 0;
+
+  do_epsilon_updates(rec, rec->prune_delta, 0);
+  return 0;
+}
+
+void srec_force_the_end(srec* rec, frameID end_frame, wordID end_word)
+{
+  srec_word_lattice* wl = rec->word_lattice;
+  wtokenID wtoken_index, tmp;
+  frameID frame;
+  wtoken_index = wl->words_for_frame[end_frame];
+  if (wtoken_index == MAXwtokenID)
+  {
+    for (frame = end_frame - 1; frame > 20; frame--)
+    {
+      if (wl->words_for_frame[frame] != MAXwtokenID)
+      {
+        word_token* wtoken;
+        wl->words_for_frame[end_frame] = wl->words_for_frame[frame];
+        wl->words_for_frame[frame] = MAXwtokenID;
+        for (tmp = wl->words_for_frame[end_frame]; tmp != MAXwtokenID;
+             tmp = wtoken->next_token_index)
+        {
+          wtoken = &rec->word_token_array[tmp];
+          wtoken->end_time = frame;
+          wtoken->word = end_word;
+          wtoken->end_node = rec->context->end_node;
+        }
+#ifdef _WIN32
+        PLogError(L("Forced an end path at end frame %d/%d)\n"), frame, end_frame);
+#endif
+        break;
+      }
+    }
+  }
+}
+
+/* when there are no more frames of input, this functions
+   kills all paths not ending at the end node and
+   creates a word linked list even though there is no WORD_BOUNDARY ilabel */
+
+void srec_no_more_frames(srec* rec)
+{
+#if USE_COMP_STATS
+  frameID end_frame = rec->current_search_frame;
+#endif
+  nodeID  end_node;
+  fsmnode_token* ftoken;
+  ftokenID current_token_index;
+  costdata current_word_threshold = MAXcostdata;
+  wtokenID word_token_index;
+  int any_nodes_blocked = 0;
+  altword_token* awtoken;
+
+  /* this is just for sanity checking, to find out what the state was
+     at the end of input */
+  srec_check_end_of_speech_end(rec);
+
+  if (rec->srec_ended) return;
+  rec->srec_ended = 1;
+
+#if USE_COMP_STATS
+  comp_stats->total_time += (float)(end_frame / 50.0f);
+  dump_comp_stats(comp_stats, PSTDOUT);
+#endif
+
+  end_node = rec->context->end_node;
+  /*remove all word paths from the priority_q which do not end at end_node
+    to make space for those being added below */
+  remove_non_end_word_from_q(rec, rec->word_priority_q, rec->word_token_array,
+                             end_node);
+
+  if (rec->current_search_frame == 0)
+    return;
+
+  rec->accumulated_cost_offset[ rec->current_search_frame] =
+    rec->accumulated_cost_offset[ rec->current_search_frame-1];
+  rec->cost_offset_for_frame[ rec->current_search_frame] = 0;
+
+  /* watch out if using the best_token_for_node[] array here
+     is it valid? not if multiple recognizers, maybe we
+     should remember best_token_for_end_node separately */
+
+  current_token_index = rec->active_fsmnode_tokens;
+  while (current_token_index != MAXftokenID)
+  {
+    ftoken = &rec->fsmnode_token_array[current_token_index];
+    if (ftoken->FSMnode_index == end_node)
+    {
+      /* print_fsmnode_token(rec, current_token_index, "fsmnode_token at end_node "); */
+      word_token_index = srec_process_word_boundary_nbest(rec,
+                         ftoken->FSMnode_index,
+                         ftoken->word,
+                         ftoken->word_backtrace,
+                          ftoken->cost, &current_word_threshold, &any_nodes_blocked);
+      if (word_token_index != MAXwtokenID)
+      {
+        WORD_TOKEN_SET_WD_ETIME( (rec->word_token_array+word_token_index),
+          rec->word_token_array[word_token_index].end_time - ftoken->silence_duration);
+      }
+      /* now also dump alternatives at this last frame, sep19'03 fixed */
+      awtoken = ftoken->aword_backtrace;
+      for (; awtoken != AWTNULL; awtoken = awtoken->next_token)
+      {
+        srec_process_word_boundary_nbest(rec,
+                                         ftoken->FSMnode_index,
+                                         awtoken->word,
+                                         awtoken->word_backtrace,
+                                         ftoken->cost + awtoken->costdelta,
+                                         &current_word_threshold,
+                                         &any_nodes_blocked);
+      }
+    }
+    current_token_index = ftoken->next_token_index;
+  }
+
+  /* we clobber the word_lattice at the last frame that was created
+     in do_epsilon_updates() */
+  word_token_index = get_word_token_list(rec->word_priority_q, rec->word_token_array);
+  lattice_add_word_tokens(rec->word_lattice, rec->current_search_frame, word_token_index);
+
+  if (FST_IsVoiceEnrollment(rec->context) && word_token_index == MAXwtokenID)
+  {
+    srec_force_the_end(rec, rec->current_search_frame, rec->context->end_silence_word);
+  }
+
+  /* find the current_best_cost for this recognizer ... at the end node,
+     it will be used to decide which recognizer wins! */
+  rec->current_best_cost = lattice_best_cost_to_frame(rec->word_lattice,
+                           rec->word_token_array,
+                           rec->current_search_frame);
+
+}
+
+void srec_terminate(srec* rec)
+{
+  frameID ifr;
+  stokenID stoken_index, next_stoken_index;
+  fsmarc_token* stoken;
+  ftokenID ftoken_index, next_ftoken_index;
+  fsmnode_token* ftoken;
+  wtokenID wtoken_index, next_wtoken_index;
+  word_token* wtoken;
+
+  /* release all state tokens */
+  for (stoken_index = rec->active_fsmarc_tokens; stoken_index != MAXstokenID;
+       stoken_index = next_stoken_index)
+  {
+    stoken = &rec->fsmarc_token_array[ stoken_index];
+    next_stoken_index = stoken->next_token_index;
+    free_fsmarc_token(rec, stoken_index);
+  }
+  rec->active_fsmarc_tokens = MAXstokenID;
+
+  /* release all fsmnode tokens */
+  for (ftoken_index = rec->active_fsmnode_tokens; ftoken_index != MAXftokenID;
+       ftoken_index = next_ftoken_index)
+  {
+    ftoken = &rec->fsmnode_token_array[ ftoken_index];
+    next_ftoken_index = ftoken->next_token_index;
+    free_fsmnode_token(rec, ftoken_index);
+  }
+  rec->active_fsmnode_tokens = MAXftokenID;
+
+  /* release all word tokens */
+  for (ifr = 0; ifr < rec->current_search_frame; ifr++)
+  {
+    for (wtoken_index = rec->word_lattice->words_for_frame[ifr];
+         wtoken_index != MAXwtokenID; wtoken_index = next_wtoken_index)
+    {
+      wtoken = &rec->word_token_array[wtoken_index];
+      next_wtoken_index = wtoken->next_token_index;
+      free_word_token(rec, wtoken_index);
+    }
+    rec->word_lattice->words_for_frame[ifr] = MAXwtokenID;
+  }
+  rec->current_model_scores[SILENCE_MODEL_INDEX] = DO_NOT_COMPUTE_MODEL;
+  rec->current_best_cost = MAXcostdata;
+  rec->srec_ended = 1;
+}
+/*------------------------------------------------------------------------*
+ *                                                                        *
+ * main work of the viterbi search                                        *
+ *                                                                        *
+ *------------------------------------------------------------------------*/
+
+/*with new update to FSM node scheme, the sequence of operation is:
+
+  for each frame:
+
+  1. Handle all internal HMM updates based on new frame observations.  This is
+  done in place with the current list of HMM tokens.
+
+  2. For each current active FSM node (from previous frame), activate update
+  into state 0 (either for existing HMM tokens or for new HMM tokens) by going
+  through an observation frame (so, only go from an FSM node to a new HMM
+  token if the first observation frame gets a score above the current pruning
+  threshold).  FSM nodes are freed as this is done.  So, no FSMnode tokens are left
+  at the end of this.
+
+  3. Prune.  Note that the best score will have already been established for
+  this frame (so therefore the pruning threshold will not change).
+
+  4. reset best cost to 0 (to keep scores in range).  We can do this here since we already  know the best score.
+
+  5. For end hmm states which are above the pruning threshold, create new
+  FSMnode_tokens.
+
+  6. update epsilons, including word boundary arcs (which put words onto the word lattice).
+  epsilon updates go from FSM node to FSM node.
+
+  repeat for next frame based on new FSM nodes and current HMMs
+
+*/
+
+void srec_viterbi_part1(srec *rec,
+                        SWIModel *acoustic_models,
+                        pattern_info *pattern,
+                        costdata silence_model_cost);
+
+void srec_viterbi_part2(srec *rec);
+
+int multi_srec_viterbi(multi_srec *recm,
+                       srec_eos_detector_parms* eosd,
+                       pattern_info *pattern,
+                       utterance_info* utt_not_used)
+{
+  EOSrc eosrc1 = SPEECH_ENDED, eosrc2 = SPEECH_ENDED;
+#if DO_ALLOW_MULTIPLE_MODELS
+  ASSERT(recm->num_activated_recs == recm->num_swimodels);
+    if (recm->num_activated_recs == 1)
+  {
+#endif
+    srec* rec1 = &recm->rec[0];
+#if USE_COMP_STATS
+    start_cs_clock1(&comp_stats->overall_search);
+#endif
+    if (rec1->current_search_frame >= (rec1->word_lattice->max_frames - 1))
+      return 1;
+    srec_viterbi_part1(&recm->rec[0], recm->swimodel[0], pattern, DO_NOT_COMPUTE_MODEL);
+    reset_best_cost_to_zero(rec1, rec1->current_best_cost);
+    reset_cost_offsets(recm, rec1->current_search_frame, rec1->current_best_cost);
+    rec1->current_prune_delta = rec1->prune_delta;
+    rec1->current_best_cost   = 0;
+    srec_viterbi_part2(&recm->rec[0]);
+    eosrc1 = srec_check_end_of_speech(eosd, &recm->rec[0]);
+#if USE_COMP_STATS
+    end_cs_clock1(&comp_stats->overall_search, 1);
+#endif
+
+    SREC_STATS_UPDATE(&recm->rec[0]);
+    recm->eos_status = eosrc1;
+#if DO_ALLOW_MULTIPLE_MODELS
+    }
+  else if (recm->num_activated_recs == 2)
+  {
+    srec* rec1 = &recm->rec[0];
+    srec* rec2 = &recm->rec[1];
+    SWIModel* acoustic_models1 = recm->swimodel[0];
+    SWIModel* acoustic_models2 = recm->swimodel[1];
+    costdata diff;
+    costdata current_best_cost;
+
+    ASSERT(rec1->prune_delta == rec2->prune_delta);
+    /* in part 1 we need to operate by adjusting the prune delta, 'cuz we want
+       to operate on scores after consumption of a frame */
+    if ((rec1->current_best_cost > MAXcostdata / 2 && !rec1->srec_ended) ||
+        (rec2->current_best_cost > MAXcostdata / 2 && !rec2->srec_ended))
+    {
+      printf("hey %d %d\n", rec1->current_best_cost, rec2->current_best_cost);
+    }
+
+    /* figure out the prune_delta for the different genders, we
+       want that pruning should be joint (i.e. prune male and
+       female relative to overall best).  Before part1 we don't
+       yet know the overall best, so we use the gender score gap
+       from the last frame, and make the prune the worse gender
+       accordingly more aggressive */
+
+    if (!rec2->srec_ended && rec1->current_best_cost < rec2->current_best_cost)
+    {
+      diff = rec2->current_best_cost - rec1->current_best_cost;
+      if (rec2->current_search_frame >= (rec2->word_lattice->max_frames - 1))
+      {
+        return 1;
+      }
+      if (diff > rec2->prune_delta)
+      {
+        srec_terminate(rec2);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+        PLogMessage("T: terminate_viterbi(rec2) @%d", rec2->current_search_frame);
+#endif
+      }
+      else
+        rec2->current_prune_delta = rec2->prune_delta - diff;
+      rec1->current_prune_delta = rec1->prune_delta;
+    }
+    else if (!rec1->srec_ended)
+    {
+      if (rec1->current_search_frame >= (rec1->word_lattice->max_frames - 1))
+      {
+        return 1;
+      }
+      diff = rec1->current_best_cost - rec2->current_best_cost;
+      if (diff > rec1->prune_delta)
+      {
+        srec_terminate(rec1);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+        PLogMessage("T: terminate_viterbi(rec1) @%d", rec1->current_search_frame);
+#endif
+      }
+      else
+        rec1->current_prune_delta = rec1->prune_delta - diff;
+      rec2->current_prune_delta = rec2->prune_delta;
+    }
+
+    /* now run part1 for each gender */
+    if (!rec1->srec_ended)
+    {
+      srec_viterbi_part1(rec1, acoustic_models1, pattern, DO_NOT_COMPUTE_MODEL);
+      SREC_STATS_UPDATE(rec1);
+    }
+
+    if (!rec2->srec_ended)
+    {
+      srec_viterbi_part1(rec2, acoustic_models2, pattern, rec1->current_model_scores[SILENCE_MODEL_INDEX]);
+      SREC_STATS_UPDATE(rec2);
+    }
+
+    /* now adjust score offsets, score offsets are shared across genders */
+
+    if (rec1->current_best_cost <= rec2->current_best_cost)
+    {
+      /* am1 is winning, prune 2 harder */
+      current_best_cost = rec1->current_best_cost;
+      reset_cost_offsets(recm, rec1->current_search_frame, current_best_cost);
+    }
+    else
+    {
+      /* am2 is winning, prune 1 harder */
+      current_best_cost = rec2->current_best_cost;
+      reset_cost_offsets(recm, rec2->current_search_frame, current_best_cost);
+    }
+
+    /* jean: some cleanup needed here */
+    /** best_token_for_arc = rec1->best_token_for_arc;
+      rec1->best_token_for_arc = 0; **/
+    if (!rec1->srec_ended)
+    {
+      reset_best_cost_to_zero(rec1, current_best_cost);
+      rec1->current_best_cost = (costdata)(rec1->current_best_cost - (costdata) current_best_cost);
+      srec_viterbi_part2(rec1);
+      if (rec1->active_fsmnode_tokens == MAXftokenID)
+        srec_terminate(rec1);
+      if (!rec1->srec_ended)
+        eosrc1 = srec_check_end_of_speech(eosd, rec1);
+    }
+    /** rec1->best_token_for_arc = best_token_for_arc;
+      best_token_for_arc = rec2->best_token_for_arc;
+      rec2->best_token_for_arc = 0; **/
+    if (!rec2->srec_ended)
+    {
+      reset_best_cost_to_zero(rec2, current_best_cost);
+      rec2->current_best_cost = (costdata)(rec2->current_best_cost - (costdata) current_best_cost);
+      srec_viterbi_part2(rec2);
+      if (rec2->active_fsmnode_tokens == MAXftokenID)
+        srec_terminate(rec2);
+      if (!rec2->srec_ended)
+        eosrc2 = srec_check_end_of_speech(eosd, rec2);
+    }
+    /** rec2->best_token_for_arc = best_token_for_arc; **/
+    SREC_STATS_UPDATE(rec1);
+    SREC_STATS_UPDATE(rec2);
+    recm->eos_status = eosrc1;
+    if (rec1->current_best_cost > rec2->current_best_cost)
+      recm->eos_status = eosrc2;
+  }
+#endif
+    return 0;
+}
+
+
+void srec_viterbi_part1(srec *rec,
+                        SWIModel *acoustic_models,
+                        pattern_info *pattern,
+                        costdata silence_model_cost)
+{
+  costdata current_best_cost;
+  /*  costdata current_prune_thresh; */
+  costdata current_prune_delta;
+  /* the score difference for pruning - can get adjusted below if
+     pruning gets tighted to keep array sizes in check*/
+  costdata *current_model_scores;
+  int num_models_computed;
+  nodeID num_fsm_nodes_updated;
+
+#if USE_COMP_STATS
+  start_cs_clock(&comp_stats->models);
+#endif
+
+  /*first go ahead and compute scores for all models which are needed by the search at this point*/
+
+
+  find_which_models_to_compute(rec, acoustic_models);
+  /* communication happens via rec->current_model_scores */
+#define SCORE_FIRST_SILENCE_ONLY
+#ifdef SCORE_FIRST_SILENCE_ONLY
+  if (silence_model_cost != DO_NOT_COMPUTE_MODEL)
+    rec->current_model_scores[SILENCE_MODEL_INDEX] = silence_model_cost;
+#endif
+  num_models_computed = compute_model_scores(rec->current_model_scores, acoustic_models, pattern, rec->current_search_frame);
+  rec->best_model_cost_for_frame[rec->current_search_frame] = best_uint16(rec->current_model_scores, acoustic_models->num_hmmstates);
+
+#if USE_COMP_STATS
+  end_cs_clock(&comp_stats->models, num_models_computed);
+  start_cs_clock(&comp_stats->internal_hmm);
+#endif
+
+  /*get some things out of the rec structure to make things a bit faster*/
+  current_model_scores = rec->current_model_scores;
+
+  /*update search to next frame*/
+  current_best_cost = MAXcostdata - ((costdata)2) * rec->prune_delta; /*to avoid overflows, must clean up later */
+  /* current_prune_thresh = MAXcostdata; */
+  current_prune_delta = rec->current_prune_delta;
+
+  /* srec_stats_update(rec, "(...0) "); */
+  /*------------------------------------------------------------------------*
+    1. Handle all internal HMM updates based on new frame observations.  This is
+    done in place with the current list of HMM tokens.
+   *------------------------------------------------------------------------*/
+
+  update_internal_hmm_states(rec, &current_prune_delta, &current_best_cost, current_model_scores);
+
+  /*  check_if_any_token_better_than_best_cost(rec, rec->active_fsmarc_tokens, current_best_cost, "after update into new");*/
+
+#if USE_COMP_STATS
+  end_cs_clock(&comp_stats->internal_hmm, rec->num_new_states);
+  start_cs_clock(&comp_stats->fsm_to_hmm);
+#endif
+
+  /* srec_stats_update(rec, "(...1) "); */
+  /*------------------------------------------------------------------------*
+    2. For each current active FSM node (from previous frame), activate update
+    into state 0 (either for existing HMM tokens or for new HMM tokens) by going
+    through an observation frame (so, only go from an FSM node to a new HMM
+    token if the first observation frame gets a score above the current pruning
+    threshold).  FSM nodes are freed as this is done.  So, no FSMnode tokens are left
+    at the end of this.
+   *------------------------------------------------------------------------*/
+
+  num_fsm_nodes_updated = (nodeID) update_from_current_fsm_nodes_into_new_HMMs(rec, &current_prune_delta, &current_best_cost, current_model_scores);
+  /* srec_stats_update(rec, "(...2) "); */
+  /*------------------------------------------------------------------------*
+    3. Prune.  Note that the best score will have already been established for
+    this frame (so therefore the pruning threshold will not change).
+   *------------------------------------------------------------------------*/
+
+#if USE_COMP_STATS
+  end_cs_clock(&comp_stats->fsm_to_hmm, num_fsm_nodes_updated);
+  start_cs_clock(&comp_stats->prune);
+#endif
+
+  prune_new_tokens(rec, (costdata)(current_best_cost + current_prune_delta));
+
+  /* it's nice to do word token pruning here 'cuz we only need to traceback
+     the active_fsmarc_tokens, active_fsmnode_tokens are propogated thereto */
+
+  reprune_word_tokens_if_necessary(rec);
+
+  rec->current_prune_delta = current_prune_delta;
+  rec->current_best_cost = current_best_cost;
+  /* srec_stats_update(rec, "(...3) "); */
+#if USE_COMP_STATS
+  end_cs_clock(&comp_stats->prune, rec->num_new_states);
+#endif
+}
+
+void srec_viterbi_part2(srec *rec)
+{
+  wtokenID word_token_index;
+  nodeID inode, num_fsm_nodes_updated;
+  costdata current_prune_delta = rec->current_prune_delta;
+  costdata current_best_cost = rec->current_best_cost;
+  ftokenID* ftmp;
+  int num_updates;
+
+  /* first we clear the best_token_for_node array, there are no live
+     fsmnode_tokens at this point, and we don't want leftovers from
+     the last frame */
+  ftmp = rec->best_token_for_node;
+  for (inode = 0; inode < rec->context->num_nodes; inode++)
+    *ftmp++ = MAXftokenID;
+
+  /*------------------------------------------------------------------------*
+    4. reset best cost to 0 (to keep scores in range).  We can do this here
+    since we already know the best score.  This is done here so that
+    no fsmnode tokens (there are none active now) need updating.  This is also
+    done here before epsilons - that way we don't need to update the word
+    tokens .
+
+    We assume this was done just before part2.
+   *------------------------------------------------------------------------*/
+
+#if USE_COMP_STATS
+  start_cs_clock(&comp_stats->hmm_to_fsm);
+#endif
+
+  /*------------------------------------------------------------------------*
+    5. For end hmm states which are above the pruning threshold, create new
+    FSMnode_tokens.
+   *------------------------------------------------------------------------*/
+
+  num_updates = update_from_hmms_to_fsmnodes(rec, current_prune_delta, current_best_cost);
+  if (num_updates == 0)
+  {
+    num_updates = update_from_hmms_to_fsmnodes(rec, 2 * current_prune_delta, current_best_cost);
+    SREC_STATS_INC_FORCED_UPDATES();
+  }
+  SREC_STATS_UPDATE(rec);
+
+#if USE_COMP_STATS
+  end_cs_clock(&comp_stats->hmm_to_fsm, rec->num_new_states);
+  start_cs_clock(&comp_stats->epsilon);
+#endif
+
+  /* srec_stats_update(rec, "(...5) "); */
+
+  /*------------------------------------------------------------------------*
+    6. update epsilons, including word boundary arcs (which put words onto the word lattice).
+    epsilon updates go from FSM node to FSM node.
+   *------------------------------------------------------------------------*/
+
+  /*clear priority_q for this frame*/
+  clear_priority_q(rec->word_priority_q);
+
+  num_fsm_nodes_updated = (nodeID) do_epsilon_updates(rec, current_prune_delta, current_best_cost);
+
+#if USE_COMP_STATS
+  end_cs_clock(&comp_stats->epsilon, num_fsm_nodes_updated);
+#endif
+
+  /* srec_stats_update(rec, "(...6) "); */
+  rec->current_search_frame++;
+
+  /* no need to prune again after epsilons since they add no new cost - if we
+     add costs to epsilon arcs (at word boundaries for example), add another
+     pruning stage */
+
+  word_token_index = get_word_token_list(rec->word_priority_q, rec->word_token_array);
+  lattice_add_word_tokens(rec->word_lattice, rec->current_search_frame, word_token_index);
+}
+
+/* get the top choice, trace it back, and find out where speech starts
+   and ends.  this is used for channel normalization */
+
+static srec* WHICH_RECOG(multi_srec* rec)
+{
+#if DO_ALLOW_MULTIPLE_MODELS
+  srec* return_rec = NULL;
+  costdata current_best_cost = MAXcostdata;
+  int i = 0;
+  for (i = 0; i < rec->num_activated_recs; i++)
+  {
+    if (current_best_cost > rec->rec[i].current_best_cost)
+    {
+      current_best_cost = rec->rec[i].current_best_cost;
+      return_rec = &rec->rec[i];
+    }
+  }
+  return return_rec;
+#else
+    return &rec->rec[0];
+#endif
+}
+
+void multi_srec_get_speech_bounds(multi_srec* recm, frameID* start_frame, frameID* end_frame)
+{
+  frameID csf;
+  wtokenID token_index;
+  wordID last_word;
+  srec* rec = WHICH_RECOG(recm);
+
+  *start_frame = *end_frame = 0;
+
+  if (!rec)
+    return;
+  csf = rec->current_search_frame;
+  token_index = rec->word_lattice->words_for_frame[csf];
+  last_word = MAXwordID;
+  while (token_index != MAXwtokenID)
+  {
+    word_token* wtoken = &rec->word_token_array[token_index];
+    word_token* next_wtoken;
+
+    if (wtoken->word == rec->context->beg_silence_word)
+    {
+      if (*start_frame == 0) *start_frame = wtoken->end_time;
+    }
+    if (wtoken->word == rec->context->hack_silence_word)
+    {
+      if (wtoken->backtrace != MAXwtokenID)
+      {
+        next_wtoken = &rec->word_token_array[wtoken->backtrace];
+        if (next_wtoken->word == rec->context->beg_silence_word)
+          *start_frame = wtoken->end_time;
+      }
+    }
+
+    if (last_word == rec->context->end_silence_word)
+    {
+      *end_frame = wtoken->end_time;
+      if (wtoken->word ==  rec->context->hack_silence_word
+          && wtoken->backtrace != MAXwtokenID)
+      {
+        next_wtoken = &rec->word_token_array[wtoken->backtrace];
+        *end_frame = WORD_TOKEN_GET_WD_ETIME( next_wtoken);
+      }
+    }
+    if (token_index ==  wtoken->backtrace)
+    {
+      /* infinite loop! */
+      PLogError ("warning: breaking infinite loop\n");
+      *end_frame = 0;
+      break;
+    }
+    token_index = wtoken->backtrace;
+    last_word = wtoken->word;
+  }
+}
+
+int multi_srec_get_eos_status(multi_srec* rec)
+{
+  int rc;
+  ASSERT(rec);
+  rc = (int)rec->eos_status;
+  if (rc < 0) rc = 0;
+  return rc;
+}
+
+  /*
+     ToDo List:
+
+     end-pointing
+     duration
+     channel normalization
+     re-use and appropriate killing of word_tokens
+     pruning fsmnode_tokens
+     astar backward for alternative choices
+
+     minimized graphs and word merging
+     Johans idea:
+     When propagating a fsmarc_token, we need to remember the word.id when it
+     is observed.  Let's continue to use fsmarc_token->word[] to remember those.
+     When merging 2+ fsmarc_tokens into a fsmnode_token, we need remember
+     both histories, not just the best. All histories and maintained on a linked
+     list, with word_token->next_token_index serving as links, somehow we also
+     remember the cost offset from one link to the next and keep track of that.
+     Try to create the word_token as late a possible, so as to keep usage down.
+     The list should be sorted so that we can drop things off the end, Ie. don't
+     need to keep all word, a max of 10 is fine cuz that's the most we'll need
+     to drop off at a .wb anyways!
+
+     altwords .. working .. now cpu optimize ... ideas
+     use only the head refcount, #define the refcopy, not a function
+     free_altword_token_batch() should not double check for AWTNULL
+     BUILD & BUILD_DEBUG in selected areas
+     reprune_altword_token_batch ... change costbasis to a tag ... to say (already repruned)
+
+
+
+     endpointing
+     at grammar prepare ...
+     get the list of endnodes ... get the list of opendnodes
+     ... start from the graph's endnode, walk backwards on all null or silence arcs, find the nodes which have a silence or null path to the end: those are sinknodes
+     ... sinknodes are endnodes or opendnodes ... the sinknodesO are the sinknodes that do go to speech arcs .. the sinknodes1 are the sinknodes that do not go to any speech arcs
+     ... walkforward all sinknodes0 through iwt arcs, those are openendnodes
+     ... walkforward all sinknodes1 through iwt arcs, those are endnodes
+     get the top score fsmnode_token ...
+     ... is it on an endnode ... has this been the top choice for the last 30 frames
+     ... is it on an optional endnode ... has this neen the top choice for the last 50 frames?
+
+  */
diff --git a/srec/crec/srec_context.c b/srec/crec/srec_context.c
new file mode 100644
index 0000000..b00ec86
--- /dev/null
+++ b/srec/crec/srec_context.c
@@ -0,0 +1,3835 @@
+/*---------------------------------------------------------------------------*
+ *  srec_context.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "stdlib.h"
+#include "string.h"
+#include "buildopt.h"
+#include "setting.h"
+#include "passert.h"
+#include "pendian.h"
+#include "portable.h"
+#include "pstdio.h"
+#include "ptypes.h"
+#include "srec_context.h"
+#include "srec_sizes.h"
+#include "search_network.h"
+#include "srec_arb.h"
+#include "hmm_desc.h"
+#if USE_COMP_STATS
+#include "comp_stats.h"
+#endif
+
+#ifdef SET_RCSID
+static const char *rcsid = 0 ? (const char *) &rcsid :
+"$Id: srec_context.c,v 1.84.4.54 2008/05/15 20:06:39 dahan Exp $";
+#endif
+
+
+/* these are constants for now, we need to figure out how to make
+   this more flexible, possible ideas are:
+   (1) to specify these via API functions such as CR_LoadSyntax(),
+   (2) use defaults that would have been set the main parfile,
+   (3) put values for these fields in an actual grammar
+*/
+
+#define AVG_ARCS_PER_WORD    10
+#define AVG_NODES_PER_WORD    7
+#define AVG_CHARS_PER_WORD   18
+#define MAX_PRON_LEN         1024
+#define MAX_WORD_LEN 128
+#define DO_WEIGHTED_ADDWORD   1
+#define SLOTLOOP_OFFSET 64
+#define SLOTNAME_INDICATOR "__"
+#define RULE_INDICATOR '@'
+#define MAX_LINE_LENGTH 512
+#define DEFAULT_WB_COST 40
+#define DISABLE_ARC_COST 999
+#define DO_ARCS_IO_IN_ARC_ORDER 1
+
+#define IS_SILENCE_ILABEL(ilabel,context) (ilabel >= context->hmm_ilabel_offset+EPSILON_OFFSET && ilabel<context->hmm_ilabel_offset+EPSILON_OFFSET+NUM_SILENCE_HMMS)
+// looking to match filename.grxml.Names@__Names__ 
+// see also grxmlcompile.cpp where these names are constructed
+#define IS_SLOT_OLABEL(wd) (strchr(wd,IMPORTED_RULES_DELIM)<strstr(wd,SLOTNAME_INDICATOR) && strlen(wd)>4 && !strcmp(wd+strlen(wd)-2,SLOTNAME_INDICATOR) )
+
+/*
+SYNTAX : DATA_ALIGN(pointer, data type, bytes_filled)
+EXAMPLE: We need to cast a memory address to a (wordmap*)
+         so we call DATA_ALIGN(memptr, wordmap, filled),
+         where FILLED contains the number of bytes that were used to align the pointer
+*/
+#if (CPU & CPU_ARM)||(CPU & CPU_STRONGARM)
+/* under IPAQ it appears we need to align the structures
+   to certain boundaries.  More attention needed here for other
+   platforms ! */
+#define DATA_ALIGN(x, y, z) if ((int) (x) % sizeof(y)) { \
+    (z)=sizeof(y) - ((int) (x) % sizeof(y)); \
+    (x) += (z); /* force correct data alignment */ \
+  } else z=0;
+#else
+#define DATA_ALIGN(x, y, z)
+#endif
+
+int do_minimize = 1;
+#define PTR_TO_IDX(ptr, base) ((asr_uint32_t) (ptr == NULL ? 0xFFFFFFFFu : (asr_uint32_t)(ptr - base)))
+#define IDX_TO_PTR(idx, base) (idx == 0xFFFFFFFFu ? NULL : base + idx)
+
+/* prototypes */
+
+/*----------------------------------------------------------------------*
+ *                                                                      *
+ * internal prototypes                                                  *
+ *                                                                      *
+ *----------------------------------------------------------------------*/
+
+/* general use functions */
+char split_line(char* line, char** av);
+asr_int32_t atoi_with_check(const char* buf, asr_int32_t max);
+int sprintf_arc(char* buf, srec_context* fst, FSMarc* arc);
+int printf_arc1(srec_context* fst, char* msg, FSMarc* arc);
+int printf_node1(srec_context* fst, FSMnode* node);
+
+/* fst_* functions are internal fst functions */
+int fst_add_arcs(srec_context* fst, nodeID start_node, nodeID end_node,
+                 wordID olabel, costdata cost,
+                 modelID* model_sequence, int num_models);
+int fst_push_arc_olabel(srec_context* fst, FSMarc* arc);
+int fst_push_arc_cost(srec_context* fst, FSMarc* arc);
+int fst_pull_arc_olabel(srec_context* fst, FSMarc* arc);
+int fst_free_arc(srec_context* fst, FSMarc* arc);
+int fst_free_node(srec_context* fst, FSMnode* node);
+int fst_free_arc_net(srec_context* fst, FSMarc* arc);
+arcID fst_get_free_arc(srec_context* fst);
+nodeID fst_get_free_node(srec_context* fst);
+int fst_pack_arc_usage(srec_context* fst);
+
+void append_arc_arriving_node(srec_context* fst, FSMnode* to_node, FSMarc_ptr atok);
+void append_arc_leaving_node(srec_context* fst, FSMnode* fr_node, FSMarc_ptr atok);
+int num_arcs_leaving(srec_context* fst, FSMnode* node);
+
+int num_arcs_arriving(srec_context* fst, FSMnode* node);
+int num_arcs_arriving_gt_1(srec_context* fst, FSMnode* node);
+int fst_fill_node_info(srec_context* context);
+int fst_alloc_transit_points(srec_context* context);
+
+/* higher-level functions */
+int FST_LoadReverseWordGraph(srec_context* context, int num_words_to_add,
+                             PFile* fp);
+int FST_LoadParams(srec_context* context, PFile* fp);
+int FST_AssumeParams(srec_context* context);
+int FST_UnloadReverseWordGraph(srec_context* context);
+int FST_AttachArbdata(srec_context* fst, srec_arbdata* allophone_tree);
+
+static ESR_ReturnCode wordmap_clean ( wordmap *word_map );
+static ESR_ReturnCode wordmap_populate ( wordmap *word_map, wordID num_words );
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ *                                                                          *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+int FST_IsVoiceEnrollment(srec_context* context)
+{
+  if (context->olabels == NULL) return 0;
+  if (context->olabels->num_words < 2) return 0;
+  if (strstr(context->olabels->words[1], "enroll")) return 1;
+  return 0;
+}
+
+int FST_LoadContext(const char* synbase, srec_context** pcontext,
+                    int num_words_to_add)
+{
+  int rc;
+  PFile* fp;
+  char buffer[MAX_LINE_LENGTH];
+  srec_context* context;
+
+  context = (srec_context*)CALLOC_CLR(1, sizeof(srec_context), "srec.graph.base");
+  if(!context)
+	  return FST_FAILED_ON_MEMORY;
+  memset(context, 0, sizeof(srec_context));
+
+  context->addWordCaching_lastslot_name = 0;
+  context->addWordCaching_lastslot_num = MAXwordID;
+  context->addWordCaching_lastslot_needs_post_silence = ESR_FALSE;
+
+  sprintf(buffer, "%s.map", synbase);
+  fp = file_must_open(NULL, buffer, L("r"), ESR_TRUE);
+  if (!fp) return FST_FAILED_ON_INVALID_ARGS;
+  rc = FST_LoadWordMap(&context->olabels, num_words_to_add, fp);
+  pfclose(fp);
+  if (rc) return rc;
+
+  sprintf(buffer, "%s.PCLG.txt", synbase);
+  fp = file_must_open(NULL, buffer, L("r"), ESR_TRUE);
+  if (!fp) return FST_FAILED_ON_INVALID_ARGS;
+  rc = FST_LoadGraph(context, context->ilabels, context->olabels, num_words_to_add, fp);
+  pfclose(fp);
+  if (rc != FST_SUCCESS) return rc;
+
+  sprintf(buffer, "%s.Grev2.det.txt", synbase);
+  fp = file_must_open(NULL, buffer, L("r"), ESR_TRUE);
+  if (!fp) return FST_FAILED_ON_INVALID_ARGS;
+  rc = FST_LoadReverseWordGraph(context, num_words_to_add, fp);
+  pfclose(fp);
+  if (rc != FST_SUCCESS) return rc;
+
+  sprintf(buffer, "%s.params", synbase);
+  fp = file_must_open(NULL, buffer, L("r"), ESR_TRUE);
+  if (fp) {
+    rc = FST_LoadParams(context, fp);
+    pfclose(fp);
+    if (rc != FST_SUCCESS) return rc;
+  } else {
+    rc = FST_AssumeParams(context);
+  }
+
+  context->grmtyp = (arcID)FST_GetGrammarType(context);
+
+  *pcontext = context;
+  rc = fst_fill_node_info(context);
+  return rc ? FST_FAILED_ON_INVALID_ARGS : FST_SUCCESS;
+}
+
+void FST_UnloadContext(srec_context* context)
+{
+  if (!context) return;
+
+  FST_UnloadWordMap(&context->ilabels);
+  FST_UnloadWordMap(&context->olabels);
+  FST_UnloadGraph(context);
+  FST_UnloadReverseWordGraph(context);
+  FREE(context);
+}
+
+int FST_PrepareContext(srec_context* context)
+{
+  nodeID i;
+  int rc = FST_SUCCESS;
+  /* after all word additions, we need to "prepare" the context */
+
+  /* first check for any changes to optional endnodes etc .. */
+  for (i = 0; i < context->num_nodes; i++)
+    if (context->FSMnode_info_list[i] == NODE_INFO_UNKNOWN)
+      break;
+  if (i != context->num_nodes)
+    rc = fst_fill_node_info(context);
+
+  context->whether_prepared = 1;
+  return rc ? FST_FAILED_ON_INVALID_ARGS : FST_SUCCESS;
+}
+
+void fst_set_wb_costs( srec_context* context, costdata wbcost)
+{
+  unsigned int i;
+  for(i=0; i<(unsigned int)context->FSMarc_list_len; i++) {
+    if(context->FSMarc_list[i].ilabel == WORD_BOUNDARY)
+      context->FSMarc_list[i].cost = wbcost;
+  }
+}
+
+int FST_LoadParams(srec_context* context, PFile* fp)
+{
+  char line[MAX_LINE_LENGTH];
+  costdata wbcost = MAXcostdata;
+  while (pfgets(line, MAX_LINE_LENGTH, fp))
+  {
+    char* key = strtok(line," \n\r\t");
+    char* val = key ? strtok(NULL," \n\r\t") : NULL;
+    if(val && !strcmp(val,"="))
+      val = key ? strtok(NULL," \n\r\t") : NULL;
+    if(!key || !key[0])
+      continue;
+    else if(val && val[0]) {
+      if(!strcmp(key,"word_penalty")) {
+        wbcost = (costdata)atoi_with_check(val, MAXcostdata);
+	if(wbcost == MAXcostdata) {
+	  return FST_FAILED_ON_INVALID_ARGS;
+	}
+      } else {
+	PLogError(L("error: unknown parameter %s in .params file"), key);
+	return FST_FAILED_ON_INVALID_ARGS;
+      }
+    }
+  }
+  if(wbcost != MAXcostdata)
+    fst_set_wb_costs( context, wbcost);
+  return FST_SUCCESS;
+}
+
+int FST_AssumeParams( srec_context* context)
+{
+  fst_set_wb_costs( context, (costdata)DEFAULT_WB_COST);
+  return FST_SUCCESS;
+}
+
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ *                                                                          *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+modelID hmm_number(const char* hmm_Name, modelID hmm_ilabel_offset)
+{
+  if (!strcmp(hmm_Name, "eps")) return EPSILON_LABEL;
+  if (!strcmp(hmm_Name, ".wb")) return WORD_BOUNDARY;
+  if (!strcmp(hmm_Name, ".ph")) return PHONE_BOUNDARY;
+  ASSERT(hmm_Name[0] == 'h' && hmm_Name[1] == 'm' && hmm_Name[2] == 'm' && hmm_Name[3]);
+  return (modelID)(hmm_ilabel_offset + (modelID)atoi_with_check(hmm_Name + 3, MAXmodelID));
+}
+
+char* hmm_name(modelID ilabel, modelID hmm_ilabel_offset, char* buf)
+{
+  static char mybuf[32];
+  if (!buf) buf = mybuf;
+  if (ilabel == EPSILON_LABEL)
+    sprintf(buf, "eps");
+  else if (ilabel == WORD_BOUNDARY)
+    sprintf(buf, ".wb");
+  else if (ilabel == PHONE_BOUNDARY)
+    sprintf(buf, ".ph");
+  else
+    sprintf(buf, "hmm%03d", ilabel - hmm_ilabel_offset);
+  return buf;
+}
+
+/*------------------------------------------------------------------*
+ *                                                                  *
+ * words                                                            *
+ *                                                                  *
+ *------------------------------------------------------------------*/
+int HashCmpWord(const LCHAR *key1, const LCHAR *key2)
+{
+	return LSTRCMP(key1,key2);
+}
+unsigned int HashGetCode(const void *key)
+{
+	const LCHAR* k = (const LCHAR*)key;
+	unsigned int i, len, h = 0;
+	len = LSTRLEN( k);
+	for ( i = 0; i < len; i++)
+		h = 31*h + (unsigned int)k[i];
+	return h;
+}
+
+int wordmap_create(wordmap** pwmap, int num_chars, int num_words, int num_words_to_add)
+{
+  wordmap* Interface;
+  PHashTableArgs hashArgs;
+  ESR_ReturnCode rc;
+
+  Interface = (wordmap*)CALLOC_CLR(1, sizeof(wordmap), "srec.graph.wordmap.base");
+  Interface->max_words = (wordID)(num_words + num_words_to_add);
+  Interface->num_words = (wordID)0;
+  /* *pwmap->words = (ptr32*) CALLOC_CLR(wmap->max_words, sizeof(ptr32), "graph.wordmap.words"); */
+  Interface->words = (char**) CALLOC_CLR(Interface->max_words, sizeof(char*), "srec.graph.wordmap.words");
+  Interface->max_chars = num_chars + num_words_to_add * AVG_CHARS_PER_WORD;
+  Interface->chars = (char*) CALLOC_CLR(Interface->max_chars, sizeof(char), "srec.graph.wordmap.chars");
+  Interface->next_chars = Interface->chars;
+  Interface->wordIDForWord = NULL;
+  *pwmap = Interface;
+
+  /* use a hashtable to save mapping between wdID and array index */
+  if (num_words_to_add >= 0)
+  {
+    hashArgs.capacity = num_words + num_words_to_add + 10;
+	if(hashArgs.capacity%2==0) hashArgs.capacity += 1;
+    hashArgs.compFunction = HashCmpWord; // PHASH_TABLE_DEFAULT_COMP_FUNCTION;
+    hashArgs.hashFunction = HashGetCode; // PHASH_TABLE_DEFAULT_HASH_FUNCTION;
+    hashArgs.maxLoadFactor = PHASH_TABLE_DEFAULT_MAX_LOAD_FACTOR;
+    CHKLOG(rc, PHashTableCreate(&hashArgs, L("srec.graph.wordmap.wordIDForWord.wordmap_create()"), &Interface->wordIDForWord));
+  }
+  else
+  {
+    Interface->wordIDForWord = NULL;
+  }
+
+  return FST_SUCCESS;
+
+CLEANUP:
+  wordmap_destroy(pwmap);
+  return rc;
+}
+wordID wordmap_add_word(wordmap* wmap, const char* word);
+
+int FST_LoadWordMap(wordmap** pwmap, int num_words_to_add, PFile* fp)
+{
+  wordID my_wID, wm_wID;
+  char *word, *wID_string;
+  int num_words;
+  asr_int32_t num_chars;
+  char buf[MAX_LINE_LENGTH];
+  long fpos;
+  wordmap* wmap;
+  /* figure out the number of words */
+  fpos = pftell(fp);
+  for (num_words = 0, num_chars = 0; pfgets(buf, MAX_LINE_LENGTH, fp); num_words++)
+  {
+    word = strtok(buf, " \n\r\t");
+    num_chars += strlen(word);
+  }
+  num_chars += num_words * 2; /* for null terminators */
+  pfseek(fp, fpos, SEEK_SET);
+
+  /* Alex added this to reuse this functionality elsewhere
+    destroy function for this create function is actually taken care of by the
+    FST_UnloadWordMap function
+  */
+  wordmap_create(&wmap, num_chars, num_words, num_words_to_add);
+
+  /* later replace this with wordblocks, linked list of 8 character blocks! */
+  while (pfgets(buf, MAX_LINE_LENGTH, fp))
+  {
+    word = strtok(buf, " \n\r\t");
+    wID_string = strtok(NULL, " \n\r\t");
+    my_wID = (wordID)atoi_with_check(wID_string, MAXwordID);
+
+    // if(strstr(word,SLOTNAME_INDICATOR))
+    //    word = strstr(word,SLOTNAME_INDICATOR);
+    wm_wID = wordmap_add_word(wmap, word);
+    ASSERT(my_wID == wm_wID);
+  }
+  ASSERT(wmap->num_words == num_words);
+
+  for (my_wID = 1; my_wID < num_words; my_wID++)
+  {
+    if (!IS_SLOT_OLABEL(wmap->words[my_wID]))
+      break;
+  }
+  wmap->num_slots = my_wID;
+  wordmap_setbase(wmap);
+  *pwmap = wmap;
+  if(wmap->num_slots > MAX_NUM_SLOTS) 
+    return FST_FAILED_ON_INVALID_ARGS;
+  else 
+    return FST_SUCCESS;
+}
+
+int wordmap_destroy(wordmap** wmap)
+{
+  if (wmap && *wmap)
+  {
+    wordmap_clean ( *wmap );
+    if (((*wmap)->wordIDForWord)) PHashTableDestroy((*wmap)->wordIDForWord);
+    if (((*wmap)->chars)) FREE((*wmap)->chars);
+    if (((*wmap)->words)) FREE((*wmap)->words);
+    if ((*wmap)) FREE((*wmap));
+    *wmap = 0;
+  }
+  return FST_SUCCESS;
+}
+
+int FST_UnloadWordMap(wordmap** wmap)
+{
+  return wordmap_destroy(wmap);
+}
+
+
+int FST_DumpWordMap(PFile* fp, wordmap* wmap)
+{
+  wordID my_wID;
+  for (my_wID = 0; my_wID < wmap->num_words; my_wID++)
+  {
+    pfprintf(fp, "%s %hu\n", wmap->words[my_wID], my_wID);
+  }
+  return FST_SUCCESS;
+}
+
+wordID wordmap_find_index(wordmap* wmap, const char* word)
+{
+  void *wdID_void;
+  ESR_ReturnCode rc;
+  size_t i;
+
+  if (!word)
+    return MAXwordID;
+
+  if (wmap->num_words == 0)
+    return MAXwordID;
+
+  if (wmap->wordIDForWord)
+  {
+    rc = PHashTableGetValue(wmap->wordIDForWord, word, (void**)&wdID_void);
+
+    if (rc == ESR_SUCCESS)
+      return (wordID)(int)wdID_void;
+  }
+  else
+  {
+    for (i = 0; i < wmap->num_words; i++)
+    {
+      if (!strcmp(wmap->words[i], word))
+      {
+        return (wordID)i;
+      }
+    }
+  }
+  return MAXwordID;
+}
+
+wordID wordmap_find_rule_index(wordmap* wmap, const char* rule)
+{
+  int i;
+  int strlen_rule = strlen(rule);
+  for (i = wmap->num_slots; --i > 0;)
+  { /* > (not >=) because eps is always 0 */
+    char* p = strstr(wmap->words[i], SLOTNAME_INDICATOR);
+    if(p != NULL){
+      if (!strcmp(p, rule)) break;
+      else if(!strncmp(p,rule,strlen_rule) && !strcmp(p+strlen_rule,SLOTNAME_INDICATOR)) break;
+    }
+  }
+  if (i == 0) return MAXwordID;
+  else return(wordID)i;
+}
+
+wordID wordmap_find_index_in_rule(wordmap* wmap, const char* word, wordID rule)
+{
+  int len = strlen(word);
+  int rule0 = rule + '0';
+  void *wdID_void;
+  LCHAR word_dot_rule[256];
+  ESR_ReturnCode rc;
+
+  if (!word)
+    return MAXwordID;
+  LSTRCPY(word_dot_rule, word);
+  word_dot_rule[len++] = IMPORTED_RULES_DELIM;
+  word_dot_rule[len++] = (char)rule0;
+  word_dot_rule[len++] = 0;
+  rc = PHashTableGetValue(wmap->wordIDForWord, word_dot_rule, (void**)&wdID_void);
+  if (rc == ESR_SUCCESS)
+    return (wordID)(int)(wdID_void);
+  return MAXwordID;
+}
+
+int strlen_with_null(const char* word)
+{
+#if 1 /* NT  */
+  int len = strlen(word) + 1;
+  if (len % 2 == 1) len++;
+  return len;
+#else /* C54 */
+#endif
+}
+
+int wordmap_whether_in_rule(wordmap* wmap, wordID word, wordID rule)
+{
+  char* word_chars;
+  int len;
+  if (word > wmap->num_words) return 0;
+  word_chars = wmap->words[word];
+  len = strlen(word_chars);
+  if (word_chars[len-1] == rule + '0' && word_chars[len-2] == IMPORTED_RULES_DELIM)
+    return 1;
+  else
+    return 0;
+}
+
+void wordmap_setbase(wordmap* wmap)
+{
+  wmap->num_base_words = wmap->num_words;
+  wmap->next_base_chars = wmap->next_chars;
+}
+
+void wordmap_ceiling(wordmap* wmap)
+{
+  /* this is irreversible */
+  wmap->max_words = wmap->num_words;
+  wmap->max_chars = (wmap->next_chars - wmap->chars);
+}
+
+
+static ESR_ReturnCode wordmap_clean ( wordmap *word_map )
+    {
+  ESR_ReturnCode  clean_status;
+  PHashTableEntry *entry;
+  PHashTableEntry *oldEntry;
+  wordID          *value;
+
+  clean_status = ESR_SUCCESS;
+
+  if ( word_map->wordIDForWord == NULL )
+    return clean_status;
+
+  clean_status = PHashTableEntryGetFirst ( word_map->wordIDForWord, &entry);
+
+  while ( ( entry != NULL ) && ( clean_status == ESR_SUCCESS ) )
+    {
+      clean_status = PHashTableEntryGetKeyValue ( entry, NULL, (void **)&value );
+
+      if ( clean_status == ESR_SUCCESS )
+	{
+	  oldEntry = entry;
+	  clean_status = PHashTableEntryAdvance ( &entry );
+
+	  if ( clean_status == ESR_SUCCESS )
+	    clean_status = PHashTableEntryRemove ( oldEntry );
+	}
+    }
+    return ( clean_status );
+    }
+
+
+static ESR_ReturnCode wordmap_populate ( wordmap *word_map, wordID num_words )
+{
+  ESR_ReturnCode  populate_status;
+  wordID          wdID;
+  
+  populate_status = ESR_SUCCESS;
+  wdID = 0;
+  
+  if ( word_map->wordIDForWord != NULL )
+    {
+      while ( ( wdID < num_words ) && ( populate_status == ESR_SUCCESS ) )
+	{
+	  populate_status = PHashTablePutValue ( word_map->wordIDForWord, word_map->words[wdID],
+						 (const void *)(int)wdID, NULL );
+	  if ( populate_status == ESR_SUCCESS )
+	    wdID++;
+	  else {
+	    return (populate_status);
+	  }
+	}
+    }
+  return ( populate_status );
+}
+
+void wordmap_reset(wordmap* wmap)
+{
+  char** tmp_words;
+  int i;
+  ESR_ReturnCode    reset_status;
+
+  if (wmap->num_base_words < wmap->num_words)
+  {
+    /*wordID i = (wordID)(wmap->num_base_words);*/
+    char* old_wmap_chars = wmap->chars;                       
+    int offset = wmap->next_base_chars - wmap->chars;
+    char* tmp_chars = NEW_ARRAY(char, offset, L("srec.g2g.graph.wordmap.chars"));
+    if(!tmp_chars) {
+      passert ( 0 && L("failed to reset the memory for wordmap.chars ") );
+    }
+    memcpy(tmp_chars,wmap->chars, offset * sizeof(char));
+    FREE(wmap->chars);
+    
+    wmap->chars = tmp_chars;
+    wmap->next_base_chars = wmap->chars + (wmap->next_base_chars - old_wmap_chars);
+    wmap->max_chars = (wordID) offset;
+    wmap->next_chars = wmap->next_base_chars;
+    
+    tmp_words = (char**) CALLOC_CLR(wmap->num_base_words, sizeof(char*), "srec.graph.wordmap.words");
+    if(!tmp_words) {
+      passert ( 0 && L("failed to reset the memory for wordmap.words ") );
+    }
+    memcpy( tmp_words, wmap->words, wmap->num_base_words * sizeof(char*));
+    FREE( wmap->words);
+    
+    wmap->words = tmp_words;
+    wmap->max_words = wmap->num_base_words;
+    wmap->num_words  = wmap->num_base_words;
+    
+    for(i=0; i<wmap->num_words; i++)
+      wmap->words[i] = wmap->chars + (wmap->words[i] - old_wmap_chars);
+  }
+  
+  reset_status = wordmap_clean ( wmap );
+  
+  if ( reset_status == ESR_SUCCESS )
+    {
+      reset_status = wordmap_populate ( wmap, wmap->num_base_words );
+      
+      if ( reset_status != ESR_SUCCESS )
+	{
+	  wordmap_clean ( wmap );
+	  passert ( 0 && L("wordmap_reset failed") );
+	}
+    }
+  else
+    {
+      passert ( 0 && L("wordmap_reset failed") );
+    }
+}
+
+#define FST_GROW_FACTOR 12/10
+#define FST_GROW_MINCHARS 256
+#define FST_GROW_MINWORDS  32
+wordID wordmap_add_word(wordmap* wmap, const char* word)
+{
+  int len = strlen_with_null(word);
+  wordID wdID =0;
+
+  if (wmap->next_chars + len >= wmap->chars + wmap->max_chars)
+  {
+#if defined(FST_GROW_FACTOR)
+     int i,tmp_max_chars= wmap->max_chars * FST_GROW_FACTOR;
+	 char* old_wmap__chars = wmap->chars;
+      if(tmp_max_chars - wmap->max_chars < FST_GROW_MINCHARS)
+	tmp_max_chars +=FST_GROW_MINCHARS;
+
+      char* tmp_chars = NEW_ARRAY(char, tmp_max_chars, L("srec.g2g.graph.wordmap.chars"));
+      if(!tmp_chars) {
+          PLogError(L("ESR_OUT_OF_MEMORY: Could not extend allocation of wordmap.chars"));
+          return MAXwordID;
+      }
+      memcpy(tmp_chars,wmap->chars,wmap->max_chars * sizeof(char));
+      FREE(wmap->chars);
+      
+      wmap->chars = tmp_chars;
+      wmap->next_chars = wmap->chars + (wmap->next_chars - old_wmap__chars);
+      wmap->next_base_chars = wmap->chars + (wmap->next_base_chars - old_wmap__chars); 
+      wmap->max_chars = (wordID)tmp_max_chars;
+      //Remove old keys --- Add WORD
+      wordmap_clean (wmap );
+      
+      // adjust word pointers
+      for(i=0; i<wmap->num_words; i++)
+	{
+	  wmap->words[i] = wmap->chars + (wmap->words[i] - old_wmap__chars);
+	  // adjust hashtable ---
+	  if (wmap->wordIDForWord)
+	    {
+	      ESR_ReturnCode rc = PHashTablePutValue ( wmap->wordIDForWord, wmap->words[i],
+						       (const void *)i, NULL );
+	      if ( rc != ESR_SUCCESS ) {
+		goto CLEANUP;
+	      }
+	    }
+	}
+#else // so not defined(FST_GROW_FACTOR)
+      PLogError("error: char overflow in wmap %d max %d\n", (int)(wmap->next_chars - wmap->chars), wmap->max_chars);
+      return MAXwordID;
+#endif // defined(FST_GROW_FACTOR)
+  }
+  //Add word
+  if (wmap->num_words == wmap->max_words)
+    {
+#if defined(FST_GROW_FACTOR)
+      char** tmp_words;
+      wordID tmp_max_words;
+      int itmp_max_words =  wmap->max_words * FST_GROW_FACTOR;
+      
+      if(itmp_max_words - wmap->max_words < FST_GROW_MINWORDS)
+	    itmp_max_words += FST_GROW_MINWORDS;
+
+      if( itmp_max_words >= MAXwordID) {
+	    PLogError("error: word ptr overflow in wmap %d max %d\n", (int)wmap->num_words, wmap->max_words);
+	    return MAXwordID;
+      }
+      tmp_max_words = (wordID)itmp_max_words;
+	  tmp_words = (char**) CALLOC_CLR(tmp_max_words, sizeof(char*), "srec.graph.wordmap.words");
+      if(!tmp_words) {
+	PLogError(L("ESR_OUT_OF_MEMORY: Could not extend allocation of wordmap.words"));
+        return MAXwordID;
+      }
+      memcpy( tmp_words, wmap->words, wmap->num_words * sizeof(char*));
+      FREE( wmap->words);
+      wmap->words = tmp_words;
+      wmap->max_words = tmp_max_words;
+#else // so not defined(FST_GROW_FACTOR)
+      PLogError("error: word ptr overflow in wmap %d max %d\n", (int)wmap->num_words, wmap->max_words);
+      return MAXwordID;
+#endif // defined(FST_GROW_FACTOR)
+    }
+  if(1)
+    {
+    strcpy(wmap->next_chars, word);
+    wmap->words[ wmap->num_words++] = wmap->next_chars;
+    wmap->next_chars += len;
+    wdID = (wordID)(wmap->num_words - (wordID)1);
+    if (wmap->wordIDForWord)
+    {
+       ESR_ReturnCode rc = PHashTablePutValue ( wmap->wordIDForWord, wmap->words[wdID],
+                      (const void *)(int)wdID, NULL );
+    if ( rc != ESR_SUCCESS )
+      goto CLEANUP;
+    }
+    return wdID;
+  }
+CLEANUP:
+  PLogError("error: could not add word and wordID in wmap hash (%s -> %d)\n", word, wdID);
+  return MAXwordID;
+}
+
+wordID wordmap_add_word_in_rule(wordmap* wmap, const char* word, wordID rule)
+{
+  int len = strlen_with_null(word) + 2;
+  wordID wdID = 0;
+  wordID i;
+//wordmap_add_word_in_rule
+  if (wmap->next_chars + len >= wmap->chars + wmap->max_chars)
+  {
+#if defined(FST_GROW_FACTOR)
+      int tmp_max_chars = wmap->max_chars * FST_GROW_FACTOR;
+      char* tmp_chars;
+	  char* old_next_chars = wmap->next_chars;
+	  char* old_chars = wmap->chars;
+
+      if(tmp_max_chars-wmap->max_chars < FST_GROW_MINCHARS )
+	    tmp_max_chars += FST_GROW_MINCHARS;
+      if( wmap->chars + tmp_max_chars <= wmap->next_chars + len)
+	    tmp_max_chars += len;
+
+      tmp_chars = NEW_ARRAY(char, tmp_max_chars, L("srec.g2g.graph.wordmap.chars"));
+    if(!tmp_chars) {
+          PLogError(L("ESR_OUT_OF_MEMORY: Could not extend allocation of wordmap_add_in_rule.chars"));
+          return MAXwordID;
+      }
+      memcpy(tmp_chars, wmap->chars, wmap->max_chars * sizeof(char));
+      FREE(wmap->chars);
+
+      wmap->chars = tmp_chars;
+      wmap->next_chars = wmap->chars + (old_next_chars - old_chars) ;
+      wmap->next_base_chars = wmap->chars + (wmap->next_base_chars - old_chars); 
+      wmap->max_chars = (wordID)tmp_max_chars;
+      
+      //Remove old keys
+      wordmap_clean ( wmap );
+      
+      // adjust word pointers wordmap_add_word_in_rule
+      for(i=0; i<wmap->num_words; i++)
+	{
+ 	  wmap->words[i] = wmap->chars +(wmap->words[i] - old_chars) ;
+	  // adjust hashtable ----- add in rulewordmap_add_word_in_rule ----
+	  if (wmap->wordIDForWord) {
+	    ESR_ReturnCode rc = PHashTablePutValue ( wmap->wordIDForWord, wmap->words[i],
+						     (void*)(int)(i), NULL );
+	    if ( rc != ESR_SUCCESS )
+	      goto CLEANUP;
+	  }
+	}
+#else
+      PLogError("error: char overflow in wmap %d max %d\n", (int)(wmap->next_chars - wmap->chars), wmap->max_chars);
+      return MAXwordID;
+#endif
+  }//wordmap_add_word_in_rule
+  if (wmap->num_words == wmap->max_words)
+    {
+#if defined(FST_GROW_FACTOR)
+      char** tmp_words;
+      wordID tmp_max_words;
+      int itmp_max_words =  wmap->max_words * FST_GROW_FACTOR;
+      if(itmp_max_words - wmap->max_words < FST_GROW_MINWORDS)
+	itmp_max_words += FST_GROW_MINWORDS;
+      
+      if( itmp_max_words >= MAXwordID) {
+	PLogError("error: word ptr overflow in wmap %d max %d\n", (int)wmap->num_words, wmap->max_words);
+	return MAXwordID;
+      }
+      
+      tmp_max_words = (wordID)itmp_max_words;
+      tmp_words = (char**) CALLOC_CLR(tmp_max_words, sizeof(char*), "srec.graph.wordmap.words");
+      if(!tmp_words) {
+        PLogError(L("ESR_OUT_OF_MEMORY: Could not extend allocation of wordmap_add_rule.words"));
+        return MAXwordID;
+      }
+      memcpy( tmp_words, wmap->words, wmap->num_words * sizeof(char*));
+      FREE( wmap->words);
+      wmap->words = tmp_words;
+      wmap->max_words = tmp_max_words;
+#else
+      PLogError("error: word ptr overflow in wmap %d max %d\n", (int)wmap->num_words, wmap->max_words);
+      return MAXwordID;
+#endif
+    }
+  if(1)
+  {
+    char *p;
+    const char *q;
+    /* word.1 */
+    for (p = wmap->next_chars, q = word; (*p = *q) != '\0'; p++, q++) ; /* basic strcpy() */
+    *p++ = IMPORTED_RULES_DELIM;
+    *p++ = (char)(rule + ((wordID)'0'));
+    *p   = '\0';
+    wmap->words[ wmap->num_words++] = wmap->next_chars;
+    wmap->next_chars += len;
+    wdID = (wordID)(wmap->num_words - (wordID)1);
+    if (wmap->wordIDForWord)
+      {
+        ESR_ReturnCode rc = PHashTablePutValue ( wmap->wordIDForWord, wmap->words[wdID],
+						 (void*)(int)(wdID), NULL );
+	if ( rc != ESR_SUCCESS )
+	  goto CLEANUP;
+      }
+    return wdID;
+  }
+CLEANUP:
+  PLogError("error: could not add word and wordID in wmap hash (%s -> %d)\n", word, wdID);
+  return MAXwordID;
+}
+
+/*----------------------------------------------------------------------*
+ *                                                                      *
+ * API                                                                  *
+ *                                                                      *
+ *----------------------------------------------------------------------*/
+
+int FST_AttachArbdata(srec_context* fst, srec_arbdata* allophone_tree)
+{
+  int rc = 0;
+  unsigned int allotree__modelid;
+
+  fst->allotree = allophone_tree;
+  if( !allophone_tree)
+      return 1;
+  fst->hmm_info_for_ilabel = allophone_tree->hmm_infos - fst->hmm_ilabel_offset;
+  allotree__modelid = version_arbdata_models(allophone_tree);
+  if (allotree__modelid != 0 && fst->modelid != 0)
+  {
+    if (allotree__modelid != fst->modelid)
+    {
+      PLogError("Error: modelids disagree, sgcbaseline(%u) arbdata(%u)", fst->modelid, allotree__modelid);
+      rc = FST_FAILED_ON_INVALID_ARGS;
+    }
+  }
+
+  return rc;
+}
+
+int FST_LoadGraph(srec_context* pfst, wordmap* imap, wordmap* omap,
+                  int num_words_to_add, PFile* fp)
+{
+  int i, rc = 0;
+  char line[MAX_LINE_LENGTH], *args[32], nargs;
+  arcID max_num_FSMarcs;
+  arcID max_num_FSMnodes;
+  nodeID from_node, last_from_node, into_node, num_nodes, max_node_number = 0;
+  FSMarc_ptr atok =  (FSMarc_ptr)0;
+  FSMarc *atoken = NULL;
+  FSMnode *fr_node, *to_node;
+  costdata cost = FREEcostdata;
+  arcID num_arcs;
+
+  srec_context* fst = pfst;
+  char *ilabel_str = 0, *olabel_str = 0;
+  long fpos;
+  arcID new_arc_id;
+  asr_int32_t temp;
+
+
+  /* determine number of arcs and nodes to allocate, add 50% for dynamic */
+  fpos = pftell(fp);
+  max_num_FSMnodes = 0;
+  pfst->modelid = 0;
+  for (max_num_FSMarcs = 0; pfgets(line, sizeof(line) / sizeof(char), fp); max_num_FSMarcs++)
+  {
+    if (strstr(line, "modelid:") == line)
+    {
+      char *p;
+      pfst->modelid = strtoul(line + strlen("modelid:"), &p, 10);
+    }
+    from_node = (nodeID)atoi_with_check(line, MAXnodeID);
+    if (from_node > max_num_FSMnodes)
+      max_num_FSMnodes = from_node;
+  }
+  pfseek(fp, fpos, SEEK_SET);
+  temp = max_num_FSMnodes + 1 /*why+1?*/ + num_words_to_add * AVG_NODES_PER_WORD;
+  if (temp >= MAXnodeID)
+  {
+    max_num_FSMnodes = MAXnodeID - 1;
+    PLogMessage("Warning: using max nodes instead\n");
+  }
+  else
+  {
+    max_num_FSMnodes = (nodeID)temp;
+  }
+  temp = max_num_FSMarcs + num_words_to_add * AVG_ARCS_PER_WORD;
+  if (temp >= MAXarcID)
+  {
+    max_num_FSMarcs = MAXarcID - 1;
+    PLogMessage("Warning: using max arcs instead\n");
+  }
+  else
+  {
+    max_num_FSMarcs = (arcID)temp;
+  }
+  fst->olabels = omap;
+  if (imap)
+  {
+    /* generally no imap is specified */
+    fst->ilabels = imap;
+    fst->hmm_ilabel_offset = wordmap_find_index(fst->ilabels, "hmm0");
+    ASSERT(fst->hmm_ilabel_offset >= 0);
+  }
+  else
+  {
+    fst->ilabels = (wordmap*)CALLOC_CLR(1, sizeof(wordmap), "srec.graph.imap");
+    fst->ilabels->num_words = fst->ilabels->max_words = 0;
+    fst->ilabels->words = 0;
+    /* this is bad hard code, we can get this from the swiarb file, it is
+       equal to the number of phonemes (53 for enu, 39 for jpn) plus the special
+       models (eps,.wb,.ph,h#,#h,iwt,not) minus 1 ('cuz base number is 0) */
+    fst->hmm_ilabel_offset = 128; /* should match MAX_PHONEMES */
+  }
+  fst->FSMarc_list = (FSMarc*)CALLOC_CLR(max_num_FSMarcs, sizeof(FSMarc), "srec.graph.arcs");
+  fst->FSMnode_list = (FSMnode*)CALLOC_CLR(max_num_FSMnodes, sizeof(FSMnode), "srec.graph.nodes");
+  fst->FSMnode_info_list = (FSMnode_info*)CALLOC_CLR(max_num_FSMnodes, sizeof(char), "srec.graph.nodeinfos");
+
+  /* setup the arc freelist */
+  fst->FSMarc_freelist = 0;
+  fst->num_arcs = 0;
+  for (i = 0; i < max_num_FSMarcs - 1; i++)
+  {
+    fst->FSMarc_list[i].linkl_next_arc = ARC_ItoX(i + 1);
+    fst->FSMarc_list[i].linkl_prev_arc = FSMARC_FREE;
+  }
+  fst->FSMarc_list[i].linkl_next_arc = FSMARC_NULL;
+  fst->FSMarc_list[i].linkl_prev_arc = FSMARC_FREE;
+
+  /* initialize the nodes, 'cuz reading is random order */
+  fst->num_nodes = 0;
+  for (i = 0; i < max_num_FSMnodes; i++)
+  {
+    fr_node = &fst->FSMnode_list[i];
+    fr_node->un_ptr.first_next_arc = fr_node->first_prev_arc = FSMARC_NULL;
+  }
+
+  /* 1. first load up all the information */
+  IF_DEBUG_WDADD(printf("load graph ... 1\n"));
+  num_arcs = 0;
+  last_from_node = MAXnodeID;
+  while (pfgets(line, sizeof(line) / sizeof(char), fp))
+  {
+    if (strstr(line, "modelid:") == line) continue;
+    IF_DEBUG_WDADD(printf("read arc %s", line));
+    nargs = split_line(line, args);
+    if (nargs >= 4)
+    {
+      from_node = (nodeID)atoi_with_check(args[0], MAXnodeID);
+      into_node = (nodeID)atoi_with_check(args[1], MAXnodeID);
+      ilabel_str = args[2];
+      olabel_str = args[3];
+      cost = FREEcostdata;
+      if (nargs == 5)
+        PLogError(L("Warning: too many arguments on line %s"), line);
+    }
+    else if (nargs == 1)
+    {
+      from_node = (nodeID)atoi_with_check(args[0], MAXnodeID);
+      into_node = MAXnodeID;
+      ilabel_str = 0;
+      olabel_str = 0;
+      cost = FREEcostdata;
+    }
+    else
+    {
+      from_node = into_node = 0;
+      PLogError("can't parse line %s\n", line);
+      ASSERT(0);
+    }
+
+    if (into_node == MAXnodeID)
+    {
+      fst->end_node = from_node;
+    }
+    else
+    {
+      new_arc_id = fst_get_free_arc(fst);
+      if (new_arc_id == MAXarcID)
+        return FST_FAILED_ON_MEMORY;
+      atok = ARC_ItoX(new_arc_id);
+      atoken = ARC_XtoP(atok);
+      num_arcs++;
+      fr_node = &fst->FSMnode_list[from_node];
+      to_node = &fst->FSMnode_list[into_node];
+      if (fst->ilabels->num_words == 0)
+      {
+        atoken->ilabel = hmm_number(ilabel_str, fst->hmm_ilabel_offset);
+	/* Xufang: if olabel_str is a slotname, change the input label to a no-silence and no-eps HMM. It is true that the weight of slot arcs is 999 and hmm will not take effect in the runtime, but it was found that when the slot is a loop, eps and silence will cause the recursive function fst_node_has_speech_to_come into a no-step-out status.*/
+	if(strstr(olabel_str, SLOTNAME_INDICATOR)!=NULL)
+	  atoken->ilabel = fst->hmm_ilabel_offset + SLOTLOOP_OFFSET;
+      }
+      else
+      {
+        atoken->ilabel = wordmap_find_index(fst->ilabels, ilabel_str);
+      }
+      atoken->olabel = wordmap_find_index(fst->olabels, olabel_str);
+      /* if(g_fst_options.wtw_cost_override>0) {
+      if(atoken->ilabel == WORD_BOUNDARY)
+      atoken->cost = g_fst_options.wtw_cost_override;
+      else
+      atoken->cost = g_fst_options.arc_cost_override;
+      } else  */
+      atoken->cost = cost;
+#if DEBUG_WDADD
+      atoken->ilabel_str = (atoken->ilabel < fst->ilabels->num_words ? fst->ilabels->words[atoken->ilabel] : 0);
+      atoken->olabel_str = (atoken->olabel < fst->olabels->num_words ? fst->olabels->words[atoken->olabel] : 0);
+#endif
+      append_arc_leaving_node(fst, fr_node, atok);
+      if (into_node > max_node_number)
+        max_node_number = into_node;
+      append_arc_arriving_node(fst, to_node, atok);
+      atoken->fr_node = NODE_ItoX(from_node);
+      atoken->to_node = NODE_ItoX(into_node);
+    }
+    last_from_node = from_node;
+  }
+  ASSERT(fst->num_arcs == num_arcs);
+
+  /* setup the node freelist */
+  IF_DEBUG_WDADD(printf("load graph ... 6\n"));
+  num_nodes = (nodeID)(max_node_number + 1);
+  if( max_num_FSMnodes > num_nodes) {
+  fst->FSMnode_freelist = num_nodes;
+  for (i = num_nodes; i < (max_num_FSMnodes - 1); i++)
+  {
+    fst->FSMnode_list[i].un_ptr.next_node = NODE_ItoX(i + 1);
+    fst->FSMnode_list[i].first_prev_arc = FSMARC_FREE;
+  }
+	if (i == (max_num_FSMnodes - 1)) {
+     fst->FSMnode_list[i].un_ptr.next_node = FSMNODE_NULL;
+     fst->FSMnode_list[i].first_prev_arc = FSMARC_FREE;
+    }
+  } else
+	fst->FSMnode_freelist  = FSMNODE_NULL;
+
+  /* some book-keeping stuff */
+  IF_DEBUG_WDADD(printf("load graph ... 7\n"));
+  fst->num_base_arcs = fst->num_arcs = num_arcs;
+  fst->FSMarc_list_len = max_num_FSMarcs;
+  fst->FSMnode_list_len = max_num_FSMnodes;
+  fst->num_base_nodes = fst->num_nodes = num_nodes;
+  fst->start_node = 0;
+  /* fst->end_node = 0; this is set up above */
+
+  /* beg and end word labels */
+  fst->beg_silence_word = wordmap_find_index(fst->olabels, "-pau-");
+  fst->end_silence_word = wordmap_find_index(fst->olabels, "-pau2-");
+  fst->hack_silence_word = wordmap_find_index(fst->olabels, "silence");
+
+  /* set the search limitations, real ones will be registered later */
+  fst->max_searchable_nodes = 0;
+  fst->max_searchable_arcs = 0;
+
+  rc = fst_alloc_transit_points(fst);
+  return (rc ? FST_FAILED_ON_INVALID_ARGS : FST_SUCCESS);
+}
+
+int FST_UnloadGraph(srec_context* pfst)
+{
+  if (pfst->ilabels)
+    FREE(pfst->ilabels);
+  FREE(pfst->FSMarc_list);
+  FREE(pfst->FSMnode_list);
+  FREE(pfst->FSMnode_info_list);
+  pfst->FSMarc_list = 0;
+  pfst->FSMnode_list = 0;
+  pfst->FSMnode_info_list = 0;
+  return FST_SUCCESS;
+}
+
+int FST_DumpGraph(srec_context* fst, PFile* fp)
+{
+  int rc = 0;
+  nodeID i;
+  FSMarc_ptr atok;
+  FSMarc* atoken;
+  nodeID from_node, into_node;
+  FSMnode* ntoken;
+  char *ilabel, *olabel;
+
+  for (i = 0; i < fst->num_nodes; i++)
+  {
+    from_node = i;
+    ntoken = &fst->FSMnode_list[i];
+    if (ntoken->first_prev_arc == FSMARC_FREE)
+      continue;
+    if (ntoken->un_ptr.first_next_arc != FSMARC_NULL)
+    {
+      for (atok = ntoken->un_ptr.first_next_arc; atok != FSMARC_NULL; atok = atoken->linkl_next_arc)
+      {
+        atoken = ARC_XtoP(atok);
+        into_node = NODE_XtoI(atoken->to_node);
+        ilabel = fst->ilabels->num_words == 0 ?
+                 hmm_name(atoken->ilabel, fst->hmm_ilabel_offset, NULL) :
+                 fst->ilabels->words[atoken->ilabel] ;
+        olabel = fst->olabels->words[atoken->olabel];
+
+        if (atoken->cost != FREEcostdata)
+        {
+          /* regular arc */
+          pfprintf(fp, "%hu\t%hu\t%s\t%s\t%hu\n",
+                  from_node, into_node, ilabel, olabel, atoken->cost);
+        }
+        else
+        {
+          /* regular zero cost arc */
+          pfprintf(fp, "%hu\t%hu\t%s\t%s\n",
+                  from_node, into_node, ilabel, olabel);
+        }
+      }
+    }
+    else
+    {
+      pfprintf(fp, "%hu\n", from_node);
+    }
+  }
+  return rc;
+}
+
+int FST_AddWordToGrammar(srec_context* fst, const char* _slot,
+                         const char* word, const char* pron,
+                         const int cost)
+{
+  int num_pron_ampersands = 0, num_prons_added = 0, num_words_added = 0;
+  int i, pron_len, model_sequence_len;
+  modelID model_sequence[MAX_PRON_LEN];
+  char phoneme_sequence[MAX_PRON_LEN];
+  wordID olabel = MAXwordID;
+  int irc, rc = FST_SUCCESS;
+  nodeID start_node = MAXnodeID, end_node = MAXnodeID;
+  char veslot[MAX_WORD_LEN];
+#if USE_HMM_BASED_ENROLLMENT
+  const char* Tpron;
+#endif
+
+  /* The addword from voice enroll still use @, and to test voice enroll, @ sign was removed and __ was added at the begining and ending of a word. Xufang */
+  if(_slot[0] == '@') {
+    strcpy(veslot,SLOTNAME_INDICATOR);
+    strcat(veslot,_slot+1);
+    strcat(veslot,SLOTNAME_INDICATOR);
+  } else
+    strcpy(veslot, _slot);
+
+#if USE_COMP_STATS
+  if (!comp_stats)
+    comp_stats = init_comp_stats1();
+  start_cs_clock1(&comp_stats->word_addition);
+#endif
+
+  /* we expect developers to call AddWord with the same slot many times,
+  so we cache the slot start and end nodes and re-use on subseq calls */
+  if( fst->addWordCaching_lastslot_num == MAXwordID )
+    fst->addWordCaching_lastslot_name = NULL;
+  else {
+    fst->addWordCaching_lastslot_name = fst->olabels->words[fst->addWordCaching_lastslot_num];
+    fst->addWordCaching_lastslot_name = strstr(fst->addWordCaching_lastslot_name, SLOTNAME_INDICATOR);
+    ASSERT( fst->addWordCaching_lastslot_name);
+  }
+  if( fst->addWordCaching_lastslot_name==NULL || strcmp( fst->addWordCaching_lastslot_name, veslot)) {
+
+    fst->addWordCaching_lastslot_num = wordmap_find_rule_index(fst->olabels, veslot);
+    /* olabel not found is a user error */
+    if (fst->addWordCaching_lastslot_num == MAXwordID)
+    {
+      size_t i;
+
+      pfprintf(PSTDOUT, L("error: slot '%s' not found among ["), veslot);
+      for (i = 1; i < (size_t) fst->olabels->num_slots; ++i)
+        pfprintf(PSTDOUT, "%s, ", fst->olabels->words[i]);
+      pfprintf(PSTDOUT, L("] possible\n"));
+      rc = FST_FAILED_ON_INVALID_ARGS;
+      goto RETRC;
+    }
+
+    fst->addWordCaching_lastslot_name = fst->olabels->words[fst->addWordCaching_lastslot_num];
+    fst->addWordCaching_lastslot_name = strstr(fst->addWordCaching_lastslot_name, SLOTNAME_INDICATOR);
+    ASSERT(fst->addWordCaching_lastslot_name);
+
+    /* now find where in the graph this slot is referenced, note that
+       there might be more than one place, but here we ignore multiples */
+    for (i = fst->num_fsm_exit_points; --i >= 0;)
+      {
+	arcID arcid = fst->fsm_exit_points[i].arc_index;
+	if (fst->FSMarc_list[arcid].olabel == fst->addWordCaching_lastslot_num)
+	  {
+	    FSMarc* arc;
+	    FSMnode* node;
+	    start_node = fst->fsm_exit_points[i].from_node_index;
+	    end_node = fst->fsm_exit_points[i].wbto_node_index;
+	    fst->addWordCaching_lastslot_needs_post_silence = ESR_TRUE;
+	    fst->addWordCaching_lastslot_ifsm_exit_point = i;
+	    node = &fst->FSMnode_list[ end_node];
+	    arc = &fst->FSMarc_list[node->un_ptr.first_next_arc];
+	    if (arc->olabel == fst->end_silence_word && arc->linkl_next_arc == MAXarcID)
+	      fst->addWordCaching_lastslot_needs_post_silence = ESR_FALSE;
+	    break;
+	  }
+      }
+
+    /* not found in the graph is an internal error, coding error */
+    if (i < 0 || start_node>=fst->num_nodes || end_node>=fst->num_nodes)
+      {
+	PLogError("error: (internal) finding olabel %d %d %d\n", fst->addWordCaching_lastslot_num,
+		  start_node, end_node);
+	goto RETRC;
+      }
+  } /* cached or not */
+
+  i = fst->addWordCaching_lastslot_ifsm_exit_point;
+  start_node = fst->fsm_exit_points[i].from_node_index;
+  end_node = fst->fsm_exit_points[i].wbto_node_index;
+
+  /* now start_node and end_node are known */
+  if (!word || !*word || !pron || !*pron)
+    {
+      rc = FST_FAILED_ON_INVALID_ARGS;
+      PLogError("error: null word/pron on input to FST_AddWordToGrammar()\n");
+      goto RETRC;
+    }
+
+  /* from here */
+  IF_DEBUG_WDADD(printf("Adding %s %s\n", word, (const char*)pron));
+
+  /* loop over all prons, we break when we hit the double-null (hence the +1) */
+  for( ; (*pron)!='\0'; pron+=(pron_len+1)) {
+    pron_len = strlen((char*)pron);
+    if (pron_len >= MAX_PRON_LEN)
+      {
+	PLogError("error: wordadd failed on word %s due to pron [%s] too long\n", word, (char*)pron);
+	rc = FST_FAILED_ON_INVALID_ARGS;
+	goto RETRC;
+      }
+
+    /* check for searchability after adding, estimating at most pron_len
+       arcs and nodes will be added */
+    if (fst->num_arcs + pron_len > fst->max_searchable_arcs)
+      {
+	PLogError("error: wordadd failed on word %s due to %d arc search limit\n",
+		  word, fst->max_searchable_arcs);
+	rc = FST_FAILED_ON_MEMORY;
+	goto RETRC;
+      }
+
+    if (fst->num_nodes + pron_len > fst->max_searchable_nodes)
+      {
+	PLogError("error: wordadd failed on word %s due to %d node search limit\n",
+		  word, fst->max_searchable_nodes);
+	rc = FST_FAILED_ON_MEMORY;
+	goto RETRC;
+      }
+
+    /* add the word if necessary, !FST_SUCCESS is allowed if we're just adding
+       an alternate pronunciation */
+    olabel = wordmap_find_index_in_rule(fst->olabels, word, fst->addWordCaching_lastslot_num);
+    if (olabel == MAXwordID)
+      {
+	olabel = wordmap_add_word_in_rule(fst->olabels, word, fst->addWordCaching_lastslot_num);
+	if (olabel != MAXwordID)
+	  num_words_added++;
+      }
+    if (olabel == MAXwordID)
+      {
+	PLogError("error: wordmap_add_word failed\n");
+	rc = FST_FAILED_ON_MEMORY;
+	goto RETRC;
+      }
+
+#if USE_HMM_BASED_ENROLLMENT
+    // pron should be converted to model_sequence, model_sequence_len
+#define VETRANS_PREFIX "wd_hmm"
+#define VETRANS_PREFIX_LEN 6
+    if( LSTRSTR(pron, VETRANS_PREFIX)!=NULL) {
+      // printf("Debug-pron: %d, %s\n",pron_len, pron);
+      model_sequence_len=0;
+      for(Tpron=pron; (Tpron=strstr(Tpron, VETRANS_PREFIX))!=NULL; ){
+	// Tpron = strstr(Tpron, "wd_hmm");
+	Tpron += VETRANS_PREFIX_LEN; // skip over "wd_hmm"
+	// Copy hmm number (56,132,...)
+	model_sequence[ model_sequence_len] = atoi_with_check(Tpron, MAXmodelID);
+	model_sequence_len++;
+      }
+
+
+      /* we need to append silence at the end since we might be dealing with a slot
+	 that has ensuing speech, formerly we only dealt with ROOT which defacto
+	 was followed by the pau2 silence, so ROOT did not need its own */
+      if (fst->addWordCaching_lastslot_needs_post_silence)
+	model_sequence[model_sequence_len++] = 3; // <<< hmm3_sil !!! ugly hard-code here
+
+      /* append the word boundary */
+      model_sequence[model_sequence_len++] = WORD_BOUNDARY;
+      /* translate to input label ids */
+      for (i = 0; i < model_sequence_len; i++)
+	{
+	  if (model_sequence[i] >= EPSILON_OFFSET)
+	    model_sequence[i] = (modelID)(model_sequence[i] + fst->hmm_ilabel_offset);
+	}
+    }
+    else
+#endif
+      {
+	pron_len = strlen((char*)pron);
+	if (pron_len >= MAX_PRON_LEN)
+	  {
+	    PLogError("error: wordadd failed on word %s due to pron [%s] too long\n", word, (char*)pron);
+	    rc = FST_FAILED_ON_INVALID_ARGS;
+	    goto RETRC;
+	  }
+
+	for (i = 0; i < pron_len; i++)
+	  {
+	    if (pron[i] == OPTSILENCE_CODE)
+	      {
+		phoneme_sequence[i] = SILENCE_CODE;
+		num_pron_ampersands++;
+	      }
+	    else
+	      phoneme_sequence[i] = pron[i];
+	  }
+	/* we need to append silence at the end since we might be dealing with a slot
+	   that has ensuing speech, formerly we only dealt with ROOT which defacto
+	   was followed by the pau2 silence, so ROOT did not need its own */
+	if (fst->addWordCaching_lastslot_needs_post_silence)
+	  phoneme_sequence[i++] = SILENCE_CODE;
+
+	model_sequence_len = i;
+	irc = get_modelids_for_pron(fst->allotree, phoneme_sequence, model_sequence_len, model_sequence);
+	/* check for bad sequence of phonemes */
+	if (irc)
+	  {
+	    PLogError("error: get_modelids_for_pron(%s) returned %d\n", pron, irc);
+	    rc = FST_FAILED_ON_INVALID_ARGS;
+	    goto RETRC;
+	  }
+	IF_DEBUG_WDADD(printf("model_sequence ...\n"));
+
+	/* append the word boundary */
+	model_sequence[model_sequence_len++] = WORD_BOUNDARY;
+	/* translate to input label ids */
+	for (i = 0; i < model_sequence_len; i++)
+	  {
+	    if (model_sequence[i] >= EPSILON_OFFSET)
+	      model_sequence[i] = (modelID)(model_sequence[i] + fst->hmm_ilabel_offset);
+	  }
+      } /*  end of ph_t ph_r .. type decoding of the model  sequence */
+
+    /* now do the actual addition */
+    rc = fst_add_arcs(fst, start_node, end_node, olabel, (costdata)cost, model_sequence, model_sequence_len);
+    if (rc == FST_SUCCESS)
+      {
+	num_prons_added++;
+      }
+    else if (rc == FST_FAILED_ON_HOMONYM)
+      {
+	/* maybe the another pron will work? */
+      }
+    else
+      {
+	PLogMessage("error: fst_add_arcs() failed adding word %s pron %s ('&' as 'iwt')\n", word, (char*)pron);
+	goto RETRC;
+      }
+
+    /* second add the pron with no silences,
+       this only applies to true prons, not wd_hmm333 wd_hmm222 type prons */
+
+    if (num_pron_ampersands > 0)
+      {
+	for (i = 0, model_sequence_len = 0; i < pron_len; i++)
+	  {
+	    if (pron[i] != OPTSILENCE_CODE)
+	      phoneme_sequence[model_sequence_len++] = pron[i];
+	  }
+
+	irc = get_modelids_for_pron(fst->allotree, phoneme_sequence, model_sequence_len, model_sequence);
+	/* check for bad sequence of phonemes */
+	if (irc)
+	  {
+	    PLogError("error: get_modelids_for_pron(%s) returned %d\n", pron, rc);
+	    rc = FST_FAILED_ON_INVALID_ARGS;
+	    goto RETRC;
+	  }
+	else
+	  {
+	    IF_DEBUG_WDADD(printf("model_sequence ...\n"));
+
+	    /* append the word boundary */
+	    model_sequence[model_sequence_len++] = WORD_BOUNDARY;
+	    /* translate to input label ids */
+	    for (i = 0; i < model_sequence_len; i++)
+	      {
+		if (model_sequence[i] >= EPSILON_OFFSET)
+		  model_sequence[i] = (modelID)(model_sequence[i] + fst->hmm_ilabel_offset);
+	      }
+	    /* now do the actual addition */
+	    rc = fst_add_arcs(fst, start_node, end_node,
+			      olabel, (costdata)cost, model_sequence, model_sequence_len);
+
+	    if (rc == FST_SUCCESS)
+	      {
+		num_prons_added++;
+	      }
+	    else if (rc == FST_FAILED_ON_HOMONYM)
+	      {
+		/* maybe another pron worked? */
+	      }
+	    else
+	      {
+		PLogMessage("Warning: fst_add_arcs() failed while adding "
+			    "word %s pron %s (skip '&')\n", word, (char*)pron);
+		goto RETRC;
+	      }
+	  }
+      }
+  }
+
+
+ RETRC:
+  /* set this to make sure that FST_Prepare gets called after add word */
+  fst->whether_prepared = 0;
+#if USE_COMP_STATS
+  end_cs_clock1(&comp_stats->word_addition, 1);
+#endif
+
+  if (rc < 0 && rc != FST_FAILED_ON_HOMONYM)
+    return rc;
+
+  if (num_prons_added == 0 && num_words_added > 0)
+    {
+      return FST_FAILED_ON_HOMONYM;
+    }
+  else if (num_prons_added == 0 && num_words_added == 0)
+    {
+      return FST_FAILED_ON_HOMOGRAPH;
+    }
+  else if (num_prons_added > 0 && num_words_added == 0)
+    {
+      return FST_SUCCESS_ON_OLD_WORD;
+    }
+  else
+    {
+      /* if(num_prons_added>0 && num_words_added>0) */
+      return FST_SUCCESS;
+    }
+}
+
+/* remove arcs leaving a node, arcs added via word add, are just discarded
+to be cleaned up for re-use by other functions */
+void remove_added_arcs_leaving(srec_context* fst, nodeID ni)
+{
+  FSMnode* node = &fst->FSMnode_list[ ni];
+  FSMarc *arc = NULL, *arc2;
+  arcID *pai, ai, ai2;
+  for (pai = &node->un_ptr.first_next_arc, ai = (*pai); ai != MAXarcID; pai = &arc->linkl_next_arc, ai = (*pai))
+  {
+    if (ai < fst->num_base_arcs)
+    {
+      arc = &fst->FSMarc_list[ai];
+    }
+    else
+    {
+      arc2 = &fst->FSMarc_list[ai];
+      for (ai2 = arc2->linkl_next_arc; ai2 >= fst->num_base_arcs && ai2 != MAXarcID;
+           ai2 = arc2->linkl_next_arc)
+      {
+        arc2 = &fst->FSMarc_list[ai2];
+      }
+      *pai = ai2;
+    }
+  }
+}
+
+/* remove arcs arriving at a node, arcs added via word add, are just discarded
+   to be cleaned up for re-use by other functions */
+void remove_added_arcs_arriving(srec_context* fst, nodeID ni)
+{
+  FSMnode* node = &fst->FSMnode_list[ni];
+  FSMarc *arc = NULL, *arc2;
+  arcID *pai, ai, ai2;
+  for (pai = &node->first_prev_arc, ai = (*pai); ai != MAXarcID;
+       pai = &arc->linkl_prev_arc, ai = (*pai))
+  {
+    if (ai < fst->num_base_arcs)
+    {
+      arc = &fst->FSMarc_list[ai];
+    }
+    else
+    {
+      arc2 = &fst->FSMarc_list[ai];
+      for (ai2 = arc2->linkl_prev_arc; ai2 >= fst->num_base_arcs && ai2 != MAXarcID;
+           ai2 = arc2->linkl_prev_arc)
+      {
+        arc2 = &fst->FSMarc_list[ai2];
+      }
+      *pai = ai2;
+    }
+  }
+}
+
+/* reset greammar, but resetting all the arcs, nodes and words added
+   via the addword functions */
+
+int FST_ResetGrammar(srec_context* fst)
+{
+  int i, rc = 0;
+  nodeID fst_slot_start_node, fst_slot_end_node;
+  wordID fst_slot_slotnum;
+  arcID ai;
+  nodeID ni2, ni3, ni4, ni3a;
+  FSMnode_t *node, *node2, *node3;
+  FSMarc_t *arc, *arc2, *arc3;
+
+  /*fst_slot_slotnum = wordmap_find_rule_index(fst->olabels, slot);*/
+  for (fst_slot_slotnum = 1; fst_slot_slotnum < fst->olabels->num_slots;
+       fst_slot_slotnum++)
+  {
+
+    if (fst_slot_slotnum == MAXwordID)
+    {
+      char *slot = "";
+      PLogError("error: slot '%s' not found among [%d,%d] possible\n", slot, 1, fst->olabels->num_slots - 1);
+      return (rc = FST_FAILED_ON_INVALID_ARGS);
+    }
+
+    /* now find where in the graph this slot is referenced, note that
+       there might be more than one place, but here we ignore multiples */
+    fst_slot_start_node = MAXnodeID;
+    fst_slot_end_node = MAXnodeID;
+    for (i = fst->num_fsm_exit_points; --i >= 0;)
+    {
+      ai = fst->fsm_exit_points[i].arc_index;
+      if (fst->FSMarc_list[ai].olabel == fst_slot_slotnum)
+      {
+        fst_slot_start_node = fst->fsm_exit_points[i].from_node_index;
+        fst_slot_end_node = fst->fsm_exit_points[i].wbto_node_index;
+      }
+    }
+
+    /* this 'slot' could be the root rule, which can't be removed */
+    if (fst_slot_start_node == MAXnodeID || fst_slot_end_node == MAXnodeID)
+      continue;
+
+    /*
+      start                     end
+      node   node2    node3   node4
+       o--@N-->o--sil-->o--wb-->o
+         arc     arc2   | arc3  ^
+                 |       |wb
+                 \__sil->o
+    arc4   ni3a
+    */
+
+    remove_added_arcs_leaving(fst, fst_slot_start_node);
+    node = &fst->FSMnode_list[ fst_slot_start_node];
+    for (ai = node->un_ptr.first_next_arc; ai != MAXarcID; ai = arc->linkl_next_arc)
+    {
+      arc = &fst->FSMarc_list[ai];
+      if (arc->olabel != fst_slot_slotnum)
+        continue;
+
+      ni2 = arc->to_node;
+      remove_added_arcs_arriving(fst, ni2);
+      if (ni2 == fst_slot_end_node)
+        continue;
+      node2 = &fst->FSMnode_list[ni2];
+      arc2 = &fst->FSMarc_list[ node2->un_ptr.first_next_arc];
+
+
+      ni3 = arc2->to_node;
+      remove_added_arcs_arriving(fst, ni3);
+      if (ni3 == fst_slot_end_node)
+        continue;
+      node3 = &fst->FSMnode_list[ni3];
+      arc3 = &fst->FSMarc_list[ node3->un_ptr.first_next_arc];
+      while (arc3->linkl_next_arc != MAXarcID)
+      {
+        arc3 = &fst->FSMarc_list[arc3->linkl_next_arc];
+        ni3a = arc3->to_node;
+        remove_added_arcs_arriving(fst, ni3a);
+      }
+      arc3 = &fst->FSMarc_list[ node3->un_ptr.first_next_arc];
+
+      ni4 = arc3->to_node;
+      remove_added_arcs_arriving(fst, ni4);
+      ASSERT(ni4 == fst_slot_end_node);
+      if (ni4 == fst_slot_end_node)
+        continue;
+    }
+  }
+
+  /* reset the freelist for nodes */   
+  if( fst->num_nodes == fst->num_base_nodes )
+    {}
+  else{
+    FSMnode *ntoken;
+    FSMnode* tmp_FSMnode_list;
+    FSMnode_info* tmp_FSMnode_info_list;
+
+	fst->FSMnode_freelist = MAXnodeID;
+    fst->num_nodes = fst->FSMnode_list_len = fst->num_base_nodes;
+
+	tmp_FSMnode_list = (FSMnode*)CALLOC_CLR(fst->FSMnode_list_len, sizeof(FSMnode), "srec.graph.nodes");
+    if(!tmp_FSMnode_list){
+     PLogError("ERROR: Could NOT reset the memory for srec.graph.nodes");
+     return FST_FAILED_ON_MEMORY;
+     }
+    memcpy( tmp_FSMnode_list, fst->FSMnode_list, fst->FSMnode_list_len*sizeof(FSMnode));
+
+    /* scan to the end of the free list (to be re-used) */
+    nodeID* last_free_node = (&fst->FSMnode_freelist);
+	ntoken = (*last_free_node==MAXnodeID) ? NULL : &fst->FSMnode_list[*last_free_node] ;
+
+	for( ; *last_free_node!=MAXnodeID; last_free_node = &ntoken->un_ptr.next_node)
+		 ntoken = &tmp_FSMnode_list[ *last_free_node];
+
+	FREE( fst->FSMnode_list);
+    tmp_FSMnode_info_list = (FSMnode_info*)CALLOC_CLR(fst->FSMnode_list_len, sizeof(FSMnode_info), "srec.graph.nodeinfos");
+    if(!tmp_FSMnode_info_list){
+     PLogError("ERROR: Could NOT reset the memory for srec.graph.nodeinfos");
+     return FST_FAILED_ON_MEMORY;
+     }
+	// copy in node info
+	memcpy( tmp_FSMnode_info_list, fst->FSMnode_info_list, fst->FSMnode_list_len*sizeof(FSMnode_info));
+
+
+	FREE( fst->FSMnode_info_list);
+	fst->FSMnode_info_list = tmp_FSMnode_info_list;
+    fst->FSMnode_list = tmp_FSMnode_list;
+  }
+
+  /*ni = fst->FSMnode_freelist = fst->num_base_nodes;
+    node = &fst->FSMnode_list[ni];
+    for (; ni < fst->FSMnode_list_len - 1; ni++, node++)
+       node->un_ptr.next_node = (nodeID)(ni + 1);
+    node->un_ptr.next_node = MAXnodeID;
+    fst->num_nodes = fst->num_base_nodes;*/
+
+  /* reset the freelist for arcs */ 
+  if( fst->num_arcs == fst->num_base_arcs )
+    {}
+  else {
+    FSMarc* atoken = NULL;
+    FSMarc* tmp_FSMarc_list;
+    
+    fst->num_arcs = fst->num_base_arcs;
+    fst->FSMarc_list_len = fst->num_base_arcs;
+    fst->FSMarc_freelist = MAXarcID;
+    tmp_FSMarc_list = (FSMarc*)CALLOC_CLR(fst->FSMarc_list_len, sizeof(FSMarc), "srec.graph.arcs");
+    if(!tmp_FSMarc_list){
+      PLogError("ERROR: Could NOT reset the memory for srec.graph.arcs");
+     return FST_FAILED_ON_MEMORY;
+    }
+    memcpy( tmp_FSMarc_list, fst->FSMarc_list, fst->FSMarc_list_len*sizeof(FSMarc));
+    
+    /* scan to the end of the free list (to be re-used) */
+    arcID* last_free_arc = &fst->FSMarc_freelist;
+    atoken = (*last_free_arc==MAXarcID) ? NULL : &fst->FSMarc_list[*last_free_arc] ;
+    
+    for( ; *last_free_arc!=MAXarcID; last_free_arc=&atoken->linkl_next_arc)
+      atoken = &tmp_FSMarc_list[ *last_free_arc];
+
+    FREE( fst->FSMarc_list);
+    fst->FSMarc_list = tmp_FSMarc_list;
+  }
+  
+  /*ai = fst->FSMarc_freelist = fst->num_base_arcs;
+    arc = &fst->FSMarc_list[ai];
+    for (; ai < fst->FSMarc_list_len - 1; ai++, arc++)
+    arc->linkl_next_arc = (arcID)(ai + 1);
+    arc->linkl_next_arc = MAXarcID;
+    fst->num_arcs = fst->num_base_arcs;
+    fst->FSMarc_list_len = fst->num_base_arcs;*/
+  
+  /* now remove all the added words */
+  wordmap_reset(fst->olabels);
+  return FST_SUCCESS;
+}
+
+/* See the description of arc_tokens in the header file. These
+   arcs are nodeless, which make loading from a file that
+   references nodes a little harder.  We need to do it in stages.
+   Later, when we load from binary image it should be much simpler.
+*/
+
+arc_token_lnk get_first_arc_leaving_node(arc_token* arc_token_list,
+    arcID num_arcs,
+    nodeID node)
+{
+  arcID i;
+  for (i = 0; i < num_arcs; i++)
+  {
+    if ((nodeID)(int)arc_token_list[i].next_token_index == node)
+      return ARC_TOKEN_LNK(arc_token_list, i);
+  }
+  return ARC_TOKEN_NULL;
+}
+
+int FST_LoadReverseWordGraph(srec_context* context, int num_words_to_add, PFile* fp)
+{
+  arcID i;
+  char line[MAX_LINE_LENGTH];
+  char word_label_as_str[128];
+  arcID num_alloc_arc_tokens;
+  nodeID from_node, into_node;
+  labelID word_label = MAXwordID;
+  arc_token *atoken, *last_atoken;
+  costdata cost;
+  arcID num_arcs;
+  arc_token *arc_token_list, *tmp;
+  long fpos;
+
+  /* determine number of word arcs to allocate */
+  fpos = pftell(fp);
+  for (num_arcs = 0; pfgets(line, MAX_LINE_LENGTH, fp);  num_arcs++) ;
+  num_alloc_arc_tokens = num_arcs;
+  num_alloc_arc_tokens = (arcID)(num_arcs + num_words_to_add);
+  pfseek(fp, fpos, SEEK_SET);
+
+  context->arc_token_list = (arc_token*)CALLOC_CLR(num_alloc_arc_tokens, sizeof(arc_token), "srec.graph.wordgraph");
+  arc_token_list = context->arc_token_list;
+
+  /* 1. first load up all the information */
+  i = 0;
+  while (pfgets(line, MAX_LINE_LENGTH, fp))
+  {
+    if (sscanf(line, "%hu\t%hu\t%s", &from_node, &into_node, word_label_as_str) == 3)
+    {
+      word_label = wordmap_find_index(context->olabels, word_label_as_str);
+      // ASSERT(word_label >= 0);
+      cost = FREEcostdata;
+    }
+    else if (sscanf(line, "%hu", &from_node) == 1)
+    {
+      into_node = MAXnodeID;
+      word_label = MAXwordID;
+      cost = FREEcostdata;
+    }
+    else
+    {
+      PLogError("FST_LoadReverseWordGraph() .. can't parse line %s\n", line);
+      ASSERT(0);
+    }
+    atoken = &arc_token_list[i];
+    i++;
+    atoken->ilabel = word_label;
+	/* atoken->olabel = WORD_EPSILON_LABEL; */
+    /*atoken->cost = cost; cost is not used for now */
+#if DEBUG_ASTAR
+    atoken->label = (word_label == MAXwordID ? 0 : wmap->words[word_label]);
+#endif
+    atoken->first_next_arc = (arc_token_lnk)into_node;
+    atoken->next_token_index = (arc_token_lnk)from_node;
+  }
+  num_arcs = i;
+
+  /* 2. now do the internal cross references */
+  for (i = 0; i < num_arcs; i++)
+  {
+    atoken = &arc_token_list[i];
+    into_node = (nodeID)atoken->first_next_arc;
+    if (into_node == MAXnodeID)
+      atoken->first_next_arc = ARC_TOKEN_NULL;
+    else
+      atoken->first_next_arc = get_first_arc_leaving_node(arc_token_list, num_arcs, (nodeID)atoken->first_next_arc);
+  }
+
+  /* 3. now do more internal cross refs */
+  last_atoken = &arc_token_list[0];
+  for (i = 1; i < num_arcs; i++)
+  {
+    atoken = &arc_token_list[i];
+    if (atoken->next_token_index != last_atoken->next_token_index)
+    {
+      last_atoken->next_token_index = ARC_TOKEN_NULL;
+    }
+    else
+    {
+      last_atoken->next_token_index = ARC_TOKEN_LNK(arc_token_list, i);
+    }
+    last_atoken = atoken;
+  }
+  last_atoken->next_token_index = ARC_TOKEN_NULL;
+
+#if DEBUG_ASTAR
+  /* under debug, it's nice to be able to see the words leaving the
+     destination node, they are stored sequentially in the debug ary */
+  for (i = 0; i < num_arcs; i++)
+  {
+    char * p;
+    atoken = &arc_token_list[i];
+    atoken->debug[0] = 0;
+    for (tmp = ARC_TOKEN_LNK(arc_token_list, atoken->first_next_arc); tmp != NULL;
+         tmp = ARC_TOKEN_PTR(arc_token_list, tmp->next_token_index))
+    {
+      if (tmp->first_next_arc == ARC_TOKEN_NULL)
+      {
+        p = "END";
+      }
+      else if (!tmp->label)
+      {
+        p = "NULL";
+      }
+      else
+      {
+        p = tmp->label;
+      }
+      if (strlen(atoken->debug) + strlen(p) + 6 < 64)
+      {
+        strcat(atoken->debug, p);
+        strcat(atoken->debug, " ");
+      }
+      else
+      {
+        strcat(atoken->debug, "...");
+        break;
+      }
+    }
+  }
+#endif
+  context->arc_token_list_len = num_alloc_arc_tokens;
+  if (num_alloc_arc_tokens > num_arcs)
+  {
+    atoken = &context->arc_token_list[num_arcs];
+    for (i = num_arcs; i < num_alloc_arc_tokens; i++, atoken++)
+    {
+      atoken->first_next_arc = ARC_TOKEN_NULL;
+      atoken->ilabel         = MAXwordID;
+      atoken->next_token_index = ARC_TOKEN_LNK(arc_token_list, i + 1);/*atoken+1;*/
+    }
+    atoken--;
+    atoken->next_token_index = ARC_TOKEN_NULL;
+    context->arc_token_freelist = &context->arc_token_list[num_arcs];
+  }
+  else
+  {
+    context->arc_token_freelist = NULL;
+  }
+  /* the insert start is the arc that goes to the end */
+  atoken = context->arc_token_list;
+  atoken = ARC_TOKEN_PTR(arc_token_list, atoken->first_next_arc);
+  for (; atoken; atoken = ARC_TOKEN_PTR(arc_token_list, atoken->next_token_index))
+  {
+    if (atoken->first_next_arc == ARC_TOKEN_NULL)
+      break;
+    tmp = ARC_TOKEN_PTR(context->arc_token_list, atoken->first_next_arc);
+    if (tmp->ilabel == MAXwordID && tmp->first_next_arc == ARC_TOKEN_NULL)
+      break;
+  }
+  context->arc_token_insert_start = atoken;
+
+  return FST_SUCCESS;
+}
+
+int FST_UnloadReverseWordGraph(srec_context* context)
+{
+  FREE(context->arc_token_list);
+  context->arc_token_list = 0;
+  return FST_SUCCESS;
+}
+
+/*----------------------------------------------------------------------*
+ *                                                                      *
+ * general                                                              *
+ *                                                                      *
+ *----------------------------------------------------------------------*/
+
+char split_line(char* line, char** av)
+{
+  int i = 0;
+  av[i] = strtok(line, "\n\r\t ");
+  for (; av[i];)
+  {
+    av[++i] = strtok(NULL, "\n\r\t ");
+  }
+  return i;
+}
+
+asr_int32_t atoi_with_check(const char* buf, asr_int32_t mymax)
+{
+  asr_int32_t ans = atol(buf);
+  ASSERT(ans < mymax);
+  return ans;
+}
+
+/*----------------------------------------------------------------------*
+ *                                                                      *
+ * fst                                                                  *
+ *                                                                      *
+ *----------------------------------------------------------------------*/
+
+arcID fst_get_free_arc(srec_context* fst)
+{
+  FSMarc* atoken;
+  arcID atokid = fst->FSMarc_freelist;
+  if (atokid == MAXarcID)
+  {
+    PLogError("error: ran out of arcs\n");
+    return atokid;
+  }
+  atoken = &fst->FSMarc_list[atokid];
+  fst->FSMarc_freelist = ARC_XtoI(atoken->linkl_next_arc);
+  memset(atoken, 0, sizeof(FSMarc));
+  atoken->to_node = FSMNODE_NULL;
+  atoken->fr_node = FSMNODE_NULL;
+  atoken->linkl_next_arc = FSMARC_NULL;
+  atoken->linkl_prev_arc = FSMARC_NULL;
+  atoken->ilabel = 0;
+  atoken->olabel = 0;
+  atoken->cost   = 0;
+  fst->num_arcs++;
+  return atokid;
+}
+nodeID fst_get_free_node(srec_context* fst)
+{
+  FSMnode* ntoken;
+  nodeID ntokid = fst->FSMnode_freelist;
+  if (ntokid == MAXnodeID)
+  {
+    PLogError("error: ran out of nodes\n");
+    return ntokid;
+  }
+  ntoken = &fst->FSMnode_list[ntokid];
+  fst->FSMnode_freelist = NODE_XtoI(ntoken->un_ptr.next_node);
+  ntoken->un_ptr.first_next_arc = FSMARC_NULL;
+  ntoken->first_prev_arc = FSMARC_NULL;
+  /* ASSERT( (int)(ntok - fst->FSMnode_list) == fst->num_nodes); */
+  fst->num_nodes++;
+  return ntokid;
+}
+
+int fst_free_node(srec_context* fst, FSMnode* node)
+{
+  IF_DEBUG_WDADD(printf_node(fst, "freeing: ", node));
+  node->first_prev_arc = FSMARC_NULL;
+  node->un_ptr.next_node = fst->FSMnode_freelist;
+  node->first_prev_arc = FSMARC_FREE;
+  fst->FSMnode_freelist = (nodeID)(node - fst->FSMnode_list);
+  /* fst->num_nodes--; not allowed unless we compress! */
+  return 0;
+}
+
+int fst_free_arc(srec_context* fst, FSMarc* arc)
+{
+  IF_DEBUG_WDADD(printf_arc(fst, "freeing: ", arc));
+  arc->linkl_prev_arc = FSMARC_FREE;
+  arc->linkl_next_arc = ARC_ItoX(fst->FSMarc_freelist);
+  arc->cost = 2;
+  arc->ilabel = 0;
+  arc->olabel = 0;
+  IF_DEBUG_WDADD(arc->ilabel_str = 0);
+  IF_DEBUG_WDADD(arc->olabel_str = 0);
+  fst->FSMarc_freelist = (arcID)(arc - fst->FSMarc_list);
+  fst->num_arcs--;
+  return 0;
+}
+
+int fst_free_arc_net(srec_context* fst, FSMarc* arc)
+{
+  if (!arc)
+    return 0;
+  /* need to traverse the arc, get the 'from' nodes,
+     then traverse the from nodes and kill arcs */
+  /* we'll need this after an error condition */
+  return 0;
+}
+
+int fst_push_arc_olabel(srec_context* fst, FSMarc* arc)
+{
+  FSMarc_ptr atok;
+  FSMarc* atoken;
+  FSMnode_ptr ntok = arc->to_node;
+
+  /* look for all arcs leaving this arc, and mark them
+     normally there is only one, except for multipron words */
+  for (atok = FIRST_NEXT(ntok); atok != FSMARC_NULL; atok = atoken->linkl_next_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    /* cannot have multiple olabels before a boundary */
+    if (atoken->olabel != WORD_EPSILON_LABEL)
+      return FST_FAILED_INTERNAL;
+    atoken->olabel = arc->olabel;
+#if DO_WEIGHTED_ADDWORD
+    atoken->cost = (costdata)(atoken->cost + arc->cost);
+#endif
+    IF_DEBUG_WDADD(atoken->olabel_str = arc->olabel_str);
+  }
+  /* unlabel this arc */
+  arc->olabel = WORD_EPSILON_LABEL;
+#if DO_WEIGHTED_ADDWORD
+  arc->cost = FREEcostdata;
+#endif
+  IF_DEBUG_WDADD(arc->olabel_str = fst->olabels->words[ arc->olabel]);
+  return FST_SUCCESS;
+}
+
+#if DO_WEIGHTED_ADDWORD
+int fst_push_arc_cost(srec_context* fst, FSMarc* arc)
+{
+  FSMarc_ptr atok;
+  FSMarc* atoken;
+  FSMnode_ptr ntok = arc->to_node;
+  /* look for all arcs leaving this arc, and push the cost thereto */
+  for (atok = FIRST_NEXT(ntok); atok != FSMARC_NULL; atok = atoken->linkl_next_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    atoken->cost = (costdata)(atoken->cost + arc->cost);
+  }
+  arc->cost = FREEcostdata;
+  return FST_SUCCESS;
+}
+#endif
+
+
+int fst_pull_arc_olabel(srec_context* fst, FSMarc* arc)
+{
+  FSMarc_ptr atok;
+  FSMarc* atoken;
+  FSMnode_ptr fr_node = arc->fr_node;
+  FSMarc_ptr tmp_atok;
+  FSMarc *tmp_atoken;
+  FSMnode *anode;
+
+  if (arc->olabel == WORD_EPSILON_LABEL)
+    return FST_SUCCESS;
+
+  /* can the olabel be pulled earlier? */
+  for (atok = FIRST_PREV(fr_node); atok != FSMARC_NULL; atok = atoken->linkl_prev_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    anode = NODE_XtoP(atoken->to_node);
+
+    tmp_atok = anode->un_ptr.first_next_arc;
+    if (tmp_atok != FSMARC_NULL)
+    {
+      tmp_atoken = ARC_XtoP(tmp_atok);
+      if (tmp_atoken->linkl_next_arc != FSMARC_NULL)
+      {
+        return FST_CONTINUE;
+      }
+    }
+  }
+
+  /* look for all arcs arriving at this arc, and mark them */
+  for (atok = FIRST_PREV(fr_node);atok != FSMARC_NULL;atok = atoken->linkl_prev_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    /* cannot have multiple olabels! serious internal error!? */
+    if (atoken->olabel != WORD_EPSILON_LABEL)
+    {
+      PLogError("error: internal error, in fst_pull_arc_olabel()\n");
+      return FST_FAILED_INTERNAL;
+    }
+    atoken->olabel = arc->olabel;
+#if DO_WEIGHTED_ADDWORD
+    atoken->cost = arc->cost;
+#endif
+    IF_DEBUG_WDADD(atoken->olabel_str = arc->olabel_str);
+  }
+  /* unlabel this arc */
+  arc->olabel = WORD_EPSILON_LABEL;
+#if DO_WEIGHTED_ADDWORD
+  arc->cost   = FREEcostdata;
+#endif
+  IF_DEBUG_WDADD(arc->olabel_str = fst->olabels->words[ arc->olabel]);
+  return FST_SUCCESS;
+}
+
+static FSMarc* find_next_arc_with_ilabel(srec_context* fst, FSMnode* node, labelID ilabel, FSMarc** last)
+{
+  FSMarc_ptr atok;
+  FSMarc* atoken = NULL;
+  for (atok = node->un_ptr.first_next_arc; atok != FSMARC_NULL; atok = atoken->linkl_next_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    if (atoken->ilabel == ilabel)
+      return atoken;
+  }
+  *last = atoken; /* to this we may want to append a new arc */
+  return NULL;
+}
+
+FSMarc* find_prev_arc_with_iolabels(srec_context* fst, FSMnode* node, labelID ilabel, labelID olabel, FSMarc** last)
+{
+  FSMarc_ptr atok;
+  FSMarc* atoken = NULL;
+  FSMarc_ptr tmp_atok;
+  FSMarc* tmp_atoken;
+
+  for (atok = node->first_prev_arc; atok != FSMARC_NULL; atok = atoken->linkl_prev_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    if (atoken->olabel == olabel && atoken->ilabel == ilabel)
+    {
+      tmp_atok = NODE_XtoP(atoken->fr_node)->un_ptr.first_next_arc;
+      if (tmp_atok != FSMARC_NULL)
+      {
+        tmp_atoken = ARC_XtoP(tmp_atok);
+
+        if (tmp_atoken->linkl_next_arc == FSMARC_NULL)
+          return atoken;
+      }
+      else
+        return atoken;
+    }
+
+  }
+  if (last) *last = atoken;
+  return NULL;
+}
+
+int num_arcs_leaving(srec_context* fst, FSMnode* node)
+{
+  int num_arcs = 0;
+  FSMarc_ptr atok;
+  FSMarc* atoken;
+  for (atok = node->un_ptr.first_next_arc; atok != FSMARC_NULL; atok = atoken->linkl_next_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    num_arcs++;
+  }
+  return num_arcs;
+}
+
+int num_arcs_arriving(srec_context* fst, FSMnode* node)
+{
+  int num_arcs = 0;
+  FSMarc_ptr atok;
+  FSMarc* atoken;
+  for (atok = node->first_prev_arc; atok != FSMARC_NULL; atok = atoken->linkl_prev_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    num_arcs++;
+  }
+  return num_arcs;
+}
+
+PINLINE int num_arcs_arriving_gt_1(srec_context* fst, FSMnode* node)
+{
+  FSMarc_ptr atok = node->first_prev_arc;
+  FSMarc* atoken;
+  if (atok == FSMARC_NULL)
+    return 0;
+  atoken = ARC_XtoP(atok);
+  return atoken->linkl_prev_arc == FSMARC_NULL ? 0 : 1;
+}
+
+static void remove_arc_arriving(srec_context* fst, FSMnode* to_node, FSMarc* arc)
+{
+  FSMarc* atoken;
+  FSMarc_ptr* atok;
+  for (atok = &to_node->first_prev_arc;(*atok) != FSMARC_NULL; atok = &atoken->linkl_prev_arc)
+  {
+    atoken = ARC_XtoP(*atok);
+    if (atoken == arc)
+    {
+      (*atok) = arc->linkl_prev_arc;
+      return;
+    }
+  }
+  ASSERT(0);
+}
+
+int split_node_for_arc(srec_context* fst, FSMarc* arc)
+{
+  arcID new_arc_id;
+  nodeID new_node_id;
+  FSMnode* new_node;
+  FSMnode* old_node;
+  FSMarc_ptr atok, new_next, last_new_next;
+  FSMarc *atoken, *new_next_p;
+
+  IF_DEBUG_WDADD(printf_arc(fst, "spliting ... ", arc));
+
+  new_node_id = fst_get_free_node(fst);
+  if (new_node_id == MAXnodeID)
+    return FST_FAILED_ON_MEMORY;
+  new_node = &fst->FSMnode_list[ new_node_id];
+  old_node = NODE_XtoP(arc->to_node);
+  arc->to_node = NODE_ItoX(new_node_id);
+  new_node->first_prev_arc = ARC_PtoX(arc);
+  remove_arc_arriving(fst, old_node, arc);
+  arc->linkl_prev_arc = FSMARC_NULL;
+
+  last_new_next = FSMARC_NULL;
+  for (atok = old_node->un_ptr.first_next_arc; atok != FSMARC_NULL; atok = atoken->linkl_next_arc)
+  {
+    atoken = ARC_XtoP(atok);
+    new_arc_id = fst_get_free_arc(fst);
+    if (new_arc_id == MAXarcID)
+      return FST_FAILED_ON_MEMORY;
+    new_next = ARC_ItoX(new_arc_id);
+    if (last_new_next != FSMARC_NULL)
+      LINKL_NEXT(last_new_next) = new_next;
+    else
+      new_node->un_ptr.first_next_arc = new_next;
+    new_next_p = ARC_XtoP(new_next);
+    new_next_p->ilabel = atoken->ilabel;
+    new_next_p->to_node = atoken->to_node;
+    new_next_p->fr_node = arc->to_node;
+    new_next_p->olabel = atoken->olabel;
+    IF_DEBUG_WDADD(new_next_p->ilabel_str = atoken->ilabel_str);
+    IF_DEBUG_WDADD(new_next_p->olabel_str = atoken->olabel_str);
+    new_next_p->linkl_next_arc = FSMARC_NULL; /* set at next loop */
+    append_arc_arriving_node(fst, NODE_XtoP(atoken->to_node), new_next);
+    last_new_next = new_next;
+  }
+  return FST_SUCCESS;
+}
+
+int fst_add_arcs(srec_context* fst, nodeID start_node, nodeID end_node,
+                 wordID add_tree_olabel, costdata add_tree_cost,
+                 modelID* add_tree_start, int add_tree_len)
+{
+  int rc = FST_SUCCESS;
+  FSMarc_ptr atok = (FSMarc_ptr)0, last_atok = (FSMarc_ptr)0;
+  FSMarc* atoken = NULL;
+  FSMarc *next_atoken, *prev_atoken;
+  FSMarc *append_to;
+  FSMnode *late_start_node, *early_end_node;
+  FSMnode *ntoken, *last_ntoken;
+  FSMnode_ptr ntok, last_ntok;
+  modelID *add_tree_end = add_tree_start + add_tree_len - 1;
+  modelID *add_tree_late_start, *add_tree_early_end;
+  modelID *add_tree;
+  arcID new_arc_id, atokid;
+  nodeID new_node_id, atokid_node;
+  wordID add_tree_olabel_use = add_tree_olabel;
+  wordID add_tree_cost_use   = add_tree_cost;
+
+  append_to = NULL;
+  add_tree = add_tree_start;
+#define FST_GROW_MINARCS  100
+#define FST_GROW_MINNODES 100
+#if defined(FST_GROW_FACTOR)
+
+  /* make sure we have enough arcs available */
+  if(fst->num_arcs + add_tree_len >= fst->FSMarc_list_len)
+   {
+	FSMarc* tmp_FSMarc_list;
+	arcID tmp_FSMarc_list_len;
+	int itmp_FSMarc_list_len = fst->FSMarc_list_len*FST_GROW_FACTOR ;
+
+	if( itmp_FSMarc_list_len - fst->FSMarc_list_len < FST_GROW_MINARCS)
+		itmp_FSMarc_list_len += FST_GROW_MINARCS;
+
+	if( itmp_FSMarc_list_len - fst->FSMarc_list_len < add_tree_len)
+		itmp_FSMarc_list_len += add_tree_len;
+
+    if(itmp_FSMarc_list_len >= (int)MAXarcID)
+	     return FST_FAILED_ON_MEMORY;
+
+	tmp_FSMarc_list_len = (arcID)itmp_FSMarc_list_len;
+
+    tmp_FSMarc_list = (FSMarc*)CALLOC_CLR(tmp_FSMarc_list_len, sizeof(FSMarc), "srec.graph.arcs");
+      if(!tmp_FSMarc_list) {
+	PLogError("error: Failed to extend the memory for arcs\n");
+        return FST_FAILED_INTERNAL;
+      }
+    memcpy( tmp_FSMarc_list, fst->FSMarc_list, fst->FSMarc_list_len*sizeof(FSMarc));
+
+	/* initialize the new free list.
+    head of this new free list is tmp_FSMarc_list[ fst->FSMarc_list_len] */
+	for(atokid=fst->FSMarc_list_len; atokid<tmp_FSMarc_list_len-1; atokid++) {
+	   tmp_FSMarc_list[atokid].linkl_next_arc = ARC_ItoX(atokid+1);
+       tmp_FSMarc_list[atokid].linkl_prev_arc = FSMARC_FREE;
+    }
+    tmp_FSMarc_list[atokid].linkl_next_arc = FSMARC_NULL;
+    tmp_FSMarc_list[atokid].linkl_prev_arc = FSMARC_FREE;
+
+    /* scan to the end of the old free list (to be re-used) */
+    arcID* last_free_arc = &fst->FSMarc_freelist;
+    atoken = (*last_free_arc==MAXarcID) ? NULL : &fst->FSMarc_list[*last_free_arc] ;
+
+    for( ; *last_free_arc!=MAXarcID; last_free_arc=&atoken->linkl_next_arc)
+	    atoken = &tmp_FSMarc_list[ *last_free_arc];
+
+	/* append the new free list to the current free list */
+	*last_free_arc = fst->FSMarc_list_len;
+
+	FREE( fst->FSMarc_list);
+    fst->FSMarc_list = tmp_FSMarc_list;
+    fst->FSMarc_list_len = tmp_FSMarc_list_len;
+   }
+
+   /* make sure we have enough nodes available */
+   if(fst->num_nodes + add_tree_len >= fst->FSMnode_list_len)
+   {
+     FSMnode* tmp_FSMnode_list;
+	 nodeID tmp_FSMnode_list_len;
+	 FSMnode_info* tmp_FSMnode_info_list;
+	 int itmp_FSMnode_list_len = fst->FSMnode_list_len * FST_GROW_FACTOR ;
+
+	 if( itmp_FSMnode_list_len - fst->FSMnode_list_len < FST_GROW_MINNODES)
+		itmp_FSMnode_list_len += FST_GROW_MINNODES;
+
+	 if( itmp_FSMnode_list_len - fst->FSMnode_list_len < add_tree_len)
+		itmp_FSMnode_list_len += add_tree_len;
+
+	 if(itmp_FSMnode_list_len >= (int)MAXnodeID)
+	     return FST_FAILED_ON_MEMORY;
+
+	 tmp_FSMnode_list_len = (nodeID)itmp_FSMnode_list_len;
+
+     tmp_FSMnode_list = (FSMnode*)CALLOC_CLR(tmp_FSMnode_list_len, sizeof(FSMnode), "srec.graph.nodes");
+     if(!tmp_FSMnode_list) {
+       PLogError("ERROR: Failed to extend the memory for nodes\n");
+       return FST_FAILED_INTERNAL;
+     }
+     memcpy( tmp_FSMnode_list, fst->FSMnode_list, fst->FSMnode_list_len*sizeof(FSMnode));
+
+	/* initialize the new free node list.
+    head of this new free list is tmp_FSMnode_list[ fst->FSMnode_list_len] */
+    for(atokid_node=fst->FSMnode_list_len; atokid_node<tmp_FSMnode_list_len-1; atokid_node++)
+	{
+	   tmp_FSMnode_list[atokid_node].un_ptr.next_node = NODE_ItoX(atokid_node + 1);
+       tmp_FSMnode_list[atokid_node].first_prev_arc = FSMARC_FREE;
+    }
+       tmp_FSMnode_list[atokid_node].un_ptr.next_node = FSMNODE_NULL;
+       tmp_FSMnode_list[atokid_node].first_prev_arc = FSMARC_FREE;
+
+    /* scan to the end of the old free list (to be re-used) */
+    nodeID* last_free_node = (&fst->FSMnode_freelist);
+	ntoken = (*last_free_node==MAXnodeID) ? NULL : &fst->FSMnode_list[*last_free_node] ;
+
+	for( ; *last_free_node!=MAXnodeID; last_free_node = &ntoken->un_ptr.next_node)
+		 ntoken = &tmp_FSMnode_list[ *last_free_node];
+
+	/* append the new free list to the current free list */
+	*last_free_node = fst->FSMnode_list_len;
+
+	FREE( fst->FSMnode_list);
+
+	tmp_FSMnode_info_list = (FSMnode_info*)CALLOC_CLR( tmp_FSMnode_list_len, sizeof(FSMnode_info), "srec.graph.nodeinfos");
+     if(!tmp_FSMnode_info_list) {
+       PLogError("ERROR: Failed to extend the memory for node infos\n");
+       return FST_FAILED_INTERNAL;
+     }
+	// copy in old node info
+	memcpy( tmp_FSMnode_info_list, fst->FSMnode_info_list, fst->FSMnode_list_len*sizeof(FSMnode_info));
+
+	// initialize the new node info
+	for (atokid_node=fst->FSMnode_list_len; atokid_node < tmp_FSMnode_list_len; atokid_node++)
+		tmp_FSMnode_info_list[atokid_node] = NODE_INFO_UNKNOWN;
+
+	FREE( fst->FSMnode_info_list);
+	fst->FSMnode_info_list = tmp_FSMnode_info_list;
+    fst->FSMnode_list = tmp_FSMnode_list;
+    fst->FSMnode_list_len = tmp_FSMnode_list_len;
+}
+#endif
+   late_start_node = &fst->FSMnode_list[start_node];
+
+  while (1)
+  {
+
+    next_atoken = find_next_arc_with_ilabel(fst, late_start_node,
+                                            *add_tree /*->ilabel*/,
+                                            &append_to);
+    if (next_atoken != NULL)
+    {
+      /* so next_atok->ilabel == add_tree->ilabel */
+
+      if (next_atoken->ilabel == WORD_BOUNDARY && *add_tree/*->ilabel*/ == WORD_BOUNDARY)
+      {
+	 next_atoken = NULL;
+	 break; /* break as if nothing more can be shared! */
+	// return FST_FAILED_ON_HOMONYM;
+      }
+
+      if (num_arcs_arriving_gt_1(fst, NODE_XtoP(next_atoken->to_node)))
+      {
+        split_node_for_arc(fst, next_atoken);
+        /* unfortunate side effect here, that if we later find out this
+           was a homonym addition, then this expansion was useless and
+           for now we don't undo it! */
+      }
+
+      /* we shouldn't really push the olabel if it's the same for both! */
+      if (next_atoken->olabel != add_tree_olabel_use)
+      {
+        if (next_atoken->olabel != WORD_EPSILON_LABEL)
+        {
+          if (fst_push_arc_olabel(fst, next_atoken) != FST_SUCCESS)
+          {
+            PLogError("error: internal error fst_push_arc_olabel()\n");
+            return FST_FAILED_INTERNAL;
+          }
+        }
+#if DO_WEIGHTED_ADDWORD
+        else
+          fst_push_arc_cost(fst, next_atoken);
+#endif
+      }
+      else if (add_tree_olabel_use != WORD_EPSILON_LABEL)
+      {
+        /* the graph already has this word, so we just re-use the olabel
+           and disable the setting of olabel down below */
+        add_tree_olabel_use = WORD_EPSILON_LABEL;
+#if DO_WEIGHTED_ADDWORD
+        add_tree_cost_use   = FREEcostdata;
+#endif
+      }
+      add_tree++;
+      late_start_node = NODE_XtoP(next_atoken->to_node);
+    }
+    else
+    {
+      break;
+    }
+  }
+
+  add_tree_late_start = add_tree;
+  early_end_node = &fst->FSMnode_list[end_node];
+
+  if (!do_minimize)
+  {
+    last_ntoken = NULL;
+    last_ntok = NODE_PtoX(late_start_node);
+    for (; add_tree <= add_tree_end; add_tree++)
+    {
+      new_arc_id = fst_get_free_arc(fst);
+      if (new_arc_id == MAXarcID)
+      {
+        PLogError("fst_get_free_arc() failed\n");
+        return FST_FAILED_ON_MEMORY;
+      }
+      atok = ARC_ItoX(new_arc_id);
+      atoken = ARC_XtoP(atok);
+      if (add_tree != add_tree_end)
+      {
+        new_node_id = fst_get_free_node(fst);
+        if (new_node_id == MAXnodeID)
+        {
+          PLogError("fst_get_free_node() failed\n");
+          return FST_FAILED_ON_MEMORY;
+        }
+        ntok = NODE_ItoX(new_node_id);
+        ntoken = NODE_XtoP(ntok);
+        ntoken->first_prev_arc = atok;
+      }
+      else
+      {
+        ntok = FSMNODE_NULL;
+        ntoken = NULL;
+      }
+      atoken->fr_node = last_ntok; /* was NODE_PtoX(late_start_node) */
+      atoken->to_node = ntok;
+      atoken->ilabel = *add_tree;
+      atoken->linkl_next_arc = FSMARC_NULL;
+      atoken->linkl_prev_arc = FSMARC_NULL;
+      IF_DEBUG_WDADD(atoken->ilabel_str = fst->ilabels->words[ atoken->ilabel]);
+      if (!last_ntoken)
+      {
+        append_to->linkl_next_arc = atok;
+        atoken->olabel = add_tree_olabel_use;
+#if DO_WEIGHTED_ADDWORD
+        atoken->cost  =  add_tree_cost_use;
+#endif
+        IF_DEBUG_WDADD(atok->olabel_str = fst->olabels->words[ atoken->olabel]);
+      }
+      else
+      {
+        last_ntoken->un_ptr.first_next_arc = atok;
+      }
+      last_ntoken = ntoken;
+      last_ntok   = ntok;
+    }
+    /*  add_tree_end->to_node = early_end_node;
+    add_tree_end->linkl_next_arc = FSMARC_NULL;
+    atok = last_arc_arriving( early_end_node);
+    atok->linkl_prev_arc = add_tree_end;
+    add_tree_end->linkl_prev_arc = FSMARC_NULL; */
+    atoken->to_node = NODE_ItoX(end_node);
+    append_arc_arriving_node(fst, &fst->FSMnode_list[end_node], atok);
+  }
+
+  else /* ie. do_minimize from the rear */
+  {
+
+    add_tree = add_tree_end;
+    new_arc_id = fst_get_free_arc(fst);
+    if (new_arc_id == MAXarcID)
+      return FST_FAILED_ON_MEMORY;
+    atok = ARC_ItoX(new_arc_id);
+    atoken = ARC_XtoP(atok);
+    atoken->olabel = add_tree_olabel_use;
+#if DO_WEIGHTED_ADDWORD
+    atoken->cost   = add_tree_cost_use;
+#endif
+    atoken->ilabel = *add_tree_late_start;
+    atoken->fr_node = NODE_PtoX(late_start_node);
+    if (atoken->ilabel == WORD_BOUNDARY)
+    {
+      atoken->cost = (costdata)(atoken->cost + fst->wtw_average);
+    }
+    else
+    {
+      atoken->cost   = add_tree_cost_use + fst->wtw_average;
+      add_tree_cost_use = FREEcostdata;
+    }
+    IF_DEBUG_WDADD(atoken->olabel_str = fst->olabels->words[ atoken->olabel]);
+    IF_DEBUG_WDADD(atoken->ilabel_str = fst->ilabels->words[ atoken->ilabel]);
+    append_arc_leaving_node(fst, late_start_node, atok);
+
+    last_atok = atok;
+    while (1)
+    {
+
+      if (add_tree == add_tree_late_start)
+        break;
+      /* if there are other arcs leaving this node then joining
+      earlier than here will result in over-generation, so don't
+      if( atok!=end_arc && atok->linkl_next_arc != FSMARC_NULL)
+      break;
+      */
+      /*
+      also need boundary conditions checker here
+      */
+
+      /* */
+      IF_DEBUG_WDADD(printf_node(fst, early_end_node));
+
+      /* if( num_arcs_leaving( add_tree_end->fr_node->first_prev_arc->to_node) >1) {
+      printf("merge stopped due to num_arcs leaving ..\n");
+      printf_arc(fst, add_tree_end->fr_node->first_prev_arc->to_node->first_next_arc);
+      break;
+      } */
+
+      for (atok = early_end_node->first_prev_arc; atok != FSMARC_NULL; atok = atoken->linkl_prev_arc)
+      {
+        atoken = ARC_XtoP(atok);
+	/* never pull before the slot marker */
+	if(atoken->cost == DISABLE_ARC_COST) break; 
+	if(atoken->olabel>0 && atoken->olabel<fst->olabels->num_slots) break;  
+        fst_pull_arc_olabel(fst, atoken); /* fails are ok */
+      }
+
+      prev_atoken = find_prev_arc_with_iolabels(fst, early_end_node,
+                    *add_tree /*->ilabel*/,
+                    WORD_EPSILON_LABEL,
+                    NULL /*&append_to*/);
+      if (!prev_atoken)
+        break;
+      else
+      {
+        /* this check is now inside find_prev_arc_with_iolabels */
+        /* if( num_arcs_leaving(prev_atok->fr_node->first_prev_arc->to_node->first_next_arc)>1)*/
+
+        /* now look to merge earlier still */
+        early_end_node = NODE_XtoP(prev_atoken->fr_node);
+        add_tree--;
+        if (add_tree == add_tree_late_start)
+          break;
+      }
+    }
+    add_tree_early_end = add_tree;
+    for (add_tree = add_tree_late_start + 1; add_tree <= add_tree_early_end; add_tree++)
+    {
+      new_node_id = fst_get_free_node(fst);
+      if (new_node_id == MAXnodeID)
+        return FST_FAILED_ON_MEMORY;
+      ntok = NODE_ItoX(new_node_id);
+      ntoken = NODE_XtoP(ntok);
+      new_arc_id = fst_get_free_arc(fst);
+      if (new_arc_id == MAXarcID)
+        return FST_FAILED_ON_MEMORY;
+      atok = ARC_ItoX(new_arc_id);
+      atoken = ARC_XtoP(atok);
+      atoken->ilabel = *add_tree;
+#if DO_WEIGHTED_ADDWORD
+      atoken->cost   = FREEcostdata; /* idea: distribute add_tree_cost here;*/
+#endif
+      atoken->olabel = WORD_EPSILON_LABEL;
+      atoken->fr_node = ntok;
+      atoken->to_node = FSMNODE_NULL; /* filled in next loop */
+      IF_DEBUG_WDADD(atoken->olabel_str = fst->olabels->words[atoken->olabel]);
+      IF_DEBUG_WDADD(atoken->ilabel_str = fst->ilabels->words[atoken->ilabel]);
+
+      ntoken->un_ptr.first_next_arc = atok;
+      ntoken->first_prev_arc = last_atok;
+      TO_NODE(last_atok) = ntok;
+      last_atok = atok;
+    }
+    TO_NODE(last_atok) = NODE_PtoX(early_end_node);
+    append_arc_arriving_node(fst, early_end_node, last_atok);
+  }
+  return rc;
+}
+
+
+void append_arc_leaving_node(srec_context* fst, FSMnode* fr_node, FSMarc_ptr arc)
+{
+  FSMarc_ptr* atok = &fr_node->un_ptr.first_next_arc;
+  FSMarc* atoken = ARC_XtoP(*atok);
+  for (; (*atok) != FSMARC_NULL; atok = &atoken->linkl_next_arc)
+  {
+    atoken = ARC_XtoP(*atok);
+  }
+  *atok = arc;
+  LINKL_NEXT(arc) = FSMARC_NULL;
+}
+void append_arc_arriving_node(srec_context* fst, FSMnode* to_node, FSMarc_ptr arc)
+{
+  FSMarc_ptr* atok = &to_node->first_prev_arc;
+  FSMarc* atoken = ARC_XtoP(*atok);
+  for (; (*atok) != FSMARC_NULL; atok = &atoken->linkl_prev_arc)
+  {
+    atoken = ARC_XtoP(*atok);
+  }
+  *atok = arc;
+  LINKL_PREV(arc) = FSMARC_NULL;
+}
+
+
+int printf_node1(srec_context* fst, FSMnode* node)
+{
+  return 0;
+}
+int printf_arc1(srec_context* fst, char* msg, FSMarc* arc)
+{
+  char buffer[MAX_LINE_LENGTH];
+  sprintf_arc(buffer, fst, arc);
+  printf("%s%s\n", msg, buffer);
+  return 0;
+}
+int sprintf_arc(char* buf, srec_context* fst, FSMarc* arc)
+{
+  int rc;
+  FSMnode* to_node = NODE_XtoP(arc->to_node);
+  arcID arc_index = (arcID)(arc - fst->FSMarc_list);
+  if (to_node->un_ptr.first_next_arc == FSMARC_NULL)
+    rc = sprintf(buf, "arc%hu\n", arc_index);
+  else
+  {
+    rc = sprintf(buf, "arc%hu\t%hu,%hu\t%s\t%s\t%hu\n",
+                 arc_index,
+                 ARC_XtoI(to_node->un_ptr.first_next_arc),
+                 arc->linkl_next_arc != FSMARC_NULL ? ARC_XtoI(arc->linkl_next_arc) : -1,
+                 fst->ilabels->words[arc->ilabel],
+                 fst->olabels->words[arc->olabel],
+                 arc->cost);
+  }
+  return rc;
+}
+
+/* dumps the recognition context as a binary file,
+   it will also store any empty space for growing */
+
+#define ENCODE(SIGN,TYP) { SIGN+=sizeof(TYP); SIGN=SIGN<<3; ASSERT((shifted+=3)<32); }
+
+asr_int32_t FST_sizes_signature()
+{
+#ifndef NDEBUG
+  int shifted = 0;
+#endif
+  asr_int32_t signature = 0;
+  ENCODE(signature, arcID);
+  ENCODE(signature, nodeID);
+  ENCODE(signature, wordID);
+  ENCODE(signature, labelID);
+  ENCODE(signature, costdata);
+  return signature;
+}
+
+int FST_ContextImageSize(srec_context* context)
+{
+  int size = 0;
+  size += sizeof(srec_context);
+  size += sizeof(wordmap);
+  size += sizeof(char*) * context->olabels->max_words;
+  size += sizeof(char) * context->olabels->max_chars;
+  size += sizeof(wordmap);
+  if (context->ilabels->words != NULL)
+    size += sizeof(char*) * context->olabels->max_words;
+  if (context->ilabels->chars != NULL)
+    size += sizeof(char) * context->olabels->max_chars;
+  size += sizeof(FSMarc) * context->FSMarc_list_len;
+  size += sizeof(FSMnode) * context->FSMnode_list_len;
+  size += sizeof(FSMnode_info) * context->FSMnode_list_len;
+  size += sizeof(arc_token) * context->arc_token_list_len;
+  return size;
+}
+
+ESR_ReturnCode serializeWordMapV2(wordmap *wordmap, PFile* fp)
+{
+  unsigned int i = 0;
+  unsigned int nfields;
+  unsigned int tmp2[32];
+
+  i = 0;
+  tmp2[i++] = wordmap->num_words;
+  tmp2[i++] = wordmap->num_slots;
+  tmp2[i++] = wordmap->max_words;
+  tmp2[i++] = wordmap->num_base_words;
+  tmp2[i++] = wordmap->max_chars;
+  tmp2[i++] = (wordmap->next_chars - wordmap->chars);
+  tmp2[i++] = (wordmap->next_base_chars - wordmap->chars);
+  nfields = i;
+  if (pfwrite(tmp2, sizeof(tmp2[0]), nfields, fp) != nfields)
+    return ESR_WRITE_ERROR;
+
+  if (pfwrite(wordmap->chars, sizeof(char), wordmap->max_chars, fp) != (size_t)wordmap->max_chars)
+    return ESR_WRITE_ERROR;
+
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode deserializeWordMapV2(wordmap **pwordmap, PFile* fp)
+{
+  unsigned int i = 0;
+  unsigned int nfields;
+  unsigned int tmp2[32];
+  wordmap *awordmap;
+  char *p;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  unsigned int next_chars_idx, next_base_chars_idx;
+
+  awordmap = NEW(wordmap, L("srec.g2g.graph.wordmap.base"));
+  if (awordmap == NULL)
+  {
+    PLogError("NEW failed on srec.g2g.graph.wordmap.base\n");
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  awordmap->wordIDForWord = NULL; // early break to cleanup needs this
+
+  nfields = 7;
+  if (pfread(tmp2, sizeof(tmp2[0]), nfields, fp) != nfields)
+  {
+    PLogError("pfread failed when reading nfields\n");
+    rc = ESR_READ_ERROR;
+    goto CLEANUP;
+  }
+
+  i = 0;
+  awordmap->num_words      = (wordID)tmp2[i++];
+  awordmap->num_slots      = (wordID)tmp2[i++];
+  awordmap->max_words      = (wordID)tmp2[i++];
+  awordmap->num_base_words = (wordID)tmp2[i++];
+  awordmap->max_chars      = tmp2[i++];
+  next_chars_idx           = tmp2[i++];
+  next_base_chars_idx      = tmp2[i++];
+  ASSERT(nfields == i);
+
+  awordmap->words = NEW_ARRAY(char*, awordmap->max_words, L("srec.g2g.graph.wordmap.words"));
+  if (awordmap->words == NULL)
+  {
+    PLogError("NEW_ARRAY failed for srec.g2g.graph.wordmap.words %d\n", awordmap->max_words);
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  awordmap->chars = NEW_ARRAY(char, awordmap->max_chars, L("srec.g2g.graph.wordmap.chars"));
+  if (awordmap->chars == NULL)
+  {
+    PLogError("NEW_ARRAY failed for srec.g2g.graph.wordmap.chars %d\n", awordmap->max_chars);
+    rc = ESR_OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  awordmap->next_chars = awordmap->chars + next_chars_idx;
+  awordmap->next_base_chars = awordmap->chars + next_base_chars_idx;
+
+  if ((i=pfread(awordmap->chars, sizeof(char), awordmap->max_chars, fp)) != (size_t)awordmap->max_chars)
+  {
+    PLogError("pfread failed while reading %d chars\n", awordmap->max_chars);
+    rc = ESR_READ_ERROR;
+    goto CLEANUP;
+  }
+
+
+  p = awordmap->chars;
+  ASSERT((int)p % 2 == 0);
+  nfields = 0;
+  if (nfields < awordmap->num_words)
+    awordmap->words[nfields++] = p;
+  for (; p < awordmap->next_chars; p++) // was next_base_chars
+  {
+    if ( ( *p ) == '\0' )
+    {
+      if (nfields == awordmap->num_words) // was num_base_words
+        break;
+      if (((int)p) % 2 == 0) p++; /* so that words begin on even byte bound */
+      awordmap->words[nfields++] = p + 1;
+    }
+  }
+  ASSERT(nfields == awordmap->num_words); // was num_base_words
+
+  if (awordmap->max_words >= awordmap->num_base_words) 
+    {
+      PHashTableArgs hashArgs;
+      hashArgs.capacity = awordmap->max_words;
+      if(hashArgs.capacity%2==0) hashArgs.capacity += 1; 
+      hashArgs.compFunction = HashCmpWord; //PHASH_TABLE_DEFAULT_COMP_FUNCTION;
+      hashArgs.hashFunction = HashGetCode; //PHASH_TABLE_DEFAULT_HASH_FUNCTION;
+      hashArgs.maxLoadFactor = PHASH_TABLE_DEFAULT_MAX_LOAD_FACTOR;
+      CHKLOG(rc, PHashTableCreate(&hashArgs, L("srec.graph.wordmap.wordIDForWord.deserializeWordMap()"), &awordmap->wordIDForWord));
+      
+      rc = wordmap_populate ( awordmap, awordmap->num_words );
+      
+      if (rc != ESR_SUCCESS)
+	{
+        wordmap_clean ( awordmap );
+        goto CLEANUP;
+      }
+    }
+  else
+    {
+      awordmap->wordIDForWord = NULL;
+    }
+  
+  /* success */
+  *pwordmap = awordmap;
+  return ESR_SUCCESS;
+
+ CLEANUP:
+  if (awordmap != NULL)
+  {
+    if (awordmap->wordIDForWord != NULL)
+      PHashTableDestroy(awordmap->wordIDForWord);
+    if (awordmap->words != NULL) FREE(awordmap->words);
+    if (awordmap->chars != NULL) FREE(awordmap->chars);
+    FREE(awordmap);
+  }
+  return rc;
+}
+
+static ESR_ReturnCode serializeArcToken(arc_token *token_base,
+                                        int i,
+                                        PFile* fp)
+{
+  arc_token *token = token_base + i;
+  asr_uint32_t idx;
+
+  if (pfwrite(&token->ilabel, 2, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  if (pfwrite(&token->olabel, 2, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  /* if (pfwrite(&token->cost, 2, 1, fp) != 1)
+     return ESR_WRITE_ERROR; */
+  idx = PTR_TO_IDX(ARC_TOKEN_PTR(token_base, token->first_next_arc), token_base);
+
+  if (pfwrite(&idx, 4, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  idx = PTR_TO_IDX(ARC_TOKEN_PTR(token_base, token->next_token_index), token_base);
+
+  if (pfwrite(&idx, 4, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  return ESR_SUCCESS;
+}
+
+static ESR_ReturnCode serializeArcTokenInfo(srec_context *context,
+    PFile* fp)
+{
+  int i;
+  asr_uint32_t idx;
+  ESR_ReturnCode rc;
+
+  if (pfwrite(&context->arc_token_list_len, 2, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  idx = PTR_TO_IDX(context->arc_token_freelist, context->arc_token_list);
+
+  if (pfwrite(&idx, 4, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  idx = PTR_TO_IDX(context->arc_token_insert_start, context->arc_token_list);
+
+  if (pfwrite(&idx, 4, 1, fp) != 1)
+    return ESR_WRITE_ERROR;
+
+  for (i = 0; i < context->arc_token_list_len; ++i)
+  {
+    rc = serializeArcToken(context->arc_token_list, i, fp);
+    if (rc != ESR_SUCCESS) return rc;
+  }
+  return ESR_SUCCESS;
+}
+
+static ESR_ReturnCode deserializeArcToken(arc_token *token_base,
+    int i,
+    PFile* fp)
+{
+  arc_token *token = token_base + i;
+  asr_uint32_t idx[2];
+  asr_uint16_t labels[2];
+
+  if (pfread(labels, 2, 2, fp) != 2)
+    return ESR_READ_ERROR;
+
+  token->ilabel = labels[0];
+  token->olabel = labels[1];
+
+  /* if (pfread(&token->cost, 2, 1, fp) != 1)
+     return ESR_READ_ERROR; */
+
+  if (pfread(idx, 4, 2, fp) != 2)
+    return ESR_READ_ERROR;
+
+  token->first_next_arc = ARC_TOKEN_PTR2LNK(token_base, IDX_TO_PTR(idx[0], token_base));
+  token->next_token_index = ARC_TOKEN_PTR2LNK(token_base, IDX_TO_PTR(idx[1], token_base));
+
+  return ESR_SUCCESS;
+}
+
+static ESR_ReturnCode deserializeArcTokenInfo(srec_context *context,
+    PFile* fp)
+{
+  ESR_ReturnCode rc;
+  int i;
+  asr_uint32_t idx;
+
+  if (pfread(&context->arc_token_list_len, 2, 1, fp) != 1) {
+    PLogError("pfread failed in deserializeArcTokenInfo()\n");
+    return ESR_READ_ERROR;
+  }
+
+  context->arc_token_list = NEW_ARRAY(arc_token, context->arc_token_list_len,
+                                      L("srec.graph.wordgraph"));
+
+  if (context->arc_token_list == NULL)
+    return ESR_OUT_OF_MEMORY;
+
+  if (pfread(&idx, 4, 1, fp) != 1)
+  {
+    rc = ESR_READ_ERROR;
+    goto CLEANUP;
+  }
+
+  context->arc_token_freelist =
+    IDX_TO_PTR(idx, context->arc_token_list);
+
+  if (pfread(&idx, 4, 1, fp) != 1)
+  {
+    rc = ESR_READ_ERROR;
+    goto CLEANUP;
+  }
+
+  context->arc_token_insert_start =
+    IDX_TO_PTR(idx, context->arc_token_list);
+
+  for (i = 0; i < context->arc_token_list_len; ++i)
+  {
+    rc = deserializeArcToken(context->arc_token_list, i, fp);
+    if (rc != ESR_SUCCESS) goto CLEANUP;
+  }
+  return ESR_SUCCESS;
+
+CLEANUP:
+  FREE(context->arc_token_list);
+  context->arc_token_list =
+    context->arc_token_freelist =
+      context->arc_token_insert_start = NULL;
+  return rc;
+}
+
+int FST_GetGrammarType(srec_context* context)
+{
+  arc_token *t, *u;
+  wordID expected_wdid;
+  /* 0 1 0
+     1 2 4
+     ...
+     1 2 1316
+     2
+  */
+  t = context->arc_token_list;
+  if (t->ilabel != WORD_EPSILON_LABEL)
+    return GrammarTypeBNF;
+  if (t->next_token_index)
+    return GrammarTypeBNF;
+  t = ARC_TOKEN_PTR(context->arc_token_list, t->first_next_arc);
+  expected_wdid = NUM_ITEMLIST_HDRWDS;
+  for (; t; t = ARC_TOKEN_PTR(context->arc_token_list, t->next_token_index))
+  {
+    if (t->ilabel != expected_wdid)
+      return GrammarTypeBNF;
+    u = ARC_TOKEN_PTR(context->arc_token_list, t->first_next_arc);
+    if (u != NULL && u->ilabel != MAXwordID)
+      return GrammarTypeBNF;
+    expected_wdid++;
+  }
+  if (expected_wdid != context->olabels->num_words)
+    return GrammarTypeBNF;
+  return GrammarTypeItemList;
+}
+
+int FST_DumpContextAsImageV2(srec_context* context, PFile* fp)
+{
+  asr_uint32_t header[4];
+  arcID tmp[32], i, j, nfields;
+  FSMarc* arc;
+  ESR_ReturnCode rc;
+#if !defined(DO_ARCS_IO_IN_ARC_ORDER)
+  FSMnode* node;
+  arcID arcid, num_arcs, num_arcs_written;
+#endif
+
+  /* Write header information. */
+  header[0] = 0;
+  header[1] = IMAGE_FORMAT_V2;
+  header[2] = context->modelid;
+  header[3] = context->grmtyp;
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("FST_DumpContextAsImageV2() fstgrmtyp %d", context->grmtyp);
+#endif
+
+  if (pfwrite(header, sizeof(header[0]), 4, fp) != 4)
+  {
+    PLogError("FST_DumpContextAsImage: Could not write header.\n");
+    return FST_FAILED_INTERNAL;
+  }
+
+  /* arcs and nodes */
+  i = 0;
+  tmp[i++] = context->num_arcs;
+  tmp[i++] = context->FSMarc_list_len;
+  tmp[i++] = context->num_base_arcs;
+  tmp[i++] = context->FSMarc_freelist;
+  tmp[i++] = context->max_searchable_arcs;
+
+  tmp[i++] = context->num_nodes;
+  tmp[i++] = context->FSMnode_list_len;
+  tmp[i++] = context->num_base_nodes;
+  tmp[i++] = context->FSMnode_freelist;
+  tmp[i++] = context->start_node;
+  tmp[i++] = context->end_node;
+  tmp[i++] = context->max_searchable_nodes;
+
+  tmp[i++] = context->beg_silence_word;
+  tmp[i++] = context->end_silence_word;
+  tmp[i++] = context->hack_silence_word;
+  tmp[i++] = context->hmm_ilabel_offset;
+
+  nfields = i;
+
+  if (pfwrite(tmp, sizeof(tmp[0]), nfields, fp) != nfields)
+    return ESR_WRITE_ERROR;
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("G2G done WR hdrs %d", pftell(fp));
+#endif
+
+#if defined(DO_ARCS_IO_IN_ARC_ORDER)
+  if( 1) {
+	 i = 0;
+     tmp[i++] = context->end_node;
+     tmp[i++] = MAXnodeID;
+     tmp[i++] = MAXmodelID;
+     tmp[i++] = MAXwordID;
+     tmp[i++] = FREEcostdata;
+     nfields = i;
+     if (pfwrite(tmp, sizeof(tmp[0]), nfields, fp) != nfields)
+        return ESR_WRITE_ERROR;
+  }
+  for(j=0; j<context->num_arcs; j++) {
+        arc = &context->FSMarc_list[j];
+        i = 0;
+        tmp[i++] = arc->fr_node;
+        tmp[i++] = arc->to_node;
+	ASSERT(arc->to_node == context->end_node || arc->to_node != MAXnodeID);
+        tmp[i++] = arc->ilabel;
+        tmp[i++] = arc->olabel;
+        tmp[i++] = arc->cost;
+        nfields = i;
+        if (pfwrite(tmp, sizeof(tmp[0]), nfields, fp) != nfields)
+          return ESR_WRITE_ERROR;
+  }
+#else
+  num_arcs_written = 0;
+  for (j = 0; j < context->num_nodes; j++) {
+    node = &context->FSMnode_list[j];
+    num_arcs = (arcID)num_arcs_leaving(context, node);
+    arcid = node->un_ptr.first_next_arc;
+    if (arcid == MAXarcID) {
+      i = 0;
+      tmp[i++] = (arcID)j;
+      tmp[i++] = MAXarcID;
+      tmp[i++] = MAXarcID;
+      tmp[i++] = MAXarcID;
+      tmp[i++] = MAXarcID;
+      nfields = i;
+      if (pfwrite(tmp, sizeof(tmp[0]), nfields, fp) != nfields)
+        return ESR_WRITE_ERROR;
+      /* num_arcs_written++; end node don't have a to-arc */
+    }
+    else {
+      for (; arcid != MAXarcID; arcid = arc->linkl_next_arc) {
+        arc = &context->FSMarc_list[arcid];
+        i = 0;
+        tmp[i++] = (arcID)j;
+        tmp[i++] = arc->to_node;
+	ASSERT(arc->to_node == context->end_node || arc->to_node != MAXnodeID);
+        tmp[i++] = arc->ilabel;
+        tmp[i++] = arc->olabel;
+        tmp[i++] = arc->cost;
+        nfields = i;
+        if (pfwrite(tmp, sizeof(tmp[0]), nfields, fp) != nfields)
+          return ESR_WRITE_ERROR;
+        num_arcs_written++;
+      }
+    }
+  }
+  ASSERT(num_arcs_written == context->num_arcs);
+#endif
+
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("G2G done WR arcs %d", pftell(fp));
+#endif
+
+  /* node info   .. will now be calculated on line */
+  /* wrapup_cost .. will now be calculated on line */
+
+  /* exit points for slots */
+  if (1)
+  {
+    srec_fsm_exit_point *p, *q;
+    if (pfwrite(&context->num_fsm_exit_points, 2, 1, fp) != 1)
+      return ESR_WRITE_ERROR;
+    p = context->fsm_exit_points;
+    q = p + MAX_NUM_SLOTS;
+    while (p < q)
+    {
+      if (pfwrite(&p->from_node_index, 2, 1, fp) != 1)
+        return ESR_WRITE_ERROR;
+      if (pfwrite(&p->arc_index, 2, 1, fp) != 1)
+        return ESR_WRITE_ERROR;
+      if (pfwrite(&p->wbto_node_index, 2, 1, fp) != 1)
+        return ESR_WRITE_ERROR;
+      ++p;
+    }
+  }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("G2G done WR exits %d", pftell(fp));
+#endif
+  /* no entry points stuff */
+
+  /* no saving ilabels */
+
+  /* now load the ilabels */
+  rc = serializeWordMapV2(context->olabels, fp);
+  if (rc != ESR_SUCCESS)
+    return rc;
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("G2G done WR wmap %d", pftell(fp));
+#endif
+
+  if (context->grmtyp != GrammarTypeItemList)
+  {
+    if (serializeArcTokenInfo(context, fp) != ESR_SUCCESS)
+    {
+      PLogError("FST_DumpContextAsImage: could not write arc token data.\n");
+      return FST_FAILED_INTERNAL;
+    }
+  }
+  else
+  {
+    /* nothing, at decoding time, we'll just construct the graph
+       from the word list, ie just this ..
+       0 1 0
+       1 2 4
+       ...
+       1 2 1316
+       2
+       ie
+       0 1 0
+       for(i=4;i<nwords;i++) { "1 2 i" }
+       2
+       because words 0-3 are eps,-pau-,-pau2-,slot@grammarname.grxml
+    */
+  }
+
+  /* Write header information. */
+  header[0] = pftell(fp);
+  header[1] = IMAGE_FORMAT_V2;
+
+  /* goto beginning of file. */
+  if (pfseek(fp, 0, SEEK_SET))
+  {
+    PLogError("FST_DumpContextAsImage: could not reposition for header.\n");
+    return FST_FAILED_INTERNAL;
+  }
+
+  if (pfwrite(header, 4, 2, fp) != 2)
+  {
+    PLogError("FST_DumpContextAsImage: Could not write header.\n");
+    return FST_FAILED_INTERNAL;
+  }
+
+  /* reset pointer at end of file. */
+  if (pfseek(fp, 0, SEEK_END))
+  {
+    PLogError("FST_DumpContextAsImage: could not reposition file pointer at end.\n");
+    return FST_FAILED_INTERNAL;
+  }
+
+  return FST_SUCCESS;
+}
+
+
+int FST_LoadContextFromImageV2(srec_context* fst, PFile* fp)
+{
+  asr_int32_t header[6];
+  arcID tmp[32], num_arcs, new_arc_id;
+  unsigned int i, nfields;
+  srec_fsm_exit_point *p, *q;
+  arcID max_num_FSMarcs;
+  nodeID max_num_FSMnodes;
+  FSMarc_ptr atok =  (FSMarc_ptr)0;
+  FSMarc *atoken = NULL;
+  FSMnode *fr_node, *to_node;
+  int rc = FST_SUCCESS;
+  ESR_ReturnCode esr_rc;
+  ESR_BOOL seenFinalNode = ESR_FALSE;
+
+  /* read header information. */
+  if (pfread(&header[2], sizeof(header[0]), 2, fp) != 2)
+  {
+    PLogError("FST_DumpContextAsImage: Could not read header.\n");
+    return FST_FAILED_INTERNAL;
+  }
+  fst->modelid = header[2];
+  fst->grmtyp  = header[3];
+
+  nfields = 16;
+  if (pfread(tmp, sizeof(tmp[0]), nfields, fp) != nfields)
+    return ESR_READ_ERROR;
+
+  /* arcs and nodes */
+  i = 0;
+  fst->num_arcs             = max_num_FSMarcs = tmp[i++];
+  fst->FSMarc_list_len      = tmp[i++];
+  fst->num_base_arcs        = tmp[i++];
+  fst->FSMarc_freelist      = tmp[i++];
+  fst->max_searchable_arcs  = tmp[i++] * 0; /*5*/
+  fst->num_nodes            = max_num_FSMnodes = tmp[i++];
+  fst->FSMnode_list_len     = tmp[i++];
+  fst->num_base_nodes       = tmp[i++];
+  fst->FSMnode_freelist     = tmp[i++];
+  fst->start_node           = tmp[i++];/*10*/
+  fst->end_node             = tmp[i++];
+  fst->max_searchable_nodes = tmp[i++] * 0;
+  fst->beg_silence_word     = tmp[i++];
+  fst->end_silence_word     = tmp[i++];
+  fst->hack_silence_word    = tmp[i++]; /*15*/
+  fst->hmm_ilabel_offset    = tmp[i++]; /* 16 */
+
+  fst->addWordCaching_lastslot_name = 0;
+  fst->addWordCaching_lastslot_num = MAXwordID;
+  fst->addWordCaching_lastslot_needs_post_silence = ESR_FALSE;
+
+  ASSERT(i == nfields);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("G2G done RD hdrs %d", pftell(fp));
+#endif
+
+  ASSERT(fst->num_arcs >= fst->num_base_arcs); // was ==
+  ASSERT(fst->num_nodes >= fst->num_base_nodes); // was ==
+
+  fst->FSMarc_list = (FSMarc*)CALLOC_CLR(fst->FSMarc_list_len, sizeof(FSMarc), "srec.graph.arcs");
+  if (!fst->FSMarc_list)
+  {
+    rc = FST_FAILED_ON_MEMORY;
+    PLogError("CALLOC_CLR fst->FSMarc_list \n");
+    goto CLEANUP;
+  }
+  fst->FSMnode_list = (FSMnode*)CALLOC_CLR(fst->FSMnode_list_len, sizeof(FSMnode), "srec.graph.nodes");
+  if (!fst->FSMnode_list)
+  {
+    rc = FST_FAILED_ON_MEMORY;
+    PLogError("CALLOC_CLR fst->FSMnode_list  failed\n");
+    goto CLEANUP;
+  }
+  fst->FSMnode_info_list = (FSMnode_info*)CALLOC_CLR(fst->FSMnode_list_len, sizeof(FSMnode_info), "srec.graph.nodeinfos");
+
+  if (!fst->FSMnode_info_list)
+  {
+    rc = FST_FAILED_ON_MEMORY;
+    PLogError("CALLOC_CLR fst->FSMnode_info_list failed\n");
+    goto CLEANUP;
+  }
+
+  /* setup the arc freelist */
+  fst->FSMarc_freelist = 0;
+  fst->num_arcs = 0;
+  for (i = 0; i < (unsigned)fst->FSMarc_list_len - 1; i++)
+  {
+    fst->FSMarc_list[i].linkl_next_arc = ARC_ItoX(i + 1);
+    fst->FSMarc_list[i].linkl_prev_arc = FSMARC_FREE;
+  }
+  fst->FSMarc_list[i].linkl_next_arc = FSMARC_NULL;
+  fst->FSMarc_list[i].linkl_prev_arc = FSMARC_FREE;
+
+  /* initialize the nodes, 'cuz reading is random order */
+  for (i = 0; i < max_num_FSMnodes; i++)
+  {
+    fr_node = &fst->FSMnode_list[i];
+    fr_node->un_ptr.first_next_arc = fr_node->first_prev_arc = FSMARC_NULL;
+  }
+
+  /* 1. first load up all the information */
+  num_arcs = 0;
+  for (i = 0; i < max_num_FSMarcs || !seenFinalNode; i++)
+  {
+    if (i > max_num_FSMarcs && !seenFinalNode)
+    {
+      PLogError("Final node never encountered");
+      rc = ESR_INVALID_STATE;
+      goto CLEANUP;
+    }
+	nfields = 5;
+    if (pfread(tmp,sizeof(tmp[0]),nfields,fp) != nfields)
+    {
+      PLogError("reading arc");
+      rc = ESR_INVALID_STATE;
+      goto CLEANUP;
+    }
+
+    if (tmp[1] == MAXnodeID)
+    {
+      seenFinalNode = ESR_TRUE;
+      if(fst->end_node != tmp[0]) {
+	PLogError("error with arc %d->%d ilabel %d olabel %d cost %d\n", tmp[0], tmp[1], tmp[2], tmp[3], tmp[4]);
+      ASSERT(fst->end_node == tmp[0]);
+      }
+      i--;
+    }
+    else
+    {
+      new_arc_id = fst_get_free_arc(fst);
+      if (new_arc_id == MAXarcID)
+        return FST_FAILED_ON_MEMORY;
+      atok = ARC_ItoX(new_arc_id);
+      atoken = ARC_XtoP(atok);
+      num_arcs++;
+
+      ASSERT(tmp[0] < fst->num_nodes);
+      ASSERT(tmp[1] < fst->num_nodes);
+      fr_node = &fst->FSMnode_list[ tmp[0]];
+      to_node = &fst->FSMnode_list[ tmp[1]];
+      atoken->ilabel = tmp[2];
+      atoken->olabel = tmp[3];
+      atoken->cost   = tmp[4];
+      append_arc_leaving_node(fst, fr_node, atok);
+      append_arc_arriving_node(fst, to_node, atok);
+      atoken->fr_node = NODE_ItoX(tmp[0]);
+      atoken->to_node = NODE_ItoX(tmp[1]);
+    }
+  }
+  ASSERT(fst->num_arcs == num_arcs);
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("G2G done RD arcs %d", pftell(fp));
+#endif
+
+  /* setup the node freelist */
+  if (fst->num_nodes < fst->FSMnode_list_len)
+  {
+    fst->FSMnode_freelist = fst->num_nodes;
+    for (i = fst->num_nodes; i < (unsigned)fst->FSMnode_list_len - 1; i++)
+    {
+      fst->FSMnode_list[i].un_ptr.next_node = NODE_ItoX(i + 1);
+      fst->FSMnode_list[i].first_prev_arc = FSMARC_FREE;
+    }
+    fst->FSMnode_list[i].un_ptr.next_node = FSMNODE_NULL;
+    fst->FSMnode_list[i].first_prev_arc = FSMARC_FREE;
+  }
+  else
+  {
+    fst->FSMnode_freelist = MAXnodeID;
+  }
+
+  /* node info   .. will now be calculated on line */
+  /* wrapup_cost .. will now be calculated on line */
+  fst->whether_prepared = 0;
+  fst_fill_node_info(fst);
+  for (i = 0; i < fst->num_nodes; i++)
+    fst->FSMnode_info_list[i] = NODE_INFO_UNKNOWN;
+
+  /* exit points for slots */
+  if (pfread(&fst->num_fsm_exit_points, 2, 1, fp) != 1)
+    return ESR_READ_ERROR;
+  p = fst->fsm_exit_points;
+  q = p + MAX_NUM_SLOTS;
+  while (p < q)
+  {
+    if (pfread(&p->from_node_index, 2, 1, fp) != 1)
+      return ESR_WRITE_ERROR;
+    if (pfread(&p->arc_index, 2, 1, fp) != 1)
+      return ESR_WRITE_ERROR;
+    if (pfread(&p->wbto_node_index, 2, 1, fp) != 1)
+      return ESR_WRITE_ERROR;
+    ++p;
+  }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("G2G done RD exits %d", pftell(fp));
+#endif
+
+  /* no entry points stuff */
+
+  /* ilabels were not saved, create them as empty */
+  fst->ilabels = (wordmap*)CALLOC_CLR(1, sizeof(wordmap), "srec.graph.imap");
+  fst->ilabels->num_words = fst->ilabels->max_words = 0;
+  fst->ilabels->words = 0;
+
+  /* now save the olabels */
+  esr_rc = deserializeWordMapV2(&fst->olabels, fp);
+  if (esr_rc != ESR_SUCCESS)
+  {
+    PLogError("deserializeWordMapV2() failed\n");
+    rc = FST_FAILED_INTERNAL;
+    goto CLEANUP;
+  }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("G2G done RD wmap %d", pftell(fp));
+#endif
+
+  /* arctokeninfo */
+  if (fst->grmtyp != GrammarTypeItemList)
+  {
+    if (deserializeArcTokenInfo(fst, fp) != ESR_SUCCESS)
+    {
+      PLogError("FST_DumpContextAsImage: could not write arc token data.\n");
+      rc = FST_FAILED_INTERNAL;
+      goto CLEANUP;
+    }
+  }
+  else
+  {
+    /* here we just construct an isolated list, but we should scrap it later */
+    wordID wdid;
+    arc_token *atl, *final, *atli;
+    fst->arc_token_list_len = fst->olabels->num_words + 2 - NUM_ITEMLIST_HDRWDS;
+    atl = NEW_ARRAY(arc_token, fst->arc_token_list_len, L("srec.graph.wordgraph"));
+    if(!atl) {
+      PLogError("fst->arc_token_list_len failed\n");
+      goto CLEANUP;
+    }
+    atl->first_next_arc = ARC_TOKEN_LNK(atl, 1);
+    atl->next_token_index = ARC_TOKEN_NULL;
+    final = atl + fst->arc_token_list_len - 1;
+    for (i = 1, wdid = NUM_ITEMLIST_HDRWDS; wdid < fst->olabels->num_words; i++, wdid++)
+    {
+      atli = &atl[i];
+      atli->ilabel = wdid;
+      atli->olabel = wdid;/*not used*/
+      atli->next_token_index = ARC_TOKEN_LNK(atl, (i + 1));
+      atli->first_next_arc = ARC_TOKEN_LNK(atl, (fst->arc_token_list_len - 1)); /*final*/
+    }
+    ASSERT(atl + i == final);
+    final->next_token_index = ARC_TOKEN_NULL;
+    final->first_next_arc = ARC_TOKEN_NULL;
+    final->ilabel = final->olabel = 0;
+    fst->arc_token_list = atl;
+  }
+  return FST_SUCCESS;
+CLEANUP:
+  return FST_FAILED_INTERNAL;
+}
+
+
+int FST_LoadContextFromImageV2(srec_context* context, PFile* fp);
+
+int FST_LoadContextFromImage(srec_context** pcontext, PFile* fp)
+{
+  srec_context* context = NULL;
+  /* used to force correct data alignment */
+  asr_int32_t header[2];
+  int rc = FST_SUCCESS;
+
+  /*printf("FST_LoadContexFromImage\n");*/
+  if (!fp)
+  {
+    PLogError("FST_LoadContextImage() failed; bad file pointer\n");
+    return FST_FAILED_ON_INVALID_ARGS;
+  }
+
+  context = NEW(srec_context, L("srec.graph.binary"));
+  if (context == NULL)
+  {
+    PLogError("FST_LoadContextFromImage: out of memory while allocating context.\n");
+    return FST_FAILED_ON_MEMORY;
+  }
+  memset(context, 0, sizeof(srec_context));
+
+  /* header */
+  if (pfread(header, 4, 2, fp) != 2)
+  {
+    PLogError("FST_LoadContextFromImage: failed reading header.\n");
+    rc = FST_FAILED_ON_INVALID_ARGS;
+    goto CLEANUP;
+  }
+
+  if (header[1] == IMAGE_FORMAT_V2)
+  {
+    rc = FST_LoadContextFromImageV2(context, fp);
+    if (rc != FST_SUCCESS)
+      goto CLEANUP;
+  }
+  else
+  {
+    PLogError("FST_LoadContextFromImage() failed on image_format\n");
+    goto CLEANUP;
+  }
+  *pcontext = context;
+  return FST_SUCCESS;
+CLEANUP:
+  if (context) FREE(context);
+  *pcontext = 0;
+  return rc;
+}
+
+
+int FST_DumpReverseWordGraph(srec_context* context, PFile* fp)
+{
+  /* not implemented, use FST_DumpSyntaxAsImage() for now */
+  return 1;
+}
+
+/* this belongs part of the srec_context */
+typedef struct
+{
+  asr_int32_t image_format;
+  asr_int32_t image_size;
+  asr_int32_t sizes_signature;
+}
+context_image_header;
+
+
+int FST_LoadContextFromStreamImage(srec_context** pcontext, char* buffer, asr_int32_t buffer_len)
+{
+  return FST_FAILED_INTERNAL;
+}
+
+typedef struct nodeID_list_t
+{
+  nodeID *nodes, num_nodes, num_alloc;
+}
+nodeID_list;
+
+int fst_node_has_speech_to_come(srec_context* context, nodeID node_index)
+{
+  /* recursive func ... try to keep stack use low! */
+  /* later we should cache this information:
+     need 2bits:  endn opte regl dunno */
+  FSMarc* arc;
+  arcID arc_index = context->FSMnode_list[ node_index].un_ptr.first_next_arc;
+  for (; arc_index != MAXarcID; arc_index = arc->linkl_next_arc)
+  {
+    arc = &context->FSMarc_list[arc_index];
+    if (arc->ilabel >= context->hmm_ilabel_offset + EPSILON_OFFSET + NUM_SILENCE_HMMS)
+    {
+      return 1;
+    }
+    else if (arc->ilabel < EPSILON_OFFSET)
+    {
+      if (fst_node_has_speech_to_come(context, arc->to_node))
+      {
+        return 1;
+      }
+    }
+    else if (IS_SILENCE_ILABEL(arc->ilabel, context))
+    {
+      /* another silence! */
+      if (fst_node_has_speech_to_come(context, arc->to_node))
+        return 1;
+    }
+  }
+  return 0;
+}
+
+int fst_fill_node_info(srec_context* context)
+{
+  char* infos = context->FSMnode_info_list;
+  nodeID_list optends_obj;
+  nodeID_list *optends = &optends_obj;
+
+  FSMnode* node;
+  FSMarc* arc;
+  nodeID i, j, node_index;
+  arcID arc_index;
+  costdata wrapup_cost;
+  int wrapup_cost_inconsistencies;
+  /* int num_near_end_nodes; nodes within EPS or silence to the end, these
+     are called NODE_INFO_ENDNODES, so that they can be excluded from the
+     comparison with end_node score in the eos detection */
+
+  optends->num_nodes    = 1;
+  optends->num_alloc    = 8192; /* scaled up from 512 to support dynamic grammar add word of 5000 */
+  optends->nodes        = (nodeID*)CALLOC(optends->num_alloc, sizeof(nodeID), "srec.tmp.optendnodes");
+  optends->nodes[0]     = context->end_node;
+  /* num_near_end_nodes = 0; */
+
+  for (i = 0; i < optends->num_nodes; i++)
+  {
+    node_index = optends->nodes[i];
+    node = &context->FSMnode_list[ node_index];
+    for (arc_index = node->first_prev_arc; arc_index != MAXarcID;
+         arc_index = arc->linkl_prev_arc)
+    {
+      arc = &context->FSMarc_list[arc_index];
+      if (arc->fr_node != node_index)
+      {
+
+        if (IS_SILENCE_ILABEL(arc->ilabel, context) || arc->ilabel < EPSILON_OFFSET)
+        {
+          /* ok, fr_node goes to the end via silence, check for dups */
+          for (j = 0; j < optends->num_nodes; j++)
+            if (optends->nodes[j] == arc->fr_node) break;
+          /* append it to the list */
+          if (j == optends->num_nodes)
+          {
+            if (optends->num_nodes < optends->num_alloc)
+              optends->nodes[ optends->num_nodes++] = arc->fr_node;
+            else
+            {
+              ASSERT(0 && "allocated too few optend nodes");
+              return 0;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /* now set the info array, default is regular */
+  for (i = 0; i < context->num_nodes; i++)
+    infos[i] = NODE_INFO_REGULAR;
+  /* also set the other nodes, we'll check whether nodes were added
+     via these flags */
+  for (; i < context->FSMnode_list_len; i++)
+    infos[i] = NODE_INFO_UNKNOWN;
+  infos[ context->end_node] = NODE_INFO_ENDNODE;
+
+  /* get rid of direct to end nodes, etc */
+  for (i = 0, j = 0; i < optends->num_nodes; i++)
+  {
+    optends->nodes[j] = optends->nodes[i];
+    if (fst_node_has_speech_to_come(context, optends->nodes[i]))
+    {
+      j++;
+      infos[ optends->nodes[i]] = NODE_INFO_OPTENDN;
+    }
+    else
+    {
+      infos[ optends->nodes[i]] = NODE_INFO_ENDNODE;
+      /* num_near_end_nodes++; */
+    }
+  }
+  optends->num_nodes = j;
+
+  /* printf("get_oppend_nodes (%d)", optends->num_nodes);
+     for(i=0; i<optends->num_nodes; i++) printf(" %d", optends->nodes[i]);
+     printf("\n");
+  */
+
+  FREE(optends->nodes);
+
+  /* find the wrapup cost */
+  node = &context->FSMnode_list[ context->end_node];
+  wrapup_cost = MAXcostdata;
+  wrapup_cost_inconsistencies = 0;
+  for (arc_index = node->first_prev_arc; arc_index != MAXarcID;
+       arc_index = arc->linkl_prev_arc)
+  {
+    arc = &context->FSMarc_list[ arc_index];
+    if (IS_SILENCE_ILABEL(arc->ilabel, context) &&
+        arc->olabel == context->end_silence_word)
+    {
+      if (wrapup_cost == MAXcostdata)
+        wrapup_cost = arc->cost;
+      else if (context->wrapup_cost != arc->cost)
+      {
+        wrapup_cost = arc->cost;
+        wrapup_cost_inconsistencies++;
+      }
+    }
+  }
+#define MIN_WRAPUP_COST 100
+  context->wtw_average = wrapup_cost;
+  if (context->wtw_average > 200)
+    context->wtw_average = 200;
+  if (context->wrapup_cost < MIN_WRAPUP_COST)
+    context->wrapup_cost = MIN_WRAPUP_COST;
+  /*log_report("context->wrapup_cost %d (%d)\n", context->wrapup_cost,
+    wrapup_cost_inconsistencies);*/
+  return 0;
+}
+
+int fst_alloc_transit_points(srec_context* context)
+{
+  arcID i;
+  wordID num_slots = context->olabels->num_slots;
+  wordID olabel;
+  asr_int16_t nfxps = 0;
+  FSMarc* arc;
+  FSMnode* node;
+
+  context->num_fsm_exit_points = 0;
+  /* slot 0 is invalid, it is the "eps", so num_slots==1 means no slots! */
+  if (num_slots == 1) 
+    return 0;
+
+  /* scan through to finds arc that carry rule references */
+  for (i = 0; i < context->num_arcs; i++)
+  {
+    olabel =  context->FSMarc_list[i].olabel;
+    /* (wordID)(olabel-1) < (num_slots-1) ?? might work */
+    if (olabel > 0 && olabel < num_slots)
+    {
+      context->FSMarc_list[i].cost = DISABLE_ARC_COST;
+      if (nfxps >= MAX_NUM_SLOTS)
+      {
+        PLogError("error: too many fsm exit points in fsm, too many public rules referenced from here\n");
+        return 0;
+      }
+      context->fsm_exit_points[nfxps].arc_index = i;
+      context->fsm_exit_points[nfxps].from_node_index = context->FSMarc_list[i].fr_node;
+      /* skip over the trailing silence and .wb labels */
+      for (arc = &context->FSMarc_list[i]; arc->ilabel != WORD_BOUNDARY;)
+      {
+        node = &context->FSMnode_list[arc->to_node];
+        arc =  &context->FSMarc_list[node->un_ptr.first_next_arc];
+      }
+      context->fsm_exit_points[nfxps].wbto_node_index = arc->to_node;
+      nfxps++;
+
+    } /* olabel<num_slots */
+  } /* i<num_arcs */
+  context->num_fsm_exit_points  = nfxps;
+  return 0;
+}
+
+
+/*
+  cross-word modeling:
+  for now we'll assume silence context on either side, later we'll create
+  a graph with the right fan out on the edges of each slot.  At that point we
+  may have routines like ... if(is_dead_end(arc)) continue;
+
+  word removal:
+  we'll use refcounters on arcs, we can search the whole graph for the
+  olabel, then remove forward and remove backwards
+
+  word addition:
+  glenville ^ hmm183 hmm222 hmm162 hmm246 hmm346 hmm191 hmm219
+
+  set imap=C:/users/dahan/speech2go/fst/enu_d2f_fray_g/model.map
+  set omap=C:/users/dahan/speech2go/fst/enu_d2f_fray_g/namesnnumsSC.map
+  wintel/debug/addword.exe -min
+  $SWISDK/bin/fsmcompileD -t -i $imap -o $omap -F out.PCLG out.PCLG.txt
+  $SWISDK/bin/fsmdrawD -i $imap -o $omap out.PCLG > out.PCLG.dot
+  dotty out.PCLG.dot
+
+  need
+  - a sanity check
+  - remove word
+  - multiple pronunciations handling
+  - homonyms handling, other boundary conditions checking
+  - measure the speed
+
+  alan_adams al~#ad}z
+  alan_adams al~ad}z
+  paul_adams p{l#ad}z
+
+
+
+*/
diff --git a/srec/crec/srec_debug.c b/srec/crec/srec_debug.c
new file mode 100644
index 0000000..55eac65
--- /dev/null
+++ b/srec/crec/srec_debug.c
@@ -0,0 +1,129 @@
+/*---------------------------------------------------------------------------*
+ *  srec_debug.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "srec_debug.h"
+#include "passert.h"
+#include "portable.h"
+#include "srec_tokens.h"
+
+
+char* sprint_altwords(srec* rec, altword_token* awtoken)
+{
+  static char buf[64];
+  char *bufp = &buf[0];
+
+  if (awtoken == AWTNULL) buf[0] = 0;
+  else
+  {
+    for (; awtoken; awtoken = awtoken->next_token)
+    {
+      bufp += sprintf(bufp, "%d,", awtoken->word);
+      ASSERT(awtoken->costdelta != MAXcostdata);
+    }
+    if (bufp > &buf[0]) *(bufp - 1) = 0;
+  }
+  return &buf[0];
+}
+
+void print_fsmnode_token(srec* rec, ftokenID token_index, char* msg)
+{
+  fsmnode_token *ftoken;
+  char word_backtrace_trans[512];
+  char *p;
+  if (token_index == MAXftokenID)
+  {
+    printf("%sftoken %d\n", msg, token_index);
+    return;
+  }
+  ftoken = &rec->fsmnode_token_array[token_index];
+#define SPRINT_ALTWORDS(rEc,aWt) sprint_altwords(rEc,aWt)
+  printf("%sftoken %d rec %d@%d fsmnode %d cost %d word %d(%s) word_backtrace %d next_token_index %d ", msg, token_index, rec->id, rec->current_search_frame, ftoken->FSMnode_index, ftoken->cost, ftoken->word,
+         SPRINT_ALTWORDS(rec, ftoken->aword_backtrace),
+         ftoken->word_backtrace, ftoken->next_token_index);         
+  
+  p = "null";
+  if (ftoken->word < rec->context->olabels->num_words)
+    p = rec->context->olabels->words[ftoken->word];
+  sprint_bword_token_backtrace(word_backtrace_trans, sizeof(word_backtrace_trans), rec, ftoken->word_backtrace);
+  printf(" [%s] %s\n", p, word_backtrace_trans);
+}
+
+void print_fsmnode_token_list(srec* rec, stokenID token_index, char* msg)
+{
+  printf(msg);
+  
+  while (token_index != MAXftokenID)
+  {
+    fsmnode_token* ftoken = &rec->fsmnode_token_array[token_index];
+    print_fsmnode_token(rec, token_index, "");
+    token_index = ftoken->next_token_index;
+  }
+}
+
+void print_search_status(srec* rec)
+{
+  int count, count2;
+  printf("SEARCH STATUS .. frame %d\n", rec->current_search_frame);
+  printf("prune_delta %d active_fsmarc_tokens %d\n",
+         rec->prune_delta, rec->active_fsmarc_tokens);
+  printf("num_new_states %d/%d fsmarc_token_array_size %d freelist %d\n", rec->num_new_states, rec->max_new_states, rec->fsmarc_token_array_size, rec->fsmarc_token_freelist);
+  printf("active_fsmnode_tokens %d num_models %d fsmnode_token_array_size %d freelist %d\n", rec->active_fsmnode_tokens, rec->num_model_slots_allocated, rec->fsmnode_token_array_size, rec->fsmnode_token_freelist);
+  count = count_fsmnode_token_list(rec, rec->active_fsmnode_tokens);
+  count2 = count_fsmarc_token_list(rec, rec->active_fsmarc_tokens);
+  printf("number active: %d fsmnodes %d fsmarcs\n", count, count2);
+}
+
+void print_fsmarc_token(srec* rec, stokenID token_index, char* msg)
+{
+  int i;
+  srec_context *context = rec->context;
+  
+  fsmarc_token* stoken = &rec->fsmarc_token_array[token_index];
+  FSMarc* arc = &context->FSMarc_list[stoken->FSMarc_index];
+  costdata* costs = &stoken->cost[0];
+  wordID* wordids = &stoken->word[0];
+	frameID* duration = &stoken->duration[0];
+  wtokenID* word_backtrace = &stoken->word_backtrace[0];
+  bigcostdata cost_offset = rec->accumulated_cost_offset[rec->current_search_frame-1];
+  char word_backtrace_trans[256];
+  
+  printf("%sstoken %4d at arc %4d ilabel %4d nextnode %4d states", msg, token_index,
+         stoken->FSMarc_index, arc->ilabel, arc->to_node);
+  for (i = 0; i < stoken->num_hmm_states; i++)
+  {
+    char *p = "null";
+    if (wordids[i] < context->olabels->num_words) p = context->olabels->words[wordids[i]];
+    sprint_bword_token_backtrace(word_backtrace_trans, 256, rec, word_backtrace[i]);
+    printf(" w%d(%s)/%s/c%d/C%d/B%d/%d(%s)", wordids[i],
+           SPRINT_ALTWORDS(rec, stoken->aword_backtrace[i]),
+           p, costs[i], costs[i] + cost_offset, word_backtrace[i], duration[i], word_backtrace_trans);
+  }
+  printf("\n");
+}
+
+void print_fsmarc_token_list(srec* rec, stokenID token_index, char* msg)
+{
+  printf(msg);
+  while (token_index != MAXstokenID)
+  {
+    fsmarc_token* stoken = &rec->fsmarc_token_array[token_index];
+    print_fsmarc_token(rec, token_index, "");
+    token_index = stoken->next_token_index;
+  }
+}
diff --git a/srec/crec/srec_debug.h b/srec/crec/srec_debug.h
new file mode 100644
index 0000000..87c3dfc
--- /dev/null
+++ b/srec/crec/srec_debug.h
@@ -0,0 +1,36 @@
+/*---------------------------------------------------------------------------*
+ *  srec_debug.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _SREC_DEBUG_H_
+#define _SREC_DEBUG_H_
+
+#include "srec.h"
+#include "word_lattice.h"
+
+void print_altword_token(srec* rec, altword_token* b, char* msg);
+#define sanity_check_altwords(ReC,aWtOkEn)
+
+
+void print_fsmnode_token(srec* rec, ftokenID token_index, char* msg);
+void print_fsmnode_token_list(srec* rec, stokenID token_index, char* msg);
+void print_search_status(srec* rec);
+void print_fsmarc_token(srec* rec, stokenID token_index, char* msg);
+void print_fsmarc_token_list(srec* rec, stokenID token_index, char* msg);
+
+#endif
diff --git a/srec/crec/srec_eosd.c b/srec/crec/srec_eosd.c
new file mode 100644
index 0000000..6b7a9b7
--- /dev/null
+++ b/srec/crec/srec_eosd.c
@@ -0,0 +1,260 @@
+/*---------------------------------------------------------------------------*
+ *  srec_eosd.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include"portable.h"
+#include"passert.h"
+#include"srec.h"
+#include"srec_eosd.h"
+#include"srec_context.h"
+#include"word_lattice.h"
+
+void srec_eosd_allocate(srec_eos_detector_parms** peosd,
+                        int eos_costdelta,
+                        int opt_eos_costdelta,
+                        int terminal_timeout,
+                        int optional_terminal_timeout,
+                        int non_terminal_timeout,
+                        int max_speech_duration)
+{
+  srec_eos_detector_parms* eosd;
+  eosd = (srec_eos_detector_parms*)CALLOC(1, sizeof(srec_eos_detector_parms), "search.endpointer");
+  eosd->eos_costdelta        = (frameID)eos_costdelta;
+  eosd->opt_eos_costdelta    = (frameID)opt_eos_costdelta;
+  eosd->endnode_timeout      = (frameID)terminal_timeout;
+  eosd->optendnode_timeout   = (frameID)optional_terminal_timeout;
+  eosd->internalnode_timeout = (frameID)non_terminal_timeout;
+  eosd->inspeech_timeout     = (frameID)max_speech_duration;
+  *peosd = eosd;
+}
+
+void srec_eosd_destroy(srec_eos_detector_parms* eosd)
+{
+  FREE(eosd);
+}
+
+/* The current algorithm does not make use of most of the frmcnt counters,
+   rather we look at the eos frame from the final end node search state
+   and comparrer with the current frame.  The new method is less sensitive
+   to background noise.
+
+   The 1.9 method had a blatant bug in that we were reseting the optend_frmnt
+   when there were no live alternative tokens, ie xftoken == NUL was causing
+   reset!
+*/
+
+void srec_eosd_state_reset(srec_eos_detector_state* eosd_state)
+{
+  eosd_state->endnode_frmcnt = 0;
+  eosd_state->optendnode_frmcnt = 0;
+  eosd_state->internalnode_frmcnt = 0;
+  eosd_state->inspeech_frmcnt = 0;
+  eosd_state->internalnode_node_index = MAXnodeID;
+}
+
+EOSrc srec_check_end_of_speech_end(srec* rec)
+{
+  EOSrc rc = SPEECH_MAYBE_ENDED;
+  return rc;
+}
+
+EOSrc srec_check_end_of_speech(srec_eos_detector_parms* eosd_parms, srec* rec)
+{
+  nodeID end_node;
+  EOSrc rc = VALID_SPEECH_CONTINUING;
+  bigcostdata eos_cost_margin;
+  bigcostdata opteos_cost_margin;
+  word_token* last_wtoken;
+  int nframes_since_eos;
+  
+  fsmnode_token *ftoken, *eftoken, *oeftoken, *xftoken;
+  ftokenID ftoken_index, eftoken_index, oeftoken_index, xftoken_index;
+  costdata wrapup_cost = rec->context->wrapup_cost;
+  srec_eos_detector_state* eosd_state = &rec->eosd_state;
+  
+  if (rec->current_search_frame == 1)
+    srec_eosd_state_reset(eosd_state);
+    
+  end_node = rec->context->end_node;
+  eftoken_index = rec->best_token_for_node[ end_node];
+  if (eftoken_index != MAXftokenID)
+    eftoken = &rec->fsmnode_token_array[ eftoken_index];
+  else
+    eftoken = NULL;
+    
+  xftoken_index  = rec->current_best_ftoken_index[NODE_INFO_REGULAR];
+  if (xftoken_index != MAXftokenID)
+    xftoken = &rec->fsmnode_token_array[ xftoken_index];
+  else
+    xftoken = NULL;
+    
+  oeftoken_index = rec->current_best_ftoken_index[NODE_INFO_OPTENDN];
+  if (oeftoken_index != MAXftokenID)
+    oeftoken = &rec->fsmnode_token_array[ oeftoken_index];
+  else
+    oeftoken = NULL;
+    
+    
+  if (rec->srec_ended)
+    rc = SPEECH_MAYBE_ENDED;
+  else if (rec->current_search_frame >= rec->word_lattice->max_frames - 1
+           || rec->current_search_frame >= eosd_parms->inspeech_timeout)
+  {
+    /* here we will need to differentiate max_frames from
+       num_frames_allocated */
+    if (eftoken_index != MAXftokenID)
+      rc = SPEECH_ENDED;
+    else
+      rc = SPEECH_TOO_LONG;
+  }
+  else
+  {
+  
+    /* reset the internal counter? */
+    ftoken_index = rec->current_best_ftoken_index[NODE_INFO_REGULAR];
+    if (ftoken_index != MAXftokenID)
+    {
+      ftoken = &rec->fsmnode_token_array[ ftoken_index];
+      if (eosd_state->internalnode_node_index != ftoken->FSMnode_index)
+      {
+        eosd_state->internalnode_node_index = ftoken->FSMnode_index;
+        eosd_state->internalnode_frmcnt = 1;
+      }
+      else
+      {
+        if (ftoken->word != rec->context->beg_silence_word)
+          eosd_state->internalnode_frmcnt++;
+      }
+    }
+    else
+    {
+      eosd_state->internalnode_frmcnt = 1;
+      eosd_state->internalnode_node_index = MAXnodeID;
+    }
+    
+    /* nframes since eos */
+    if (eftoken)
+    {
+      last_wtoken = NULL;
+      if (eftoken->word_backtrace != MAXwtokenID)
+      {
+        last_wtoken = &rec->word_token_array[eftoken->word_backtrace];
+        nframes_since_eos = rec->current_search_frame - last_wtoken->end_time;
+      }
+      else
+        nframes_since_eos = 0;
+    }
+    else
+      nframes_since_eos = 0;
+      
+    /* eos cost margin */
+    if (!eftoken)
+    {
+      eos_cost_margin = 0;
+    }
+    else if (!oeftoken && !xftoken)
+    {
+      eos_cost_margin = MAXcostdata;
+    }
+    else if (!oeftoken)
+    {
+      eos_cost_margin = xftoken->cost + wrapup_cost - eftoken->cost;
+    }
+    else if (!xftoken)
+    {
+      eos_cost_margin = oeftoken->cost + wrapup_cost - eftoken->cost;
+    }
+    else if (oeftoken->cost > eftoken->cost)
+    {
+      eos_cost_margin = xftoken->cost + wrapup_cost - eftoken->cost;
+    }
+    else
+    { /* if(oeftoken->cost < eftoken->cost) */
+      eos_cost_margin = oeftoken->cost + wrapup_cost - eftoken->cost;
+    }
+    
+    /* opteos cost margin */
+    if (!eftoken)
+    {
+      opteos_cost_margin = 0;
+    }
+    else if (!oeftoken)
+    {
+      opteos_cost_margin = 0;
+    }
+    else if (!xftoken)
+    {
+      opteos_cost_margin = MAXcostdata;
+    }
+    else
+    {
+      opteos_cost_margin = xftoken->cost + wrapup_cost - eftoken->cost;
+    }
+    
+    if (eftoken)
+    {
+      if (oeftoken && nframes_since_eos > eosd_parms->optendnode_timeout
+          && opteos_cost_margin > eosd_parms->eos_costdelta)
+      {
+        rc = SPEECH_ENDED;
+        
+      }
+      else if (!oeftoken && nframes_since_eos > eosd_parms->endnode_timeout
+               && eos_cost_margin > eosd_parms->eos_costdelta)
+      {
+        rc = SPEECH_ENDED;
+        
+      }
+      else if (nframes_since_eos > eosd_parms->optendnode_timeout
+               && eos_cost_margin > eosd_parms->eos_costdelta)
+      {
+        rc = SPEECH_ENDED;
+        
+      }
+      else
+      {
+        rc = VALID_SPEECH_CONTINUING;
+      }
+    }
+    
+    /* reached internal timeout, ie at same node for so long? */
+    if (eosd_state->internalnode_frmcnt >= eosd_parms->internalnode_timeout)
+    {
+      /* PLogMessage("eosd_state->internalnode_frmcnt %d eosd_parms->internalnode_timeout %d\n", eosd_state->internalnode_frmcnt, eosd_parms->internalnode_timeout); */
+      ftoken_index = rec->current_best_ftoken_index[NODE_INFO_REGULAR];
+      ftoken = &rec->fsmnode_token_array [ ftoken_index];
+      /* sprintf(buf, "eos rec%d@%d,%d i%d> ", rec->id,
+      rec->current_search_frame, ftoken->FSMnode_index,
+      eosd_state->internalnode_frmcnt);
+      PLogMessage(buf); 
+      sprint_word_token_backtrace(buf,sizeof(buf),rec,ftoken->word_backtrace);
+      PLogMessage(" %s\n", buf); */
+      rc = SPEECH_ENDED;
+    }
+  }
+  
+  /* the endnode will never win against an optend node because
+     the cost at endnode is the same or worse (even wrapup_cost adjustment) */
+  
+  
+  
+  /* so we need to check for optend nodes separately here
+     but we really need to remember best_optendnode_index, best_endnode_index
+     best_nonendnode_index */
+  return rc;
+}
diff --git a/srec/crec/srec_initialize.c b/srec/crec/srec_initialize.c
new file mode 100644
index 0000000..47e50f7
--- /dev/null
+++ b/srec/crec/srec_initialize.c
@@ -0,0 +1,236 @@
+/*---------------------------------------------------------------------------*
+ *  srec_initialize.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _RTT
+#include "pstdio.h"
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "passert.h"
+
+#include "portable.h"
+
+#include "hmm_desc.h"
+#include "utteranc.h"
+#include "hmmlib.h"
+
+#include "srec_sizes.h"
+#include "srec.h"
+#include "word_lattice.h"
+#include "swimodel.h"
+
+#include "c42mul.h"
+
+/*this file contains code which handles the initialization of the srec data structures*/
+
+/*allocates an srec -
+
+input args come from config and are:
+
+    int         viterbi_prune_thresh;  score-based pruning threshold - only keep paths within this delta of best cost
+
+    int         max_hmm_tokens;       controls the maximum number of HMM's alive in any frame.  If number
+     exceeded, pruning gets tightened.  So, this threshold can be used
+     to tradeoff accuracy for computation an memory
+    int         max_fsmnode_tokens;   controls the maximum number of FSMs alive in any frame.  If number,
+     exceeded, pruning gets tightened.  So, this threshold can be used
+     to tradeoff accuracy for computation an memory
+    int         max_word_tokens;      controls the maximum number of word tokens kept in the word lattice.
+     if number exceeded, the word lattice is pruned more tightly (less word
+     ends per frame
+
+    int         max_altword_tokens;     controls the maximum number of alternative paths to propagate for proper nbest
+
+    int         num_wordends_per_frame; controls the size of the word lattice - the number of word ends to
+       keep at each time frame
+    int         max_fsm_nodes;        allocation size of a few arrays in the search - needs to be big enough
+     to handle any grammar that the search needs to run.  Initialization fails
+     if num exceeded
+    int         max_fsm_arcs;         allocation size of a few arrays in the search - needs to be big enough
+     to handle any grammar that the search needs to run.  Initialization fails
+     if num exceeded
+
+*/
+
+static void allocate_recognition1(srec *rec,
+                                  int viterbi_prune_thresh,  /*score-based pruning threshold - only keep paths within this delta of best cost*/
+                                  int max_hmm_tokens,
+                                  int max_fsmnode_tokens,
+                                  int max_word_tokens,
+                                  int max_altword_tokens,
+                                  int num_wordends_per_frame,
+                                  int max_frames,
+                                  int max_model_states)
+{
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage("allocating recognition arrays2 prune %d max_hmm_tokens %d max_fsmnode_tokens %d max_word_tokens %d max_altword_tokens %d max_wordends_per_frame %d\n",
+              viterbi_prune_thresh,
+              max_hmm_tokens,
+              max_fsmnode_tokens,
+              max_word_tokens,
+              max_altword_tokens,
+              num_wordends_per_frame);
+#endif
+  rec->current_model_scores = (costdata*) CALLOC_CLR(max_model_states, sizeof(costdata), "search.srec.current_model_scores"); /*FIX - either get NUM_MODELS from acoustic models, or check this someplace to make sure we have enough room*/
+  rec->num_model_slots_allocated = (modelID)max_model_states;
+
+  rec->fsmarc_token_array_size = (stokenID)max_hmm_tokens;
+
+  rec->fsmarc_token_array = (fsmarc_token*) CALLOC_CLR(rec->fsmarc_token_array_size , sizeof(fsmarc_token), "search.srec.fsmarc_token_array");
+  rec->max_new_states = (stokenID)max_hmm_tokens;
+
+  rec->word_token_array = (word_token*) CALLOC_CLR(max_word_tokens, sizeof(word_token), "search.srec.word_token_array");
+  rec->word_token_array_size = (wtokenID)max_word_tokens;
+  /* todo: change this to a bit array later */
+  rec->word_token_array_flags = (asr_int16_t*) CALLOC_CLR(max_word_tokens, sizeof(asr_int16_t), "search.srec.word_token_array_flags");
+
+  rec->fsmnode_token_array = (fsmnode_token*) CALLOC_CLR(max_fsmnode_tokens, sizeof(fsmnode_token), "search.srec.fsmnode_token_array");
+  rec->fsmnode_token_array_size = (ftokenID)max_fsmnode_tokens;
+
+  rec->altword_token_array = (altword_token*) CALLOC_CLR(max_altword_tokens, sizeof(altword_token), "search.srec.altword_token_array");
+  rec->altword_token_array_size = (wtokenID)max_altword_tokens;
+
+  rec->prune_delta = (costdata)viterbi_prune_thresh;
+
+  rec->max_frames   = (frameID)max_frames;
+  rec->best_model_cost_for_frame = (costdata*)CALLOC_CLR(max_frames, sizeof(costdata), "search.srec.best_model_cost_for_frame");
+  rec->word_lattice = allocate_word_lattice((frameID)max_frames);
+
+  rec->word_priority_q = allocate_priority_q(num_wordends_per_frame);
+  rec->best_fsmarc_token = MAXstokenID;
+
+#define ASTAR_NBEST_LEN 10
+  rec->astar_stack = astar_stack_make(rec, ASTAR_NBEST_LEN);
+  rec->context = NULL;
+}
+
+static int check_parameter_range(int parval, int parmin, int parmax, const char* parname)
+{
+  if (parval > parmax)
+  {
+    log_report("Error: %s value %d is out-of-range [%d,%d]\n", parname,
+               parval, parmin, parmax);
+    return 1;
+  }
+  else
+  {
+    return 0;
+  }
+}
+
+int allocate_recognition(multi_srec *rec,
+                         int viterbi_prune_thresh,  /*score-based pruning threshold - only keep paths within this delta of best cost*/
+                         int max_hmm_tokens,
+                         int max_fsmnode_tokens,
+                         int max_word_tokens,
+                         int max_altword_tokens,
+                         int num_wordends_per_frame,
+                         int max_fsm_nodes,
+                         int max_fsm_arcs,
+                         int max_frames,
+                         int max_model_states,
+                         int max_searches)
+{
+  int i;
+
+  if (check_parameter_range(max_fsm_nodes, 1, MAXnodeID, "max_fsm_nodes"))
+    return 1;
+  if (check_parameter_range(max_fsm_arcs, 1, MAXarcID, "max_fsm_arcs"))
+    return 1;
+  if (check_parameter_range(max_frames, 1, MAXframeID, "max_frames"))
+    return 1;
+  if (check_parameter_range(max_model_states, 1, MAXmodelID, "max_model_states"))
+    return 1;
+  if (check_parameter_range(max_hmm_tokens, 1, MAXstokenID, "max_hmm_tokens"))
+    return 1;
+  if (check_parameter_range(max_fsmnode_tokens, 1, MAXftokenID, "max_fsmnode_tokens"))
+    return 1;
+  if (check_parameter_range(viterbi_prune_thresh, 1, MAXcostdata, "viterbi_prune_thresh"))
+    return 1;
+  if (check_parameter_range(max_altword_tokens, 0, MAXftokenID, "max_altword_tokens"))
+    return 1;
+  if (check_parameter_range(max_searches, 1, 2, "max_searches"))
+    return 1;
+
+  rec->rec = (srec*)CALLOC_CLR(max_searches, sizeof(srec), "search.srec.base");
+  rec->num_allocated_recs = max_searches;
+  rec->num_swimodels      = 0;
+
+  /* best_token_for_arc and best_token_for_node are shared across
+     multiple searches */
+  rec->best_token_for_arc = (stokenID*)CALLOC_CLR(max_fsm_arcs, sizeof(stokenID), "search.srec.best_token_for_arc");
+  rec->max_fsm_arcs = (arcID)max_fsm_arcs;
+
+  rec->best_token_for_node = (ftokenID*)CALLOC_CLR(max_fsm_nodes, sizeof(ftokenID), "search.srec.best_token_for_node");
+  rec->max_fsm_nodes = (nodeID)max_fsm_nodes;
+
+  /* cost offsets and accumulated cost offsets are pooled for all
+     different searches, this saves memory and enables each search
+     to know it's total scores */
+  rec->cost_offset_for_frame = (costdata*)CALLOC_CLR(max_frames, sizeof(costdata), "search.srec.current_best_costs");
+  rec->accumulated_cost_offset = (bigcostdata*)CALLOC_CLR(max_frames, sizeof(bigcostdata), "search.srec.accumulated_cost_offset");
+  rec->max_frames = (frameID)max_frames;
+  for (i = 0; i < max_frames; i++)
+    rec->accumulated_cost_offset[i] = 0;
+
+  /* now copy the shared data down to individual recogs */
+  for (i = 0; i < rec->num_allocated_recs; i++)
+  {
+    allocate_recognition1(&rec->rec[i], viterbi_prune_thresh, max_hmm_tokens, max_fsmnode_tokens, max_word_tokens, max_altword_tokens, num_wordends_per_frame, max_frames, max_model_states);
+    rec->rec[i].best_token_for_node     = rec->best_token_for_node;
+    rec->rec[i].max_fsm_nodes           = rec->max_fsm_nodes;
+    rec->rec[i].best_token_for_arc      = rec->best_token_for_arc;
+    rec->rec[i].max_fsm_arcs            = rec->max_fsm_arcs;
+    rec->rec[i].max_frames              = rec->max_frames;
+    rec->rec[i].cost_offset_for_frame   = rec->cost_offset_for_frame;
+    rec->rec[i].accumulated_cost_offset = rec->accumulated_cost_offset;
+    rec->rec[i].id = (asr_int16_t)i;
+  }
+  rec->eos_status = VALID_SPEECH_NOT_YET_DETECTED;
+  return 0;
+}
+
+
+static void free_recognition1(srec *rec)
+{
+  FREE(rec->current_model_scores);
+  FREE(rec->fsmarc_token_array);
+  FREE(rec->word_token_array);
+  FREE(rec->word_token_array_flags);
+  FREE(rec->fsmnode_token_array);
+  FREE(rec->altword_token_array);
+  FREE(rec->best_model_cost_for_frame);
+  destroy_word_lattice(rec->word_lattice);
+  free_priority_q(rec->word_priority_q);
+  astar_stack_destroy(rec);
+}
+
+void free_recognition(multi_srec *rec)
+{
+  int i;
+  for (i = 0; i < rec->num_allocated_recs; i++)
+    free_recognition1(&rec->rec[i]);
+  FREE(rec->accumulated_cost_offset);
+  FREE(rec->cost_offset_for_frame);
+  FREE(rec->best_token_for_node);
+  FREE(rec->best_token_for_arc);
+  FREE(rec->rec);
+}
+
diff --git a/srec/crec/srec_results.c b/srec/crec/srec_results.c
new file mode 100644
index 0000000..6c5a200
--- /dev/null
+++ b/srec/crec/srec_results.c
@@ -0,0 +1,482 @@
+/*---------------------------------------------------------------------------*
+ *  srec_results.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include"passert.h"
+
+#include"portable.h"
+#include"srec.h"
+#include"search_network.h"
+#include"srec_stats.h"
+#if USE_COMP_STATS
+#include"comp_stats.h"
+#endif
+#include"srec_results.h"
+
+static srec* WHICH_RECOG(multi_srec* recm)
+{
+  srec* return_rec = NULL;
+  costdata current_best_cost = MAXcostdata;
+  int i = 0;
+#if DO_ALLOW_MULTIPLE_MODELS
+  for (i = 0; i < recm->num_activated_recs; i++)
+  {
+#endif
+    if (current_best_cost > recm->rec[i].current_best_cost)
+    {
+      current_best_cost = recm->rec[i].current_best_cost;
+      return_rec = &recm->rec[i];
+    }
+#if DO_ALLOW_MULTIPLE_MODELS
+  }
+#endif
+  return return_rec;
+}
+
+int srec_get_bestcost_recog_id(multi_srec* recm, int* id)
+{
+  srec* rec = WHICH_RECOG(recm);
+  if (!rec) *id = -1;
+  else *id = rec->id;
+  return 0;
+}
+
+void srec_result_strip_slot_markers(char* result)
+{
+  if (!result) return;
+  else
+  {
+    char *p = result, *q = p;
+    for (; (*q = *p); q++, p++)
+    {
+      if (p[0] == IMPORTED_RULES_DELIM && (p[2] == ' ' || p[2] == '\0'))
+      {
+        p += 2;
+        *q = *p;
+      }
+    }
+  }
+}
+
+int srec_has_results(multi_srec* recm)
+{
+  srec* rec = WHICH_RECOG(recm);
+  frameID end_frame;
+  if (!rec)
+    return 0;
+  end_frame = rec->current_search_frame;
+  if (!rec->srec_ended)
+    return 0;
+  if (rec->word_lattice->words_for_frame[end_frame] != MAXwtokenID)
+    return 1;
+  if (rec->astar_stack->num_complete_paths)
+    return 1;
+  return 0;
+}
+
+int srec_clear_results(multi_srec* recm)
+{
+  srec* rec = WHICH_RECOG(recm);
+  frameID ifr;
+  SREC_STATS_SHOW();
+  SREC_STATS_CLEAR();
+
+  if (!rec)
+    return 1;
+  astar_stack_clear(rec->astar_stack);
+  for (ifr = 0; ifr <= rec->current_search_frame; ifr++)
+    rec->word_lattice->words_for_frame[ifr] = MAXwtokenID;
+
+  return 0;
+}
+
+void* srec_nbest_prepare_list(multi_srec* recm, int n, asr_int32_t* bestcost)
+{
+  int rc;
+  srec* rec = WHICH_RECOG(recm);
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+
+  if (!stack)
+    return NULL;
+#if USE_COMP_STATS
+  start_cs_clock1(&comp_stats->astar);
+#endif
+  rc = astar_stack_prepare(stack, n, rec);
+  if (rc)
+  {
+    *bestcost = MAXbcostdata;
+    return (void*)rec;
+  }
+  astar_stack_do_backwards_search(rec, n);
+#if USE_COMP_STATS
+  end_cs_clock1(&comp_stats->astar, 1);
+#endif
+  if (stack->num_complete_paths)
+  {
+    *bestcost = stack->complete_paths[0]->costsofar;
+  }
+  else
+  {
+    *bestcost = MAXbcostdata;
+  }
+
+  return (void*)(rec);
+}
+
+void srec_nbest_destroy_list(void* rec_void)
+{
+  srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+  astar_stack_clear(stack);
+}
+
+int srec_nbest_get_num_choices(void* rec_void)
+{
+  srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+  return stack ? stack->num_complete_paths : 0;
+}
+
+int srec_nbest_put_confidence_value(void* rec_void, int choice, int confidence_value)
+{
+  srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+  if (!stack)
+  {
+	  return 1;
+  }
+  else
+  {
+  stack->complete_path_confidences[choice] = confidence_value;
+  return 0;
+  }
+}
+
+int srec_nbest_get_confidence_value(void* rec_void, int choice)
+{
+  srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+  return stack->complete_path_confidences[choice];
+}
+
+int srec_nbest_fix_homonym_confidence_values(void* rec_void)
+{
+  int i, num_fixed = 0;
+  srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+  if (!stack)
+    return num_fixed;
+  for(i=1; i<stack->num_complete_paths; i++) {
+    partial_path* parp = stack->complete_paths[i];
+    for (; parp; parp = parp->next) {
+      word_token* wtoken = &rec->word_token_array[ parp->token_index];
+      if(WORD_TOKEN_GET_HOMONYM( wtoken)) {
+        stack->complete_path_confidences[i] = stack->complete_path_confidences[i-1];
+        num_fixed++;
+        break;
+      }
+    }
+  }
+  return num_fixed;
+}
+
+LCHAR* srec_nbest_get_word(void* nbest, size_t choice)
+{
+  srec* rec = (srec*)nbest;
+  return rec->context->olabels->words[choice];
+}
+
+int srec_nbest_remove_result(void* rec_void, int n)
+{
+  int i;
+  srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+
+
+  if (!stack || n < 0 || n >= stack->num_complete_paths)
+  {
+    return 0; /* out of range error */
+  }
+
+  /* free the partial_path which represents the entry */
+  free_partial_path(stack, stack->complete_paths[n]);
+
+  /* now I need to move everybody up one so I do not have a hole
+     in the middle of my nbest list */
+  for (i = n + 1 ; i < stack->num_complete_paths; i++)
+    stack->complete_paths[i-1] = stack->complete_paths[i];
+  stack->complete_paths[i-1] = 0; /* empty the last one */
+
+  /* finally change the size of my nbest list */
+  stack->num_complete_paths--;
+
+  return 1;
+}
+
+ESR_ReturnCode srec_nbest_get_resultWordIDs(void* rec_void, size_t index, wordID* wordIDs, size_t* len, asr_int32_t* cost)
+{
+  const srec* rec = (srec*) rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+  partial_path* parp;
+  wordID id;
+  size_t currentLen = 0;
+
+  if (!stack || index >= (size_t) stack->num_complete_paths)
+  {
+    if (wordIDs) *wordIDs = MAXwordID;
+    if (len) *len = 0;
+    *cost = MAXbcostdata;
+    return ESR_ARGUMENT_OUT_OF_BOUNDS; /* out of range error */
+  }
+
+  parp = stack->complete_paths[index];
+  *cost = stack->complete_paths[index]->costsofar;
+  if (len == NULL || wordIDs == NULL)
+    return ESR_SUCCESS;
+  if (parp && parp->word == rec->context->beg_silence_word)
+    parp = parp->next;
+  while (parp)
+  {
+    id = parp->word;
+    if (id == rec->context->end_silence_word)
+      break;
+
+    if (currentLen >= *len)
+    {
+      *wordIDs = MAXwordID;
+      *len = currentLen + 1;
+      return ESR_BUFFER_OVERFLOW; /* too little space error */
+    }
+    *wordIDs = id;
+    ++wordIDs;
+    ++currentLen;
+    parp = parp->next;
+  }
+  --currentLen;
+
+  if (currentLen >= *len)
+  {
+    *wordIDs = MAXwordID;
+    *len = currentLen + 1;
+    return ESR_BUFFER_OVERFLOW; /* too little space error */
+  }
+  *wordIDs = MAXwordID;
+  *len = currentLen + 1;
+  return ESR_SUCCESS;
+}
+
+int srec_nbest_get_result(void* rec_void, int n, char* label, int label_len, asr_int32_t* cost, int whether_strip_slot_markers)
+{
+  const srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+  partial_path* parp;
+  word_token* wtoken;
+  int return_len;
+
+  if (!stack || n < 0 || n >= stack->num_complete_paths)
+  {
+    *label = 0;
+    *cost = MAXbcostdata;
+    return 1; /* out of range error */
+  }
+
+  return_len = 0;
+  parp = stack->complete_paths[n];
+  *cost = stack->complete_paths[n]->costsofar;
+  for (; parp; parp = parp->next)
+  {
+    const char *p;
+    int lenp;
+    wtoken = &rec->word_token_array[ parp->token_index];
+    p = "NULL";
+    if (rec->context->olabels->words[wtoken->word])
+      p = rec->context->olabels->words[wtoken->word];
+    if (!strcmp(p, "-pau2-"))
+      break;
+
+    lenp = (char)strlen(p);
+    if (return_len + lenp >= label_len)
+    {
+      *label = 0;
+      return 1; /* too little space error */
+    }
+    strcpy(label + return_len, p);
+    return_len += lenp;
+    if (whether_strip_slot_markers)
+    {
+      if (label[return_len-2] == IMPORTED_RULES_DELIM)
+      {
+        label[return_len-2] = 0;
+        return_len -= 2;
+      }
+    }
+
+#define SHOW_END_TIMES 1
+#if SHOW_END_TIMES
+    {
+      char et[16];
+      lenp = sprintf(et, "@%d", wtoken->end_time);
+      if (return_len + lenp >= label_len)
+        return 0;
+      strcpy(label + return_len, et);
+      return_len += lenp;
+    }
+#endif
+    lenp = 1;
+    if (return_len + lenp >= label_len)
+      return 0; /* too little space error */
+    strcpy(label + return_len, " ");
+    return_len += lenp;
+  }
+  *(label + return_len) = 0;
+  return 0;
+}
+
+int srec_nbest_get_choice_info(void* rec_void, int ibest, asr_int32_t* infoval, char* infoname)
+{
+  srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+
+  if (!stack)
+    return 1;
+
+  if (ibest < 0 || ibest >= stack->num_complete_paths)
+    return 1;
+
+  /*!strcmp(infoname,"num_speech_frames")||
+    !strcmp(infoname,"speech_frames_cost"))*/
+  if (1)
+  {
+    partial_path* parp = stack->complete_paths[ibest];
+    frameID start_frame = MAXframeID;
+    frameID i, end_frame = MAXframeID;
+    frameID num_speech_frames;
+    bigcostdata speech_frames_cost, start_cost = 0, end_cost = 0;
+    word_token* wtoken;
+    frameID num_words;
+
+    for (num_words = 0 ; parp; parp = parp->next)
+    {
+      if (parp->token_index == MAXwtokenID) break;
+      wtoken = &rec->word_token_array[ parp->token_index];
+      if (wtoken->word == rec->context->beg_silence_word)
+      {
+        start_frame = wtoken->end_time;
+        start_cost = wtoken->cost + rec->accumulated_cost_offset[ start_frame];
+        num_words--;
+      }
+      else if (parp->next &&
+               parp->next->token_index != MAXwtokenID &&
+               rec->word_token_array[ parp->next->token_index].word == rec->context->end_silence_word)
+      {
+        end_frame = wtoken->end_time;
+        end_cost = wtoken->cost + rec->accumulated_cost_offset[ end_frame];
+        num_words--;
+      }
+      num_words++;
+    }
+
+    if (start_frame != MAXframeID && end_frame != MAXframeID)
+    {
+      num_speech_frames = (frameID)(end_frame - start_frame);
+      speech_frames_cost = end_cost - start_cost;
+#define WTW_AT_NNREJ_TRAINING 40
+      speech_frames_cost = speech_frames_cost - (num_words + 1) * (rec->context->wtw_average - WTW_AT_NNREJ_TRAINING);
+      if (!strcmp(infoname,  "num_speech_frames"))
+        *infoval = num_speech_frames;
+      else if (!strcmp(infoname, "speech_frames_cost"))
+        *infoval = speech_frames_cost;
+      else if (!strcmp(infoname, "gsm_states_score_diff"))
+      {
+        /* this is the best cost, unconstrained by state sequence */
+        bigcostdata gsm_states_cost = 0;
+        for (i = start_frame + 1; i <= end_frame; i++)
+        {
+          gsm_states_cost += rec->cost_offset_for_frame[i];
+          *infoval = (asr_int32_t)speech_frames_cost - (asr_int32_t)gsm_states_cost;
+        }
+      }
+      else if (!strcmp(infoname, "gsm_words_score_diff"))
+      {
+        /* this is the best cost, unconstrained by word sequence */
+        /* we can do this with astar.c ... with some work */
+        *infoval = 0;
+      }
+      else if (!strcmp(infoname, "num_words"))
+      {
+        *infoval = num_words;
+      }
+      else if (!strcmp(infoname, "gsm_cost"))
+      {
+        bigcostdata gsm_states_cost = 0;
+        for (i = start_frame + 1; i <= end_frame; i++)
+          gsm_states_cost += rec->best_model_cost_for_frame[i];
+        *infoval = gsm_states_cost;
+      }
+      else if (!strcmp(infoname, "num_total_frames"))
+      {
+        *infoval = rec->current_search_frame;
+      }
+      else if (!strcmp(infoname, "gsm_cost_all_frames"))
+      {
+        bigcostdata gsm_states_cost = 0;
+        for (i = 0; i < rec->current_search_frame; i++)
+          gsm_states_cost += rec->best_model_cost_for_frame[i];
+        *infoval = gsm_states_cost;
+      }
+      else if (!strcmp(infoname, "acoustic_model_index"))
+      {
+        *infoval = rec->id;
+      }
+      else
+      {
+        log_report("Error: srec_nbest_get_choice_info does not know re %s\n", infoname);
+        return 1;
+      }
+    }
+  }
+  return 0;
+}
+
+
+int srec_nbest_sort(void* rec_void)
+{
+  srec* rec = (srec*)rec_void;
+  AstarStack* stack = rec ? rec->astar_stack : 0;
+  size_t i, j, n;
+  partial_path* parp;
+
+  if (!stack || stack->num_complete_paths < 1)
+    return 0; /* out of range error */
+
+  n = stack->num_complete_paths;
+
+  /* bubble sort is fine */
+  /* PLogError("** srec_nbest_sort **\n"); */
+  for (i = 0;i < n;i++)
+    for (j = i + 1;j < n;j++)
+      if (stack->complete_paths[j]->costsofar < stack->complete_paths[i]->costsofar)
+      {
+        /* PLogMessage(" %d %d", stack->complete_paths[j]->costsofar,      stack->complete_paths[j]->costsofar); */
+        parp = stack->complete_paths[i];
+        stack->complete_paths[i] = stack->complete_paths[j];
+        stack->complete_paths[j] = parp;
+      }
+  return 1;
+
+}
diff --git a/srec/crec/srec_stats.c b/srec/crec/srec_stats.c
new file mode 100644
index 0000000..bd731e5
--- /dev/null
+++ b/srec/crec/srec_stats.c
@@ -0,0 +1,185 @@
+/*---------------------------------------------------------------------------*
+ *  srec_stats.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include"srec_stats.h"
+#include "passert.h"
+#include "portable.h"
+
+
+#ifdef SREC_STATS_ACTIVE
+
+typedef struct
+{
+  int num_fsmarc_tokens;
+  int num_fsmnode_tokens;
+  int num_word_tokens;
+  int num_altword_tokens, num_altword_token_batches;
+
+  int num_astar_active_parps;
+  int num_astar_complete_parps;
+  int num_astar_parps_in_use;
+
+  int num_fsmarc_token_reprunes;
+  int num_fsmnode_token_reprunes;
+  int num_word_token_reprunes;
+  int num_altword_token_reprunes;
+  int num_bad_backtraces;
+  int num_forced_updates;
+
+}
+srec_stats;
+
+srec_stats my_srec_stats;
+
+#define MAX_IN_SAMPLE(MaX,SamPle) \
+  if((MaX)<(SamPle)) MaX = (SamPle);
+
+void srec_stats_clear()
+{
+  memset(&my_srec_stats, 0, sizeof(my_srec_stats));
+}
+
+void srec_stats_show()
+{
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+  PLogMessage(
+    L("SREC STATS: FWD tokens s %d f %d w %d aw %d // ASTAR parps a %d c %d t %d // REPRUNES s %d f %d w %d aw %d bbt %d fcu %d\n"),
+    my_srec_stats.num_fsmarc_tokens,
+    my_srec_stats.num_fsmnode_tokens,
+    my_srec_stats.num_word_tokens,
+    my_srec_stats.num_altword_tokens,
+    my_srec_stats.num_astar_active_parps,
+    my_srec_stats.num_astar_complete_parps,
+    my_srec_stats.num_astar_parps_in_use,
+    my_srec_stats.num_fsmarc_token_reprunes,
+    my_srec_stats.num_fsmnode_token_reprunes,
+    my_srec_stats.num_word_token_reprunes,
+    my_srec_stats.num_altword_token_reprunes,
+    my_srec_stats.num_bad_backtraces,
+    my_srec_stats.num_forced_updates
+  );
+#endif
+}
+
+void srec_stats_update(srec* rec, char* msg)
+{
+  int i;
+  asr_int16_t num;
+  fsmnode_token* ftoken;
+  fsmarc_token* stoken;
+  word_token* wtoken;
+  altword_token* awtoken;
+  asr_int16_t numb;
+  stokenID st_index;
+  ftokenID ft_index;
+  wtokenID wt_index;
+
+  if (msg) PLogMessage ( msg );
+  /* state tokens */
+  st_index = rec->active_fsmarc_tokens;
+  for (num = 0; st_index != MAXstokenID; st_index = stoken->next_token_index)
+  {
+    stoken = &rec->fsmarc_token_array[st_index];
+    num++;
+  }
+  if (msg) PLogMessage ( " stokens %d", num );
+  MAX_IN_SAMPLE(my_srec_stats.num_fsmarc_tokens, num);
+
+  /* fsmnode tokens */
+  ft_index = rec->active_fsmnode_tokens;
+  for (num = 0 ; ft_index != MAXftokenID; ft_index = ftoken->next_token_index)
+  {
+    ftoken = &rec->fsmnode_token_array[ft_index];
+    num++;
+  }
+  if (msg) PLogMessage ( " ftokens %d", num );
+  MAX_IN_SAMPLE(my_srec_stats.num_fsmnode_tokens, num);
+
+  /* word tokens */
+  for (i = 0, num = 0; i < rec->current_search_frame; i++)
+  {
+    wt_index = rec->word_lattice->words_for_frame[i];
+    for (; wt_index != MAXwtokenID; wt_index = wtoken->next_token_index)
+    {
+      wtoken = &rec->word_token_array[wt_index];
+      num++;
+    }
+  }
+  if (msg) PLogMessage ( " wtokens %d", num );
+  MAX_IN_SAMPLE(my_srec_stats.num_word_tokens, num);
+
+  /* altword tokens */
+  for (num = 0, awtoken = rec->altword_token_freelist; awtoken; awtoken = awtoken->next_token)
+    num++;
+  num = rec->altword_token_array_size - num;
+  for (numb = 0, i = 0; i < rec->altword_token_array_size; i++)
+    if (rec->altword_token_array[i].next_token == AWTNULL)
+      numb++;
+  numb--; /* foreach tail, there is a head, remove the freelist head pointer */
+  if (msg) PLogMessage ( " awtokens %d/%d", num, numb );
+  MAX_IN_SAMPLE(my_srec_stats.num_altword_tokens, num);
+  MAX_IN_SAMPLE(my_srec_stats.num_altword_token_batches, numb);
+  if (msg) PLogMessage ( "\n" );
+}
+
+void srec_stats_update_astar(AstarStack* stack)
+{
+  int num_parps_in_use;
+  partial_path *parp;
+  /* active parps are the leaves of the tree, still being extended */
+  MAX_IN_SAMPLE(my_srec_stats.num_astar_active_parps,
+                stack->num_active_paths);
+  /* complete parps are the leaves, for completed paths */
+  MAX_IN_SAMPLE(my_srec_stats.num_astar_complete_parps,
+                stack->num_complete_paths);
+  
+  num_parps_in_use = stack->partial_path_array_size;
+  for (parp = stack->free_parp_list; parp; parp = parp->next)
+    num_parps_in_use--;
+
+  MAX_IN_SAMPLE(my_srec_stats.num_astar_parps_in_use, num_parps_in_use);
+}
+
+void srec_stats_inc_stoken_reprunes(int n)
+{
+  my_srec_stats.num_fsmarc_token_reprunes   += n;
+}
+void srec_stats_inc_ftoken_reprunes(int n)
+{
+  my_srec_stats.num_fsmnode_token_reprunes += n;
+}
+void srec_stats_inc_wtoken_reprunes(int n)
+{
+  my_srec_stats.num_word_token_reprunes    += n;
+}
+void srec_stats_inc_awtoken_reprunes(int n)
+{
+  my_srec_stats.num_altword_token_reprunes += n;
+}
+void srec_stats_inc_bad_backtraces()
+{
+  my_srec_stats.num_bad_backtraces++;
+}
+void srec_stats_inc_forced_updates()
+{
+  my_srec_stats.num_forced_updates++;
+}
+#endif
+
+
diff --git a/srec/crec/srec_stats.h b/srec/crec/srec_stats.h
new file mode 100644
index 0000000..6b91b52
--- /dev/null
+++ b/srec/crec/srec_stats.h
@@ -0,0 +1,75 @@
+/*---------------------------------------------------------------------------*
+ *  srec_stats.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SREC_STATS_H__
+#define __SREC_STATS_H__
+
+#include "srec.h"
+#include "astar.h"
+#include "word_lattice.h"
+
+/*--------------------------------------------------------------------------*
+ *                                                                          *
+ * stats                                                                    *
+ *                                                                          *
+ *--------------------------------------------------------------------------*/
+
+#define SREC_STATS_ACTIVE
+
+#ifndef SREC_STATS_ACTIVE
+#define SREC_STATS_CLEAR()
+#define SREC_STATS_SHOW()
+#define SREC_STATS_UPDATE(REC)
+#define SREC_STATS_UPDATE_ASTAR(AsTaR)
+#define SREC_STATS_INC_STOKEN_REPRUNES(K)
+#define SREC_STATS_INC_FTOKEN_REPRUNES(K)
+#define SREC_STATS_INC_WTOKEN_REPRUNES(K)
+
+#else
+
+#define SREC_STATS_CLEAR()  srec_stats_clear()
+#if defined(__vxworks) && defined(NDEBUG)
+#define SREC_STATS_SHOW()
+#else
+#define SREC_STATS_SHOW()   srec_stats_show()
+#endif
+#define SREC_STATS_UPDATE(ReC) srec_stats_update(ReC,0)
+#define SREC_STATS_UPDATE_ASTAR(AsTaR) srec_stats_update_astar(AsTaR)
+#define SREC_STATS_INC_STOKEN_REPRUNES(K) srec_stats_inc_stoken_reprunes(K)
+#define SREC_STATS_INC_FTOKEN_REPRUNES(K) srec_stats_inc_ftoken_reprunes(K)
+#define SREC_STATS_INC_WTOKEN_REPRUNES(K) srec_stats_inc_wtoken_reprunes(K)
+#define SREC_STATS_INC_AWTOKEN_REPRUNES(K) srec_stats_inc_awtoken_reprunes(K)
+#define SREC_STATS_INC_BAD_BACKTRACES() srec_stats_inc_bad_backtraces()
+#define SREC_STATS_INC_FORCED_UPDATES() srec_stats_inc_forced_updates()
+
+void srec_stats_clear(void);
+void srec_stats_show(void);
+void srec_stats_update(srec* rec, char* msg);
+void srec_stats_inc_stoken_reprunes(int n);
+void srec_stats_inc_ftoken_reprunes(int n);
+void srec_stats_inc_wtoken_reprunes(int n);
+void srec_stats_inc_awtoken_reprunes(int n);
+void srec_stats_update_astar(AstarStack* stack);
+void srec_stats_inc_bad_backtraces();
+void srec_stats_inc_forced_updates();
+
+
+#endif
+
+#endif
diff --git a/srec/crec/srec_tokens.c b/srec/crec/srec_tokens.c
new file mode 100644
index 0000000..7bbf5be
--- /dev/null
+++ b/srec/crec/srec_tokens.c
@@ -0,0 +1,348 @@
+/*---------------------------------------------------------------------------*
+ *  srec_tokens.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include"srec.h"
+#include"srec_tokens.h"
+#include "passert.h"
+#include "portable.h"
+
+
+/* we do no expect dump_core() to ever be called */
+static void dump_core(char *msg)
+{
+  PLogError ( msg );
+  ASSERT(0);
+}
+
+/*
+ * fsmarc_token management
+ */
+
+int count_fsmarc_token_list(srec* rec, stokenID token_index)
+{
+  int count = 0;
+  
+  while (token_index != MAXstokenID)
+  {
+    fsmarc_token* stoken = &rec->fsmarc_token_array[token_index];
+    token_index = stoken->next_token_index;
+    count++;
+    ASSERT(count < 5000);
+  }
+  return count;
+}
+
+/* static int num_fsmarc_tokens_allocated = 0; */
+
+void initialize_free_fsmarc_tokens(srec *rec)
+{
+  stokenID i;
+  
+  /* num_fsmarc_tokens_allocated = 0; */
+  for (i = 0;i < rec->fsmarc_token_array_size - 1;i++)
+  {
+    rec->fsmarc_token_array[i].next_token_index = i + 1;
+  }
+  rec->fsmarc_token_array[rec->fsmarc_token_array_size-1].next_token_index = MAXstokenID;
+  rec->fsmarc_token_freelist = 0;
+}
+
+/*allocates the token and sets it up for a given arc*/
+stokenID setup_free_fsmarc_token(srec *rec, FSMarc* arc, arcID fsm_arc_index, miscdata what_to_do_if_fails)
+{
+  int i;
+  stokenID token_to_return;
+  fsmarc_token *token;
+  
+  if (rec->fsmarc_token_freelist ==  MAXstokenID)
+  {
+    if (what_to_do_if_fails == EXIT_IF_NO_TOKENS)
+    {
+      /*FIX - replace with crec error handling*/
+      dump_core("setup_free_fsmarc_token: ran out of tokens\n");
+    }
+    if (what_to_do_if_fails == NULL_IF_NO_TOKENS)
+    {
+      return MAXstokenID;
+    }
+    else
+    { /*no other conditions for now, so just exit*/
+      /*FIX - replace with crec error handling*/
+      dump_core("setup_free_fsmarc_token: ran out of tokens\n");
+    }
+  }
+  
+  ASSERT(rec->fsmarc_token_freelist < rec->fsmarc_token_array_size);
+  token_to_return = rec->fsmarc_token_freelist;
+  token = &(rec->fsmarc_token_array[token_to_return]);
+  
+  token->FSMarc_index = fsm_arc_index;
+  arc = &(rec->context->FSMarc_list[fsm_arc_index]);
+  token->num_hmm_states = rec->context->hmm_info_for_ilabel[arc->ilabel].num_states;
+  
+  for (i = 0;i < token->num_hmm_states;i++)
+  {
+    token->cost[i] = MAXcostdata;
+    token->word[i] = MAXwordID;
+    token->word_backtrace[i] = MAXwtokenID;
+    token->duration[i] = MAXframeID;
+    token->aword_backtrace[i] = AWTNULL;
+  }
+  
+  rec->fsmarc_token_freelist = token->next_token_index;
+  
+  /* num_fsmarc_tokens_allocated++; */
+  return token_to_return;
+}
+
+
+void free_fsmarc_token(srec *rec, stokenID old_token_index)
+{
+  fsmarc_token* stoken;
+  ASSERT(old_token_index < rec->fsmarc_token_array_size);
+  stoken = &rec->fsmarc_token_array[old_token_index];
+  stoken->next_token_index = rec->fsmarc_token_freelist;
+  rec->fsmarc_token_freelist = old_token_index;
+  { int i;
+    for (i = 0; i < stoken->num_hmm_states; i++)
+      if (stoken->aword_backtrace[i] != AWTNULL)
+        free_altword_token_batch(rec, stoken->aword_backtrace[i]);
+  }
+}
+
+void sort_fsmarc_token_list(srec* rec, stokenID* ptoken_index)
+{};
+
+/*
+ * word_token management
+ */
+
+void initialize_free_word_tokens(srec *rec)
+{
+  wtokenID i;
+  word_token* wtoken = NULL;
+  
+  for (i = 0;i < rec->word_token_array_size;i++)
+  {
+    wtoken = &rec->word_token_array[i];
+    wtoken->next_token_index = i + 1;
+  }
+  /* last one must point nowhere */
+  wtoken->next_token_index = MAXwtokenID;
+  rec->word_token_freelist = 0;
+}
+
+wtokenID get_free_word_token(srec *rec, miscdata what_to_do_if_fails)
+{
+  wtokenID token_to_return;
+  word_token* wtoken;
+  
+  if (rec->word_token_freelist ==  MAXwtokenID)
+  {
+    if (what_to_do_if_fails == EXIT_IF_NO_TOKENS)
+    {
+      /*FIX - replace with crec error handling*/
+      dump_core("get_free_word_token: ran out of tokens\n");
+    }
+    if (what_to_do_if_fails == NULL_IF_NO_TOKENS)
+    {
+      return MAXwtokenID;
+    }
+    else
+    { /*no other conditions for now, so just exit*/
+      /*FIX - replace with crec error handling*/
+      dump_core("get_free_word_token: ran out of tokens\n");
+    }
+  }
+  
+  token_to_return = rec->word_token_freelist;
+  wtoken =  &rec->word_token_array[token_to_return];
+  rec->word_token_freelist = wtoken->next_token_index;
+  
+  /*note that we are returning without setting any contents of the token (including next_token_index)
+   leave it for the calling program to take care of that*/
+  
+  return token_to_return;
+}
+
+
+
+
+/*
+ * fsmnode_token management
+ */
+
+int count_fsmnode_token_list(srec* rec, ftokenID token_index)
+{
+  int count = 0;
+  
+  while (token_index != MAXftokenID)
+  {
+    fsmnode_token* ftoken = &rec->fsmnode_token_array[token_index];
+    token_index = ftoken->next_token_index;
+    count++;
+  }
+  return count;
+}
+
+void initialize_free_fsmnode_tokens(srec *rec)
+{
+  ftokenID i;
+  fsmnode_token* ftoken = NULL;
+  
+  for (i = 0;i < rec->fsmnode_token_array_size;i++)
+  {
+    ftoken = &rec->fsmnode_token_array[i];
+    ftoken->next_token_index = i + 1;
+  }
+  /* last one must point nowhere */
+  ftoken->next_token_index = MAXftokenID;
+  rec->fsmnode_token_freelist = 0;
+}
+
+ftokenID get_free_fsmnode_token(srec *rec, miscdata what_to_do_if_fails)
+{
+  ftokenID token_to_return;
+  fsmnode_token* ftoken;
+  
+  if (rec->fsmnode_token_freelist ==  MAXftokenID)
+  {
+    if (what_to_do_if_fails == EXIT_IF_NO_TOKENS)
+    {
+      /*FIX - replace with crec error handling*/
+      dump_core("get_free_fsmnode_token: ran out of tokens\n");
+    }
+    if (what_to_do_if_fails == NULL_IF_NO_TOKENS)
+    {
+      return MAXftokenID;
+    }
+    else
+    { /*no other conditions for now, so just exit*/
+      /*FIX - replace with crec error handling*/
+      dump_core("get_free_fsmnode_token: ran out of tokens\n");
+    }
+  }
+  
+  token_to_return = rec->fsmnode_token_freelist;
+  ftoken =  &rec->fsmnode_token_array[token_to_return];
+  rec->fsmnode_token_freelist = ftoken->next_token_index;
+  
+  /*note that we are returning without setting any contents of the token
+    (including next_token_index)
+    leave it for the calling program to take care of that */
+  
+  return token_to_return;
+}
+
+void free_fsmnode_token(srec *rec, ftokenID old_token_index)
+{
+  fsmnode_token* ftoken;
+  ASSERT(old_token_index < rec->fsmnode_token_array_size);
+  ftoken = &rec->fsmnode_token_array[old_token_index];
+  ftoken->next_token_index = rec->fsmnode_token_freelist;
+  ftoken->cost = MAXcostdata;
+  rec->fsmnode_token_freelist = old_token_index;
+  if (ftoken->aword_backtrace != AWTNULL)
+    free_altword_token_batch(rec, ftoken->aword_backtrace);
+}
+
+/*
+ *  altword token management
+ */
+
+void initialize_free_altword_tokens(srec *rec)
+{
+  wtokenID i;
+  altword_token* awtoken = NULL;
+  for (i = 0;i < rec->altword_token_array_size;i++)
+  {
+    awtoken = rec->altword_token_array + i;
+    awtoken->next_token = awtoken + 1;
+    awtoken->costdelta  = MAXcostdata;
+    awtoken->refcount   = 0;
+    awtoken->costbasis  = 0;
+  }
+  /* last one must point nowhere */
+  awtoken->next_token = NULL;
+  rec->altword_token_freelist = &rec->altword_token_array[0];
+  rec->altword_token_freelist_len = rec->altword_token_array_size;
+}
+
+
+int count_altword_token(srec* rec, altword_token* b)
+{
+  int num = 0;
+  for (; b; b = b->next_token) { 
+	  num++; 
+      // if(num>9999) ASSERT(0); 
+  }
+  return num;
+}
+
+
+/* get a free altword token, handle out of memory later!! */
+altword_token* get_free_altword_token(srec* rec, miscdata what_to_do_if_fails)
+{
+  altword_token* awtoken = rec->altword_token_freelist;
+  /* what_to_do_if_fails ... we do not ever expect failure because
+     all get_free's are preceded by repruning, but if there should
+     ever be a failure, we will return NULL and handle it in the 
+     caller */
+  if (!awtoken /*&& what_to_do_if_fails==NULL_IF_NO_TOKENS*/)
+    return awtoken;
+  awtoken->refcount = 1;
+  rec->altword_token_freelist = awtoken->next_token;
+  rec->altword_token_freelist_len--;
+  return awtoken;
+}
+
+/* release an altword token */
+int free_altword_token(srec* rec, altword_token* old_token)
+{
+  ASSERT(old_token->refcount >= 1);
+  if (--old_token->refcount <= 0)
+  {
+    old_token->next_token = rec->altword_token_freelist;
+    old_token->costdelta  = MAXcostdata;
+    rec->altword_token_freelist = old_token;
+    rec->altword_token_freelist_len++;
+  }
+  return old_token->refcount; /* return zero if truly freed */
+}
+
+altword_token* free_altword_token_batch(srec* rec, altword_token* old_token)
+{
+  /* char dd[128], *ddp = &dd[0]; */
+  ASSERT(old_token->refcount >= 1);
+  if (--old_token->refcount <= 0)
+  {
+    altword_token *awtoken, *next_awtoken;
+    for (awtoken = old_token; awtoken != AWTNULL; awtoken = next_awtoken)
+    {
+      next_awtoken = awtoken->next_token;
+      /* *(ddp++) = '0' + awtoken->refcount; */
+      awtoken->costdelta  = MAXcostdata;
+      awtoken->next_token = rec->altword_token_freelist;
+      rec->altword_token_freelist = awtoken;
+      rec->altword_token_freelist_len++;
+    }
+  }  
+  return AWTNULL;
+}
+
diff --git a/srec/crec/srec_tokens.h b/srec/crec/srec_tokens.h
new file mode 100644
index 0000000..3c3a4db
--- /dev/null
+++ b/srec/crec/srec_tokens.h
@@ -0,0 +1,67 @@
+/*---------------------------------------------------------------------------*
+ *  srec_tokens.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _SREC_TOKENS_H_
+#define _SREC_TOKENS_H_
+
+#include"srec.h"
+#include"srec_sizes.h"
+
+/* miscdata what_to_do_if_fails */
+#define EXIT_IF_NO_TOKENS 1  /*for handling allocation failures*/
+#define NULL_IF_NO_TOKENS 2  /*for handling allocation failures*/
+
+/*
+ * fsmarc_token management
+ */
+
+int count_fsmarc_token_list(srec* rec, stokenID token_index);
+void initialize_free_fsmarc_tokens(srec *rec);
+stokenID setup_free_fsmarc_token(srec *rec, FSMarc* arc, arcID fsm_arc_index, miscdata what_to_do_if_fails);
+void free_fsmarc_token(srec *rec, stokenID old_token_index);
+void sort_fsmarc_token_list(srec* rec, stokenID* ptoken_index);
+
+/*
+ * word_token management
+ */
+
+void initialize_free_word_tokens(srec *rec);
+wtokenID get_free_word_token(srec *rec, miscdata what_to_do_if_fails);
+
+/*
+ * fsmnode_token management
+ */
+
+int count_fsmnode_token_list(srec* rec, ftokenID token_index);
+void initialize_free_fsmnode_tokens(srec *rec);
+ftokenID get_free_fsmnode_token(srec *rec, miscdata what_to_do_if_fails);
+void free_fsmnode_token(srec *rec, ftokenID old_token_index);
+
+/*
+ *  altword token management
+ */
+
+void initialize_free_altword_tokens(srec *rec);
+int count_altword_token(srec* rec, altword_token* b);
+altword_token* get_free_altword_token(srec* rec, miscdata what_to_do_if_fails);
+int free_altword_token(srec* rec, altword_token* old_token);
+altword_token* free_altword_token_batch(srec* rec, altword_token* old_token);
+#define print_altword_token_counts(a,b)
+
+#endif
diff --git a/srec/crec/text_parser.c b/srec/crec/text_parser.c
new file mode 100644
index 0000000..4b3dc15
--- /dev/null
+++ b/srec/crec/text_parser.c
@@ -0,0 +1,247 @@
+/*---------------------------------------------------------------------------*
+ *  text_parser.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include"pstdio.h"
+#include"srec_context.h"
+#include"astar.h"
+
+#include "passert.h"
+#include "portable.h"
+
+
+#define MAX_LOCAL_LEN 256
+#define PARSE_PASS 0
+#define PARSE_FAIL 1
+
+static char copy_of_word[MAX_LOCAL_LEN]; /* save heap on recursive function */
+static int check_word_path(srec_context* context, arc_token* atok,
+                           const char* transcription, int tlen)
+{
+  const char    *wd, *p;
+  char          *q;
+  arc_token*    next_atok;
+  wordID        wdID;
+  size_t        copy_of_word_size;
+  int           q_position;
+
+  if ( strlen ( transcription ) >= MAX_LOCAL_LEN )
+    {
+      PLogError("Transcription too long [%s]\n", transcription);
+      return PARSE_FAIL;
+    }
+  copy_of_word_size = sizeof(copy_of_word) / sizeof(char);
+  
+  /* wd points to the first char of last word */
+  wd = transcription;
+  if (tlen > 0)
+  {
+    for (wd = transcription + tlen - 1; wd > transcription; wd--)
+    {
+      if (*wd == ' ')
+      {
+        wd++;
+        break;
+      }
+    }
+  }
+  for (p = wd, q = copy_of_word; ; p++, q++)
+  {
+    q_position = q - copy_of_word;
+    if ( ( q_position < 0 ) || ( (size_t)( q_position ) >= copy_of_word_size ) )
+    {
+      PLogError("Word too long in transcription [%s]\n", transcription);
+      return PARSE_FAIL;
+    }
+    *q = *p;
+    if (*p == ' ' || *p == '\0')
+    {
+      *q = 0;
+      break;
+    }
+  }
+  wdID = wordmap_find_index(context->olabels, copy_of_word);
+  
+  if (wdID < MAXwordID)
+  {
+    next_atok = get_arc_for_word(atok, wdID, context, context->beg_silence_word);
+  }
+  else
+  {
+    next_atok = get_arc_for_word_without_slot_annotation(atok, wd, context, context->beg_silence_word);
+    if (!next_atok)
+      return PARSE_FAIL;
+  }
+  
+  if (next_atok)
+  {
+    int whether_final_atok = 0;
+    arc_token* tmp;
+    for (tmp = ARC_TOKEN_PTR(context->arc_token_list, next_atok->first_next_arc); tmp != NULL;
+         tmp = ARC_TOKEN_PTR(context->arc_token_list, tmp->next_token_index))
+    {
+      if (tmp->ilabel == MAXwordID) whether_final_atok = 1;
+    }
+    
+    if (wd == transcription && whether_final_atok)
+      return PARSE_PASS;
+    else if (wd == transcription)
+      return PARSE_FAIL;
+    else
+    {
+      tlen--;
+      while (transcription[tlen] != ' ' && tlen > 0) tlen--;
+      return check_word_path(context, next_atok, transcription, tlen);
+    }
+  }
+  else
+  {
+    return PARSE_FAIL;
+  }
+}
+
+int FST_CheckPath_Simple(srec_context* context, const char* transcription)
+{
+  arc_token* atok = &context->arc_token_list[0];
+  int transcription_len = strlen(transcription);
+  int rc;
+  
+  for (; transcription_len > 0; transcription_len--)
+    if (transcription[transcription_len-1] != ' ') break;
+  rc = check_word_path(context, atok, transcription, transcription_len);
+  return rc;
+}
+
+int FST_CheckPath_Complex(srec_context* context, const char* transcription,
+                          char* literal, size_t max_literal_len)
+{
+  int i, j, rc;
+  int num_spaces;
+  char copy_of_transcription[MAX_LOCAL_LEN];
+  char* spaces[24], *p; /* can't go too high here!! */
+  ASSERT(strlen(transcription) < MAX_LOCAL_LEN);
+  
+  strcpy(copy_of_transcription, transcription);
+  for (num_spaces = 0, p = copy_of_transcription; *p; p++)
+  {
+    if (*p == ' ')
+    {
+      if ((size_t)num_spaces >= sizeof(spaces) / sizeof(char*))
+      {
+        PLogError("FST_CheckPath_Complex() failed on too many words\n");
+        return PARSE_FAIL;
+      }
+      spaces[num_spaces++] = p;
+    }
+  }
+  
+  if (num_spaces == 0)
+  {
+    rc = FST_CheckPath_Simple(context, transcription);
+    if (rc == PARSE_PASS)
+    {
+      ASSERT(strlen(copy_of_transcription) < max_literal_len);
+      strcpy(literal, copy_of_transcription);
+    }
+    return rc;
+  }
+  
+  for (i = 0; i < (1 << num_spaces); i++)
+  {
+    /* find the space pointers */
+    for (j = 0; j < num_spaces; j++)
+      *spaces[j] = i & (1 << j) ? '_' : ' ';
+    /* check each word, potentially within a rule! */
+    for (p = strtok(copy_of_transcription, " "); p; p = strtok(NULL, " "))
+    {
+      wordID k, wdid = wordmap_find_index(context->olabels, p);
+      if (wdid < MAXwordID) continue;
+      for (k = 1; k < context->olabels->num_slots; k++)
+      {
+        wdid = wordmap_find_index_in_rule(context->olabels, p, k);
+        if (wdid < MAXwordID) break;
+      }
+      if (wdid == MAXwordID)
+        goto next_i;
+    }
+    /* fix the nulls back */
+    for (j = 0; j < num_spaces; j++)
+      *spaces[j] = i & (1 << j) ? '_' : ' ';
+    rc = FST_CheckPath_Simple(context, copy_of_transcription);
+    if (rc == PARSE_PASS)
+    {
+      ASSERT(strlen(copy_of_transcription) < max_literal_len);
+      strcpy(literal, copy_of_transcription);
+      return rc;
+    }
+next_i:
+    continue;
+  }
+  return PARSE_FAIL;
+}
+
+static void clean_up_sentence(char* s);
+
+int FST_CheckPath(srec_context* context, const char* transcription,
+                  char* literal, size_t max_literal_len)
+{
+  char mytranscription[256];
+  passert(strlen(transcription) < sizeof(mytranscription));
+  strcpy(mytranscription, transcription);
+  clean_up_sentence(mytranscription);
+  if (!context->arc_token_list)
+    return 2;
+  else
+    return FST_CheckPath_Complex(context, mytranscription, literal, max_literal_len);
+}
+
+static void clean_up_sentence(char* s)
+{
+  char* p, *q;
+  if (0) printf("sentence: '%s'\n", s);
+  /* change speech codes to spaces */
+  for (p = s; *p; p++)
+  {
+    if (*p == '[')
+      for (;*p && *p != ']'; p++)
+        *p = ' ';
+    if (*p == ']') *p = ' ';
+  }
+  /* trim leading spaces */
+  for (p = s; *p == ' ';)
+    for (q = p; *q; q++) *q = *(q + 1);
+  /* trim middle spaces */
+  for (p = s; p && *p;)
+  {
+    if (!*p) break;
+    p = strchr(p, ' ');
+    if (!p) break;
+    for (;*(p + 1) == ' ';)
+      for (q = p; *q; q++) *q = *(q + 1);
+    p++;
+  }
+  /* trim ending spaces */
+  for (p = s + strlen(s); p != s;)
+    if (*(--p) == ' ') *p = 0;
+    else break;
+    
+  if (0) printf("clean_sentence: '%s'\n", s);
+}
+
+
+
diff --git a/srec/crec/word_lattice.c b/srec/crec/word_lattice.c
new file mode 100644
index 0000000..0e600cb
--- /dev/null
+++ b/srec/crec/word_lattice.c
@@ -0,0 +1,759 @@
+/*---------------------------------------------------------------------------*
+ *  word_lattice.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _RTT
+#include "pstdio.h"
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "passert.h"
+#include "portable.h"
+
+
+#include "portable.h"
+
+#include "hmm_desc.h"
+#include "utteranc.h"
+#include "hmmlib.h"
+
+#include "srec_sizes.h"
+#include "search_network.h"
+#include "srec.h"
+#include "word_lattice.h"
+#include "astar.h"
+#include "srec_stats.h"
+#include "srec_results.h"
+
+#define PRINT_WORD_LATTICE        0
+#define PRINT_SEARCH_DETAILS      0
+
+#define TRUE_KILL_WTOKEN(WT) { WT.cost = MAXcostdata; \
+    WT.word = MAXwordID;  \
+    WT.end_time = MAXframeID; \
+    WT.end_node = MAXnodeID; \
+    WT.backtrace = MAXwtokenID; \
+  }
+
+srec_word_lattice *allocate_word_lattice(frameID max_frames)
+{
+  srec_word_lattice *wl;
+
+  wl = (srec_word_lattice*) CALLOC_CLR(1, sizeof(srec_word_lattice), "search.word_lattice.base");
+  wl->max_frames = max_frames;
+  wl->words_for_frame = (wtokenID*) CALLOC_CLR(max_frames, sizeof(wtokenID), "search.word_lattice.words");
+
+  wl->whether_sorted = (asr_int16_t*)CALLOC_CLR(max_frames,  sizeof(asr_int16_t), "search.word_lattice.sflag");
+
+  return wl;
+}
+
+void destroy_word_lattice(srec_word_lattice* wl)
+{
+  FREE(wl->words_for_frame);
+  FREE(wl->whether_sorted);
+  FREE(wl);
+}
+
+void initialize_word_lattice(srec_word_lattice* wl)
+{
+  frameID ifr;
+  for (ifr = 0; ifr < wl->max_frames; ifr++)
+  {
+    wl->words_for_frame[ifr] = MAXwtokenID;
+    wl->whether_sorted[ifr] = 0;
+  }
+}
+
+costdata lattice_best_cost_to_frame(srec_word_lattice *wl, word_token* word_token_array, frameID ifr)
+{
+  int sanity_counter = 0;
+  costdata best_cost = MAXcostdata;
+  wtokenID wtoken_index = wl->words_for_frame[ ifr];
+  while (wtoken_index != MAXwtokenID)
+  {
+    word_token* wtoken = &word_token_array[wtoken_index];
+    if (sanity_counter++ > 200) return MAXcostdata;
+    wtoken_index = wtoken->next_token_index;
+    if (best_cost > wtoken->cost)
+      best_cost = wtoken->cost;
+  }
+  return best_cost;
+}
+
+void lattice_add_word_tokens(srec_word_lattice *wl, frameID frame,
+                             wtokenID word_token_list_head)
+{
+  if (frame >= wl->max_frames)
+  {
+    log_report("lattice_add_word_tokens: max_frame not big enough\n");
+    ASSERT(0);
+  }
+  wl->words_for_frame[frame] = word_token_list_head;
+}
+
+void print_word_token_backtrace(srec* rec, wtokenID wtoken_index, char* tail)
+{
+  char* null = "NULL", *p;
+  char iwttime[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
+  bigcostdata cost;
+  bigcostdata cost_for_word;
+  word_token *wtoken, *last_wtoken;
+
+  last_wtoken = NULL;
+  while (wtoken_index != MAXwtokenID)
+  {
+    wtoken = &rec->word_token_array[wtoken_index];
+    if (wtoken->word < rec->context->olabels->num_words)
+      p = rec->context->olabels->words[wtoken->word];
+    else
+      p = null;
+    ASSERT(!last_wtoken || last_wtoken->end_time > wtoken->end_time);
+    ASSERT(rec->accumulated_cost_offset[ wtoken->end_time] != 0);
+    cost = wtoken->cost + rec->accumulated_cost_offset[ wtoken->end_time];
+
+    if (wtoken->backtrace != MAXwtokenID)
+    {
+      word_token* next_wtoken = &rec->word_token_array[wtoken->backtrace];
+      cost_for_word = cost - next_wtoken->cost - rec->accumulated_cost_offset[ next_wtoken->end_time];
+    }
+    else
+    {
+      cost_for_word = cost;
+    }
+    sprintf(iwttime, "/%d", WORD_TOKEN_GET_WD_ETIME(wtoken) );
+    PLogMessage (" (%d W%d %s cost=%d/%d/%d time=%d%s node=%d)", wtoken_index, wtoken->word, p, wtoken->cost, cost, cost_for_word, wtoken->end_time, iwttime, wtoken->end_node);
+    fflush(stdout);
+    ASSERT(wtoken->backtrace != wtoken_index);
+    wtoken_index = wtoken->backtrace;
+    last_wtoken = wtoken;
+  }
+  PLogMessage (tail);
+}
+
+int sprint_bword_token_backtrace(char* buf, int buflen, srec* rec, wtokenID wtoken_index)
+{
+  char* null = "NULL", *p;
+  char *pbuf = buf;
+  *pbuf = 0;
+
+  while (wtoken_index != MAXwtokenID)
+  {
+    word_token* wtoken = &rec->word_token_array[wtoken_index];
+    p = null;
+    if (wtoken->word < rec->context->olabels->num_words)
+      p = rec->context->olabels->words[wtoken->word];
+    ASSERT(pbuf + strlen(p) + 1 < buf + buflen);
+    pbuf += sprintf(pbuf, "%s ", p);
+    ASSERT(wtoken->backtrace != wtoken_index);
+
+    wtoken_index = wtoken->backtrace;
+  }
+  if (pbuf > buf && *(pbuf - 1) == ' ') *(pbuf - 1) = 0;
+  return 0;
+}
+
+#define ERROR_TRANSCRIPTION_TOO_LONG -1
+
+ESR_ReturnCode sprint_word_token_backtraceByWordID(wordID* wordIDs, size_t* len, srec* rec, wtokenID wtoken_index)
+{
+  size_t i, currentLen = 0;
+  ESR_ReturnCode rc;
+  word_token* wtoken;
+
+#if PRINT_SEARCH_DETAILS
+  printf("in get backtrace wtoken %d\n", wtoken_index);
+#endif
+
+  while (wtoken_index != MAXwtokenID)
+  {
+    if (*len <= currentLen)
+    {
+      rc = ESR_BUFFER_OVERFLOW;
+      PLogError(ESR_rc2str(rc));
+      *len = currentLen + 1;
+      goto CLEANUP;
+    }
+    wtoken = &rec->word_token_array[wtoken_index];
+    wordIDs[currentLen] = wtoken->word;
+    ++currentLen;
+
+    if (wtoken_index == wtoken->backtrace)
+    {
+      *len = 0;
+      PLogError("Result is loopy, rejecting");
+      return ESR_INVALID_STATE;
+    }
+    wtoken_index = wtoken->backtrace;
+  }
+
+  /* reverse the order */
+  for (i = 0; i < currentLen / 2; i++)
+  {
+    wordID tmp = wordIDs[i];
+    wordIDs[i] = wordIDs[(currentLen-1-i)];
+    wordIDs[(currentLen-1-i)] = tmp;
+  }
+  /* strip the pau/pau2 markers */
+  if (currentLen >= 1 && wordIDs[0] == rec->context->beg_silence_word)
+  {
+    for (i = 0; i < currentLen - 1; i++)
+      wordIDs[i] = wordIDs[i+1];
+    currentLen--;
+  }
+  if (currentLen >= 1 && wordIDs[currentLen-1] == rec->context->end_silence_word)
+    currentLen--;
+  wordIDs[currentLen] = MAXwordID;
+  *len = currentLen;
+
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+int sprint_word_token_backtrace(char *transcription, int len, srec* rec, wtokenID wtoken_index)
+{
+  char *w;
+  char *from_p;
+  char *to_p;
+  char *end;
+  char *tr_end = transcription;
+  int wlen;
+
+#define SHOW_END_TIMES 1
+#if SHOW_END_TIMES
+  char buf[256/*64*/];
+#endif
+
+  *transcription = 0;
+
+#if PRINT_SEARCH_DETAILS
+  printf("in get backtrace wtoken %d\n", wtoken_index);
+#endif
+
+  while (wtoken_index != MAXwtokenID)
+  {
+    word_token* wtoken = &rec->word_token_array[wtoken_index];
+#if PRINT_SEARCH_DETAILS
+    printf("got token %d word %d\n", wtoken_index, wtoken->word);
+#endif
+
+    w = "NULL";
+    if (wtoken->word < rec->context->olabels->num_words)
+      w = rec->context->olabels->words[wtoken->word];
+#if SHOW_END_TIMES
+    /* should be defined outside because it is used outside by w */
+    /* sprintf(buf,"%s@%d.%d",w, WORD_TOKEN_GET_WD_ETIME(wtoken), wtoken->end_time); */
+    if (strlen(w) + 12 > sizeof(buf))
+    {
+      *transcription = 0;
+      return ERROR_TRANSCRIPTION_TOO_LONG;
+    }
+    else
+    {
+      sprintf(buf, "%s@%d", w, wtoken->end_time);
+      w = &buf[0];
+    }
+#endif
+    wlen = strlen(w);
+    if (wlen + tr_end - transcription + 1 >= len)
+    {
+      *transcription = 0;
+      return ERROR_TRANSCRIPTION_TOO_LONG;
+    }
+    /*need to tack onto beginning, so move string over*/
+    from_p = tr_end;
+    to_p = tr_end + wlen + 1;
+    tr_end = to_p;
+    while (from_p >= transcription) *(to_p--) = *(from_p--);
+
+    /* add a space*/
+    *to_p = ' ';
+
+    /*add the new word*/
+    to_p = transcription;
+    end = to_p + wlen;
+
+    while (to_p < end) *(to_p++) = *(w++);
+
+    if (wtoken_index == wtoken->backtrace)
+    {
+      *transcription = 0;
+#if BUILD&BUILD_DEBUG
+      printf("Error: result is loopy, rejecting\n");
+#endif
+      return ERROR_RESULT_IS_LOOPY;
+    }
+    wtoken_index = wtoken->backtrace;
+  }
+  return 0;
+}
+
+void print_word_token(srec* rec, wtokenID wtoken_index, char* msg)
+{
+  bigcostdata cost, cost_for_word;
+  char *p = "NULL";
+  word_token* wtoken = &rec->word_token_array[wtoken_index];
+
+  PLogMessage ( msg );
+  if (wtoken->word < rec->context->olabels->num_words)
+    p = rec->context->olabels->words[wtoken->word];
+  ASSERT(rec->accumulated_cost_offset[ wtoken->end_time] != 0);
+  cost = wtoken->cost + rec->accumulated_cost_offset[wtoken->end_time];
+  if (wtoken->backtrace != MAXwtokenID)
+  {
+    word_token* next_wtoken = &rec->word_token_array[wtoken->backtrace];
+    cost_for_word = cost - next_wtoken->cost - rec->accumulated_cost_offset[next_wtoken->end_time];
+  }
+  else
+  {
+    cost_for_word = cost;
+  }
+  printf("wtoken %d W%i %s cost=%d/%d/%d time=%d/%d node=%d", wtoken_index,
+         wtoken->word, p, wtoken->cost, cost, cost_for_word, wtoken->end_time, WORD_TOKEN_GET_WD_ETIME(wtoken), wtoken->end_node);
+  pfflush(PSTDOUT);
+  print_word_token_backtrace(rec, wtoken->backtrace, "\n");
+}
+
+
+void print_word_token_list(srec* rec, wtokenID wtoken_index, char* msg)
+{
+#ifndef NDEBUG
+  int sanity_counter = 0;
+#endif
+  PLogMessage ( msg );
+  while (wtoken_index != MAXwtokenID)
+  {
+    word_token* wtoken = &rec->word_token_array[wtoken_index];
+    print_word_token(rec, wtoken_index, "");
+    ASSERT(sanity_counter++ < 200);
+    ASSERT(wtoken_index != wtoken->next_token_index);
+    wtoken_index = wtoken->next_token_index;
+  }
+}
+
+#define MAX_LEN 256
+void srec_get_result(srec *rec)
+{
+  srec_word_lattice *wl;
+  frameID i;
+  wtokenID token_index;
+  word_token *wtoken;
+
+#if PRINT_SEARCH_DETAILS
+  printf("in srec_get_result\n");
+#endif
+
+  wl = rec->word_lattice;
+#if PRINT_WORD_LATTICE
+  for (i = 0; i <= rec->current_search_frame; i++)
+  {
+#else
+  for (i = rec->current_search_frame; i <= rec->current_search_frame; i++)
+  {
+#endif
+
+    /* put the best choice at the top */
+    sort_word_lattice_at_frame(rec, i);
+    token_index = wl->words_for_frame[i];
+
+#if PRINT_WORD_LATTICE
+    printf("----- List of words for frame %d\n", i);
+    print_word_token_list(rec, token_index, "");
+#endif
+
+    if (i == rec->current_search_frame && token_index != MAXwtokenID)
+    {
+      wtoken =  &(rec->word_token_array[token_index]);
+      print_word_token(rec, token_index, "Final Top Choice: ");
+    }
+  }
+}
+
+static srec* WHICH_RECOG(multi_srec* rec)
+{
+  srec* return_rec = NULL;
+  costdata current_best_cost = MAXcostdata;
+  int i = 0;
+#if DO_ALLOW_MULTIPLE_MODELS
+  for (i = 0; i < rec->num_activated_recs; i++)
+  {
+#endif
+    if (current_best_cost > rec->rec[i].current_best_cost)
+    {
+      current_best_cost = rec->rec[i].current_best_cost;
+      return_rec = &rec->rec[i];
+    }
+#if DO_ALLOW_MULTIPLE_MODELS
+  }
+#endif
+  return return_rec;
+}
+
+ESR_ReturnCode srec_get_top_choice_wordIDs(multi_srec* recm, wordID* wordIDs, size_t* len)
+{
+  srec* rec = WHICH_RECOG(recm);
+  frameID end_frame;
+  srec_word_lattice* wl;
+  wtokenID token_index;
+  ESR_ReturnCode rc;
+
+  if (!rec)
+  {
+    rc = ESR_INVALID_STATE;
+    PLogError(ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  end_frame = rec->current_search_frame;
+  wl = rec->word_lattice;
+  token_index = wl->words_for_frame[end_frame];
+
+  if (token_index == MAXwtokenID)
+  {
+    PLogError(L("ESR_INVALID_STATE"));
+    return ESR_INVALID_STATE;
+  }
+#if PRINT_WORD_LATTICE
+  print_word_token_list(rec, token_index, "WORD TOKENS AT END\n");
+#endif
+  /* the head of the list on the last frame is always best */
+  CHKLOG(rc, sprint_word_token_backtraceByWordID(wordIDs, len, rec, token_index));
+
+  return ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+int srec_get_top_choice_transcription(multi_srec* recm, char *transcription, int len, int whether_strip_slot_markers)
+{
+  int rc;
+  srec* rec = WHICH_RECOG(recm);
+  frameID end_frame;
+  srec_word_lattice* wl;
+  wtokenID token_index;
+
+  if (!rec)
+  {
+    *transcription = 0;
+    return 1;
+  }
+  if( recm->eos_status == VALID_SPEECH_NOT_YET_DETECTED)
+  {
+      *transcription = 0;
+      return 1;
+  }
+
+  end_frame = rec->current_search_frame;
+  wl = rec->word_lattice;
+  sort_word_lattice_at_frame(rec, end_frame);
+  token_index = wl->words_for_frame[end_frame];
+
+  if (token_index != MAXwtokenID)
+  {
+#if PRINT_WORD_LATTICE
+    print_word_token_list(rec, token_index, "WORD TOKENS AT END\n");
+#endif
+    /* the head of the list on the last frame is always best */
+    rc = sprint_word_token_backtrace(transcription, len, rec, token_index);
+  }
+  else
+  {
+    strcpy(transcription, "");
+    rc = 1;
+  }
+  if (whether_strip_slot_markers)
+    srec_result_strip_slot_markers(transcription);
+  return rc;
+}
+
+int srec_get_top_choice_score(multi_srec* recm, bigcostdata *cost, int do_incsil)
+{
+  srec* rec = WHICH_RECOG(recm);
+  frameID end_frame;
+  srec_word_lattice* wl;
+  wtokenID token_index;
+  word_token* wtoken;
+
+  if (!rec)
+  {
+    *cost = MAXcostdata;
+    return 1;
+  }
+
+  end_frame = rec->current_search_frame;
+  wl = rec->word_lattice;
+  token_index = wl->words_for_frame[end_frame];
+
+  if (end_frame < MAXframeID && token_index != MAXwtokenID)
+  {
+    wtoken = &rec->word_token_array[token_index];
+    *cost = wtoken->cost;
+    *cost += rec->accumulated_cost_offset[ wtoken->end_time];
+    return 0;
+  }
+  else
+  {
+    *cost = MAXcostdata;
+    return 1;
+  }
+}
+
+int srec_print_results(multi_srec *recm, int max_choices)
+{
+  char transcription[MAX_LEN];
+  bigcostdata cost;
+
+  srec_get_top_choice_transcription(recm, transcription, MAX_LEN, 1);
+  srec_get_top_choice_score(recm, &cost, SCOREMODE_INCLUDE_SILENCE);
+
+  log_report("R: %8ld %8ld %s\t%.1f\n", 0, 0, transcription, cost);
+
+  return 0;
+}
+
+/* sort the word lattice at this frame, todo: remove rec argument */
+
+#define MAX_WTOKENS_AT_FRAME 64 /* +1 for the MAXwtokenID! */
+void sort_word_lattice_at_frame(srec* rec, frameID frame)
+{
+  srec_word_lattice* wl = rec->word_lattice;
+  word_token *wtoken, *wtoken2;
+  wtokenID pwi[MAX_WTOKENS_AT_FRAME], token_index;
+  word_token* word_token_array = rec->word_token_array;
+  int i, j, npwi = 0;
+  ASSERT(rec->word_priority_q->max_in_q < MAX_WTOKENS_AT_FRAME);
+
+  ASSERT(frame < wl->max_frames);
+  if (wl->whether_sorted[frame])
+    return;
+
+  wl->whether_sorted[frame] = 1;
+
+  /* make an array of word token index addresses */
+  for (pwi[npwi] = wl->words_for_frame[frame]; pwi[npwi] != MAXwtokenID;)
+  {
+    ASSERT(npwi < MAX_WTOKENS_AT_FRAME);
+    token_index = pwi[npwi];
+    wtoken = &word_token_array[ token_index];
+    npwi++;
+    pwi[npwi] = wtoken->next_token_index;
+  }
+
+  /* sort the word token indices, bubble sort is fine */
+  for (i = 0; i < npwi; i++)
+  {
+    for (j = 0; j < (npwi - 1); j++)
+    {
+      wtoken = &word_token_array[ pwi[j]];
+      wtoken2 = &word_token_array[ pwi[j+1]];
+      if (wtoken->cost > wtoken2->cost)
+      {
+        token_index = pwi[j];
+        pwi[j] = pwi[j+1];
+        pwi[j+1] = token_index;
+      }
+    }
+  }
+
+  /*print_word_token_list(rec,wl->words_for_frame[frame],"## BEFORE SORT\n");*/
+  wl->words_for_frame[ frame] = pwi[0];
+  for (i = 0; i < npwi; i++)
+  {
+    wtoken = &word_token_array[ pwi[i]];
+    wtoken->next_token_index = pwi[i+1]; /* last points nowhwere */
+  }
+  /*print_word_token_list(rec,wl->words_for_frame[frame],"## AFTER  SORT\n");*/
+}
+
+
+/* this frees a word token, it may still have references in the lattice though */
+
+void free_word_token(srec *rec, wtokenID old_token_index)
+{
+  word_token* wtoken;
+  wtoken = &rec->word_token_array[old_token_index];
+  wtoken->next_token_index = rec->word_token_freelist;
+  rec->word_token_freelist = old_token_index;
+  TRUE_KILL_WTOKEN(rec->word_token_array[rec->word_token_freelist]);
+}
+
+/* this frees some earlier allocated word_tokens from previous frames,
+   this makes sure we can always have some to spare for future frames */
+
+void free_word_token_from_lattice(srec *rec, wtokenID old_token_index)
+{
+  word_token* wtoken;
+  wtokenID *rtoken_index;
+  word_token* rtoken;
+
+#define CHECK_FREE_WORD_TOKEN 1
+#if CHECK_FREE_WORD_TOKEN
+  stokenID stoken_index, i;
+  ftokenID ftoken_index;
+  fsmarc_token* stoken;
+  fsmnode_token* ftoken;
+  int nerrs = 0;
+
+  stoken_index = rec->active_fsmarc_tokens;
+  for (; stoken_index != MAXstokenID; stoken_index = stoken->next_token_index)
+  {
+    stoken = &rec->fsmarc_token_array[stoken_index];
+    for (i = 0; i < stoken->num_hmm_states; i++)
+    {
+      if (stoken->word_backtrace[i] == old_token_index)
+      {
+        printf("Error: can't delete wtoken %d cuz stoken%d.%d cost %d\n",
+               old_token_index, stoken_index, i, stoken->cost[i]);
+        nerrs++;
+      }
+    }
+  }
+
+  ftoken_index = rec->active_fsmnode_tokens;
+  for (; ftoken_index != MAXftokenID; ftoken_index = ftoken->next_token_index)
+  {
+    ftoken = &rec->fsmnode_token_array[ftoken_index];
+    if (ftoken->word_backtrace == old_token_index)
+    {
+      printf("Error: can't delete wtoken %d cuz ftoken %d cost %d\n",
+             old_token_index, ftoken_index, ftoken->cost);
+      nerrs++;
+    }
+  }
+
+  /*  wtoken = &rec->word_token_array[old_token_index];
+      for(ifr=wtoken->end_time+1; ifr>=0; ifr--) {
+      wtoken_index = rec->word_lattice->words_for_frame[ifr];
+      for( ; wtoken_index!= MAXwtokenID; wtoken_index=wtoken->next_token_index) {
+      wtoken = &rec->word_token_array[wtoken_index];
+      if(wtoken->backtrace == old_token_index) {
+      printf("Error: can't delete wtoken %d cuz wtoken %d at frame %d backtraces cost %d\n",
+      old_token_index, wtoken_index, ifr, wtoken->cost);
+      nerrs++;
+      }
+      }
+      }
+  */
+  ASSERT(nerrs == 0);
+  if (nerrs > 0)
+  {
+    print_word_token(rec, old_token_index, "Error: while deleting ");
+    return;
+  }
+#endif
+
+  wtoken = &rec->word_token_array[old_token_index];
+  /* remove from word lattice */
+  rtoken_index = &rec->word_lattice->words_for_frame[ wtoken->end_time+1];
+  for (; (*rtoken_index) != MAXwtokenID; rtoken_index = &rtoken->next_token_index)
+  {
+    rtoken = &rec->word_token_array[(*rtoken_index)];
+    if (*rtoken_index == old_token_index)
+    {
+      *rtoken_index = wtoken->next_token_index;
+      break;
+    }
+  }
+  wtoken->next_token_index = rec->word_token_freelist;
+  rec->word_token_freelist = old_token_index;
+  TRUE_KILL_WTOKEN(rec->word_token_array[rec->word_token_freelist]);
+}
+
+int reprune_word_tokens(srec* rec, costdata current_best_cost)
+{
+  int i, keep_astar_prune;
+  arc_token* keep_arc_token_list;
+
+  stokenID stoken_index;
+  fsmarc_token* stoken;
+  wtokenID btindex;
+  word_token* bttoken;
+  wtokenID wtoken_index;
+  word_token* wtoken;
+  altword_token* awtoken;
+
+  /* remember things about the astar before changing it for local purposes */
+  keep_astar_prune = rec->astar_stack->prune_delta;
+  /* rec->astar_stack->prune_delta = 400; */
+  /* ignore the grammar constraints for this quick astar backward pass */
+  keep_arc_token_list = rec->context->arc_token_list;
+  rec->context->arc_token_list = 0;
+
+  /* we will flag all wtokens to be kept */
+
+  /* initialize the flags to keep all */
+  memset(rec->word_token_array_flags, 0, sizeof(rec->word_token_array_flags[0])*rec->word_token_array_size);
+
+  /* flag all those tokens not active, ie already free */
+  wtoken_index = rec->word_token_freelist;
+  for (; wtoken_index != MAXwtokenID; wtoken_index = wtoken->next_token_index)
+  {
+    wtoken = &rec->word_token_array[wtoken_index];
+    rec->word_token_array_flags[wtoken_index]--;  /* already deleted */
+  }
+
+  /* flag along the best active state paths */
+  stoken_index = rec->active_fsmarc_tokens;
+  for (; stoken_index != MAXstokenID; stoken_index = stoken->next_token_index)
+  {
+    stoken = &rec->fsmarc_token_array[ stoken_index];
+    for (i = 0; i < stoken->num_hmm_states; i++)
+    {
+      btindex = stoken->word_backtrace[i];
+      for (; btindex != MAXwtokenID; btindex = bttoken->backtrace)
+      {
+        bttoken = &rec->word_token_array[ btindex];
+        ASSERT(rec->word_token_array_flags[ btindex] >= 0);
+        rec->word_token_array_flags[ btindex] = 1;
+      }
+      for (awtoken = stoken->aword_backtrace[i]; awtoken;
+           awtoken = awtoken->next_token)
+      {
+        btindex = awtoken->word_backtrace;
+        for (; btindex != MAXwtokenID; btindex = bttoken->backtrace)
+        {
+          bttoken = &rec->word_token_array[ btindex];
+          rec->word_token_array_flags[ btindex] = 1;
+        }
+      }
+    }
+  }
+
+  /* run the astar and flag a little more */
+  astar_stack_prepare_from_active_search(rec->astar_stack, 100, rec);
+  astar_stack_do_backwards_search(rec, 100);
+  astar_stack_flag_word_tokens_used(rec->astar_stack, rec);
+  astar_stack_clear(rec->astar_stack);
+
+  /* kill_word_tokens */
+  for (i = 0; i < rec->word_token_array_size; i++)
+  {
+    if (rec->word_token_array_flags[i] == 0) /* < 0 are already free! */
+      free_word_token_from_lattice(rec, (frameID)i);
+  }
+
+  /* set this back to a regular astar from remembered values */
+  rec->context->arc_token_list = keep_arc_token_list;
+  rec->astar_stack->prune_delta = (costdata) keep_astar_prune;
+
+  SREC_STATS_INC_WTOKEN_REPRUNES(1);
+  return 0;
+}
+
diff --git a/srec/include/all_defs.h b/srec/include/all_defs.h
new file mode 100644
index 0000000..5d076d7
--- /dev/null
+++ b/srec/include/all_defs.h
@@ -0,0 +1,127 @@
+/*---------------------------------------------------------------------------*
+ *  all_defs.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _h_all_defs_
+#define _h_all_defs_
+
+#include "ptypes.h"
+#include "setting.h"
+
+#define USE_CONFIDENCE_SCORER 1
+
+/* constants */
+/* Model constants */
+#define MAX_LABEL       40      /* Maximum permitted label length */
+#define MAX_STRING      1024    /* Maximum permitted string length */
+#define MAX_FILE_NAME 256     /* Maximum permitted filename length */
+#define ALLOC_BLOCK     100
+#define MAX_STREAM      32      /* max no. of streams in prog, not file */
+#define MAX_DIMEN 64
+#define MAX_PELS        128
+
+/* Likelihood calculations */
+#define ADD_LOG_LIMIT    8
+#define SCORE_ADJUST     4
+#define SIGMA_BIAS       4
+#define MUL_SCALE        6.4F
+#define WT_SCALE         6.4F /* log weights */
+#define WT_ADJUST  2 /* in bits, for exp table lookup */
+#define WEIGHT_SHIFT  10
+#define WEIGHT_SCALE  (0x01 << WEIGHT_SHIFT) /* absolute weights */
+#define MAX_WTS   400 /* Needs to be tuned, dependent on some scales */
+#define IMELDA_SCALE     14 /* Applicable only for grand variance */
+#define EIGEN            1      /* for full covariance probability calc. */
+#define EUCLID_SHIFT     14 /* Scaling for FIXED_POINT in shifts */
+
+/* MLLR and Baum-Welch */
+/*dahan20070525
+#define MEAN_SCALE 20 // MLLR coefficients
+#define MEAN_OFFSET 128 // MLLR coefficients 
+#define MAX_MLLR_TRANSFORMS 50
+#define EPSILON         0.001F
+#define MAX_OCCUPANCY   1000
+#define ITEM_WEIGHT     1       // item weighting for covariance calc. 
+// otherwise gamma weighted 
+#define GAMMA_SIGNI     0.0001  // minimum occupancy accumulates 
+*/
+
+/* state duration constants */
+#define DUR_BIAS        0       /* duration penalty bias, changed elsewhere */
+#define NEWTON_FACTOR   10.0F   /* for converting duration to penalties */
+#define DEFAULT_UNIT_PER_FRAME 1
+#define FRAME_RATE_IN_MS 10
+#define UTB_MEAN        127.5F  /* mean of parameters in utb file */
+
+/* utterence constants */
+#define NORM_IN_IMELDA     0 /* Do channel normalization in IMELDA space */
+#define MAX_CEP_DIM     12
+#define MAX_CHAN_DIM     36
+#define MAX_FILTER_NUM     32 /* spectrum filter read as frontend pars  (centre freq, spread)*/
+#define NEW_UTB      1 /* support for latest (version 5) UTB files */
+/* with this set to zero supports version 3 files */
+
+
+/* phonemes and contexts */
+#define MAX_PHONEMES     128
+#define MAX_PHONE_STATES 6
+
+#define True  ESR_TRUE /*  Boolean constants */
+#define False  ESR_FALSE
+
+#define LITTLE          0       /* endian types */
+#define BIG             1
+/*  Configuration options
+    useful arithmetic functions and constants */
+#ifndef MAX
+#define MAX(X,Y)        ((X) > (Y) ? (X) : (Y))
+#endif
+#ifndef MIN
+#define MIN(X,Y)        ((X) < (Y) ? (X) : (Y))
+#endif
+#ifndef RANGE
+#define RANGE(X,Y,Z)        ((X) < (Y) ? (Y) : (X) > (Z) ? (Z) : (X))
+#endif
+#define SQR(X)          ((X) * (X))
+#define MAKEBYTE(X)     ((X) > 255 ? 255: ((X) < 0 ? 0 : (X)))
+#define ROUNDOFF(X) ((int)((X) >= 0 ? ((X) + 0.5) : ((X) - 0.5)))
+
+#ifndef M_PI
+#define M_PI            3.14159265358979323846  
+#endif /* M_PI */
+
+#define MAX_LOG  1000000                 /* Check this value against types */
+#define FIXED_MAX 32767
+
+
+#define D_SHORT         1L            /* Frame data types */
+#define D_LONG          2L
+#define D_FLOAT         3L
+#define D_PTR           4L
+#define D_CHAR          5L
+#define D_UCHAR         6L
+#define D_USHORT        7L
+#define D_INT           8L
+#define D_UINT          9L
+#define D_ULONG        10L
+#define D_DOUBLE       11L
+
+#define USE_SYSTEM_MEMMOVE  1  /* memmove redefinitions, do not change */
+
+#endif
diff --git a/srec/include/ann_util.h b/srec/include/ann_util.h
new file mode 100644
index 0000000..87708b4
--- /dev/null
+++ b/srec/include/ann_util.h
@@ -0,0 +1,86 @@
+/*---------------------------------------------------------------------------*
+ *  ann_util.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _ANNOTATE_UTITITIES_INCLUDED_
+#define _ANNOTATE_UTITITIES_INCLUDED_
+
+
+#include "utteranc.h"
+#include "c42mul.h"
+
+#ifdef SET_RCSID
+static const char col_util_h[] = "$Id: ann_util.h,v 1.1.10.4 2007/08/31 17:44:52 dahan Exp $";
+#endif
+#define TCP_BLOCK_SIZE 10
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  annotate  *tcp;
+  int   numWords;
+  int   NumFrames;
+  int                 snr;
+}
+annotate_info;
+
+
+annotate_info* allocate_annotation(void);
+void annotation_create_tcp_entry(annotate_info* hAnnotation ,
+                                 char* label);
+                                 
+void free_annotation(annotate_info* hAnnotation);
+
+
+
+int annotation_delete_segment(annotate_info* hAnnotation, int id);
+int annotation_delete_leading_segments(annotate_info* hAnnotation,
+                                       int num_to_delete, int num_to_keep, int min_length, int max_length,
+                                       int min_sil_dur);
+void annotation_delete_segment_info(annotate_info* hAnnotation);
+void annotation_decorate_labels(annotate_info* hAnnotation, char *label);
+int annotation_segment_utterance(annotate_info* hAnnotation,
+                                 utterance_info* utt,
+                                 preprocessed *prep,
+                                 char *label,
+                                 int *has_trailing_silence);
+                                 
+int annotation_add_utt_segment_to_acoustic(model_info *acc,
+    preprocessed *prep,
+    utterance_info* utt,
+    annotate_info* hAnnotation,
+    char* base_label,
+    int do_backup);
+int  annotation_from_voicing(annotate_info * hAnnotation,
+                             utterance_info * utt,
+                             preprocessed * prep);
+int annotation_compare(annotate_info *test_annotation,
+                       annotate_info *ref_annotation);
+void save_annotations(annotate_info* hAnnotation, char* FileName);
+int annotation_from_results(annotate_info *hAnnotation, srec *rec);
+void annotation_get_data(annotate_info* hAnnotation, int id,
+                         int* begin, int* end,  char* buff, int buffLen);
+int construct_syntax_for_annotation(syntax_info *rule, annotate_info* hAnnotation);
+
+int find_beep_in_utterance(annotate_info *hAnnotation, utterance_info *utt,
+                           utterance_info *beep_utt, preprocessed *prep, char *label);
+int detect_beep_by_shape(preprocessed  *prep, utterance_info *utt1,
+                         utterance_info *utt2, int *start, int *end);
+#endif 
diff --git a/srec/include/astar.h b/srec/include/astar.h
new file mode 100644
index 0000000..87db174
--- /dev/null
+++ b/srec/include/astar.h
@@ -0,0 +1,131 @@
+/*---------------------------------------------------------------------------*
+ *  astar.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __ASTAR_H__
+#define __ASTAR_H__
+
+#include "search_network.h"
+#include "srec_sizes.h"
+#include "sizes.h"
+
+/*********************************************************************
+ *                                                                   *
+ * Word Graph for Astar                                              *
+ *                                                                   *
+ *********************************************************************/
+
+/* #define DEBUG_ASTAR 1 */
+
+/* an arc_token is used for the word graph, this implementation
+   removes the need for nodes, and allows arc_tokens to be
+   freed and re-used easily for dynamic grammar creation.
+   Why do away with nodes?  Nodes need a list of outgoing arcs,
+   or arc pointers.  Rather than store this arc list as an array,
+   we can store it as a linked list, for easy addition/removal.
+   Nodes are now just a pointer to the first arc in a linked list.
+   But further, why not just reference the "first_arc" instead of
+   a node?  That's what we're doing here.  The "end_node" is
+   really an arc, whose arc->first_next_arc is NULL.
+
+   This experimental implementation is working for the moment!
+*/
+
+/* VxWorks 5.4 does not support unnamed struct/union yet */
+/* here we use indices to link one arc token to the next */
+#define ARC_TOKEN_LNK(bAsE,iDx) ((arcID)iDx)
+#define ARC_TOKEN_PTR(bAsE,atp) (atp==MAXarcID?NULL:bAsE+atp)
+#define ARC_TOKEN_PTR2LNK(bAsE,atp) (atp==NULL?MAXarcID:(arcID)(atp-bAsE))
+#define ARC_TOKEN_IDX(bAsE,atp) (atp)
+#define ARC_TOKEN_NULL MAXarcID
+typedef arcID      arc_token_lnk;
+typedef struct arc_token_t
+{
+#ifdef DEBUG_ASTAR
+  char* label, debug[64];
+#endif
+  wordID  ilabel;                  /* input label */
+  labelID olabel;                  /* output label */
+  arc_token_lnk first_next_arc;
+  arc_token_lnk next_token_index;
+}
+arc_token;
+
+/**
+ * @todo document
+ */
+typedef struct partial_path_t
+{
+  wtokenID token_index;
+  wordID   word;           /* quick access to word (wta[token_index].word) */
+  bigcostdata costsofar;   /* quick access to total score, frwd+bkwd */
+  struct partial_path_t* next;
+  struct partial_path_t* first_prev_arc;
+  struct partial_path_t* linkl_prev_arc;
+  arc_token* arc_for_wtoken;
+  short refcount;
+  struct partial_path_t* hashlink;
+}
+partial_path;
+#define PARP_TERMINAL         ((partial_path*)-1)
+
+typedef struct
+{
+
+  partial_path* free_parp_list;
+  partial_path* partial_path_array;
+  int partial_path_array_size;
+  
+  /* todo: replace these pointers with partial_path_token type things */
+  int max_active_paths;
+  int num_active_paths;
+  partial_path** active_paths;    /* partial paths, sorted by score */
+  
+  int max_complete_paths;
+  int num_complete_paths;
+  partial_path** complete_paths;
+  int* complete_path_confidences;
+  partial_path* root_path;        /* root is the rightmost partial path
+           to be used for as root of a tree
+           for checking paths already visited */
+  costdata prune_delta;
+  void* pphash;
+}
+AstarStack;
+
+typedef struct srec_t srec;
+typedef srec* psrec;
+
+int astar_stack_do_backwards_search(psrec rec, int request_nbest_len);
+int astar_stack_prepare(AstarStack* stack, int request_nbest_len, psrec rec);
+int astar_stack_prepare_from_active_search(AstarStack* stack, int request_nbest_len, psrec rec);
+void astar_stack_clear(AstarStack* stack);
+int astar_stack_flag_word_tokens_used(AstarStack* stack, psrec rec);
+AstarStack* astar_stack_make(psrec rec, int max_nbest_len);
+int astar_stack_destroy(psrec rec);
+
+void free_partial_path(AstarStack* stack, partial_path* parp);
+void print_path(partial_path* parp, psrec rec, char* msg);
+
+arc_token* get_arc_for_word(arc_token* atoken, wordID word, void* context_void,
+                            wordID terminal_word);
+                            
+arc_token* get_arc_for_word_without_slot_annotation(arc_token* atoken, const char* word,
+    void* context_void, wordID terminal_word);
+    
+#endif
diff --git a/srec/include/buildopt.h b/srec/include/buildopt.h
new file mode 100644
index 0000000..197a9e0
--- /dev/null
+++ b/srec/include/buildopt.h
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  buildopt.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _buildopt_h_
+#define _buildopt_h_
+
+#ifndef BUILD_SHIP
+#include "vcc_helper.h"
+#endif
+
+#define SET_RCSID
+
+#if BUILD & BUILD_SHIP
+#define USE_CREC_FILEUTILS     0     /* do not use portable libraries */
+#endif
+
+#endif
diff --git a/srec/include/c42mul.h b/srec/include/c42mul.h
new file mode 100644
index 0000000..fefcd6e
--- /dev/null
+++ b/srec/include/c42mul.h
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*
+ *  c42mul.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_c42mul_
+#define _h_c42mul_
+
+#ifdef SET_RCSID
+static const char c42mul_h[] = "$Id: c42mul.h,v 1.8.6.8 2008/03/07 19:46:58 dahan Exp $";
+#endif
+
+
+#include "prelib.h"
+#include "utteranc.h"
+#include "duk_args.h"
+#include "setting.h"
+#include "srec_sizes.h"
+#include "search_network.h"
+#include "srec.h"
+#include "swimodel.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  /*      Exception based error reporting */
+#define SETUP_RETURN(REC)   ((REC)->err_code= setjmp ((REC)->except_buf))
+#define RETURN_ERROR(CODE)  (rec->except_enabled ? longjmp(rec->except_buf, (CODE)) : SERVICE_ERROR(CODE))
+#define SET_ERROR(CODE)     (rec->err_code= CODE)
+
+  /*  Main calls to multi-line recognition
+  */
+  int multi_srec_viterbi(multi_srec *rec,
+                         srec_eos_detector_parms* eosd,
+                         pattern_info *pattern,
+                         utterance_info* utt);
+
+  void multi_srec_get_result(multi_srec *rec);
+  int activate_grammar_for_recognition(multi_srec* rec1, srec_context* context, const char* rule);
+  int clear_grammars_for_recognition(multi_srec* rec1);
+
+  void partial_traceback(multi_srec *rec, pattern_info *pattern,
+                         utterance_info *utt);
+  void begin_recognition(multi_srec *rec, int begin_syn_node);
+  void end_recognition(multi_srec *rec);
+  int  add_acoustic_model_for_recognition(multi_srec* rec, SWIModel* swimodel);
+  int  clear_acoustic_models_for_recognition(multi_srec* rec);
+
+  void free_recognition(multi_srec *rec);
+  int allocate_recognition(multi_srec *rec,
+                           int viterbi_prune_thresh,
+                           /* score-based pruning threshold - only keep paths within this delta of best cost*/
+                           int max_hmm_tokens,
+                           int max_fsmnode_tokens,
+                           int max_word_tokens,
+                           int max_altword_tokens,
+                           int num_wordends_per_frame,
+                           int max_fsm_nodes,
+                           int max_fsm_arcs,
+                           int max_frames,
+                           int max_model_states,
+                           int max_searches);
+
+  int compare_model_indices(multi_srec *rec1, srec *rec2);
+
+  void reset_utt_ended_in_result(multi_srec *rec, int sil_dur);
+  int  has_utt_ended_in_result(multi_srec *rec);
+
+
+#if DO_STRESS_CALC
+  void get_stress_in_segment(stress_info *stress, fepFramePkt *frmPkt,
+                             int start, int end, int relative_to_pullp);
+#endif
+
+
+  /*  Utterance stuff moved in here
+  */
+  int get_data_frame(preprocessed *predat, utterance_info *utt);
+  int get_utterance_frame(preprocessed *predat, utterance_info *utt);
+  int advance_utterance_frame(utterance_info *utt);
+  int retreat_utterance_frame(utterance_info *utt);
+  int copy_pattern_frame(utterance_info *oututt, preprocessed *prep);
+  void prepare_data_frame(preprocessed *predat);
+  void convert_adjustment_to_imelda(norm_info *norm, preprocessed *prep);
+
+  int inherit_recognition_statistics(utterance_info *utt, multi_srec *recog,
+                                     int norm_dim);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/srec/include/caexcept.h b/srec/include/caexcept.h
new file mode 100644
index 0000000..7ee3f5a
--- /dev/null
+++ b/srec/include/caexcept.h
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*
+ *  caexcept.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _h_caexcept_
+#define _h_caexcept_
+
+#ifdef SET_RCSID
+static const char caexcept_h[] = "$Id: caexcept.h,v 1.1.10.2 2007/08/31 17:44:52 dahan Exp $";
+#endif
+
+
+#include "duk_err.h"
+
+
+#ifdef USE_EXCEPTION_HANDLING
+
+typedef crecXceptn CA_Exception;
+
+#define TRY_CA_EXCEPT try{
+
+#define BEG_CATCH_CA_EXCEPT }catch( CA_Exception* e ){
+
+#define END_CATCH_CA_EXCEPT( Obj )      \
+  rethrow_crec_xception(e, (void*) Obj );     \
+  }
+
+#else
+
+#define TRY_CA_EXCEPT
+
+#define BEG_CATCH_CA_EXCEPT if(0){
+
+#define END_CATCH_CA_EXCEPT( Obj ) }
+
+#endif
+
+
+#endif /* _h_caexcept_ */
diff --git a/srec/include/channorm.h b/srec/include/channorm.h
new file mode 100644
index 0000000..c90951a
--- /dev/null
+++ b/srec/include/channorm.h
@@ -0,0 +1,66 @@
+/*---------------------------------------------------------------------------*
+ *  channorm.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+#ifndef __channorm_h
+#define __channorm_h
+
+#ifdef SET_RCSID
+static const char channorm_h[] = "$Id: channorm.h,v 1.1.10.4 2007/08/31 17:44:52 dahan Exp $";
+#endif
+
+#include "all_defs.h"
+#include "hmm_type.h"
+#include "specnorm.h"
+
+
+typedef struct
+{
+  int dim;
+  int init[MAX_CHAN_DIM];              /*  Values located in the .CMN file */
+  int target[MAX_CHAN_DIM];            /*  Values located in the .TMN file */
+  int adjust[MAX_CHAN_DIM];
+  int adj_valid;
+  imeldata imelda_adjust[MAX_CHAN_DIM];
+}
+norm_info;
+
+norm_info *create_channel_normalization(void);
+void destroy_channel_normalization(norm_info *channorm);
+void apply_channel_normalization(norm_info *channorm, imeldata *fram,
+                                 int dimen);
+void apply_channel_normalization_in_imelda(norm_info *channorm,
+    imeldata *outframe,
+    imeldata *frame, int dimen);
+void estimate_normalization_parameters(norm_info *channorm,
+                                       spect_dist_info **chandata, int dimen);
+void setup_channel_normalization(norm_info *channorm,
+                                 spect_dist_info **chandata, int dimen,
+                                 int forget_factor);
+void clear_channel_normalization(spect_dist_info **chandata, int dimen);
+int load_channel_parameters(char *basename, norm_info *channorm);
+
+void setup_ambient_estimation(spect_dist_info **backchan, int dimen,
+                              int forget_factor);
+void clear_ambient_estimation(spect_dist_info **backchan, int dimen);
+
+
+#endif
diff --git a/srec/include/comp_stats.h b/srec/include/comp_stats.h
new file mode 100644
index 0000000..859d918
--- /dev/null
+++ b/srec/include/comp_stats.h
@@ -0,0 +1,143 @@
+/*---------------------------------------------------------------------------*
+ *  comp_stats.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __COMP_STATS_H__
+#define __COMP_STATS_H__
+
+
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "pstdio.h"
+
+#ifdef _WIN32
+#include <windows.h>
+typedef __int64 CS_TIME;
+typedef __int64 CS_ACC_TIME;
+#else
+typedef clock_t CS_TIME;
+typedef unsigned long CS_ACC_TIME;
+#endif
+
+#ifdef __vxworks
+/*
+ * the reason to rename the functions is:
+ * Xanavi project required to combine S2G and Solo together, Solo has the same API
+ * duplicate function names are not allowed in VxWorks
+ */
+#define init_comp_stats init_comp_stats_esr
+#define dump_comp_stats dump_comp_stats_esr
+
+#define init_cs_clock   init_cs_clock_esr
+#define print_cs_clock  print_cs_clock_esr
+
+#define start_cs_clock  start_cs_clock_esr
+#define end_cs_clock    end_cs_clock_esr
+
+#define reset_cs_clock  reset_cs_clock_esr
+#define reset_cs_clock  reset_cs_clock_esr
+#define make_cs_clock   make_cs_clock_esr
+
+#endif
+
+/**
+ * @todo document
+ */
+typedef struct CS_CLOCK_t
+{
+  CS_TIME last;
+  CS_ACC_TIME total_time;
+  double clocks_per_msec;
+  int ncalls;
+  int item_count;
+}
+CS_CLOCK;
+
+/**
+ * @todo document
+ */
+typedef struct COMP_STATS_t
+{
+  CS_CLOCK overall_search;
+  CS_CLOCK models;
+  CS_CLOCK fsm_to_hmm;
+  CS_CLOCK hmm_to_fsm;
+  CS_CLOCK internal_hmm;
+  CS_CLOCK epsilon;
+  CS_CLOCK prune;
+  CS_CLOCK front_end;
+  CS_CLOCK word_lookup;
+  CS_CLOCK word_addition;
+  float total_time;   /*in seconds*/
+  CS_CLOCK astar;
+}
+COMP_STATS;
+
+
+void reset_cs_clock(CS_CLOCK *clock);
+void init_cs_clock(CS_CLOCK *c);
+CS_CLOCK *make_cs_clock(void);
+
+#if defined(__cplusplus) && !defined(_ASCPP)
+extern "C"
+{
+#endif
+  COMP_STATS *init_comp_stats(void);
+  void start_cs_clock(CS_CLOCK *clock);
+  void end_cs_clock(CS_CLOCK *c, int count);
+#if defined(__cplusplus) && !defined(_ASCPP)
+}
+#endif
+
+void print_cs_clock(CS_CLOCK *c, float num_seconds, PFile* fp, char *prompt, char *item_name);
+void dump_comp_stats(COMP_STATS *c, PFile* fp);
+
+#if USE_COMP_STATS
+#if defined(__cplusplus) && !defined(_ASCPP)
+extern "C"
+{
+#endif
+  extern COMP_STATS *comp_stats;
+#if defined(__cplusplus) && !defined(_ASCPP)
+}
+#endif
+#define init_comp_stats1()        init_comp_stats()
+#define reset_cs_clock1( CLK)     reset_cs_clock( CLK)
+#define init_cs_clock1( CLK)      init_cs_clock( CLK)
+#define make_cs_clock1()          make_cs_clock()
+#define start_cs_clock1( CLK)     start_cs_clock( CLK)
+#define end_cs_clock1( CLK,CNT)   end_cs_clock( CLK,CNT)
+#define print_cs_clock1( CLK, NS,FP,PR,IN)  print_cs_clock( CLK, NS,FP,PR,IN)
+#define dump_comp_stats1( CS,FP)  dump_comp_stats( CS,FP)
+
+#else /* not USE_COMP_STATS */
+
+#define init_comp_stats1()
+#define reset_cs_clock1( CLK)
+#define init_cs_clock1( CLK)
+#define make_cs_clock1()
+#define start_cs_clock1( CLK)
+#define end_cs_clock1( CLK,CNT)
+#define print_cs_clock1( CLK, NS,FP,PR,IN)
+#define dump_comp_stats1( CS,FP)
+#endif
+
+#endif
diff --git a/srec/include/creccons.h b/srec/include/creccons.h
new file mode 100644
index 0000000..6f949ab
--- /dev/null
+++ b/srec/include/creccons.h
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------------*
+ *  creccons.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __creccons_h
+#define __creccons_h
+
+/************************************************************************
+ * Constants
+ ************************************************************************/
+
+/************************************************************************
+ * CREC Wave Constants
+ ************************************************************************/
+
+#define DEVICE_RAW_PCM      1
+#define DEVICE_MULAW        2
+#define WAVE_DEVICE_RAW     1
+
+/************************************************************************
+ * CREC Utterance Constants
+ ************************************************************************/
+
+#define LIVE_INPUT                  2
+
+/************************************************************************
+ * CREC Recognizer Constants
+ ************************************************************************/
+
+#define FULL_RESULT      3
+#define REJECT_RESULT      4
+#define INVALID_REQUEST             5
+
+#define FB_DEAD                     0
+#define FB_IDLE                     1
+#define FB_ACTIVE                   2
+
+/************************************************************************
+ * CREC end of utterance constants
+ ************************************************************************/
+
+#define RESULTS_UTTERANCE_END 1
+#define SYNTAX_UTTERANCE_END  2
+
+#endif
diff --git a/srec/include/duk_args.h b/srec/include/duk_args.h
new file mode 100644
index 0000000..d5816b2
--- /dev/null
+++ b/srec/include/duk_args.h
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*
+ *  duk_args.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_arg_defs_
+#define _h_arg_defs_
+
+#ifdef SET_RCSID
+static const char duk_args_h[] = "$Id: duk_args.h,v 1.3.6.3 2007/08/31 17:44:52 dahan Exp $";
+#endif
+
+#include "all_defs.h"
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+
+
+/* argument types */
+#define A_BOO 1  /* A boolean, switch */
+#define A_STR 2  /* A string */
+#define A_INT 3  /* An integer */
+#define A_FLT 4  /* A floating point number */
+#define A_FIL 5  /* A file name */
+#define A_LIS 6  /* A list of strings */
+
+#define A_TYP_MASK 0x0f
+#define A_TYP(X)        (A_TYP_MASK & (X))
+
+/* Array flag */
+#define A_ARRAY  0x10
+#define A_IF_ARRAY(X) (A_ARRAY & (X))
+
+/* Mandatory arguments info */
+#define A_MAND  0x20
+#define A_IF_MAND(X) (A_MAND & (X))
+
+/* flagless arguments */
+#define A_NOF  0x40
+#define A_IF_NOF(X) (A_NOF & (X))
+
+/* private info */
+#define A_SET  0x80
+#define A_IF_SET(X) (A_SET & (X))
+
+/**
+ * @todo document
+ */
+typedef union
+{
+  char   *a_string;
+  int   *a_int;
+  float  *a_float;
+#ifndef _RTT
+  PFile** a_file;
+#endif
+  char  **a_list;
+}
+arg_name;
+
+typedef struct
+{
+  int   typ;
+  char  *flag;
+  int   max_args;
+  arg_name  name;
+  char  *def;
+}
+arg_info;
+
+#define SET_ARG_ENTRY(A,W,X,Y,Z) ((A)->typ=(W), (A)->flag=(X), (A)->name.a_string=(Y), (A)->max_args=1, (A)->def=(Z))
+#define SET_ARRAY_ARG_ENTRY(A,W,X,Y,N,Z) ((A)->typ=((W)|A_ARRAY), (A)->flag=(X), (A)->name.a_string=(Y), (A)->max_args=(N), (A)->def=(Z))
+
+int  parse_single_argument(arg_info *avlist, int avc, char *key, char *value,
+                           int count, int override, int *success);
+int  get_single_argument(arg_info *avlist, int avc, char *key, void *value,
+                         unsigned long *valueLen, int typ);
+int get_string_argument(arg_info *avlist, int avc, char *key, char *value, int valueLen, int *bytes_required, int typ);
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+  int  com_arg_parse(int argc, char **argv, int avc, arg_info *avlist,
+                     char *module);
+#ifdef __cplusplus
+}
+#endif
+int  get_arginfo_flags(arg_info *arglist, int argc, char buffer[], int buflen);
+int  is_flag_assigned(char *pattern, int avc, arg_info *avlist);
+void help_line(char *problem, int avc, arg_info *avlist);
+void statement(char *descinfo);
+
+#ifndef _RTT
+int  resource_arg_parse(const char *resname, char *module, int avc,
+                        arg_info *avlist);
+void save_parsed_args(const char *resname, char *module, int avc,
+                      arg_info *avlist);
+#endif  /* _RTT */
+                      
+typedef struct
+{
+  int  value;
+  char  *entry;
+}
+list_item;
+
+int lookup_list(list_item *list_data, int nlist, char *key);
+
+#endif /* _h_arg_defs_ */
diff --git a/srec/include/duk_err.h b/srec/include/duk_err.h
new file mode 100644
index 0000000..b721504
--- /dev/null
+++ b/srec/include/duk_err.h
@@ -0,0 +1,201 @@
+/*---------------------------------------------------------------------------*
+ *  duk_err.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _h_duk_err_
+#define _h_duk_err_
+
+#ifdef SET_RCSID
+static const char duk_err_h[] = "$Id: duk_err.h,v 1.5.6.5 2007/08/31 17:44:52 dahan Exp $";
+#endif
+
+/** Still need this enum */
+enum CrecException
+{
+  TIME_OUT_ERROR,  /* general operational errors */
+  FEATURE_NOT_SUPPORTED,
+  BAD_PARAMETER,
+  BAD_ARGUMENT,
+  BAD_INDEX,
+  UNEXPECTED_STATE_ERROR,
+  UNEXPECTED_DATA_ERROR,
+  PREMATURE_EXIT,
+  BAD_TUNNEL,
+  FFT_TOO_SMALL,
+  BAD_COSINE_TRANSFORM,
+  ZERO_SPACE_ALLOC,  /* memory allocation errors */
+  NO_SPACE_FOR_MALLOC,
+  NO_SPACE_FOR_REALLOC,
+  NO_SPACE_IN_OSHEAP,
+  FREE_INVALID_POINTER,
+  UNALLOCATED_VARIABLE,
+  UNFREED_VARIABLE,
+  STATE_LINK_ERROR,
+  NO_ACTIVE_PATHS,
+  SELF_LOOP_NODE,
+  POLLUTED_TRACEBACK,
+  NO_SPACE_FOR_LINKS,
+  NO_SPACE_FOR_HIST,
+  NO_SPACE_FOR_BACKPTR,
+  BAD_SYNTAX_NODE,
+  SYNTAX_UNSPECIFIED,
+  BAD_SYNTAX,
+  BAD_MODEL,
+  INCORRECT_MODEL_TYPE,
+  BAD_WW_MODEL_NAME,
+  NO_MODEL_FOR_SYNTAX,
+  MISMATCHED_MODEL_FOR_SYNTAX,
+  BAD_SILENCE_MODEL,
+  BAD_CONTEXT,
+  BAD_GRAMMAR,
+  BAD_MULTABLE,
+  BAD_PEL_DATA,
+  BAD_CHANNEL,
+  BAD_PICTYPE_IN_ARB,
+  STREAM_OPEN_FAILED,         /* data transmission errors */
+  STREAM_CLOSE_FAILED,
+  STREAM_READ_FAILED,
+  STREAM_WRITE_FAILED,
+  STREAM_ALREADY_OPEN,
+  FILE_OPEN_FAILED,  /* file handling errors */
+  FILE_SEEK_FAILED,
+  BAD_DATA_IN_FILE,
+  UNSUPPORTED_DATA_IN_FILE,
+  FILE_WRITE_ERROR,
+  FILE_READ_ERROR,
+  INCORRECT_FILE_VERSION,
+  MISSING_FILE_VERSION,
+  RECOGNITION_RESULT,  /* diagnostic messages */
+  DIAG_MESSAGE,
+  BAD_RESULT,
+  BAD_IMELDA,
+  BAD_MLLR_TRANSFORM,
+  BAD_COVARIANCE,
+  BAD_OPERATION,
+  SINGULAR_MATRIX,
+  BAD_WAV_DEVICE,
+  BAD_LATTICE,
+  NO_SPACE_FOR_LATTICE,
+  DFILE_EXCEPTION,
+  WINSOUND_EXCEPTION,
+  INTERNAL_ERROR,
+  RECOGNIZER_NOT_LOADED,
+  RECOGNIZER_ALREADY_LOADED,
+  RECOGNIZER_NOT_SETUP,
+  RECOGNIZER_ALREADY_SETUP,
+  RECOGNIZER_NOT_STARTED,
+  RECOGNIZER_ALREADY_STARTED,
+  RECOGNIZER_NOT_CONFIGURED,
+  RECOGNIZER_ALREADY_CONFIGURED,
+  RECOGNIZER_HAS_RESULTS,
+  RECOGNIZER_NO_RESULTS,
+  ACOUSTIC_ALREADY_LOADED,
+  ACOUSTIC_NOT_LOADED,
+  ACOUSTIC_HAS_PATTERN,
+  ACOUSTIC_HAS_NO_PATTERN,
+  ACOUSTIC_PATTERN_MISMATCH,
+  VOCAB_ALREADY_LOADED,
+  VOCAB_NOT_LOADED,
+  SYNTAX_GROUP_INVALID,
+  SYNTAX_GROUPS_NOT_COMMON,
+  SYNTAX_GROUP_MISMATCH,
+  SYNTAX_GROUP_NOT_EMPTY,
+  SYNTAX_RULE_INVALID,
+  SYNTAX_RULE_NOT_EMPTY,
+  SYNTAX_NOT_SETUP,
+  SYNTAX_ALREADY_SETUP,
+  UTTERANCE_UNKNOWN,
+  UTTERANCE_INVALID,
+  UTTERANCE_ALREADY_INITIALISED,
+  UTTERANCE_NOT_INITIALISED,
+  UTTERANCE_DIMEN_MISMATCH,
+  MODEL_DIMEN_MISMATCH,
+  PATTERN_NOT_LOADED,
+  PATTERN_ALREADY_LOADED,
+  PATTERN_NOT_SETUP,
+  PATTERN_ALREADY_SETUP,
+  PATTERN_NOT_SETUP_FOR_NOISE,
+  PATTERN_ALREADY_SETUP_FOR_NOISE,
+  ENDIAN_MISMATCH_ERROR,
+  IMAGE_BAD_FILETYPE,
+  IMAGE_BAD_ENDIAN,
+  RECOGNIZER_INPUT_NOT_LOADED,
+  PATTERN_INPUT_NOT_LOADED,
+  ACOUSTIC_INPUT_NOT_LOADED,
+  FRONTEND_INPUT_NOT_LOADED,
+  UNCONFIGURED_WAVE,
+  CONFIGURED_WAVE,
+  UNCONFIGURED_CMS_AND_AGC,
+  CONFIGURED_CMS_AND_AGC,
+  UNATTACHED_CMS_AND_AGC,
+  ATTACHED_CMS_AND_AGC,
+  BAD_CMS_AND_AGC_CONFIGURATION,
+  UNCONFIGURED_FRONTEND,
+  CONFIGURED_FRONTEND,
+  SPEC_FILTER_NOT_CONFIGURED,
+  SPEC_FILTER_CONFIGURED,
+  NONLINEAR_FILTER_NOT_CONFIGURED,
+  NONLINEAR_FILTER_CONFIGURED,
+  MAX_FILTER_POINTS_EXCEEDED,
+  MISMATCHED_BUFF_SIZES,
+  INCORRECT_SAMPLERATE,
+  OCCUPANCY_MISMATCH,
+  UNKNOWN_ARGUMENT,
+  CACHE_NOT_SETUP,
+  CACHE_ALREADY_SETUP,
+  BAD_PHONEME,
+  ANNOTATE_NO_SEGMENTS,
+  ANNOTATE_SEGMENTS_EXIST,
+  ANNOTATE_NO_LABEL,
+  BAD_LABEL,
+  FB_INVALID_STATE,
+  FB_FRAME_INVALID,
+  PIECEWISE_START,
+  WARP_SCALE,
+  NO_WARP,
+  SEGMENTATION_NOT_INIT,
+  SEGMENTATION_INIT,
+  ASSERT_FAILED
+};
+
+/**
+ * Service error.
+ */
+typedef struct
+{
+  char *msg;
+  enum CrecException code;
+  int is_fatal;
+}
+crecExceptionInfo;
+
+#ifdef USE_EXCEPTION_HANDLING
+
+typedef struct
+{
+  int  ca_rtti;
+  enum  CrecException   code;
+  char  *file_where_thrown;
+  int  line_where_thrown;
+  void  *err_object;
+}
+crecXceptn;
+#endif
+
+#endif /* _h_duk_err_ */
diff --git a/srec/include/duk_io.h b/srec/include/duk_io.h
new file mode 100644
index 0000000..6051d2b
--- /dev/null
+++ b/srec/include/duk_io.h
@@ -0,0 +1,68 @@
+/*---------------------------------------------------------------------------*
+ *  duk_io.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _h_dukio_
+#define _h_dukio_
+
+#ifdef SET_RCSID
+static const char duk_io_h[] = "$Id: duk_io.h,v 1.7.6.4 2007/08/31 17:44:53 dahan Exp $";
+#endif
+
+#ifndef _RTT
+#include <stdio.h>
+#endif
+
+#include "all_defs.h"
+#include "duk_err.h"
+#include "pstdio.h"
+
+/*  File types for whole word model and tcp files
+*/
+#define OS_DIR_DELIM    '/'  /* OS Directory Delimiter          */
+#define OS_EXT_DELIM    '.'  /* OS Filename Extension Delimeter */
+#define TCP_EXT         "tcp"  /* Transcription Extension   */
+#define MDL_EXT         "mdl"  /* Model         Extension   */
+#define FIELD_DELIM     '#'  /* Field         Delimeter   */
+
+#define filtered_fgets pfgets
+
+void extractBase(char*);
+int  extractFS(char*);
+char extractFT(char*);
+
+#if !defined(_RTT)
+#if defined(__cplusplus) && !defined(_ASCPP)
+extern "C"
+{
+#endif
+#if defined(__cplusplus) && !defined(_ASCPP)
+}
+#endif
+
+int  check_file_extension(char *filename, char *extension);
+void get_file_extension(char *filename, char *extension);
+
+void skip_line(PFile* fileptr);
+
+int  extractFS(char *name);
+char extractFT(char *name);
+#endif
+
+#endif /* _h_dukio_ */
diff --git a/srec/include/errhndl.h b/srec/include/errhndl.h
new file mode 100644
index 0000000..5c13647
--- /dev/null
+++ b/srec/include/errhndl.h
@@ -0,0 +1,38 @@
+/*---------------------------------------------------------------------------*
+ *  errhndl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __errhndl_h
+#define __errhndl_h
+
+/************************************************************************
+ * Error handling/handle checking...
+ *
+ * choke point for all CREC errors
+ ************************************************************************/
+
+int  isCrecErrHandlerSet(void);
+
+void invokeCrecErrHandler(char* file,
+                          int   line,
+                          char* errMsg,
+                          int   errCode,
+                          char* auxMsg,
+                          int   auxCode);
+                          
+#endif
diff --git a/srec/include/fft.h b/srec/include/fft.h
new file mode 100644
index 0000000..c050a32
--- /dev/null
+++ b/srec/include/fft.h
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------------*
+ *  fft.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+#ifndef _h_fft_
+#define _h_fft_
+
+
+#include "fronttyp.h"
+
+/*  These are the data objects associated with the FFT and IFFT
+**  which generate the modulated carriers
+*/
+
+
+#include "sp_fft.h"
+
+int  fft_perform_and_magsq(fft_info *fft);
+void do_magsq(fft_info *fft);
+
+void configure_fft(fft_info *fft, int size);
+int  place_sample_data(fft_info *fft, fftdata *seq, fftdata *smooth, int num);
+void unconfigure_fft(fft_info *fft);
+
+
+#endif /* _h_fft_ */
diff --git a/srec/include/fpi_tgt.h b/srec/include/fpi_tgt.h
new file mode 100644
index 0000000..2022bc5
--- /dev/null
+++ b/srec/include/fpi_tgt.h
@@ -0,0 +1,166 @@
+/*---------------------------------------------------------------------------*
+ *  fpi_tgt.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ *
+ *
+ */
+
+#ifndef __fpi_tgt_h
+#define __fpi_tgt_h
+
+#ifdef SET_RCSID
+static const char fpi_tgt_h[] = "$Id: fpi_tgt.h,v 1.1.10.3 2007/08/31 17:44:53 dahan Exp $";
+#endif
+
+
+
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "creccons.h"   /* CREC Public Constants    */
+
+#include "hmm_type.h"
+#include "specnorm.h"
+#include "voicing.h"
+
+#define QUICK 0
+
+/***********************************
+ * MACROs for Pointer Manipulation *
+ ***********************************/
+
+#if QUICK
+#define NEXT_FRAME_POINTER(PKT,X)   (((X) + (PKT)->frameSize) & (PKT)->stackMask)
+#define PREV_FRAME_POINTER(PKT,X)   (((X) - (PKT)->frameSize) & (PKT)->stackMask)
+#define FIX_FRAME_POINTER(PKT,X)    ((X) & (PKT)->stackMask)
+#define POINTER_GAP(PKT, LEAD, LAG) ((((LEAD) - (LAG)) & (PKT)->stackMask)/(PKT)->frameSize)
+#define CHECK_BOUND(PKT, X)         ((X) < (PKT)->frameStack ? NULL : (X) > (PKT)->lastFrameInStack ? NULL : (X))
+#else
+#define NEXT_FRAME_POINTER(PKT,X)   ((X) >= (PKT)->lastFrameInStack ? (PKT)->frameStack : (X) + (PKT)->frameSize)
+#define PREV_FRAME_POINTER(PKT,X)   ((X) <= (PKT)->frameStack ? (PKT)->lastFrameInStack : (X) - (PKT)->frameSize)
+#define FIX_FRAME_POINTER(PKT,X)    ((X) < (PKT)->frameStack ? (X) + (PKT)->featuresInStack \
+                                     : (X) > (PKT)->lastFrameInStack ? (X) - (PKT)->featuresInStack : (X))
+#define POINTER_GAP(PKT, LEAD, LAG) ((LEAD) >= (LAG) ? ((LEAD) - (LAG))/(PKT)->frameSize : ((PKT)->featuresInStack + (LEAD) - (LAG))/(PKT)->frameSize)
+#define CHECK_BOUND(PKT, X)         ((X) < (PKT)->frameStack ? NULL : (X) > (PKT)->lastFrameInStack ? NULL : (X))
+#endif
+
+#ifdef DEBUGSEM
+volatile int releaseCalled = 0;
+volatile int waitCalled = 0;
+#endif
+
+/************************************************************************
+ * Structures                                                           *
+ ************************************************************************/
+
+/****************
+ * Frame Buffer *
+ ****************/
+
+typedef struct
+{
+  volatile int  isCollecting;      /* Frame buffer is collecting */
+  featdata*     frameStack;        /* Pointer to Frame Stack          */
+  int           frameSize;         /* How many data items per frame?  */
+  int           uttDim;            /* How many spectral parameters?   */
+  int           frameStackSize;    /* How many frames in the Stack?   */
+  unsigned long stackMask;      /* Mask to fit stack size  */
+  int           featuresInStack;   /* How many features in the Stack? */
+  featdata*     lastFrameInStack;  /* Pointer to last frame           */
+  int           haveVoiced;      /* whether voice stack is valid */
+  volatile int  voicingDetected;   /* Voicing present in this buffer  */
+  volatile int  utt_ended;         /* end of utterance flag           */
+  volatile int  quietFrames;      /* consecutive quiet frames to end */
+  volatile int  uttTimeout;      /* Voicing present in this buffer  */
+  int           holdOffPeriod;     /* Copy of 'holdOff' argument      */
+  int           holdOff;           /* countdown of 'holdOffPeriod     */
+  
+  featdata* volatile pushp;        /* Ptr to frame being written      */
+  featdata* volatile pullp;        /* Ptr to next frame to be read    */
+  featdata* volatile pushBlkp;     /* pushp blocker                   */
+  
+  int    blockLen;      /* Blocking enabled to this length */
+  volatile int  pushBlocked;       /* Set if pushp ever gets blocked  */
+  unsigned long blockTime;         /* Last time frame was blocked     */
+  unsigned long pushTime;          /* Time of FEP frame               */
+  unsigned long pullTime;          /* Time of REC frame               */
+  unsigned long startTime;         /* Time of first frame of this utt */
+  unsigned long stopTime;          /* Time of first frame of this utt */
+  
+  volatile featdata  maxC0;      /* Maximum C0 tracked  */
+  volatile featdata  minC0;      /* Minimum C0 tracked  */
+}
+fepFramePkt;
+
+/************************************************************************
+ * Prototypes                                                           *
+ ************************************************************************/
+
+/*************************
+ * Both FEP and REC units
+ *************************/
+void      startFrameCollection(fepFramePkt* frmPkt);
+int          stopFrameCollection(fepFramePkt* frmPkt);
+
+/*************************
+ * For FEP unit Only (?) *
+ *************************/
+
+fepFramePkt* createFrameBuffer(int fCnt, int dimen, int blockLen, int doVoice);
+int          resizeFrameBuffer(fepFramePkt *frmPkt, int fCnt);
+int          clearFrameBuffer(fepFramePkt* frmPkt);
+int          destroyFrameBuffer(fepFramePkt* frmPkt);
+int          pushSingleFEPframe(fepFramePkt* frmPkt, featdata* parPtr, int voiceData);
+void      clearEndOfUtterance(fepFramePkt* frmPkt);
+void      setupEndOfUtterance(fepFramePkt* frmPkt, long timeout, long holdOff);
+
+/*************************
+ * For REC unit Only (?) *
+ *************************/
+
+int         setRECframePtr(fepFramePkt* frmPkt, int fCnt, int mode);
+featdata*   currentRECframePtr(fepFramePkt* frmPkt);
+featdata*   currentFEPframePtr(fepFramePkt* frmPkt);
+int         incRECframePtr(fepFramePkt* frmPkt);
+int         decRECframePtr(fepFramePkt* frmPkt);
+int         framesInBuffer(fepFramePkt* frmPkt);
+featdata    getVoicingCode(fepFramePkt *frmPkt, featdata *frmptr);
+void     setVoicingCode(fepFramePkt *frmPkt, featdata *frmptr, featdata vcode);
+unsigned long getRECframeTime(fepFramePkt* frmPkt);
+unsigned long getFEPframeTime(fepFramePkt* frmPkt);
+featdata    getCurrentC0(fepFramePkt* frmPkt);
+featdata    getMaximumC0(fepFramePkt* frmPkt);
+featdata    getMinimumC0(fepFramePkt* frmPkt);
+featdata    get_c0_peak_over_range(fepFramePkt *frmPkt, int start, int end);
+
+void        clearC0Entries(fepFramePkt* frmPkt);
+void     releaseBlockedFramesInBuffer(fepFramePkt* frmPkt);
+
+void    get_channel_statistics(fepFramePkt *frmPkt, int start, int end,
+                               spect_dist_info** spec, int num, int relative_to_pullp);
+int     get_background_statistics(fepFramePkt *frmPkt, int start, int end,
+                                  spect_dist_info** spec, int num, int relative_to_pullp);
+int     rec_frame_voicing_status(fepFramePkt *frmPkt);
+void    utterance_detection_fixup(fepFramePkt *frmPkt, featdata **last_pushp,
+                                  int voice_duration, int quite_duration,
+                                  int unsure_duration);
+                                  
+#endif
diff --git a/srec/include/front.h b/srec/include/front.h
new file mode 100644
index 0000000..bd75132
--- /dev/null
+++ b/srec/include/front.h
@@ -0,0 +1,292 @@
+/*---------------------------------------------------------------------------*
+ *  front.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_front_
+#define _h_front_
+
+#include "all_defs.h"
+#include "fronttyp.h"
+#include "log_tabl.h"
+#include "duk_err.h"
+#include "voicing.h"
+#include "specnorm.h"
+#include "channorm.h"
+#include "swicms.h"
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+#include "fft.h"
+#include "frontpar.h" /* Shared front end parameters structure. Native data types only. */
+
+
+#define SPEC_SUB        0
+#define SPEC_CORRECT    0
+#define BIGGER_WINDOW   0
+#define MIN_WARP_SCALE 0.5
+#define MAX_WARP_SCALE 1.5
+
+#define D_FIXED D_LONG
+
+
+
+#define FRAMERATE       100
+#define NUM_MEL_FREQS   30                      /* up to 3750 Hz. Now >5512 -BP */
+#define DELTA           3
+#define Q2              7
+#define NP  1025
+#define NF  40
+#define NC  40
+#define MEL_FREQ_ARRAY_SIZE 30
+
+
+/* Spectral sub def moved from spec_sub.c BP */
+#ifdef SET_RCSID
+static const char spec_sub_h[] = "$Id: front.h,v 1.2.10.9 2007/08/31 17:44:53 dahan Exp $";
+#endif
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  cepdata     *sub_vector;
+  int      is_valid;
+  unsigned int    frame_dur;
+  cepdata     scale;
+  unsigned int    count;
+}
+spectral_sub_info;
+
+
+/**
+ * Contains the data storage points associated with a channel.
+ */
+typedef struct
+{
+  size_t mel_dim;
+
+  /* WAVE data */
+  int buff_size;
+  samdata *outbuff;          /* incoming samples buffer */
+  samdata *refbuff;          /* outgoing samples buffer */
+  fftdata *prebuff;          /* buffer for preemphasised data */
+  fftdata *prerefbuff;       /* buffer for preemphasised data outgoing */
+  int     forget_factor;
+  norm_info *channorm;
+  swicms_norm_info *swicms;
+  spect_dist_info *spchchan[MAX_CHAN_DIM];
+
+  /* FREQ data */
+  int     shift;
+  int     num_freq;
+  cepdata *filterbank;
+  cepdata *filterbankref;
+  spectral_sub_info *spectral_sub;
+
+  /* CEP data */
+  int     frame_valid;          /* whether frame is valid */
+  long    frame_count;          /* frame count */
+  int     frame_delay;         /* ignore the first few frames */
+  cepdata *cep;                 /* cepstrum coefs. of prev. frames */
+  cepdata *rasta;
+  featdata *framdata;
+  bigdata lastx;
+}
+front_channel;
+
+
+
+/*  This is where the front end objects are defined
+     WAVE (front_wave)
+     FREQ (front_freq)
+     CEP  (front_cep)
+*/
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  size_t samdim;
+  int   samtyp;
+  int   samplerate;
+  coefdata    pre_mel;
+  int   high_clip;
+  int   low_clip;
+  int   max_per10000_clip;
+  int   max_dc_offset;
+  int   high_noise_level_bit;
+  int   low_speech_level_bit;
+  int   min_samples;
+}
+front_wave;
+
+
+/**
+ * FREQ object.
+ */
+typedef struct
+{
+  int     window_length;
+  int     samplerate;
+  int     framerate;
+  int     frame_period;                 /* the following 3 are private */
+  ESR_BOOL    do_spectral_sub;
+  int     do_nonlinear_filter;
+  ESR_BOOL    do_filterbank_input;
+  ESR_BOOL    do_filterbank_dump;
+  float   warp_scale;                     /*## */
+  float   piecewise_start;                     /*## */
+  int     low_cut;
+  int     high_cut;
+  int     num_fb_to_use;
+  int     *spectrum_filter;    /* List of FFT taps to filter */
+  int     spectrum_filter_num;
+  fftdata peakpickup;
+  fftdata peakpickdown;
+  int     cut_off_below, cut_off_above;
+  int     np, ns, nf, lognp;
+  fftdata fcb[NF];
+  fftdata *fc;
+  int     fcmid[NF+2];
+  fftdata fcscl[NF+1], framp[NP+1];
+  fftdata *ham;
+  fft_info fft;
+}
+front_freq;
+
+
+/**
+ * CEP object.
+ */
+typedef struct
+{
+  ESR_BOOL    do_dd_mel;
+  ESR_BOOL    do_rasta;
+  int     do_scales;
+  ESR_BOOL    do_plp;
+  size_t  mel_dim;
+  int     lpc_order;
+  ESR_BOOL    do_skip_even_frames;
+  ESR_BOOL    do_smooth_c0;
+  int     spectral_sub_frame_dur;
+  coefdata spec_sub_scale;
+  int     forget_factor;           /* preserve % of previous hist */
+  int     sv6_margin;
+  cepdata *melA_scale;
+  cepdata *melB_scale;
+  cepdata *dmelA_scale;
+  cepdata *dmelB_scale;
+  cepdata *ddmelA_scale;
+  cepdata *ddmelB_scale;
+  cepdata *rastaA_scale;
+  cepdata *rastaB_scale;
+  cepdata *mel_offset;
+  cepdata *mel_loop;
+  cepdata *cs;
+  log_table_info  logtab;
+}
+front_cep;
+
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  front_wave *waveobj;
+  front_freq *freqobj;
+  front_cep  *cepobj;
+  /* Internal memberrs that may need to be configurable. Currently constants
+  size_t mel_dim;
+  */
+}
+front_config;
+
+
+/*  Front end function declarations follow */
+
+
+front_config *config_frontend(void);
+int make_frame(front_channel *channel, front_wave *waveobj,
+               front_freq *freqobj, front_cep *cepobj,
+               voicing_info *voice,
+               samdata *inFramesWorth, samdata *refFramesWorth,
+               int num_samples,
+               featdata *framdata, featdata *voicedata);
+void standard_front_init(front_config *config, front_freq *freqobj);
+void init_cepstrum_analysis(front_config *config, front_freq *freqobj);
+
+
+void load_samples(front_channel *channel, int window_length,
+                  samdata *incom, samdata *outgo, int nsam);
+void filterbank_emulation(front_channel * channel, front_wave *waveobj,
+                          front_freq *freqobj, front_cep *cepobj, samdata *income, samdata *outgo,
+                          int num_samples);
+void cepstrum_params(front_channel *channel, front_wave *waveobj,
+                     front_freq *freqobj, front_cep *cepobj);
+int make_std_frame(front_channel *channel, front_cep *cepobj,
+                   featdata *hFrame);
+int purge_std_frames(front_channel *channel, front_cep *cepobj,
+                     featdata *hFrame, int frame);
+
+void init_spectral_sub(front_config *config, front_freq *freqobj);
+void close_spectral_sub(front_freq *freqobj);
+void reset_spectral_sub(front_freq *freqobj);
+void do_spectral_subtraction(cepdata *fbo, spectral_sub_info* spectral_sub,
+                             int num_freqs);
+
+int create_spectrum_filter(front_freq *freqobj, int *freq, int *spread);
+
+void clear_spectrum_filter(front_freq *freqobj);
+
+front_config *create_config_object(void) ;
+void setup_config_object(front_config *config, front_parameters *parameters);
+void clear_config_object(front_config *config);
+void delete_config_object(front_config *config);
+
+
+front_channel *create_channel_object(void) ;
+void delete_channel_object(front_channel *channel);
+void setup_channel_object(front_channel *channel, front_wave *waveobj,
+                          front_freq *freqobj, front_cep *cepobj);
+void clear_channel_object(front_channel *channel);
+void reset_channel_object(front_channel *channel);
+
+/*
+** Fixed pont front end
+**
+** Function:      Scaling (in bit shifts)
+**
+** preemphasis   -1
+** hamming-window    0
+** fft     0
+** magnitude   HFN
+** filterbank    0
+**
+** log
+** cosine    HFN-
+** regression    0
+** scaling
+*/
+
+
+#endif /* _h_front_ */
diff --git a/srec/include/frontapi.h b/srec/include/frontapi.h
new file mode 100644
index 0000000..a8ddcae
--- /dev/null
+++ b/srec/include/frontapi.h
@@ -0,0 +1,1133 @@
+/*---------------------------------------------------------------------------*
+ *  frontapi.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_frontapi_
+#define _h_frontapi_
+
+#include "creccons.h"   /* CREC Public Constants    */
+
+#include "front.h"
+#include "sample.h"
+#include "utteranc.h"
+#include "caexcept.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  /**
+   ************************************************************************
+   * SwigImageBegin       <- DO NOT MOVE THIS LINE !
+   *
+   * This is a CADOC Keyword section.
+   *
+   * If CADOC is instructed to create a SWIG I-File and this is one of the
+   * files in the input list, everything between the 'SwigImage Begin' and
+   * 'SwigImage End' keywords comment blocks will be copied 'as-is' to the
+   * SWIG I-File specified on the CADOC command line.
+   *
+   ************************************************************************
+   */
+#include "mutualob.h"
+  
+#ifndef SWIGBUILD
+  
+  typedef struct
+  {
+    int                 ca_rtti;
+    booldata            is_configured;
+    booldata            is_configuredForAgc;
+    booldata            is_configuredForVoicing;
+    booldata            is_attached;
+    wave_info           data;
+    voicing_info        voice;
+  }
+  CA_Wave;
+  
+  typedef struct
+  {
+    int                 ca_rtti;
+    booldata            is_configured;
+    booldata            is_filter_loaded;
+    int                 status;
+    int                 samplerate;
+    float               src_scale;
+    float               sink_scale;
+    int                 offset;
+    front_config        *config;
+  }
+  CA_Frontend;
+  
+#endif
+  
+  /**
+   ************************************************************************
+   * SwigImageEnd         <- DO NOT MOVE THIS LINE !
+   ************************************************************************
+   */
+  
+  /*
+  **  Frontend
+  */
+  
+  CA_Frontend* CA_AllocateFrontend(float srcscale,
+                                   int offset,
+                                   float sinkscale);
+  /**
+   *
+   * Params       srcscale    Gain applied to incoming wave data
+   *              offset      DC offset applied to incoming wave data
+   *              sinkscale   Gain applied to any wave data sinks
+   *
+   * Returns      Handle to new Front End object
+   *
+   * See          CA_FreeFrontend
+   *
+   ************************************************************************
+   * Allocates a front-end object
+   ************************************************************************
+   */
+  
+  
+  void CA_FreeFrontend(CA_Frontend* hFrontend);
+  /**
+   *
+   * Params       hFrontend   Handle to valid front-end object
+   *
+   * Returns      void
+   *
+   * See          CA_AllocateFrontend
+   *
+   ************************************************************************
+   * Deletes a front-end object
+   ************************************************************************
+   */
+  
+  
+  void CA_ConfigureFrontend(CA_Frontend *hFrontend,
+                            CA_FrontendInputParams *hFrontArgs);
+  /**
+   *
+   * Params       hFrontend   Handle to valid front-end object
+   *              hFrontpars  Handle to valid front-end input parameters object
+   *
+   * Returns      void
+   *
+   * See          CA_UnconfigureFrontend
+   *
+   ************************************************************************
+   * Set up the front end using the paramteters. This function
+   * configures the member Wave, Freq and Cep objects, by calling their
+   * create and setup functions.
+   ************************************************************************
+   */
+  
+  
+  void CA_SetWarpScale(CA_Frontend *hFrontend, float wscale);
+  /**
+   *
+   * Params       hFrontend   Handle to valid front-end object
+   *              wscale      warp scale
+   *
+   * Returns      void
+   *
+   * See          CA_SetFrontendParameter
+   *
+   ************************************************************************
+   ************************************************************************
+   */
+  
+  void CA_UnconfigureFrontend(CA_Frontend *hFrontend);
+  /**
+   *
+   * Params       hFrontend   Handle to valid front-end object
+   *
+   * Returns      void
+   *
+   * See          CA_ConfigureFrontend
+   *
+   ************************************************************************
+   * Undo all of the front end configurations
+   ************************************************************************
+   */
+  
+  
+  int  CA_MakeFrame(CA_Frontend* hFrontend,
+                    CA_Utterance* hUtt,
+                    CA_Wave* hWave);
+  /**
+   *
+   * Params       hFrontend   Handle to valid front-end object
+   *              hUtt        Handle to valid utterance object
+   *              hWave       Handle to valid wave object
+   *
+   * Returns      non-zero if a frame was constructed
+   *
+   ************************************************************************
+   * Constructs a single frame from audio in the wave object.  The output
+   * frame is inserted into the utterance.
+   *
+   * Frames may not be built. An initial start-up condition prevents
+   * the first few frames of audio from being used for frames, in this case
+   * this method returns zero to the caller.
+   ************************************************************************
+   */
+  
+  
+  int  CA_GetFrontendFramesPerValidFrame(CA_Frontend *hFrontend);
+  int  CA_GetFrontendSampleRate(CA_Frontend *hFrontend);
+  /**
+   *
+   * Params       hFrontend   Handle to valid front-end object
+   *
+   * Returns       Current sample rate (Hz)
+   *
+   * See          CA_ConfigureFrontend
+   *
+   ************************************************************************
+   * Gets the sample rate from the front end object
+   ************************************************************************
+   */
+  
+  
+  int  CA_GetFrontendUtteranceDimension(CA_Frontend *hFrontend);
+  /**
+   *
+   * Params       hFrontend   Handle to valid front-end object
+   *
+   * Returns      The dimension of utterance that the front end will build
+   *
+   * See          CA_InitUtteranceForFile
+   *              CA_InitUtteranceForFrontend
+   *              CA_LoadUtteranceFrame
+   *
+   ************************************************************************
+   * Returns the number of items in an utterance.
+   ************************************************************************
+   */
+  
+  
+  int  CA_GetRecognitionHoldoff(CA_FrontendInputParams *hFrontPar);
+  /**
+   *
+   * Params       hFrontpar  Handle to valid front-end input parameters object
+   *
+   * Returns      The minimum recognition holdoff period, i.e. the minimum
+   *              gap between the frontend and recognizer.
+   *
+   ************************************************************************
+   * Computes the Recognition Holdoff Parameter value.  Setting the par in
+   * a par file is unnecessary if this function is used.
+   ************************************************************************
+   */
+  
+  
+  /*
+  **  Channel normalization
+  */
+ESR_ReturnCode CA_GetCMSParameters ( CA_Wave *hWave, const LCHAR **param_string );
+ESR_ReturnCode CA_SetCMSParameters ( CA_Wave *hWave, const LCHAR *param_string );
+
+
+  void CA_ReLoadCMSParameters(CA_Wave *hWave,
+                              const char *basename);
+                              
+  void CA_LoadCMSParameters(CA_Wave *hWave,
+                            char *basename,
+                            CA_FrontendInputParams
+                            *hFrontArgs);
+  /**
+   *
+   * Params       hWave       Handle to valid wave object
+   *              basename    Forename of .cmn and .tmn files that store the parameters
+   *              hFrontPar       Handle to a valid CRhFrontendInputParams
+   *
+   * Returns      Nothing
+   *
+   * See          CA_ConfigureCMSparameters
+   *              CA_SaveCMSParameters
+   *              CA_AttachCMStoUtterance
+   *
+   ************************************************************************
+   * Loads CMS parameters from file.  Sets up the CMS calculations
+   * The .cmn and .tmn files must obviously have the same basename.
+   ************************************************************************
+   */
+  
+  
+  void CA_SaveCMSParameters(CA_Wave *hWave,
+                            const char *basename);
+  /**
+   *
+   * Params       hWave       Handle to valid wave object
+   *              basename    Forename of .cmn and .tmn files that are
+   *                          to store the parameters
+   *
+   * Returns      Nothing
+   *
+   * See          CA_LoadCMSParameters
+   *              CA_ClearCMSParameters
+   *
+   ************************************************************************
+   * This method writes out .CMN and .TMN files.
+   *
+   * The .CMN file may differ from the one used during a call to
+   * CA_LoadCMSParameters() due to channel adaptation.
+   *
+   * The .cmn and .tmn files will obviously have the same basename.
+   ************************************************************************
+   */
+  
+  
+  void CA_ClearCMSParameters(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave       Handle to valid wave object
+   *
+   * Returns      Nothing
+   *
+   * See          CA_LoadCMSParameters
+   *              CA_SaveCMSParameters
+   *              CA_DetachCMSfromUtterance
+   *
+   ************************************************************************
+   * This method clears any CMS information.  Must call
+   * CA_DetachCMSfromUtterance on the Wave first, if CA_AttachCMStoUtterance
+   * has been called.
+   ************************************************************************
+   */
+  
+  void CA_AttachCMStoUtterance(CA_Wave *hWave,
+                               CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *              hUtt    Handle to an utterance object to clear
+   *
+   * Returns      Nothing.
+   *
+   * See          CA_LoadCMSParameters
+   *              CA_DetachCMStoUtterance
+   *
+   ************************************************************************
+   *  The CMS data items are inherited from the CA_Wave object to the
+   *  CA_Utterance.  All calculations carried out with this utterance
+   *  object will now result in new statistics being inherited by the
+   *  CA_Wave object.
+   ************************************************************************
+   */
+  
+  /**
+   * Returns true if CMS is attached to utterance.
+   *
+   * @param hWave wave handle
+   * @param isAttached [out] True if attached
+   */
+  ESR_ReturnCode CA_IsCMSAttachedtoUtterance(CA_Wave* hWave, ESR_BOOL* isAttached);
+  
+  /**
+   * Returns true if CA_Wave is configured for Agc.
+   *
+   * @param hWave wave handle
+   * @param isAttached [out] True if attached
+   */
+  ESR_ReturnCode CA_IsConfiguredForAgc(CA_Wave* hWave, ESR_BOOL* isConfigured);
+  
+  void CA_DetachCMSfromUtterance(CA_Wave *hWave,
+                                 CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *              hUtt    Handle to an utterance object to clear
+   *
+   * Returns      Nothing.
+   *
+   * See          CA_LoadCMSParameters
+   *              CA_AttachCMStoUtterance
+   *              CA_ClearCMSParameters
+   *
+   ************************************************************************
+   *  The CMS data items are now dis-inherited by the CA_Utterance object.
+   *  Calculations carried out with this utterance
+   *  object will no longer result in new statistics being inherited by the
+   *  CA_Wave object.
+   ************************************************************************
+   */
+  
+  
+  void CA_CalculateCMSParameters(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave       Handle to valid wave object
+   *
+   * Returns
+   *
+   * See          CA_LoadCMSParameters
+   *              CA_AttachCMStoUtterance
+   *              CA_DiscardCMSAccumulates
+   *
+   ************************************************************************
+   * This routine updates the values used for cepstrum mean subtraction
+   * using a running estimation algorithm.
+   * A call must first have been made to CA_LoadCMSparameters and
+   * subsequently to a CA_AttachCMStoUtterance.
+   ************************************************************************
+   */
+  
+  
+  void CA_DiscardCMSAccumulates(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave       Handle to valid wave object
+   *
+   * Returns
+   *
+   * See          CA_LoadCMSParameters
+   *              CA_AttachCMStoUtterance
+   *              CA_CalculateCMSParameters
+   *
+   ************************************************************************
+   * This routine clears the updates used for the running estimation of
+   * cepstrum mean subtraction.
+   * CMS parameters must have been loaded and attached to the wave.
+   ************************************************************************
+   */
+  
+  
+  
+  /*
+  **  Wave
+  */
+  /**
+   ************************************************************************
+   * CA_Wave methods
+   *
+   * The wave-input object that represents a file or a device.
+   * It maintains sample buffers and data associated with that input stream
+   * such as agc, talk-over etc.
+   *
+   * However the process of getting samples into the CA_Wave object from
+   * a physical device is external to CREC-API.
+   ************************************************************************
+   */
+  
+  CA_Wave* CA_AllocateWave(char typ);
+  /**
+   *
+   * Params       typ     A waveform type charcater
+   *
+   * Returns      Handle to a new Wave structure
+   *
+   * See          CA_FreeWave
+   *              CA_ConfigureWave
+   *
+   ************************************************************************
+   * Creates a Wave structure.
+   *
+   * There are several options for the 'typ' character, each is listed below:
+   *  'M' mu-Law
+   *  'P' PCM  (i.e. 8k or 11kHz PCM Files)
+   *  'R' RIFF
+   *  'N' NIST
+   *
+   * Once allocated, the returned object should be configured with a call
+   * to CA_ConfigureWave().
+   ************************************************************************
+   */
+  
+  
+  void CA_ConfigureWave(CA_Wave *hWave,
+                        CA_Frontend *hFrontend);
+  /**
+   *
+   * Params       hWave   Handle to a previously created Wave structure
+   *              hFrontend   Handle to valid front-end object
+   *
+   * Returns      void
+   *
+   * See          CA_UnconfigureWave
+   *
+   ************************************************************************
+   * Initializes a Wave structure.
+   *
+   * This should be called before any other Wave methods.
+   ************************************************************************
+   */
+  
+  
+  void CA_ConfigureVoicingAnalysis(CA_Wave *hWave,
+                                   CA_FrontendInputParams *hFrontPar);
+  /**
+   *
+   * Params       hWave           Handle to a previously created Wave structure
+   *              hFrontPar       Handle to a valid CRhFrontendInputParams
+   *
+   * Returns      void
+   *
+   ************************************************************************
+   * Initializes a Wave's voicin analysis module.
+   ************************************************************************
+   */
+  
+  
+  void CA_ResetWave(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to a previously created Wave structure
+   *
+   * Returns      Nothing
+   *
+   ************************************************************************
+   * This prepares the wave object for re-use.  The voicing information
+   * is cleared. It is *essential* to call this function if the Wave object
+   * is used for streaming live data, or multiple-utterance wave files.
+   *
+   ************************************************************************
+   */
+  
+  
+  void CA_UnconfigureWave(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to a previously created Wave structure
+   *
+   * Returns      void
+   *
+   * See          CA_ConfigureWave
+   *
+   ************************************************************************
+   * Uninitializes a Wave structure.
+   ************************************************************************
+   */
+  
+  
+  void CA_FreeWave(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to a previously created Wave structure
+   *
+   * Returns      Nothing, the Wave object is no longer valid
+   *
+   * See          CA_AllocateWave
+   *
+   ************************************************************************
+   * Removes a previously allocated Wave structure
+   ************************************************************************
+   */
+  
+  
+  int  CA_OpenWaveFromFile(CA_Wave *hWave,
+                           char* filename,
+                           char typ,
+                           int endian,
+                           int do_write,
+                           int samplerate);
+  /**
+   *
+   * Params       hWave       Handle to valid Wave structure
+   *              filename    ASCII, null-terminated filename string
+   *              typ         File attribute character
+   *              endian      Binary storage, use 'LITTLE' or 'BIG'
+   *              do_write    Adds a RIFF header if non-ZERO
+   *              samplerate  File's sample rate (Hz)
+   *
+   * Returns      non-ZERO if successful
+   *
+   * See          CA_CloseFile
+   *
+   ************************************************************************
+   * Initializes the Wave structure for use with a known filename.
+   *
+   * There are several options for the 'typ' character, each is listed below:
+   *  'M' mu-Law Files
+   *  'P' PCM Files (i.e. 8k or 11kHz PCM Files)
+   *  'R' RIFF
+   *  'N' NIST
+   *
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  void CA_CloseFile(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      Nothing, the opened file is closed
+   *
+   * See          CA_OpenWaveFromFile
+   *
+   ************************************************************************
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  int  CA_OpenWaveFromDevice(CA_Wave *hWave,
+                             int wave_type,
+                             int samplerate,
+                             int device_id,
+                             int device_type);
+  /**
+   *
+   * Params       hWave       Handle to valid Wave structure
+   *              wave_type   Audio format
+   *              samplerate  Device sample rate (Hz)
+   *              device_id   The Physical device number of the
+   *                          waveform hardware (normally starting at 0)
+   *              device_type The type of device
+   *
+   * Returns      non-ZERO if successful
+   *
+   * See          CA_CloseDevice
+   *
+   ************************************************************************
+   * Initializes the Wave structure for use with a known filename.
+   *
+   * 'wave_type' should be either DEVICE_MULAW or DEVICE_RAW_PCM.  This
+   * enables correct internal interpretation of the audio samples.  If the
+   * device is an output device 'wave_type' should be 0 (ZERO).
+   *
+   * It is an error to call this function without first configuring hWave
+   *
+   * 'device_type' should be one of WAVE_DEVICE_MSWAVE (for real devices)
+   * or WAVE_DEVICE_RAW (if using the raw interface - CA_LoadSamples)
+   ************************************************************************
+   */
+  
+  
+  void CA_CloseDevice(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      Nothing, the opened device is closed
+   *
+   * See          CA_OpenWaveFromDevice
+   *
+   ************************************************************************
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  void CA_SetWaveBoostValue(CA_Wave *hWave,
+                            int waveBoost);
+  /**
+   *
+   * Params       hWave       Handle to valid Wave structure
+   *              waveBoost   The input sample scaling value (in %)
+   *
+   * Returns      void
+   *
+   ************************************************************************
+   * The 'offset' and 'gain' parameters are applied to the current
+   * waveform buffer and the resultant samples clamped to a 16-bit
+   * audio range.
+   *
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  int  CA_GetWaveBoostValue(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      The input sample scaling value (in %)
+   *
+   ************************************************************************
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  int  CA_GetSampleRate(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave       Handle to valid Wave structure
+   *
+   * Returns      Sample rate used by the wave device
+   *
+   * See          CA_LoadSamples
+   *              CA_ConfigureWave
+   *
+   ************************************************************************
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  void CA_CopyWaveSegment(CA_Wave *source,
+                          CA_Wave *sink,
+                          unsigned long offset,
+                          unsigned long length);
+  /**
+   *
+   * Params       source  Handle to valid Wave structure for source
+   *              sink    Handle to valid Wave structure for destination
+   *              offset  Sample number starting the segment (first sample == 0)
+   *              length  Number of samples in the segment
+   *
+   * Returns      Nothing, the wave segment in 'source' is copied to 'sink'
+   *
+   ************************************************************************
+   * This is useful when copying selected sections of a waveform.  It is
+   * employed within the SDXCollect_SinkWaveSegment() method.
+   *
+   * 'source' and 'sinks' must be different objects.
+   *
+   * It is an error to call this function without first configuring
+   * the 'source' and 'sink' wave objects.
+   ************************************************************************
+   */
+  
+  
+  int  CA_GetBufferSize(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave       Handle to valid Wave structure
+   *
+   * Returns      Buffer size (in bytes) used by the wave device for
+   *              the construction of a single frame.
+   *
+   * See          CA_LoadSamples
+   *              CA_ConfigureWave
+   *
+   ************************************************************************
+   * This function is supplied for use in conjunction with CA_LoadSamples.
+   * The application should call CA_CetBufferSIze on the current input Wave
+   * object and use the result to create the wave sample buffer that it will
+   * supply to CA_LoadSamples.
+   *
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+#ifndef SWIGBUILD
+  int  CA_LoadSamples(CA_Wave *hWave,
+                      samdata *pPCMData,
+                      int sampleCount);
+#else
+  int  CA_LoadSamples(CA_Wave *hWave,
+                      short *pPCMData,
+                      int sampleCount);
+#endif
+  /**
+   *
+   * Params       hWave       Handle to valid Wave structure
+   *              pPCMData    Pointer to a buffer created by the application.
+   *              sampleCount The number of samples in the supplied buffer.
+   *
+   * Returns      Buffer size (in bytes) used by the wave device for
+   *              the construction of a single frame.
+   *
+   * See          CA_GetBufferSize
+   *              CA_ConfigureWave
+   *
+   ************************************************************************
+   * The buffer contains exactly enough wave data to make one frame of an
+   * utterance. The required buffer size can be got by calling CA_GetBufferSize.
+   * The application is responsible for ensuring that the supplied sample
+   * data is in the correct format. The sample rate should match that of the
+   * recognizer, and the sample size should be of size 16 bits. CA_LoadSamples
+   * will check the sample count, and report an error if it does not match
+   * the front end's required buffer size.
+   *
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  int  CA_ReadSamplesForFrame(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      The number of samples read; <0 on failure.
+   *
+   * See          CA_SaveSamplesForFrame
+   *
+   ************************************************************************
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  int  CA_SaveSamplesForFrame(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      The number of samples read; <0 on failure.
+   *
+   * See          CA_ReadSamplesForFrame
+   *
+   ************************************************************************
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  void CA_ConditionSamples(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      Nothing. The incoming audio buffer is 'conditioned'.
+   *
+   ************************************************************************
+   * The 'offset' and 'gain' parameters are applied to the current
+   * waveform buffer and the resultant samples clamped to a 16-bit
+   * audio range.
+   *
+   * It is an error to call this function without first configuring hWave
+   ************************************************************************
+   */
+  
+  
+  void CA_CopyWaveSamples(CA_Wave *hWaveIn,
+                          CA_Wave *hWaveOut);
+  /**
+   *
+   * Params       hWaveIn     Handle to valid Wave object
+   *              hWaveOut    Handle to valid Wave object
+   *
+   * Returns      The audio samples in the In channel are
+   *              copied to the Out channel
+   *
+   ************************************************************************
+   * This method is provided to permit incoming audio sample to be copied
+   * to the sink for file storage.  The wave objects should have been
+   * created as appropriate sources or sinks.
+   *
+   * 'hWaveIn' and 'hWaveOut' must be different objects.
+   *
+   * It is an error to call this function without first configuring
+   * the 'hWaveIn' and 'hWaveOut' wave objects.
+   ************************************************************************
+   */
+  
+  
+  int  CA_WaveIsOutput(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      Boolean.
+   *
+   ************************************************************************
+   * Returns true if the Wave is setup as a sink of data
+   *
+   * It is an error to call this function without first configuring hWave
+   * and setting it up as a device or a file
+   ************************************************************************
+   */
+  
+  
+  int  CA_WaveIsInput(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      Boolean.
+   *
+   ************************************************************************
+   * Returns true if the Wave is setup as a source of data
+   *
+   * It is an error to call this function without first configuring hWave
+   * and setting it up as a device or a file
+   ************************************************************************
+   */
+  
+  
+  int  CA_WaveIsADevice(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      Boolean.
+   *
+   ************************************************************************
+   * Returns true if the Wave is setup as a device
+   *
+   * It is an error to call this function without first configuring hWave
+   * and setting it up as a device or a file
+   ************************************************************************
+   */
+  
+  
+  int  CA_WaveIsAFile(CA_Wave *hWave);
+  /**
+   *
+   * Params       hWave   Handle to valid Wave structure
+   *
+   * Returns      Boolean.
+   *
+   ************************************************************************
+   * Returns true if the Wave is setup as a file of data
+   *
+   * It is an error to call this function without first configuring hWave
+   * and setting it up as a device or a file
+   ************************************************************************
+   */
+  
+  void CA_StartSigCheck(CA_Wave *hWave);
+  void CA_StopSigCheck(CA_Wave *hWave);
+  void CA_ResetSigCheck(CA_Wave *hWave);
+  void CA_GetSigStats(CA_Wave *hWave, int *nsam, int *pclowclip, int *pchighclip,
+                      int *dc_offset, int *amp, int *pc5, int *pc95,
+                      int *overflow);
+  ESR_BOOL CA_DoSignalCheck(CA_Wave *hWave, ESR_BOOL *clipping, ESR_BOOL *dcoffset,
+                        ESR_BOOL *highnoise, ESR_BOOL *quietspeech, ESR_BOOL *too_few_samples,
+                        ESR_BOOL *too_many_samples);
+                        
+                        
+                        
+  /*  Frontend parameter API
+  */
+  /**
+   ************************************************************************
+   * CA_FrontendInputParams methods
+   *
+   * To load the front-end parameters from a par file
+   *
+   * This object holds input parameters (objtained from an ASCII
+   * parameter file) for the Front-End object.
+   *
+   * Apart from allocating and freeing the object it also has a method
+   * used to read a given parameter file.
+   ************************************************************************
+   */
+  
+  
+  
+  CA_FrontendInputParams* CA_AllocateFrontendParameters(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to new front-end input object
+   *
+   * See          CA_FreeFrontendParameters
+   *              CA_ConfigureFrontend
+   *
+   ************************************************************************
+   * Creates a new front-end input paramater onject
+   ************************************************************************
+   */
+  
+  
+  void CA_LoadFrontendParameters(CA_FrontendInputParams* hFrontpar,
+                                 const char* parfile);
+  /**
+   *
+   * Params       hFrontpar   valid front-end input object handle
+   *              parfile     par file
+   *
+   * Returns      void
+   *
+   * See          CA_SaveFrontendParameters
+   *              CA_ConfigureFrontend
+   *
+   ************************************************************************
+   * Loads known front-end parameters from the given .PAR file.
+   * The file is a .par file
+   ************************************************************************
+   */
+  
+  
+  void CA_FreeFrontendParameters(CA_FrontendInputParams* hFrontpar);
+  /**
+   *
+   * Params       hFrontpar   valid front-end input object handle
+   *
+   * Returns      void        front-end object is no longer valid
+   *
+   * See          CA_AllocateFrontendParameters
+   *
+   ************************************************************************
+   * Removes a previously allocated parameter object
+   ************************************************************************
+   */
+  
+  
+  void CA_SaveFrontendParameters(CA_FrontendInputParams* hFrontpar,
+                                 const char* parfile);
+  /**
+   *
+   * Params       hFrontpar   valid front-end input object handle
+   *              parfile     parameter (.par) file to read
+   *
+   * Returns      void
+   *
+   * See          CA_LoadFrontendParameters
+   *              CA_ConfigureFrontend
+   *
+   ************************************************************************
+   * Saves a previously loaded (modified) parameter file
+   *
+   * It is an error to call this function without first loading
+   * front-end input parameters.
+   ************************************************************************
+   */
+  
+  
+  int  CA_SetFrontendParameter(CA_FrontendInputParams *hFrontpar,
+                               char *key,
+                               char *value);
+  /**
+   *
+   * Params       hFrontpar   valid Front End Parameter handle
+   *              key         parameter key (text label)
+   *              value       new parameter value (text)
+   *
+   * Returns      Zero on error
+   *
+   * See          CA_GetFrontendStringParameter
+   *              CA_GetFrontendIntParameter
+   *              CA_GetFrontendFloatParameter
+   *              CA_LoadFrontendParameters
+   *
+   ************************************************************************
+   * Sets/Modifies a known Front End Input parameter.
+   *
+   * It is an error to call this function without first loading
+   * front-end input parameters.
+   ************************************************************************
+   */
+  
+  
+  int  CA_GetFrontendParameter(CA_FrontendInputParams *hFrontpar,
+                               char *key,
+                               void *value);
+  /**
+   *
+   * Params       hFrontpar   valid Front End Parameter handle
+   *              key         parameter key (text label)
+   *              value       pointer to store parameter value (text)
+   *              valueLen    size of value buffer
+   *
+   * Returns      False on error
+   *
+   * See          CA_SetFrontendParameter
+   *              CA_LoadFrontendParameters
+   *
+   ************************************************************************
+   * Reads a known Front End Parameter.
+   *
+   * It is an error to call this function without first loading
+   * front-end input parameters.
+   ************************************************************************
+   */
+  
+  int  CA_GetFrontendStringParameter(CA_FrontendInputParams *hFrontpar,
+                                     char *key,
+                                     char *value,
+                                     int valueLen,
+                                     int *bytes_required);
+  /**
+   *
+   * Params       hFrontpar   valid Front End Parameter handle
+   *              key         parameter key (text label)
+   *              value       pointer to store parameter value
+   *  value_len   number of bytes pointed to by value
+   *  bytes_required holds the number of bytes neededf to store the data
+   *
+   * Returns      False on error
+   *
+   * See          CA_SetFrontendParameter
+   *              CA_LoadFrontendParameters
+   *
+   ************************************************************************
+   * Reads a known Front End Parameter.
+   *
+   * It is an error to call this function without first loading
+   * front-end input parameters.
+   ************************************************************************
+   */
+  
+  int CA_LoadSpectrumFilter(CA_Frontend *hFrontend, char *basename);
+  /**
+   *
+   * Params       hFrontend   valid Frontend handle
+   *              basename    basename of filter file (a text file)
+   *              hFrontArs   valid Frontend parameters handle
+   *
+   * Returns      False on error
+   *
+   * See          CA_SetFrontendParameter
+   *              CA_LoadFrontendParameters
+   *
+   ************************************************************************
+   * Loads a spectrum filter from a file.
+   *
+   * It is an error to call this function without first loading
+   * front-end input parameters.
+   ************************************************************************
+   */
+  
+  void CA_ClearSpectrumFilter(CA_Frontend *hFrontend);
+  /**
+   *
+   * Params       hFrontend   valid Frontend handle
+   *
+   * Returns      void
+   *
+   * See          CA_LoadSpectrumFilter
+   *
+   ************************************************************************
+   * Clears a front end spectrum filter.
+   *
+   * It is an error to call this function without first loading
+   * front-end input parameters.
+   ************************************************************************
+   */
+  
+  int CA_IsSpectrumFilterLoaded(CA_Frontend *hFrontend);
+  /**
+   *
+   * Params       hFrontend   valid Frontend handle
+   *
+   * Returns      True if front end is loaded with a spectrum filter.
+   *
+   * See          CA_LoadSpectrumFilter
+   *
+   ************************************************************************
+   *
+   ************************************************************************
+   */
+  
+  void CA_EnableNonlinearFilter(CA_Frontend *hFrontend);
+  void CA_DisableNonlinearFilter(CA_Frontend *hFrontend);
+  void CA_EnableSpectrumFilter(CA_Frontend *hFrontend);
+  void CA_DisableSpectrumFilter(CA_Frontend *hFrontend);
+  
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/srec/include/frontpar.h b/srec/include/frontpar.h
new file mode 100644
index 0000000..74aeb41
--- /dev/null
+++ b/srec/include/frontpar.h
@@ -0,0 +1,89 @@
+/*---------------------------------------------------------------------------*
+ *  frontpar.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_frontpar_
+#define _h_frontpar_
+
+#include "hmm_type.h"
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int  ca_rtti;
+  booldata    is_loaded;
+  int   mel_dim;
+  int   samplerate;
+  float window_factor;
+  float pre_mel;
+  int   low_cut;
+  int   high_cut;
+  ESR_BOOL  do_skip_even_frames;
+  ESR_BOOL  do_smooth_c0;
+  float offset;
+  ESR_BOOL  do_dd_mel;
+  int   forget_factor;            /* preserve % of previous hist */
+  int   sv6_margin;
+  ESR_BOOL  do_rastac0;           /* rasta c0 is skipped if false. Don't really need this now.    */
+  ESR_BOOL  do_spectral_sub;
+  int   spectral_sub_frame_dur;
+  float spec_sub_scale;
+  ESR_BOOL  do_filterbank_dump;
+  ESR_BOOL  do_filterbank_input;
+  int   num_fb_to_use;
+  int   lpc_order;
+  float peakpickup;
+  float peakpickdown;
+  float warp_scale;                      /*## */
+  float piecewise_start;                      /*## */
+  int melA_scale[MAX_CEP_DIM];
+  int melB_scale[MAX_CEP_DIM];
+  int dmelA_scale[MAX_CEP_DIM];
+  int dmelB_scale[MAX_CEP_DIM];
+  int ddmelA_scale[MAX_CEP_DIM];
+  int ddmelB_scale[MAX_CEP_DIM];
+  int rastaA_scale[MAX_CEP_DIM];
+  int rastaB_scale[MAX_CEP_DIM];
+  int mel_offset[MAX_CHAN_DIM];
+  int mel_loop[MAX_CHAN_DIM];
+  int   spectrum_filter_freq[MAX_FILTER_NUM];
+  int   spectrum_filter_spread[MAX_FILTER_NUM];
+  int   voice_margin;
+  int   fast_voice_margin;
+  int   tracker_margin;
+  int   voice_duration;
+  int   quiet_duration;
+  int   unsure_duration;
+  int   start_windback;
+  int   high_clip;
+  int   low_clip;
+  int   max_per10000_clip;
+  int   max_dc_offset;
+  int   high_noise_level_bit;
+  int   low_speech_level_bit;
+  int   min_samples;
+}
+front_parameters;
+
+#endif /*_h_frontpar_ */
+
+
diff --git a/srec/include/fronttyp.h b/srec/include/fronttyp.h
new file mode 100644
index 0000000..ec1e639
--- /dev/null
+++ b/srec/include/fronttyp.h
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*
+ *  fronttyp.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _h_fronttyp_
+#define _h_fronttyp_
+
+typedef long     bigdata;
+typedef int     coefdata;
+typedef short     samdata;
+typedef int     fftdata; /* TODO: Swap in fixed point datatype when working */
+typedef int     cepdata;
+
+/******************************************************************************
+**  Fixed point processing macros. These are defined in non-fixed point build also.
+*******************************************************************************/
+
+#define COEFDATA_SIZE   32 /* coefficients */
+#define SAMDATA_SIZE    16 /* samples */
+#define FFTDATA_SIZE    32 /* fft internal data */
+#define CEPDATA_SIZE    32 /* cepstrum internal data */
+
+#define HALF_COEFDATA_SIZE      (COEFDATA_SIZE >> 1)
+#define HALF_SAMDATA_SIZE       (SAMDATA_SIZE >> 1)
+#define HALF_FFTDATA_SIZE       (FFTDATA_SIZE >> 1)
+#define HALF_CEPDATA_SIZE       (CEPDATA_SIZE >> 1)
+#define QUART_CEPDATA_SIZE      (CEPDATA_SIZE >> 2)
+#define QUART_FFTDATA_SIZE      (CEPDATA_SIZE >> 2)
+
+/*  scaling in terms of shifts */
+#define COSINE_TABLE_SHIFT HALF_CEPDATA_SIZE   /* minimum 5 */
+#define RAMP_SHIFT  6
+#define HALF_RAMP_SHIFT  (RAMP_SHIFT >> 1)
+#define COEFDATA_SHIFT  8
+#define HALF_COEFDATA_SHIFT (COEFDATA_SHIFT >> 1)
+#define WAVE_SHIFT  0
+#define BYTERANGE_SHIFT  1
+
+#endif
diff --git a/srec/include/hmm_desc.h b/srec/include/hmm_desc.h
new file mode 100644
index 0000000..c2d0279
--- /dev/null
+++ b/srec/include/hmm_desc.h
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------*
+ *  hmm_desc.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_hmm_desc_
+#define _h_hmm_desc_
+
+#ifdef SET_RCSID
+static const char hmm_desc_h[] = "$Id: hmm_desc.h,v 1.2.10.6 2008/01/21 20:30:05 dahan Exp $";
+#endif
+
+#include "creccons.h"   /* CREC Public Constants    */
+
+#include "all_defs.h"
+#include "hmm_type.h"
+#include "sizes.h"
+
+
+
+#define PDTYP(X)        ((X) & 0x0f)
+
+#define DIAG            (1<<4) /* Diagonal covariance model */
+#define FULL            (2<<4) /* Full covariance model */
+#define VARTYP(X)       ((X) & 0x30)
+
+#define EXPDUR  (1<<6) /* Exponential duration model */
+#define DURTYP(X) ((X) & 0xc0)
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  unsigned char phone; /*  Internal phoneme symbol */
+  unsigned char pr_code[4]; /*  Printable phone code */
+  unsigned char near_phone;
+  int  num_states;
+  unsigned char dict_code;    /*  single char printable code */
+}
+phoneme_info;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int  num_phones;
+  phoneme_info *phoneme;
+  int  index[256];
+}
+phoneme_set;
+
+/**
+ * The space_filler var here is to make sure that this structure is
+ * always the same size on different platforms.  ARM unix appears to
+ * want structures to by a multiple of 4 bytes, hence the filler.
+ */
+typedef struct
+{
+  unsigned char left_phone[MAX_PHONEMES];
+  unsigned char right_phone[MAX_PHONEMES];
+  short  apply;
+  short  space_filler; /* TODO: revisit this issue */
+}
+question;
+
+#define NON_GENERIC 0
+#define RIGHT_GENERIC 1
+#define LEFT_GENERIC 2 /*  Was the other way */
+#define BOTH_GENERIC 3
+#define DIPHONE  9
+
+/* the terminal_tree_node structure is used in a union with tree_branch_info
+   resulting in a "tree_node".  We must initialize "tree_node"s of both
+   both types in large static array, which is hard.  So instead we initialize
+   a static array of terminal_tree_node's but need to fill that structure up
+   with dummies to be the same size as the full "tree_node".  For 2-byte
+   pointer configurations this may not be memory efficient :( */
+
+/**
+ * @todo document
+ */
+typedef struct terminal_tree_node_info
+{
+  asr_int16_t    quest_index;
+  asr_int16_t   pelid;
+  asr_int16_t   avg_durn;
+  asr_int16_t          dummy_filler1, dummy_filler2, dummy_filler3;
+}
+terminal_tree_node;
+
+/**
+ * @todo document
+ */
+typedef struct tree_branch_info
+{
+  asr_int16_t  quest_index;
+  struct tree_branch_info  *fail;
+  struct tree_branch_info  *pass;
+}
+tree_branch_info;
+
+/**
+ * @todo document
+ */
+typedef union {
+  struct tree_branch_info    node;
+  struct terminal_tree_node_info term;
+} tree_node;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int       no_states;
+  /*    int       phoneme; */
+  tree_node *root[MAX_PHONE_STATES];
+}
+tree_info;
+
+/**
+ * holds the body of a sorted .ok dictionary file
+ */
+typedef struct
+{
+  char* ok_file_data; /* data in the .ok file */
+  int ok_file_data_length; /* length of data ok_file_data */
+  const char* first_entry; /* first entry in the dictionary */
+  const char* last_entry; /* last entry in the dictionary */
+  int hasUpper; /* nonzero if upper case present in dictionary (usually not) */
+}
+vocab_info;
+
+#endif
diff --git a/srec/include/hmm_type.h b/srec/include/hmm_type.h
new file mode 100644
index 0000000..993e898
--- /dev/null
+++ b/srec/include/hmm_type.h
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*
+ *  hmm_type.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_hmm_types
+#define _h_hmm_types
+
+#ifdef SET_RCSID
+static const char hmm_type_h[] = "$Id: hmm_type.h,v 1.1.10.5 2007/08/31 17:44:53 dahan Exp $";
+#endif
+
+
+#include <math.h>
+#include "all_defs.h"
+
+typedef ESR_BOOL  booldata; /* general boolean data */
+typedef int  scodata;        /* for path scores */
+typedef int  prdata;         /* for observation probabilities */
+typedef signed char     wtdata;
+typedef unsigned char   unidata;        /* for unimodal model storage */
+typedef unidata  moddata;        /* for segmental model storage */
+typedef double          covdata;        /* covariance data */
+typedef unsigned char   featdata;       /* for preprocessor data */
+typedef int             imeldata;       /* for preprocessor data */
+#define IMELDATA_TO_FEATDATA(X)   ((featdata)(X))
+typedef long  accdata;        /* for accumulate storage */
+typedef unsigned char   phonedata;      /* for model contexts */
+typedef phonedata conxdata;
+typedef int             latdata;        /* for lattice identifiers */
+
+#endif
diff --git a/srec/include/hmmlib.h b/srec/include/hmmlib.h
new file mode 100644
index 0000000..83f2bab
--- /dev/null
+++ b/srec/include/hmmlib.h
@@ -0,0 +1,36 @@
+/*---------------------------------------------------------------------------*
+ *  hmmlib.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _h_hmmlib_
+#define _h_hmmlib_
+
+#ifdef SET_RCSID
+static const char hmmlib_h[] = "$Id: hmmlib.h,v 1.4.6.8 2008/01/21 20:30:05 dahan Exp $";
+#endif
+
+
+#include "hmm_desc.h"
+#include "ESR_Locale.h"
+
+int read_word_transcription(const LCHAR* basename, vocab_info* voc, ESR_Locale* locale);
+void delete_word_transcription(vocab_info* voc);
+int get_prons(const vocab_info* voc, const char* label, char* prons, int prons_len);
+                                
+#endif /* _h_hmmlib_ */
diff --git a/srec/include/log_tabl.h b/srec/include/log_tabl.h
new file mode 100644
index 0000000..bd0eaae
--- /dev/null
+++ b/srec/include/log_tabl.h
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*
+ *  log_tabl.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _h_log_tabl_
+#define _h_log_tabl_
+
+#define LOG_SCALE 1024  /* smallest scale is about 0.1 dB */
+#define LOG_SCALE_SHIFT   10
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int    size;
+  int    shift;
+  int    scale;
+  unsigned long mask;
+  int    *table;
+}
+log_table_info;
+
+void create_lookup_log(log_table_info *logtab, int num_bits);
+int log_lookup(log_table_info *logtab, int operand, int shift);
+int inv_log_lookup(log_table_info *logtab, int operand);
+void destroy_lookup_log(log_table_info *logtab);
+int integer_square_root(int operand);
+
+
+
+#endif
diff --git a/srec/include/mutualob.h b/srec/include/mutualob.h
new file mode 100644
index 0000000..866ed22
--- /dev/null
+++ b/srec/include/mutualob.h
@@ -0,0 +1,70 @@
+/*---------------------------------------------------------------------------*
+ *  mutualob.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _h_mutualob_
+#define _h_mutualob_
+
+#include "frontpar.h"
+
+#ifndef SWIGBUILD
+
+typedef front_parameters CA_FrontendInputParams;
+
+typedef struct
+{
+  int    ca_rtti;
+  /* IMPORTANT NOTE
+   *
+   * This structure is used by 'CA_WritePatternImage()'
+   * in the file "ca/cod_imag.c". Certain assumptions
+   * about the member types and order are made.
+   * DON'T change this structure without making
+   * appropriate changes to the above function.
+   */
+  
+  booldata    is_setup;
+  booldata    is_attached;
+  utterance_info data;
+}
+CA_Utterance;
+#endif
+
+#define CA_SIGNATURE_PATTERN       0xca00
+#define CA_VERIFY_SIGNATURE(X)       ((unsigned long)(X) & 0xca00)
+
+#define CA_ACOUSTIC_SIGNATURE                       0xca01
+#define CA_ACOUSTIC_PARAMETERS_SIGNATURE            0xca02
+#define CA_ARRAY_SIGNATURE                          0xca03
+#define CA_ANNOTATION_SIGNATURE                     0xca04
+#define CA_EXCEPTION_SIGNATURE                      0xca05
+#define CA_FRONTEND_SIGNATURE                       0xca06
+#define CA_FRONTEND_PARAMETERS_SIGNATURE            0xca07
+#define CA_NBEST_LIST_SIGNATURE                     0xca08
+#define CA_PATTERN_SIGNATURE                        0xca09
+#define CA_PATTERN_PARAMETERS_SIGNATURE             0xca0a
+#define CA_RECOGNIZER_SIGNATURE                     0xca0b
+#define CA_RECOGNIZER_PARAMETERS_SIGNATURE          0xca0c
+#define CA_SYNTAX_SIGNATURE                         0xca0d
+#define CA_UTTERANCE_SIGNATURE                      0xca0e
+#define CA_VOCABULARY_SIGNATURE                     0xca0f
+#define CA_WAVE_SIGNATURE                           0xca10
+#define CA_RESEARCH_SIGNATURE                       0xca11
+
+#endif
diff --git a/srec/include/portable.h b/srec/include/portable.h
new file mode 100644
index 0000000..3d39931
--- /dev/null
+++ b/srec/include/portable.h
@@ -0,0 +1,90 @@
+/*---------------------------------------------------------------------------*
+ *  portable.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _h_portable_
+#define _h_portable_
+
+#ifdef SET_RCSID
+static const char portable_h[] = "$Id: portable.h,v 1.4.10.4 2007/10/15 18:06:25 dahan Exp $";
+#endif
+
+
+#include <math.h>
+
+#include "passert.h"
+#include "pmemory.h"
+#include "PFileSystem.h"
+#include "plog.h"
+#include "pstdio.h"
+#include "ptypes.h"
+#include "setting.h"
+
+#define ASSERT passert
+
+/* QNX defines log in math.h */
+#ifndef log
+#define log(X)          ((X) <= 1e-32 ? -MAX_LOG : log(X))
+/* #define exp(X)          ((X) < FLT_MIN_EXP ? 0.0 : exp(X)) */
+#endif
+/*  Allocation macros
+*/
+
+#if defined(__sgi)
+#define inline
+#elif defined(unix)
+#define inline __inline__
+#endif
+
+  static PINLINE PFile* file_must_open(PFile* afile, const LCHAR *name, const LCHAR *mode, ESR_BOOL littleEndian)
+  {
+    PFile* fp;
+    ESR_ReturnCode rc;
+    
+    fp = pfopen ( name, mode );
+
+    if (fp == NULL)
+    {
+      LCHAR path[P_PATH_MAX];
+      LCHAR *tmp = path;
+      size_t len;
+      
+      len = P_PATH_MAX;
+      CHKLOG(rc, pf_get_cwd (path, &len));
+      PLogError(L("Could not open file %s, mode=%s, cwd=%s\n"), name, mode, tmp);
+      /* passert(0); */
+      fp = NULL;
+    }
+    return fp;
+CLEANUP:
+    return NULL;
+  }
+
+#define report_malloc_usage() do { } while(0); /* do nothing */
+#define log_report PLogMessage
+
+#define SERVICE_ERROR(X) do \
+  { \
+    log_report("service error (%d)\n", X); \
+    assert(0); \
+    exit(1); \
+  } while(0)
+
+
+#endif
diff --git a/srec/include/pre_desc.h b/srec/include/pre_desc.h
new file mode 100644
index 0000000..4b7eef6
--- /dev/null
+++ b/srec/include/pre_desc.h
@@ -0,0 +1,223 @@
+/*---------------------------------------------------------------------------*
+ *  pre_desc.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_pre_desc_
+#define _h_pre_desc_
+
+#ifdef SET_RCSID
+static const char pre_desc_h[] = "$Id: pre_desc.h,v 1.3.6.10 2008/03/07 19:41:39 dahan Exp $";
+#endif
+
+
+#include "all_defs.h"
+#include "hmm_type.h"
+#include "specnorm.h"
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+
+#define DO_SUBTRACTED_SEGMENTATION  0
+
+#ifndef NONE
+#define NONE   0
+#endif
+#define SCALE   1 /* Scaling the channels */
+#define LIN_TRAN  2 /* Linear Transformation */
+#define VFR   4 /* Variable frame rate */
+#define USE_MULTAB      8 /* Set up multable distance calculations */
+
+/**
+ * @todo document
+ */
+typedef struct
+{  /* mul-table data types */
+  unsigned short sigma;
+  int   num;
+  short *pdf;
+}
+mul_table;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  unsigned short num_dev8_index;
+  unsigned char  *dev8_index;
+  unsigned short *wt_index;
+  short    *gauss_dist_table;
+  short    **dist_ptr;
+  prdata    multable_factor; /* euclidean to multable */
+  prdata    multable_factor_gaussian; /* euclidean to multable */
+  prdata    grand_mod_cov; /* grand covariance modulus */
+  prdata    grand_mod_cov_gaussian; /* grand covariance modulus */
+}
+mul_table_info;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  prdata *table;
+  prdata add_log_limit;
+  prdata scale;   /* X - scale to log function */
+  prdata inv_scale;
+  float logscale;  /* Y - scale to log function */
+}
+logadd_table_info;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  unsigned long num;
+  accdata **between;
+  accdata *bmean;
+  accdata **within;
+  accdata *wmean;
+}
+transform_info;
+
+/**
+ * @todo document
+ */
+typedef struct
+{   /* Segmentation parameters */
+  int  rel_low;
+  int  rel_high;
+  int  gap_period;
+  int  click_period;
+  int  breath_period;
+  int  extend_annotation;
+  int  param;
+  int         min_initial_quiet_frames;    /* num silence frames needed before input */
+  int         min_annotation_frames;          /* minimum overall length */
+  int         max_annotation_frames;          /* maximum overall length */
+  int         delete_leading_segments;        /* num segments to delete. 0=no action */
+  int         leading_segment_accept_if_not_found; /* Do not reject segmentation if not found */
+  int         leading_segment_min_frames;   /* remove unless shorter */
+  int         leading_segment_max_frames;   /* remove unless exceeded */
+  int         leading_segment_min_silence_gap_frames;/* remove if good silence gap to next segment */
+  int  beep_size;  /*X201 beep filter */
+  int  beep_threshold;  /*X201 beep filter */
+  int  min_segment_rel_c0; /* Any segment gets deleted whose peak c0 is < max - min_segment_rel_c0 */
+
+#if DO_SUBTRACTED_SEGMENTATION
+  int         snr_holdoff;    /* Ignore first n frames when estimating speech level for SNR measure */
+  int         min_acceptable_snr; /* for an acceptable segmentation */
+#endif
+}
+endpoint_info;
+
+
+/**
+ * @todo document
+ */
+typedef struct
+{  /* processed speech data/front end output */
+  int  ref_count; /* reference counts */
+  /* Pattern vector section */
+  int  dim;  /* dimension of frame vector */
+  int  use_dim; /* dimension used for recognition */
+  int  whole_dim; /* reduced feature use. Set unused to 127 (0) on model construction */
+  int  use_from; /* first channel used for recognition */
+  featdata *last_frame; /* last frame processed in frame buffer */
+  imeldata *seq;  /* current valid frame */
+  imeldata *seq_unnorm; /* current valid frame, for whole-word models */
+  prdata seq_sq_sum; /* sum of the squared of frames */
+  prdata seq_sq_sum_whole; /* sum of the squared of frames, for wholeword */
+  prdata seq_unnorm_sq_sum_whole; /* sum of the squared of frames, for wholeword */
+  int  voicing_status; /* voicing code */
+  int  post_proc; /* post processing functions */
+  imeldata *offset; /* offset vector with transformation */
+  imeldata **matrix; /* linear transformation matrix */
+  int  imel_shift; /* Imelda scale factor (in shifts) */
+  covdata **imelda; /* linear transformation matrix, PMC or RN */
+  imeldata **invmat; /* inverse transformation matrix */
+  int  inv_shift; /* inverse Imelda scale factor (in shifts) */
+  covdata **inverse; /* inverse linear transformation matrix, PMC or RN */
+#if PARTIAL_DISTANCE_APPROX /* Gaussian tail approximation? */
+  int  partial_distance_calc_dim;  /* number of params to calc distance over, before approximating if beyond threshold */
+  scodata partial_distance_threshold;
+  prdata partial_distance_calc_threshold;
+  prdata partial_distance_offset;
+  prdata global_distance_over_n_params;
+  int  global_model_means[MAX_DIMEN];
+  prdata partial_mean_sq_sum;
+  prdata partial_seq_sq_sum;
+  prdata partial_seq_unnorm_sq_sum;
+#endif
+  imeldata *chan_offset;
+  /* Channel Normalization etc */
+
+  /* Tables */
+  prdata exp_wt[MAX_WTS]; /* weights exp lookup table */
+  mul_table_info mul;  /* Mul-table */
+  logadd_table_info add; /* logadd-table */
+  /* ENC */
+  booldata is_setup_for_noise;
+  booldata do_whole_enc; /* to enable ENC */
+  booldata do_sub_enc; /* to enable ENC */
+  booldata enc_count;
+  booldata ambient_valid; /* ambient estimates valid */
+  imeldata **pmc_fixmat; /* ENC matrix */
+  imeldata **pmc_fixinv; /* inverse ENC matrix */
+  covdata **pmc_matrix; /* ENC matrix in float */
+  covdata **pmc_inverse; /* inverse ENC matrix in float */
+  int  pmc_matshift; /* scaling */
+  int  pmc_invshift; /* scaling */
+  imeldata    *ambient_mean; /* ambient mean vector */
+  imeldata    *ambient_prof; /* ambient estimates, pseudo space */
+  imeldata    *ambient_prof_unnorm; /* ambient estimates, unnormalised */
+  logadd_table_info fbadd; /* logadd-table for ENC */
+#if DO_SUBTRACTED_SEGMENTATION
+  int  mel_dim;
+  covdata **spec_inverse;
+  imeldata **spec_fixinv;
+  int  spec_invshift;
+  int  *cep_offset;
+#endif
+  /* Parameters */
+  prdata mix_score_scale; /* Mixture score scaling constant */
+  prdata uni_score_scale; /* Unimodal score scaling constant */
+  prdata uni_score_offset; /* Unimodal score offset constant */
+  prdata imelda_scale;  /* Imelda grand variance */
+  /* Endpoint data */
+  endpoint_info end;
+
+}
+preprocessed;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  preprocessed    *prep; /* The preprocessed data structure */
+  /* The following stuff cannot be cloned */
+  booldata do_imelda; /* Alignment based accumulation */
+  transform_info  imelda_acc;
+}
+pattern_info;
+
+#endif /* _h_pre_desc_ */
diff --git a/srec/include/prelib.h b/srec/include/prelib.h
new file mode 100644
index 0000000..d62c71f
--- /dev/null
+++ b/srec/include/prelib.h
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*
+ *  prelib.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef _h_prelib_
+#define _h_prelib_
+
+#ifdef SET_RCSID
+static const char prelib_h[] = "$Id: prelib.h,v 1.2.6.7 2008/04/01 18:23:20 dahan Exp $";
+#endif
+
+
+#include "pre_desc.h"
+
+void    init_preprocessed(preprocessed *datapak, int dimen,
+                          float imelda_scale);
+void init_partial_distance_approx(preprocessed *prep);
+void clear_partial_distance_approx(preprocessed *prep);
+void    clear_preprocessed(preprocessed *datapak);
+
+void    linear_transform_frame(preprocessed *datapak, imeldata *fram, int do_shift);
+void    inverse_transform_frame (preprocessed *prep, imeldata *fram, int do_shift);
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  void create_lookup_logadd(logadd_table_info *table, float mul_scale);
+
+#ifdef __cplusplus
+}
+#endif
+
+void destroy_lookup_logadd(logadd_table_info *table);
+
+void create_linear_transform(preprocessed *datapak, int matdim,
+                             int with_offset);
+void free_linear_transform(preprocessed *datapak);
+#ifndef _RTT
+int  init_newton_transform(preprocessed *datapak, float reqscale,
+                           char *filename, int dimen);
+void copy_linear_transform(preprocessed *datapak, float **new_matrix,
+                           int dimen);
+void load_imelda_transform(char *filename, int dim);
+#endif
+
+void set_cepstrum_offset(preprocessed *prep, int index, int value);
+
+int voicing_bit(preprocessed *predat);
+
+#if DO_SUBTRACTED_SEGMENTATION
+void setup_spectrum_transform(preprocessed *prep, int numceps,
+                              float *stat_sc, float *stat_off);
+void clear_spectrum_transform(preprocessed *prep);
+#endif
+
+#endif
diff --git a/srec/include/sample.h b/srec/include/sample.h
new file mode 100644
index 0000000..96333cc
--- /dev/null
+++ b/srec/include/sample.h
@@ -0,0 +1,222 @@
+/*---------------------------------------------------------------------------*
+ *  sample.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _h_sample_
+#define _h_sample_
+
+
+#include "all_defs.h"
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+#include "front.h"
+
+#ifdef _WIN32
+#include "windows.h"
+#endif
+
+/*  The known wave types here
+*/
+/* #define DEVICE_RAW_PCM 1 */
+/* #define DEVICE_MULAW  2 */
+#define FILE_FORMATTED  3
+
+/*  The known device (op) types here
+*/
+
+#define WAVE_DEVICE_INPUT   1
+#define WAVE_DEVICE_OUTPUT  2
+#define WAVE_FILE_INPUT     3
+#define WAVE_FILE_OUTPUT    4
+
+/*  The known wave-file types are
+** RIFF (R), NIST (N), RAW-PCM (P), RAW-MU-LAW (M)
+*/
+
+#if !defined(_WIN32)     /* TODO: do we want to support RIFF header files? */
+/* Add definition for use in RIFF header r/w */
+#if defined unix || defined PSOS || defined POSIX
+/* VxWorks simulator defines DWORD and WORD already */
+#if !(defined(__vxworks) && (CPU & SIMNT))
+typedef asr_uint32_t DWORD;
+#endif
+typedef unsigned char  BYTE;
+/* following two lines does not help. It only works when WORD is defined by MACRO: #define WORD unsigned short */
+#ifdef WORD
+#undef WORD
+#endif
+#if !(defined(__vxworks) && (CPU & SIMNT))
+typedef asr_uint16_t WORD;
+#endif
+#define WAVE_FORMAT_PCM 0x01
+#endif
+
+//typedef DWORD  FOURCC;         /* a four character code */
+#define MAKEFOURCC(ch0, ch1, ch2, ch3) ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
+#define mmioFOURCC MAKEFOURCC
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  WORD  wFormatTag;
+  WORD  nChannels;
+  DWORD nSamplesPerSec;
+  DWORD nAvgBytesPerSec;
+  WORD  nBlockAlign;
+}
+WAVEFORMAT;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  WAVEFORMAT wf;
+  WORD       wBitsPerSample;
+}
+PCMWAVEFORMAT;
+#else
+/* disable nameless union/struct warning in mmsytem.h but restore them to
+disallow such code of our own.
+*/
+#pragma warning (push)
+#pragma warning (disable: 4201)
+#include <mmsystem.h>
+#pragma warning (pop)
+#endif
+
+
+#ifndef _RTT
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  char  typ;  /* R (RIFF), N (NIST), P (RAW PCM) M (MU-LAW) */
+  int   op;      /* read or write */
+  int   endian;  /* 0 is little 1 is big */
+  unsigned long len; /* length of file */
+  PFile* file;  /* pointer to file */
+  char  name[MAX_FILE_NAME]; /* file name */
+}
+wav_file_info;
+
+#endif
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  char typ;  /* -Undefined as yet- */
+  int  op;      /* read (i/p) or write (o/p) */
+}
+wav_device_info;
+
+/**
+ * @todo document
+ */
+typedef union {
+#ifndef _RTT
+  wav_file_info   file;
+#endif
+  wav_device_info ext;
+} gen_device_info;
+
+#define MAXHISTBITS 33  /* one more than bitrange for signed */
+/* int bit usage - this could be 17 if */
+/* we assume shorts   */
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int nsam;
+  int sum;
+  int sum2;
+  int sumsqu;
+  int sumsqu2;
+  int sumabs;
+  int sumabs2;
+  int highclip;
+  int lowclip;
+  int bithist[MAXHISTBITS];
+  samdata highclip_level;
+  samdata lowclip_level;
+  int max_per10000_clip;
+  int max_dc_offset;
+  int high_noise_level_bit;
+  int low_speech_level_bit;
+  int min_samples;
+}
+wave_stats;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int   wave_type;
+  int   device_type;
+  int   samplerate;
+  int   frame_size;
+  int   window_size;
+  int   num_samples;
+  samdata  *income;
+  samdata  *outgo;
+  booldata  initialised;
+  float  scale;
+  int   offset;
+  /* The channel object here is the set of data streams used in making frames.
+      IN CA, it is convenient to store channel as part of CA_Wave (wave_info).
+      It could have a many-to-one relationship with wave_info. */
+  front_channel *channel;
+  gen_device_info     device;
+  wave_stats  stats;
+  booldata  do_stats;
+}
+wave_info;
+
+
+void reset_sig_check(wave_stats *ws);
+void get_sig_check(wave_stats *ws, int *nsam, int *pclowclip, int *pchighclip,
+                   int *dc_offset, int *amp, int *pc5, int *pc95, int* overflow);
+void acc_wave_stats(wave_info* wave);
+
+void create_sample_buffer(wave_info *wave, int frame_size, int window_size);
+void free_sample_buffer(wave_info *wave);
+#ifndef _RTT
+int init_wavfile_stream(wave_info *wave, char *filename, int type);
+int close_wavfile_stream(wave_info *wave);
+int load_wavfile_data(wave_info* wave);
+int save_wavfile_data(wave_info* wave);
+int seek_wavfile_data(wave_info* wave, long offset, int origin);
+int read_riff_header(PFile* waveFile, PCMWAVEFORMAT *pcmWaveFormat, unsigned long *datalen);
+void add_riff_header(PFile* waveFile, int samplerate, int bitspersample);
+void fix_riff_header(PFile* waveFile, int samplerate, int bitspersample);
+#endif
+void copy_wave_data(wave_info* dest, wave_info* src);
+
+
+
+#endif
diff --git a/srec/include/search_network.h b/srec/include/search_network.h
new file mode 100644
index 0000000..1862a61
--- /dev/null
+++ b/srec/include/search_network.h
@@ -0,0 +1,149 @@
+/*---------------------------------------------------------------------------*
+ *  search_network.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/* this file containts data structures needed for defining FSM network*/
+
+#ifndef _h_search_network_
+#define _h_search_network_
+
+#include"srec_sizes.h"
+
+typedef struct FSMarc_t FSMarc;
+typedef struct FSMnode_t FSMnode;
+
+#define DEBUG_WDADD 0
+
+/* DEBUG_WDADD:
+   it's really hard to debug the incremental word addition feature
+   without being able to navigate through the graph structure, this
+   is enabled in msdev by a compilation that uses actual pointers
+   for arc and node references, arc and node pointers can be expanded
+   in visual studio, but the IDs (offsets into base pointers) cannot.
+   During dev, care should be take to keep the !DEBUG_WDADD fast
+
+   ItoX, XtoP, etc .. convert IDs to X to Ptrs, where
+   I ... means ID
+   P ... means pointer
+   X ... means ID or pointer, depending on DEBUG_WDADD
+*/
+
+#if DEBUG_WDADD
+
+#define IF_DEBUG_WDADD(EXPRESSION) EXPRESSION
+#define printf_arc printf_arc1
+#define printf_node printf_node1
+#define TO_NODE(ARC) (ARC)->to_node
+#define NEXT_NODE(NOD) (NOD)->next_node
+#define LINKL_NEXT(ARC) (ARC)->linkl_next_arc
+#define LINKL_PREV(ARC) (ARC)->linkl_prev_arc
+#define FIRST_PREV(NOD) (NOD)->first_prev_arc
+#define FIRST_NEXT(NOD) (NOD)->first_next_arc
+#define ARC_XtoP(ARC) (ARC)
+#define ARC_XtoI(ARC)  ((arcID)((ARC)-fst->FSMarc_list))
+#define ARC_PtoX(ARC)  (ARC)
+#define ARC_ItoX(ARC_ID)  (&fst->FSMarc_list[ARC_ID])
+#define NODE_XtoP(NOD) (NOD)
+#define NODE_XtoI(NOD) ((nodeID)((NOD)-fst->FSMnode_list))
+#define NODE_PtoX(NOD) (NOD)
+#define NODE_ItoX(NODE_ID) (&fst->FSMnode_list[NODE_ID])
+#define FSMARC_NULL NULL
+#define FSMNODE_NULL NULL
+#define FSMARC_FREE (FSMarc*)0xffffffff
+#define FSMNODE_FREE (FSMnode*)0xffffffff
+
+#else
+
+#define IF_DEBUG_WDADD(EXPRESSION)
+#define printf_arc
+#define printf_node
+#define TO_NODE(ARC) fst->FSMarc_list[(ARC)].to_node
+#define NEXT_NODE(NOD) fst->FSMnode_list[(NOD)].un_ptr.next_node
+#define LINKL_NEXT(ARC) fst->FSMarc_list[(ARC)].linkl_next_arc
+#define LINKL_PREV(ARC) fst->FSMarc_list[(ARC)].linkl_prev_arc
+#define FIRST_PREV(NOD) fst->FSMnode_list[(NOD)].first_prev_arc
+#define FIRST_NEXT(NOD) fst->FSMnode_list[(NOD)].un_ptr.first_next_arc
+#define ARC_XtoP(ARC) (&fst->FSMarc_list[(ARC)])
+#define ARC_XtoI(ARC)  ((arcID)(ARC))
+#define ARC_PtoX(ARC)  ((arcID)((ARC)-fst->FSMarc_list))
+#define ARC_ItoX(ARC_ID)  ((arcID)(ARC_ID))
+#define NODE_XtoP(NOD) (&fst->FSMnode_list[(NOD)])
+#define NODE_XtoI(NOD) ((nodeID)(NOD))
+#define NODE_PtoX(NOD) ((nodeID)((NOD)-fst->FSMnode_list))
+#define NODE_ItoX(NODE_ID) ((nodeID)(NODE_ID))
+#define FSMARC_NULL MAXarcID
+#define FSMNODE_NULL MAXnodeID
+#define FSMARC_FREE MAXarcID-1
+
+#endif
+
+#if DEBUG_WDADD
+typedef FSMnode* FSMnode_ptr;
+typedef FSMarc*  FSMarc_ptr;
+#else
+typedef nodeID      FSMnode_ptr;
+typedef arcID       FSMarc_ptr;
+#endif
+
+/**
+ * @todo document
+ */
+typedef struct FSMnode_t
+{
+  union {
+    FSMarc_ptr first_next_arc;
+    FSMnode_ptr next_node;
+  } un_ptr;
+  FSMarc_ptr first_prev_arc; /* this can be removed if not doing addword */
+}
+FSMnode_t;
+
+/**
+ * @todo document
+ */
+typedef struct FSMarc_t
+{
+#if DEBUG_WDADD
+  char* ilabel_str;
+  char* olabel_str;
+#endif
+  FSMnode_ptr to_node;
+  FSMarc_ptr linkl_next_arc;
+  
+  FSMnode_ptr fr_node;         /* this can be removed if not doing addword */
+  FSMarc_ptr linkl_prev_arc;   /* this can be removed if not doing addword */
+  
+  labelID ilabel;              /* input label */
+  labelID olabel;              /* output label */
+  costdata cost;
+}
+FSMarc_t;
+
+/*according to Johan:*/
+#define EPSILON_OFFSET 3
+#define EPSILON_LABEL 0
+#define WORD_BOUNDARY 1
+#define PHONE_BOUNDARY 2
+
+/* */
+#define WORD_EPSILON_LABEL 0
+
+
+
+
+#endif
diff --git a/srec/include/setting.h b/srec/include/setting.h
new file mode 100644
index 0000000..729a98f
--- /dev/null
+++ b/srec/include/setting.h
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*
+ *  setting.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*  Header file which describes the settings for the compilation
+*/
+
+#ifndef _setting_h_
+#define _setting_h_
+
+#ifdef SET_RCSID
+static const char setting_h[] = "$Id: setting.h,v 1.5.8.4 2007/08/31 17:44:53 dahan Exp $";
+#endif
+
+
+#include "buildopt.h"
+
+/************************************************************************
+ ************************************************************************/
+
+/*  For fixed point code, see settings in hmm_type.h
+**  Also do create more abstract types for preferred data types
+**  for variables in hmm_type.h
+*/
+
+
+#ifndef _RTT
+#define REPORT_USAGE 1
+#endif
+
+#define PC_DEMO_NBEST
+
+/************************************************************************
+ *  The stuff below should be edited with care
+ ************************************************************************/
+
+#if defined(PC_DEMO)
+
+#elif defined(PC_DEMO_NBEST)
+
+/*  Computational and storage features
+*/
+#define USE_CPP_MEMORY  1
+
+#elif defined(GRAND_UNIX)
+
+#elif defined(PSOS)
+
+#elif defined(VOYAGER)
+
+#elif defined (POSIX)
+
+#elif defined(DEVELOPER)
+
+#else
+
+#endif
+
+/************************************************************************
+ ************************************************************************/
+
+/* Sanity checking of defines
+*/
+
+#endif
diff --git a/srec/include/simapi.h b/srec/include/simapi.h
new file mode 100644
index 0000000..6a8d62f
--- /dev/null
+++ b/srec/include/simapi.h
@@ -0,0 +1,2846 @@
+/*---------------------------------------------------------------------------*
+ *  simapi.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_simapi_
+#define _h_simapi_
+
+#ifdef SET_RCSID
+static const char simapi_h[] = "$Id: simapi.h,v 1.22.4.25 2008/03/07 17:37:14 dahan Exp $";
+#endif
+
+#include "creccons.h"   /* CREC Public Constants    */
+
+#include "c42mul.h"
+#include "caexcept.h"
+#include "setting.h"
+#include "mutualob.h"
+#include "srec_sizes.h"
+#include "search_network.h"
+#include "srec.h"
+#include "srec_eosd.h"
+#include "srec_results.h"
+#include "swimodel.h"
+#include "ESR_Locale.h"
+
+/**
+ ************************************************************************
+ * SwigImageBegin       <- DO NOT MOVE THIS LINE !
+ *
+ * This is a CADOC Keyword section.
+ *
+ * If CADOC is instructed to create a SWIG I-File and this is one of the
+ * files in the input list, everything between the 'SwigImage Begin' and
+ * 'SwigImage End' keywords comment blocks will be copied 'as-is' to the
+ * SWIG I-File specified on the CADOC command line.
+ *
+ * The purpose of the following marked section is to identify CA
+ * structures that SWIG may need to complete the CREC API interface.
+ *
+ * Refer to the document "DOC\CADOC.TXT" for details for the CADOC Tool.
+ *
+ ************************************************************************
+ */
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#ifndef SWIGBUILD
+
+  typedef featdata CA_Feature;
+
+	/**
+	 * @todo document
+	 */
+#define NCONFPARS 6
+
+typedef struct
+{
+    double scale[NCONFPARS];
+    double offset[NCONFPARS];
+    double weight[NCONFPARS];
+} Confidence_model_parameters;
+
+  typedef struct
+  {
+	Confidence_model_parameters one_nbest;
+	Confidence_model_parameters many_nbest;
+  }
+  CA_ConfidenceScorer;
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int         ca_rtti;
+    booldata    is_resultBlocked;
+    booldata    is_configured;
+    int         setup_count;
+    booldata    is_running;
+    multi_srec  *recm;                  /* contains recognition structure */
+    srec_eos_detector_parms* eosd_parms;/* contains ep parameters */
+  }
+  CA_Recog;
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int         ca_rtti;
+    booldata    is_loaded;
+    int         pattern_setup_count;
+    int         use_dim;
+    int         partial_distance_calc_dim;
+    prdata      imelda_scale;
+    SWIModel    *swimodel; /* owning pointer to compact acoustic models */
+  }
+  CA_Acoustic;
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int         ca_rtti;
+    /* IMPORTANT NOTE
+     *
+     * This structure is used by CA_WriteSyntaxImage
+     * in the file "ca/cod_imag.c". Certain assumptions
+     * about the member types and order are made.
+     * DON'T change this structure without making
+     * appropriate changes to the above function.
+     */
+
+    booldata    has_groups;
+    booldata    has_rules;
+    int         setup_count;
+    /* syntax_info* synx; */
+    srec_context* synx;
+  }
+  CA_Syntax;
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int dummy;
+  }
+  CA_Arbdata;
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int         ca_rtti;
+    /* IMPORTANT NOTE
+     *
+     * This structure is used by CA_WritePatternImage
+     * in the file "ca/cod_imag.c". Certain assumptions
+     * about the member types and order are made.
+     * DON'T change this structure without making
+     * appropriate changes to the above function.
+     */
+
+    booldata      is_loaded;
+    //model_info    *setup_whole;
+    //model_info    *setup_sub;
+    booldata      has_cache;
+    booldata      true_accumulates;
+    booldata      recog_terminated;
+    pattern_info  data;
+  }
+  CA_Pattern;
+
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int           dim;
+    transform_info  imelda_acc;
+    transform_info  mllr_acc;
+    booldata      do_mllr;
+    booldata      do_imelda;
+    booldata      is_loaded;
+    booldata      is_setup;
+  }
+  CA_Transform;
+
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int             ca_rtti;
+    booldata        is_loaded;    /* generates VOCAB_NOT_CONFIGURED */
+    vocab_info      voc;
+  }
+  CA_Vocab;
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int           ca_rtti;
+    short         type;
+    unsigned long startTime;
+    unsigned long endTime;
+    short         wordID;
+    long          score;
+    char          *label;
+  }
+  CA_Result;
+
+  /* typedef nbest_list CA_NBestList; */
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    asr_int32_t dummy[2];
+  }
+  CA_NBestList;
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int         ca_rtti;
+    booldata    is_loaded;
+    int         dimen;
+    int         stay_penalty;
+    int         skip_penalty;
+    int         whole_stay_penalty;
+    int         whole_skip_penalty;
+    int         dur_scale;
+    int         frame_period;
+    int         min_var;
+    int         max_var;
+    booldata    load_all;
+    char        load_models[MAX_LABEL];
+  }
+  CA_AcoustInputParams;
+
+
+	/**
+	 * @todo document
+	 */
+	typedef struct
+  {
+    int         ca_rtti;
+    booldata    is_loaded;
+    ESR_BOOL        do_early;
+    ESR_BOOL        do_partial;
+    int         word_penalty;
+    int         top_choices;
+    int         reject_score;
+    int         traceback_freq;
+    int         viterbi_prune_thresh;  /*score-based pruning threshold - only keep paths within this delta of best cost*/
+    int         max_hmm_tokens;       /*controls the maximum number of HMM's alive in any frame.  If number
+         exceeded, pruning gets tightened.  So, this threshold can be used
+         to tradeoff accuracy for computation an memory*/
+    int         max_fsmnode_tokens;   /*controls the maximum number of FSMs alive in any frame.  If number,
+         exceeded, pruning gets tightened.  So, this threshold can be used
+         to tradeoff accuracy for computation an memory*/
+    int         max_word_tokens;      /*controls the maximum number of word tokens kept in the word lattice.
+         if number exceeded, the word lattice is pruned more tightly (less word
+         ends per frame*/
+    int         max_altword_tokens;      /*controls the maximum number of alternative paths to propagate, for nbest */
+    int         num_wordends_per_frame; /*controls the size of the word lattice - the number of word ends to
+           keep at each time frame*/
+    int         max_fsm_nodes;        /*allocation size of a few arrays in the search - needs to be big enough
+         to handle any grammar that the search needs to run.  Initialization fails
+         if num exceeded*/
+    int         max_fsm_arcs;         /*allocation size of a few arrays in the search - needs to be big enough
+         to handle any grammar that the search needs to run.  Initialization fails
+         if num exceeded*/
+    int           max_searches;         /* now: 2 searches for 2 genders */
+    int         terminal_timeout;           /* end of utterance timeout at terminal node */
+    int         optional_terminal_timeout;  /* end of utterance timeout at optional terminal node */
+    int         non_terminal_timeout;       /* end of utterance timeout at non terminal node */
+    int         eou_threshold;              /* select hypotheses for end-of-utterance tests */
+    int         stats_enabled;              /* enable frame-by-frame recognizer stats */
+    int         max_frames;             /* max number of frames in for searching */
+    int         max_model_states;       /* indicates largest acoustic model this search can use */
+  }
+  CA_RecInputParams;
+
+	/**
+	 * @todo document
+	 */
+  typedef struct
+  {
+    int         ca_rtti;
+    booldata    is_loaded;
+    int         dimen;
+    int         whole_dimen;
+    int         feat_start;
+    float       mix_score_scale;
+    float       imelda_scale;
+    float       uni_score_scale;
+    float       uni_score_offset;
+    int         forget_speech;
+    int         forget_background;
+    int         rel_low;
+    int         rel_high;
+    int         gap_period;
+    int         click_period;
+    int         breath_period;
+    int         extend_annotation;
+    int         param;
+#if PARTIAL_DISTANCE_APPROX
+    int         partial_distance_dim;
+    int         partial_distance_threshold;
+    int         partial_distance_offset;
+    int         global_model_means[MAX_DIMEN];
+#endif
+    int         min_initial_quiet_frames;      /* num silence frames needed before input */
+    int         min_annotation_frames;          /* minimum overall length */
+    int         max_annotation_frames;          /* maximum overall length */
+    int         delete_leading_segments;        /* num segments to delete. 0=no action */
+    int         leading_segment_accept_if_not_found; /* Do not reject segmentation if not found */
+    int         leading_segment_min_frames;     /* remove unless shorter */
+    int         leading_segment_max_frames;     /* remove unless exceeded */
+    int         leading_segment_min_silence_gap_frames;/* remove if good silence gap to next segment */
+    int         beep_size;  /*X201 beep filter */
+    int         beep_threshold;  /*X201 beep filter */
+    int         min_segment_rel_c0; /* Any segment gets deleted whose peak c0 is < max - min_segment_rel_c0 */
+
+#if DO_SUBTRACTED_SEGMENTATION
+    int         snr_holdoff; /* Ignore first n frames when estimating speech level for SNR measure */
+    int         min_acceptable_snr; /* for successful segmentation */
+#endif
+    int         stats_enabled;                  /* enable frame-by-frame pattern stats */
+  }
+  CA_PatInputParams;
+
+
+
+#endif
+
+#define IMELDA_ACC_BETWEEN      1
+#define IMELDA_ACC_WITHIN       2
+#define IMELDA_ACC_BMEAN        3
+#define IMELDA_ACC_WMEAN        4
+#define MLLR_ACC_BETWEEN        5
+#define MLLR_ACC_WITHIN         6
+#define MLLR_ACC_BMEAN          7
+#define MLLR_ACC_WMEAN          8
+#define IMELDA_MATRIX           9
+#define INVERSE_IMELDA_MATRIX   10
+#define MLLR_MATRIX             11
+#define TRANSFORM_MATRIX        12
+#define TRANSFORM_OFFSET        13
+#define CHAN_OFFSET             14
+
+  /* for fast match debugging
+  ** 5/1/99 SL
+  */
+#define FRAME_VOICED            1
+#define FRAME_QUIET             2
+#define FRAME_UNCERTAIN         3
+
+  int CA_GetVoicingStatus(CA_Pattern *hPattern);
+  /**
+   *
+   * Params       hPattern    Handle to valid object
+   * Returns      int         See below
+   *
+   ************************************************************************
+   * Returns the voicing status of the current frame contained in the
+   * Pattern object.
+   * The function will return one of the following values :-
+   *
+   * FRAME_VOICED         1
+   * FRAME_QUIET          2
+   * FRAME_UNCERTAIN              3
+   *
+   * TODO: Integrate these defines into CR_type.h
+   ************************************************************************
+   */
+
+
+
+  /*
+  ** File: simapi.c
+  */
+  void CA_GetVersion(char *vertab,
+                     int len);
+  /**
+   * Params   *vertab     Version info
+   *          len         length of vertab
+   *
+   * Returns  nothing
+   *
+   ************************************************************************
+   * There doesn't seem to be anything using this function.  Has it been
+   * replaced by CrecGetVersion??  If so, there should be a CA interface
+   * to it.
+   ************************************************************************
+   */
+
+
+  void CA_Log(const char *string);
+  /**
+   *
+   * Params       string  Single string for output log
+   *
+   * Returns      nothing
+   *
+   *
+   ************************************************************************
+   * NOTE swig dosen't allow <varargs> for function arguments hence, you
+   * will have to format the string yourself prior to calling this function
+   ************************************************************************
+   */
+
+
+  void CA_Init(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Nothing, the error callback routine is registered
+   *
+   * See          CA_Term
+   *
+   ************************************************************************
+   * Initializes the CREC (CR) interface.  A callback routine is supplied
+   * by the user.  This is used as the registered callback function.
+   * Any errors will vector through this method.  The prototype for the
+   * callback funtion is defined in CR_TYPE.H
+   *
+   * This method must be the first CR call.  It can only be called again
+   * during the lifetime of a process after a call to CA_Term().
+   *
+   * The user can specify NULL as the handler funtion, this will cause
+   * the default error handler, crDefaultHandler(), to run when errors
+   * are encountered.  This allows the easy use of PERL scripts and the CR
+   * interface.  Generally a handler should be supplied.
+   ************************************************************************
+   */
+
+  void CA_Term(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Nothing, CR is terminated.  No CR method can be called
+   *              until another call to CA_Init()
+   *
+   * See          CA_Init
+   *
+   ************************************************************************
+   * Signals that the CREC (CR) interface is no longer needed.  This should
+   * be the last method called in a CR application.
+   *
+   * The callback routine registered with CA_Init() is released.
+   *
+   * A test is made to ensure that all the handles associated with
+   * CR objects have been de-allocated.  If an object handle still
+   * exists when CA_Term() is called this will generate an error.
+   ************************************************************************
+   */
+
+
+
+
+#ifdef USE_EXCEPTION_HANDLING
+  /*
+  **  CA_Exception methods
+  */
+  int  CA_ExceptionGetCode(CA_Exception* e);
+  int  CA_ExceptionGetMessage(CA_Exception* e , char* buff, int len,
+                              char *filebuff, int filebufflen, int* line);
+
+  int  CA_ExceptionGetHandleType(CA_Exception* e);
+  int  CA_ExceptionGetHandle(CA_Exception* e, void **handle);
+  int  CA_ExceptionDelete(CA_Exception* e);
+#endif
+
+
+  /*
+  **  CA_Acoustic methods
+  */
+  /*
+  **  File: acc_basi.c
+  */
+  CA_Acoustic *CA_AllocateAcoustic(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to new acoustic structure, or NULL on error.
+   *
+   * See          CA_FreeAcoustic
+   *
+   ************************************************************************
+   * Allocates a new Acoustic structure (object)
+   ************************************************************************
+   */
+
+
+  void CA_FreeAcoustic(CA_Acoustic *hAcoust);
+  /**
+   *
+   * Params       hAcoust   Handle to previously allocated acoustic structure
+   *
+   * Returns      void
+   *
+   * See          CA_AllocateAcoustic
+   *
+   ************************************************************************
+   * Frees a previously allocated acoustic object.
+   ************************************************************************
+   */
+
+
+  void CA_UnloadAcoustic(CA_Acoustic *hAcoust);
+
+
+  /*
+  **  File: acc_sub.c
+  */
+  int  CA_LoadAcousticSub(CA_Acoustic *hAcoust,
+                          char *subname,
+                          CA_AcoustInputParams *hAcoustInp);
+  /**
+   *
+   * Params       hAcoust   point to a valid acoustic object
+   *              subname     subword acoustic model file
+   *              do_arb      0 for pcx, 1 for arb
+   *              do_uni      1 for unimodal models
+   *              hAcoustInp  Handle to valid acoustic input object
+   *
+   * Returns      True/False
+   *
+   * See          CA_UnloadAcoustic
+   *              CA_LoadAcousticWhole
+   *              CA_LoadDictionary
+   *
+   ************************************************************************
+   * The acoustic sub-word models, whether speaker dependent or independent
+   * must be loaded with this method.
+   *
+   * The model files must be in the 'Tracy' format (.PDF, .MIX etc.).
+   * It is possible to load the ARB files, PCX files and CLV files.
+   *
+   * Note:    The phoneme table located with the ARB file is checked with
+   *          other phoneme tables in the system (such as the one specified
+   *          in the OK file).  This is why the Vocabulary class is also
+   *          required.
+   ************************************************************************
+   */
+
+
+
+
+  /*
+  **  CA_Vocab methods
+  */
+  /*
+  **  File: voc_basi.c
+  */
+  CA_Vocab *CA_AllocateVocabulary(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to allocated vocabulary structure, or NULL on error.
+   *
+   * See          CA_FreeVocabulary
+   *
+   ************************************************************************
+   * This method creates a new vocabulary structure (object).  The new
+   * structure is supplied to the caller by the method's return value.
+   ************************************************************************
+   */
+
+
+  void CA_FreeVocabulary(CA_Vocab *hVocab);
+  /**
+   *
+   * Params       hVocab  Handle to a previously allocated vocabulary
+   *
+   * Returns      void
+   *
+   * See          CA_AllocateVocabulary
+   *
+   ************************************************************************
+   * Frees a previously allocated vocabular structure (object).
+   ************************************************************************
+   */
+  void CA_LoadDictionary(CA_Vocab *hVocab,
+                         const LCHAR* vocname,
+                         char *phtname,
+                         ESR_Locale* locale);
+  /**
+   *
+   * Params       hVocab  Handle to vocabulary object
+   *              vocFile Source vocabulary file
+   *              phtname Source of phoneme table file
+   *              locale Locale associated with dictionary
+   *
+   * Returns      void
+   *
+   * See          CA_UnloadDictionary
+   *
+   ************************************************************************
+   * Loads vocabulary 'words' from an OK file.
+   ************************************************************************
+   */
+
+
+  void CA_UnloadDictionary(CA_Vocab *hVocab);
+  /**
+   *
+   * Params       hVocab  Handle to vocabulary object
+   *
+   * Returns      void
+   *
+   * See          CA_LoadDictionary
+   *
+   ************************************************************************
+   * Unloads a previously loaded dictionary
+   ************************************************************************
+   */
+
+
+  int  CA_CheckEntryInDictionary(CA_Vocab *hVocab,
+                                 const char *label);
+  /**
+   *
+   * Params       hVocab  Handle to vocabulary object
+   *              label   textual trasncription of requested word
+   *
+   * Returns      ?
+   *
+   ************************************************************************
+   * Checks the existance of a pronunciation
+   ************************************************************************
+   */
+
+
+  int CA_GetEntryInDictionary(CA_Vocab *hVocab,
+                              const char *label,
+                              char *pron,
+                              int *pronSize,
+                              int pronMaxSize);
+  /**
+   *
+   * Params       hVocab      Handle to vocabulary object
+   *              label       textual trasncription of requested word
+   *              pron        buffer to put pronunciation in.  The format
+   *                          of this buffer is a series of prons terminated
+   *                          by a null all terminated by a double null
+   *              pronSize    the number of bytes returned in the pron buffer
+   *              pronMaxSiz  this size of "pron"
+   *
+   * Returns      true if the word exists in the dictionary
+   *
+   ************************************************************************
+   * Get the pronunciation of a word
+   ************************************************************************
+   */
+
+
+  /*
+  **  CA_NGram methods
+  */
+  /*
+  **  File: lmf_basi.c
+  */
+  /*
+  ** Gethin 25Aug00
+  ** Functions excluded from compilation in ca.mak,
+  ** therefore commented here
+  **
+  ** CA_NGram *CA_AllocateNGram (void);
+  ** void CA_FreeNGram (CA_NGram *hNGram);
+  ** void CA_LoadNGram (CA_NGram *hNGram, char *lmfname, char *trnname);
+  ** void CA_SaveNGram (CA_NGram *hNGram, char *lmfname);
+  ** void CA_UnloadNGram (CA_NGram *hNGram);
+  ** int CA_ScoreSentence (CA_NGram *hNGram, char *sentence);
+  ** int CA_SetupNGram (CA_NGram *hNGram, CA_Vocab *hVocab, int type);
+  */
+
+  /*
+  **  CA_Pattern methods
+  */
+  /*
+  **  File: pat_basi.c
+  */
+
+  CA_Pattern *CA_AllocatePattern(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to new pattern object
+   *
+   * See          CA_FreePattern
+   *
+   ************************************************************************
+   * Creates a new pattern structure (object)
+   ************************************************************************
+   */
+
+
+  void CA_FreePattern(CA_Pattern *hPattern);
+  /**
+   *
+   * Params       hPattern    valid pattern handle
+   *
+   * Returns      Nothing, the pattern handle is not longer valid.
+   *
+   * See          CA_AllocatePattern
+   *
+   ************************************************************************
+   * Deletes a previously allocated pattern structure
+   ************************************************************************
+   */
+
+
+  int  CA_LoadPattern(CA_Pattern *hPattern,
+                      CA_PatInputParams *hPatInput,
+                      int dimen,
+                      char *multable,
+                      char *imelda);
+  /**
+   *
+   * Params       hPattern    valid pattern handle
+   *              hPatInput   valid pattern input paramater handle
+   *              dimen
+   *              multable
+   *              imelda
+   *
+   * Returns      true/false
+   *
+   * See          CA_UnloadPattern
+   *              CA_SetupPatternForAcoustic
+   *              CA_LoadPatternParameters
+   *
+   ************************************************************************
+   * Loads a pattern object.  Once loaded it need to be setup
+   * with an acoustic model before any further setups involving
+   * the recognizer.  The imelda parameters and optionally
+   * the multables are loaded into the object.  Setup operations
+   * based on parameters are also done.
+   *
+   * It is an error to call this function without first loading
+   * pattern input parameters.
+   ************************************************************************
+   */
+
+
+  void CA_UnloadPattern(CA_Pattern *hPattern);
+  /**
+   *
+   * Params       hPattern    valid pattern handle
+   *
+   * Returns      Nothing, loaded object is unloaded
+   *
+   * See          CA_LoadPattern
+   *
+   ************************************************************************
+   * Unloads a previously loaded pattern object
+   ************************************************************************
+   */
+
+
+  void CA_SetupPatternForAcoustic(CA_Pattern *hPattern,
+                                  CA_Acoustic *hAcoustic);
+  /**
+   *
+   * Params       hPattern    valid pattern handle
+   *              hAcoustic   valid acoustic handle
+   *
+   * Returns      Nothing, the pattern object is setup and ready for use
+   *
+   * See          CA_ClearPatternForAcoustic
+   *              CA_LoadPattern
+   *
+   ************************************************************************
+   * This sets up a previously allocated pattern object with acoustic
+   * model information from the appropriate acoustic object.
+   * It is necessary to call this function before the acoustic
+   * object can be used any recognition or adaptation.
+   *
+   * If you have not called CA_LoadPattern() an error will be generated.
+   ************************************************************************
+   */
+
+
+  void CA_ClearPatternForAcoustic(CA_Pattern *hPattern,
+                                  CA_Acoustic *hAcoustic);
+  /**
+   *
+   * Params       hPattern    valid pattern handle
+   *              hAcoustic   valid acoustic handle
+   *
+   * Returns      Nothing
+   *
+   * See          CA_SetupPatternForAcoustic
+   *
+   ************************************************************************
+   * un-sets a previously prepared pattern object
+   ************************************************************************
+   */
+
+
+  int  CA_NextPatternFrame(CA_Pattern *hPattern,
+                           CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hPattern valid pattern handle
+   *              hUtt     valid utterance handle
+   *
+   * Returns      status code
+   *
+   * See          CA_NextUtteranceFrame
+   *              CA_MakePatternFrame
+   *              CA_AdvanceRecognitionByFrame
+   *
+   ************************************************************************
+   * Frames can be accessed, on-by-one, from an utterance object into
+   * a pattern object with this method.  If this routine returns a non-zero
+   * value then an utterance frame is available for processing and a call
+   * to the recognition method CA_AdvanceRecognitionByFrame as shown below:
+   *
+   * while ( CA_NextPatternFrame( hPattern, hUtt ) )
+   * {
+   *     CA_AdvanceRecognitionByFrame( hRecog, hPattern, hUtt );
+   * }
+   *
+   * Frames copied in with this method are transformed (post-IMELDA)
+   *
+   * It is now advised that instead of this function,
+   * one uses CA_GetUtteranceFrame and CA_AdvanceUtteranceFrame
+   * to access frames in sequence.
+   ************************************************************************
+   */
+
+  int  CA_MakePatternFrame(CA_Pattern *hPattern,
+                           CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hPattern valid pattern handle
+   *              hUtt     valid utterance object handle
+   *
+   * Returns      ?
+   *
+   * See          CA_NextUtteranceFrame
+   *              CA_NextPatternFrame
+   *
+   ************************************************************************
+   * The current frames is pulled in from an utterance object into
+   * a pattern object with this method.  The frame position is not
+   * moved on.
+   *
+   * Frames copied in with this method are IMELDA transformed
+   ************************************************************************
+   */
+
+
+  /*
+  **  File: pat_tran.c
+  */
+  void CA_SetCepstrumOffsetInPattern(CA_Pattern *hPattern,
+                                     int index,
+                                     int value);
+   /**
+   *
+   * Params       hPattern    valid pattern handle
+   *              hAcoust   valid acoustic handle
+   *              relevance   relevance coefficient
+   *
+   * Returns      Nothing
+   *
+   ************************************************************************
+   *  Accumulates the relevance of hAcoustic into hPattern
+   ************************************************************************
+   */
+
+
+  void CA_SetupNoiseConditioning(CA_Pattern *hPattern,
+                                 CA_FrontendInputParams *hFrontpar,
+                                 int do_wholeword,
+                                 int do_subword);
+  /**
+   *
+   * Params       hPattern valid pattern handle
+   *              hFrontpar valid frontend parameter object handle
+   *              do_wholeword    true or false
+   *              do_subword      true or false
+   *
+   * Returns      ?
+   *
+   * See          CA_ClearNoiseConditioning
+   *              CA_ConditionAcousticToNoise
+   *
+   ************************************************************************
+   * The initial setup for Extended Noise Conditioning (ENC).
+   *
+   ************************************************************************
+   */
+
+
+  void CA_ClearNoiseConditioning(CA_Pattern *hPattern);
+  /**
+   *
+   * Params       hPattern valid pattern handle
+   *
+   * Returns      ?
+   *
+   * See          CA_SetupNoiseConditioning
+   *              CA_ConditinAcousticToNoise
+   *
+   ************************************************************************
+   * To free data structures constructed for Extended Noise Conditioning.
+   *
+   ************************************************************************
+   */
+
+
+  void CA_WriteMLLRCovariates(CA_Pattern *hPattern,
+                              CA_Acoustic *hAcoust,
+                              char *basename);
+  /**
+      No CR equivalent function
+   */
+
+
+  void CA_ReadMLLRTransforms(CA_Pattern *hPattern,
+                             CA_Acoustic *hAcoust,
+                             char *basename,
+                             int ntrans);
+  /**
+      No CR equivalent function
+   */
+
+
+  /*
+  **  File: pat_dump.c
+  */
+  void CA_SetupTransformDump(CA_Pattern *hPattern,
+                             char* basename);
+  /**
+   *
+   * Params       hPattern    valid pattern handle
+   *              basename    file base name
+   *
+   * Returns      Nothing
+   *
+   * See          CA_ClearTransformDump
+   *              CA_CalculateTransforms
+   *              CA_ClearTransformAccumulates
+   *
+   ************************************************************************
+   *  Sets up the facility to save the transform accumulates to a file.
+   ************************************************************************
+   */
+
+
+  void CA_ClearTransformDump(CA_Pattern *hPattern);
+  /**
+   *
+   * Params       hPattern    valid pattern handle
+   *
+   * Returns      Nothing
+   *
+   * See          CA_SetupTransformDump
+   *              CA_CalculateTransforms
+   *              CA_ClearTransformAccumulates
+   *
+   ************************************************************************
+   *  Clears the facility to save the transform accumulates to a file.
+   ************************************************************************
+   */
+
+
+  /*
+   * Pattern Array access methods
+   */
+  /*
+  **  File: pat_swig.c
+  */
+
+	/*
+   * Transform methods
+   */
+  /*
+  **  File: catrans.c
+  */
+  /*
+   * dave 08-Oct-99: These functions are now out of sync with CA.
+   *
+   * CA_Transform *CA_AllocateTransform (void);
+
+   * void CA_FreeTransform (CA_Transform *hTransform);
+   * int CA_LoadTransform (CA_Transform *hTransform, int dimen);
+   * void CA_UnloadTransform (CA_Transform *hTransform);
+   * void CA_ConfigureTransform (CA_Transform *hTransform,int do_mllr,int do_imelda);
+   * void CA_ClearTransform (CA_Transform *hTransform);
+   * void CA_InheritAccumulates (CA_Transform *hTransform, CA_Pattern *hPattern);
+   * void CA_LoadTransformAccumulates( CA_Pattern *hPattern,
+   *      CA_Transform *hTransform);
+   */
+
+  /*
+  **  CA_Utterance methods
+  */
+  /*
+  **  File: utt_basi.c
+  */
+  CA_Utterance *CA_AllocateUtterance(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to a new utterance object
+   *
+   * See          CA_FreeUtterance
+   *
+   ************************************************************************
+   * Creates a new utterance object
+   ************************************************************************
+   */
+
+
+  void CA_FreeUtterance(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      void    the object is no longer valid
+   *
+   * See          CA_AllocateUtterance
+   *
+   ************************************************************************
+   * Destroys a previously allocated utterance object
+   ************************************************************************
+   */
+
+
+  int  CA_InitUtteranceForFrontend(CA_Utterance *hUtt,
+                                   CA_FrontendInputParams *hFrontInp);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *              hFrontPar valid frontend input parameter handle
+   *
+   * Returns      non-zero on error
+   *
+   * See          CA_ClearUtterance
+   *              CA_GetFrontendUtteranceDimension
+   *              CA_LoadUtteranceFrame
+   *
+   ************************************************************************
+   * Creates an utterance object ready for the frontend to insert frames.
+   * This method should also be used to create utterances which will be
+   * used for raw utterance (frame-by-frame) recognition - See
+   * CA_LoadUtteranceFrame().
+   *
+   * Use the result from CA_GetFrontendUtteranceDimension to specify
+   * the dimension.
+   ************************************************************************
+   */
+
+
+  void CA_ClearUtterance(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      void
+   *
+   * See          CA_InitUtteranceForFrontend
+   *
+   ************************************************************************
+   * Closes a previously opened utterance and frame buffer.
+   ************************************************************************
+   */
+
+
+  int  CA_NextUtteranceFrame(CA_Pattern *hPattern,
+                             CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hPattern    valid pattern handle
+   *              hUtt        valid utterance handle
+   *
+   * Returns      status code
+   *
+   * See          CA_NextPatternFrame
+   *              CA_MakePatternFrame
+   *              CA_AdvanceUtteranceFrame
+   *
+   ************************************************************************
+   * Frames can be accessed, on-by-one, from an utterance object into
+   * a pattern object with this method.  It is advised that instead of
+   * this function, one use CA_MakePatternFrame and CA_AdvanceUtteranceFrame
+   * to access frames in sequence.
+   *
+   * Frames copied in with this method are un-transformed (pre-IMELDA)
+   ************************************************************************
+   */
+
+
+  int  CA_AdvanceUtteranceFrame(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      True if it successfully advances the frame positon by one.
+   *
+   * See          CA_AdvanceRecognitionByFrame
+   *
+   ************************************************************************
+   ************************************************************************
+   */
+
+  int  CA_UtteranceHasVoicing(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      non-zero if utterance has voicing data
+   *
+   ************************************************************************
+   * This method can be polled to interrogate the state of the utterance.
+   ************************************************************************
+   */
+
+  ESR_BOOL CA_IsUtteranceLockedForInput(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      TRUE if utterance is locked
+   *
+   * See          CA_LockUtteranceFromInput
+   *
+   ************************************************************************
+   * Indicates if utterance is locked.
+   ************************************************************************
+   */
+
+  void CA_UnlockUtteranceForInput(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      void
+   *
+   * See          CA_LockUtteranceFromInput
+   *              CA_ResetVoicing
+   *
+   ************************************************************************
+   * This primes the utterance object by setting it's status to ACTIVE
+   ************************************************************************
+   */
+
+
+  void CA_LockUtteranceFromInput(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      void
+   *
+   * See          CA_UnlockUtteranceForInput
+   *
+   ************************************************************************
+   * This signals that the utterance is complete by setting it's status to IDLE
+   ************************************************************************
+   */
+
+
+  void CA_ResetVoicing(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      void
+   *
+   * See          CA_UnlockUtteranceForInput
+   *              CA_LockUtteranceFromInput
+   *
+   ************************************************************************
+   * This prepares the utterance object for re-use.  The 'utterance has
+   * started' and 'utterance has ended' flags are cleared.
+   * Unlike CA_UnlockUtteranceForInput, this does not fully clear the utterance.
+   ************************************************************************
+   */
+
+
+  void CA_FlushUtteranceFrames(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      void
+   *
+   * See          CA_InitUtterance
+   *
+   ************************************************************************
+   * Clears the utterance object's frame buffer
+   ************************************************************************
+   */
+
+
+  void CA_SetEndOfUtteranceByLevelTimeout(CA_Utterance *hUtt,
+                                          long timeout,
+                                          long holdOff);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *              timeout timeout before EOU decision
+   *              holdOff Period which must pass before EOU can be signalled
+   *
+   * Returns      void
+   *
+   * See          CA_UtteranceHasEnded
+   *              CA_SeekStartOfUtterance
+   *
+   ************************************************************************
+   * Sets the duration (of silence) which should pass before making
+   * and end-of-utterance (EOU) decision.
+   *
+   * 'holdOff' is the period which must elapse before an EOU decision can
+   * be made.  An EOU will not occure before 'holdOff'.
+   *
+   * 'timeout' anf 'holdOff' are measured in frames.
+   *
+   * Caution: if an utterance can be spoken within 'holdOff' frames
+   *          it may be missed by the recognizer.
+   ************************************************************************
+   */
+
+
+  int  CA_UtteranceHasEnded(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      non-zero if utterance has finished
+   *              (we've processed the last frame and we're locked from input)
+   *
+   * See          CA_SeekStartOfUtterance
+   *              CA_SetEndOfUtteranceByLevelTimeout
+   *
+   ************************************************************************
+   * This method can be polled to interrogate the state of the utterance.
+   ************************************************************************
+   */
+
+  /*
+  **  File: utt_file.c
+  */
+  int  CA_SeekUtteranceFrame(CA_Utterance *hUtt,
+                             int frame_no);
+  /**
+   *
+   * Params       hUtt        valid utterance handle
+   *              frame_no    new frame number (should this be unsigned long?)
+   *
+   * Returns      -1 on error
+   *
+   * See          CA_NextPatternFrame
+   *
+   ************************************************************************
+   * The 'file pointer' is set to an explicit location
+   ************************************************************************
+   */
+
+
+  int CA_SaveUtterance(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      int
+   *
+   ************************************************************************
+   * Saves an utterance
+   ************************************************************************
+   */
+
+
+  void CA_SaveUtteranceHeader(CA_Utterance *hUtt, int frames,
+                              int samplerate, int framerate);
+  /**
+   *
+   * Params       hUtt        valid utterance handle
+   *              frames      frames which have been saved in this utt
+   *              samplerate  sampling rate (typically 22050Hz)
+   *              framerate   frame rate    (typically 100 frames per second)
+   * Returns      void
+   *
+   ************************************************************************
+   * Saves an utterance
+   ************************************************************************
+   */
+
+
+  /*
+  **  File: utt_data.c
+  */
+  int  CA_SeekStartOfUtterance(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      non-zero if utterance has begun
+   *
+   * See          CA_UtterancehasEnded
+   *
+   ************************************************************************
+   * This method can be polled to interrogate the state of the utterance.
+   ************************************************************************
+   */
+
+
+  int  CA_GetUnprocessedFramesInUtterance(CA_Utterance *hUtt);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *
+   * Returns      number of un-read frames in the utterance's frame buffer
+   *
+   * See          CA_AdvanceRecognitionByFrame
+   *
+   ************************************************************************
+   * Returns the number of un-read frames in the utterance's frame buffer,
+   * i.e. those that have been inserted but have not yet been processed
+   * by the recognizer object.
+   ************************************************************************
+   */
+
+
+  /*
+  **  File: utt_proc.c
+  */
+  int  CA_LoadUtteranceFrame(CA_Utterance *hUtt,
+                             unsigned char* pUttFrame,
+                             int uttFrameLen);
+  /**
+   *
+   * Params       hUtt        valid utterance handle
+   *              pUttFrame   Pointer utterance data
+   *              uttFrameLen Number of items (features) in the frame
+   *
+   * Returns      zero on error
+   *
+   * See          CA_InitUtteranceForFrontend
+   *              CA_GetFrontendUtteranceDimension
+   *
+   ************************************************************************
+   * Inserts the frame data pointed to by 'pUttFrame' into the utterance
+   * object 'hUtt'.
+   *
+   * The size of the frame must agree with the value used to initialise
+   * the utterance object.  Utterances suitable for injection are
+   * ones created for the Frontend.
+   ************************************************************************
+   */
+
+
+  int  CA_CopyUtteranceFrame(CA_Utterance *hUtt1,
+                             CA_Utterance *hUtt2);
+  /**
+   *
+   * Params       hUtt1   Destination valid utterance handle
+   *              hUtt2   Source valid utterance handle
+   *
+   * Returns      zero on error
+   *
+   ************************************************************************
+   * Copies utterance frames from one utterance object to another
+   ************************************************************************
+   */
+
+
+  void CA_CopyPatternFrame(CA_Utterance *hUtt,
+                           CA_Pattern *hPattern);
+  /**
+      No CR equivalent function
+   */
+
+
+  int  CA_CalculateUtteranceStatistics(CA_Utterance *hUtt,
+                                       int start,
+                                       int end);
+  /**
+   *
+   * Params       hUtt    valid utterance handle
+   *              start   starting frame ID (timecode)
+   *              end     final frame ID (timecode)
+   *
+   * Returns      Number of frames used in analysis
+   *
+   *
+   ************************************************************************
+   * Signals the collection of statistics over a pre-defined range of
+   * utterance frames in the utterance's frame buffer.  do_filter flag
+   * selects the frames that are likely to have just the ambient noise
+   * only.
+   * returns the number of frames used in the analysis.
+   ************************************************************************
+   */
+
+
+  /*
+  **  CA_Syntax methods
+  */
+
+  CA_Syntax *CA_AllocateSyntax(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to new syntax structure (object)
+   *
+   * See          CA_FreeSyntax
+   *
+   ************************************************************************
+   * creates a new syntax object
+   ************************************************************************
+   */
+
+
+  void CA_FreeSyntax(CA_Syntax *hSyntax);
+  /**
+   *
+   * Params       hSyntax valid syntax handle
+   *
+   * Returns      void
+   *
+   * See          CA_AllocateSyntax
+   *
+   ************************************************************************
+   * Frees an allocated syntax object
+   ************************************************************************
+   */
+
+  int CA_IsEnrollmentSyntax(CA_Syntax *hSyntax);
+  /**
+   *
+   * Params       hSyntax valid syntax handle
+   *
+   * Returns      int
+   *
+   ************************************************************************
+   * tells whether a syntax is to be used for voice-enrollment 
+   ************************************************************************
+   */
+
+  int  CA_SetupSyntaxForRecognizer(CA_Syntax *hSyntax,
+                                   CA_Recog *hRecog);
+  /**
+   *
+   * Params       hSyntax valid syntax handle
+   *              hRecog  valid recog handle
+   *
+   * Returns      The number of Syntax groups located
+   *
+   * See          CA_CeilingSyntaxForRecognizer
+   *
+   ************************************************************************
+   * This is an essential, pre-recognition, setup method on the syntax object.
+   * A syntax can be set up using more than one recognizer, provided the
+   * active models have matching word indices.
+   * now deprecated
+   ************************************************************************
+   */
+    int  CA_CeilingSyntaxForRecognizer(CA_Syntax *hSyntax,
+                                   CA_Recog *hRecog);
+  /**
+   *
+   * Params       hSyntax valid syntax handle
+   *              hRecog  valid recog handle
+   *
+   * Returns      The number of Syntax groups located
+   *
+   * See          CA_ClearSyntaxForRecognizer
+   *
+   ************************************************************************
+   * This is an essential, pre-recognition, setup method on the syntax object.
+   * A syntax can be set up using more than one recognizer, provided the
+   * active models have matching word indices.
+   * now deprecated
+   ************************************************************************
+   */
+
+
+
+  void CA_ClearSyntaxForRecognizer(CA_Syntax *hSyntax,
+                                   CA_Recog *hRecog);
+  /**
+   *
+   * Params       hSyntax valid syntax handle
+   *              hRecog  valid recog handle
+   *
+   * Returns      void
+   *
+   * See          CA_SetupSyntaxForRecognizer
+   *              CA_UnloadRecognitionModels
+   *
+   ************************************************************************
+   * Clears a previous syntax setup.
+   ************************************************************************
+   */
+
+
+  int  CA_CompileSyntax(CA_Syntax *hSyntax);
+  /**
+   *
+   * Params       hSyntax     valid syntax handle
+   *
+   * Returns      0 if successful, otherwise 1 to indicate faliure
+   *
+   * See          CA_AddWordToSyntax
+   *
+   ************************************************************************
+   * Compiles a syntax after words have been added dynamically
+   *
+   ************************************************************************
+   */
+
+  /*
+  **  File: syn_grou.c
+  */
+
+
+  void CA_GetGroupName(CA_Syntax *hSyntax,
+                       int group_id,
+                       char *buff,
+                       int buff_len);
+  /**
+      No CR equivalent function.  Not called by any function
+   */
+
+  void CA_DeleteSyntaxGroups(CA_Syntax *hSyntax);
+  /**
+      CR function has no prototype
+   */
+
+  /*
+  **  File: syn_rule.c
+  */
+
+int CA_CheckTranscription(CA_Syntax *hSyntax,
+                            const char *trans,
+                            int allow_group_labels);
+  /**
+   *
+   * Params       hSyntax     valid syntax handle
+   *              trans        character string phrase
+    allow_group_labels  If 1, permits either words or group labels
+   *
+   * Returns      -1 if successful, 1 if failed, 0 if all words parsed,
+    but not on a valid terminal node.
+   *
+   ************************************************************************
+   * Use CA_CheckTranscription to check whether a phrase is valid for the
+   * given syntax. Set allow_group_labels to 0 if you use single-word per group.
+   *
+   * NB When allow_group_labels is set to 1, there is a danger that a group
+   * label might match an invalid word.
+   ************************************************************************
+   */
+
+  /* It's nice to keep the Arbdata separate from the models and from the graphs
+     because we may have two or more acoustic models that use the same arbdata,
+     which is also justification for having the model durations in the
+     acoustic model file.  Different grammars should also be able to
+     share an Arbdata */
+  /* new CA_Syntax functions */
+int CA_AttachArbdataToSyntax(CA_Syntax* hSyntax, CA_Arbdata* arbdata);
+CA_Arbdata* CA_LoadArbdata(const char* filename);
+unsigned int CA_ArbdataGetModelVersionID(CA_Arbdata* ca_arbdata);
+int CA_ArbdataGetModelIdsForPron(CA_Arbdata* ca_arbdata,
+								 const char* pronunciation,  /* WB assumed at the edges */
+								 int pronunciation_len,
+								 modelID* pmodelIds);
+int CA_ArbdataGetModelIdsForPIC(CA_Arbdata* ca_arbdata, const char lphon, const char cphon, const char rphon);
+
+  /**
+   * Destroys arbdata.
+   *
+   * @param arbdata CA_Arbdata handle
+   */
+void CA_FreeArbdata(CA_Arbdata* arbdata);
+int CA_AddWordToSyntax(CA_Syntax* syntax, const char* slot,
+                         const char *phrase, const char* pronunciation, const int weight);
+int CA_ResetSyntax(CA_Syntax* syntax);
+int CA_LoadSyntaxAsExtensible(CA_Syntax *hSyntax, char *synbase,
+                                int num_words_to_add);
+int CA_DumpSyntaxAsImage(CA_Syntax *hSyntax, const char *imagename, int version_number);
+int CA_DumpSyntax(CA_Syntax *hSyntax, const char *basename);
+int CA_LoadSyntaxFromImage(CA_Syntax *hSyntax, const LCHAR* filename);
+
+
+  /*
+  **  CA_Recog methods
+  */
+  /*
+  **  File: rec_basi.c
+  */
+  CA_Recog *CA_AllocateRecognition(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to valid recognizer object, NULL on error.
+   *
+   * See          CA_FreeRecognition
+   *
+   ************************************************************************
+   * Creates a reconition object.
+   * This only creates the object and internal storage structures.
+   * The pointer can be re-used but must be deleted when finished with.
+   ************************************************************************
+   */
+
+
+  int CA_ConfigureRecognition(CA_Recog *hRecoc,
+                              CA_RecInputParams *hRecInput);
+
+
+
+  void CA_UnconfigureRecognition(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog              valid recog handle
+   *
+   * Returns      void
+   *
+   * See          CA_ConfigureRecognition
+   *
+   ************************************************************************
+   * Unconfigures recognizer.
+   ************************************************************************
+   */
+
+
+  void CA_FreeRecognition(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns      void
+   *
+   * See          CA_AllocateRecognition
+   *
+   ************************************************************************
+   * Deletes a previously allocated recognizer
+   ************************************************************************
+   */
+
+
+  void CA_BeginRecognition(CA_Recog *hRecog,
+                           CA_Syntax *hSyntax,
+                           int first_syntax_node,
+                           CA_RecInputParams *hRecInput);
+  /**
+   *
+   * Params       hRecog              valid recog handle
+   *              hSyntax             valid syntax handle
+   *              first_syntax_node   starting syntax node
+   *              hRecInput           valid recog input parameter handle
+   *
+   * Returns      void
+   *
+   * See          CA_EndRecognition
+   *              CA_LoadRecognitionParameters
+   *
+   ************************************************************************
+   * Before a recognizer object can be used it must be initialized.
+   * This method performs this task and is given an appropriate
+   * syntax (and starting node) along with the required recognition
+   * input parameters.
+   *
+   * 'first_syntax_node' should be set to '1' (the root of the syntax object).
+   * Only experienced users should set this to any other value.  It is
+   * a start node ID returned by CA_AddNewNode().
+   *
+   * It is an error to call this function without first loading
+   * recognizer input parameters.
+   ************************************************************************
+   */
+
+
+  void CA_AdvanceRecognitionByFrame(CA_Recog *hRecog,
+                                    CA_Pattern *hPattern,
+                                    CA_Utterance *hUtterance);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              hPattern    valid pattern handle
+   *              hUtterance  valid utterance handle
+   *
+   * Returns      void
+   *
+   * See          CA_BeginRecognition
+   *              CA_EndRecognition
+   *              CA_AllocatePattern
+   *              CA_AllocateUtterance
+   *              CA_NextPatternFrame
+   *
+   ************************************************************************
+   * The vocabulary and acoustic object are required by the recognition
+   * object to process input frames should already have been loaded with
+   * a call to one of the CA_LoadModels methods.
+   *
+   * This method advances the recognizer by a single frame from the
+   * input stream.  This should be called when time permits and frames
+   * are available in the input stream (utterance).  Typically one would
+   * use the CA_Pattern object to detect the presence of unused frames,
+   * This is shown below:
+   *
+   * while ( CA_NextPatternFrame( hPattern, hUtt ) )
+   * {
+   *     CA_AdvanceRecognitionByFrame( hRecog, hPattern, hUtt );
+   * }
+   *
+   * This frame-by-frame approach provides the developer with fine control
+   * of the recognition task.  In a multi-process real-time enviornment
+   * where a sophisticated OS may not be present, one might want to
+   * schedule other tasks between individual frames.  This was certainly
+   * the case on early DSP boards chosen to host the CA recognizer.
+   * The developer may, of course, decide that such fine control is not
+   * required.  In such cases a higher level convenience function can easily
+   * be constructed and 'wrapped' around this method and
+   * which prepares the recognizer, processes all frames and then returns to
+   * the caller.
+   *
+   * Recognition results may be issued at any time within this method,
+   * It is partial traceback controls the time when results can be issued.
+   * Currently results are placed in a file or to the screen - the
+   * CA_Result methods provide additional flexibility.
+   ************************************************************************
+   */
+
+
+  int  CA_EndRecognition(CA_Recog *hRecog,
+                         CA_Pattern *hPattern,
+                         CA_Utterance *hUtterance);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              hPattern    valid pattern handle
+   *              hUtterance  valid utterance handle
+   *
+   * Returns      non-ZERO if correct termination
+   *
+   * See          CA_BeginRecognition
+   *              CA_AdvanceRecognitionByFrame
+   *  CA_DiscardRecognition
+   *
+   ************************************************************************
+   * When input processing is deemed to be complete, this mthod must
+   * be called.  It should be called after all the required input frames
+   * have been advanced through.  Not more than one recognizer may be
+   * terminated in this fashion when multiple recognizers are employed on
+   * given utterance.  All others should be discarded.
+   ************************************************************************
+   */
+
+
+  int CA_DiscardRecognition(CA_Recog *hRecog,
+                            CA_Pattern *hPattern,
+                            CA_Utterance *hUtterance);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              hPattern    valid pattern handle
+   *              hUtterance  valid utterance handle
+   *
+   *
+   * Returns      non-ZERO if successful
+   *
+   * See          CA_BeginRecognition
+   *              CA_AdvanceRecognitionByFrame
+   *  CA_EnddRecognition
+   *
+   ************************************************************************
+   * To discard the current recognition process.  Not more than one
+   * recognizer may be terminated in this fashion when multiple recognizers
+   * are employed on given utterance.  All others should be discarded.
+   ************************************************************************
+   */
+
+
+  void CA_UpdateCMSAccumulates(CA_Utterance *hUtt,
+                               CA_Recog *hRecog);
+  /**
+   *
+   * Params       hUtt       valid utterance handle
+   *              hRecog     valid recog handle
+   *
+   * Returns      Nothing
+   *
+   * See          CA_AttachCMStoUtterane
+   *              CA_CalculateCMSParameters
+   *
+   ************************************************************************
+   * Copies channel normalization accumulates from recog to utterance.
+   * These are then used when a call is made to CA_CalculateCMSParameters.
+   ************************************************************************
+   */
+
+  /*
+  **  File: rec_load.c
+  */
+  void CA_LoadModelsInAcoustic(CA_Recog *hRecog,
+                               CA_Acoustic *hAcoust,
+                               CA_AcoustInputParams *hAcoustInp);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              hAcoust     valid acoutic (model) handle
+   *              hAcoustInp  valid acoustic inpit parameter handle
+   *
+   * Returns      void
+   *
+   * See          CA_LoadModelsInDictionary
+   *              CA_UnloadRecognitionModels
+   *              CA_LoadAcousticParameters
+   *
+   ************************************************************************
+   * This method constructs whole or sub-word models from
+   * the entire model set in preparation for recognition.
+   *
+   * It is an error to call this function without first loading
+   * acoustic input parameters.
+   ************************************************************************
+   */
+
+
+  void CA_LoadModelsInDictionary(CA_Recog *hRecog,
+                                 CA_Vocab *hVocab,
+                                 CA_Acoustic *hAcoust,
+                                 CA_AcoustInputParams *hAcoustInp);
+
+
+
+  void CA_LoadCrosswordTriphonesInSyntax(CA_Recog *hRecog,
+                                         CA_Syntax *hSyntax,
+                                         CA_Acoustic *hAcoust,
+                                         CA_AcoustInputParams *hAcoustInp,
+                                         int do_generics);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              hSyntax     valid syntax handle
+   *              hVocab      valid vocabulary handle
+   *              hAcoust     valid acoustic (model) handle
+   *              hAcoustInp  valid acoustic input parameter handle
+   *              do-generics
+   *
+   * Returns      void
+   *
+   * See          CA_LoadModelsInAcoustic
+   *              CA_LoadModelsInDictionary
+   *              CA_UnloadRecognitionModels
+   *              CA_LoadAcousticParameters
+   *
+   ************************************************************************
+   * It is an error to call this function without first loading
+   * acoustic input parameters.
+   ************************************************************************
+   */
+
+
+void CA_UnloadRecognitionModels (CA_Recog *hRecog);
+/**
+ *
+ * Params       hRecog  valid recog handle
+ *
+ * Returns      void
+ *
+ * See          CA_LoadModelsInAcoustic
+ *              CA_LoadModelsInDictionary
+ *
+ ************************************************************************
+ * Destorys a previously loaded set of models.
+ * The models could have been constructed from acoustic information,
+ * dictionary (vocabulary) information or syntax (grammar) information
+ ************************************************************************
+ */
+
+
+  void CA_LoadMonophonesInAcoustic(CA_Recog *hRecog,
+                                   CA_Acoustic *hAcoust,
+                                   CA_AcoustInputParams *hAcoustInp);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              hAcoust     valid acoustic (model) handle
+   *              hAcoustInp  valid acoustic input parameter handle
+   *
+   * Returns      void
+   *
+   * See          CA_LoadModelsInAcoustic
+   *              CA_LoadCrosswordTriphonesInSyntax
+   *              CA_UnloadRecognitionModels
+   *              CA_LoadAcousticParameters
+   *
+   ************************************************************************
+   * This method constructs models for phoneme recognition. When using it,
+   * replace the calls to CA_LoadModelsInAcoustic and
+   * CA_LoadCrosswordTriphonesInSyntax with a call to
+   * CA_LoadMonophonesInAcoustic.
+   ************************************************************************
+   */
+
+
+  int CA_CompareModelIndices(CA_Recog *hRecog1,
+                             CA_Recog *hRecog2);
+  /**
+   *
+   * Params       hRecog1 valid recog handle
+   *              hRecog2 valid recog handle
+   *
+   * Returns      0 if indices match.
+   *
+   * See          CA_SetupSyntaxForRecognizer
+   *
+   ************************************************************************
+   * Checks that the model indices for two recognizers that have been set
+   * up are compatible. This check should be made if the recognizers are
+   * to use a shared syntax object. The check should be made prior to the
+	 * calls to CA_BeginRecognition.
+   ************************************************************************
+   */
+
+
+  int CA_FixModelIndices(CA_Recog *hRecogTgt,
+                         CA_Acoustic *hAcousticSub,
+                         CA_Acoustic *hAcousticWhole,
+                         CA_Recog *hRecogSrc);
+  /**
+   *
+   * Params       hRecogTgt       valid recog handle
+   *              hAcousticSub    valid sub-word acoustic handle
+   *              hAcousticWhole  valid whole-word acoustic handle
+   *              hRecogSrc       valid recog handle
+   *
+   * Returns      0 if successful.
+   *
+   * See          CA_CompareModelIndices
+   *              CA_LoadCrossWordTriphonesInSyntax
+   *
+   ************************************************************************
+   * Us this function if the model indices for two recognizers that have
+   * been set up are not compatible. This function modifies the target
+   * recognizer's model indices to make them compatible with one another.
+   * This means that they can safely share a syntax object without the
+   * need for calling CA_LoadCrosswordTriphonesInSyntax.
+   ************************************************************************
+   */
+
+
+
+
+  /*
+  **  File: rec_addi.c
+  */
+  int  CA_GetRecognitionTopScore(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns      top score
+   *
+   * See          CA_SetRecognitionTopScore
+   *
+   ************************************************************************
+   * Reads top scoring result (used in multi-model configurations)
+   ************************************************************************
+   */
+
+
+  void CA_SetRecognitionTopScore(CA_Recog *hRecog,
+                                 int score);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *              score   score
+   *
+   * Returns      void
+   *
+   * See          CA_GetRecognitionTopScore
+   *
+   ************************************************************************
+   * Sets top scoring result (used in multi-model configurations)
+   ************************************************************************
+   */
+
+
+  int  CA_GetRecognitionTerminationScore(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns      top score
+   *
+   ************************************************************************
+   * Reads top scoring final result (used in multi-model configurations)
+   ************************************************************************
+   */
+
+
+  int  CA_TracebackPerformed(CA_Recog* hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns      non-ZERO if the previous recognition frame processing
+   *              resulted in the execution of a partial-traceback
+   *
+   * See          CA_SetupRecognizerForSyntax
+   *
+   ************************************************************************
+   * Used to test for the need to get some results
+   ************************************************************************
+   */
+
+
+  void CA_BlockRecognitionResults(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns      void
+   *
+   * See          CA_UnBlockRecognitionResults
+   *
+   ************************************************************************
+   * Disables result generation (used in multi-model configurations)
+   ************************************************************************
+   */
+
+
+  void CA_UnBlockRecognitionResults(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns      void
+   *
+   * See          CA_BlockRecognitionResults
+   *
+   ************************************************************************
+   * Re-enables result generation (used in multi-model configurations)
+   ************************************************************************
+   */
+
+
+  /*
+  **  File: rec_resu.c
+  */
+  int  CA_FullResultScore(CA_Recog *hRecog,
+                          int *score,
+                          int do_incsil);
+
+
+
+  int  CA_FullResultDuration(CA_Recog *hRecog,
+                             int *dur,
+                             int do_incsil);
+
+
+
+#ifdef SWIGBUILD
+  int  CA_FullResultLabel(CA_Recog *hRecog,
+                          void *label,
+                          int len);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *              label   ASCII storage for returned result label
+   *              len     Number of charcaters available for label.
+   *                      Up to 'len'-1 characters will be returned.
+   *
+   * Returns      PARTIAL_RESULTS_EMPTY if no result is available for release.
+   *              Otherwize the result FULL_RESULT if a valid result is available,
+   *              or REJECT_RESULT if the reject score is > reject threshold.
+   *
+   * See          CA_FullResultScore
+   *              CA_PurgeResults
+   *
+   ************************************************************************
+   * This method returns all the Main ROOT results that have occured
+   * (and have been unread) up to now.  Results reported by this method
+   * will only be removed from subsequent calls after a 'purge'.
+   *
+   * If no results are available a return code of PARTIAL_RESULTS_EMPTY
+   * is returned.  In this situation the label will be set to "<>".
+   *
+   * All results between 'head' and 'tail' are reported.
+   ************************************************************************
+   */
+
+
+#else
+  int  CA_FullResultLabel(CA_Recog *hRecog,
+                          char *label,
+                          int len);
+  /**
+  *
+  * Params       hRecog  valid recog handle
+  *              label   ASCII storage for returned result label
+  *              len     Number of charcaters available for label.
+  *                      Up to 'len'-1 characters will be returned.
+  *
+  * Returns      PARTIAL_RESULTS_EMPTY if no result is available for release.
+  *              Otherwize the result FULL_RESULT if a valid result is available,
+  *              or REJECT_RESULT if the reject score is > reject threshold.
+  *
+  * See          CA_FullResultScore
+  *              CA_PurgeResults
+  *
+  ************************************************************************
+  * This method returns all the Main ROOT results that have occured
+  * (and have been unread) up to now.  Results reported by this method
+  * will only be removed from subsequent calls after a 'purge'.
+  *
+  * If no results are available a return code of PARTIAL_RESULTS_EMPTY
+  * is returned.  In this situation the label will be set to "<>".
+  *
+  * All results between 'head' and 'tail' are reported.
+  ************************************************************************
+  */
+#endif
+
+  /**
+   * Strips the slot market characters from the utterance string.
+   *
+   * @param text String to filter
+   */
+  ESR_ReturnCode CA_ResultStripSlotMarkers(char *text);
+  ESR_ReturnCode CA_FullResultWordIDs(CA_Recog *hRecog, wordID *wordIDs, size_t* len);
+
+  /**
+   * Gets the recognizer model id that was succesful (id is index in swimdllist file)
+   *
+   * @param text String to filter
+   */
+  ESR_ReturnCode CA_GetRecogID(CA_Recog *hRecog, int *id);
+
+
+  int  CA_GetRejectMargin(CA_Recog *hRecog);
+  /**
+   *
+   * Params               hRecog  valid recog handle
+   *
+   * Returns              reject margin, the differnce between the utterance score
+   *                      and the reject model score.
+   *
+   * See          CA_FullResultLabel
+   *              CA_FullResultScore
+   *
+   ************************************************************************
+   * This method returns the reject margin, the difference between the
+   * utterance score and the reject model score.
+   ************************************************************************
+   */
+
+  void CA_PurgeResults(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns      Nothing, internal result list will be deleted
+   *
+   * See          CA_FullResultLabel
+   *              CA_FullResultScore
+   *
+   ************************************************************************
+   ************************************************************************
+   */
+
+
+  void CA_ClearResults(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns      void
+   *
+   * See          CA_RecognitionHasResults
+   ************************************************************************
+   * Clears results in a recognizer.  Should do CA_RecognitionHasResults
+   * first, to see if there are results to clear.
+   ************************************************************************
+   */
+
+  int CA_RecognitionHasResults(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              num_frames  number of silence frames before end of
+   *                          utterance is considered
+   *
+   * Returns      void
+   *
+   ************************************************************************
+   ************************************************************************
+   */
+
+
+  int  CA_IsEndOfUtteranceByResults(CA_Recog *hRecog);
+  /**
+   *
+   * Params       hRecog  valid recog handle
+   *
+   * Returns
+   *
+   * See
+   *
+   ************************************************************************
+   ************************************************************************
+   */
+
+
+  int  CA_FullResultWordCount(CA_Recog *hRecog,
+                              int *count);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              count       pointer to storage for results word count
+   *
+   * Returns      PARTIAL_RESULTS_EMPTY if no result is available for release.
+   *              Otherwize the result FULL_RESULT if a valid result is available,
+   *              or REJECT_RESULT if the reject score is > reject threshold.
+   *
+   * See          CA_FullResultLabel
+   *              CA_PurgeResults
+   *
+   ************************************************************************
+   * This method returns the word count of the Main ROOT results that have
+   * occured (and have been unread) up to now (silence isn't a word).
+   * Results reported by this method will only be removed from subsequent
+   * calls after a 'purge'.
+   *
+   * If no results are available a return code of PARTIAL_RESULTS_EMPTY
+   * is returned.  In this situation the the count will be set to 0.
+   *
+   * All results between 'head' and 'tail' are reported.
+   ************************************************************************
+   */
+
+
+  int  CA_CheckWordHyphenation(CA_Recog *hRecog,
+                               int *hyphen,
+                               int position);
+  /**
+   *
+   * Params       hRecog      valid recog handle
+   *              hyphen      pointer to storage for hyphenation check result
+   *              position    first word position to check (zero based)
+   *
+   * Returns      PARTIAL_RESULTS_EMPTY if no result is available.
+   *              INVALID_REQUEST if position is illegal (negative or too big).
+   *              Otherwize the result FULL_RESULT.
+   *
+   * See          CA_FullResultLabel
+   *              CA_FullResultWordCount
+   *              CA_PurgeResults
+   *
+   ************************************************************************
+   * This method checks whether two words should be hyphenated or not. This
+   * check is done on the Main ROOT results that have occured (and have been
+   * unread) up to now, excluding silence labels. The words are pointed out
+   * by giving the position of the first word to check inside the sequence
+   * (zero based, not counting silence labels).
+   *
+   * If no results are available, a return code of PARTIAL_RESULTS_EMPTY is
+   * returned. If the given word position is illegal (either negative or too
+   * big), a return code of INVALID_REQUEST is returned.
+   * In these situations the hyphenation will be set to 0.
+   ************************************************************************
+   */
+
+
+  /*
+  **  File: rec_nbes.c
+  */
+  CA_NBestList *CA_PrepareNBestList(CA_Recog *hRecog,
+                                    int n,
+                                    asr_int32_t *bestScore);
+  /**
+   *
+   * Params       hRecog      valid recog object handle
+   *              n           number of items in list
+   *              bestScore   The score associated with the root result
+   *                          is returned in this argument.
+   *
+   * Returns      Handle to new N-Best object
+   *
+   * See          CA_DeleteNBestList
+   *
+   ************************************************************************
+   * Creates an N-Best structure for iterating through as results arrive.
+   ************************************************************************
+   */
+
+
+  void CA_DeleteNBestList(CA_NBestList *hNbest);
+  /**
+   *
+   * Params       hNbest   valid nbest object handle
+   *
+   * Returns      Nothing, the object is no longer valid
+   *
+   * See          CA_PrepareNBestList
+   *
+   ************************************************************************
+   * Deletes a previously allocated NBest list object
+   ************************************************************************
+   */
+
+  LCHAR* CA_NBestListGetResultWord(CA_NBestList *hNbest, size_t iChoice);
+  int  CA_NBestListGetResultConfidenceValue(CA_NBestList *hNbest, size_t iChoice, int* value);
+  int  CA_NBestListRemoveResult(CA_NBestList *hNbest, int index);
+
+   int  CA_NBestListCount(CA_NBestList *hNbest);
+  /**
+   *
+   * Params       hNbest       valid N-Best object handle
+   *
+   * Returns      Number of entries found in the list.  The maximum number
+   *              of entries in the list is determined when the list is created.
+   *
+   * See          CA_PrepareNBestList
+   *
+   ************************************************************************
+   * Once an N-Best list has been created this method allows the caller
+   * to check the number of entries in the list.
+   ************************************************************************
+   */
+
+  /**
+   * Returns the n'th nbest-list entry.
+   *
+   * @param nbest N-best list structure
+   * @param index N-best list index
+   * @param wordIDs Array of wordIDs making up the literal
+   * @param len [in/out] Length of wordIDs argument. If the return code is ESR_BUFFER_OVERFLOW,
+   *            the required length is returned in this variable.
+   * @param cost Cost associated with literal
+   */
+  ESR_ReturnCode CA_NBestListGetResultWordIDs(CA_NBestList* nbest, size_t iChoice, wordID* wordIDs, size_t* len, asr_int32_t* cost);
+
+
+  /*
+  **  CA_Params methods
+  */
+  /*
+  **  File: par_basi.c
+  */
+  CA_AcoustInputParams *CA_AllocateAcousticParameters(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to valid acoustic input object, NULL on error
+   *
+   * See          CA_FreeAcousticParameters
+   *              CA_LoadAcousticWhole
+   *              CA_LoadAcousticSub
+   *              CA_LoadModelsInAcoustic
+   *              CA_SaveAcousticSub
+   *              CA_LoadModelsInDictionary
+   *
+   ************************************************************************
+   * Creates a new acoustic input paramater onject
+   ************************************************************************
+   */
+
+
+  void CA_FreeAcousticParameters(CA_AcoustInputParams *hAcoustInp);
+  /**
+   *
+   * Params       hAcoustInp  valid acoustic input handle
+   *
+   * Returns      Nothing, the acoustic input handle is no longer valid
+   *
+   * See          CA_AllocateAcousticParameters
+   *
+   ************************************************************************
+   * Removes a previously allocated parameter object
+   ************************************************************************
+   */
+
+
+  CA_PatInputParams *CA_AllocatePatternParameters(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to a new pattern object, NULL on error
+   *
+   * See          CA_FreePatternParameters
+   *              CA_LoadPattern
+   *
+   ************************************************************************
+   * Creates a new pattern input paramater onject
+   ************************************************************************
+   */
+
+
+  void CA_FreePatternParameters(CA_PatInputParams *hPatInp);
+  /**
+   *
+   * Params       hPatInp valid pattern input handle
+   *
+   * Returns      void    The input handle is no longer valid.
+   *
+   * See          CA_AllocatePatternParameters
+   *
+   ************************************************************************
+   * Removes a previously allocated parameter object
+   ************************************************************************
+   */
+
+
+  CA_RecInputParams *CA_AllocateRecognitionParameters(void);
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to new recog input object
+   *
+   * See          CA_FreeRecognitionParameters
+   *              CA_BeginRecognition
+   *
+   ************************************************************************
+   * Creates a new recog input paramater onject
+   ************************************************************************
+   */
+
+
+  void CA_FreeRecognitionParameters(CA_RecInputParams *hRecInp);
+  /**
+   *
+   * Params       hRecInp valid recog input handle
+   *
+   * Returns      void    the recognition input object is no longer valid
+   *
+   * See          CA_AllocateRecognitionParameters
+   *
+   ************************************************************************
+   * Removes a previously allocated parameter object
+   ************************************************************************
+   */
+
+
+
+  /*
+  **  File: par_load.c
+  */
+  void CA_LoadAcousticParameters(CA_AcoustInputParams *hAcoustInp,
+                                 const char *parfile);
+  /**
+   *
+   * Params       hAcoustInp  valid acoustic input handle
+   *              parfile     parameter (.INI) file to read
+   *
+   * Returns      void
+   *
+   * See          CA_SaveAcousticParameters
+   *              CA_LoadAcousticWhole
+   *              CA_LoadAcousticSub
+   *              CA_LoadModelsInAcoustic
+   *              CA_SaveAcousticSub
+   *              CA_LoadModelsInDictionary
+   *
+   ************************************************************************
+   * Loads known acoustic parameters from the given parameter file.
+   * The file is an ASCII text file usually of the type .PAR or .INI
+   ************************************************************************
+   */
+
+
+  void CA_SaveAcousticParameters(CA_AcoustInputParams *hAcoustInp,
+                                 const char *parfile);
+  /**
+   *
+   * Params       hAcoustInp  valid acoustic input handle
+   *              parfile     parameter (.INI) file to write
+   *
+   * Returns      void
+   *
+   * See          CA_LoadAcousticParameters
+   *
+   ************************************************************************
+   * Saves a previously loaded (modified) parameter file
+   *
+   * It is an error to call this function without first loading
+   * acoustic input parameters.
+   ************************************************************************
+   */
+
+
+  void CA_LoadPatternParameters(CA_PatInputParams *hPatInp,
+                                const char *parfile);
+  /**
+   *
+   * Params       hPatInp valid pattern handle
+   *              parfile parameter (.INI) file to read
+   *
+   * Returns      void
+   *
+   * See          CA_SavePatternParameters
+   *              CA_LoadPattern
+   *
+   ************************************************************************
+   * Loads known pattern parameters from the given parameter file.
+   * The file is an ASCII text file usually of the type .PAR or .INI
+   ************************************************************************
+   */
+
+
+  void CA_SavePatternParameters(CA_PatInputParams *hPatInp,
+                                const char *parfile);
+  /**
+   *
+   * Params       hPatInp valid pattern input handle
+   *              parfile parameter (.INI) file to write
+   *
+   * Returns      void
+   *
+   * See          CA_LoadPatternParameters
+   *              CA_LoadPattern
+   *
+   ************************************************************************
+   * Saves a previously loaded (modified) parameter file
+   *
+   * It is an error to call this function without first loading
+   * pattern input parameters.
+   ************************************************************************
+   */
+
+
+  void CA_LoadRecognitionParameters(CA_RecInputParams *hRecInp,
+                                    const char *parfile);
+  /**
+   *
+   * Params       hRecInp valid recog input handle
+   *              parfile parameter (.INI) file to read
+   *
+   * Returns      void
+   *
+   * See          CA_AllocateRecognitionParameters
+   *              CA_SaveRecognitionParameters
+   *              CA_BeginRecognition
+   *
+   ************************************************************************
+   * Loads known recognition parameters from the given parameter file.
+   * The file is an ASCII text file usually of the type .PAR or .INI
+   ************************************************************************
+   */
+
+
+  void CA_SaveRecognitionParameters(CA_RecInputParams *hRecInp,
+                                    const char *parfile);
+  /**
+   *
+   * Params       hRecInp valid recog input handle
+   *              parfile parameter (.INI) file to write
+   *
+   * Returns      void
+   *
+   * See          CA_LoadRecognitionParameters
+   *              CA_BeginRecognition
+   *
+   ************************************************************************
+   * Saves a previously loaded (modified) parameter file
+   ************************************************************************
+   */
+
+
+  /*
+  **  File: par_set.c
+  */
+
+  int CA_GetAcousticParameter(CA_AcoustInputParams *hAcoustInp,
+                              char *key,
+                              void *value);
+  /**
+   *
+   * Params       hAcoustInp  valid acoustic input handle
+   *              key         parameter key (text label)
+   *              value       pointer to store parameter value (text)
+   *              valueLen    size of value buffer
+   *
+   * Returns      False on error
+   *
+   * See          CA_GetAcousticIntParameter
+   *              CA_GetAcousticFloatParameter
+   *              CA_LoadAcousticParameters
+   *
+   ************************************************************************
+   * Gets a known acoustic parameter.
+   *
+   * It is an error to call this function without first loading
+   * acoustic input parameters.
+   ************************************************************************
+   */
+
+
+  int CA_GetAcousticStringParameter(CA_AcoustInputParams *hAcoustInp,
+                                    char *key,
+                                    char *value,
+                                    int valueLen,
+                                    int *bytes_required);
+  /**
+   *
+   * Params       hAcoustInp  valid acoustic input handle
+   *              key         parameter key (text label)
+   *              value       pointer to store parameter value (text)
+   *              valueLen    size of value buffer
+   *
+   * Returns      False on error
+   *
+   * See          CA_GetAcousticIntParameter
+   *              CA_GetAcousticFloatParameter
+   *              CA_LoadAcousticParameters
+   *
+   ************************************************************************
+   * Gets a known acoustic parameter.
+   *
+   * It is an error to call this function without first loading
+   * acoustic input parameters.
+   ************************************************************************
+   */
+
+  int CA_SetPatternParameter(CA_PatInputParams *hPatInp,
+                             char *key,
+                             char *value);
+  /**
+   *
+   * Params       hPatInp valid Pattern Input handle
+   *              key     parameter key (text label)
+   *              value   new parameter value (text)
+   *
+   * Returns      Zero on error
+   *
+   * See          CA_GetPatternStringParameter
+   *              CA_GetPatternIntParameter
+   *              CA_GetPatternFloatParameter
+   *              CA_LoadPatternParameters
+   *
+   ************************************************************************
+   * Sets/Modifies a known Pattern Input parameter.
+   *
+   * It is an error to call this function without first loading
+   * pattern input parameters.
+   ************************************************************************
+   */
+
+
+  int CA_GetPatternParameter(CA_PatInputParams *hPatInp,
+                             char *key,
+                             void *value);
+  /**
+   *
+   * Params       hPatInp valid Pattern Input handle
+   *              key     parameter key (text label)
+   *              value   pointer to store parameter value (int)
+   *
+   * Returns      False on error
+   *
+   * See          CA_SetPatternParameter
+   *              CA_LoadPatternParameters
+   *
+   ************************************************************************
+   * Reads a known Pattern Input Parameter.
+   *
+   * It is an error to call this function without first loading
+   * pattern input parameters.
+   ************************************************************************
+   */
+
+
+  int CA_GetPatternStringParameter(CA_PatInputParams *hPatInp,
+                                   char *key,
+                                   char *value,
+                                   int valueLen,
+                                   int *bytes_required);
+  /**
+   *
+   * Params       hPatInp     valid Pattern Input handle
+   *              key         parameter key (text label)
+   *              value       pointer to store parameter value (text)
+   *              valueLen    size of value buffer
+   *
+   * Returns      False on error
+   *
+   * See          CA_SetPatternParameter
+   *              CA_LoadPatternParameters
+   *
+   ************************************************************************
+   * Reads a known Pattern Input Parameter.
+   *
+   * It is an error to call this function without first loading
+   * pattern input parameters.
+   ************************************************************************
+   */
+
+
+  int CA_SetRecognitionParameter(CA_RecInputParams *hRecInp,
+                                 char *key,
+                                 char *value);
+  /**
+   *
+   * Params       hRecInp valid recog input handle
+   *              key     parameter key (text label)
+   *              value   new parameter value (text)
+   *
+   * Returns      Zero on error
+   *
+   * See          CA_GetRecognitionStringParameter
+   *              CA_GetRecognitionIntParameter
+   *              CA_GetRecognitionFloatParameter
+   *              CA_LoadRecognitionParameters
+   *
+   ************************************************************************
+   * Sets/Modifies a known recognition parameter.
+   *
+   * It is an error to call this function without first loading
+   * recognizer input parameters.
+   ************************************************************************
+   */
+
+  int CA_GetRecognitionParameter(CA_RecInputParams *hRecInp,
+                                 char *key,
+                                 void *value);
+  /**
+   *
+   * Params       hRecInp valid recog input handle
+   *              key     parameter key (text label)
+   *              value   pointer to store parameter value (int)
+   *
+   * Returns      False on error
+   *
+   * See          CA_SetRecognitionParameter
+   *              CA_BeginRecognition
+   *              CA_LoadRecognitionParameters
+   *
+   ************************************************************************
+   * Reads a known recognition parameter.
+   *
+   * It is an error to call this function without first loading
+   * recognizer input parameters.
+   ************************************************************************
+   */
+
+
+  int CA_GetRecognitionStringParameter(CA_RecInputParams *hRecInp,
+                                       char *key,
+                                       char *value,
+                                       int valueLen,
+                                       int *bytes_required);
+#if USE_CONFIDENCE_SCORER
+
+  CA_ConfidenceScorer* CA_AllocateConfidenceScorer(void);
+
+  /**
+   *
+   * Params       void
+   *
+   * Returns      Handle to new ConfidenceScorer structure, or NULL on error.
+   *
+   * See          CR_FreeConfidenceScorer
+   *
+   ************************************************************************
+   * Allocates a new SymbolMatch structure (object)
+   ************************************************************************
+   */
+
+  void CA_FreeConfidenceScorer(CA_ConfidenceScorer *hConfidenceScorer);
+
+ 
+  int CA_LoadConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer);
+  /**
+   *
+   * Params       hConfidenceScorer   Handle to previously allocated ConfidenceScorer object
+   *  nnet_file     Name of the confidence scoring file
+   *
+   * Returns      True if successful, False in the case of an error
+   *
+   * See
+   *
+   ************************************************************************
+   ************************************************************************
+   */
+
+  void CA_UnloadConfidenceScorer(CA_ConfidenceScorer *hConfidenceScorer);
+  /**
+   *
+   * Params       hConfidenceScorer   Handle to previously allocated ConfidenceScorer object
+   *
+   * Returns
+   *
+   * See
+   *
+   ************************************************************************
+   ************************************************************************
+   */
+
+  int CA_ComputeConfidenceValues(CA_ConfidenceScorer* hConfidenceScorer,
+                                CA_Recog* recog, CA_NBestList *nbestlist);
+   /**
+   *
+   * Params       hConfidenceScorer   Handle to previously allocated ConfidenceScorer object
+   *              recog               Handle to recognizer that won
+   *              nbestlist           Handle to nbest list where confidence values will be inserted
+   *
+   * Returns      0 if successful, 1 if not.
+   *
+   *
+   ************************************************************************
+   ************************************************************************
+   */
+
+#endif /* #if USE_CONFIDENCE_SCORER */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/srec/include/sizes.h b/srec/include/sizes.h
new file mode 100644
index 0000000..1183eb9
--- /dev/null
+++ b/srec/include/sizes.h
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------------*
+ *  sizes.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _SIZES_H_
+#define _SIZES_H_
+
+#include "ptypes.h"
+
+#if 1
+
+#define BYTES_PER_ATOM 1
+
+#define FOUR_BYTE_PTR(PTR,NAME,DUMMY) union { PTR NAME; asr_int32_t DUMMY; }
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  FOUR_BYTE_PTR(char*, ptr, dummy) tmp;
+}
+ptr32;
+
+#else
+#error Unknown build processor!
+
+#endif
+#endif
diff --git a/srec/include/sp_fft.h b/srec/include/sp_fft.h
new file mode 100644
index 0000000..9fe2725
--- /dev/null
+++ b/srec/include/sp_fft.h
@@ -0,0 +1,337 @@
+/*---------------------------------------------------------------------------*
+ *  sp_fft.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _SPLIT_RADIX_FFT_H_
+#define _SPLIT_RADIX_FFT_H_
+
+/*
+////////////////////////////////////////////////////////////////////////////
+//
+//  FILE:         fft.h
+//
+//  CREATED:   11-September-99
+//
+//  DESCRIPTION:  Split-Radix FFT
+//
+//
+//
+//
+//  MODIFICATIONS:
+// Revision history log
+    VSS revision history.  Do not edit by hand.
+
+    $NoKeywords: $
+
+*/
+
+/*
+>>>>> Floating and Fixed Point plit-Radix FFT -- The Fastest FFT  <<<<<<<<
+
+The split-radix FFT improves the efficiency of the FFT implementation
+by mixing a radix-2 and a radix-4 FFT algorithms. Specifically,
+the radix-2 decomposes one Fourier transform into two half-sized Fourier
+transform at each stage. It is the FFT presented in almost every textbook
+and implemented. Unfortuantely, it is also the least efficient among the
+power-of-two FFT, The radix-4 decomposes one Fourier transform into
+four quarter-sized Fourier transform. It is much more
+efficient than the radix-2 FFT, but it requires a power-of-four as the data length.
+By combining the radix-2 and the radix-4 algorithms, one not only
+removes the power-of-four limitation of the radix-4 alogorithm, but also
+obtains the most efficient power-of-two FFT algorithm.
+
+The split-radix FFT decomposes a Fourier transform
+
+  X(k) = sum(n = 0 to N-1, x[n] * W**(n*k))
+
+successively into one length N/2 radix-2 and two length N/4 radix-4 FFT
+
+ X(2k) = sum(n = 0 to N/2 - 1, [x[n] + x(n + N/2)] * W**(2*n*k))
+ X(4k + 1) = sum(n = 0 to N/4 - 1, [x[n] - x(n + N/2) - j(x[n] - x(n + 3*N/4))] * W(n)*W**(4*n*k))
+ X(4k + 3) = sum(n = 0 to N/4 - 1, [x[n] - x(n + N/2) + j(x[n] - x(n + 3*N/4))] * W(n)*W**(4*n*k))
+
+where W(n) = exp(-j2*PI*n/N) is called a twiddle factor
+
+The detailed description of the algorithm (with bugs) can be found in
+
+  H.V. Sorensen, M.T. Heideman, and C. S. Burrus, "On Computing the Split-Radix
+  FFT,"IEEE Trans. Acoust., Speech, Signal Processing, pp. 152-200, Feb. 1986.
+
+The implementation of the split-radix is similar to that of the radix-2
+algorithm, except a smart index scheme is needed at each stage to determine
+which nodes need to be decomposed further and which ones do not, since
+a radix-2 decomposition is done at every stage while a radix-4 decomposition
+is done at every other stage. This implementation uses an index scheme designed
+by H.V. Sorensen, M.T. Heideman, and C. S. Burrus.
+
+You can use this implementation for both floating and fixed point FFT and
+inverse FFT computation by changing a compliler constant FIXED_POINT
+in file fft.h. Some addtional information can be found in following sections..
+
+ Usage
+ Efficiency
+ Examples:
+
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+Usage:
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+For floating point, you have to undefine the constant FIXED_POINT and
+use typedef to define the trigonomy function and input data types.
+
+For fixed point, the constant FIXED_POINT must be defined and a 32 bit
+representation of both input data and trigonomy function data are required.
+Furthermore, you have three choices to conduct fixed-point FFT.
+If you use the algorithm in both Microsoft C and I86 hardware environment, you
+should use an assemblyline implementation. To do this, you go to the file
+himul32.cpp and define constants MICROSOFTC_HIMUL32 and I86_HIMUL3.
+If you use the algorithm only in the Microsoft C environment,
+a Microsoft specific implementation should be used. You do this by
+going to the file himul32.cpp to undefine I86_HIMUL3, and
+define MICROSOFTC_HIMUL32.
+In any other situation, a stric C implementation should be used by
+undefining both MICROSOFTC_HIMUL32 and I86_HIMUL3.
+
+To use the algorithm, you need to constrcut an fft_info object
+
+ fft_info* my_fft_info = new_fft_info(log2Size);
+
+If you have a real data input data[] of size 2**(log2Size + 1), you
+use
+
+ do_real_fft(my_fft_info, size, data);
+
+The positive half frequency Fourier transform will be returned, in addition
+to the first and last elements of the transform that are stored in the
+first and second elements of the data array. If the data[] array is the
+Fourier transform of a real data input, you can also conduct the inverse
+Fourier transform to get the real data input by
+
+ do_real_ifft(my_fft_info, size, data);
+
+Finally, you should remember to remove my_fft_info object using
+
+ delete_fft_info(my_fft_info)
+
+when you are done with FFT.
+
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+Efficiency:
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+TIME: Let M = log2Size be the power-of-two length and N = 2**M be the complex
+  FFT input size. The following formulas give the comutation requirements
+  of the split-radix FFT algorithm.
+
+  Multiplications = (4/3)*M*N - (35/9)N + 4
+  Adds   = (8/3)*M*N - (16/9)N + 2
+
+  On a 266 MHz 64 MB RAM Pentium, using a release build,
+  500 runs of paired 256 point complex (512  point real) input FFT
+  (forward + inverse) have the following time counts:
+
+Floating Point:
+  Real:  0.160 sec.
+  Complex: 0.120 sec.
+
+
+Fixed Point:
+  Assembly:  Real 0.170 sec, Complex 0.140 sec.
+  Microsoft C: Real 0.250 sec, Complex 0.240 sec.
+  Stric C:  Real 0.540 sec, Complex 0.441 sec.
+
+
+SPACE: The computation is done in place so that there is no dynamic memory allocation
+  in do_fft (do_real_fft) and do_ifft (do_real_ifft) call, except some
+  temporary local variables.
+
+  The memory space is needed in fft_info struct to store the cosine (sine) tales
+  butterfly index table, and bit reverse table. Specifically,
+
+  cosine(sine) tables: 3*N (half can be saved if we only save cosine or sine tables)
+  butterfly index table: < N
+  bitrever index table: N
+
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+Example:
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+The examples of running this program is given in a compiled out main()
+in fft.cpp. You can run this program by compiling the fft.h, fft.cpp, and
+himul32.cpp with main() compiled.
+
+*/ /* end of the comment block*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#define DATA_BITS 16   /*number of significant bits in fftdata*/
+#define HAMMING_DATA_BITS 15
+
+  typedef fftdata     trigonomydata;
+
+  typedef struct
+  {
+    /* fft log length */
+    unsigned  m_logLength;
+
+    /* fft data length */
+    unsigned  m_length;
+
+    unsigned  *m_bitreverseTbl;
+
+    /* L shaped butterfly index table */
+    unsigned  *m_butterflyIndexTbl;
+
+    /* sine and cosine tables */
+    trigonomydata *m_sin1Tbl;
+    trigonomydata *m_cos1Tbl;
+    trigonomydata *m_cos2Tbl;
+    trigonomydata *m_sin2Tbl;
+    trigonomydata *m_sin3Tbl;
+    trigonomydata *m_cos3Tbl;
+
+
+  }
+  srfft;
+
+  typedef struct
+  {
+    srfft   *m_srfft;
+
+    fftdata *real;
+    fftdata *imag;
+
+    asr_uint32_t  size;
+    asr_uint32_t  size2;
+
+  }
+  fft_info;
+
+
+  /****************************************************************
+   new_srfft: create srfft object
+
+   Parameters:
+    log2Length -- the power-of-two length of the complex FFT
+
+   Returns:
+    the created srfft object
+  ****************************************************************/
+  srfft* new_srfft(unsigned log2Length);
+
+
+  /****************************************************************
+   delete_srfft: release all the memory allocated to srfft object
+
+   Parameters:
+    pthis -- a pointer to a srfft object created by new_srfft
+
+   Returns:
+    none
+  ****************************************************************/
+  void delete_srfft(srfft* pthis);
+
+
+  /******************************************************************
+   do_real_fft conducts a forward FFT of a real data array using
+   the split-radix algorithm
+
+   Parameters:
+    pthis  -- a pointer to the srfft object
+    length -- length of data array, must be a power-of-2 length
+       and must be equal to 2**(log2Length + 1)
+    data   -- A real data array, overwritten by the positive frequency
+       half of its Fourier transform.
+       Data[0] and data[1] store the first and last
+       component of the the Fourier transform. After that, the
+       even elements store the real component, while the odd
+       elements store the imaginary component of the transform.
+   Return:
+    none
+  *********************************************************************/
+  void do_real_fft(srfft* pthis, unsigned length, fftdata* data);
+
+
+  /******************************************************************
+   do_real_ifft conducts an inverse FFT of a real data array's FFT using
+   the split-radix algorithm
+
+   Parameters:
+    pthis  -- a pointer to the srfft object
+    length -- length of data array, must be a power-of-2 length
+       and must be equal to 2**(log2Length + 1)
+    data   -- FFT of an real data array, overwritten by the real data array.
+       For input, data[0] and data[1] store the first and last
+       component of the the Fourier transform. After that,
+       the even elements store the real component of the transform,
+       while the odd elements store the imaginary component of
+       the transform.
+   Return:
+    none
+  *********************************************************************/
+  void do_real_ifft(srfft* pthis, unsigned length, fftdata* data);
+
+
+  /* >>>>>>>>>>>>>> Private Methods <<<<<<<<<<<<<<<<<<<<<<<<< */
+
+  /******************************************************************
+   allocate_butterfly_index uses an index scheme developed by
+   Sorensen, Heideman, and Burrus to determine which L shaped
+   butterfiles needs to be computed at each stage and
+   store these indexes into a table
+
+   Parameters:
+    pthis -- a pointer to the srfft object
+
+   Returns:
+    none
+  *********************************************************************/
+  void allocate_butterfly_tbl(srfft* pthis);
+
+  /******************************************************************
+   allocate_trigonomy_tbl allocates trigonomy function tables
+   for FFT computation
+
+   Parameters:
+    pthis -- a pointer to the srfft object
+
+   Returns:
+    none
+  *********************************************************************/
+  void allocate_trigonomy_tbl(srfft* pthis);
+
+  /******************************************************************
+   allocate_bitreverse_tbl() allocates bit reverse index table
+
+   Parameters:
+    pthis -- a pointer to the srfft object
+
+   Returns:
+    none
+  *********************************************************************/
+  void allocate_bitreverse_tbl(srfft* pthis);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/srec/include/specnorm.h b/srec/include/specnorm.h
new file mode 100644
index 0000000..9d6c748
--- /dev/null
+++ b/srec/include/specnorm.h
@@ -0,0 +1,95 @@
+/*---------------------------------------------------------------------------*
+ *  specnorm.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef __specnorm_h
+#define __specnorm_h
+
+#ifdef SET_RCSID
+static const char specnorm_h[] = "$Id: specnorm.h,v 1.1.10.4 2007/08/31 17:44:53 dahan Exp $";
+#endif
+
+
+
+#include "hmm_type.h"
+
+
+#define USE_MEDIAN 0
+#define USE_MEAN 1
+
+#define C0_MARGIN 19
+#define MEDIAN_SPREAD 20
+#define MIN_COUNT 1 /* was 20 */
+
+#define SV6_TO_MEAN 30 /* units of C0 */
+
+#define UNIT_SIZE 1
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int  gain_used;
+  int  offset;
+  int  forget_factor;
+  int  estimate_period;
+  long count;
+  long *hist;
+  int  low_entry;
+  int  high_entry;
+  long high_counts;
+  long low_counts;
+  int  perc_high;
+  int  estimate_percentile;
+  int  sv6_margin;
+  int  sv6;
+  int  median;
+  int  mean;
+  int  devn;
+  long mean_count;
+  long running_total;
+  long running_total_devn;
+}
+spect_dist_info;
+
+spect_dist_info *create_spectrum_distribution(int offset, int initial_median,
+    int low_entry, int high_entry,
+    int forget_factor,
+    int estimate_period, int estimate_percentile,
+    int sv6_margin);                                
+                                
+void destroy_spectrum_distribution(spect_dist_info *spec);
+void clear_distribution_counts(spect_dist_info *spec);
+void clear_mean_counts(spect_dist_info *spec);
+void forget_distribution_counts(spect_dist_info *spec, int forget_factor);
+void shift_distribution_counts(spect_dist_info *spec, int shift);
+int  add_distribution_data(spect_dist_info *spec, int spec_val);
+void evaluate_parameters(spect_dist_info *spec);
+int  estimate_percentile(spect_dist_info *spec, int percentile);
+void estimate_mean(spect_dist_info *spec, int forget_factor);
+void estimate_sv6(spect_dist_info *spec);
+int  median_normalize_data(spect_dist_info *spec, int spec_val);
+int  mean_normalize_data(spect_dist_info *spec, int spec_val);
+int  sv6_normalize_data(spect_dist_info *spec, int spec_val);
+void shift_parameters(spect_dist_info *spec, int shift);
+
+
+#endif
diff --git a/srec/include/srec.h b/srec/include/srec.h
new file mode 100644
index 0000000..7569a73
--- /dev/null
+++ b/srec/include/srec.h
@@ -0,0 +1,368 @@
+/*---------------------------------------------------------------------------*
+ *  srec.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/* this file contains defines needed by the srec search component*/
+
+#ifndef _h_srec_
+#define _h_srec_
+
+#include "swimodel.h"
+#include "hmm_desc.h"
+#include "utteranc.h"
+#include "hmmlib.h"
+#include "srec_sizes.h"
+#include "search_network.h"
+#include "srec_context.h"
+#include "srec_eosd.h"
+#include "astar.h"
+
+#define MAX_HMM 3            /*maximum HMM states in an allophone*/
+#define DO_ALLOW_MULTIPLE_MODELS 1
+
+/*in order to keep data sizes as small as possible, most of the the structure
+  below use indices into one fsmarc_token array and one word_token array.  This
+  makes the code a bit confusing (compared to just keeping pointers to these
+  structure around), uses a bit more CPU, but saves memory and gives us more
+  flexibility in the sizes of these data types*/
+
+/**
+ * @todo document
+ */
+typedef struct altword_token_t
+{
+  costdata costdelta;        /* cost relative to path being propagated */
+  wordID word;               /* alternative word, diff from path b.p. */
+  wtokenID word_backtrace;   /* alternative backtrace, diff from path b.p.*/
+  struct altword_token_t* next_token; /* todo: change this to indices */
+  asr_int16_t refcount;
+  costdata costbasis;        /* cost of best fsmarc_token host */
+}
+altword_token;
+#define AWTNULL 0
+/* fsmarc_tokens and fsmnode_tokens point to a batch of altword_tokens
+   to save memory, many fsmarc_tokens can point to the same altword_token
+   and these are propagated by reference */
+
+/**
+ * @todo document
+ */
+typedef struct fsmarc_token_t
+{
+  frameID num_hmm_states;           /* number of hmm states */
+  costdata cost[MAX_HMM];           /* cost so far*/
+  wtokenID word_backtrace[MAX_HMM]; /* index into word tokens*/
+  wordID word[MAX_HMM];             /* when the path encounters an output
+             symbol, store it here*/
+  frameID duration[MAX_HMM];        /* frames observed for this hmm state, todo: pack into char! */
+  arcID FSMarc_index;               /* index into the FSM arc array */
+
+  stokenID next_token_index;        /* for maintaining linked lists of these
+             tokens, both in search and in freelist */
+  altword_token* aword_backtrace[MAX_HMM];
+}
+fsmarc_token;
+/* 30 bytes */
+
+
+/**
+ * These are used while maximizing into FSM nodes.
+ */
+typedef struct fsmnode_token_t
+{
+  costdata cost;
+  wtokenID word_backtrace;  /* index into word tokens*/
+  wordID word;              /* when the path encounters an output*/
+  nodeID FSMnode_index;
+  ftokenID next_token_index;
+  altword_token* aword_backtrace;
+  frameID silence_duration;
+}
+fsmnode_token;
+/* 10 bytes */
+
+/**
+ * @todo document
+ */
+typedef struct word_token_t
+{
+  wordID word;                /* the word just observed */
+  frameID end_time;           /* end time of the word just observed, includes trailing silence */
+  nodeID end_node;            /* for backtrace with word graph */
+  wtokenID backtrace;         /* for backtrace */
+  costdata cost;              /* cost for path up to this point*/
+  wtokenID next_token_index;  /* for maintaining linked lists of these tokens
+       (both in the search and in the freelist) */
+  frameID _word_end_time;     /* end time of the word just observed, excl trailing silence */
+  /* since frameID is 16 bit, and 15bits is plenty
+     (ie 32767 frames * 20ms/frame = 655 sec), we use the high-bit to store
+	 whether this word_token represents a homonym, this is used in confidence
+	 score fixing! */
+#define WORD_TOKEN_GET_HOMONYM(wT)     (wT->_word_end_time & 0x8000)  // 10000000
+#define WORD_TOKEN_SET_HOMONYM(wT,hM)  (wT->_word_end_time = (wT->_word_end_time&0x7fff)|(hM?0x8000:0))
+#define WORD_TOKEN_GET_WD_ETIME(wT)    (wT->_word_end_time & 0x7fff) // 01111111
+#define WORD_TOKEN_SET_WD_ETIME(wT,eT) (wT->_word_end_time = (wT->_word_end_time&0x8000)|(eT))
+}
+word_token;
+/* 12 bytes */
+
+/**
+ * Contains what we need for later backtrace, nbest, etc.
+ */
+typedef struct
+{
+  /* there are various arrays below which frame number long - this is the number allocated */
+  frameID max_frames;
+
+  /* for each frame, head of a linked list of word tokens for that frame */
+  wtokenID *words_for_frame;
+  asr_int16_t *whether_sorted;
+
+}
+srec_word_lattice;
+
+/*This is just implemented as a list so far - use Johan's fancy implementation later*/
+
+/**
+ * @todo document
+ */
+typedef struct priority_q_t
+{
+  wtokenID word_token_list;  /* index of head token in queue - keep worst at end
+      (so we can pop one off) */
+  costdata max_cost_in_q;
+  miscdata num_in_q;
+  miscdata max_in_q;
+}
+priority_q;
+
+/*------------------------------------------------------------------*
+ *                                                                  *
+ *------------------------------------------------------------------*/
+
+/* notes ... what needs to be acoustic model specific
+
+   (p)ool it
+   (1) single  .r but reset
+   (x) specific
+
+   1 context
+   1 word_priority_q
+   x word_lattice
+   1 prune_delta
+   1 current_search_frame
+
+   1.r best_token_for_arc[]  max_fsm_arcs
+   1.r best_token_for_node[]   max_fsm_nodes
+   1 cost_offset_for_frame MAX_FRAMES
+   1 accumulated_cost_offset_for_frame MAX_FRAMES
+
+   x active_fsmarc_tokens
+   num_new_states   ... num in active_fsmarc_tokens
+   max_new_states   ... same as fsmarc_token_array_size
+
+   x active_fsm_node_tokens
+
+   ? current_model_scores num_model_slots_allocated
+
+   p fsmarc_token_array _size _freelist
+   p fsmnode_token_array  _size _freelist
+   x word_token_array _size _freelist
+   x word_token_array_flags
+
+   ... not used! best_fsmarc_token
+   srec_ended
+   astar_stack
+*/
+
+struct srec_t
+{  /*contains everything needed to run the search*/
+  asr_int16_t id;                   /*contains an id for this recognizer*/
+  srec_context *context;      /*contains the recognition context (fst, info about models, etc)*/
+  priority_q *word_priority_q; /*used to keep track of new word in frame*/
+  srec_word_lattice *word_lattice;  /*used to keep track of word lattice in utterance*/
+
+  costdata prune_delta;        /* controls the amount of score-based pruning - should this go in the context instead?*/
+  costdata current_prune_delta; /* when the above changes in mid-frame */
+  costdata current_best_cost;   /* 0 if single recog */
+
+  frameID current_search_frame;
+  stokenID *best_token_for_arc;  /* non-owning ptr, see multi_srec below */
+
+  stokenID active_fsmarc_tokens; /*head of list of state tokens for the next frame.  Used during
+        the search to keep track of new states for new frame.  This
+        is to allow us to efficently do things like prune, free state arrays, etc*/
+
+
+  nodeID num_new_states;
+  nodeID max_new_states;  /*the num allocated in the new_states array - if the search is exceeding this,
+         we need to tighten the pruning*/
+
+  ftokenID *best_token_for_node;   /* non-owning ptr, see multi_srec below */
+
+  ftokenID active_fsmnode_tokens;  /* linked list of all fsmnode token (same as ones in
+           best_state_for_node, just kept as a list)*/
+
+  costdata *current_model_scores;  /* temporary array used by the search to contain model scores -
+           size is max number of models*/
+  modelID num_model_slots_allocated;  /*num allocated in above array - search will only
+       work with models with less than this number of models*/
+
+  /*the following arrays handle all the state and word tokens.  All of them
+    are allocated to a fixed size at startup time, and the search uses elements
+    from the first array in the search.  The pruning of the search is used to
+    make sure that the allocated number is not exceeded*/
+
+
+  fsmarc_token *fsmarc_token_array;  /*used for storage of all state tokens
+           - allocated once at startup time and kept
+           around.  It's fixed size and the search
+           pruning must ensure that it is never
+           exceeded*/
+  stokenID fsmarc_token_array_size; /*total number of tokens allocated in this array*/
+  stokenID fsmarc_token_freelist;   /*index to head of state token freelist*/
+
+  fsmnode_token *fsmnode_token_array;  /*used for storage of all fsmnode tokens
+           - allocated once at startup time and kept
+           around.  It's fixed size and the search
+           pruning must ensure that it is never
+           exceeded*/
+  ftokenID fsmnode_token_array_size; /*total number of tokens allocated in this array*/
+  ftokenID fsmnode_token_freelist;   /*index to head of fsmnode token freelist*/
+
+  word_token *word_token_array;    /* used for storage of all word tokens -
+            allocated once at startup time and kept
+            around.  It's fixed size and the search
+            pruning must ensure that it is never
+            exceeded*/
+  asr_int16_t* word_token_array_flags;   /* bitarray used for flagging */
+  wtokenID word_token_array_size;  /* total number of tokens allocated in
+            this array*/
+  wtokenID word_token_freelist;    /* index to head of word token freelist*/
+
+  altword_token* altword_token_array; /* used to store alternative words before a wb */
+  wtokenID altword_token_array_size;
+  altword_token* altword_token_freelist;
+  wtokenID altword_token_freelist_len;
+
+  frameID max_frames;
+  costdata* best_model_cost_for_frame;
+  costdata* cost_offset_for_frame;        /* see multi_srec, below */
+  bigcostdata* accumulated_cost_offset;   /* see multi_srec, below */
+
+  stokenID best_fsmarc_token;      /* ?? index of best scoring state token
+           this is used to lookup wtokens on the
+           top choice path, to make sure they're not
+           pruned via reprune_word_tokens() */
+  costdata current_best_ftoken_cost[NODE_INFO_NUMS];
+  ftokenID current_best_ftoken_index[NODE_INFO_NUMS];
+
+  /*the following elements are to keep track of how big various arrays are*/
+  nodeID max_fsm_nodes;           /* see multi_srec below */
+  arcID max_fsm_arcs;             /* see multi_srec below */
+  asr_int16_t srec_ended;
+  AstarStack *astar_stack;        /* for backwards word search */
+  featdata* avg_state_durations;  /* average state durations (from AMs) */
+
+  srec_eos_detector_state eosd_state;
+};
+
+#define MAX_RECOGNIZERS 2          /* generally, 1x for each acoustic model */
+#define MAX_ACOUSTIC_MODELS 2
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  asr_int32_t num_allocated_recs;
+  asr_int32_t num_activated_recs;
+  srec* rec;                       /* size num_allocated_recs, one for
+            each gender */
+
+  frameID max_frames;
+  costdata* cost_offset_for_frame; /* size max_frames, keeps track of
+            current_best_costs bookkeeping from
+            reset_current_best_costs_to_zero() */
+  bigcostdata *accumulated_cost_offset; /* same as above but cumulative */
+
+
+  ftokenID *best_token_for_node;  /* array (size max_fsm_nodes) best path into
+           fsmnode - kept as an fsmnode_token */
+  nodeID max_fsm_nodes;
+  stokenID *best_token_for_arc;   /* array (size max_fsm_arcs) best path into
+           fsmarc - kept as a fsmarc_token */
+  arcID max_fsm_arcs;
+
+  /* non owning pointer to compact acoustic models */
+  asr_int32_t num_swimodels;
+  SWIModel    *swimodel[MAX_ACOUSTIC_MODELS];
+  EOSrc eos_status;
+}
+multi_srec;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+  priority_q* allocate_priority_q(int max_n);
+  void free_priority_q(priority_q* pq);
+  void clear_priority_q(priority_q *pq);
+  wtokenID get_word_token_list(priority_q *pq, word_token *word_token_array);
+  wtokenID add_word_token_to_priority_q(priority_q *pq, wtokenID token_index_to_add, word_token *word_token_array);
+  void remove_non_end_word_from_q(srec *rec, priority_q *pq, word_token *word_token_array, nodeID end_node);
+  costdata get_priority_q_threshold(priority_q *pq, word_token *word_token_array);
+
+  void free_word_token(srec *rec, wtokenID old_token_index);
+  int srec_begin(srec* rec, int begin_syn_node);
+  void srec_no_more_frames(srec* rec);
+  bigcostdata accumulated_cost_offset(costdata *cost_offsets, frameID frame);
+  void multi_srec_get_speech_bounds(multi_srec* rec, frameID* start_frame, frameID* end_frame);
+  int multi_srec_get_eos_status(multi_srec* rec);
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * For visualization in the debugger
+ */
+typedef struct
+{
+  asr_uint16_t data[50];
+}
+us50;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  asr_uint16_t data[250];
+}
+us250;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  asr_uint16_t data[1000];
+}
+us1000;
+
+#endif
diff --git a/srec/include/srec_arb.h b/srec/include/srec_arb.h
new file mode 100644
index 0000000..d461de4
--- /dev/null
+++ b/srec/include/srec_arb.h
@@ -0,0 +1,131 @@
+/*---------------------------------------------------------------------------*
+ *  srec_arb.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SREC_ARB_H__
+#define __SREC_ARB_H__
+
+#include"sizes.h"
+#include"hmm_desc.h"           /* 'cuz we're still using the old tree nodes */
+#include"search_network.h"     /* for EPSILON_OFFSET */
+
+#define PSET_BIT_ARRAY_SIZE 7  /* max phonemes is 7*16 (128) */
+typedef asr_uint16_t phonemeID;
+#define MAXphonemeID 255
+#define SILENCE_CODE '#'
+#define OPTSILENCE_CODE '&'
+#define SILENCE_CODE_STR "#"
+#define OPTSILENCE_CODE_STR "&"
+#define HMM_COUNTER_OFFSET EPSILON_OFFSET
+#define NUM_SILENCE_HMMS 3
+#define WBPHONEME_CODE '_'
+#define USE_WWTRIPHONE 0
+
+#define QUESTION_LEFT  1
+#define QUESTION_RIGHT 2
+#define QUESTION_WBLEFT  3
+#define QUESTION_WBRIGHT 4
+#define ANSWER_FAIL    0
+#define ANSWER_PASS    1
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  asr_uint16_t qtype;
+  asr_uint16_t membership_bits[PSET_BIT_ARRAY_SIZE];
+}
+srec_question;
+#define BIT_ADDRESS(K,A,B) { A=(K)/16; B=1<<((K)%16); }
+
+#define MAX_PHONEME_NAME_LEN 8/BYTES_PER_ATOM
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  char   name[MAX_PHONEME_NAME_LEN];
+  asr_uint16_t code;
+  tree_node* model_nodes; /* pelid at the bottom, is really a HMM model ID */
+  asr_uint16_t num_states;
+  tree_node* state_nodes[MAX_PHONE_STATES];
+}
+phoneme_data;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  char name[MAX_PHONEME_NAME_LEN]; /* 6400 bytes to free up here */
+  asr_int16_t num_states;
+  asr_int16_t* state_indices; /* only the first HMMInfo owns the pointer data */
+}
+HMMInfo;
+
+#define NUM_PHONEME_INDICES 256
+/**
+ * @todo document
+ */
+typedef struct
+{
+  char* image;
+  asr_uint16_t image_size;
+  asr_int16_t num_phonemes;
+  phoneme_data* pdata;
+  asr_int16_t num_questions;
+  srec_question* questions;
+  asr_int16_t num_states; /* total number of states, all allophones, phonemes */
+  asr_int16_t num_hmms;
+  HMMInfo* hmm_infos;
+  phonemeID phoneme_index[NUM_PHONEME_INDICES]; /* from short code to phoneme index */
+  /* later add a data member called 'hmm_ilabel_offset', such that
+     for graphs prepared with OSR/SGC, the ilabels on that graph
+     must be offset by this number to get hmms */
+  // struct PCPinfo* pcpinfo;
+  void* pcpinfo;
+}
+srec_arbdata;
+
+/*---------------------------------------------------------------------------*
+ *                                                                           *
+ *                                                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#if defined(__cplusplus) /*&& !defined(_ASCPP)*/
+extern "C"
+{
+#endif
+
+  int get_modelid_for_pic(srec_arbdata* allotree,
+                          phonemeID lphon, phonemeID cphon, phonemeID rphon);
+                          
+  int get_modelids_for_pron(srec_arbdata* allotree, const char* phonemes,
+                            int num_phonemes, modelID* acoustic_model_ids);
+                            
+  int read_arbdata_from_stream(srec_arbdata** pallotree, char* buffer, int buffer_size);
+  unsigned int version_arbdata_models(srec_arbdata* a);
+  
+#if defined(__cplusplus) /*&& !defined(_ASCPP)*/
+}
+#endif
+
+#endif
diff --git a/srec/include/srec_context.h b/srec/include/srec_context.h
new file mode 100644
index 0000000..29033b5
--- /dev/null
+++ b/srec/include/srec_context.h
@@ -0,0 +1,246 @@
+/*---------------------------------------------------------------------------*
+ *  srec_context.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/* this file contains defines needed by the srec search component*/
+
+#ifndef _h_srec_context_
+#define _h_srec_context_
+
+#include "srec_arb.h"
+#include "astar.h"
+
+#include "portable.h"
+
+#include "phashtable.h"
+
+#define CONTEXT_FILE_FORMAT_VERSION1_ID 10001
+#define IMAGE_FORMAT_V1   32432
+#define IMAGE_FORMAT_V2   32439
+#define USE_HMM_BASED_ENROLLMENT 0
+
+/*********************************************************************
+ *                                                                   *
+ * WordMap                                                           *
+ *                                                                   *
+ *********************************************************************/
+
+/* todo: for dynamic vocabs, a word should eventually be replaced
+   not so much "char* word" but "wordblock* head", Jean to merge
+   in that code later. */
+
+typedef struct
+{
+  wordID num_words;
+  wordID num_slots;        
+  wordID max_words;
+  wordID num_base_words;      /* before any additions */
+  /* ptr32* words; c55 ?? */
+  char** words;               /* size max_words */
+  
+  char* chars;                /* FOUR_BYTE_PTR(char*, chars, dummy1); */
+  asr_int32_t max_chars;
+  char* next_chars;  /* FOUR_BYTE_PTR(char*, next_chars, dummy2); */
+  char* next_base_chars;      /* before any additions */
+  PHashTable *wordIDForWord;
+}
+wordmap;
+
+/*********************************************************************
+ *                                                                   *
+ * FST                                                               *
+ *                                                                   *
+ *********************************************************************/
+
+typedef struct srec_fsm_entry_point_t
+{
+  nodeID node_index;
+  nodeID* node_for_lpcp;        /* size num_lpcps */
+}
+srec_fsm_entry_point;
+
+/**
+ * srec_fsm_exit_point_t holds information about a particular slot within
+ * the fst, so that we don't need to recalculate it each time.
+ */
+typedef struct srec_fsm_exit_point_t
+{
+  nodeID from_node_index;  /* from node, there can be multiple arcs leaving here */
+  arcID arc_index;         /* arc on which the "class" rests */
+  nodeID wbto_node_index;  /* node index after the .wb ilabel */
+}
+srec_fsm_exit_point;
+#define MAX_NUM_SLOTS 12    /* SLOTS */
+#define IMPORTED_RULES_DELIM '.' /* SLOT MARKER */
+
+typedef char FSMnode_info; 
+#define NODE_INFO_UNKNOWN 0
+#define NODE_INFO_ENDNODE 1
+#define NODE_INFO_OPTENDN 2
+#define NODE_INFO_REGULAR 3
+#define NODE_INFO_NUMS    4
+
+typedef struct srec_context
+{
+  asr_uint32_t modelid;  /* modelid at compilation time, or 0 for unknown */
+  int grmtyp;            /* GrammarType */
+  
+  FSMarc* FSMarc_list;   /* allocation base */
+  arcID num_arcs;        /* number of arcs actually used */
+  arcID FSMarc_list_len; /* number of arcs allocated     */
+  arcID num_base_arcs;   /* number of arcs before additions */
+  arcID FSMarc_freelist; /* head of the free list */
+  
+  FSMnode* FSMnode_list;
+  nodeID num_nodes;
+  nodeID FSMnode_list_len;
+  nodeID num_base_nodes;
+  nodeID FSMnode_freelist;
+  FSMnode_info* FSMnode_info_list; /* todo: change this to an ary of 2bit els*/
+  
+  costdata wrapup_cost;        /* cost of going from optend nodes to endnode */
+  costdata wtw_average;        /* cost of going from optend nodes to endnode */
+  
+  nodeID start_node;
+  nodeID end_node;
+  
+  asr_int16_t num_fsm_exit_points;  /* one per rule import */
+  srec_fsm_exit_point fsm_exit_points[MAX_NUM_SLOTS];
+  /* caching for add word, because FST_AddWordToSlot() is often sequentially 
+	 on the same slot */
+  wordID addWordCaching_lastslot_num;
+  LCHAR* addWordCaching_lastslot_name;
+  ESR_BOOL addWordCaching_lastslot_needs_post_silence;
+  wordID addWordCaching_lastslot_ifsm_exit_point;
+  
+  wordID beg_silence_word;
+  wordID end_silence_word;
+  wordID hack_silence_word;
+  
+  /* aux */
+  wordmap *ilabels;           /* input arc labels */
+  wordmap *olabels;           /* word labels */
+  srec_arbdata *allotree;          /* for addword, knows hmm to state conversion */
+  
+  /* word graph, for a-star */
+  arc_token* arc_token_list;
+  arcID arc_token_list_len;
+  arc_token* arc_token_freelist;
+  arc_token* arc_token_insert_start;
+  
+  /* search capabilities, return error if adding words beyond this! */
+  nodeID max_searchable_nodes;
+  arcID max_searchable_arcs;
+  
+  /* these are pointers to data owned by others, made part of this
+     structure for completeness of information needed by an active
+     search, for banked memory models, we may want these to be a "copy" */
+  asr_int16_t hmm_ilabel_offset;        /* offset for ilabels to hmm */
+  HMMInfo* hmm_info_for_ilabel;   /* ilabel to state conversion */
+  featdata* _unused_avg_state_durations;  /* average durations */
+  
+  /* says whether a grammar has been prepared FST_Prepare()
+     a Grammar must be prepared before it is used in a recognition */
+  asr_int16_t whether_prepared;
+}
+srec_context;
+
+
+/*********************************************************************
+ *                                                                   *
+ * Functions                                                         *
+ *                                                                   *
+ *********************************************************************/
+
+#define FST_SUCCESS_ON_OLD_WORD 2
+#define FST_CONTINUE   1
+#define FST_SUCCESS 0
+#define FST_FAILED_ON_INVALID_ARGS -2
+#define FST_FAILED_ON_MEMORY -3
+#define FST_FAILED_ON_HOMONYM -4
+#define FST_FAILED_ON_HOMOGRAPH -5
+#define FST_FAILED_INTERNAL -6
+/* #define FST_NEWWORD    2 // implies success */
+
+#define NUM_ITEMLIST_HDRWDS    4
+enum GrammarType { GrammarTypeUnknown = 0, GrammarTypeBNF = 1, GrammarTypeItemList = 2 };
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  /* FST type functions */
+  int FST_AttachArbdata(srec_context* fst, srec_arbdata* allophone_tree);
+  int FST_DumpGraph(srec_context* fst, PFile* fp);
+  int FST_DumpWordMap(PFile* fp, wordmap* wmap);
+  int FST_DumpReverseWordGraph(srec_context* context, PFile* fp);
+  
+  int FST_AddWordToGrammar(srec_context* fst,
+                           const char* slot,
+                           const char* word,
+                           const char* pron, const int cost);
+  int FST_ResetGrammar(srec_context* fst);
+  
+  int FST_PrepareContext(srec_context* fst);
+  int FST_IsVoiceEnrollment(srec_context* context);
+  int FST_LoadContext(const char* synbase, srec_context** pcontext, int num_words_to_add);
+  void FST_UnloadContext(srec_context* context);
+  
+  int FST_LoadWordMap(wordmap** pwmap, int num_words_to_add, PFile* fp);
+  int FST_UnloadWordMap(wordmap** pwmap);
+  int FST_LoadGraph(srec_context* pfst, wordmap* imap, wordmap* omap,
+                    int num_words_to_add, PFile* fp);
+  int FST_UnloadGraph(srec_context* pfst);
+  
+#if defined(DO_ALLOW_V1_G2G_FILES)
+  int FST_DumpContextAsImageV1(srec_context* context, PFile* fp);
+#endif
+  int FST_DumpContextAsImageV2(srec_context* context, PFile* fp);
+  int FST_LoadContextFromImage(srec_context** pcontext, PFile* fp);
+  
+  int FST_CheckPath(srec_context* context, const char* transcription,
+                    char* literal, size_t max_literal_len);
+#define FST_GetNodeInfo(cn,nd) (cn->FSMnode_info_list[nd])
+                    
+  /* wordmap functions */
+  int wordmap_whether_in_rule(wordmap* wmap, wordID word, wordID rule);
+  wordID wordmap_find_index(wordmap* wmap, const char* word);
+  wordID wordmap_find_index_in_rule(wordmap* wmap, const char* word, wordID rule);
+  wordID wordmap_find_rule_index(wordmap* wmap, const char* rule);
+  int wordmap_create(wordmap** pwmap, int num_chars, int num_words, int num_words_to_add);
+  int wordmap_destroy(wordmap** pwmap);
+  wordID wordmap_add_word(wordmap* wmap, const char* word);
+  void wordmap_reset(wordmap* wmap);
+  void wordmap_setbase(wordmap* wmap);
+  void wordmap_ceiling(wordmap* wmap);
+  wordID wordmap_add_word_in_rule(wordmap* wmap, const char* word, wordID rule);
+  
+  /* utils */
+  asr_int32_t atoi_with_check(const char* buf, asr_int32_t mymax);
+  arc_token_lnk get_first_arc_leaving_node(arc_token* arc_token_list, arcID num_arcs, nodeID node);
+  ESR_ReturnCode deserializeWordMapV2(wordmap **pwordmap, PFile* fp);
+  ESR_ReturnCode serializeWordMapV2(wordmap *wordmap, PFile* fp);
+  int FST_GetGrammarType(srec_context* context);
+  
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/srec/include/srec_eosd.h b/srec/include/srec_eosd.h
new file mode 100644
index 0000000..f57d776
--- /dev/null
+++ b/srec/include/srec_eosd.h
@@ -0,0 +1,64 @@
+/*---------------------------------------------------------------------------*
+ *  srec_eosd.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SREC_EOSD_H__
+#define __SREC_EOSD_H__
+
+#include"sizes.h"
+/* all values <=0 will continue recognition. >0 stops it */
+typedef enum { VALID_SPEECH_NOT_YET_DETECTED = -1, VALID_SPEECH_CONTINUING = 0, SPEECH_ENDED, SPEECH_ENDED_WITH_ERROR, SPEECH_TOO_LONG, SPEECH_MAYBE_ENDED, SPEECH_ENDED_BY_LEVEL_TIMEOUT } EOSrc;
+
+typedef struct srec_eos_detector_parms_t
+{
+  costdata eos_costdelta;
+  costdata opt_eos_costdelta;
+
+  frameID endnode_timeout;
+  frameID optendnode_timeout;
+  frameID internalnode_timeout;
+  frameID inspeech_timeout;
+}
+srec_eos_detector_parms;
+
+typedef struct srec_eos_detector_state_t
+{
+  frameID endnode_frmcnt;
+  frameID optendnode_frmcnt;
+  frameID internalnode_frmcnt;
+  frameID inspeech_frmcnt;
+
+  nodeID  internalnode_node_index;
+}
+srec_eos_detector_state;
+
+void srec_eosd_allocate(srec_eos_detector_parms** eosd_parms,
+                        int eos_costdelta,
+                        int opt_eos_costdelta,
+                        int endnode_timeout,
+                        int optendnode_timeout,
+                        int internalnode_timeout,
+                        int inspeech_timeout);
+
+void srec_eosd_destroy(srec_eos_detector_parms* eosd_parms);
+
+void srec_eosd_state_reset(srec_eos_detector_state* eosd_state);
+EOSrc srec_check_end_of_speech(srec_eos_detector_parms* eosd_parms, srec* rec);
+EOSrc srec_check_end_of_speech_end(srec* rec);
+
+#endif
diff --git a/srec/include/srec_results.h b/srec/include/srec_results.h
new file mode 100644
index 0000000..54169a1
--- /dev/null
+++ b/srec/include/srec_results.h
@@ -0,0 +1,55 @@
+/*---------------------------------------------------------------------------*
+ *  srec_results.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SREC_RESULTS_H__
+#define __SREC_RESULTS_H__
+
+#include"srec.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  /* results */
+  int srec_has_results(multi_srec* rec);
+  int srec_clear_results(multi_srec* rec);
+  int srec_get_bestcost_recog_id(multi_srec* rec, int* id);
+
+  /* nbest */
+  void* srec_nbest_prepare_list(multi_srec* rec, int n, asr_int32_t* bestcost);
+  void srec_nbest_destroy_list(void* nbest);
+  int srec_nbest_get_num_choices(void* nbest);
+  int srec_nbest_put_confidence_value(void* rec_void, int choice, int confidence_value);
+  int srec_nbest_get_confidence_value(void* rec_void, int choice);
+  int srec_nbest_fix_homonym_confidence_values(void* rec_void);
+  int srec_nbest_get_result(void* nbest, int n, char* label, int label_len, asr_int32_t* cost, int whether_strip_slot_markers);
+  LCHAR* srec_nbest_get_word(void* nbest, size_t choice);
+  ESR_ReturnCode srec_nbest_get_resultWordIDs(void* nbest, size_t inde, wordID* wordIDs, size_t* len, asr_int32_t* cost);
+  void srec_result_strip_slot_markers(char* result);
+  int srec_nbest_get_choice_info(void* rec_void, int ibest, asr_int32_t* infoval, char* infoname);
+  int srec_nbest_remove_result(void* rec_void, int n);
+  int srec_nbest_sort(void* rec_void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/srec/include/srec_sizes.h b/srec/include/srec_sizes.h
new file mode 100644
index 0000000..33fc7ad
--- /dev/null
+++ b/srec/include/srec_sizes.h
@@ -0,0 +1,56 @@
+/*---------------------------------------------------------------------------*
+ *  srec_sizes.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+
+#ifndef _h_srec_sizes_
+#define _h_srec_sizes_
+
+typedef asr_uint16_t costdata;  /*done as cost, so always >= 0*/
+typedef asr_int32_t bigcostdata;          /*done as cost, so always >= 0*/
+typedef asr_uint16_t miscdata;  /*for random small things*/
+typedef asr_uint16_t labelID; /*16 bits is a bit overkill for this, but 8's not enough*/
+typedef asr_uint16_t wordID;  /*for word index*/
+typedef asr_uint16_t nodeID;  /*for FSM node index*/
+typedef asr_uint16_t arcID;  /*for FSM arc index*/
+typedef asr_uint16_t frameID;  /*for time frame*/
+typedef asr_uint16_t stokenID;  /*for state token storage*/
+typedef asr_uint16_t ftokenID;  /*for FSMnode token storage*/
+typedef asr_uint16_t wtokenID;  /*for word token storage*/
+typedef asr_uint16_t HMMID;  /*for HMMs*/
+typedef asr_uint16_t modelID;  /*for models (HMM state distributions)*/
+
+/*limits on each of the above sizes*/
+
+#define MAXcostdata ((costdata)65535)
+#define MAXbcostdata ((bigcostdata)2147483647)
+#define FREEcostdata 0
+#define MAXlabelID 65535
+#define MAXwordID 65535
+#define MAXnodeID 65535
+#define MAXarcID 65535
+#define MAXframeID ((frameID)65535)
+#define MAXstokenID 65535
+#define MAXftokenID 65535
+#define MAXwtokenID 65535
+#define MAXmodelID 65535
+#define MAXHMMID 65535
+
+#endif
diff --git a/srec/include/swicms.h b/srec/include/swicms.h
new file mode 100644
index 0000000..12504b3
--- /dev/null
+++ b/srec/include/swicms.h
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*
+ *  swicms.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SWICMS_H__
+#define __SWICMS_H__
+
+#include"all_defs.h"
+#include"sizes.h"
+#include"fronttyp.h"
+#include"pre_desc.h"
+
+#define DEBUG_SWICMS        0
+#define MAX_CACHED_FRAMES 800
+#define SWICMS_CACHE_RESOLUTION_DEFAULT   8
+#define SWICMS_CACHE_SIZE_DEFAULT         100 /* equals #frames/resolution */
+
+/**
+ * This is used for casting in debugger, just type (imelvec*)tmn.
+ */
+typedef struct
+{
+  imeldata vec[MAX_CHAN_DIM];
+}
+imelvec;
+
+/**
+ * Does channel normalization without using fine recognition segmenation.  It remembers the 
+ * frames of speech and uses that as a channel mean for the next utterance.  A forget_factor
+ * is used to weigh the new speech mean estimate with an older one.
+ */
+typedef struct
+{
+  imeldata tmn [MAX_CHAN_DIM];                 /* target mean */
+  imeldata cmn [MAX_CHAN_DIM];                 /* channel mean */
+  
+  imeldata lda_tmn [MAX_CHAN_DIM];                 /* target mean */
+  imeldata lda_cmn [MAX_CHAN_DIM];                 /* channel mean */
+  
+  imeldata adjust[MAX_CHAN_DIM]; /* target less channel */
+  
+  int is_valid;
+  int forget_factor;           /* in frames, mass of cmn average */
+  int sbindex;                 /* speech to background index
+        100 -> use only speech to calculate CMN
+        000 -> use only background to calculate CMN
+        050 -> use half/half ..
+        all numbers in between are acceptable */
+
+  int num_frames_in_cmn; /* num frames used to estimate cmn (or lda_cmn) */
+
+  /* for in-utterance channel normalization */
+  struct {
+    int forget_factor2;     /* cmn is given this weight to start off */
+    int disable_after;      /* we disable in-utt cms after this many fr*/
+    int enable_after;       /* we enable in-utt cms after this many fr*/
+    int num_bou_frames_to_skip;   /* don't start accum 'til this many frames */
+    int num_frames_since_bou;     /* counter for above, bou=begin-of-utt     */
+    int num_frames_in_accum;      /* number of frames in accum */
+    imeldata accum[MAX_CHAN_DIM]; /* accumulates frames of the current utt */
+  } inutt;
+
+  int cached_num_frames;       /* we cache frames, until recognition is done
+        and can calculate speech mean from these */
+  int cache_resolution;        /* we'll avg this many frames per section */
+  imeldata cached_sections[SWICMS_CACHE_SIZE_DEFAULT][MAX_CHAN_DIM];  
+  /*const*/ preprocessed* _prep;
+}
+swicms_norm_info;
+
+int swicms_init(swicms_norm_info* swicms);
+int swicms_cache_frame(swicms_norm_info* swicms, imeldata* frame, int dimen);
+int apply_channel_normalization_in_swicms(swicms_norm_info *swicms,
+    imeldata* oframe, imeldata* iframe,
+    int dimen);
+int swicms_lda_process(swicms_norm_info* swicms, preprocessed* prep);
+
+int swicms_update(swicms_norm_info* swicms, int speech_start_frame, int speech_end_frame);
+
+ESR_ReturnCode swicms_set_cmn(swicms_norm_info *swicms, const LCHAR *new_cmn_params );
+ESR_ReturnCode swicms_get_cmn(swicms_norm_info *swicms, const LCHAR **cmn_params );
+
+#if DEBUG_SWICMS
+int swicms_compare(swicms_norm_info* swicms, imeldata* imelda_adjust);
+int swicms_dump_stats(swicms_norm_info* swicms);
+#else
+#define swicms_compare(swicms,ia)
+#define swicms_dump_stats(swicms)
+#endif
+
+#endif
+
diff --git a/srec/include/swimodel.h b/srec/include/swimodel.h
new file mode 100644
index 0000000..e06ddc2
--- /dev/null
+++ b/srec/include/swimodel.h
@@ -0,0 +1,112 @@
+/*---------------------------------------------------------------------------*
+ *  swimodel.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SWIMODEL_H__
+#define __SWIMODEL_H__
+
+#include "hmm_type.h"
+#include "pre_desc.h"
+#include "srec_sizes.h"
+#include "PortExport.h"
+
+#define MAXduration 255
+#define DURATION_MODEL_OFF 0  /* off for one particular pel */
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  short num_pdfs;           /* number of pdfs for this state */
+  /* featdata avg_durn;           average state duration, belongs here but stored
+     elsewhere to avoid paging back to memory of acoustic models, c54!! */
+  featdata *means;            /* pointer to block of means for the set
+       of pdfs (points into the allmeans array)*/
+  wtdata *weights;            /*pointer to weights*/
+}
+SWIhmmState;
+
+/**
+ * Model loading storage structures.
+ */
+typedef struct
+{
+  void* mem_image;              /* if set, contains a pointer to one chunk of memory which contains
+         the entire models.  This allows us to read and write the models
+         in one shot.  The function setup_model_pointers_from_image sets up
+         the pointers in these structures*/
+  int image_size;
+  modelID num_hmmstates;        /* number of hmm states ~ 800 */
+  short num_dims;               /* feature vector dimensions ~ 36 or 28 */
+  modelID num_pdfs;             /* total number of pdfs ~ 4800 */
+  SWIhmmState *hmmstates;       /* size num_hmmstates ~ 800*/
+  featdata    *allmeans;        /* size num_dims*num_pdfs ~ 36*4800 */
+  wtdata    *allweights;        /* size num_pdfs ~ 4800 */
+  featdata *avg_state_durations; /* average duration of this acoustic model state */
+}
+SWIModel;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* SpeechWorks compact acoustic models */
+SWIModel *load_swimodel(char *filename);
+void free_swimodel(SWIModel* swimodel);
+scodata mixture_diagonal_gaussian_swimodel(preprocessed *prep, SWIhmmState *spd, short num_dims);
+  
+  extern char loop_cost_table [128][6];
+  extern char trans_cost_table [128][6];
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* the looping cost for the new duration model. In this new duration model, 
+   the looping probability is multiplied by a sigmoid function having the
+   following form: sigm(-scale(duration_so_far-offset))  so that the looping 
+   cost increases as the duration_so_far increases and encouraging to 
+   stay within a given state for a duration approx. equal to the average state 
+   duration. The looping cost values are implemented as a lookup table.*/ 
+
+static PINLINE costdata duration_penalty_loop(frameID average_duration, frameID duration_so_far)
+{
+ if (average_duration > 127)  average_duration =  127;
+ if(duration_so_far> 6) duration_so_far = 6;
+ return (costdata)loop_cost_table[average_duration][duration_so_far-1];
+}
+
+/* the transition cost for the new duration model. In this new duration model,
+   the transition probability is multiplied by a sigmoid function having the 
+   following form: sigm(scale(duration_so_far-offset)) so that the  transition 
+   cost decreases as the duration_so_far increases thus encouraging to leave 
+   a given state when the duration exceeds the average state duration. The transition 
+   cost values are implemented as a lookup table*/
+
+static PINLINE costdata duration_penalty_depart(frameID average_duration, frameID duration_so_far)
+{
+  if (average_duration > 127)     average_duration = 127;
+  if(duration_so_far> 6)     duration_so_far = 6;
+  return (costdata) trans_cost_table[average_duration][duration_so_far-1];
+}
+
+#endif /* __SWIMODEL_H__ */
+
diff --git a/srec/include/utteranc.h b/srec/include/utteranc.h
new file mode 100644
index 0000000..a6dd539
--- /dev/null
+++ b/srec/include/utteranc.h
@@ -0,0 +1,272 @@
+/*---------------------------------------------------------------------------*
+ *  utteranc.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef _h_utteranc_
+#define _h_utteranc_
+
+#ifdef SET_RCSID
+static const char utteranc_h[] = "$Id: utteranc.h,v 1.3.6.7 2007/08/31 17:44:53 dahan Exp $";
+#endif
+
+
+
+#include "all_defs.h"
+#include "hmm_type.h"
+#include "fpi_tgt.h"
+#include "voicing.h"
+#include "specnorm.h"
+#include "channorm.h"
+#include "swicms.h"
+#ifndef _RTT
+#include "duk_io.h"
+#endif
+
+#define DEFAULT_BUFFER_SIZE 100 /* in frames */
+#define KEEP_FRAMES   40 /* in frames, past frames kept */
+
+/*  Functions supported are
+**  new, delete (by source)
+**  open file/device, close file/device
+**  attach and detach sink
+**  read/store samples - including the header
+*/
+
+/**
+ * @todo document
+ */
+typedef struct
+{                /* label structure */
+  char *label;
+  long begin;
+  long end;
+  char *extra;
+  unsigned char flag;
+}
+annotate;
+
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int   utt_type;
+  int   dim;
+  fepFramePkt  *frame;
+  int   num_chan;
+  int   do_channorm;
+  spect_dist_info **spchchan; /*  Mirrored from the Wave object */
+  norm_info   *channorm; /*  Mirrored from the Wave object */
+  swicms_norm_info     *swicms;    /* copy of wave obj pointer */
+  spect_dist_info *backchan[MAX_CHAN_DIM];
+  featdata  *last_push;
+  int   voice_duration;
+  int   quiet_duration;
+  int   unsure_duration;
+  int   start_windback;
+}
+utt_generic_info;
+
+#ifndef _RTT
+/**
+ * @todo document
+ */
+typedef struct
+{
+  char  typ;  /* s (16 bit), c (8 bit), u (newton .utb) */
+  int   endian;  /* 0 is little 1 is big */
+  int   do_skip; /* skip every other frame */
+  unsigned long len;  /* length of file/utterance */
+  PFile* file;  /* pointer to file */
+  char  name[MAX_LABEL]; /* file name */
+  /*    int   op;  read or write */
+  int   num_utts; /* no. of utterances in utb file */
+  annotate  *utb_table; /* utb file header information */
+}
+utt_file_info;
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int   utt_type;
+  int   dim;
+  fepFramePkt  *frame;
+  int   num_chan;
+  int   do_channorm;
+  spect_dist_info **spchchan; /*  Mirrored from the Wave object */
+  norm_info   *channorm; /*  Mirrored from the Wave object */
+  swicms_norm_info    *swicms;          /* copy of wave obj pointer */
+  spect_dist_info *backchan[MAX_CHAN_DIM];
+  featdata  *last_push;
+  int   voice_duration;
+  int   quiet_duration;
+  int   unsure_duration;
+  int   start_windback;
+  /*    voicing_info voice; */
+  utt_file_info file;
+}
+file_utterance_info;
+#endif
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  int   utt_type;
+  int   dim;
+  fepFramePkt  *frame;
+  int   num_chan;
+  int   do_channorm;
+  spect_dist_info **spchchan; /*  Mirrored from the Wave object */
+  norm_info   *channorm; /*  Mirrored from the Wave object */
+  swicms_norm_info    *swicms;        /* copy of wave obj pointer */
+  spect_dist_info *backchan[MAX_CHAN_DIM];
+  featdata  *last_push;
+  int   voice_duration;
+  int   quiet_duration;
+  int   unsure_duration;
+  int   start_windback;
+}
+live_utterance_info;
+
+/**
+ * @todo document
+ */
+typedef union
+{
+  int   utt_type; /* live or from file */
+  utt_generic_info    gen_utt; /* generic one */
+#ifndef _RTT
+  file_utterance_info file_utt;
+#endif
+  live_utterance_info live_utt;
+} utterance_info;
+
+
+/*
+**  Size of the utb file headers and details
+*/
+
+#ifndef _RTT
+#define UTT_VERSION 2
+#define UTT_HEADER_SIZE 16        /*Size on disk*/
+#define UTB_HEADER_SIZE 32        /*Size on disk*/
+#define UTB_HEADER_USED 16        /*Size on disk*/   /* SAL */
+
+/**
+ * UTB file header.
+ */
+typedef struct _UttHeader
+{
+	/**
+	 * The size of the header in bytes.
+	 */
+  unsigned short headerSize;
+	/**
+	 * The version of the file format.
+	 */
+  unsigned short version;
+	/**
+	 * The size of the payload in bytes.
+	 */
+  unsigned long  nBytes;
+	/**
+	 * The number of parameters per frame.
+	 */
+  unsigned short nParametersPerFrame;
+	/**
+	 * 0=unknown, 1=none, 2=amp-based, 3=harmonicity-based, 4=mrec style
+	 */
+  unsigned short channelNormalization;    
+  /**
+	 * 0=unknown, 1=no, 2=yes
+	 */
+  unsigned short speakerNormalization;
+  /**
+	 * 0=unknown, 1=no, 2=yes
+	 */
+  unsigned short imeldaization;
+	/**
+	 * Before imelda truncation.
+	 */
+  unsigned short nOriginalParameters;
+	/**
+	 * The number of samples per frame.
+	 */
+  unsigned short samplesPerFrame;
+	/**
+	 * The audio sample rate.
+	 */
+  unsigned long  sampleRate;
+	/**
+	 * not used in version 5.
+	 */
+  unsigned long  checksum;
+}
+UttHeader;
+
+int    update_utb_header(file_utterance_info *utt, int frames, int samplerate,
+                         int framerate);
+void    init_utt_v5_header(UttHeader *uhead, int dim, int samplerate, int framerate);
+int init_data_file(char *filename, file_utterance_info *utt, int dimen,
+                   char typ, int endian, int do_skip);
+int new_data_file(char *filename, file_utterance_info *utt, int dimen,
+                  char typ, int endian);
+int set_data_frame(file_utterance_info *utt, long begin);
+int buffer_data_frames(file_utterance_info *utt, long f_begin, long f_end);
+void more_data_frames(file_utterance_info *utt);
+int save_data_frames(file_utterance_info *utt);
+void close_data_stream(file_utterance_info *utt);
+int init_utb_file(file_utterance_info *utt, annotate **table);
+int position_utb_file(file_utterance_info *utt, long position, annotate *table);
+int load_utb_data(file_utterance_info *utt, int num_frames, int do_skip);
+int load_short_data(file_utterance_info *utt, int num_frames, int do_skip);
+int save_utb_data(file_utterance_info *utt, int num_frames);
+int save_short_data(file_utterance_info *utt, int num_frames);
+int read_utt_head(UttHeader *head, PFile* datafile);
+int write_utt_head(UttHeader *head, PFile* datafile);
+int check_for_utb(char* filename);
+
+/*  TCP reading routines
+*/
+int     read_tcp(char *filename, annotate **tag_base);
+int     read_lst(char *filename, annotate *tag_base, int ntags);
+int     read_utb_table(char *filename, annotate **tag_base);
+void    save_tcp(char *tcpnam, annotate *tag, int ntags);
+void compose_tcp_name_of_utt(char* uttname , char* tcpname);
+
+#endif
+
+void init_utterance(utterance_info *utt, int utt_type, int dimen,
+                    int buffer_size, int keep_frames, int num_chan, int do_voicing);
+void set_voicing_durations(utterance_info *utt, int voice_duration,
+                           int quiet_duration, int unsure_duration,
+                           int start_windback);
+void free_utterance(utterance_info *utt);
+int utterance_started(utterance_info *utt);
+int utterance_ended(utterance_info *utt);
+int load_utterance_frame(utterance_info *utt, unsigned char* pUttFrame, int voicing);
+int copy_utterance_frame(utterance_info *oututt, utterance_info *inutt);
+
+#endif /* _h_utteranc_ */
diff --git a/srec/include/vcc_helper.h b/srec/include/vcc_helper.h
new file mode 100644
index 0000000..bb3816a
--- /dev/null
+++ b/srec/include/vcc_helper.h
@@ -0,0 +1,83 @@
+/*---------------------------------------------------------------------------*
+ *  vcc_helper.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _VCC_HELPER_H
+#define _VCC_HELPER_H
+
+#define OS_MSDOS 1
+#define OS_WIN32 2
+#define OS_MAC 4
+#define OS_UNIX 8
+#define OS_EMBEDDED 16
+#define OS_VXWORKS 32
+#define OS_PSOS 64
+#define OS_WINCE 128
+#define OS_PALM 256
+#define OS_JAVA 512
+#define OS_QNX 1024
+
+#define CPU_I86 1
+#define CPU_68K 2
+#define CPU_MIPS 4
+#define CPU_ALPHA 8
+#define CPU_PPC 16
+#define CPU_SPARC 32
+#define CPU_ARM 64
+#define CPU_STRONGARM 128
+#define CPU_TMS320X 256
+#define CPU_SH3 512
+#define CPU_SH4 = 1024
+
+#define C_BORLAND 1
+#define C_MICROSOFT 2
+#define C_INTEL 4
+#define C_HIGH 8
+#define C_ZORTECH 16
+#define C_WATCOM 32
+#define C_GNU 64
+#define C_SUNPRO 128
+#define C_DECCXX 256
+#define C_METROWERKS 512
+#define C_GHS 1024
+#define C_TICXC 2048
+#define C_ARM 4096
+#define C_DIABDATA 8192
+
+#define BUILD_SHIP 1
+#define BUILD_INHOUSE 2
+#define BUILD_DEBUGO 4
+#define BUILD_DEBUG 8
+#define BUILD_PROFILE 16
+#define BUILD_TRACE 32
+
+//Developers should define:
+//
+//OS
+//HOST_OS
+//TARGET_OS
+//CPU
+//HOST_CPU
+//TARGET_CPU
+//COMPILER
+//BUILD
+//
+// Other keywords that were used in the makefile and were not migrated:
+//-DDISABLE_EXCEPTION_HANDLING /DWIN32 /D_WIN32 /DSOUNDBLASTER /D_DEBUG /D_DLL /D_ASCPP
+
+#endif //_VCC_HELPER_H
diff --git a/srec/include/voicing.h b/srec/include/voicing.h
new file mode 100644
index 0000000..7194d5a
--- /dev/null
+++ b/srec/include/voicing.h
@@ -0,0 +1,82 @@
+/*---------------------------------------------------------------------------*
+ *  voicing.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#ifndef __voicing_h
+#define __voicing_h
+
+#ifdef SET_RCSID
+static const char voicing_h[] = "$Id: voicing.h,v 1.1.10.3 2007/08/31 17:44:53 dahan Exp $";
+#endif
+
+
+#include "hmm_type.h"
+
+#define B0_HANG1 100
+#define B0_HANG2 300
+#define B0_RATE1 15     /* 256 * 0.06 */
+#define B0_RATE2 38     /* 256 * 0.15 */
+#define B1_RATE  26     /* 256 * 0.1 */
+#define DYNAMIC_RANGE (70 << 8)   /* typical dynamic range */
+
+/*  The following are internal constants used by the voicing detector program
+*/
+#define VOICE_MASK           0xfffffff0
+#define VOICE_BIT            0x01L
+#define QUIET_BIT            0x02L
+#define FAST_VOICE_BIT       0x04L
+#define BELOW_THRESHOLD_BIT  0x08L
+#define REC_VOICE_BIT      0x10L
+#define REC_QUIET_BIT      0x20L
+#define REC_UNSURE_BIT       0x40L
+
+#define VOICING_DATA(X)      ((X) & (VOICE_BIT | QUIET_BIT))
+#define FAST_MATCH_DATA(X)   ((X) & (FAST_VOICE_BIT | QUIET_BIT))
+
+#define FAST_BIT_SET(X)      ((X) & FAST_VOICE_BIT)
+#define QUIET_BIT_SET(X)     ((X) & QUIET_BIT)
+#define RECOGNIZER_QUIET(X)  ((X) & REC_QUIET_BIT)
+#define SET_VOICING_CODES(X,C) (((X) & ~(REC_VOICE_BIT | REC_QUIET_BIT | REC_UNSURE_BIT)) | (C))
+
+typedef featdata voicedata;
+
+typedef struct
+{
+  int   b0;   /* background estimate, level 0 */
+  int   b1;   /* background estimate, level 1 */
+  int   s0;
+  int   margin;
+  int   fast_margin;
+  int   quiet_margin;
+  int   voice_duration; /* threshold for consecutive speech frames */
+  int   quiet_duration; /* threshold for consecutive silence frames */
+  int   count;
+  long  sil_count;  /* no. of consecutive silence frames */
+  long  fast_count;  /* no. of consecutive speech frames */
+  long  speech_count;  /* no. of consecutive speech frames for barge-in */
+  int   voice_status;  /* voicing decision */
+}
+voicing_info;
+
+
+void init_voicing_analysis(voicing_info *voice);
+long voicing_analysis(voicing_info *voice, voicedata enval, int* log);
+
+#endif
diff --git a/srec/include/word_lattice.h b/srec/include/word_lattice.h
new file mode 100644
index 0000000..0e3a28f
--- /dev/null
+++ b/srec/include/word_lattice.h
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------------*
+ *  word_lattice.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef WORD_LATTICE_H
+#define WORD_LATTICE_H
+
+#include"srec_sizes.h"
+#include"srec.h"
+#include"search_network.h"
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+  void print_word_token(srec* rec, wtokenID wtoken_index, char* msg);
+  void print_word_token_backtrace(srec* rec, wtokenID wtoken_index, char* tail);
+  void print_word_token_list(srec* rec, wtokenID wtoken_index, char* msg);
+  int sprint_bword_token_backtrace(char *buf, int len, srec* rec, wtokenID wtoken_index);
+  
+#define SCOREMODE_EXCLUDE_SILENCE 0
+#define SCOREMODE_INCLUDE_SILENCE 1
+#define ERROR_TRANSCRIPTION_TOO_LONG -1
+#define ERROR_RESULT_IS_LOOPY        -2
+  
+  int srec_print_results(multi_srec *rec, int max_choices);
+  int srec_get_top_choice_score(multi_srec* rec, bigcostdata *cost, int do_incsil);
+  int srec_get_top_choice_transcription(multi_srec* rec, char *transcription, int len, int whether_strip_slot_markers) ;
+  ESR_ReturnCode srec_get_top_choice_wordIDs(multi_srec* recm, wordID* wordIDs, size_t* len);
+  int sprint_word_token_backtrace(char *transcription, int len, srec* rec, wtokenID wtoken_index);
+  void sort_word_lattice_at_frame(srec* rec, frameID frame);
+  int reprune_word_tokens(srec* rec, costdata current_best_cost);
+  srec_word_lattice *allocate_word_lattice(frameID max_frames);
+  void destroy_word_lattice(srec_word_lattice* wl);
+  void initialize_word_lattice(srec_word_lattice* wl);
+  void lattice_add_word_tokens(srec_word_lattice *wl, frameID frame,
+                               wtokenID word_token_list_head);
+  costdata lattice_best_cost_to_frame(srec_word_lattice *wl, word_token* word_token_array, frameID ifr);
+  
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
diff --git a/srec/srec.doxygen b/srec/srec.doxygen
new file mode 100644
index 0000000..d44cc18
--- /dev/null
+++ b/srec/srec.doxygen
@@ -0,0 +1,208 @@
+# Doxyfile 1.3-rc2
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = SREC
+PROJECT_NUMBER         = "(C) Copyright 2003 Speechworks International"
+OUTPUT_DIRECTORY       = C:/ESR_DOC/SREC
+OUTPUT_LANGUAGE        = English
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+SHORT_NAMES            = NO
+HIDE_SCOPE_NAMES       = NO
+VERBATIM_HEADERS       = YES
+SHOW_INCLUDE_FILES     = NO
+JAVADOC_AUTOBRIEF      = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+DISTRIBUTE_GROUP_DOC   = YES
+TAB_SIZE               = 6
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= NO
+ALIASES                = 
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+SHOW_USED_FILES        = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = c:/users/gili/esr/Shared \
+                         c:/users/gili/esr/portable/include/ESR_ReturnCode.h \
+                         c:/users/gili/esr/srec
+FILE_PATTERNS          = *.h
+RECURSIVE              = YES
+EXCLUDE                = c:/users/gili/esr/srec/ca \
+                         c:/users/gili/esr/srec/cfront \
+                         c:/users/gili/esr/srec/clib \
+                         c:/users/gili/esr/srec/crec \
+                         c:/users/gili/esr/srec/include \
+                         c:/users/gili/esr/srec/cr
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = *Impl.h
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = YES
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = .\
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = YES
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = YES
+BINARY_TOC             = NO
+TOC_EXPAND             = YES
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 1
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_SCHEMA             = 
+XML_DTD                = 
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+GRAPHICAL_HIERARCHY    = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = "C:/Program Files/ATT/Graphviz/bin/"
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
+CGI_NAME               = search.cgi
+CGI_URL                = 
+DOC_URL                = 
+DOC_ABSPATH            = 
+BIN_ABSPATH            = /usr/local/bin/
+EXT_DOC_PATHS          = 
diff --git a/srec/test/Android.mk b/srec/test/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/srec/test/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/srec/test/SRecTest/Android.mk b/srec/test/SRecTest/Android.mk
new file mode 100644
index 0000000..69ac5a6
--- /dev/null
+++ b/srec/test/SRecTest/Android.mk
@@ -0,0 +1,43 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	src/SRecTest.c \
+	src/srec_test_config.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/src \
+	$(LOCAL_PATH)/include \
+	$(LOCAL_PATH)/../include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/cr \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libUAPI_jni \
+	
+LOCAL_MODULE:= SRecTest
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_EXECUTABLE)
diff --git a/srec/test/SRecTest/src/SRecTest.c b/srec/test/SRecTest/src/SRecTest.c
new file mode 100644
index 0000000..3dc04f8
--- /dev/null
+++ b/srec/test/SRecTest/src/SRecTest.c
@@ -0,0 +1,3821 @@
+
+/*---------------------------------------------------------------------------*
+ *  SRecTest.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifdef _WIN32
+#else
+    #include <sys/select.h>
+#endif
+
+#ifdef _WIN32
+  #include "signal.h"
+  #include "direct.h"
+#endif
+
+#include "passert.h"
+#include "ESR_CommandLine.h"
+#include "ESR_Session.h"
+#include "LCHAR.h"
+#include "PFile.h"
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+//#include "PMemoryFileSystem.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "ptypes.h"
+#include "string.h"
+#include "stdio.h"
+#include "stdlib.h"
+#if defined(APP_ENABLE_TIMER)
+#include "ptimer.h"
+#endif
+#include "SR_Grammar.h"
+#include "SR_Recognizer.h"
+#include "SR_RecognizerResult.h"
+#include "SR_Session.h"
+#include "SR_Vocabulary.h"
+#include "SR_AcousticState.h"
+#include "SR_Nametag.h"
+#include "PStackSize.h"
+
+// #define ACCURACY_TESTING 
+#ifdef ACCURACY_TESTING
+#include "SR_GrammarImpl.h"
+#include "SR_SemanticProcessorImpl.h"
+#endif
+
+#include "srec_test_config.h"
+
+//Define this in makefile
+//#define _DEBUGHEAP
+
+
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+#include <crtdbg.h>
+#endif
+
+
+#define LOG_BUFFER_SIZE                 512
+#define MAX_AUDIO_BUFFER_SIZE           10240
+#define DEFAULT_AUDIO_BUFFER_SIZE       256
+#define MAX_LINE_LENGTH                 1024
+#define TRANSCRIPTION_SIZE              512
+#define MAX_SCORE_LENGTH                5
+#define MAX_NUM_REC_CONTEXTS            4
+
+#ifdef PFILE_VIRTUAL_SUPPORT
+  extern const FileRecord pFileRecTable[];
+  extern const unsigned char pFileStart0[];
+#endif /* #ifdef PFILE_VIRTUAL_SUPPORT */
+
+typedef enum
+    {
+    SENTENCE_BEGIN,
+    SENTENCE_BEGIN_BRACKET_BEGIN,
+    SENTENCE_BEGIN_BRACKET_END,
+    SENTENCE_MIDDLE,
+    SENTENCE_MIDDLE_BRACKET_BEGIN,
+    SENTENCE_MIDDLE_BRACKET_END,
+    SENTENCE_MIDDLE_WITH_SPACE
+    } SENTENCE_CLEANING_STATES;
+
+
+
+typedef enum
+    {
+    ForcedRecModeNotSet = -1,
+    ForcedRecModeOff=0,
+    ForcedRecModeOneTime,
+    ForcedRecModeOn
+    } ForcedRecMode;
+
+
+typedef enum
+    {
+    ERROR_LEVEL_CRITICAL = 0,
+    ERROR_LEVEL_HIGH,
+    ERROR_LEVEL_MODERATE,
+    ERROR_LEVEL_LOW
+    } SREC_TEST_ERROR_LEVELS;
+
+
+typedef struct
+    {
+    LCHAR       grammar_path [P_PATH_MAX];      /* File path of the grammar. */
+    LCHAR       grammarID [P_PATH_MAX];         /* ID of the grammar. */
+    LCHAR       ruleName  [P_PATH_MAX];         /* rule name of the grammar. */
+    SR_Grammar* grammar;                        /* grammar. */
+    ESR_BOOL        is_ve_grammar;                  /* Is voice-enrollment grammar or not */
+    } APPL_GRAMMAR_DATA;
+
+
+
+typedef struct ApplicationData_t
+    {
+    int                         argc;               /* The number of command-line arguments. */
+    LCHAR                       **argv;             /* The command-line argument values. */
+    ESR_Locale                  locale;             /* Current application locale. */
+    SR_Recognizer               *recognizer;        /* The current recognizer. */
+    SR_RecognizerResult         *result;            /* The last recognition result. */
+    SR_Vocabulary               *vocabulary;        /* The current vocabulary. */
+    SR_Nametag                  *nametag;           /* The nametag generated by the last recognition. */
+    SR_Nametags                 *nametags;          /* The active nametag collection. */
+    APPL_GRAMMAR_DATA           grammars [MAX_NUM_REC_CONTEXTS];        /* Grammar data */
+    int                         grammarCount;       /* The number of grammars. */
+    int                         active_grammar_num;     /* The index number of the active grammar. */
+    const asr_int16_t                 *raw_waveform;      /*Points to raw waveform returned from voice enrollment */
+    size_t                      raw_waveform_size;  /* Size of above wave_form */
+    asr_int16_t                 audio_buffer [MAX_AUDIO_BUFFER_SIZE];
+    unsigned int                audio_buffer_requested_size;
+    unsigned int                num_samples_read;
+    LCHAR                       raw_waveform_filename [P_PATH_MAX];     /* Name of file of saved waveform data. */
+    PFile                       *raw_waveform_file;     /* Pointer to file of saved waveform data. */
+    LCHAR                       transcription [MAX_LINE_LENGTH];
+    ForcedRecMode               forced_rec_mode;
+    } ApplicationData;
+
+
+
+static int      srec_test_get_run_params ( unsigned int *num_shutdown_loops, unsigned int *num_continuous_run_loops );
+static int      srec_test_init_application_data ( ApplicationData *applicationData, int arg_count, LCHAR *arg_vals [] );
+static int      srec_test_init_file_system ( int arg_count, LCHAR *arg_vals [] );
+static int      srec_test_init_logging_system ( int arg_count, LCHAR *arg_vals [], PLogger *logger );
+static int      srec_test_init_memory_system ( unsigned int srec_test_heap_size );
+static int      srec_test_init_system ( unsigned int srec_test_heap_size, PLogger* logger, int arg_count, LCHAR *arg_vals [] );
+static int      srec_test_run_test_execute ( ApplicationData *applicationData );
+static int      srec_test_run_test_init ( ApplicationData *applicationData );
+static int      srec_test_run_test ( ApplicationData *applicationData );
+static int      srec_test_shutdown_file_system ( void );
+static int      srec_test_shutdown_logging_system ( PLogger *logger );
+static int      srec_test_shutdown_memory_system ( void );
+static int      srec_test_recognize_nist_file ( SR_Grammar *active_grammar, ApplicationData *data, FILE *results_file,
+                                                LCHAR *command_text, size_t *recognition_count );
+static int      srec_test_recognize_pcm_file ( SR_Grammar *active_grammar, ApplicationData *data, FILE *results_file,
+                                               LCHAR *command_text, size_t *recognition_count );
+static void     srec_test_log_recognition_failure ( ApplicationData *data );
+
+
+
+static ESR_BOOL interrupted = ESR_FALSE;
+
+/* static ESR_BOOL no_enroll = ESR_FALSE;      //BJP */
+
+int signal_handler_SIGINT(int v)
+{
+  interrupted = ESR_TRUE;
+  return 0;
+}
+
+
+
+ESR_ReturnCode myDSMCallback(LCHAR* functionName, LCHAR** argv, size_t argc, void* value, LCHAR* result, size_t* resultSize)
+{
+  LCHAR* meaning;
+
+  PLOG_DBG_TRACE((L("myDSMCallback(%s) invoked\n"), functionName));
+  if ((LSTRCMP(functionName, "myDSMCallback")!=0) || (argc > 1))
+  {
+    /* Unsupported semantic function */
+    return ESR_INVALID_STATE;
+  }
+        if (argc > 0)
+                meaning = argv[0];
+        else
+                meaning = L("");
+  lstrtrim(meaning);
+  LSTRLWR(meaning);
+
+  if (LISDIGIT(*meaning))
+        {
+                /* Penalize meaning starting with "<digit>" */
+    if (*resultSize < LSTRLEN(L("1000"))+1)
+    {
+      *resultSize = LSTRLEN(L("1000"))+1;
+      return ESR_BUFFER_OVERFLOW;
+    }
+    LSTRCPY(result, "1000");
+    *resultSize = LSTRLEN(L("1000"))+1;
+    return ESR_SUCCESS;
+        }
+  if (*resultSize < LSTRLEN(L("0"))+1)
+  {
+    *resultSize = LSTRLEN(L("0"))+1;
+    return ESR_BUFFER_OVERFLOW;
+  }
+  LSTRCPY(result, "0");
+  *resultSize = LSTRLEN(L("0"))+1;
+  return ESR_SUCCESS;
+}
+
+
+
+void srec_test_log_error ( unsigned int error_id, SREC_TEST_ERROR_LEVELS error_level, LCHAR *error_text )
+    {
+
+    switch ( error_level )
+        {
+        case ERROR_LEVEL_CRITICAL:
+            LPRINTF ( "Critical Level Error %s\n", error_text );
+            break;
+
+        case ERROR_LEVEL_HIGH:
+            LPRINTF ( "High Level Error %s\n", error_text );
+            break;
+
+        case ERROR_LEVEL_MODERATE:
+            LPRINTF ( "Moderate Level Error %s\n", error_text );
+            break;
+
+        case ERROR_LEVEL_LOW:
+            LPRINTF ( "Low Level Error %s\n", error_text );
+            break;
+
+        default:
+            LPRINTF ( "Unknown Level Error %d  :  %s\n", error_level, error_text );
+            break;
+        }
+    }
+
+
+
+void srec_test_delete_grammar ( ApplicationData *data, int grammar_num )
+    {
+    LCHAR log_buffer[LOG_BUFFER_SIZE];
+
+    if ( grammar_num < data->grammarCount )
+        {
+        if ( ( data->grammarCount - grammar_num ) > 1 )
+            {
+            memmove ( &data->grammars [grammar_num], &data->grammars [data->grammarCount - 1],
+                      ( data->grammarCount - grammar_num - 1 ) * sizeof ( APPL_GRAMMAR_DATA ) );
+            if ( grammar_num > data->active_grammar_num )
+                data->active_grammar_num--;
+            }
+        data->grammarCount--;
+        }
+    else
+        {
+        LSPRINTF ( log_buffer, L("Internal Error Grammar TableCorrupt : Grammar %d Does Not Exist"), grammar_num );
+        srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, log_buffer );
+        }
+    }
+
+
+
+static void srec_test_get_active_grammar ( ApplicationData *data, SR_Grammar **active_grammar )
+    {
+
+    if ( data->active_grammar_num >= 0 )
+        *active_grammar = data->grammars [data->active_grammar_num].grammar;
+    else
+        *active_grammar = NULL;
+    }
+
+
+
+static void srec_test_get_active_grammar_data ( ApplicationData *data, APPL_GRAMMAR_DATA **active_grammar_data )
+    {
+
+    if ( data->active_grammar_num >= 0 )
+        *active_grammar_data = &data->grammars [data->active_grammar_num];
+    else
+        *active_grammar_data = NULL;
+    }
+
+
+
+static ESR_BOOL srec_test_get_grammar_from_id ( ApplicationData *data, char *grammar_id,
+                                            int *grammar_index, ESR_BOOL *is_active, ESR_BOOL *is_ve_grammar )
+    {
+    ESR_BOOL            found_grammar;
+    int             grammar_counter;
+
+    found_grammar = ESR_FALSE;
+    grammar_counter = 0;
+
+    while ( ( found_grammar == ESR_FALSE ) && ( grammar_counter < data->grammarCount ) )
+        {
+        if ( strcmp ( grammar_id, data->grammars [grammar_counter].grammarID ) == 0 )
+            {
+            *grammar_index = grammar_counter;
+            *is_ve_grammar = data->grammars [grammar_counter].is_ve_grammar;
+
+            if ( grammar_counter == data->active_grammar_num )
+                *is_active = ESR_TRUE;
+            else
+                *is_active = ESR_FALSE;
+            found_grammar = ESR_TRUE;
+            }
+        else
+            {
+            grammar_counter++;
+            }
+        }
+    return ( found_grammar );
+    }
+
+
+
+static int srec_test_get_empty_grammar_index ( ApplicationData *data, unsigned int *grammar_index )
+    {
+    int get_status;
+
+    if ( data->grammarCount < MAX_NUM_REC_CONTEXTS )
+        {
+        get_status = 0;
+        *grammar_index = data->grammarCount;
+        }
+    else
+        {
+        get_status = -1;
+        }
+    return ( get_status );
+    }
+
+
+
+ESR_ReturnCode ShutdownSession ( void )
+    {
+    ESR_ReturnCode    shutdown_status;
+
+    shutdown_status = SR_SessionDestroy ( );
+
+    return ( shutdown_status );
+    }
+
+
+
+ESR_ReturnCode InitSession ( int argc, LCHAR *argv [] )
+    {
+    ESR_ReturnCode    init_status;
+    LCHAR             path[P_PATH_MAX];
+    size_t            len;
+
+    len = P_PATH_MAX;
+    init_status = ESR_CommandLineGetValue ( argc, (const char **)argv, L("parfile"), path, &len );
+
+    if ( init_status == ESR_SUCCESS )
+        {
+        init_status = SR_SessionCreate ( path );
+
+        if ( init_status == ESR_SUCCESS )
+            {
+  /* Command-line options always override PAR file options */
+            init_status = ESR_SessionImportCommandLine ( argc, argv );
+
+            if ( init_status != ESR_SUCCESS )
+                {
+                SR_SessionDestroy ( );
+                /* Log Here */
+                }
+            }
+        else
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, L("Parfile Nmae Not Specified on Command Line") );
+        }
+    return ( init_status );
+    }
+
+
+
+ESR_ReturnCode ShutdownGrammarUnload ( ApplicationData *data, unsigned int grammar_num )
+    {
+    ESR_ReturnCode  shutdown_status;
+
+    shutdown_status = SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+
+    return ( shutdown_status );
+    }
+
+
+
+ESR_ReturnCode SetupGrammarLoad ( ApplicationData *data, unsigned int grammar_num )
+    {
+    ESR_ReturnCode  setup_status;
+
+    setup_status = SR_GrammarLoad (data->grammars [grammar_num].grammar_path, &data->grammars [grammar_num].grammar );
+
+    if ( setup_status == ESR_SUCCESS )
+        {
+        setup_status = SR_GrammarSetupVocabulary ( data->grammars [grammar_num].grammar, data->vocabulary );
+
+        if ( setup_status == ESR_SUCCESS )
+            {
+            setup_status = SR_GrammarSetupRecognizer( data->grammars [grammar_num].grammar, data->recognizer );
+
+            if ( setup_status == ESR_SUCCESS )
+                {
+                setup_status = SR_GrammarSetDispatchFunction ( data->grammars [grammar_num].grammar, L("myDSMCallback"), NULL, myDSMCallback );
+
+                if ( setup_status != ESR_SUCCESS )
+                    SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+                }
+            else
+                {
+                SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+                }
+            }
+        else
+            {
+            SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+            }
+        }
+    return ( setup_status );
+    }
+
+
+
+ESR_ReturnCode SetupGrammarActivate ( ApplicationData *data, unsigned int grammar_num )
+    {
+    ESR_ReturnCode  setup_status;
+    setup_status = SR_RecognizerActivateRule ( data->recognizer, data->grammars [grammar_num].grammar, data->grammars [grammar_num].ruleName, 1 );
+    return ( setup_status );
+    }
+
+
+
+#ifdef ACCURACY_TESTING
+ESR_ReturnCode srec_test_parse (SR_Grammar *grammar, const LCHAR* trans, LCHAR* meaning, size_t *len);
+#endif
+
+/**
+ * Parses source string and copies the first whitespace-delimited token into destination.
+ *
+ * @param source Source string to parse
+ * @param target Target string to copy into
+ * @param charsRead [in] Size of target buffer.
+ *                  [out] Number of characters read up to end of token.
+ *                  If the return code is ESR_BUFFER_OVERFLOW, the required length is
+ *                  returned in this variable.
+ */
+int getFirstToken(LCHAR* source, LCHAR* target, size_t* charsRead)
+{
+  LCHAR* beginning = source;
+  LCHAR* ending;
+
+  /* Skip whitespace */
+  for (; *beginning!=L('\0') && LISSPACE(*beginning); ++beginning);
+  if (*beginning==L('\0'))
+    return ( -1 ); /* invalid command syntax */
+
+  if(*beginning == '\"') {
+	  beginning++;
+	  for (ending=beginning; *ending!=L('\0') && *ending!='\"'; ++ending);
+	  *ending = L(' ');
+  } else {
+	/* Find next whitespace */
+	for (ending=beginning; *ending!=L('\0') && !LISSPACE(*ending); ++ending);
+  }
+  if ((size_t) (ending-beginning) > *charsRead)
+  {
+    *charsRead = ending-beginning;
+    return ( -1 );
+  }
+  *charsRead = ending-source;
+  LSTRNCPY(target, beginning, ending-beginning);
+  target[ending-beginning] = L('\0');
+  return ( 0 );
+}
+
+
+
+int srec_test_get_five_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command,
+                                       size_t second_max_command_size, LCHAR *second_command,
+                                       size_t third_max_command_size, LCHAR *third_command,
+                                       size_t fourth_max_command_size, LCHAR *fourth_command,
+                                       size_t fifth_max_command_size, LCHAR *fifth_command,
+                                       size_t *actual_commands, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, first_command, &first_max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size );
+
+        if ( get_status == ESR_SUCCESS )
+            {
+            get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size,
+                                         third_command, &third_max_command_size );
+            if ( get_status == ESR_SUCCESS )
+                {
+                get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size,
+                                             fourth_command, &fourth_max_command_size );
+                if ( get_status == ESR_SUCCESS )
+                    {
+                    get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size,
+                                                 fifth_command, &fifth_max_command_size );
+                    if ( get_status == ESR_SUCCESS )
+                        {
+                        if ( command_end != NULL )
+                            *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size + fifth_max_command_size;
+                        if ( actual_commands != NULL )
+                            *actual_commands = 5;
+                        }
+                    else
+                        {
+                        if ( command_end != NULL )
+                            *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size;
+                        if ( actual_commands != NULL )
+                            *actual_commands = 4;
+                        }
+                    }
+                else
+                    {
+                    if ( command_end != NULL )
+                        *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size;
+                    if ( actual_commands != NULL )
+                        *actual_commands = 3;
+                    }
+                }
+            else
+                {
+                if ( command_end != NULL )
+                    *command_end = command_start + first_max_command_size + second_max_command_size;
+                if ( actual_commands != NULL )
+                    *actual_commands = 2;
+                }
+            }
+        else
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 1;
+            }
+        }
+    else
+        {
+        if ( command_end != NULL )
+            *command_end = command_start;
+        if ( actual_commands != NULL )
+            *actual_commands = 0;
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_get_four_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command,
+                                       size_t second_max_command_size, LCHAR *second_command,
+                                       size_t third_max_command_size, LCHAR *third_command,
+                                       size_t fourth_max_command_size, LCHAR *fourth_command,
+                                       size_t *actual_commands, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, first_command, &first_max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size );
+
+        if ( get_status == ESR_SUCCESS )
+            {
+            get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size,
+                                         third_command, &third_max_command_size );
+            if ( get_status == ESR_SUCCESS )
+                {
+                get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size,
+                                             fourth_command, &fourth_max_command_size );
+                if ( get_status == ESR_SUCCESS )
+                    {
+                    if ( command_end != NULL )
+                        *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size;
+                    if ( actual_commands != NULL )
+                        *actual_commands = 4;
+                    }
+                else
+                    {
+                    if ( command_end != NULL )
+                        *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size;
+                    if ( actual_commands != NULL )
+                        *actual_commands = 3;
+                    }
+                }
+            else
+                {
+                if ( command_end != NULL )
+                    *command_end = command_start + first_max_command_size + second_max_command_size;
+                if ( actual_commands != NULL )
+                    *actual_commands = 2;
+                }
+            }
+        else
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 1;
+            }
+        }
+    else
+        {
+        if ( command_end != NULL )
+            *command_end = command_start;
+        if ( actual_commands != NULL )
+            *actual_commands = 0;
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_get_three_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command,
+                                        size_t second_max_command_size, LCHAR *second_command,
+                                        size_t third_max_command_size, LCHAR *third_command,
+                                        size_t *actual_commands, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, first_command, &first_max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size );
+
+        if ( get_status == ESR_SUCCESS )
+            {
+            get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size,
+                                         third_command, &third_max_command_size );
+            if ( get_status == ESR_SUCCESS )
+                {
+                if ( command_end != NULL )
+                    *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size;
+                if ( actual_commands != NULL )
+                    *actual_commands = 3;
+                }
+            else
+                {
+                if ( command_end != NULL )
+                    *command_end = command_start + first_max_command_size + second_max_command_size;
+                if ( actual_commands != NULL )
+                    *actual_commands = 2;
+                }
+            }
+        else
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 1;
+            }
+        }
+    else
+        {
+        if ( command_end != NULL )
+            *command_end = command_start;
+        if ( actual_commands != NULL )
+            *actual_commands = 0;
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_get_two_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command,
+                                      size_t second_max_command_size, LCHAR *second_command,
+                                      size_t *actual_commands, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, first_command, &first_max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size );
+
+        if ( get_status == ESR_SUCCESS )
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size + second_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 2;
+            }
+        else
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 1;
+            }
+        }
+    else
+        {
+        if ( command_end != NULL )
+            *command_end = command_start;
+        if ( actual_commands != NULL )
+            *actual_commands = 0;
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_get_one_command_item ( LCHAR *command_start, size_t max_command_size, LCHAR *command, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, command, &max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        if ( command_end != NULL )
+            *command_end = command_start + max_command_size;
+        }
+    return ( get_status );
+    }
+
+
+
+/**
+ * Execute TCP-file commands.
+ *
+ * @param text String containing command
+ * @param recognizer The recognizer
+ */
+//static int words_added = 0;
+
+#if defined(APP_ENABLE_TIMER)
+static PTimer *addWordTimer = NULL;
+static PTimer *compileTimer = NULL;
+#endif
+
+
+
+int srec_test_reset_slots ( SR_Grammar *active_grammar )
+    {
+    int             reset_status;
+    ESR_ReturnCode  esr_status;
+
+    if ( active_grammar != NULL )
+        {
+        reset_status = 0;
+        esr_status = SR_GrammarResetAllSlots ( active_grammar );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            reset_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        reset_status = -1;
+        /* Log Here */
+        }
+    return ( reset_status );
+    }
+
+
+
+int srec_test_add_word ( SR_Grammar *active_grammar, LCHAR *command_text )
+    {
+    int             add_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           slot [MAX_LINE_LENGTH];
+    LCHAR           word [MAX_LINE_LENGTH];
+    LCHAR           pron [MAX_LINE_LENGTH];
+    LCHAR           weight [MAX_UINT_DIGITS+1];
+    LCHAR           semanticTag [MAX_LINE_LENGTH];
+    int             weightNumber;
+    int             convert_string_to_num;
+
+    if ( active_grammar != NULL )
+        {
+        add_status  = srec_test_get_five_command_items ( command_text, MAX_LINE_LENGTH, slot,
+                                                         MAX_LINE_LENGTH, word, MAX_LINE_LENGTH, pron,
+                                                         MAX_UINT_DIGITS + 1, weight, MAX_LINE_LENGTH,
+                                                         semanticTag, NULL, NULL );
+        if ( add_status == 0 )
+            {
+            convert_string_to_num = lstrtoi (weight, &weightNumber, 10 );
+
+            if ( convert_string_to_num == 0 )
+                {
+#if defined(APP_ENABLE_TIMER)
+                PTimerStart ( addWordTimer );
+#endif
+				pron[ strlen(pron)+1] = 0; // make sure we have double-null!
+                esr_status = SR_GrammarAddWordToSlot ( active_grammar, slot, word, pron, weightNumber, semanticTag );
+#if defined(APP_ENABLE_TIMER)
+                PTimerStop(addWordTimer);
+#endif
+                if ( esr_status != ESR_SUCCESS )
+                    {
+                    add_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                add_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            add_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        add_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" );
+        }
+    return ( add_status );
+    }
+
+
+
+int srec_test_compile_active_context ( SR_Grammar *active_grammar )
+    {
+    int             compile_status;
+    ESR_ReturnCode  esr_status;
+
+    if ( active_grammar != NULL )
+        {
+        compile_status = 0;
+#if defined(APP_ENABLE_TIMER)
+        PTimerStart ( compileTimer );
+#endif
+        esr_status = SR_GrammarCompile( active_grammar );
+#if defined(APP_ENABLE_TIMER)
+        PTimerStop ( compileTimer );
+#endif
+        if ( esr_status != ESR_SUCCESS )
+            {
+            compile_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        compile_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, L("No Active Grammar To Compile") );
+        }
+    return ( compile_status );
+    }
+
+
+
+int srec_test_load_grammar_data_from_command ( ApplicationData *data, unsigned int grammar_num, LCHAR *command_text )
+    {
+    int             get_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           path [P_PATH_MAX];
+    LCHAR           id [P_PATH_MAX];
+    LCHAR           rule [P_PATH_MAX];
+    LCHAR           ve_marker [P_PATH_MAX];
+    size_t          path_length;
+
+    get_status = srec_test_get_four_command_items ( command_text, P_PATH_MAX, path, P_PATH_MAX, id,
+                                                    P_PATH_MAX, rule, P_PATH_MAX, ve_marker, NULL, NULL );
+    if ( get_status == 0 )
+        {
+        path_length = P_PATH_MAX;
+        esr_status = ESR_SessionPrefixWithBaseDirectory ( path, &path_length );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            LSTRCPY ( data->grammars [grammar_num].grammar_path, path );
+            LSTRCPY ( data->grammars [grammar_num].grammarID, id );
+            LSTRCPY ( data->grammars [grammar_num].ruleName, rule );
+
+            if ( LSTRCMP ( ve_marker, L("ve") ) ==0 )
+                data->grammars [grammar_num].is_ve_grammar = ESR_TRUE;
+            else if ( LSTRCMP ( ve_marker, L("not_ve") ) ==0 )
+                data->grammars [grammar_num].is_ve_grammar = ESR_FALSE;
+            else
+                {
+                get_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            get_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        /* Log Here */
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_load_context ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             load_status;
+    ESR_ReturnCode  esr_status;
+    unsigned int    open_grammar;
+
+    load_status = srec_test_get_empty_grammar_index ( data, &open_grammar );
+
+    if ( load_status == 0 )
+        {
+        load_status = srec_test_load_grammar_data_from_command ( data, open_grammar, command_text );
+
+        if ( load_status == 0 )
+            {
+            esr_status = SetupGrammarLoad ( data, open_grammar );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                LPRINTF(L("Grammar Loaded\n"));
+                data->grammarCount++;
+                }
+            else
+                {
+                load_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Maximum Number Of Grammars Already Loaded") );
+        }
+    return ( load_status );
+    }
+
+
+
+int srec_test_free_context ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text )
+    {
+    int             free_status;
+    ESR_ReturnCode  esr_status;
+    int             grammar_num;
+    ESR_BOOL            found_grammar;
+    ESR_BOOL            grammar_is_active;
+    ESR_BOOL            grammar_is_ve;
+    LCHAR           grammar_id [P_PATH_MAX];
+
+    free_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL );
+
+    if ( free_status == 0 )
+        {
+        found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve );
+
+        if ( found_grammar == ESR_TRUE )
+            {
+            if ( grammar_is_active == ESR_TRUE )
+                {
+                if ( grammar_is_ve == ESR_TRUE )
+                    {
+                    esr_status = SR_RecognizerSetBoolParameter ( data->recognizer, L("enableGetWaveform"), ESR_FALSE );
+
+                    if ( esr_status != ESR_SUCCESS )
+                        {
+                        free_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                else
+                    {
+                    esr_status = ESR_SUCCESS;
+                    }
+                if ( esr_status == ESR_SUCCESS )
+                    {
+                    esr_status = SR_RecognizerDeactivateRule ( data->recognizer, data->grammars [data->active_grammar_num].grammar,
+                                                               data->grammars [data->active_grammar_num].ruleName );
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                          data->active_grammar_num = -1;
+                        }
+                    else
+                        {
+                        free_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                }
+            else
+                {
+                free_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            free_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        /* Log Here */
+        }
+    return ( free_status );
+    }
+
+
+
+int srec_test_unload_context ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             unload_status;
+    ESR_ReturnCode  esr_status;
+    int             grammar_num;
+    ESR_BOOL            found_grammar;
+    ESR_BOOL            grammar_is_active;
+    ESR_BOOL            grammar_is_ve;
+    LCHAR           grammar_id [P_PATH_MAX];
+
+   unload_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL );
+
+   if ( unload_status == 0 )
+        {
+        found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve );
+
+        if ( found_grammar == ESR_TRUE )
+            {
+            if ( grammar_is_active == ESR_FALSE )
+                {
+                esr_status = SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+
+                if ( esr_status != ESR_SUCCESS )
+                    {
+                    unload_status = -1;
+                    /* Log Here */
+                    }
+                srec_test_delete_grammar ( data, grammar_num );
+                }
+            else
+                {
+                unload_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            unload_status = -1;
+            /* Log Here */
+            }
+            }
+    else
+        {
+        /* Log Here */
+        }
+    return ( unload_status );
+    }
+
+
+
+int srec_test_use_context ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text )
+    {
+    int             use_status;
+    ESR_ReturnCode  esr_status;
+    int             grammar_num;
+    ESR_BOOL            found_grammar;
+    ESR_BOOL            grammar_is_active;
+    ESR_BOOL            grammar_is_ve;
+    LCHAR           grammar_id [P_PATH_MAX];
+
+    if ( active_grammar == NULL )
+        {
+        use_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL );
+
+        if ( use_status == 0 )
+            {
+            found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve );
+
+            if ( found_grammar == ESR_TRUE )
+                {
+                    esr_status = SR_RecognizerActivateRule ( data->recognizer, data->grammars [grammar_num].grammar,
+                                                             data->grammars [grammar_num].ruleName, 1 );
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                        if ( data->grammars [grammar_num].is_ve_grammar == ESR_TRUE )
+                            {
+                            esr_status = SR_RecognizerSetBoolParameter ( data->recognizer, L("enableGetWaveform"), ESR_TRUE );
+
+                            if ( esr_status == ESR_SUCCESS )
+                                {
+                                data->active_grammar_num = (int)grammar_num;
+                                }
+                            else
+                                {
+                                use_status = -1;
+                                /* Log Here */
+                                SR_RecognizerDeactivateRule ( data->recognizer, data->grammars [grammar_num].grammar,
+                                                              data->grammars [grammar_num].ruleName );
+                                }
+                            }
+                        else
+                            {
+                            data->active_grammar_num = (int)grammar_num;
+                            }
+                        }
+                    else
+                        {
+                        use_status = -1;
+                        /* Log Here */
+                        }
+                }
+            else
+                {
+                use_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            use_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        use_status = -1;
+		PLogError("ERROR: context_use ignored, use context_free first!");
+        /* Log Here */
+        }
+    return ( use_status );
+    }
+
+
+
+int srec_test_save_context ( SR_Grammar *active_grammar, LCHAR *command_text )
+    {
+    int             save_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+
+    if ( active_grammar != NULL )
+        {
+        save_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL );
+
+        if ( save_status == 0 )
+            {
+            esr_status = SR_GrammarSave ( active_grammar, file_name );
+
+            if ( esr_status != ESR_SUCCESS )
+                {
+                save_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        save_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" );
+        }
+    return ( save_status );
+    }
+
+
+
+int srec_test_get_size_t_parameter ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             get_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           key [P_PATH_MAX];
+    size_t          value;
+
+    get_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, key, NULL );
+
+    if ( get_status == 0 )
+        {
+        esr_status = SR_RecognizerGetSize_tParameter ( data->recognizer, key, &value );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            printf ( "Get Parameter  :  %s  :  %u\n", key, value );
+        }
+    else
+            {
+            get_status = -1;
+            /* Log Here */
+            }
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_set_size_t_parameter ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             set_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           key [P_PATH_MAX];
+    LCHAR           value [MAX_UINT_DIGITS+1];
+    int             value_as_number;
+    int             convert_string_to_num;
+
+    set_status = srec_test_get_two_command_items ( command_text, P_PATH_MAX, key,
+                                                   MAX_UINT_DIGITS + 1, value, NULL, NULL );
+    if ( set_status == 0 )
+        {
+        convert_string_to_num = lstrtoi ( value, &value_as_number, 10 );
+
+        if ( convert_string_to_num == 0 )
+            {
+            if ( value_as_number > 0 )
+                {
+                esr_status = SR_RecognizerSetSize_tParameter ( data->recognizer, key, (size_t)value_as_number );
+
+                if ( esr_status != ESR_SUCCESS )
+                    {
+                    set_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                set_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            set_status = -1;
+            /* Log Here */
+            }
+        }
+    return ( set_status );
+    }
+
+
+
+int srec_test_voice_enroll ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text )
+    {
+    int             enroll_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           slot [P_PATH_MAX];
+    LCHAR           nametagID [P_PATH_MAX];
+    LCHAR           weight [MAX_UINT_DIGITS+1];
+    int             weightNumber;
+    int             convert_string_to_num;
+
+    if ( active_grammar != NULL )
+        {
+        if ( data->nametag != NULL )
+            {
+            enroll_status = srec_test_get_three_command_items ( command_text, P_PATH_MAX, slot, P_PATH_MAX, nametagID,
+                                                                MAX_UINT_DIGITS + 1, weight, NULL, NULL );
+            if ( enroll_status == 0 )
+                {
+                convert_string_to_num = lstrtoi ( weight, &weightNumber, 10 );
+
+                if ( convert_string_to_num == 0 )
+                    {
+                    esr_status = SR_NametagSetID ( data->nametag, nametagID );
+
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+			  LCHAR value[MAX_LINE_LENGTH];
+			  LSPRINTF( value,"V='%s';",nametagID);
+                        esr_status = SR_GrammarAddNametagToSlot ( active_grammar, slot, data->nametag, weightNumber, value );
+                        if ( esr_status != ESR_SUCCESS )
+                            {
+                            enroll_status = -1;
+                            /* Log Here */
+                            }
+                        }
+                    else
+                        {
+                        enroll_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                else
+                    {
+                    enroll_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                /* Log Here */
+                }
+            }
+        else
+            {
+            enroll_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        enroll_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" );
+        }
+    return ( enroll_status );
+    }
+
+
+
+int srec_test_load_nametags ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             load_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+
+    load_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL );
+
+    if ( load_status == 0 )
+        {
+        esr_status = SR_NametagsLoad ( data->nametags, file_name );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            load_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        load_status = -1;
+        /* Log Here */
+        }
+    return ( load_status );
+    }
+
+
+
+int srec_test_save_nametags ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             save_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+
+    save_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL );
+
+    if ( save_status == 0 )
+        {
+        esr_status = SR_NametagsSave ( data->nametags, file_name );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            save_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        save_status = -1;
+        /* Log Here */
+        }
+    return ( save_status );
+    }
+
+
+
+int srec_test_clear_nametags ( ApplicationData *data )
+    {
+    int             clear_status;
+    ESR_ReturnCode  esr_status;
+
+    clear_status = 0;
+    esr_status = SR_NametagsDestroy ( data->nametags );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        data->nametags = NULL;
+        esr_status = SR_NametagsCreate ( &data->nametags );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            clear_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        clear_status = -1;
+        /* Log Here */
+        }
+    return ( clear_status );
+    }
+
+
+
+int srec_test_add_to_nametags ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             add_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           nametagID [P_PATH_MAX];
+
+    if ( data->nametag != NULL )
+        {
+        add_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, nametagID, NULL );
+
+        if ( add_status == 0 )
+            {
+            esr_status = SR_NametagSetID ( data->nametag, nametagID );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                esr_status = SR_NametagsAdd ( data->nametags, data->nametag );
+
+                if ( esr_status == ESR_SUCCESS )
+                    {
+                    data->nametag = NULL;
+                    }
+                else
+                    {
+                    add_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                add_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            add_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        add_status = -1;
+        /* Log Here */
+        }
+    return ( add_status );
+    }
+
+
+int srec_test_voice_enroll_nametags ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text )
+    {
+    int             enroll_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           slot [P_PATH_MAX];
+    SR_Nametag      *nametag;
+    size_t          nametags_size;
+    size_t          current_nametag;
+
+    if ( active_grammar != NULL )
+        {
+        enroll_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, slot, NULL );
+
+        if ( enroll_status == 0 )
+            {
+            esr_status = SR_NametagsGetSize (data->nametags, &nametags_size );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                current_nametag = 0;
+
+                while ( ( current_nametag < nametags_size ) && ( esr_status == ESR_SUCCESS ) )
+                    {
+                    esr_status = SR_NametagsGetAtIndex ( data->nametags, current_nametag, &nametag );
+
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                        esr_status = SR_GrammarAddNametagToSlot ( active_grammar, slot, nametag, 0, NULL );
+
+                        if ( esr_status == ESR_SUCCESS )
+                            {
+                            current_nametag++;
+                            }
+                        else
+                            {
+                            enroll_status = -1;
+                            /* Log Here */
+                            }
+                        }
+                    else
+                        {
+                        enroll_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                }
+            else
+                {
+                enroll_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        enroll_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" );
+        }
+    return ( enroll_status );
+    }
+
+
+
+int srec_test_set_audio_size ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             set_status;
+    LCHAR           new_size [P_PATH_MAX];
+    int             size_as_number;
+    int             convert_string_to_num;
+
+    set_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, new_size, NULL );
+
+    if ( set_status == 0 )
+        {
+        convert_string_to_num = lstrtoi ( new_size, &size_as_number, 10 );
+
+        if ( convert_string_to_num == 0 )
+            {
+            if ( ( size_as_number > 0 ) && ( size_as_number <= MAX_AUDIO_BUFFER_SIZE ) )
+                {
+                data->audio_buffer_requested_size = size_as_number;
+                LPRINTF ( L("Audio Size Set To %d\n"), size_as_number );
+                }
+            else
+                {
+                set_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            set_status = -1;
+            /* Log Here */
+            }
+        }
+    return ( set_status );
+    }
+
+
+#ifdef _WIN32
+int srec_test_sleep ( LCHAR *command_text )
+    {
+
+    return ( - 1 );
+    }
+#else
+int srec_test_sleep ( LCHAR *command_text )
+    {
+    int         sleep_status;
+    struct timeval  sleep_time_struct;
+    LCHAR           sleep_time [P_PATH_MAX];
+    int             time_as_number;
+    int             convert_string_to_num;
+
+    sleep_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, sleep_time, NULL );
+
+    if ( sleep_status == 0 )
+        {
+        convert_string_to_num = lstrtoi ( sleep_time, &time_as_number, 10 );
+
+        if ( convert_string_to_num == 0 )
+            {
+        sleep_time_struct.tv_sec = time_as_number;
+        sleep_time_struct.tv_usec = 0;
+        select ( 0, NULL, NULL, NULL, &sleep_time_struct );
+        }
+    else
+        {
+        sleep_status = -1;
+        /* Log Here */
+        }
+        }
+    return ( sleep_status );
+    }
+#endif
+
+
+int srec_test_change_sample_rate ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             change_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           new_rate [P_PATH_MAX];
+    int             rate_as_number;
+    int             convert_string_to_num;
+
+    change_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, new_rate, NULL );
+
+    if ( change_status == 0 )
+        {
+        convert_string_to_num = lstrtoi ( new_rate, &rate_as_number, 10 );
+
+        if ( convert_string_to_num == 0 )
+            {
+            esr_status = SR_Recognizer_Change_Sample_Rate ( data->recognizer, rate_as_number );
+
+            if ( esr_status != ESR_SUCCESS )
+                {
+                change_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            change_status = -1;
+            /* Log Here */
+            }
+        }
+    if ( change_status == 0 )
+        printf ( "\nSuccessfully Set Sample Rate To  :  %s\n", new_rate );
+    else
+        printf ( "\nFailed To Set Sample Rate To  :  %s\n", new_rate );
+    return ( change_status );
+    }
+
+
+
+int srec_test_set_acousticstate ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             set_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           state_string [P_PATH_MAX];
+
+    set_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, state_string, NULL );
+
+    if ( set_status == 0 )
+        {
+        esr_status = SR_AcousticStateSet ( data->recognizer, state_string );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            set_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        /* Log Here */
+        }
+    return ( set_status );
+    }
+
+
+
+int srec_test_get_acousticstate ( ApplicationData *data )
+    {
+    int             get_status;
+    ESR_ReturnCode  esr_status;
+    const LCHAR     *state_string;
+
+    get_status = 0;
+    esr_status = SR_AcousticStateGet ( data->recognizer, &state_string );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        printf ( "Acoustic State :\n%s\n", state_string );
+        }
+    else
+        {
+        get_status = -1;
+        /* Log Here */
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_reset_acousticstate ( ApplicationData *data )
+    {
+    int             reset_status;
+    ESR_ReturnCode  esr_status;
+
+    reset_status = 0;
+    esr_status = SR_AcousticStateReset ( data->recognizer );
+
+    if ( esr_status != ESR_SUCCESS )
+        {
+        reset_status = -1;
+        /* Log Here */
+        }
+    return ( reset_status );
+    }
+
+
+
+int srec_test_set_forced_rec_mode ( ApplicationData *data, LCHAR *command_text )
+    {
+    int         set_status;
+    LCHAR       mode[P_PATH_MAX];
+
+    set_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, mode, NULL );
+
+    if ( set_status == 0 )
+        {
+        if ( LSTRCMP ( mode, L("one_time") ) == 0 )
+            {
+            data->forced_rec_mode = ForcedRecModeOneTime;
+            }
+        else if ( LSTRCMP ( mode, L("off") ) == 0 )
+            {
+            data->forced_rec_mode = ForcedRecModeOff;
+            }
+        else if ( LSTRCMP ( mode, L("on") ) == 0 )
+            {
+            data->forced_rec_mode = ForcedRecModeOn;
+            }
+        else
+            {
+            set_status = -1;
+            /* Log Here */
+            }
+        }
+    return ( set_status );
+    }
+
+
+
+int srec_test_execute_command ( ApplicationData *data, LCHAR *text, FILE *results_file, size_t *recognition_count )
+    {
+    int         execute_status;
+    LCHAR       *current_command_start;
+    LCHAR       *current_end_command;
+    LCHAR       command [MAX_LINE_LENGTH];
+    SR_Grammar  *active_grammar;
+    LCHAR       log_buffer [LOG_BUFFER_SIZE];
+
+    srec_test_get_active_grammar ( data, &active_grammar );
+    current_command_start = text;
+    execute_status = srec_test_get_one_command_item ( current_command_start, MAX_LINE_LENGTH, command, &current_end_command );
+
+    if ( execute_status == 0 )
+        {
+        if( data->nametag
+            && ((LSTRCMP(command, "recognize_nist")==0) || (LSTRCMP(command, "recognize_pcm")==0)) ) {
+                /* if there is a nametag held in memory, and we don't make use of it, then
+                let's destroy it here */
+            SR_NametagDestroy(  data->nametag);
+            data->nametag = NULL;
+        }
+
+        if ( LSTRCMP ( command, L("recognize_nist") ) == 0 )
+            execute_status = srec_test_recognize_nist_file ( active_grammar, data, results_file,
+                                                             current_end_command, recognition_count );
+        else if ( LSTRCMP ( command, L("recognize_pcm") ) == 0 )
+            execute_status = srec_test_recognize_pcm_file ( active_grammar, data, results_file,
+                                                            current_end_command, recognition_count );
+        else if ( LSTRCMP ( command, L("context_load") ) == 0 )
+            execute_status = srec_test_load_context ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("context_use") ) == 0 )
+            execute_status = srec_test_use_context ( active_grammar, data, current_end_command );
+        else if ( LSTRCMP ( command, L("context_free") ) == 0 )
+            execute_status = srec_test_free_context ( active_grammar, data, current_end_command );
+        else if ( LSTRCMP ( command, L("context_unload") ) == 0 )
+            execute_status = srec_test_unload_context ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("addwords_from_nametags") ) == 0 )
+            execute_status = srec_test_voice_enroll_nametags ( active_grammar, data, current_end_command );
+        else if ( LSTRCMP ( command, L("resetslots") ) == 0 )
+            execute_status = srec_test_reset_slots ( active_grammar );
+        else  if ( LSTRCMP ( command, L("addword") ) == 0 )
+            execute_status = srec_test_add_word ( active_grammar, current_end_command );
+        else if ( LSTRCMP ( command, L("context_compile") ) == 0 )
+            execute_status = srec_test_compile_active_context ( active_grammar );
+        else if ( LSTRCMP ( command, L("context_save") ) == 0 )
+            execute_status = srec_test_save_context ( active_grammar, current_end_command );
+        else if ( LSTRCMP ( command, L("addword_from_last_nametag") ) == 0 )
+            execute_status = srec_test_voice_enroll ( active_grammar, data, current_end_command );
+        else if ( LSTRCMP ( command, L("load_nametags") ) == 0 )
+            execute_status = srec_test_load_nametags ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("save_nametags") ) == 0 )
+            execute_status = srec_test_save_nametags ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("clear_nametags") ) ==0 )
+            execute_status = srec_test_clear_nametags ( data );
+        else if ( LSTRCMP ( command, L("add_to_nametags") ) == 0 )
+            execute_status = srec_test_add_to_nametags ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("acousticstate_set") ) == 0 )
+            execute_status = srec_test_set_acousticstate ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("acousticstate_get") ) == 0 )
+            execute_status = srec_test_get_acousticstate ( data );
+        else if ( LSTRCMP ( command, L("acousticstate_reset") ) == 0 )
+            execute_status = srec_test_reset_acousticstate ( data );
+        else if ( LSTRCMP ( command, L("forced_rec") ) == 0 )
+            execute_status = srec_test_set_forced_rec_mode ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("change_sample_rate") ) == 0 )
+            execute_status = srec_test_change_sample_rate ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("set_size_t_parameter") ) == 0 )
+            execute_status = srec_test_set_size_t_parameter ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("get_size_t_parameter") ) == 0 )
+            execute_status = srec_test_get_size_t_parameter ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("set_audio_size") ) == 0 )
+            execute_status = srec_test_set_audio_size ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("sleep") ) == 0 )
+            execute_status = srec_test_sleep ( current_end_command );
+        else if ( *( command ) == L('#') )
+            execute_status = 0;   /* Comment in file just skip */
+        else
+            {
+            execute_status = -1;
+            LSPRINTF ( log_buffer, L("Unknown Command %s"), command );
+            srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, log_buffer );
+            }
+        }
+    else
+        {
+        /* Log Here */
+        }
+    return ( execute_status );
+    }
+
+
+
+int srec_test_open_command_file ( PFile **command_file )
+    {
+    int             open_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+    size_t          len;
+
+    open_status = 0;
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.tcp"), file_name, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        len = P_PATH_MAX;
+        esr_status = ESR_SessionPrefixWithBaseDirectory ( file_name, &len );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            *command_file = pfopen ( file_name, L("r") );
+
+            if ( *command_file == NULL )
+                {
+                open_status = -1;
+                LPRINTF(L("\nError opening command file %s\n"), file_name);
+                }
+            }
+        else
+            {
+            open_status = -1;
+            LPRINTF(L("\nError finding command file\n"));
+            }
+        }
+     else
+        {
+        open_status = -1;
+        /* Log Here */
+        }
+     return ( open_status );
+     }
+
+
+
+void srec_test_close_command_file ( PFile *command_file )
+    {
+
+    pfclose ( command_file );
+    }
+
+
+
+void srec_test_close_audio_file ( PFile *audio_file )
+    {
+
+    pfclose ( audio_file );
+    }
+
+
+
+int srec_test_open_results_file ( FILE **results_file )
+    {
+    int             open_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+    size_t          len;
+
+    open_status = 0;
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.results"), file_name, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        *results_file = fopen ( file_name, L("w") );
+
+        if ( ( *results_file ) == NULL )
+            {
+            open_status = -1;
+            /* Log Here */
+            }
+        }
+     else
+         {
+         open_status = -1;
+         /* Log Here */
+         }
+     return ( open_status );
+     }
+
+
+
+void srec_test_close_results_file ( FILE *results_file )
+    {
+
+    fclose ( results_file );
+    }
+
+
+
+int srec_test_process_commands ( ApplicationData *data )
+    {
+    int             process_status;
+    PFile           *command_file;
+    FILE            *results_file;
+    LCHAR           *got_line_ok;
+    LCHAR           linebuffer [MAX_LINE_LENGTH];
+    size_t          recognition_count;
+
+    recognition_count = 0;
+    process_status = srec_test_open_command_file ( &command_file );
+
+    if ( process_status == 0 )
+        {
+        process_status = srec_test_open_results_file ( &results_file );
+
+        if ( process_status == 0 )
+            {
+            do
+                {
+                got_line_ok = pfgets ( linebuffer, MAX_LINE_LENGTH, command_file );
+
+                if ( got_line_ok != NULL )
+                    srec_test_execute_command ( data, linebuffer, results_file, &recognition_count );
+                }
+            while ( ( got_line_ok != NULL ) && ( process_status == 0 ) );
+            if( data->nametag ) {
+                SR_NametagDestroy(  data->nametag);
+                data->nametag = NULL;
+            }
+
+
+            srec_test_close_results_file ( results_file );
+            }
+        srec_test_close_command_file ( command_file );
+        }
+    return ( process_status );
+    }
+
+
+
+int srec_test_open_pcm_file ( LCHAR *file_name, PFile **pcm_file )
+    {
+    int             open_status;
+    ESR_ReturnCode  esr_status;
+    int             lstr_result;
+    LCHAR           file_path [P_PATH_MAX];
+    size_t          len;
+
+    open_status = 0;
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.datapath"), file_path, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        len = P_PATH_MAX;
+        esr_status = ESR_SessionPrefixWithBaseDirectory ( file_path, &len );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            esr_status = pf_convert_backslashes_to_forwardslashes ( file_path );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                len = P_PATH_MAX;
+                lstr_result = lstrinsert ( file_path, file_name, 0, &len );
+
+                if ( lstr_result == 0 )
+                    {
+                    *pcm_file = pfopen ( file_name, L("rb") );
+
+                    if ( ( *pcm_file ) == NULL )
+                        {
+                        open_status = -1;
+                        }
+                    }
+                else
+                    {
+                    open_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                open_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            open_status = -1;
+            /* Log Here */
+            }
+        }
+     else
+         {
+         open_status = -1;
+         /* Log Here */
+         }
+     if(open_status) PLogError( ("Error: while opening %s\n"), file_name);
+     return ( open_status );
+     }
+
+
+
+int srec_test_open_nist_file ( LCHAR *file_name, PFile **nist_file )
+    {
+    int             open_status;
+    ESR_ReturnCode  esr_status;
+    int             lstr_result;
+    LCHAR           file_path [P_PATH_MAX];
+    size_t          len;
+
+    open_status = 0;
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.datapath"), file_path, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        len = P_PATH_MAX;
+        esr_status = ESR_SessionPrefixWithBaseDirectory ( file_path, &len );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            esr_status = pf_convert_backslashes_to_forwardslashes ( file_path );
+
+        if(file_path[ LSTRLEN(file_path)-1] != L('/'))
+            LSTRCAT(file_path,L("/"));
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                len = P_PATH_MAX;
+                lstr_result = lstrinsert ( file_path, file_name, 0, &len );
+
+                if ( lstr_result == 0 )
+                    {
+                    *nist_file = pfopen ( file_name, L("rb") );
+
+                    if ( ( *nist_file ) != NULL )
+                        {
+                        esr_status = pfseek ( *nist_file, 1024, SEEK_SET );
+
+                        if ( esr_status != ESR_SUCCESS )
+                            {
+                            open_status = -1;
+                            }
+                        }
+                    else
+                        {
+                        open_status = -1;
+                        }
+                    }
+                else
+                    {
+                    open_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                open_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            open_status = -1;
+            /* Log Here */
+            }
+        }
+     else
+         {
+         open_status = -1;
+         /* Log Here */
+         }
+	 if(open_status)	PLogError( ("Error: while opening %s\n"), file_name);
+     return ( open_status );
+     }
+
+
+
+int srec_test_get_audio_from_file ( PFile *audio_file, ApplicationData *data, ESR_BOOL *hit_eof )
+    {
+    int get_status;
+    int eof_status;
+
+    get_status = 0;
+    data->num_samples_read = pfread ( data->audio_buffer, sizeof ( asr_int16_t ), data->audio_buffer_requested_size, audio_file );
+
+    if ( data->num_samples_read > 0 )
+        {
+        *hit_eof = ESR_FALSE;
+        }
+    else
+        {
+        eof_status = pfeof ( audio_file );
+
+        if ( eof_status == 0 )
+            {
+            get_status = -1;
+            /* Log Here */
+            }
+        else
+            {
+            *hit_eof = ESR_TRUE;
+            }
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_feed_recognizer ( ApplicationData *data, ESR_BOOL hit_eof, SR_RecognizerStatus *esr_recog_status, SR_RecognizerResultType *result_type )
+    {
+    int             feed_status;
+    ESR_ReturnCode  esr_status;
+
+    feed_status = 0;
+    esr_status = SR_RecognizerPutAudio ( data->recognizer, data->audio_buffer, &data->num_samples_read, hit_eof );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        do
+            {
+            esr_status = SR_RecognizerAdvance ( data->recognizer, esr_recog_status, result_type, &data->result );
+
+            if ( esr_status != ESR_SUCCESS )
+                {
+                feed_status = -1;
+                *esr_recog_status = SR_RECOGNIZER_EVENT_STOPPED;
+                *result_type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+                /* Log Here */
+                }
+            }
+        while ( ( *esr_recog_status ) == SR_RECOGNIZER_EVENT_INCOMPLETE );
+        }
+    else
+        {
+        feed_status = -1;
+        /* Log Here */
+        }
+     return ( feed_status );
+     }
+
+
+
+int srec_test_flush_audio ( ApplicationData *data, SR_RecognizerStatus *esr_recog_status, SR_RecognizerResultType *result_type )
+    {
+    int             flush_status;
+    ESR_ReturnCode  esr_status;
+
+    flush_status = 0;
+
+    while ( ( *result_type ) != SR_RECOGNIZER_RESULT_TYPE_COMPLETE )
+        {
+        esr_status = SR_RecognizerAdvance ( data->recognizer, esr_recog_status, result_type, &data->result );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            flush_status = -1;
+            *esr_recog_status = SR_RECOGNIZER_EVENT_STOPPED;
+            *result_type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+            /* Log Here */
+            }
+        }
+    return ( flush_status );
+    }
+
+
+
+int srec_test_process_start_timeout ( ApplicationData *data, FILE *results_file )
+    {
+    int             process_status;
+    ESR_ReturnCode  esr_status;
+    size_t          utterance_timeout;
+
+    process_status = 0;
+    esr_status = ESR_SessionGetSize_t ( L("SREC.Recognizer.utterance_timeout"), &utterance_timeout );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        LFPRINTF ( results_file, L("E: utterance_timeout %lu\n"), (unsigned long)utterance_timeout );
+        LFPRINTF ( results_file, L("R: <FAILED>\n") );
+        LPRINTF ( L("\n-------------------------------------\n") );
+        LPRINTF ( L("E: utterance_timeout %lu\n"), (unsigned long)utterance_timeout );
+        LPRINTF ( L("R: <FAILED>\n") );
+        LPRINTF ( L("-------------------------------------\n\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    srec_test_log_recognition_failure ( data );
+
+    return ( process_status );
+    }
+
+
+int srec_test_write_and_log_wave_form_file ( ApplicationData *data, size_t recognition_count )
+    {
+    int                 write_status;
+    ESR_ReturnCode      esr_status;
+    LCHAR               *wave_filename;
+
+    write_status = 0;
+    LSPRINTF ( data->raw_waveform_filename, L("a%lu__%s.raw"), (unsigned long)recognition_count, data->transcription );
+    wave_filename = data->raw_waveform_filename;
+
+    while ( *wave_filename )
+        {
+        if ( *wave_filename == ' ')
+            *wave_filename = '_';
+        wave_filename++;
+        }
+/* just write to file for now... for testing purposes */
+    LPRINTF ( L("Dumping audio waveform to file %s\n"), data->raw_waveform_filename );
+    data->raw_waveform_file = pfopen ( data->raw_waveform_filename, L("wb") );
+
+    if ( data->raw_waveform_file != NULL )
+        {
+        pfwrite ( (void*)data->raw_waveform, 1, data->raw_waveform_size, data->raw_waveform_file );
+        pfclose ( data->raw_waveform_file );
+/* log the filename in the ESR log */
+        esr_status = SR_RecognizerLogToken ( data->recognizer, "WVFMFILENAME", data->raw_waveform_filename );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            write_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        write_status = -1;
+        /* Log Here */
+        }
+    return ( write_status );
+    }
+
+
+
+int srec_test_process_nbest_list ( ApplicationData *data, FILE *results_file )
+{
+  int                 process_status;
+  ESR_ReturnCode      esr_status;
+  size_t              nbestSize;
+  size_t              nbest_num;
+  LCHAR               linebuffer [MAX_LINE_LENGTH];
+  size_t              line_length;
+  
+  process_status = 0;
+  /* At least one semantic result exists */
+  LPRINTF ( L("\n\n----------------------------------------------\n") );
+  
+  LPRINTF ( L("TRANSCRIPTION    : '%s'\n"), data->transcription );
+  esr_status = SR_RecognizerResultGetSize (data->result, &nbestSize );
+  
+  if ( esr_status == ESR_SUCCESS )
+    {
+      for ( nbest_num = 0; nbest_num < nbestSize; nbest_num++ )
+        {
+          line_length =  MAX_LINE_LENGTH;
+          esr_status = SR_RecognizerResultGetValue ( data->result, nbest_num, L("literal"), linebuffer, &line_length );
+          
+          if ( esr_status == ESR_SUCCESS )
+            {
+              LPRINTF ( L("LITERAL[%2lu]      : '%s'\n"), (unsigned long)nbest_num, linebuffer );
+              line_length = MAX_LINE_LENGTH;
+              esr_status = SR_RecognizerResultGetValue ( data->result, nbest_num, L("meaning"), linebuffer, &line_length );
+              
+              if ( esr_status != ESR_SUCCESS )
+                {
+                  linebuffer [0] = L('\0') ;
+                }
+              LPRINTF ( L("MEANING[%2lu]      : '%s'\n"), (unsigned long)nbest_num, linebuffer );
+              
+              line_length =  MAX_LINE_LENGTH;
+              esr_status = SR_RecognizerResultGetValue (data->result, nbest_num , L("conf"), linebuffer, &line_length );
+              if ( esr_status == ESR_SUCCESS )
+                {
+                  LPRINTF ( L("CONFIDENCE VALUE : '%s'\n"), linebuffer );
+                }
+              else
+                {
+                  process_status = -1;
+                  /* Log Here */
+                }
+              
+              line_length = MAX_LINE_LENGTH;
+              esr_status = SR_RecognizerResultGetValue (data->result, nbest_num, L("raws"), linebuffer, &line_length );
+              
+              if ( esr_status == ESR_SUCCESS )
+                {
+                  LPRINTF ( L("RAW SCORE[%2lu]    : '%s'\n"), (unsigned long)nbest_num, linebuffer);
+                }
+              else
+                {
+                  process_status = -1;
+                  /* Log Here */
+                }
+#ifdef SREC_ENGINE_VERBOSE_LOGGING
+              if(1) {
+                /* get ALL key value pairs */
+                LCHAR *keys[32], keysdata[128*32];
+                size_t k,key_count = sizeof(keys)/sizeof(keys[0]);
+                for(k=0;k<key_count;k++) keys[k] = &keysdata[128*k];
+                // esr_status = SR_RecognizerResultGetKeyCount(data->result, nbest_num, &key_count);
+                esr_status = SR_RecognizerResultGetKeyList(data->result, nbest_num, (LCHAR**)keys, &key_count);
+                if(esr_status == ESR_SUCCESS) {
+                  for (k=0; k<key_count; k++) {
+                    LCHAR value[128];
+                    size_t valuelen = sizeof(value)/sizeof(value[0]);
+                    esr_status = SR_RecognizerResultGetValue( data->result, nbest_num, keys[k], value, &valuelen);
+                    if(esr_status==ESR_SUCCESS)
+                      LPRINTF( L("%s[%2lu] : '%s'\n"), keys[k], (unsigned long)nbest_num, value);
+                  }
+                }
+              }
+#endif
+              LPRINTF ( L("\n"));
+            }
+          else
+            {
+              process_status = -1;
+              /* Log Here */
+            }
+        }
+    }
+  else
+    {
+      process_status = -1;
+      /* Log Here */
+    }
+  
+  LPRINTF ( L("----------------------------------------------\n\n") );
+  return ( process_status );
+}
+
+
+
+int srec_test_process_recognition ( ApplicationData *data, FILE *results_file, size_t recognition_count )
+{
+  int                 process_status;
+  ESR_ReturnCode      esr_status;
+  APPL_GRAMMAR_DATA   *grammar_data;
+  LCHAR               linebuffer [MAX_LINE_LENGTH];
+  size_t              line_length;
+  
+  process_status = 0;
+  srec_test_get_active_grammar_data ( data, &grammar_data );
+
+  do {
+    line_length = MAX_LINE_LENGTH;
+    esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("literal"), linebuffer, &line_length );
+    
+    if ( esr_status != ESR_SUCCESS ) break;
+    LFPRINTF ( results_file, L("R: %s\n"), linebuffer );
+    line_length = MAX_LINE_LENGTH;
+    esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("conf"), linebuffer, &line_length );
+    
+    if ( esr_status != ESR_SUCCESS ) break;
+
+    LFPRINTF ( results_file, L("S: %s\n"), linebuffer);
+    LPRINTF ( L("S: %s\n"), linebuffer);
+    srec_test_process_nbest_list ( data, results_file );
+    /*
+     * SR_RecognizerResultGetWaveform will return pointer to buffer holding
+     * audio data in it. This buffer is NOT under the application's control
+     * and MUST only be read from.
+     */
+    if ( grammar_data->is_ve_grammar == ESR_TRUE )
+      {
+	esr_status = SR_NametagCreate ( data->result, L("dummyID"), &data->nametag );
+	if(esr_status != ESR_SUCCESS) { 
+	  LPRINTF ( L("VoiceEnrollment=>FAILURE\n") );
+	  break;
+	}
+	LPRINTF ( L("VoiceEnrollment=>SUCCESS\n") );
+	if(1) {
+	  const char* value = NULL;
+	  size_t len, len2;
+	  char* value2;
+	  /* this is to mimic what might happen in a real application */
+	  esr_status = SR_NametagGetValue( data->nametag, &value, &len);
+	  value2 = (char*)CALLOC(len, sizeof(char), "srectest.nametag");
+	  len2 = len;
+	  memcpy( value2, value, len);
+	  esr_status = SR_NametagDestroy(data->nametag);
+	  data->nametag = NULL;
+	  if(esr_status != ESR_SUCCESS) break;
+	  /* in a real application we would save the nametag value someplace
+	     along with the data->raw_waveform, then retrieve it and create a 
+	     nametag from that value */
+	  esr_status = SR_NametagCreateFromValue( L("dummyID"),  value2, len2, &data->nametag);
+	  FREE( value2);
+	  value2 = NULL;
+	}
+	if ( esr_status != ESR_SUCCESS ) break;
+
+	esr_status = SR_RecognizerResultGetWaveform ( data->result, &data->raw_waveform, &data->raw_waveform_size );
+	if( esr_status != ESR_SUCCESS ) break;
+
+	if ( data->raw_waveform )
+	  {
+	    process_status = srec_test_write_and_log_wave_form_file ( data, recognition_count );
+	    
+	    if ( process_status == 0 )
+	      {
+		esr_status = SR_RecognizerLogEvent ( data->recognizer, "ESRve" );
+	      }
+	    else {
+	      esr_status = ESR_INVALID_STATE;
+	    }
+	  }
+      }
+    process_status = 0;
+  } while(0);
+  if( esr_status != ESR_SUCCESS) {
+        process_status = -1;
+        /* Log Here */
+  }
+  return ( process_status );
+}
+
+
+
+int srec_test_process_recognition_fail ( ApplicationData *data )
+    {
+    int                 process_status;
+    ESR_ReturnCode      esr_status;
+    APPL_GRAMMAR_DATA   *grammar_data;
+    ESR_BOOL                reason_status;
+
+    process_status = 0;
+    srec_test_get_active_grammar_data ( data, &grammar_data );
+    LPRINTF(L("*** no match in recognition***\n"));
+
+    if ( grammar_data->is_ve_grammar == ESR_TRUE )
+        {
+        data->nametag = NULL;
+        LPRINTF ( L("VoiceEnrollement = FAILED : \n") );
+        }
+    esr_status = SR_RecognizerIsSignalClipping ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal is clipping\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalDCOffset ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal is DC-offset\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalNoisy ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal is noisy\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalTooFewSamples ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal has too few samples\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalTooManySamples ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal has too many samples\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalTooQuiet ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal is too quiet\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    srec_test_log_recognition_failure ( data );
+    return ( process_status );
+    }
+
+
+
+int srec_test_process_recognition_unsupported_case ( ApplicationData *data, FILE *results_file )
+    {
+    int process_status;
+
+    process_status = 0;
+    LFPRINTF ( results_file, L("E: No results available\n") );
+    LFPRINTF ( results_file, L("R: <FAILED>\n") );
+    srec_test_log_recognition_failure ( data );
+
+    return ( process_status );
+    }
+
+
+
+static void srec_test_log_recognition_failure ( ApplicationData *data )
+    {
+
+    LPRINTF(L("----------------------------------------------\n"));
+    LPRINTF(L("TRANSCRIPTION    : '%s'\n"), data->transcription);
+    LPRINTF(L("<NO-RESULTS>\n"));
+    LPRINTF(L("----------------------------------------------\n\n"));
+    }
+
+
+
+int srec_test_process_results ( ApplicationData *data, SR_RecognizerStatus esr_recog_status,
+                                FILE *results_file, size_t recognition_count )
+    {
+    int process_status;
+
+    switch ( esr_recog_status )
+        {
+        case SR_RECOGNIZER_EVENT_START_OF_UTTERANCE_TIMEOUT:
+            process_status = srec_test_process_start_timeout ( data, results_file );
+            break;
+
+        case SR_RECOGNIZER_EVENT_RECOGNITION_RESULT:
+            process_status = srec_test_process_recognition ( data, results_file, recognition_count );
+            break;
+
+        case SR_RECOGNIZER_EVENT_NO_MATCH:
+            process_status = srec_test_process_recognition_fail ( data );
+            break;
+
+        default:
+            process_status = srec_test_process_recognition_unsupported_case ( data, results_file );
+            break;
+        }
+    return ( process_status );
+    }
+
+
+
+int srec_test_log_reco_from_file_data ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *waveform, LCHAR *bos, LCHAR *eos, LCHAR *transcription )
+    {
+    int             log_status;
+    ESR_ReturnCode  esr_status;
+    size_t          result_count;
+    ESR_BOOL            got_results;
+    size_t          transcription_length;
+
+    log_status = 0;
+    LSPRINTF ( data->transcription, "%s", transcription );
+    transcription_length = LSTRLEN ( data->transcription );
+
+    while ( ( *( data->transcription + transcription_length - 1 ) == '\n' ) ||
+            ( *( data->transcription + transcription_length - 1 ) == '\r' ) )
+        {
+	  *( data->transcription + transcription_length - 1 ) = '\0';
+	  transcription_length--;
+        }
+  LPRINTF ( L("D: %s\nC: %s\n"), waveform, data->transcription );
+
+    esr_status = SR_GrammarCheckParse ( active_grammar, data->transcription, 0, &result_count );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( result_count > 0 )
+            {
+#ifdef ACCURACY_TESTING
+	      LCHAR meaning[MAX_LINE_LENGTH] = { 0 };
+	      size_t len  = MAX_LINE_LENGTH;
+	      got_results = ESR_TRUE;
+	      LPRINTF ( L("Sem (%lu):  invocab=1\n"), (unsigned long)result_count );
+	      srec_test_parse ( active_grammar, transcription, meaning, &len);
+	      if(LSTRLEN(meaning)>0) 
+		LPRINTF( L("CSem: %s\n"), meaning);
+#else
+	      got_results = ESR_TRUE;
+	      LPRINTF ( L("Sem (%lu):  invocab=1\n"), (unsigned long)result_count );
+#endif
+            }
+        else
+            {
+            got_results = ESR_FALSE;
+            LPRINTF ( L("Sem:  <NO INTERPRETATION FOUND>\n") );
+            LPRINTF ( L("CSem: <NO INTERPRETATION FOUND>\n") );
+	    }
+        esr_status = SR_RecognizerLogWaveformData ( data->recognizer, waveform, data->transcription, atof ( bos ), atof ( eos ), got_results );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            log_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        log_status = -1;
+        /* Log Here */
+        }
+
+    return ( log_status );
+    }
+
+
+
+static int srec_test_recognize_pcm_file ( SR_Grammar *active_grammar, ApplicationData *data, FILE *results_file,
+                                          LCHAR *command_text, size_t *recognition_count )
+    {
+    int                     recognize_status;
+    ESR_ReturnCode          esr_status;
+    SR_RecognizerStatus     esr_recog_status;
+    SR_RecognizerResultType result_type;
+    LCHAR                   *transcription;
+    LCHAR                   waveform [MAX_LINE_LENGTH];
+    LCHAR                   bos [MAX_LINE_LENGTH];
+    LCHAR                   eos [MAX_LINE_LENGTH];
+    PFile                   *waveform_file;
+    ESR_BOOL                    hit_eof;
+
+    if ( active_grammar != NULL )
+        {
+        recognize_status = srec_test_get_three_command_items ( command_text, MAX_LINE_LENGTH, waveform,
+                                                              MAX_LINE_LENGTH, bos, MAX_LINE_LENGTH,
+                                                              eos, NULL, &transcription );
+	while( *transcription == ' ' ) transcription++;
+        if ( recognize_status == 0 )
+            {
+            recognize_status = srec_test_log_reco_from_file_data ( active_grammar, data, waveform, bos, eos, transcription );
+
+            if ( recognize_status == 0 )
+                {
+				if(LSTRCMP(bos,"0") || LSTRCMP(eos,"0")) {
+					PLogError( ("Error: non-zero BOS and non-zero EOS are not supported\n"));
+					return -1;
+				}
+                recognize_status = srec_test_open_pcm_file ( waveform, &waveform_file );
+
+                if ( recognize_status == 0 )
+                    {
+                    if ( ( data->forced_rec_mode == ForcedRecModeOn ) || ( data->forced_rec_mode == ForcedRecModeOneTime ) )
+                        SR_GrammarAllowOnly ( active_grammar, data->transcription );
+                    esr_status = SR_RecognizerStart ( data->recognizer );
+
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                        ( *recognition_count )++;
+                        hit_eof = ESR_FALSE;
+
+                        do
+                            {
+                            recognize_status = srec_test_get_audio_from_file ( waveform_file, data, &hit_eof );
+
+                            if ( recognize_status == 0 )
+                                recognize_status = srec_test_feed_recognizer ( data, hit_eof, &esr_recog_status, &result_type  );
+                            }
+                        while ( ( hit_eof == ESR_FALSE ) && ( result_type != SR_RECOGNIZER_RESULT_TYPE_COMPLETE ) && ( recognize_status == 0 ) );
+
+                        if ( recognize_status == 0 )
+                            {
+                            recognize_status = srec_test_flush_audio ( data, &esr_recog_status, &result_type );
+
+                            if ( recognize_status == 0 )
+                                {
+                                recognize_status = srec_test_process_results ( data, esr_recog_status,
+                                                                               results_file, *recognition_count );
+                                }
+                            }
+                        esr_status = SR_RecognizerStop ( data->recognizer );
+
+                        if (esr_status == ESR_SUCCESS )
+                            {
+                            LPRINTF ( L("Recognizer has been stopped\n") );
+                            }
+                        else
+                            {
+                            recognize_status = -1;
+                            LPRINTF ( L("Recognizer has failed to stop\n") );
+                            }
+                        }
+                    if ( data->forced_rec_mode == ForcedRecModeOneTime )
+                        {
+                        data->forced_rec_mode = ForcedRecModeOff;
+                        SR_GrammarAllowAll ( active_grammar );
+                        }
+                    srec_test_close_audio_file ( waveform_file );
+                    }
+                }
+            }
+        }
+     else
+         {
+         recognize_status = -1;
+         /* Log Here */
+         }
+     return ( recognize_status );
+     }
+
+
+
+static int srec_test_recognize_nist_file ( SR_Grammar *active_grammar, ApplicationData *data, FILE *results_file,
+                                           LCHAR *command_text, size_t *recognition_count )
+    {
+    int                     recognize_status;
+    ESR_ReturnCode          esr_status;
+    SR_RecognizerStatus     esr_recog_status;
+    SR_RecognizerResultType result_type;
+    LCHAR                   *transcription;
+    LCHAR                   waveform [MAX_LINE_LENGTH];
+    LCHAR                   bos [MAX_LINE_LENGTH];
+    LCHAR                   eos [MAX_LINE_LENGTH];
+    PFile                   *waveform_file;
+    ESR_BOOL                    hit_eof;
+
+    if ( active_grammar != NULL )
+        {
+        recognize_status = srec_test_get_three_command_items ( command_text, MAX_LINE_LENGTH, waveform,
+                                                              MAX_LINE_LENGTH, bos, MAX_LINE_LENGTH,
+                                                              eos, NULL, &transcription );
+	while( *transcription == ' ' ) transcription++;
+        if ( recognize_status == 0 )
+            {
+            recognize_status = srec_test_log_reco_from_file_data ( active_grammar, data, waveform, bos, eos, transcription );
+
+            if ( recognize_status == 0 )
+                {
+				if(LSTRCMP(bos,"0") || LSTRCMP(eos,"0")) {
+					PLogError( ("Error: non-zero BOS and non-zero EOS are not supported\n"));
+					return -1;
+				}
+                recognize_status = srec_test_open_nist_file ( waveform, &waveform_file );
+
+                if ( recognize_status == 0 )
+                    {
+                    if ( ( data->forced_rec_mode == ForcedRecModeOn ) || ( data->forced_rec_mode == ForcedRecModeOneTime ) )
+                        SR_GrammarAllowOnly ( active_grammar, data->transcription );
+                    esr_status = SR_RecognizerStart ( data->recognizer );
+
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                        ( *recognition_count )++;
+                        hit_eof = ESR_FALSE;
+
+                        do
+                            {
+                            recognize_status = srec_test_get_audio_from_file ( waveform_file, data, &hit_eof );
+
+                            if ( recognize_status == 0 )
+                                recognize_status = srec_test_feed_recognizer ( data, hit_eof, &esr_recog_status, &result_type  );
+                            }
+                        while ( ( hit_eof == ESR_FALSE ) && ( result_type != SR_RECOGNIZER_RESULT_TYPE_COMPLETE ) && ( recognize_status == 0 ) );
+
+                        if ( recognize_status == 0 )
+                            {
+                            recognize_status = srec_test_flush_audio ( data, &esr_recog_status, &result_type );
+
+                            if ( recognize_status == 0 )
+                                {
+                                recognize_status = srec_test_process_results ( data, esr_recog_status,
+                                                                               results_file, *recognition_count );
+                                }
+                            }
+                        }
+                        esr_status = SR_RecognizerStop ( data->recognizer );
+
+                        if (esr_status == ESR_SUCCESS )
+                            {
+                            LPRINTF ( L("Recognizer has been stopped\n") );
+                            }
+                        else
+                            {
+                            recognize_status = -1;
+                            LPRINTF ( L("Recognizer has failed to stop\n") );
+                            }
+                    if ( data->forced_rec_mode == ForcedRecModeOneTime )
+                        {
+                        data->forced_rec_mode = ForcedRecModeOff;
+                        SR_GrammarAllowAll ( active_grammar );
+                        }
+                    srec_test_close_audio_file ( waveform_file );
+                    }
+                }
+            }
+        }
+     else
+         {
+         recognize_status = -1;
+         /* Log Here */
+         }
+     return ( recognize_status );
+     }
+
+
+
+#define STACK_SIZE (1024 * 200)
+
+#ifdef _WIN32
+/* disable optimization for the next functions as the compiler optimizes away the assignment to mySTACK[i] */
+#pragma optimize("", off)
+
+static void initStack()
+{
+  int mySTACK[STACK_SIZE];
+ {
+   /* This extra block is to ensure that local variables of the function occur after buffer mySTACK. */
+   int i;
+
+   for (i = 0; i < STACK_SIZE; ++i)
+   {
+     mySTACK[i] = 0xDEADBEEF;
+   }
+ }
+}
+
+static int analyzeStack()
+{
+  int mySTACK[STACK_SIZE];
+ {
+
+   /* This extra block is to ensure that local variables of the function occur after buffer mySTACK. */
+   int i, j;
+
+   for (i = STACK_SIZE - 1; i >= 0; --i)
+   {
+     if (mySTACK[i] == 0xDEADBEEF)
+     {
+       /* This might be a candidate for the end of stack marker, or it could be
+          some value that is equal to our marker.  To ensure reliability of
+          this candidate, we will make sure that all remaining entries int the
+          stack are also equal to DEADBEEF.
+       */
+       for (j = i - 1; j >= 0; --j)
+       {
+         if (mySTACK[j] != 0xDEADBEEF)
+         {
+           i = j;
+           break;
+         }
+       }
+       if (j < 0) break;
+     }
+   }
+
+   if (i < 0)
+     return -1;
+   else
+     return (STACK_SIZE - 1 - i) * sizeof(int);
+ }
+}
+
+/* restore optmization settings to what they used to be. */
+#pragma optimize("", on)
+#endif
+
+
+#ifdef ACCURACY_TESTING
+static void srec_test_clean_up_sentence ( char* sentence )
+    {
+    int                         clean_up_status;
+    int                         sentence_finished;
+    SENTENCE_CLEANING_STATES    current_state;
+    char                        *current_input;
+    char                        *current_output;
+
+    clean_up_status = 0;
+    sentence_finished = 0;
+    current_state = SENTENCE_BEGIN;
+    current_input = sentence;
+    current_output = sentence;
+    strtok( sentence, "\n\r");
+
+    do
+        {
+        switch ( *current_input )
+            {
+            case '\0':
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:  /* Is this error condition */
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        *current_output = '\0';
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = '\0';
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */
+                        *( current_output - 1 ) = '\0';
+                        clean_up_status = -1;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        *( current_output - 1 ) = '\0';
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        *( current_output - 1 ) = '\0';
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        /* Log error */
+                        break;
+                    }
+                sentence_finished = 1;
+                break;
+
+            case ' ':
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = ' ';
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE_WITH_SPACE;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+                    }
+                current_input++;
+                break;
+
+            case '[':
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        current_state = SENTENCE_BEGIN_BRACKET_BEGIN;
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        current_state = SENTENCE_BEGIN_BRACKET_BEGIN;
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = ' ';
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE_BRACKET_BEGIN;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        current_state = SENTENCE_MIDDLE_BRACKET_BEGIN;
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        current_state = SENTENCE_MIDDLE_BRACKET_BEGIN;
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+                    }
+                current_input++;
+                break;
+
+            case ']':
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:
+                        current_state = SENTENCE_BEGIN_BRACKET_END;
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */
+                        current_state = SENTENCE_MIDDLE_BRACKET_END;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+                    }
+                current_input++;
+                break;
+
+            default:
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN:
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+                    }
+                current_input++;
+                break;
+            }
+        }
+    while ( ( sentence_finished == 0 ) && ( clean_up_status == 0 ) );
+    }
+
+
+
+ESR_ReturnCode srec_test_parse ( SR_Grammar* grammar, const LCHAR* trans, LCHAR* meaning, size_t *len )
+    {
+    ESR_ReturnCode      parse_status;
+    char                cleaned_trans[TRANSCRIPTION_SIZE];
+    SR_SemanticResult   *semanticResults;
+    size_t              result_count;
+
+    result_count = 0;
+    strcpy( cleaned_trans, trans );
+    srec_test_clean_up_sentence ( cleaned_trans );
+
+  /* create the result holders, initially not greater than MAX */
+    parse_status = SR_SemanticResultCreate ( &semanticResults );
+
+    if ( parse_status == ESR_SUCCESS )
+        {
+        result_count = 1;
+        parse_status = SR_SemanticProcessor_Flush( ( (SR_GrammarImpl*)grammar )->semproc );
+
+        if ( parse_status == ESR_SUCCESS )
+            {
+            parse_status = SR_SemanticProcessor_SetParam( ((SR_GrammarImpl*)grammar)->semproc, L("literal"), cleaned_trans );
+
+            if ( parse_status == ESR_SUCCESS )
+                { 
+                parse_status = SR_GrammarCheckParse( grammar, cleaned_trans, &semanticResults, (size_t*)&result_count );
+
+                if ( parse_status == ESR_SUCCESS )
+                    {
+                    if ( result_count < 1 )
+                        {
+                        LSTRCPY ( meaning, L("") );
+                        SR_SemanticResultDestroy( semanticResults);
+                        parse_status = ESR_NO_MATCH_ERROR;
+                        }
+                    else
+                        {
+                        parse_status = SR_SemanticResultGetValue ( semanticResults, "meaning", meaning, len);
+                        SR_SemanticResultDestroy( semanticResults);
+                        }
+                    }
+                }
+            }
+        }
+    return ( parse_status );
+    }
+#endif
+
+
+static int srec_test_get_run_params ( unsigned int *num_shutdown_loops, unsigned int *num_continuous_run_loops )
+    {
+    int get_status;
+
+    get_status = get_num_srec_test_shutdown_times ( num_shutdown_loops );
+
+    if ( get_status == 0 )
+                get_status = get_num_srec_test_continuous_loops ( num_continuous_run_loops );
+
+    return ( get_status );
+    }
+
+
+
+static int srec_test_shutdown_application_data ( ApplicationData *applicationData )
+    {
+    int init_status;
+    int i;
+
+    init_status = 0;
+
+    applicationData->argc = 0;
+    applicationData->argv = NULL;
+    applicationData->locale = -1;
+
+    if (applicationData->recognizer != NULL)
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Recognizer") );
+/*        SR_RecognizerLogSessionEnd ( applicationData->recognizer );
+        SR_RecognizerDestroy ( applicationData->recognizer );*/
+        applicationData->recognizer = NULL;
+        applicationData->result = NULL;                 // this was deallocated by SR_RecognizerDestroy()
+        }
+
+    if (applicationData->vocabulary != NULL)
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Vocabulary") );
+/*        SR_VocabularyDestroy(applicationData->vocabulary);
+        applicationData->vocabulary = NULL;*/
+        }
+
+    if (applicationData->nametag != NULL)
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup NameTag") );
+/*        SR_NametagDestroy(applicationData->nametag);
+        applicationData->nametag = NULL;*/
+        }
+
+    if (applicationData->nametags != NULL)
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup NameTagSet") );
+/*        SR_NametagsDestroy(applicationData->nametags);
+        applicationData->nametags = NULL;*/
+        }
+
+    for (i = 0; i < applicationData->grammarCount; ++i)
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Grammar") );
+/*
+        if ( applicationData->grammars [i] != NULL )
+            {
+            printf ( "!!!!!!!!  %d Grammars Not Destroyed !!!!!!!!!!!!\n", i );
+            SR_GrammarDestroy(applicationData->grammars[i]);
+            applicationData->grammars[i] = NULL;
+            }
+        }
+
+    applicationData->activeGrammar = -1;
+    applicationData->activeRule = NULL;
+    applicationData->voiceEnrollment = NULL;
+*/
+    applicationData->raw_waveform = NULL;
+    applicationData->raw_waveform_filename [0] = L( '\0' );
+    applicationData->raw_waveform_file = NULL;
+    applicationData->transcription[0] = L( '\0' );
+    applicationData->forced_rec_mode = ForcedRecModeNotSet;
+
+    return ( init_status );
+    }
+
+
+
+static int srec_test_init_application_data ( ApplicationData *applicationData, int arg_count, LCHAR *arg_vals [] )
+    {
+    int init_status;
+
+    init_status = 0;
+    applicationData->argc = arg_count;
+    applicationData->argv = arg_vals;
+    applicationData->locale = -1;
+    applicationData->recognizer = NULL;
+    applicationData->result = NULL;
+    applicationData->vocabulary = NULL;
+    applicationData->nametag = NULL;
+    applicationData->nametags = NULL;
+    applicationData->grammarCount = 0;  /* No need to initialize arrays, index is 0 */
+    applicationData->active_grammar_num = -1;
+/*    applicationData->activeRule = NULL;
+    applicationData-> = applicationData->voiceEnrollment = NULL;*/
+    applicationData->audio_buffer_requested_size = DEFAULT_AUDIO_BUFFER_SIZE;
+    applicationData->raw_waveform = NULL;
+    applicationData->raw_waveform_filename [0] = L( '\0' );
+    applicationData->raw_waveform_file = NULL;
+    applicationData->transcription[0] = L( '\0' );
+    applicationData->forced_rec_mode = ForcedRecModeNotSet;
+    return ( init_status );
+    }
+
+
+static int srec_test_run_test_shutdown_session ( ApplicationData *applicationData )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+
+    SR_RecognizerUnsetup ( applicationData->recognizer); // releases acoustic models
+    SR_RecognizerDestroy ( applicationData->recognizer );
+    applicationData->recognizer = NULL;
+    ShutdownSession ( );
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_run_test_init_session ( ApplicationData *applicationData )
+{
+  int             run_status;
+  ESR_ReturnCode  esr_status;
+
+  run_status = 0;
+  LPRINTF(L("\nCreate Recognizer:\n"));
+  LPRINTF(L("    InitSession()\n"));
+  esr_status = InitSession ( applicationData->argc, applicationData->argv );
+
+  if ( esr_status == ESR_SUCCESS )
+    {
+      LPRINTF(L("    SR_RecognizerCreate()\n"));
+      esr_status = SR_RecognizerCreate ( &applicationData->recognizer );
+
+      if ( esr_status != ESR_SUCCESS )
+    {
+      ShutdownSession ( );
+      run_status = -1;
+      /* Log Here */
+    } else {
+      LPRINTF(L("    SR_RecognizerSetup()\n"));
+      esr_status = SR_RecognizerSetup ( applicationData->recognizer);
+      if ( esr_status != ESR_SUCCESS )
+        {
+          ShutdownSession ( );
+          run_status = -1;
+          /* Log Here */
+        }
+    }
+    }
+  return ( run_status );
+}
+
+
+static int srec_test_run_test_shutdown_vocab_grammar ( ApplicationData *applicationData )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+    SR_RecognizerLogSessionEnd ( applicationData->recognizer );
+/*    SR_GrammarDestroy ( applicationData->grammars [0].grammar );
+    applicationData->grammars [0].grammar = NULL;*/
+    SR_VocabularyDestroy ( applicationData->vocabulary );
+    applicationData->vocabulary = NULL;
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_run_test_init_vocab_grammar ( ApplicationData *applicationData )
+    {
+    int             run_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           filename[P_PATH_MAX];
+    size_t          len;
+
+    run_status = 0;
+   /* Create vocabulary object and associate with grammar */
+    LPRINTF(L("Create vocabulary object and associate with grammar:\n"));
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), filename, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        LPRINTF(L("    SR_VocabularyLoad()\n"));
+        esr_status = SR_VocabularyLoad ( filename, &applicationData->vocabulary );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            LPRINTF(L("    SR_VocabularyGetLanguage()\n"));
+            esr_status =  SR_VocabularyGetLanguage ( applicationData->vocabulary, &applicationData->locale );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                /* start a new log session */
+                LPRINTF( L("Start a new log session:\n") );
+                LPRINTF( L("    SR_RecognizerLogSessionStart()\n") );
+                esr_status = SR_RecognizerLogSessionStart ( applicationData->recognizer, L("SRecTest.session1") );
+
+                if ( esr_status != ESR_SUCCESS )
+                    {
+                    SR_VocabularyDestroy ( applicationData->vocabulary );
+                    applicationData->vocabulary = NULL;
+                    run_status = -1;
+                    /* Log here */
+                    }
+                }
+            else
+                {
+                SR_VocabularyDestroy ( applicationData->vocabulary );
+                applicationData->vocabulary = NULL;
+                run_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            run_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        run_status = -1;
+        /* Log Here */
+        }
+    return ( run_status );
+    }
+
+
+
+static int srec_test_run_test_shutdown ( ApplicationData *applicationData )
+    {
+    int shutdown_status;
+
+    shutdown_status = srec_test_run_test_shutdown_vocab_grammar ( applicationData );
+
+        if ( shutdown_status == 0 )
+            shutdown_status = srec_test_run_test_shutdown_session ( applicationData );
+    return ( shutdown_status );
+    }
+
+
+static int srec_test_run_test_init ( ApplicationData *applicationData )
+{
+  int run_status;
+
+  run_status = srec_test_run_test_init_session ( applicationData );
+
+  if ( run_status == 0 )
+    {
+      run_status = srec_test_run_test_init_vocab_grammar ( applicationData );
+
+      if ( run_status != 0 )
+    {
+      srec_test_run_test_shutdown_session ( applicationData );
+    }
+    }
+  else
+    {
+      srec_test_run_test_shutdown_session ( applicationData );
+    }
+  return ( run_status );
+}
+
+
+
+static int srec_test_run_test_execute ( ApplicationData *applicationData )
+    {
+    int             run_status;
+    ESR_ReturnCode  esr_status;
+
+    run_status = 0;
+    applicationData->nametag = NULL;
+
+    LPRINTF(L("Recognize:\n"));
+    LPRINTF(L("    SR_NametagsCreate()\n"));
+    esr_status = SR_NametagsCreate ( &applicationData->nametags );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        run_status = srec_test_process_commands ( applicationData );
+        SR_NametagsDestroy ( applicationData->nametags );
+        applicationData->nametags = NULL;
+
+        if ( run_status != 0 )
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        run_status = -1;
+        /* Log Here */
+        }
+    return ( run_status );
+    }
+
+
+
+static int srec_test_run_test ( ApplicationData *applicationData )
+    {
+    int run_status;
+
+    run_status = srec_test_run_test_init ( applicationData );
+
+    if ( run_status == 0 )
+        {
+        run_status = srec_test_run_test_execute ( applicationData );
+        srec_test_run_test_shutdown ( applicationData );
+        }
+    return ( run_status );
+    }
+
+
+
+static int srec_test_shutdown_memory_system ( void )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+    PMemShutdown ( );
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_init_memory_system ( unsigned int srec_test_heap_size )
+    {
+    int             init_status;
+    ESR_ReturnCode  esr_status;
+
+    init_status = 0;
+    esr_status = PMemInit ( );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        PSTACK_SIZE_INIT ( );   /* I don't know what this is, it should probably have a status */
+        }
+    else
+        {
+        init_status = -1;
+        /* Log Here */
+        }
+    return ( init_status );
+    }
+
+
+
+static int srec_test_shutdown_file_system ( void )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_init_file_system ( int arg_count, LCHAR *arg_vals [] )
+    {
+    int             init_status;
+
+    init_status = 0;
+    return ( init_status );
+    }
+
+
+
+static int srec_test_shutdown_logging_system ( PLogger *logger )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+    PLogShutdown ( );
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_init_logging_system ( int arg_count, LCHAR *arg_vals [], PLogger *logger )
+    {
+    int             init_status;
+    ESR_ReturnCode  esr_status;
+
+    init_status = 0;
+    esr_status = PLogCreateFileLogger ( PSTDOUT, &logger );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        esr_status = PLogInit ( logger, 0 );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+/*          pfclose ( (struct PFile_t *)logger );       I'm not sure this is correct, check with Gili */
+            init_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        init_status = -1;
+        /* Log Here */
+        }
+    return ( init_status );
+    }
+
+
+
+static int srec_test_shutdown_system ( PLogger *logger )
+    {
+    int shutdown_status;
+
+    shutdown_status = srec_test_shutdown_logging_system ( logger );
+
+    if ( shutdown_status == 0 )
+        {
+        shutdown_status = srec_test_shutdown_file_system ( );
+
+        if ( shutdown_status == 0 )
+            shutdown_status = srec_test_shutdown_memory_system ( );
+        }
+    return ( shutdown_status );
+    }
+
+
+
+
+static int srec_test_init_system ( unsigned int srec_test_heap_size, PLogger* logger, int arg_count, LCHAR *arg_vals [] )
+    {
+    int init_status;
+
+   /* register signal handler so cleanup works on CTRL-C (Win32) */
+#ifdef _WIN32
+    signal(SIGINT, signal_handler_SIGINT);
+#endif
+    init_status = srec_test_init_memory_system ( srec_test_heap_size );
+
+    if ( init_status == 0 )
+        {
+        init_status = srec_test_init_file_system ( arg_count, arg_vals );
+
+        if ( init_status == 0 )
+            {
+            init_status = srec_test_init_logging_system ( arg_count, arg_vals, logger );
+
+            if ( init_status != 0 )
+                {
+                srec_test_shutdown_file_system ( );
+                srec_test_shutdown_memory_system ( );
+                }
+            }
+        else
+            {
+            srec_test_shutdown_memory_system ( );
+            }
+        }
+    return ( init_status );
+    }
+
+
+
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+_CrtMemState s0,s1,s2;
+
+
+
+void OutputDivider( void )
+    {
+
+    _RPT1(_CRT_WARN, "%s", "********************************************************************\n");
+    }
+
+
+
+void OutputNewline( void )
+    {
+
+    _RPT1(_CRT_WARN, "%s", "\n");
+    }
+#endif
+
+
+
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+void initialize_heap_logging ( void )
+    {
+
+     _CrtSetReportMode(_CRT_WARN,   _CRTDBG_MODE_FILE);
+     _CrtSetReportFile(_CRT_WARN,   _CRTDBG_FILE_STDOUT);
+     _CrtSetReportMode(_CRT_ERROR,  _CRTDBG_MODE_FILE);
+     _CrtSetReportFile(_CRT_ERROR,  _CRTDBG_FILE_STDOUT);
+     _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
+     _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
+     _CrtMemCheckpoint(&s0);
+     }
+#endif
+
+
+
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+void execute_heap_logging ( void )
+    {
+    OutputNewline();
+    OutputDivider();
+    _RPT1(_CRT_WARN, "%s", "After cleanup, before exiting main()\n");
+    OutputDivider();
+    _CrtMemCheckpoint(&s1);
+    _CrtMemDifference(&s2, &s0, &s1);
+    _CrtMemDumpStatistics(&s2);
+    OutputNewline();
+    OutputDivider();
+    _RPT1(_CRT_WARN, "%s", "Checking for memory leaks...\n");
+    OutputDivider();
+    _CrtDumpMemoryLeaks();
+    }
+#endif
+
+
+
+int main(int argc, LCHAR* argv [] )
+    {
+     int             test_status;
+     unsigned int    num_shutdown_loops;
+     unsigned int    current_shutdown_loop;
+     unsigned int    num_continuous_run_loops;
+     unsigned int    current_continuous_run_loop;
+     unsigned int    srec_test_heap_size;
+
+#ifdef _WIN32
+    initStack();
+#endif
+        {
+    /* This extra block is there to get a more precise estimate of the stack
+      depth.  This way we also make sure that the local variables of main are
+      taken into acount when estimating the stack size.
+   */
+        ApplicationData applicationData;
+        PLogger* logger;
+
+        srec_test_heap_size = ( 4 * 1024 * 1024 );
+        logger = NULL;
+        test_status = srec_test_get_run_params ( &num_shutdown_loops, &num_continuous_run_loops );
+
+        if ( test_status == 0 )
+            {
+            current_shutdown_loop = 0;
+
+            while ( ( current_shutdown_loop < num_shutdown_loops )/* && ( test_status == 0 )*/ )
+                {
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+                initialize_heap_logging ( );
+#endif
+                test_status = srec_test_init_system ( srec_test_heap_size, logger, argc, argv );
+
+                if ( test_status == 0 )
+                    {
+                    current_continuous_run_loop = 0;
+
+                    while ( ( current_continuous_run_loop < num_continuous_run_loops ) && ( test_status == 0 ) )
+                        {
+                        test_status = srec_test_init_application_data ( &applicationData, argc, argv );
+
+                        if ( test_status == 0 )
+                            {
+                            test_status = srec_test_run_test ( &applicationData );
+                            srec_test_shutdown_application_data ( &applicationData );
+                            }
+                        current_continuous_run_loop++;
+                        }
+                    test_status = srec_test_shutdown_system ( logger );
+                    }
+                current_shutdown_loop++;
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+                execute_heap_logging ( );
+#endif
+                }
+            }
+        }
+
+    return ( test_status );
+    }
+
+
diff --git a/srec/test/SRecTest/src/srec_test_config.c b/srec/test/SRecTest/src/srec_test_config.c
new file mode 100644
index 0000000..4569130
--- /dev/null
+++ b/srec/test/SRecTest/src/srec_test_config.c
@@ -0,0 +1,72 @@
+/*---------------------------------------------------------------------------*
+ *  srec_test_config.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "srec_test_config.h"
+
+static unsigned int	num_test_shutdown_times = 1;	/* Number of times to shutdown and restart during test */
+static unsigned int	num_test_continuous_loops = 1;	/* Number of loops to run between start and shutdown */
+
+
+
+int get_num_srec_test_shutdown_times ( unsigned int *shutdown_times )
+    {
+    int get_status;
+
+    *shutdown_times = num_test_shutdown_times;
+    get_status = 0;
+
+    return ( get_status );
+    }
+
+
+
+int set_num_srec_test_shutdown_times ( unsigned int shutdown_times )
+    {
+    int set_status;
+
+    num_test_shutdown_times = shutdown_times;
+    set_status = 0;
+
+    return ( set_status );
+    }
+
+
+
+int get_num_srec_test_continuous_loops ( unsigned int *continuous_loops )
+    {
+    int get_status;
+
+    *continuous_loops = num_test_continuous_loops;
+    get_status = 0;
+
+    return ( get_status );
+    }
+
+
+
+int set_num_srec_test_continuous_loops ( unsigned int continuous_loops )
+    {
+    int set_status;
+
+    num_test_continuous_loops = continuous_loops;
+    set_status = 0;
+
+    return ( set_status );
+    }
+
diff --git a/srec/test/SRecTest/src/srec_test_config.h b/srec/test/SRecTest/src/srec_test_config.h
new file mode 100644
index 0000000..a8ed11b
--- /dev/null
+++ b/srec/test/SRecTest/src/srec_test_config.h
@@ -0,0 +1,29 @@
+/*---------------------------------------------------------------------------*
+ *  srec_test_config.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+extern int	get_num_srec_test_continuous_loops ( unsigned int *continuous_loops );
+extern int	get_num_srec_test_shutdown_times ( unsigned int *shutdown_times );
+extern int	set_num_srec_test_continuous_loops ( unsigned int continuous_loops );
+extern int	set_num_srec_test_shutdown_times ( unsigned int shutdown_times );
+
+/*
+ *	All functions return 0 on success, -1 on failure
+ */
+
+
diff --git a/srec/test/SRecTestAudio/Android.mk b/srec/test/SRecTestAudio/Android.mk
new file mode 100644
index 0000000..db7f26b
--- /dev/null
+++ b/srec/test/SRecTestAudio/Android.mk
@@ -0,0 +1,46 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	src/SRecTestAudio.c \
+	src/srec_test_config.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/src \
+	$(LOCAL_PATH)/include \
+	$(LOCAL_PATH)/../include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/cr \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+	
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libhardware \
+	libUAPI_jni \
+
+LOCAL_MODULE:= SRecTestAudio
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_EXECUTABLE)
diff --git a/srec/test/SRecTestAudio/src/SRecTestAudio.c b/srec/test/SRecTestAudio/src/SRecTestAudio.c
new file mode 100644
index 0000000..30633b8
--- /dev/null
+++ b/srec/test/SRecTestAudio/src/SRecTestAudio.c
@@ -0,0 +1,3496 @@
+/*---------------------------------------------------------------------------*
+ *  SRecTestAudio.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifdef _WIN32
+  #include <windows.h>
+  #include <mmsystem.h>
+  #include "signal.h"
+  #include "direct.h"
+#endif
+
+#include "passert.h"
+#include "ESR_CommandLine.h"
+#include "ESR_Session.h"
+#include "LCHAR.h"
+#include "PFile.h"
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+//#include "PMemoryFileSystem.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "ptypes.h"
+#include "string.h"
+#include "stdio.h"
+#include "stdlib.h"
+#if defined(APP_ENABLE_TIMER)
+#include "ptimer.h"
+#endif
+#include "SR_Grammar.h"
+#include "SR_Recognizer.h"
+#include "SR_RecognizerResult.h"
+#include "SR_Session.h"
+#include "SR_Vocabulary.h"
+#include "SR_AcousticState.h"
+#include "SR_Nametag.h"
+#include "PStackSize.h"
+
+#ifdef ACCURACY_TESTING
+#include "SR_GrammarImpl.h"
+#include "SR_SemanticProcessorImpl.h"
+#endif
+
+#include "audioin.h"
+#include "srec_test_config.h"
+
+//Define this in makefile
+//#define _DEBUGHEAP
+
+
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+#include <crtdbg.h>
+#endif
+
+
+#define SREC_TEST_DEFAULT_AUDIO_FREQUENCY       11025
+#define LOG_BUFFER_SIZE                         512
+#define MAX_AUDIO_BUFFER_SIZE                   2048
+#define DEFAULT_AUDIO_BUFFER_SIZE               256
+#define MAX_LINE_LENGTH                         255
+#define TRANSCRIPTION_SIZE                      512
+#define MAX_SCORE_LENGTH                        5
+#define MAX_NUM_REC_CONTEXTS                    4
+
+
+#ifdef PFILE_VIRTUAL_SUPPORT
+  extern const FileRecord pFileRecTable[];
+  extern const unsigned char pFileStart0[];
+#endif /* #ifdef PFILE_VIRTUAL_SUPPORT */
+
+typedef enum
+    {
+    SENTENCE_BEGIN,
+    SENTENCE_BEGIN_BRACKET_BEGIN,
+    SENTENCE_BEGIN_BRACKET_END,
+    SENTENCE_MIDDLE,
+    SENTENCE_MIDDLE_BRACKET_BEGIN,
+    SENTENCE_MIDDLE_BRACKET_END,
+    SENTENCE_MIDDLE_WITH_SPACE
+    } SENTENCE_CLEANING_STATES;
+
+
+
+typedef enum
+    {
+    ForcedRecModeNotSet = -1,
+    ForcedRecModeOff=0,
+    ForcedRecModeOneTime,
+    ForcedRecModeOn
+    } ForcedRecMode;
+
+
+typedef enum
+    {
+    ERROR_LEVEL_CRITICAL = 0,
+    ERROR_LEVEL_HIGH,
+    ERROR_LEVEL_MODERATE,
+    ERROR_LEVEL_LOW
+    } SREC_TEST_ERROR_LEVELS;
+
+
+typedef struct
+    {
+    LCHAR       grammar_path [P_PATH_MAX];      /* File path of the grammar. */
+    LCHAR       grammarID [P_PATH_MAX];         /* ID of the grammar. */
+    LCHAR       ruleName  [P_PATH_MAX];         /* rule name of the grammar. */
+    SR_Grammar* grammar;                        /* grammar. */
+    ESR_BOOL        is_ve_grammar;                  /* Is voice-enrollment grammar or not */
+    } APPL_GRAMMAR_DATA;
+
+
+typedef struct ApplicationData_t
+    {
+    int                         argc;           /* The number of command-line arguments. */
+    LCHAR                       **argv;         /* The command-line argument values. */
+    PFile                       *outputLog;     /* Output log. */
+    ESR_Locale                  locale;         /* Current application locale. */
+    SR_Recognizer               *recognizer;    /* The current recognizer. */
+    SR_RecognizerResult         *result;        /* The last recognition result. */
+    SR_Vocabulary               *vocabulary;    /* The current vocabulary. */
+    SR_Nametag                  *nametag;       /* The nametag generated by the last recognition. */
+    SR_Nametags                 *nametags;      /* The active nametag collection. */
+    APPL_GRAMMAR_DATA           grammars [MAX_NUM_REC_CONTEXTS];        /* Grammar data */
+    int                         grammarCount;   /* The number of grammars. */
+    int                         active_grammar_num;     /* The index number of the active grammar. */
+    const asr_int16_t                 *raw_waveform;  /*Points to raw waveform returned from voice enrollment */
+    size_t                      raw_waveform_size;  /* Size of above wave_form */
+    asr_int16_t                 audio_buffer [MAX_AUDIO_BUFFER_SIZE];
+    unsigned int                audio_buffer_requested_size;
+    unsigned int                num_samples_read;
+    LCHAR                       raw_waveform_filename [P_PATH_MAX];     /* Name of file of saved waveform data. */
+    PFile                       *raw_waveform_file;     /* Pointer to file of saved waveform data. */
+    LCHAR                       transcription [MAX_LINE_LENGTH];
+    ForcedRecMode               forced_rec_mode;
+    } ApplicationData;
+
+
+
+static int      srec_test_get_run_params ( unsigned int *num_shutdown_loops, unsigned int *num_continuous_run_loops );
+static int      srec_test_init_application_data ( ApplicationData *applicationData, int arg_count, LCHAR *arg_vals [] );
+static int      srec_test_init_file_system ( int arg_count, LCHAR *arg_vals [] );
+static int      srec_test_init_logging_system ( int arg_count, LCHAR *arg_vals [], PLogger *logger );
+static int      srec_test_init_memory_system ( unsigned int srec_test_heap_size );
+static int      srec_test_init_system ( unsigned int srec_test_heap_size, PLogger* logger, int arg_count,
+                                        LCHAR *arg_vals [], AUDIOIN_H *audio_input_handle );
+static int      srec_test_run_test_execute ( ApplicationData *applicationData, AUDIOIN_H audio_input_handle );
+static int      srec_test_run_test_init ( ApplicationData *applicationData );
+static int      srec_test_run_test ( ApplicationData *applicationData, AUDIOIN_H audio_input_handle );
+static int      srec_test_shutdown_file_system ( void );
+static int      srec_test_shutdown_logging_system ( PLogger *logger );
+static int      srec_test_shutdown_memory_system ( void );
+static int      srec_test_recognize_live ( SR_Grammar *active_grammar, ApplicationData *data, AUDIOIN_H audio_input_handle,
+                                           FILE *results_file, size_t *recognition_count );
+static void     srec_test_log_recognition_failure ( ApplicationData *data );
+
+
+
+static ESR_BOOL interrupted = ESR_FALSE;
+
+/* static ESR_BOOL no_enroll = ESR_FALSE;      //BJP */
+
+int signal_handler_SIGINT(int v)
+{
+  interrupted = ESR_TRUE;
+  return 0;
+}
+
+
+
+ESR_ReturnCode myDSMCallback(LCHAR* functionName, LCHAR** argv, size_t argc, void* value, LCHAR* result, size_t* resultSize)
+{
+  LCHAR* meaning;
+
+  PLOG_DBG_TRACE((L("myDSMCallback(%s) invoked\n"), functionName));
+  if ((LSTRCMP(functionName, "myDSMCallback")!=0) || (argc > 1))
+  {
+    /* Unsupported semantic function */
+    return ESR_INVALID_STATE;
+  }
+        if (argc > 0)
+                meaning = argv[0];
+        else
+                meaning = L("");
+  lstrtrim(meaning);
+  LSTRLWR(meaning);
+
+  if (LISDIGIT(*meaning))
+        {
+                /* Penalize meaning starting with "<digit>" */
+    if (*resultSize < LSTRLEN(L("1000"))+1)
+    {
+      *resultSize = LSTRLEN(L("1000"))+1;
+      return ESR_BUFFER_OVERFLOW;
+    }
+    LSTRCPY(result, "1000");
+    *resultSize = LSTRLEN(L("1000"))+1;
+    return ESR_SUCCESS;
+        }
+  if (*resultSize < LSTRLEN(L("0"))+1)
+  {
+    *resultSize = LSTRLEN(L("0"))+1;
+    return ESR_BUFFER_OVERFLOW;
+  }
+  LSTRCPY(result, "0");
+  *resultSize = LSTRLEN(L("0"))+1;
+  return ESR_SUCCESS;
+}
+
+
+
+void srec_test_log_error ( unsigned int error_id, SREC_TEST_ERROR_LEVELS error_level, LCHAR *error_text )
+    {
+
+    switch ( error_level )
+        {
+        case ERROR_LEVEL_CRITICAL:
+            LPRINTF ( "Critical Level Error %s\n", error_text );
+            break;
+
+        case ERROR_LEVEL_HIGH:
+            LPRINTF ( "High Level Error %s\n", error_text );
+            break;
+
+        case ERROR_LEVEL_MODERATE:
+            LPRINTF ( "Moderate Level Error %s\n", error_text );
+            break;
+
+        case ERROR_LEVEL_LOW:
+            LPRINTF ( "Low Level Error %s\n", error_text );
+            break;
+
+        default:
+            LPRINTF ( "Unknown Level Error %d  :  %s\n", error_level, error_text );
+            break;
+        }
+    }
+
+
+
+void srec_test_delete_grammar ( ApplicationData *data, int grammar_num )
+    {
+    LCHAR log_buffer[LOG_BUFFER_SIZE];
+
+    if ( grammar_num < data->grammarCount )
+        {
+        if ( ( data->grammarCount - grammar_num ) > 1 )
+            {
+            memmove ( &data->grammars [grammar_num], &data->grammars [data->grammarCount - 1],
+                      ( data->grammarCount - grammar_num - 1 ) * sizeof ( APPL_GRAMMAR_DATA ) );
+            if ( grammar_num > data->active_grammar_num )
+                data->active_grammar_num--;
+            }
+        data->grammarCount--;
+        }
+    else
+        {
+        LSPRINTF ( log_buffer, L("Internal Error Grammar TableCorrupt : Grammar %d Does Not Exist"), grammar_num );
+        srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, log_buffer );
+        }
+    }
+
+
+
+static void srec_test_get_active_grammar ( ApplicationData *data, SR_Grammar **active_grammar )
+    {
+
+    if ( data->active_grammar_num >= 0 )
+        *active_grammar = data->grammars [data->active_grammar_num].grammar;
+    else
+        *active_grammar = NULL;
+    }
+
+
+
+static void srec_test_get_active_grammar_data ( ApplicationData *data, APPL_GRAMMAR_DATA **active_grammar_data )
+    {
+
+    if ( data->active_grammar_num >= 0 )
+        *active_grammar_data = &data->grammars [data->active_grammar_num];
+    else
+        *active_grammar_data = NULL;
+    }
+
+
+
+static ESR_BOOL srec_test_get_grammar_from_id ( ApplicationData *data, char *grammar_id,
+                                            int *grammar_index, ESR_BOOL *is_active, ESR_BOOL *is_ve_grammar )
+    {
+    ESR_BOOL            found_grammar;
+    int             grammar_counter;
+
+    found_grammar = ESR_FALSE;
+    grammar_counter = 0;
+
+    while ( ( found_grammar == ESR_FALSE ) && ( grammar_counter < data->grammarCount ) )
+        {
+        if ( strcmp ( grammar_id, data->grammars [grammar_counter].grammarID ) == 0 )
+            {
+            *grammar_index = grammar_counter;
+            *is_ve_grammar = data->grammars [grammar_counter].is_ve_grammar;
+
+            if ( grammar_counter == data->active_grammar_num )
+                *is_active = ESR_TRUE;
+            else
+                *is_active = ESR_FALSE;
+            found_grammar = ESR_TRUE;
+            }
+        else
+            {
+            grammar_counter++;
+            }
+        }
+    return ( found_grammar );
+    }
+
+
+
+static int srec_test_get_empty_grammar_index ( ApplicationData *data, unsigned int *grammar_index )
+    {
+    int get_status;
+
+    if ( data->grammarCount < MAX_NUM_REC_CONTEXTS )
+        {
+        get_status = 0;
+        *grammar_index = data->grammarCount;
+        }
+    else
+        {
+        get_status = -1;
+        }
+    return ( get_status );
+    }
+
+
+
+ESR_ReturnCode ShutdownSession ( void )
+    {
+    ESR_ReturnCode    shutdown_status;
+
+    shutdown_status = SR_SessionDestroy ( );
+
+    return ( shutdown_status );
+    }
+
+
+
+ESR_ReturnCode InitSession ( int argc, char** argv )
+    {
+    ESR_ReturnCode    init_status;
+    LCHAR             path[P_PATH_MAX];
+    size_t            len;
+
+    len = P_PATH_MAX;
+    init_status = ESR_CommandLineGetValue ( argc, (const char **)argv, L("parfile"), path, &len );
+
+    if ( init_status == ESR_SUCCESS )
+        {
+        init_status = SR_SessionCreate ( path );
+
+        if ( init_status == ESR_SUCCESS )
+            {
+  /* Command-line options always override PAR file options */
+            init_status = ESR_SessionImportCommandLine ( argc, argv );
+
+            if ( init_status != ESR_SUCCESS )
+                {
+                SR_SessionDestroy ( );
+                /* Log Here */
+                }
+            }
+        else
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, L("Parfile Nmae Not Specified on Command Line") );
+        }
+    return ( init_status );
+    }
+
+
+
+ESR_ReturnCode ShutdownGrammarUnload ( ApplicationData *data, unsigned int grammar_num )
+    {
+    ESR_ReturnCode  shutdown_status;
+
+    shutdown_status = SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+
+    return ( shutdown_status );
+    }
+
+
+
+ESR_ReturnCode SetupGrammarLoad ( ApplicationData *data, unsigned int grammar_num )
+    {
+    ESR_ReturnCode  setup_status;
+
+    setup_status = SR_GrammarLoad (data->grammars [grammar_num].grammar_path, &data->grammars [grammar_num].grammar );
+
+    if ( setup_status == ESR_SUCCESS )
+        {
+        setup_status = SR_GrammarSetupVocabulary ( data->grammars [grammar_num].grammar, data->vocabulary );
+
+        if ( setup_status == ESR_SUCCESS )
+            {
+            // setup_status = SR_GrammarSetupModels ( data->grammars [grammar_num].grammar, data->models );
+            setup_status = SR_GrammarSetupRecognizer( data->grammars [grammar_num].grammar, data->recognizer );
+
+            if ( setup_status == ESR_SUCCESS )
+                {
+                setup_status = SR_GrammarSetDispatchFunction ( data->grammars [grammar_num].grammar, L("myDSMCallback"), NULL, myDSMCallback );
+
+                if ( setup_status != ESR_SUCCESS )
+                    SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+                }
+            else
+                {
+                SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+                }
+            }
+        else
+            {
+            SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+            }
+        }
+    return ( setup_status );
+    }
+
+
+
+ESR_ReturnCode SetupGrammarActivate ( ApplicationData *data, unsigned int grammar_num )
+    {
+    ESR_ReturnCode  setup_status;
+
+	setup_status = SR_RecognizerActivateRule ( data->recognizer, data->grammars [grammar_num].grammar, data->grammars [grammar_num].ruleName, 1 );
+    return ( setup_status );
+    }
+
+
+
+#ifdef ACCURACY_TESTING
+ESR_ReturnCode srec_test_parse (SR_Grammar *grammar, const LCHAR* trans, LCHAR* meaning, size_t *len);
+#endif
+
+/**
+ * Parses source string and copies the first whitespace-delimited token into destination.
+ *
+ * @param source Source string to parse
+ * @param target Target string to copy into
+ * @param charsRead [in] Size of target buffer.
+ *                  [out] Number of characters read up to end of token.
+ *                  If the return code is ESR_BUFFER_OVERFLOW, the required length is
+ *                  returned in this variable.
+ */
+int getFirstToken(LCHAR* source, LCHAR* target, size_t* charsRead)
+{
+  LCHAR* beginning = source;
+  LCHAR* ending;
+
+  /* Skip whitespace */
+  for (; *beginning!=L('\0') && LISSPACE(*beginning); ++beginning);
+  if (*beginning==L('\0'))
+    return ( -1 ); /* invalid command syntax */
+  /* Find next whitespace */
+  for (ending=beginning; *ending!=L('\0') && !LISSPACE(*ending); ++ending);
+  if ((size_t) (ending-beginning) > *charsRead)
+  {
+    *charsRead = ending-beginning;
+    return ( -1 );
+  }
+  *charsRead = ending-source;
+  LSTRNCPY(target, beginning, ending-beginning);
+  target[ending-beginning] = L('\0');
+  return ( 0 );
+}
+
+
+
+int srec_test_get_five_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command,
+                                       size_t second_max_command_size, LCHAR *second_command,
+                                       size_t third_max_command_size, LCHAR *third_command,
+                                       size_t fourth_max_command_size, LCHAR *fourth_command,
+                                       size_t fifth_max_command_size, LCHAR *fifth_command,
+                                       size_t *actual_commands, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, first_command, &first_max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size );
+
+        if ( get_status == ESR_SUCCESS )
+            {
+            get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size,
+                                         third_command, &third_max_command_size );
+            if ( get_status == ESR_SUCCESS )
+                {
+                get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size,
+                                             fourth_command, &fourth_max_command_size );
+                if ( get_status == ESR_SUCCESS )
+                    {
+                    get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size,
+                                                 fifth_command, &fifth_max_command_size );
+                    if ( get_status == ESR_SUCCESS )
+                        {
+                        if ( command_end != NULL )
+                            *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size + fifth_max_command_size;
+                        if ( actual_commands != NULL )
+                            *actual_commands = 5;
+                        }
+                    else
+                        {
+                        if ( command_end != NULL )
+                            *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size;
+                        if ( actual_commands != NULL )
+                            *actual_commands = 4;
+                        }
+                    }
+                else
+                    {
+                    if ( command_end != NULL )
+                        *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size;
+                    if ( actual_commands != NULL )
+                        *actual_commands = 3;
+                    }
+                }
+            else
+                {
+                if ( command_end != NULL )
+                    *command_end = command_start + first_max_command_size + second_max_command_size;
+                if ( actual_commands != NULL )
+                    *actual_commands = 2;
+                }
+            }
+        else
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 1;
+            }
+        }
+    else
+        {
+        if ( command_end != NULL )
+            *command_end = command_start;
+        if ( actual_commands != NULL )
+            *actual_commands = 0;
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_get_four_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command,
+                                       size_t second_max_command_size, LCHAR *second_command,
+                                       size_t third_max_command_size, LCHAR *third_command,
+                                       size_t fourth_max_command_size, LCHAR *fourth_command,
+                                       size_t *actual_commands, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, first_command, &first_max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size );
+
+        if ( get_status == ESR_SUCCESS )
+            {
+            get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size,
+                                         third_command, &third_max_command_size );
+            if ( get_status == ESR_SUCCESS )
+                {
+                get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size,
+                                             fourth_command, &fourth_max_command_size );
+                if ( get_status == ESR_SUCCESS )
+                    {
+                    if ( command_end != NULL )
+                        *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size;
+                    if ( actual_commands != NULL )
+                        *actual_commands = 4;
+                    }
+                else
+                    {
+                    if ( command_end != NULL )
+                        *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size;
+                    if ( actual_commands != NULL )
+                        *actual_commands = 3;
+                    }
+                }
+            else
+                {
+                if ( command_end != NULL )
+                    *command_end = command_start + first_max_command_size + second_max_command_size;
+                if ( actual_commands != NULL )
+                    *actual_commands = 2;
+                }
+            }
+        else
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 1;
+            }
+        }
+    else
+        {
+        if ( command_end != NULL )
+            *command_end = command_start;
+        if ( actual_commands != NULL )
+            *actual_commands = 0;
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_get_three_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command,
+                                        size_t second_max_command_size, LCHAR *second_command,
+                                        size_t third_max_command_size, LCHAR *third_command,
+                                        size_t *actual_commands, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, first_command, &first_max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size );
+
+        if ( get_status == ESR_SUCCESS )
+            {
+            get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size,
+                                         third_command, &third_max_command_size );
+            if ( get_status == ESR_SUCCESS )
+                {
+                if ( command_end != NULL )
+                    *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size;
+                if ( actual_commands != NULL )
+                    *actual_commands = 3;
+                }
+            else
+                {
+                if ( command_end != NULL )
+                    *command_end = command_start + first_max_command_size + second_max_command_size;
+                if ( actual_commands != NULL )
+                    *actual_commands = 2;
+                }
+            }
+        else
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 1;
+            }
+        }
+    else
+        {
+        if ( command_end != NULL )
+            *command_end = command_start;
+        if ( actual_commands != NULL )
+            *actual_commands = 0;
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_get_two_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command,
+                                      size_t second_max_command_size, LCHAR *second_command,
+                                      size_t *actual_commands, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, first_command, &first_max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size );
+
+        if ( get_status == ESR_SUCCESS )
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size + second_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 2;
+            }
+        else
+            {
+            if ( command_end != NULL )
+                *command_end = command_start + first_max_command_size;
+            if ( actual_commands != NULL )
+                *actual_commands = 1;
+            }
+        }
+    else
+        {
+        if ( command_end != NULL )
+            *command_end = command_start;
+        if ( actual_commands != NULL )
+            *actual_commands = 0;
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_get_one_command_item ( LCHAR *command_start, size_t max_command_size, LCHAR *command, LCHAR **command_end )
+    {
+    int get_status;
+
+    get_status = getFirstToken ( command_start, command, &max_command_size );
+
+    if ( get_status == ESR_SUCCESS )
+        {
+        if ( command_end != NULL )
+            *command_end = command_start + max_command_size;
+        }
+    return ( get_status );
+    }
+
+
+
+/**
+ * Execute TCP-file commands.
+ *
+ * @param text String containing command
+ * @param recognizer The recognizer
+ */
+//static int words_added = 0;
+
+#if defined(APP_ENABLE_TIMER)
+static PTimer *addWordTimer = NULL;
+static PTimer *compileTimer = NULL;
+#endif
+
+
+
+int srec_test_reset_slots ( SR_Grammar *active_grammar )
+    {
+    int             reset_status;
+    ESR_ReturnCode  esr_status;
+
+    if ( active_grammar != NULL )
+        {
+        reset_status = 0;
+        esr_status = SR_GrammarResetAllSlots ( active_grammar );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            reset_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        reset_status = -1;
+        /* Log Here */
+        }
+    return ( reset_status );
+    }
+
+
+
+int srec_test_add_word ( SR_Grammar *active_grammar, LCHAR *command_text )
+    {
+    int             add_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           slot [MAX_LINE_LENGTH];
+    LCHAR           word [MAX_LINE_LENGTH];
+    LCHAR           pron [MAX_LINE_LENGTH];
+    LCHAR           weight [MAX_UINT_DIGITS+1];
+    LCHAR           semanticTag [MAX_LINE_LENGTH];
+    int             weightNumber;
+    int             convert_string_to_num;
+
+    if ( active_grammar != NULL )
+        {
+        add_status  = srec_test_get_five_command_items ( command_text, MAX_LINE_LENGTH, slot,
+                                                         MAX_LINE_LENGTH, word, MAX_LINE_LENGTH, pron,
+                                                         MAX_UINT_DIGITS + 1, weight, MAX_LINE_LENGTH,
+                                                         semanticTag, NULL, NULL );
+        if ( add_status == 0 )
+            {
+            convert_string_to_num = lstrtoi (weight, &weightNumber, 10 );
+
+            if ( convert_string_to_num == 0 )
+                {
+#if defined(APP_ENABLE_TIMER)
+                PTimerStart ( addWordTimer );
+#endif
+                esr_status = SR_GrammarAddWordToSlot ( active_grammar, slot, word, pron, weightNumber, semanticTag );
+#if defined(APP_ENABLE_TIMER)
+                PTimerStop(addWordTimer);
+#endif
+                if ( esr_status != ESR_SUCCESS )
+                    {
+                    add_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                add_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            add_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        add_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" );
+        }
+    return ( add_status );
+    }
+
+
+
+int srec_test_compile_active_context ( SR_Grammar *active_grammar )
+    {
+    int             compile_status;
+    ESR_ReturnCode  esr_status;
+
+    if ( active_grammar != NULL )
+        {
+        compile_status = 0;
+#if defined(APP_ENABLE_TIMER)
+        PTimerStart ( compileTimer );
+#endif
+        esr_status = SR_GrammarCompile( active_grammar );
+#if defined(APP_ENABLE_TIMER)
+        PTimerStop ( compileTimer );
+#endif
+        if ( esr_status != ESR_SUCCESS )
+            {
+            compile_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        compile_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, L("No Active Grammar To Compile") );
+        }
+    return ( compile_status );
+    }
+
+
+
+int srec_test_load_grammar_data_from_command ( ApplicationData *data, unsigned int grammar_num, LCHAR *command_text )
+    {
+    int             get_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           path [P_PATH_MAX];
+    LCHAR           id [P_PATH_MAX];
+    LCHAR           rule [P_PATH_MAX];
+    LCHAR           ve_marker [P_PATH_MAX];
+    size_t          path_length;
+
+    get_status = srec_test_get_four_command_items ( command_text, P_PATH_MAX, path, P_PATH_MAX, id,
+                                                    P_PATH_MAX, rule, P_PATH_MAX, ve_marker, NULL, NULL );
+    if ( get_status == 0 )
+        {
+        path_length = P_PATH_MAX;
+        esr_status = ESR_SessionPrefixWithBaseDirectory ( path, &path_length );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            LSTRCPY ( data->grammars [grammar_num].grammar_path, path );
+            LSTRCPY ( data->grammars [grammar_num].grammarID, id );
+            LSTRCPY ( data->grammars [grammar_num].ruleName, rule );
+
+            if ( LSTRCMP ( ve_marker, L("ve") ) ==0 )
+                data->grammars [grammar_num].is_ve_grammar = ESR_TRUE;
+            else if ( LSTRCMP ( ve_marker, L("not_ve") ) ==0 )
+                data->grammars [grammar_num].is_ve_grammar = ESR_FALSE;
+            else
+                {
+                get_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            get_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        /* Log Here */
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_load_context ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             load_status;
+    ESR_ReturnCode  esr_status;
+    unsigned int    open_grammar;
+
+    load_status = srec_test_get_empty_grammar_index ( data, &open_grammar );
+
+    if ( load_status == 0 )
+        {
+        load_status = srec_test_load_grammar_data_from_command ( data, open_grammar, command_text );
+
+        if ( load_status == 0 )
+            {
+            esr_status = SetupGrammarLoad ( data, open_grammar );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                data->grammarCount++;
+                }
+            else
+                {
+                load_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Maximum Number Of Grammars Already Loaded") );
+        }
+    return ( load_status );
+    }
+
+
+
+int srec_test_free_context ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text )
+    {
+    int             free_status;
+    ESR_ReturnCode  esr_status;
+    int             grammar_num;
+    ESR_BOOL            found_grammar;
+    ESR_BOOL            grammar_is_active;
+    ESR_BOOL            grammar_is_ve;
+    LCHAR           grammar_id [P_PATH_MAX];
+
+    free_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL );
+
+    if ( free_status == 0 )
+        {
+        found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve );
+
+        if ( found_grammar == ESR_TRUE )
+            {
+            if ( grammar_is_active == ESR_TRUE )
+                {
+                if ( grammar_is_ve == ESR_TRUE )
+                    {
+                    esr_status = SR_RecognizerSetBoolParameter ( data->recognizer, L("enableGetWaveform"), ESR_FALSE );
+
+                    if ( esr_status != ESR_SUCCESS )
+                        {
+                        free_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                else
+                    {
+                    esr_status = ESR_SUCCESS;
+                    }
+                if ( esr_status == ESR_SUCCESS )
+                    {
+                    esr_status = SR_RecognizerDeactivateRule ( data->recognizer, data->grammars [data->active_grammar_num].grammar,
+                                                               data->grammars [data->active_grammar_num].ruleName );
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+						data->active_grammar_num = -1;
+                        }
+                    else
+                        {
+                        free_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                }
+            else
+                {
+                free_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            free_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        /* Log Here */
+        }
+    return ( free_status );
+    }
+
+
+
+int srec_test_unload_context ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             unload_status;
+    ESR_ReturnCode  esr_status;
+    int             grammar_num;
+    ESR_BOOL            found_grammar;
+    ESR_BOOL            grammar_is_active;
+    ESR_BOOL            grammar_is_ve;
+    LCHAR           grammar_id [P_PATH_MAX];
+
+   unload_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL );
+
+   if ( unload_status == 0 )
+        {
+        found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve );
+
+        if ( found_grammar == ESR_TRUE )
+            {
+            if ( grammar_is_active == ESR_FALSE )
+                {
+                esr_status = SR_GrammarDestroy ( data->grammars [grammar_num].grammar );
+
+                if ( esr_status != ESR_SUCCESS )
+                    {
+                    unload_status = -1;
+                    /* Log Here */
+                    }
+                srec_test_delete_grammar ( data, grammar_num );
+                }
+            else
+                {
+                unload_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            unload_status = -1;
+            /* Log Here */
+            }
+            }
+    else
+        {
+        /* Log Here */
+        }
+    return ( unload_status );
+    }
+
+
+
+int srec_test_use_context ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text )
+    {
+    int             use_status;
+    ESR_ReturnCode  esr_status;
+    int             grammar_num;
+    ESR_BOOL            found_grammar;
+    ESR_BOOL            grammar_is_active;
+    ESR_BOOL            grammar_is_ve;
+    LCHAR           grammar_id [P_PATH_MAX];
+
+    if ( active_grammar == NULL )
+        {
+        use_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL );
+
+        if ( use_status == 0 )
+            {
+            found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve );
+
+            if ( found_grammar == ESR_TRUE )
+                {
+                    esr_status = SR_RecognizerActivateRule ( data->recognizer, data->grammars [grammar_num].grammar,
+                                                             data->grammars [grammar_num].ruleName, 1 );
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                        if ( data->grammars [grammar_num].is_ve_grammar == ESR_TRUE )
+                            {
+                            esr_status = SR_RecognizerSetBoolParameter ( data->recognizer, L("enableGetWaveform"), ESR_TRUE );
+
+                            if ( esr_status == ESR_SUCCESS )
+                                {
+                                data->active_grammar_num = (int)grammar_num;
+                                }
+                            else
+                                {
+                                use_status = -1;
+                                /* Log Here */
+                                SR_RecognizerDeactivateRule ( data->recognizer, data->grammars [grammar_num].grammar,
+                                                              data->grammars [grammar_num].ruleName );
+                                }
+                            }
+                        else
+                            {
+                            data->active_grammar_num = (int)grammar_num;
+                            }
+                        }
+                    else
+                        {
+                        use_status = -1;
+                        /* Log Here */
+                        }
+                }
+            else
+                {
+                use_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            use_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+         use_status = -1;
+        /* Log Here */
+        }
+    return ( use_status );
+    }
+
+
+
+int srec_test_save_context ( SR_Grammar *active_grammar, LCHAR *command_text )
+    {
+    int             save_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+
+    if ( active_grammar != NULL )
+        {
+        save_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL );
+
+        if ( save_status == 0 )
+            {
+            esr_status = SR_GrammarSave ( active_grammar, file_name );
+
+            if ( esr_status != ESR_SUCCESS )
+                {
+                save_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        save_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" );
+        }
+    return ( save_status );
+    }
+
+
+
+int srec_test_voice_enroll ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text )
+    {
+    int             enroll_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           slot [P_PATH_MAX];
+    LCHAR           nametagID [P_PATH_MAX];
+    LCHAR           weight [MAX_UINT_DIGITS+1];
+    int             weightNumber;
+    int             convert_string_to_num;
+
+    if ( active_grammar != NULL )
+        {
+        if ( data->nametag != NULL )
+            {
+            enroll_status = srec_test_get_three_command_items ( command_text, P_PATH_MAX, slot, P_PATH_MAX, nametagID,
+                                                                MAX_UINT_DIGITS + 1, weight, NULL, NULL );
+            if ( enroll_status == 0 )
+                {
+                convert_string_to_num = lstrtoi ( weight, &weightNumber, 10 );
+
+                if ( convert_string_to_num == 0 )
+                    {
+                    esr_status = SR_NametagSetID ( data->nametag, nametagID );
+
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                        esr_status = SR_GrammarAddNametagToSlot ( active_grammar, slot, data->nametag, weightNumber, NULL );
+
+                        if ( esr_status != ESR_SUCCESS )
+                            {
+                            enroll_status = -1;
+                            /* Log Here */
+                            }
+                        }
+                    else
+                        {
+                        enroll_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                else
+                    {
+                    enroll_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                /* Log Here */
+                }
+            }
+        else
+            {
+            enroll_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        enroll_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" );
+        }
+    return ( enroll_status );
+    }
+
+
+
+int srec_test_load_nametags ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             load_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+
+    load_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL );
+
+    if ( load_status == 0 )
+        {
+        esr_status = SR_NametagsLoad ( data->nametags, file_name );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            load_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        load_status = -1;
+        /* Log Here */
+        }
+    return ( load_status );
+    }
+
+
+
+int srec_test_save_nametags ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             save_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+
+    save_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL );
+
+    if ( save_status == 0 )
+        {
+        esr_status = SR_NametagsSave ( data->nametags, file_name );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            save_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        save_status = -1;
+        /* Log Here */
+        }
+    return ( save_status );
+    }
+
+
+
+int srec_test_clear_nametags ( ApplicationData *data )
+    {
+    int             clear_status;
+    ESR_ReturnCode  esr_status;
+
+    clear_status = 0;
+    esr_status = SR_NametagsDestroy ( data->nametags );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        data->nametags = NULL;
+        esr_status = SR_NametagsCreate ( &data->nametags );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            clear_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        clear_status = -1;
+        /* Log Here */
+        }
+    return ( clear_status );
+    }
+
+
+
+int srec_test_add_to_nametags ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             add_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           nametagID [P_PATH_MAX];
+
+    if ( data->nametag != NULL )
+        {
+        add_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, nametagID, NULL );
+
+        if ( add_status == 0 )
+            {
+            esr_status = SR_NametagSetID ( data->nametag, nametagID );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                esr_status = SR_NametagsAdd ( data->nametags, data->nametag );
+
+                if ( esr_status == ESR_SUCCESS )
+                    {
+                    data->nametag = NULL;
+                    }
+                else
+                    {
+                    add_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                add_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            add_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        add_status = -1;
+        /* Log Here */
+        }
+    return ( add_status );
+    }
+
+
+int srec_test_voice_enroll_nametags ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text )
+  {
+    int             enroll_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           slot [P_PATH_MAX];
+    SR_Nametag      *nametag;
+    size_t          nametags_size;
+    size_t          current_nametag;
+
+    if ( active_grammar != NULL )
+        {
+        enroll_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, slot, NULL );
+
+        if ( enroll_status == 0 )
+            {
+            esr_status = SR_NametagsGetSize (data->nametags, &nametags_size );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                current_nametag = 0;
+
+                while ( ( current_nametag < nametags_size ) && ( esr_status == ESR_SUCCESS ) )
+                    {
+                    esr_status = SR_NametagsGetAtIndex ( data->nametags, current_nametag, &nametag );
+
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                        esr_status = SR_GrammarAddNametagToSlot ( active_grammar, slot, nametag, 0, NULL );
+
+                        if ( esr_status == ESR_SUCCESS )
+                            {
+                            current_nametag++;
+                            }
+                        else
+                            {
+                            enroll_status = -1;
+                            /* Log Here */
+                            }
+                        }
+                    else
+                        {
+                        enroll_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                }
+            else
+                {
+                enroll_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        enroll_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" );
+        }
+    return ( enroll_status );
+    }
+
+
+
+int srec_test_load_acousticstate ( ApplicationData *data, LCHAR *command_text )
+    {
+    int             load_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+
+    load_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL );
+
+    if ( load_status == 0 )
+        {
+        esr_status = SR_AcousticStateLoad ( data->recognizer, file_name );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            load_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        /* Log Here */
+        }
+    return ( load_status );
+    }
+
+
+
+int srec_test_reset_acousticstate ( ApplicationData *data )
+    {
+    int             reset_status;
+    ESR_ReturnCode  esr_status;
+
+    reset_status = 0;
+    esr_status = SR_AcousticStateReset ( data->recognizer );
+
+    if ( esr_status != ESR_SUCCESS )
+        {
+        reset_status = -1;
+        /* Log Here */
+        }
+    return ( reset_status );
+    }
+
+
+
+int srec_test_set_forced_rec_mode ( ApplicationData *data, LCHAR *command_text )
+    {
+    int         set_status;
+    LCHAR       mode[P_PATH_MAX];
+
+    set_status =  srec_test_get_one_command_item ( command_text, P_PATH_MAX, mode, NULL );
+
+    if ( set_status == 0 )
+        {
+        if ( LSTRCMP ( mode, L("one_time") ) == 0 )
+            {
+            data->forced_rec_mode = ForcedRecModeOneTime;
+            }
+        else if ( LSTRCMP ( mode, L("off") ) == 0 )
+            {
+            data->forced_rec_mode = ForcedRecModeOff;
+            }
+        else if ( LSTRCMP ( mode, L("on") ) == 0 )
+            {
+            data->forced_rec_mode = ForcedRecModeOn;
+            }
+        else
+            {
+            set_status = -1;
+            /* Log Here */
+            }
+        }
+    return ( set_status );
+    }
+
+
+
+int srec_test_execute_command ( ApplicationData *data, AUDIOIN_H audio_input_handle, LCHAR *text, FILE *results_file, size_t *recognition_count )
+    {
+    int         execute_status;
+    LCHAR       *current_command_start;
+    LCHAR       *current_end_command;
+    LCHAR       command [MAX_LINE_LENGTH];
+    SR_Grammar  *active_grammar;
+    LCHAR       log_buffer [LOG_BUFFER_SIZE];
+
+    srec_test_get_active_grammar ( data, &active_grammar );
+    current_command_start = text;
+    execute_status = srec_test_get_one_command_item ( current_command_start, MAX_LINE_LENGTH, command, &current_end_command );
+
+    if ( execute_status == 0 )
+        {
+		if( data->nametag 
+			&& ((LSTRCMP(command, "recognize_nist")==0) || (LSTRCMP(command, "recognize_pcm")==0)) ) {
+				/* if there is a nametag held in memory, and we don't make use of it, then
+				let's destroy it here */  
+			SR_NametagDestroy(  data->nametag);
+			data->nametag = NULL;
+		}
+        if ( LSTRCMP ( command, L("recognize_live") ) == 0 )
+            execute_status = srec_test_recognize_live ( active_grammar, data, audio_input_handle, results_file, recognition_count );
+        else if ( LSTRCMP ( command, L("context_load") ) == 0 )
+            execute_status = srec_test_load_context ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("context_use") ) == 0 )
+            execute_status = srec_test_use_context ( active_grammar, data, current_end_command );
+        else if ( LSTRCMP ( command, L("context_free") ) == 0 )
+            execute_status = srec_test_free_context ( active_grammar, data, current_end_command );
+        else if ( LSTRCMP ( command, L("context_unload") ) == 0 )
+            execute_status = srec_test_unload_context ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("addwords_from_nametags") ) == 0 )
+            execute_status = srec_test_voice_enroll_nametags ( active_grammar, data, current_end_command );
+        else if ( LSTRCMP ( command, L("resetslots") ) == 0 )
+            execute_status = srec_test_reset_slots ( active_grammar );
+        else  if ( LSTRCMP ( command, L("addword") ) == 0 )
+            execute_status = srec_test_add_word ( active_grammar, current_end_command );
+        else if ( LSTRCMP ( command, L("context_compile") ) == 0 )
+            execute_status = srec_test_compile_active_context ( active_grammar );
+        else if ( LSTRCMP ( command, L("context_save") ) == 0 )
+            execute_status = srec_test_save_context ( active_grammar, current_end_command );
+        else if ( LSTRCMP ( command, L("addword_from_last_nametag") ) == 0 )
+            execute_status = srec_test_voice_enroll ( active_grammar, data, current_end_command );
+        else if ( LSTRCMP ( command, L("load_nametags") ) == 0 )
+            execute_status = srec_test_load_nametags ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("save_nametags") ) == 0 )
+            execute_status = srec_test_save_nametags ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("clear_nametags") ) ==0 )
+            execute_status = srec_test_clear_nametags ( data );
+        else if ( LSTRCMP ( command, L("add_to_nametags") ) == 0 )
+            execute_status = srec_test_add_to_nametags ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("acousticstate_load") ) == 0 )
+            execute_status = srec_test_load_acousticstate ( data, current_end_command );
+        else if ( LSTRCMP ( command, L("acousticstate_reset") ) == 0 )
+            execute_status = srec_test_reset_acousticstate ( data );
+        else if ( LSTRCMP ( command, L("forced_rec") ) == 0 )
+            execute_status = srec_test_set_forced_rec_mode ( data, current_end_command );
+        else if ( *( command ) == L('#') )
+            execute_status = 0;   /* Comment in file just skip */
+        else
+            {
+            execute_status = -1;
+            LSPRINTF ( log_buffer, L("Unknown Command %s"), command );
+            srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, log_buffer );
+            }
+        }
+    else
+        {
+        /* Log Here */
+        }
+    return ( execute_status );
+    }
+
+
+
+int srec_test_open_command_file ( PFile **command_file )
+    {
+    int             open_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+    size_t          len;
+
+    open_status = 0;
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.tcp"), file_name, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        len = P_PATH_MAX;
+        esr_status = ESR_SessionPrefixWithBaseDirectory ( file_name, &len );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+	    *command_file = pfopen ( file_name,  L("r") );
+
+	    if ( ( *command_file ) == NULL )
+                {
+                open_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            open_status = -1;
+            /* Log Here */
+            }
+        }
+     else
+         {
+         open_status = -1;
+         /* Log Here */
+         }
+     return ( open_status );
+     }
+
+
+
+void srec_test_close_command_file ( PFile *command_file )
+    {
+
+    pfclose ( command_file );
+    }
+
+
+
+void srec_test_close_audio_file ( PFile *audio_file )
+    {
+
+    pfclose ( audio_file );
+    }
+
+
+
+int srec_test_open_results_file ( FILE **results_file )
+    {
+    int             open_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           file_name [P_PATH_MAX];
+    size_t          len;
+
+    open_status = 0;
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.results"), file_name, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        *results_file = fopen ( file_name, L("w") );
+
+        if ( ( *results_file ) == NULL )
+            {
+            open_status = -1;
+            /* Log Here */
+            }
+        }
+     else
+         {
+         open_status = -1;
+         /* Log Here */
+         }
+     return ( open_status );
+     }
+
+
+
+void srec_test_close_results_file ( FILE *results_file )
+    {
+
+    fclose ( results_file );
+    }
+
+
+
+int srec_test_process_commands ( ApplicationData *data, AUDIOIN_H audio_input_handle )
+    {
+    int             process_status;
+    PFile           *command_file;
+    FILE            *results_file;
+    LCHAR           *got_line_ok;
+    LCHAR           linebuffer [MAX_LINE_LENGTH];
+    size_t          recognition_count;
+
+    recognition_count = 0;
+    process_status = srec_test_open_command_file ( &command_file );
+
+    if ( process_status == 0 )
+        {
+        process_status = srec_test_open_results_file ( &results_file );
+
+        if ( process_status == 0 )
+            {
+            do
+                {
+                got_line_ok = pfgets ( linebuffer, MAX_LINE_LENGTH, command_file );
+
+                if ( got_line_ok != NULL )
+                    srec_test_execute_command ( data, audio_input_handle, linebuffer, results_file, &recognition_count );
+                }
+            while ( ( got_line_ok != NULL ) && ( process_status == 0 ) );
+			if( data->nametag ) {
+				SR_NametagDestroy(  data->nametag);
+				data->nametag = NULL;
+			}
+
+            srec_test_close_results_file ( results_file );
+            }
+        srec_test_close_command_file ( command_file );
+        }
+    return ( process_status );
+    }
+
+
+
+int srec_test_open_nist_file ( LCHAR *file_name, PFile **nist_file )
+    {
+    int             open_status;
+    ESR_ReturnCode  esr_status;
+    int             lstr_result;
+    LCHAR           file_path [P_PATH_MAX];
+    size_t          len;
+
+    open_status = 0;
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.datapath"), file_path, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        len = P_PATH_MAX;
+        esr_status = ESR_SessionPrefixWithBaseDirectory ( file_path, &len );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            esr_status = pf_convert_backslashes_to_forwardslashes ( file_path );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                len = P_PATH_MAX;
+                lstr_result = lstrinsert ( file_path, file_name, 0, &len );
+
+                if ( lstr_result == 0 )
+                    {
+		    *nist_file = pfopen ( file_name, L("rb") );
+
+                    if ( ( *nist_file ) != NULL )
+                        {
+                        esr_status = pfseek ( *nist_file, 1024, SEEK_SET );
+
+                        if ( esr_status != ESR_SUCCESS )
+                            {
+                            open_status = -1;
+                            /* Log Here */
+                            }
+                        }
+                    else
+                        {
+                        open_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                else
+                    {
+                    open_status = -1;
+                    /* Log Here */
+                    }
+                }
+            else
+                {
+                open_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            open_status = -1;
+            /* Log Here */
+            }
+        }
+     else
+         {
+         open_status = -1;
+         /* Log Here */
+         }
+     return ( open_status );
+     }
+
+
+
+int srec_test_get_audio_from_file ( PFile *audio_file, ApplicationData *data, ESR_BOOL *hit_eof )
+    {
+    int get_status;
+    int eof_status;
+
+    get_status = 0;
+    data->num_samples_read = pfread ( data->audio_buffer, sizeof ( asr_int16_t ), data->audio_buffer_requested_size, audio_file );
+
+    if ( data->num_samples_read > 0 )
+        {
+        *hit_eof = ESR_FALSE;
+        }
+    else
+        {
+        eof_status = pfeof ( audio_file );
+
+        if ( eof_status == 0 )
+            {
+            get_status = -1;
+            /* Log Here */
+            }
+        else
+            {
+            *hit_eof = ESR_TRUE;
+            }
+        }
+    return ( get_status );
+    }
+
+
+
+int srec_test_feed_recognizer ( ApplicationData *data, ESR_BOOL hit_eof, SR_RecognizerStatus *esr_recog_status, SR_RecognizerResultType *result_type )
+    {
+    int             feed_status;
+    ESR_ReturnCode  esr_status;
+
+    feed_status = 0;
+    esr_status = SR_RecognizerPutAudio ( data->recognizer, data->audio_buffer, &data->num_samples_read, hit_eof );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        do
+            {
+            esr_status = SR_RecognizerAdvance ( data->recognizer, esr_recog_status, result_type, &data->result );
+
+            if ( esr_status != ESR_SUCCESS )
+                {
+                feed_status = -1;
+                *esr_recog_status = SR_RECOGNIZER_EVENT_STOPPED;
+                *result_type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+                /* Log Here */
+                }
+            }
+        while ( ( *esr_recog_status ) == SR_RECOGNIZER_EVENT_INCOMPLETE );
+        }
+    else
+        {
+        feed_status = -1;
+        /* Log Here */
+        }
+     return ( feed_status );
+     }
+
+
+
+int srec_test_flush_audio ( ApplicationData *data, SR_RecognizerStatus *esr_recog_status, SR_RecognizerResultType *result_type )
+    {
+    int             flush_status;
+    ESR_ReturnCode  esr_status;
+
+    flush_status = 0;
+
+    while ( ( *result_type ) != SR_RECOGNIZER_RESULT_TYPE_COMPLETE )
+        {
+        esr_status = SR_RecognizerAdvance ( data->recognizer, esr_recog_status, result_type, &data->result );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            flush_status = -1;
+            *esr_recog_status = SR_RECOGNIZER_EVENT_STOPPED;
+            *result_type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+            /* Log Here */
+            }
+        }
+    return ( flush_status );
+    }
+
+
+
+int srec_test_process_start_timeout ( ApplicationData *data, FILE *results_file )
+    {
+    int             process_status;
+    ESR_ReturnCode  esr_status;
+    size_t          utterance_timeout;
+
+    process_status = 0;
+    esr_status = ESR_SessionGetSize_t ( L("SREC.Recognizer.utterance_timeout"), &utterance_timeout );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        LFPRINTF ( results_file, L("E: utterance_timeout %lu\n"), (unsigned long)utterance_timeout );
+        LFPRINTF ( results_file, L("R: <FAILED>\n") );
+        LPRINTF ( L("\n-------------------------------------\n") );
+        LPRINTF ( L("E: utterance_timeout %lu\n"), (unsigned long)utterance_timeout );
+        LPRINTF ( L("R: <FAILED>\n") );
+        LPRINTF ( L("-------------------------------------\n\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    srec_test_log_recognition_failure ( data );
+
+    return ( process_status );
+    }
+
+
+int srec_test_write_and_log_wave_form_file ( ApplicationData *data, size_t recognition_count )
+    {
+    int                 write_status;
+    ESR_ReturnCode      esr_status;
+    LCHAR               *wave_filename;
+
+    write_status = 0;
+    LSPRINTF ( data->raw_waveform_filename, L("a%lu__%s.raw"), (unsigned long)recognition_count, data->transcription );
+    wave_filename = data->raw_waveform_filename;
+
+    while ( *wave_filename )
+        {
+        if ( *wave_filename == ' ')
+            *wave_filename = '_';
+        wave_filename++;
+        }
+/* just write to file for now... for testing purposes */
+    LPRINTF ( L("Dumping audio waveform to file %s\n"), data->raw_waveform_filename );
+    data->raw_waveform_file = pfopen ( data->raw_waveform_filename, L("wb") );
+
+    if ( data->raw_waveform_file != NULL )
+        {
+        pfwrite ( (void*)data->raw_waveform, 1, data->raw_waveform_size, data->raw_waveform_file );
+        pfclose ( data->raw_waveform_file );
+/* log the filename in the ESR log */
+        esr_status = SR_RecognizerLogToken ( data->recognizer, "WVFMFILENAME", data->raw_waveform_filename );
+
+        if( esr_status != ESR_SUCCESS )
+            {
+            write_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        write_status = -1;
+        /* Log Here */
+        }
+    return ( write_status );
+    }
+
+
+
+int srec_test_process_nbest_list ( ApplicationData *data, FILE *results_file )
+    {
+    int                 process_status;
+    ESR_ReturnCode      esr_status;
+    size_t              nbestSize;
+    size_t              nbest_num;
+    LCHAR               linebuffer [MAX_LINE_LENGTH];
+    size_t              line_length;
+
+    process_status = 0;
+      /* At least one semantic result exists */
+    LPRINTF ( L("\n\n----------------------------------------------\n") );
+    line_length =  MAX_LINE_LENGTH;
+    esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("conf"), linebuffer, &line_length );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        LPRINTF ( L("CONFIDENCE SCORE : '%s'\n"), linebuffer );
+        LPRINTF ( L("TRANSCRIPTION    : '%s'\n"), data->transcription );
+        esr_status = SR_RecognizerResultGetSize (data->result, &nbestSize );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            for ( nbest_num = 0; nbest_num < nbestSize; nbest_num++ )
+                {
+                line_length =  MAX_LINE_LENGTH;
+                esr_status = SR_RecognizerResultGetValue ( data->result, nbest_num, L("literal"), linebuffer, &line_length );
+
+                if ( esr_status == ESR_SUCCESS )
+                    {
+                    LPRINTF ( L("LITERAL[%2lu]      : '%s'\n"), (unsigned long)nbest_num, linebuffer );
+                    line_length = MAX_LINE_LENGTH;
+                    esr_status = SR_RecognizerResultGetValue ( data->result, nbest_num, L("meaning"), linebuffer, &line_length );
+
+                    if ( esr_status != ESR_SUCCESS )
+                        {
+                        linebuffer [0] = L('\0') ;
+                        }
+                    LPRINTF ( L("MEANING[%2lu]      : '%s'\n"), (unsigned long)nbest_num, linebuffer );
+                    line_length = MAX_LINE_LENGTH;
+                    esr_status = SR_RecognizerResultGetValue (data->result, nbest_num, L("raws"), linebuffer, &line_length );
+
+                    if ( esr_status == ESR_SUCCESS )
+                        {
+                            LPRINTF ( L("RAW SCORE[%2lu]    : '%s'\n\n"), (unsigned long)nbest_num, linebuffer);
+                        }
+                    else
+                        {
+                        process_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                else
+                    {
+                    process_status = -1;
+                    /* Log Here */
+                    }
+                }
+            }
+        else
+            {
+            process_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    LPRINTF ( L("----------------------------------------------\n\n") );
+    return ( process_status );
+    }
+
+
+
+int srec_test_process_recognition ( ApplicationData *data, FILE *results_file, size_t recognition_count )
+    {
+    int                 process_status;
+    ESR_ReturnCode      esr_status;
+    APPL_GRAMMAR_DATA   *grammar_data;
+    LCHAR               linebuffer [MAX_LINE_LENGTH];
+    size_t              line_length;
+
+    process_status = 0;
+    srec_test_get_active_grammar_data ( data, &grammar_data );
+    line_length = MAX_LINE_LENGTH;
+    esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("literal"), linebuffer, &line_length );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        LFPRINTF ( results_file, L("R: %s\n"), linebuffer );
+        line_length = MAX_LINE_LENGTH;
+        esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("conf"), linebuffer, &line_length );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            LFPRINTF ( results_file, L("S: %s\n"), linebuffer);
+            LPRINTF ( L("S: %s\n"), linebuffer);
+            srec_test_process_nbest_list ( data, results_file );
+         /*
+          * SR_RecognizerResultGetWaveform will return pointer to buffer holding
+          * audio data in it. This buffer is NOT under the application's control
+          * and MUST only be read from.
+          */
+            if ( grammar_data->is_ve_grammar == ESR_TRUE )
+                {
+                LPRINTF ( L("VoiceEnrollement=>SUCCESS\n") );
+                esr_status = SR_NametagCreate ( data->result, L("dummyID"), &data->nametag );
+
+                if ( esr_status == ESR_SUCCESS )
+                    {
+                    esr_status = SR_RecognizerResultGetWaveform ( data->result, &data->raw_waveform, &data->raw_waveform_size );
+
+                    if( esr_status == ESR_SUCCESS )
+                        {
+                        if ( data->raw_waveform )
+                            {
+                            process_status = srec_test_write_and_log_wave_form_file ( data, recognition_count );
+
+                            if ( process_status == 0 )
+                                {
+                                esr_status = SR_RecognizerLogEvent ( data->recognizer, "ESRve" );
+
+                                if( esr_status != ESR_SUCCESS )
+                                    {
+                                    process_status = -1;
+                                    /* Log Here */
+                                    }
+                                }
+                            else
+                                {
+                                /* Log Here */
+                                }
+                            }
+                        }
+                    else
+                        {
+                        process_status = -1;
+                        /* Log Here */
+                        }
+                    }
+                else
+                    {
+                    process_status = -1;
+                    /* Log Here */
+                    }
+                }
+            }
+        else
+            {
+            process_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    return ( process_status );
+    }
+
+
+
+int srec_test_process_recognition_fail ( ApplicationData *data )
+    {
+    int                 process_status;
+    ESR_ReturnCode      esr_status;
+    APPL_GRAMMAR_DATA   *grammar_data;
+    ESR_BOOL                reason_status;
+
+    process_status = 0;
+    srec_test_get_active_grammar_data ( data, &grammar_data );
+    LPRINTF(L("*** no match in recognition***\n"));
+
+    if ( grammar_data->is_ve_grammar == ESR_TRUE )
+        {
+        data->nametag = NULL;
+        LPRINTF ( L("VoiceEnrollement = FAILED : \n") );
+        }
+    esr_status = SR_RecognizerIsSignalClipping ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal is clipping\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalDCOffset ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal is DC-offset\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalNoisy ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal is noisy\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalTooFewSamples ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal has too few samples\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalTooManySamples ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal has too many samples\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    esr_status = SR_RecognizerIsSignalTooQuiet ( data->recognizer, &reason_status );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( reason_status == ESR_TRUE )
+            LPRINTF ( L("- Signal is too quiet\n") );
+        }
+    else
+        {
+        process_status = -1;
+        /* Log Here */
+        }
+    srec_test_log_recognition_failure ( data );
+    return ( process_status );
+    }
+
+
+
+int srec_test_process_recognition_unsupported_case ( ApplicationData *data, FILE *results_file )
+    {
+    int process_status;
+
+    process_status = 0;
+    LFPRINTF ( results_file, L("E: No results available\n") );
+    LFPRINTF ( results_file, L("R: <FAILED>\n") );
+    srec_test_log_recognition_failure ( data );
+
+    return ( process_status );
+    }
+
+
+
+static void srec_test_log_recognition_failure ( ApplicationData *data )
+    {
+
+    LPRINTF(L("----------------------------------------------\n"));
+    LPRINTF(L("TRANSCRIPTION    : '%s'\n"), data->transcription);
+    LPRINTF(L("<NO-RESULTS>\n"));
+    LPRINTF(L("----------------------------------------------\n\n"));
+    }
+
+
+
+int srec_test_process_results ( ApplicationData *data, SR_RecognizerStatus esr_recog_status,
+                                FILE *results_file, size_t recognition_count )
+    {
+    int process_status;
+
+    switch ( esr_recog_status )
+        {
+        case SR_RECOGNIZER_EVENT_START_OF_UTTERANCE_TIMEOUT:
+            process_status = srec_test_process_start_timeout ( data, results_file );
+            break;
+
+        case SR_RECOGNIZER_EVENT_RECOGNITION_RESULT:
+            process_status = srec_test_process_recognition ( data, results_file, recognition_count );
+            break;
+
+        case SR_RECOGNIZER_EVENT_NO_MATCH:
+            process_status = srec_test_process_recognition_fail ( data );
+            break;
+
+        default:
+            process_status = srec_test_process_recognition_unsupported_case ( data, results_file );
+            break;
+        }
+    return ( process_status );
+    }
+
+
+
+int srec_test_log_reco_from_file_data ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *waveform, LCHAR *bos, LCHAR *eos, LCHAR *transcription )
+    {
+    int             log_status;
+    ESR_ReturnCode  esr_status;
+    size_t          result_count;
+    ESR_BOOL            got_results;
+    size_t          transcription_length;
+
+    log_status = 0;
+    LSPRINTF ( data->transcription, "%s", transcription );
+    transcription_length = LSTRLEN ( data->transcription );
+
+    while ( ( *( data->transcription + transcription_length - 1 ) == '\n' ) ||
+            ( *( data->transcription + transcription_length - 1 ) == '\r' ) )
+        {
+        *( data->transcription + transcription_length - 1 ) = '\0';
+        transcription_length--;
+        }
+    LPRINTF ( L("D: %s\nC: %s\n"), waveform, data->transcription );
+    esr_status = SR_GrammarCheckParse ( active_grammar, data->transcription, 0, &result_count );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        if ( result_count > 0 )
+            {
+            got_results = ESR_TRUE;
+            LPRINTF ( L("Sem (%lu):  invocab=1\n"), (unsigned long)result_count );
+            }
+        else
+            {
+            got_results = ESR_FALSE;
+            LPRINTF ( L("Sem:  <NO INTERPRETATION FOUND>\n") );
+            }
+        esr_status = SR_RecognizerLogWaveformData ( data->recognizer, waveform, data->transcription, atof ( bos ), atof ( eos ), got_results );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+            log_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        log_status = -1;
+        /* Log Here */
+        }
+    return ( log_status );
+    }
+
+
+
+int srec_test_start_audio ( AUDIOIN_H audio_input_handle )
+    {
+    int                     start_status;
+    LHS_AUDIOIN_ERROR       audio_status;
+
+    start_status = 0;
+    audio_status = lhs_audioinStart ( audio_input_handle );
+
+    if ( audio_status == LHS_AUDIOIN_OK )
+        {
+        LPRINTF ( L("\n!!!!!! Start Speaking !!!!!!....\n") );
+        }
+    else
+        {
+        start_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, "Audio Device Failed To Start" );
+        }
+    return ( start_status );
+    }
+
+
+
+int srec_test_stop_audio ( AUDIOIN_H audio_input_handle )
+    {
+    int                     stop_status;
+    LHS_AUDIOIN_ERROR       audio_status;
+
+    stop_status = 0;
+    audio_status = lhs_audioinStop ( audio_input_handle );
+
+    if ( audio_status == LHS_AUDIOIN_OK )
+        {
+        LPRINTF ( L("\n!!!!!! Audio Stopped !!!!!!....\n") );
+        }
+    else
+        {
+        stop_status = -1;
+        /* Log Here */
+        }
+    return ( stop_status );
+    }
+
+
+int srec_test_get_audio_from_live_input ( ApplicationData *data, AUDIOIN_H audio_input_handle, ESR_BOOL *hit_eof )
+    {
+    int                     get_status;
+    LHS_AUDIOIN_ERROR       audio_status;
+    AUDIOIN_INFO            input_status;
+    unsigned long data__num_samples_read;
+
+    get_status = 0;
+    *hit_eof = ESR_FALSE;
+    data->num_samples_read = data->audio_buffer_requested_size;
+    data__num_samples_read = data->num_samples_read;
+    audio_status = lhs_audioinGetSamples ( audio_input_handle, &data__num_samples_read, data->audio_buffer, &input_status );
+    data->num_samples_read = (unsigned  int)data__num_samples_read;
+
+    if ( audio_status == LHS_AUDIOIN_OK )
+        {
+        if ( data->num_samples_read == 0 )
+            *hit_eof = ESR_TRUE;
+        }
+    else
+        {
+        get_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, "Audio Device Failed To Read" );
+        }
+    return ( get_status );
+    }
+
+
+
+static int srec_test_recognize_live ( SR_Grammar *active_grammar, ApplicationData *data, AUDIOIN_H audio_input_handle, FILE *results_file, size_t *recognition_count )
+    {
+    int                     recognize_status;
+    ESR_ReturnCode          esr_status;
+    SR_RecognizerStatus     esr_recog_status;
+    SR_RecognizerResultType result_type;
+    ESR_BOOL                    hit_eof;
+
+    if ( active_grammar != NULL )
+        {
+        recognize_status = srec_test_start_audio ( audio_input_handle );
+
+        if ( recognize_status == 0 )
+            {
+            if ( ( data->forced_rec_mode == ForcedRecModeOn ) || ( data->forced_rec_mode == ForcedRecModeOneTime ) )
+                SR_GrammarAllowOnly ( active_grammar, data->transcription );
+            esr_status = SR_RecognizerStart ( data->recognizer );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                ( *recognition_count )++;
+                hit_eof = ESR_FALSE;
+
+                do
+                    {
+                    recognize_status = srec_test_get_audio_from_live_input ( data, audio_input_handle, &hit_eof );
+
+                    if ( recognize_status == 0 )
+                        recognize_status = srec_test_feed_recognizer ( data, hit_eof, &esr_recog_status, &result_type  );
+                    }
+                while ( ( hit_eof == ESR_FALSE ) && ( result_type != SR_RECOGNIZER_RESULT_TYPE_COMPLETE ) && ( recognize_status == 0 ) );
+
+                if ( recognize_status == 0 )
+                    {
+                    recognize_status = srec_test_flush_audio ( data, &esr_recog_status, &result_type );
+
+                    if ( recognize_status == 0 )
+                        {
+                        recognize_status = srec_test_process_results ( data, esr_recog_status, results_file, *recognition_count );
+                        }
+                    }
+                }
+                esr_status = SR_RecognizerStop ( data->recognizer );
+
+                if (esr_status == ESR_SUCCESS )
+                    {
+                    LPRINTF ( L("Recognizer has been stopped\n") );
+                    }
+                else
+                    {
+                    recognize_status = -1;
+                    LPRINTF ( L("Recognizer has failed to stop\n") );
+                    }
+            if ( data->forced_rec_mode == ForcedRecModeOneTime )
+                {
+                data->forced_rec_mode = ForcedRecModeOff;
+                SR_GrammarAllowAll ( active_grammar );
+                }
+            srec_test_stop_audio ( audio_input_handle );
+            }
+        }
+     else
+         {
+         recognize_status = -1;
+         /* Log Here */
+         }
+     return ( recognize_status );
+     }
+
+
+
+#define STACK_SIZE (1024 * 200)
+
+#ifdef _WIN32
+/* disable optimization for the next functions as the compiler optimizes away the assignment to mySTACK[i] */
+#pragma optimize("", off)
+
+static void initStack()
+{
+  int mySTACK[STACK_SIZE];
+ {
+   /* This extra block is to ensure that local variables of the function occur after buffer mySTACK. */
+   int i;
+
+   for (i = 0; i < STACK_SIZE; ++i)
+   {
+     mySTACK[i] = 0xDEADBEEF;
+   }
+ }
+}
+
+static int analyzeStack()
+{
+  int mySTACK[STACK_SIZE];
+ {
+
+   /* This extra block is to ensure that local variables of the function occur after buffer mySTACK. */
+   int i, j;
+
+   for (i = STACK_SIZE - 1; i >= 0; --i)
+   {
+     if (mySTACK[i] == 0xDEADBEEF)
+     {
+       /* This might be a candidate for the end of stack marker, or it could be
+          some value that is equal to our marker.  To ensure reliability of
+          this candidate, we will make sure that all remaining entries int the
+          stack are also equal to DEADBEEF.
+       */
+       for (j = i - 1; j >= 0; --j)
+       {
+         if (mySTACK[j] != 0xDEADBEEF)
+         {
+           i = j;
+           break;
+         }
+       }
+       if (j < 0) break;
+     }
+   }
+
+   if (i < 0)
+     return -1;
+   else
+     return (STACK_SIZE - 1 - i) * sizeof(int);
+ }
+}
+
+/* restore optmization settings to what they used to be. */
+#pragma optimize("", on)
+#endif
+
+
+#ifdef ACCURACY_TESTING
+static void srec_test_clean_up_sentence ( char* sentence )
+    {
+    int                         clean_up_status;
+    int                         sentence_finished;
+    SENTENCE_CLEANING_STATES    current_state;
+    char                        *current_input;
+    char                        *current_output;
+
+    clean_up_status = 0;
+    sentence_finished = 0;
+    current_state = SENTENCE_BEGIN;
+    current_input = sentence;
+    current_output = sentence;
+
+    do
+        {
+        switch ( *current_input )
+            {
+            case '\0':
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:  /* Is this error condition */
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        *current_output = '\0';
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = '\0';
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */
+                        *( current_output - 1 ) = '\0';
+                        clean_up_status = -1;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        *( current_output - 1 ) = '\0';
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        *( current_output - 1 ) = '\0';
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        /* Log error */
+                        break;
+                    }
+                sentence_finished = 1;
+                break;
+
+            case ' ':
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = ' ';
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE_WITH_SPACE;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+                    }
+                current_input++;
+                break;
+
+            case '[':
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        current_state = SENTENCE_BEGIN_BRACKET_BEGIN;
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        current_state = SENTENCE_BEGIN_BRACKET_BEGIN;
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = ' ';
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE_BRACKET_BEGIN;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        current_state = SENTENCE_MIDDLE_BRACKET_BEGIN;
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        current_state = SENTENCE_MIDDLE_BRACKET_BEGIN;
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+                    }
+                current_input++;
+                break;
+
+            case ']':
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:
+                        current_state = SENTENCE_BEGIN_BRACKET_END;
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */
+                        current_state = SENTENCE_MIDDLE_BRACKET_END;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+                    }
+                current_input++;
+                break;
+
+            default:
+                switch ( current_state )
+                    {
+                    case SENTENCE_BEGIN:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_BEGIN:
+                        break;
+
+                    case SENTENCE_BEGIN_BRACKET_END:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    case SENTENCE_MIDDLE:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_BEGIN:
+                        break;
+
+                    case SENTENCE_MIDDLE_BRACKET_END:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    case SENTENCE_MIDDLE_WITH_SPACE:
+                        *current_output = *current_input;
+                        current_output++;
+                        current_state = SENTENCE_MIDDLE;
+                        break;
+
+                    default:
+                        *current_output = '\0';
+                        clean_up_status = -1;
+                        /* Log error */
+                        break;
+                    }
+                current_input++;
+                break;
+            }
+        }
+    while ( ( sentence_finished == 0 ) && ( clean_up_status == 0 ) );
+    }
+
+
+
+ESR_ReturnCode srec_test_parse ( SR_Grammar* grammar, const LCHAR* trans, LCHAR* meaning, size_t *len )
+    {
+    ESR_ReturnCode      parse_status;
+    char                cleaned_trans[TRANSCRIPTION_SIZE];
+    SR_SemanticResult   *semanticResults;
+    size_t              result_count;
+
+    result_count = 0;
+    strcpy( cleaned_trans, trans );
+    srec_test_clean_up_sentence ( cleaned_trans );
+
+  /* create the result holders, initially not greater than MAX */
+    parse_status = SR_SemanticResultCreate ( &semanticResults );
+
+    if ( parse_status == ESR_SUCCESS )
+        {
+        result_count = 1;
+        parse_status = SR_SemanticProcessor_Flush( ( (SR_GrammarImpl*)grammar )->semproc );
+
+        if ( parse_status == ESR_SUCCESS )
+            {
+            parse_status = SR_SemanticProcessor_SetParam( ((SR_GrammarImpl*)grammar)->semproc, L("literal"), cleaned_trans );
+
+            if ( parse_status == ESR_SUCCESS )
+                {
+                parse_status = grammar->checkParse ( grammar, cleaned_trans, &semanticResults, (size_t*)&result_count );
+
+                if ( parse_status == ESR_SUCCESS )
+                    {
+                    if ( result_count < 1 )
+                        {
+                        LSTRCPY ( meaning, L("") );
+                        SR_SemanticResultDestroy( semanticResults);
+                        parse_status = ESR_NO_MATCH_ERROR;
+                        }
+                    else
+                        {
+                        parse_status = semanticResults->getValue ( semanticResults, "meaning", meaning, len);
+                        SR_SemanticResultDestroy( semanticResults);
+                        }
+                    }
+                }
+            }
+        }
+    return ( parse_status );
+    }
+#endif
+
+
+static int srec_test_get_run_params ( unsigned int *num_shutdown_loops, unsigned int *num_continuous_run_loops )
+    {
+    int get_status;
+
+    get_status = get_num_srec_test_shutdown_times ( num_shutdown_loops );
+
+    if ( get_status == 0 )
+                get_status = get_num_srec_test_continuous_loops ( num_continuous_run_loops );
+
+    return ( get_status );
+    }
+
+
+
+static int srec_test_shutdown_application_data ( ApplicationData *applicationData )
+    {
+    int init_status;
+    int i;
+
+    init_status = 0;
+
+    applicationData->argc = 0;
+    applicationData->argv = NULL;
+    applicationData->outputLog = PSTDOUT;       // may need to check if non PSTDOUT or non PSTDERROR
+    applicationData->locale = -1;
+
+    if (applicationData->recognizer != NULL)
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Recognizer") );
+/*        SR_RecognizerLogSessionEnd ( applicationData->recognizer );
+        SR_RecognizerDestroy ( applicationData->recognizer );*/
+        applicationData->recognizer = NULL;
+        applicationData->result = NULL;                 // this was deallocated by SR_RecognizerDestroy()
+        }
+
+    if (applicationData->vocabulary != NULL)
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Vocabulary") );
+/*        SR_VocabularyDestroy(applicationData->vocabulary);
+        applicationData->vocabulary = NULL;*/
+        }
+
+
+    if (applicationData->nametag != NULL)
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup NameTag") );
+/*        SR_NametagDestroy(applicationData->nametag);
+        applicationData->nametag = NULL;*/
+        }
+
+    if (applicationData->nametags != NULL)
+        {
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup NameTagSet") );
+/*        SR_NametagsDestroy(applicationData->nametags);
+        applicationData->nametags = NULL;*/
+        }
+
+    for (i = 0; i < applicationData->grammarCount; ++i)
+        srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Grammar") );
+/*
+        if ( applicationData->grammars [i] != NULL )
+            {
+            printf ( "!!!!!!!!  %d Grammars Not Destroyed !!!!!!!!!!!!\n", i );
+            SR_GrammarDestroy(applicationData->grammars[i]);
+            applicationData->grammars[i] = NULL;
+            }
+        }
+
+    applicationData->activeGrammar = -1;
+    applicationData->activeRule = NULL;
+    applicationData->voiceEnrollment = NULL;
+*/
+    applicationData->raw_waveform = NULL;
+    applicationData->raw_waveform_filename [0] = L( '\0' );
+    applicationData->raw_waveform_file = NULL;
+    applicationData->transcription[0] = L( '\0' );
+    applicationData->forced_rec_mode = ForcedRecModeNotSet;
+
+    return ( init_status );
+    }
+
+
+
+static int srec_test_init_application_data ( ApplicationData *applicationData, int arg_count, LCHAR *arg_vals [] )
+    {
+    int init_status;
+
+    init_status = 0;
+    applicationData->argc = arg_count;
+    applicationData->argv = arg_vals;
+    applicationData->outputLog = PSTDOUT;
+    applicationData->locale = -1;
+    applicationData->recognizer = NULL;
+    applicationData->result = NULL;
+    applicationData->vocabulary = NULL;
+    applicationData->nametag = NULL;
+    applicationData->nametags = NULL;
+    applicationData->grammarCount = 0;  /* No need to initialize arrays, index is 0 */
+    applicationData->active_grammar_num = -1;
+/*    applicationData->activeRule = NULL;
+    applicationData-> = applicationData->voiceEnrollment = NULL;*/
+    applicationData->audio_buffer_requested_size = DEFAULT_AUDIO_BUFFER_SIZE;
+    applicationData->raw_waveform = NULL;
+    applicationData->raw_waveform_filename [0] = L( '\0' );
+    applicationData->raw_waveform_file = NULL;
+    applicationData->transcription[0] = L( '\0' );
+    applicationData->forced_rec_mode = ForcedRecModeNotSet;
+    return ( init_status );
+    }
+
+
+static int srec_test_run_test_shutdown_session ( ApplicationData *applicationData )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+
+    SR_RecognizerUnsetup ( applicationData->recognizer); // releases acoustic models
+    SR_RecognizerDestroy ( applicationData->recognizer );
+    applicationData->recognizer = NULL;
+    ShutdownSession ( );
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_run_test_init_session ( ApplicationData *applicationData )
+{
+  int             run_status;
+  ESR_ReturnCode  esr_status;
+  
+  run_status = 0;
+  LPRINTF(L("\nCreate recognizer:\n"));
+  LPRINTF(L("    InitSession()\n"));
+  esr_status = InitSession ( applicationData->argc, applicationData->argv );
+  
+  if ( esr_status == ESR_SUCCESS )
+    {
+      LPRINTF(L("    SR_RecognizerCreate()\n"));
+      esr_status = SR_RecognizerCreate ( &applicationData->recognizer );
+      
+      if ( esr_status != ESR_SUCCESS )
+	{
+	  ShutdownSession ( );
+	  run_status = -1;
+	  /* Log Here */
+	} else {
+	  LPRINTF(L("    SR_RecognizerSetup()\n"));
+	  esr_status = SR_RecognizerSetup ( applicationData->recognizer); 
+	  if ( esr_status != ESR_SUCCESS )
+	    {
+	      ShutdownSession ( );
+	      run_status = -1;
+	      /* Log Here */
+	    }
+	} 
+    }
+  return ( run_status );
+}
+
+
+static int srec_test_run_test_shutdown_vocab_grammar ( ApplicationData *applicationData )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+    SR_RecognizerLogSessionEnd ( applicationData->recognizer );
+/*    SR_GrammarDestroy ( applicationData->grammars [0].grammar );
+    applicationData->grammars [0].grammar = NULL;*/
+    SR_VocabularyDestroy ( applicationData->vocabulary );
+    applicationData->vocabulary = NULL;
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_run_test_init_vocab_grammar ( ApplicationData *applicationData )
+    {
+    int             run_status;
+    ESR_ReturnCode  esr_status;
+    LCHAR           filename[P_PATH_MAX];
+    size_t          len;
+
+    run_status = 0;
+   /* Create vocabulary object and associate with grammar */
+    LPRINTF(L("Create vocabulary object and associate with grammar:\n"));
+    len = P_PATH_MAX;
+    esr_status = ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), filename, &len );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        LPRINTF(L("    SR_VocabularyLoad()\n"));
+        esr_status = SR_VocabularyLoad ( filename, &applicationData->vocabulary );
+
+        if ( esr_status == ESR_SUCCESS )
+            {
+            LPRINTF(L("    SR_VocabularyGetLanguage()\n"));
+            esr_status =  SR_VocabularyGetLanguage ( applicationData->vocabulary, &applicationData->locale );
+
+            if ( esr_status == ESR_SUCCESS )
+                {
+                /* start a new log session */
+                LPRINTF( L("Start a new log session:\n") );
+                LPRINTF( L("    SR_RecognizerLogSessionStart()\n") );
+                esr_status = SR_RecognizerLogSessionStart ( applicationData->recognizer, L("SRecTest.session1") );
+
+                if ( esr_status != ESR_SUCCESS )
+                    {
+                    SR_VocabularyDestroy ( applicationData->vocabulary );
+                    applicationData->vocabulary = NULL;
+                    run_status = -1;
+                    /* Log here */
+                    }
+                }
+            else
+                {
+                SR_VocabularyDestroy ( applicationData->vocabulary );
+                applicationData->vocabulary = NULL;
+                run_status = -1;
+                /* Log Here */
+                }
+            }
+        else
+            {
+            run_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        run_status = -1;
+        /* Log Here */
+        }
+    return ( run_status );
+    }
+
+
+
+static int srec_test_run_test_shutdown ( ApplicationData *applicationData )
+    {
+    int shutdown_status;
+
+    shutdown_status = srec_test_run_test_shutdown_vocab_grammar ( applicationData );
+
+    if ( shutdown_status == 0 )
+        {
+            shutdown_status = srec_test_run_test_shutdown_session ( applicationData );
+        }
+    return ( shutdown_status );
+    }
+
+
+static int srec_test_run_test_init ( ApplicationData *applicationData )
+{
+  int run_status;
+  
+  run_status = srec_test_run_test_init_session ( applicationData );
+  
+  if ( run_status == 0 )
+    {
+      run_status = srec_test_run_test_init_vocab_grammar ( applicationData );
+      
+      if ( run_status != 0 )
+	{
+	  srec_test_run_test_shutdown_session ( applicationData );
+	}
+    } 
+  else
+    {
+      srec_test_run_test_shutdown_session ( applicationData );
+    }
+  return ( run_status );
+}
+
+
+static int srec_test_run_test_execute ( ApplicationData *applicationData, AUDIOIN_H audio_input_handle )
+    {
+    int             run_status;
+    ESR_ReturnCode  esr_status;
+
+    run_status = 0;
+    applicationData->nametag = NULL;
+
+    LPRINTF(L("Recognize:\n"));
+    LPRINTF(L("    SR_NametagsCreate()\n"));
+    esr_status = SR_NametagsCreate ( &applicationData->nametags );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        run_status = srec_test_process_commands ( applicationData, audio_input_handle );
+        SR_NametagsDestroy ( applicationData->nametags );
+        applicationData->nametags = NULL;
+
+        if ( run_status != 0 )
+            {
+            /* Log Here */
+            }
+        }
+    else
+        {
+        run_status = -1;
+        /* Log Here */
+        }
+    return ( run_status );
+    }
+
+
+
+static int srec_test_run_test ( ApplicationData *applicationData, AUDIOIN_H audio_input_handle )
+    {
+    int run_status;
+
+    run_status = srec_test_run_test_init ( applicationData );
+
+    if ( run_status == 0 )
+        {
+        run_status = srec_test_run_test_execute ( applicationData, audio_input_handle );
+        srec_test_run_test_shutdown ( applicationData );
+        }
+    return ( run_status );
+    }
+
+
+
+static int srec_test_shutdown_memory_system ( void )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+    PMemShutdown ( );
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_init_memory_system ( unsigned int srec_test_heap_size )
+    {
+    int             init_status;
+    ESR_ReturnCode  esr_status;
+
+    init_status = 0;
+    esr_status = PMemInit ( );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        PSTACK_SIZE_INIT ( );   /* I don't know what this is, it should probably have a status */
+        }
+    else
+        {
+        init_status = -1;
+        /* Log Here */
+        }
+    return ( init_status );
+    }
+
+
+
+static int srec_test_shutdown_file_system ( void )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_init_file_system ( int arg_count, LCHAR *arg_vals [] )
+    {
+    int             init_status;
+
+    init_status = 0;
+    return ( init_status );
+    }
+
+
+
+static int srec_test_shutdown_logging_system ( PLogger *logger )
+    {
+    int shutdown_status;
+
+    shutdown_status = 0;
+    PLogShutdown ( );
+
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_init_logging_system ( int arg_count, LCHAR *arg_vals [], PLogger *logger )
+    {
+    int             init_status;
+    ESR_ReturnCode  esr_status;
+
+    init_status = 0;
+    esr_status = PLogCreateFileLogger ( PSTDOUT, &logger );
+
+    if ( esr_status == ESR_SUCCESS )
+        {
+        esr_status = PLogInit ( logger, 0 );
+
+        if ( esr_status != ESR_SUCCESS )
+            {
+/*          pfclose ( (struct PFile_t *)logger );       I'm not sure this is correct, check with Gili */
+            init_status = -1;
+            /* Log Here */
+            }
+        }
+    else
+        {
+        init_status = -1;
+        /* Log Here */
+        }
+    return ( init_status );
+    }
+
+
+
+static int srec_test_init_audio_input ( AUDIOIN_H *audio_input_handle )
+    {
+    int                 init_status;
+    LHS_AUDIOIN_ERROR   audio_status;
+
+    init_status = 0;
+    audio_status = lhs_audioinOpen ( WAVE_MAPPER, SREC_TEST_DEFAULT_AUDIO_FREQUENCY, audio_input_handle );
+
+    if ( audio_status != LHS_AUDIOIN_OK )
+        {
+        init_status = -1;
+        srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, "Audio Device Failed To Open" );
+        }
+    return ( init_status );
+    }
+
+
+
+static int srec_test_shutdown_audio_input ( AUDIOIN_H *audio_input_handle )
+    {
+    int                 shutdown_status;
+    LHS_AUDIOIN_ERROR   audio_status;
+
+    shutdown_status = 0;
+    audio_status = lhs_audioinClose ( audio_input_handle );
+
+    if ( audio_status != LHS_AUDIOIN_OK )
+        {
+        shutdown_status = -1;
+        /* Log Here */
+        }
+    return ( shutdown_status );
+    }
+
+
+
+static int srec_test_shutdown_system ( PLogger *logger, AUDIOIN_H *audio_input_handle )
+    {
+    int shutdown_status;
+
+    shutdown_status = srec_test_shutdown_audio_input ( audio_input_handle );
+
+    if ( shutdown_status == 0 )
+        {
+        shutdown_status = srec_test_shutdown_logging_system ( logger );
+
+        if ( shutdown_status == 0 )
+            {
+            shutdown_status = srec_test_shutdown_file_system ( );
+
+            if ( shutdown_status == 0 )
+                shutdown_status = srec_test_shutdown_memory_system ( );
+            }
+        }
+    return ( shutdown_status );
+    }
+
+
+
+
+static int srec_test_init_system ( unsigned int srec_test_heap_size, PLogger* logger, int arg_count, LCHAR *arg_vals [], AUDIOIN_H *audio_input_handle )
+    {
+    int init_status;
+
+   /* register signal handler so cleanup works on CTRL-C (Win32) */
+#ifdef _WIN32
+    signal(SIGINT, signal_handler_SIGINT);
+#endif
+    init_status = srec_test_init_memory_system ( srec_test_heap_size );
+
+    if ( init_status == 0 )
+        {
+        init_status = srec_test_init_file_system ( arg_count, arg_vals );
+
+        if ( init_status == 0 )
+            {
+            init_status = srec_test_init_logging_system ( arg_count, arg_vals, logger );
+
+            if ( init_status == 0 )
+                {
+                init_status = srec_test_init_audio_input ( audio_input_handle );
+
+                if ( init_status != 0 )
+                    {
+                    srec_test_shutdown_logging_system ( logger );
+                    srec_test_shutdown_file_system ( );
+                    srec_test_shutdown_memory_system ( );
+                    }
+                }
+            else
+                {
+                srec_test_shutdown_file_system ( );
+                srec_test_shutdown_memory_system ( );
+                }
+            }
+        else
+            {
+            srec_test_shutdown_memory_system ( );
+            }
+        }
+    return ( init_status );
+    }
+
+
+
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+_CrtMemState s0,s1,s2;
+
+
+
+void OutputDivider( void )
+    {
+
+    _RPT1(_CRT_WARN, "%s", "********************************************************************\n");
+    }
+
+
+
+void OutputNewline( void )
+    {
+
+    _RPT1(_CRT_WARN, "%s", "\n");
+    }
+#endif
+
+
+
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+void initialize_heap_logging ( void )
+    {
+
+     _CrtSetReportMode(_CRT_WARN,   _CRTDBG_MODE_FILE);
+     _CrtSetReportFile(_CRT_WARN,   _CRTDBG_FILE_STDOUT);
+     _CrtSetReportMode(_CRT_ERROR,  _CRTDBG_MODE_FILE);
+     _CrtSetReportFile(_CRT_ERROR,  _CRTDBG_FILE_STDOUT);
+     _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
+     _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
+     _CrtMemCheckpoint(&s0);
+     }
+#endif
+
+
+
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+void execute_heap_logging ( void )
+    {
+    OutputNewline();
+    OutputDivider();
+    _RPT1(_CRT_WARN, "%s", "After cleanup, before exiting main()\n");
+    OutputDivider();
+    _CrtMemCheckpoint(&s1);
+    _CrtMemDifference(&s2, &s0, &s1);
+    _CrtMemDumpStatistics(&s2);
+    OutputNewline();
+    OutputDivider();
+    _RPT1(_CRT_WARN, "%s", "Checking for memory leaks...\n");
+    OutputDivider();
+    _CrtDumpMemoryLeaks();
+    }
+#endif
+
+
+
+int main(int argc, LCHAR* argv [] )
+    {
+     int             test_status;
+     unsigned int    num_shutdown_loops;
+     unsigned int    current_shutdown_loop;
+     unsigned int    num_continuous_run_loops;
+     unsigned int    current_continuous_run_loop;
+     unsigned int    srec_test_heap_size;
+
+#ifdef _WIN32
+    initStack();
+#endif
+        {
+    /* This extra block is there to get a more precise estimate of the stack
+      depth.  This way we also make sure that the local variables of main are
+      taken into acount when estimating the stack size.
+   */
+        ApplicationData applicationData;
+        PLogger         *logger;
+        AUDIOIN_H       audio_in_handle;
+
+        srec_test_heap_size = ( 4 * 1024 * 1024 );
+        logger = NULL;
+        test_status = srec_test_get_run_params ( &num_shutdown_loops, &num_continuous_run_loops );
+
+        if ( test_status == 0 )
+            {
+            current_shutdown_loop = 0;
+
+            while ( ( current_shutdown_loop < num_shutdown_loops )/* && ( test_status == 0 )*/ )
+                {
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+                initialize_heap_logging ( );
+#endif
+                test_status = srec_test_init_system ( srec_test_heap_size, logger, argc, argv, &audio_in_handle );
+
+                if ( test_status == 0 )
+                    {
+                    current_continuous_run_loop = 0;
+
+                    while ( ( current_continuous_run_loop < num_continuous_run_loops ) && ( test_status == 0 ) )
+                        {
+                        test_status = srec_test_init_application_data ( &applicationData, argc, argv );
+
+                        if ( test_status == 0 )
+                            {
+                            test_status = srec_test_run_test ( &applicationData, audio_in_handle );
+                            srec_test_shutdown_application_data ( &applicationData );
+                            }
+                        current_continuous_run_loop++;
+                        }
+                    test_status = srec_test_shutdown_system ( logger, &audio_in_handle );
+                    }
+                current_shutdown_loop++;
+#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32)
+                execute_heap_logging ( );
+#endif
+                }
+            }
+        }
+
+    return ( test_status );
+    }
+
+
diff --git a/srec/test/SRecTestAudio/src/srec_test_config.c b/srec/test/SRecTestAudio/src/srec_test_config.c
new file mode 100644
index 0000000..4569130
--- /dev/null
+++ b/srec/test/SRecTestAudio/src/srec_test_config.c
@@ -0,0 +1,72 @@
+/*---------------------------------------------------------------------------*
+ *  srec_test_config.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "srec_test_config.h"
+
+static unsigned int	num_test_shutdown_times = 1;	/* Number of times to shutdown and restart during test */
+static unsigned int	num_test_continuous_loops = 1;	/* Number of loops to run between start and shutdown */
+
+
+
+int get_num_srec_test_shutdown_times ( unsigned int *shutdown_times )
+    {
+    int get_status;
+
+    *shutdown_times = num_test_shutdown_times;
+    get_status = 0;
+
+    return ( get_status );
+    }
+
+
+
+int set_num_srec_test_shutdown_times ( unsigned int shutdown_times )
+    {
+    int set_status;
+
+    num_test_shutdown_times = shutdown_times;
+    set_status = 0;
+
+    return ( set_status );
+    }
+
+
+
+int get_num_srec_test_continuous_loops ( unsigned int *continuous_loops )
+    {
+    int get_status;
+
+    *continuous_loops = num_test_continuous_loops;
+    get_status = 0;
+
+    return ( get_status );
+    }
+
+
+
+int set_num_srec_test_continuous_loops ( unsigned int continuous_loops )
+    {
+    int set_status;
+
+    num_test_continuous_loops = continuous_loops;
+    set_status = 0;
+
+    return ( set_status );
+    }
+
diff --git a/srec/test/SRecTestAudio/src/srec_test_config.h b/srec/test/SRecTestAudio/src/srec_test_config.h
new file mode 100644
index 0000000..a8ed11b
--- /dev/null
+++ b/srec/test/SRecTestAudio/src/srec_test_config.h
@@ -0,0 +1,29 @@
+/*---------------------------------------------------------------------------*
+ *  srec_test_config.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+extern int	get_num_srec_test_continuous_loops ( unsigned int *continuous_loops );
+extern int	get_num_srec_test_shutdown_times ( unsigned int *shutdown_times );
+extern int	set_num_srec_test_continuous_loops ( unsigned int continuous_loops );
+extern int	set_num_srec_test_shutdown_times ( unsigned int shutdown_times );
+
+/*
+ *	All functions return 0 on success, -1 on failure
+ */
+
+
diff --git a/tests/Android.mk b/tests/Android.mk
new file mode 100644
index 0000000..c6b675d
--- /dev/null
+++ b/tests/Android.mk
@@ -0,0 +1,137 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+#####################################################################
+# Compiled grammars, TCP test scripts, audio data and shell scripts #
+#####################################################################
+
+copy_from :=                                       \
+    ../config/en.us/tcp/bothtags5.tcp              \
+    ../config/en.us/tcp/bothtags5_from_saved.tcp   \
+    ../config/en.us/tcp/change_sample_rate2.tcp    \
+    ../config/en.us/tcp/recognize_1_live.tcp       \
+    ../config/en.us/tcp/recognize_10_live.tcp      \
+    ../config/en.us/tcp/set_get_param.tcp          \
+    ../config/en.us/audio/v139/v139_024.nwv        \
+    ../config/en.us/audio/v139/v139_254.nwv        \
+    ../config/en.us/audio/v139/v139_127.nwv        \
+    ../config/en.us/audio/v139/v139_107.nwv        \
+    ../config/en.us/audio/v139/v139_248.nwv        \
+    ../config/en.us/audio/v139/v139_077.nwv        \
+    ../config/en.us/audio/v139/v139_040.nwv        \
+    ../config/en.us/audio/v139/v139_021.nwv        \
+    ../config/en.us/audio/v139/v139_206.nwv        \
+    ../config/en.us/audio/v139/v139_103.nwv        \
+    ../config/en.us/audio/v139/v139_113.nwv        \
+    ../config/en.us/audio/v139/v139_067.nwv        \
+    ../config/en.us/audio/v139/v139_202.nwv        \
+    ../config/en.us/audio/v139/v139_007.nwv        \
+    ../config/en.us/audio/v139/v139_189.nwv        \
+    ../config/en.us/audio/m252/m252a12e.nwv        \
+    ../config/en.us/audio/m252/m252a22e.nwv        \
+    ../config/en.us/audio/m252/m252a10e.nwv        \
+    ../config/en.us/audio/m252/m252a3fe.nwv        \
+    ../config/en.us/audio/m252/m252a11e.nwv        \
+    ../config/en.us/audio/m252/m252a21e.nwv        \
+    ../config/en.us/audio/m252/m252a24e.nwv        \
+    ../config/en.us/wave/dallas/0000/S072.nwf      \
+    ../config/en.us/wave/dallas/0000/S074.nwf      \
+    ../config/en.us/wave/dallas/0000/S075.nwf      \
+    ../config/en.us/wave/dallas/0000/S076.nwf      \
+    ../config/en.us/wave/dallas/0000/S077.nwf      \
+    ../config/en.us/wave/dallas/0000/S079.nwf      \
+    ../config/en.us/wave/dallas/0000/S080.nwf      \
+    ../config/en.us/wave/dallas/0000/S083.nwf      \
+    ../config/en.us/wave/dallas/0000/S086.nwf      \
+    ../config/en.us/wave/dallas/0000/S088.nwf      \
+    ../config/en.us/wave/dallas/0300/S052.nwf      \
+    ../config/en.us/wave/dallas/0300/S053.nwf      \
+    ../config/en.us/wave/dallas/0300/S057.nwf      \
+    ../config/en.us/wave/dallas/0300/S063.nwf      \
+    ../config/en.us/wave/dallas/0300/S065.nwf      \
+    ../config/en.us/wave/dallas/0303/S080.nwf      \
+    ../config/en.us/wave/dallas/0303/S083.nwf      \
+    ../config/en.us/wave/dallas/0303/S084.nwf      \
+    ../config/en.us/wave/dallas/0303/S087.nwf      \
+    ../config/en.us/wave/dallas/0303/S088.nwf      \
+    ../config/en.us/wave/dallas/0303/S089.nwf      \
+    ../config/en.us/wave/dallas/0303/S090.nwf      \
+    ../config/en.us/wave/dallas/0304/S052.nwf      \
+    ../config/en.us/wave/dallas/0304/S054.nwf      \
+    ../config/en.us/wave/dallas/0304/S055.nwf      \
+    ../config/en.us/wave/dallas/0304/S074.nwf      \
+    ../config/en.us/wave/dallas/0304/S075.nwf      \
+    ../config/en.us/wave/dallas/0304/S076.nwf      \
+    ../config/en.us/wave/dallas/0304/S077.nwf      \
+    ../config/en.us/wave/dallas-8kHz/0301/S078.nwf \
+    ../config/en.us/wave/dallas-8kHz/0301/S079.nwf \
+    ../config/en.us/wave/dallas-8kHz/0301/S080.nwf \
+    ../config/en.us/wave/dallas-8kHz/0301/S082.nwf \
+    ../config/en.us/wave/dallas-8kHz/0301/S083.nwf \
+    ../config/en.us/wave/dallas-8kHz/0301/S089.nwf \
+    ../config/en.us/wave/dallas-8kHz/0302/S051.nwf \
+    ../config/en.us/wave/dallas-8kHz/0302/S052.nwf \
+    ../config/en.us/wave/dallas-8kHz/0302/S053.nwf \
+    ../config/en.us/wave/dallas-8kHz/0302/S054.nwf \
+    ../config/en.us/wave/dallas-8kHz/0302/S065.nwf \
+    ../config/en.us/wave/dallas-8kHz/0302/S070.nwf \
+    ../config/en.us/wave/dallas-8kHz/0302/S071.nwf \
+    ../config/en.us/run-bothtags5.sh               \
+    ../config/en.us/run-bothtags5-from-saved.sh    \
+    ../config/en.us/run-change-sample-rate2.sh     \
+    ../config/en.us/run-liveaudio.sh               \
+    ../config/en.us/run-set-get-param.sh           \
+    ../config/en.us/run-chmod.sh                   \
+
+copy_to := $(addprefix $(TARGET_OUT)/usr/srec/config/,$(copy_from))
+
+$(copy_to) : $(TARGET_OUT)/usr/srec/config/% : $(LOCAL_PATH)/% | $(ACP)
+	$(transform-prebuilt-to-target)
+
+
+#####################################################################
+# Shell scripts for UAPI tests                                      #
+#####################################################################
+
+copy_from_scripts :=     \
+    run_contacts.sh      \
+    run_ERT.sh           \
+    run_parameters.sh    \
+    run_robustness1.sh   \
+    run_robustness2.sh   \
+    run_robustness3.sh   \
+    run_UAPI_SrecTest.sh \
+    run_UAPI_Test.sh     \
+    run_voicetags1.sh    \
+    run_chmod.sh         \
+
+copy_to_scripts := $(addprefix $(TARGET_OUT)/usr/srec/,$(copy_from_scripts))
+
+$(copy_to_scripts) : $(TARGET_OUT)/usr/srec/% : $(LOCAL_PATH)/% | $(ACP)
+	$(transform-prebuilt-to-target)
+
+
+#####################################################################
+# PCM input for UAPI tests                                          #
+#####################################################################
+
+copy_from_pcm :=      \
+    ./pcm/yes_08k.pcm \
+    ./pcm/yes_11k.pcm \
+
+#   ./pcm/yes_16k.pcm \
+#   ./pcm/yes_22k.pcm \
+
+copy_to_pcm := $(addprefix $(TARGET_OUT)/usr/srec/,$(copy_from_pcm))
+
+$(copy_to_pcm) : $(TARGET_OUT)/usr/srec/% : $(LOCAL_PATH)/% | $(ACP)
+	$(transform-prebuilt-to-target)
+
+
+#####################################################################
+# Run "make srec_test_files" to install the above files.            #
+# By default they are not copied to /system/usr/srec since they are #
+# only required by the SREC and UAPI tests.                         #
+#####################################################################
+
+srec_test_files : $(copy_to) $(copy_to_scripts) $(copy_to_pcm) srec_grammars
diff --git a/tests/pcm/alabama_08k.pcm b/tests/pcm/alabama_08k.pcm
new file mode 100644
index 0000000..7d102e9
--- /dev/null
+++ b/tests/pcm/alabama_08k.pcm
Binary files differ
diff --git a/tests/pcm/california_11k.pcm b/tests/pcm/california_11k.pcm
new file mode 100644
index 0000000..7f470ca
--- /dev/null
+++ b/tests/pcm/california_11k.pcm
Binary files differ
diff --git a/tests/pcm/longwav_08k.wav b/tests/pcm/longwav_08k.wav
new file mode 100644
index 0000000..1b5fab1
--- /dev/null
+++ b/tests/pcm/longwav_08k.wav
Binary files differ
diff --git a/tests/pcm/longwav_11k.wav b/tests/pcm/longwav_11k.wav
new file mode 100644
index 0000000..1e0010f
--- /dev/null
+++ b/tests/pcm/longwav_11k.wav
Binary files differ
diff --git a/tests/pcm/yes.wav b/tests/pcm/yes.wav
new file mode 100644
index 0000000..6adc554
--- /dev/null
+++ b/tests/pcm/yes.wav
Binary files differ
diff --git a/tests/pcm/yes_08k.pcm b/tests/pcm/yes_08k.pcm
new file mode 100644
index 0000000..6adc554
--- /dev/null
+++ b/tests/pcm/yes_08k.pcm
Binary files differ
diff --git a/tests/pcm/yes_11k.pcm b/tests/pcm/yes_11k.pcm
new file mode 100644
index 0000000..a6c93e3
--- /dev/null
+++ b/tests/pcm/yes_11k.pcm
Binary files differ
diff --git a/tests/pcm/yes_16k.pcm b/tests/pcm/yes_16k.pcm
new file mode 100644
index 0000000..499e4eb
--- /dev/null
+++ b/tests/pcm/yes_16k.pcm
Binary files differ
diff --git a/tests/pcm/yes_22k.pcm b/tests/pcm/yes_22k.pcm
new file mode 100644
index 0000000..7eca53e
--- /dev/null
+++ b/tests/pcm/yes_22k.pcm
Binary files differ
diff --git a/tests/run_ERT.sh b/tests/run_ERT.sh
new file mode 100755
index 0000000..62d0dd4
--- /dev/null
+++ b/tests/run_ERT.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+dalvikvm -Xcheck:jni -Xbootclasspath:/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/srec-java-tests.jar android.speech.recognition.test.EmbeddedRecognizerTest
diff --git a/tests/run_UAPI_SrecTest.sh b/tests/run_UAPI_SrecTest.sh
new file mode 100755
index 0000000..b34a353
--- /dev/null
+++ b/tests/run_UAPI_SrecTest.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+/system/bin/UAPI_SrecTest
diff --git a/tests/run_UAPI_Test.sh b/tests/run_UAPI_Test.sh
new file mode 100755
index 0000000..629add8
--- /dev/null
+++ b/tests/run_UAPI_Test.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+/system/bin/UAPI_test
diff --git a/tests/run_chmod.sh b/tests/run_chmod.sh
new file mode 100755
index 0000000..83e19ce
--- /dev/null
+++ b/tests/run_chmod.sh
@@ -0,0 +1,9 @@
+chmod 777 ./run_contacts.sh
+chmod 777 ./run_ERT.sh
+chmod 777 ./run_parameters.sh
+chmod 777 ./run_robustness1.sh
+chmod 777 ./run_robustness2.sh
+chmod 777 ./run_robustness3.sh
+chmod 777 ./run_UAPI_SrecTest.sh
+chmod 777 ./run_UAPI_Test.sh
+chmod 777 ./run_voicetags1.sh
diff --git a/tests/run_contacts.sh b/tests/run_contacts.sh
new file mode 100755
index 0000000..d43b167
--- /dev/null
+++ b/tests/run_contacts.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+dalvikvm -Xcheck:jni -Xbootclasspath:/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/srec-java-tests.jar android.speech.recognition.test.contacts.Main
diff --git a/tests/run_parameters.sh b/tests/run_parameters.sh
new file mode 100755
index 0000000..b47b377
--- /dev/null
+++ b/tests/run_parameters.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+dalvikvm -Xcheck:jni -Xbootclasspath:/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/srec-java-tests.jar android.speech.recognition.test.parameters.Parameters
diff --git a/tests/run_robustness1.sh b/tests/run_robustness1.sh
new file mode 100755
index 0000000..33a141a
--- /dev/null
+++ b/tests/run_robustness1.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+dalvikvm -Xcheck:jni -Xbootclasspath:/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/srec-java-tests.jar android.speech.recognition.test.robustness1.Robustness1
diff --git a/tests/run_robustness2.sh b/tests/run_robustness2.sh
new file mode 100755
index 0000000..0c0cd8e
--- /dev/null
+++ b/tests/run_robustness2.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+dalvikvm -Xcheck:jni -Xbootclasspath:/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/srec-java-tests.jar android.speech.recognition.test.robustness1.Robustness2
diff --git a/tests/run_robustness3.sh b/tests/run_robustness3.sh
new file mode 100755
index 0000000..a9b3e68
--- /dev/null
+++ b/tests/run_robustness3.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+dalvikvm -Xcheck:jni -Xbootclasspath:/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/srec-java-tests.jar android.speech.recognition.test.robustness1.Robustness3
diff --git a/tests/run_voicetags1.sh b/tests/run_voicetags1.sh
new file mode 100755
index 0000000..d869ffc
--- /dev/null
+++ b/tests/run_voicetags1.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+dalvikvm -Xcheck:jni -Xbootclasspath:/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/srec-java-tests.jar android.speech.recognition.test.voicetags.Voicetags1
diff --git a/tests/run_xtapxmlconsole.sh b/tests/run_xtapxmlconsole.sh
new file mode 100755
index 0000000..a702446
--- /dev/null
+++ b/tests/run_xtapxmlconsole.sh
@@ -0,0 +1,2 @@
+cd /system/usr/srec
+dalvikvm -Xcheck:jni -Xbootclasspath:/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/srec-java-tests.jar  android.speech.recognition.xtapxmlconsole.Main
diff --git a/tools/Android.mk b/tools/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/tools/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/tools/cmd/pht_to_long.pl b/tools/cmd/pht_to_long.pl
new file mode 100644
index 0000000..48b088c
--- /dev/null
+++ b/tools/cmd/pht_to_long.pl
@@ -0,0 +1,64 @@
+use Getopt::Long;
+
+$rc = GetOptions("pht=s" => \$phtfile,
+		 "ok=s" => \$okfile,
+		 "i=s" => \$okfile,
+		 "otxt=s" => \$otxt,
+		 "o=s" => \$otxt,
+		 "showerrs" => \$showerrs);
+
+if(defined $phtfile) {
+    load_phtfile( $phtfile);
+}
+
+sub load_phtfile
+{
+    my $phtfile = shift(@_);
+    $lphhash{"&"}++;
+    $lph_for_sph{"&"} = "&";
+    open(PHT, "<$phtfile") || die "error opening phtfile $phtfile\n";
+    print STDERR "using phtfile $phtfile\n";
+    <PHT>;  # header
+    while(<PHT>) {
+	s/\s+$//g;
+	($trash,$lph,$sph,$num_states) = split(/\s+/);
+	$lph_for_sph{$sph} = $lph;
+	$lphhash{$lph}++;
+    }
+    close(PHT);
+}
+
+open(HH, "<$okfile") || die "error opening okfile $okfile\n";
+open(OO, ">$otxt") || die "error opening output dict $otxt\n";
+while(<HH>) {
+    s/\s+$//;
+    if(/^LANG\s*=\s*(\S+)/) { # LANG = EN-US
+	my $language = lc($1);
+	my $language_header_line = $_;
+	$language =~ s/\-/\./g;
+	if(!defined $phtfile) {
+	    die "Error: ESRSDK is not defined\n" if(!defined $ENV{ESRSDK});
+	    $phtfile = "$ENV{ESRSDK}/config/$language/models/generic.pht";
+	    load_phtfile( $phtfile);
+	}
+	print OO "$language_header_line\n";
+	next;
+    }
+    ($word, $pron) = split(/\s+/);
+    @sphlist = split(/ */, $pron);
+    @lphlist = ();
+    $nerrs = 0;
+    foreach $sph (@sphlist) {
+	$lph = $lph_for_sph{$sph};
+	if(!defined $lph) {
+	    warn "error: unknown sph $sph in $word $pron\n" ;
+	    $lph = "($sph)";
+	    $nerrs++;
+	}
+	push(@lphlist, $lph);
+    }
+    next if($nerrs && !$showerrs) ;
+    print OO "$word \t @lphlist\n";
+}
+close(HH);
+close(OO);
diff --git a/tools/cmd/pht_to_short.pl b/tools/cmd/pht_to_short.pl
new file mode 100644
index 0000000..6000bc8
--- /dev/null
+++ b/tools/cmd/pht_to_short.pl
@@ -0,0 +1,70 @@
+
+use Getopt::Long;
+
+$rc = GetOptions("pht=s" => \$phtfile,
+		 "i=s" => \$oklongfile,
+		 "ok=s" => \$okfile);
+
+load_phtfile($phtfile) if(defined $phtfile);
+
+sub load_phtfile
+{
+    my $phtfile = shift(@_);
+    open(PHT, "<$phtfile") || die "error opening phtfile $phtfile\n";
+    print STDERR "using phtfile $phtfile\n";
+    <PHT>; # header
+    while(<PHT>) {
+	s/\s+$//g;
+	($trash,$lph,$sph,$num_states) = split(/\s+/);
+	$lph_for_sph{$sph} = $lph;
+	$sph_for_lph{$lph} = $sph;
+	$lphhash{$lph}++;
+    }
+    close(PHT);
+    $sph = $lph = "&";
+    $lph_for_sph{$sph} = $lph;
+    $sph_for_lph{$lph} = $sph;
+    $lphhash{$lph}++;
+    $sph = "#"; $lph = "iwt";
+    $lph_for_sph{$sph} = $lph;
+    $sph_for_lph{$lph} = $sph;
+    $lphhash{$lph}++;
+}
+
+open(HH, "<$oklongfile") || die "error opening okfile $oklongfile\n";
+open(OO, ">$okfile") || die "error opening output dict $okfile\n";
+while(<HH>) {
+    s/\s+$//;
+    if(/^LANG\s*=\s*(\S+)/) { # LANG = EN-US
+	my $language = lc($1);
+	my $language_header_line = $_;
+	$language =~ s/\-/\./g;
+	if(!defined $phtfile) {
+	    die "Error: ESRSDK is not defined\n" if(!defined $ENV{ESRSDK});
+	    $phtfile = "$ENV{ESRSDK}/config/$language/models/generic.pht";
+	    load_phtfile( $phtfile);
+	}
+	print OO "$language_header_line\n";
+	next;
+    }
+    s/\s+$//;
+    s/^\s+//;
+    if(/\#\#/) {
+	next if($skip_funnies);
+	s/\#\#.*$//;
+    }
+    ($word, $pron) = split(/\s*\t\s*/, $_, 2);
+    
+    @lphlist = split(/\s+/, $pron);
+    @sphlist = ();
+    foreach $lph (@lphlist) {
+	die "error: unknown lph $lph in $word\n" if(!defined  $sph_for_lph{$lph});
+	push(@sphlist, $sph_for_lph{$lph});
+    }
+    $sphPron = join("",@sphlist);
+    print OO "$word $sphPron\n";
+}
+
+close(HH);
+close(OO);
+		 
diff --git a/tools/cmd/srecres2utd.pl b/tools/cmd/srecres2utd.pl
new file mode 100644
index 0000000..03c3ccd
--- /dev/null
+++ b/tools/cmd/srecres2utd.pl
@@ -0,0 +1,250 @@
+#!/usr/localbin/perl
+
+use Getopt::Long;
+use File::Basename;
+use lib dirname($0);
+
+$assume_invocab = 0; # _when_semantics_missing 
+$rc = GetOptions("add=s" => \@additional_fields,
+		 "invocab" => \$assume_invocab, 
+		 "quiet" => \$quiet,
+		 "semantic" => \$try_semantic_validation,
+		 "altsem=s" => \$altsemfile,
+                 );
+
+my @fields = ("file", "correct", "invocab", "gdiff", "sd", "sd13", "spf", "abs", "gdiffpf", "rejrslt", "rankc", "match", "ortho", "choice1", "choice2", "score1", "conf", "gender");
+
+if($try_semantic_validation) {
+    push(@additional_fields,"parsed_ortho");
+}
+push(@fields, @additional_fields);
+foreach $additional_field (@additional_fields) {
+    $additional_fieldh{$additional_field}++;
+}
+
+load_altsemfile($altsemfile) if($altsemfile);
+
+$| = 1;
+
+if(@ARGV[0] =~ /^@/) {
+    $flist = substr($ARGV[0],1);
+    @resfiles = `cat $flist`;
+    grep { s/\s+$// } @resfiles;
+} else {
+    @resfiles = @ARGV;
+}
+
+foreach $resfile (@resfiles) {
+    ($base = $resfile) =~ s/\.[a-z]+$//i;
+    $utdfile = "$base.utd";
+
+    # print "processing $resfile to $utdfile\n" unless($quiet);
+    open(RES, "<$resfile") || die "error opening $resfile\n";
+    open(UTD, ">$utdfile") || die "error opening $utdfile\n";
+    $hUTD = \*UTD;
+    undef %results;
+    while(<RES>) {
+	s/\s+$//;
+        s/^\s+//;
+	if(/^D:\s+(\S+)\s*$/) { # same as CREC
+	    $file = $1;
+	    if(defined %token) {
+		process(\%token, \%results);
+		dump_record($hUTD, \%token);
+	    } else {
+		dump_header($hUTD);
+	    }
+	    undef %token;
+	    $token{file} = $file;
+	    $file =~ /ENU-(\d\d\d)-/;
+	    $token{gender} = $gender{$1};
+	    $token{"snr"} = get_snr($file) if($additional_fieldh{"snr"});
+	    $token{"snrr"} = sprintf("%.2d",int(get_snr($file)/5+0.5)*5) if($additional_fieldh{"snrr"});
+	} elsif(/^C:\s+(.*)$/) { # same as CREC
+	    $token{ortho} = normalize($1);
+	} elsif(/^\s*(\S+) = (.*)$/) {
+	    ($augkey,$augval) = ($1,$2);
+	    if($augkey eq "feedback") {
+		$token{parsed_ortho} = $augval;
+		$token{invocab}++;
+	    }
+	} elsif(/^R:\s+(.*)$/) { # same as CREC
+	    if(/<rejected/i || /<FAILED/i) {
+		$token{rejrslt} = "f";
+	    } else {
+		# $token{topchoice} = $1;
+		$token{rejrslt} = "a";
+	    }
+	} elsif(/^Sem[^:]+:  invocab=(\d)/) { # same as CREC
+	    $token{invocab} = 1;
+	} elsif(/^CSem:\s+([a-z]+.*)\s*$/i) { 
+	    $token{parsed_ortho} = $1;
+	} elsif(/^Sem:(\s+)(\S+)/) { # same as CREC
+	    $token{invocab} = 0;
+	} elsif(/^LITERAL\[\s*0\]\s*:\s*\'(.*)\'/) {
+	    $choice = $1;
+	    $token{choices}[0] = $choice;
+	} elsif(/^LITERAL\[\s*(\d+)\]\s+:\s+\'(.*)\'/) {
+	    $i = $1;
+	    $choice = $2;
+	    /.*\: \'(.*)\'/;
+	    $choice = $1;
+	    $token{choices}[$i] = $choice;
+	} elsif(/^MEANING\[\s*(\d+)\]\s+:\s+\'(.*)\'/) {
+	    $i = $1;
+	    $choice = $2;
+	    /.*\: \'(.*)\'/;
+	    $choice = $1;
+	    $choice =~ s/\s+$//;
+	    $token{meanings}[$i] = $choice;
+	} elsif(/^LITERAL\[(\d+)\]\[(\d+)\]\s+:\s+\'(.*)\'/) {
+	    $i = $1;
+	    $score = $2;
+	    $token{scores}[$i] = $score;
+	} elsif(/^RAW SCORE\s+:\s+\'(.*)\'/) {
+	    $token{topscore} = $1;
+	} elsif(/^gdiff\s+(.*)$/){
+            $token{gdiff} = $1;
+        } elsif(/^sd13\s+(.*)$/){
+            $token{sd13} = $1; 
+        } elsif(/^spf\s+(.*)$/){
+            $token{spf} = $1;
+        } elsif(/^abs\s+(.*)$/){
+            $token{abs} = $1;
+        } elsif(/^gdiffpf\s+(.*)$/){
+            $token{gdiffpf} = $1;
+        } elsif(/^sd\s+(.*)$/){ 
+            $token{sd} = $1; 
+        } elsif(/^CONFIDENCE SCORE\s+:\s+\'(.*)\'/) {
+            $token{conf} = $1;
+        }
+    }
+    process(\%token, \%results) if(defined %token);
+    dump_record($hUTD, \%token) if(defined %token);
+    close(UTD);
+    close(RES);
+    undef %token;
+    $results{total} ||= 1;
+    $rr = $results{correct}/$results{total} * 100;
+    $rr = int($rr*10 + 0.5)/10;
+    print sprintf("%-45s RR %4.1f %d/%d (%d oovs)\n", $base, $rr, $results{correct}, $results{total}, $results{numoovs});
+}
+
+
+sub process
+{
+    my $token = shift(@_);
+    my $results = shift(@_);
+    $token->{invocab} = 1 if($assume_invocab);
+    if(defined $token{topchoice}) {
+	$token->{choices}[0] = $token{topchoice};
+    }
+    if(defined $token{topscore}) {
+	$token->{scores}[0] = $token{topscore};
+    }
+    my $ortho = lc($token->{ortho});
+    my $topch = lc($token->{choices}[0]);
+
+    $ortho =~ s/_/ /g;
+    $topch =~ s/_/ /g;
+    $topch =~ s/\s\s+/ /g;
+    $ortho =~ s/\s\s+/ /g;
+    if($token->{invocab} == 0) {
+	$token->{correct} = "0"; 
+	$results->{numoovs}++;
+    } elsif($topch eq $ortho) {
+	$results->{total}++;
+	$results->{correct}++;
+	$token->{correct} = "1";
+    } else {
+	$results->{total}++;
+	# print "$token->{file} MEANINGCMP: ==$token->{meanings}[0]== ==$token->{parsed_ortho}==\n";
+	if($altsemfile) {
+	    if($token->{parsed_ortho} ne $csemtags{$token->{file}}) {
+		# print "changing $token{parsed_ortho} ne $csemtags{$token->{file}}\n";
+		$token->{parsed_ortho} = $csemtags{$token->{file}};
+	    }
+	}
+
+	if(not $try_semantic_validation) {
+	    $token->{correct} = "0";
+	} else {
+	    if($token->{meanings}[0] eq $token->{parsed_ortho} && length($token->{parsed_ortho})>0) {
+		$token->{correct} = "1";
+		$results->{correct}++ ;
+	    } else {
+		$token->{correct} = "0";
+	    }
+	}
+    }
+    $token->{rankc} = 0;
+    my $nchoices = scalar(@{$token->{choices}});
+    for($i=0; $i<$nchoices; $i++) {
+	my $choice = lc $token->{choices}[$i];
+	$choice =~ s/_/ /g;
+	if($choice eq $ortho) {
+	    $token->{rankc} = $i+1;
+	    last;
+	}
+    }
+    $token->{gender} = "?";
+}
+
+sub dump_record
+{
+    my $HH = shift(@_);
+    my $token = shift(@_);
+    foreach $field (@fields) {
+          if ($field =~ /^sd13$/){
+          print UTD "$token->{$field}" , ":";
+	} elsif($field =~ /^(\S+)(\d+)$/) {
+	  $name = "${1}s"; 
+	  $num = $2 - 1;
+	  print UTD "$token->{$name}[$num]", ":";
+	} else{
+          print UTD "$token->{$field}" , ":";
+	} 
+    }
+    print UTD "\n";
+}
+
+sub dump_header
+{
+    my $HH = shift(@_);
+    foreach $field (@fields) {
+	print UTD "$field" , ":";
+    }
+    print UTD "\n";
+}
+
+sub normalize
+{
+    my $k = shift(@_);
+    $k =~ s/\s\s+/ /g;
+    $k =~ s/\:/\;/g;
+    $k =~ s/\[[^\]]+\]//g;
+    $k =~ s/^\s+//g;
+    $k =~ s/\s+$//g;
+    return $k;
+}
+
+sub load_altsemfile
+{
+    my $semfile = shift(@_);
+    open(SM,"<$semfile") || die "error: opening $semfile\n";
+    while(<SM>) {
+	if(/D: (\S+)$/) {
+	    $file = $1;
+	    $file =~ s/\s+$//;
+	} elsif(/^CSem:\s+([a-z]+.*)\s*$/i) { 
+	    $csemtags{$file} = $1;
+	    $csemtags{$file} =~ s/\s+$//;
+	} elsif(/^Sem[^:]+:  invocab=(\d)/) { # same as CREC
+	    $semtags{$file} = 1;
+	} elsif(/^Sem:(\s+)(\S+)/) { # same as CREC
+	    $semtags{$file} = 0;
+	}
+    }
+    close(SM);
+}
+
diff --git a/tools/dictTest/Android.mk b/tools/dictTest/Android.mk
new file mode 100644
index 0000000..d99e4a7
--- /dev/null
+++ b/tools/dictTest/Android.mk
@@ -0,0 +1,43 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	dictTest.c \
+
+LOCAL_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_Core \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_EventLog \
+	libSR_G2P \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Recognizer \
+	libSR_Semproc \
+	libSR_Session \
+	libSR_Vocabulary \
+	
+LOCAL_MODULE:= dictTest
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/dictTest/dictTest.c b/tools/dictTest/dictTest.c
new file mode 100644
index 0000000..8deb33b
--- /dev/null
+++ b/tools/dictTest/dictTest.c
@@ -0,0 +1,374 @@
+/*---------------------------------------------------------------------------*
+ *  dictTest.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ESR_Locale.h"
+#include "LCHAR.h"
+#include "pstdio.h"
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "ESR_Session.h"
+#include "SR_Session.h"
+#include "SR_Vocabulary.h"
+
+#define MAX_LINE_LENGTH     512
+#define MAX_PRONS_LENGTH 1024
+
+static ESR_ReturnCode InitSession ( LCHAR *parfilename );
+static ESR_ReturnCode ShutdownSession ( void );
+
+void usage()
+{
+  LPRINTF("usage: dictTest [-words words.txt] [-vocab dictionary.ok] [-itest input.tst] [-out output.txt] [-locale en-us|en-gb|fr-fr|de-de] [-parfile baseline.par]\n");
+}
+
+void doGetProns(SR_Vocabulary *vocab, LCHAR* phrase, size_t len, FILE* fout)
+{
+  ESR_ReturnCode rc;
+  LCHAR prons[MAX_PRONS_LENGTH];
+
+  rc = SR_VocabularyGetPronunciation(vocab, phrase, prons, &len);
+  // rc = vocab->getPronunciation(vocab, phrase, prons, &len);
+
+  if (rc != ESR_SUCCESS)
+    LFPRINTF(fout,"ERROR: %s\n", ESR_rc2str(rc));
+  else {
+    size_t len_used;
+    LCHAR *pron = 0;
+    for(len_used=0; len_used<len; ) {
+      pron = &prons[0]+len_used;
+      len_used += LSTRLEN(pron)+1;
+      LFPRINTF(fout,"%s : %s\n", phrase, pron);
+    }
+  }
+}
+
+//parses the input file, runs phoneme tests and produces output to be parsed by perl script
+void doInputTestPhonemes(SR_Vocabulary *vocab, PFile* fin, FILE* fout)
+{
+#if 0
+  //waste of space with all of these arrays, they are too large, but leave for now
+  ESR_ReturnCode rc;
+  LCHAR line[2 * MAX_PRONS_LENGTH];
+  LCHAR phoneme[MAX_PRONS_LENGTH];
+  LCHAR* phrase;
+  LCHAR* expectedPhoneme;
+    LCHAR** tokenArray;
+  size_t len;
+
+  //read through the test file parsing it into the variables
+  while(!pfeof(fin))
+  {
+    pfgets(line, MAX_LINE_LENGTH, fin);
+
+        rc = ESR_ProcessLinearToCommandLineTokens(line, &tokenArray, &len);
+        if (rc!=ESR_SUCCESS || len!=2)
+        {
+          LFPRINTF(fout, "ERROR: INVALID FORMAT for input line\n");
+            continue;
+        }
+        phrase = tokenArray[0];
+        expectedPhoneme = tokenArray[1];
+
+      LPRINTF( "expected %s\n", expectedPhoneme);
+
+        len = MAX_PRONS_LENGTH;
+        rc = vocab->getPronunciation(vocab, phrase, phoneme, &len);
+
+        if(rc != ESR_SUCCESS)
+            LFPRINTF(fout,"ERROR: %s\n", ESR_rc2str(rc));
+        else
+        {
+            LFPRINTF(fout,"%s|%s|%s|", phrase, expectedPhoneme, phoneme);
+
+            if(LSTRCMP(expectedPhoneme, phoneme) == 0)
+                LFPRINTF(fout,"PASSED\n");
+            else
+                LFPRINTF(fout,"FAILED\n");
+        }
+  }
+#endif
+}
+
+int main(int argc, char **argv)
+{
+  LCHAR phrase[MAX_LINE_LENGTH];
+  SR_Vocabulary *vocab = 0;
+  LCHAR vocabfile[MAX_LINE_LENGTH];
+  LCHAR outfilename[MAX_LINE_LENGTH];
+  LCHAR testfilename[MAX_LINE_LENGTH];
+  LCHAR parfilename[MAX_LINE_LENGTH];
+  LCHAR wordfile[MAX_LINE_LENGTH];
+  LCHAR locale[MAX_LINE_LENGTH];
+  LCHAR ptemp[MAX_LINE_LENGTH];
+  LCHAR* p;
+  ESR_ReturnCode rc;
+  int i;
+  PFile* fin = 0;
+  FILE* fout = stdout;
+  size_t len;
+  ESR_BOOL bSession = ESR_FALSE;
+
+  LCHAR *env_sdk_path;
+  LCHAR *env_lang;
+
+  CHKLOG(rc, PMemInit());
+/*  CHKLOG(rc, PFileSystemCreate());
+    CHKLOG(rc, PANSIFileSystemCreate());
+    CHKLOG(rc, PANSIFileSystemAddPath(L("/dev/ansi"), L("/")));*/
+
+    /* Set ANSI file-system as default file-system */
+/*  CHKLOG(rc, PANSIFileSystemSetDefault(ESR_TRUE));*/
+    /* Set virtual current working directory to native current working directory */
+/*  len = P_PATH_MAX;
+    CHKLOG(rc, PANSIFileSystemGetcwd(cwd, &len));
+    CHKLOG(rc, PFileSystemChdir(cwd));*/
+
+    fout = stdout;
+  *vocabfile = 0;
+  *wordfile = 0;
+  *locale = 0;
+  *outfilename = 0;
+  *testfilename = 0;
+  *parfilename = 0;
+
+  /* get some phrases from the user */
+  LPRINTF("\nDictation Test Program for esr (Nuance Communications, 2007)\n");
+
+  if(argc != 1 && argc != 3 && argc != 5 && argc != 7 && argc != 9)
+  {
+    usage();
+        rc = 1;
+    goto CLEANUP;
+  }
+
+  for(i=1; i<argc; i++)
+  {
+    if(!LSTRCMP(argv[i], L("-words")))
+      LSTRCPY(wordfile, argv[++i]);
+    else if(!LSTRCMP(argv[i], L("-vocab")))
+      LSTRCPY(vocabfile, argv[++i]);
+    else if(!LSTRCMP(argv[i], L("-locale")))
+      LSTRCPY(locale, argv[++i]);
+    else if(!LSTRCMP(argv[i], L("-out")))
+      LSTRCPY(outfilename, argv[++i]);
+    else if(!LSTRCMP(argv[i], L("-itest")))
+      LSTRCPY(testfilename, argv[++i]);
+    else if(!LSTRCMP(argv[i], L("-parfile")) || !LSTRCMP(argv[i], L("-par")) )
+      LSTRCPY(parfilename, argv[++i]);
+    else {
+      usage();
+      rc = 1;
+      goto CLEANUP;
+    }
+  }
+
+  if ( *parfilename == L('\0') )
+  {
+    LPRINTF ( "Warning: No parfile defined in the command line.\n" );
+    LPRINTF ( "Looking for the default parfile, $ESRSDK/config/$ESRLANG/baseline.par...\n" );
+
+    env_sdk_path =  LGETENV(L("ESRSDK"));
+    if ( env_sdk_path != NULL )
+    {
+      LSPRINTF ( parfilename, L("%s/config/"), env_sdk_path );
+      env_lang = LGETENV(L("ESRLANG"));
+      if ( env_lang != NULL )
+      {
+         LSTRCAT ( parfilename, env_lang );
+         LSTRCAT ( parfilename, L("/baseline.par") );
+      }
+      else
+      {
+        LPRINTF("Error: An environment variable ESRLANG should be defined.\n");
+        goto CLEANUP;
+      }
+    }
+    else
+    {
+      LPRINTF("Error: An environment variable ESRSDK should be defined.\n");
+      goto CLEANUP;
+    }
+  }
+
+  rc = InitSession( parfilename );
+  if ( rc != ESR_SUCCESS )
+  {
+    LPRINTF("Error: %s\n", ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+  bSession = ESR_TRUE;
+
+  if (*vocabfile == 0)
+  {
+    len = sizeof(vocabfile);
+    rc = ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), vocabfile, &len );
+    env_sdk_path =  LGETENV(L("ESRSDK"));
+    if ( env_sdk_path != NULL )
+      {
+	LSPRINTF ( parfilename, L("%s/config/"), env_sdk_path );
+	env_lang = LGETENV(L("ESRLANG"));
+	if ( env_lang != NULL )
+	  {
+	    LSTRCAT ( parfilename, env_lang );
+	    LSTRCAT ( parfilename, L("/baseline.par") );
+	  }
+	else
+	  {
+	    LPRINTF("Error: An environment variable ESRLANG should be defined.\n");
+	    goto CLEANUP;
+	  }
+      }
+    else
+      {
+	LPRINTF("Error: An environment variable ESRSDK should be defined.\n");
+	goto CLEANUP;
+      }
+
+    strcpy(ptemp, env_sdk_path);
+    strcat(ptemp,"/config/");
+    strcat(ptemp,env_lang);
+    strcat(ptemp,"/");
+    strcat(ptemp,vocabfile);
+    strcpy(vocabfile,ptemp);
+    if ( rc == ESR_SUCCESS )
+    {
+      len = sizeof(vocabfile);
+       rc = ESR_SessionPrefixWithBaseDirectory(vocabfile, &len);
+    }
+    else
+    {
+       *vocabfile = 0;
+    }
+  }
+
+  if (*vocabfile)
+    rc = SR_VocabularyLoad(vocabfile, &vocab);
+  else if (*locale)
+  {
+    ESR_Locale localeTag;
+
+    rc = ESR_str2locale(locale, &localeTag);
+    if (rc != ESR_SUCCESS)
+    {
+      LPRINTF("Error: %s\n",ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+    rc = SR_VocabularyCreate(localeTag, &vocab);
+  }
+  else
+    rc = SR_VocabularyCreate(ESR_LOCALE_EN_US, &vocab);
+
+  if (rc != ESR_SUCCESS)
+  {
+    LPRINTF("Error: %s\n",ESR_rc2str(rc));
+    goto CLEANUP;
+  }
+
+  if (*outfilename) /* output file */
+  {
+    if  ((fout = fopen(outfilename,"w")) == NULL)
+    {
+      LPRINTF("Could not open file: %s\n",outfilename);
+      rc = 1;
+      goto CLEANUP;
+    }
+  }
+
+  if (*wordfile) /* file mode */
+  {
+    if ((fin = pfopen(wordfile,"r")) == NULL)
+    {
+      LPRINTF("Could not open file: %s\n", wordfile);
+      goto CLEANUP;
+    }
+    while (pfgets(phrase, MAX_LINE_LENGTH, fin)!=NULL)
+    {
+      lstrtrim(phrase);
+      doGetProns(vocab, phrase, MAX_PRONS_LENGTH, fout);
+    }
+
+  }
+  else if (*testfilename) /* test file mode */
+  {
+    if ((fin = pfopen(testfilename,"r")) == NULL)
+    {
+      LPRINTF("Could not open file: %s\n", testfilename);
+      rc = 1;
+      goto CLEANUP;
+    }
+    doInputTestPhonemes(vocab, fin, fout);
+  }
+  else /* interactive mode */
+  {
+    LPRINTF("'qqq' to quit\n");
+    while (ESR_TRUE)
+    {
+      LPRINTF("> ");
+      if(! pfgets(phrase, MAX_LINE_LENGTH, PSTDIN ))
+        break;
+      // remove trailing whitespace
+      for(p=&phrase[0]; *p!=0 && *p!='\n' && *p!='\r'; p++) {}
+      *p=0;
+      lstrtrim(phrase);
+      if(!LSTRCMP("qqq",phrase))
+        break;
+      else
+        doGetProns(vocab, phrase, MAX_PRONS_LENGTH, fout);
+     }
+  }
+
+CLEANUP:
+  if(vocab)
+    vocab->destroy(vocab);
+
+  if(bSession)
+    ShutdownSession();
+
+  if(fin)
+    pfclose(fin);
+
+  if(fout && fout != stdout)
+    fclose(fout);
+
+/*  PANSIFileSystemDestroy();
+  PFileSystemDestroy();*/
+  PMemShutdown();
+  return rc;
+}
+
+static ESR_ReturnCode InitSession ( LCHAR *parfilename )
+{
+  ESR_ReturnCode    init_status;
+
+  init_status = SR_SessionCreate ( parfilename );
+
+  return ( init_status );
+}
+
+static ESR_ReturnCode ShutdownSession ( void )
+{
+  ESR_ReturnCode    shutdown_status;
+
+  shutdown_status = SR_SessionDestroy ( );
+
+  return ( shutdown_status );
+}
+
diff --git a/tools/grxmlcompile/Android.mk b/tools/grxmlcompile/Android.mk
new file mode 100644
index 0000000..4661b43
--- /dev/null
+++ b/tools/grxmlcompile/Android.mk
@@ -0,0 +1,76 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+OPENFSTSDK=$(ASR_ROOT_DIR)/tools/thirdparty/OpenFst
+
+LOCAL_SRC_FILES:= \
+	gr_iface.cpp \
+	netw_dump.cpp \
+	sub_base.cpp \
+	sub_grph.cpp \
+	sub_min.cpp \
+	sub_supp.cpp \
+	grxmlcompile.cpp \
+	grxmldoc.cpp \
+	hashmap.cpp \
+
+ifndef OPENFSTSDK
+LOCAL_SRC_FILES += sub_phon.cpp vocab.cpp
+endif
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH) \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+	external/tinyxml \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+	-fexceptions \
+	
+LOCAL_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_Core \
+	libSR_EventLog \
+	libSR_G2P \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Session \
+	libSR_Semproc \
+	libSR_Vocabulary \
+
+ifdef OPENFSTSDK
+LOCAL_C_INCLUDES += $(OPENFSTSDK)
+LOCAL_CFLAGS +=	-DOPENFSTSDK
+LOCAL_SHARED_LIBRARIES += libfst
+endif
+
+LOCAL_STATIC_LIBRARIES := \
+	libtinyxml \
+
+LOCAL_LDLIBS := \
+	-lm \
+	-lpthread \
+	-ldl \
+
+LOCAL_MODULE:= grxmlcompile
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/grxmlcompile/fst-io.h b/tools/grxmlcompile/fst-io.h
new file mode 100644
index 0000000..7179cfb
--- /dev/null
+++ b/tools/grxmlcompile/fst-io.h
@@ -0,0 +1,415 @@
+#ifndef __FST_IO_H__
+#define __FST_IO_H__
+
+// fst-io.h 
+// This is a copy of the OPENFST SDK application sample files ...
+// except for the main functions ifdef'ed out
+// 2007, 2008 Nuance Communications
+//
+// print-main.h compile-main.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Classes and functions to compile a binary Fst from textual input.
+// Includes helper function for fstcompile.cc that templates the main
+// on the arc type to support multiple and extensible arc types.
+
+#include <fstream>
+#include <sstream>
+
+#include "fst/lib/fst.h"
+#include "fst/lib/fstlib.h"
+#include "fst/lib/fst-decl.h"
+#include "fst/lib/vector-fst.h"
+#include "fst/lib/arcsort.h"
+#include "fst/lib/invert.h"
+
+namespace fst {
+  
+  template <class A> class FstPrinter {
+  public:
+    typedef A Arc;
+    typedef typename A::StateId StateId;
+    typedef typename A::Label Label;
+    typedef typename A::Weight Weight;
+    
+    FstPrinter(const Fst<A> &fst,
+	       const SymbolTable *isyms,
+	       const SymbolTable *osyms,
+	       const SymbolTable *ssyms,
+	       bool accep)
+      : fst_(fst), isyms_(isyms), osyms_(osyms), ssyms_(ssyms),
+      accep_(accep && fst.Properties(kAcceptor, true)), ostrm_(0) {}
+    
+    // Print Fst to an output strm
+    void Print(ostream *ostrm, const string &dest) {
+      ostrm_ = ostrm;
+      dest_ = dest;
+      StateId start = fst_.Start();
+      if (start == kNoStateId)
+	return;
+      // initial state first
+      PrintState(start);
+      for (StateIterator< Fst<A> > siter(fst_);
+	   !siter.Done();
+	   siter.Next()) {
+	StateId s = siter.Value();
+	if (s != start)
+	  PrintState(s);
+      }
+    }
+    
+  private:
+    // Maximum line length in text file.
+    static const int kLineLen = 8096;
+    
+    void PrintId(int64 id, const SymbolTable *syms,
+		 const char *name) const {
+      if (syms) {
+	string symbol = syms->Find(id);
+	if (symbol == "") {
+	  LOG(ERROR) << "FstPrinter: Integer " << id
+		     << " is not mapped to any textual symbol"
+		     << ", symbol table = " << syms->Name()
+		     << ", destination = " << dest_;
+	  exit(1);
+	}
+	*ostrm_ << symbol;
+      } else {
+	*ostrm_ << id;
+      }
+    }
+    
+    void PrintStateId(StateId s) const {
+      PrintId(s, ssyms_, "state ID");
+    }
+    
+    void PrintILabel(Label l) const {
+      PrintId(l, isyms_, "arc input label");
+    }
+    
+    void PrintOLabel(Label l) const {
+      PrintId(l, osyms_, "arc output label");
+    }
+    
+    void PrintState(StateId s) const {
+      bool output = false;
+      for (ArcIterator< Fst<A> > aiter(fst_, s);
+	   !aiter.Done();
+	   aiter.Next()) {
+	Arc arc = aiter.Value();
+	PrintStateId(s);
+	*ostrm_ << "\t";
+	PrintStateId(arc.nextstate);
+	*ostrm_ << "\t";
+	PrintILabel(arc.ilabel);
+	if (!accep_) {
+	  *ostrm_ << "\t";
+	  PrintOLabel(arc.olabel);
+	}
+	if (arc.weight != Weight::One())
+	  *ostrm_ << "\t" << arc.weight;
+	*ostrm_ << "\n";
+	output = true;
+      }
+      Weight final = fst_.Final(s);
+      if (final != Weight::Zero() || !output) {
+	PrintStateId(s);
+	if (final != Weight::One()) {
+	  *ostrm_ << "\t" << final;
+	}
+	*ostrm_ << "\n";
+      }
+    }
+    
+    const Fst<A> &fst_;
+    const SymbolTable *isyms_;     // ilabel symbol table
+    const SymbolTable *osyms_;     // olabel symbol table
+    const SymbolTable *ssyms_;     // slabel symbol table
+    bool accep_;                   // print as acceptor when possible
+    ostream *ostrm_;                // binary FST destination
+    string dest_;                  // binary FST destination name
+    DISALLOW_EVIL_CONSTRUCTORS(FstPrinter);
+  };
+  
+#if 0
+  // Main function for fstprint templated on the arc type.
+  template <class Arc>
+    int PrintMain(int argc, char **argv, istream &istrm,
+		  const FstReadOptions &opts) {
+    Fst<Arc> *fst = Fst<Arc>::Read(istrm, opts);
+    if (!fst) return 1;
+    
+    string dest = "standard output";
+    ostream *ostrm = &std::cout;
+    if (argc == 3) {
+      dest = argv[2];
+      ostrm = new ofstream(argv[2]);
+      if (!*ostrm) {
+	LOG(ERROR) << argv[0] << ": Open failed, file = " << argv[2];
+	return 0;
+      }
+    }
+    ostrm->precision(9);
+    
+    const SymbolTable *isyms = 0, *osyms = 0, *ssyms = 0;
+    
+    if (!FLAGS_isymbols.empty() && !FLAGS_numeric) {
+      isyms = SymbolTable::ReadText(FLAGS_isymbols);
+      if (!isyms) exit(1);
+    }
+    
+    if (!FLAGS_osymbols.empty() && !FLAGS_numeric) {
+      osyms = SymbolTable::ReadText(FLAGS_osymbols);
+      if (!osyms) exit(1);
+    }
+    
+    if (!FLAGS_ssymbols.empty() && !FLAGS_numeric) {
+      ssyms = SymbolTable::ReadText(FLAGS_ssymbols);
+      if (!ssyms) exit(1);
+    }
+    
+    if (!isyms && !FLAGS_numeric)
+      isyms = fst->InputSymbols();
+    if (!osyms && !FLAGS_numeric)
+      osyms = fst->OutputSymbols();
+    
+    FstPrinter<Arc> fstprinter(*fst, isyms, osyms, ssyms, FLAGS_acceptor);
+    fstprinter.Print(ostrm, dest);
+    
+    if (isyms && !FLAGS_save_isymbols.empty())
+      isyms->WriteText(FLAGS_save_isymbols);
+    
+    if (osyms && !FLAGS_save_osymbols.empty())
+      osyms->WriteText(FLAGS_save_osymbols);
+    
+    if (ostrm != &std::cout)
+      delete ostrm;
+    return 0;
+  }
+#endif
+  
+  
+  template <class A> class FstReader {
+  public:
+    typedef A Arc;
+    typedef typename A::StateId StateId;
+    typedef typename A::Label Label;
+    typedef typename A::Weight Weight;
+    
+    FstReader(istream &istrm, const string &source,
+	      const SymbolTable *isyms, const SymbolTable *osyms,
+	      const SymbolTable *ssyms, bool accep, bool ikeep,
+	      bool okeep, bool nkeep)
+      : nline_(0), source_(source),
+      isyms_(isyms), osyms_(osyms), ssyms_(ssyms),
+      nstates_(0), keep_state_numbering_(nkeep) {
+      char line[kLineLen];
+      while (istrm.getline(line, kLineLen)) {
+	++nline_;
+	vector<char *> col;
+	SplitToVector(line, "\n\t ", &col, true);
+	if (col.size() == 0 || col[0][0] == '\0')  // empty line
+	  continue;
+	if (col.size() > 5 ||
+	    col.size() > 4 && accep ||
+	    col.size() == 3 && !accep) {
+	  LOG(ERROR) << "FstReader: Bad number of columns, source = " << source_
+		     << ", line = " << nline_;
+	  exit(1);
+	}
+	StateId s = StrToStateId(col[0]);
+	while (s >= fst_.NumStates())
+	  fst_.AddState();
+	if (nline_ == 1)
+	  fst_.SetStart(s);
+	
+	Arc arc;
+	StateId d = s;
+	switch (col.size()) {
+	case 1:
+	  fst_.SetFinal(s, Weight::One());
+	  break;
+	case 2:
+	  fst_.SetFinal(s, StrToWeight(col[1], true));
+	  break;
+	case 3:
+	  arc.nextstate = d = StrToStateId(col[1]);
+	  arc.ilabel = StrToILabel(col[2]);
+	  arc.olabel = arc.ilabel;
+	  arc.weight = Weight::One();
+	  fst_.AddArc(s, arc);
+	  break;
+	case 4:
+	  arc.nextstate = d = StrToStateId(col[1]);
+	  arc.ilabel = StrToILabel(col[2]);
+	  if (accep) {
+	    arc.olabel = arc.ilabel;
+	    arc.weight = StrToWeight(col[3], false);
+	  } else {
+	    arc.olabel = StrToOLabel(col[3]);
+	    arc.weight = Weight::One();
+	  }
+	  fst_.AddArc(s, arc);
+	  break;
+	case 5:
+	  arc.nextstate = d = StrToStateId(col[1]);
+	  arc.ilabel = StrToILabel(col[2]);
+	  arc.olabel = StrToOLabel(col[3]);
+	  arc.weight = StrToWeight(col[4], false);
+	  fst_.AddArc(s, arc);
+	}
+	while (d >= fst_.NumStates())
+	  fst_.AddState();
+      }
+      if (ikeep)
+	fst_.SetInputSymbols(isyms);
+      if (okeep)
+	fst_.SetOutputSymbols(osyms);
+    }
+    
+    const VectorFst<A> &Fst() const { return fst_; }
+    
+  private:
+    // Maximum line length in text file.
+    static const int kLineLen = 8096;
+    
+    int64 StrToId(const char *s, const SymbolTable *syms,
+		  const char *name) const {
+      int64 n;
+      
+      if (syms) {
+	n = syms->Find(s);
+	if (n < 0) {
+	  LOG(ERROR) << "FstReader: Symbol \"" << s
+		     << "\" is not mapped to any integer " << name
+		     << ", symbol table = " << syms->Name()
+		     << ", source = " << source_ << ", line = " << nline_;
+	  exit(1);
+	}
+      } else {
+	char *p;
+	n = strtoll(s, &p, 10);
+	if (p < s + strlen(s) || n < 0) {
+	  LOG(ERROR) << "FstReader: Bad " << name << " integer = \"" << s
+		     << "\", source = " << source_ << ", line = " << nline_;
+	  exit(1);
+	}
+      }
+      return n;
+    }
+    
+    StateId StrToStateId(const char *s) {
+      StateId n = StrToId(s, ssyms_, "state ID");
+      
+      if (keep_state_numbering_)
+	return n;
+      
+      // remap state IDs to make dense set
+      typename hash_map<StateId, StateId>::const_iterator it = states_.find(n);
+      if (it == states_.end()) {
+	states_[n] = nstates_;
+	return nstates_++;
+      } else {
+	return it->second;
+      }
+    }
+    
+    StateId StrToILabel(const char *s) const {
+      return StrToId(s, isyms_, "arc ilabel");
+    }
+    
+    StateId StrToOLabel(const char *s) const {
+      return StrToId(s, osyms_, "arc olabel");
+    }
+    
+    Weight StrToWeight(const char *s, bool allow_zero) const {
+      Weight w;
+      istringstream strm(s);
+      strm >> w;
+      if (strm.fail() || !allow_zero && w == Weight::Zero()) {
+	LOG(ERROR) << "FstReader: Bad weight = \"" << s
+		   << "\", source = " << source_ << ", line = " << nline_;
+	exit(1);
+      }
+      return w;
+    }
+    
+    VectorFst<A> fst_;
+    size_t nline_;
+    string source_;                      // text FST source name
+    const SymbolTable *isyms_;           // ilabel symbol table
+    const SymbolTable *osyms_;           // olabel symbol table
+    const SymbolTable *ssyms_;           // slabel symbol table
+    hash_map<StateId, StateId> states_;  // state ID map
+    StateId nstates_;                    // number of seen states
+    bool keep_state_numbering_;
+    DISALLOW_EVIL_CONSTRUCTORS(FstReader);
+  };
+  
+#if 0
+  // Main function for fstcompile templated on the arc type.  Last two
+  // arguments unneeded since fstcompile passes the arc type as a flag
+  // unlike the other mains, which infer the arc type from an input Fst.
+  template <class Arc>
+    int CompileMain(int argc, char **argv, istream& /* strm */,
+		    const FstReadOptions & /* opts */) {
+    char *ifilename = "standard input";
+    istream *istrm = &std::cin;
+    if (argc > 1 && strcmp(argv[1], "-") != 0) {
+      ifilename = argv[1];
+      istrm = new ifstream(ifilename);
+      if (!*istrm) {
+	LOG(ERROR) << argv[0] << ": Open failed, file = " << ifilename;
+	return 1;
+      }
+    }
+    const SymbolTable *isyms = 0, *osyms = 0, *ssyms = 0;
+    
+    if (!FLAGS_isymbols.empty()) {
+      isyms = SymbolTable::ReadText(FLAGS_isymbols);
+      if (!isyms) exit(1);
+    }
+    
+    if (!FLAGS_osymbols.empty()) {
+      osyms = SymbolTable::ReadText(FLAGS_osymbols);
+      if (!osyms) exit(1);
+    }
+    
+    if (!FLAGS_ssymbols.empty()) {
+      ssyms = SymbolTable::ReadText(FLAGS_ssymbols);
+      if (!ssyms) exit(1);
+    }
+    
+    FstReader<Arc> fstreader(*istrm, ifilename, isyms, osyms, ssyms,
+			     FLAGS_acceptor, FLAGS_keep_isymbols,
+			     FLAGS_keep_osymbols, FLAGS_keep_state_numbering);
+    
+    const Fst<Arc> *fst = &fstreader.Fst();
+    if (FLAGS_fst_type != "vector") {
+      fst = Convert<Arc>(*fst, FLAGS_fst_type);
+      if (!fst) return 1;
+    }
+    fst->Write(argc > 2 ? argv[2] : "");
+    if (istrm != &std::cin)
+      delete istrm;
+    return 0;
+  }
+#endif
+  
+}  // namespace fst
+
+#endif /* __FST_IO_H__ */
+
diff --git a/tools/grxmlcompile/gr_iface.cpp b/tools/grxmlcompile/gr_iface.cpp
new file mode 100644
index 0000000..e6a37c7
--- /dev/null
+++ b/tools/grxmlcompile/gr_iface.cpp
@@ -0,0 +1,207 @@
+/* FILE:		gr_iface.cpp
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <string>
+#include <assert.h>
+
+#include "grph.h"
+
+#define DEBUG       0
+
+int Graph::addSubGraph (SubGraph *sbGraph)
+{
+    int ruleId;
+
+    if (numSubGraph%BLKSIZE == 0) {
+	if (numSubGraph >0) {
+	    SubGraph **newSubGraph= new SubGraph * [numSubGraph+BLKSIZE];
+	    int *newIndex= new int [numSubGraph+BLKSIZE];
+	    for (int ii= 0; ii < numSubGraph; ii++) {
+                newSubGraph[ii]= subGraph[ii];
+                newIndex[ii]= subIndex[ii];
+	    }
+	    delete [] subGraph;
+	    delete [] subIndex;
+	    subGraph= newSubGraph;
+	    subIndex= newIndex;
+	}
+	else {
+	    subGraph= new SubGraph * [BLKSIZE];
+	    subIndex= new int [BLKSIZE];
+	}
+    }
+    ruleId= sbGraph->getRuleId();
+
+    subGraph[numSubGraph]= sbGraph;
+    subIndex[numSubGraph]= ruleId;
+#if DEBUG
+    char rulLabel[128];
+
+    if (sbGraph) {
+        sbGraph->getName (rulLabel, 128);
+        printf ("Adding rule %s with %d\n", rulLabel, ruleId);
+    }
+#endif
+    numSubGraph++;
+    return numSubGraph;
+}
+
+int Graph::getSubGraphIndex (int subId)
+{
+    for (int ii= numSubGraph-1; ii >= 0; ii--)
+        if (subIndex[ii] == subId)
+            return ii;
+    return -1;
+}
+
+int Graph::getSubGraphIndex (SubGraph *sGraph)
+{
+    for (int ii= numSubGraph-1; ii >= 0; ii--)
+        if (subGraph[ii] == sGraph)
+            return subIndex[ii];
+    return -1;
+}
+
+/**  Begin and end scope */
+
+void Graph::BeginRule (SubGraph *subg)
+{
+    subg->BeginScope (SCOPE_RULE, 0, 0);
+#if DEBUG
+    subg->DebugPrintDirective ("<ruleref>");
+#endif
+    return;
+}
+
+void Graph::EndRule (SubGraph *subg)
+{
+#if DEBUG
+    subg->DebugPrintDirective ("</ruleref>");
+#endif
+    subg->EndScope();
+    return;
+}
+
+void Graph::BeginItem (SubGraph *subg)
+{
+    subg->BeginScope (SCOPE_ITEM, 0, 0);
+#if DEBUG
+    subg->DebugPrintDirective ("<item>");
+#endif
+    return;
+}
+
+void Graph::BeginItemRepeat (SubGraph *subg, int minCount, int maxCount)
+{
+    subg->BeginScope (SCOPE_REPEAT, minCount, maxCount);
+#if DEBUG
+    subg->DebugPrintDirective ("<item repeat>");
+#endif
+    return;
+}
+
+void Graph::AddRuleRef (SubGraph *subg, int ruleNo)
+{
+    subg->AddItem (-ruleNo, ruleNo);
+#if DEBUG
+    subg->DebugPrintDirective ("<add ruleref>");
+    printf ("    %d\n", ruleNo);
+#endif
+    return;
+}
+
+void Graph::AddLabel (SubGraph *subg, int labNo)
+{
+    subg->AddItem (labNo, -1);
+#if DEBUG
+    subg->DebugPrintLabel (labNo);
+#endif
+    return;
+}
+
+void Graph::AddTag (SubGraph *subg, int tagNo)
+{
+    subg->AddTag (tagNo);
+#if DEBUG
+    subg->DebugPrintLabel (tagNo);
+#endif
+    return;
+}
+
+void Graph::EndItem (SubGraph *subg)
+{
+#if DEBUG
+    subg->DebugPrintDirective ("</item>");
+#endif
+    subg->EndScope();
+    return;
+}
+
+void Graph::BeginOneOf (SubGraph *subg)
+{
+    subg->BeginScope (SCOPE_ONEOF, 0, 0);
+#if DEBUG
+    subg->DebugPrintDirective ("<one-of>");
+#endif
+    return;
+}
+
+void Graph::EndOneOf (SubGraph *subg)
+{
+#if DEBUG
+    subg->DebugPrintDirective ("</one-of>");
+#endif
+    subg->EndScope ();
+    return;
+}
+
+void Graph::BeginCount (SubGraph *subg, int minCount, int maxCount)
+{
+    subg->BeginScope (SCOPE_COUNT, minCount, maxCount);
+#if DEBUG
+    subg->DebugPrintDirective ("<count>");
+#endif
+    return;
+}
+
+void Graph::EndCount (SubGraph *subg)
+{
+#if DEBUG
+    subg->DebugPrintDirective ("</count>");
+#endif
+    subg->EndScope();
+    return;
+}
+
+void Graph::BeginOptional (SubGraph *subg)
+{
+    subg->BeginScope (SCOPE_OPT, 0, 0);
+#if DEBUG
+    subg->DebugPrintDirective ("<item repeat= 0- >");
+#endif
+    return;
+}
+
+void Graph::ExpandRules (SubGraph *subg)
+{
+    subg->ExpandRules (subGraph, subIndex, numSubGraph);
+    return;
+}
diff --git a/tools/grxmlcompile/grph.h b/tools/grxmlcompile/grph.h
new file mode 100644
index 0000000..5478728
--- /dev/null
+++ b/tools/grxmlcompile/grph.h
@@ -0,0 +1,75 @@
+/* FILE:		grph.h
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "sub_grph.h"
+
+class Graph
+{
+public:
+    Graph (char *name)
+    {
+        int count= strlen(name);
+        title= new char [count+1];
+        strcpy (title, name);
+        numSubGraph= 0;
+        return;
+    };
+
+    ~Graph()
+    {
+	  delete [] subGraph;
+	  delete [] subIndex;
+	if (title) {
+	    delete [] title;
+	}
+    }
+
+    int addSubGraph (SubGraph *subGraph);
+    int getSubGraphIndex (SubGraph *subGraph);
+
+    void BeginRule (SubGraph *subg);
+    void EndRule (SubGraph *subg);
+    void BeginItem (SubGraph *subg);
+    void BeginItemRepeat (SubGraph *subg, int min_count, int max_count);
+    void AddRuleRef (SubGraph *subg, int ruleNo);
+    void AddLabel (SubGraph *subg, int labNo);
+    void AddTag (SubGraph *subg, int tagNo);
+    void EndItem (SubGraph *subg);
+    void BeginOneOf (SubGraph *subg);
+    void EndOneOf (SubGraph *subg);
+    void BeginCount (SubGraph *subg, int minCount, int maxCount);
+    void EndCount (SubGraph *subg);
+    void BeginOptional (SubGraph *subg);
+
+    void ExpandRules (SubGraph *subg);
+
+    int         numSubGraph;
+    SubGraph    **subGraph;
+    int         *subIndex;
+
+private:
+
+    int getSubGraphIndex (int subId);
+
+    char        *title;
+
+};
+
+
diff --git a/tools/grxmlcompile/grxmlcompile.cpp b/tools/grxmlcompile/grxmlcompile.cpp
new file mode 100644
index 0000000..761bbc9
--- /dev/null
+++ b/tools/grxmlcompile/grxmlcompile.cpp
@@ -0,0 +1,940 @@
+/*---------------------------------------------------------------------------*
+ *  grxmlcompile.cpp  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ptypes.h"
+
+#include <ext/hash_map>
+
+#include "fst/lib/fst.h"
+#include "fst/lib/fstlib.h"
+#include "fst/lib/arc.h"
+#include "fst/lib/fst-decl.h"
+#include "fst/lib/vector-fst.h"
+#include "fst/lib/arcsort.h"
+#include "fst/lib/invert.h"
+
+#include "fst-io.h"
+
+#include "ESR_Locale.h"
+#include "LCHAR.h"
+#include "pstdio.h"
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "ESR_Session.h"
+#include "SR_Session.h"
+#include "SR_Vocabulary.h"
+#include "srec_arb.h"       // for EPSILON_LABEL etc
+#include <fstream>
+#include <iostream>
+#include "tinyxml.h"
+#include "grxmldoc.h"
+
+#ifdef MEMTRACE
+#include <mcheck.h>
+#endif
+
+#define OPENFST_ACKNOWLEDGEMENT	\
+	"This tool uses the OpenFst library. \n" \
+ "Licensed under the Apache License, Version 2.0 (the \"License\");\n" \
+" you may not use this file except in compliance with the License.\n" \
+" You may obtain a copy of the License at" \
+"\n" \
+"      http://www.apache.org/licenses/LICENSE-2.0\n" \
+"\n" \
+" Unless required by applicable law or agreed to in writing, software\n" \
+" distributed under the License is distributed on an \"AS IS\" BASIS,\n" \
+" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" \
+" See the License for the specific language governing permissions and\n" \
+" limitations under the License.\n" \
+"\n" \
+" This library was developed at Google Research (M. Riley, J. Schalkwyk, W. Skut) and NYU's Courant Institute (C. Allauzen, M. Mohri). It is intended to be comprehensive, flexible, efficient and scale well to large problems. It is an open source project distributed under the Apache license. \n" 
+
+
+#define TINYXML_ACKNOWLEDGEMENT	\
+	"This tool uses the tinyxml library. \n" \
+"Copyright (c) 2007 Project Admins: leethomason \n" \
+"The TinyXML software is provided 'as-is', without any express or implied\n" \
+"warranty. In no event will the authors be held liable for any damages\n" \
+"arising from the use of this software.\n" \
+"\n" \
+"Permission is granted to anyone to use this software for any purpose,\n" \
+"including commercial applications, and to alter it and redistribute it\n" \
+"freely, subject to the following restrictions:\n" 
+
+#define NUANCE_COPYRIGHT \
+"// grxmlcompile\n" \
+"//\n" \
+"// Licensed under the Apache License, Version 2.0 (the \"License\");\n" \
+"// you may not use this file except in compliance with the License.\n" \
+"// You may obtain a copy of the License at\n" \
+"//\n" \
+"//      http://www.apache.org/licenses/LICENSE-2.0\n" \
+"//\n" \
+"// Unless required by applicable law or agreed to in writing, software\n" \
+"// distributed under the License is distributed on an \"AS IS\" BASIS,\n" \
+"// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" \
+"// See the License for the specific language governing permissions and\n" \
+"// limitations under the License.\n" \
+"//\n" \
+"// This program compiles a .grxml grammar into the graphs needed for \n" \
+"// decoding with SREC\n" \
+"// \n" 
+
+#define MAX_LINE_LENGTH   256
+#define MAX_PATH_NAME 512
+#define MAX_PRONS_LENGTH 1024
+#define SILENCE_PREFIX_WORD "-pau-"
+#define SILENCE_SUFFIX_WORD "-pau2-"
+#define SLOT_SUFFIX "__"
+#define SLOT_PREFIX "__"
+#define MAX_NUM_SLOTS 12 /* must agree with srec_context.h */
+#define EXTRA_EPSILON_LABEL 39999 // must be higher than the number of models
+#define DEFAULT_WB_COST 40
+#define DEFAULT_WB_COST_STR "40"
+#define SLOT_COUNTER_OFFSET 30000 // must be higher than the number of models
+#define NOISE_PHONEME_CODE 'J'
+
+static int debug = 0;
+static int verbose = 0;
+
+using namespace std;
+
+ESR_ReturnCode make_openfst_graphs(GRXMLDoc* pDoc, /* for metas */
+				   const std::string& grxmlBasename,
+				   const char* vocabFilename,
+				   const char* cfstFilename, 
+				   const char* modelmapFilename);
+
+const char* showline(const char* fn, int line_num)
+{
+  static char line[8096] = { 0 };
+  int line_count = 0;
+  ifstream strm(fn);
+  while (strm && strm.getline(line, sizeof(line))) 
+	  if(line_count++ == line_num) break;
+  return &line[0];
+}
+
+std::string ExtractFileName(const std::string& full)
+{
+  std::string::size_type idx = full.find_last_of("/");
+    
+  if (idx != std::string::npos)
+    return full.substr(idx+1);
+  else 
+    return full;
+}
+
+/*-----------------------------------------------------------------------*
+ *                                                                       *
+ *                                                                       *
+ *-----------------------------------------------------------------------*/
+
+int usage_error(const char* prgname)
+{
+  printf("USAGE: -par <par file> -grxml <grxml grammar file> -vocab <dictionary file (.ok)> [-outdir <output directory>]\n");
+  return (int)ESR_INVALID_ARGUMENT;
+}
+
+int main(int argc, char* argv[])
+{
+  ESR_ReturnCode status = ESR_SUCCESS;
+  char *parfile = NULL;
+  char *grxmlfile = NULL;
+  char *cmdline_vocfile = NULL;
+  std::string outdir("."); // default output dir is current directory
+  /* for now, assume char and LCHAR are the same, else fail to compile! */
+  { char zzz[ 1 - (sizeof(LCHAR)!=sizeof(char))]; zzz[0] = 0; } 
+
+#ifdef MEMTRACE
+    mtrace();
+#endif
+
+#if defined(GRXMLCOMPILE_PRINT_ACKNOWLEDGEMENT)
+    cout << OPENFST_ACKNOWLEDGEMENT <<std::endl;
+    cout << TINYXML_ACKNOWLEDGEMENT <<std::endl;
+    cout << NUANCE_COPYRIGHT <<std::endl;
+#endif
+
+    // Process all XML files given on command line
+
+    if(argc<5){
+      return usage_error(argv[0]);
+    }
+
+    for(int i=1;i<argc;i++)
+    {
+      if(!strcmp(argv[i],"-grxml"))
+        grxmlfile = argv[++i];
+      else if(!strcmp(argv[i],"-debug"))
+        debug++;
+      else if(!strcmp(argv[i],"-verbose"))
+        verbose++;
+      else if(!strcmp(argv[i],"-par") || !strcmp(argv[i],"-parfile"))
+        parfile = argv[++i];
+      else if(!strcmp(argv[i],"-vocab")) 
+        cmdline_vocfile = argv[++i];
+      else if(!strcmp(argv[i],"-outdir")) 
+        outdir = std::string(argv[++i]);
+      else {
+        printf("error_usage: argument [%s]\n", argv[i]);
+	return usage_error(argv[0]);
+	return (int)ESR_INVALID_ARGUMENT;
+      }
+    }
+
+    //process_xml( std::string(grxmlfile), parfile );
+    std::string filename = std::string(grxmlfile);
+
+    /***************************
+            process xml
+    ***************************/
+
+    cout << "processing [" << filename << "] ..." << endl;
+    
+    TiXmlDocument node;
+    bool bLoadedOK = node.LoadFile( filename.c_str() );
+    if(!bLoadedOK || node.Error()) {
+      std::cout << "Error: while creating TiXmlDocument from " << filename << std::endl;
+      std::cout << "Error: " << node.Error() << " id " << node.ErrorId() << " row " << node.ErrorRow() << " col " << node.ErrorCol() << std::endl;
+      std::cout << "Error: " << node.ErrorDesc() <<  std::endl;
+      std::cout << "Error: near " << showline( filename.c_str(), node.ErrorRow()) << std::endl;
+      return (int)ESR_INVALID_ARGUMENT;
+    }
+    
+    
+    // *************************************************
+    //	Parse the file into a DOM object and create word graph
+    //
+    GRXMLDoc *doc = new (GRXMLDoc);
+    std::string filenameNoPath = ExtractFileName(filename);
+    doc->parseGrammar( node, filenameNoPath );   // THE PARSING AND NETWORK BUILD HAPPENS IN HERE
+    /************************
+      end of xml processing
+    ************************/
+    
+    // Create grammar network files. Use prefix of input file for output.
+    std::string s = filename;
+    std::string grxmlbase = outdir + "/" + ExtractFileName(grxmlfile);
+    unsigned int p1 = grxmlbase.find_last_of(".");
+    if ( p1 != string::npos ) 
+      grxmlbase.assign( grxmlbase, 0, p1);
+
+    std::string newName;
+    newName = grxmlbase + ".map";
+    doc->writeMapFile( newName );
+    newName = grxmlbase + ".script";
+    doc->writeScriptFile( newName );
+
+    doc->writeGraphFiles( grxmlbase, false );
+    
+    // 
+    // SR initialization
+    //
+    char vocfile[MAX_PATH_NAME];
+    char cfstfile[MAX_PATH_NAME];
+    char modelmapfile[MAX_PATH_NAME];
+    size_t len;
+    
+    PMemInit();
+    printf("info: Using parfile %s\n",parfile);
+    status = SR_SessionCreate((const LCHAR*) parfile);
+    // status = SR_SessionCreate ( parfile );
+    if (  status != ESR_SUCCESS ) {
+      LPRINTF("Error: SR_SessionCreate(%s) %s\n", parfile, ESR_rc2str(status));
+      return (int)status;
+    }
+    
+    // vocfile
+    if(cmdline_vocfile) {
+      strcpy( vocfile, cmdline_vocfile);
+    } else {
+      len = MAX_PATH_NAME;
+      ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), (LCHAR*)vocfile, &len );
+      // skip PrefixWithBaseDirectory(), 'tis done inside SR_VocabularyLoad()
+    }
+    printf("info: Using dictionary %s\n",vocfile);
+    
+    // modelmapfile
+    len = MAX_PATH_NAME;
+    ESR_SessionGetLCHAR ( L("cmdline.arbfile"), (LCHAR*)modelmapfile, &len);
+    len = MAX_PATH_NAME;
+    status = ESR_SessionPrefixWithBaseDirectory ( (LCHAR*)modelmapfile, &len);
+    char* p = strrchr(modelmapfile,'/');
+    if(!p) p = strrchr(modelmapfile,'\\');
+    if(p) strcpy(p, "/models128x.map");
+    
+    // cfstfile
+    len = MAX_PATH_NAME;
+    ESR_SessionGetLCHAR ( L("cmdline.arbfile"), (LCHAR*)cfstfile, &len);
+    len = MAX_PATH_NAME;
+    status = ESR_SessionPrefixWithBaseDirectory ( (LCHAR*)cfstfile, &len);
+    p = strrchr(cfstfile,'/');
+    if(!p) p = strrchr(cfstfile,'\\');
+    if(p) strcpy(p, "/generic.C");
+    
+    status = make_openfst_graphs( doc, grxmlbase, (const char*)vocfile, (const char*)cfstfile, (const char*)modelmapfile);
+    if(status != ESR_SUCCESS) {
+      LPRINTF("Error: make_openfst_graphs() returned %s\n",  ESR_rc2str(status));      
+    } else {
+      /* make_openfst_graphs() can sometimes call doc->setMeta() to put
+	 Session parameters into the .params file, so writeParamsFile()
+	 should be called after make_openfst_graphs() */
+      newName = grxmlbase + ".params";
+      doc->writeParamsFile( newName );
+    }
+
+    //
+    // SR de-initialization
+    //
+    SR_SessionDestroy();
+    PMemShutdown();
+    
+    delete doc;
+    return (int)status;
+}
+
+/*-----------------------------------------------------------------*
+ * utils                                                           *
+ *-----------------------------------------------------------------*/
+
+bool is_slot_symbol( const char* sym)
+{
+  const char* p = strstr(sym,SLOT_PREFIX);
+  int len = strlen(sym);
+  if(len>4 && !strcmp(sym+len-2,SLOT_SUFFIX) && (p-sym)<len-2) {
+    return true;
+  } else 
+    return false;
+}
+
+int64 StrToId(const char *s, fst::SymbolTable *syms,
+	      const char *name) 
+{
+  int64 n;
+  if (syms) {
+    n = syms->Find(s);
+    if (n < 0) {
+      cerr << "FstReader: Symbol \"" << s
+	   << "\" is not mapped to any integer " << name
+	   << ", symbol table = " << syms->Name();
+    }
+  } else {
+    char *p;
+    n = strtoll(s, &p, 10);
+    if (p < s + strlen(s) || n < 0) {
+      cerr << "FstReader: Bad " << name << " integer = \"" << s;
+    }
+  }
+  return n;
+}
+
+/* FstMergeOLabelsToILabels, FstSplitOLabelsFromILabels
+   are used to make sure the minimization does not go overboard in pushing
+   output labels toward the beginning of the graph.  When that happens 
+   then the speech recognition decoder fails! */
+
+ESR_ReturnCode FstMergeOLabelsToILabels( fst::StdVectorFst& fst_, int max_ilabels )
+{
+  fst::StdArc::StateId s = fst_.Start();
+  if (s == fst::kNoStateId)
+    return ESR_INVALID_ARGUMENT;
+  for (fst::StateIterator< fst::StdVectorFst> siter(fst_); 
+       !siter.Done(); siter.Next()) {
+    s = siter.Value();
+    
+    for(fst::MutableArcIterator<fst::StdVectorFst> aiter(&fst_, s);
+	!aiter.Done(); aiter.Next()) {
+      fst::StdArc arc = aiter.Value();
+      if( arc.ilabel >= max_ilabels || 
+	  (float)arc.ilabel + ((float)max_ilabels)*arc.olabel > INT_MAX) {
+	std::cout << "Error: internal error in FstMergeOLabelsToILabels() " << std::endl;
+	return ESR_NOT_IMPLEMENTED;
+      }
+      arc.ilabel = arc.ilabel + max_ilabels * arc.olabel;
+      arc.olabel = 0;
+      aiter.SetValue( arc);
+    }
+  }
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode FstMergeOLabelsToILabels_GetMax( fst::StdVectorFst& fst_, int& max_ilabel )
+{
+  if (fst_.Start() == fst::kNoStateId) return ESR_INVALID_ARGUMENT;
+  for (fst::StateIterator< fst::StdVectorFst> siter(fst_); 
+       !siter.Done(); siter.Next()) {
+    for(fst::MutableArcIterator<fst::StdVectorFst> aiter(&fst_, siter.Value());
+	!aiter.Done(); aiter.Next()) {
+      if( aiter.Value().ilabel > max_ilabel) 
+	max_ilabel = aiter.Value().ilabel;
+    }
+  }
+  max_ilabel++;
+  return ESR_SUCCESS;
+}
+
+ESR_ReturnCode FstSplitOLabelsFromILabels( fst::StdVectorFst& fst_, int max_ilabels )
+{
+  fst::StdArc::StateId s = fst_.Start();
+  if (s == fst::kNoStateId)
+    return ESR_INVALID_ARGUMENT;
+  for (fst::StateIterator< fst::StdVectorFst> siter(fst_); 
+       !siter.Done(); siter.Next()) {
+    s = siter.Value();
+
+    for(fst::MutableArcIterator<fst::StdVectorFst> aiter(&fst_, s);
+	!aiter.Done(); aiter.Next()) {
+      fst::StdArc arc = aiter.Value();
+      arc.olabel = arc.ilabel / max_ilabels;
+      arc.ilabel = arc.ilabel - arc.olabel*max_ilabels;
+      aiter.SetValue( arc);
+    }
+  }
+  return ESR_SUCCESS;
+}
+
+/* this is to replace the "fake" extra epsilon input labels, which were
+   put there to disambiguate homonyms */
+
+ESR_ReturnCode FstReplaceILabel( fst::StdVectorFst& fst_, int from_ilabel, int into_ilabel)
+{
+  fst::StdArc::StateId s = fst_.Start();
+  if (s == fst::kNoStateId)
+    return ESR_INVALID_ARGUMENT;
+  for (fst::StateIterator< fst::StdVectorFst> siter(fst_); 
+       !siter.Done(); siter.Next()) {
+    s = siter.Value();
+
+    for(fst::MutableArcIterator<fst::StdVectorFst> aiter(&fst_, s);
+	!aiter.Done(); aiter.Next()) {
+      fst::StdArc arc = aiter.Value();
+      if(arc.ilabel == from_ilabel) {
+	arc.ilabel = into_ilabel;
+	aiter.SetValue( arc);
+      }
+    }
+  }
+  return ESR_SUCCESS;
+}
+
+/* this pushes the slot labels forward which gives an opportunity for 
+   multiple instances of the slot to be merged, eg. lookup NAME
+   vs lookup contact NAME .. if in separate rules, then they will
+   merge thanks to using 3 arcs for the NAME */
+
+ESR_ReturnCode FstPushSlotLikeOLabels( fst::StdVectorFst& fst_, int myMin, int myMax)
+{
+  int i;
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  char done_for_state[2*65536]; // hope this is enough!
+  memset( &done_for_state[0], 0, sizeof(done_for_state));
+
+  fst::StdArc::StateId s = fst_.Start();
+  for (fst::StateIterator< fst::StdVectorFst> siter(fst_); 
+       !siter.Done(); siter.Next()) {
+    s = siter.Value();
+
+    if(done_for_state[ s]) continue;
+    done_for_state[ s]++;
+
+    for(fst::MutableArcIterator<fst::StdVectorFst> aiter(&fst_, s);
+	!aiter.Done(); aiter.Next()) {
+      fst::StdArc arc = aiter.Value();
+      if(arc.olabel >= myMin && arc.olabel < myMax) {
+	fst::StdArc::StateId s2 = arc.nextstate;
+	int slotId = arc.olabel;
+
+	if(verbose) 
+	  std::cout << "info: FstPushSlotLikeOLabels() at state " << s << " arc ilabel " << arc.ilabel << " olabel " << arc.olabel << std::endl;
+
+	arc.ilabel = EPSILON_LABEL;
+	arc.olabel = EPSILON_LABEL;
+	arc.weight = 0; // zero weight
+	aiter.SetValue( arc);
+	done_for_state[ s2]++;
+	for(fst::MutableArcIterator<fst::StdVectorFst> aiter2(&fst_, s2);
+	    !aiter2.Done(); aiter2.Next()) {
+	  fst::StdArc arc2 = aiter2.Value();
+	  if(arc2.ilabel == WORD_BOUNDARY) {
+	    std::cout << "Error: FstPushSlotLikeOLabels() failing, there could be confusion between the slot (hack-pron) and a real-pron, the slot olabel may have been pushed by earlier fst operations!" << std::endl;
+	    rc = ESR_INVALID_STATE;
+	  } else 
+	    arc2.ilabel = EPSILON_LABEL;
+	  arc2.olabel = slotId;
+	  aiter2.SetValue( arc2);
+	}
+      }
+    }
+  }
+
+  /* check */
+  int *num_pclg_arcs_using_slot = new int[myMax];
+  for(i=0;i<myMax;i++) num_pclg_arcs_using_slot[i] = 0;
+  for (fst::StateIterator< fst::StdVectorFst> siter(fst_); 
+       !siter.Done(); siter.Next()) {
+    s = siter.Value();
+
+    for(fst::MutableArcIterator<fst::StdVectorFst> aiter(&fst_, s);
+	!aiter.Done(); aiter.Next()) {
+      fst::StdArc arc = aiter.Value();
+      if(arc.olabel >= myMin && arc.olabel < myMax) 
+	num_pclg_arcs_using_slot[arc.olabel]++;
+    }
+  }
+  for(i=0; i<myMax; i++) {
+    if(num_pclg_arcs_using_slot[i] > 1) {
+      std::cout << "Error: SREC will not support multiply referred slots." << std::endl;
+      std::cout << "Error: Consider re-working your grammar to merge the references into one rule" << std::endl;
+      std::cout << "Error: or use two different slots" << std::endl;
+      rc = ESR_NOT_SUPPORTED;
+    }
+  }
+  delete [] num_pclg_arcs_using_slot;
+
+  return rc;
+}
+
+/* gets the range of slot numbers, myMin inclusive, myMax is exclusive */
+
+void get_slot_olabel_range( const fst::SymbolTable* syms, int* myMin, int* myMax)
+{
+  // assumes slots are at the top of the symbol table
+  fst::SymbolTableIterator iter( *syms);
+  *myMin = *myMax = 0;
+  for(iter.Reset(); !iter.Done(); iter.Next() ) {
+    const char* sym = iter.Symbol();
+    if ( is_slot_symbol( sym)) {
+      if(! (*myMin)) *myMin = iter.Value();
+      *myMax = iter.Value()+1;
+    }
+  }
+}
+
+/* SLOT_COUNTER_OFFSET
+   The cfst is used to turn phonemes into acoustic models, but we're using
+   special phonemes for the slots, and must here add those as pass through
+   in the Cfst, meaning that the slot marker must be unchanged after 
+   composition.  To do that we find the places in the Cfst where silence is 
+   used, and put the slot marker arcs in parallel.  This also causes the 
+   models before the slot to assume silence to the right, and the models after
+   the slot to assume silence to the left, both of which are reasonable */
+
+ESR_ReturnCode FstAddSlotMarkersToCFst( fst::StdVectorFst& cfst_, int myMin, int myMax)
+{
+  int num_silence_arcs_in_cfst = 0;
+  int mimicPhonemeCode = SILENCE_CODE;
+
+  fst::StdArc::StateId s = cfst_.Start();
+  if (s == fst::kNoStateId)
+    return ESR_INVALID_ARGUMENT;
+  for (fst::StateIterator< fst::StdVectorFst> siter(cfst_); 
+       !siter.Done(); siter.Next()) {
+    s = siter.Value();
+
+    for(fst::MutableArcIterator<fst::StdVectorFst> aiter(&cfst_, s);
+	!aiter.Done(); aiter.Next()) {
+      fst::StdArc arc = aiter.Value();
+      if( arc.olabel == mimicPhonemeCode) {
+	num_silence_arcs_in_cfst++;
+	for(int i=myMin; i<myMax; i++) 
+	  cfst_.AddArc( s, fst::StdArc(SLOT_COUNTER_OFFSET+i /*model*/,
+				       SLOT_COUNTER_OFFSET+i /*phoneme*/, 0.0, arc.nextstate));
+      }
+    }
+  }
+  fst::ArcSort(&cfst_, fst::StdOLabelCompare());
+  if(!num_silence_arcs_in_cfst) 
+    return ESR_INVALID_ARGUMENT;
+  else 
+    return ESR_SUCCESS;
+}
+
+/*
+ * make the graphs used by the recognition engine during the search.
+ */
+
+ESR_ReturnCode make_openfst_graphs(  GRXMLDoc* pDoc,
+				     const std::string& grxmlBasename,
+				     const char* vocabFilename,
+				     const char* cfstFilename, 
+				     const char* modelmapFilename)
+{
+  SR_Vocabulary *vocab = 0;
+  ESR_ReturnCode rc;
+  
+  fst::StdVectorFst l_fst;      // .L file, created from the .map and .ok
+  
+  int stateSt, stateEn;
+  size_t len;
+  bool do_skip_interword_silence = false;
+  hash_map<string,int> homonym_count;
+  int word_penalty = 0;
+
+  rc = SR_VocabularyLoad(vocabFilename, &vocab);
+  if (rc != ESR_SUCCESS) {
+    cerr << "Error: " <<  ESR_rc2str(rc) << endl;
+    return ESR_INVALID_ARGUMENT; // goto CLEANUP;
+  }
+  
+  std::string word_penalty_str;
+  if( pDoc->findMeta(std::string("word_penalty"),word_penalty_str)) 
+    word_penalty = atoi((const char *)word_penalty_str.c_str());
+  else {
+    rc = ESR_SessionGetInt( L("CREC.Recognizer.wordpen"), &word_penalty);
+    if(rc != ESR_SUCCESS) 
+      word_penalty = DEFAULT_WB_COST;
+    word_penalty_str = DEFAULT_WB_COST_STR;
+    pDoc->setMeta( std::string("word_penalty"), word_penalty_str) ;
+    cout << "using word_penalty " << word_penalty << endl;
+  }
+
+  std::string do_skip_interword_silence_str;
+  if( pDoc->findMeta(std::string("do_skip_interword_silence"), do_skip_interword_silence_str)) 
+    do_skip_interword_silence = ((do_skip_interword_silence_str != "true") ? false : true);
+    
+  /*-----------------------------------------------------------------*
+   *   read the .map and .omap created from grxmlcompiler classes    *
+   *-----------------------------------------------------------------*/
+    
+  std::string omapFilename = grxmlBasename + std::string(".omap");
+  std::string imapFilename = grxmlBasename + std::string(".map");
+  
+  cout << "info: reading word symbols " << imapFilename << endl;
+  fst::SymbolTable *word_syms = fst::SymbolTable::ReadText(imapFilename);
+  if(!word_syms) {
+    cerr << "error: reading word_syms" << endl;
+    return ESR_INVALID_ARGUMENT;
+  }
+  cout << "info: reading parser symbols " << omapFilename << endl;
+  fst::SymbolTable *prsr_syms = fst::SymbolTable::ReadText(omapFilename);
+  if(!prsr_syms) {
+    cerr << "error: reading prsr_syms" << endl;
+    return ESR_INVALID_ARGUMENT;
+  }
+  cout << "info: reading model symbols " << modelmapFilename << endl;
+  fst::SymbolTable *model_syms = fst::SymbolTable::ReadText(modelmapFilename);
+  if(!prsr_syms) {
+    cerr << "error: reading prsr_syms" << endl;
+    return ESR_INVALID_ARGUMENT;
+  }
+  int max_model_sym = 0;
+  /* if(1) {
+     fst::SymbolTableIterator iter( *model_syms);
+     for(iter.Reset(); !iter.Done(); iter.Next() ) max_model_sym++; */
+  
+  /*-----------------------------------------------------------------*
+   * create the .L pronunciations transducer                         *
+   *-----------------------------------------------------------------*/
+
+  // Adds state 0 to the initially empty FST and make it the start state.
+  stateSt = l_fst.AddState();   
+  stateEn = l_fst.AddState();
+  l_fst.SetStart(stateSt);  // arg is state ID
+  l_fst.SetFinal(stateEn, 0.0);  // 1st arg is state ID, 2nd arg weight
+  l_fst.AddArc(stateEn, fst::StdArc(EPSILON_LABEL,EPSILON_LABEL,0.0,stateSt));
+
+  int num_slots = 0;
+  fst::SymbolTableIterator iter( *word_syms);
+  for(iter.Reset(); !iter.Done(); iter.Next() ) {
+    ESR_ReturnCode rc;
+    LCHAR prons[MAX_PRONS_LENGTH];
+    const char* phrase = iter.Symbol();
+    int wordId = iter.Value();
+    bool wordId_is_silence = false;
+    bool wordId_is_slot    = false;
+    /* script or scope marker, skip it */
+    /* if( is_scope_marker( phrase) || is_script_marker(phrase)) 
+       continue; */
+    /* epsilon */
+    if(!strcmp( phrase, SILENCE_PREFIX_WORD) 
+       || !strcmp(phrase,SILENCE_SUFFIX_WORD))
+      wordId_is_silence = true;
+    else if( !strcmp( phrase, "eps") && wordId == 0) 
+      continue;
+    /* rule markers */
+    else if( strstr( phrase, ".grxml@"))
+      continue;
+    /* script markers */
+    else if( phrase[0]=='_' && strspn(phrase+1,"0123456789")==strlen(phrase+1))
+      continue;
+    else if(is_slot_symbol(phrase)) {
+      cout << "SLOT>> " << phrase << endl;
+      wordId_is_slot = true;
+      num_slots++;
+    } 
+
+    if(num_slots > MAX_NUM_SLOTS) {
+      std::cout << "Error: SREC may have trouble with this many slots! (" << num_slots << ")" << std::endl;
+      // return ESR_NOT_SUPPORTED;
+    }
+
+    if(wordId_is_slot) {
+      int stateP = stateSt, statePp1;
+      /* with 2 arcs, we have a better chance to merge the slot if used from
+	 different parts of the grammar, see FstPushSlotLikeOLabels elsewhere */
+      statePp1 = l_fst.AddState();
+      l_fst.AddArc(stateP, fst::StdArc( wordId+SLOT_COUNTER_OFFSET, wordId, 0.0, statePp1));
+      stateP = statePp1;  
+      statePp1 = l_fst.AddState();
+      l_fst.AddArc(stateP, fst::StdArc( wordId+SLOT_COUNTER_OFFSET, EPSILON_LABEL, 0.0, statePp1));
+      stateP = statePp1;  
+      l_fst.AddArc(stateP, fst::StdArc( WORD_BOUNDARY, EPSILON_LABEL, 0.0, stateEn));
+    } else {
+      size_t len_used;
+      LCHAR *pron = 0, *p;
+      /* word is ok, get the pron */
+      len = MAX_PRONS_LENGTH;
+      rc = SR_VocabularyGetPronunciation(vocab, phrase, prons, &len);
+      if (rc != ESR_SUCCESS) {
+	LPRINTF( "ERROR: SR_VocabularyGetPronunciation(*,%s,*,*) returned %s\n", phrase, ESR_rc2str(rc));
+	SR_VocabularyDestroy(vocab);
+	return rc;
+      }
+      for(len_used=0; len_used<len; ) {
+	pron = &prons[0]+len_used;
+	len_used += LSTRLEN(pron)+1;
+	if( *pron == 0) break;
+	int stateP = stateSt, statePp1;
+	int olabel = wordId;
+	LPRINTF("%s : %s\n", phrase, pron);
+	/* main pronunciation */
+	for(p=pron; *p; p++) {
+	  statePp1 = l_fst.AddState();
+	  if(*p == OPTSILENCE_CODE) {
+	    l_fst.AddArc(stateP, fst::StdArc( SILENCE_CODE, olabel, 0.0, statePp1));
+	    l_fst.AddArc(stateP, fst::StdArc( EPSILON_LABEL, olabel, 0.0, statePp1));
+	  } else {
+	    l_fst.AddArc(stateP, fst::StdArc( *p, olabel, 0.0, statePp1));
+	  }
+	  stateP = statePp1;
+	  olabel = EPSILON_LABEL;
+	}
+	/* add epsilons if this is a homonym */
+	string pron_string = pron;
+	hash_map<string,int>::const_iterator it = homonym_count.find( pron_string);
+	if(it == homonym_count.end()) {
+	  homonym_count[ pron_string] = 0;
+	} else {
+	  homonym_count[ pron_string] = homonym_count[ pron_string]+1;
+	}
+	int extra_epsilons_needed = homonym_count[ pron_string] ;
+	if(wordId_is_silence) extra_epsilons_needed = 0;
+	for(int i=0;i<extra_epsilons_needed;i++) {
+	  statePp1 = l_fst.AddState();
+	  l_fst.AddArc(stateP, fst::StdArc( EXTRA_EPSILON_LABEL, olabel, 0.0, statePp1));
+	  stateP = statePp1;
+	}
+	/* add optional silence after each word */
+	if(!do_skip_interword_silence && !wordId_is_silence && !wordId_is_slot) {
+	  statePp1 = l_fst.AddState();
+	  l_fst.AddArc(stateP, fst::StdArc( SILENCE_CODE, EPSILON_LABEL, 0.0, statePp1));
+	  l_fst.AddArc(statePp1, fst::StdArc( WORD_BOUNDARY, EPSILON_LABEL, 0.0, stateEn));
+	  l_fst.AddArc(stateP, fst::StdArc( WORD_BOUNDARY, EPSILON_LABEL, 0.0, stateEn));
+	} else if(wordId_is_silence && !strcmp(phrase, SILENCE_SUFFIX_WORD)) {
+	  /* SILENCE_SUFFIX_WORD does not need a terminal .wb */
+	  l_fst.AddArc(stateP, fst::StdArc( EPSILON_LABEL, EPSILON_LABEL, 0.0, stateEn));
+	} else {
+	  l_fst.AddArc(stateP, fst::StdArc( WORD_BOUNDARY, EPSILON_LABEL, 0.0, stateEn));
+	}
+      } // loop over multiple prons
+    } // slot vs non-slot
+  } /* .map (word_syms) iterator */
+  
+  std::string lfstFilename = grxmlBasename + ".L";
+  // We can save this FST to a file with: 
+  if(debug) l_fst.Write(lfstFilename.c_str());
+  
+  /*-----------------------------------------------------------------*
+   *   read the .P.txt created from grxmlcompiler classes            *
+   *-----------------------------------------------------------------*/
+  
+  std::string ptxtFilename = grxmlBasename + std::string(".P.txt");
+  std::ifstream istrm(ptxtFilename.c_str());
+  if(!istrm) {
+    cerr << "error: reading ptxtFilename" << endl;
+    return ESR_INVALID_ARGUMENT;
+  }
+  
+  cout << "info: reading parser from text " << ptxtFilename << endl;
+  fst::FstReader<fst::StdArc> reader( istrm, ptxtFilename, word_syms, prsr_syms, 
+				      /*state_syms*/ NULL, 
+				      /*acceptor*/ false,
+				      /*ikeep*/ false,
+				      /*okeep*/ false,
+				      /*nkeep*/ false);
+  // .P file, created from the .P.txt and .omap
+  const fst::StdVectorFst& p_fst = reader.Fst();
+  
+  /*-----------------------------------------------------------------*
+   *   make the helper FSTs                                          *
+   *-----------------------------------------------------------------*/
+  
+  cout << "info: creating helper fsts" << endl;
+  fst::StdVectorFst prefix_fst;
+  fst::StdVectorFst suffix_fst;
+  fst::StdVectorFst eps_fst;
+  // int eps_word = StrToId("eps", word_syms, "arc ilabel");
+  int pau_word = StrToId(SILENCE_PREFIX_WORD, word_syms, "arc ilabel");
+  int pau2_word = StrToId(SILENCE_SUFFIX_WORD, word_syms, "arc ilabel");
+  if(pau_word < 0 || pau2_word < 0) 
+    return ESR_INVALID_ARGUMENT;
+  
+  stateSt = prefix_fst.AddState();   
+  stateEn = prefix_fst.AddState();
+  prefix_fst.SetStart(stateSt);  // arg is state ID
+  prefix_fst.SetFinal(stateEn, 0.0);  // 1st arg is state ID, 2nd arg weight
+  prefix_fst.AddArc(stateSt, fst::StdArc(pau_word, pau_word, 0.0, stateEn));
+  
+  stateSt = suffix_fst.AddState();   
+  stateEn = suffix_fst.AddState();
+  suffix_fst.SetStart(stateSt);  // arg is state ID
+  suffix_fst.SetFinal(stateEn, 0.0);  // 1st arg is state ID, 2nd arg weight
+  suffix_fst.AddArc(stateSt, fst::StdArc(pau2_word, pau2_word, 0.0, stateEn));
+  
+  stateSt = eps_fst.AddState();   
+  stateEn = stateSt; // stateEn = eps_fst.AddState();
+  eps_fst.SetStart(stateSt);  // arg is state ID
+  eps_fst.SetFinal(stateEn, 0.0);  // 1st arg is state ID, 2nd arg weight
+  // eps_fst.AddArc(stateSt, fst::StdArc(eps_word, eps_word, 0.0, stateEn));
+  
+  /*-----------------------------------------------------------------*
+   *    make Grev2.det.txt                                           *
+   *-----------------------------------------------------------------*/
+  cout << "info: creating reverse g fst" << endl;
+  fst::StdVectorFst g_fst = p_fst;   // this is a copy!!
+  fst::StdVectorFst grev_fst;        // reversed
+  fst::StdVectorFst grev_min_fst;    // eps removed and minimized
+  fst::StdVectorFst grev_det_fst;
+
+  fst::Project(&g_fst, fst::PROJECT_INPUT);
+  if(debug) g_fst.Write( grxmlBasename + ".G");
+  fst::Reverse( g_fst, &grev_fst);
+  if(debug) grev_fst.Write( grxmlBasename + ".Grev");
+  fst::RmEpsilon( &grev_fst, /*connect?*/ true );
+  if(debug) grev_fst.Write( grxmlBasename + ".Grevrme");
+  fst::Determinize(grev_fst, &grev_det_fst);
+  if(debug) grev_det_fst.Write( grxmlBasename + ".Grevrmedet");
+  if(1) fst::Minimize(&grev_det_fst);
+  if(debug) grev_det_fst.Write( grxmlBasename + ".Grevrmedetmin");
+  fst::Concat( &eps_fst, grev_det_fst);
+  grev_det_fst = eps_fst;
+  if(debug) grev_det_fst.Write( grxmlBasename + ".Grevrmedetmin2");
+  std::string grevFilename = grxmlBasename + std::string(".Grev2.det.txt");
+  
+  cout << "info: writing reverse G fst as text " << grevFilename << endl;
+  ostream* ostrm1 = new ofstream( grevFilename.c_str(), ios_base::out);
+  fst::FstPrinter<fst::StdArc> printer1( grev_det_fst,
+					word_syms, word_syms, 
+					 NULL, /*acceptor?*/ true);
+  printer1.Print( ostrm1, grevFilename);
+  delete ostrm1;
+  
+  /*-----------------------------------------------------------------*
+   *    make PCLG.txt                                                *
+   *-----------------------------------------------------------------*/
+  
+  fst::StdVectorFst* c_fst;
+  fst::StdVectorFst lg_fst;
+  fst::StdVectorFst clg_fst;
+  fst::StdVectorFst clg_det_fst;
+  
+  cout << "info: reading model fst " << cfstFilename << endl;
+  c_fst = fst::StdVectorFst::Read( cfstFilename);
+  
+  int slot_olabel_min=0, slot_olabel_max=0; // [min,max) .. ie excludes max
+  get_slot_olabel_range( word_syms, &slot_olabel_min, &slot_olabel_max);
+  if(slot_olabel_max > MAX_NUM_SLOTS) 
+    std::cout << "Error: SREC may have trouble with this many slots! (" << slot_olabel_max << ")" << std::endl;
+
+  /* add slot markers as if they were silence phonemes, this makes the context
+     for them as if the slot were silence, which is reasonable, although another
+     reasonable thing would be to allow all contexts.  Adding the true context
+     only would add complexity and slow down word addition too much. */
+
+  rc = FstAddSlotMarkersToCFst( *c_fst, slot_olabel_min, slot_olabel_max);
+  if(rc) return rc;
+
+  fst::Concat( &g_fst, suffix_fst);
+  fst::Concat( &prefix_fst, g_fst);
+  if(debug) prefix_fst.Write( grxmlBasename + ".G2");    
+  fst::ComposeOptions copts( /*connect?*/ true);
+  
+  fst::ArcSort(&l_fst, fst::StdOLabelCompare());
+  fst::ArcSort(&prefix_fst, fst::StdILabelCompare());
+
+  fst::Compose(l_fst, prefix_fst, &lg_fst, copts);
+  if(debug) lg_fst.Write( grxmlBasename + ".LG");    
+  fst::ArcSort(&lg_fst, fst::StdILabelCompare());
+  if(debug) lg_fst.Write( grxmlBasename + ".LG2");    
+
+  fst::RmEpsilon( &lg_fst, /*connect?*/ true );
+  if(debug) lg_fst.Write( grxmlBasename + ".LGrme");    
+  fst::Determinize( lg_fst, &clg_fst); // clg_fst is really lg_det_fst!
+  if(debug) clg_fst.Write( grxmlBasename + ".LGrmedet");    
+  rc = FstReplaceILabel( clg_fst, EXTRA_EPSILON_LABEL, EPSILON_LABEL);
+  fst::Compose( *c_fst, clg_fst, &clg_det_fst, copts);
+  if(debug) clg_det_fst.Write( grxmlBasename + ".CLGrmedet");    
+
+  rc = FstMergeOLabelsToILabels_GetMax( clg_det_fst, /*int&*/max_model_sym);
+  if(verbose)
+    cout << "info: merging into ilabels I=i+" << max_model_sym << "*o" << endl;
+  rc = FstMergeOLabelsToILabels( clg_det_fst, max_model_sym);
+  if(debug) clg_det_fst.Write( grxmlBasename + ".CLGrmedet2");    
+  fst::Minimize( &clg_det_fst);
+  if(debug) clg_det_fst.Write( grxmlBasename + ".CLGrmedet3");    
+  if(verbose) 
+    cout << "info: splitting from ilabels" << endl;
+  rc = FstSplitOLabelsFromILabels( clg_det_fst, max_model_sym);
+  if(debug) clg_det_fst.Write( grxmlBasename + ".CLGrmedet4");    
+
+  rc = FstPushSlotLikeOLabels( clg_det_fst, slot_olabel_min, slot_olabel_max);
+  if(rc != ESR_SUCCESS) 
+        std::cout << "Error: FstPushSlotLikeOLabels() failed" << std::endl;
+  if(debug) clg_det_fst.Write( grxmlBasename + ".CLG");    
+
+  std::string pclgFilename = grxmlBasename + ".PCLG.txt";
+  ostream* ostrm = new ofstream( pclgFilename.c_str(), ios_base::out);
+  fst::FstPrinter<fst::StdArc> printer( clg_det_fst, 
+					model_syms, word_syms, 
+					NULL, /*acceptor?*/ false);
+  printer.Print( ostrm, pclgFilename);
+  delete ostrm;
+  
+  delete c_fst;
+  delete word_syms;  word_syms = NULL;
+  delete prsr_syms;  prsr_syms = NULL;
+  delete model_syms; model_syms = NULL;
+  
+  /*-----------------------------------------------------------------*
+   *    cleanup                                                      *
+   *-----------------------------------------------------------------*/
+
+  if(vocab) {
+    SR_VocabularyDestroy(vocab);
+    vocab = NULL;
+  }
+  
+  return rc;
+
+}
+
+
diff --git a/tools/grxmlcompile/grxmldoc.cpp b/tools/grxmlcompile/grxmldoc.cpp
new file mode 100644
index 0000000..50c780a
--- /dev/null
+++ b/tools/grxmlcompile/grxmldoc.cpp
@@ -0,0 +1,1293 @@
+/*---------------------------------------------------------------------------*
+ *  grxmldoc.cpp  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include <stdlib.h>
+#include <fstream>
+#include <sstream>
+#include <iostream>
+#include <algorithm> // for std::sort
+#include "tinyxml.h"
+#include "grph.h"       // The word graph object and interface
+#include "sub_grph.h"	// The sub-graph object and interface
+#include "hashmap.h"
+#include "grxmldoc.h"
+#include "ESR_Session.h"
+//#include "LCHAR.h"
+
+#define GRXML_DEBUG 0
+#define MAX_PATH_NAME 512
+
+#define FATAL_ERROR(x,y) { std::cout << (x) << std::endl; exit ((y)); }
+#define WARNING(x) std::cout << (x) << std::endl;
+
+#if GRXML_DEBUG
+//#define DEBUG_PRINT(x) //
+#define DEBUG_PRINT(x) std::cout << (x) << std::endl;
+#define PRINT_EXPRESSION(x)
+//#define PRINT_EXPRESSION(x) std::cout << (x) << std::endl;
+#else
+#define DEBUG_PRINT(x) //
+#define PRINT_EXPRESSION(x) //
+
+#endif
+
+using namespace std;
+
+#define CHECK_NOT_EMPTY(s, t) { if (s.empty()) \
+				{ \
+				std::cout << "ERROR: Empty string of type "  << t <<std::endl; \
+				} \
+			     }
+
+int get_range(const std::string& s, int* minCnt, int* maxCnt)
+{
+  std::string sval;
+  unsigned int p1 =s.find("-");
+  if ( p1 !=string::npos ) {
+    sval.assign( s, 0, p1 );
+    if(strspn(sval.c_str(),"0123456789")<1) return 1;
+    *minCnt = atoi( sval.c_str() );
+    sval.assign( s, p1+1, s.size() );
+    *maxCnt = -1;    // 0== any?
+    // If max is given then use BeginCount otherwise use BeginItemRepeat
+    if (!sval.empty() ) {
+      if(strspn(sval.c_str(),"0123456789")<1) return 1;
+      *maxCnt = atoi( sval.c_str() );
+    }
+    return 0;
+  } 
+  p1 = s.find("+");
+  if( p1 != string::npos) {
+    sval.assign( s, 0, p1 );
+    if(strspn(sval.c_str(),"0123456789")<1) return 1;
+    *minCnt = atoi( sval.c_str() );
+    *maxCnt = -1; 
+    return 0;
+  }
+  if(strspn(s.c_str(),"0123456789")<1) return 1;
+  *minCnt = *maxCnt = atoi( s.c_str());
+  return 0;
+}
+
+GRXMLDoc::GRXMLDoc()
+{
+    m_NodeKeyWords.insert(make_pair("grammar", NodeTypeGrammar));
+    m_NodeKeyWords.insert(make_pair("rule", NodeTypeRule));
+    m_NodeKeyWords.insert(make_pair("ruleref", NodeTypeRuleReference));
+    m_NodeKeyWords.insert(make_pair("one-of", NodeTypeOneOf));
+    m_NodeKeyWords.insert(make_pair("item", NodeTypeItem));
+    m_NodeKeyWords.insert(make_pair("tag", NodeTypeTag));
+    m_NodeKeyWords.insert(make_pair("count", NodeTypeCount));
+    m_NodeKeyWords.insert(make_pair("meta", NodeTypeMeta));
+    m_pGraph = 0;
+    m_RuleAutoIndex = 0;
+    m_TagAutoIndex = 0;
+    m_LabelAutoIndex = 0;
+    m_ExpandedRulesAutoIndex = 0;
+    m_XMLFileName = "dummy.xml";
+}
+
+
+GRXMLDoc::~GRXMLDoc()
+{
+    deleteRules();
+    if (m_pGraph) {
+        delete m_pGraph;
+    }
+}
+
+
+bool GRXMLDoc::parseGrammar( XMLNode &node, std::string & xMLFileName )
+{
+    m_XMLFileName = xMLFileName;
+    // Set up the internally defined rules, etc.
+    initializeLists();
+    // The top level "document" node is given to this fn
+    // Create the container for the word graph.
+    if (m_pGraph) {
+        delete m_pGraph;
+    }
+    m_pGraph = new Graph("XML grammar");
+    SubGraph *p_SubGraph;
+
+    parseNode( node, p_SubGraph, 1 );     // NB Subgraph pointed to will change in recursive fn.
+
+    if (findSubGraph( m_RootRule, p_SubGraph )) {
+	m_pGraph->ExpandRules (p_SubGraph);
+	p_SubGraph->RemoveInternalConnections ();
+	//Print the root rule.
+	//printSubgraph( *p_SubGraph );
+    }
+    return true;
+}
+
+
+bool GRXMLDoc::parseNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level )
+{
+    // We will create a new subgraph for each rule node.
+    // The "current" subgraph is substituted with the new subgraph for all ops on child nodes.
+    // After processing child nodes the original subgraph is reinstated
+    // for final operations in the endNode() fn.
+
+    // Initial processing of the current node before processing children
+#if 0 && GRXML_DEBUG
+	if(node.Type() == TiXmlNode::ELEMENT) 
+		node.ToElement()->Print( stdout, level);
+	else if(node.Type() == TiXmlNode::DOCUMENT)
+		node.ToDocument()->Print( stdout, level);
+	else if(node.Type() == TiXmlNode::TEXT)
+		node.ToText()->Print( stdout, level);
+	else if(node.Type() == TiXmlNode::DECLARATION)
+		node.ToDeclaration()->Print( stdout, level);
+	else {
+		const char* text = node.Value();
+		if(!text) text = "__NULL__";
+		printf("processing node type %d text %s\n", node.Type(), text);
+	}
+#endif
+    beginNode( node, p_SubGraph, level );
+
+    SubGraph *p_LocalSubGraph;
+    p_LocalSubGraph = p_SubGraph;
+	TiXmlNode* child;
+	for( child = node.FirstChild(); child; child = child->NextSibling() )
+    {
+		parseNode ( *child, p_SubGraph, level+1 );
+    }
+    // Revert current node
+    p_SubGraph = p_LocalSubGraph;
+
+    // Finish processing current node
+    endNode( node, p_SubGraph, level );
+
+    return true;
+} // parseNode
+
+
+bool GRXMLDoc::beginNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level )
+{
+    std::string name = node.Value();
+    DEBUG_PRINT("Element = " + name);
+
+    // XMLNode::Type type = node.getType();
+    if ( node.Type() == TiXmlNode::TEXT) // isCData()
+    {
+      const char* cc_name = node.Parent()->Value();
+      std::string str_name(cc_name); 
+      DEBUG_PRINT (std::string("CDATA ") + name);
+      DEBUG_PRINT (std::string("CDATA ") + str_name);
+      
+      processCDATA( node, p_SubGraph );
+    }
+    else if ( node.Type()== TiXmlNode::ELEMENT /*isNode()*/ || node.NoChildren() /*isLeaf()*/)
+      {
+	//printNode(node, level);
+	// Use enum value
+	KEYWDPAIR::iterator pos;
+	pos = m_NodeKeyWords.find( name );
+	KeywordValues nodeType = NodeTypeBadValue;
+	if ( pos != m_NodeKeyWords.end() )
+	{
+	    nodeType = (*pos).second;
+	    DEBUG_PRINT("nodeType=" + nodeType);
+	} else if(node.Type() == TiXmlNode::COMMENT) {
+		return true;
+	} else if(node.Type() == TiXmlNode::DECLARATION && name.length()==0) {
+		return true;
+	} else {
+	  FATAL_ERROR( std::string("Error: unknown tag ") + name, ESR_INVALID_ARGUMENT);
+	}
+
+	switch ( nodeType )
+	{
+	case NodeTypeGrammar:
+	    {
+		beginParseGrammarNode( node );
+	    }
+	    break;
+	case NodeTypeRule:
+	    {
+		// NB This fn creates a new subgraph.
+		beginParseRuleNode( node, p_SubGraph );
+	    }
+	    break;
+	    case NodeTypeRuleReference:
+	    {
+		// NB This fn creates a new subgraph.
+		beginRuleRef( node, p_SubGraph );
+	    }
+	    break;
+	    case NodeTypeOneOf:
+	    {
+		beginOneOf( node, p_SubGraph );
+	    }
+	    break;
+	    case NodeTypeItem:
+	    {
+		beginItem( node, p_SubGraph );
+	    }
+	    break;
+	    case NodeTypeTag:
+	    {
+		beginTag( node, p_SubGraph );
+	    }
+	    break;
+	    case NodeTypeCount:
+	    {
+		beginCount( node, p_SubGraph );
+	    }
+	    break;
+	    case NodeTypeMeta:
+	    {
+	        beginParseMetaNode( node );
+	    }
+	    break;
+	    case NodeTypeBadValue:
+	    default:
+		DEBUG_PRINT( "UNKNOWN node name: " + name );
+	    break;
+	}; // switch
+    } //is a Node or Leaf
+    else if ( node.Type() == TiXmlNode::TEXT) // isCData()
+      {
+	DEBUG_PRINT (std::string("CDATA ") + name);
+	processCDATA( node, p_SubGraph );
+    }
+    return true;
+} // beginNode()
+
+
+bool GRXMLDoc::endNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level )
+{
+    std::string name = node.Value();
+    //XMLNode::Type type = node.getType();
+
+    if ( node.Type()== TiXmlNode::ELEMENT /*isNode()*/ || node.NoChildren() )
+    {
+	KEYWDPAIR::iterator pos;
+	pos = m_NodeKeyWords.find( name );
+	KeywordValues nodeType = NodeTypeBadValue;
+	if ( pos != m_NodeKeyWords.end() )
+	{
+	    nodeType = (*pos).second;
+	}  else if(node.Type() == TiXmlNode::COMMENT) {
+		return true;
+	} else if(node.Type() == TiXmlNode::DECLARATION && name.length()==0) {
+		return true;
+	} else if(node.Type() == TiXmlNode::TEXT) {
+
+	} else {
+	  FATAL_ERROR( std::string("Error: unknown tag ") + name, ESR_INVALID_ARGUMENT );
+	}
+
+	switch ( nodeType )
+	{
+	case NodeTypeGrammar:
+	{
+	    endParseGrammarNode( node );
+	}
+	break;
+	case NodeTypeRule:
+	{
+	    endParseRuleNode( node, p_SubGraph );
+	}
+	break;
+	case NodeTypeRuleReference:
+	{
+	    endRuleRef( node, p_SubGraph );
+	}
+	break;
+	case NodeTypeOneOf:
+	{
+	    endOneOf( node, p_SubGraph );
+	}
+	break;
+	case NodeTypeItem:
+	{
+	    endItem(node, p_SubGraph );
+	}
+	break;
+	case NodeTypeTag:
+	{
+	    endTag( node, p_SubGraph );
+	}
+	break;
+	case NodeTypeCount:
+	{
+	    endCount( node, p_SubGraph );
+	}
+	break;
+        case NodeTypeMeta:
+	{
+            endParseMetaNode( node );
+	}
+	break;
+	case NodeTypeBadValue:
+	default:
+	    DEBUG_PRINT( "UNKNOWN node name: ");
+	    DEBUG_PRINT( name.c_str() );
+	//Extend the
+	break;
+	}; // switch
+    } //isNode() or isLeaf()
+    else
+    {
+	// Do nothing?
+    }
+    return true;
+} // endNode()
+
+
+bool GRXMLDoc::beginParseGrammarNode(XMLNode &node)
+{
+	const char* attr;
+#define GETATTR(nAmE) ((attr=node.ToElement()->Attribute(nAmE))!=NULL) ? attr:""
+	m_XMLMode      = GETATTR("mode");
+	m_XMLLanguage  = GETATTR("xml:lang");
+    m_RootRule     = GETATTR("root");	// The root rule name
+
+    DEBUG_PRINT("Root rule = " + m_RootRule);
+
+    m_XMLTagFormat = GETATTR("tag-format");
+    m_XMLVersion   = GETATTR("version");
+    m_XMLBase      = GETATTR("xml:base");
+    return true;
+}
+
+bool GRXMLDoc::beginParseMetaNode(XMLNode &node)
+{
+  const char* attr;
+  std::string meta_name  = GETATTR("name");
+  std::string meta_value = GETATTR("content");
+
+  if(meta_name == "word_penalty") {
+    m_MetaKeyValPairs.insert(meta_name,meta_value);
+    // m_MetaKeyValPairs.print();
+  } else if(meta_name == "do_skip_interword_silence") {
+    for(int j = 0; j<(int)meta_value.size(); j++){
+      meta_value[j] = tolower(meta_value[j]); //lower();
+    }
+    if(meta_value!="true" && meta_value!="false") 
+      printf ("\nWarning: %s must be set to 'true' or 'false'; defaulting to 'false'\n", meta_name.c_str());
+    else 
+      m_MetaKeyValPairs.insert(meta_name,meta_value);
+  } else if(meta_name == "userdict_name") {
+    printf ("\nWarning: ignoring unsupported meta %s %s\n", meta_name.c_str(), meta_value.c_str());
+  } else {
+    printf ("\nWarning: ignoring unsupported meta %s %s\n", meta_name.c_str(), meta_value.c_str());
+  }
+  return true;
+}
+
+
+bool GRXMLDoc::endParseGrammarNode(XMLNode &node)
+{
+    // End parse operations
+    return true;
+}
+
+
+bool GRXMLDoc::beginParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph)
+{
+	const char* attr;
+    // Note: The subGraph may change if there are forward references. This
+    // is fine as we revert to the previous one when finished parsing the current node.
+    DEBUG_PRINT ( "---- Rule\n" );
+    std::string ruleName = GETATTR("id" );
+    std::string s_tag    = GETATTR("tag" );
+    if( s_tag.length()>0) {
+      FATAL_ERROR("Error: unsupported tag= syntax, use <tag> ... </tag>", 1)
+    }
+    CHECK_NOT_EMPTY( ruleName, "id" );
+    // Rule name must be unique within scope of entire grammar.
+    // Put rule on stack - for context
+    m_RuleListStack.push( ruleName );
+
+    // Check whether a ruleref placeholder exists for this rule.
+    int index;
+    bool foundRule = findRuleIndex( ruleName, index );
+    if (foundRule) {
+	// Rule is already declared; it must have been forward referenced
+	// so swap the placeholder subgraph in.
+	// NB subgraph and rule name are already known to lists.
+	SubGraph *p_ExistingSubgraph;
+	if ( findSubGraph( ruleName, p_ExistingSubgraph ) ) {
+	    p_SubGraph = p_ExistingSubgraph;
+	}
+	else {
+	    FATAL_ERROR("ERROR! Subgraph without rule name entry found!", -1);
+        }
+    }
+    else {
+	// Create a Word Graph node for each rule node
+	SubGraph *newGraph;
+	addRuleToList( ruleName, newGraph );
+	p_SubGraph = newGraph;
+    }
+
+    // Make a note of the scope or rules; public, etc - used in map file.
+    findRuleIndex( ruleName, index );
+    std::string ruleScope = GETATTR("scope" );
+    if ( !ruleScope.empty() ) {
+        m_RuleScope.insert(index, ruleScope);
+    }
+
+    // We must accommodate Rules that have CDATA without an <item> element.
+    // We need to infer this element for all rules.
+    m_pGraph->BeginItem( p_SubGraph );
+
+    PRINT_EXPRESSION( ruleName + " = { " );
+    return true;
+} // beginParseRuleNode()
+
+
+bool GRXMLDoc::endParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph )
+{
+    // The rule expression has been built as a subgraph and ID added to the rule list.
+    // Finished editing subgraph
+    DEBUG_PRINT ( "---- /Rule\n" );
+    //m_pGraph->EndRule(&p_SubGraph);
+    // Tell the world
+    //std::string ruleName = attr.get( "id" );
+    std::string ruleName = m_RuleListStack.top();
+    m_RuleListStack.pop();
+    //CHECK_NOT_EMPTY( ruleName, "id" );
+    // Must be unique rule name within scope of entire grammar.
+    // Check whether a ruleref placeholder exists for this rule.
+    m_pGraph->addSubGraph ( p_SubGraph );
+
+    // We must accommodate Rules that have CDATA without an <item> element.
+    // We need to infer this element for all rules.
+    m_pGraph->EndItem( p_SubGraph );
+
+    PRINT_EXPRESSION( " }\n" );
+    return true;
+}
+
+bool GRXMLDoc::processCDATA( XMLNode &node, SubGraph *&p_SubGraph )
+{
+    // Note the Item's CDATA
+    // Strip leading and trailing whitespace
+    const char* cc_name = node.Parent()->Value();
+    std::string str_name(cc_name); // = node.Parent()->ValueStr(); // getName
+    // std::string name = node.Parent()->Value(); // getName
+    //if ( name == "item" ) {
+    if ( str_name != "tag" ) {
+
+	const char* const whitespace = " \t\r\n\v\f";
+	std::string cdata = node.Value(); // getCData()
+	std::string word; // Words are whitespace separated
+
+	cdata.erase(0, cdata.find_first_not_of(whitespace) );
+	cdata.erase(cdata.find_last_not_of(whitespace) + 1);
+#if GRXML_DEBUG
+        std::cout << "/--" << cdata << "--/\n";
+#endif
+
+	std::string::size_type begIdx, endIdx;
+
+        //search beginning of the first word
+        begIdx = cdata.find_first_not_of(whitespace);
+
+        //while beginning of a word found
+	while (begIdx != std::string::npos) {
+            //search end of the actual word
+            endIdx = cdata.find_first_of (whitespace, begIdx);
+            if (endIdx == string::npos) {
+                //end of word is end of line
+                endIdx = cdata.length();
+            }
+            word.clear();
+	    // word.assign(cdata,begIdx,endIdx);
+	    word.append (cdata, begIdx, endIdx - begIdx);
+	    if ( !word.empty() )
+	    {
+#if GRXML_DEBUG
+		std::cout << " -->" << word << "<--\n";
+#endif
+		int index;
+		// If a slot then take note of rule name
+		if ( IsSlot( word ) ) {
+		  const char* xmlBasename;
+		  std::string ruleName = m_RuleListStack.top();
+		  m_SlotList.insert(index, ruleName);
+		  xmlBasename = strrchr(m_XMLFileName.c_str(),'/');
+		  xmlBasename = xmlBasename ? xmlBasename+1 : m_XMLFileName.c_str();
+		  word = (std::string)xmlBasename + "." + ruleName + "@" + word;
+		  addLabelToList( word );
+		  findLabelIndex( word, index );
+		} else {
+		  addLabelToList( word );
+		  findLabelIndex( word, index );
+		}
+		m_pGraph->AddLabel( p_SubGraph, index );
+	    }
+	    begIdx = cdata.find_first_not_of (whitespace, endIdx);
+
+	}
+    } //tag
+    else {
+	// Do nothing with CDATA for elements that are not items.
+	// In particular, do not strip whitespace from tag cdata.
+	// However, CPPDOM appears to remove linefeeds. May need to tidy up.
+
+    }
+    return true;
+} // cdata
+
+bool GRXMLDoc::beginItem( XMLNode &node, SubGraph *&p_SubGraph )
+{
+	const char* attr;
+    DEBUG_PRINT ("---- Item:\n");
+    // First check whethere there is a count/repeat
+    std::string s     = GETATTR("repeat" );
+    int minCnt=0,maxCnt=0;
+    std::string s_tag = GETATTR("tag" );
+    if( s_tag.length()>0) {
+      FATAL_ERROR("Error: unsupported tag= syntax, use <tag> ... </tag>", 1)
+    }
+    if( s.length()>0 && get_range( s, &minCnt, &maxCnt) ) {
+      FATAL_ERROR(std::string("error: while parsing range ") + s,1);
+    }
+    if ( !s.empty() ) {
+      // RED FLAG: max should not be 0! A +ve number should have been given.
+      if( maxCnt>0) {
+	m_pGraph->BeginCount( p_SubGraph, minCnt, maxCnt );
+      }
+      else {
+	// NB: BeginItemRepeat  can only use min of 0 or 1!
+	m_pGraph->BeginItemRepeat ( p_SubGraph, minCnt, -1);
+      }
+    }
+    else {
+	m_pGraph->BeginItem( p_SubGraph );
+    }
+    return true;
+}
+
+
+bool GRXMLDoc::endItem( XMLNode &node, SubGraph *&p_SubGraph )
+{
+    DEBUG_PRINT ( "---- /Item\n" );
+
+    // What TODO if no tag for an item?
+
+    m_pGraph->EndItem( p_SubGraph );
+    return true;
+}
+
+
+bool GRXMLDoc::beginRuleRef( XMLNode &node, SubGraph *&p_SubGraph )
+{
+    // Extend word FST node with an entire FST subgraph.
+    // Forward referencing of rules is supported.
+    // NB Remove the leading # from the ruleref name!
+    DEBUG_PRINT ( "---- Ruleref\n" );
+
+	const char* attr;
+    std::string s_tag = GETATTR("tag" );
+    if( s_tag.length()>0) {
+      FATAL_ERROR("Error: unsupported tag= syntax, use <tag> ... </tag>", 1)
+    }
+    std::string s = GETATTR("uri" );
+    if (s.empty())
+    {
+	//
+	FATAL_ERROR( "ERROR! Ruleref specifies no uri name!", -1 );
+    }
+    // Remove the #:
+    int p1 = s.find("#");
+    if ( p1 !=0 ) {
+	FATAL_ERROR( "ERROR! bad ruleref name: '" + s + "'" + ". Rule reference must start with a '#'. External references are not supported.", -1 );
+    }
+    string ruleName;
+    getRuleRefName( node, ruleName );
+
+    //std::string parentRuleName = m_RuleListStack.top();
+    //addRuleDependency( parentRuleName, ruleName );
+
+    int index;
+    bool foundRule = findRuleIndex( ruleName, index );
+    if (!foundRule) {
+	// Forward reference; create a placeholder subgraph ptr.
+	//SubGraph *newGraph = new SubGraph( (char *) ruleName.c_str() );
+	// RED FLAG:  Remember to check fwd ref rule was filled in at end.
+	SubGraph *newGraph;
+	addRuleToList( ruleName, newGraph );
+	findRuleIndex( ruleName, index );
+    }
+    // We can now treat a forward-referenced graph as if it was defined.
+    // We will add the subgraph when we have the tag - see endItem().
+    m_pGraph->BeginRule( p_SubGraph );
+    m_pGraph->AddRuleRef( p_SubGraph, index );
+    m_pGraph->EndRule( p_SubGraph );
+
+    return true;
+}
+
+
+bool GRXMLDoc::endRuleRef(XMLNode &grmNode, SubGraph *&p_SubGraph )
+{
+    DEBUG_PRINT ( "---- /Ruleref\n" );
+    // Does nothing
+    // NB The tag is not under the ruleref element - it is in the current item element.
+    // We now add the tag of the AddRuleRef as we see the tag element. See EndTag().
+
+    return true;
+}
+
+
+bool GRXMLDoc::beginOneOf(XMLNode &grmNode, SubGraph *&p_SubGraph)
+{
+    DEBUG_PRINT ( "----OneOf\n" );
+    m_pGraph->BeginOneOf (p_SubGraph);
+    return true;
+}
+
+
+bool GRXMLDoc::endOneOf(XMLNode &grmNode, SubGraph *&p_SubGraph)
+{
+    DEBUG_PRINT ( "----/OneOf\n" );
+    m_pGraph->EndOneOf (p_SubGraph);
+    return true;
+}
+
+
+bool GRXMLDoc::beginTag( XMLNode &node, SubGraph *&p_SubGraph )
+{
+    DEBUG_PRINT ("---- Tag\n");
+    std::string s = node.ToElement()->GetText(); // getCdata();
+#if GRXML_DEBUG
+    std::cout << s;     // debug
+#endif
+    // Store the semantic tag info.
+    // NB Do not strip whitespace from tag cdata
+    if ( !s.empty() )
+    {
+	int index;
+	addTagToList( s );
+	findTagIndex( s, index );
+	m_pGraph->AddTag ( p_SubGraph, index );
+    }
+
+    return true;
+}
+
+
+bool GRXMLDoc::endTag( XMLNode &node, SubGraph *&p_SubGraph )
+{
+    DEBUG_PRINT ("---- /Tag\n");
+    return true;
+}
+
+
+bool GRXMLDoc::beginCount( XMLNode &node, SubGraph *&p_SubGraph )
+{
+	const char* attr;
+    // Count of reps applies to the text elements in this count node
+    DEBUG_PRINT ("---- Count\n");
+    // Get number attr
+    std::string s     = GETATTR("number");
+    std::string s_tag = GETATTR("tag" );
+    if( s_tag.length()>0) {
+      FATAL_ERROR("Error: unsupported tag= syntax, use <tag> ... </tag>", 1)
+    }
+    if (s.empty()) {
+		return false;
+    }
+    // not  in subgraph but in graph?!
+    //graph.BeginCount(n);
+
+    int minCnt=-1, maxCnt=-1;
+    if( get_range( s, &minCnt, &maxCnt) ) {
+      FATAL_ERROR(std::string("error: while parsing range ") + s,1);
+    }
+    if ( s.c_str() == std::string("optional") )
+    {
+	m_pGraph->BeginOptional( p_SubGraph );
+    }
+    else if ( minCnt>0 && maxCnt>0) 
+    {
+	m_pGraph->BeginCount( p_SubGraph, minCnt, maxCnt );
+    }
+    else if( minCnt>0 ) 
+      {
+	m_pGraph->BeginItemRepeat ( p_SubGraph, minCnt, -1);
+      }
+    else { //
+    	m_pGraph->BeginOptional ( p_SubGraph );
+    }
+
+    return true;
+}
+
+
+bool GRXMLDoc::endCount( XMLNode &node, SubGraph *&p_SubGraph )
+{
+    DEBUG_PRINT ("---- /Count\n");
+    m_pGraph->EndCount( p_SubGraph );
+    return true;
+}
+
+bool GRXMLDoc::endParseMetaNode(XMLNode &node)
+{
+  // End parse operations
+  return true;
+}
+
+void GRXMLDoc::printNode(XMLNode &node, int level)
+{
+    std::string name = node.Value();
+    int type = node.Type();
+    std::string c_data;
+
+    for(int i=0;i<level;i++) std::cout << " ";
+
+    char c = ' ';
+    switch(type)
+    {
+    case TiXmlNode::ELEMENT:
+	// case XMLNode::xml_nt_node: // grammar, rule, one-of, item, count
+	 c = '+';
+	 break;
+	/* case TiXmlNode::TEXT:
+	// case XMLNode::xml_nt_leaf:
+	c = '-';
+	break; */
+    case TiXmlNode::DOCUMENT:
+    // case XMLNode::xml_nt_document:
+	c = '\\';
+	break;
+    case TiXmlNode::TEXT:
+    // case XMLNode::xml_nt_cdata:
+	c = '#';
+	c_data = node.Value(); // getCdata();
+	break;
+	case TiXmlNode::UNKNOWN:
+	case TiXmlNode::COMMENT:
+	case TiXmlNode::TYPECOUNT:
+	case TiXmlNode::DECLARATION:
+	default:
+		std::cout << "Error: not sure what to do here" << std::endl;
+		break;
+    }
+	if(node.Type() == TiXmlNode::TEXT)  // isCData()
+	  std::cout << c << name.c_str() << "[" << c_data << "]" << std::endl;
+	//Extend the tag hashtable
+    else
+	  std::cout << c << name.c_str() << std::endl;
+
+	if( node.Type() == TiXmlNode::ELEMENT) {
+
+		for(TiXmlAttribute* attr=node.ToElement()->FirstAttribute();
+			attr; attr=attr->Next() ) {
+
+		  // guru: added output of attributes
+			for (int i=0; i<level; i++)
+				std::cout << " ";
+			std::cout << "   ";
+			std::cout << attr->Name() << ": " << attr->Value() << std::endl;
+		}
+	}
+
+}
+
+/** Function: addRuleToList
+    Extends list of SubGraphs with given subGraph
+    and extends list of rule names too.
+    TODO: Can we use one hash and use internal numeric index for rule IDs?
+*/
+
+
+bool GRXMLDoc::addRuleToList(std::string const & ruleName, SubGraph *&p_SubGraph)
+{
+    int index;
+    if ( findRuleIndex ( ruleName, index ) ) {
+	FATAL_ERROR("ERROR! Rule name " + ruleName + " is already defined!", -1 );
+    }
+
+    addLabelToList( m_XMLFileName + "@" + ruleName);
+    findLabelIndex( m_XMLFileName + "@" + ruleName, index );
+#if GRXML_DEBUG
+    std::cout << "Rule " << ruleName << std::endl;
+#endif
+    // Create the new subgraph and update lists
+    m_RuleList.insert( ruleName, index );
+    p_SubGraph = new SubGraph( (char *) ruleName.c_str(), index );
+
+    bool success = m_SubgraphList.insert( ruleName, p_SubGraph );
+    if (!success) {
+	FATAL_ERROR("ERROR! subgraph for " + ruleName + " is already defined!", -1 );
+    }
+#if ADD_BRACES
+    addLabelToList( "{" );
+    std::stringstream  ss;
+    ss << "}(" << index << ")";
+    addLabelToList( ss.str());
+#endif
+    return success;
+}
+
+
+bool GRXMLDoc::deleteRules()
+{
+    // Delete all allocated subgraphs.
+    // The rule strings are part of the hashtables and get deleted by them.
+    int index;
+    SubGraph *p_SubGraph;
+    std::string ruleName;
+    while ( !m_RuleList.isEmpty() ) {
+	m_RuleList.getFirst( &ruleName, &index );
+	m_RuleList.remove( ruleName );
+	if (m_SubgraphList.getValue( ruleName, &p_SubGraph ) ) {
+	    delete p_SubGraph;
+	}
+	else {
+	    FATAL_ERROR("No subgraph for rule " + ruleName + "! Mismatched rules and subgraph hashtables!", -1);
+	}
+    }
+    m_SubgraphList.clear();
+    m_RuleList.clear();
+    m_LabelList.clear();
+    m_TagList.clear();
+    return true;
+}
+
+bool GRXMLDoc::findSubGraph(std::string & s, SubGraph *&p_SubGraph)
+{
+    return m_SubgraphList.getValue(s, &p_SubGraph);
+}
+
+bool GRXMLDoc::findRule(int i, std::string &s )
+{
+    return m_RuleList.getIndex( i, &s );
+}
+
+bool GRXMLDoc::findTag(int i, std::string &s )
+{
+    return m_TagList.getValue( i, &s );
+}
+
+bool GRXMLDoc::findLabel(int i, std::string &s )
+{
+    return m_LabelList.getValue( i, &s );
+}
+
+bool GRXMLDoc::findSubGraphIndex( SubGraph *p_SubGraph, std::string &s )
+{
+    return m_SubgraphList.getIndex( p_SubGraph, &s );
+}
+
+bool GRXMLDoc::findRuleIndex( std::string s, int &i )
+{
+    return m_RuleList.getValue( s, &i );
+}
+bool GRXMLDoc::findTagIndex( std::string s, int &i )
+{
+    return m_TagList.getIndex( s, &i );
+}
+bool GRXMLDoc::findLabelIndex( std::string s, int &i )
+{
+    return m_LabelList.getIndex( s, &i );
+}
+bool GRXMLDoc::findMeta(const std::string & sn, std::string &s)
+{
+    return m_MetaKeyValPairs.getValue( sn, &s );
+}
+bool GRXMLDoc::setMeta(const std::string & sn, const std::string &s)
+{
+  std::string tmp;
+  if(findMeta(sn,tmp)) 
+    m_MetaKeyValPairs.remove(sn);
+  return m_MetaKeyValPairs.insert(sn,s);
+}
+
+bool GRXMLDoc::addTagToList( std::string const& s )
+{
+    bool success = true;
+    // Make values unique
+    int index;
+    if ( !findTagIndex( s, index ) ) 
+	success = m_TagList.insert( m_TagAutoIndex++, s );
+    return success;
+}
+
+
+bool GRXMLDoc::addLabelToList( std::string const& s )
+{
+  // TODO: Labels should be unique. Change key.
+  int index;
+  bool bRes = m_LabelList.getIndex( s, &index );
+  if(bRes == true) {
+    return false; // exists
+  }
+  bRes = m_LabelList.insert( m_LabelAutoIndex++, s );
+  return  bRes;
+}
+
+void GRXMLDoc::printLists()
+{
+    m_SubgraphList.print();
+    m_RuleList.print();
+    m_TagList.print();
+    m_LabelList.print();
+}
+
+
+void GRXMLDoc::printSubgraphs()
+{
+    SubGraph *p_SubGraph;
+    std::string rule;
+    int index;
+    if ( m_RuleList.getFirst( &rule, &index) ) {
+	if ( findSubGraph( rule, p_SubGraph ) ) {
+	    DEBUG_PRINT("============ Rule: " + rule + "============");
+	    printSubgraph( *p_SubGraph );
+	    while ( m_RuleList.getNext( &rule, &index) ) {
+		if ( findSubGraph( rule, p_SubGraph ) ) {
+		    printSubgraph( *p_SubGraph );
+		}
+	    }
+	}
+    }
+}
+
+
+void GRXMLDoc::printSubgraph( SubGraph &p_SubGraph )
+{
+    p_SubGraph.PrintWithLabels( *this );
+}
+
+
+bool GRXMLDoc::getRuleRefName(XMLNode &node, std::string &ruleName)
+{
+  const char* attr;
+  std::string s = GETATTR("uri" );
+  if (s.empty()) {
+    FATAL_ERROR( "ERROR! Ruleref specifies no uri name!", -1 );
+  }
+  // Remove the #:
+  int p1 = s.find("#");
+  if ( p1 !=0 ) {
+    FATAL_ERROR( "ERROR! bad ruleref name: '" + s + "'", -1 );
+  }
+  ruleName.assign( s, 1, s.size() );
+  return true;
+}
+
+void GRXMLDoc::initializeLists()
+{
+  m_SubgraphList.setName("Subgraphs");
+  m_RuleList.setName("Rules");
+  m_TagList.setName("Tags");
+  m_LabelList.setName("Labels");
+  
+  /* Predefined rules. NB Labels are also created for each rule added.
+  // The required order for these labels in the .map output file is:
+  //     0   eps
+  //     next come slots
+  //     pau and pau2
+  //     everything else
+  // We will add all these now in case they are referenced and we will
+  // reindex after we have parsed the grammar -- when we have the list
+  // of slots. This re-indexing is for the output files .map and .P.txt.
+  //
+  */
+    addLabelToList( "eps" );
+
+    addLabelToList( "-pau-" );
+    addLabelToList( "-pau2-" );
+}
+
+void GRXMLDoc::writeMapFile( std::string & fileName )
+{
+    // We need to re-index in order to put the labels in correct order:
+    // 1. eps
+    // 2. all slots
+    // 3. all rules
+    // 4. -pau- words
+    // 5. remaining labels
+    ofstream outfile;
+    int index, origIndex;
+    std::string label;
+    std::string slotRuleName;
+    std::string scope; // For rules
+    HashMap<int,std::string> orderedList;
+    int orderedIndex=0;
+    // 1. eps
+    orderedList.insert( orderedIndex++, "eps" );
+
+    // 2. slots
+    if ( m_LabelList.getFirst( &origIndex, &label ) ) {
+	if ( IsSlot( label ) ) {
+	    orderedList.insert( orderedIndex++, label );
+	}
+	while (m_LabelList.getNext( &origIndex, &label ) ) {
+	    if ( IsSlot( label ) ) {
+		orderedList.insert( orderedIndex++, label );
+	    }
+	}
+    }
+
+    // 3.  Now rules, or anything with @
+    if ( m_LabelList.getFirst( &origIndex, &label ) ) {
+	do {
+#if GRXML_DEBUG
+	    std::cout << label << " "<< label.find_first_of ("@") << std::endl;
+#endif
+            if (!IsSlot(label) && label.find_first_of ("@") != string::npos) {
+#if GRXML_DEBUG
+		std::cout << "    Adding " << label << std::endl;
+#endif
+		orderedList.insert( orderedIndex++, label );
+	    }
+	} while (m_LabelList.getNext( &origIndex, &label ) );
+    }
+
+    // 4. pau
+    orderedList.insert( orderedIndex++, "-pau-" );
+    orderedList.insert( orderedIndex++, "-pau2-" );
+
+    // 5. Remaining stuff. NB We depend upon the label not
+    //    being added twice.
+    if ( m_LabelList.getFirst( &origIndex, &label ) ) {
+	if ( !orderedList.getIndex( label, &index ) ) {
+	  orderedList.insert( orderedIndex++, label );
+	}
+	while (m_LabelList.getNext( &origIndex, &label ) ) {
+	    if ( !orderedList.getIndex( label, &index ) ) {
+	      orderedList.insert( orderedIndex++, label );
+	    }
+	}
+    }
+    outfile.open ( fileName.c_str() );
+
+    bool bRes = orderedList.getFirst( &index, &label );
+    do {
+      if(!bRes) break;
+      // Look up scope using original index
+      m_LabelList.getIndex( label, &origIndex );
+      if (m_RuleScope.getValue(origIndex, &scope) ) 
+	label = scope + ":" + label;
+      outfile << label << " " << index << std::endl;
+      bRes = orderedList.getNext( &index, &label );
+    } while(bRes);
+
+    outfile.close();
+}
+
+
+void GRXMLDoc::writeScriptFile( std::string & fileName )
+{
+    ofstream outfile;
+    int index;
+    std::string label;
+    outfile.open ( fileName.c_str() );
+    if ( m_TagList.getFirst( &index, &label ) ) {
+    	outfile << index << " " << label << std::endl;
+    }
+    while (m_TagList.getNext( &index, &label ) ) {
+    	outfile << index << " " << label << std::endl;
+    }
+    outfile.close();
+
+    //m_LabelList.writeFile( fileName );
+}
+
+void GRXMLDoc::writeParamsFile( std::string & fileName )
+{
+  std::string wtw;
+  ofstream outfile;
+  bool bRes;
+  
+  outfile.open(fileName.c_str());
+
+  std::string metaname = "word_penalty";
+  bRes = findMeta(metaname, wtw);
+  if(bRes)
+    outfile << metaname.c_str() << "\t=\t" << wtw.c_str() << std::endl;
+
+  // outfile << "locale"  << "\t=\t" << m_XMLLanguage << std::endl;
+  outfile.close();
+}
+
+void GRXMLDoc::writeGraphFiles( std::string& prefix, bool bDoWriteRecogGraphs)
+{
+    SubGraph *p_SubGraph;
+    SubGraph *p_SemGraph;
+    std::string fileName;
+    if ( !findSubGraph( m_RootRule, p_SubGraph ) ) {
+	FATAL_ERROR ("ERROR: writeGraphFiles - no root rule "+ m_RootRule + " defined. No file created", -1 );
+    }
+
+    //  Create .P.txt
+    printf ("\nCreating semantic graph file\n");
+    p_SemGraph = new SubGraph( (char *) "Main", -1);
+    m_pGraph->BeginRule( p_SemGraph );
+    m_pGraph->AddRuleRef( p_SemGraph, p_SubGraph->getRuleId());
+    m_pGraph->EndRule( p_SemGraph );
+    m_pGraph->ExpandRules (p_SemGraph);
+    p_SemGraph->RemoveInternalConnections ();
+
+    p_SemGraph->AddTerminalConnections ();
+    p_SemGraph->ReduceArcsByEquivalence();
+    p_SemGraph->RemoveUnreachedConnections (-1, -1);
+    p_SemGraph->DeterminizeArcs();
+    p_SemGraph->RemoveUnreachedConnections (-1, -1);
+    p_SemGraph->ReduceArcsByEquivalence();
+    p_SemGraph->RemoveUnreachedConnections (-1, -1);
+    fileName = prefix + ".P.txt";
+    p_SemGraph->WriteForwardGraphWithSemantic( fileName, *this );
+    delete p_SemGraph;
+
+    fileName = prefix + ".omap";
+    this->WriteOLabels(fileName);
+}
+
+void GRXMLDoc::sortLabels()
+{
+    // We need to re-index in order to put the labels in correct order:
+    int index=0, origIndex;
+    std::string label;
+    std::string slotRuleName;
+    std::string scope; // For rules
+    std::vector <std::string> orderedList;
+    if ( m_LabelList.getFirst( &origIndex, &label ) ) {
+        // Look up scope using original index
+        orderedList.push_back( label );
+        while (m_LabelList.getNext( &origIndex, &label ) ) {
+            orderedList.push_back( label );
+        }
+    }
+    std::sort(orderedList.begin(), orderedList.end() );
+    m_SortedLabelList.clear();
+    index=0;
+    for (std::vector<std::string>::const_iterator citer = orderedList.begin();
+     citer != orderedList.end(); ++citer) {
+        label = *citer;
+        m_LabelList.getIndex( label, &origIndex );
+        m_SortedLabelList.insert( index, label );
+        index++;
+        // std::cout <<"Sorted: " << index <<" " << label <<std::endl;
+    }
+    return;
+}
+
+bool GRXMLDoc::findSortedLabel(int i, std::string &s )
+{
+    if (m_SortedLabelList.isEmpty() ) {
+        sortLabels(); // Create the sorted label list.
+    }
+    return m_SortedLabelList.getValue( i, &s );
+}
+
+bool GRXMLDoc::findSortedLabelIndex( int i, int &sortedIndex )
+{
+    std::string s;
+    if (m_SortedLabelList.isEmpty() ) {
+        sortLabels(); // Create the sorted label list.
+    }
+    if ( m_LabelList.getValue( i, &s ) ) {
+        if ( m_SortedLabelList.getIndex(s, &sortedIndex )) {
+            return true;
+        }
+    }
+    return false;
+}
+
+void GRXMLDoc::addOLabelToOList( std::string &s)
+{
+    m_OutputPtxtLabels.insert( s, 0);
+}
+
+bool GRXMLDoc::WriteOLabels(const std::string& fileName)
+{
+  HashMap<int,std::string> invMap;
+  int count = 0;
+  int max_script_label = 0;
+  int scriptID = 0;
+  std::map<std::string, int>::iterator iter;
+  bool bFound;
+  int tmp;
+
+  std::string strIndex = "eps";
+  bFound = m_OutputPtxtLabels.getValue(strIndex, &tmp);
+  if(bFound) 
+    m_OutputPtxtLabels.remove(strIndex);
+  m_OutputPtxtLabels.insert(strIndex, count); 
+  invMap.insert( count, strIndex);
+  count++;
+
+  strIndex = "{";
+  bFound = m_OutputPtxtLabels.getValue(strIndex, &tmp);
+  if(bFound) 
+    m_OutputPtxtLabels.remove(strIndex);
+  m_OutputPtxtLabels.insert(strIndex, count); 
+  invMap.insert( count, strIndex);
+  count++;
+
+  iter = m_OutputPtxtLabels.begin(); 
+  for( ; iter!=m_OutputPtxtLabels.end(); iter++) {
+    const char* label = iter->first.c_str();
+    if( !strncmp(label,SCRIPT_LABEL_PREFIX, SCRIPT_LABEL_PREFIX_LEN)
+	&& strspn(label+SCRIPT_LABEL_PREFIX_LEN,"0123456789")==strlen(label+SCRIPT_LABEL_PREFIX_LEN) ) {
+      scriptID = atoi(label+SCRIPT_LABEL_PREFIX_LEN);
+      if(max_script_label < scriptID)
+	max_script_label = scriptID;
+    }/* else if( !strncmp(label,SCRIPT_LABEL_PREFIX, SCRIPT_LABEL_PREFIX_LEN)) {
+      invMap.insert(count, iter->first);
+      iter->second = count;
+      count++;
+      }*/
+    else if(!invMap.getIndex((iter->first), &tmp)){
+      invMap.insert(count, iter->first);
+      iter->second = count;
+      count++;
+    }
+  }
+
+  cout << "found max_script_label " << max_script_label << endl;
+  for(int j=0; j<=max_script_label; j++) {
+    std::stringstream ss;
+    ss << SCRIPT_LABEL_PREFIX << j;
+    if(!invMap.getIndex( ss.str(), &tmp)) {
+      invMap.insert( count++, ss.str());
+    }
+  }
+
+  std::ofstream outfile(fileName.c_str());
+  std::string outscript;
+  if(!outfile) {
+    FATAL_ERROR( "Error: opening the omap file for output", 1);
+    WARNING( "Error: opening the omap file for output");
+    return 1;
+  } 
+  for(int i=0; i<count; i++) {
+    outscript = "";
+    invMap.getValue(i,&outscript);
+    if(outscript.length() == 0) {
+      cout << "error: internal error while making .omap " << i << endl;
+      FATAL_ERROR("error",1);
+    }
+    outfile << outscript.c_str() << " " << i << std::endl;
+  }
+  outfile.close();
+  return 0;
+}
diff --git a/tools/grxmlcompile/grxmldoc.h b/tools/grxmlcompile/grxmldoc.h
new file mode 100644
index 0000000..7278cea
--- /dev/null
+++ b/tools/grxmlcompile/grxmldoc.h
@@ -0,0 +1,180 @@
+/*---------------------------------------------------------------------------*
+ *  grxmldoc.h  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#ifndef __grxmldoc_h__
+#define  __grxmldoc_h__
+
+// #define MEMTRACE // Uses mtrace() to detect leaks
+
+#include "hashmap.h"
+#include "tinyxml.h"
+#include <stack>
+#include "vocab.h"
+
+#define SCRIPT_LABEL_PREFIX "_"
+#define SCRIPT_LABEL_PREFIX_LEN 1
+class Node;
+template <typename T1, typename T2> class HashMap;
+class Graph;
+class SubGraph;
+
+class GRXMLDoc
+{
+public:
+    typedef TiXmlNode XMLNode;
+    // Some convenience items for string comparison
+    typedef enum KeywordValues {NodeTypeGrammar, NodeTypeRule, NodeTypeRuleReference, NodeTypeOneOf, NodeTypeItem, NodeTypeTag, NodeTypeCount, NodeTypeMeta, NodeTypeBadValue};
+    typedef  std::map<std::string, KeywordValues> KEYWDPAIR;
+
+    typedef struct {
+	bool hasRuleRef;
+	std::string RuleRefName;
+	int tagID;
+    } ItemData;
+
+    GRXMLDoc();
+    ~GRXMLDoc();
+
+    // Optional use of voc and model files
+   // TODO: Rearrange access to voc and models
+#ifndef OPENFSTSDK
+    void initialize_SR(char* parfile);
+    void shutdown_SR();
+    Vocabulary *getVocabulary() { return m_pVocab;}
+    AcousticModel* getModel() { return m_pModel;}
+    int addPhonemeToList( std::string const& s );
+    bool findPhoneme( int i, std::string & s );
+    bool getHMMSequence (int centre, int left, int right, std::vector<int> & modelSequence);
+#endif
+
+    //  Lookup functions
+    bool findSubGraph(std::string & s, SubGraph *&p_SubGraph);
+    bool findRule(int i, std::string &s );
+    bool findTag(int i, std::string &s );
+    bool findLabel(int i, std::string &s );
+    bool findSubGraphIndex( SubGraph *p_SubGraph, std::string &s );
+    bool findRuleIndex( std::string s, int &i );
+    bool findTagIndex( std::string s, int &i );
+    bool findLabelIndex( std::string s, int &i );
+    bool findSortedLabel(int i, std::string &s );
+    bool findSortedLabelIndex( int i, int &sortedIndex );
+    bool findMeta(const std::string & sn, std::string &s);
+    bool setMeta(const std::string & sn, const std::string &s);
+    void sortLabels();
+    void addOLabelToOList( std::string & s);
+    bool WriteOLabels(const std::string& fileName);
+
+    // Take DOM object and create word graph. Creates SubGraph, rule, tag and label lists.
+    bool parseGrammar( XMLNode &node, std::string & xMLFileName );
+
+    // Generate output files
+    void writeMapFile( std::string & fileName );
+    void writeScriptFile( std::string & fileName );
+    void writeGraphFiles( std::string & fileName, bool bDoWriteRecogGraphs );
+    void writeParamsFile( std::string & fileName );
+    void printLists();
+    void printSubgraphs();
+
+protected:
+    void initializeLists();
+    bool parseNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level );
+    bool beginNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level );
+    bool endNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level );
+    bool beginParseGrammarNode( XMLNode &node );
+    bool endParseGrammarNode( XMLNode &node );
+    bool beginParseMetaNode( XMLNode &node );
+    bool endParseMetaNode( XMLNode &node );
+    bool beginParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph);
+    bool endParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph );
+    bool beginItem( XMLNode &node, SubGraph *&p_SubGraph );
+    bool endItem( XMLNode &node, SubGraph *&p_SubGraph );
+    bool processCDATA( XMLNode &node, SubGraph *&p_SubGraph );
+    bool beginOneOf( XMLNode &node, SubGraph *&p_SubGraph );
+    bool endOneOf( XMLNode &node, SubGraph *&p_SubGraph );
+    bool beginRuleRef( XMLNode &grmNode, SubGraph *&p_SubGraph );
+    bool endRuleRef(XMLNode &node, SubGraph *&p_SubGraph );
+    bool fixRuleRef( SubGraph *&p_SubGraph );
+    bool getRuleRefName(XMLNode &node, std::string &ruleName);
+    bool extendAltExpression( XMLNode &node, int level );
+    bool beginTag( XMLNode &node, SubGraph *&p_SubGraph );
+    bool endTag( XMLNode &node, SubGraph *&p_SubGraph );
+    bool beginCount( XMLNode &node, SubGraph *&p_SubGraph );
+    bool endCount( XMLNode &node, SubGraph *&p_SubGraph );
+    void printNode( XMLNode &node, int level );
+    bool addRuleToList(std::string const& ruleName, SubGraph *&p_SubGraph);
+
+    bool deleteRules();
+    bool addTagToList( std::string const& s );
+    bool addLabelToList( std::string const& s );
+    void printSubgraph( SubGraph &p_SubGraph );
+
+private:
+
+    Graph *m_pGraph;	// The top-level container object for the word graph;
+    KEYWDPAIR  m_NodeKeyWords;
+    // The unique attributes of the GRML doc
+    std::string m_XMLMode;
+    std::string m_XMLLanguage;
+    std::string m_RootRule;
+    std::string m_XMLTagFormat;
+    std::string m_XMLVersion;
+    std::string m_XMLBase;
+    std::string m_XMLFileName;
+
+    //  We store indices for all labels used in the word graph.
+    //  Store all these labels in the m_LabelList table, which is auto-indexed.
+    //  We need a list of the rule names so that we can distinguish them from other labels.
+    //  Store these rule names in the m_RuleList table with an index equal to the label index for the rule.
+    //  Thus, when we need the index of a rule, we go straight to m_RuleList
+    //	and when we need the label of a rule or any other item we use m_LabelList.
+
+    HashMap<std::string,SubGraph*> m_SubgraphList;
+    HashMap<int,std::string> m_TagList;	// <item tag = ...
+    HashMap<int,std::string> m_LabelList; // Stores all network label IDs, including rule names
+    HashMap<int,std::string> m_SortedLabelList; // Used to sort the labels fo
+    HashMap<int, std::string> m_PhonemeList;    // Stores triphones
+    HashMap<std::string,int> m_RuleList; // Stores rule name and index used in the LabelList. Use to distinguish which are rules.
+    HashMap<int, std::string> m_RuleScope;
+    HashMap<int, std::string> m_SlotList;
+    HashMap<std::string, std::string> m_MetaKeyValPairs; //Store word-penalty value
+    HashMap<std::string, int> m_OutputPtxtLabels;
+
+    std::stack<ItemData*> m_ItemVarsStack;
+    std::stack<std::string> m_RuleListStack;
+    int m_RuleAutoIndex;
+    int m_TagAutoIndex;
+    int m_LabelAutoIndex;
+    int m_PhonemeAutoIndex;
+    int m_ExpandedRulesAutoIndex;
+    int m_TagID; // Use to stash tag index for items.
+    // Note the subgraph list does not have an auto-index as it is string-indexed.
+    // All these lists also have an internal numeric index which can be used.
+
+#ifndef OPENFSTSDK
+    Vocabulary *m_pVocab;
+    AcousticModel *m_pModel;
+#endif
+
+};
+
+#endif // __grxmldoc_h__
+
+
+
diff --git a/tools/grxmlcompile/hashimpl.cpp b/tools/grxmlcompile/hashimpl.cpp
new file mode 100644
index 0000000..b17b6a2
--- /dev/null
+++ b/tools/grxmlcompile/hashimpl.cpp
@@ -0,0 +1,22 @@
+/* FILE:
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "hashmap.cpp" // The template definition file as a header file
+// This file forces the instantiation of the templates. Do not compile the above file.
diff --git a/tools/grxmlcompile/hashmap.cpp b/tools/grxmlcompile/hashmap.cpp
new file mode 100644
index 0000000..82f9811
--- /dev/null
+++ b/tools/grxmlcompile/hashmap.cpp
@@ -0,0 +1,188 @@
+/* FILE:		hashmap.cpp
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Helper template for compiling FST data structure 
+ *                      from a GRXML file.
+ *			A doubly indexed map class using two maps.
+ *			Indices are a user-defined  type and an int index. 
+ *                      Both are unique indices.
+ *			The int index has automatic non-reusable numbering.
+ *
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <map>
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "hashmap.h"
+#include "sub_grph.h"
+using namespace std;
+
+
+template <typename T1, typename T2>
+HashMap<T1,T2>::HashMap():
+m_NextAutoIndex(0)
+{
+}
+
+template <typename T1, typename T2>
+void HashMap<T1,T2>::setName(std::string s)
+{
+  m_Name = s;
+}
+
+template <typename T1, typename T2>
+bool HashMap<T1,T2>::insert( T1 const & index, T2 const & value)
+{
+
+  pair<typename std::map<T1,T2>::iterator,bool> result = m_Map.insert( make_pair(index, value) );
+    if (!result.second) {
+	return false;
+    }
+
+    return true;
+}
+
+template <typename T1, typename T2>
+bool HashMap<T1,T2>::remove( T1 const & index )
+{
+  m_Map.erase( index );
+  return true;
+}
+
+template <typename T1, typename T2>
+bool HashMap<T1,T2>::isEmpty()
+{
+    return m_Map.empty();
+}
+
+
+template <typename T1, typename T2>
+bool HashMap<T1,T2>::clear()
+{
+    m_Map.clear();
+    return true;
+}
+
+
+
+template <typename T1, typename T2>
+bool HashMap<T1,T2>::getIndex( T2 const & value, T1 *index )
+{
+   //do something with all elements having a certain value
+   typename std::map<T1,T2>::iterator pos;
+   for (pos = m_Map.begin(); pos != m_Map.end(); ++pos) {
+      if (pos->second == value) {
+	  *index = (pos->first);
+	  return true;
+      }
+   }
+   return false;
+}
+
+template <typename T1, typename T2>
+bool HashMap<T1,T2>::getFirst( T1 *index, T2 *value )
+{
+    if (m_Map.empty() ) {
+	return false;
+    }
+    //do something with all elements having a certain value
+    typename std::map<T1,T2>::iterator pos;
+    m_pPos= m_Map.begin();
+    *index = m_pPos->first;
+    *value=  m_pPos->second;
+    return true;
+}
+
+template <typename T1, typename T2>
+bool HashMap<T1,T2>::getNext( T1 *index, T2 *value )
+{
+    if ( m_Map.empty() ) {
+	return false;
+    }
+    if ( ++m_pPos == m_Map.end() )  {
+	return false;
+    }
+    *index = m_pPos->first;
+    *value=  m_pPos->second;
+    return true;
+}
+
+template <typename T1, typename T2>
+bool HashMap<T1,T2>::getValue(T1 const & index, T2 *value)
+{
+    typename std::map<T1,T2>::iterator pos;
+    pos = m_Map.find(index);
+    if (m_Map.end() != pos) {
+	*value = pos->second;
+	return true;
+    }
+    return false;
+}
+
+template <typename T1, typename T2>
+int HashMap<T1,T2>::size()
+{
+    return m_Map.size();
+}
+
+template <typename T1, typename T2>
+void HashMap<T1,T2>::print()
+{
+    typename std::map<T1,T2>::iterator pos;
+    cout << "======= '" <<  m_Name <<"' =======" << std::endl;
+    for (pos = m_Map.begin(); pos != m_Map.end(); ++pos) {
+	cout << pos->first <<" : " << pos->second << std::endl;
+   }
+}
+
+template <typename T1, typename T2>
+void HashMap<T1,T2>::writeFile( std::string fileName )
+{
+    ofstream outfile;
+    outfile.open ( fileName.c_str() );
+    typename std::map<T1,T2>::iterator pos;
+    for (pos = m_Map.begin(); pos != m_Map.end(); ++pos) {
+	outfile << pos->first << " " << pos->second << std::endl;
+    }
+    outfile.close();
+}
+
+template <typename T1, typename T2>
+typename std::map<T1,T2>::iterator HashMap<T1,T2>::begin()
+{
+  m_pPos = m_Map.begin();
+  return m_pPos;
+}
+
+template <typename T1, typename T2>
+typename std::map<T1,T2>::iterator HashMap<T1,T2>::end()
+{
+  m_pPos = m_Map.end();
+  return m_pPos;
+}
+
+// Declare known data types so that we don't need to put this in hashmap.h.
+// If user needs others the put the declaration in a separate user file.
+template class HashMap<int,string>;
+template class HashMap<int, int>;
+template class HashMap<string, SubGraph* >;
+template class HashMap<std::string,int>;
+template class HashMap<std::string, HashMap<std::string, int>*>;
+template class HashMap<std::string, std::string>;
diff --git a/tools/grxmlcompile/hashmap.h b/tools/grxmlcompile/hashmap.h
new file mode 100644
index 0000000..8600bff
--- /dev/null
+++ b/tools/grxmlcompile/hashmap.h
@@ -0,0 +1,61 @@
+/* FILE:		hashmap.h
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __hashmap_h__
+#define __hashmap_h__
+
+#include <iostream>
+#include <map>
+#include <vector>
+
+
+template <typename T1, typename T2>
+class HashMap
+{
+public:
+    //typedef T1	MapValue;
+    HashMap();
+    void setName(std::string s);
+    bool insert( T1 const & index, T2 const & value);
+    bool remove( T1 const & index);
+    bool isEmpty();
+    bool clear();
+    bool getFirst( T1 *index, T2 *value );
+    bool getNext( T1 *index, T2 *value );
+    bool getValue( T1 const & index, T2 *value);	//returns value
+    bool getIndex( T2 const & value, T1 *index );	//returns index
+    void print();
+    void writeFile( std::string fileName );
+
+    typename std::map<T1,T2>::iterator begin();
+    typename std::map<T1,T2>::iterator end();
+
+    int size();
+
+private:
+    std::string m_Name;
+    std::map<T1, T2> m_Map;
+    typename std::map<T1,T2>::iterator m_pPos;
+
+    unsigned int m_NextAutoIndex;
+};
+
+
+#endif // __hashmap_h__
diff --git a/tools/grxmlcompile/netw_arc.h b/tools/grxmlcompile/netw_arc.h
new file mode 100644
index 0000000..ed591de
--- /dev/null
+++ b/tools/grxmlcompile/netw_arc.h
@@ -0,0 +1,340 @@
+/* FILE:        netw_arc.h
+ *  DATE MODIFIED:    31-Aug-07
+ *  DESCRIPTION:    Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __netw_arc_h__
+#define __netw_arc_h__
+
+#undef assert
+#define assert(X)
+
+
+class GRXMLDoc;
+class NUANArc
+{
+public:
+    friend class SubGraph;
+    /* Constructors */
+
+    /* Create arc with only input and output labels
+    */
+    NUANArc (int iLabel, int oLabel)
+    {
+        inputLabel= iLabel;
+        outputLabel= oLabel;
+        centre= -1;
+        left= -1;
+        right= -1;
+        return;
+    };
+
+    /* Create arc with full data
+    */
+    NUANArc (int iLabel, int oLabel, int from, int to)
+    {
+        inputLabel= iLabel;
+        outputLabel= oLabel;
+        fromId= from;
+        toId= to;
+        left= -1;
+        right= -1;
+        centre= -1;
+        return;
+    };
+
+    /* Copy an arc
+    */
+    NUANArc (NUANArc *arcsrc)
+    {
+        inputLabel= arcsrc->inputLabel;
+        outputLabel= arcsrc->outputLabel;
+        fromId= arcsrc->fromId;
+        toId= arcsrc->toId;
+        left= arcsrc->left;
+        right= arcsrc->right;
+        centre= arcsrc->centre;
+        return;
+    };
+
+    /* Create arc based on another arc
+    */
+    NUANArc (NUANArc *arcsrc, int offset, int startId, int newStartId, int endId, int newEndId)
+    {
+        inputLabel= arcsrc->inputLabel;
+        outputLabel= arcsrc->outputLabel;
+        if (arcsrc->fromId == startId && newStartId >= 0)
+            fromId= newStartId;
+        else
+            fromId= arcsrc->fromId + offset;
+        if (arcsrc->toId == endId && newEndId >= 0)
+            toId= newEndId;
+        else
+            toId= arcsrc->toId + offset;
+        left= -1;
+        right= -1;
+        centre= -1;
+        return;
+    };
+
+    /*  Assign non-terminal vertices
+    */
+    void AssignFromId (int Id)
+    {
+        fromId= Id;
+    };
+
+    /*  Assign non-terminal vertices
+    */
+    void AssignToId (int Id)
+    {
+        toId= Id;
+    };
+
+    void AssignInput (int Id)
+    {
+        inputLabel= Id;
+    };
+
+    void AssignOutput (int Id)
+    {
+        outputLabel= Id;
+    };
+
+    /*  Assign centre context
+    */
+    void AssignCentre (int centreData) { centre= centreData; };
+
+    /*  Assign left context
+    */
+    void AssignLeft (int leftData) { left= leftData; };
+
+    /*  Assign right context
+    */
+    void AssignRight (int rightData) { right= rightData; };
+
+    /* Access functions */
+    /* Get input label
+    */
+    int GetInput() { return inputLabel; };
+
+    /* Get output label
+    */
+    int GetOutput()  { return outputLabel; };
+
+    /* Get from Vertex
+    */
+    int GetFromId()  { return fromId; };
+
+    /* Get to Vertex
+    */
+    int GetToId()  { return toId; };
+
+    /* Get centre context
+    */
+    int GetCentre()  { return centre; };
+
+    /* Get left context
+    */
+    int GetLeft()  { return left; };
+
+    /* Get right context
+    */
+    int GetRight()  { return right; };
+
+    /*  Transduction
+    */
+    int Transduce (int iLabel)
+    {
+        if (inputLabel == iLabel)
+            return outputLabel;
+        else
+            return -1;
+    };
+
+    /*  Similarity checks
+    */
+    int Compare (NUANArc *test)
+    {
+        if (fromId > test->fromId)
+            return 1;
+        else if (fromId < test->fromId)
+            return -1;
+        else if (toId > test->toId)
+            return 1;
+        else if (toId < test->toId)
+            return -1;
+        else if (inputLabel > test->inputLabel)
+            return 1;
+        else if (inputLabel < test->inputLabel)
+            return -1;
+        else if (outputLabel > test->outputLabel)
+            return 1;
+        else if (outputLabel < test->outputLabel)
+            return -1;
+        else
+            return 0;
+        }
+
+    int CompareSymbol (NUANArc *test)
+    {
+        if (inputLabel > test->inputLabel)
+            return 1;
+        else if (inputLabel < test->inputLabel)
+            return -1;
+        else if (outputLabel > test->outputLabel)
+            return 1;
+        else if (outputLabel < test->outputLabel)
+            return -1;
+        else
+            return 0;
+        }
+
+    int CompareReverse (NUANArc *test)
+    {
+        if (toId > test->toId)
+            return 1;
+        else if (toId < test->toId)
+            return -1;
+        else if (fromId > test->fromId)
+            return 1;
+        else if (fromId < test->fromId)
+            return -1;
+        else if (inputLabel > test->inputLabel)
+            return 1;
+        else if (inputLabel < test->inputLabel)
+            return -1;
+        else if (outputLabel > test->outputLabel)
+            return 1;
+        else if (outputLabel < test->outputLabel)
+            return -1;
+        else
+            return 0;
+    }
+
+    int CompareForMin (NUANArc *test)
+    {
+        if (fromId > test->fromId)
+            return 1;
+        else if (fromId < test->fromId)
+            return -1;
+        else if (inputLabel > test->inputLabel)
+            return 1;
+        else if (inputLabel < test->inputLabel)
+            return -1;
+        else if (outputLabel > test->outputLabel)
+            return 1;
+        else if (outputLabel < test->outputLabel)
+            return -1;
+        else if (toId > test->toId)
+            return 1;
+        else if (toId < test->toId)
+            return -1;
+        else
+            return 0;
+    }
+
+    int CompareWithContext (NUANArc *test)
+    {
+        if (fromId > test->fromId)
+            return 1;
+        else if (fromId < test->fromId)
+            return -1;
+        else if (toId > test->toId)
+            return 1;
+        else if (toId < test->toId)
+            return -1;
+        else if (inputLabel > test->inputLabel)
+            return 1;
+        else if (inputLabel < test->inputLabel)
+            return -1;
+        else if (outputLabel > test->outputLabel)
+            return 1;
+        else if (outputLabel < test->outputLabel)
+            return -1;
+        else if (left > test->left)
+            return 1;
+        else if (left < test->left)
+            return -1;
+        else if (right > test->right)
+            return 1;
+        else if (right < test->right)
+            return -1;
+        else
+            return 0;
+    }
+
+    bool IsSame (NUANArc *test)
+    {
+        if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && fromId == test->fromId && toId == test->toId)
+            return true;
+        else
+            return false;
+    };
+
+    bool HasSameLabels (NUANArc *test)
+    {
+        if (inputLabel == test->inputLabel && outputLabel == test->outputLabel)
+            return true;
+        else
+            return false;
+    };
+
+    bool HasSameLabelsAndTo (NUANArc *test)
+    {
+        if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && toId == test->toId)
+            return true;
+        else
+            return false;
+    };
+
+    bool HasSameLabelsAndFrom (NUANArc *test)
+    {
+        if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && fromId == test->fromId)
+            return true;
+        else
+            return false;
+    };
+
+    /* Print
+    */
+    void Print()
+    {
+        printf ("%d %d %d %d (%d)\n", fromId, toId, inputLabel, outputLabel, centre);
+        return;
+    };
+    void PrintText()
+    {
+        printf ("%d %d %c %d (%d)\n", fromId, toId, inputLabel, outputLabel, centre);
+        return;
+    };
+
+    void Dump (GRXMLDoc &p_Doc );
+
+
+protected:
+    int     inputLabel;     /*  input label */
+    int     outputLabel;    /*  output label */
+    int     fromId;         /*  from node */
+    int     toId;           /*  to node */
+    int     centre;         /*  left context  */
+    int     left;           /*  left context  */
+    int     right;          /*  right context */
+};
+
+#endif // __netw_arc_h__
diff --git a/tools/grxmlcompile/netw_dump.cpp b/tools/grxmlcompile/netw_dump.cpp
new file mode 100644
index 0000000..4d6462c
--- /dev/null
+++ b/tools/grxmlcompile/netw_dump.cpp
@@ -0,0 +1,374 @@
+/* FILE:		netw_dump.cpp
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <fstream>
+#include <iostream>
+#include <sstream>
+
+#include <string>
+
+#include "netw_arc.h"
+#include "sub_grph.h"
+
+#include "grxmldoc.h"
+
+void SubGraph::RemapForSortedOutput ( GRXMLDoc &p_Doc )
+{
+    int origIndex, sortedIndex;
+
+    for (int ii= 0; ii < numArc; ii++) {
+	origIndex= arc[ii]->GetInput();
+	if (origIndex >= 0 && p_Doc.findSortedLabelIndex (origIndex, sortedIndex ))
+	    arc[ii]->AssignInput (sortedIndex);
+    }
+    return;
+}
+
+void SubGraph::WriteForwardGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
+{
+    // Creates file of forward graph  - the {name}.G.txt file
+    int loc;
+    std::string inLabel;
+    std::ofstream outfile;
+    std::string label;
+    std::string separator = "\t";
+    std::string Eps = "eps";
+
+    RemapForSortedOutput (p_Doc);
+    SortLanguageForMin ();
+    p_Doc.sortLabels();
+    outfile.open ( fileName.c_str() );
+    for (int ii= 0; ii < numArc; ii++) {
+	inLabel="";
+        loc = forwardList[ii];
+	switch ( arc[loc]->inputLabel ) {
+	    case TERMINAL_LABEL:    //  Terminal transition
+		outfile << arc[loc]->fromId << std::endl;
+		break;
+	    case NONE_LABEL:        //  Null transition
+		outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << std::endl;
+		break;
+	    case TAG_LABEL:         //  Tag transition
+	    case WB_LABEL:          //  Word boundary transition
+	    case BEGINSCOPE_LABEL:  //  Start of scope
+	    case ENDSCOPE_LABEL:    //  End of scope
+	    case BEGINRULE_LABEL:   //  Start of rule
+	    case ENDRULE_LABEL:     //  End of rule
+	    case DISCARD_LABEL:     //  Discard (internal)
+		break;
+	    default:
+		{
+		    // if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
+		    if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) {
+			std::stringstream ss;
+			ss << arc[loc]->inputLabel;
+			inLabel = ss.str();
+		    }
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << inLabel.c_str() << std::endl;
+		}
+		break;
+	} // switch
+
+    }
+    outfile.close();
+
+    SortLanguage ();
+    return;
+}
+
+
+void SubGraph::WriteForwardGraphWithSemantic ( std::string & fileName, GRXMLDoc &p_Doc )
+{
+    int loc;
+    std::string inLabel, outLabel;
+    std::string tag;
+    std::string Eps = "eps";
+    std::string OpenBrace = "{";
+    std::string CloseBrace = "}";
+    std::string Separator ="\t";
+
+    std::ofstream outfile;
+    std::string label;
+    std::string separator = "\t";
+    outfile.open ( fileName.c_str() );
+
+    RemapForSortedOutput (p_Doc);
+    SortLanguageForMin ();
+    p_Doc.sortLabels();
+    for ( int ii= 0; ii < numArc; ii++ ) {
+        loc= forwardList[ii];
+	inLabel = "";
+	switch ( arc[loc]->inputLabel ) {
+	    case BEGINRULE_LABEL:   //  Start of rule
+		inLabel = Eps;
+		outLabel = OpenBrace;
+		break;
+	    case ENDRULE_LABEL:     //  End of rule
+		{
+		    inLabel = Eps;
+		    if (!p_Doc.findRule( arc[loc]->outputLabel, outLabel ) ) {
+			std::stringstream ss;
+			ss << arc[loc]->outputLabel;
+			outLabel = "(" + ss.str() + ")";
+		    }
+		    outLabel = outLabel + CloseBrace;
+		}
+		break;
+	    case NONE_LABEL:        //  Null transition
+		inLabel = Eps;
+                outLabel= Eps;
+                break;
+	    case TAG_LABEL:         //  Tag transition
+		inLabel = Eps;
+                {
+		    std::stringstream ss;
+		    ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel;
+		    outLabel = ss.str();
+                }
+                break;
+	    case TERMINAL_LABEL:    //  Terminal transition
+		outLabel = "";
+		break;
+	    case WB_LABEL:          //  Word boundary transition
+	    case BEGINSCOPE_LABEL:  //  Start of scope
+	    case ENDSCOPE_LABEL:    //  End of scope
+	    case DISCARD_LABEL:     //  Discard (internal)
+		break;
+	    default:
+                //  Input label
+		// if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
+		if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) {
+		    inLabel = arc[loc]->inputLabel;
+		}
+
+                //  Output label
+                if (arc[loc]->outputLabel == -1)
+                    outLabel= Eps;
+                else {
+		    std::stringstream ss;
+		    ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel;
+		    outLabel = ss.str();
+                }
+		break;
+	}
+	if ( outLabel.empty() )
+	    outfile << arc[loc]->fromId << std::endl;
+	else {
+	    outfile << arc[loc]->fromId << Separator << arc[loc]->toId  << Separator << inLabel.c_str() << Separator << outLabel.c_str()  << std::endl;
+	    p_Doc.addOLabelToOList( outLabel);
+	}
+    }
+    outfile.close();
+
+    return;
+}
+
+void SubGraph::WriteHMMGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
+{
+    // Creates file of forward graph  - the {name}.G.txt file
+    int loc;
+    std::string inLabel;
+    std::string outLabel;
+    std::string phLabel;
+    std::string metaname;
+    std::string wtw;
+    std::ofstream outfile;
+    std::string label;
+    std::string separator = "\t";
+    std::string Eps = "eps";
+    std::string Pau = "-pau-";
+    std::string Pau2 = "-pau2-";
+    bool bRes;
+
+    metaname = "word_penalty";
+    bRes = p_Doc.findMeta(metaname, wtw);
+
+    outfile.open ( fileName.c_str() );
+    for (int ii= 0; ii < numArc; ii++) {
+	inLabel="";
+        loc = forwardList[ii];
+	switch ( arc[loc]->inputLabel ) {
+	    case TERMINAL_LABEL:    //  Terminal transition
+		outfile << arc[loc]->fromId << std::endl;
+		break;
+	    case NONE_LABEL:        //  Null transition
+		if (arc[loc]->outputLabel >= 0) {
+		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
+			std::stringstream ss;
+			ss << arc[loc]->outputLabel;
+			outLabel = ss.str();
+		    }
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << outLabel.c_str() << std::endl;
+		}
+		else
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << Eps << std::endl;
+		break;
+	    case WB_LABEL:          //  Word boundary transition
+		if (arc[loc]->outputLabel >= 0) {
+		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
+			std::stringstream ss;
+			ss << arc[loc]->outputLabel;
+			outLabel = ss.str();
+		    }
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << outLabel.c_str() << std::endl;
+		}
+		else
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << Eps << std::endl;
+		break;
+	    case TAG_LABEL:         //  Tag transition
+	    case BEGINSCOPE_LABEL:  //  Start of scope
+	    case ENDSCOPE_LABEL:    //  End of scope
+	    case BEGINRULE_LABEL:   //  Start of rule
+	    case ENDRULE_LABEL:     //  End of rule
+	    case DISCARD_LABEL:     //  Discard (internal)
+		break;
+	    default:
+                 {
+		    if (arc[loc]->outputLabel >= 0) {
+		        if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
+			    std::stringstream ss;
+			    ss << arc[loc]->outputLabel;
+			    outLabel = ss.str();
+		        }
+		    }
+		    else if (arc[loc]->outputLabel == INITIAL_LABEL)
+			outLabel= Pau;
+		    else if (arc[loc]->outputLabel == FINAL_LABEL)
+			outLabel= Pau2;
+		    else
+		        outLabel= Eps;
+                }
+		break;
+	} // switch
+
+    }
+    outfile.close();
+    return;
+}
+
+void SubGraph::WritePhonemeGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
+{
+    // Creates file of forward graph  - the {name}.G.txt file
+    int loc;
+    std::string inLabel;
+    std::string outLabel;
+    std::ofstream outfile;
+    std::string label;
+    std::string separator = "\t";
+    std::string Eps = "eps";
+
+    outfile.open ( fileName.c_str() );
+    for (int ii= 0; ii < numArc; ii++) {
+	inLabel="";
+        loc = forwardList[ii];
+	switch ( arc[loc]->inputLabel ) {
+	    case TERMINAL_LABEL:    //  Terminal transition
+		outfile << arc[loc]->fromId << std::endl;
+		break;
+	    case NONE_LABEL:        //  Null transition
+		if (arc[loc]->outputLabel >= 0) {
+		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
+			std::stringstream ss;
+			ss << arc[loc]->outputLabel;
+			outLabel = ss.str();
+		    }
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << outLabel.c_str() << std::endl;
+		}
+		else
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << Eps << std::endl;
+		break;
+	    case WB_LABEL:          //  Word boundary transition
+		if (arc[loc]->outputLabel >= 0) {
+		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
+			std::stringstream ss;
+			ss << arc[loc]->outputLabel;
+			outLabel = ss.str();
+		    }
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << outLabel.c_str() << std::endl;
+		}
+		else
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << Eps << std::endl;
+		break;
+	    case TAG_LABEL:         //  Tag transition
+	    case BEGINSCOPE_LABEL:  //  Start of scope
+	    case ENDSCOPE_LABEL:    //  End of scope
+	    case BEGINRULE_LABEL:   //  Start of rule
+	    case ENDRULE_LABEL:     //  End of rule
+	    case DISCARD_LABEL:     //  Discard (internal)
+		break;
+	    default:
+	        if ( arc[loc]->inputLabel >= 0) {
+		  
+		}
+                else {
+		    //  Note negative index
+		    if (!p_Doc.findLabel( -arc[loc]->inputLabel, inLabel ) ) {
+			std::stringstream ss;
+			ss << arc[loc]->inputLabel;
+			inLabel = ss.str();
+		    }
+		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << inLabel.c_str() << separator << Eps << std::endl;
+                }
+		break;
+	} // switch
+
+    }
+        outfile.close();
+
+    return;
+}
+
+
+void SubGraph::PrintWithLabels( GRXMLDoc &p_Doc )
+{
+    int loc;
+    std::string inLabel, outLabel;
+    std::string label;
+
+    printf ("Graph %s (%d %d)\n", title, startId, lastId);
+    for (int ii= 0; ii < numArc; ii++) {
+        loc= forwardList[ii];
+	if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
+	    inLabel = arc[loc]->inputLabel;
+	    //std::stringstream  ss;
+	    //ss << arc[loc]->inputLabel;
+	    //inLabel = ss.str();
+	}
+	if (!p_Doc.findTag( arc[loc]->outputLabel, outLabel ) ) {
+	    outLabel = arc[loc]->outputLabel;
+	    //std::stringstream  ss;
+	    //ss << arc[loc]->outputLabel;
+	    //outLabel = ss.str();
+	}
+	std::cout << arc[loc]->fromId <<" " << arc[loc]->toId  << " "  << inLabel.c_str() <<" " << outLabel.c_str()  << std::endl;
+    }
+
+    return;
+}
+
+void NUANArc::Dump(GRXMLDoc &p_Doc )
+{
+    // I need  a handle to the grxml doc object in order to access labels
+    printf ("%d %d %d %d\n", fromId, toId, inputLabel, outputLabel);
+    return;
+}
+
+
+
diff --git a/tools/grxmlcompile/sub_base.cpp b/tools/grxmlcompile/sub_base.cpp
new file mode 100644
index 0000000..95368b5
--- /dev/null
+++ b/tools/grxmlcompile/sub_base.cpp
@@ -0,0 +1,346 @@
+/* FILE:		sub_base.cpp
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <string>
+#include <assert.h>
+
+#include "sub_grph.h"
+
+
+SubGraph::SubGraph (SubGraph *baseG)
+{
+    int count= strlen(baseG->title);
+    title= new char [count+1];
+    strcpy (title, baseG->title);
+    ruleId= baseG->ruleId;
+    arc= new NUANArc * [BLKSIZE];
+    popOp= 0;
+    numVertex= baseG->numVertex;
+    lastScope= SCOPE_ROOT;
+    startId= baseG->startId;
+    lastId= baseG->lastId;
+    endId= baseG->endId;
+    forwardList= 0;
+    backwardList= 0;
+    sortNum= 0;
+    numArc= 0;
+    CopyFastArcs (baseG, 0, baseG->numArc, 0, -1, -1, -1, -1);
+    UpdateVertexCount (0);
+
+    return;
+}
+
+int SubGraph::NewVertexId ()
+{
+    return (numVertex++);
+}
+
+void SubGraph::AllocateSpaceForArc ()
+{
+    if (numArc == 0) {
+        arc= new NUANArc * [BLKSIZE];
+    }
+    if (numArc%BLKSIZE == 0) {
+        NUANArc **new_arc= new NUANArc * [numArc+BLKSIZE];
+        for (int ii= 0; ii < numArc; ii++)
+            new_arc[ii]= arc[ii];
+        delete [] arc;
+        arc= new_arc;
+    }
+}
+
+NUANArc *SubGraph::CreateArc (int iLabel, int oLabel, int from, int to)
+{
+    assert (!(iLabel == NONE_LABEL && from == to));
+    AllocateSpaceForArc ();
+    NUANArc *arc_one= new NUANArc (iLabel, oLabel, from, to);
+    arc[numArc]= arc_one;
+    numArc++;
+    return arc_one;
+}
+
+NUANArc *SubGraph::InheritArc (NUANArc *arcBase, int id)
+{
+    AllocateSpaceForArc ();
+    NUANArc *arc_one= new NUANArc (arcBase);
+    arc_one->AssignFromId (id);
+    arc[numArc]= arc_one;
+    numArc++;
+    return arc_one;
+}
+
+NUANArc *SubGraph::InheritReverseArc (NUANArc *arcBase, int id)
+{
+    AllocateSpaceForArc ();
+    NUANArc *arc_one= new NUANArc (arcBase);
+    arc_one->AssignToId (id);
+    arc[numArc]= arc_one;
+    numArc++;
+    return arc_one;
+}
+
+NUANArc *SubGraph::InheritReverseArcWithTag (NUANArc *arcBase, int id, int tagId)
+{
+    AllocateSpaceForArc ();
+    NUANArc *arc_one= new NUANArc (arcBase);
+    arc_one->AssignToId (id);
+    arc_one->AssignOutput (tagId);
+    arc[numArc]= arc_one;
+    numArc++;
+    return arc_one;
+}
+
+NUANArc *SubGraph::CreateCopyWithOutput (NUANArc *arcBase, int id)
+{
+    AllocateSpaceForArc ();
+    NUANArc *arc_one= new NUANArc (arcBase);
+    arc_one->AssignOutput (id);
+    arc[numArc]= arc_one;
+    numArc++;
+    return arc_one;
+}
+
+void SubGraph::CopyFastArcs (SubGraph *subG, int startLoc, int endLoc, int offset, int headId, int newHeadId, int tailId, int newTailId)
+{
+    NUANArc *arc_one;
+
+    for (int ii= startLoc; ii < endLoc; ii++) {
+        if (numArc%BLKSIZE == 0) {
+            NUANArc **new_arc= new NUANArc * [numArc+BLKSIZE];
+            for (int ii= 0; ii < numArc; ii++)
+                new_arc[ii]= arc[ii];
+            delete [] arc;
+            arc= new_arc;
+        }
+        arc_one= new NUANArc (subG->arc[ii], offset, headId, newHeadId, tailId, newTailId);
+        arc[numArc]= arc_one;
+        numArc++;
+    }
+    return;
+}
+
+void SubGraph::Print ()
+{
+    int loc;
+
+    printf ("Graph %s (%d %d)\n", title, startId, lastId);
+    for (int ii= 0; ii < numArc; ii++) {
+        loc= forwardList[ii];
+        // loc= ii;
+        arc[loc]->Print();
+    }
+    return;
+}
+
+void SubGraph::PrintText ()
+{
+    int loc;
+
+    printf ("Graph %s (%d %d)\n", title, startId, lastId);
+    for (int ii= 0; ii < numArc; ii++) {
+        loc= forwardList[ii];
+        // loc= ii;
+        arc[loc]->PrintText();
+    }
+    return;
+}
+
+void SubGraph::ReverseDepthOnTerminal (int *depthMap)
+{
+    for (int ii= 0; ii < numArc; ii++)
+        if (arc[ii]->GetInput() == TERMINAL_LABEL)
+            ReverseDepthData (arc[ii]->GetFromId(), depthMap, 1);
+        return;
+}
+
+void SubGraph::ReverseDepthData (int startId, int *depthMap, int depth)
+{
+    int rix, nextId, nextInp;
+
+    if (depthMap[startId] > depth)
+        depthMap[startId]= depth;
+    else
+        return;
+    rix= FindToIndex (startId);
+    if (rix < 0)
+        return;
+    while (rix < numArc && arc[backwardList[rix]]->GetToId() == startId) {
+        nextId= arc[backwardList[rix]]->GetFromId();
+        nextInp= arc[backwardList[rix]]->GetInput();
+        if (nextId >= 0 && nextInp != DISCARD_LABEL)
+            ReverseDepthData (nextId, depthMap, depth+1);
+        rix++;
+    }
+    return;
+}
+
+void SubGraph::ForwardDepthData (int startId, int *depthMap, int depth)
+{
+    int rix, nextId, nextInp;
+
+    if (depthMap[startId] > depth)
+        depthMap[startId]= depth;
+    else
+        return;
+    rix= FindFromIndex (startId);
+    if (rix < 0)
+        return;
+    while (rix < numArc && arc[forwardList[rix]]->GetFromId() == startId) {
+        nextId= arc[forwardList[rix]]->GetToId();
+        nextInp= arc[forwardList[rix]]->GetInput();
+        if (nextId >= 0 && nextInp != DISCARD_LABEL)
+            ForwardDepthData (nextId, depthMap, depth+1);
+        rix++;
+    }
+    return;
+}
+
+void SubGraph::RemoveUnvisitedArcs (int initialId, int finalId)
+{
+    int ii;
+    int *forwardDepth= new int [numVertex];
+    int *reverseDepth= new int [numVertex];
+
+    for (ii= 0; ii < numVertex; ii++)
+        forwardDepth[ii]= reverseDepth[ii]= MAXNUM;     //  TODO: review
+    SortLanguage();
+    SortLanguageReverse();
+
+    ForwardDepthData (initialId, forwardDepth, 1);
+    if (finalId >= 0)
+        ReverseDepthData (finalId, reverseDepth, 1);
+    ReverseDepthOnTerminal (reverseDepth);
+
+    for (ii= 0; ii < numVertex; ii++) {
+        if (forwardDepth[ii] == MAXNUM)
+            forwardDepth[ii]= -1;
+        if (reverseDepth[ii] == MAXNUM)
+            reverseDepth[ii]= -1;
+    }
+    RemoveMarkedNodes (forwardDepth, reverseDepth);
+    delete [] forwardDepth;
+    delete [] reverseDepth;
+    return;
+}
+
+void SubGraph::RemoveMarkedNodes (int *forwardDepth, int *reverseDepth)
+{
+    int ii, currId, incId, outId;
+
+    currId= 0;
+    for (ii= 0; ii < numArc; ii++) {
+        incId= arc[ii]->GetFromId();
+        outId= arc[ii]->GetToId();
+        assert (outId == DISCARD_LABEL || outId == TERMINAL_LABEL || outId >= 0);
+        if (incId != DISCARD_LABEL && outId != DISCARD_LABEL
+            && arc[ii]->GetInput() != DISCARD_LABEL
+            && forwardDepth[incId] > 0
+            && (outId == TERMINAL_LABEL || reverseDepth[outId] > 0)) {
+            arc[currId]= arc[ii];
+            currId++;
+        }
+        else
+            delete arc[ii];
+    }
+    for (ii= currId; ii < numArc; ii++)
+	arc[ii]= 0;
+    numArc= currId;
+    return;
+}
+
+void SubGraph::RemoveDiscardedArcs ()
+{
+    int ii, currId, outId, inpId;
+
+    currId= 0;
+    for (ii= 0; ii < numArc; ii++) {
+        outId= arc[ii]->GetToId();
+        inpId= arc[ii]->GetInput();
+        if (outId != DISCARD_LABEL && inpId != DISCARD_LABEL) {
+            arc[currId]= arc[ii];
+            currId++;
+        }
+        else
+            delete arc[ii];
+    }
+    for (ii= currId; ii < numArc; ii++)
+	arc[ii]= 0;
+    numArc= currId;
+    return;
+}
+
+void SubGraph::MapGraphVertices (int *equivMap)
+{
+    int ii, fromId, toId;
+
+    for (ii= 0; ii < numArc; ii++) {
+        fromId= arc[ii]->GetFromId();
+        if (fromId >= 0)
+            if (equivMap[fromId] != fromId)
+                arc[ii]->AssignInput (DISCARD_LABEL);
+        toId= arc[ii]->GetToId();
+        if (toId >= 0)
+            if (equivMap[toId] != toId)
+                arc[ii]->AssignToId (equivMap[toId]);
+    }
+    return;
+}
+
+void SubGraph::DebugPrintDirective (char *dirrData)
+{
+    for (int ii= 0; ii < (popOp/7); ii++)
+        printf ("  ");
+    printf ("%s\n", dirrData);
+    return;
+}
+
+void SubGraph::DebugPrintLabel (int labId)
+{
+    for (int ii= 0; ii <= (popOp/7); ii++)
+        printf ("  ");
+    printf ("%d\n", labId);
+    return;
+}
+
+void SubGraph::ClearLabelledConnections (int labItem)
+{
+    for (int ii= 0; ii < numArc; ii++) {
+        if (arc[ii]->GetInput() == labItem)
+            arc[ii]->AssignToId (DISCARD_LABEL);
+    }
+    return;
+}
+
+void SubGraph::ClearRuleIds ()
+{
+    for (int ii= 0; ii < numArc; ii++) {
+        if (arc[ii]->GetInput() < 0 && arc[ii]->GetInput() > NONE_LABEL)
+            arc[ii]->AssignToId (DISCARD_LABEL);
+    }
+    return;
+}
+
+void SubGraph::ClearOutputs ()
+{
+    for (int ii= 0; ii < numArc; ii++)
+        arc[ii]->AssignOutput (NONE_LABEL);
+    return;
+}
diff --git a/tools/grxmlcompile/sub_grph.cpp b/tools/grxmlcompile/sub_grph.cpp
new file mode 100644
index 0000000..4b30556
--- /dev/null
+++ b/tools/grxmlcompile/sub_grph.cpp
@@ -0,0 +1,826 @@
+/* FILE:		sub_grph.cpp
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <string>
+#include <assert.h>
+
+#include "sub_grph.h"
+
+
+static int checkEntry (int *itemList, int count, int item);
+
+static int checkEntry (int *itemList, int count, int item)
+{
+    for (int ii= 0; ii < count; ii++)
+        if (item == itemList[ii])
+            return ii;
+    return -1;
+}
+
+bool IsSlot (std::string label)
+{
+        int count= label.size();
+        int fPos= label.find_first_of ("___");
+        int lPos= label.find_last_of ("___") + 1;
+	// std::cout << label << " " << count << " " << fPos << " " << lPos << std::endl;
+        if (fPos >= 0 && lPos == count)
+            return true;
+        else
+            return false;
+}
+
+
+void SubGraph::pushScope ()
+{
+    opStack[popOp++]= lastScope;
+    opStack[popOp++]= startId;
+    opStack[popOp++]= endId;
+    opStack[popOp++]= lastId;
+    opStack[popOp++]= arg1;
+    opStack[popOp++]= arg2;
+    opStack[popOp++]= numArc;
+    return;
+}
+
+void SubGraph::popScope ()
+{
+    prevStartId= startId;
+    prevEndId= endId;
+    arcLoc= opStack[--popOp];
+    arg2= opStack[--popOp];
+    arg1= opStack[--popOp];
+    lastId= opStack[--popOp];
+    endId= opStack[--popOp];
+    startId= opStack[--popOp];
+    lastScope= opStack[--popOp];
+    return;
+}
+
+void SubGraph::BeginScope (int scopeType, int newArg1, int newArg2)
+//  Begin a new scope
+//  Create nodes for item and /item but no transitions
+{
+    pushScope();
+
+    arg1= newArg1;
+    arg2= newArg2;
+    lastScope= scopeType;
+    arcLoc= numArc;
+
+    startId= NewVertexId();
+
+    switch (scopeType) {
+    case SCOPE_ITEM:
+    case SCOPE_RULE:
+    case SCOPE_COUNT:
+    case SCOPE_REPEAT:
+    case SCOPE_OPT:
+        endId= -1;
+        lastId= startId;
+        break;
+    case SCOPE_ONEOF:
+        endId= NewVertexId();
+        lastId= endId;
+        break;
+    default:
+        printf ("Shouldn't be getting here\n");
+    }
+    return;
+}
+
+void SubGraph::EndScope ()
+//  End the current scope
+{
+    int closeId= CloseScope();
+    lastId= ConnectLastScope (startId, closeId);
+}
+
+int SubGraph::ConnectLastScope (int beginScopeId, int endScopeId)
+//  Connect up the child network to the parent
+{
+    int begLabel, endLabel, begOutLabel, endOutLabel;
+
+    if (endId == -1)
+        endId= lastId;
+    if (lastScope == SCOPE_RULE) {
+        begLabel= BEGINRULE_LABEL;
+        begOutLabel= BEGINRULE_LABEL;
+        endLabel= ENDRULE_LABEL;
+        endOutLabel= arg1;  //  For inserting into closing brace
+    }
+    else {
+        begLabel= BEGINSCOPE_LABEL;
+        begOutLabel= BEGINRULE_LABEL;
+        endLabel= ENDSCOPE_LABEL;
+        endOutLabel= ENDSCOPE_LABEL;
+    }
+
+    popScope();
+
+    switch (lastScope) {
+    case SCOPE_ITEM:
+    case SCOPE_COUNT:
+    case SCOPE_REPEAT:
+    case SCOPE_OPT:
+        (void) CreateArc (begLabel, begOutLabel, lastId, beginScopeId);
+        lastId= NewVertexId();
+        (void) CreateArc (endLabel, endOutLabel, endScopeId, lastId);
+        break;
+    case SCOPE_ONEOF:
+        (void) CreateArc (begLabel, begOutLabel, startId, beginScopeId);
+        (void) CreateArc (endLabel, endOutLabel, endScopeId, endId);
+        break;
+    case SCOPE_RULE:
+        (void) CreateArc (begLabel, begOutLabel, lastId, beginScopeId);
+        lastId= NewVertexId();
+        (void) CreateArc (endLabel, ruleId, endScopeId, lastId);
+        break;
+    case SCOPE_ROOT:
+        (void) CreateArc (begLabel, begOutLabel, lastId, beginScopeId);
+        lastId= NewVertexId();
+        (void) CreateArc (endLabel, endOutLabel, endScopeId, lastId);
+        break;
+    default:
+        printf ("Shouldn't be getting here\n");
+    }
+    return lastId;
+}
+
+int SubGraph::CloseScope ()
+//  Closes the transitions and returns to the previous scope
+//  Special case for count and repeats
+{
+    int ii, finalId, endLoc, blockCount;
+
+    switch (lastScope) {
+    case SCOPE_ITEM:
+    case SCOPE_RULE:
+    case SCOPE_ONEOF:
+        break;
+    case SCOPE_OPT:
+        (void) CreateArc (NONE_LABEL, NONE_LABEL, startId, lastId);  // start to end
+        break;
+    case SCOPE_COUNT:
+        endLoc= numArc;
+        blockCount= numVertex - startId - 1;
+	    //  Special case, min-count= 0
+
+        for (ii= 1; ii < arg1; ii++)
+            CopyFastArcs (this, arcLoc, endLoc, ii * blockCount, -1, -1, -1, -1);
+        finalId= lastId + (arg2 - 1) * blockCount;
+        for ( ; ii < arg2; ii++) {
+            CopyFastArcs (this, arcLoc, endLoc, ii * blockCount, -1, -1, -1, -1);
+            (void) CreateArc (NONE_LABEL, NONE_LABEL, lastId + (ii - 1) * blockCount, finalId);
+        }
+	    if (arg1 <= 0)
+	        (void) CreateArc (NONE_LABEL, NONE_LABEL, startId, finalId);  // start to end
+
+        UpdateVertexCount (endLoc);
+        lastId= finalId;
+        break;
+    case SCOPE_REPEAT:
+        endLoc= numArc;
+        blockCount= numVertex - startId - 1;
+#if 1
+        for (ii= 1; ii < arg1; ii++)
+            CopyFastArcs (this, arcLoc, endLoc, ii * blockCount, -1, -1, -1, -1);
+        finalId= lastId + (arg1 - 1) * blockCount;
+
+        // loop
+        CopyFastArcs (this, arcLoc, endLoc, blockCount, startId, finalId, lastId, finalId);
+
+        // start to end
+        if (arg1 == 0)
+            (void) CreateArc (NONE_LABEL, NONE_LABEL, startId, finalId);
+#else
+        // loop
+        CopyFastArcs (this, arcLoc, endLoc, blockCount, startId, lastId, lastId, lastId);
+        UpdateVertexCount (endLoc);
+
+        // second part
+        blockCount= numVertex - startId;
+        CopyFastArcs (this, arcLoc, endLoc, blockCount, startId, lastId, lastId, -1);
+        UpdateVertexCount (endLoc);
+
+        // once
+        finalId= lastId + blockCount;
+        blockCount= numVertex - startId;
+        if (arg1 <= 1)
+            CopyFastArcs (this, arcLoc, endLoc, blockCount, startId, startId, lastId, finalId);
+
+        // start to end
+        if (arg1 == 0)
+            (void) CreateArc (NONE_LABEL, NONE_LABEL, startId, finalId);
+#endif
+
+        UpdateVertexCount (endLoc);
+        lastId= finalId;
+        break;
+    default:
+        printf ("Shouldn't be getting here\n");
+    }
+    return lastId;
+}
+
+int SubGraph::AddItem (int inputLabel, int tagLabel)
+{
+    int newId;
+
+    switch (lastScope) {
+    case SCOPE_RULE:
+        arg1= tagLabel;
+    case SCOPE_ITEM:
+    case SCOPE_OPT:
+    case SCOPE_COUNT:
+    case SCOPE_REPEAT:
+        newId= NewVertexId();
+        (void) CreateArc (inputLabel, tagLabel, lastId, newId);
+        lastId= newId;
+        break;
+    case SCOPE_ONEOF:
+        (void) CreateArc (inputLabel, tagLabel, startId, endId);
+        lastId= endId;
+        break;
+    default: ;
+        printf ("Shouldn't be getting here\n");
+    }
+    return lastId;
+}
+
+int SubGraph::AddTag (int tagLabel)
+{
+    int newId;
+
+    switch (lastScope) {
+    case SCOPE_RULE:
+    case SCOPE_ITEM:
+    case SCOPE_OPT:
+    case SCOPE_COUNT:
+    case SCOPE_REPEAT:
+        newId= NewVertexId();
+        (void) CreateArc (TAG_LABEL, tagLabel, lastId, newId);
+        lastId= newId;
+        break;
+    case SCOPE_ONEOF:
+        (void) CreateArc (TAG_LABEL, tagLabel, startId, endId);
+        lastId= endId;
+        break;
+    default:
+        printf ("Shouldn't be getting here\n");
+    }
+    return lastId;
+}
+
+void SubGraph::ExpandRules (SubGraph **subList, int *lookupList, int numSubs)
+{
+    int initialId, finalId, ruleId, pos;
+
+    for (int ii= 0; ii < numArc; ii++) {
+        ruleId= arc[ii]->GetInput();
+        if (ruleId < 0 && ruleId > NONE_LABEL) {
+            initialId= arc[ii]->GetFromId();
+            finalId= arc[ii]->GetToId();
+            ruleId= checkEntry (lookupList, numSubs, -ruleId);
+            assert (ruleId >= 0);
+	    // printf ("Expanding rule (%d) %s\n", -ruleId, subList[ruleId]->title);
+
+            arc[ii]->AssignInput (DISCARD_LABEL);       //  Clear down the rule
+	    // printf ("------------------------");
+	    // subList[ruleId]->SortLanguage();
+	    // subList[ruleId]->Print();
+	    // printf ("------------------------////");
+	    pos= numArc;
+            CopyFastArcs (subList[ruleId], 0, subList[ruleId]->numArc, numVertex,
+                        subList[ruleId]->startId, initialId, subList[ruleId]->lastId, finalId);
+	    UpdateVertexCount (pos);
+        }
+    }
+    UpdateVertexCount (0);
+    SortLanguage ();
+    return;
+}
+
+void SubGraph::UpdateVertexCount (int startLoc)
+{
+    int vertId, maxVertId;
+
+    maxVertId= -1;
+    for (int ii= startLoc; ii < numArc; ii++) {
+        vertId= arc[ii]->GetFromId();
+        if (maxVertId < vertId)
+            maxVertId= vertId;
+        vertId= arc[ii]->GetToId();
+        if (maxVertId < vertId)
+            maxVertId= vertId;
+    }
+    maxVertId++;
+    if (startLoc <= 0)       //  i.e. a fresh start
+        numVertex= maxVertId;
+    else if (numVertex < maxVertId)
+        numVertex= maxVertId;
+    return;
+}
+
+void SubGraph::AddTerminalConnections ()
+{
+    //  Add terminal transition
+    (void) CreateArc (TERMINAL_LABEL, NONE_LABEL, lastId, TERMINAL_LABEL);
+    return;
+}
+
+void SubGraph::RemoveRuleConnections ()
+{
+    AddTerminalConnections ();
+    RemoveTagConnections (-1, -1);
+    RemoveRuleStarts (-1, -1);
+    RemoveRuleEnds (-1, -1);
+    RemoveNulls (-1, -1);
+    ClearRuleIds ();
+
+    ClearDuplicateArcs ();
+    RemoveUnvisitedArcs (startId, lastId);
+    RemoveDiscardedArcs ();
+    RenumberNodes ();
+    UpdateVertexCount (0);
+
+    SortLanguage ();
+    return;
+}
+
+void SubGraph::RemoveRuleStarts (int startPoint, int endPoint)
+{
+    if (startPoint == -1 && endPoint == -1) {
+        startPoint= startId;
+        endPoint= lastId;
+    }
+
+    int *nodeList= new int [numVertex];
+    int *visitList= new int [numVertex];
+    for (int ii= 0; ii < numVertex; ii++)
+        visitList[ii]= 0;
+
+    SortLanguage ();
+    ProcessBegins (startPoint, endPoint, BEGINRULE_LABEL, nodeList, 0, visitList, numVertex);
+    ClearLabelledConnections (BEGINRULE_LABEL);
+
+    delete [] nodeList;
+    delete [] visitList;
+    return;
+}
+
+void SubGraph::RemoveRuleEnds (int startPoint, int endPoint)
+{
+    if (startPoint == -1 && endPoint == -1) {
+        startPoint= startId;
+        endPoint= lastId;
+    }
+
+    int *nodeList= new int [numVertex];
+    int *visitList= new int [numVertex];
+    for (int ii= 0; ii < numVertex; ii++)
+        visitList[ii]= 0;
+
+    SortLanguageReverse ();
+    ProcessEnds (endPoint, startPoint, ENDRULE_LABEL, nodeList, 0, visitList, numVertex);
+    ClearLabelledConnections (ENDRULE_LABEL);
+
+    delete [] nodeList;
+    delete [] visitList;
+    return;
+}
+
+void SubGraph::RemoveNulls (int startPoint, int endPoint)
+{
+    if (startPoint == -1 && endPoint == -1) {
+        startPoint= startId;
+        endPoint= lastId;
+    }
+
+    int *nodeList= new int [numVertex];
+    int *visitList= new int [numVertex];
+    for (int ii= 0; ii < numVertex; ii++)
+        visitList[ii]= 0;
+
+    SortLanguage ();
+    ProcessBegins (startPoint, endPoint, NONE_LABEL, nodeList, 0, visitList, numVertex);
+    ClearLabelledConnections (NONE_LABEL);
+
+    delete [] nodeList;
+    delete [] visitList;
+    return;
+}
+
+void SubGraph::RemoveInternalConnections ()
+{
+    RemoveForwardConnections (-1, -1);
+    RemoveBackwardConnections (-1, -1);
+    ClearDuplicateArcs ();
+    RemoveUnvisitedArcs (startId, lastId);
+    RemoveDiscardedArcs ();
+    RenumberNodes ();
+    UpdateVertexCount (0);
+
+    SortLanguage ();
+    return;
+}
+
+void SubGraph::RemoveForwardConnections (int startPoint, int endPoint)
+{
+    //  Code to pull up nodes for forward connecting transitions
+
+    if (startPoint == -1 && endPoint == -1) {
+        startPoint= startId;
+        endPoint= lastId;
+    }
+
+    int *nodeList= new int [numVertex];
+    int *visitList= new int [numVertex];
+    for (int ii= 0; ii < numVertex; ii++)
+        visitList[ii]= 0;
+
+    SortLanguage ();
+    ProcessBegins (startPoint, endPoint, BEGINSCOPE_LABEL, nodeList, 0, visitList, numVertex);
+    ClearLabelledConnections (BEGINSCOPE_LABEL);
+    RemoveDiscardedArcs ();
+
+    delete [] nodeList;
+    delete [] visitList;
+    return;
+}
+
+void SubGraph::PullUpBegins (int currId, int baseId, int finalId, int procLabel,
+                             int *nodeList, int currNum, int maxNum)
+{
+    int rix;
+
+    nodeList[currNum]= currId;
+    rix= FindFromIndex (currId);
+    if (rix < 0)
+        return;
+    while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) {
+        if (arc[forwardList[rix]]->GetInput() == procLabel) {
+            PullUpBegins (arc[forwardList[rix]]->GetToId(), baseId,
+                                finalId, procLabel, nodeList, currNum+1, maxNum);
+        }
+        else if (arc[forwardList[rix]]->GetInput() != DISCARD_LABEL)
+            InheritArc (arc[forwardList[rix]], baseId);
+        rix++;
+    }
+    return;
+}
+
+void SubGraph::ProcessBegins (int currId, int finalId, int procLabel,
+                              int *nodeList, int currNum, int *visitMark, int maxNum)
+{
+    int rix, nextId;
+
+    nodeList[currNum]= currId;
+    rix= FindFromIndex (currId);
+    if (rix < 0) {
+	    visitMark[currId]= 1;
+        return;
+    }
+    while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) {
+        if (arc[forwardList[rix]]->GetInput() == procLabel) {
+            PullUpBegins (arc[forwardList[rix]]->GetToId(), currId,
+                        finalId, procLabel, nodeList, currNum, maxNum);
+        }
+
+        nextId= arc[forwardList[rix]]->GetToId();
+        if (nextId >= 0 && nextId != finalId && checkEntry (nodeList, currNum, nextId) < 0
+         && visitMark[nextId] == 0)
+            ProcessBegins (nextId, finalId, procLabel, nodeList, currNum+1, visitMark, maxNum);
+        rix++;
+    }
+    visitMark[currId]= 1;
+    return;
+}
+
+void SubGraph::RemoveBackwardConnections (int startPoint, int endPoint)
+{
+    //  Code to push back nodes for reverse connecting transitions
+
+    if (startPoint == -1 && endPoint == -1) {
+        startPoint= startId;
+        endPoint= lastId;
+    }
+
+    int *nodeList= new int [numVertex];
+    int *visitList= new int [numVertex];
+    for (int ii= 0; ii < numVertex; ii++)
+        visitList[ii]= 0;
+
+    SortLanguageReverse ();
+    ProcessEnds (endPoint, startPoint, ENDSCOPE_LABEL, nodeList, 0, visitList, numVertex);
+    ClearLabelledConnections (ENDSCOPE_LABEL);
+    RemoveDiscardedArcs ();
+
+    delete [] nodeList;
+    delete [] visitList;
+    return;
+}
+
+void SubGraph::PullUpEnds (int currId, int baseId, int initialId, int procLabel,
+                           int *nodeList, int currNum, int maxNum)
+{
+    int rix;
+
+    nodeList[currNum]= currId;
+    rix= FindToIndex (currId);
+    if (rix < 0)
+        return;
+    while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) {
+        if (arc[backwardList[rix]]->GetInput() == procLabel) {
+            PullUpEnds (arc[backwardList[rix]]->GetFromId(), baseId,
+                                initialId, procLabel, nodeList, currNum+1, maxNum);
+        }
+        else if (arc[backwardList[rix]]->GetInput() != DISCARD_LABEL)
+            InheritReverseArc (arc[backwardList[rix]], baseId);
+        rix++;
+    }
+    return;
+}
+
+void SubGraph::ProcessEnds (int currId, int initialId, int procLabel,
+                            int *nodeList, int currNum, int *visitMark, int maxNum)
+{
+    int rix, nextId;
+
+    nodeList[currNum]= currId;
+    rix= FindToIndex (currId);
+    if (rix < 0) {
+	visitMark[currId]= 1;
+        return;
+    }
+    while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) {
+        if (arc[backwardList[rix]]->GetInput() == procLabel) {
+            PullUpEnds (arc[backwardList[rix]]->GetFromId(), currId,
+                        initialId, procLabel, nodeList, currNum, maxNum);
+        }
+        nextId= arc[backwardList[rix]]->GetFromId();
+        if (nextId != initialId && checkEntry (nodeList, currNum, nextId) < 0
+         && visitMark[nextId] == 0)
+            ProcessEnds (nextId, initialId, procLabel, nodeList, currNum+1, visitMark, maxNum);
+        rix++;
+    }
+    visitMark[currId]= 1;
+    return;
+}
+
+void SubGraph::RemoveUnreachedConnections (int startPoint, int endPoint)
+{
+    //  Obtain nodes with real transitions
+    //  Code to pull up nodes for forward connecting transitions
+    //  Code to push back nodes for reverse connecting transitions
+
+    if (startPoint == -1 && endPoint == -1) {
+        startPoint= startId;
+        endPoint= lastId;
+    }
+
+    ClearDuplicateArcs ();
+    RemoveUnvisitedArcs (startPoint, endPoint);
+    RemoveDiscardedArcs ();
+    RenumberNodes ();
+    UpdateVertexCount (0);
+
+    return;
+}
+
+void SubGraph::RemoveUnreachedConnectionsDebug (int startPoint, int endPoint)
+{
+    //  Obtain nodes with real transitions
+    //  Code to pull up nodes for forward connecting transitions
+    //  Code to push back nodes for reverse connecting transitions
+
+    if (startPoint == -1 && endPoint == -1) {
+        startPoint= startId;
+        endPoint= lastId;
+    }
+
+    // ClearDuplicateArcs ();
+    RemoveUnvisitedArcs (startPoint, endPoint);
+    RemoveDiscardedArcs ();
+    // RenumberNodes ();
+    UpdateVertexCount (0);
+
+    return;
+}
+
+void SubGraph::ReduceArcsByEquivalence ()
+{
+    int ii, *equivMap, *depthMap;
+
+    //  Sort by Input, Output and to nodes
+    SortLanguage ();
+    SortLanguageReverse ();
+
+    //  Calculate depth
+    depthMap= new int [numVertex];
+    for (ii= 0; ii < numVertex; ii++)
+        depthMap[ii]= MAXNUM;
+    if (lastId >= 0)
+        ReverseDepthData (lastId, depthMap, 1);
+    ReverseDepthOnTerminal (depthMap);
+    for (ii= 0; ii < numVertex; ii++)
+        if (depthMap[ii] == MAXNUM)
+            depthMap[ii]= -1;
+
+    //  Create equivalence list
+    equivMap= new int [numVertex];
+    for (ii= 0; ii < numVertex; ii++)
+        equivMap[ii]= ii;
+
+    //  Equivalence test to use equivalence list, duplicate transitions ignored
+    //  Test nodes with same equivalence
+    IdentifyEquivalence (depthMap, equivMap);
+
+    //  On identification of an equivalence
+    //      Update equivalence entry
+    MapGraphVertices (equivMap);
+    RemoveDiscardedArcs ();
+
+    //  Sort for general access
+    SortLanguage ();
+
+    delete [] depthMap;
+    delete [] equivMap;
+    return;
+}
+
+void SubGraph::DeterminizeArcs ()
+{
+    int ii;
+    bool allDone;
+
+    SortLanguage ();
+    DetCache *cache= new DetCache;
+
+    SetupVisitationCache ();
+    assert (VisitationConsistencyCheck () == 0);
+    printf ("Determinization\n");
+    allDone= false;
+    while (!allDone) {
+        allDone= true;
+        for (ii= 0; ii < numVertex; ii++) {
+	    if (QueryMinProperty(ii) == false) {
+                if (startId == ii || QueryNodeProperty(ii) > 0) {
+                    DeterminizeAtVertex (ii, cache);
+		    SetMinProperty (ii);
+        	    allDone= false;
+	            //printf ("    Node %d, Total %d, Arcs %d\n", ii, numVertex, numArc);
+	        }
+                assert (VisitationConsistencyCheck () == 0);
+		// hmm .. this seems harmless but ..
+		// printf("assert(0) in SubGraph::DeterminizeArcs() ii=%d allDone=%d\n", ii, allDone);
+		// assert (0);
+            }
+        }
+    }
+
+    ClearVisitationCache ();
+
+    delete cache;
+    return;
+}
+
+int SubGraph::IsDeterminized (int currId)
+{
+    int count, rix, lastInput;
+
+    count= 0;
+    lastInput= -1;
+    rix= FindFromIndex (currId);
+    if (rix < 0)
+        return -1;
+    while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) {
+        if (lastInput >= 0 && lastInput == arc[forwardList[rix]]->GetInput())
+            count++;
+        else
+            lastInput= arc[forwardList[rix]]->GetInput();
+        rix++;
+    }
+    return count;
+}
+
+void SubGraph::ReverseGraphForOutput ()
+{
+    int     ii, incId, outId;
+
+    assert (startId == 0);
+    UpdateVertexCount (0);
+    for (ii= 0; ii < numArc; ii++) {
+        incId= arc[ii]->GetFromId();
+        outId= arc[ii]->GetToId();
+        if (outId == TERMINAL_LABEL) {
+            arc[ii]->AssignFromId (0);
+            arc[ii]->AssignInput (NONE_LABEL);
+            arc[ii]->AssignOutput (NONE_LABEL);
+            arc[ii]->AssignToId (incId);
+        }
+        else {
+            arc[ii]->AssignFromId (outId);
+            if (incId == 0)
+                arc[ii]->AssignToId (numVertex);
+            else
+                arc[ii]->AssignToId (incId);
+        }
+    }
+    (void) CreateArc (TERMINAL_LABEL, NONE_LABEL, numVertex, TERMINAL_LABEL);  //  Add terminal transition
+    numVertex++;
+
+    return;
+}
+
+void SubGraph::RemoveTagConnections (int startPoint, int endPoint)
+{
+    //  Code to push back nodes for reverse connecting transitions
+
+    if (startPoint == -1 && endPoint == -1) {
+        startPoint= startId;
+        endPoint= lastId;
+    }
+
+    int *nodeList= new int [numVertex];
+    int *visitList= new int [numVertex];
+    for (int ii= 0; ii < numVertex; ii++)
+        visitList[ii]= 0;
+
+    SortLanguageReverse ();
+    ProcessTags (endPoint, startPoint, nodeList, 0, visitList, numVertex);
+    ClearLabelledConnections (TAG_LABEL);
+    RemoveDiscardedArcs ();
+
+    delete [] nodeList;
+    delete [] visitList;
+    return;
+}
+
+bool SubGraph::PullUpTags (int currId, int baseId, int initialId,
+                           int outTag, int *nodeList, int currNum, int maxNum)
+{
+    int rix;
+    bool hasCascade= false;
+
+    nodeList[currNum]= currId;
+    rix= FindToIndex (currId);
+    if (rix < 0)
+        return hasCascade;
+    while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) {
+        if (arc[backwardList[rix]]->GetInput() == TAG_LABEL) {
+            if (PullUpTags (arc[backwardList[rix]]->GetFromId(), baseId, initialId,
+                arc[backwardList[rix]]->GetOutput(), nodeList, currNum+1, maxNum))
+                CreateCopyWithOutput (arc[backwardList[rix]], NONE_LABEL);
+            hasCascade= true;
+        }
+        else if (arc[backwardList[rix]]->GetInput() != DISCARD_LABEL)
+            InheritReverseArcWithTag (arc[backwardList[rix]], baseId, outTag);
+        rix++;
+    }
+    return hasCascade;
+}
+
+void SubGraph::ProcessTags (int currId, int initialId, int *nodeList, int currNum,
+                            int *visitMark, int maxNum)
+{
+    int rix, nextId;
+
+    nodeList[currNum]= currId;
+    rix= FindToIndex (currId);
+    if (rix < 0) {
+	    visitMark[currId]= 1;
+        return;
+    }
+    while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) {
+        if (arc[backwardList[rix]]->GetInput() == TAG_LABEL) {
+            if (PullUpTags (arc[backwardList[rix]]->GetFromId(), currId, initialId,
+                arc[backwardList[rix]]->GetOutput(), nodeList, currNum, maxNum))
+                CreateCopyWithOutput (arc[backwardList[rix]], NONE_LABEL);
+        }
+        nextId= arc[backwardList[rix]]->GetFromId();
+        if (nextId != initialId && checkEntry (nodeList, currNum, nextId) < 0
+         && visitMark[nextId] == 0)
+            ProcessTags (nextId, initialId, nodeList, currNum+1, visitMark, maxNum);
+        rix++;
+    }
+    visitMark[currId]= 1;
+    return;
+}
diff --git a/tools/grxmlcompile/sub_grph.h b/tools/grxmlcompile/sub_grph.h
new file mode 100644
index 0000000..083bd24
--- /dev/null
+++ b/tools/grxmlcompile/sub_grph.h
@@ -0,0 +1,377 @@
+/* FILE:		sub_grph.h
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __sub_grph_h__
+#define __sub_grph_h__
+
+#include "netw_arc.h"
+
+#include "vocab.h"
+
+//  TODO:
+//  Guards various stages 1.  Compiling  2.  Processing
+
+#define SCOPE_ROOT         0
+#define SCOPE_ITEM        -1
+#define SCOPE_RULE        -2
+#define SCOPE_ONEOF       -3
+#define SCOPE_COUNT       -4
+#define SCOPE_OPT         -5
+#define SCOPE_REPEAT      -6
+
+#define NONE_LABEL        -100000           //  Null transition
+#define TAG_LABEL         -100001           //  Tag transition
+#define WB_LABEL          -100002           //  Word boundary transition
+#define TERMINAL_LABEL    -100003           //  Terminal transition
+#define BEGINSCOPE_LABEL  -100004           //  Start of scope
+#define ENDSCOPE_LABEL    -100005           //  End of scope
+#define BEGINRULE_LABEL   -100006           //  Start of rule
+#define ENDRULE_LABEL     -100007           //  End of rule
+#define DISCARD_LABEL     -100010           //  Discard (internal)
+#define INITIAL_LABEL     -100011           //  Initial silence
+#define FINAL_LABEL       -100012           //  Final silence
+
+#define MAXNUM             100000           //  A large number
+#define BLKSIZE             10000           //  Buffer size
+#define MAXITS                  5           //  Maximum equivalence reduction iterations
+
+// #define MAX(X,Y)        ((X) > (Y) ? (X) : (Y))
+// #define MIN(X,Y)        ((X) > (Y) ? (X) : (Y))
+
+// General functions
+bool IsSlot (std::string label);
+
+
+class DetCache {
+    public:
+
+        DetCache () { num= 0; dataPack= 0; };
+
+        void AddEntry (int comb, int first, int second) {
+            if (num == 0)
+                dataPack= new int [3*BLKSIZE];
+            else if ((num%BLKSIZE) == 0) {
+                int *newPack = new int [num+3*BLKSIZE];
+                for (int ii= 0; ii < (3*num); ii++)
+                    newPack[ii]= dataPack[ii];
+                delete [] dataPack;
+                dataPack= newPack;
+            }
+            dataPack[3*num]= first;
+            dataPack[3*num+1]= second;
+            dataPack[3*num+2]= comb;
+	    num++;
+            return;
+        };
+
+        int QueryEntry (int first, int second) {
+            if (!dataPack)
+                return -1;
+            for (int ii= 0; ii < num; ii++)
+                if (dataPack[3*ii] == first && dataPack[3*ii+1] == second)
+                    return (dataPack[3*ii+2]);
+            return -1;
+        }
+
+        ~DetCache () { if (dataPack) delete [] dataPack; };
+
+    private:
+        int num;
+        int *dataPack;
+};
+
+
+class SubGraph
+{
+public:
+
+    SubGraph (char *name, int ruleNo)
+    {
+        int count= strlen(name);
+        title= new char [count+1];
+        strcpy (title, name);
+	// printf ("New Rule %s\n", title);
+        ruleId= ruleNo;
+        popOp= 0;
+        numArc= 0;
+        numVertex= 0;
+        lastScope= SCOPE_ROOT;
+        startId= NewVertexId();
+        lastId= startId;
+        endId= lastId;
+        forwardList= 0;
+        backwardList= 0;
+        sortNum= 0;
+        vertexProp= 0;
+        sizeProp= 0;
+        return;
+    };
+
+    SubGraph (SubGraph *baseG);
+
+    ~SubGraph ()
+    {
+        delete [] title;
+        for (int ii= 0; ii < numArc; ii++)
+            delete arc[ii];
+        if (numArc >0)
+            delete [] arc;
+        if (forwardList)
+            delete [] forwardList;
+        if (backwardList)
+            delete [] backwardList;
+        return;
+    }
+
+    void getName (char *name, int maxlen)
+    {
+        strncpy (name, title, maxlen);
+    }
+
+    int getRuleId () {
+        return ruleId;
+    }
+
+    /**  Creates a copy of the graph */
+    void CopyFastArcs (SubGraph *subG, int startLoc, int endLoc, int offset, int headId, int newHeadId, int tailId, int newTailId);
+
+    /**  Graph construction routines */
+    void BeginScope (int scopeType, int arg1, int arg2);
+    void EndScope ();
+    int  AddItem (int inputLabel, int tagLabel);
+    int  AddTag (int tagLabel);
+    void ExpandRules (SubGraph **subList, int *lookupList, int numSubs);
+
+    /**  Reverse subgraph */
+    void ReverseGraphForOutput ();
+    void SortLanguage ();
+    void SortLanguageForMin ();
+    void SortLanguageReverse ();
+    void UpdateSortForLanguage ();
+
+    void RemoveRuleConnections ();
+    void RemoveInternalConnections ();
+    void RemoveUnreachedConnections (int startPoint, int endPoint);
+    void RemoveUnreachedConnectionsDebug (int startPoint, int endPoint);
+    void RemoveTagConnections (int startPoint, int endPoint);
+    void AddTerminalConnections ();
+
+    void Print ();
+    void PrintText ();
+    void PrintWithLabels( GRXMLDoc &p_Doc );
+    void RemapForSortedOutput ( GRXMLDoc & doc );
+
+    void WriteForwardGraphWithSemantic ( std::string & fileName, GRXMLDoc &p_Doc );
+    void WriteForwardGraphFile ( std::string & fileName, GRXMLDoc &p_Doc );
+    void WriteFile ( std::string & fileName, GRXMLDoc &p_Doc );
+    void WritePhonemeGraphFile( std::string & fileName, GRXMLDoc &p_Doc );
+    void WriteHMMGraphFile( std::string & fileName, GRXMLDoc &p_Doc );
+
+    void DeterminizeArcs ();
+    int IsDeterminized (int currId);
+    void ReduceArcsByEquivalence ();
+
+    void ExpandPhonemes ( GRXMLDoc & doc );
+    void AddLeftContexts ();
+    void AddRightContexts ();
+    void ExpandToHMMs ( GRXMLDoc & doc );
+    void ExpandIntraWordSilence ( GRXMLDoc & doc );
+    void ClearOutputs ();
+    void ShiftOutputsToLeft ();
+    void FinalProcessing ( GRXMLDoc & doc );
+
+    void DebugPrintDirective (char *dirrData);
+    void DebugPrintLabel (int labId);
+
+private:
+
+    int        NewVertexId ();
+    int        numVertex;
+
+    void       AllocateSpaceForArc ();
+    NUANArc        *CreateArc (int iLabel, int oLabel, int from, int to);
+    NUANArc        *InheritArc (NUANArc *arcBase, int id);
+    NUANArc        *InheritReverseArc (NUANArc *arcBase, int id);
+    NUANArc        *CreateCopyWithOutput (NUANArc *arcBase, int id);
+    NUANArc        *InheritReverseArcWithTag (NUANArc *arcBase, int id, int tagId);
+    int        numArc;
+    NUANArc        **arc;
+    int        sortNum;
+    int        sortRevNum;
+    int        *forwardList;
+    int        *backwardList;
+
+    int  ConnectLastScope (int beginScopeId, int endScopeId);
+    int  CloseScope ();
+    void UpdateVertexCount (int startLoc);
+
+    int FindFromIndex (int element);
+    int FindToIndex (int element);
+    void PullUpBegins (int currId, int baseId, int endId, int procLabel, int *nodeList, int currNum, int maxNum);
+    void ProcessBegins (int currId, int endId, int procLabel, int *nodeList, int currNum, int *visitMark, int maxNum);
+    void PullUpEnds (int currId, int baseId, int initialId, int procLabel, int *nodeList, int currNum, int maxNum);
+    void ProcessEnds (int currId, int initialId, int procLabel, int *nodeList, int currNum, int *visitMark, int maxNum);
+    bool PullUpTags (int currId, int baseId, int initialId, int outTag, int *nodeList, int currNum, int maxNum);
+    void ProcessTags (int currId, int initialId, int *nodeList, int currNum, int *visitMark, int maxNum);
+    void ClearDuplicateArcs ();
+
+    void RemoveRuleStarts (int startId, int endId);
+    void RemoveRuleEnds (int startId, int endId);
+    void RemoveNulls (int startPoint, int endPoint);
+    void RemoveForwardConnections (int startId, int endId);
+    void RemoveBackwardConnections (int startId, int endId);
+    void ClearLabelledConnections (int labItem);
+    void RemoveUnvisitedArcs (int initialId, int finalId);
+    void RemoveMarkedNodes (int *forwardDepth, int *reverseDepth);
+    void RemoveDiscardedArcs ();
+    void RenumberNodes ();
+
+    bool EquivalenceTestForward (int firstId, int secondId, int *equivMap);
+    void ForwardDepthData (int startId, int *depthMap, int depth);
+    void ReverseDepthData (int startId, int *depthMap, int depth);
+    void ReverseDepthOnTerminal (int *depthMap);
+
+    void MapGraphVertices (int *equivMap);
+    void IdentifyEquivalence (int *depthMap, int *equivMap);
+    void CheckForChangeAndResort (int currId, int *mapList);
+
+    void SortLanguageAtIndices (int begIx, int endIx);
+    void SortLanguageAtIndicesForMin (int begIx, int endIx);
+    void SortLanguageAtSortIndices (int begIx, int endIx);
+    bool CheckSort ();
+    bool CheckSortReverse ();
+    void RemoveDuplicatesAtNode (int rixBegin, int rixEnd);
+    void MergeVertices (int newId, int firstId, int secondId);
+    void DeterminizeAtVertex (int baseId, DetCache *cache);
+    int  PairwiseDeterminize (int baseId, int firstId, int fixStart, int secondId, int sixStart, DetCache *cache);
+    void ClearRuleIds ();
+    void ViewNode (int currId);
+
+    void ReverseMarkArcs ();
+    void ReverseMarkOutput (int currId, int initialId, int outId);
+    void MarkNodesByOutputAndClearArcs ();
+    void ExpandWordBoundaries ( GRXMLDoc & doc );
+    void AddInitialFinalSilences ( GRXMLDoc & doc );
+
+    void UpdateVisitationCache (int startNo);
+    void ClearVisitationCache ();
+    void SetupVisitationCache ();
+    void DecVisitationCache (int currId);
+    void IncVisitationCache (int currId);
+    int VisitationConsistencyCheck ();
+
+    void CreateNodeProperty () {
+        vertexProp= new int [BLKSIZE];
+        vertexMinned= new bool [BLKSIZE];
+        sizeProp= BLKSIZE;
+        for (int ii= 0; ii < sizeProp; ii++) {
+            vertexProp[ii]= 0;
+            vertexMinned[ii]= false;
+	}
+        return;
+    }
+
+    void IncNodeProperty (int vertNo) {
+        if (vertNo >= sizeProp) {
+            int newSize= (vertNo/BLKSIZE + 1)*BLKSIZE;
+            int *newPack = new int [newSize];
+            bool *newMinned = new bool [newSize];
+            int ii;
+            for (ii= 0; ii < sizeProp; ii++) {
+                newPack[ii]= vertexProp[ii];
+                newMinned[ii]= vertexMinned[ii];
+	    }
+            for (ii= sizeProp; ii < newSize; ii++) {
+                newPack[ii]= 0;
+                newMinned[ii]= false;
+	    }
+            delete [] vertexProp;
+            delete [] vertexMinned;
+            vertexProp= newPack;
+            vertexMinned= newMinned;
+	    sizeProp= newSize;
+        }
+        vertexProp[vertNo]++;
+        return;
+    }
+
+    void DecNodeProperty (int vertNo) {
+        if (vertNo < sizeProp)
+            vertexProp[vertNo]--;
+        return;
+    }
+
+    void SetNodeProperty (int vertNo, int value) {
+        if (vertNo < sizeProp)
+            vertexProp[vertNo]= value;
+        return;
+    }
+
+    void SetMinProperty (int vertNo) {
+        if (vertNo < sizeProp)
+            vertexMinned[vertNo]= true;
+        return;
+    }
+
+    int QueryNodeProperty (int vertNo) {
+        if (vertNo < sizeProp)
+            return (vertexProp[vertNo]);
+        return -1;
+    }
+
+    int QueryMinProperty (int vertNo) {
+        if (vertNo < sizeProp)
+            return (vertexMinned[vertNo]);
+        return false;
+    }
+
+    void DeleteNodeProperty () {
+        delete [] vertexProp;
+        delete [] vertexMinned;
+        vertexProp= 0;
+        vertexMinned= 0;
+    }
+
+
+    /*  Stacking of operations and related data
+    */
+    char    *title;
+    int     ruleId;
+    int     lastScope;
+    int     startId;
+    int     endId;
+    int     prevStartId;
+    int     prevEndId;
+    int     lastId;
+    int     arg1;
+    int     arg2;
+    int     arcLoc;
+    int     opStack[100000];      // TODO: remove hard coded number
+    int     popOp;
+    void    pushScope ();
+    void    popScope ();
+    int     silenceId;
+    int     intraId;
+    int     *vertexProp;          //  Vertex properties
+    bool    *vertexMinned;          //  Vertex properties
+    int     sizeProp;
+};
+
+#endif // __sub_grph_h__
diff --git a/tools/grxmlcompile/sub_min.cpp b/tools/grxmlcompile/sub_min.cpp
new file mode 100644
index 0000000..9692ec0
--- /dev/null
+++ b/tools/grxmlcompile/sub_min.cpp
@@ -0,0 +1,568 @@
+/* FILE:		sub_min.cpp
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <string>
+#include <assert.h>
+
+#include "sub_grph.h"
+
+#define SYMBOL_COMPARE(x,y) (arc[x]->CompareSymbol(arc[y]))
+#define COMPARE(x,y) (arc[x]->Compare(arc[y]))
+
+//  Minimization to facilitate moving output symbols - mainly for phoneme networks
+//      Check partial merge
+//      Move the output symbol if only one node
+
+/*
+static int checkEntry (int *itemList, int count, int item);
+
+static int checkEntry (int *itemList, int count, int item)
+{
+    for (int ii= 0; ii < count; ii++)
+        if (item == itemList[ii])
+            return ii;
+    return -1;
+}
+*/
+
+void SubGraph::ViewNode (int currId)
+{
+    int  rix;
+
+    printf ("Node: %d\n", currId);
+    rix= FindFromIndex (currId);
+    if (rix < 0)
+        return;
+    while (rix < numArc && arc[forwardList[rix]]->GetFromId() == currId) {
+        arc[forwardList[rix]]->Print();
+        rix++;
+    }
+    return;
+}
+
+
+bool SubGraph::EquivalenceTestForward (int firstId, int secondId, int *equivMap)
+{
+    int  fix, six, fnxt, snxt, tof, tos, count;
+
+    assert (firstId != secondId);
+    fix= FindFromIndex (firstId);
+    six= FindFromIndex (secondId);
+    if (fix < 0 || six < 0)
+        return false;
+
+    count= 0;
+    do {
+
+        //  Move to next valid transitions
+        while (fix < numArc && arc[forwardList[fix]]->GetFromId() == firstId
+            && arc[forwardList[fix]]->GetToId() == DISCARD_LABEL)
+            fix++;
+        if (fix < numArc && arc[forwardList[fix]]->GetFromId() == firstId)
+            fnxt= arc[forwardList[fix]]->GetFromId();
+        else
+            fnxt= -1;
+
+        while (six < numArc && arc[forwardList[six]]->GetFromId() == secondId
+            && arc[forwardList[six]]->GetToId() == DISCARD_LABEL)
+            six++;
+        if (six < numArc && arc[forwardList[six]]->GetFromId() == secondId)
+            snxt= arc[forwardList[six]]->GetFromId();
+        else
+            snxt= -1;
+
+        if (fnxt != firstId && snxt != secondId)
+            return true;
+        else if (fnxt != firstId || snxt != secondId)
+            return false;
+
+	tos= arc[forwardList[six]]->GetToId();
+	tof= arc[forwardList[fix]]->GetToId();
+        // printf ("Debug inner %d %d, %d %d\n", tof, tos, equivMap[tof], equivMap[tos]);
+	// if (tof >= 0)		bogus assert
+	    // assert (tof == equivMap[tof]);
+	// if (tos >= 0)
+	    // assert (tos == equivMap[tos]);
+
+        //  Test
+        if (!arc[forwardList[fix]]->HasSameLabels (arc[forwardList[six]])
+	    || tos != tof)
+            return false;
+	count++;
+
+        fix++;
+        six++;
+
+    }  while (fnxt >= 0 && snxt >= 0);
+
+    return false;
+}
+
+void SubGraph::IdentifyEquivalence (int *depthMap, int *equivMap)
+{
+    int ii, jj, dd, maxDepth, count, itCnt;
+
+    maxDepth= 0;
+    for (ii= 0; ii < numVertex; ii++) {
+        if (maxDepth < depthMap[ii])
+            maxDepth= depthMap[ii];
+    }
+
+    itCnt= 0;
+    do {
+        count= 0;
+        for (dd= 0; dd <= maxDepth; dd++)
+            for (ii= 0; ii < numVertex; ii++)
+                if (depthMap[ii] == dd && ii == equivMap[ii]) {
+                    CheckForChangeAndResort (ii, equivMap);
+                    for (jj= ii+1; jj < numVertex; jj++)
+                        if (depthMap[jj] == dd && jj == equivMap[jj]) {
+                            // Equivalence test
+                            CheckForChangeAndResort (jj, equivMap);
+                            // printf ("Try %d %d, ", ii, jj);
+                            if (EquivalenceTestForward (ii, jj, equivMap)) {
+                                equivMap[jj]= ii;
+                                // printf ("Merged %d %d\n", ii, jj);
+                                count++;
+                            }
+                        }
+                }
+
+        itCnt++;
+        // printf ("Total %d mergers\n", count);
+    } while (count > 0 && itCnt < MAXITS);
+
+    return;
+}
+
+void SubGraph::CheckForChangeAndResort (int currId, int *mapList)
+{
+    int  rix, rixBegin, nextId;
+    bool needSort;
+
+    needSort= false;
+    rixBegin= rix= FindFromIndex (currId);
+    if (rix < 0)
+        return;
+    while (rix < numArc && arc[forwardList[rix]]->GetFromId() == currId) {
+        nextId= arc[forwardList[rix]]->GetToId();
+        if (nextId >= 0 && mapList[nextId] != nextId) {
+            needSort= true;
+            arc[forwardList[rix]]->AssignToId(mapList[nextId]);
+        }
+        rix++;
+    }
+
+    //  Resort
+    if (needSort)
+        RemoveDuplicatesAtNode (rixBegin, rix);
+
+    return;
+}
+
+void SubGraph::DeterminizeAtVertex (int baseId, DetCache *cache)
+{
+    int  fix, six, firstId, secondId, vertEnd;
+
+    fix= FindFromIndex (baseId);
+    if (fix < 0)
+        return;
+
+    // Remove duplicates
+    vertEnd= fix;
+    six= -1;
+    while (vertEnd < sortNum && arc[forwardList[vertEnd]]->GetFromId() == baseId) {
+        vertEnd++;
+    }
+    vertEnd++;
+
+    //  Iteration over first node
+    firstId= -1;
+    while (fix < sortNum && arc[forwardList[fix]]->GetFromId() == baseId) {
+
+        //  Iterator for firstId
+        while (fix < sortNum && arc[forwardList[fix]]->GetFromId() == baseId
+            && (arc[forwardList[fix]]->GetToId() == firstId
+		    || arc[forwardList[fix]]->GetInput() == TERMINAL_LABEL
+		    || arc[forwardList[fix]]->GetInput() == DISCARD_LABEL))
+            fix++;
+
+	// Terminal Condition
+	if (fix >= sortNum || arc[forwardList[fix]]->GetFromId() != baseId)
+	    break;
+	else
+	    firstId= arc[forwardList[fix]]->GetToId();
+
+        //  Iteration over second node
+	six= fix;
+        secondId= firstId;
+        while (six < sortNum && arc[forwardList[six]]->GetFromId() == baseId) {
+
+	        //  Iterator for secondId
+            while (six < sortNum && arc[forwardList[six]]->GetFromId() == baseId
+                && (arc[forwardList[six]]->GetToId() == secondId
+		        || arc[forwardList[six]]->GetInput() == TERMINAL_LABEL
+		        || arc[forwardList[six]]->GetInput() == DISCARD_LABEL))
+		        six++;
+
+	        //  Terminal condition
+	        if (six >= sortNum || arc[forwardList[six]]->GetFromId() != baseId)
+		    break;
+	        else
+		    secondId= arc[forwardList[six]]->GetToId();
+
+            //  Now we have both Ids worked out
+	        assert (firstId >= 0);
+	        assert (secondId >= 0);
+                assert (arc[forwardList[fix]]->GetInput() != DISCARD_LABEL);
+                assert (arc[forwardList[six]]->GetInput() != DISCARD_LABEL);
+
+            if (PairwiseDeterminize (baseId, firstId, fix, secondId, six, cache) > 0) {
+                SortLanguageAtSortIndices (fix, vertEnd);
+
+                //  Are we done with the first node?
+                while (fix < sortNum && arc[forwardList[fix]]->GetFromId() == baseId
+                   && arc[forwardList[fix]]->GetInput() == DISCARD_LABEL)
+                    fix++;
+
+	            //  Terminal condition
+	            if (fix >= sortNum || arc[forwardList[fix]]->GetFromId() != baseId
+                 || arc[forwardList[fix]]->GetToId() != firstId)
+		            break;
+            }
+        }
+    }
+    return;
+}
+
+int SubGraph::PairwiseDeterminize (int baseId, int firstId, int fixStart, int secondId,
+                                   int sixStart, DetCache *cache)
+{
+    int  fix, six, fmiss, smiss, nmatch, symTst, newId;
+    bool isCached;
+
+    fix= fixStart;
+    six= sixStart;
+
+    assert (arc[forwardList[fix]]->GetInput() != DISCARD_LABEL);
+    assert (arc[forwardList[six]]->GetInput() != DISCARD_LABEL);
+
+    //  Count
+    isCached= false;
+    fmiss= smiss= nmatch= 0;
+    newId= -1;
+    while (six < sortNum && fix < sortNum) {
+
+        assert (arc[forwardList[fix]]->GetInput() != DISCARD_LABEL);
+        assert (arc[forwardList[six]]->GetInput() != DISCARD_LABEL);
+
+        symTst= SYMBOL_COMPARE (forwardList[fix], forwardList[six]);
+        if (symTst == 0) {
+            if (newId == -1) {
+                newId= cache->QueryEntry (firstId, secondId);
+		if (newId < 0)
+                    newId= NewVertexId ();
+                else
+                    isCached= true;
+		// printf ("Forming %d with %d and %d at %d\n", newId, firstId, secondId, baseId);
+            }
+
+            //  Assign second to new Vertex
+            arc[forwardList[six]]->AssignToId (newId);
+
+            //  Assign first to DISCARD Index
+            arc[forwardList[fix]]->AssignInput (DISCARD_LABEL);
+
+            //  Increment to next
+            do {
+                fix++;
+            } while (fix < sortNum && arc[forwardList[fix]]->GetInput() == DISCARD_LABEL);
+            if (fix >= sortNum || arc[forwardList[fix]]->GetFromId() != baseId
+                || arc[forwardList[fix]]->GetToId() != firstId)
+                fix= sortNum;
+
+            do {
+                six++;
+            } while (six < sortNum && arc[forwardList[six]]->GetInput() == DISCARD_LABEL);
+            if (six >= sortNum || arc[forwardList[six]]->GetFromId() != baseId
+                || arc[forwardList[six]]->GetToId() != secondId)
+                six= sortNum;
+
+            nmatch++;
+        }
+        else if (symTst < 0) {
+            do {
+                fix++;
+            } while (fix < sortNum && arc[forwardList[fix]]->GetInput() == DISCARD_LABEL);
+            if (fix >= sortNum || arc[forwardList[fix]]->GetFromId() != baseId
+                || arc[forwardList[fix]]->GetToId() != firstId)
+                fix= sortNum;
+            fmiss++;
+        }
+        else if (symTst > 0) {
+            do {
+                six++;
+            } while (six < sortNum && arc[forwardList[six]]->GetInput() == DISCARD_LABEL);
+            if (six >= sortNum || arc[forwardList[six]]->GetFromId() != baseId
+                || arc[forwardList[six]]->GetToId() != secondId)
+                six= sortNum;
+            smiss++;
+        }
+    }
+
+    // SortLanguageAtSortIndices (fixStart, fix);
+
+    if (newId >= 0) {
+        if (isCached == false) {
+            // numLast= numArc;
+            MergeVertices (newId, firstId, secondId);
+            cache->AddEntry (newId, firstId, secondId);
+            // UpdateVisitationCache (numLast);
+        }
+        assert (nmatch > 0);
+    }
+
+    //  Update fan-in count
+    if (nmatch > 0) {
+        // printf ("Merging %d %d to create %d\n", firstId, secondId, newId);
+        for (int ii= 0; ii < nmatch; ii++) {
+            // IncNodeProperty (newId);
+            IncVisitationCache (newId);
+            DecVisitationCache (firstId);
+            DecVisitationCache (secondId);
+        }
+    }
+    return nmatch;
+}
+
+void SubGraph::MergeVertices (int newId, int firstId, int secondId)
+{
+    int fix, six, symTst, numStart;
+    NUANArc *arcOne;
+
+    numStart= numArc;
+    fix= FindFromIndex (firstId);
+    six= FindFromIndex (secondId);
+    if (fix < 0 || six < 0) {
+        if (fix >= 0)
+            while (fix < sortNum && arc[forwardList[fix]]->GetFromId() == firstId) {
+                if (arc[forwardList[fix]]->GetInput() != DISCARD_LABEL)
+                    InheritArc (arc[forwardList[fix]], newId);
+                fix++;
+            }
+        else if (six >= 0)
+            while (six < sortNum && arc[forwardList[six]]->GetFromId() == secondId) {
+                if (arc[forwardList[six]]->GetInput() != DISCARD_LABEL)
+                    InheritArc (arc[forwardList[six]], newId);
+                six++;
+            }
+    }
+    else {
+        while (six < sortNum && fix < sortNum) {
+
+            symTst= SYMBOL_COMPARE (forwardList[fix], forwardList[six]);
+
+            if (symTst == 0) {
+                if (arc[forwardList[fix]]->GetToId() == firstId
+                 && arc[forwardList[six]]->GetToId() == secondId) {
+                    arcOne= InheritArc (arc[forwardList[fix]], newId);
+                    arcOne->AssignToId (newId);
+                }
+                else if (arc[forwardList[fix]]->GetToId()
+                 == arc[forwardList[six]]->GetToId()) {
+                    InheritArc (arc[forwardList[fix]], newId);
+		}
+                else {
+                    InheritArc (arc[forwardList[fix]], newId);
+                    InheritArc (arc[forwardList[six]], newId);
+                }
+
+                //  Increment to next
+                do {
+                    fix++;
+                } while (fix < sortNum && arc[forwardList[fix]]->GetInput() == DISCARD_LABEL);
+                if (fix >= sortNum || arc[forwardList[fix]]->GetFromId() != firstId
+                    || arc[forwardList[fix]]->GetFromId() != firstId)
+                    fix= sortNum;
+
+                do {
+                    six++;
+                } while (six < sortNum && arc[forwardList[six]]->GetInput() == DISCARD_LABEL);
+                if (six >= sortNum || arc[forwardList[six]]->GetFromId() != secondId)
+                    six= sortNum;
+            }
+            else if (symTst < 0) {
+                InheritArc (arc[forwardList[fix]], newId);
+                do {
+                    fix++;
+                } while (fix < sortNum && arc[forwardList[fix]]->GetInput() == DISCARD_LABEL);
+                if (fix >= sortNum || arc[forwardList[fix]]->GetFromId() != firstId
+                    || arc[forwardList[fix]]->GetFromId() != firstId)
+                    fix= sortNum;
+            }
+            else if (symTst > 0) {
+                InheritArc (arc[forwardList[six]], newId);
+                do {
+                    six++;
+                } while (six < sortNum && arc[forwardList[six]]->GetInput() == DISCARD_LABEL);
+                if (six >= sortNum || arc[forwardList[six]]->GetFromId() != secondId
+                    || arc[forwardList[six]]->GetFromId() != secondId)
+                    six= sortNum;
+            }
+        }
+
+        while (fix < sortNum && arc[forwardList[fix]]->GetFromId() == firstId) {
+            if (arc[forwardList[fix]]->GetInput() != DISCARD_LABEL)
+                InheritArc (arc[forwardList[fix]], newId);
+            fix++;
+        }
+
+        while (six < sortNum && arc[forwardList[six]]->GetFromId() == secondId) {
+            if (arc[forwardList[six]]->GetInput() != DISCARD_LABEL)
+                InheritArc (arc[forwardList[six]], newId);
+            six++;
+        }
+    }
+
+    //  Update the sort list
+    UpdateSortForLanguage ();
+    // RemoveDuplicatesAtNode (numStart, numArc);
+    // ViewNode (newId);
+    assert (CheckSort());
+
+    // printf ("Merging %d %d to create %d\n", firstId, secondId, newId);
+
+    return;
+}
+
+void SubGraph::SetupVisitationCache ()
+{
+    int ii;
+
+    CreateNodeProperty ();
+    for (ii= 0; ii < numArc; ii++)
+        if (arc[ii]->GetInput() != DISCARD_LABEL && arc[ii]->GetToId() >= 0)
+            IncNodeProperty (arc[ii]->GetToId());
+    return;
+}
+
+void SubGraph::ClearVisitationCache ()
+{
+    DeleteNodeProperty ();
+    return;
+}
+
+void SubGraph::UpdateVisitationCache (int startNo)
+{
+    int ii;
+
+    for (ii= startNo; ii < numArc; ii++)
+        if (arc[ii]->GetInput() != DISCARD_LABEL && arc[ii]->GetToId() >= 0) {
+            IncNodeProperty (arc[ii]->GetToId());
+            // std::cout << " (" << arc[ii]->GetToId() << " " << QueryNodeProperty (arc[ii]->GetToId()) << ") ";
+        }
+    // std::cout << std::endl;
+    return;
+}
+
+void SubGraph::DecVisitationCache (int currId)
+{
+    int rix;
+
+    DecNodeProperty (currId);
+    // std::cout << " [" << currId << " " << QueryNodeProperty (currId) << "] ";
+    if (QueryNodeProperty (currId) <= 0) {
+        // std::cout << " [" << currId << "] ";
+        rix= FindFromIndex (currId);
+        if (rix < 0)
+            return;
+        while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) {
+            if (arc[forwardList[rix]]->GetInput() != DISCARD_LABEL
+                && arc[forwardList[rix]]->GetToId() >= 0) {
+                if (arc[forwardList[rix]]->GetFromId() == arc[forwardList[rix]]->GetToId())
+                    DecNodeProperty (currId);
+                else if (QueryNodeProperty (arc[forwardList[rix]]->GetToId()) > 0)
+                    DecVisitationCache (arc[forwardList[rix]]->GetToId());
+            }
+            rix++;
+        }
+    }
+    return;
+}
+
+void SubGraph::IncVisitationCache (int currId)
+{
+    int rix;
+
+    if (QueryNodeProperty (currId) <= 0) {
+        IncNodeProperty (currId);
+        // std::cout << " (" << currId << ") ";
+        rix= FindFromIndex (currId);
+        if (rix < 0)
+            return;
+        while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) {
+            if (arc[forwardList[rix]]->GetInput() != DISCARD_LABEL
+                && arc[forwardList[rix]]->GetToId() >= 0) {
+                // IncNodeProperty (arc[forwardList[rix]]->GetToId());
+		// if (currId != arc[forwardList[rix]]->GetToId())
+                    IncVisitationCache (arc[forwardList[rix]]->GetToId());
+            }
+            rix++;
+        }
+    }
+    else
+        IncNodeProperty (currId);
+    // std::cout << " (" << currId << " " << QueryNodeProperty (currId) << ") ";
+    return;
+}
+
+int SubGraph::VisitationConsistencyCheck ()
+{
+    int ii, failCount;
+
+    int *nodeCount= new int [numVertex];
+
+    UpdateVertexCount (0);
+
+    // std::cout << "Count: ";
+    for (ii= 0; ii <numVertex; ii++) {
+        // std::cout << ii << " (" << vertexProp[ii] << ") ";
+        nodeCount[ii]= 0;
+    }
+    // std::cout << std::endl;
+    for (ii= 0; ii <numArc; ii++)
+        if (arc[ii]->GetInput() != DISCARD_LABEL && arc[ii]->GetToId() >= 0
+            && (vertexProp[arc[ii]->GetFromId()] > 0 || arc[ii]->GetFromId() == startId))
+            nodeCount[arc[ii]->GetToId()]++;
+    failCount= 0;
+    // std::cout << "Failure list: ";
+    for (ii= 0; ii <numVertex; ii++)
+        if (vertexProp[ii] != nodeCount[ii]) {
+            // std::cout << ii << " (" << vertexProp[ii] << " " << nodeCount[ii] << ") ";
+            failCount++;
+        }
+    // std::cout << std::endl;
+
+    // return failCount;
+    delete [] nodeCount;
+
+    return 0;
+}
diff --git a/tools/grxmlcompile/sub_phon.cpp b/tools/grxmlcompile/sub_phon.cpp
new file mode 100644
index 0000000..dfc9bd4
--- /dev/null
+++ b/tools/grxmlcompile/sub_phon.cpp
@@ -0,0 +1,472 @@
+/* FILE:		sub_phon.cpp
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <assert.h>
+
+#define DEBUG           0
+
+#include "sub_grph.h"
+#include "grxmldoc.h"
+
+void SubGraph::ExpandPhonemes ( GRXMLDoc &doc )
+{
+    int ii, wordId, phoneId, currId, newId, nextId, arcCount;
+    Pronunciation pron;
+    int pronCount;
+    NUANArc *arcOne;
+    std::string modelLabel, word;
+
+    {
+        std::stringstream ss;
+        ss << SILENCE_CONTEXT;
+        modelLabel= ss.str();
+        silenceId = doc.addPhonemeToList(modelLabel);
+    }
+    {
+        std::stringstream ss;
+        ss << INTRA_SILENCE_CONTEXT;
+        modelLabel= ss.str();
+        intraId = doc.addPhonemeToList(modelLabel);
+    }
+    UpdateVertexCount (0);
+    arcCount= numArc;
+    for (ii= 0; ii < arcCount; ii++) {
+        wordId= arc[ii]->GetInput();
+        if (wordId >= 0) {
+	    doc.findLabel(wordId, word );
+            if (IsSlot (word)) {
+	        // std::cout << "Found slot "<< word <<std::endl;
+	        newId= NewVertexId();
+	        arcOne= CreateArc (NONE_LABEL, NONE_LABEL, arc[ii]->GetFromId(), newId);
+		arcOne->AssignCentre (NONE_LABEL);
+	        nextId= NewVertexId();
+	        //  special case
+	        arcOne= CreateArc (-wordId, wordId, newId, nextId);
+		arcOne->AssignCentre (NONE_LABEL);
+	        // (void) CreateArc (-wordId, NONE_LABEL, arc[ii]->GetFromId(), newId);
+	        arcOne= CreateArc (WB_LABEL, NONE_LABEL, nextId, arc[ii]->GetToId());
+		arcOne->AssignCentre (NONE_LABEL);
+	        // (void) CreateArc (WB_LABEL, wordId, newId, arc[ii]->GetToId());
+            }
+            else {
+	        pron.clear();
+	        pron.lookup( *(doc.getVocabulary()), word );
+	        pronCount = pron.getPronCount();
+	        for (int jj= 0; jj < pronCount; jj++) {
+	            currId= arc[ii]->GetFromId();
+	            int modelCount = pron.getPhonemeCount(jj);
+	            for (int kk= 0; kk < modelCount; kk++) {
+	                newId= NewVertexId();
+	                pron.getPhoneme(jj, kk, modelLabel);
+	                //std::cout << "ExpandPhonemes adding "<< modelLabel <<std::endl;
+	                phoneId = doc.addPhonemeToList( modelLabel );
+	                arcOne= CreateArc (phoneId, NONE_LABEL, currId, newId);
+                        if (phoneId == intraId)
+		            arcOne->AssignCentre (silenceId);
+                        else
+		            arcOne->AssignCentre (phoneId);
+	                currId= newId;
+	            }
+	            arcOne= CreateArc (WB_LABEL, wordId, currId, arc[ii]->GetToId());
+		    arcOne->AssignCentre (NONE_LABEL);
+	        }
+	        //  End of loop
+            }
+	    arc[ii]->AssignInput (DISCARD_LABEL);   //  Delete original arc
+        }
+    }
+    RemoveDiscardedArcs ();
+
+    for (ii= 0; ii < numArc; ii++) {
+	arc[ii]->AssignLeft (NONE_LABEL);
+	arc[ii]->AssignRight (NONE_LABEL);
+    }
+
+    SortLanguage ();
+
+    return;
+}
+
+void SubGraph::AddLeftContexts ()
+{
+    int ii, rix, currId, leftC;
+
+    SortLanguage();
+    SortLanguageReverse();
+    for (ii= 0; ii < numArc; ii++) {
+        if (arc[ii]->GetInput() >= 0) {
+            currId= arc[ii]->GetFromId();
+            rix= FindToIndex (currId);
+            if (rix >= 0) {
+                leftC= arc[backwardList[rix]]->GetCentre();
+                arc[ii]->AssignLeft(leftC);
+            }
+            else if (currId != startId)
+                printf ("Shouldn't get here (L) %d\n", currId);
+        }
+        else
+            arc[ii]->AssignLeft (NONE_LABEL);
+    }
+    return;
+}
+
+void SubGraph::AddRightContexts ()
+{
+    int ii, rix, currId, rightC;
+
+    SortLanguage();
+    SortLanguageReverse();
+    for (ii= 0; ii < numArc; ii++) {
+        if (arc[ii]->GetInput() >= 0) {
+            currId= arc[ii]->GetToId();
+            rix= FindFromIndex (currId);
+            if (rix >= 0) {
+                rightC= arc[forwardList[rix]]->GetCentre();
+                arc[ii]->AssignRight (rightC);
+            }
+            else
+                printf ("Shouldn't get here (R) %d\n", currId);
+        }
+        else
+            arc[ii]->AssignRight (NONE_LABEL);
+    }
+    return;
+}
+
+void SubGraph::ExpandToHMMs ( GRXMLDoc &doc )
+{
+    int ii, currId, newId, arcCount, left, right, centre;
+    int modelCount;
+    NUANArc *arcOne;
+
+    UpdateVertexCount (0);
+    arcCount= numArc;
+    for (ii= 0; ii < arcCount; ii++) {
+        std::vector<int> modelSequence;
+	if (arc[ii]->GetInput() >= 0) {      //  i.e. proper phoneme
+            centre= arc[ii]->GetCentre();
+	    left= arc[ii]->GetLeft();
+	    right= arc[ii]->GetRight();
+#if DEBUG
+            std::cout << "HMM PIC:" << left <<" " << centre <<" " << right << std::endl;
+#endif
+	    doc.getHMMSequence (centre, left, right, modelSequence);
+	    modelCount = modelSequence.size();
+#if DEBUG
+            std::cout << "HMM: " << centre << " number of HMMs = " << modelCount <<std::endl;
+#endif
+	    if (modelCount >= 0) {
+		currId= arc[ii]->GetFromId();
+		for (int jj= 0; jj < modelCount; jj++) {
+                    if (jj == (modelCount - 1))
+                        newId= arc[ii]->GetToId();
+                    else
+		        newId= NewVertexId();
+		    arcOne= CreateArc (modelSequence[jj], NONE_LABEL, currId, newId);
+		    arcOne->AssignCentre (arc[ii]->GetInput());
+		    arcOne->AssignLeft (arc[ii]->GetLeft());
+		    arcOne->AssignRight (arc[ii]->GetRight());
+#if DEBUG
+                    std::cout << "HMM phoneme: " << modelSequence[jj] << " ";
+#endif
+		    currId= newId;
+		}
+#if DEBUG
+                std::cout << " centre " << arc[ii]->GetInput() << std::endl;
+#endif
+                arc[ii]->AssignInput (DISCARD_LABEL);       //  Delete original arc
+            }
+        }
+    }
+    RemoveDiscardedArcs ();
+
+    SortLanguage ();
+
+    return;
+}
+
+void SubGraph::ExpandIntraWordSilence ( GRXMLDoc &doc )
+{
+    int ii, fix, bix, firstId, newId, modelCount, followCount, currId, count;
+    int left, centre, right;
+    NUANArc *arcOne;
+
+    SortLanguage();
+    SortLanguageReverse();
+
+#if DEBUG
+    std::cout << "Intra sil search " << intraId << std::endl;
+#endif
+    count= numArc;
+    for (ii= 0; ii < count; ii++) {
+        if (arc[ii]->GetCentre() == intraId) {
+#if DEBUG
+            std::cout << "Intra sil: " << arc[ii]->GetFromId() << " " << arc[ii]->GetToId() << std::endl;
+#endif
+
+            fix= FindToIndex (arc[ii]->GetFromId());
+            if (fix < 0)
+                return;
+            while (fix < sortRevNum
+             && arc[backwardList[fix]]->GetToId() == arc[ii]->GetFromId()) {
+		//  left triphone
+                newId= NewVertexId();
+		left= arc[backwardList[fix]]->GetLeft();
+		centre= arc[ii]->GetLeft();
+		right= arc[ii]->GetRight();
+#if DEBUG
+                std::cout << "HMM PIC:" << left <<" " << centre <<" " << right << std::endl;
+#endif
+                std::vector<int> modelSequence;
+	        doc.getHMMSequence (centre, left, right, modelSequence);
+	        modelCount = modelSequence.size();
+#if DEBUG
+                std::cout << "HMM: " << centre << " number of HMMs = " << modelCount <<std::endl;
+#endif
+	        if (modelCount >= 0) {
+		    currId= arc[backwardList[fix]]->GetFromId();
+		    for (int jj= 0; jj < modelCount; jj++) {
+		        newId= NewVertexId();
+		        arcOne= CreateArc (modelSequence[jj],
+			    arc[backwardList[fix]]->GetOutput(), currId, newId);
+		        arcOne->AssignCentre (centre);
+#if DEBUG
+                        std::cout << "HMM phoneme: " << modelSequence[jj] << " ";
+#endif
+		        currId= newId;
+		    }
+#if DEBUG
+                    std::cout << " " << centre << std::endl;
+#endif
+		}
+		firstId= newId;
+
+		//  right block
+                bix= FindFromIndex (arc[ii]->GetToId());
+                if (bix < 0)
+                    return;
+                while (bix < sortNum
+                 && arc[forwardList[bix]]->GetFromId() == arc[ii]->GetToId()) {
+                    fix++;
+		    //  right triphone
+		    left= arc[ii]->GetLeft();
+		    centre= arc[ii]->GetRight();
+		    right= arc[forwardList[bix]]->GetRight();
+
+#if DEBUG
+                    std::cout << "HMM PIC:" << left <<" " << centre <<" " << right << std::endl;
+#endif
+                    std::vector<int> followSequence;
+	            doc.getHMMSequence (centre, left, right, followSequence);
+	            followCount = followSequence.size();
+#if DEBUG
+                    std::cout << "HMM: " << centre << " number of HMMs = " << followCount <<std::endl;
+#endif
+
+	            if (followCount >= 0) {
+		        currId= firstId;
+		        for (int jj= 0; jj < followCount; jj++) {
+                            if (jj == (followCount - 1))
+                                newId= arc[forwardList[bix]]->GetToId();
+                            else
+		                newId= NewVertexId();
+		            arcOne= CreateArc (followSequence[jj],
+				arc[forwardList[bix]]->GetOutput(), currId, newId);
+		            arcOne->AssignCentre (centre);
+#if DEBUG
+                            std::cout << "HMM phoneme: " << followSequence[jj] << " ";
+#endif
+		            currId= newId;
+		        }
+#if DEBUG
+                        std::cout << " " << centre << std::endl;
+#endif
+		    }
+                    bix++;
+                }
+		fix++;
+            }
+            // arc[ii]->AssignInput (silenceId);
+        }
+    }
+    return;
+}
+
+void SubGraph::ShiftOutputsToLeft ()
+{
+    UpdateVertexCount (0);
+    SortLanguage();
+    SortLanguageReverse();
+    ReverseMarkArcs();
+    MarkNodesByOutputAndClearArcs();
+    return;
+}
+
+void SubGraph::ReverseMarkArcs ()
+{
+    int ii;
+
+    for (ii= 0; ii < numArc; ii++)
+        if (arc[ii]->GetInput() == WB_LABEL)
+            ReverseMarkOutput (arc[ii]->GetFromId(), startId, arc[ii]->GetOutput());
+    return;
+}
+
+void SubGraph::ReverseMarkOutput (int currId, int initialId, int outId)
+{
+    int rix;
+
+    rix= FindToIndex (currId);
+    if (rix < 0)
+        return;
+    while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) {
+        if (arc[backwardList[rix]]->GetOutput() != DISCARD_LABEL    //  not resolved yet
+         && arc[backwardList[rix]]->GetInput() >= 0) { // excludes word boundary
+            if (arc[backwardList[rix]]->GetOutput() == NONE_LABEL)
+                arc[backwardList[rix]]->AssignOutput (outId);
+            else if (outId != arc[backwardList[rix]]->GetOutput())
+                arc[backwardList[rix]]->AssignOutput(DISCARD_LABEL);
+            ReverseMarkOutput (arc[backwardList[rix]]->GetFromId(), initialId, outId);
+        }
+        rix++;
+    }
+    return;
+}
+
+void SubGraph::MarkNodesByOutputAndClearArcs ()
+{
+    int ii, currId, rix;
+
+    int *nodeList= new int [numVertex];
+    for (ii= 0; ii < numVertex; ii++)
+        nodeList[ii]= NONE_LABEL;
+
+    //  Associate outputs with destination node
+    for (ii= 0; ii < numArc; ii++) {
+        currId= arc[ii]->GetToId();
+        if (currId >= 0) {
+	    if (arc[ii]->GetInput() == WB_LABEL)
+                nodeList[currId]= DISCARD_LABEL;
+            else if (nodeList[currId] != DISCARD_LABEL) {
+                if (nodeList[currId] == NONE_LABEL)
+                    nodeList[currId]= arc[ii]->GetOutput();
+                else if (nodeList[currId] != arc[ii]->GetOutput())
+                    nodeList[currId]= DISCARD_LABEL;
+            }
+        }
+    }
+
+    //  Now discard all arcs other than those emanating from unique assignments
+    for (ii= 0; ii < numArc; ii++) {
+        currId= arc[ii]->GetFromId();
+        if (nodeList[currId] >= 0 && arc[ii]->GetOutput() >= 0) // unique ones
+            arc[ii]->AssignOutput(DISCARD_LABEL);
+    }
+
+    //  Finally, special case for intra-word silence
+    for (ii= 0; ii < numArc; ii++) {
+	if (arc[ii]->GetOutput() >= 0 && arc[ii]->GetCentre() == intraId) {
+            currId= arc[ii]->GetToId();
+#if DEBUG
+            std::cout << "Intra silence: " << currId << " " << arc[ii]->GetFromId() << std::endl;
+#endif
+            rix= FindFromIndex (currId);
+            if (rix < 0)
+                continue;
+            while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) {
+                assert (arc[forwardList[rix]]->GetOutput() == DISCARD_LABEL);
+                arc[forwardList[rix]]->AssignOutput(arc[ii]->GetOutput());
+		rix++;
+	    }
+            arc[ii]->AssignOutput(DISCARD_LABEL);
+        }
+    }
+
+    delete [] nodeList;
+    return;
+}
+
+void SubGraph::FinalProcessing (GRXMLDoc &doc)
+{
+    ExpandWordBoundaries (doc);
+    AddInitialFinalSilences (doc);
+    return;
+}
+
+void SubGraph::ExpandWordBoundaries (GRXMLDoc &doc)
+{
+    int ii, newId, count;
+    NUANArc  *arcOne;
+
+    count= numArc;
+    for (ii= 0; ii < count; ii++) {
+        std::vector<int> modelSequence;
+        doc.getHMMSequence (silenceId, -1, -1, modelSequence);
+        if (arc[ii]->GetInput() == WB_LABEL) {
+            newId= NewVertexId();
+            // (void) CreateArc (NONE_LABEL, NONE_LABEL, arc[ii]->GetFromId(), newId);
+            // arcOne= CreateArc (modelSequence[0], NONE_LABEL, arc[ii]->GetFromId(), newId);
+            arcOne= CreateArc (modelSequence[0], NONE_LABEL, arc[ii]->GetFromId(), newId);
+	    arcOne->AssignCentre (silenceId);
+            (void) CreateArc (WB_LABEL, arc[ii]->GetOutput(), newId, arc[ii]->GetToId());
+            // arc[ii]->AssignInput (DISCARD_LABEL);
+        }
+    }
+    return;
+}
+
+void SubGraph::AddInitialFinalSilences (GRXMLDoc &doc)
+{
+    int ii, rix, newId, intId, count;
+    NUANArc *arcOne;
+
+    SortLanguage();
+    newId= NewVertexId();
+    rix= FindFromIndex (startId);
+    if (rix < 0)
+        return;
+    while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == startId) {
+        arc[forwardList[rix]]->AssignFromId (newId);
+        rix++;
+    }
+    std::vector<int> modelSequence;
+    doc.getHMMSequence (silenceId, -1, -1, modelSequence);
+    intId= NewVertexId();
+    arcOne= CreateArc (modelSequence[0], INITIAL_LABEL, startId, intId);
+    arcOne->AssignCentre (silenceId);
+    (void) CreateArc (WB_LABEL, NONE_LABEL, intId, newId);
+
+    count= numArc;
+    newId= NewVertexId();
+    for (ii= 0; ii < count; ii++) {
+        if (arc[ii]->GetInput() == TERMINAL_LABEL) {
+            arc[ii]->AssignInput (modelSequence[0]);
+            arc[ii]->AssignCentre (silenceId);
+            arc[ii]->AssignOutput (FINAL_LABEL);
+            arc[ii]->AssignToId (newId);
+        }
+    }
+    (void) CreateArc (TERMINAL_LABEL, TERMINAL_LABEL, newId, newId);
+
+    return;
+}
diff --git a/tools/grxmlcompile/sub_supp.cpp b/tools/grxmlcompile/sub_supp.cpp
new file mode 100644
index 0000000..325cd61
--- /dev/null
+++ b/tools/grxmlcompile/sub_supp.cpp
@@ -0,0 +1,548 @@
+/* FILE:		sub_supp.cpp
+ *  DATE MODIFIED:	31-Aug-07
+ *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
+ *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <string>
+#include <assert.h>
+
+#include "sub_grph.h"
+
+
+#define ARC_COMPARE(x,y) (arc[x]->Compare(arc[y]))
+#define ARC_COMPARE_REV(x,y) (arc[x]->CompareReverse(arc[y]))
+#define ARC_COMPARE_MIN(x,y) (arc[x]->CompareForMin(arc[y]))
+
+
+void SubGraph::SortLanguage ()
+{
+    int *sortList;
+
+    if (numArc <= 1) {
+        sortList= new int [numArc+2];
+        sortList[0]= 0;
+        if (forwardList)
+            delete [] forwardList;
+        forwardList= sortList;
+        sortNum= numArc;
+	    return;
+    }
+    SortLanguageAtIndices (-1, -1);
+    return;
+}
+
+void SubGraph::SortLanguageAtIndices (int begIx, int endIx)
+{
+    int	ii, jj, hired, retd;
+    int holdArc, *sortList;
+
+    if (begIx < 0)
+        begIx= 0;
+    if (endIx < 0)
+        endIx= numArc;
+
+    if (endIx <= begIx)
+	    return;
+
+    sortList= new int [numArc+2];
+    for (ii= 0; ii < sortNum && ii < numArc; ii++)
+        sortList[ii]= forwardList[ii];
+    for (ii= begIx; ii < endIx; ii++)
+        sortList[ii]= ii;
+    sortList--;
+
+    /*  Hiring
+    */
+    hired= (numArc >> 1)+1;
+    while (hired-- > 1) {
+	    holdArc= sortList[hired];
+	    ii= hired;
+	    jj= hired << 1;
+	    while (jj <= numArc) {
+	        if (jj < numArc && ARC_COMPARE (sortList[jj], sortList[jj+1]) <= 0 )
+		        jj++;
+	        if (ARC_COMPARE (holdArc, sortList[jj]) < 0) {
+		        sortList[ii]= sortList[jj];
+		        ii= jj;
+		        jj <<= 1;
+	        }
+	        else
+		    break;
+	    }
+	    sortList[ii]= holdArc;
+    }
+
+    /*  Retiring
+    */
+    retd= numArc;
+    while (retd > 0) {
+	    holdArc= sortList[retd];
+	    sortList[retd]= sortList[1];
+	        if (--retd == 1) {
+	            sortList[1]= holdArc;
+	            break;
+	        }
+	    ii= 1;
+	    jj= 2;
+	    while (jj <= retd) {
+	        if (jj < retd && ARC_COMPARE (sortList[jj], sortList[jj+1]) <= 0)
+		        jj++;
+	        if (ARC_COMPARE (holdArc, sortList[jj]) < 0) {
+		        sortList[ii]= sortList[jj];
+		        ii= jj;
+		        jj <<= 1;
+	        }
+	        else
+		        break;
+	    }
+	    sortList[ii]= holdArc;
+    }
+    sortList++;
+
+    if (forwardList)
+        delete [] forwardList;
+    forwardList= sortList;
+    sortNum= numArc;
+
+    /*  Now carry out some checks
+    */
+    assert(CheckSort());
+
+    return;
+}
+
+void SubGraph::SortLanguageAtSortIndices (int begIx, int endIx)
+{
+    int	ii, jj, hired, retd;
+    int holdArc, *sortList;
+
+    if (begIx < 0)
+        begIx= 0;
+    if (endIx < 0)
+        endIx= numArc;
+
+    if (endIx <= begIx)
+	    return;
+
+    sortList= forwardList;
+    sortList--;
+
+    /*  Hiring
+    */
+    hired= (numArc >> 1)+1;
+    while (hired-- > 1) {
+	    holdArc= sortList[hired];
+	    ii= hired;
+	    jj= hired << 1;
+	    while (jj <= numArc) {
+	        if (jj < numArc && ARC_COMPARE (sortList[jj], sortList[jj+1]) <= 0 )
+		        jj++;
+	        if (ARC_COMPARE (holdArc, sortList[jj]) < 0) {
+		        sortList[ii]= sortList[jj];
+		        ii= jj;
+		        jj <<= 1;
+	        }
+	        else
+		    break;
+	    }
+	    sortList[ii]= holdArc;
+    }
+
+    /*  Retiring
+    */
+    retd= numArc;
+    while (retd > 0) {
+	    holdArc= sortList[retd];
+	    sortList[retd]= sortList[1];
+	        if (--retd == 1) {
+	            sortList[1]= holdArc;
+	            break;
+	        }
+	    ii= 1;
+	    jj= 2;
+	    while (jj <= retd) {
+	        if (jj < retd && ARC_COMPARE (sortList[jj], sortList[jj+1]) <= 0)
+		        jj++;
+	        if (ARC_COMPARE (holdArc, sortList[jj]) < 0) {
+		        sortList[ii]= sortList[jj];
+		        ii= jj;
+		        jj <<= 1;
+	        }
+	        else
+		        break;
+	    }
+	    sortList[ii]= holdArc;
+    }
+    sortList++;
+
+    forwardList= sortList;
+
+    /*  Now carry out some checks
+    */
+    assert(CheckSort());
+
+    return;
+}
+
+int SubGraph::FindFromIndex (int element)
+{
+    int rix, rix_low, rix_high, direction;
+
+    rix_low= -1;
+    rix_high= sortNum;
+    while ((rix_high - rix_low) > 1) {
+	    rix= (rix_high + rix_low) >> 1;
+	    direction= element - arc[forwardList[rix]]->GetFromId();
+	    if (direction < 0)
+	        rix_high= rix;
+	    else if (direction > 0)
+	        rix_low= rix;
+	    else {
+            assert (arc[forwardList[rix]]->GetFromId() == element);
+	        while (rix > 0 && arc[forwardList[rix-1]]->GetFromId() == element)
+		        rix--;
+            assert (arc[forwardList[rix]]->GetFromId() == element);
+            assert (rix < sortNum);
+	        return (rix);
+	    }
+    }
+    return (-1);
+}
+
+void SubGraph::SortLanguageReverse ()
+{
+    int	ii, jj, hired, retd;
+    int holdArc, *sortList;
+
+    if (numArc <= 1) {
+        sortList= new int [numArc+2];
+        sortList[0]= 0;
+        if (backwardList)
+            delete [] backwardList;
+        backwardList= sortList;
+        sortRevNum= numArc;
+	    return;
+    }
+
+    sortList= new int [numArc+2];
+    for (ii= 0; ii < numArc; ii++)
+        sortList[ii]= ii;
+    sortList--;
+
+    /*  Hiring
+    */
+    hired= (numArc >> 1)+1;
+    while (hired-- > 1) {
+	    holdArc= sortList[hired];
+	    ii= hired;
+	    jj= hired << 1;
+	    while (jj <= numArc) {
+	        if (jj < numArc && ARC_COMPARE_REV (sortList[jj], sortList[jj+1]) <= 0 )
+		        jj++;
+	        if (ARC_COMPARE_REV (holdArc, sortList[jj]) < 0) {
+		        sortList[ii]= sortList[jj];
+		        ii= jj;
+		        jj <<= 1;
+	        }
+	        else
+		    break;
+	    }
+	    sortList[ii]= holdArc;
+    }
+
+    /*  Retiring
+    */
+    retd= numArc;
+    while (retd > 0) {
+	    holdArc= sortList[retd];
+	    sortList[retd]= sortList[1];
+	        if (--retd == 1) {
+	            sortList[1]= holdArc;
+	            break;
+	        }
+	    ii= 1;
+	    jj= 2;
+	    while (jj <= retd) {
+	        if (jj < retd && ARC_COMPARE_REV (sortList[jj], sortList[jj+1]) <= 0)
+		        jj++;
+	        if (ARC_COMPARE_REV (holdArc, sortList[jj]) < 0) {
+		        sortList[ii]= sortList[jj];
+		        ii= jj;
+		        jj <<= 1;
+	        }
+	        else
+		        break;
+	    }
+	    sortList[ii]= holdArc;
+    }
+    sortList++;
+
+    if (backwardList)
+        delete [] backwardList;
+    backwardList= sortList;
+    sortRevNum= numArc;
+
+    /*  Now carry out some checks
+    */
+    assert(CheckSortReverse());
+
+    return;
+}
+
+int SubGraph::FindToIndex (int element)
+{
+    int rix, rix_low, rix_high, direction;
+
+    rix_low= -1;
+    rix_high= sortRevNum;
+    while ((rix_high - rix_low) > 1) {
+	    rix= (rix_high + rix_low) >> 1;
+	    direction= element - arc[backwardList[rix]]->GetToId();
+	    if (direction < 0)
+	        rix_high= rix;
+	    else if (direction > 0)
+	        rix_low= rix;
+	    else {
+            assert (arc[backwardList[rix]]->GetToId() == element);
+	        while (rix > 0 && arc[backwardList[rix-1]]->GetToId() == element)
+		        rix--;
+            assert (arc[backwardList[rix]]->GetToId() == element);
+            assert (rix < sortRevNum);
+	        return (rix);
+	    }
+    }
+    return (-1);
+}
+
+void SubGraph::UpdateSortForLanguage ()
+{
+    SortLanguageAtIndices (sortNum, numArc);
+}
+
+bool SubGraph::CheckSort ()
+{
+    for (int ii= 1; ii < numArc; ii++) {
+	    if (ARC_COMPARE (forwardList[ii-1], forwardList[ii]) > 0)
+            return false;
+    }
+    return true;
+}
+
+bool SubGraph::CheckSortReverse ()
+{
+    for (int ii= 1; ii < numArc; ii++) {
+	if (ARC_COMPARE_REV (backwardList[ii-1], backwardList[ii]) > 0) {
+	    printf ("Failed at %d\n", ii);
+            return false;
+	}
+    }
+    return true;
+}
+
+void SubGraph::ClearDuplicateArcs ()
+{
+    int currId;
+
+    SortLanguage();
+    currId= 0;
+    for (int ii= 1; ii < numArc; ii++) {
+        if (arc[forwardList[ii]]->GetInput() != DISCARD_LABEL)
+            if (ARC_COMPARE (forwardList[currId], forwardList[ii]) == 0)
+                arc[forwardList[ii]]->AssignInput (DISCARD_LABEL);
+            else
+                currId= ii;
+    }
+    return;
+}
+
+void SubGraph::RenumberNodes ()
+{
+  int  ii, id, count;
+
+    UpdateVertexCount (0);
+    if (numVertex > 0) {
+        int *mapList= new int [numVertex];
+        for (ii= 0; ii < numVertex; ii++)
+            mapList[ii]= -1;
+
+        for (ii= 0; ii < numArc; ii++) {
+            id= arc[ii]->GetFromId();
+            mapList[id]= 1;
+            id= arc[ii]->GetToId();
+            if (id >= 0)
+                mapList[id]= 1;
+        }
+
+        count= 0;
+        for (ii= 0; ii < numVertex; ii++)
+            if (mapList[ii] > 0) {
+                mapList[ii]= count;
+                count++;
+            }
+
+        for (ii= 0; ii < numArc; ii++) {
+            id= arc[ii]->GetFromId();
+            arc[ii]->AssignFromId(mapList[id]);
+            id= arc[ii]->GetToId();
+            if (id >= 0)
+                arc[ii]->AssignToId(mapList[id]);
+        }
+        startId= mapList[startId];
+        if (lastId >= 0)
+            lastId= mapList[lastId];
+        delete [] mapList;
+    }
+    else {
+        startId= 0;
+        lastId= -1;
+        endId= -1;
+    }
+    return;
+}
+
+void SubGraph::RemoveDuplicatesAtNode (int rixBegin, int rixEnd)
+//  Works only within one node/vertex
+{
+    int rix, lastRix;
+    bool needSort;
+
+    SortLanguageAtSortIndices (rixBegin, rixEnd);
+
+    //  Check for duplicate transitions
+    needSort= false;
+    lastRix= rixBegin;
+    for (rix= rixBegin+1; rix < rixEnd; rix++) {
+        assert (arc[forwardList[lastRix]]->GetFromId() == arc[forwardList[rix]]->GetFromId());
+        if (ARC_COMPARE (forwardList[lastRix], forwardList[rix]) == 0) {
+            arc[forwardList[rix]]->AssignInput (DISCARD_LABEL);
+            needSort= true;
+        }
+        else
+            lastRix= rix;
+    }
+
+    //  Resort
+    if (needSort)
+        SortLanguageAtSortIndices (rixBegin, rixEnd);
+
+    return;
+}
+
+void SubGraph::SortLanguageForMin ()
+{
+    int *sortList;
+
+    if (numArc <= 1) {
+        sortList= new int [numArc+2];
+        sortList[0]= 0;
+        if (forwardList)
+            delete [] forwardList;
+        forwardList= sortList;
+        sortNum= numArc;
+	    return;
+    }
+    SortLanguageAtIndicesForMin (-1, -1);
+    return;
+}
+
+void SubGraph::SortLanguageAtIndicesForMin (int begIx, int endIx)
+{
+    int	ii, jj, hired, retd;
+    int holdArc, *sortList;
+
+    if (begIx < 0)
+        begIx= 0;
+    if (endIx < 0)
+        endIx= numArc;
+
+    if (endIx <= begIx)
+	    return;
+
+    sortList= new int [numArc+2];
+    for (ii= 0; ii < sortNum && ii < numArc; ii++)
+        sortList[ii]= forwardList[ii];
+    for (ii= begIx; ii < endIx; ii++)
+        sortList[ii]= ii;
+    sortList--;
+
+    /*  Hiring
+    */
+    hired= (numArc >> 1)+1;
+    while (hired-- > 1) {
+	    holdArc= sortList[hired];
+	    ii= hired;
+	    jj= hired << 1;
+	    while (jj <= numArc) {
+	        if (jj < numArc && ARC_COMPARE_MIN (sortList[jj], sortList[jj+1]) <= 0 )
+		        jj++;
+	        if (ARC_COMPARE_MIN (holdArc, sortList[jj]) < 0) {
+		        sortList[ii]= sortList[jj];
+		        ii= jj;
+		        jj <<= 1;
+	        }
+	        else
+		    break;
+	    }
+	    sortList[ii]= holdArc;
+    }
+
+    /*  Retiring
+    */
+    retd= numArc;
+    while (retd > 0) {
+	    holdArc= sortList[retd];
+	    sortList[retd]= sortList[1];
+	        if (--retd == 1) {
+	            sortList[1]= holdArc;
+	            break;
+	        }
+	    ii= 1;
+	    jj= 2;
+	    while (jj <= retd) {
+	        if (jj < retd && ARC_COMPARE_MIN (sortList[jj], sortList[jj+1]) <= 0)
+		        jj++;
+	        if (ARC_COMPARE_MIN (holdArc, sortList[jj]) < 0) {
+		        sortList[ii]= sortList[jj];
+		        ii= jj;
+		        jj <<= 1;
+	        }
+	        else
+		        break;
+	    }
+	    sortList[ii]= holdArc;
+    }
+    sortList++;
+
+    if (forwardList)
+        delete [] forwardList;
+    forwardList= sortList;
+    sortNum= numArc;
+
+    /*  Now carry out some checks
+    */
+    int checkSort = CheckSort();
+    if(checkSort == 0) {
+      // printf("assert(0) in SubGraph::CheckSort %d\n", checkSort);
+      // hmm .. this seems harmless but ...!
+      // assert(checkSort);
+    }
+
+    return;
+}
+
diff --git a/tools/grxmlcompile/testhashmap.cpp b/tools/grxmlcompile/testhashmap.cpp
new file mode 100644
index 0000000..91da173
--- /dev/null
+++ b/tools/grxmlcompile/testhashmap.cpp
@@ -0,0 +1,203 @@
+/*---------------------------------------------------------------------------*
+ *  testhashmap.cpp  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include <string>
+#include <fstream>
+#include <iostream>
+#include "../src/hashmap.h"
+using namespace std;
+
+
+#if 1
+void test1();
+void test2();
+
+
+void main(int argc, char* argv[])
+{
+test2();
+}
+
+// (INT,INT) hash
+void test1()
+{
+    HashMap<int,int > myHash;
+    int value;
+    int i;
+    i=10;
+    myHash.setName("TestHash");
+    myHash.insert(1, i);
+    myHash.getValue(1, &value);
+    std::cout << "Index 1 has value= " << value <<std::endl;
+    myHash.getIndex( 10, &i );
+    std::cout << "value " << value << " has index " << i <<std::endl;
+    unsigned int j;
+    myHash.getNumericIndex(i, &j);
+    std::cout << "index  " << i << " has numeric index " << j <<std::endl;
+    myHash.getNumericIndexByValue(value, &j);
+    std::cout << "value " << value << " has numeric index " << j <<std::endl;
+
+    myHash.print();
+    myHash.remove(1);
+    myHash.print();
+}
+
+
+// (INT,STRING) hash
+void test2()
+{
+    HashMap<int,string> myHash;
+    string value = "hello";
+    int i;
+    i=10;
+    myHash.setName("TestHash");
+    myHash.insert(1, value);
+    myHash.insert(2, "world");
+
+    myHash.getValue(1, &value);
+    std::cout << "Index 1 has value= " << value <<std::endl;
+    myHash.getIndex( value, &i );
+    std::cout << "value " << value << " has index " << i <<std::endl;
+    unsigned int j;
+    myHash.getNumericIndex(i, &j);
+    std::cout << "index  " << i << " has numeric index " << j <<std::endl;
+    myHash.getNumericIndexByValue(value, &j);
+    std::cout << "value " << value << " has numeric index " << j <<std::endl;
+
+    myHash.print();
+    myHash.getFirst(&i, &value);
+    std::cout << "First iterator values are " << i <<", " << value <<std::endl;
+    if (myHash.getNext(&i, &value)) {
+	std::cout << "Iterator values are " << i <<", " << value <<std::endl;
+    }
+    else {
+	std::cout << "No first index - map is empty" <<std::endl;
+    }
+    myHash.remove(1);
+    myHash.getFirst(&i, &value);
+    std::cout << "First iterator values are " << i <<", " << value <<std::endl;
+    if (myHash.getNext(&i, &value)) {
+	std::cout << "Iterator values are " << i <<", " << value <<std::endl;
+    }
+    else {
+	std::cout << "No next index - map is empty" <<std::endl;
+    }
+
+
+    myHash.print();
+}
+
+
+
+
+
+
+
+
+
+
+#else
+
+void findi(string s);
+void finds(int i);
+void insert(int i, const string &s);
+void remove( int i );
+
+HashMap<int,string> myHash;
+
+void main(int argc, char* argv[])
+{
+    string s;
+    s = "hello";
+    insert(1,s);
+    insert(2,"world");
+
+    finds(2);
+    finds(1);
+    finds(99);
+    findi("hello");
+    findi("world");
+    findi("xox");
+
+    s = "bollocks";
+    findi("hello");
+    finds(1);
+    insert(3,s);
+    finds(3);
+    insert(3,"zzz");
+    finds(3);
+    remove(3);
+    insert(3,"zzz");
+    finds(3);
+
+}
+
+
+void findi(string s)
+{
+    int i;
+    if ( myHash.getIndex(s, &i) ) {
+	cout << "'" << s << "' has index of " << i <<endl;
+    }
+    else {
+	cout << "'" << s << "' not found!" << endl;
+    }
+}
+
+void finds(int i)
+{
+    string s;
+    if ( myHash.getValue(i, &s) ) {
+	cout << "'" << i << "' has value of " << s <<endl;
+    }
+    else {
+	cout << "'" << i << "' not found!" << endl;
+    }
+}
+
+void insert( int i, const string &s)
+{
+    string ss;
+    if (!myHash.getValue(i, &ss) ) {
+	if ( myHash.insert(i, s) ) {
+	    cout << "Inserted: " << i << "," << s <<endl;
+	}
+    }
+    else {
+	cout << "Failed to insert '" << i << "," << s <<"'" << endl;
+    }
+}
+
+void remove( int i )
+{
+    string ss;
+    if (myHash.getValue(i, &ss) ) {
+	if ( myHash.remove(i) ) {
+	    cout << "Removed: " << i << endl;
+	}
+    }
+    else {
+	cout << "Failed to remove '" << i << "'" << endl;
+    }
+}
+
+
+#endif
diff --git a/tools/grxmlcompile/vocab.cpp b/tools/grxmlcompile/vocab.cpp
new file mode 100644
index 0000000..0f82213
--- /dev/null
+++ b/tools/grxmlcompile/vocab.cpp
@@ -0,0 +1,304 @@
+/*---------------------------------------------------------------------------*
+ *  vocab.cpp                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <string>
+#include <iostream>
+#include <stdexcept>
+#include "ESR_Locale.h"
+#include "LCHAR.h"
+#include "pstdio.h"
+#include "ESR_Session.h"
+#include "SR_Vocabulary.h"
+
+#include "vocab.h"
+
+#define MAX_LINE_LENGTH     256
+#define MAX_PRONS_LENGTH 1024
+
+#define DEBUG	0
+
+#define GENERIC CONTEXT "#"
+
+Vocabulary::Vocabulary( std::string const & vocFileName )
+{
+    ESR_ReturnCode rc;
+    rc = SR_VocabularyLoad(vocFileName.c_str(), &m_hVocab);
+    if (rc != ESR_SUCCESS)
+    {
+        std::cout << "Error: " << ESR_rc2str(rc) <<std::endl;
+        exit (-1);
+    }
+}
+
+Vocabulary::~Vocabulary()
+{
+    SR_VocabularyDestroy(m_hVocab);
+}
+
+Pronunciation::Pronunciation()
+{
+}
+
+Pronunciation::~Pronunciation()
+{
+}
+
+void Pronunciation::clear()
+{
+    m_Prons.clear();
+    for (unsigned int ii=0;ii<m_ModelIDs.size();ii++ )
+    {
+        m_ModelIDs[ii].clear();
+    }
+    m_ModelIDs.clear();
+}
+
+int Pronunciation::lookup(  Vocabulary & vocab, std::string  & phrase )
+{
+    ESR_ReturnCode rc;
+    LCHAR prons[MAX_PRONS_LENGTH];
+    LCHAR* c_phrase;
+    size_t len;
+
+    LCHAR s[MAX_LINE_LENGTH];
+    strcpy (s, phrase.c_str() ); // No conversion for std::string to wchar
+    //clear();
+
+    memset (prons, 0x00, sizeof(LCHAR));
+
+    c_phrase = s;
+    SR_Vocabulary *p_SRVocab = vocab.getSRVocabularyHandle();
+#if DEBUG
+    std::cout << "DEBUG: " << phrase <<" to be looked up" << std::endl;
+#endif
+    rc = SR_VocabularyGetPronunciation( p_SRVocab, c_phrase, prons, &len );
+    if (rc != ESR_SUCCESS)
+        //  std::cout <<"ERORORORORROOR!" <<std::endl;
+        std::cout <<"ERROR: " << ESR_rc2str(rc) << std::endl;
+    else {
+#if DEBUG
+        std::cout <<"OUTPUT: " << prons << " num " << len << std::endl;
+#endif
+        size_t len_used;
+        LCHAR *pron = 0;
+        for(len_used=0; len_used <len; ) {
+            pron = &prons[0]+len_used;
+            len_used += LSTRLEN(pron)+1;
+#if DEBUG
+            std::cout << "DEBUG: used " << len_used << " now " << LSTRLEN(pron) << std::endl;
+#endif
+            std::string pronString( pron ); // wstring conversion if needed
+            addPron( pronString );
+#if DEBUG
+            std::cout << "DEBUG: " << phrase << " " << pron << std::endl;
+#endif
+        }
+    }
+    return getPronCount();
+}
+
+
+int Pronunciation::addPron( std::string & s )
+{
+    m_Prons.push_back( s );
+    return m_Prons.size();
+}
+
+int Pronunciation::getPronCount()
+{  // returns number of prons
+    return m_Prons.size();
+}
+
+bool Pronunciation::getPron( int index, std::string &s )
+{
+ // returns string length used
+    try {
+      s = m_Prons.at(index);
+    }
+    catch(std::out_of_range& err) {
+      std::cerr << "out_of_range: " << err.what() << std::endl;
+    }
+    return true;
+}
+
+void Pronunciation::print()
+{
+  std::string s;
+  for (int ii=0; ii< getPronCount(); ii++) {
+    getPron(ii, s);
+#if DEBUG
+    std::cout << "Pron #" << ii << ": " << s << std::endl;
+#endif
+  }
+}
+
+void Pronunciation::printModelIDs()
+{
+  std::string s;
+  for (int ii=0; ii< getPronCount(); ii++) {
+    getPron(ii, s);
+#if DEBUG
+    std::cout << "  Pron #" << ii << ": " << s << std::endl;
+    std::cout << "    Model IDs: ";
+#endif
+    for (int jj=0;jj<getModelCount(ii);jj++) {
+      std::cout << " " << getModelID(ii,jj);
+    }
+#if DEBUG
+    std::cout <<  std::endl;
+#endif
+  }
+}
+
+int Pronunciation::getPhonemeCount( int pronIndex )
+{
+  std::string s;
+  getPron(pronIndex, s);
+  return s.size();
+}
+
+bool Pronunciation::getPhoneme( int pronIndex, int picIndex , std::string &phoneme )
+{
+  std::string s;
+  getPron(pronIndex, s);
+  phoneme= s.at(picIndex);
+  return true;
+}
+
+
+bool Pronunciation::getPIC( int pronIndex, int picIndex, std::string &pic )
+{
+  std::string pron;
+  char lphon;
+  char cphon;
+  char rphon;
+
+  getPron( pronIndex, pron );
+  int numPhonemes = pron.size();
+  if ( 1==numPhonemes ) {
+    lphon=GENERIC_CONTEXT;
+    rphon=GENERIC_CONTEXT;
+    cphon = pron.at(0);
+  }
+  else
+    {
+      if ( 0==picIndex ) {
+	lphon=GENERIC_CONTEXT;
+	rphon=GENERIC_CONTEXT;
+      }
+      else if( numPhonemes-1==picIndex ) {
+	lphon = pron.at(picIndex-1);
+	rphon=GENERIC_CONTEXT;
+      }
+      else {
+	lphon = pron.at(picIndex-1);
+	rphon = pron.at(picIndex+1);
+      }
+      cphon = pron.at(picIndex);
+      pic = lphon + cphon + rphon;
+    }
+  return true;
+}
+
+int Pronunciation::lookupModelIDs( AcousticModel &acoustic )
+{
+  // Looks up all hmms for all prons
+  std::string pron;
+  char lphon;
+  char cphon;
+  char rphon;
+
+  int numProns = getPronCount();
+  int totalCount=0;
+  for (int ii=0;ii < numProns; ii++ )
+    {
+      getPron( ii, pron );
+      std::vector<int> idList; // Create storage
+      int numPhonemes = getPhonemeCount(ii);
+      if (1==numPhonemes) {
+	lphon=GENERIC_CONTEXT;
+	rphon=GENERIC_CONTEXT;
+	cphon = pron.at(0);
+      }
+      else
+      for ( int jj=0;jj<numPhonemes;jj++ )
+	{
+	  std::string pic;
+	  getPIC(ii, jj, pic);
+	  lphon = pron.at(0);
+	  cphon = pron.at(1);
+	  rphon = pron.at(2);
+	  int id = CA_ArbdataGetModelIdsForPIC( acoustic.getCAModelHandle(), lphon, cphon,  rphon );
+#if DEBUG
+	  std::cout <<"DEBUG model id: " << lphon <<cphon << rphon << "  "<< id << std::endl;
+#endif
+
+	  idList.push_back(id);
+	}
+      m_ModelIDs.push_back(idList);
+      totalCount+=numPhonemes;
+    }
+  return totalCount;
+}
+
+int Pronunciation::getModelCount( int pronIndex )
+{
+  return m_ModelIDs[pronIndex].size();
+}
+
+int Pronunciation::getModelID( int pronIndex, int modelPos )
+{
+  return m_ModelIDs[pronIndex][modelPos];
+}
+
+AcousticModel::AcousticModel( std::string & arbFileName )
+{
+  m_CA_Arbdata = CA_LoadArbdata( arbFileName.c_str() );
+  if (!m_CA_Arbdata)
+    {
+      std::cout << "Error: while trying to load " << arbFileName.c_str() << std::endl;
+      exit (-1);
+    }
+
+}
+
+AcousticModel::~AcousticModel()
+{
+  CA_FreeArbdata( m_CA_Arbdata);
+}
+
+int AcousticModel::getStateIndices(int id, std::vector<int> & stateIDs)
+{
+  srec_arbdata *allotree = (srec_arbdata*) m_CA_Arbdata;
+  int numStates = allotree->hmm_infos[id].num_states;
+#if DEBUG
+  std::cout << "getStateIndices: count = " << numStates <<std::endl;
+#endif
+  for (int ii=0; ii <numStates; ii++ ) {
+    stateIDs.push_back( allotree->hmm_infos[id].state_indices[ii] );
+#if DEBUG
+    std::cout <<  allotree->hmm_infos[id].state_indices[ii] ;
+#endif
+  }
+#if DEBUG
+  std::cout << std::endl;
+#endif
+    return stateIDs.size();
+}
+
diff --git a/tools/grxmlcompile/vocab.h b/tools/grxmlcompile/vocab.h
new file mode 100644
index 0000000..e526045
--- /dev/null
+++ b/tools/grxmlcompile/vocab.h
@@ -0,0 +1,100 @@
+/*---------------------------------------------------------------------------*
+ *  vocab.h                                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+/** FILE:	        vocab.h
+**  DATE MODIFIED:	31-Aug-07
+**  DESCRIPTION:	Container class for Nuance Vocabulary access
+**
+**			All rights reserved
+*/
+
+#ifndef __vocab_h__
+#define  __vocab_h__
+
+#include <vector>
+#include <string>
+#include "SR_Session.h"
+#include "SR_Vocabulary.h"
+
+//#include "srec_arb.h"
+
+#include "simapi.h"
+
+
+#define GENERIC_CONTEXT '_'
+#define SILENCE_CONTEXT '#'
+#define INTRA_SILENCE_CONTEXT '&'
+
+class Vocabulary
+{
+ public:
+    Vocabulary();
+    Vocabulary( std::string const & vocFileName );
+    ~Vocabulary();
+    SR_Vocabulary *getSRVocabularyHandle() { return m_hVocab; }
+ private:
+    SR_Vocabulary *m_hVocab;
+};
+
+
+class AcousticModel
+{
+    public:
+        AcousticModel( std::string & arbFileName );
+        ~AcousticModel();
+        CA_Arbdata *getCAModelHandle() {return m_CA_Arbdata; }
+        int getStateIndices(int id, std::vector<int> & stateIDs);
+    private:
+        CA_Arbdata* m_CA_Arbdata;
+};
+
+
+class Pronunciation
+{
+    public:
+        typedef enum PelPosition {LEFT, RIGHT, MIDDLE};
+        Pronunciation();
+        //    Pronunciation( Vocabulary & vocab );
+        int lookup( Vocabulary & vocab, std::string  & phrase );
+        ~Pronunciation();
+        int addPron( std::string & s );
+        int getPronCount(); // returns number of prons
+        bool getPron( int index, std::string &s );
+        void clear();
+        void print();
+        void printModelIDs();
+        int getPhonemeCount( int pronIndex );
+        bool getPhoneme( int pronIndex, int picIndex , std::string &phoneme );
+        int lookupModelIDs( AcousticModel &acoustic );
+        int getModelCount( int pronIndex ); //
+        int getModelID( int pronIndex, int modelPos );
+        bool getPIC( int pronIndex, int picIndex, std::string &pic );
+
+    private:
+        Vocabulary *m_pVocab;
+
+        std::string m_Phrase;
+        std::vector<std::string> m_Prons;
+        std::vector< std::vector<int> > m_ModelIDs;
+};
+
+#endif // __vocab_h__
+
+
diff --git a/tools/make_cfst/Android.mk b/tools/make_cfst/Android.mk
new file mode 100644
index 0000000..21d143a
--- /dev/null
+++ b/tools/make_cfst/Android.mk
@@ -0,0 +1,50 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	make_cfst.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/tools/thirdparty/OpenFst \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_Core \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_EventLog \
+	libSR_G2P \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Recognizer \
+	libSR_Semproc \
+	libSR_Session \
+	libSR_Vocabulary \
+	libfst \
+
+LOCAL_LDLIBS := \
+	-lm \
+	-lpthread \
+	-ldl \
+
+LOCAL_MODULE:= make_cfst
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/make_cfst/make_cfst.cpp b/tools/make_cfst/make_cfst.cpp
new file mode 100644
index 0000000..17fb53a
--- /dev/null
+++ b/tools/make_cfst/make_cfst.cpp
@@ -0,0 +1,272 @@
+/*---------------------------------------------------------------------------*
+ *  make_cfst.cpp                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "ptypes.h"
+#include "srec_arb.h"
+#include "simapi.h"
+
+#include "fst/lib/fstlib.h"
+#include "fst/lib/fst-decl.h"
+#include "fst/lib/vector-fst.h"
+#include "fst/lib/arcsort.h"
+#include "fst/lib/invert.h"
+#include "fst/lib/rmepsilon.h"
+
+#define MAX_LINE_LENGTH     256
+#define MAX_PRONS_LENGTH 1024
+#define EPSILON_LABEL 0
+#define MAX_MODELS 1024
+#define MAXPHID 8888
+#define MAX_PHONEMES 128
+
+using namespace fst;
+
+int usage(const char* prog)
+{
+  printf("usage: %s  -phones models/phones.map -models models/models128x.map -cfst models/generic.C -swiarb models/generic.swiarb\n", prog);
+  return 1;
+}
+
+typedef struct Minifst_t
+{
+  char lcontexts[MAX_PHONEMES];
+  char rcontexts[MAX_PHONEMES];
+  int modelId;
+  int stateSt;
+  int stateEn;
+  phonemeID phonemeId;
+  unsigned char phonemeCode;
+  int lcontext_state[MAX_PHONEMES];
+  int rcontext_state[MAX_PHONEMES];
+} Minifst;
+
+int main(int argc, char **argv)
+{
+  char* cfstFilename = 0;
+  char* swiarbFilename = 0;
+  char* phonesMap;
+  char* modelsMap;
+  int i;
+  phonemeID lphonId, cphonId, rphonId;
+  unsigned char cphon;
+  modelID modelId, max_modelId = 0;
+  int stateSt, stateEn;
+  int stateN, stateNp1;
+  int rc;
+  Minifst minifst[MAX_MODELS];
+  int do_show_text = 1;
+  int do_until_step = 99;
+
+  /* initial memory */
+  rc = PMemInit();
+  ASSERT( rc == ESR_SUCCESS);
+
+  // A vector FST is a general mutable FST
+  fst::StdVectorFst myCfst;
+  // fst::Fst<fst::StdArc> myCfst;
+
+  if(argc <= 1) 
+    return usage(argv[0]);
+
+  for(i=1; i<argc; i++)
+  {
+    if(0) ;
+    else if(!strcmp(argv[i],"-phones"))
+      phonesMap = argv[++i];
+    else if(!strcmp(argv[i],"-models"))
+      modelsMap = argv[++i];
+    else if(!strcmp(argv[i],"-cfst"))
+      cfstFilename = argv[++i];
+    else if(!strcmp(argv[i],"-step"))
+      do_until_step = atoi(argv[++i]);
+    else if(!strcmp(argv[i],"-swiarb"))
+      swiarbFilename = argv[++i];
+    else {
+      return usage(argv[0]);
+    }
+  }
+
+  printf("loading %s ...\n", swiarbFilename);
+  CA_Arbdata* ca_arbdata = CA_LoadArbdata(swiarbFilename);
+  srec_arbdata *allotree = (srec_arbdata*)ca_arbdata;
+
+
+  /*-------------------------------------------------------------------------
+   *
+   *       /---<---<---<---<---<---<---\
+   *      /                             \
+   *     /       -wb--         -wb-      \
+   *    /        \   /         \  /       \
+   *   0 ---#--->  n ----M---> n+1 ---#---> 1
+   *
+   *
+   *
+   *
+   *-------------------------------------------------------------------------
+   */
+
+  // Adds state 0 to the initially empty FST and make it the start state.
+  stateSt = myCfst.AddState();   // 1st state will be state 0 (returned by AddState)
+  stateEn = myCfst.AddState();
+  myCfst.SetStart(stateSt);  // arg is state ID
+  myCfst.SetFinal(stateEn, 0.0);  // 1st arg is state ID, 2nd arg weight
+  myCfst.AddArc(stateEn, fst::StdArc(EPSILON_LABEL, EPSILON_LABEL, 0.0, stateSt));
+
+  phonemeID silencePhonId = 0;
+  modelID silenceModelId = 0;
+  silenceModelId = (modelID)get_modelid_for_pic(allotree, silencePhonId, silencePhonId, silencePhonId);
+  // silenceModelId += MODEL_LABEL_OFFSET; #define MODEL_LABEL_OFFSET 128 
+
+  for(modelId=0; modelId<MAX_MODELS; modelId++) {
+    minifst[modelId].modelId = MAXmodelID;
+    minifst[modelId].stateSt = minifst[modelId].stateEn = 0;
+    minifst[modelId].phonemeId = MAXphonemeID;
+    minifst[modelId].phonemeCode = 0;
+    for(i=0;i<MAX_PHONEMES;i++) {
+      minifst[modelId].lcontexts[i] = minifst[modelId].rcontexts[i] = 0;
+      minifst[modelId].lcontext_state[i] = minifst[modelId].rcontext_state[i] = 0;
+    }
+  }
+
+  for(cphonId=0; cphonId<allotree->num_phonemes && cphonId<MAXPHID; cphonId++) {
+    cphon = allotree->pdata[cphonId].code;
+    printf("processing phoneme %d of %d %d %c\n", cphonId, allotree->num_phonemes, cphon, cphon);
+    
+    for(lphonId=0; lphonId<allotree->num_phonemes && lphonId<MAXPHID; lphonId++) {
+      unsigned char lphon = allotree->pdata[lphonId].code;
+      for(rphonId=0; rphonId<allotree->num_phonemes && rphonId<MAXPHID; rphonId++) {
+	unsigned char rphon = allotree->pdata[rphonId].code;
+	if( 1|| cphon=='a') { //22222
+	  modelId = (modelID)get_modelid_for_pic(allotree, lphonId, cphonId, rphonId);
+	} else {
+	  modelId = (modelID)get_modelid_for_pic(allotree, 0, cphonId, 0);
+	}
+	if(modelId == MAXmodelID) {
+	  printf("error while get_modelid_for_pic( %x, %d, %d, %d)\n",
+		 (int)allotree, lphonId, cphonId, rphonId);
+	  continue;
+	} else 
+	  if(do_show_text) printf("%c %c %c hmm%03d_%c %d %d %d\n", lphon, cphon, rphon, modelId, cphon, lphonId, cphonId, rphonId);
+	ASSERT(modelId < MAX_MODELS);
+	minifst[ modelId].phonemeId = cphonId;
+	minifst[ modelId].phonemeCode = cphon;
+	minifst[ modelId].modelId = modelId;
+	minifst[ modelId].lcontexts[lphonId] = 1;
+	minifst[ modelId].rcontexts[rphonId] = 1;
+	if(modelId>max_modelId) max_modelId = modelId;
+      }
+    }
+  }
+
+  printf("adding model arcs .. max_modelId %d\n",max_modelId);
+  for(modelId=0; modelId<=max_modelId; modelId++) {
+    if( minifst[modelId].modelId == MAXmodelID) continue;
+    cphon = minifst[modelId].phonemeCode;
+    minifst[modelId].stateSt = (stateN = myCfst.AddState());
+    minifst[modelId].stateEn = (stateNp1 = myCfst.AddState()); /* n plus 1 */
+    myCfst.AddArc( stateN, fst::StdArc(cphon,modelId,0.0,stateNp1));
+    myCfst.AddArc( stateNp1, fst::StdArc(WORD_BOUNDARY,WORD_BOUNDARY,0.0,stateNp1));
+
+    if(do_show_text) printf("%d\t\%d\t%c\t\%d\n", stateN,stateNp1,cphon,modelId);
+#if 1
+    for( lphonId=0; lphonId<allotree->num_phonemes; lphonId++) {
+      minifst[modelId].lcontext_state[lphonId] = myCfst.AddState();
+      myCfst.AddArc( minifst[modelId].lcontext_state[lphonId],
+		  fst::StdArc(EPSILON_LABEL,EPSILON_LABEL,0.0,
+			      minifst[modelId].stateSt));
+			      
+    }
+    for( rphonId=0; rphonId<allotree->num_phonemes; rphonId++) {
+      minifst[modelId].rcontext_state[rphonId] = myCfst.AddState();
+      myCfst.AddArc( minifst[modelId].stateEn, 
+		  fst::StdArc(EPSILON_LABEL,EPSILON_LABEL,0.0,
+			      minifst[modelId].rcontext_state[rphonId]));
+    }
+#endif
+  }
+#if 1
+  printf("adding cross-connections\n");
+  for( modelId=0; modelId<=max_modelId; modelId++) {
+    printf("processing model %d\n", modelId);
+    if( minifst[modelId].modelId == MAXmodelID) continue;
+    cphonId = minifst[modelId].phonemeId;
+    for( modelID mId=0; mId<=max_modelId; mId++) {
+      if( minifst[mId].modelId != MAXmodelID &&
+	  // minifst[mId].phonemeId == rphonId &&
+	  minifst[modelId].rcontexts[ minifst[mId].phonemeId] == 1 &&
+	  minifst[mId].lcontexts[ cphonId] == 1) {
+	myCfst.AddArc( minifst[modelId].stateEn,
+		    fst::StdArc(EPSILON_LABEL,EPSILON_LABEL,0.0,
+				minifst[mId].stateSt));
+      }
+    }
+  }
+  /* start node connections */
+  myCfst.AddArc( stateSt,
+	      fst::StdArc(EPSILON_LABEL, EPSILON_LABEL, 0.0,
+			  minifst[silenceModelId].stateSt));
+  myCfst.AddArc(  minifst[silenceModelId].stateEn,
+	      fst::StdArc(EPSILON_LABEL, EPSILON_LABEL, 0.0, stateEn));
+#endif
+  
+  fst::StdVectorFst fst2;
+  fst::StdVectorFst* ofst = &myCfst;
+  if(do_until_step>0) {
+    printf("invert\n");
+    fst::Invert(&myCfst);
+    bool FLAGS_connect = true;
+    if(do_until_step>1) {
+      printf("rmepsilon\n");
+      fst::RmEpsilon( &myCfst, FLAGS_connect);
+      if(do_until_step>2) {
+	printf("determinize\n");
+	fst::Determinize(myCfst, &fst2);
+	ofst = &fst2;
+	if(do_until_step>3) {
+	  printf("arcsort olabels\n");
+	  fst::ArcSort(&fst2, fst::StdOLabelCompare());
+	}
+      }
+    }
+  }
+
+#if 0
+  for(fst::SymbolTableIterator syms_iter( *syms); !syms_iter.Done(); syms_iter.Next() ) {
+    int value = (int)syms_iter.Value();
+    const char* key = syms_iter.Symbol();
+  } 
+#endif
+  
+  printf("writing output file %s\n", cfstFilename);
+  
+  // We can save this FST to a file with: 
+  /* fail compilation if char and LCHAR aren't the same! */
+
+  { char zzz[ 1 - (sizeof(LCHAR)!=sizeof(char))]; zzz[0] = 0; } 
+  ofst->Write((const char*)cfstFilename);
+
+  CA_FreeArbdata( ca_arbdata);
+
+  PMemShutdown();
+
+  //  CLEANUP:
+  return (int)rc;
+}
+
+
diff --git a/tools/make_g2g/Android.mk b/tools/make_g2g/Android.mk
new file mode 100644
index 0000000..9c7ad83
--- /dev/null
+++ b/tools/make_g2g/Android.mk
@@ -0,0 +1,45 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	make_g2g.c \
+
+LOCAL_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/clib \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_Core \
+	libSR_EventLog \
+	libSR_G2P \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Recognizer \
+	libSR_Semproc \
+	libSR_Session \
+	libSR_Vocabulary \
+	
+LOCAL_MODULE:= make_g2g
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/make_g2g/make_g2g.c b/tools/make_g2g/make_g2g.c
new file mode 100644
index 0000000..8795c00
--- /dev/null
+++ b/tools/make_g2g/make_g2g.c
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------------*
+ *  make_g2g.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+
+#include "pstdio.h"
+#include "pmemory.h"
+#include "plog.h"
+#include "PFile.h"
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+
+#include "SR_Grammar.h"
+#include "ESR_CommandLine.h"
+#include "ESR_Session.h"
+#include "LCHAR.h"
+#include "srec_context.h"
+
+#define MAX_LINE_LENGTH 256
+#define MAX_STR_LENGTH   80
+#define MAX_SEM_RESULTS   3
+#define MAX_KEYS         30
+
+static void usage(LCHAR* exename)
+{
+  LFPRINTF(stdout,"usage: %s -base <base grammar filename> [-out <output file>] \n",exename);
+}
+
+int main (int argc, char *argv[])
+{
+  SR_Grammar* grammar = NULL;
+  ESR_ReturnCode rc;
+  LCHAR base[P_PATH_MAX];
+  LCHAR* p;
+  LCHAR outFilename[P_PATH_MAX];
+  size_t len;
+
+	/*
+	 * Initialize portable library.
+	 * Can't use CHKLOG() before plogInit, so use non-portable methods instead.
+	 */
+  CHKLOG(rc, PMemInit());
+/*  CHKLOG(rc, PFileSystemCreate());
+  CHKLOG(rc, PANSIFileSystemCreate());
+  CHKLOG(rc, PANSIFileSystemAddPath(L("/dev/ansi/"), L("/")));*/
+  CHKLOG(rc, PLogInit(NULL, 3));
+  
+  /* Set ANSI file-system as default file-system */
+/*  CHKLOG(rc, PANSIFileSystemSetDefault(ESR_TRUE));*/
+  /* Set virtual current working directory to native current working directory */
+/*  len = P_PATH_MAX;
+  CHKLOG(rc, PANSIFileSystemGetcwd(cwd, &len));
+  CHKLOG(rc, PFileSystemChdir(cwd));*/
+  
+  len = P_PATH_MAX;
+  rc = ESR_CommandLineGetValue(argc, (const char **)argv, L("base"), base, &len);
+  if (rc==ESR_NO_MATCH_ERROR)
+    {
+    LFPRINTF(stderr, "ERROR: Mandatory option -base is unspecified\n");
+    return ESR_INVALID_ARGUMENT;
+  }
+  else if (rc!=ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+  len = P_PATH_MAX;
+  rc = ESR_CommandLineGetValue(argc, (const char **)argv, L("out"), outFilename, &len);
+  if (rc==ESR_NO_MATCH_ERROR)
+    {
+      LFPRINTF(stderr, "ERROR: Mandatory option -out is unspecified\n");
+      return ESR_INVALID_ARGUMENT;
+    }
+  else if (rc!=ESR_SUCCESS)
+    {
+      PLogError(ESR_rc2str(rc));
+      goto CLEANUP;
+    }
+
+  if (base==NULL || (LSTRCMP(outFilename, L(""))==0 ))
+    {
+      usage(argv[0]);
+      exit(EXIT_FAILURE);
+    }
+  
+  /* setup the default outfilename if not already set */
+  if (!outFilename[0])
+    {
+      LSTRCPY(outFilename,base);
+      /* get rid of the ',addWords=2000' grammar load param */
+      p = LSTRCHR(outFilename,L(','));
+      if(p) *p = 0;
+      LSTRCAT(outFilename,L(".g2g"));
+    }
+  
+  LFPRINTF(stdout,"Loading grammar %s from text files...\n",base);
+  CHKLOG(rc, SR_GrammarLoad(base, &grammar));
+
+  LFPRINTF(stdout,"Saving grammar as binary image %s...\n",outFilename);
+  CHKLOG(rc, SR_GrammarSave(grammar, outFilename));
+
+  LFPRINTF(stdout,"SUCCESS!\n");
+
+CLEANUP:
+ 
+  if (grammar)
+		grammar->destroy(grammar);
+  PLogShutdown();
+/*	PANSIFileSystemDestroy();
+	PFileSystemDestroy();*/
+  PMemShutdown();
+  return rc;
+}
diff --git a/tools/make_ve_grammar/Android.mk b/tools/make_ve_grammar/Android.mk
new file mode 100644
index 0000000..dd99239
--- /dev/null
+++ b/tools/make_ve_grammar/Android.mk
@@ -0,0 +1,41 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	make_ve_grammar.c \
+
+LOCAL_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_Core \
+	libSR_EventLog \
+	libSR_G2P \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Recognizer \
+	libSR_Semproc \
+	libSR_Session \
+	libSR_Vocabulary \
+	
+LOCAL_MODULE:= make_ve_grammar
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/make_ve_grammar/make_ve_grammar.c b/tools/make_ve_grammar/make_ve_grammar.c
new file mode 100644
index 0000000..1d9fdab
--- /dev/null
+++ b/tools/make_ve_grammar/make_ve_grammar.c
@@ -0,0 +1,269 @@
+/*---------------------------------------------------------------------------*
+ *  make_ve_grammar.c                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "plog.h"
+#include "passert.h"
+#include "duk_args.h"
+#include "duk_err.h"
+#include "ptrd.h"
+
+#include "srec_arb.h"
+#include "simapi.h"
+
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+
+#define MAX_FILE_NAME_LEN 64
+#define DEFAULT_WWTRIPHONE_SILMODE 3
+
+
+/* check if the central phoneme is a word-specific phoneme; if so, do not enroll it into the ve grammar.*/
+int ws_verify(char * allo_phoneme){
+  switch(allo_phoneme[0]){
+  case '(': return 1;
+  case '.': return 1;
+  case '0': return 1;
+  case '1': return 1;
+  case '2': return 1;
+  case '3': return 1;
+  case '4': return 1;
+  case '5': return 1;
+  case '7': return 1;
+  case '8': return 1;
+  case '9': return 1;
+  case '=': return 1;
+  case '>': return 1;
+  case 'B': return 1;
+  case 'F': return 1;
+  case 'G': return 1;
+  case 'H': return 1;
+  case 'K': return 1;
+  case 'M': return 1;
+  case 'Q': return 1;
+  case 'R': return 1;
+  case 'W': return 1;
+  case 'X': return 1;
+  case 'Y': return 1;
+  case '[': return 1;
+  case '\\': return 1;
+  case '|': return 1;
+  case '+': return 1;
+  default: return 0;
+  }
+}
+
+int main (int argc, char **argv)
+{
+	int i;
+	char filen[MAX_FILE_NAME_LEN]="";
+	CA_Arbdata *ca_arbdata = NULL;     /* new, link btw acc/syn */
+	char *arbfile = NULL;
+	char *base = NULL;
+
+	FILE* pfile;
+	FILE* pFile_PCLG;
+	FILE* pFile_map;
+	FILE* pFile_P;
+        FILE* pFile_Grev;
+	FILE* pFile_script;
+
+	int num_hmms;
+	int num_wd = 0;
+	int script_line = 0;
+	int cflag = 0, fnode = 0;
+	int sil_model = DEFAULT_WWTRIPHONE_SILMODE;
+	int rc;
+	srec_arbdata *allotree = NULL;
+	 
+	nodeID startNode       = 0;
+	nodeID pauEndNode      = 1;
+	nodeID modelStartNode  = 2;
+	nodeID modelEndNode    = 3;
+	nodeID pau2StartNode   = 4;
+	nodeID pau2EndNode     = 5;
+	nodeID endNode         = 6;
+
+	/* initial memory */
+	CHKLOG(rc, PMemInit());
+
+	if(argc<5){
+	  printf("USAGE: -swiarb <swiarb file> -base <output base name>\n");
+	  exit(1);
+	}
+
+
+	for(i=1; i<argc; i++) {
+	  if(!strcmp(argv[i],"-swiarb")) {
+	    arbfile = argv[++i];
+	    printf("using swiarb from file %s\n", arbfile);
+	  }
+	  else if(!strcmp(argv[i],"-base")){
+	    base = argv[++i];
+	  }
+	  else {
+	    printf("error_usage: argument [%s]\n", argv[i]);
+	    exit(1);
+	  }
+	}
+    	
+	/* check arb file exist*/
+	if ( (pfile = fopen(arbfile, "r")) != NULL ){
+	    fclose(pfile);
+	}
+	else{
+	  printf("ERROR: the specified swiarb file does not exist.\n");
+	  exit(1);
+	}
+
+	
+	ca_arbdata = CA_LoadArbdata(arbfile);
+  
+	allotree = (srec_arbdata*)ca_arbdata;
+	num_hmms = allotree->num_hmms;
+
+
+	/* Dump out VE .PCLG.txt, .Grev2.det.txt, .P.txt, .script and .map files; .P.txt, .script and .map are not necessary for voice enroll, so just dump out to create .g2g file. Xufang */
+
+	printf("Dumping out VE files\n");
+
+	strcat(filen,base);
+	strcat(filen,".PCLG.txt");
+	pFile_PCLG = fopen(filen,"w");
+
+	filen[0]='\0';
+	strcat(filen,base);
+	strcat(filen,".map");
+        pFile_map = fopen(filen,"w");
+
+        filen[0]='\0';
+        strcat(filen,base);
+        strcat(filen,".P.txt");
+        pFile_P = fopen(filen,"w");
+
+        filen[0]='\0';
+        strcat(filen,base);
+        strcat(filen,".Grev2.det.txt");
+        pFile_Grev = fopen(filen,"w");
+
+        filen[0]='\0';
+        strcat(filen,base);
+        strcat(filen,".script");
+        pFile_script = fopen(filen,"w");
+
+        fprintf(pFile_Grev,"0\t1\teps\t80\n");
+        fprintf(pFile_Grev,"1\t2\t%s.grxml@VE_Words\n",base);
+
+	fprintf(pFile_map,"eps %d\n",num_wd++);
+        fprintf(pFile_map,"%s.grxml@ROOT %d\n",base,num_wd++);
+        fprintf(pFile_map,"%s.grxml@VE_Words %d\n",base,num_wd++);
+        fprintf(pFile_map,"-pau- %d\n",num_wd++);
+        fprintf(pFile_map,"-pau2- %d\n",num_wd++);
+        fprintf(pFile_map,"@VE_Words %d\n",num_wd++);
+
+        fprintf(pFile_P,"0\t1\teps\t{\t\n");
+        fprintf(pFile_P,"1\t2\teps\t{\t\n");
+        fprintf(pFile_P,"2\t3\teps\t{\t\n");
+        fprintf(pFile_P,"2\t4\teps\t{\t\n");
+        fprintf(pFile_P,"3\t5\t%s.grxml@VE_Words\t%s.grxml@VE_Words\t\n",base,base);
+        fprintf(pFile_P,"4\t8\teps\t{\t\n");
+        fprintf(pFile_P,"5\t6\teps\t_3\t\n");
+        fprintf(pFile_P,"6\t7\teps\tVE_Words}\t\n");
+        fprintf(pFile_P,"7\t9\teps\t_2\t\n");
+
+        fprintf(pFile_script,"%d type=SENT.type;meaning=SENT.V;\n",script_line++);
+        fprintf(pFile_script,"%d type='NEW';V=UTT.V;\n",script_line++);
+        fprintf(pFile_script,"%d type='OLD';V=VE_Words.V;\n",script_line++);
+	fprintf(pFile_script,"%d V=UTT.V?UTT.V:'--';\n",script_line++);
+        fprintf(pFile_script,"%d V=PHONEME.V\n",script_line++);
+
+	for(i=0;i<num_hmms;i++){
+	  if(ws_verify(allotree->hmm_infos[i].name))
+	    continue;
+	  if(!strcmp(allotree->hmm_infos[i].name,"#")){
+	    sil_model = i;
+	    fprintf(pFile_PCLG,"%d\t%d\thmm%d_#sil#\t-pau-\n", startNode, pauEndNode, i);
+            fprintf(pFile_PCLG,"%d\t%d\t.wb\teps\n", pauEndNode, modelStartNode);
+          }
+          else{
+            if(strlen(allotree->hmm_infos[i].name)>0){
+	      if(cflag==0){
+		fnode = i;
+		cflag = 1;
+	      }
+              fprintf(pFile_PCLG,"%d\t%d\thmm%d_%s\twd_hmm%d_%s\t40\n", modelStartNode, modelEndNode, 
+		      i,allotree->hmm_infos[i].name,i,allotree->hmm_infos[i].name);
+	      fprintf(pFile_map,"wd_hmm%d_%s %d\n",i,allotree->hmm_infos[i].name,num_wd++);
+	      fprintf(pFile_Grev,"1\t3\twd_hmm%d_%s\n",i,allotree->hmm_infos[i].name);
+	      fprintf(pFile_P,"8\t10\twd_hmm%d_%s\t_%d\t\n",i,allotree->hmm_infos[i].name,script_line);
+	      fprintf(pFile_script,"%d V=V?V:'';V=V+'wd_hmm%d_%s';\n",script_line++,i,allotree->hmm_infos[i].name);
+	    }
+          }
+	}
+
+        fprintf(pFile_PCLG,"%d\t%d\t.wb\teps\n", modelEndNode, modelStartNode);
+        fprintf(pFile_PCLG,"%d\t%d\t.wb\teps\n", modelEndNode, pau2StartNode);
+        fprintf(pFile_PCLG,"%d\t%d\thmm%d_#sil#\t-pau2-\n",pau2StartNode, pau2EndNode, sil_model);
+        fprintf(pFile_PCLG,"%d\t%d\t.wb\teps\n", pau2EndNode, endNode);
+        fprintf(pFile_PCLG,"%d\n", endNode);
+
+        fprintf(pFile_Grev,"2\n");
+	for(i=fnode;i<num_hmms;i++){
+          if(ws_verify(allotree->hmm_infos[i].name))
+            continue;	  
+	  fprintf(pFile_Grev,"3\t3\twd_hmm%d_%s\t40\n",i,allotree->hmm_infos[i].name);
+	}
+        fprintf(pFile_Grev,"3\n");
+
+        fprintf(pFile_P,"9\t11\teps\tSENT}\t\n");
+        fprintf(pFile_P,"10\t12\teps\tPHONEME}\t\n");
+        fprintf(pFile_P,"11\t13\teps\t_0\t\n");
+        fprintf(pFile_P,"12\t14\teps\t_4\t\n");
+        fprintf(pFile_P,"13\t15\teps\tROOT}\t\n");
+        fprintf(pFile_P,"14\t16\teps\teps\t\n");
+        fprintf(pFile_P,"15\t\n");
+        fprintf(pFile_P,"16\t17\teps\tUTT}\t\n");
+        fprintf(pFile_P,"16\t8\teps\t{\t\n");
+        fprintf(pFile_P,"17\t9\teps\t_1\t\n");
+
+	fclose(pFile_PCLG);
+	printf("Creating %s.PCLG.txt...\n",base);
+        fclose(pFile_Grev);
+        printf("Creating %s.Grev2.det.txt...\n",base);
+        fclose(pFile_map);
+	printf("Creating %s.map...\n",base);
+        fclose(pFile_P);
+	printf("Creating %s.P.txt...\n",base);
+	fclose(pFile_script);
+	printf("Creating %s.script...\n",base);
+	printf("SUCCESS!\n");
+
+
+  CA_FreeArbdata( ca_arbdata);
+	
+  PMemShutdown();
+  return 0;
+CLEANUP:
+  return 1;
+}
+
diff --git a/tools/parseStringTest/Android.mk b/tools/parseStringTest/Android.mk
new file mode 100644
index 0000000..5f33459
--- /dev/null
+++ b/tools/parseStringTest/Android.mk
@@ -0,0 +1,45 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	parseStringTest.c \
+
+LOCAL_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_Core \
+	libSR_EventLog \
+	libSR_G2P \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Semproc \
+	libSR_Session \
+	libSR_Vocabulary \
+	
+LOCAL_MODULE:= parseStringTest
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/parseStringTest/parseStringTest.c b/tools/parseStringTest/parseStringTest.c
new file mode 100644
index 0000000..42946f8
--- /dev/null
+++ b/tools/parseStringTest/parseStringTest.c
@@ -0,0 +1,647 @@
+/*---------------------------------------------------------------------------*
+ *  parseStringTest.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "pstdio.h"
+#include "pmemory.h"
+#include "plog.h"
+
+
+#include "HashMap.h"
+#include "SR_Grammar.h"
+#include "SR_SemanticResult.h"
+#include "ESR_Session.h"
+#include "ESR_Locale.h"
+#include "LCHAR.h"
+
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+
+/* for testing RecognizerImpl.c, see below */
+#include"buildopt.h"
+#include"setting.h"
+#include"srec_sizes.h"
+#include"SR_GrammarImpl.h"
+
+/* defines */
+#define MAX_LINE_LENGTH 256
+#define MAX_STR_LENGTH  512
+#define MAX_SEM_RESULTS   3
+#define MAX_KEYS         30
+
+/* protos */
+ESR_ReturnCode process_single_key_line(SR_Grammar* grammar, PFile* fin, PFile* fout);
+ESR_ReturnCode process_multi_key_line(SR_Grammar* grammar, const LCHAR* rootrule, PFile* fin, PFile* fout);
+
+/* struct */
+typedef struct Opts
+{
+  int use_parse_by_string_ids;
+  int do_check_all_ids;
+}
+Opts;
+
+int usage(LCHAR* exename)
+{
+  pfprintf(PSTDOUT, "usage: %s -base <basefilename> [-in <input file>] [-out <output file>] [-itest <testfilename>]\n", exename);
+  return 1;
+}
+
+void lstr_strip_multiple_spaces(LCHAR* trans)
+{
+  char *src=trans, *dst=trans;
+  for( ;(*dst = *src)!=L('\0'); src++) {
+    if(*dst != ' ') dst++;
+    else if(src[1] != ' ') dst++;
+  }
+}
+
+/**
+ * Display the Semantic Result
+ */
+void display_results(SR_SemanticResult *result, PFile* fout)
+{
+  size_t i, size, len;
+  LCHAR* keys[MAX_KEYS]; /* array of pointers to strings */
+  LCHAR  value[MAX_STR_LENGTH];
+  ESR_ReturnCode rc;
+  
+  size = MAX_KEYS;
+  rc = result->getKeyList(result, (LCHAR**) & keys, &size); /* get the key list */
+  if (rc == ESR_SUCCESS)
+  {
+    for (i = 0; i < size; i++)
+    {
+      len = MAX_STR_LENGTH;
+      if ((rc = result->getValue(result, keys[i], value, &len)) == ESR_SUCCESS)
+        pfprintf(fout, "{%s : %s}\n", keys[i], value);
+      else
+        pfprintf(fout, "Error: %s\n", ESR_rc2str(rc));
+    }
+    pfprintf(fout, "--Done--\n");
+  }
+  else
+    pfprintf(fout, "Error: %s\n", ESR_rc2str(rc));
+}
+
+ESR_ReturnCode Parse(SR_Grammar* grammar, LCHAR* trans, PFile* fout, Opts* opts)
+{
+  ESR_ReturnCode rc = ESR_SUCCESS;
+  size_t i, result_count, key_count;
+  SR_SemanticResult* semanticResults[MAX_SEM_RESULTS];
+  wordID wordIDs[32], *wordIDptr;
+  SR_GrammarImpl* pgrammar = (SR_GrammarImpl*)grammar;
+  wordmap* wmap;
+  
+  if (opts->do_check_all_ids)
+  {
+    wordID id;
+    Opts myopts;
+    memcpy(&myopts, opts, sizeof(myopts));
+    myopts.do_check_all_ids = 0;
+    wmap = pgrammar->syntax->synx->olabels;
+    /* start at word 4 because "eps, -pau- -pau2- @root */
+    for (id = 4; id < wmap->num_words; id++)
+    {
+      trans = wmap->words[id];
+      Parse(grammar, trans, fout, &myopts);
+    }
+    return 0;
+  }
+  
+  result_count = MAX_SEM_RESULTS; /* initially not greater than MAX */
+  for (i = 0; i < result_count; i++)
+    SR_SemanticResultCreate(&semanticResults[i]); /* create the result holders */
+  lstrtrim(trans);
+  /* check for multiple space separators! */
+  lstr_strip_multiple_spaces(trans);
+  
+  if (!opts->use_parse_by_string_ids)
+  {
+    rc = grammar->checkParse(grammar, trans, semanticResults, (size_t*) & result_count);
+  }
+  else
+  {
+    char copy_of_trans[256], *p;
+    strcpy(copy_of_trans, trans);
+    wmap = pgrammar->syntax->synx->olabels;
+    wordIDs[0] = wordIDs[1] = MAXwordID;
+    wordIDptr = &wordIDs[0];
+    for (p = strtok(copy_of_trans, " "); p; p = strtok(NULL, " "))
+    {
+      for (i = 0; i < wmap->num_words; i++)
+        if (!strcmp(wmap->words[i], p))
+        {
+          *wordIDptr++ = (wordID)i;
+          break;
+        }
+      if (i == wmap->num_words)
+      {
+        wordIDs[0] = MAXwordID;
+        break;
+      }
+    }
+    *wordIDptr++ = MAXwordID;
+    
+    /* printf("wordids:");
+       for(wordIDptr=&wordIDs[0]; *wordIDptr!=MAXwordID; wordIDptr++) 
+       printf(" %d/%s", *wordIDptr, wmap->words[*wordIDptr]);
+       printf("\n"); */
+    
+    if (wordIDs[0] == MAXwordID)
+    {
+      result_count = 0;
+      rc = ESR_SUCCESS;
+    }
+    else
+    {
+      rc = pgrammar->semproc->flush(pgrammar->semproc);
+      rc = pgrammar->semproc->setParam(pgrammar->semproc, L("literal"), trans);
+      rc = pgrammar->semproc->checkParseByWordID(pgrammar->semproc, pgrammar->semgraph,
+           wordIDs, semanticResults, &result_count);
+    }
+  }
+  if (rc != ESR_SUCCESS)
+  {
+    pfprintf(fout, "error (%s)\n\n", trans);
+    return rc;
+  }
+  
+  if (result_count < 1)
+  {
+    pfprintf(fout, "no parse (%s)\n\n", trans);
+  }
+  else
+  {
+    key_count = 0xffff;
+    rc = SR_SemanticResultGetKeyCount(semanticResults[0], &key_count);
+    pfprintf(fout, "parse ok (%d results) (%s) (%d)\n", result_count, trans, key_count);
+    for (i = 0; i < result_count; i++)
+      display_results(semanticResults[i], fout);
+      
+    for (i = 0; i < MAX_SEM_RESULTS; i++)
+    {
+      rc = semanticResults[i]->destroy(semanticResults[i]);
+      if (rc != ESR_SUCCESS)
+        return rc;
+    }
+  }
+  return ESR_SUCCESS;
+}
+
+/* tests the transcription against the grammar and then decided based on what was expected of the test
+whether or not is it considered a pass or fail */
+ESR_ReturnCode ParseTestSet(SR_Grammar* grammar, LCHAR* trans, LCHAR* key, LCHAR* ref, LCHAR* result, PFile* fout)
+{
+  size_t len;
+  ESR_ReturnCode rc;
+  int i, result_count;
+  SR_SemanticResult* semanticResults[MAX_SEM_RESULTS];
+  LCHAR  value[MAX_STR_LENGTH];
+  
+  result_count = MAX_SEM_RESULTS;
+  for (i = 0; i < result_count; i++)
+    SR_SemanticResultCreate(&semanticResults[i]);
+    
+  lstrtrim(trans);
+  /* check for multiple space separators! */
+  lstr_strip_multiple_spaces(trans);
+  
+  pfprintf(fout, "checking (%s) ref(%s) res(%s)\n", trans, ref, result);
+  rc = grammar->checkParse(grammar, trans, semanticResults, (size_t*) & result_count);
+  if (rc != ESR_SUCCESS)
+    return rc;
+    
+  /*result file will contain
+  transcription | key | reference | result | PASSESD/FAILED */
+  
+  if (result_count < 1) /*failed to parse, but this could still be a pass if you expected a failure*/
+  {
+    pfprintf(fout, "NO PARSE FOR: %s|%s|%s|  |", trans, key, ref);
+    if (strcmp("FAIL", result) == 0)
+      pfprintf(fout, "PASSED (%s)\n", trans);
+    else
+      pfprintf(fout, "FAILED (%s)\n", trans);
+  }
+  else /*parsed, look at what was expected, what was returned and which of PASS/FAIL is expected */
+  {
+    for (i = 0; i < result_count; i++)
+    {
+      len = MAX_STR_LENGTH;
+      if ((rc = semanticResults[i]->getValue(semanticResults[i], key, value, &len)) == ESR_SUCCESS)
+      {
+        pfprintf(fout, "%s|%s|%s|%s|", trans, key, ref, value);
+        
+        if (strcmp(value, ref) == 0 && strcmp("PASS", result) == 0)
+          pfprintf(fout, "PASSED\n");
+        else
+          pfprintf(fout, "FAILED\n");
+      }
+      else
+      {
+        pfprintf(fout, "ERROR: %s, while checking key='%s'\n", ESR_rc2str(rc), key);
+      }
+    }
+    
+    /*deallocate semantic results*/
+    for (i = 0; i < MAX_SEM_RESULTS; i++)
+    {
+      rc = semanticResults[i]->destroy(semanticResults[i]);
+      if (rc != ESR_SUCCESS)
+        return rc;
+    }
+  }
+  return ESR_SUCCESS;
+}
+
+int main(int argc, char **argv)
+{
+  LCHAR trans[MAX_LINE_LENGTH];
+  SR_Grammar* grammar = NULL;
+  ESR_ReturnCode rc;
+  LCHAR base[P_PATH_MAX] = L("");
+  LCHAR infilename[P_PATH_MAX] = L("");
+  LCHAR inRTfilename[P_PATH_MAX] = L("");
+  LCHAR outfilename[P_PATH_MAX] = L("");
+  PFile *fin = NULL, *fout = NULL;
+  int i;
+  LCHAR *rootrule = L("myRoot"), *p;
+  Opts opts = { 0, 0 };
+  
+  /*
+   * Initialize portable library.
+   */
+  CHKLOG(rc, PMemInit());
+
+  fin = PSTDIN;
+  fout = PSTDOUT;
+  
+  if (argc < 3)
+  {
+    usage(argv[0]);
+    exit(EXIT_FAILURE);
+  }
+  for (i = 1; i < argc; ++i)
+  {
+    if (!LSTRCMP(argv[i], L("-base")))
+    {
+      ++i;
+      LSTRCPY(base, argv[i]);
+    }
+    else if (!LSTRCMP(argv[i], L("-in")))
+    {
+      ++i;
+      LSTRCPY(infilename, argv[i]);
+    }
+    else if (!LSTRCMP(argv[i], L("-out")))
+    {
+      ++i;
+      LSTRCPY(outfilename, argv[i]);
+    }
+    else if (!LSTRCMP(argv[i], L("-itest")))
+    {
+      ++i;
+      LSTRCPY(inRTfilename, argv[i]);
+    }
+    else if (!LSTRCMP(argv[i], L("-ids")))
+    {
+      opts.use_parse_by_string_ids = 1;
+    }
+    else if (!LSTRCMP(argv[i], L("-allids")))
+    {
+      opts.do_check_all_ids = 1;
+      opts.use_parse_by_string_ids = 1;
+    }
+    else
+      return usage(argv[0]);
+  }
+  
+  CHK(rc, PLogInit(NULL, 0));
+    
+  rc = SR_GrammarLoad(base, &grammar);
+  if (rc != ESR_SUCCESS)
+    goto CLEANUP;
+    
+  if (*outfilename)
+  {
+    if ((fout = pfopen(outfilename, "w")) == NULL)
+    {
+      pfprintf(PSTDOUT, "Could not open file: %s\n", outfilename);
+      rc = 1;
+      goto CLEANUP;
+    }
+  }
+  
+  if (opts.do_check_all_ids)
+  {
+    rc = Parse(grammar, NULL, fout, &opts);
+  }
+  else if (*infilename)
+  {
+    if (LSTRCMP(infilename, "-") == 0)
+    {
+      fin = PSTDIN;
+    }
+    else if ((fin = pfopen(infilename, "r")) == NULL)
+    {
+      pfprintf(PSTDOUT, "Could not open file: %s\n", infilename);
+      rc = 1;
+      goto CLEANUP;
+    }
+    for (;;)
+    {
+      if (pfgets(trans, MAX_LINE_LENGTH, fin) == NULL)
+      {
+        if (!pfeof(fin))
+        {
+          rc = ESR_READ_ERROR;
+          PLogError(ESR_rc2str(rc));
+        }
+        break;
+      }
+      if (trans[0] == '#') continue;
+      lstrtrim(trans);
+      /* check for multiple space separators! */
+      lstr_strip_multiple_spaces(trans);
+      pfprintf(fout, "Transcription: %s\n", trans);
+      if ((rc = Parse(grammar, trans, fout, &opts)) != ESR_SUCCESS)
+        goto CLEANUP;
+      pfprintf(fout, "\n");
+    }
+  }
+  else if (*inRTfilename) /*using a test file*/
+  {
+    if ((fin = pfopen(inRTfilename, "r")) == NULL)
+    {
+      pfprintf(PSTDOUT, "Could not open test file: %s\n", inRTfilename);
+      rc = 1;
+      goto CLEANUP;
+    }
+    
+    /*read through the test file parsing it into the variables
+     FORMAT: "the transciption" key "value" 
+    */
+    while (ESR_TRUE)
+    {
+      if (0) rc = process_single_key_line(grammar, fin, fout);
+      else  rc = process_multi_key_line(grammar, rootrule, fin, fout);
+      if (rc == ESR_READ_ERROR)
+      {
+        rc = ESR_SUCCESS;
+        break;
+      }
+    }
+  }
+  else
+  {
+    /* get some transcriptions from the user */
+    pfprintf(PSTDOUT, "\nSemantic Parser Test Program for esr (Nuance Communicaitions, 2007)\n");
+    pfprintf(PSTDOUT, "'qqq' to quit\n");
+    
+    while (ESR_TRUE)
+    {
+      pfprintf(PSTDOUT, "> ");
+
+      if (!fgets(trans, MAX_LINE_LENGTH, PSTDIN))
+        break;
+      // remove trailing whitespace
+      for(p=&trans[0]; *p!=0 && *p!='\n' && *p!='\r'; p++) {}
+      *p=0;
+
+      if (!LSTRCMP("qqq", trans))
+        break;
+      else
+        if ((rc = Parse(grammar, trans, fout, &opts)) != ESR_SUCCESS)
+          goto CLEANUP;
+    }
+  }
+CLEANUP:
+  if (fin && fin != PSTDIN)
+    pfclose(fin);
+  if (fout && fout != PSTDOUT)
+    pfclose(fout);
+  if (grammar) grammar->destroy(grammar);
+  PLogShutdown();
+/*  PANSIFileSystemDestroy();
+  PFileSystemDestroy();*/
+  PMemShutdown();
+  return rc;
+}
+
+ESR_ReturnCode process_single_key_line(SR_Grammar* grammar, PFile* fin, PFile* fout)
+{
+  LCHAR* position;
+  LCHAR line[MAX_LINE_LENGTH];
+  LCHAR trans[MAX_LINE_LENGTH];
+  LCHAR key[MAX_LINE_LENGTH];
+  LCHAR refValue[MAX_LINE_LENGTH];
+  LCHAR result[MAX_LINE_LENGTH];
+  ESR_ReturnCode rc;
+  
+  position = pfgets(line, MAX_LINE_LENGTH, fin);
+  if (line[0] == '#')
+    return ESR_SUCCESS;
+  if (!strncmp(line, "__END__", 7))
+    return ESR_READ_ERROR;
+  if (position == NULL)
+  {
+    if (pfeof(fin))
+      return ESR_READ_ERROR;
+    else
+    {
+      PLogError(L("ESR_READ_ERROR"));
+      return ESR_READ_ERROR;
+    }
+  }
+  
+  //get the transcription to test
+  if ((position = strtok(line, "\"")) != NULL)
+  {
+    LSTRCPY(trans, position);
+  }
+  else
+  {
+    pfprintf(fout, "INVALID FORMAT for input line 1 \n");
+    rc = ESR_INVALID_ARGUMENT;
+    goto CLEANUP;
+  }
+  
+  //get the key (meaning)
+  if ((position = strtok(NULL, " \t")) != NULL)
+  {
+    LSTRCPY(key, position);
+  }
+  else
+  {
+    pfprintf(fout, "INVALID FORMAT for input line 2\n");
+    rc = ESR_INVALID_ARGUMENT;
+    goto CLEANUP;
+  }
+  
+  //get the expected return string
+  if ((position = strtok(NULL, "\"")) != NULL)
+  {
+    LSTRCPY(refValue, position);
+  }
+  else
+  {
+    pfprintf(fout, "INVALID FORMAT for input line 3\n");
+    rc = ESR_INVALID_ARGUMENT;
+    goto CLEANUP;
+  }
+  
+  //get the expected result PASS/FAIL
+  //there is no need to write PASS, if nothing is written PASS is assumed
+  if ((position = strtok(NULL, " \t\r\n\"")) != NULL)
+  {
+    LSTRCPY(result, position);
+    
+    if (strcmp(result, "PASS") != 0 && strcmp(result, "FAIL") != 0)
+    {
+      pfprintf(fout, "INVALID FORMAT for input line, use either PASS or FAIL\n");
+      rc = ESR_INVALID_ARGUMENT;
+      goto CLEANUP;
+    }
+    
+    if ((rc = ParseTestSet(grammar, trans, key, refValue, result, fout)) != ESR_SUCCESS)
+      goto CLEANUP;
+  }
+  else
+  {
+    if ((rc = ParseTestSet(grammar, trans, key, refValue, "PASS", fout)) != ESR_SUCCESS)
+      goto CLEANUP;
+  }
+  rc = ESR_SUCCESS;
+CLEANUP:
+  return rc;
+}
+
+ESR_ReturnCode process_multi_key_line(SR_Grammar* grammar, const LCHAR* rootrule, PFile* fin, PFile* fout)
+{
+  LCHAR *position, *p;
+  LCHAR line[MAX_LINE_LENGTH];
+  LCHAR trans[MAX_LINE_LENGTH];
+  LCHAR keyvals[MAX_LINE_LENGTH];
+  ESR_ReturnCode rc;
+  SR_SemanticResult* semanticResults[MAX_SEM_RESULTS];
+  LCHAR refkey[MAX_LINE_LENGTH];
+  LCHAR refval[MAX_LINE_LENGTH], value[MAX_STR_LENGTH];
+  size_t i, j, len;
+  size_t result_count;
+  
+  position = pfgets(line, MAX_LINE_LENGTH, fin);
+  if (line[0] == '#')
+    return ESR_SUCCESS;
+  if (!strncmp(line, "__END__", 7))
+    return ESR_READ_ERROR;
+  if (position == NULL)
+  {
+    if (pfeof(fin))
+      return ESR_READ_ERROR;
+    else
+    {
+      PLogError(L("ESR_READ_ERROR"));
+      return ESR_READ_ERROR;
+    }
+  }
+  
+  /* we're trying to parse
+    Hello there : BONJOUR
+   */
+  p = strtok(line, ":");
+  LSTRCPY(trans, p);
+  /* strip trailing spaces */
+  for (len = strlen(trans); len > 0 && trans[len-1] == ' '; len--)
+    trans[len-1] = 0;
+    
+  p = strtok(NULL, "\n\r");
+  /* strip leading spaces */
+  while (*p == ' ' || *p == '\t')  p++;
+  LSTRCPY(keyvals, p);
+  
+  result_count = MAX_SEM_RESULTS;
+  for (i = 0; i < result_count; i++)
+    SR_SemanticResultCreate(&semanticResults[i]);
+    
+  /* pfprintf(fout,"checking (%s) ref(%s)\n", trans, keyvals); */
+  rc = grammar->checkParse(grammar, trans, semanticResults, (size_t*) & result_count);
+  if (rc != ESR_SUCCESS)
+    return rc;
+    
+  /*result file will contain
+  transcription | key | reference | result | PASSESD/FAILED */
+  
+  if (result_count < 1) /*failed to parse, but this could still be a pass if you expected a failure*/
+  {
+    pfprintf(fout, "%s|%s|  |", trans, keyvals);
+    if (!strcmp("FAIL", keyvals) || !strcmp(keyvals, "-"))
+      pfprintf(fout, "PASSED\n");
+    else
+      pfprintf(fout, "FAILED\n");
+  }
+  else /*parsed, look at what was expected, what was returned and which of PASS/FAIL is expected */
+  {
+    size_t size, len;
+    LCHAR* keys_available[MAX_KEYS]; /* array of pointers to strings */
+    size = MAX_KEYS;
+    rc = semanticResults[0]->getKeyList(semanticResults[0], (LCHAR**) & keys_available, &size);
+    
+    for (p = strtok(keyvals, ";"); p; p = strtok(NULL, ";"))
+    {
+      sprintf(refkey, "%s.%s", rootrule, p);
+      p = strchr(refkey, '=');
+      assert(p);
+      *p = 0;
+      p++;
+      if (*p == '\'') p++;
+      LSTRCPY(refval, p);
+      if (refval[ strlen(refval)-1] == '\'') refval[strlen(refval)-1] = 0;
+      
+      for (i = 0; i < result_count; i++)
+      {
+        len = MAX_STR_LENGTH;
+        for (j = 0; j < size; j++)
+          if (!strcmp(keys_available[j], refkey)) break;
+        if (j < size)
+          rc = semanticResults[i]->getValue(semanticResults[i], refkey, value, &len);
+        else
+        {
+          LSTRCPY(value, "<NOSUCHKEY>");
+          rc = ESR_NO_MATCH_ERROR;
+        }
+        pfprintf(fout, "%s|%s|%s|%s|", trans, refkey, refval, value);
+        if (strcmp(value, refval) == 0)
+          pfprintf(fout, "PASSED\n");
+        else
+          pfprintf(fout, "FAILED\n");
+      }
+    }
+    
+    /*deallocate semantic results*/
+    for (i = 0; i < MAX_SEM_RESULTS; i++)
+    {
+      rc = semanticResults[i]->destroy(semanticResults[i]);
+      if (rc != ESR_SUCCESS)
+        PLogError("%s while destroying", ESR_rc2str(rc));
+    }
+  }
+  return ESR_SUCCESS;
+}
+
diff --git a/tools/test_g2g/Android.mk b/tools/test_g2g/Android.mk
new file mode 100644
index 0000000..c4bdd17
--- /dev/null
+++ b/tools/test_g2g/Android.mk
@@ -0,0 +1,46 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	test_g2g.c \
+
+LOCAL_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/clib \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_Core \
+	libSR_EventLog \
+	libSR_G2P \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Recognizer \
+	libSR_Semproc \
+	libSR_Session \
+	libSR_Vocabulary \
+	
+LOCAL_MODULE:= test_g2g
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/test_g2g/test_g2g.c b/tools/test_g2g/test_g2g.c
new file mode 100644
index 0000000..f68e221
--- /dev/null
+++ b/tools/test_g2g/test_g2g.c
@@ -0,0 +1,536 @@
+/*---------------------------------------------------------------------------*
+ *  test_g2g.c  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+
+#include "pstdio.h"
+#include "pmemory.h"
+#include "plog.h"
+#include "HashMap.h"
+#include "SR_Grammar.h"
+#include "SR_Vocabulary.h"
+#include "SR_SemanticResult.h"
+#include "ESR_Session.h"
+#include "ESR_Locale.h"
+#include "ESR_CommandLine.h"
+#include "LCHAR.h"
+
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+
+#include "SR_GrammarImpl.h"
+
+#include "simapi.h"
+#include "srec_context.h"
+#include "srec_arb.h"
+
+/**
+ * @todo document
+ */
+typedef struct
+{
+  unsigned short nnodes;
+  unsigned long  size;
+  long    phoneme;
+  unsigned short node_pos;
+  unsigned long  node_off;
+  short    low_genone_no;
+  short    high_genone_no;
+  short    low_pel_no;
+  short    high_pel_no;
+}
+tree_head;
+
+
+int usage(LCHAR* exename)
+{
+  pfprintf(PSTDOUT,"usage: %s -base <basefilename> \n",exename);
+  pfprintf(PSTDOUT,"<basefilename> can be a file.g2g or @g2gfilelist\n");
+  pfprintf(PSTDOUT,"[-checkword id] .. also checks word id in the file\n");
+  pfprintf(PSTDOUT,"[-swiarb esr/config/lang/models/generic.swiarb] ... enables word check\n");
+  return 1;
+}
+
+/* protos */
+ESR_ReturnCode find_phonemes_for_ihmms( CA_Arbdata* ca_arbdata, modelID* ihmms, int num_hmms);
+ESR_ReturnCode Parse(SR_Grammar* grammar, LCHAR* trans, PFile* fout);
+int CheckG2G(CA_Arbdata* arbdata, int* p4pTable, const char* base, int wordid, char* outbase);
+void load_filelist(char* filelist, char*** pfiles, int *pnum_files);
+int *phonemecode_for_pel_table(CA_Arbdata* arbdata);
+
+int debug = 0;
+#define MAX_LINE_LENGTH 256
+#define MAX_STR_LENGTH   80
+#define MAX_SEM_RESULTS   3
+#define MAX_KEYS         30
+
+/* main */
+
+int main (int argc, char **argv)
+{
+  ESR_ReturnCode rc;
+  LCHAR base[P_PATH_MAX] = L("");
+  int i;
+  CA_Arbdata* ca_arbdata;
+  char*  arbfile = NULL;
+  char** g2glist;
+  int g2glist_len;
+  char* outbase = NULL;
+  int *p4pTable;
+  int wordid = 0;
+  int log_level = 0;
+
+  /*
+   * Initialize portable library.
+   */
+  CHKLOG(rc, PMemInit());
+/*  CHKLOG(rc, PFileSystemCreate());
+  CHKLOG(rc, PANSIFileSystemCreate());
+  CHKLOG(rc, PANSIFileSystemAddPath(L("/dev/ansi"), L("/")));*/
+  
+  /* Set ANSI file-system as default file-system */
+/*  CHKLOG(rc, PANSIFileSystemSetDefault(ESR_TRUE));*/
+  /* Set virtual current working directory to native current working directory */
+/*  len = P_PATH_MAX;
+  CHKLOG(rc, PANSIFileSystemGetcwd(cwd, &len));
+  CHKLOG(rc, PFileSystemChdir(cwd));*/
+  
+  if( argc <= 1)
+	{
+    usage(argv[0]);
+    exit(EXIT_FAILURE);
+  }
+
+	for (i = 1; i < argc; ++i)
+	{
+		if(!LSTRCMP(argv[i], L("-base")))
+		{
+			++i;
+			LSTRCPY(base, argv[i]);
+		}
+		else if(!LSTRCMP(argv[i],L("-out")))
+		{
+			outbase = argv[++i];
+		}
+		else if(!LSTRCMP(argv[i],L("-swiarb")))
+		{
+			arbfile = argv[++i];
+		}
+		else if(!LSTRCMP(argv[i],L("-checkword")))
+		{
+			wordid = atoi(argv[++i]);
+		}
+		else if(!LSTRCMP(argv[i],L("-log")))
+		{
+			log_level = 10;
+		}
+		else
+		{
+			printf("unrecog'd argument %s\n", argv[i]);
+			exit(1);
+		}
+	}
+
+	CHK(rc, PLogInit(NULL, log_level));
+
+	if(arbfile) {
+		ca_arbdata = CA_LoadArbdata(arbfile); 
+		if(!ca_arbdata) {
+      pfprintf(PSTDOUT, "Error: loading arbfile %s\n", arbfile);
+      goto CLEANUP;
+    }
+    pfprintf(PSTDOUT, "arbdata done\n");
+    p4pTable  = phonemecode_for_pel_table(ca_arbdata);
+    pfprintf(PSTDOUT, "p4pTable done\n");
+  } else {
+    ca_arbdata = 0;
+    p4pTable = 0;
+  }
+    
+  if(base[0] == '@') {
+    load_filelist(base+1, &g2glist, &g2glist_len);
+    pfprintf(PSTDOUT, "g2glist %s .. %d entries\n", g2glist_len);
+    for(i=0; i<g2glist_len; i++) 
+      CheckG2G( ca_arbdata, p4pTable, g2glist[i], wordid, outbase);
+  }
+  else {
+    CheckG2G( ca_arbdata, p4pTable, base, wordid, outbase);
+  }
+
+CLEANUP:
+  PLogShutdown();
+/*  PANSIFileSystemDestroy();
+  PFileSystemDestroy();*/
+  PMemSetLogFile(PSTDOUT);
+  PMemDumpLogFile();
+  PMemShutdown();
+  return rc;
+}
+
+int CheckG2G(CA_Arbdata* ca_arbdata, int* p4pTable, const char* base, int wordid, char* outbase)
+{
+  ESR_ReturnCode rc;
+  SR_GrammarImpl *grammarImpl;
+  SR_Grammar* grammar = NULL;
+  srec_context* fst;
+  CA_Syntax* syntax;
+  modelID ilabels_preceding[64], num_ilabels_preceding;
+  modelID ilabels_following[64], num_ilabels_following;
+  modelID ilabels[128], num_ilabels;
+  int i,j;
+  unsigned long g2gsize;
+
+  if(1) {
+    FILE* fp;
+    fp = fopen(base, "rb");
+    if(!fp) g2gsize = 0;
+    else {
+      fseek(fp, 0, SEEK_END);
+      g2gsize = ftell(fp);
+      fclose(fp);
+    }
+  }
+
+  rc = SR_GrammarLoad(base, &grammar);
+  if(rc != ESR_SUCCESS) {
+    pfprintf(PSTDOUT, "%s failed at load\n", base);
+    goto CLEANUP;
+  }
+  
+  grammarImpl = (SR_GrammarImpl*)grammar;
+  syntax = grammarImpl->syntax;
+  if(outbase) {
+    CA_DumpSyntax( syntax, outbase);
+  }
+
+  fst = syntax->synx;
+  pfprintf(PSTDOUT, "%s %d arcs %d/%d/%d nodes %d/%d/%d words %d/%d chars %d/%d modelver %d\n",
+	   base, g2gsize, 
+		 fst->num_arcs, fst->num_base_arcs, fst->FSMarc_list_len,
+		 fst->num_nodes, fst->num_base_nodes, fst->FSMnode_list_len,
+	   fst->olabels->num_words, fst->olabels->max_words,
+	   fst->olabels->next_chars-fst->olabels->chars, 
+	   fst->olabels->max_chars,
+#ifdef IMAGE_FORMAT_V2   
+	   fst->modelid
+#else
+	   -1
+#endif
+	   );
+
+  if(wordid == 0 || ca_arbdata == 0) 
+    goto CLEANUP;
+
+  if(wordid >= fst->olabels->num_words) {
+    pfprintf(PSTDOUT, "%s failed 'cuz numwords(%d) < %d\n", base, 
+	     fst->olabels->num_words, wordid);
+    goto CLEANUP;
+  }
+
+  for(i=0; i<fst->num_arcs; i++) {
+    if(fst->FSMarc_list[i].olabel == wordid) {
+      FSMnode* node;
+      FSMarc* arc = &fst->FSMarc_list[i];
+      nodeID fr_node = arc->fr_node;
+      arcID iarc;
+      ilabels_following[0] = arc->ilabel;
+      num_ilabels_following = 1;
+      num_ilabels_preceding = 0;
+      for( ; fr_node!=fst->start_node; fr_node=arc->fr_node) {
+	node = &fst->FSMnode_list[fr_node];
+	iarc = node->first_prev_arc;
+	for( ; iarc!=MAXarcID; iarc=arc->linkl_prev_arc) {
+	  arc = &fst->FSMarc_list[iarc];
+	  if(arc->fr_node != fr_node) break;
+	}
+	if(iarc == MAXarcID) {
+	  pfprintf(PSTDOUT, "%s failed at 11\n", base);
+	  goto CLEANUP;
+	}
+	if(arc->ilabel == WORD_BOUNDARY) break;
+	ilabels_preceding[num_ilabels_preceding++] = arc->ilabel;
+      }
+      arc = &fst->FSMarc_list[i];
+      fr_node = arc->to_node;
+      for( ; fr_node!=fst->end_node; fr_node=arc->to_node) {
+	node = &fst->FSMnode_list[fr_node];
+	iarc = node->un_ptr.first_next_arc;
+	for( ; iarc!=MAXarcID; iarc=arc->linkl_next_arc) {
+	  arc = &fst->FSMarc_list[iarc];
+	  if(arc->to_node != fr_node) break;
+	}
+	if(iarc == MAXarcID) {
+	  pfprintf(PSTDOUT, "%s failed at 12\n", base);
+	  goto CLEANUP;
+	}
+	ilabels_following[num_ilabels_following++] = arc->ilabel;
+	if(arc->ilabel == WORD_BOUNDARY) break;
+      }
+      num_ilabels = 0;
+      for(j=0; j<num_ilabels_preceding; j++) 
+	ilabels[num_ilabels++] = ilabels_preceding[num_ilabels_preceding-1-j];
+      for(j=0; j<num_ilabels_following; j++) 
+	ilabels[num_ilabels++] = ilabels_following[j];
+      if(ilabels[num_ilabels-1] == WORD_BOUNDARY) 
+	num_ilabels--;
+      for(j=0; j<num_ilabels; j++) {
+	if(ilabels[j]<fst->hmm_ilabel_offset) {
+	  pfprintf(PSTDOUT, "%s failed at 15\n", base);
+	  goto CLEANUP;
+	} else 
+	  ilabels[j] = ilabels[j] - (labelID)fst->hmm_ilabel_offset;
+      }
+      pfprintf(PSTDOUT, "%s (W%d) ihmms ", fst->olabels->words[wordid], wordid);
+      for(j=0;j<num_ilabels;j++) 
+	pfprintf(PSTDOUT, " %d", ilabels[j]);
+      pfprintf(PSTDOUT, "\n");
+      if(num_ilabels < 2) {
+	pfprintf(PSTDOUT, "%s failed at 1\n", base);
+	goto CLEANUP;
+      }
+      if(p4pTable) 
+	rc = find_phonemes_for_ihmms( ca_arbdata, ilabels, num_ilabels);
+      else {
+	rc = ESR_SUCCESS;
+	for(j=0; j<num_ilabels; j++) {
+	  if(p4pTable[ ilabels[j]]<0) {
+	    rc = ESR_NO_MATCH_ERROR;
+	    ilabels[j] = MAXmodelID;
+	  } else {
+	    ilabels[j] = (modelID)p4pTable[ ilabels[j]];
+	  }
+	}
+      }
+	
+      if(rc) {
+	pfprintf(PSTDOUT, "%s failed at 2\n", base);
+	goto CLEANUP;
+      }
+      pfprintf(PSTDOUT, "%s ", fst->olabels->words[wordid]);
+      for(j=0;j<num_ilabels;j++) pfprintf(PSTDOUT, "%c", ilabels[j]);
+      pfprintf(PSTDOUT, "\n");
+      rc = Parse( grammar, fst->olabels->words[wordid], PSTDOUT);
+      if(rc) {
+	pfprintf(PSTDOUT, "%s failed at 3\n", base);
+	goto CLEANUP;
+      }
+      pfprintf(PSTDOUT, "%s PASSED (on %s)\n", base, fst->olabels->words[wordid]);
+      break;
+    }
+  }
+
+  return 0;
+ CLEANUP:
+  if(grammar) SR_GrammarDestroy(grammar);
+  return 1;
+
+}
+
+
+int traverse_tree(tree_node* node, tree_head *tree_topo, int *num_terminal_nodes)
+{
+  if(node) 
+    tree_topo->nnodes++;
+  
+  if(node->node.quest_index < 0) {
+    if(num_terminal_nodes) 
+      (*num_terminal_nodes)++;
+    if( node->term.pelid < tree_topo->low_pel_no) 
+      tree_topo->low_pel_no = tree_topo->low_genone_no = node->term.pelid;
+    if( node->term.pelid > tree_topo->high_pel_no) 
+      tree_topo->high_pel_no = tree_topo->high_genone_no = node->term.pelid;
+  } else {
+    traverse_tree( (tree_node*)node->node.fail, tree_topo, num_terminal_nodes);
+    traverse_tree( (tree_node*)node->node.pass, tree_topo, num_terminal_nodes);
+  }
+  return 0;
+  
+}
+
+int num_nodes_in_tree(tree_node* node, int *num_terminal_nodes)
+{
+  tree_head topo;
+  *num_terminal_nodes = 0;
+  topo.nnodes = 0;
+  traverse_tree(node, &topo, num_terminal_nodes);
+  return topo.nnodes;
+}
+
+ESR_ReturnCode find_phonemes_for_ihmms( CA_Arbdata* ca_arbdata, modelID* ihmms, int num_ihmms)
+{
+  int ii, i;
+  int num_hmms_in_phoneme;
+  tree_head topo;
+  srec_arbdata* a = (srec_arbdata*)ca_arbdata;
+  int num_phonemes_for_ihmms = 0;
+
+  for(ii=0; ii<num_ihmms; ii++) {
+    for(i=0; i<a->num_phonemes; i++) {
+      num_hmms_in_phoneme = 0;
+      topo.low_pel_no  = 32567;
+      topo.high_pel_no = 0;
+      traverse_tree(a->pdata[i].model_nodes, &topo, &num_hmms_in_phoneme);
+      if(debug)printf("phoneme %d num_hmms %d (%d-%d)\n", i, num_hmms_in_phoneme,
+		      topo.low_pel_no, topo.high_pel_no);
+      if(ihmms[ii] >= topo.low_pel_no && ihmms[ii]<= topo.high_pel_no) {
+	ihmms[ii] = (modelID)i;
+	num_phonemes_for_ihmms++;
+	break;
+      }
+    }
+    if( i==a->num_phonemes) {
+      if(ihmms[ii]<=5) {
+	ihmms[ii] = 0;
+	num_phonemes_for_ihmms++;
+      } else {
+	PLogError("error: could not find hmm%d under any phoneme! ",ihmms[ii]);
+      }
+    }
+
+  }
+  if(num_phonemes_for_ihmms != num_ihmms) 
+    return ESR_INVALID_ARGUMENT;
+  else {
+    for(ii=0; ii<num_ihmms; ii++) ihmms[ii] =  a->pdata[ ihmms[ii]].code;
+    return ESR_SUCCESS;
+  }
+}
+
+void display_results(SR_SemanticResult *result, PFile* fout)
+{
+  size_t i, size, len;
+  LCHAR* keys[MAX_KEYS]; /* array of pointers to strings */
+  LCHAR  value[MAX_STR_LENGTH];
+  ESR_ReturnCode rc;
+
+  size = MAX_KEYS;
+  rc = result->getKeyList(result, (LCHAR**) &keys, &size); /* get the key list */
+  if(rc == ESR_SUCCESS)
+  {
+    for(i=0; i<size; i++)
+    {
+      len = MAX_STR_LENGTH;
+      if ((rc = result->getValue(result,keys[i],value,&len)) == ESR_SUCCESS)
+        pfprintf(fout,"{%s : %s}\n",keys[i],value);
+      else
+        pfprintf(fout,"Error: %s\n",ESR_rc2str(rc));
+    }
+  }
+  else
+    pfprintf(fout,"Error: %s\n",ESR_rc2str(rc));
+}
+
+ESR_ReturnCode Parse(SR_Grammar* grammar, LCHAR* trans, PFile* fout)
+{
+  ESR_ReturnCode rc;
+  int i, result_count;
+  SR_SemanticResult* semanticResults[MAX_SEM_RESULTS];
+
+  result_count = MAX_SEM_RESULTS; /* initially not greater than MAX */
+  for(i =0; i<result_count; i++)
+    SR_SemanticResultCreate(&semanticResults[i]); /* create the result holders */
+
+  lstrtrim(trans);
+
+  rc = grammar->checkParse(grammar, trans, semanticResults, (size_t*) &result_count);
+  if(rc != ESR_SUCCESS)
+    return rc;
+
+  if(result_count < 1)
+  {
+    pfprintf(fout,"no parse\n\n");
+    return ESR_NO_MATCH_ERROR;
+  }
+  else
+  {
+    pfprintf(fout,"parse ok (%d results)\n", result_count);
+    for(i=0; i < result_count; i++)
+      display_results(semanticResults[i],fout);
+
+    for(i=0; i < MAX_SEM_RESULTS; i++)
+    {
+      rc = semanticResults[i]->destroy(semanticResults[i]);
+      if(rc != ESR_SUCCESS)
+        return rc;
+    }
+    return ESR_SUCCESS;
+  }
+}
+
+void load_filelist(char* filelist, char*** pfiles, int *pnum_files)
+{
+  int i = 0;
+  FILE* fp;
+  char line[512];
+  char **files = 0, *file;
+  int num_files = 0;
+
+  fp = fopen(filelist, "r");
+  if(!fp) {
+    pfprintf(PSTDOUT, "failed to open %s\n", filelist);
+    goto DONE;
+  }
+
+  while( fgets(line, sizeof(line), fp)) {
+    if(line[0] == '#') continue;
+    i++;
+  }
+  fclose(fp);
+
+  num_files = i;
+  *files = CALLOC( num_files, sizeof(char*), __FILE__);
+  fp = fopen(filelist, "r");
+  for(i=0; fgets(line,sizeof(line),fp) && i<num_files; i++) {
+    if(line[0] == '#') continue;
+    strtok(line,"\n\r\t");
+    file = files[i++] = CALLOC(strlen(line)+1,sizeof(char),__FILE__);
+    strcpy( file, line);
+  }
+  fclose(fp);
+  num_files = i;
+  
+ DONE:
+  *pfiles = files;
+  *pnum_files = num_files;
+}
+
+int* phonemecode_for_pel_table(CA_Arbdata* ca_arbdata)
+{
+  static int table[2048];
+  int i,j;
+  tree_head topo;
+  srec_arbdata* a = (srec_arbdata*)ca_arbdata;
+  int num_hmms_in_phoneme;
+  
+  for(j=0; j< (int)(sizeof(table)/sizeof(int)); j++)
+    table[j] = 0;
+
+  for(i=0; i<a->num_phonemes; i++) {
+    num_hmms_in_phoneme = 0;
+    topo.low_pel_no  = 32567;
+    topo.high_pel_no = 0;
+    traverse_tree(a->pdata[i].model_nodes, &topo, &num_hmms_in_phoneme);
+    if(debug)printf("phoneme %d num_hmms %d (%d-%d)\n", i, num_hmms_in_phoneme,
+		    topo.low_pel_no, topo.high_pel_no);
+    
+    for(j=topo.low_pel_no; j<=topo.high_pel_no; j++) 
+      table[j] = a->pdata[i].code;
+  }
+  return &table[0];
+}
diff --git a/tools/test_swiarb/Android.mk b/tools/test_swiarb/Android.mk
new file mode 100644
index 0000000..a26219f
--- /dev/null
+++ b/tools/test_swiarb/Android.mk
@@ -0,0 +1,41 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	test_swiarb.c \
+
+LOCAL_C_INCLUDES := \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+
+LOCAL_CFLAGS += \
+	$(ASR_GLOBAL_DEFINES) \
+	$(ASR_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_Core \
+	libSR_EventLog \
+	libSR_G2P \
+	libSR_Grammar \
+	libSR_Nametag \
+	libSR_Recognizer \
+	libSR_Semproc \
+	libSR_Session \
+	libSR_Vocabulary \
+	
+LOCAL_MODULE:= test_swiarb
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/test_swiarb/test_swiarb.c b/tools/test_swiarb/test_swiarb.c
new file mode 100644
index 0000000..69145a6
--- /dev/null
+++ b/tools/test_swiarb/test_swiarb.c
@@ -0,0 +1,146 @@
+/*---------------------------------------------------------------------------*
+ *  test_swiarb.c                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "plog.h"
+#include "passert.h"
+#include "duk_args.h"
+#include "duk_err.h"
+#include "ptrd.h"
+
+#include "srec_arb.h"
+#include "simapi.h"
+
+#include "PFileSystem.h"
+#include "PANSIFileSystem.h"
+
+#define MAX_PATH_LENGTH 256
+#define MAX_LINE_LENGTH 256
+#define MAX_ENTRY_LENGTH 128
+#define MAX_NUM_REC_CONTEXTS 4
+#define ANY_SYNTAX syntax_list[0] /* just get around internal checks */
+#define NUM_WORDS_TO_ADD 500
+#define MAX_INTERACTIVE_NUM 128
+
+#define printf_vector(HEAD, FMT, PTR, NN) { unsigned int iI; printf(HEAD); for(iI=0;iI<(NN);iI++) printf(FMT, PTR[iI]); printf("\n"); }
+
+/* #include"scg_arbdata.c" */
+//static int debug = 0;
+
+
+int main (int argc, char **argv)
+{
+	int i, j;
+	int interactive_test = 0;
+    CA_Arbdata             *ca_arbdata = NULL;     /* new, link btw acc/syn */
+	//char *modelmap = NULL;
+	char *arbfile = NULL;
+	char* q;
+	modelID model_sequence[128];
+	char pronunciation[256];
+	int pronunciation_len;
+	int rc;
+	srec_arbdata *allotree = NULL;
+
+/* initial memory */
+	CHKLOG(rc, PMemInit());
+
+	if(argc<=1){
+	  printf("USAGE: -swiarb <swiarb file> -interactive\n");
+	  exit(1);
+	}
+
+
+	for(i=1; i<argc; i++) {
+      if(!strcmp(argv[i],"-swiarb")) {
+	if(argc==2){
+	  printf("Please specify the swiarb file.\n");
+	  exit(1);
+	}
+	arbfile = argv[++i];
+	printf("using swiarb from file %s\n", arbfile);
+      } else if(!strcmp(argv[i],"-interactive")) {
+	interactive_test++;
+      } else {
+	printf("error_usage: argument [%s]\n", argv[i]);
+	exit(1);
+      }
+    }
+	
+/* get modelID for a triphone */
+    ca_arbdata = CA_LoadArbdata(arbfile);
+    
+    for(i=0; i<MAX_INTERACTIVE_NUM; i++){
+
+      if(interactive_test){
+	printf("Type \"quit\" to exit the test.\n");
+	printf("pronunciation: ");
+	q = fgets(pronunciation, sizeof(pronunciation), stdin);
+	if(!strcmp(q,"quit\n")) break;
+      }
+      else{
+	printf("USAGE: -swiarb <swiarb file> -interactive\n");
+	exit(1);
+      }
+
+      pronunciation_len = strlen(pronunciation)-1;
+      CA_ArbdataGetModelIdsForPron(ca_arbdata,
+                                 pronunciation, pronunciation_len,
+                                 &model_sequence[0]);
+
+
+      printf("short pronunciation length is %d.\n", pronunciation_len);
+      printf("Acoustic model IDs (\"#\" is silence,\"_\" is word boundary):\n");
+      for (j=0;j<pronunciation_len;j++){
+      
+	if(j==0){
+	  if(pronunciation_len==1) 
+	    printf("triphone:_%c_ -> ModelID:%d\n", pronunciation[j], model_sequence[j]);
+	    else
+	  printf("triphone:_%c%c -> ModelID:%d\n", pronunciation[j], pronunciation[j+1],
+	       model_sequence[j]);
+	}
+	else if(j==(pronunciation_len-1)){
+	  printf("triphone:%c%c_ -> ModelID:%d\n", pronunciation[j-1], pronunciation[j], model_sequence[j]);
+	}
+	else{
+	  printf("triphone:%c%c%c -> ModelID:%d\n", pronunciation[j-1], pronunciation[j], pronunciation[j+1],
+	       model_sequence[j]);
+	}
+      
+	allotree = (srec_arbdata*)ca_arbdata;
+	printf_vector("pel_ids: ", " %d", allotree->hmm_infos[model_sequence[j]].state_indices, 
+		    (unsigned int) allotree->hmm_infos[model_sequence[j]].num_states);
+	printf("\n");
+      
+      }
+    }
+
+  CA_FreeArbdata( ca_arbdata);
+	
+  PMemShutdown();
+  return 0;
+CLEANUP:
+  return 1;
+}
+
diff --git a/tools/thirdparty/Android.mk b/tools/thirdparty/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/tools/thirdparty/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/tools/thirdparty/OpenFst/Android.mk b/tools/thirdparty/OpenFst/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/tools/thirdparty/OpenFst/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/tools/thirdparty/OpenFst/README b/tools/thirdparty/OpenFst/README
new file mode 100644
index 0000000..4351e5d
--- /dev/null
+++ b/tools/thirdparty/OpenFst/README
@@ -0,0 +1,36 @@
+OpenFst - Beta release version.  
+http://128.122.80.210/~openfst/twiki/pub/FST/FstDownload
+OpenFst-beta-20070801.tgz
+
+PLATFORMS:
+
+  This version is known to work under linux using g++.
+  The make files are unlikely to work on other platforms
+  unmodified. Stay tuned for an autoconf build.
+	
+BUILDING:
+
+  To build (rudimentary Makefiles for now):
+
+    cd fst ; make all
+
+  To test:
+
+    cd fst ; make test
+    # Note long compile on algo_test and pair-arc.so (many templates)
+
+USING WITH YOUR OWN PROGRAMS:
+
+  Include "fst/lib/fstlib.h" (path must be relative to the OpenFst root
+  directory). You need to link to fst/lib/libfst.so as well as libpthread
+  and libdl. The linking is dynamic so that the Fst and Arc tpe
+  DSO extensions can be used (see e.g. test/dso_test.sh).
+
+DOCUMENTATION: 
+
+  At www.openfst.org.
+
+TO DO:
+  1) remove/sanitize google-isms - e.g. flags and error handling in compat.*
+  2) autoconf
+  3) check portability
diff --git a/tools/thirdparty/OpenFst/fst/Android.mk b/tools/thirdparty/OpenFst/fst/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/tools/thirdparty/OpenFst/fst/lib/Android.mk b/tools/thirdparty/OpenFst/fst/lib/Android.mk
new file mode 100644
index 0000000..0593078
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/Android.mk
@@ -0,0 +1,25 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+	fst.cpp \
+	properties.cpp \
+	symbol-table.cpp \
+	compat.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH) \
+	$(LOCAL_PATH)/../.. \
+
+LOCAL_CFLAGS += \
+	-DFST_DL \
+
+LOCAL_SHARED_LIBRARIES := \
+
+LOCAL_LDLIBS += -lpthread
+
+LOCAL_MODULE := libfst
+
+include $(BUILD_HOST_SHARED_LIBRARY)
diff --git a/tools/thirdparty/OpenFst/fst/lib/arc.h b/tools/thirdparty/OpenFst/fst/lib/arc.h
new file mode 100644
index 0000000..92d80a0
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/arc.h
@@ -0,0 +1,165 @@
+// arc.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Commonly used Fst arc types.
+
+#ifndef FST_LIB_ARC_H__
+#define FST_LIB_ARC_H__
+
+#include "fst/lib/float-weight.h"
+#include "fst/lib/product-weight.h"
+#include "fst/lib/string-weight.h"
+
+namespace fst {
+
+// Arc with integer labels and state Ids and float weights over the
+// tropical semiring.
+struct StdArc {
+  typedef int Label;
+  typedef TropicalWeight Weight;
+  typedef int StateId;
+
+  StdArc(Label i, Label o, Weight w, StateId s)
+      : ilabel(i), olabel(o), weight(w), nextstate(s) {}
+
+  StdArc() {}
+
+  static const string &Type() {  // Arc type name
+    static const string type = "standard";
+    return type;
+  }
+
+  Label ilabel;       // Transition input label
+  Label olabel;       // Transition output label
+  Weight weight;      // Transition weight
+  StateId nextstate;  // Transition destination state
+};
+
+
+// Arc with integer labels and state Ids and float weights over the
+// log semiring.
+struct LogArc {
+  typedef int Label;
+  typedef LogWeight Weight;
+  typedef int StateId;
+
+  LogArc(Label i, Label o, Weight w, StateId s)
+      : ilabel(i), olabel(o), weight(w), nextstate(s) {}
+
+  LogArc() {}
+
+  static const string &Type() {  // Arc type name
+    static const string type = "log";
+    return type;
+  }
+
+  Label ilabel;       // Transition input label
+  Label olabel;       // Transition output label
+  Weight weight;      // Transition weight
+  StateId nextstate;  // Transition destination state
+};
+
+
+// Arc with integer labels and state Ids and string weights.
+template <StringType S = STRING_LEFT>
+class StringArc {
+ public:
+  typedef int Label;
+  typedef StringWeight<int, S> Weight;
+  typedef int StateId;
+
+  StringArc(Label i, Label o, Weight w, StateId s)
+      : ilabel(i), olabel(o), weight(w), nextstate(s) {}
+
+  StringArc() {}
+
+  static const string &Type() {  // Arc type name
+    static const string type =
+        S == STRING_LEFT ? "standard_string" :
+        (S == STRING_RIGHT ? "right_standard_string" :
+         (S == STRING_LEFT_RESTRICT ? "restricted_string" :
+          "right_restricted_string"));
+    return type;
+  }
+
+  Label ilabel;       // Transition input label
+  Label olabel;       // Transition output label
+  Weight weight;      // Transition weight
+  StateId nextstate;  // Transition destination state
+};
+
+
+// Arc with label and state Id type the same as template arg and with
+// weights over the Gallic semiring w.r.t the output labels and weights of A.
+template <class A, StringType S = STRING_LEFT>
+struct GallicArc {
+  typedef A Arc;
+  typedef typename A::Label Label;
+  typedef typename A::StateId StateId;
+  typedef GallicWeight<Label, typename A::Weight, S> Weight;
+
+  GallicArc() {}
+
+  GallicArc(Label i, Label o, Weight w, StateId s)
+      : ilabel(i), olabel(o), weight(w), nextstate(s) {}
+
+  GallicArc(const A &arc)
+      : ilabel(arc.ilabel), olabel(arc.ilabel),
+        weight(arc.olabel, arc.weight), nextstate(arc.nextstate) {}
+
+  static const string &Type() {  // Arc type name
+    static const string type =
+        (S == STRING_LEFT ? "gallic_" :
+         (S == STRING_RIGHT ? "right_gallic_" :
+          (S == STRING_LEFT_RESTRICT ? "restricted_gallic_" :
+           "right_restricted_gallic_"))) + A::Type();
+    return type;
+  }
+
+  Label ilabel;       // Transition input label
+  Label olabel;       // Transition output label
+  Weight weight;      // Transition weight
+  StateId nextstate;  // Transition destination state
+};
+
+
+// Arc with the reverse of the weight found in its template arg.
+template <class A> struct ReverseArc {
+  typedef A Arc;
+  typedef typename A::Label Label;
+  typedef typename A::Weight AWeight;
+  typedef typename AWeight::ReverseWeight Weight;
+  typedef typename A::StateId StateId;
+
+  ReverseArc(Label i, Label o, Weight w, StateId s)
+      : ilabel(i), olabel(o), weight(w), nextstate(s) {}
+
+  ReverseArc() {}
+
+  static const string &Type() {  // Arc type name
+    static const string type = "reverse_" + Arc::Type();
+    return type;
+  }
+
+  Label ilabel;       // Transition input label
+  Label olabel;       // Transition output label
+  Weight weight;      // Transition weight
+  StateId nextstate;  // Transition destination state
+};
+
+}  // namespace fst;
+
+#endif  // FST_LIB_ARC_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/arcfilter.h b/tools/thirdparty/OpenFst/fst/lib/arcfilter.h
new file mode 100644
index 0000000..2840ac6
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/arcfilter.h
@@ -0,0 +1,43 @@
+// arcfilter.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Function objects to restrict which arcs are traversed in an FST.
+
+#ifndef FST_LIB_ARCFILTER_H__
+#define FST_LIB_ARCFILTER_H__
+
+namespace fst {
+
+// True for all arcs.
+template <class A>
+class AnyArcFilter {
+public:
+  bool operator()(const A &arc) const { return true; }
+};
+
+
+// True for (input/output) epsilon arcs.
+template <class A>
+class EpsilonArcFilter {
+public:
+  bool operator()(const A &arc) const {
+    return arc.ilabel == 0 && arc.olabel == 0;
+  }
+};
+
+}  // namespace fst
+
+#endif  // FST_LIB_ARCFILTER_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/arcsort.h b/tools/thirdparty/OpenFst/fst/lib/arcsort.h
new file mode 100644
index 0000000..4d15adb
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/arcsort.h
@@ -0,0 +1,317 @@
+// arcsort.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to sort arcs in an FST.
+
+#ifndef FST_LIB_ARCSORT_H__
+#define FST_LIB_ARCSORT_H__
+
+#include <algorithm>
+
+#include "fst/lib/cache.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+// Sorts the arcs in an FST according to function object 'comp' of
+// type Compare. This version modifies its input.  Comparison function
+// objects IlabelCompare and OlabelCompare are provived by the
+// library. In general, Compare must meet the requirements for an STL
+// sort comparision function object. It must also have a member
+// Properties(uint64) that specifies the known properties of the
+// sorted FST; it takes as argument the input FST's known properties
+// before the sort.
+//
+// Complexity:
+// - Time: O(V + D log D)
+// - Space: O(D)
+// where V = # of states and D = maximum out-degree.
+template<class Arc, class Compare>
+void ArcSort(MutableFst<Arc> *fst, Compare comp) {
+  typedef typename Arc::StateId StateId;
+
+  uint64 props = fst->Properties(kFstProperties, false);
+
+  vector<Arc> arcs;
+  for (StateIterator< MutableFst<Arc> > siter(*fst);
+       !siter.Done();
+       siter.Next()) {
+    StateId s = siter.Value();
+    arcs.clear();
+    for (ArcIterator< MutableFst<Arc> > aiter(*fst, s);
+         !aiter.Done();
+         aiter.Next())
+      arcs.push_back(aiter.Value());
+    sort(arcs.begin(), arcs.end(), comp);
+    fst->DeleteArcs(s);
+    for (size_t a = 0; a < arcs.size(); ++a)
+      fst->AddArc(s, arcs[a]);
+  }
+
+  fst->SetProperties(comp.Properties(props), kFstProperties);
+}
+
+typedef CacheOptions ArcSortFstOptions;
+
+// Implementation of delayed ArcSortFst.
+template<class A, class C>
+class ArcSortFstImpl : public CacheImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+  using FstImpl<A>::InputSymbols;
+  using FstImpl<A>::OutputSymbols;
+
+  using VectorFstBaseImpl<typename CacheImpl<A>::State>::NumStates;
+
+  using CacheImpl<A>::HasArcs;
+  using CacheImpl<A>::HasFinal;
+  using CacheImpl<A>::HasStart;
+
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  ArcSortFstImpl(const Fst<A> &fst, const C &comp,
+                 const ArcSortFstOptions &opts)
+      : CacheImpl<A>(opts), fst_(fst.Copy()), comp_(comp) {
+    SetType("arcsort");
+    uint64 props = fst_->Properties(kCopyProperties, false);
+    SetProperties(comp_.Properties(props));
+    SetInputSymbols(fst.InputSymbols());
+    SetOutputSymbols(fst.OutputSymbols());
+  }
+
+  ArcSortFstImpl(const ArcSortFstImpl& impl)
+      : fst_(impl.fst_->Copy()), comp_(impl.comp_) {
+    SetType("arcsort");
+    SetProperties(impl.Properties(), kCopyProperties);
+    SetInputSymbols(impl.InputSymbols());
+    SetOutputSymbols(impl.OutputSymbols());
+  }
+
+  ~ArcSortFstImpl() { delete fst_; }
+
+  StateId Start() {
+    if (!HasStart())
+      SetStart(fst_->Start());
+    return CacheImpl<A>::Start();
+  }
+
+  Weight Final(StateId s) {
+    if (!HasFinal(s))
+      SetFinal(s, fst_->Final(s));
+    return CacheImpl<A>::Final(s);
+  }
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumOutputEpsilons(s);
+  }
+
+  void InitStateIterator(StateIteratorData<A> *data) const {
+    fst_->InitStateIterator(data);
+  }
+
+  void InitArcIterator(StateId s, ArcIteratorData<A> *data) {
+    if (!HasArcs(s))
+      Expand(s);
+    CacheImpl<A>::InitArcIterator(s, data);
+  }
+
+  void Expand(StateId s) {
+    for (ArcIterator< Fst<A> > aiter(*fst_, s); !aiter.Done(); aiter.Next())
+      AddArc(s, aiter.Value());
+    SetArcs(s);
+
+    if (s < NumStates()) {  // ensure state exists
+      vector<A> &carcs = GetState(s)->arcs;
+      sort(carcs.begin(), carcs.end(), comp_);
+    }
+  }
+
+ private:
+  const Fst<A> *fst_;
+  C comp_;
+
+  void operator=(const ArcSortFstImpl<A, C> &impl);  // Disallow
+};
+
+
+// Sorts the arcs in an FST according to function object 'comp' of
+// type Compare. This version is a delayed Fst.  Comparsion function
+// objects IlabelCompare and OlabelCompare are provided by the
+// library. In general, Compare must meet the requirements for an STL
+// comparision function object (e.g. as used for STL sort). It must
+// also have a member Properties(uint64) that specifies the known
+// properties of the sorted FST; it takes as argument the input FST's
+// known properties.
+//
+// Complexity:
+// - Time: O(v + d log d)
+// - Space: O(v + d)
+// where v = # of states visited, d = maximum out-degree of states
+// visited. Constant time and space to visit an input state is assumed
+// and exclusive of caching.
+template <class A, class C>
+class ArcSortFst : public Fst<A> {
+ public:
+  friend class CacheArcIterator< ArcSortFst<A, C> >;
+  friend class ArcIterator< ArcSortFst<A, C> >;
+
+  typedef A Arc;
+  typedef C Compare;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  ArcSortFst(const Fst<A> &fst, const C &comp)
+      : impl_(new ArcSortFstImpl<A, C>(fst, comp, ArcSortFstOptions())) {}
+
+  ArcSortFst(const Fst<A> &fst, const C &comp, const ArcSortFstOptions &opts)
+      : impl_(new ArcSortFstImpl<A, C>(fst, comp, opts)) {}
+
+  ArcSortFst(const ArcSortFst<A, C> &fst) :
+      impl_(new ArcSortFstImpl<A, C>(*(fst.impl_))) {}
+
+  virtual ~ArcSortFst() { if (!impl_->DecrRefCount()) delete impl_; }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual ArcSortFst<A, C> *Copy() const {
+    return new ArcSortFst<A, C>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual void InitStateIterator(StateIteratorData<A> *data) const {
+    impl_->InitStateIterator(data);
+  }
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+ private:
+  ArcSortFstImpl<A, C> *impl_;
+
+  void operator=(const ArcSortFst<A, C> &fst);  // Disallow
+};
+
+
+// Specialization for ArcSortFst.
+template <class A, class C>
+class ArcIterator< ArcSortFst<A, C> >
+    : public CacheArcIterator< ArcSortFst<A, C> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const ArcSortFst<A, C> &fst, StateId s)
+      : CacheArcIterator< ArcSortFst<A, C> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+
+// Compare class for comparing input labels of arcs.
+template<class A> class ILabelCompare {
+ public:
+  bool operator() (A arc1, A arc2) const {
+    return arc1.ilabel < arc2.ilabel;
+  }
+
+  uint64 Properties(uint64 props) const {
+    return props & kArcSortProperties | kILabelSorted;
+  }
+};
+
+
+// Compare class for comparing output labels of arcs.
+template<class A> class OLabelCompare {
+ public:
+  bool operator() (const A &arc1, const A &arc2) const {
+    return arc1.olabel < arc2.olabel;
+  }
+
+  uint64 Properties(uint64 props) const {
+    return props & kArcSortProperties | kOLabelSorted;
+  }
+};
+
+
+// Useful aliases when using StdArc.
+template<class C> class StdArcSortFst : public ArcSortFst<StdArc, C> {
+ public:
+  typedef StdArc Arc;
+  typedef C Compare;
+};
+
+typedef ILabelCompare<StdArc> StdILabelCompare;
+
+typedef OLabelCompare<StdArc> StdOLabelCompare;
+
+}  // namespace fst
+
+#endif  // FST_LIB_ARCSORT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/arcsum.h b/tools/thirdparty/OpenFst/fst/lib/arcsum.h
new file mode 100644
index 0000000..442e2c1
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/arcsum.h
@@ -0,0 +1,96 @@
+// arcsum.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions to sum arcs (sum weights) in an fst.
+
+#ifndef FST_LIB_ARCSUM_H__
+#define FST_LIB_ARCSUM_H__
+
+#include "fst/lib/mutable-fst.h"
+#include "fst/lib/weight.h"
+
+namespace fst {
+
+template <class A>
+class ArcSumCompare {
+ public:
+  bool operator()(const A& x, const A& y) {
+    if (x.ilabel < y.ilabel) return true;
+    if (x.ilabel > y.ilabel) return false;
+    if (x.olabel < y.olabel) return true;
+    if (x.olabel < y.olabel) return false;
+    if (x.nextstate < y.nextstate) return true;
+    if (x.nextstate > y.nextstate) return false;
+    return false;
+  }
+};
+
+
+template <class A>
+class ArcSumEqual {
+ public:
+  bool operator()(const A& x, const A& y) {
+    return (x.ilabel == y.ilabel &&
+            x.olabel == y.olabel &&
+            x.nextstate == y.nextstate);
+  }
+};
+
+
+// Combines identically labeled arcs, summing weights. For each state
+// we combine arcs with the same input and output label, summing their
+// weights using Weight:::Plus().
+template <class A>
+void ArcSum(MutableFst<A>* fst) {
+  typedef typename A::StateId StateId;
+
+  vector<A> arcs;
+  for (StateIterator<Fst<A> > siter(*fst); !siter.Done(); siter.Next()) {
+    StateId s = siter.Value();
+    if (fst->NumArcs(s) == 0) continue;
+
+    // Sums arcs into arcs array.
+    arcs.clear();
+    arcs.reserve(fst->NumArcs(s));
+    for (ArcIterator<Fst<A> > aiter(*fst, s); !aiter.Done();
+         aiter.Next())
+      arcs.push_back(aiter.Value());
+
+    // At each state, first sorts the exiting arcs by input label, output label
+    // and destination state and then combines arcs identical in these
+    // attributes.
+    ArcSumCompare<A> comp;
+    sort(arcs.begin(), arcs.end(), comp);
+
+    // Deletes current arcs and copy in sumed arcs.
+    fst->DeleteArcs(s);
+    A current_arc = arcs[0];
+    ArcSumEqual<A> equal;
+    for (size_t i = 1; i < arcs.size(); ++i) {
+      if (equal(current_arc, arcs[i])) {
+        current_arc.weight = Plus(current_arc.weight, arcs[i].weight);
+      } else {
+        fst->AddArc(s, current_arc);
+        current_arc = arcs[i];
+      }
+    }
+    fst->AddArc(s, current_arc);
+  }
+}
+
+}
+
+#endif  // FST_LIB_ARCSUM_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/cache.h b/tools/thirdparty/OpenFst/fst/lib/cache.h
new file mode 100644
index 0000000..ec00d5a
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/cache.h
@@ -0,0 +1,461 @@
+// cache.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// An Fst implementation that caches FST elements of a delayed
+// computation.
+
+#ifndef FST_LIB_CACHE_H__
+#define FST_LIB_CACHE_H__
+
+#include <list>
+
+#include "fst/lib/vector-fst.h"
+
+DECLARE_bool(fst_default_cache_gc);
+DECLARE_int64(fst_default_cache_gc_limit);
+
+namespace fst {
+
+struct CacheOptions {
+  bool gc;          // enable GC
+  size_t gc_limit;  // # of bytes allowed before GC
+
+
+  CacheOptions(bool g, size_t l) : gc(g), gc_limit(l) {}
+  CacheOptions()
+      : gc(FLAGS_fst_default_cache_gc),
+        gc_limit(FLAGS_fst_default_cache_gc_limit) {}
+};
+
+
+// This is a VectorFstBaseImpl container that holds a State similar to
+// VectorState but additionally has a flags data member (see
+// CacheState below). This class is used to cache FST elements with
+// the flags used to indicate what has been cached. Use HasStart()
+// HasFinal(), and HasArcs() to determine if cached and SetStart(),
+// SetFinal(), AddArc(), and SetArcs() to cache. Note you must set the
+// final weight even if the state is non-final to mark it as
+// cached. If the 'gc' option is 'false', cached items have the extent
+// of the FST - minimizing computation. If the 'gc' option is 'true',
+// garbage collection of states (not in use in an arc iterator) is
+// performed, in a rough approximation of LRU order, when 'gc_limit'
+// bytes is reached - controlling memory use. When 'gc_limit' is 0,
+// special optimizations apply - minimizing memory use.
+
+template <class S>
+class CacheBaseImpl : public VectorFstBaseImpl<S> {
+ public:
+  using FstImpl<typename S::Arc>::Type;
+  using VectorFstBaseImpl<S>::NumStates;
+  using VectorFstBaseImpl<S>::AddState;
+
+  typedef S State;
+  typedef typename S::Arc Arc;
+  typedef typename Arc::Weight Weight;
+  typedef typename Arc::StateId StateId;
+
+  CacheBaseImpl()
+      : cache_start_(false), nknown_states_(0), min_unexpanded_state_id_(0),
+        cache_first_state_id_(kNoStateId), cache_first_state_(0),
+        cache_gc_(FLAGS_fst_default_cache_gc),  cache_size_(0),
+        cache_limit_(FLAGS_fst_default_cache_gc_limit > kMinCacheLimit ||
+                     FLAGS_fst_default_cache_gc_limit == 0 ?
+                     FLAGS_fst_default_cache_gc_limit : kMinCacheLimit) {}
+
+  explicit CacheBaseImpl(const CacheOptions &opts)
+      : cache_start_(false), nknown_states_(0),
+        min_unexpanded_state_id_(0), cache_first_state_id_(kNoStateId),
+        cache_first_state_(0), cache_gc_(opts.gc), cache_size_(0),
+        cache_limit_(opts.gc_limit > kMinCacheLimit || opts.gc_limit == 0 ?
+                     opts.gc_limit : kMinCacheLimit) {}
+
+  ~CacheBaseImpl() {
+    delete cache_first_state_;
+  }
+
+  // Gets a state from its ID; state must exist.
+  const S *GetState(StateId s) const {
+    if (s == cache_first_state_id_)
+      return cache_first_state_;
+    else
+      return VectorFstBaseImpl<S>::GetState(s);
+  }
+
+  // Gets a state from its ID; state must exist.
+  S *GetState(StateId s) {
+    if (s == cache_first_state_id_)
+      return cache_first_state_;
+    else
+      return VectorFstBaseImpl<S>::GetState(s);
+  }
+
+  // Gets a state from its ID; return 0 if it doesn't exist.
+  const S *CheckState(StateId s) const {
+    if (s == cache_first_state_id_)
+      return cache_first_state_;
+    else if (s < NumStates())
+      return VectorFstBaseImpl<S>::GetState(s);
+    else
+      return 0;
+  }
+
+  // Gets a state from its ID; add it if necessary.
+  S *ExtendState(StateId s) {
+    if (s == cache_first_state_id_) {
+      return cache_first_state_;                   // Return 1st cached state
+    } else if (cache_limit_ == 0 && cache_first_state_id_ == kNoStateId) {
+      cache_first_state_id_ = s;                   // Remember 1st cached state
+      cache_first_state_ = new S;
+      return cache_first_state_;
+    } else if (cache_first_state_id_ != kNoStateId &&
+               cache_first_state_->ref_count == 0) {
+      cache_first_state_id_ = s;                   // Reuse 1st cached state
+      cache_first_state_->Reset();
+      return cache_first_state_;                   // Return 1st cached state
+    } else {
+      while (NumStates() <= s)                     // Add state to main cache
+        AddState(0);
+      if (!VectorFstBaseImpl<S>::GetState(s)) {
+        SetState(s, new S);
+        if (cache_first_state_id_ != kNoStateId) {  // Forget 1st cached state
+          while (NumStates() <= cache_first_state_id_)
+            AddState(0);
+          SetState(cache_first_state_id_, cache_first_state_);
+          if (cache_gc_) {
+            cache_states_.push_back(cache_first_state_id_);
+            cache_size_ += sizeof(S) +
+                           cache_first_state_->arcs.capacity() * sizeof(Arc);
+            cache_limit_ = kMinCacheLimit;
+          }
+          cache_first_state_id_ = kNoStateId;
+          cache_first_state_ = 0;
+        }
+        if (cache_gc_) {
+          cache_states_.push_back(s);
+          cache_size_ += sizeof(S);
+          if (cache_size_ > cache_limit_)
+            GC(s, false);
+        }
+      }
+      return VectorFstBaseImpl<S>::GetState(s);
+    }
+  }
+
+  void SetStart(StateId s) {
+    VectorFstBaseImpl<S>::SetStart(s);
+    cache_start_ = true;
+    if (s >= nknown_states_)
+      nknown_states_ = s + 1;
+  }
+
+  void SetFinal(StateId s, Weight w) {
+    S *state = ExtendState(s);
+    state->final = w;
+    state->flags |= kCacheFinal | kCacheRecent;
+  }
+
+  void AddArc(StateId s, const Arc &arc) {
+    S *state = ExtendState(s);
+    state->arcs.push_back(arc);
+  }
+
+  // Marks arcs of state s as cached.
+  void SetArcs(StateId s) {
+    S *state = ExtendState(s);
+    vector<Arc> &arcs = state->arcs;
+    state->niepsilons = state->noepsilons = 0;
+    for (unsigned int a = 0; a < arcs.size(); ++a) { 
+      const Arc &arc = arcs[a];
+      if (arc.nextstate >= nknown_states_)
+        nknown_states_ = arc.nextstate + 1;
+      if (arc.ilabel == 0)
+        ++state->niepsilons;
+      if (arc.olabel == 0)
+        ++state->noepsilons;
+    }
+    ExpandedState(s);
+    state->flags |= kCacheArcs | kCacheRecent;
+    if (cache_gc_ && s != cache_first_state_id_) {
+      cache_size_ += arcs.capacity() * sizeof(Arc);
+      if (cache_size_ > cache_limit_)
+        GC(s, false);
+    }
+  };
+
+  void ReserveArcs(StateId s, size_t n) {
+    S *state = ExtendState(s);
+    state->arcs.reserve(n);
+  }
+
+  // Is the start state cached?
+  bool HasStart() const { return cache_start_; }
+  // Is the final weight of state s cached?
+
+  bool HasFinal(StateId s) const {
+    const S *state = CheckState(s);
+    if (state && state->flags & kCacheFinal) {
+      state->flags |= kCacheRecent;
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  // Are arcs of state s cached?
+  bool HasArcs(StateId s) const {
+    const S *state = CheckState(s);
+    if (state && state->flags & kCacheArcs) {
+      state->flags |= kCacheRecent;
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  Weight Final(StateId s) const {
+    const S *state = GetState(s);
+    return state->final;
+  }
+
+  size_t NumArcs(StateId s) const {
+    const S *state = GetState(s);
+    return state->arcs.size();
+  }
+
+  size_t NumInputEpsilons(StateId s) const {
+    const S *state = GetState(s);
+    return state->niepsilons;
+  }
+
+  size_t NumOutputEpsilons(StateId s) const {
+    const S *state = GetState(s);
+    return state->noepsilons;
+  }
+
+  // Provides information needed for generic arc iterator.
+  void InitArcIterator(StateId s, ArcIteratorData<Arc> *data) const {
+    const S *state = GetState(s);
+    data->base = 0;
+    data->narcs = state->arcs.size();
+    data->arcs = data->narcs > 0 ? &(state->arcs[0]) : 0;
+    data->ref_count = &(state->ref_count);
+    ++(*data->ref_count);
+  }
+
+  // Number of known states.
+  StateId NumKnownStates() const { return nknown_states_; }
+  // Find the mininum never-expanded state Id
+  StateId MinUnexpandedState() const {
+    while (min_unexpanded_state_id_ < (StateId)expanded_states_.size() && 
+          expanded_states_[min_unexpanded_state_id_])
+      ++min_unexpanded_state_id_;
+    return min_unexpanded_state_id_;
+  }
+
+  // Removes from cache_states_ and uncaches (not referenced-counted)
+  // states that have not been accessed since the last GC until
+  // cache_limit_/3 bytes are uncached.  If that fails to free enough,
+  // recurs uncaching recently visited states as well. If still
+  // unable to free enough memory, then widens cache_limit_.
+  void GC(StateId current, bool free_recent) {
+    if (!cache_gc_)
+      return;
+    VLOG(2) << "CacheImpl: Enter GC: object = " << Type() << "(" << this
+            << "), free recently cached = " << free_recent
+            << ", cache size = " << cache_size_
+            << ", cache limit = " << cache_limit_ << "\n";
+    typename list<StateId>::iterator siter = cache_states_.begin();
+
+    size_t cache_target = (2 * cache_limit_)/3 + 1;
+    while (siter != cache_states_.end()) {
+      StateId s = *siter;
+      S* state = VectorFstBaseImpl<S>::GetState(s);
+      if (cache_size_ > cache_target && state->ref_count == 0 &&
+          (free_recent || !(state->flags & kCacheRecent)) && s != current) {
+        cache_size_ -= sizeof(S) + state->arcs.capacity() * sizeof(Arc);
+        delete state;
+        SetState(s, 0);
+        cache_states_.erase(siter++);
+      } else {
+        state->flags &= ~kCacheRecent;
+        ++siter;
+      }
+    }
+    if (!free_recent && cache_size_ > cache_target) {
+      GC(current, true);
+    } else {
+      while (cache_size_ > cache_target) {
+        cache_limit_ *= 2;
+        cache_target *= 2;
+      }
+    }
+    VLOG(2) << "CacheImpl: Exit GC: object = " << Type() << "(" << this
+            << "), free recently cached = " << free_recent
+            << ", cache size = " << cache_size_
+            << ", cache limit = " << cache_limit_ << "\n";
+  }
+
+ private:
+  static const uint32 kCacheFinal =  0x0001;  // Final weight has been cached
+  static const uint32 kCacheArcs =   0x0002;  // Arcs have been cached
+  static const uint32 kCacheRecent = 0x0004;  // Mark as visited since GC
+
+  static const size_t kMinCacheLimit;         // Minimum (non-zero) cache limit
+
+  void ExpandedState(StateId s) {
+    if (s < min_unexpanded_state_id_)
+      return;
+    while ((StateId)expanded_states_.size() <= s) 
+      expanded_states_.push_back(false);
+    expanded_states_[s] = true;
+  }
+
+  bool cache_start_;                         // Is the start state cached?
+  StateId nknown_states_;                    // # of known states
+  vector<bool> expanded_states_;             // states that have been expanded
+  mutable StateId min_unexpanded_state_id_;  // minimum never-expanded state Id
+  StateId cache_first_state_id_;             // First cached state id
+  S *cache_first_state_;                     // First cached state
+  list<StateId> cache_states_;               // list of currently cached states
+  bool cache_gc_;                            // enable GC
+  size_t cache_size_;                        // # of bytes cached
+  size_t cache_limit_;                       // # of bytes allowed before GC
+
+  void InitStateIterator(StateIteratorData<Arc> *);  // disallow
+  DISALLOW_EVIL_CONSTRUCTORS(CacheBaseImpl);
+};
+
+template <class S>
+const size_t CacheBaseImpl<S>::kMinCacheLimit = 8096;
+
+
+// Arcs implemented by an STL vector per state. Similar to VectorState
+// but adds flags and ref count to keep track of what has been cached.
+template <class A>
+struct CacheState {
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  CacheState() :  final(Weight::Zero()), flags(0), ref_count(0) {}
+
+  void Reset() {
+    flags = 0;
+    ref_count = 0;
+    arcs.resize(0);
+  }
+
+  Weight final;              // Final weight
+  vector<A> arcs;            // Arcs represenation
+  size_t niepsilons;         // # of input epsilons
+  size_t noepsilons;         // # of output epsilons
+  mutable uint32 flags;
+  mutable int ref_count;
+};
+
+// A CacheBaseImpl with a commonly used CacheState.
+template <class A>
+class CacheImpl : public CacheBaseImpl< CacheState<A> > {
+ public:
+  typedef CacheState<A> State;
+
+  CacheImpl() {}
+
+  explicit CacheImpl(const CacheOptions &opts)
+      : CacheBaseImpl< CacheState<A> >(opts) {}
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(CacheImpl);
+};
+
+
+// Use this to make a state iterator for a CacheBaseImpl-derived Fst.
+// You'll need to make this class a friend of your derived Fst.
+// Note this iterator only returns those states reachable from
+// the initial state, so consider implementing a class-specific one.
+template <class F>
+class CacheStateIterator : public StateIteratorBase<typename F::Arc> {
+ public:
+  typedef typename F::Arc Arc;
+  typedef typename Arc::StateId StateId;
+
+  explicit CacheStateIterator(const F &fst) : fst_(fst), s_(0) {}
+
+  virtual bool Done() const {
+    if (s_ < fst_.impl_->NumKnownStates())
+      return false;
+    fst_.Start();  // force start state
+    if (s_ < fst_.impl_->NumKnownStates())
+      return false;
+    for (int u = fst_.impl_->MinUnexpandedState();
+         u < fst_.impl_->NumKnownStates();
+         u = fst_.impl_->MinUnexpandedState()) {
+      ArcIterator<F>(fst_, u);  // force state expansion
+      if (s_ < fst_.impl_->NumKnownStates())
+        return false;
+    }
+    return true;
+  }
+
+  virtual StateId Value() const { return s_; }
+
+  virtual void Next() { ++s_; }
+
+  virtual void Reset() { s_ = 0; }
+
+ private:
+  const F &fst_;
+  StateId s_;
+};
+
+
+// Use this to make an arc iterator for a CacheBaseImpl-derived Fst.
+// You'll need to make this class a friend of your derived Fst and
+// define types Arc and State.
+template <class F>
+class CacheArcIterator {
+ public:
+  typedef typename F::Arc Arc;
+  typedef typename F::State State;
+  typedef typename Arc::StateId StateId;
+
+  CacheArcIterator(const F &fst, StateId s) : i_(0) {
+    state_ = fst.impl_->ExtendState(s);
+    ++state_->ref_count;
+  }
+
+  ~CacheArcIterator() { --state_->ref_count;  }
+
+  bool Done() const { return i_ >= state_->arcs.size(); }
+
+  const Arc& Value() const { return state_->arcs[i_]; }
+
+  void Next() { ++i_; }
+
+  void Reset() { i_ = 0; }
+
+  void Seek(size_t a) { i_ = a; }
+
+ private:
+  const State *state_;
+  size_t i_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(CacheArcIterator);
+};
+
+}  // namespace fst
+
+#endif  // FST_LIB_CACHE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/closure.h b/tools/thirdparty/OpenFst/fst/lib/closure.h
new file mode 100644
index 0000000..1322a6b
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/closure.h
@@ -0,0 +1,142 @@
+// closure.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to compute the concatenative closure of an Fst.
+
+#ifndef FST_LIB_CLOSURE_H__
+#define FST_LIB_CLOSURE_H__
+
+#include "fst/lib/mutable-fst.h"
+#include "fst/lib/rational.h"
+
+namespace fst {
+
+// Computes the concatenative closure. This version modifies its
+// MutableFst input. If FST transduces string x to y with weight a,
+// then the closure transduces x to y with weight a, xx to yy with
+// weight Times(a, a), xxx to yyy with with Times(Times(a, a), a),
+// etc. If closure_type == CLOSURE_STAR, then the empty string is
+// transduced to itself with weight Weight::One() as well.
+//
+// Complexity:
+// - Time: O(V)
+// - Space: O(V)
+// where V = # of states.
+template<class Arc>
+void Closure(MutableFst<Arc> *fst, ClosureType closure_type) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Label Label;
+  typedef typename Arc::Weight Weight;
+
+  uint64 props = fst->Properties(kFstProperties, false);
+  StateId start = fst->Start();
+  for (StateIterator< MutableFst<Arc> > siter(*fst);
+       !siter.Done();
+       siter.Next()) {
+    StateId s = siter.Value();
+    Weight final = fst->Final(s);
+    if (final != Weight::Zero())
+      fst->AddArc(s, Arc(0, 0, final, start));
+  }
+  if (closure_type == CLOSURE_STAR) {
+    StateId nstart = fst->AddState();
+    fst->SetStart(nstart);
+    fst->SetFinal(nstart, Weight::One());
+    if (start != kNoLabel)
+      fst->AddArc(nstart, Arc(0, 0, Weight::One(), start));
+  }
+  fst->SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR),
+                     kFstProperties);
+}
+
+// Computes the concatenative closure. This version modifies its
+// RationalFst input.
+template<class Arc>
+void Closure(RationalFst<Arc> *fst, ClosureType closure_type) {
+  fst->Impl()->AddClosure(closure_type);
+}
+
+
+struct ClosureFstOptions : RationalFstOptions {
+  ClosureType type;
+
+  ClosureFstOptions(const RationalFstOptions &opts, ClosureType t)
+      : RationalFstOptions(opts), type(t) {}
+  explicit ClosureFstOptions(ClosureType t) : type(t) {}
+  ClosureFstOptions() : type(CLOSURE_STAR) {}
+};
+
+
+// Computes the concatenative closure. This version is a delayed
+// Fst. If FST transduces string x to y with weight a, then the
+// closure transduces x to y with weight a, xx to yy with weight
+// Times(a, a), xxx to yyy with weight Times(Times(a, a), a), etc. If
+// closure_type == CLOSURE_STAR, then The empty string is transduced
+// to itself with weight Weight::One() as well.
+//
+// Complexity:
+// - Time: O(v)
+// - Space: O(v)
+// where v = # of states visited. Constant time and space to visit an
+// input state or arc is assumed and exclusive of caching.
+template <class A>
+class ClosureFst : public RationalFst<A> {
+ public:
+  using RationalFst<A>::Impl;
+
+  typedef A Arc;
+
+  ClosureFst(const Fst<A> &fst, ClosureType closure_type) {
+    Impl()->InitClosure(fst, closure_type);
+  }
+
+  ClosureFst(const Fst<A> &fst, const ClosureFstOptions &opts)
+      : RationalFst<A>(opts) {
+    Impl()->InitClosure(fst, opts.type);
+  }
+
+  ClosureFst(const ClosureFst<A> &fst) : RationalFst<A>(fst) {}
+
+  virtual ClosureFst<A> *Copy() const { return new ClosureFst<A>(*this); }
+};
+
+
+// Specialization for ClosureFst.
+template <class A>
+class StateIterator< ClosureFst<A> > : public StateIterator< RationalFst<A> > {
+ public:
+  explicit StateIterator(const ClosureFst<A> &fst)
+      : StateIterator< RationalFst<A> >(fst) {}
+};
+
+
+// Specialization for ClosureFst.
+template <class A>
+class ArcIterator< ClosureFst<A> > : public ArcIterator< RationalFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const ClosureFst<A> &fst, StateId s)
+      : ArcIterator< RationalFst<A> >(fst, s) {}
+};
+
+
+// Useful alias when using StdArc.
+typedef ClosureFst<StdArc> StdClosureFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_CLOSURE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/compat.cpp b/tools/thirdparty/OpenFst/fst/lib/compat.cpp
new file mode 100644
index 0000000..11302a8
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/compat.cpp
@@ -0,0 +1,135 @@
+// compat.cc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Google compatibility definitions.
+
+#include <cstring>
+
+#include "fst/lib/compat.h"
+
+DEFINE_int32(v, 0, "verbose level");
+DEFINE_bool(help, false, "verbose level");
+DEFINE_string(tmpdir, "/tmp/", "temporary directory");
+
+static string prog_name;
+static string flag_usage;
+
+static void out_of_memory() {
+  fprintf(stderr, "%s: Memory allocation failed\n", prog_name.c_str());
+  exit(1);
+}
+
+void InitFst(const char *usage, int *argc, char ***argv, bool remove_flags) {
+  prog_name = (*argv)[0];
+  set_new_handler(out_of_memory);
+
+  flag_usage = usage;
+  int index = 1;
+  for (; index < *argc; ++index) {
+    string argval = (*argv)[index];
+
+    if (argval[0] != '-' || argval == "-")
+      break;
+    while (argval[0] == '-')
+      argval = argval.substr(1);  // remove initial '-'s
+
+    string arg = argval;
+    string val = "";
+
+    // split argval (arg=val) into arg and val
+    size_t pos = argval.find("=");
+    if (pos != string::npos) {
+      arg = argval.substr(0, pos);
+      val = argval.substr(pos + 1);
+    }
+
+    FlagRegister<bool> *bool_register =
+      FlagRegister<bool>::GetRegister();
+    if (bool_register->InitFlag(arg, val))
+      continue;
+    FlagRegister<string> *string_register =
+      FlagRegister<string>::GetRegister();
+    if (string_register->InitFlag(arg, val))
+      continue;
+    FlagRegister<int32> *int32_register =
+      FlagRegister<int32>::GetRegister();
+    if (int32_register->InitFlag(arg, val))
+      continue;
+    FlagRegister<int64> *int64_register =
+      FlagRegister<int64>::GetRegister();
+    if (int64_register->InitFlag(arg, val))
+      continue;
+    FlagRegister<double> *double_register =
+      FlagRegister<double>::GetRegister();
+    if (double_register->InitFlag(arg, val))
+      continue;
+
+    LOG(FATAL) << "FlagInit: Bad option: " << (*argv)[index];
+  }
+
+  if (remove_flags) {
+    for (int i = 0; i < *argc - index; ++i)
+      (*argv)[i + 1] = (*argv)[i + index];
+    *argc -= index - 1;
+  }
+
+  if (FLAGS_help) {
+    ShowUsage();
+    exit(1);
+  }
+}
+
+void ShowUsage() {
+  std::cout << flag_usage << "\n";
+  std::cout << "  Flags Description:\n";
+  FlagRegister<bool> *bool_register = FlagRegister<bool>::GetRegister();
+  bool_register->ShowUsage();
+  FlagRegister<string> *string_register = FlagRegister<string>::GetRegister();
+  string_register->ShowUsage();
+  FlagRegister<int32> *int32_register = FlagRegister<int32>::GetRegister();
+  int32_register->ShowUsage();
+  FlagRegister<int64> *int64_register = FlagRegister<int64>::GetRegister();
+  int64_register->ShowUsage();
+  FlagRegister<double> *double_register = FlagRegister<double>::GetRegister();
+  double_register->ShowUsage();
+}
+
+void SplitToVector(char* full, const char* delim, vector<char*>* vec,
+                   bool omit_empty_strings) {
+  char* next  = full;
+  while((next = strsep(&full, delim)) != NULL) {
+   if (omit_empty_strings && next[0] == '\0') continue;
+   vec->push_back(next);
+  }
+  // Add last element (or full string if no delimeter found):
+  if (full != NULL) {
+    vec->push_back(full);
+  }
+}
+
+
+MD5::MD5() {}  // ?OP?
+
+void MD5::Reset() {}  // ?OP?
+
+void MD5::Update(void const *data, int size) {}  // ?OP?
+
+string MD5::Digest() { return ""; }  // every matches! ?OP?
+
+
+Mutex::Mutex() {}  // ?OP?
+
+MutexLock::MutexLock(Mutex *mutex) {}  // ?OP?
diff --git a/tools/thirdparty/OpenFst/fst/lib/compat.h b/tools/thirdparty/OpenFst/fst/lib/compat.h
new file mode 100644
index 0000000..4c27ee3
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/compat.h
@@ -0,0 +1,314 @@
+// compat.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Google compatibility declarations and inline definitions.
+
+#ifndef FST_COMPAT_H__
+#define FST_COMPAT_H__
+
+// for STL
+#include <cassert>
+#include <cstdio>
+#include <iostream>
+#include <map>
+#include <string>
+#include <vector>
+
+#include <ext/hash_map>
+#include <fcntl.h>
+#include <pthread.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+// exact size types
+typedef short int16;
+typedef int int32;
+typedef long long int64;
+
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+typedef unsigned long long uint64;
+
+using namespace std;
+
+// make copy constructor and operator= private
+#define DISALLOW_EVIL_CONSTRUCTORS(type)    \
+  type(const type&);                        \
+  void operator=(const type&)
+
+// thread control
+class Mutex {
+ public:
+  Mutex();
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(Mutex);
+};
+
+class MutexLock {
+ public:
+  MutexLock(Mutex *);
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(MutexLock);
+};
+
+
+// flags
+#define DECLARE_bool(name) extern bool FLAGS_ ## name
+#define DECLARE_string(name) extern string FLAGS_ ## name
+#define DECLARE_int32(name) extern int32 FLAGS_ ## name
+#define DECLARE_int64(name) extern int64 FLAGS_ ## name
+#define DECLARE_double(name) extern double FLAGS_ ## name
+
+template <typename T>
+struct FlagDescription {
+  FlagDescription(T *addr, const char *doc, const char *type, const T val)
+      : address(addr), doc_string(doc), type_name(type), default_value(val) {}
+
+  T *address;
+  const char *doc_string;
+  const char *type_name;
+  const T default_value;
+};
+
+template <typename T>
+class FlagRegister {
+ public:
+  static FlagRegister<T> *GetRegister() {
+    pthread_once(&register_init_, &FlagRegister<T>::Init);
+    return register_;
+  }
+
+  const FlagDescription<T> &GetFlagDescription(const string &name) const {
+    MutexLock l(register_lock_);
+    typename map< string, FlagDescription<T> >::const_iterator it =
+      flag_table_.find(name);
+    return it != flag_table_.end() ? it->second : 0;
+  }
+  void SetDescription(const string &name, const FlagDescription<T> &desc) {
+    MutexLock l(register_lock_);
+    flag_table_.insert(make_pair(name, desc));
+  }
+
+  bool SetFlag(const string &val, bool *address) const {
+    if (val == "true" || val == "1" || val.empty()) {
+      *address = true;
+      return true;
+    } else if (val == "false" || val == "0") {
+      *address = false;
+      return true;
+    }
+    else {
+      return false;
+    }
+  }
+  bool SetFlag(const string &val, string *address) const {
+    *address = val;
+    return true;
+  }
+  bool SetFlag(const string &val, int32 *address) const {
+    char *p = 0;
+    *address = strtol(val.c_str(), &p, 0);
+    return !val.empty() && *p == '\0';
+  }
+  bool SetFlag(const string &val, int64 *address) const {
+    char *p = 0;
+    *address = strtoll(val.c_str(), &p, 0);
+    return !val.empty() && *p == '\0';
+  }
+  bool SetFlag(const string &val, double *address) const {
+    char *p = 0;
+    *address = strtod(val.c_str(), &p);
+    return !val.empty() && *p == '\0';
+  }
+
+  bool InitFlag(const string &arg, const string &val) const {
+    for (typename map< string, FlagDescription<T> >::const_iterator it =
+           flag_table_.begin();
+         it != flag_table_.end();
+         ++it) {
+      const string &name = it->first;
+      const FlagDescription<T> &desc = it->second;
+      if (arg == name)
+        return SetFlag(val, desc.address);
+    }
+    return false;
+  }
+
+  void ShowDefault(bool default_value) const {
+    std::cout << ", default = ";
+    std::cout << (default_value ? "true" : "false");
+  }
+  void ShowDefault(const string &default_value) const {
+    std::cout << ", default = ";
+    std::cout << "\"" << default_value << "\"";
+  }
+  template<typename V> void ShowDefault(const V& default_value) const {
+    std::cout << ", default = ";
+    std::cout << default_value;
+  }
+  void ShowUsage() const {
+    for (typename map< string, FlagDescription<T> >::const_iterator it =
+           flag_table_.begin();
+         it != flag_table_.end();
+         ++it) {
+      const string &name = it->first;
+      const FlagDescription<T> &desc = it->second;
+      std::cout << "    --" << name
+           << ": type = " << desc.type_name;
+      ShowDefault(desc.default_value);
+      std::cout << "\n      " << desc.doc_string  << "\n";
+    }
+  }
+
+ private:
+  static void Init() {
+    register_lock_ = new Mutex;
+    register_ = new FlagRegister<T>;
+  }
+  static pthread_once_t register_init_;   // ensures only called once
+  static Mutex* register_lock_;           // multithreading lock
+  static FlagRegister<T> *register_;
+
+  map< string, FlagDescription<T> > flag_table_;
+};
+
+template <class T>
+pthread_once_t FlagRegister<T>::register_init_ = PTHREAD_ONCE_INIT;
+
+template <class T>
+Mutex *FlagRegister<T>::register_lock_ = 0;
+
+template <class T>
+FlagRegister<T> *FlagRegister<T>::register_ = 0;
+
+
+template <typename T>
+class FlagRegisterer {
+ public:
+  FlagRegisterer(const string &name, const FlagDescription<T> &desc) {
+    FlagRegister<T> *registr = FlagRegister<T>::GetRegister();
+    registr->SetDescription(name, desc);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(FlagRegisterer);
+};
+
+
+#define DEFINE_VAR(type, name, value, doc)                                \
+  type FLAGS_ ## name = value;                                            \
+  static FlagRegisterer<type>                                             \
+  name ## _flags_registerer(#name, FlagDescription<type>(&FLAGS_ ## name, \
+                                                         doc,             \
+                                                         #type,           \
+                                                         value))
+
+#define DEFINE_bool(name, value, doc) DEFINE_VAR(bool, name, value, doc)
+#define DEFINE_string(name, value, doc) DEFINE_VAR(string, name, value, doc)
+#define DEFINE_int32(name, value, doc) DEFINE_VAR(int32, name, value, doc)
+#define DEFINE_int64(name, value, doc) DEFINE_VAR(int64, name, value, doc)
+#define DEFINE_double(name, value, doc) DEFINE_VAR(double, name, value, doc)
+
+void InitFst(const char *usage, int *argc, char ***argv, bool remove_flags);
+
+void ShowUsage();
+
+
+// checking
+#define CHECK(x) assert(x)
+#define CHECK_EQ(x, y) assert((x) == (y))
+
+// logging
+DECLARE_int32(v);
+
+// tmp directory
+DECLARE_string(tmpdir);
+
+class LogMessage {
+ public:
+  LogMessage(const string &type) : fatal_(type == "FATAL") {
+    std::cerr << type << ": ";
+  }
+  ~LogMessage() {
+    std::cerr << endl;
+    if(fatal_)
+      exit(1);
+  }
+  ostream &stream() { return std::cerr; }
+
+ private:
+  bool fatal_;
+};
+
+#define LOG(type) LogMessage(#type).stream()
+#define VLOG(level) if ((level) <= FLAGS_v) LOG(INFO)
+
+
+// string utilities
+void SplitToVector(char *line, const char *delim,
+                   vector<char *> *vec, bool omit_empty_strings);
+
+// Downcasting
+template<typename To, typename From>
+inline To down_cast(From* f) {
+  return static_cast<To>(f);
+}
+
+// Bitcasting
+template <class Dest, class Source>
+inline Dest bit_cast(const Source& source) {
+  // Compile time assertion: sizeof(Dest) == sizeof(Source)
+  // A compile error here means your Dest and Source have different sizes.
+  typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 :
+                                    -1];
+  Dest dest;
+  memcpy(&dest, &source, sizeof(dest));
+  return dest;
+}
+
+// MD5 checksums
+class MD5 {
+ public:
+  MD5();
+  void Reset();
+  void Update(void const *data, int size);
+  string Digest();
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(MD5);
+};
+
+// Hashing functions
+namespace __gnu_cxx {
+
+template<> struct hash<int64> {
+  size_t operator()(int64 x) const {
+    return x;
+  }
+};
+
+template<> struct hash<string> {
+  size_t operator()(const string &s) const {
+    return __stl_hash_string(s.c_str());
+  }
+};
+
+}  // namespace __gnu_cxx
+
+#endif  // FST_COMPAT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/complement.h b/tools/thirdparty/OpenFst/fst/lib/complement.h
new file mode 100644
index 0000000..c727220
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/complement.h
@@ -0,0 +1,293 @@
+// complement.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Class to complement an Fst.
+
+#ifndef FST_LIB_COMPLEMENT_H__
+#define FST_LIB_COMPLEMENT_H__
+
+#include <algorithm>
+
+#include "fst/lib/fst.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+template <class A> class ComplementFst;
+
+// Implementation of delayed ComplementFst. The algorithm used
+// completes the (deterministic) FSA and then exchanges final and
+// non-final states.  Completion, i.e. ensuring that all labels can be
+// read from every state, is accomplished by using RHO labels, which
+// match all labels that are otherwise not found leaving a state. The
+// first state in the output is reserved to be a new state that is the
+// destination of all RHO labels. Each remaining output state s
+// corresponds to input state s - 1. The first arc in the output at
+// these states is the rho label, the remaining arcs correspond to the
+// input arcs.
+template<class A>
+class ComplementFstImpl : public FstImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+
+  friend class StateIterator< ComplementFst<A> >;
+  friend class ArcIterator< ComplementFst<A> >;
+
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  explicit ComplementFstImpl(const Fst<A> &fst) : fst_(fst.Copy()) {
+    SetType("complement");
+    uint64 props = fst.Properties(kILabelSorted, false);
+    SetProperties(ComplementProperties(props), kCopyProperties);
+    SetInputSymbols(fst.InputSymbols());
+    SetOutputSymbols(fst.OutputSymbols());
+  }
+
+  ~ComplementFstImpl() { delete fst_; }
+
+  StateId Start() const {
+    StateId start = fst_->Start();
+    if (start != kNoStateId)
+      return start + 1;
+    else
+      return 0;
+  }
+
+  // Exchange final and non-final states; make rho destination state final.
+  Weight Final(StateId s) const {
+    if (s == 0 || fst_->Final(s - 1) == Weight::Zero())
+      return Weight::One();
+    else
+      return Weight::Zero();
+  }
+
+  size_t NumArcs(StateId s) const {
+    if (s == 0)
+      return 1;
+    else
+      return fst_->NumArcs(s - 1) + 1;
+  }
+
+  size_t NumInputEpsilons(StateId s) const {
+    return s == 0 ? 0 : fst_->NumInputEpsilons(s - 1);
+  }
+
+  size_t NumOutputEpsilons(StateId s) const {
+    return s == 0 ? 0 : fst_->NumOutputEpsilons(s - 1);
+  }
+
+ private:
+  const Fst<A> *fst_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(ComplementFstImpl);
+};
+
+
+// Complements an automaton; this is a library-internal operation
+// that introduces the rho label. This version is a delayed Fst.
+template <class A>
+class ComplementFst : public Fst<A> {
+ public:
+  friend class StateIterator< ComplementFst<A> >;
+  friend class ArcIterator< ComplementFst<A> >;
+
+  typedef A Arc;
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  explicit ComplementFst(const Fst<A> &fst)
+      : impl_(new ComplementFstImpl<A>(fst)) {
+    uint64 props = kUnweighted | kNoEpsilons | kIDeterministic | kAcceptor;
+    if (fst.Properties(props, true) != props)
+      LOG(FATAL) << "ComplementFst: argument not an unweighted"
+                 << " epsilon-free deterministic acceptor";
+  }
+
+  ComplementFst(const ComplementFst<A> &fst) : impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~ComplementFst() { if (!impl_->DecrRefCount()) { delete impl_;  }}
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual ComplementFst<A> *Copy() const {
+    return new ComplementFst<A>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual inline void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual inline void InitArcIterator(StateId s,
+                                      ArcIteratorData<A> *data) const;
+
+ private:
+  ComplementFstImpl<A> *impl_;
+
+  void operator=(const ComplementFst<A> &fst);  // disallow
+};
+
+
+// Specialization for ComplementFst.
+template <class A>
+class StateIterator< ComplementFst<A> > : public StateIteratorBase<A> {
+ public:
+  typedef typename A::StateId StateId;
+  typedef typename A::Label Label;
+
+  explicit StateIterator(const ComplementFst<A> &fst)
+      : siter_(*fst.impl_->fst_), s_(0) {
+  }
+
+  virtual bool Done() const { return s_ > 0 && siter_.Done(); }
+  virtual StateId Value() const { return s_; }
+  virtual void Next() {
+    if (s_ != 0)
+      siter_.Next();
+    ++s_;
+  }
+  virtual void Reset() {
+    siter_.Reset();
+    s_ = 0;
+  }
+
+ private:
+  StateIterator< Fst<A> > siter_;
+  StateId s_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(StateIterator);
+};
+
+
+// Specialization for ComplementFst.
+template <class A>
+class ArcIterator< ComplementFst<A> > : public ArcIteratorBase<A> {
+ public:
+  typedef typename A::StateId StateId;
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+
+  ArcIterator(const ComplementFst<A> &fst, StateId s)
+      : aiter_(0), s_(s), pos_(0) {
+    if (s_ != 0)
+      aiter_ = new ArcIterator< Fst<A> >(*fst.impl_->fst_, s - 1);
+  }
+  virtual ~ArcIterator() { delete aiter_; }
+
+  virtual bool Done() const {
+    if (s_ != 0)
+      return pos_ > 0 && aiter_->Done();
+    else
+      return pos_ > 0;
+  }
+
+  // Adds the rho label to the rho destination state.
+  virtual const A& Value() const {
+    if (pos_ == 0) {
+      arc_.ilabel = arc_.olabel = kRhoLabel;
+      arc_.weight = Weight::One();
+      arc_.nextstate = 0;
+    } else {
+      arc_ = aiter_->Value();
+      ++arc_.nextstate;
+    }
+    return arc_;
+  }
+  virtual void Next() {
+    if (s_ != 0 && pos_ > 0)
+      aiter_->Next();
+    ++pos_;
+  }
+  virtual void Reset() {
+    if (s_ != 0)
+      aiter_->Reset();
+    pos_ = 0;
+  }
+  virtual void Seek(size_t a) {
+    if (s_ != 0) {
+      if (a == 0) {
+        aiter_->Reset();
+      } else {
+        aiter_->Seek(a - 1);
+      }
+    }
+    pos_ = a;
+  }
+
+ private:
+  ArcIterator< Fst<A> > *aiter_;
+  StateId s_;
+  size_t pos_;
+  mutable A arc_;
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+
+template <class A> inline void
+ComplementFst<A>::InitStateIterator(StateIteratorData<A> *data) const {
+  data->base = new StateIterator< ComplementFst<A> >(*this);
+}
+
+template <class A> inline void
+ComplementFst<A>::InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+  data->base = new ArcIterator< ComplementFst<A> >(*this, s);
+}
+
+
+// Useful alias when using StdArc.
+typedef ComplementFst<StdArc> StdComplementFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_COMPLEMENT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/compose.h b/tools/thirdparty/OpenFst/fst/lib/compose.h
new file mode 100644
index 0000000..24b169f
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/compose.h
@@ -0,0 +1,910 @@
+// compose.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Class to compute the composition of two FSTs
+
+#ifndef FST_LIB_COMPOSE_H__
+#define FST_LIB_COMPOSE_H__
+
+#include <algorithm>
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+
+#include "fst/lib/cache.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+// Enumeration of uint64 bits used to represent the user-defined
+// properties of FST composition (in the template parameter to
+// ComposeFstOptions<T>). The bits stand for extensions of generic FST
+// composition. ComposeFstOptions<> (all the bits unset) is the "plain"
+// compose without any extra extensions.
+enum ComposeTypes {
+  // RHO: flags dealing with a special "rest" symbol in the FSTs.
+  // NB: at most one of the bits COMPOSE_FST1_RHO, COMPOSE_FST2_RHO
+  // may be set.
+  COMPOSE_FST1_RHO    = 1ULL<<0,  // "Rest" symbol on the output side of fst1.
+  COMPOSE_FST2_RHO    = 1ULL<<1,  // "Rest" symbol on the input side of fst2.
+  COMPOSE_FST1_PHI    = 1ULL<<2,  // "Failure" symbol on the output
+                                  // side of fst1.
+  COMPOSE_FST2_PHI    = 1ULL<<3,  // "Failure" symbol on the input side
+                                  // of fst2.
+  COMPOSE_FST1_SIGMA  = 1ULL<<4,  // "Any" symbol on the output side of
+                                  // fst1.
+  COMPOSE_FST2_SIGMA  = 1ULL<<5,  // "Any" symbol on the input side of
+                                  // fst2.
+  // Optimization related bits.
+  COMPOSE_GENERIC     = 1ULL<<32,  // Disables optimizations, applies
+                                   // the generic version of the
+                                   // composition algorithm. This flag
+                                   // is used for internal testing
+                                   // only.
+
+  // -----------------------------------------------------------------
+  // Auxiliary enum values denoting specific combinations of
+  // bits. Internal use only.
+  COMPOSE_RHO         = COMPOSE_FST1_RHO | COMPOSE_FST2_RHO,
+  COMPOSE_PHI         = COMPOSE_FST1_PHI | COMPOSE_FST2_PHI,
+  COMPOSE_SIGMA       = COMPOSE_FST1_SIGMA | COMPOSE_FST2_SIGMA,
+  COMPOSE_SPECIAL_SYMBOLS = COMPOSE_RHO | COMPOSE_PHI | COMPOSE_SIGMA,
+
+  // -----------------------------------------------------------------
+  // The following bits, denoting specific optimizations, are
+  // typically set *internally* by the composition algorithm.
+  COMPOSE_FST1_STRING = 1ULL<<33,  // fst1 is a string
+  COMPOSE_FST2_STRING = 1ULL<<34,  // fst2 is a string
+  COMPOSE_FST1_DET    = 1ULL<<35,  // fst1 is deterministic
+  COMPOSE_FST2_DET    = 1ULL<<36,  // fst2 is deterministic
+  COMPOSE_INTERNAL_MASK    = 0xffffffff00000000ULL
+};
+
+
+template <uint64 T = 0ULL>
+struct ComposeFstOptions : public CacheOptions {
+  explicit ComposeFstOptions(const CacheOptions &opts) : CacheOptions(opts) {}
+  ComposeFstOptions() { }
+};
+
+
+// Abstract base for the implementation of delayed ComposeFst. The
+// concrete specializations are templated on the (uint64-valued)
+// properties of the FSTs being composed.
+template <class A>
+class ComposeFstImplBase : public CacheImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+
+  using CacheBaseImpl< CacheState<A> >::HasStart;
+  using CacheBaseImpl< CacheState<A> >::HasFinal;
+  using CacheBaseImpl< CacheState<A> >::HasArcs;
+
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  ComposeFstImplBase(const Fst<A> &fst1,
+                     const Fst<A> &fst2,
+                     const CacheOptions &opts)
+      :CacheImpl<A>(opts), fst1_(fst1.Copy()), fst2_(fst2.Copy()) {
+    SetType("compose");
+    uint64 props1 = fst1.Properties(kFstProperties, false);
+    uint64 props2 = fst2.Properties(kFstProperties, false);
+    SetProperties(ComposeProperties(props1, props2), kCopyProperties);
+
+    if (!CompatSymbols(fst2.InputSymbols(), fst1.OutputSymbols()))
+      LOG(FATAL) << "ComposeFst: output symbol table of 1st argument "
+                 << "does not match input symbol table of 2nd argument";
+
+    SetInputSymbols(fst1.InputSymbols());
+    SetOutputSymbols(fst2.OutputSymbols());
+  }
+
+  virtual ~ComposeFstImplBase() {
+    delete fst1_;
+    delete fst2_;
+  }
+
+  StateId Start() {
+    if (!HasStart()) {
+      StateId start = ComputeStart();
+      if (start != kNoStateId) {
+        SetStart(start);
+      }
+    }
+    return CacheImpl<A>::Start();
+  }
+
+  Weight Final(StateId s) {
+    if (!HasFinal(s)) {
+      Weight final = ComputeFinal(s);
+      SetFinal(s, final);
+    }
+    return CacheImpl<A>::Final(s);
+  }
+
+  virtual void Expand(StateId s) = 0;
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumOutputEpsilons(s);
+  }
+
+  void InitArcIterator(StateId s, ArcIteratorData<A> *data) {
+    if (!HasArcs(s))
+      Expand(s);
+    CacheImpl<A>::InitArcIterator(s, data);
+  }
+
+  // Access to flags encoding compose options/optimizations etc.  (for
+  // debugging).
+  virtual uint64 ComposeFlags() const = 0;
+
+ protected:
+  virtual StateId ComputeStart() = 0;
+  virtual Weight ComputeFinal(StateId s) = 0;
+
+  const Fst<A> *fst1_;            // first input Fst
+  const Fst<A> *fst2_;            // second input Fst
+};
+
+
+// The following class encapsulates implementation-dependent details
+// of state tuple lookup, i.e. a bijective mapping from triples of two
+// FST states and an epsilon filter state to the corresponding state
+// IDs of the fst resulting from composition. The mapping must
+// implement the [] operator in the style of STL associative
+// containers (map, hash_map), i.e. table[x] must return a reference
+// to the value associated with x. If x is an unassigned tuple, the
+// operator must automatically associate x with value 0.
+//
+// NB: "table[x] == 0" for unassigned tuples x is required by the
+// following off-by-one device used in the implementation of
+// ComposeFstImpl. The value stored in the table is equal to tuple ID
+// plus one, i.e. it is always a strictly positive number. Therefore,
+// table[x] is equal to 0 if and only if x is an unassigned tuple (in
+// which the algorithm assigns a new ID to x, and sets table[x] -
+// stored in a reference - to "new ID + 1"). This form of lookup is
+// more efficient than calling "find(x)" and "insert(make_pair(x, new
+// ID))" if x is an unassigned tuple.
+//
+// The generic implementation is a wrapper around a hash_map.
+template <class A, uint64 T>
+class ComposeStateTable {
+ public:
+  typedef typename A::StateId StateId;
+
+  struct StateTuple {
+    StateTuple() {}
+    StateTuple(StateId s1, StateId s2, int f)
+        : state_id1(s1), state_id2(s2), filt(f) {}
+    StateId state_id1;  // state Id on fst1
+    StateId state_id2;  // state Id on fst2
+    int filt;           // epsilon filter state
+  };
+
+  ComposeStateTable() {
+    StateTuple empty_tuple(kNoStateId, kNoStateId, 0);
+  }
+
+  // NB: if 'tuple' is not in 'table_', the pair (tuple, StateId()) is
+  // inserted into 'table_' (standard STL container semantics). Since
+  // StateId is a built-in type, the explicit default constructor call
+  // StateId() returns 0.
+  StateId &operator[](const StateTuple &tuple) {
+    return table_[tuple];
+  }
+
+ private:
+  // Comparison object for hashing StateTuple(s).
+  class StateTupleEqual {
+   public:
+    bool operator()(const StateTuple& x, const StateTuple& y) const {
+      return x.state_id1 == y.state_id1 &&
+             x.state_id2 == y.state_id2 &&
+             x.filt == y.filt;
+    }
+  };
+
+  static const int kPrime0 = 7853;
+  static const int kPrime1 = 7867;
+
+  // Hash function for StateTuple to Fst states.
+  class StateTupleKey {
+   public:
+    size_t operator()(const StateTuple& x) const {
+      return static_cast<size_t>(x.state_id1 +
+                                 x.state_id2 * kPrime0 +
+                                 x.filt * kPrime1);
+    }
+  };
+
+  // Lookup table mapping state tuples to state IDs.
+  typedef hash_map<StateTuple,
+                         StateId,
+                         StateTupleKey,
+                         StateTupleEqual> StateTable;
+ // Actual table data.
+  StateTable table_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(ComposeStateTable);
+};
+
+
+// State tuple lookup table for the composition of a string FST with a
+// deterministic FST.  The class maps state tuples to their unique IDs
+// (i.e. states of the ComposeFst). Main optimization: due to the
+// 1-to-1 correspondence between the states of the input string FST
+// and those of the resulting (string) FST, a state tuple (s1, s2) is
+// simply mapped to StateId s1. Hence, we use an STL vector as a
+// lookup table. Template argument Fst1IsString specifies which FST is
+// a string (this determines whether or not we index the lookup table
+// by the first or by the second state).
+template <class A, bool Fst1IsString>
+class StringDetComposeStateTable {
+ public:
+  typedef typename A::StateId StateId;
+
+  struct StateTuple {
+    typedef typename A::StateId StateId;
+    StateTuple() {}
+    StateTuple(StateId s1, StateId s2, int /* f */)
+        : state_id1(s1), state_id2(s2) {}
+    StateId state_id1;  // state Id on fst1
+    StateId state_id2;  // state Id on fst2
+    static const int filt = 0;  // 'fake' epsilon filter - only needed
+                                // for API compatibility
+  };
+
+  StringDetComposeStateTable() {}
+
+  // Subscript operator. Behaves in a way similar to its map/hash_map
+  // counterpart, i.e. returns a reference to the value associated
+  // with 'tuple', inserting a 0 value if 'tuple' is unassigned.
+  StateId &operator[](const StateTuple &tuple) {
+    StateId index = Fst1IsString ? tuple.state_id1 : tuple.state_id2;
+    if (index >= (StateId)data_.size()) { 
+      // NB: all values in [old_size; index] are initialized to 0.
+      data_.resize(index + 1);
+    }
+    return data_[index];
+  }
+
+ private:
+  vector<StateId> data_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(StringDetComposeStateTable);
+};
+
+
+// Specializations of ComposeStateTable for the string/det case.
+// Both inherit from StringDetComposeStateTable.
+template <class A>
+class ComposeStateTable<A, COMPOSE_FST1_STRING | COMPOSE_FST2_DET>
+    : public StringDetComposeStateTable<A, true> { };
+
+template <class A>
+class ComposeStateTable<A, COMPOSE_FST2_STRING | COMPOSE_FST1_DET>
+    : public StringDetComposeStateTable<A, false> { };
+
+
+// Parameterized implementation of FST composition for a pair of FSTs
+// matching the property bit vector T. If possible,
+// instantiation-specific switches in the code are based on the values
+// of the bits in T, which are known at compile time, so unused code
+// should be optimized away by the compiler.
+template <class A, uint64 T>
+class ComposeFstImpl : public ComposeFstImplBase<A> {
+  typedef typename A::StateId StateId;
+  typedef typename A::Label   Label;
+  typedef typename A::Weight  Weight;
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+
+  enum FindType { FIND_INPUT  = 1,          // find input label on fst2
+                  FIND_OUTPUT = 2,          // find output label on fst1
+                  FIND_BOTH   = 3 };        // find choice state dependent
+
+  typedef ComposeStateTable<A, T & COMPOSE_INTERNAL_MASK> StateTupleTable;
+  typedef typename StateTupleTable::StateTuple StateTuple;
+
+ public:
+  ComposeFstImpl(const Fst<A> &fst1,
+                 const Fst<A> &fst2,
+                 const CacheOptions &opts)
+      :ComposeFstImplBase<A>(fst1, fst2, opts) {
+
+    bool osorted = fst1.Properties(kOLabelSorted, false);
+    bool isorted = fst2.Properties(kILabelSorted, false);
+
+    switch (T & COMPOSE_SPECIAL_SYMBOLS) {
+      case COMPOSE_FST1_RHO:
+      case COMPOSE_FST1_PHI:
+      case COMPOSE_FST1_SIGMA:
+        if (!osorted || FLAGS_fst_verify_properties)
+          osorted = fst1.Properties(kOLabelSorted, true);
+        if (!osorted)
+          LOG(FATAL) << "ComposeFst: 1st argument not output label "
+                     << "sorted (special symbols present)";
+        break;
+      case COMPOSE_FST2_RHO:
+      case COMPOSE_FST2_PHI:
+      case COMPOSE_FST2_SIGMA:
+        if (!isorted || FLAGS_fst_verify_properties)
+          isorted = fst2.Properties(kILabelSorted, true);
+        if (!isorted)
+          LOG(FATAL) << "ComposeFst: 2nd argument not input label "
+                     << "sorted (special symbols present)";
+        break;
+      case 0:
+        if (!isorted && !osorted || FLAGS_fst_verify_properties) {
+          osorted = fst1.Properties(kOLabelSorted, true);
+          if (!osorted)
+            isorted = fst2.Properties(kILabelSorted, true);
+        }
+        break;
+      default:
+        LOG(FATAL)
+          << "ComposeFst: More than one special symbol used in composition";
+    }
+
+    if (isorted && (T & COMPOSE_FST2_SIGMA)) {
+      find_type_ = FIND_INPUT;
+    } else if (osorted && (T & COMPOSE_FST1_SIGMA)) {
+      find_type_ = FIND_OUTPUT;
+    } else if (isorted && (T & COMPOSE_FST2_PHI)) {
+      find_type_ = FIND_INPUT;
+    } else if (osorted && (T & COMPOSE_FST1_PHI)) {
+      find_type_ = FIND_OUTPUT;
+    } else if (isorted && (T & COMPOSE_FST2_RHO)) {
+      find_type_ = FIND_INPUT;
+    } else if (osorted && (T & COMPOSE_FST1_RHO)) {
+      find_type_ = FIND_OUTPUT;
+    } else if (isorted && (T & COMPOSE_FST1_STRING)) {
+      find_type_ = FIND_INPUT;
+    } else if(osorted && (T & COMPOSE_FST2_STRING)) {
+      find_type_ = FIND_OUTPUT;
+    } else if (isorted && osorted) {
+      find_type_ = FIND_BOTH;
+    } else if (isorted) {
+      find_type_ = FIND_INPUT;
+    } else if (osorted) {
+      find_type_ = FIND_OUTPUT;
+    } else {
+      LOG(FATAL) << "ComposeFst: 1st argument not output label sorted "
+                 << "and 2nd argument is not input label sorted";
+    }
+  }
+
+  // Finds/creates an Fst state given a StateTuple.  Only creates a new
+  // state if StateTuple is not found in the state hash.
+  //
+  // The method exploits the following device: all pairs stored in the
+  // associative container state_tuple_table_ are of the form (tuple,
+  // id(tuple) + 1), i.e. state_tuple_table_[tuple] > 0 if tuple has
+  // been stored previously. For unassigned tuples, the call to
+  // state_tuple_table_[tuple] creates a new pair (tuple, 0). As a
+  // result, state_tuple_table_[tuple] == 0 iff tuple is new.
+  StateId FindState(const StateTuple& tuple) {
+    StateId &assoc_value = state_tuple_table_[tuple];
+    if (assoc_value == 0) {  // tuple wasn't present in lookup table:
+                             // assign it a new ID.
+      state_tuples_.push_back(tuple);
+      assoc_value = state_tuples_.size();
+    }
+    return assoc_value - 1;  // NB: assoc_value = ID + 1
+  }
+
+  // Generates arc for composition state s from matched input Fst arcs.
+  void AddArc(StateId s, const A &arca, const A &arcb, int f,
+              bool find_input) {
+    A arc;
+    if (find_input) {
+      arc.ilabel = arcb.ilabel;
+      arc.olabel = arca.olabel;
+      arc.weight = Times(arcb.weight, arca.weight);
+      StateTuple tuple(arcb.nextstate, arca.nextstate, f);
+      arc.nextstate = FindState(tuple);
+    } else {
+      arc.ilabel = arca.ilabel;
+      arc.olabel = arcb.olabel;
+      arc.weight = Times(arca.weight, arcb.weight);
+      StateTuple tuple(arca.nextstate, arcb.nextstate, f);
+      arc.nextstate = FindState(tuple);
+    }
+    CacheImpl<A>::AddArc(s, arc);
+  }
+
+  // Arranges it so that the first arg to OrderedExpand is the Fst
+  // that will be passed to FindLabel.
+  void Expand(StateId s) {
+    StateTuple &tuple = state_tuples_[s];
+    StateId s1 = tuple.state_id1;
+    StateId s2 = tuple.state_id2;
+    int f = tuple.filt;
+    if (find_type_ == FIND_INPUT)
+      OrderedExpand(s, ComposeFstImplBase<A>::fst2_, s2,
+                    ComposeFstImplBase<A>::fst1_, s1, f, true);
+    else
+      OrderedExpand(s, ComposeFstImplBase<A>::fst1_, s1,
+                    ComposeFstImplBase<A>::fst2_, s2, f, false);
+  }
+
+  // Access to flags encoding compose options/optimizations etc.  (for
+  // debugging).
+  virtual uint64 ComposeFlags() const { return T; }
+
+ private:
+  // This does that actual matching of labels in the composition. The
+  // arguments are ordered so FindLabel is called with state SA of
+  // FSTA for each arc leaving state SB of FSTB. The FIND_INPUT arg
+  // determines whether the input or output label of arcs at SB is
+  // the one to match on.
+  void OrderedExpand(StateId s, const Fst<A> *fsta, StateId sa,
+                     const Fst<A> *fstb, StateId sb, int f, bool find_input) {
+
+    size_t numarcsa = fsta->NumArcs(sa);
+    size_t numepsa = find_input ? fsta->NumInputEpsilons(sa) :
+                     fsta->NumOutputEpsilons(sa);
+    bool finala = fsta->Final(sa) != Weight::Zero();
+    ArcIterator< Fst<A> > aitera(*fsta, sa);
+    // First handle special epsilons and sigmas on FSTA
+    for (; !aitera.Done(); aitera.Next()) {
+      const A &arca = aitera.Value();
+      Label match_labela = find_input ? arca.ilabel : arca.olabel;
+      if (match_labela > 0) {
+        break;
+      }
+      if ((T & COMPOSE_SIGMA) != 0 &&  match_labela == kSigmaLabel) {
+        // Found a sigma? Match it against all (non-special) symbols
+        // on side b.
+        for (ArcIterator< Fst<A> > aiterb(*fstb, sb);
+             !aiterb.Done();
+             aiterb.Next()) {
+          const A &arcb = aiterb.Value();
+          Label labelb = find_input ? arcb.olabel : arcb.ilabel;
+          if (labelb <= 0) continue;
+          AddArc(s, arca, arcb, 0, find_input);
+        }
+      } else if (f == 0 && match_labela == 0) {
+        A earcb(0, 0, Weight::One(), sb);
+        AddArc(s, arca, earcb, 0, find_input);  // move forward on epsilon
+      }
+    }
+    // Next handle non-epsilon matches, rho labels, and epsilons on FSTB
+    for (ArcIterator< Fst<A> > aiterb(*fstb, sb);
+         !aiterb.Done();
+         aiterb.Next()) {
+      const A &arcb = aiterb.Value();
+      Label match_labelb = find_input ? arcb.olabel : arcb.ilabel;
+      if (match_labelb) {  // Consider non-epsilon match
+        if (FindLabel(&aitera, numarcsa, match_labelb, find_input)) {
+          for (; !aitera.Done(); aitera.Next()) {
+            const A &arca = aitera.Value();
+            Label match_labela = find_input ? arca.ilabel : arca.olabel;
+            if (match_labela != match_labelb)
+              break;
+            AddArc(s, arca, arcb, 0, find_input);  // move forward on match
+          }
+        } else if ((T & COMPOSE_SPECIAL_SYMBOLS) != 0) {
+          // If there is no transition labelled 'match_labelb' in
+          // fsta, try matching 'match_labelb' against special symbols
+          // (Phi, Rho,...).
+          for (aitera.Reset(); !aitera.Done(); aitera.Next()) {
+            A arca = aitera.Value();
+            Label labela = find_input ? arca.ilabel : arca.olabel;
+            if (labela >= 0) {
+              break;
+            } else if (((T & COMPOSE_PHI) != 0) && (labela == kPhiLabel)) {
+              // Case 1: if a failure transition exists, follow its
+              // transitive closure until a) a transition labelled
+              // 'match_labelb' is found, or b) the initial state of
+              // fsta is reached.
+
+              StateId sf = sa;  // Start of current failure transition.
+              while (labela == kPhiLabel && sf != arca.nextstate) {
+                sf = arca.nextstate;
+
+                size_t numarcsf = fsta->NumArcs(sf);
+                ArcIterator< Fst<A> > aiterf(*fsta, sf);
+                if (FindLabel(&aiterf, numarcsf, match_labelb, find_input)) {
+                  // Sub-case 1a: there exists a transition starting
+                  // in sf and consuming symbol 'match_labelb'.
+                  AddArc(s, aiterf.Value(), arcb, 0, find_input);
+                  break;
+                } else {
+                  // No transition labelled 'match_labelb' found: try
+                  // next failure transition (starting at 'sf').
+                  for (aiterf.Reset(); !aiterf.Done(); aiterf.Next()) {
+                    arca = aiterf.Value();
+                    labela = find_input ? arca.ilabel : arca.olabel;
+                    if (labela >= kPhiLabel) break;
+                  }
+                }
+              }
+              if (labela == kPhiLabel && sf == arca.nextstate) {
+                // Sub-case 1b: failure transitions lead to start
+                // state without finding a matching
+                // transition. Therefore, we generate a loop in start
+                // state of fsta.
+                A loop(match_labelb, match_labelb, Weight::One(), sf);
+                AddArc(s, loop, arcb, 0, find_input);
+              }
+            } else if (((T & COMPOSE_RHO) != 0) && (labela == kRhoLabel)) {
+              // Case 2: 'match_labelb' can be matched against a
+              // "rest" (rho) label in fsta.
+              if (find_input) {
+                arca.ilabel = match_labelb;
+                if (arca.olabel == kRhoLabel)
+                  arca.olabel = match_labelb;
+              } else {
+                arca.olabel = match_labelb;
+                if (arca.ilabel == kRhoLabel)
+                  arca.ilabel = match_labelb;
+              }
+              AddArc(s, arca, arcb, 0, find_input);  // move fwd on match
+            }
+          }
+        }
+      } else if (numepsa != numarcsa || finala) {  // Handle FSTB epsilon
+        A earca(0, 0, Weight::One(), sa);
+        AddArc(s, earca, arcb, numepsa > 0, find_input);  // move on epsilon
+      }
+    }
+    SetArcs(s);
+   }
+
+
+  // Finds matches to MATCH_LABEL in arcs given by AITER
+  // using FIND_INPUT to determine whether to look on input or output.
+  bool FindLabel(ArcIterator< Fst<A> > *aiter, size_t numarcs,
+                 Label match_label, bool find_input) {
+    // binary search for match
+    size_t low = 0;
+    size_t high = numarcs;
+    while (low < high) {
+      size_t mid = (low + high) / 2;
+      aiter->Seek(mid);
+      Label label = find_input ?
+                    aiter->Value().ilabel : aiter->Value().olabel;
+      if (label > match_label) {
+        high = mid;
+      } else if (label < match_label) {
+        low = mid + 1;
+      } else {
+        // find first matching label (when non-determinism)
+        for (size_t i = mid; i > low; --i) {
+          aiter->Seek(i - 1);
+          label = find_input ? aiter->Value().ilabel : aiter->Value().olabel;
+          if (label != match_label) {
+            aiter->Seek(i);
+            return true;
+          }
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+
+  StateId ComputeStart() {
+    StateId s1 = ComposeFstImplBase<A>::fst1_->Start();
+    StateId s2 = ComposeFstImplBase<A>::fst2_->Start();
+    if (s1 == kNoStateId || s2 == kNoStateId)
+      return kNoStateId;
+    StateTuple tuple(s1, s2, 0);
+    return FindState(tuple);
+  }
+
+  Weight ComputeFinal(StateId s) {
+    StateTuple &tuple = state_tuples_[s];
+    Weight final = Times(ComposeFstImplBase<A>::fst1_->Final(tuple.state_id1),
+                         ComposeFstImplBase<A>::fst2_->Final(tuple.state_id2));
+    return final;
+  }
+
+
+  FindType find_type_;            // find label on which side?
+
+  // Maps from StateId to StateTuple.
+  vector<StateTuple> state_tuples_;
+
+  // Maps from StateTuple to StateId.
+  StateTupleTable state_tuple_table_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(ComposeFstImpl);
+};
+
+
+// Computes the composition of two transducers. This version is a
+// delayed Fst. If FST1 transduces string x to y with weight a and FST2
+// transduces y to z with weight b, then their composition transduces
+// string x to z with weight Times(x, z).
+//
+// The output labels of the first transducer or the input labels of
+// the second transducer must be sorted.  The weights need to form a
+// commutative semiring (valid for TropicalWeight and LogWeight).
+//
+// Complexity:
+// Assuming the first FST is unsorted and the second is sorted:
+// - Time: O(v1 v2 d1 (log d2 + m2)),
+// - Space: O(v1 v2)
+// where vi = # of states visited, di = maximum out-degree, and mi the
+// maximum multiplicity of the states visited for the ith
+// FST. Constant time and space to visit an input state or arc is
+// assumed and exclusive of caching.
+//
+// Caveats:
+// - ComposeFst does not trim its output (since it is a delayed operation).
+// - The efficiency of composition can be strongly affected by several factors:
+//   - the choice of which tnansducer is sorted - prefer sorting the FST
+//     that has the greater average out-degree.
+//   - the amount of non-determinism
+//   - the presence and location of epsilon transitions - avoid epsilon
+//     transitions on the output side of the first transducer or
+//     the input side of the second transducer or prefer placing
+//     them later in a path since they delay matching and can
+//     introduce non-coaccessible states and transitions.
+template <class A>
+class ComposeFst : public Fst<A> {
+ public:
+  friend class ArcIterator< ComposeFst<A> >;
+  friend class CacheStateIterator< ComposeFst<A> >;
+  friend class CacheArcIterator< ComposeFst<A> >;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  ComposeFst(const Fst<A> &fst1, const Fst<A> &fst2)
+      : impl_(Init(fst1, fst2, ComposeFstOptions<>())) { }
+
+  template <uint64 T>
+  ComposeFst(const Fst<A> &fst1,
+             const Fst<A> &fst2,
+             const ComposeFstOptions<T> &opts)
+      : impl_(Init(fst1, fst2, opts)) { }
+
+  ComposeFst(const ComposeFst<A> &fst) : Fst<A>(fst), impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~ComposeFst() { if (!impl_->DecrRefCount()) delete impl_;  }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual ComposeFst<A> *Copy() const {
+    return new ComposeFst<A>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual inline void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+  // Access to flags encoding compose options/optimizations etc.  (for
+  // debugging).
+  uint64 ComposeFlags() const { return impl_->ComposeFlags(); }
+
+ protected:
+  ComposeFstImplBase<A> *Impl() { return impl_; }
+
+ private:
+  ComposeFstImplBase<A> *impl_;
+
+  // Auxiliary method encapsulating the creation of a ComposeFst
+  // implementation that is appropriate for the properties of fst1 and
+  // fst2.
+  template <uint64 T>
+  static ComposeFstImplBase<A> *Init(
+      const Fst<A> &fst1,
+      const Fst<A> &fst2,
+      const ComposeFstOptions<T> &opts) {
+
+    // Filter for sort properties (forces a property check).
+    uint64 sort_props_mask = kILabelSorted | kOLabelSorted;
+    // Filter for optimization-related properties (does not force a
+    // property-check).
+    uint64 opt_props_mask =
+      kString | kIDeterministic | kODeterministic | kNoIEpsilons |
+      kNoOEpsilons;
+
+    uint64 props1 = fst1.Properties(sort_props_mask, true);
+    uint64 props2 = fst2.Properties(sort_props_mask, true);
+
+    props1 |= fst1.Properties(opt_props_mask, false);
+    props2 |= fst2.Properties(opt_props_mask, false);
+
+    if (!(Weight::Properties() & kCommutative)) {
+      props1 |= fst1.Properties(kUnweighted, true);
+      props2 |= fst2.Properties(kUnweighted, true);
+      if (!(props1 & kUnweighted) && !(props2 & kUnweighted))
+        LOG(FATAL) << "ComposeFst: Weight needs to be a commutative semiring: "
+                   << Weight::Type();
+    }
+
+    // Case 1: flag COMPOSE_GENERIC disables optimizations.
+    if (T & COMPOSE_GENERIC) {
+      return new ComposeFstImpl<A, T>(fst1, fst2, opts);
+    }
+
+    const uint64 kStringDetOptProps =
+      kIDeterministic | kILabelSorted | kNoIEpsilons;
+    const uint64 kDetStringOptProps =
+      kODeterministic | kOLabelSorted | kNoOEpsilons;
+
+    // Case 2: fst1 is a string, fst2 is deterministic and epsilon-free.
+    if ((props1 & kString) &&
+        !(T & (COMPOSE_FST1_RHO | COMPOSE_FST1_PHI | COMPOSE_FST1_SIGMA)) &&
+        ((props2 & kStringDetOptProps) == kStringDetOptProps)) {
+      return new ComposeFstImpl<A, T | COMPOSE_FST1_STRING | COMPOSE_FST2_DET>(
+          fst1, fst2, opts);
+    }
+    // Case 3: fst1 is deterministic and epsilon-free, fst2 is string.
+    if ((props2 & kString) &&
+        !(T & (COMPOSE_FST1_RHO | COMPOSE_FST1_PHI | COMPOSE_FST1_SIGMA)) &&
+        ((props1 & kDetStringOptProps) == kDetStringOptProps)) {
+      return new ComposeFstImpl<A, T | COMPOSE_FST2_STRING | COMPOSE_FST1_DET>(
+          fst1, fst2, opts);
+    }
+
+    // Default case: no optimizations.
+    return new ComposeFstImpl<A, T>(fst1, fst2, opts);
+  }
+
+  void operator=(const ComposeFst<A> &fst);  // disallow
+};
+
+
+// Specialization for ComposeFst.
+template<class A>
+class StateIterator< ComposeFst<A> >
+    : public CacheStateIterator< ComposeFst<A> > {
+ public:
+  explicit StateIterator(const ComposeFst<A> &fst)
+      : CacheStateIterator< ComposeFst<A> >(fst) {}
+};
+
+
+// Specialization for ComposeFst.
+template <class A>
+class ArcIterator< ComposeFst<A> >
+    : public CacheArcIterator< ComposeFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const ComposeFst<A> &fst, StateId s)
+      : CacheArcIterator< ComposeFst<A> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+template <class A> inline
+void ComposeFst<A>::InitStateIterator(StateIteratorData<A> *data) const {
+  data->base = new StateIterator< ComposeFst<A> >(*this);
+}
+
+// Useful alias when using StdArc.
+typedef ComposeFst<StdArc> StdComposeFst;
+
+
+struct ComposeOptions {
+  bool connect;  // Connect output
+
+  ComposeOptions(bool c) : connect(c) {}
+  ComposeOptions() : connect(true) { }
+};
+
+
+// Computes the composition of two transducers. This version writes
+// the composed FST into a MurableFst. If FST1 transduces string x to
+// y with weight a and FST2 transduces y to z with weight b, then
+// their composition transduces string x to z with weight
+// Times(x, z).
+//
+// The output labels of the first transducer or the input labels of
+// the second transducer must be sorted.  The weights need to form a
+// commutative semiring (valid for TropicalWeight and LogWeight).
+//
+// Complexity:
+// Assuming the first FST is unsorted and the second is sorted:
+// - Time: O(V1 V2 D1 (log D2 + M2)),
+// - Space: O(V1 V2 D1 M2)
+// where Vi = # of states, Di = maximum out-degree, and Mi is
+// the maximum multiplicity for the ith FST.
+//
+// Caveats:
+// - Compose trims its output.
+// - The efficiency of composition can be strongly affected by several factors:
+//   - the choice of which tnansducer is sorted - prefer sorting the FST
+//     that has the greater average out-degree.
+//   - the amount of non-determinism
+//   - the presence and location of epsilon transitions - avoid epsilon
+//     transitions on the output side of the first transducer or
+//     the input side of the second transducer or prefer placing
+//     them later in a path since they delay matching and can
+//     introduce non-coaccessible states and transitions.
+template<class Arc>
+void Compose(const Fst<Arc> &ifst1, const Fst<Arc> &ifst2,
+             MutableFst<Arc> *ofst,
+             const ComposeOptions &opts = ComposeOptions()) {
+  ComposeFstOptions<> nopts;
+  nopts.gc_limit = 0;  // Cache only the last state for fastest copy.
+  *ofst = ComposeFst<Arc>(ifst1, ifst2, nopts);
+  if (opts.connect)
+    Connect(ofst);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_COMPOSE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/concat.h b/tools/thirdparty/OpenFst/fst/lib/concat.h
new file mode 100644
index 0000000..4100ec5
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/concat.h
@@ -0,0 +1,153 @@
+// concat.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to compute the concat of two FSTs.
+
+#ifndef FST_LIB_CONCAT_H__
+#define FST_LIB_CONCAT_H__
+
+#include <algorithm>
+
+#include "fst/lib/mutable-fst.h"
+#include "fst/lib/rational.h"
+
+namespace fst {
+
+// Computes the concatenation (product) of two FSTs; this version
+// modifies its MutableFst argument.  If FST1 transduces string x to y
+// with weight a and FST2 transduces string w to v with weight b, then
+// their concatenation transduces string xw to yv with Times(a, b).
+//
+// Complexity:
+// - Time: O(V1 + V2 + E2)
+// - Space: O(V1 + V2 + E2)
+// where Vi = # of states and Ei = # of arcs of the ith FST.
+template<class Arc>
+void Concat(MutableFst<Arc> *fst1, const Fst<Arc> &fst2) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Label Label;
+  typedef typename Arc::Weight Weight;
+
+  StateId start1 = fst1->Start();
+  if (start1 == kNoStateId)
+    return;
+
+  uint64 props1 = fst1->Properties(kFstProperties, false);
+  uint64 props2 = fst2.Properties(kFstProperties, false);
+
+  StateId numstates1= fst1->NumStates();
+
+  for (StateIterator< Fst<Arc> > siter2(fst2);
+       !siter2.Done();
+       siter2.Next()) {
+    StateId s1 = fst1->AddState();
+    StateId s2 = siter2.Value();
+    fst1->SetFinal(s1, fst2.Final(s2));
+    for (ArcIterator< Fst<Arc> > aiter(fst2, s2);
+         !aiter.Done();
+         aiter.Next()) {
+      Arc arc = aiter.Value();
+      arc.nextstate += numstates1;
+      fst1->AddArc(s1, arc);
+    }
+  }
+
+  StateId start2 = fst2.Start();
+  for (StateId s1 = 0; s1 < numstates1; ++s1) {
+    Weight final = fst1->Final(s1);
+    if (final != Weight::Zero()) {
+      fst1->SetFinal(s1, Weight::Zero());
+      if (start2 != kNoStateId)
+        fst1->AddArc(s1, Arc(0, 0, final, start2 + numstates1));
+    }
+  }
+  if (start2 != kNoStateId)
+    fst1->SetProperties(ConcatProperties(props1, props2), kFstProperties);
+}
+
+
+// Computes the concatentation of two FSTs. This version modifies its
+// RationalFst input.
+template<class Arc>
+void Concat(RationalFst<Arc> *fst1, const Fst<Arc> &fst2) {
+  fst1->Impl()->AddConcat(fst2);
+}
+
+
+typedef RationalFstOptions ConcatFstOptions;
+
+
+// Computes the concatenation (product) of two FSTs; this version is a
+// delayed Fst. If FST1 transduces string x to y with weight a and FST2
+// transduces string w to v with weight b, then their concatenation
+// transduces string xw to yv with Times(a, b).
+//
+// Complexity:
+// - Time: O(v1 + e1 + v2 + e2),
+// - Space: O(v1 + v2)
+// where vi = # of states visited and ei = # of arcs visited of the
+// ith FST. Constant time and space to visit an input state or arc is
+// assumed and exclusive of caching.
+template <class A>
+class ConcatFst : public RationalFst<A> {
+ public:
+  using RationalFst<A>::Impl;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  ConcatFst(const Fst<A> &fst1, const Fst<A> &fst2) {
+    Impl()->InitConcat(fst1, fst2);
+  }
+
+  ConcatFst(const Fst<A> &fst1, const Fst<A> &fst2,
+            const ConcatFstOptions &opts) : RationalFst<A>(opts) {
+    Impl()->InitConcat(fst1, fst2);
+  }
+
+  ConcatFst(const ConcatFst<A> &fst) : RationalFst<A>(fst) {}
+
+  virtual ConcatFst<A> *Copy() const { return new ConcatFst<A>(*this); }
+};
+
+
+// Specialization for ConcatFst.
+template <class A>
+class StateIterator< ConcatFst<A> > : public StateIterator< RationalFst<A> > {
+ public:
+  explicit StateIterator(const ConcatFst<A> &fst)
+      : StateIterator< RationalFst<A> >(fst) {}
+};
+
+
+// Specialization for ConcatFst.
+template <class A>
+class ArcIterator< ConcatFst<A> > : public ArcIterator< RationalFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const ConcatFst<A> &fst, StateId s)
+      : ArcIterator< RationalFst<A> >(fst, s) {}
+};
+
+
+// Useful alias when using StdArc.
+typedef ConcatFst<StdArc> StdConcatFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_CONCAT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/connect.h b/tools/thirdparty/OpenFst/fst/lib/connect.h
new file mode 100644
index 0000000..27f781f
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/connect.h
@@ -0,0 +1,220 @@
+// connect.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Classes and functions to remove unsuccessful paths from an Fst.
+
+#ifndef FST_LIB_CONNECT_H__
+#define FST_LIB_CONNECT_H__
+
+#include "fst/lib/mutable-fst.h"
+
+namespace fst {
+
+// Finds and returns strongly-connected components, accessible and
+// coaccessible states and related properties. Uses Tarzan's single
+// DFS SCC algorithm (see Aho, et al, "Design and Analysis of Computer
+// Algorithms", 189pp).
+template <class A>
+class SccVisitor {
+ public:
+  typedef A Arc;
+  typedef typename Arc::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  // scc[i]: strongly-connected component number for state i.
+  //   SCC numbers will be in topological order for acyclic input.
+  // access[i]: accessibility of state i.
+  // coaccess[i]: coaccessibility of state i.
+  // Any of above can be NULL.
+  // props: related property bits (cyclicity, initial cyclicity,
+  //   accessibiliity, coaccessiblity) set/cleared (o.w. unchanged).
+  SccVisitor(vector<StateId> *scc, vector<bool> *access,
+             vector<bool> *coaccess, uint64 *props)
+      : scc_(scc), access_(access), coaccess_(coaccess), props_(props) {}
+  SccVisitor(uint64 *props)
+      : scc_(0), access_(0), coaccess_(0), props_(props) {}
+
+  void InitVisit(const Fst<A> &fst) {
+    if (scc_)
+      scc_->clear();
+    if (access_)
+      access_->clear();
+    if (coaccess_) {
+      coaccess_->clear();
+      coaccess_internal_ = false;
+    } else {
+      coaccess_ = new vector<bool>;
+      coaccess_internal_ = true;
+    }
+    *props_ |= kAcyclic | kInitialAcyclic | kAccessible | kCoAccessible;
+    *props_ &= ~(kCyclic | kInitialCyclic | kNotAccessible | kNotCoAccessible);
+    fst_ = &fst;
+    start_ = fst.Start();
+    nstates_ = 0;
+    nscc_ = 0;
+    dfnumber_ = new vector<StateId>;
+    lowlink_ = new vector<StateId>;
+    onstack_ = new vector<bool>;
+    scc_stack_ = new vector<StateId>;
+  }
+
+  bool InitState(StateId s, StateId root) {
+    scc_stack_->push_back(s);
+    while ((StateId)dfnumber_->size() <= s) { 
+      if (scc_)
+        scc_->push_back(-1);
+      if (access_)
+        access_->push_back(false);
+      coaccess_->push_back(false);
+      dfnumber_->push_back(-1);
+      lowlink_->push_back(-1);
+      onstack_->push_back(false);
+    }
+    (*dfnumber_)[s] = nstates_;
+    (*lowlink_)[s] = nstates_;
+    (*onstack_)[s] = true;
+    if (root == start_) {
+      if (access_)
+        (*access_)[s] = true;
+    } else {
+      if (access_)
+        (*access_)[s] = false;
+      *props_ |= kNotAccessible;
+      *props_ &= ~kAccessible;
+    }
+    ++nstates_;
+    return true;
+  }
+
+  bool TreeArc(StateId s, const A &arc) { return true; }
+
+  bool BackArc(StateId s, const A &arc) {
+    StateId t = arc.nextstate;
+    if ((*dfnumber_)[t] < (*lowlink_)[s])
+      (*lowlink_)[s] = (*dfnumber_)[t];
+    if ((*coaccess_)[t])
+      (*coaccess_)[s] = true;
+    *props_ |= kCyclic;
+    *props_ &= ~kAcyclic;
+    if (arc.nextstate == start_) {
+      *props_ |= kInitialCyclic;
+      *props_ &= ~kInitialAcyclic;
+    }
+    return true;
+  }
+
+  bool ForwardOrCrossArc(StateId s, const A &arc) {
+    StateId t = arc.nextstate;
+    if ((*dfnumber_)[t] < (*dfnumber_)[s] /* cross edge */ &&
+        (*onstack_)[t] && (*dfnumber_)[t] < (*lowlink_)[s])
+      (*lowlink_)[s] = (*dfnumber_)[t];
+    if ((*coaccess_)[t])
+      (*coaccess_)[s] = true;
+    return true;
+  }
+
+  void FinishState(StateId s, StateId p, const A *) {
+    if (fst_->Final(s) != Weight::Zero())
+      (*coaccess_)[s] = true;
+    if ((*dfnumber_)[s] == (*lowlink_)[s]) {  // root of new SCC
+      bool scc_coaccess = false;
+      size_t i = scc_stack_->size();
+      StateId t;
+      do {
+        t = (*scc_stack_)[--i];
+        if ((*coaccess_)[t])
+          scc_coaccess = true;
+      } while (s != t);
+      do {
+        t = scc_stack_->back();
+        if (scc_)
+          (*scc_)[t] = nscc_;
+        if (scc_coaccess)
+          (*coaccess_)[t] = true;
+        (*onstack_)[t] = false;
+        scc_stack_->pop_back();
+      } while (s != t);
+      if (!scc_coaccess) {
+        *props_ |= kNotCoAccessible;
+        *props_ &= ~kCoAccessible;
+      }
+      ++nscc_;
+    }
+    if (p != kNoStateId) {
+      if ((*coaccess_)[s])
+        (*coaccess_)[p] = true;
+      if ((*lowlink_)[s] < (*lowlink_)[p])
+        (*lowlink_)[p] = (*lowlink_)[s];
+    }
+  }
+
+  void FinishVisit() {
+    // Numbers SCC's in topological order when acyclic.
+    if (scc_)
+      for (StateId i = 0; i < (StateId)scc_->size(); ++i) 
+        (*scc_)[i] = nscc_ - 1 - (*scc_)[i];
+    if (coaccess_internal_)
+      delete coaccess_;
+    delete dfnumber_;
+    delete lowlink_;
+    delete onstack_;
+    delete scc_stack_;
+  }
+
+ private:
+  vector<StateId> *scc_;        // State's scc number
+  vector<bool> *access_;        // State's accessibility
+  vector<bool> *coaccess_;      // State's coaccessibility
+  uint64 *props_;
+  const Fst<A> *fst_;
+  StateId start_;
+  StateId nstates_;             // State count
+  StateId nscc_;                // SCC count
+  bool coaccess_internal_;
+  vector<StateId> *dfnumber_;   // state discovery times
+  vector<StateId> *lowlink_;    // lowlink[s] == dfnumber[s] => SCC root
+  vector<bool> *onstack_;       // is a state on the SCC stack
+  vector<StateId> *scc_stack_;  // SCC stack (w/ random access)
+};
+
+
+// Trims an FST, removing states and arcs that are not on successful
+// paths. This version modifies its input.
+//
+// Complexity:
+// - Time:  O(V + E)
+// - Space: O(V + E)
+// where V = # of states and E = # of arcs.
+template<class Arc>
+void Connect(MutableFst<Arc> *fst) {
+  typedef typename Arc::StateId StateId;
+
+  vector<bool> access;
+  vector<bool> coaccess;
+  uint64 props = 0;
+  SccVisitor<Arc> scc_visitor(0, &access, &coaccess, &props);
+  DfsVisit(*fst, &scc_visitor);
+  vector<StateId> dstates;
+  for (StateId s = 0; s < (StateId)access.size(); ++s)
+    if (!access[s] || !coaccess[s])
+      dstates.push_back(s);
+  fst->DeleteStates(dstates);
+  fst->SetProperties(kAccessible | kCoAccessible, kAccessible | kCoAccessible);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_CONNECT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/const-fst.h b/tools/thirdparty/OpenFst/fst/lib/const-fst.h
new file mode 100644
index 0000000..74f0c91
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/const-fst.h
@@ -0,0 +1,394 @@
+// const-fst.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Simple concrete immutable FST whose states and arcs are each stored
+// in single arrays.
+
+#ifndef FST_LIB_CONST_FST_H__
+#define FST_LIB_CONST_FST_H__
+
+#include "fst/lib/expanded-fst.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+template <class A> class ConstFst;
+
+// States and arcs each implemented by single arrays, templated on the
+// Arc definition.
+template <class A>
+class ConstFstImpl : public FstImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::WriteHeaderAndSymbols;
+
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  ConstFstImpl()
+      : states_(0), arcs_(0), nstates_(0), narcs_(0), start_(kNoStateId) {
+    SetType("const");
+    SetProperties(kNullProperties | kStaticProperties);
+  }
+
+  explicit ConstFstImpl(const Fst<A> &fst);
+
+  ~ConstFstImpl() {
+    delete[] states_;
+    delete[] arcs_;
+  }
+
+  StateId Start() const { return start_; }
+
+  Weight Final(StateId s) const { return states_[s].final; }
+
+  StateId NumStates() const { return nstates_; }
+
+  size_t NumArcs(StateId s) const { return states_[s].narcs; }
+
+  size_t NumInputEpsilons(StateId s) const { return states_[s].niepsilons; }
+
+  size_t NumOutputEpsilons(StateId s) const { return states_[s].noepsilons; }
+
+  static ConstFstImpl<A> *Read(istream &strm, const FstReadOptions &opts);
+
+  bool Write(ostream &strm, const FstWriteOptions &opts) const;
+
+  A *Arcs(StateId s) { return arcs_ + states_[s].pos; }
+
+  // Provide information needed for generic state iterator
+  void InitStateIterator(StateIteratorData<A> *data) const {
+    data->base = 0;
+    data->nstates = nstates_;
+  }
+
+  // Provide information needed for the generic arc iterator
+  void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    data->base = 0;
+    data->arcs = arcs_ + states_[s].pos;
+    data->narcs = states_[s].narcs;
+    data->ref_count = 0;
+  }
+
+ private:
+  // States implemented by array *states_ below, arcs by (single) *arcs_.
+  struct State {
+    Weight final;                // Final weight
+    uint32 pos;                  // Start of state's arcs in *arcs_
+    uint32 narcs;                // Number of arcs (per state)
+    uint32 niepsilons;           // # of input epsilons
+    uint32 noepsilons;           // # of output epsilons
+    State() : final(Weight::Zero()), niepsilons(0), noepsilons(0) {}
+  };
+
+  // Properties always true of this Fst class
+  static const uint64 kStaticProperties = kExpanded;
+  // Current file format version
+  static const int kFileVersion = 1;
+  // Minimum file format version supported
+  static const int kMinFileVersion = 1;
+  // Byte alignment for states and arcs in file format
+  static const int kFileAlign = 16;
+
+  State *states_;                // States represenation
+  A *arcs_;                      // Arcs representation
+  StateId nstates_;              // Number of states
+  size_t narcs_;                 // Number of arcs (per FST)
+  StateId start_;                // Initial state
+
+  DISALLOW_EVIL_CONSTRUCTORS(ConstFstImpl);
+};
+
+template<class A>
+ConstFstImpl<A>::ConstFstImpl(const Fst<A> &fst) : nstates_(0), narcs_(0) {
+  SetType("const");
+  uint64 copy_properties = fst.Properties(kCopyProperties, true);
+  SetProperties(copy_properties | kStaticProperties);
+  SetInputSymbols(fst.InputSymbols());
+  SetOutputSymbols(fst.OutputSymbols());
+  start_ = fst.Start();
+
+  // count # of states and arcs
+  for (StateIterator< Fst<A> > siter(fst);
+       !siter.Done();
+       siter.Next()) {
+    ++nstates_;
+    StateId s = siter.Value();
+    for (ArcIterator< Fst<A> > aiter(fst, s);
+         !aiter.Done();
+         aiter.Next())
+      ++narcs_;
+  }
+  states_ = new State[nstates_];
+  arcs_ = new A[narcs_];
+  size_t pos = 0;
+  for (StateId s = 0; s < nstates_; ++s) {
+    states_[s].final = fst.Final(s);
+    states_[s].pos = pos;
+    states_[s].narcs = 0;
+    states_[s].niepsilons = 0;
+    states_[s].noepsilons = 0;
+    for (ArcIterator< Fst<A> > aiter(fst, s);
+         !aiter.Done();
+         aiter.Next()) {
+      const A &arc = aiter.Value();
+      ++states_[s].narcs;
+      if (arc.ilabel == 0)
+        ++states_[s].niepsilons;
+      if (arc.olabel == 0)
+        ++states_[s].noepsilons;
+      arcs_[pos++] = arc;
+    }
+  }
+}
+
+template<class A>
+ConstFstImpl<A> *ConstFstImpl<A>::Read(istream &strm,
+                                       const FstReadOptions &opts) {
+  ConstFstImpl<A> *impl = new ConstFstImpl<A>;
+  FstHeader hdr;
+  if (!impl->ReadHeaderAndSymbols(strm, opts, kMinFileVersion, &hdr))
+    return 0;
+  impl->start_ = hdr.Start();
+  impl->nstates_ = hdr.NumStates();
+  impl->narcs_ = hdr.NumArcs();
+  impl->states_ = new State[impl->nstates_];
+  impl->arcs_ = new A[impl->narcs_];
+
+  char c;
+  for (int i = 0; i < kFileAlign && strm.tellg() % kFileAlign; ++i)
+    strm.read(&c, 1);
+  // TODO: memory map this
+  size_t b = impl->nstates_ * sizeof(typename ConstFstImpl<A>::State);
+  strm.read(reinterpret_cast<char *>(impl->states_), b);
+  if (!strm) {
+    LOG(ERROR) << "ConstFst::Read: Read failed: " << opts.source;
+    return 0;
+  }
+  // TODO: memory map this
+  b = impl->narcs_ * sizeof(A);
+  for (int i = 0; i < kFileAlign && strm.tellg() % kFileAlign; ++i)
+    strm.read(&c, 1);
+  strm.read(reinterpret_cast<char *>(impl->arcs_), b);
+  if (!strm) {
+    LOG(ERROR) << "ConstFst::Read: Read failed: " << opts.source;
+    return 0;
+  }
+  return impl;
+}
+
+template<class A>
+bool ConstFstImpl<A>::Write(ostream &strm,
+                            const FstWriteOptions &opts) const {
+  FstHeader hdr;
+  hdr.SetStart(start_);
+  hdr.SetNumStates(nstates_);
+  hdr.SetNumArcs(narcs_);
+  WriteHeaderAndSymbols(strm, opts, kFileVersion, &hdr);
+  if (!strm)
+    return false;
+
+  for (int i = 0; i < kFileAlign && strm.tellp() % kFileAlign; ++i)
+    strm.write("", 1);
+  strm.write(reinterpret_cast<char *>(states_),
+             nstates_ * sizeof(State));
+  for (int i = 0; i < kFileAlign && strm.tellp() % kFileAlign; ++i)
+    strm.write("", 1);
+  strm.write(reinterpret_cast<char *>(arcs_), narcs_ * sizeof(A));
+  strm.flush();
+  if (!strm)
+    LOG(ERROR) << "ConstFst::Write: Write failed: " << opts.source;
+  return strm;
+}
+
+// Simple concrete immutable FST.  This class attaches interface to
+// implementation and handles reference counting.
+template <class A>
+class ConstFst : public ExpandedFst<A> {
+ public:
+  friend class StateIterator< ConstFst<A> >;
+  friend class ArcIterator< ConstFst<A> >;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  ConstFst() : impl_(new ConstFstImpl<A>()) {}
+
+  ConstFst(const ConstFst<A> &fst) : impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  explicit ConstFst(const Fst<A> &fst) : impl_(new ConstFstImpl<A>(fst)) {}
+
+  virtual ~ConstFst() { if (!impl_->DecrRefCount()) delete impl_;  }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  StateId NumStates() const { return impl_->NumStates(); }
+
+  size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  // Get a copy of this ConstFst
+  virtual ConstFst<A> *Copy() const {
+    impl_->IncrRefCount();
+    return new ConstFst<A>(impl_);
+  }
+
+  // Read a ConstFst from an input stream; return NULL on error
+  static ConstFst<A> *Read(istream &strm, const FstReadOptions &opts) {
+    ConstFstImpl<A>* impl = ConstFstImpl<A>::Read(strm, opts);
+    return impl ? new ConstFst<A>(impl) : 0;
+  }
+
+  // Read a ConstFst from a file; returno NULL on error
+  static ConstFst<A> *Read(const string &filename) {
+    ifstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "ConstFst::Write: Can't open file: " << filename;
+      return 0;
+    }
+    return Read(strm, FstReadOptions(filename));
+  }
+
+  // Write a ConstFst to an output stream; return false on error
+  virtual bool Write(ostream &strm, const FstWriteOptions &opts) const {
+    return impl_->Write(strm, opts);
+  }
+
+  // Write a ConstFst to a file; return false on error
+  virtual bool Write(const string &filename) const {
+    if (!filename.empty()) {
+      ofstream strm(filename.c_str());
+      if (!strm) {
+        LOG(ERROR) << "ConstrFst::Write: Can't open file: " << filename;
+        return false;
+      }
+      return Write(strm, FstWriteOptions(filename));
+    } else {
+      return Write(std::cout, FstWriteOptions("standard output"));
+    }
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual void InitStateIterator(StateIteratorData<A> *data) const {
+    impl_->InitStateIterator(data);
+  }
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+ private:
+  ConstFst(ConstFstImpl<A> *impl) : impl_(impl) {}
+
+  ConstFstImpl<A> *impl_;  // FST's impl
+
+  void operator=(const ConstFst<A> &fst);  // disallow
+};
+
+// Specialization for ConstFst; see generic version in fst.h
+// for sample usage (but use the ConstFst type!). This version
+// should inline.
+template <class A>
+class StateIterator< ConstFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  explicit StateIterator(const ConstFst<A> &fst)
+    : nstates_(fst.impl_->NumStates()), s_(0) {}
+
+  bool Done() const { return s_ >= nstates_; }
+
+  StateId Value() const { return s_; }
+
+  void Next() { ++s_; }
+
+  void Reset() { s_ = 0; }
+
+ private:
+  StateId nstates_;
+  StateId s_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(StateIterator);
+};
+
+// Specialization for ConstFst; see generic version in fst.h
+// for sample usage (but use the ConstFst type!). This version
+// should inline.
+template <class A>
+class ArcIterator< ConstFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const ConstFst<A> &fst, StateId s)
+    : arcs_(fst.impl_->Arcs(s)), narcs_(fst.impl_->NumArcs(s)), i_(0) {}
+
+  bool Done() const { return i_ >= narcs_; }
+
+  const A& Value() const { return arcs_[i_]; }
+
+  void Next() { ++i_; }
+
+  void Reset() { i_ = 0; }
+
+  void Seek(size_t a) { i_ = a; }
+
+ private:
+  const A *arcs_;
+  size_t narcs_;
+  size_t i_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+// A useful alias when using StdArc.
+typedef ConstFst<StdArc> StdConstFst;
+
+}  // namespace fst;
+
+#endif  // FST_LIB_CONST_FST_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/determinize.h b/tools/thirdparty/OpenFst/fst/lib/determinize.h
new file mode 100644
index 0000000..63b96ec
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/determinize.h
@@ -0,0 +1,721 @@
+// determinize.h
+
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to determinize an FST.
+
+#ifndef FST_LIB_DETERMINIZE_H__
+#define FST_LIB_DETERMINIZE_H__
+
+#include <algorithm>
+#include <map>
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+#include <ext/slist>
+using __gnu_cxx::slist;
+
+#include "fst/lib/cache.h"
+#include "fst/lib/factor-weight.h"
+#include "fst/lib/map.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+//
+// COMMON DIVISORS - these are used in determinization to compute
+// the transition weights. In the simplest case, it is just the same
+// as the semiring Plus(). However, other choices permit more efficient
+// determinization when the output contains strings.
+//
+
+// The default common divisor uses the semiring Plus.
+template <class W>
+class DefaultCommonDivisor {
+ public:
+  typedef W Weight;
+
+  W operator()(const W &w1, const W &w2) const { return Plus(w1, w2); }
+};
+
+
+// The label common divisor for a (left) string semiring selects a
+// single letter common prefix or the empty string. This is used in
+// the determinization of output strings so that at most a single
+// letter will appear in the output of a transtion.
+template <typename L, StringType S>
+class LabelCommonDivisor {
+ public:
+  typedef StringWeight<L, S> Weight;
+
+  Weight operator()(const Weight &w1, const Weight &w2) const {
+    StringWeightIterator<L, S> iter1(w1);
+    StringWeightIterator<L, S> iter2(w2);
+
+    if (!(StringWeight<L, S>::Properties() & kLeftSemiring))
+      LOG(FATAL) << "LabelCommonDivisor: Weight needs to be left semiring";
+
+    if (w1.Size() == 0 || w2.Size() == 0)
+      return Weight::One();
+    else if (w1 == Weight::Zero())
+      return Weight(iter2.Value());
+    else if (w2 == Weight::Zero())
+      return Weight(iter1.Value());
+    else if (iter1.Value() == iter2.Value())
+      return Weight(iter1.Value());
+    else
+      return Weight::One();
+  }
+};
+
+
+// The gallic common divisor uses the label common divisor on the
+// string component and the template argument D common divisor on the
+// weight component, which defaults to the default common divisor.
+template <class L, class W, StringType S, class D = DefaultCommonDivisor<W> >
+class GallicCommonDivisor {
+ public:
+  typedef GallicWeight<L, W, S> Weight;
+
+  Weight operator()(const Weight &w1, const Weight &w2) const {
+    return Weight(label_common_divisor_(w1.Value1(), w2.Value1()),
+                  weight_common_divisor_(w1.Value2(), w2.Value2()));
+  }
+
+ private:
+  LabelCommonDivisor<L, S> label_common_divisor_;
+  D weight_common_divisor_;
+};
+
+// Options for finite-state transducer determinization.
+struct DeterminizeFstOptions : CacheOptions {
+  float delta;  // Quantization delta for subset weights
+
+  explicit DeterminizeFstOptions(const CacheOptions &opts, float del = kDelta)
+      : CacheOptions(opts), delta(del) {}
+
+  explicit DeterminizeFstOptions(float del = kDelta) : delta(del) {}
+};
+
+
+// Implementation of delayed DeterminizeFst. This base class is
+// common to the variants that implement acceptor and transducer
+// determinization.
+template <class A>
+class DeterminizeFstImplBase : public CacheImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+
+  using CacheBaseImpl< CacheState<A> >::HasStart;
+  using CacheBaseImpl< CacheState<A> >::HasFinal;
+  using CacheBaseImpl< CacheState<A> >::HasArcs;
+
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  DeterminizeFstImplBase(const Fst<A> &fst, const CacheOptions &opts)
+      : CacheImpl<A>(opts), fst_(fst.Copy()) {
+    SetType("determinize");
+    uint64 props = fst.Properties(kFstProperties, false);
+    SetProperties(DeterminizeProperties(props), kCopyProperties);
+
+    SetInputSymbols(fst.InputSymbols());
+    SetOutputSymbols(fst.OutputSymbols());
+  }
+
+  virtual ~DeterminizeFstImplBase() { delete fst_; }
+
+  StateId Start() {
+    if (!HasStart()) {
+      StateId start = ComputeStart();
+      if (start != kNoStateId) {
+        SetStart(start);
+      }
+    }
+    return CacheImpl<A>::Start();
+  }
+
+  Weight Final(StateId s) {
+    if (!HasFinal(s)) {
+      Weight final = ComputeFinal(s);
+      SetFinal(s, final);
+    }
+    return CacheImpl<A>::Final(s);
+  }
+
+  virtual void Expand(StateId s) = 0;
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumOutputEpsilons(s);
+  }
+
+  void InitArcIterator(StateId s, ArcIteratorData<A> *data) {
+    if (!HasArcs(s))
+      Expand(s);
+    CacheImpl<A>::InitArcIterator(s, data);
+  }
+
+  virtual StateId ComputeStart() = 0;
+
+  virtual Weight ComputeFinal(StateId s) = 0;
+
+ protected:
+  const Fst<A> *fst_;            // Input Fst
+
+  DISALLOW_EVIL_CONSTRUCTORS(DeterminizeFstImplBase);
+};
+
+
+// Implementation of delayed determinization for weighted acceptors.
+// It is templated on the arc type A and the common divisor C.
+template <class A, class C>
+class DeterminizeFsaImpl : public DeterminizeFstImplBase<A> {
+ public:
+  using DeterminizeFstImplBase<A>::fst_;
+
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  struct Element {
+    Element() {}
+
+    Element(StateId s, Weight w) : state_id(s), weight(w) {}
+
+    StateId state_id;  // Input state Id
+    Weight weight;     // Residual weight
+  };
+  typedef slist<Element> Subset;
+  typedef map<Label, Subset*> LabelMap;
+
+  DeterminizeFsaImpl(const Fst<A> &fst, C common_divisor,
+                     const DeterminizeFstOptions &opts)
+      : DeterminizeFstImplBase<A>(fst, opts),
+        delta_(opts.delta), common_divisor_(common_divisor),
+        subset_hash_(0, SubsetKey(), SubsetEqual(&elements_)) {
+    if (!fst.Properties(kAcceptor, true))
+     LOG(FATAL)  << "DeterminizeFst: argument not an acceptor";
+  if (!(Weight::Properties() & kLeftSemiring))
+    LOG(FATAL) << "DeterminizeFst: Weight needs to be left distributive: "
+               << Weight::Type();
+  }
+
+  virtual ~DeterminizeFsaImpl() {
+    for (unsigned int i = 0; i < subsets_.size(); ++i) 
+      delete subsets_[i];
+  }
+
+  virtual StateId ComputeStart() {
+    StateId s = fst_->Start();
+    if (s == kNoStateId)
+      return kNoStateId;
+    Element element(s, Weight::One());
+    Subset *subset = new Subset;
+    subset->push_front(element);
+    return FindState(subset);
+  }
+
+  virtual Weight ComputeFinal(StateId s) {
+    Subset *subset = subsets_[s];
+    Weight final = Weight::Zero();
+    for (typename Subset::iterator siter = subset->begin();
+         siter != subset->end();
+         ++siter) {
+      Element &element = *siter;
+      final = Plus(final, Times(element.weight,
+                                fst_->Final(element.state_id)));
+      }
+    return final;
+  }
+
+  // Finds the state corresponding to a subset. Only creates a new state
+  // if the subset is not found in the subset hash. FindState takes
+  // ownership of the subset argument (so that it doesn't have to copy it
+  // if it creates a new state).
+  //
+  // The method exploits the following device: all pairs stored in the
+  // associative container subset_hash_ are of the form (subset,
+  // id(subset) + 1), i.e. subset_hash_[subset] > 0 if subset has been
+  // stored previously. For unassigned subsets, the call to
+  // subset_hash_[subset] creates a new pair (subset, 0). As a result,
+  // subset_hash_[subset] == 0 iff subset is new.
+  StateId FindState(Subset *subset) {
+    StateId &assoc_value = subset_hash_[subset];
+    if (assoc_value == 0) {  // subset wasn't present; assign it a new ID
+      subsets_.push_back(subset);
+      assoc_value = subsets_.size();
+    } else {
+      delete subset;
+    }
+    return assoc_value - 1;  // NB: assoc_value = ID + 1
+  }
+
+  // Computes the outgoing transitions from a state, creating new destination
+  // states as needed.
+  virtual void Expand(StateId s) {
+
+    LabelMap label_map;
+    LabelSubsets(s, &label_map);
+
+    for (typename LabelMap::iterator liter = label_map.begin();
+         liter != label_map.end();
+         ++liter)
+      AddArc(s, liter->first, liter->second);
+    SetArcs(s);
+  }
+
+ private:
+  // Constructs destination subsets per label. At return, subset
+  // element weights include the input automaton label weights and the
+  // subsets may contain duplicate states.
+  void LabelSubsets(StateId s, LabelMap *label_map) {
+    Subset *src_subset = subsets_[s];
+
+    for (typename Subset::iterator siter = src_subset->begin();
+         siter != src_subset->end();
+         ++siter) {
+      Element &src_element = *siter;
+      for (ArcIterator< Fst<A> > aiter(*fst_, src_element.state_id);
+           !aiter.Done();
+           aiter.Next()) {
+        const A &arc = aiter.Value();
+        Element dest_element(arc.nextstate,
+                             Times(src_element.weight, arc.weight));
+        Subset* &dest_subset = (*label_map)[arc.ilabel];
+        if (dest_subset == 0)
+          dest_subset = new Subset;
+        dest_subset->push_front(dest_element);
+      }
+    }
+  }
+
+  // Adds an arc from state S to the destination state associated
+  // with subset DEST_SUBSET (as created by LabelSubsets).
+  void AddArc(StateId s, Label label, Subset *dest_subset) {
+    A arc;
+    arc.ilabel = label;
+    arc.olabel = label;
+    arc.weight = Weight::Zero();
+
+    typename Subset::iterator oiter;
+    for (typename Subset::iterator diter = dest_subset->begin();
+         diter != dest_subset->end();) {
+      Element &dest_element = *diter;
+      // Computes label weight.
+      arc.weight = common_divisor_(arc.weight, dest_element.weight);
+
+      while ((StateId)elements_.size() <= dest_element.state_id) 
+        elements_.push_back(0);
+      Element *matching_element = elements_[dest_element.state_id];
+      if (matching_element) {
+        // Found duplicate state: sums state weight and deletes dup.
+        matching_element->weight = Plus(matching_element->weight,
+                                        dest_element.weight);
+        ++diter;
+        dest_subset->erase_after(oiter);
+      } else {
+        // Saves element so we can check for duplicate for this state.
+        elements_[dest_element.state_id] = &dest_element;
+        oiter = diter;
+        ++diter;
+      }
+    }
+
+    // Divides out label weight from destination subset elements.
+    // Quantizes to ensure comparisons are effective.
+    // Clears element vector.
+    for (typename Subset::iterator diter = dest_subset->begin();
+         diter != dest_subset->end();
+         ++diter) {
+      Element &dest_element = *diter;
+      dest_element.weight = Divide(dest_element.weight, arc.weight,
+                                   DIVIDE_LEFT);
+      dest_element.weight = dest_element.weight.Quantize(delta_);
+      elements_[dest_element.state_id] = 0;
+    }
+
+    arc.nextstate = FindState(dest_subset);
+    CacheImpl<A>::AddArc(s, arc);
+  }
+
+  // Comparison object for hashing Subset(s). Subsets are not sorted in this
+  // implementation, so ordering must not be assumed in the equivalence
+  // test.
+  class SubsetEqual {
+   public:
+    // Constructor takes vector needed to check equality. See immediately
+    // below for constraints on it.
+    explicit SubsetEqual(vector<Element *> *elements)
+        : elements_(elements) {}
+
+    // At each call to operator(), elements_[state] must be defined and
+    // NULL for each state in the subset arguments. When this operator
+    // returns, elements_ will preserve that property. We keep it
+    // full of NULLs so that it is ready for the next call.
+    bool operator()(Subset* subset1, Subset* subset2) const {
+        if (subset1->size() != subset2->size())
+          return false;
+
+      // Loads first subset elements in element vector.
+      for (typename Subset::iterator iter1 = subset1->begin();
+           iter1 != subset1->end();
+           ++iter1) {
+        Element &element1 = *iter1;
+        (*elements_)[element1.state_id] = &element1;
+      }
+
+      // Checks second subset matches first via element vector.
+      for (typename Subset::iterator iter2 = subset2->begin();
+           iter2 != subset2->end();
+           ++iter2) {
+        Element &element2 = *iter2;
+        Element *element1 = (*elements_)[element2.state_id];
+        if (!element1 || element1->weight != element2.weight) {
+          // Mismatch found. Resets element vector before returning false.
+          for (typename Subset::iterator iter1 = subset1->begin();
+               iter1 != subset1->end();
+               ++iter1)
+            (*elements_)[iter1->state_id] = 0;
+          return false;
+        } else {
+          (*elements_)[element2.state_id] = 0;  // Clears entry
+        }
+      }
+      return true;
+    }
+   private:
+    vector<Element *> *elements_;
+  };
+
+  // Hash function for Subset to Fst states. Subset elements are not
+  // sorted in this implementation, so the hash must be invariant
+  // under subset reordering.
+  class SubsetKey {
+   public:
+    size_t operator()(const Subset* subset) const {
+      size_t hash = 0;
+      for (typename Subset::const_iterator iter = subset->begin();
+           iter != subset->end();
+           ++iter) {
+        const Element &element = *iter;
+        int lshift = element.state_id % kPrime;
+        int rshift = sizeof(size_t) - lshift;
+        hash ^= element.state_id << lshift ^
+                element.state_id >> rshift ^
+                element.weight.Hash();
+      }
+      return hash;
+    }
+
+   private:
+    static const int kPrime = sizeof(size_t) == 8 ? 23 : 13;
+  };
+
+  float delta_;                  // Quantization delta for subset weights
+  C common_divisor_;
+
+  // Used to test equivalence of subsets.
+  vector<Element *> elements_;
+
+  // Maps from StateId to Subset.
+  vector<Subset *> subsets_;
+
+  // Hashes from Subset to its StateId in the output automaton.
+  typedef hash_map<Subset *, StateId, SubsetKey, SubsetEqual>
+  SubsetHash;
+
+  // Hashes from Label to Subsets corr. to destination states of current state.
+  SubsetHash subset_hash_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(DeterminizeFsaImpl);
+};
+
+
+// Implementation of delayed determinization for transducers.
+// Transducer determinization is implemented by mapping the input to
+// the Gallic semiring as an acceptor whose weights contain the output
+// strings and using acceptor determinization above to determinize
+// that acceptor.
+template <class A, StringType S>
+class DeterminizeFstImpl : public DeterminizeFstImplBase<A> {
+ public:
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  typedef ToGallicMapper<A, S> ToMapper;
+  typedef FromGallicMapper<A, S> FromMapper;
+
+  typedef typename ToMapper::ToArc ToArc;
+  typedef MapFst<A, ToArc, ToMapper> ToFst;
+  typedef MapFst<ToArc, A, FromMapper> FromFst;
+
+  typedef GallicCommonDivisor<Label, Weight, S> CommonDivisor;
+  typedef GallicFactor<Label, Weight, S> FactorIterator;
+
+  // Defined after DeterminizeFst since it calls it.
+  DeterminizeFstImpl(const Fst<A> &fst, const DeterminizeFstOptions &opts);
+
+  ~DeterminizeFstImpl() { delete from_fst_; }
+
+  virtual StateId ComputeStart() { return from_fst_->Start(); }
+
+  virtual Weight ComputeFinal(StateId s) { return from_fst_->Final(s); }
+
+  virtual void Expand(StateId s) {
+    for (ArcIterator<FromFst> aiter(*from_fst_, s);
+         !aiter.Done();
+         aiter.Next())
+      CacheImpl<A>::AddArc(s, aiter.Value());
+    CacheImpl<A>::SetArcs(s);
+  }
+
+ private:
+  FromFst *from_fst_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(DeterminizeFstImpl);
+};
+
+
+// Determinizes a weighted transducer. This version is a delayed
+// Fst. The result will be an equivalent FST that has the property
+// that no state has two transitions with the same input label.
+// For this algorithm, epsilon transitions are treated as regular
+// symbols (cf. RmEpsilon).
+//
+// The transducer must be functional. The weights must be (weakly)
+// left divisible (valid for TropicalWeight and LogWeight).
+//
+// Complexity:
+// - Determinizable: exponential (polynomial in the size of the output)
+// - Non-determinizable) does not terminate
+//
+// The determinizable automata include all unweighted and all acyclic input.
+//
+// References:
+// - Mehryar Mohri, "Finite-State Transducers in Language and Speech
+//   Processing". Computational Linguistics, 23:2, 1997.
+template <class A>
+class DeterminizeFst : public Fst<A> {
+ public:
+  friend class ArcIterator< DeterminizeFst<A> >;
+  friend class CacheStateIterator< DeterminizeFst<A> >;
+  friend class CacheArcIterator< DeterminizeFst<A> >;
+  template <class B, StringType S> friend class DeterminizeFstImpl;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef typename A::Label Label;
+  typedef CacheState<A> State;
+
+  explicit DeterminizeFst(const Fst<A> &fst,
+                 const DeterminizeFstOptions &opts = DeterminizeFstOptions()) {
+    if (fst.Properties(kAcceptor, true)) {
+      // Calls implementation for acceptors.
+      typedef DefaultCommonDivisor<Weight> D;
+      impl_ = new DeterminizeFsaImpl<A, D>(fst, D(), opts);
+    } else {
+      // Calls implementation for transducers.
+      impl_ = new DeterminizeFstImpl<A, STRING_LEFT_RESTRICT>(fst, opts);
+    }
+  }
+
+  DeterminizeFst(const DeterminizeFst<A> &fst) : Fst<A>(fst), impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~DeterminizeFst() { if (!impl_->DecrRefCount()) delete impl_; }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual DeterminizeFst<A> *Copy() const {
+    return new DeterminizeFst<A>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual inline void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+ protected:
+  DeterminizeFstImplBase<A> *Impl() { return impl_; }
+
+ private:
+  // This private version is for passing the common divisor to
+  // FSA determinization.
+  template <class D>
+  DeterminizeFst(const Fst<A> &fst, const D &common_divisor,
+                 const DeterminizeFstOptions &opts)
+      :  impl_(new DeterminizeFsaImpl<A, D>(fst, common_divisor, opts)) {}
+
+  DeterminizeFstImplBase<A> *impl_;
+
+  void operator=(const DeterminizeFst<A> &fst);  // Disallow
+};
+
+
+template <class A, StringType S>
+DeterminizeFstImpl<A, S>::DeterminizeFstImpl(
+    const Fst<A> &fst, const DeterminizeFstOptions &opts)
+    : DeterminizeFstImplBase<A>(fst, opts) {
+
+  // Mapper to an acceptor.
+  ToFst to_fst(fst, ToMapper());
+
+  // Determinize acceptor.
+  // This recursive call terminates since it passes the common divisor
+  // to a private constructor.
+  DeterminizeFst<ToArc> det_fsa(to_fst, CommonDivisor(), opts);
+
+  // Mapper back to transducer.
+  FactorWeightOptions fopts(CacheOptions(true, 0), opts.delta, true);
+  FactorWeightFst<ToArc, FactorIterator> factored_fst(det_fsa, fopts);
+  from_fst_ = new FromFst(factored_fst, FromMapper());
+}
+
+
+// Specialization for DeterminizeFst.
+template <class A>
+class StateIterator< DeterminizeFst<A> >
+    : public CacheStateIterator< DeterminizeFst<A> > {
+ public:
+  explicit StateIterator(const DeterminizeFst<A> &fst)
+      : CacheStateIterator< DeterminizeFst<A> >(fst) {}
+};
+
+
+// Specialization for DeterminizeFst.
+template <class A>
+class ArcIterator< DeterminizeFst<A> >
+    : public CacheArcIterator< DeterminizeFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const DeterminizeFst<A> &fst, StateId s)
+      : CacheArcIterator< DeterminizeFst<A> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+
+template <class A> inline
+void DeterminizeFst<A>::InitStateIterator(StateIteratorData<A> *data) const
+{
+  data->base = new StateIterator< DeterminizeFst<A> >(*this);
+}
+
+
+// Useful aliases when using StdArc.
+typedef DeterminizeFst<StdArc> StdDeterminizeFst;
+
+
+struct DeterminizeOptions {
+  float delta;                   // Quantization delta for subset weights
+
+  explicit DeterminizeOptions(float d) : delta(d) {}
+  DeterminizeOptions() :delta(kDelta) {}
+};
+
+
+// Determinizes a weighted transducer.  This version writes the
+// determinized Fst to an output MutableFst.  The result will be an
+// equivalent FSt that has the property that no state has two
+// transitions with the same input label.  For this algorithm, epsilon
+// transitions are treated as regular symbols (cf. RmEpsilon).
+//
+// The transducer must be functional. The weights must be (weakly)
+// left divisible (valid for TropicalWeight and LogWeight).
+//
+// Complexity:
+// - Determinizable: exponential (polynomial in the size of the output)
+// - Non-determinizable: does not terminate
+//
+// The determinizable automata include all unweighted and all acyclic input.
+//
+// References:
+// - Mehryar Mohri, "Finite-State Transducers in Language and Speech
+//   Processing". Computational Linguistics, 23:2, 1997.
+template <class Arc>
+void Determinize(const Fst<Arc> &ifst, MutableFst<Arc> *ofst,
+             const DeterminizeOptions &opts = DeterminizeOptions()) {
+  DeterminizeFstOptions nopts;
+  nopts.delta = opts.delta;
+  nopts.gc_limit = 0;  // Cache only the last state for fastest copy.
+  *ofst = DeterminizeFst<Arc>(ifst, nopts);
+}
+
+
+}  // namespace fst
+
+#endif  // FST_LIB_DETERMINIZE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/dfs-visit.h b/tools/thirdparty/OpenFst/fst/lib/dfs-visit.h
new file mode 100644
index 0000000..e82c564
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/dfs-visit.h
@@ -0,0 +1,164 @@
+// dfs-visit.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Depth-first search visitation
+
+#ifndef FST_LIB_DFS_VISIT_H__
+#define FST_LIB_DFS_VISIT_H__
+
+#include <stack>
+
+#include "fst/lib/arcfilter.h"
+#include "fst/lib/expanded-fst.h"
+
+namespace fst {
+
+// Visitor Interface - class determines actions taken during a Dfs.
+// If any of the boolean member functions return false, the DFS is
+// aborted by first calling FinishState() on all currently grey states
+// and then calling FinishVisit().
+//
+// template <class Arc>
+// class Visitor {
+//  public:
+//   typedef typename Arc::StateId StateId;
+//
+//   Visitor(T *return_data);
+//   // Invoked before DFS visit
+//   void InitVisit(const Fst<Arc> &fst);
+//   // Invoked when state discovered (2nd arg is DFS tree root)
+//   bool InitState(StateId s, StateId root);
+//   // Invoked when tree arc examined (to white/undiscovered state)
+//   bool TreeArc(StateId s, const Arc &a);
+//   // Invoked when back arc examined (to grey/unfinished state)
+//   bool BackArc(StateId s, const Arc &a);
+//   // Invoked when forward or cross arc examined (to black/finished state)
+//   bool ForwardOrCrossArc(StateId s, const Arc &a);
+//   // Invoked when state finished (PARENT is kNoStateID and ARC == NULL
+//   // when S is tree root)
+//   void FinishState(StateId s, StateId parent, const Arc *parent_arc);
+//   // Invoked after DFS visit
+//   void FinishVisit();
+// };
+
+// An Fst state's DFS status
+const int kDfsWhite = 0;   // Undiscovered
+const int kDfsGrey =  1;   // Discovered & unfinished
+const int kDfsBlack = 2;   // Finished
+
+// An Fst state's DFS stack state
+template <class Arc>
+struct DfsState {
+  typedef typename Arc::StateId StateId;
+
+  DfsState(const Fst<Arc> &fst, StateId s): state_id(s), arc_iter(fst, s) {}
+
+  StateId state_id;       // Fst state ...
+  ArcIterator< Fst<Arc> > arc_iter;  // and its corresponding arcs
+};
+
+
+// Performs depth-first visitation. Visitor class argument determines actions
+// and contains any return data. ArcFilter determines arcs that are considered.
+template <class Arc, class V, class ArcFilter>
+void DfsVisit(const Fst<Arc> &fst, V *visitor, ArcFilter filter) {
+  typedef typename Arc::StateId StateId;
+
+  visitor->InitVisit(fst);
+
+  StateId start = fst.Start();
+  if (start == kNoStateId) {
+    visitor->FinishVisit();
+    return;
+  }
+
+  vector<char> state_color;            // Fst state DFS status
+  stack<DfsState<Arc> *> state_stack;  // DFS execution stack
+
+  StateId nstates = CountStates(fst);
+
+  while ((StateId)state_color.size() < nstates) 
+    state_color.push_back(kDfsWhite);
+
+  // Continue DFS while true
+  bool dfs = true;
+
+  // Iterate over trees in DFS forest.
+  for (StateId root = start; dfs && root < nstates;) {
+    state_color[root] = kDfsGrey;
+    state_stack.push(new DfsState<Arc>(fst, root));
+    dfs = visitor->InitState(root, root);
+    while (!state_stack.empty()) {
+      DfsState<Arc> *dfs_state = state_stack.top();
+      StateId s = dfs_state->state_id;
+      ArcIterator< Fst<Arc> > &aiter = dfs_state->arc_iter;
+      if (!dfs || aiter.Done()) {
+        state_color[s] = kDfsBlack;
+        delete dfs_state;
+        state_stack.pop();
+        if (!state_stack.empty()) {
+          DfsState<Arc> *parent_state = state_stack.top();
+          StateId p = parent_state->state_id;
+          ArcIterator< Fst<Arc> > &piter = parent_state->arc_iter;
+          visitor->FinishState(s, p, &piter.Value());
+          piter.Next();
+        } else {
+          visitor->FinishState(s, kNoStateId, 0);
+        }
+        continue;
+      }
+      const Arc &arc = aiter.Value();
+      if (!filter(arc)) {
+        aiter.Next();
+        continue;
+      }
+      int next_color = state_color[arc.nextstate];
+      switch (next_color) {
+        default:
+        case kDfsWhite:
+          dfs = visitor->TreeArc(s, arc);
+          if (!dfs) break;
+          state_color[arc.nextstate] = kDfsGrey;
+          state_stack.push(new DfsState<Arc>(fst, arc.nextstate));
+          dfs = visitor->InitState(arc.nextstate, root);
+          break;
+        case kDfsGrey:
+          dfs = visitor->BackArc(s, arc);
+          aiter.Next();
+          break;
+        case kDfsBlack:
+          dfs = visitor->ForwardOrCrossArc(s, arc);
+          aiter.Next();
+          break;
+      }
+    }
+    // Find next tree root
+    for (root = root == start ? 0 : root + 1;
+         root < nstates && state_color[root] != kDfsWhite;
+         ++root);
+  }
+  visitor->FinishVisit();
+}
+
+
+template <class Arc, class V>
+void DfsVisit(const Fst<Arc> &fst, V *visitor) {
+  DfsVisit(fst, visitor, AnyArcFilter<Arc>());
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_DFS_VISIT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/difference.h b/tools/thirdparty/OpenFst/fst/lib/difference.h
new file mode 100644
index 0000000..fa5a2a2
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/difference.h
@@ -0,0 +1,140 @@
+// difference.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Class to compute the difference between two FSAs
+
+#ifndef FST_LIB_DIFFERENCE_H__
+#define FST_LIB_DIFFERENCE_H__
+
+#include "fst/lib/compose.h"
+#include "fst/lib/complement.h"
+
+namespace fst {
+
+template <uint64 T = 0>
+struct DifferenceFstOptions
+    : public ComposeFstOptions<T | COMPOSE_FST2_RHO> { };
+
+
+// Computes the difference between two FSAs. This version is a delayed
+// Fst. Only strings that are in the first automaton but not in second
+// are retained in the result.
+//
+// The first argument must be an acceptor; the second argument must be
+// an unweighted, epsilon-free, deterministic acceptor. One of the
+// arguments must be label-sorted.
+//
+// Complexity: same as ComposeFst.
+//
+// Caveats: same as ComposeFst.
+template <class A>
+class DifferenceFst : public ComposeFst<A> {
+ public:
+  using ComposeFst<A>::Impl;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  // A - B = A ^ B'.
+  DifferenceFst(const Fst<A> &fst1, const Fst<A> &fst2)
+      : ComposeFst<A>(fst1,
+                      ComplementFst<A>(fst2),
+                      ComposeFstOptions<COMPOSE_FST2_RHO>()) {
+    if (!fst1.Properties(kAcceptor, true))
+      LOG(FATAL) << "DifferenceFst: 1st argument not an acceptor";
+    uint64 props1 = fst1.Properties(kFstProperties, false);
+    uint64 props2 = fst2.Properties(kFstProperties, false);
+    Impl()->SetProperties(DifferenceProperties(props1, props2),
+                          kCopyProperties);
+  }
+
+  template <uint64 T>
+  DifferenceFst(const Fst<A> &fst1, const Fst<A> &fst2,
+                const DifferenceFstOptions<T> &opts)
+      : ComposeFst<A>(fst1,
+                      ComplementFst<A>(fst2),
+                      ComposeFstOptions<T | COMPOSE_FST2_RHO>(opts)) {
+    if (!fst1.Properties(kAcceptor, true))
+      LOG(FATAL) << "DifferenceFst: 1st argument not an acceptor";
+    uint64 props1 = fst1.Properties(kFstProperties, false);
+    uint64 props2 = fst2.Properties(kFstProperties, false);
+    Impl()->SetProperties(DifferenceProperties(props1, props2),
+                          kCopyProperties);
+  }
+
+  DifferenceFst(const DifferenceFst<A> &fst)
+      : ComposeFst<A>(fst) {}
+
+  virtual DifferenceFst<A> *Copy() const {
+    return new DifferenceFst<A>(*this);
+  }
+};
+
+
+// Specialization for DifferenceFst.
+template <class A>
+class StateIterator< DifferenceFst<A> >
+    : public StateIterator< ComposeFst<A> > {
+ public:
+  explicit StateIterator(const DifferenceFst<A> &fst)
+      : StateIterator< ComposeFst<A> >(fst) {}
+};
+
+
+// Specialization for DifferenceFst.
+template <class A>
+class ArcIterator< DifferenceFst<A> >
+    : public ArcIterator< ComposeFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const DifferenceFst<A> &fst, StateId s)
+      : ArcIterator< ComposeFst<A> >(fst, s) {}
+};
+
+// Useful alias when using StdArc.
+typedef DifferenceFst<StdArc> StdDifferenceFst;
+
+
+typedef ComposeOptions DifferenceOptions;
+
+
+// Computes the difference between two FSAs. This version is writes
+// the difference to an output MutableFst. Only strings that are in
+// the first automaton but not in second are retained in the result.
+//
+// The first argument must be an acceptor; the second argument must be
+// an unweighted, epsilon-free, deterministic acceptor.  One of the
+// arguments must be label-sorted.
+//
+// Complexity: same as Compose.
+//
+// Caveats: same as Compose.
+template<class Arc>
+void Difference(const Fst<Arc> &ifst1, const Fst<Arc> &ifst2,
+             MutableFst<Arc> *ofst,
+             const DifferenceOptions &opts = DifferenceOptions()) {
+  DifferenceFstOptions<> nopts;
+  nopts.gc_limit = 0;  // Cache only the last state for fastest copy.
+  *ofst = DifferenceFst<Arc>(ifst1, ifst2, nopts);
+  if (opts.connect)
+    Connect(ofst);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_DIFFERENCE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/encode.h b/tools/thirdparty/OpenFst/fst/lib/encode.h
new file mode 100644
index 0000000..882cdd0
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/encode.h
@@ -0,0 +1,428 @@
+// encode.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Class to encode and decoder an fst.
+
+#ifndef FST_LIB_ENCODE_H__
+#define FST_LIB_ENCODE_H__
+
+#include "fst/lib/map.h"
+#include "fst/lib/rmfinalepsilon.h"
+
+namespace fst {
+
+static const uint32 kEncodeLabels = 0x00001;
+static const uint32 kEncodeWeights  = 0x00002;
+
+enum EncodeType { ENCODE = 1, DECODE = 2 };
+
+// Identifies stream data as an encode table (and its endianity)
+static const int32 kEncodeMagicNumber = 2129983209;
+
+
+// The following class encapsulates implementation details for the
+// encoding and decoding of label/weight tuples used for encoding
+// and decoding of Fsts. The EncodeTable is bidirectional. I.E it
+// stores both the Tuple of encode labels and weights to a unique
+// label, and the reverse.
+template <class A>  class EncodeTable {
+ public:
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+
+  // Encoded data consists of arc input/output labels and arc weight
+  struct Tuple {
+    Tuple() {}
+    Tuple(Label ilabel_, Label olabel_, Weight weight_)
+        : ilabel(ilabel_), olabel(olabel_), weight(weight_) {}
+    Tuple(const Tuple& tuple)
+        : ilabel(tuple.ilabel), olabel(tuple.olabel), weight(tuple.weight) {}
+
+    Label ilabel;
+    Label olabel;
+    Weight weight;
+  };
+
+  // Comparison object for hashing EncodeTable Tuple(s).
+  class TupleEqual {
+   public:
+    bool operator()(const Tuple* x, const Tuple* y) const {
+      return (x->ilabel == y->ilabel &&
+              x->olabel == y->olabel &&
+              x->weight == y->weight);
+    }
+  };
+
+  // Hash function for EncodeTabe Tuples. Based on the encode flags
+  // we either hash the labels, weights or compbination of them.
+  class TupleKey {
+    static const int kPrime = 7853;
+   public:
+    TupleKey()
+        : encode_flags_(kEncodeLabels | kEncodeWeights) {}
+
+    TupleKey(const TupleKey& key)
+        : encode_flags_(key.encode_flags_) {}
+
+    explicit TupleKey(uint32 encode_flags)
+        : encode_flags_(encode_flags) {}
+
+    size_t operator()(const Tuple* x) const {
+      int lshift = x->ilabel % kPrime;
+      int rshift = sizeof(size_t) - lshift;
+      size_t hash = x->ilabel << lshift;
+      if (encode_flags_ & kEncodeLabels) hash ^= x->olabel >> rshift;
+      if (encode_flags_ & kEncodeWeights)  hash ^= x->weight.Hash();
+      return hash;
+    }
+
+   private:
+    int32 encode_flags_;
+  };
+
+  typedef hash_map<const Tuple*,
+                   Label,
+                   TupleKey,
+                   TupleEqual> EncodeHash;
+
+  explicit EncodeTable(uint32 encode_flags)
+      : flags_(encode_flags),
+        encode_hash_(1024, TupleKey(encode_flags)) {}
+
+  ~EncodeTable() {
+    for (size_t i = 0; i < encode_tuples_.size(); ++i) {
+      delete encode_tuples_[i];
+    }
+  }
+
+  // Given an arc encode either input/ouptut labels or input/costs or both
+  Label Encode(const A &arc) {
+    const Tuple tuple(arc.ilabel,
+                      flags_ & kEncodeLabels ? arc.olabel : 0,
+                      flags_ & kEncodeWeights ? arc.weight : Weight::One());
+    typename EncodeHash::const_iterator it = encode_hash_.find(&tuple);
+    if (it == encode_hash_.end()) {
+      encode_tuples_.push_back(new Tuple(tuple));
+      encode_hash_[encode_tuples_.back()] = encode_tuples_.size();
+      return encode_tuples_.size();
+    } else {
+      return it->second;
+    }
+  }
+
+  // Given an encode arc Label decode back to input/output labels and costs
+  const Tuple* Decode(Label key) {
+    return key <= (Label)encode_tuples_.size() ? encode_tuples_[key - 1] : 0; 
+  }
+
+  bool Write(ostream &strm, const string &source) const {
+    WriteType(strm, kEncodeMagicNumber);
+    WriteType(strm, flags_);
+    int64 size = encode_tuples_.size();
+    WriteType(strm, size);
+    for (size_t i = 0;  i < size; ++i) {
+      const Tuple* tuple = encode_tuples_[i];
+      WriteType(strm, tuple->ilabel);
+      WriteType(strm, tuple->olabel);
+      tuple->weight.Write(strm);
+    }
+    strm.flush();
+    if (!strm)
+      LOG(ERROR) << "EncodeTable::Write: write failed: " << source;
+    return strm;
+  }
+
+  bool Read(istream &strm, const string &source) {
+    encode_tuples_.clear();
+    encode_hash_.clear();
+    int32 magic_number = 0;
+    ReadType(strm, &magic_number);
+    if (magic_number != kEncodeMagicNumber) {
+      LOG(ERROR) << "EncodeTable::Read: Bad encode table header: " << source;
+      return false;
+    }
+    ReadType(strm, &flags_);
+    int64 size;
+    ReadType(strm, &size);
+    if (!strm) {
+      LOG(ERROR) << "EncodeTable::Read: read failed: " << source;
+      return false;
+    }
+    for (size_t i = 0; i < size; ++i) {
+      Tuple* tuple = new Tuple();
+      ReadType(strm, &tuple->ilabel);
+      ReadType(strm, &tuple->olabel);
+      tuple->weight.Read(strm);
+      encode_tuples_.push_back(tuple);
+      encode_hash_[encode_tuples_.back()] = encode_tuples_.size();
+    }
+    if (!strm)
+      LOG(ERROR) << "EncodeTable::Read: read failed: " << source;
+    return strm;
+  }
+
+  const uint32 flags() const { return flags_; }
+ private:
+  uint32 flags_;
+  vector<Tuple*> encode_tuples_;
+  EncodeHash encode_hash_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(EncodeTable);
+};
+
+
+// A mapper to encode/decode weighted transducers. Encoding of an
+// Fst is useful for performing classical determinization or minimization
+// on a weighted transducer by treating it as an unweighted acceptor over
+// encoded labels.
+//
+// The Encode mapper stores the encoding in a local hash table (EncodeTable)
+// This table is shared (and reference counted) between the encoder and
+// decoder. A decoder has read only access to the EncodeTable.
+//
+// The EncodeMapper allows on the fly encoding of the machine. As the
+// EncodeTable is generated the same table may by used to decode the machine
+// on the fly. For example in the following sequence of operations
+//
+//  Encode -> Determinize -> Decode
+//
+// we will use the encoding table generated during the encode step in the
+// decode, even though the encoding is not complete.
+//
+template <class A> class EncodeMapper {
+  typedef typename A::Weight Weight;
+  typedef typename A::Label  Label;
+ public:
+  EncodeMapper(uint32 flags, EncodeType type)
+    : ref_count_(1), flags_(flags), type_(type),
+      table_(new EncodeTable<A>(flags)) {}
+
+  EncodeMapper(const EncodeMapper& mapper)
+      : ref_count_(mapper.ref_count_ + 1),
+        flags_(mapper.flags_),
+        type_(mapper.type_),
+        table_(mapper.table_) { }
+
+  // Copy constructor but setting the type, typically to DECODE
+  EncodeMapper(const EncodeMapper& mapper, EncodeType type)
+      : ref_count_(mapper.ref_count_ + 1),
+        flags_(mapper.flags_),
+        type_(type),
+        table_(mapper.table_) { }
+
+  ~EncodeMapper() {
+    if (--ref_count_ == 0) delete table_;
+  }
+
+  A operator()(const A &arc) {
+    if (type_ == ENCODE) {  // labels and/or weights to single label
+      if ((arc.nextstate == kNoStateId && !(flags_ & kEncodeWeights)) ||
+          (arc.nextstate == kNoStateId && (flags_ & kEncodeWeights) &&
+           arc.weight == Weight::Zero())) {
+        return arc;
+      } else {
+        Label label = table_->Encode(arc);
+        return A(label,
+                 flags_ & kEncodeLabels ? label : arc.olabel,
+                 flags_ & kEncodeWeights ? Weight::One() : arc.weight,
+                 arc.nextstate);
+      }
+    } else {
+      if (arc.nextstate == kNoStateId) {
+        return arc;
+      } else {
+        const typename EncodeTable<A>::Tuple* tuple =
+          table_->Decode(arc.ilabel);
+        return A(tuple->ilabel,
+                 flags_ & kEncodeLabels ? tuple->olabel : arc.olabel,
+                 flags_ & kEncodeWeights ? tuple->weight : arc.weight,
+                 arc.nextstate);;
+      }
+    }
+  }
+
+  uint64 Properties(uint64 props) {
+    uint64 mask = kFstProperties;
+    if (flags_ & kEncodeLabels)
+      mask &= kILabelInvariantProperties & kOLabelInvariantProperties;
+    if (flags_ & kEncodeWeights)
+      mask &= kILabelInvariantProperties & kWeightInvariantProperties &
+          (type_ == ENCODE ? kAddSuperFinalProperties :
+           kRmSuperFinalProperties);
+    return props & mask;
+  }
+
+
+  MapFinalAction FinalAction() const {
+    return (type_ == ENCODE && (flags_ & kEncodeWeights)) ?
+                   MAP_REQUIRE_SUPERFINAL : MAP_NO_SUPERFINAL;
+  }
+
+  const uint32 flags() const { return flags_; }
+  const EncodeType type() const { return type_; }
+
+  bool Write(ostream &strm, const string& source) {
+    return table_->Write(strm, source);
+  }
+
+  bool Write(const string& filename) {
+    ofstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "EncodeMap: Can't open file: " << filename;
+      return false;
+    }
+    return Write(strm, filename);
+  }
+
+  static EncodeMapper<A> *Read(istream &strm,
+                               const string& source, EncodeType type) {
+    EncodeTable<A> *table = new EncodeTable<A>(0);
+    bool r = table->Read(strm, source);
+    return r ? new EncodeMapper(table->flags(), type, table) : 0;
+  }
+
+  static EncodeMapper<A> *Read(const string& filename, EncodeType type) {
+    ifstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "EncodeMap: Can't open file: " << filename;
+      return false;
+    }
+    return Read(strm, filename, type);
+  }
+
+ private:
+  uint32  ref_count_;
+  uint32  flags_;
+  EncodeType type_;
+  EncodeTable<A>* table_;
+
+  explicit EncodeMapper(uint32 flags, EncodeType type, EncodeTable<A> *table)
+      : ref_count_(1), flags_(flags), type_(type), table_(table) {}
+  void operator=(const EncodeMapper &);  // Disallow.
+};
+
+
+// Complexity: O(nstates + narcs)
+template<class A> inline
+void Encode(MutableFst<A> *fst, EncodeMapper<A>* mapper) {
+  Map(fst, mapper);
+}
+
+
+template<class A> inline
+void Decode(MutableFst<A>* fst, const EncodeMapper<A>& mapper) {
+  Map(fst, EncodeMapper<A>(mapper, DECODE));
+  RmFinalEpsilon(fst);
+}
+
+
+// On the fly label and/or weight encoding of input Fst
+//
+// Complexity:
+// - Constructor: O(1)
+// - Traversal: O(nstates_visited + narcs_visited), assuming constant
+//   time to visit an input state or arc.
+template <class A>
+class EncodeFst : public MapFst<A, A, EncodeMapper<A> > {
+ public:
+  typedef A Arc;
+  typedef EncodeMapper<A> C;
+
+  EncodeFst(const Fst<A> &fst, EncodeMapper<A>* encoder)
+      : MapFst<A, A, C>(fst, encoder, MapFstOptions()) {}
+
+  EncodeFst(const Fst<A> &fst, const EncodeMapper<A>& encoder)
+      : MapFst<A, A, C>(fst, encoder, MapFstOptions()) {}
+
+  EncodeFst(const EncodeFst<A> &fst)
+      : MapFst<A, A, C>(fst) {}
+
+  virtual EncodeFst<A> *Copy() const { return new EncodeFst(*this); }
+};
+
+
+// On the fly label and/or weight encoding of input Fst
+//
+// Complexity:
+// - Constructor: O(1)
+// - Traversal: O(nstates_visited + narcs_visited), assuming constant
+//   time to visit an input state or arc.
+template <class A>
+class DecodeFst : public MapFst<A, A, EncodeMapper<A> > {
+ public:
+  typedef A Arc;
+  typedef EncodeMapper<A> C;
+
+  DecodeFst(const Fst<A> &fst, const EncodeMapper<A>& encoder)
+      : MapFst<A, A, C>(fst,
+                            EncodeMapper<A>(encoder, DECODE),
+                            MapFstOptions()) {}
+
+  DecodeFst(const EncodeFst<A> &fst)
+      : MapFst<A, A, C>(fst) {}
+
+  virtual DecodeFst<A> *Copy() const { return new DecodeFst(*this); }
+};
+
+
+// Specialization for EncodeFst.
+template <class A>
+class StateIterator< EncodeFst<A> >
+    : public StateIterator< MapFst<A, A, EncodeMapper<A> > > {
+ public:
+  explicit StateIterator(const EncodeFst<A> &fst)
+      : StateIterator< MapFst<A, A, EncodeMapper<A> > >(fst) {}
+};
+
+
+// Specialization for EncodeFst.
+template <class A>
+class ArcIterator< EncodeFst<A> >
+    : public ArcIterator< MapFst<A, A, EncodeMapper<A> > > {
+ public:
+  ArcIterator(const EncodeFst<A> &fst, typename A::StateId s)
+      : ArcIterator< MapFst<A, A, EncodeMapper<A> > >(fst, s) {}
+};
+
+
+// Specialization for DecodeFst.
+template <class A>
+class StateIterator< DecodeFst<A> >
+    : public StateIterator< MapFst<A, A, EncodeMapper<A> > > {
+ public:
+  explicit StateIterator(const DecodeFst<A> &fst)
+      : StateIterator< MapFst<A, A, EncodeMapper<A> > >(fst) {}
+};
+
+
+// Specialization for DecodeFst.
+template <class A>
+class ArcIterator< DecodeFst<A> >
+    : public ArcIterator< MapFst<A, A, EncodeMapper<A> > > {
+ public:
+  ArcIterator(const DecodeFst<A> &fst, typename A::StateId s)
+      : ArcIterator< MapFst<A, A, EncodeMapper<A> > >(fst, s) {}
+};
+
+
+// Useful aliases when using StdArc.
+typedef EncodeFst<StdArc> StdEncodeFst;
+
+typedef DecodeFst<StdArc> StdDecodeFst;
+
+}
+
+#endif  // FST_LIB_ENCODE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/epsnormalize.h b/tools/thirdparty/OpenFst/fst/lib/epsnormalize.h
new file mode 100644
index 0000000..ac4baf2
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/epsnormalize.h
@@ -0,0 +1,70 @@
+// epsnormalize.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Function that implements epsilon normalization.
+
+#ifndef FST_LIB_EPSNORMALIZE_H__
+#define FST_LIB_EPSNORMALIZE_H__
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+#include <ext/slist>
+using __gnu_cxx::slist;
+
+#include "fst/lib/factor-weight.h"
+#include "fst/lib/invert.h"
+#include "fst/lib/map.h"
+#include "fst/lib/rmepsilon.h"
+
+namespace fst {
+
+enum EpsNormalizeType {EPS_NORM_INPUT, EPS_NORM_OUTPUT};
+
+// Returns an equivalent FST that is epsilon-normalized. An acceptor is
+// epsilon-normalized if it is epsilon-removed. A transducer is input
+// epsilon-normalized if additionally if on each path any epsilon input
+// label follows all non-epsilon input labels. Output epsilon-normalized
+// is defined similarly.
+//
+// The input FST needs to be functional.
+//
+// References:
+// - Mehryar Mohri. "Generic epsilon-removal and input epsilon-normalization
+//   algorithms for weighted transducers", International Journal of Computer
+//   Science, 13(1): 129-143, 2002.
+template <class Arc>
+void EpsNormalize(const Fst<Arc> &ifst, MutableFst<Arc> *ofst,
+                      EpsNormalizeType type = EPS_NORM_INPUT) {
+  VectorFst< GallicArc<Arc, STRING_RIGHT_RESTRICT> > gfst;
+  if (type == EPS_NORM_INPUT)
+    Map(ifst, &gfst, ToGallicMapper<Arc, STRING_RIGHT_RESTRICT>());
+  else // type == EPS_NORM_OUTPUT
+    Map(InvertFst<Arc>(ifst), &gfst,
+            ToGallicMapper<Arc, STRING_RIGHT_RESTRICT>());
+  RmEpsilon(&gfst);
+  FactorWeightFst< GallicArc<Arc, STRING_RIGHT_RESTRICT>,
+    GallicFactor<typename Arc::Label,
+      typename Arc::Weight, STRING_RIGHT_RESTRICT> >
+    fwfst(gfst);
+  Map(fwfst, ofst, FromGallicMapper<Arc, STRING_RIGHT_RESTRICT>());
+  if(type == EPS_NORM_OUTPUT)
+    Invert(ofst);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_EPSNORMALIZE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/equal.h b/tools/thirdparty/OpenFst/fst/lib/equal.h
new file mode 100644
index 0000000..8e9fb11
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/equal.h
@@ -0,0 +1,119 @@
+// test.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Function to test equality of two Fsts.
+
+#ifndef FST_LIB_EQUAL_H__
+#define FST_LIB_EQUAL_H__
+
+#include "fst/lib/fst.h"
+
+namespace fst {
+
+// Tests if two Fsts have the same states and arcs in the same order.
+template<class Arc>
+bool Equal(const Fst<Arc> &fst1, const Fst<Arc> &fst2) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+
+  if (fst1.Start() != fst2.Start()) {
+    VLOG(1) << "Equal: mismatched start states";
+    return false;
+  }
+
+  StateIterator< Fst<Arc> > siter1(fst1);
+  StateIterator< Fst<Arc> > siter2(fst2);
+
+  while (!siter1.Done() || !siter2.Done()) {
+    if (siter1.Done() || siter2.Done()) {
+      VLOG(1) << "Equal: mismatched # of states";
+      return false;
+    }
+    StateId s1 = siter1.Value();
+    StateId s2 = siter2.Value();
+    if (s1 != s2) {
+      VLOG(1) << "Equal: mismatched states:"
+              << ", state1 = " << s1
+              << ", state2 = " << s2;
+      return false;
+    }
+    Weight final1 = fst1.Final(s1);
+    Weight final2 = fst2.Final(s2);
+    if (!ApproxEqual(final1, final2)) {
+      VLOG(1) << "Equal: mismatched final weights:"
+              << " state = " << s1
+              << ", final1 = " << final1
+              << ", final2 = " << final2;
+      return false;
+     }
+    ArcIterator< Fst<Arc> > aiter1(fst1, s1);
+    ArcIterator< Fst<Arc> > aiter2(fst2, s2);
+    for (size_t a = 0; !aiter1.Done() || !aiter2.Done(); ++a) {
+      if (aiter1.Done() || aiter2.Done()) {
+        VLOG(1) << "Equal: mismatched # of arcs"
+                << " state = " << s1;
+        return false;
+      }
+      Arc arc1 = aiter1.Value();
+      Arc arc2 = aiter2.Value();
+      if (arc1.ilabel != arc2.ilabel) {
+        VLOG(1) << "Equal: mismatched arc input labels:"
+                << " state = " << s1
+                << ", arc = " << a
+                << ", ilabel1 = " << arc1.ilabel
+                << ", ilabel2 = " << arc2.ilabel;
+        return false;
+      } else  if (arc1.olabel != arc2.olabel) {
+        VLOG(1) << "Equal: mismatched arc output labels:"
+                << " state = " << s1
+                << ", arc = " << a
+                << ", olabel1 = " << arc1.olabel
+                << ", olabel2 = " << arc2.olabel;
+        return false;
+      } else  if (!ApproxEqual(arc1.weight, arc2.weight)) {
+        VLOG(1) << "Equal: mismatched arc weights:"
+                << " state = " << s1
+                << ", arc = " << a
+                << ", weight1 = " << arc1.weight
+                << ", weight2 = " << arc2.weight;
+        return false;
+      } else  if (arc1.nextstate != arc2.nextstate) {
+        VLOG(1) << "Equal: mismatched input label:"
+                << " state = " << s1
+                << ", arc = " << a
+                << ", nextstate1 = " << arc1.nextstate
+                << ", nextstate2 = " << arc2.nextstate;
+        return false;
+      }
+      aiter1.Next();
+      aiter2.Next();
+
+    }
+    // Sanity checks
+    CHECK_EQ(fst1.NumArcs(s1), fst2.NumArcs(s2));
+    CHECK_EQ(fst1.NumInputEpsilons(s1), fst2.NumInputEpsilons(s2));
+    CHECK_EQ(fst1.NumOutputEpsilons(s1), fst2.NumOutputEpsilons(s2));
+
+    siter1.Next();
+    siter2.Next();
+  }
+  return true;
+}
+
+}  // namespace fst
+
+
+#endif  // FST_LIB_EQUAL_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/equivalent.h b/tools/thirdparty/OpenFst/fst/lib/equivalent.h
new file mode 100644
index 0000000..e585d9b
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/equivalent.h
@@ -0,0 +1,233 @@
+// equivalent.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file Functions and classes to determine the equivalence of two
+// FSTs.
+
+#ifndef FST_LIB_EQUIVALENT_H__
+#define FST_LIB_EQUIVALENT_H__
+
+#include <algorithm>
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+
+#include "fst/lib/encode.h"
+#include "fst/lib/push.h"
+#include "fst/lib/union-find.h"
+#include "fst/lib/vector-fst.h"
+
+namespace fst {
+
+// Traits-like struct holding utility functions/typedefs/constants for
+// the equivalence algorithm.
+//
+// Encoding device: in order to make the statesets of the two acceptors
+// disjoint, we map Arc::StateId on the type MappedId. The states of
+// the first acceptor are mapped on odd numbers (s -> 2s + 1), and
+// those of the second one on even numbers (s -> 2s + 2). The number 0
+// is reserved for an implicit (non-final) 'dead state' (required for
+// the correct treatment of non-coaccessible states; kNoStateId is
+// mapped to kDeadState for both acceptors). The union-find algorithm
+// operates on the mapped IDs.
+template <class Arc>
+struct EquivalenceUtil {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+  typedef int32 MappedId;  // ID for an equivalence class.
+
+  // MappedId for an implicit dead state.
+  static const MappedId kDeadState = 0;
+
+  // MappedId for lookup failure.
+  static const MappedId kInvalidId = -1;
+
+  // Maps state ID to the representative of the corresponding
+  // equivalence class. The parameter 'which_fst' takes the values 1
+  // and 2, identifying the input FST.
+  static MappedId MapState(StateId s, int32 which_fst) {
+    return
+      (kNoStateId == s)
+      ?
+      kDeadState
+      :
+      (static_cast<MappedId>(s) << 1) + which_fst;
+  }
+  // Maps set ID to State ID.
+  static StateId UnMapState(MappedId id) {
+    return static_cast<StateId>((--id) >> 1);
+  }
+  // Convenience function: checks if state with MappedId 's' is final
+  // in acceptor 'fa'.
+  static bool IsFinal(const Fst<Arc> &fa, MappedId s) {
+    return
+      (kDeadState == s) ?
+      false : (fa.Final(UnMapState(s)) != Weight::Zero());
+  }
+  // Convenience function: returns the representative of 'id' in 'sets',
+  // creating a new set if needed.
+  static MappedId FindSet(UnionFind<MappedId> *sets, MappedId id) {
+    MappedId repr = sets->FindSet(id);
+    if (repr != kInvalidId) {
+      return repr;
+    } else {
+      sets->MakeSet(id);
+      return id;
+    }
+  }
+};
+
+// Equivalence checking algorithm: determines if the two FSTs
+// <code>fst1</code> and <code>fst2</code> are equivalent. The input
+// FSTs must be deterministic input-side epsilon-free acceptors,
+// unweighted or with weights over a left semiring. Two acceptors are
+// considered equivalent if they accept exactly the same set of
+// strings (with the same weights).
+//
+// The algorithm (cf. Aho, Hopcroft and Ullman, "The Design and
+// Analysis of Computer Programs") successively constructs sets of
+// states that can be reached by the same prefixes, starting with a
+// set containing the start states of both acceptors. A disjoint tree
+// forest (the union-find algorithm) is used to represent the sets of
+// states. The algorithm returns 'false' if one of the constructed
+// sets contains both final and non-final states.
+//
+// Complexity: quasi-linear, i.e. O(n G(n)), where
+//   n = |S1| + |S2| is the number of states in both acceptors
+//   G(n) is a very slowly growing function that can be approximated
+//        by 4 by all practical purposes.
+//
+template <class Arc>
+bool Equivalent(const Fst<Arc> &fst1, const Fst<Arc> &fst2) {
+  typedef typename Arc::Weight Weight;
+  // Check properties first:
+  uint64 props = kNoEpsilons | kIDeterministic | kAcceptor;
+  if (fst1.Properties(props, true) != props) {
+    LOG(FATAL) << "Equivalent: first argument not an"
+               << " epsilon-free deterministic acceptor";
+  }
+  if (fst2.Properties(props, true) != props) {
+    LOG(FATAL) << "Equivalent: second argument not an"
+               << " epsilon-free deterministic acceptor";
+  }
+
+  if ((fst1.Properties(kUnweighted , true) != kUnweighted)
+      || (fst2.Properties(kUnweighted , true) != kUnweighted)) {
+    VectorFst<Arc> efst1(fst1);
+    VectorFst<Arc> efst2(fst2);
+    Push(&efst1, REWEIGHT_TO_INITIAL);
+    Push(&efst2, REWEIGHT_TO_INITIAL);
+    Map(&efst1, QuantizeMapper<Arc>());
+    Map(&efst2, QuantizeMapper<Arc>());
+    EncodeMapper<Arc> mapper(kEncodeWeights|kEncodeLabels, ENCODE);
+    Map(&efst1, &mapper);
+    Map(&efst2, &mapper);
+    return Equivalent(efst1, efst2);
+  }
+
+  // Convenience typedefs:
+  typedef typename Arc::StateId StateId;
+  typedef EquivalenceUtil<Arc> Util;
+  typedef typename Util::MappedId MappedId;
+  enum { FST1 = 1, FST2 = 2 };  // Required by Util::MapState(...)
+
+  MappedId s1 = Util::MapState(fst1.Start(), FST1);
+  MappedId s2 = Util::MapState(fst2.Start(), FST2);
+
+  // The union-find structure.
+  UnionFind<MappedId> eq_classes(1000, Util::kInvalidId);
+
+  // Initialize the union-find structure.
+  eq_classes.MakeSet(s1);
+  eq_classes.MakeSet(s2);
+
+  // Early return if the start states differ w.r.t. being final.
+  if (Util::IsFinal(fst1, s1) != Util::IsFinal(fst2, s2)) {
+    return false;
+  }
+  // Data structure for the (partial) acceptor transition function of
+  // fst1 and fst2: input labels mapped to pairs of MappedId's
+  // representing destination states of the corresponding arcs in fst1
+  // and fst2, respectively.
+  typedef
+    hash_map<typename Arc::Label, pair<MappedId, MappedId> >
+    Label2StatePairMap;
+
+  Label2StatePairMap arc_pairs;
+
+  // Pairs of MappedId's to be processed, organized in a queue.
+  deque<pair<MappedId, MappedId> > q;
+
+  // Main loop: explores the two acceptors in a breadth-first manner,
+  // updating the equivalence relation on the statesets. Loop
+  // invariant: each block of states contains either final states only
+  // or non-final states only.
+  for (q.push_back(make_pair(s1, s2)); !q.empty(); q.pop_front()) {
+    s1 = q.front().first;
+    s2 = q.front().second;
+
+    // Representatives of the equivalence classes of s1/s2.
+    MappedId rep1 = Util::FindSet(&eq_classes, s1);
+    MappedId rep2 = Util::FindSet(&eq_classes, s2);
+
+    if (rep1 != rep2) {
+      eq_classes.Union(rep1, rep2);
+      arc_pairs.clear();
+
+      // Copy outgoing arcs starting at s1 into the hashtable.
+      if (Util::kDeadState != s1) {
+        ArcIterator<Fst<Arc> > arc_iter(fst1, Util::UnMapState(s1));
+        for (; !arc_iter.Done(); arc_iter.Next()) {
+          const Arc &arc = arc_iter.Value();
+          if (arc.weight != Weight::Zero()) {  // Zero-weight arcs
+                                                   // are treated as
+                                                   // non-exisitent.
+            arc_pairs[arc.ilabel].first = Util::MapState(arc.nextstate, FST1);
+          }
+        }
+      }
+      // Copy outgoing arcs starting at s2 into the hashtable.
+      if (Util::kDeadState != s2) {
+        ArcIterator<Fst<Arc> > arc_iter(fst2, Util::UnMapState(s2));
+        for (; !arc_iter.Done(); arc_iter.Next()) {
+          const Arc &arc = arc_iter.Value();
+          if (arc.weight != Weight::Zero()) {  // Zero-weight arcs
+                                                   // are treated as
+                                                   // non-existent.
+            arc_pairs[arc.ilabel].second = Util::MapState(arc.nextstate, FST2);
+          }
+        }
+      }
+      // Iterate through the hashtable and process pairs of target
+      // states.
+      for (typename Label2StatePairMap::const_iterator
+             arc_iter = arc_pairs.begin();
+           arc_iter != arc_pairs.end();
+           ++arc_iter) {
+        const pair<MappedId, MappedId> &p = arc_iter->second;
+        if (Util::IsFinal(fst1, p.first) != Util::IsFinal(fst2, p.second)) {
+          // Detected inconsistency: return false.
+          return false;
+        }
+        q.push_back(p);
+      }
+    }
+  }
+  return true;
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_EQUIVALENT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/expanded-fst.h b/tools/thirdparty/OpenFst/fst/lib/expanded-fst.h
new file mode 100644
index 0000000..b8beaf8
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/expanded-fst.h
@@ -0,0 +1,96 @@
+// expanded-fst.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Generic FST augmented with state count - interface class definition.
+
+#ifndef FST_LIB_EXPANDED_FST_H__
+#define FST_LIB_EXPANDED_FST_H__
+
+#include "fst/lib/fst.h"
+
+namespace fst {
+
+// A generic FST plus state count.
+template <class A>
+class ExpandedFst : public Fst<A> {
+ public:
+  typedef A Arc;
+  typedef typename A::StateId StateId;
+
+  virtual StateId NumStates() const = 0;  // State count
+
+  // Get a copy of this ExpandedFst.
+  virtual ExpandedFst<A> *Copy() const = 0;
+  // Read an ExpandedFst from an input stream; return NULL on error.
+  static ExpandedFst<A> *Read(istream &strm, const FstReadOptions &opts) {
+    FstReadOptions ropts(opts);
+    FstHeader hdr;
+    if (ropts.header)
+      hdr = *opts.header;
+    else {
+      if (!hdr.Read(strm, opts.source))
+        return 0;
+      ropts.header = &hdr;
+    }
+    if (!(hdr.Properties() & kExpanded)) {
+      LOG(ERROR) << "ExpandedFst::Read: Not an ExpandedFst: " << ropts.source;
+      return 0;
+    }
+    FstRegister<A> *registr = FstRegister<A>::GetRegister();
+    const typename FstRegister<A>::Reader reader =
+      registr->GetReader(hdr.FstType());
+    if (!reader) {
+      LOG(ERROR) << "ExpandedFst::Read: Unknown FST type \"" << hdr.FstType()
+                 << "\" (arc type = \"" << A::Type()
+                 << "\"): " << ropts.source;
+      return 0;
+    }
+    Fst<A> *fst = reader(strm, ropts);
+    if (!fst) return 0;
+    return down_cast<ExpandedFst<A> *>(fst);
+  }
+  // Read an ExpandedFst from a file; return NULL on error.
+  static ExpandedFst<A> *Read(const string &filename) {
+    ifstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "ExpandedFst::Read: Can't open file: " << filename;
+      return 0;
+    }
+    return Read(strm, FstReadOptions(filename));
+  }
+};
+
+// A useful alias when using StdArc.
+typedef ExpandedFst<StdArc> StdExpandedFst;
+
+// Function to return the number of states in an FST, counting them
+// if necessary.
+template <class Arc>
+typename Arc::StateId CountStates(const Fst<Arc> &fst) {
+  if (fst.Properties(kExpanded, false)) {
+    const ExpandedFst<Arc> *efst = down_cast<const ExpandedFst<Arc> *>(&fst);
+    return efst->NumStates();
+  } else {
+    typename Arc::StateId nstates = 0;
+    for (StateIterator< Fst<Arc> > siter(fst); !siter.Done(); siter.Next())
+      ++nstates;
+    return nstates;
+  }
+}
+
+}  // FST_LIB_FST_H__
+
+#endif  // FST_LIB_EXPANDED_FST_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/factor-weight.h b/tools/thirdparty/OpenFst/fst/lib/factor-weight.h
new file mode 100644
index 0000000..3a2ef85
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/factor-weight.h
@@ -0,0 +1,449 @@
+// factor-weight.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Classes to factor weights in an FST.
+
+#ifndef FST_LIB_FACTOR_WEIGHT_H__
+#define FST_LIB_FACTOR_WEIGHT_H__
+
+#include <algorithm>
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+#include <ext/slist>
+using __gnu_cxx::slist;
+
+#include "fst/lib/cache.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+struct FactorWeightOptions : CacheOptions {
+  float delta;
+  bool final_only;  // only factor final weights when true
+
+  FactorWeightOptions(const CacheOptions &opts, float d, bool of)
+      : CacheOptions(opts), delta(d), final_only(of) {}
+
+  explicit FactorWeightOptions(float d, bool of = false)
+      : delta(d), final_only(of) {}
+
+  FactorWeightOptions(bool of = false)
+      : delta(kDelta), final_only(of) {}
+};
+
+
+// A factor iterator takes as argument a weight w and returns a
+// sequence of pairs of weights (xi,yi) such that the sum of the
+// products xi times yi is equal to w. If w is fully factored,
+// the iterator should return nothing.
+//
+// template <class W>
+// class FactorIterator {
+//  public:
+//   FactorIterator(W w);
+//   bool Done() const;
+//   void Next();
+//   pair<W, W> Value() const;
+//   void Reset();
+// }
+
+
+// Factor trivially.
+template <class W>
+class IdentityFactor {
+ public:
+  IdentityFactor(const W &w) {}
+  bool Done() const { return true; }
+  void Next() {}
+  pair<W, W> Value() const { return make_pair(W::One(), W::One()); } // unused
+  void Reset() {}
+};
+
+
+// Factor a StringWeight w as 'ab' where 'a' is a label.
+template <typename L, StringType S = STRING_LEFT>
+class StringFactor {
+ public:
+  StringFactor(const StringWeight<L, S> &w)
+      : weight_(w), done_(w.Size() <= 1) {}
+
+  bool Done() const { return done_; }
+
+  void Next() { done_ = true; }
+
+  pair< StringWeight<L, S>, StringWeight<L, S> > Value() const {
+    StringWeightIterator<L, S> iter(weight_);
+    StringWeight<L, S> w1(iter.Value());
+    StringWeight<L, S> w2;
+    for (iter.Next(); !iter.Done(); iter.Next())
+      w2.PushBack(iter.Value());
+    return make_pair(w1, w2);
+  }
+
+  void Reset() { done_ = weight_.Size() <= 1; }
+
+ private:
+  StringWeight<L, S> weight_;
+  bool done_;
+};
+
+
+// Factor a GallicWeight using StringFactor.
+template <class L, class W, StringType S = STRING_LEFT>
+class GallicFactor {
+ public:
+  GallicFactor(const GallicWeight<L, W, S> &w)
+      : weight_(w), done_(w.Value1().Size() <= 1) {}
+
+  bool Done() const { return done_; }
+
+  void Next() { done_ = true; }
+
+  pair< GallicWeight<L, W, S>, GallicWeight<L, W, S> > Value() const {
+    StringFactor<L, S> iter(weight_.Value1());
+    GallicWeight<L, W, S> w1(iter.Value().first, weight_.Value2());
+    GallicWeight<L, W, S> w2(iter.Value().second, W::One());
+    return make_pair(w1, w2);
+  }
+
+  void Reset() { done_ = weight_.Value1().Size() <= 1; }
+
+ private:
+  GallicWeight<L, W, S> weight_;
+  bool done_;
+};
+
+
+// Implementation class for FactorWeight
+template <class A, class F>
+class FactorWeightFstImpl
+    : public CacheImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+
+  using CacheBaseImpl< CacheState<A> >::HasStart;
+  using CacheBaseImpl< CacheState<A> >::HasFinal;
+  using CacheBaseImpl< CacheState<A> >::HasArcs;
+
+  typedef A Arc;
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef F FactorIterator;
+
+  struct Element {
+    Element() {}
+
+    Element(StateId s, Weight w) : state(s), weight(w) {}
+
+    StateId state;     // Input state Id
+    Weight weight;     // Residual weight
+  };
+
+  FactorWeightFstImpl(const Fst<A> &fst, const FactorWeightOptions &opts)
+      : CacheImpl<A>(opts), fst_(fst.Copy()), delta_(opts.delta),
+        final_only_(opts.final_only) {
+    SetType("factor-weight");
+    uint64 props = fst.Properties(kFstProperties, false);
+    SetProperties(FactorWeightProperties(props), kCopyProperties);
+
+    SetInputSymbols(fst.InputSymbols());
+    SetOutputSymbols(fst.OutputSymbols());
+  }
+
+  ~FactorWeightFstImpl() {
+    delete fst_;
+  }
+
+  StateId Start() {
+    if (!HasStart()) {
+      StateId s = fst_->Start();
+      if (s == kNoStateId)
+        return kNoStateId;
+      StateId start = FindState(Element(fst_->Start(), Weight::One()));
+      SetStart(start);
+    }
+    return CacheImpl<A>::Start();
+  }
+
+  Weight Final(StateId s) {
+    if (!HasFinal(s)) {
+      const Element &e = elements_[s];
+      // TODO: fix so cast is unnecessary
+      Weight w = e.state == kNoStateId
+                 ? e.weight
+                 : (Weight) Times(e.weight, fst_->Final(e.state));
+      FactorIterator f(w);
+      if (w != Weight::Zero() && f.Done())
+        SetFinal(s, w);
+      else
+        SetFinal(s, Weight::Zero());
+    }
+    return CacheImpl<A>::Final(s);
+  }
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumOutputEpsilons(s);
+  }
+
+  void InitArcIterator(StateId s, ArcIteratorData<A> *data) {
+    if (!HasArcs(s))
+      Expand(s);
+    CacheImpl<A>::InitArcIterator(s, data);
+  }
+
+
+  // Find state corresponding to an element. Create new state
+  // if element not found.
+  StateId FindState(const Element &e) {
+    if (final_only_ && e.weight == Weight::One()) {
+      while (unfactored_.size() <= (unsigned int)e.state) 
+        unfactored_.push_back(kNoStateId);
+      if (unfactored_[e.state] == kNoStateId) {
+        unfactored_[e.state] = elements_.size();
+        elements_.push_back(e);
+      }
+      return unfactored_[e.state];
+    } else {
+      typename ElementMap::iterator eit = element_map_.find(e);
+      if (eit != element_map_.end()) {
+        return (*eit).second;
+      } else {
+        StateId s = elements_.size();
+        elements_.push_back(e);
+        element_map_.insert(pair<const Element, StateId>(e, s));
+        return s;
+      }
+    }
+  }
+
+  // Computes the outgoing transitions from a state, creating new destination
+  // states as needed.
+  void Expand(StateId s) {
+    Element e = elements_[s];
+    if (e.state != kNoStateId) {
+      for (ArcIterator< Fst<A> > ait(*fst_, e.state);
+           !ait.Done();
+           ait.Next()) {
+        const A &arc = ait.Value();
+        Weight w = Times(e.weight, arc.weight);
+        FactorIterator fit(w);
+        if (final_only_ || fit.Done()) {
+          StateId d = FindState(Element(arc.nextstate, Weight::One()));
+          AddArc(s, Arc(arc.ilabel, arc.olabel, w, d));
+        } else {
+          for (; !fit.Done(); fit.Next()) {
+            const pair<Weight, Weight> &p = fit.Value();
+            StateId d = FindState(Element(arc.nextstate,
+                                          p.second.Quantize(delta_)));
+            AddArc(s, Arc(arc.ilabel, arc.olabel, p.first, d));
+          }
+        }
+      }
+    }
+    if ((e.state == kNoStateId) ||
+        (fst_->Final(e.state) != Weight::Zero())) {
+      Weight w = e.state == kNoStateId
+                 ? e.weight
+                 : Times(e.weight, fst_->Final(e.state));
+      for (FactorIterator fit(w);
+           !fit.Done();
+           fit.Next()) {
+        const pair<Weight, Weight> &p = fit.Value();
+        StateId d = FindState(Element(kNoStateId,
+                                      p.second.Quantize(delta_)));
+        AddArc(s, Arc(0, 0, p.first, d));
+      }
+    }
+    SetArcs(s);
+  }
+
+ private:
+  // Equality function for Elements, assume weights have been quantized.
+  class ElementEqual {
+   public:
+    bool operator()(const Element &x, const Element &y) const {
+      return x.state == y.state && x.weight == y.weight;
+    }
+  };
+
+  // Hash function for Elements to Fst states.
+  class ElementKey {
+   public:
+    size_t operator()(const Element &x) const {
+      return static_cast<size_t>(x.state * kPrime + x.weight.Hash());
+    }
+   private:
+    static const int kPrime = 7853;
+  };
+
+  typedef hash_map<Element, StateId, ElementKey, ElementEqual> ElementMap;
+
+  const Fst<A> *fst_;
+  float delta_;
+  bool final_only_;
+  vector<Element> elements_;  // mapping Fst state to Elements
+  ElementMap element_map_;    // mapping Elements to Fst state
+  // mapping between old/new 'StateId' for states that do not need to
+  // be factored when 'final_only_' is true
+  vector<StateId> unfactored_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(FactorWeightFstImpl);
+};
+
+
+// FactorWeightFst takes as template parameter a FactorIterator as
+// defined above. The result of weight factoring is a transducer
+// equivalent to the input whose path weights have been factored
+// according to the FactorIterator. States and transitions will be
+// added as necessary. The algorithm is a generalization to arbitrary
+// weights of the second step of the input epsilon-normalization
+// algorithm due to Mohri, "Generic epsilon-removal and input
+// epsilon-normalization algorithms for weighted transducers",
+// International Journal of Computer Science 13(1): 129-143 (2002).
+template <class A, class F>
+class FactorWeightFst : public Fst<A> {
+ public:
+  friend class ArcIterator< FactorWeightFst<A, F> >;
+  friend class CacheStateIterator< FactorWeightFst<A, F> >;
+  friend class CacheArcIterator< FactorWeightFst<A, F> >;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  FactorWeightFst(const Fst<A> &fst)
+      : impl_(new FactorWeightFstImpl<A, F>(fst, FactorWeightOptions())) {}
+
+  FactorWeightFst(const Fst<A> &fst,  const FactorWeightOptions &opts)
+      : impl_(new FactorWeightFstImpl<A, F>(fst, opts)) {}
+  FactorWeightFst(const FactorWeightFst<A, F> &fst) : Fst<A>(fst), impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~FactorWeightFst() { if (!impl_->DecrRefCount()) delete impl_;  }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual FactorWeightFst<A, F> *Copy() const {
+    return new FactorWeightFst<A, F>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual inline void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+ private:
+  FactorWeightFstImpl<A, F> *Impl() { return impl_; }
+
+  FactorWeightFstImpl<A, F> *impl_;
+
+  void operator=(const FactorWeightFst<A, F> &fst);  // Disallow
+};
+
+
+// Specialization for FactorWeightFst.
+template<class A, class F>
+class StateIterator< FactorWeightFst<A, F> >
+    : public CacheStateIterator< FactorWeightFst<A, F> > {
+ public:
+  explicit StateIterator(const FactorWeightFst<A, F> &fst)
+      : CacheStateIterator< FactorWeightFst<A, F> >(fst) {}
+};
+
+
+// Specialization for FactorWeightFst.
+template <class A, class F>
+class ArcIterator< FactorWeightFst<A, F> >
+    : public CacheArcIterator< FactorWeightFst<A, F> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const FactorWeightFst<A, F> &fst, StateId s)
+      : CacheArcIterator< FactorWeightFst<A, F> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+template <class A, class F> inline
+void FactorWeightFst<A, F>::InitStateIterator(StateIteratorData<A> *data) const
+{
+  data->base = new StateIterator< FactorWeightFst<A, F> >(*this);
+}
+
+
+}  // namespace fst
+
+#endif // FST_LIB_FACTOR_WEIGHT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/float-weight.h b/tools/thirdparty/OpenFst/fst/lib/float-weight.h
new file mode 100644
index 0000000..bec59c4
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/float-weight.h
@@ -0,0 +1,255 @@
+// float-weight.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Float weight set and associated semiring operation definitions.
+//
+
+#ifndef FST_LIB_FLOAT_WEIGHT_H__
+#define FST_LIB_FLOAT_WEIGHT_H__
+
+#include <limits>
+
+#include "fst/lib/weight.h"
+
+namespace fst {
+
+static const float kPosInfinity = numeric_limits<float>::infinity();
+static const float kNegInfinity = -kPosInfinity;
+
+// Single precision floating point weight base class
+class FloatWeight {
+ public:
+  FloatWeight() {}
+
+  FloatWeight(float f) : value_(f) {}
+
+  FloatWeight(const FloatWeight &w) : value_(w.value_) {}
+
+  FloatWeight &operator=(const FloatWeight &w) {
+    value_ = w.value_;
+    return *this;
+  }
+
+  istream &Read(istream &strm) {
+    return ReadType(strm, &value_);
+  }
+
+  ostream &Write(ostream &strm) const {
+    return WriteType(strm, value_);
+  }
+
+  ssize_t Hash() const {
+    union {
+      float f;
+      ssize_t s;
+    } u = { value_ };
+    return u.s;
+  }
+
+  const float &Value() const { return value_; }
+
+ protected:
+  float value_;
+};
+
+inline bool operator==(const FloatWeight &w1, const FloatWeight &w2) {
+  // Volatile qualifier thwarts over-aggressive compiler optimizations
+  // that lead to problems esp. with NaturalLess().
+  volatile float v1 = w1.Value();
+  volatile float v2 = w2.Value();
+  return v1 == v2;
+}
+
+inline bool operator!=(const FloatWeight &w1, const FloatWeight &w2) {
+  return !(w1 == w2);
+}
+
+inline bool ApproxEqual(const FloatWeight &w1, const FloatWeight &w2,
+                        float delta = kDelta) {
+  return w1.Value() <= w2.Value() + delta && w2.Value() <= w1.Value() + delta;
+}
+
+inline ostream &operator<<(ostream &strm, const FloatWeight &w) {
+  if (w.Value() == kPosInfinity)
+    return strm << "Infinity";
+  else if (w.Value() == kNegInfinity)
+    return strm << "-Infinity";
+  else if (w.Value() != w.Value())   // Fails for NaN
+    return strm << "BadFloat";
+  else
+    return strm << w.Value();
+}
+
+inline istream &operator>>(istream &strm, FloatWeight &w) {
+  string s;
+  strm >> s;
+  if (s == "Infinity") {
+    w = FloatWeight(kPosInfinity);
+  } else if (s == "-Infinity") {
+    w = FloatWeight(kNegInfinity);
+  } else {
+    char *p;
+    float f = strtod(s.c_str(), &p);
+    if (p < s.c_str() + s.size())
+      strm.clear(std::ios::badbit);
+    else
+      w = FloatWeight(f);
+  }
+  return strm;
+}
+
+
+// Tropical semiring: (min, +, inf, 0)
+class TropicalWeight : public FloatWeight {
+ public:
+  typedef TropicalWeight ReverseWeight;
+
+  TropicalWeight() : FloatWeight() {}
+
+  TropicalWeight(float f) : FloatWeight(f) {}
+
+  TropicalWeight(const TropicalWeight &w) : FloatWeight(w) {}
+
+  static const TropicalWeight Zero() { return TropicalWeight(kPosInfinity); }
+
+  static const TropicalWeight One() { return TropicalWeight(0.0F); }
+
+  static const string &Type() {
+    static const string type = "tropical";
+    return type;
+  }
+
+  bool Member() const {
+    // First part fails for IEEE NaN
+    return Value() == Value() && Value() != kNegInfinity;
+  }
+
+  TropicalWeight Quantize(float delta = kDelta) const {
+    return TropicalWeight(floor(Value()/delta + 0.5F) * delta);
+  }
+
+  TropicalWeight Reverse() const { return *this; }
+
+  static uint64 Properties() {
+    return kLeftSemiring | kRightSemiring | kCommutative |
+      kPath | kIdempotent;
+  }
+};
+
+inline TropicalWeight Plus(const TropicalWeight &w1,
+                           const TropicalWeight &w2) {
+  return w1.Value() < w2.Value() ? w1 : w2;
+}
+
+inline TropicalWeight Times(const TropicalWeight &w1,
+                            const TropicalWeight &w2) {
+  float f1 = w1.Value(), f2 = w2.Value();
+  if (f1 == kPosInfinity)
+    return w1;
+  else if (f2 == kPosInfinity)
+    return w2;
+  else
+    return TropicalWeight(f1 + f2);
+}
+
+inline TropicalWeight Divide(const TropicalWeight &w1,
+                             const TropicalWeight &w2,
+                             DivideType typ = DIVIDE_ANY) {
+  float f1 = w1.Value(), f2 = w2.Value();
+  if (f2 == kPosInfinity)
+    return kNegInfinity;
+  else if (f1 == kPosInfinity)
+    return kPosInfinity;
+  else
+    return TropicalWeight(f1 - f2);
+}
+
+
+// Log semiring: (log(e^-x + e^y), +, inf, 0)
+class LogWeight : public FloatWeight {
+ public:
+  typedef LogWeight ReverseWeight;
+
+  LogWeight() : FloatWeight() {}
+
+  LogWeight(float f) : FloatWeight(f) {}
+
+  LogWeight(const LogWeight &w) : FloatWeight(w) {}
+
+  static const LogWeight Zero() {   return LogWeight(kPosInfinity); }
+
+  static const LogWeight One() { return LogWeight(0.0F); }
+
+  static const string &Type() {
+    static const string type = "log";
+    return type;
+  }
+
+  bool Member() const {
+    // First part fails for IEEE NaN
+    return Value() == Value() && Value() != kNegInfinity;
+  }
+
+  LogWeight Quantize(float delta = kDelta) const {
+    return LogWeight(floor(Value()/delta + 0.5F) * delta);
+  }
+
+  LogWeight Reverse() const { return *this; }
+
+  static uint64 Properties() {
+    return kLeftSemiring | kRightSemiring | kCommutative;
+  }
+};
+
+inline double LogExp(double x) { return log(1.0F + exp(-x)); }
+
+inline LogWeight Plus(const LogWeight &w1, const LogWeight &w2) {
+  float f1 = w1.Value(), f2 = w2.Value();
+  if (f1 == kPosInfinity)
+    return w2;
+  else if (f2 == kPosInfinity)
+    return w1;
+  else if (f1 > f2)
+    return LogWeight(f2 - LogExp(f1 - f2));
+  else
+    return LogWeight(f1 - LogExp(f2 - f1));
+}
+
+inline LogWeight Times(const LogWeight &w1, const LogWeight &w2) {
+  float f1 = w1.Value(), f2 = w2.Value();
+  if (f1 == kPosInfinity)
+    return w1;
+  else if (f2 == kPosInfinity)
+    return w2;
+  else
+    return LogWeight(f1 + f2);
+}
+
+inline LogWeight Divide(const LogWeight &w1,
+                             const LogWeight &w2,
+                             DivideType typ = DIVIDE_ANY) {
+  float f1 = w1.Value(), f2 = w2.Value();
+  if (f2 == kPosInfinity)
+    return kNegInfinity;
+  else if (f1 == kPosInfinity)
+    return kPosInfinity;
+  else
+    return LogWeight(f1 - f2);
+}
+
+}  // namespace fst;
+
+#endif  // FST_LIB_FLOAT_WEIGHT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/fst-decl.h b/tools/thirdparty/OpenFst/fst/lib/fst-decl.h
new file mode 100644
index 0000000..a5cdc75
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/fst-decl.h
@@ -0,0 +1,79 @@
+// fst-decl.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// This file contains declarations of classes in the OpenFst library.
+
+#ifndef FST_LIB_FST_DECL_H__
+#define FST_LIB_FST_DECL_H__
+
+namespace fst {
+
+class SymbolTable;
+class SymbolTableIterator;
+
+class LogWeight;
+class TropicalWeight;
+
+class LogArc;
+class StdArc;
+
+template <class A> class ConstFst;
+template <class A> class ExpandedFst;
+template <class A> class Fst;
+template <class A> class MutableFst;
+template <class A> class VectorFst;
+
+template <class A, class C> class ArcSortFst;
+template <class A> class ClosureFst;
+template <class A> class ComposeFst;
+template <class A> class ConcatFst;
+template <class A> class DeterminizeFst;
+template <class A> class DeterminizeFst;
+template <class A> class DifferenceFst;
+template <class A> class IntersectFst;
+template <class A> class InvertFst;
+template <class A, class B, class C> class MapFst;
+template <class A> class ProjectFst;
+template <class A> class RelabelFst;
+template <class A> class ReplaceFst;
+template <class A> class RmEpsilonFst;
+template <class A> class UnionFst;
+
+template <class T, class Compare> class Heap;
+
+typedef ConstFst<StdArc> StdConstFst;
+typedef ExpandedFst<StdArc> StdExpandedFst;
+typedef Fst<StdArc> StdFst;
+typedef MutableFst<StdArc> StdMutableFst;
+typedef VectorFst<StdArc> StdVectorFst;
+
+template <class C> class StdArcSortFst;
+typedef ClosureFst<StdArc> StdClosureFst;
+typedef ComposeFst<StdArc> StdComposeFst;
+typedef ConcatFst<StdArc> StdConcatFst;
+typedef DeterminizeFst<StdArc> StdDeterminizeFst;
+typedef DifferenceFst<StdArc> StdDifferenceFst;
+typedef IntersectFst<StdArc> StdIntersectFst;
+typedef InvertFst<StdArc> StdInvertFst;
+typedef ProjectFst<StdArc> StdProjectFst;
+typedef RelabelFst<StdArc> StdRelabelFst;
+typedef ReplaceFst<StdArc> StdReplaceFst;
+typedef RmEpsilonFst<StdArc> StdRmEpsilonFst;
+typedef UnionFst<StdArc> StdUnionFst;
+
+}
+
+#endif  // FST_LIB_FST_DECL_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/fst.cpp b/tools/thirdparty/OpenFst/fst/lib/fst.cpp
new file mode 100644
index 0000000..3b8c9ef
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/fst.cpp
@@ -0,0 +1,89 @@
+// fst.cc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// FST definitions.
+
+#include "fst/lib/fst.h"
+
+// Include these so they are registered
+#include "fst/lib/const-fst.h"
+#include "fst/lib/vector-fst.h"
+
+// FST flag definitions
+
+DEFINE_bool(fst_verify_properties, false,
+            "Verify fst properties queried by TestProperties");
+
+DEFINE_string(fst_product_separator, ",",
+              "Character separator between printed weights"
+              " in a product semiring");
+
+DEFINE_bool(fst_default_cache_gc, true, "Enable garbage collection of cache");
+
+DEFINE_int64(fst_default_cache_gc_limit, 1<<20LL,
+             "Cache byte size that triggers garbage collection");
+
+namespace fst {
+
+// Register VectorFst and ConstFst for common arcs types
+
+REGISTER_FST(VectorFst, StdArc);
+REGISTER_FST(VectorFst, LogArc);
+REGISTER_FST(ConstFst, StdArc);
+REGISTER_FST(ConstFst, LogArc);
+
+// Identifies stream data as an FST (and its endianity)
+static const int32 kFstMagicNumber = 2125659606;
+
+// Check Fst magic number and read in Fst header.
+bool FstHeader::Read(istream &strm, const string &source) {
+  int32 magic_number = 0;
+  ReadType(strm, &magic_number);
+  if (magic_number != kFstMagicNumber) {
+    LOG(ERROR) << "FstHeader::Read: Bad FST header: " << source;
+    return false;
+  }
+
+  ReadType(strm, &fsttype_);
+  ReadType(strm, &arctype_);
+  ReadType(strm, &version_);
+  ReadType(strm, &flags_);
+  ReadType(strm, &properties_);
+  ReadType(strm, &start_);
+  ReadType(strm, &numstates_);
+  ReadType(strm, &numarcs_);
+  if (!strm)
+    LOG(ERROR) << "FstHeader::Read: read failed: " << source;
+  return strm;
+}
+
+// Write Fst magic number and Fst header.
+bool FstHeader::Write(ostream &strm, const string &source) const {
+  WriteType(strm, kFstMagicNumber);
+  WriteType(strm, fsttype_);
+  WriteType(strm, arctype_);
+  WriteType(strm, version_);
+  WriteType(strm, flags_);
+  WriteType(strm, properties_);
+  WriteType(strm, start_);
+  WriteType(strm, numstates_);
+  WriteType(strm, numarcs_);
+  if (!strm)
+    LOG(ERROR) << "FstHeader::Write: write failed: " << source;
+  return strm;
+}
+
+}
diff --git a/tools/thirdparty/OpenFst/fst/lib/fst.h b/tools/thirdparty/OpenFst/fst/lib/fst.h
new file mode 100644
index 0000000..5a1a225
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/fst.h
@@ -0,0 +1,533 @@
+// fst.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Finite-State Transducer (FST) - abstract base class definition,
+// state and arc iterator interface, and suggested base implementation.
+
+#ifndef FST_LIB_FST_H__
+#define FST_LIB_FST_H__
+
+#include "fst/lib/arc.h"
+#include "fst/lib/compat.h"
+#include "fst/lib/properties.h"
+#include "fst/lib/register.h"
+#include "fst/lib/symbol-table.h"
+#include "fst/lib/util.h"
+
+namespace fst {
+
+class FstHeader;
+template <class A> class StateIteratorData;
+template <class A> class ArcIteratorData;
+
+struct FstReadOptions  {
+  string source;                // Where you're reading from
+  const FstHeader *header;      // Pointer to Fst header (if non-zero)
+  const SymbolTable* isymbols;  // Pointer to input symbols (if non-zero)
+  const SymbolTable* osymbols;  // Pointer to output symbols (if non-zero)
+
+  explicit FstReadOptions(const string& src = "<unspecified>",
+                          const FstHeader *hdr = 0,
+                          const SymbolTable* isym = 0,
+                          const SymbolTable* osym = 0)
+      : source(src), header(hdr), isymbols(isym), osymbols(osym) {}
+};
+
+
+struct FstWriteOptions {
+  string source;                    // Where you're writing to
+  bool write_header;                // Write the header?
+  bool write_isymbols;              // Write input symbols?
+  bool write_osymbols;              // Write output symbols?
+
+  explicit FstWriteOptions(const string& src = "<unspecifed>",
+                           bool hdr = true, bool isym = true,
+                           bool osym = true)
+      : source(src), write_header(hdr),
+        write_isymbols(isym),  write_osymbols(osym) {}
+};
+
+//
+// Fst HEADER CLASS
+//
+// This is the recommended Fst file header representation.
+//
+
+class FstHeader {
+ public:
+  enum {
+    HAS_ISYMBOLS = 1,                           // Has input symbol table
+    HAS_OSYMBOLS = 2                            // Has output symbol table
+  } Flags;
+
+  FstHeader() : version_(0), flags_(0), properties_(0), start_(-1),
+                numstates_(0), numarcs_(0) {}
+  const string &FstType() const { return fsttype_; }
+  const string &ArcType() const { return arctype_; }
+  int32 Version() const { return version_; }
+  int32 GetFlags() const { return flags_; }
+  uint64 Properties() const { return properties_; }
+  int64 Start() const { return start_; }
+  int64 NumStates() const { return numstates_; }
+  int64 NumArcs() const { return numarcs_; }
+
+  void SetFstType(const string& type) { fsttype_ = type; }
+  void SetArcType(const string& type) { arctype_ = type; }
+  void SetVersion(int32 version) { version_ = version; }
+  void SetFlags(int32 flags) { flags_ = flags; }
+  void SetProperties(uint64 properties) { properties_ = properties; }
+  void SetStart(int64 start) { start_ = start; }
+  void SetNumStates(int64 numstates) { numstates_ = numstates; }
+  void SetNumArcs(int64 numarcs) { numarcs_ = numarcs; }
+
+  bool Read(istream &strm, const string &source);
+  bool Write(ostream &strm, const string &source) const;
+
+ private:
+  string fsttype_;                   // E.g. "vector"
+  string arctype_;                   // E.g. "standard"
+  int32 version_;                    // Type version #
+  int32 flags_;                      // File format bits
+  uint64 properties_;                // FST property bits
+  int64 start_;                      // Start state
+  int64 numstates_;                  // # of states
+  int64 numarcs_;                    // # of arcs
+};
+
+//
+// Fst INTERFACE CLASS DEFINITION
+//
+
+// A generic FST, templated on the arc definition, with
+// common-demoninator methods (use StateIterator and ArcIterator to
+// iterate over its states and arcs).
+template <class A>
+class Fst {
+ public:
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  virtual ~Fst() {}
+
+  virtual StateId Start() const = 0;          // Initial state
+
+  virtual Weight Final(StateId) const = 0;    // State's final weight
+
+  virtual size_t NumArcs(StateId) const = 0;  // State's arc count
+
+  virtual size_t NumInputEpsilons(StateId)
+      const = 0;                              // State's input epsilon count
+
+  virtual size_t NumOutputEpsilons(StateId)
+      const = 0;                              // State's output epsilon count
+
+  // If test=false, return stored properties bits for mask (some poss. unknown)
+  // If test=true, return property bits for mask (computing o.w. unknown)
+  virtual uint64 Properties(uint64 mask, bool test)
+      const = 0;  // Property bits
+
+  virtual const string& Type() const = 0;    // Fst type name
+
+  // Get a copy of this Fst.
+  virtual Fst<A> *Copy() const = 0;
+  // Read an Fst from an input stream; returns NULL on error
+
+  static Fst<A> *Read(istream &strm, const FstReadOptions &opts) {
+    FstReadOptions ropts(opts);
+    FstHeader hdr;
+    if (ropts.header)
+      hdr = *opts.header;
+    else {
+      if (!hdr.Read(strm, opts.source))
+        return 0;
+      ropts.header = &hdr;
+    }
+    FstRegister<A> *registr = FstRegister<A>::GetRegister();
+    const typename FstRegister<A>::Reader reader =
+        registr->GetReader(hdr.FstType());
+    if (!reader) {
+      LOG(ERROR) << "Fst::Read: Unknown FST type \"" << hdr.FstType()
+                 << "\" (arc type = \"" << A::Type()
+                 << "\"): " << ropts.source;
+      return 0;
+    }
+    return reader(strm, ropts);
+  };
+
+  // Read an Fst from a file; return NULL on error
+  static Fst<A> *Read(const string &filename) {
+    ifstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "Fst::Read: Can't open file: " << filename;
+      return 0;
+    }
+    return Read(strm, FstReadOptions(filename));
+  }
+
+  // Write an Fst to an output stream; return false on error
+  virtual bool Write(ostream &strm, const FstWriteOptions &opts) const {
+    LOG(ERROR) << "Fst::Write: No write method for " << Type() << " Fst type";
+    return false;
+  }
+
+  // Write an Fst to a file; return false on error
+  virtual bool Write(const string &filename) const {
+    LOG(ERROR) << "Fst::Write: No write method for "
+               << Type() << " Fst type: "
+               << (filename.empty() ? "standard output" : filename);
+    return false;
+  }
+
+  // Return input label symbol table; return NULL if not specified
+  virtual const SymbolTable* InputSymbols() const = 0;
+
+  // Return output label symbol table; return NULL if not specified
+  virtual const SymbolTable* OutputSymbols() const = 0;
+
+  // For generic state iterator construction; not normally called
+  // directly by users.
+  virtual void InitStateIterator(StateIteratorData<A> *) const = 0;
+
+  // For generic arc iterator construction; not normally called
+  // directly by users.
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *) const = 0;
+};
+
+
+//
+// STATE and ARC ITERATOR DEFINITIONS
+//
+
+// State iterator interface templated on the Arc definition; used
+// for StateIterator specializations returned by InitStateIterator.
+template <class A>
+class StateIteratorBase {
+ public:
+  typedef A Arc;
+  typedef typename A::StateId StateId;
+
+  virtual ~StateIteratorBase() {}
+  virtual bool Done() const = 0;      // End of iterator?
+  virtual StateId Value() const = 0;  // Current state (when !Done)
+  virtual void Next() = 0;            // Advance to next state (when !Done)
+  virtual void Reset() = 0;           // Return to initial condition
+};
+
+
+// StateIterator initialization data
+template <class A> struct StateIteratorData {
+  StateIteratorBase<A> *base;   // Specialized iterator if non-zero
+  typename A::StateId nstates;  // O.w. total # of states
+};
+
+
+// Generic state iterator, templated on the FST definition
+// - a wrapper around pointer to specific one.
+// Here is a typical use: \code
+//   for (StateIterator<StdFst> siter(fst);
+//        !siter.Done();
+//        siter.Next()) {
+//     StateId s = siter.Value();
+//     ...
+//   } \endcode
+template <class F>
+class StateIterator {
+ public:
+  typedef typename F::Arc Arc;
+  typedef typename Arc::StateId StateId;
+
+  explicit StateIterator(const F &fst) : s_(0) {
+    fst.InitStateIterator(&data_);
+  }
+
+  ~StateIterator() { if (data_.base) delete data_.base; }
+
+  bool Done() const {
+    return data_.base ? data_.base->Done() : s_ >= data_.nstates;
+  }
+
+  StateId Value() const { return data_.base ? data_.base->Value() : s_; }
+
+  void Next() {
+    if (data_.base)
+      data_.base->Next();
+    else
+      ++s_;
+  }
+
+  void Reset() {
+    if (data_.base)
+      data_.base->Reset();
+    else
+      s_ = 0;
+  }
+
+ private:
+  StateIteratorData<Arc> data_;
+  StateId s_;
+  DISALLOW_EVIL_CONSTRUCTORS(StateIterator);
+};
+
+
+// Arc iterator interface, templated on the Arc definition; used
+// for Arc iterator specializations that are returned by InitArcIterator.
+template <class A>
+class ArcIteratorBase {
+ public:
+  typedef A Arc;
+  typedef typename A::StateId StateId;
+
+  virtual ~ArcIteratorBase() {}
+  virtual bool Done() const = 0;       // End of iterator?
+  virtual const A& Value() const = 0;  // Current state (when !Done)
+  virtual void Next() = 0;             // Advance to next arc (when !Done)
+  virtual void Reset() = 0;            // Return to initial condition
+  virtual void Seek(size_t a) = 0;     // Random arc access by position
+};
+
+
+// ArcIterator initialization data
+template <class A> struct ArcIteratorData {
+  ArcIteratorBase<A> *base;  // Specialized iterator if non-zero
+  const A *arcs;             // O.w. arcs pointer
+  size_t narcs;              // ... and arc count
+  int *ref_count;            // ... and reference count if non-zero
+};
+
+
+// Generic arc iterator, templated on the FST definition
+// - a wrapper around pointer to specific one.
+// Here is a typical use: \code
+//   for (ArcIterator<StdFst> aiter(fst, s));
+//        !aiter.Done();
+//         aiter.Next()) {
+//     StdArc &arc = aiter.Value();
+//     ...
+//   } \endcode
+template <class F>
+class ArcIterator {
+   public:
+  typedef typename F::Arc Arc;
+  typedef typename Arc::StateId StateId;
+
+  ArcIterator(const F &fst, StateId s) : i_(0) {
+    fst.InitArcIterator(s, &data_);
+  }
+
+  ~ArcIterator() {
+    if (data_.base)
+      delete data_.base;
+    else if (data_.ref_count)
+    --(*data_.ref_count);
+  }
+
+  bool Done() const {
+    return data_.base ?  data_.base->Done() : i_ >= data_.narcs;
+  }
+
+  const Arc& Value() const {
+    return data_.base ? data_.base->Value() : data_.arcs[i_];
+  }
+
+  void Next() {
+    if (data_.base)
+      data_.base->Next();
+    else
+      ++i_;
+  }
+
+  void Reset() {
+    if (data_.base)
+      data_.base->Reset();
+    else
+      i_ = 0;
+  }
+
+  void Seek(size_t a) {
+    if (data_.base)
+      data_.base->Seek(a);
+    else
+      i_ = a;
+  }
+
+ private:
+  ArcIteratorData<Arc> data_;
+  size_t i_;
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+
+// A useful alias when using StdArc.
+typedef Fst<StdArc> StdFst;
+
+
+//
+//  CONSTANT DEFINITIONS
+//
+
+const int kNoStateId   =  -1;  // Not a valid state ID
+const int kNoLabel     =  -1;  // Not a valid label
+const int kPhiLabel    =  -2;  // Failure transition label
+const int kRhoLabel    =  -3;  // Matches o.w. unmatched labels (lib. internal)
+const int kSigmaLabel  =  -4;  // Matches all labels in alphabet.
+
+
+//
+// Fst IMPLEMENTATION BASE
+//
+// This is the recommended Fst implementation base class. It will
+// handle reference counts, property bits, type information and symbols.
+//
+
+template <class A> class FstImpl {
+ public:
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  FstImpl()
+      : properties_(0), type_("null"), isymbols_(0), osymbols_(0),
+        ref_count_(1) {}
+
+  FstImpl(const FstImpl<A> &impl)
+      : properties_(impl.properties_), type_(impl.type_),
+        isymbols_(impl.isymbols_ ? new SymbolTable(impl.isymbols_) : 0),
+        osymbols_(impl.osymbols_ ? new SymbolTable(impl.osymbols_) : 0),
+        ref_count_(1) {}
+
+  ~FstImpl() {
+    delete isymbols_;
+    delete osymbols_;
+  }
+
+  const string& Type() const { return type_; }
+
+  void SetType(const string &type) { type_ = type; }
+
+  uint64 Properties() const { return properties_; }
+
+  uint64 Properties(uint64 mask) const { return properties_ & mask; }
+
+  void SetProperties(uint64 props) { properties_ = props; }
+
+  void SetProperties(uint64 props, uint64 mask) {
+    properties_ &= ~mask;
+    properties_ |= props & mask;
+  }
+
+  const SymbolTable* InputSymbols() const { return isymbols_; }
+
+  const SymbolTable* OutputSymbols() const { return osymbols_; }
+
+  SymbolTable* InputSymbols() { return isymbols_; }
+
+  SymbolTable* OutputSymbols() { return osymbols_; }
+
+  void SetInputSymbols(const SymbolTable* isyms) {
+    if (isymbols_) delete isymbols_;
+    isymbols_ = isyms ? isyms->Copy() : 0;
+  }
+
+  void SetOutputSymbols(const SymbolTable* osyms) {
+    if (osymbols_) delete osymbols_;
+    osymbols_ = osyms ? osyms->Copy() : 0;
+  }
+
+  int RefCount() const { return ref_count_; }
+
+  int IncrRefCount() { return ++ref_count_; }
+
+  int DecrRefCount() { return --ref_count_; }
+
+  // Read-in header and symbols, initialize Fst, and return the header.
+  // If opts.header is non-null, skip read-in and use the option value.
+  // If opts.[io]symbols is non-null, read-in but use the option value.
+  bool ReadHeaderAndSymbols(istream &strm, const FstReadOptions& opts,
+                  int min_version, FstHeader *hdr) {
+    if (opts.header)
+      *hdr = *opts.header;
+    else if (!hdr->Read(strm, opts.source))
+      return false;
+    if (hdr->FstType() != type_) {
+      LOG(ERROR) << "FstImpl::ReadHeaderAndSymbols: Fst not of type \""
+                 << type_ << "\": " << opts.source;
+      return false;
+    }
+    if (hdr->ArcType() != A::Type()) {
+      LOG(ERROR) << "FstImpl::ReadHeaderAndSymbols: Arc not of type \""
+                 << A::Type()
+                 << "\": " << opts.source;
+      return false;
+    }
+    if (hdr->Version() < min_version) {
+      LOG(ERROR) << "FstImpl::ReadHeaderAndSymbols: Obsolete "
+                 << type_ << " Fst version: " << opts.source;
+      return false;
+    }
+    properties_ = hdr->Properties();
+    if (hdr->GetFlags() & FstHeader::HAS_ISYMBOLS)
+      isymbols_ = SymbolTable::Read(strm, opts.source);
+    if (hdr->GetFlags() & FstHeader::HAS_OSYMBOLS)
+      osymbols_ =SymbolTable::Read(strm, opts.source);
+
+    if (opts.isymbols) {
+      delete isymbols_;
+      isymbols_ = opts.isymbols->Copy();
+    }
+    if (opts.osymbols) {
+      delete osymbols_;
+      osymbols_ = opts.osymbols->Copy();
+    }
+    return true;
+  }
+
+  // Write-out header and symbols.
+  // If a opts.header is false, skip writing header.
+  // If opts.[io]symbols is false, skip writing those symbols.
+  void WriteHeaderAndSymbols(ostream &strm, const FstWriteOptions& opts,
+                             int version, FstHeader *hdr) const {
+    if (opts.write_header) {
+      hdr->SetFstType(type_);
+      hdr->SetArcType(A::Type());
+      hdr->SetVersion(version);
+      hdr->SetProperties(properties_);
+      int32 file_flags = 0;
+      if (isymbols_ && opts.write_isymbols)
+        file_flags |= FstHeader::HAS_ISYMBOLS;
+      if (osymbols_ && opts.write_osymbols)
+        file_flags |= FstHeader::HAS_OSYMBOLS;
+      hdr->SetFlags(file_flags);
+      hdr->Write(strm, opts.source);
+    }
+    if (isymbols_ && opts.write_isymbols) isymbols_->Write(strm);
+    if (osymbols_ && opts.write_osymbols) osymbols_->Write(strm);
+  }
+
+ protected:
+  uint64 properties_;           // Property bits
+
+ private:
+  string type_;                 // Unique name of Fst class
+  SymbolTable *isymbols_;       // Ilabel symbol table
+  SymbolTable *osymbols_;       // Olabel symbol table
+  int ref_count_;               // Reference count
+
+  void operator=(const FstImpl<A> &impl);  // disallow
+};
+
+}  // namespace fst;
+
+#endif  // FST_LIB_FST_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/fstlib.h b/tools/thirdparty/OpenFst/fst/lib/fstlib.h
new file mode 100644
index 0000000..0f20ce5
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/fstlib.h
@@ -0,0 +1,87 @@
+// fstlib.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \page OpenFst - Weighted Finite State Transducers
+// This is a library for constructing, combining, optimizing, and
+// searching "weighted finite-state transducers" (FSTs). Weighted
+// finite-state transducers are automata where each transition has an
+// input label, an output label, and a weight. The more familiar
+// finite-state acceptor is represented as a transducer with each
+// transition's input and output the same.  Finite-state acceptors
+// are used to represent sets of strings (specifically, "regular" or
+// "rational sets"); finite-state transducers are used to represent
+// binary relations between pairs of strings (specifically, "rational
+// transductions"). The weights can be used to represent the cost of
+// taking a particular transition.
+//
+// In this library, the transducers are templated on the Arc
+// (transition) definition, which allows changing the label, weight,
+// and state ID sets. Labels and state IDs are restricted to signed
+// integral types but the weight can be an arbitrary type whose
+// members satisfy certain algebraic ("semiring") properties.
+//
+// For more information, see the OpenFst web site:
+// http://www.openfst.org.
+
+// \file
+// This convenience file includes all other OpenFst header files.
+
+#ifndef FST_LIB_FSTLIB_H__
+#define FST_LIB_FSTLIB_H__
+
+// Abstract FST classes
+#include "fst/lib/fst.h"
+#include "fst/lib/expanded-fst.h"
+#include "fst/lib/mutable-fst.h"
+
+// Concrete FST classes
+#include "fst/lib/vector-fst.h"
+#include "fst/lib/const-fst.h"
+
+// FST algorithms and delayed FST classes
+#include "fst/lib/arcsort.h"
+#include "fst/lib/closure.h"
+#include "fst/lib/compose.h"
+#include "fst/lib/concat.h"
+#include "fst/lib/connect.h"
+#include "fst/lib/determinize.h"
+#include "fst/lib/difference.h"
+#include "fst/lib/encode.h"
+#include "fst/lib/epsnormalize.h"
+#include "fst/lib/equal.h"
+#include "fst/lib/equivalent.h"
+#include "fst/lib/factor-weight.h"
+#include "fst/lib/intersect.h"
+#include "fst/lib/invert.h"
+#include "fst/lib/map.h"
+#include "fst/lib/minimize.h"
+#include "fst/lib/project.h"
+#include "fst/lib/prune.h"
+#include "fst/lib/push.h"
+#include "fst/lib/randgen.h"
+#include "fst/lib/relabel.h"
+#include "fst/lib/replace.h"
+#include "fst/lib/reverse.h"
+#include "fst/lib/reweight.h"
+#include "fst/lib/rmepsilon.h"
+#include "fst/lib/rmfinalepsilon.h"
+#include "fst/lib/shortest-distance.h"
+#include "fst/lib/shortest-path.h"
+#include "fst/lib/synchronize.h"
+#include "fst/lib/topsort.h"
+#include "fst/lib/union.h"
+#include "fst/lib/verify.h"
+
+#endif  // FST_LIB_FSTLIB_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/heap.h b/tools/thirdparty/OpenFst/fst/lib/heap.h
new file mode 100644
index 0000000..5219c19
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/heap.h
@@ -0,0 +1,194 @@
+// heap.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Implementation of a heap as in STL, but allows tracking positions
+// in heap using a key. The key can be used to do an in place update of
+// values in the heap.
+
+#ifndef FST_LIB_HEAP_H__
+#define FST_LIB_HEAP_H__
+
+#include <functional>
+#include <vector>
+
+namespace fst {
+
+//
+// \class Heap
+// \brief A templated heap implementation that support in place update
+//        of values.
+//
+// The templated heap implementation is a little different from the
+// STL priority_queue and the *_heap operations in STL. The heap
+// supports indexing of values in the heap via an associated key.
+//
+// Each value is internally associated with a key which is returned
+// to the calling functions on heap insert. This key can be used
+// to later update the specific value in the heap.
+//
+// \param T the element type of the hash, can be POD, Data or Ptr to Data
+// \param Compare Comparison class for determing min-heapness of max-heapness
+//
+static const int kNoKey = -1;
+template <class T, class Compare>
+class Heap {
+ public:
+
+  // initialize with a specific comparator
+  Heap(Compare comp) : comp_(comp), size_(0) { }
+
+  // Create a heap with initial size of internal arrays of 1024
+  Heap() : size_(0) { }
+
+  ~Heap() { }
+
+  // insert a value into the heap
+  int Insert(const T& val) {
+    if (size_ < (int)A_.size()) { 
+      A_[size_] = val;
+      pos_[key_[size_]] = size_;
+    } else {
+      A_.push_back(val);
+      pos_.push_back(size_);
+      key_.push_back(size_);
+    }
+
+    ++size_;
+    return Insert(val, size_ - 1);
+  }
+
+  // update a value at position given by the key. The pos array is first
+  // indexed by the key. The position gives the position in the heap array.
+  // Once we have the position we can then use the standard heap operations
+  // to calculate the parent and child positions.
+  void Update(int key, const T& val) {
+    int i = pos_[key];
+    if (comp_(val, A_[Parent(i)])) {
+      Insert(val, i);
+    } else {
+      A_[i] = val;
+      Heapify(i);
+    }
+  }
+
+  // pop the (best/worst) from the heap
+  T Pop() {
+    T max = A_[0];
+
+    Swap(0, size_-1);
+    size_--;
+    Heapify(0);
+    return(max);
+  }
+
+  // return value of best in heap
+  T Top() const {
+    return A_[0];
+  }
+
+  // check if the heap is empty
+  bool Empty() const {
+    return(size_ == 0);
+  }
+
+  void Clear() {
+    size_ = 0;
+  }
+
+
+  //
+  // The following protected routines is used in a supportive role
+  // for managing the heap and keeping the heap properties.
+  //
+ private:
+  // compute left child of parent
+  int Left(int i) {
+    return 2*(i+1)-1;   // 0 -> 1, 1 -> 3
+  }
+
+  // compute right child of parent
+  int Right(int i) {
+    return 2*(i+1);     // 0 -> 2, 1 -> 4
+  }
+
+  // given a child compute parent
+  int Parent(int i) {
+    return (i-1)/2;     // 1 -> 0, 2 -> 0,  3 -> 1,  4-> 1
+  }
+
+  // swap a child, parent. Use to move element up/down tree
+  // note a little tricky here. When we swap we need to swap
+  //   the value
+  //   the associated keys
+  //   the position of the value in the heap
+  void Swap(int j, int k) {
+    int tkey = key_[j];
+    pos_[key_[j] = key_[k]] = j;
+    pos_[key_[k] = tkey]    = k;
+
+    T val  = A_[j];
+    A_[j]  = A_[k];
+    A_[k]  = val;
+  }
+
+
+  // heapify subtree rooted at index i.
+  void Heapify(int i) {
+    int l = Left(i);
+    int r = Right(i);
+    int largest;
+
+    if (l < size_ && comp_(A_[l], A_[i]) )
+      largest = l;
+    else
+      largest = i;
+
+    if (r < size_ && comp_(A_[r], A_[largest]) )
+      largest = r;
+
+    if (largest != i) {
+      Swap(i, largest);
+      Heapify(largest);
+    }
+  }
+
+
+  // insert(update) element at subtree rooted at index i
+  int Insert(const T& val, int i) {
+    int p;
+    while (i > 0 && !comp_(A_[p = Parent(i)], val)) {
+      Swap(i, p);
+      i = p;
+    }
+
+    return key_[i];
+  }
+
+
+ private:
+  Compare comp_;
+
+  vector<int> pos_;
+  vector<int> key_;
+  vector<T>   A_;
+  int  size_;
+
+  // DISALLOW_EVIL_CONSTRUCTORS(Heap);
+};
+
+}
+
+#endif  // FST_LIB_HEAP_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/intersect.h b/tools/thirdparty/OpenFst/fst/lib/intersect.h
new file mode 100644
index 0000000..796509b
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/intersect.h
@@ -0,0 +1,130 @@
+// intersect.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Class to compute the intersection of two FSAs
+
+#ifndef FST_LIB_INTERSECT_H__
+#define FST_LIB_INTERSECT_H__
+
+#include "fst/lib/compose.h"
+
+namespace fst {
+
+template <uint64 T = 0>
+struct IntersectFstOptions : public ComposeFstOptions<T> { };
+
+
+// Computes the intersection (Hadamard product) of two FSAs. This
+// version is a delayed Fst.  Only strings that are in both automata
+// are retained in the result.
+//
+// The two arguments must be acceptors. One of the arguments must be
+// label-sorted.
+//
+// Complexity: same as ComposeFst.
+//
+// Caveats:  same as ComposeFst.
+template <class A>
+class IntersectFst : public ComposeFst<A> {
+ public:
+  using ComposeFst<A>::Impl;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  IntersectFst(const Fst<A> &fst1, const Fst<A> &fst2)
+      : ComposeFst<A>(fst1, fst2) {
+    if (!fst1.Properties(kAcceptor, true) || !fst2.Properties(kAcceptor, true))
+      LOG(FATAL) << "IntersectFst: arguments not both acceptors";
+    uint64 props1 = fst1.Properties(kFstProperties, false);
+    uint64 props2 = fst2.Properties(kFstProperties, false);
+    Impl()->SetProperties(IntersectProperties(props1, props2),
+                          kCopyProperties);
+  }
+
+  template <uint64 T>
+  IntersectFst(const Fst<A> &fst1, const Fst<A> &fst2,
+               const IntersectFstOptions<T> &opts)
+      : ComposeFst<A>(fst1, fst2, ComposeFstOptions<T>(opts)) {
+    if (!fst1.Properties(kAcceptor, true) || !fst2.Properties(kAcceptor, true))
+      LOG(FATAL) << "IntersectFst: arguments not both acceptors";
+    uint64 props1 = fst1.Properties(kFstProperties, false);
+    uint64 props2 = fst2.Properties(kFstProperties, false);
+    Impl()->SetProperties(IntersectProperties(props1, props2),
+                          kCopyProperties);
+  }
+
+  IntersectFst(const IntersectFst<A> &fst) : ComposeFst<A>(fst) {}
+
+  virtual IntersectFst<A> *Copy() const {
+    return new IntersectFst<A>(*this);
+  }
+};
+
+
+// Specialization for IntersectFst.
+template <class A>
+class StateIterator< IntersectFst<A> >
+    : public StateIterator< ComposeFst<A> > {
+ public:
+  explicit StateIterator(const IntersectFst<A> &fst)
+      : StateIterator< ComposeFst<A> >(fst) {}
+};
+
+
+// Specialization for IntersectFst.
+template <class A>
+class ArcIterator< IntersectFst<A> >
+    : public ArcIterator< ComposeFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const IntersectFst<A> &fst, StateId s)
+      : ArcIterator< ComposeFst<A> >(fst, s) {}
+};
+
+// Useful alias when using StdArc.
+typedef IntersectFst<StdArc> StdIntersectFst;
+
+
+typedef ComposeOptions IntersectOptions;
+
+
+// Computes the intersection (Hadamard product) of two FSAs. This
+// version writes the intersection to an output MurableFst. Only
+// strings that are in both automata are retained in the result.
+//
+// The two arguments must be acceptors. One of the arguments must be
+// label-sorted.
+//
+// Complexity: same as Compose.
+//
+// Caveats:  same as Compose.
+template<class Arc>
+void Intersect(const Fst<Arc> &ifst1, const Fst<Arc> &ifst2,
+             MutableFst<Arc> *ofst,
+             const IntersectOptions &opts = IntersectOptions()) {
+  IntersectFstOptions<> nopts;
+  nopts.gc_limit = 0;  // Cache only the last state for fastest copy.
+  *ofst = IntersectFst<Arc>(ifst1, ifst2, nopts);
+  if (opts.connect)
+    Connect(ofst);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_INTERSECT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/invert.h b/tools/thirdparty/OpenFst/fst/lib/invert.h
new file mode 100644
index 0000000..9aefaea
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/invert.h
@@ -0,0 +1,100 @@
+// invert.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to invert an Fst.
+
+#ifndef FST_LIB_INVERT_H__
+#define FST_LIB_INVERT_H__
+
+#include "fst/lib/map.h"
+#include "fst/lib/mutable-fst.h"
+
+namespace fst {
+
+// Mapper to implement inversion of an arc.
+template <class A> struct InvertMapper {
+  InvertMapper() {}
+
+  A operator()(const A &arc) {
+    return A(arc.olabel, arc.ilabel, arc.weight, arc.nextstate);
+  }
+
+  uint64 Properties(uint64 props) { return InvertProperties(props); }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+};
+
+
+// Inverts the transduction corresponding to an FST by exchanging the
+// FST's input and output labels. This version modifies its input.
+//
+// Complexity:
+// - Time: O(V + E)
+// - Space: O(1)
+// where V = # of states and E = # of arcs.
+template<class Arc> inline
+void Invert(MutableFst<Arc> *fst) { Map(fst, InvertMapper<Arc>()); }
+
+
+// Inverts the transduction corresponding to an FST by exchanging the
+// FST's input and output labels.  This version is a delayed Fst.
+//
+// Complexity:
+// - Time: O(v + e)
+// - Space: O(1)
+// where v = # of states visited, e = # of arcs visited. Constant
+// time and to visit an input state or arc is assumed and exclusive
+// of caching.
+template <class A>
+class InvertFst : public MapFst<A, A, InvertMapper<A> > {
+ public:
+  typedef A Arc;
+  typedef InvertMapper<A> C;
+
+  explicit InvertFst(const Fst<A> &fst) : MapFst<A, A, C>(fst, C()) {}
+
+  InvertFst(const InvertFst<A> &fst) : MapFst<A, A, C>(fst) {}
+
+  virtual InvertFst<A> *Copy() const { return new InvertFst(*this); }
+};
+
+
+// Specialization for InvertFst.
+template <class A>
+class StateIterator< InvertFst<A> >
+    : public StateIterator< MapFst<A, A, InvertMapper<A> > > {
+ public:
+  explicit StateIterator(const InvertFst<A> &fst)
+      : StateIterator< MapFst<A, A, InvertMapper<A> > >(fst) {}
+};
+
+
+// Specialization for InvertFst.
+template <class A>
+class ArcIterator< InvertFst<A> >
+    : public ArcIterator< MapFst<A, A, InvertMapper<A> > > {
+ public:
+  ArcIterator(const InvertFst<A> &fst, typename A::StateId s)
+      : ArcIterator< MapFst<A, A, InvertMapper<A> > >(fst, s) {}
+};
+
+
+// Useful alias when using StdArc.
+typedef InvertFst<StdArc> StdInvertFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_INVERT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/map.h b/tools/thirdparty/OpenFst/fst/lib/map.h
new file mode 100644
index 0000000..722aef3
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/map.h
@@ -0,0 +1,967 @@
+// map.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Class to map over/transform arcs e.g., change semirings or
+// implement project/invert.
+
+#ifndef FST_LIB_MAP_H__
+#define FST_LIB_MAP_H__
+
+#include "fst/lib/cache.h"
+#include "fst/lib/mutable-fst.h"
+
+namespace fst {
+
+// This determines how final weights are mapped.
+enum MapFinalAction {
+
+  // A final weight is mapped into a final weight. An error
+  // is raised if this is not possible.
+  MAP_NO_SUPERFINAL,
+
+  // A final weight is mapped to an arc to the superfinal state
+  // when the result cannot be represented as a final weight.
+  // The superfinal state will be added only if it is needed.
+  MAP_ALLOW_SUPERFINAL,
+
+  // A final weight is mapped to an arc to the superfinal state
+  // unless the result can be represented as a final weight of weight
+  // Zero(). The superfinal state is always added (if the input is
+  // not the empty Fst).
+  MAP_REQUIRE_SUPERFINAL
+};
+
+// Mapper Interface - class determinies how arcs and final weights
+// are mapped.
+//
+// class Mapper {
+//  public:
+//   // Maps an arc type A to arc type B.
+//   B operator()(const A &arc);
+//   // Specifies final action the mapper requires (see above).
+//   // The mapper will be passed final weights as arcs of the
+//   // form A(0, 0, weight, kNoStateId).
+//   MapFinalAction FinalAction() const;
+//   // This specifies the known properties of an Fst mapped by this
+//   // mapper. It takes as argument the input Fst's known properties.
+//   uint64 Properties(uint64 props) const;
+// }
+//
+// The Map functions and classes below will use the FinalAction()
+// method of the mapper to determine how to treat final weights,
+// e.g. whether to add a superfinal state. They will use the Properties()
+// method to set the result Fst properties.
+//
+// We include a various map versions below. One dimension of
+// variation is whether the mapping mutates its input, writes to a
+// new result Fst, or is an on-the-fly Fst. Another dimension is how
+// we pass the mapper. We allow passing the mapper by pointer
+// for cases that we need to change the state of the user's mapper.
+// This is the case with the encode mapper, which is reused during
+// decoding. We also include map versions that pass the mapper
+// by value or const reference when this suffices.
+
+
+// Maps an arc type A using a mapper function object C, passed
+// by pointer.  This version modifies its Fst input.
+template<class A, class C>
+void Map(MutableFst<A> *fst, C* mapper) {
+  typedef typename A::StateId StateId;
+  typedef typename A::Weight Weight;
+
+  if (fst->Start() == kNoStateId)
+    return;
+
+  uint64 props = fst->Properties(kFstProperties, false);
+
+  MapFinalAction final_action = mapper->FinalAction();
+  StateId superfinal = kNoStateId;
+  if (final_action == MAP_REQUIRE_SUPERFINAL) {
+    superfinal = fst->AddState();
+    fst->SetFinal(superfinal, Weight::One());
+  }
+
+  for (StateId s = 0; s < fst->NumStates(); ++s) {
+    for (MutableArcIterator< MutableFst<A> > aiter(fst, s);
+         !aiter.Done(); aiter.Next()) {
+      const A &arc = aiter.Value();
+      aiter.SetValue((*mapper)(arc));
+    }
+
+    switch (final_action) {
+      case MAP_NO_SUPERFINAL:
+      default: {
+        A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId));
+        CHECK(final_arc.ilabel == 0 && final_arc.olabel == 0);
+        fst->SetFinal(s, final_arc.weight);
+        break;
+      }
+      case MAP_ALLOW_SUPERFINAL: {
+        if (s != superfinal) {
+          A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId));
+          if (final_arc.ilabel != 0 || final_arc.olabel != 0) {
+            // Add a superfinal state if not already done.
+            if (superfinal == kNoStateId) {
+              superfinal = fst->AddState();
+              fst->SetFinal(superfinal, Weight::One());
+            }
+            final_arc.nextstate = superfinal;
+            fst->AddArc(s, final_arc);
+            fst->SetFinal(s, Weight::Zero());
+          } else {
+            fst->SetFinal(s, final_arc.weight);
+          }
+          break;
+        }
+      }
+      case MAP_REQUIRE_SUPERFINAL: {
+        if (s != superfinal) {
+          A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId));
+          if (final_arc.ilabel != 0 || final_arc.olabel != 0 ||
+              final_arc.weight != Weight::Zero())
+            fst->AddArc(s, A(final_arc.ilabel, final_arc.olabel,
+                             final_arc.weight, superfinal));
+            fst->SetFinal(s, Weight::Zero());
+        }
+        break;
+      }
+    }
+  }
+  fst->SetProperties(mapper->Properties(props), kFstProperties);
+}
+
+// Maps an arc type A using a mapper function object C, passed
+// by value.  This version modifies its Fst input.
+template<class A, class C>
+void Map(MutableFst<A> *fst, C mapper) {
+  Map(fst, &mapper);
+}
+
+
+// Maps an arc type A to an arc type B using mapper function
+// object C, passed by pointer. This version writes the mapped
+// input Fst to an output MutableFst.
+template<class A, class B, class C>
+void Map(const Fst<A> &ifst, MutableFst<B> *ofst, C* mapper) {
+  typedef typename A::StateId StateId;
+  typedef typename A::Weight Weight;
+
+  ofst->DeleteStates();
+  ofst->SetInputSymbols(ifst.InputSymbols());
+  ofst->SetOutputSymbols(ifst.OutputSymbols());
+
+  if (ifst.Start() == kNoStateId)
+    return;
+
+  // Add all states.
+  for (StateIterator< Fst<A> > siter(ifst); !siter.Done(); siter.Next())
+    ofst->AddState();
+
+  MapFinalAction final_action = mapper->FinalAction();
+  StateId superfinal = kNoStateId;
+  if (final_action == MAP_REQUIRE_SUPERFINAL) {
+    superfinal = ofst->AddState();
+    ofst->SetFinal(superfinal, B::Weight::One());
+  }
+  for (StateIterator< Fst<A> > siter(ifst); !siter.Done(); siter.Next()) {
+    StateId s = siter.Value();
+    if (s == ifst.Start())
+      ofst->SetStart(s);
+
+    for (ArcIterator< Fst<A> > aiter(ifst, s); !aiter.Done(); aiter.Next())
+      ofst->AddArc(s, (*mapper)(aiter.Value()));
+
+    switch (final_action) {
+      case MAP_NO_SUPERFINAL:
+      default: {
+        B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId));
+        CHECK(final_arc.ilabel == 0 && final_arc.olabel == 0);
+        ofst->SetFinal(s, final_arc.weight);
+        break;
+      }
+      case MAP_ALLOW_SUPERFINAL: {
+        B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId));
+        if (final_arc.ilabel != 0 || final_arc.olabel != 0) {
+            // Add a superfinal state if not already done.
+          if (superfinal == kNoStateId) {
+            superfinal = ofst->AddState();
+            ofst->SetFinal(superfinal, B::Weight::One());
+          }
+          final_arc.nextstate = superfinal;
+          ofst->AddArc(s, final_arc);
+          ofst->SetFinal(s, B::Weight::Zero());
+        } else {
+          ofst->SetFinal(s, final_arc.weight);
+        }
+        break;
+      }
+      case MAP_REQUIRE_SUPERFINAL: {
+        B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId));
+        if (final_arc.ilabel != 0 || final_arc.olabel != 0 ||
+            final_arc.weight != B::Weight::Zero())
+          ofst->AddArc(s, B(final_arc.ilabel, final_arc.olabel,
+                            final_arc.weight, superfinal));
+        ofst->SetFinal(s, B::Weight::Zero());
+        break;
+      }
+    }
+  }
+  uint64 iprops = ifst.Properties(kCopyProperties, false);
+  uint64 oprops = ofst->Properties(kFstProperties, false);
+  ofst->SetProperties(mapper->Properties(iprops) | oprops, kFstProperties);
+}
+
+// Maps an arc type A to an arc type B using mapper function
+// object C, passed by value. This version writes the mapped input
+// Fst to an output MutableFst.
+template<class A, class B, class C>
+void Map(const Fst<A> &ifst, MutableFst<B> *ofst, C mapper) {
+  Map(ifst, ofst, &mapper);
+}
+
+
+struct MapFstOptions : public CacheOptions {
+  // MapFst default caching behaviour is to do no caching. Most
+  // mappers are cheap and therefore we save memory by not doing
+  // caching.
+  MapFstOptions() : CacheOptions(true, 0) {}
+  MapFstOptions(const CacheOptions& opts) : CacheOptions(opts) {}
+};
+
+
+template <class A, class B, class C> class MapFst;
+
+// Implementation of delayed MapFst.
+template <class A, class B, class C>
+class MapFstImpl : public CacheImpl<B> {
+ public:
+  using FstImpl<B>::SetType;
+  using FstImpl<B>::SetProperties;
+  using FstImpl<B>::Properties;
+  using FstImpl<B>::SetInputSymbols;
+  using FstImpl<B>::SetOutputSymbols;
+
+  using VectorFstBaseImpl<typename CacheImpl<B>::State>::NumStates;
+
+  using CacheImpl<B>::HasArcs;
+  using CacheImpl<B>::HasFinal;
+  using CacheImpl<B>::HasStart;
+
+  friend class StateIterator< MapFst<A, B, C> >;
+
+  typedef B Arc;
+  typedef typename B::Weight Weight;
+  typedef typename B::StateId StateId;
+
+  MapFstImpl(const Fst<A> &fst, const C &mapper,
+                 const MapFstOptions& opts)
+      : CacheImpl<B>(opts), fst_(fst.Copy()),
+        mapper_(new C(mapper)),
+        own_mapper_(true),
+        superfinal_(kNoStateId),
+        nstates_(0) {
+    Init();
+  }
+
+  MapFstImpl(const Fst<A> &fst, C *mapper,
+                 const MapFstOptions& opts)
+      : CacheImpl<B>(opts), fst_(fst.Copy()),
+        mapper_(mapper),
+        own_mapper_(false),
+        superfinal_(kNoStateId),
+        nstates_(0) {
+    Init();
+  }
+
+
+  ~MapFstImpl() {
+    delete fst_;
+    if (own_mapper_) delete mapper_;
+  }
+
+  StateId Start() {
+    if (!HasStart())
+      SetStart(FindOState(fst_->Start()));
+    return CacheImpl<B>::Start();
+  }
+
+  Weight Final(StateId s) {
+    if (!HasFinal(s)) {
+      switch (final_action_) {
+        case MAP_NO_SUPERFINAL:
+        default: {
+          B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)),
+                                        kNoStateId));
+          CHECK(final_arc.ilabel == 0 && final_arc.olabel == 0);
+          SetFinal(s, final_arc.weight);
+          break;
+        }
+        case MAP_ALLOW_SUPERFINAL: {
+          if (s == superfinal_) {
+            SetFinal(s, Weight::One());
+          } else {
+            B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)),
+                                          kNoStateId));
+            if (final_arc.ilabel == 0 && final_arc.olabel == 0)
+              SetFinal(s, final_arc.weight);
+            else
+              SetFinal(s, Weight::Zero());
+          }
+          break;
+        }
+        case MAP_REQUIRE_SUPERFINAL: {
+          SetFinal(s, s == superfinal_ ? Weight::One() : Weight::Zero());
+          break;
+        }
+      }
+    }
+    return CacheImpl<B>::Final(s);
+  }
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<B>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<B>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<B>::NumOutputEpsilons(s);
+  }
+
+  void InitArcIterator(StateId s, ArcIteratorData<B> *data) {
+    if (!HasArcs(s))
+      Expand(s);
+    CacheImpl<B>::InitArcIterator(s, data);
+  }
+
+  void Expand(StateId s) {
+    // Add exiting arcs.
+    if (s == superfinal_) { SetArcs(s); return; }
+
+    for (ArcIterator< Fst<A> > aiter(*fst_, FindIState(s));
+         !aiter.Done(); aiter.Next()) {
+      A aarc(aiter.Value());
+      aarc.nextstate = FindOState(aarc.nextstate);
+      const B& barc = (*mapper_)(aarc);
+      AddArc(s, barc);
+    }
+
+    // Check for superfinal arcs.
+    if (!HasFinal(s) || Final(s) == Weight::Zero())
+      switch (final_action_) {
+        case MAP_NO_SUPERFINAL:
+        default:
+          break;
+        case MAP_ALLOW_SUPERFINAL: {
+          B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)),
+                                        kNoStateId));
+          if (final_arc.ilabel != 0 || final_arc.olabel != 0) {
+            if (superfinal_ == kNoStateId)
+              superfinal_ = nstates_++;
+            final_arc.nextstate = superfinal_;
+            AddArc(s, final_arc);
+          }
+          break;
+        }
+      case MAP_REQUIRE_SUPERFINAL: {
+        B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)),
+                                      kNoStateId));
+        if (final_arc.ilabel != 0 || final_arc.olabel != 0 ||
+            final_arc.weight != B::Weight::Zero())
+          AddArc(s, B(final_arc.ilabel, final_arc.olabel,
+                      final_arc.weight, superfinal_));
+        break;
+      }
+    }
+    SetArcs(s);
+  }
+
+ private:
+  void Init() {
+    SetType("map");
+    SetInputSymbols(fst_->InputSymbols());
+    SetOutputSymbols(fst_->OutputSymbols());
+    if (fst_->Start() == kNoStateId) {
+      final_action_ = MAP_NO_SUPERFINAL;
+      SetProperties(kNullProperties);
+    } else {
+      final_action_ = mapper_->FinalAction();
+      uint64 props = fst_->Properties(kCopyProperties, false);
+      SetProperties(mapper_->Properties(props));
+      if (final_action_ == MAP_REQUIRE_SUPERFINAL)
+        superfinal_ = 0;
+    }
+  }
+
+  // Maps from output state to input state.
+  StateId FindIState(StateId s) {
+    if (superfinal_ == kNoStateId || s < superfinal_)
+      return s;
+    else
+      return s - 1;
+  }
+
+  // Maps from input state to output state.
+  StateId FindOState(StateId is) {
+    StateId os;
+    if (superfinal_ == kNoStateId || is < superfinal_)
+      os = is;
+    else
+      os = is + 1;
+
+    if (os >= nstates_)
+      nstates_ = os + 1;
+
+    return os;
+  }
+
+
+  const Fst<A> *fst_;
+  C*   mapper_;
+  bool own_mapper_;
+  MapFinalAction final_action_;
+
+  StateId superfinal_;
+  StateId nstates_;
+};
+
+
+// Maps an arc type A to an arc type B using Mapper function object
+// C. This version is a delayed Fst.
+template <class A, class B, class C>
+class MapFst : public Fst<B> {
+ public:
+  friend class ArcIterator< MapFst<A, B, C> >;
+  friend class StateIterator< MapFst<A, B, C> >;
+  friend class CacheArcIterator< MapFst<A, B, C> >;
+
+  typedef B Arc;
+  typedef typename B::Weight Weight;
+  typedef typename B::StateId StateId;
+  typedef CacheState<B> State;
+
+  MapFst(const Fst<A> &fst, const C &mapper,
+             const MapFstOptions& opts)
+      : impl_(new MapFstImpl<A, B, C>(fst, mapper, opts)) {}
+
+  MapFst(const Fst<A> &fst, C* mapper,
+             const MapFstOptions& opts)
+      : impl_(new MapFstImpl<A, B, C>(fst, mapper, opts)) {}
+
+  MapFst(const Fst<A> &fst, const C &mapper)
+      : impl_(new MapFstImpl<A, B, C>(fst, mapper,
+                                          MapFstOptions())) {}
+
+  MapFst(const Fst<A> &fst, C* mapper)
+      : impl_(new MapFstImpl<A, B, C>(fst, mapper,
+                                          MapFstOptions())) {}
+
+  MapFst(const MapFst<A, B, C> &fst) : Fst<B>(fst), impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~MapFst() { if (!impl_->DecrRefCount()) delete impl_;  }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  StateId NumStates() const { return impl_->NumStates(); }
+
+  size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual MapFst<A, B, C> *Copy() const {
+    return new MapFst<A, B, C>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+ virtual inline void InitStateIterator(StateIteratorData<B> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<B> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+ private:
+  MapFstImpl<A, B, C> *impl_;
+
+  void operator=(const MapFst<A, B, C> &fst);  // disallow
+};
+
+
+// Specialization for MapFst.
+template<class A, class B, class C>
+class StateIterator< MapFst<A, B, C> > : public StateIteratorBase<B> {
+ public:
+  typedef typename B::StateId StateId;
+
+  explicit StateIterator(const MapFst<A, B, C> &fst)
+      : impl_(fst.impl_), siter_(*impl_->fst_), s_(0),
+        superfinal_(impl_->final_action_ == MAP_REQUIRE_SUPERFINAL)
+  { CheckSuperfinal(); }
+
+  bool Done() const { return siter_.Done() && !superfinal_; }
+
+  StateId Value() const { return s_; }
+
+  void Next() {
+    ++s_;
+    if (!siter_.Done()) {
+      siter_.Next();
+      CheckSuperfinal();
+    }
+    else if (superfinal_)
+      superfinal_ = false;
+  }
+
+  void Reset() {
+    s_ = 0;
+    siter_.Reset();
+    superfinal_ = impl_->final_action_ == MAP_REQUIRE_SUPERFINAL;
+    CheckSuperfinal();
+  }
+
+ private:
+  void CheckSuperfinal() {
+    if (impl_->final_action_ != MAP_ALLOW_SUPERFINAL || superfinal_)
+      return;
+    if (!siter_.Done()) {
+      B final_arc = (*impl_->mapper_)(A(0, 0, impl_->fst_->Final(s_),
+                                           kNoStateId));
+      if (final_arc.ilabel != 0 || final_arc.olabel != 0)
+        superfinal_ = true;
+    }
+  }
+
+  const MapFstImpl<A, B, C> *impl_;
+  StateIterator< Fst<A> > siter_;
+  StateId s_;
+  bool superfinal_;    // true if there is a superfinal state and not done
+
+  DISALLOW_EVIL_CONSTRUCTORS(StateIterator);
+};
+
+// Specialization for MapFst.
+template <class A, class B, class C>
+class ArcIterator< MapFst<A, B, C> >
+    : public CacheArcIterator< MapFst<A, B, C> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const MapFst<A, B, C> &fst, StateId s)
+      : CacheArcIterator< MapFst<A, B, C> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+template <class A, class B, class C> inline
+void MapFst<A, B, C>::InitStateIterator(StateIteratorData<B> *data)
+    const {
+  data->base = new StateIterator< MapFst<A, B, C> >(*this);
+}
+
+
+//
+// Utility Mappers
+//
+
+// Mapper that returns its input.
+template <class A>
+struct IdentityMapper {
+  typedef A FromArc;
+  typedef A ToArc;
+
+  A operator()(const A &arc) const { return arc; }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const { return props; }
+};
+
+
+// Mapper that returns its input with final states redirected to
+// a single super-final state.
+template <class A>
+struct SuperFinalMapper {
+  typedef A FromArc;
+  typedef A ToArc;
+
+  A operator()(const A &arc) const { return arc; }
+
+  MapFinalAction FinalAction() const { return MAP_REQUIRE_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const {
+    return props & kAddSuperFinalProperties;
+  }
+};
+
+
+// Mapper from StdArc to LogArc.
+struct StdToLogMapper {
+  typedef StdArc FromArc;
+  typedef LogArc ToArc;
+
+  LogArc operator()(const StdArc &arc) const {
+    return LogArc(arc.ilabel, arc.olabel, arc.weight.Value(), arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const { return props; }
+};
+
+
+// Mapper from LogArc to StdArc.
+struct LogToStdMapper {
+  typedef LogArc FromArc;
+  typedef StdArc ToArc;
+
+  StdArc operator()(const LogArc &arc) const {
+    return StdArc(arc.ilabel, arc.olabel, arc.weight.Value(), arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const { return props; }
+};
+
+
+// Mapper from A to GallicArc<A>.
+template <class A, StringType S = STRING_LEFT>
+struct ToGallicMapper {
+  typedef A FromArc;
+  typedef GallicArc<A, S> ToArc;
+
+  typedef StringWeight<typename A::Label, S> SW;
+  typedef typename A::Weight AW;
+  typedef typename GallicArc<A, S>::Weight GW;
+
+  ToArc operator()(const A &arc) const {
+    // 'Super-final' arc.
+    if (arc.nextstate == kNoStateId && arc.weight != AW::Zero())
+      return ToArc(0, 0, GW(SW::One(), arc.weight), kNoStateId);
+    // 'Super-non-final' arc.
+    else if (arc.nextstate == kNoStateId)
+      return ToArc(0, 0, GW(SW::Zero(), arc.weight), kNoStateId);
+    // Epsilon label.
+    else if (arc.olabel == 0)
+      return ToArc(arc.ilabel, arc.ilabel,
+                   GW(SW::One(), arc.weight), arc.nextstate);
+    // Regular label.
+    else
+      return ToArc(arc.ilabel, arc.ilabel,
+                   GW(SW(arc.olabel), arc.weight), arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const {
+    return ProjectProperties(props, true) & kWeightInvariantProperties;
+  }
+};
+
+
+// Mapper from GallicArc<A> to A.
+template <class A, StringType S = STRING_LEFT>
+struct FromGallicMapper {
+  typedef GallicArc<A, S> FromArc;
+  typedef A ToArc;
+
+  typedef typename A::Label Label;
+  typedef StringWeight<Label, S> SW;
+  typedef typename A::Weight AW;
+  typedef typename GallicArc<A, S>::Weight GW;
+
+  A operator()(const FromArc &arc) const {
+    // 'Super-non-final' arc.
+    if (arc.nextstate == kNoStateId && arc.weight == GW::Zero())
+      return A(arc.ilabel, 0, AW::Zero(), kNoStateId);
+
+    SW w1 = arc.weight.Value1();
+    AW w2 = arc.weight.Value2();
+    StringWeightIterator<Label, S> iter1(w1);
+
+    Label l = w1.Size() == 1 ? iter1.Value() : 0;
+
+    CHECK(l != kStringInfinity);
+    CHECK(l != kStringBad);
+    CHECK(arc.ilabel == arc.olabel);
+    CHECK(w1.Size() <= 1);
+
+    return A(arc.ilabel, l, w2, arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_ALLOW_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const {
+    return props & kOLabelInvariantProperties &
+      kWeightInvariantProperties & kAddSuperFinalProperties;
+  }
+};
+
+
+// Mapper from GallicArc<A> to A.
+template <class A, StringType S = STRING_LEFT>
+struct GallicToNewSymbolsMapper {
+  typedef GallicArc<A, S> FromArc;
+  typedef A ToArc;
+
+  typedef typename A::StateId StateId;
+  typedef typename A::Label Label;
+  typedef StringWeight<Label, S> SW;
+  typedef typename A::Weight AW;
+  typedef typename GallicArc<A, S>::Weight GW;
+
+  GallicToNewSymbolsMapper(MutableFst<ToArc> *fst)
+      : fst_(fst), lmax_(0), osymbols_(fst->OutputSymbols()), isymbols_(0) {
+    fst_->DeleteStates();
+    state_ = fst_->AddState();
+    fst_->SetStart(state_);
+    fst_->SetFinal(state_, AW::One());
+    if (osymbols_) {
+      string name = osymbols_->Name() + "_from_gallic";
+      isymbols_ = new SymbolTable(name);
+      isymbols_->AddSymbol(osymbols_->Find((int64) 0), 0);
+   }
+    fst_->SetInputSymbols(isymbols_);
+  }
+
+  A operator()(const FromArc &arc) {
+    // 'Super-non-final' arc.
+    if (arc.nextstate == kNoStateId && arc.weight == GW::Zero())
+      return A(arc.ilabel, 0, AW::Zero(), kNoStateId);
+
+    SW w1 = arc.weight.Value1();
+    AW w2 = arc.weight.Value2();
+    Label l;
+
+    if (w1.Size() == 0) {
+      l = 0;
+    } else {
+      typename Map::iterator miter = map_.find(w1);
+      if (miter != map_.end()) {
+        l = (*miter).second;
+      } else {
+        l = ++lmax_;
+        map_.insert(pair<const SW, Label>(w1, l));
+        StringWeightIterator<Label, S> iter1(w1);
+        StateId n;
+        string s;
+        for(ssize_t i = 0, p = state_;
+            i < w1.Size();
+            ++i, iter1.Next(), p = n) {
+          n = i == w1.Size() - 1 ? state_ : fst_->AddState();
+          fst_->AddArc(p, ToArc(i ? 0 : l, iter1.Value(), AW::One(), n));
+          if (isymbols_) {
+            if (i) s = s + "_";
+            s = s + osymbols_->Find(iter1.Value());
+          }
+        }
+        if (isymbols_)
+          isymbols_->AddSymbol(s, l);
+      }
+    }
+
+    CHECK(l != kStringInfinity);
+    CHECK(l != kStringBad);
+    CHECK(arc.ilabel == arc.olabel);
+
+    return A(arc.ilabel, l, w2, arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_ALLOW_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const {
+    return props & kOLabelInvariantProperties &
+      kWeightInvariantProperties & kAddSuperFinalProperties;
+  }
+
+ private:
+  class StringKey {
+   public:
+    size_t operator()(const SW &x) const {
+      return x.Hash();
+    }
+  };
+
+  typedef hash_map<SW, Label, StringKey> Map;
+
+  MutableFst<ToArc> *fst_;
+  Map map_;
+  Label lmax_;
+  StateId state_;
+  SymbolTable *osymbols_, *isymbols_;
+};
+
+
+// Mapper to add a constant to all weights.
+template <class A>
+struct PlusMapper {
+  typedef typename A::Weight Weight;
+
+  explicit PlusMapper(Weight w) : weight_(w) {}
+
+  A operator()(const A &arc) const {
+    if (arc.weight == Weight::Zero())
+      return arc;
+    Weight w = Plus(arc.weight, weight_);
+    return A(arc.ilabel, arc.olabel, w, arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const {
+    return props & kWeightInvariantProperties;
+  }
+
+  Weight weight_;
+};
+
+
+// Mapper to (right) multiply a constant to all weights.
+template <class A>
+struct TimesMapper {
+  typedef typename A::Weight Weight;
+
+  explicit TimesMapper(Weight w) : weight_(w) {}
+
+  A operator()(const A &arc) const {
+    if (arc.weight == Weight::Zero())
+      return arc;
+    Weight w = Times(arc.weight, weight_);
+    return A(arc.ilabel, arc.olabel, w, arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const {
+    return props & kWeightInvariantProperties;
+  }
+
+  Weight weight_;
+};
+
+
+// Mapper to map all non-Zero() weights to One().
+template <class A, class B = A>
+struct RmWeightMapper {
+  typedef A FromArc;
+  typedef B ToArc;
+  typedef typename FromArc::Weight FromWeight;
+  typedef typename ToArc::Weight ToWeight;
+
+  B operator()(const A &arc) const {
+    ToWeight w = arc.weight != FromWeight::Zero() ?
+                   ToWeight::One() : ToWeight::Zero();
+    return B(arc.ilabel, arc.olabel, w, arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const {
+    return props & kWeightInvariantProperties | kUnweighted;
+  }
+};
+
+
+// Mapper to quantize all weights.
+template <class A, class B = A>
+struct QuantizeMapper {
+  typedef A FromArc;
+  typedef B ToArc;
+  typedef typename FromArc::Weight FromWeight;
+  typedef typename ToArc::Weight ToWeight;
+
+  QuantizeMapper() : delta_(kDelta) {}
+
+  explicit QuantizeMapper(float d) : delta_(d) {}
+
+  B operator()(const A &arc) const {
+    ToWeight w = arc.weight.Quantize(delta_);
+    return B(arc.ilabel, arc.olabel, w, arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const {
+    return props & kWeightInvariantProperties;
+  }
+
+  float delta_;
+};
+
+
+// Mapper from A to B under the assumption:
+//    B::Weight = A::Weight::ReverseWeight
+//    B::Label == A::Label
+//    B::StateId == A::StateId
+// The weight is reversed, while the label and nextstate preserved
+// in the mapping.
+template <class A, class B>
+struct ReverseWeightMapper {
+  typedef A FromArc;
+  typedef B ToArc;
+
+  B operator()(const A &arc) const {
+    return B(arc.ilabel, arc.olabel, arc.weight.Reverse(), arc.nextstate);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+  uint64 Properties(uint64 props) const { return props; }
+};
+
+}  // namespace fst
+
+#endif  // FST_LIB_MAP_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/minimize.h b/tools/thirdparty/OpenFst/fst/lib/minimize.h
new file mode 100644
index 0000000..4a2aa38
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/minimize.h
@@ -0,0 +1,558 @@
+// minimize.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file Functions and classes to minimize a finite state acceptor
+
+#ifndef FST_LIB_MINIMIZE_H__
+#define FST_LIB_MINIMIZE_H__
+
+#include <algorithm>
+#include <map>
+#include <queue>
+
+#include "fst/lib/arcsort.h"
+#include "fst/lib/arcsum.h"
+#include "fst/lib/connect.h"
+#include "fst/lib/dfs-visit.h"
+#include "fst/lib/encode.h"
+#include "fst/lib/factor-weight.h"
+#include "fst/lib/fst.h"
+#include "fst/lib/mutable-fst.h"
+#include "fst/lib/partition.h"
+#include "fst/lib/push.h"
+#include "fst/lib/queue.h"
+#include "fst/lib/reverse.h"
+
+namespace fst {
+
+// comparator for creating partition based on sorting on
+// - states
+// - final weight
+// - out degree,
+// -  (input label, output label, weight, destination_block)
+template <class A>
+class StateComparator {
+ public:
+  typedef typename A::StateId StateId;
+  typedef typename A::Weight Weight;
+
+  static const int32 kCompareFinal     = 0x0000001;
+  static const int32 kCompareOutDegree = 0x0000002;
+  static const int32 kCompareArcs      = 0x0000004;
+  static const int32 kCompareAll       = (kCompareFinal |
+                                          kCompareOutDegree |
+                                          kCompareArcs);
+
+  StateComparator(const Fst<A>& fst,
+                  const Partition<typename A::StateId>& partition,
+                  int32 flags = kCompareAll)
+      : fst_(fst), partition_(partition), flags_(flags) {}
+
+  // compare state x with state y based on sort criteria
+  bool operator()(const StateId x, const StateId y) const {
+    // check for final state equivalence
+    if (flags_ & kCompareFinal) {
+      const ssize_t xfinal = fst_.Final(x).Hash();
+      const ssize_t yfinal = fst_.Final(y).Hash();
+      if      (xfinal < yfinal) return true;
+      else if (xfinal > yfinal) return false;
+    }
+
+    if (flags_ & kCompareOutDegree) {
+      // check for # arcs
+      if (fst_.NumArcs(x) < fst_.NumArcs(y)) return true;
+      if (fst_.NumArcs(x) > fst_.NumArcs(y)) return false;
+
+      if (flags_ & kCompareArcs) {
+        // # arcs are equal, check for arc match
+        for (ArcIterator<Fst<A> > aiter1(fst_, x), aiter2(fst_, y);
+             !aiter1.Done() && !aiter2.Done(); aiter1.Next(), aiter2.Next()) {
+          const A& arc1 = aiter1.Value();
+          const A& arc2 = aiter2.Value();
+          if (arc1.ilabel < arc2.ilabel) return true;
+          if (arc1.ilabel > arc2.ilabel) return false;
+
+          if (partition_.class_id(arc1.nextstate) <
+              partition_.class_id(arc2.nextstate)) return true;
+          if (partition_.class_id(arc1.nextstate) >
+              partition_.class_id(arc2.nextstate)) return false;
+        }
+      }
+    }
+
+    return false;
+  }
+
+ private:
+  const Fst<A>& fst_;
+  const Partition<typename A::StateId>& partition_;
+  const int32 flags_;
+};
+
+// Computes equivalence classes for cyclic Fsts. For cyclic minimization
+// we use the classic HopCroft minimization algorithm, which is of
+//
+//   O(E)log(N),
+//
+// where E is the number of edges in the machine and N is number of states.
+//
+// The following paper describes the original algorithm
+//  An N Log N algorithm for minimizing states in a finite automaton
+//  by John HopCroft, January 1971
+//
+template <class A, class Queue>
+class CyclicMinimizer {
+ public:
+  typedef typename A::Label Label;
+  typedef typename A::StateId StateId;
+  typedef typename A::StateId ClassId;
+  typedef typename A::Weight Weight;
+  typedef ReverseArc<A> RevA;
+
+  CyclicMinimizer(const ExpandedFst<A>& fst) {
+    Initialize(fst);
+    Compute(fst);
+  }
+
+  ~CyclicMinimizer() {
+    delete aiter_queue_;
+  }
+
+  const Partition<StateId>& partition() const {
+    return P_;
+  }
+
+  // helper classes
+ private:
+  typedef ArcIterator<Fst<RevA> > ArcIter;
+  class ArcIterCompare {
+   public:
+    ArcIterCompare(const Partition<StateId>& partition)
+        : partition_(partition) {}
+
+    ArcIterCompare(const ArcIterCompare& comp)
+        : partition_(comp.partition_) {}
+
+    // compare two iterators based on there input labels, and proto state
+    // (partition class Ids)
+    bool operator()(const ArcIter* x, const ArcIter* y) const {
+      const RevA& xarc = x->Value();
+      const RevA& yarc = y->Value();
+      return (xarc.ilabel > yarc.ilabel);
+    }
+
+   private:
+    const Partition<StateId>& partition_;
+  };
+
+  typedef priority_queue<ArcIter*, vector<ArcIter*>, ArcIterCompare>
+  ArcIterQueue;
+
+  // helper methods
+ private:
+  // prepartitions the space into equivalence classes with
+  //   same final weight
+  //   same # arcs per state
+  //   same outgoing arcs
+  void PrePartition(const Fst<A>& fst) {
+    VLOG(5) << "PrePartition";
+
+    typedef map<StateId, StateId, StateComparator<A> > EquivalenceMap;
+    StateComparator<A> comp(fst, P_, StateComparator<A>::kCompareFinal);
+    EquivalenceMap equiv_map(comp);
+
+    StateIterator<Fst<A> > siter(fst);
+    StateId class_id = P_.AddClass();
+    P_.Add(siter.Value(), class_id);
+    equiv_map[siter.Value()] = class_id;
+    L_.Enqueue(class_id);
+    for (siter.Next(); !siter.Done(); siter.Next()) {
+      StateId  s = siter.Value();
+      typename EquivalenceMap::const_iterator it = equiv_map.find(s);
+      if (it == equiv_map.end()) {
+        class_id = P_.AddClass();
+        P_.Add(s, class_id);
+        equiv_map[s] = class_id;
+        L_.Enqueue(class_id);
+      } else {
+        P_.Add(s, it->second);
+        equiv_map[s] = it->second;
+      }
+    }
+
+    VLOG(5) << "Initial Partition: " << P_.num_classes();
+  }
+
+  // - Create inverse transition Tr_ = rev(fst)
+  // - loop over states in fst and split on final, creating two blocks
+  //   in the partition corresponding to final, non-final
+  void Initialize(const Fst<A>& fst) {
+    // construct Tr
+    Reverse(fst, &Tr_);
+    ILabelCompare<RevA> ilabel_comp;
+    ArcSort(&Tr_, ilabel_comp);
+
+    // initial split (F, S - F)
+    P_.Initialize(Tr_.NumStates() - 1);
+
+    // prep partition
+    PrePartition(fst);
+
+    // allocate arc iterator queue
+    ArcIterCompare comp(P_);
+    aiter_queue_ = new ArcIterQueue(comp);
+  }
+
+  // partition all classes with destination C
+  void Split(ClassId C) {
+    // Prep priority queue. Open arc iterator for each state in C, and
+    // insert into priority queue.
+    for (PartitionIterator<StateId> siter(P_, C);
+         !siter.Done(); siter.Next()) {
+      StateId s = siter.Value();
+      if (Tr_.NumArcs(s + 1))
+        aiter_queue_->push(new ArcIterator<Fst<RevA> >(Tr_, s + 1));
+    }
+
+    // Now pop arc iterator from queue, split entering equivalence class
+    // re-insert updated iterator into queue.
+    Label prev_label = -1;
+    while (!aiter_queue_->empty()) {
+      ArcIterator<Fst<RevA> >* aiter = aiter_queue_->top();
+      aiter_queue_->pop();
+      if (aiter->Done()) {
+        delete aiter;
+        continue;
+     }
+
+      const RevA& arc = aiter->Value();
+      StateId from_state = aiter->Value().nextstate - 1;
+      Label   from_label = arc.ilabel;
+      if (prev_label != from_label)
+        P_.FinalizeSplit(&L_);
+
+      StateId from_class = P_.class_id(from_state);
+      if (P_.class_size(from_class) > 1)
+        P_.SplitOn(from_state);
+
+      prev_label = from_label;
+      aiter->Next();
+      if (aiter->Done())
+        delete aiter;
+      else
+        aiter_queue_->push(aiter);
+    }
+    P_.FinalizeSplit(&L_);
+  }
+
+  // Main loop for hopcroft minimization.
+  void Compute(const Fst<A>& fst) {
+    // process active classes (FIFO, or FILO)
+    while (!L_.Empty()) {
+      ClassId C = L_.Head();
+      L_.Dequeue();
+
+      // split on C, all labels in C
+      Split(C);
+    }
+  }
+
+  // helper data
+ private:
+  // Partioning of states into equivalence classes
+  Partition<StateId> P_;
+
+  // L = set of active classes to be processed in partition P
+  Queue L_;
+
+  // reverse transition function
+  VectorFst<RevA> Tr_;
+
+  // Priority queue of open arc iterators for all states in the 'splitter'
+  // equivalence class
+  ArcIterQueue* aiter_queue_;
+};
+
+
+// Computes equivalence classes for acyclic Fsts. The implementation details
+// for this algorithms is documented by the following paper.
+//
+// Minimization of acyclic deterministic automata in linear time
+//  Dominque Revuz
+//
+// Complexity O(|E|)
+//
+template <class A>
+class AcyclicMinimizer {
+ public:
+  typedef typename A::Label Label;
+  typedef typename A::StateId StateId;
+  typedef typename A::StateId ClassId;
+  typedef typename A::Weight Weight;
+
+  AcyclicMinimizer(const ExpandedFst<A>& fst) {
+    Initialize(fst);
+    Refine(fst);
+  }
+
+  const Partition<StateId>& partition() {
+    return partition_;
+  }
+
+  // helper classes
+ private:
+  // DFS visitor to compute the height (distance) to final state.
+  class HeightVisitor {
+   public:
+    HeightVisitor() : max_height_(0), num_states_(0) { }
+
+    // invoked before dfs visit
+    void InitVisit(const Fst<A>& fst) {}
+
+    // invoked when state is discovered (2nd arg is DFS tree root)
+    bool InitState(StateId s, StateId root) {
+      // extend height array and initialize height (distance) to 0
+      for (size_t i = height_.size(); i <= (size_t)s; ++i) 
+        height_.push_back(-1);
+
+      if (s >= (StateId)num_states_) num_states_ = s + 1; 
+      return true;
+    }
+
+    // invoked when tree arc examined (to undiscoverted state)
+    bool TreeArc(StateId s, const A& arc) {
+      return true;
+    }
+
+    // invoked when back arc examined (to unfinished state)
+    bool BackArc(StateId s, const A& arc) {
+      return true;
+    }
+
+    // invoked when forward or cross arc examined (to finished state)
+    bool ForwardOrCrossArc(StateId s, const A& arc) {
+      if (height_[arc.nextstate] + 1 > height_[s])
+        height_[s] = height_[arc.nextstate] + 1;
+      return true;
+    }
+
+    // invoked when state finished (parent is kNoStateId for tree root)
+    void FinishState(StateId s, StateId parent, const A* parent_arc) {
+      if (height_[s] == -1) height_[s] = 0;
+      StateId h = height_[s] +  1;
+      if (parent >= 0) {
+        if (h > height_[parent]) height_[parent] = h;
+        if (h > (StateId)max_height_)     max_height_ = h; 
+      }
+    }
+
+    // invoked after DFS visit
+    void FinishVisit() {}
+
+    size_t max_height() const { return max_height_; }
+
+    const vector<StateId>& height() const { return height_; }
+
+    const size_t num_states() const { return num_states_; }
+
+   private:
+    vector<StateId> height_;
+    size_t max_height_;
+    size_t num_states_;
+  };
+
+  // helper methods
+ private:
+  // cluster states according to height (distance to final state)
+  void Initialize(const Fst<A>& fst) {
+    // compute height (distance to final state)
+    HeightVisitor hvisitor;
+    DfsVisit(fst, &hvisitor);
+
+    // create initial partition based on height
+    partition_.Initialize(hvisitor.num_states());
+    partition_.AllocateClasses(hvisitor.max_height() + 1);
+    const vector<StateId>& hstates = hvisitor.height();
+    for (size_t s = 0; s < hstates.size(); ++s)
+      partition_.Add(s, hstates[s]);
+  }
+
+  // refine states based on arc sort (out degree, arc equivalence)
+  void Refine(const Fst<A>& fst) {
+    typedef map<StateId, StateId, StateComparator<A> > EquivalenceMap;
+    StateComparator<A> comp(fst, partition_);
+
+    // start with tail (height = 0)
+    size_t height = partition_.num_classes();
+    for (size_t h = 0; h < height; ++h) {
+      EquivalenceMap equiv_classes(comp);
+
+      // sort states within equivalence class
+      PartitionIterator<StateId> siter(partition_, h);
+      equiv_classes[siter.Value()] = h;
+      for (siter.Next(); !siter.Done(); siter.Next()) {
+        const StateId s = siter.Value();
+        typename EquivalenceMap::const_iterator it = equiv_classes.find(s);
+        if (it == equiv_classes.end())
+          equiv_classes[s] = partition_.AddClass();
+        else
+          equiv_classes[s] = it->second;
+      }
+
+      // create refined partition
+      for (siter.Reset(); !siter.Done();) {
+        const StateId s = siter.Value();
+        const StateId old_class = partition_.class_id(s);
+        const StateId new_class = equiv_classes[s];
+
+        // a move operation can invalidate the iterator, so
+        // we first update the iterator to the next element
+        // before we move the current element out of the list
+        siter.Next();
+        if (old_class != new_class)
+          partition_.Move(s, new_class);
+      }
+    }
+  }
+
+ private:
+  Partition<StateId> partition_;
+};
+
+
+// Given a partition and a mutable fst, merge states of Fst inplace
+// (i.e. destructively). Merging works by taking the first state in
+// a class of the partition to be the representative state for the class.
+// Each arc is then reconnected to this state. All states in the class
+// are merged by adding there arcs to the representative state.
+template <class A>
+void MergeStates(
+    const Partition<typename A::StateId>& partition, MutableFst<A>* fst) {
+  typedef typename A::StateId StateId;
+
+  vector<StateId> state_map(partition.num_classes());
+  for (size_t i = 0; i < (size_t)partition.num_classes(); ++i) { 
+    PartitionIterator<StateId> siter(partition, i);
+    state_map[i] = siter.Value();  // first state in partition;
+  }
+
+  // relabel destination states
+  for (size_t c = 0; c < (size_t)partition.num_classes(); ++c) { 
+    for (PartitionIterator<StateId> siter(partition, c);
+         !siter.Done(); siter.Next()) {
+      StateId s = siter.Value();
+      for (MutableArcIterator<MutableFst<A> > aiter(fst, s);
+           !aiter.Done(); aiter.Next()) {
+        A arc = aiter.Value();
+        arc.nextstate = state_map[partition.class_id(arc.nextstate)];
+
+        if (s == state_map[c])  // first state just set destination
+          aiter.SetValue(arc);
+        else
+          fst->AddArc(state_map[c], arc);
+      }
+    }
+  }
+  fst->SetStart(state_map[partition.class_id(fst->Start())]);
+
+  Connect(fst);
+}
+
+template <class A>
+void AcceptorMinimize(MutableFst<A>* fst) {
+  typedef typename A::StateId StateId;
+  if (!(fst->Properties(kAcceptor | kUnweighted, true)))
+    LOG(FATAL) << "Input Fst is not an unweighted acceptor";
+
+  // connect fst before minimization, handles disconnected states
+  Connect(fst);
+  if (fst->NumStates() == 0) return;
+
+  if (fst->Properties(kAcyclic, true)) {
+    // Acyclic minimization (revuz)
+    VLOG(2) << "Acyclic Minimization";
+    AcyclicMinimizer<A> minimizer(*fst);
+    MergeStates(minimizer.partition(), fst);
+
+  } else {
+    // Cyclic minimizaton (hopcroft)
+    VLOG(2) << "Cyclic Minimization";
+    CyclicMinimizer<A, LifoQueue<StateId> > minimizer(*fst);
+    MergeStates(minimizer.partition(), fst);
+  }
+
+  // sort arcs before summing
+  ArcSort(fst, ILabelCompare<A>());
+
+  // sum in appropriate semiring
+  ArcSum(fst);
+}
+
+
+// In place minimization of unweighted, deterministic acceptors
+//
+// For acyclic automata we use an algorithm from Dominique Revuz that is
+// linear in the number of arcs (edges) in the machine.
+//  Complexity = O(E)
+//
+// For cyclic automata we use the classical hopcroft minimization.
+//  Complexity = O(|E|log(|N|)
+//
+template <class A>
+void Minimize(MutableFst<A>* fst, MutableFst<A>* sfst = 0) {
+  uint64 props = fst->Properties(kAcceptor | kIDeterministic|
+                                 kWeighted | kUnweighted, true);
+  if (!(props & kIDeterministic))
+    LOG(FATAL) << "Input Fst is not deterministic";
+
+  if (!(props & kAcceptor)) {  // weighted transducer
+    VectorFst< GallicArc<A, STRING_LEFT> > gfst;
+    Map(*fst, &gfst, ToGallicMapper<A, STRING_LEFT>());
+    fst->DeleteStates();
+    gfst.SetProperties(kAcceptor, kAcceptor);
+    Push(&gfst, REWEIGHT_TO_INITIAL);
+    Map(&gfst, QuantizeMapper< GallicArc<A, STRING_LEFT> >());
+    EncodeMapper< GallicArc<A, STRING_LEFT> >
+      encoder(kEncodeLabels | kEncodeWeights, ENCODE);
+    Encode(&gfst, &encoder);
+    AcceptorMinimize(&gfst);
+    Decode(&gfst, encoder);
+
+    if (sfst == 0) {
+      FactorWeightFst< GallicArc<A, STRING_LEFT>,
+        GallicFactor<typename A::Label,
+        typename A::Weight, STRING_LEFT> > fwfst(gfst);
+      Map(fwfst, fst, FromGallicMapper<A, STRING_LEFT>());
+    } else {
+      sfst->SetOutputSymbols(fst->OutputSymbols());
+      GallicToNewSymbolsMapper<A, STRING_LEFT> mapper(sfst);
+      Map(gfst, fst, mapper);
+      fst->SetOutputSymbols(sfst->InputSymbols());
+    }
+  } else if (props & kWeighted) {  // weighted acceptor
+    Push(fst, REWEIGHT_TO_INITIAL);
+    Map(fst, QuantizeMapper<A>());
+    EncodeMapper<A> encoder(kEncodeLabels | kEncodeWeights, ENCODE);
+    Encode(fst, &encoder);
+    AcceptorMinimize(fst);
+    Decode(fst, encoder);
+  } else {  // unweighted acceptor
+    AcceptorMinimize(fst);
+  }
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_MINIMIZE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/mutable-fst.h b/tools/thirdparty/OpenFst/fst/lib/mutable-fst.h
new file mode 100644
index 0000000..df00620
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/mutable-fst.h
@@ -0,0 +1,167 @@
+// mutable-fst.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Expanded FST augmented with mutators - interface class definition
+// and mutable arc iterator interface.
+
+#ifndef FST_LIB_MUTABLE_FST_H__
+#define FST_LIB_MUTABLE_FST_H__
+
+#include <vector>
+
+#include "fst/lib/expanded-fst.h"
+
+namespace fst {
+
+template <class A> class MutableArcIteratorData;
+
+// An expanded FST plus mutators (use MutableArcIterator to modify arcs).
+template <class A>
+class MutableFst : public ExpandedFst<A> {
+ public:
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  virtual MutableFst<A> &operator=(const Fst<A> &fst) = 0;
+
+  virtual void SetStart(StateId) = 0;           // Set the initial state
+  virtual void SetFinal(StateId, Weight) = 0;   // Set a state's final weight
+  virtual void SetProperties(uint64 props,
+                             uint64 mask) = 0;  // Set property bits wrt mask
+  virtual StateId AddState() = 0;               // Add a state, return its ID
+  virtual void AddArc(StateId, const A &arc) = 0;   // Add an arc to state
+
+  virtual void DeleteStates(const vector<StateId>&) = 0;  // Delete some states
+  virtual void DeleteStates() = 0;              // Delete all states
+  virtual void DeleteArcs(StateId, size_t n) = 0;  // Delete some arcs at state
+  virtual void DeleteArcs(StateId) = 0;         // Delete all arcs at state
+
+  // Return input label symbol table; return NULL if not specified
+  virtual const SymbolTable* InputSymbols() const = 0;
+  // Return output label symbol table; return NULL if not specified
+  virtual const SymbolTable* OutputSymbols() const = 0;
+
+  // Return input label symbol table; return NULL if not specified
+  virtual SymbolTable* InputSymbols() = 0;
+  // Return output label symbol table; return NULL if not specified
+  virtual SymbolTable* OutputSymbols() = 0;
+
+  // Set input label symbol table; NULL signifies not unspecified
+  virtual void SetInputSymbols(const SymbolTable* isyms) = 0;
+  // Set output label symbol table; NULL signifies not unspecified
+  virtual void SetOutputSymbols(const SymbolTable* osyms) = 0;
+
+  // Get a copy of this MutableFst.
+  virtual MutableFst<A> *Copy() const = 0;
+  // Read an MutableFst from an input stream; return NULL on error.
+  static MutableFst<A> *Read(istream &strm, const FstReadOptions &opts) {
+    FstReadOptions ropts(opts);
+    FstHeader hdr;
+    if (ropts.header)
+      hdr = *opts.header;
+    else {
+      if (!hdr.Read(strm, opts.source))
+        return 0;
+      ropts.header = &hdr;
+    }
+    if (!(hdr.Properties() & kMutable)) {
+      LOG(ERROR) << "MutableFst::Read: Not an MutableFst: " << ropts.source;
+      return 0;
+    }
+    FstRegister<A> *registr = FstRegister<A>::GetRegister();
+    const typename FstRegister<A>::Reader reader =
+      registr->GetReader(hdr.FstType());
+    if (!reader) {
+      LOG(ERROR) << "MutableFst::Read: Unknown FST type \"" << hdr.FstType()
+                 << "\" (arc type = \"" << A::Type()
+                 << "\"): " << ropts.source;
+      return 0;
+    }
+    Fst<A> *fst = reader(strm, ropts);
+    if (!fst) return 0;
+    return down_cast<MutableFst<A> *>(fst);
+  }
+  // Read an MutableFst from a file; returns NULL on error.
+  static MutableFst<A> *Read(const string &filename) {
+    ifstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "MutableFst::Read: Can't open file: " << filename;
+      return 0;
+    }
+    return Read(strm, FstReadOptions(filename));
+  }
+
+  // For generic mutuble arc iterator construction; not normally called
+  // directly by users.
+  virtual void InitMutableArcIterator(StateId s,
+                                      MutableArcIteratorData<A> *) = 0;
+};
+
+// Mutable arc iterator interface, templated on the Arc definition.
+template <class A>
+class MutableArcIteratorBase : public ArcIteratorBase<A> {
+ public:
+  typedef A Arc;
+  virtual void SetValue(const A &arc) = 0;  // Set current arc's contents
+};
+
+template <class A>
+struct MutableArcIteratorData {
+  MutableArcIteratorBase<A> *base;  // Specific iterator
+};
+
+// Generic mutable arc iterator, templated on the FST definition
+// - a wrapper around pointer to specific one.
+// Here is a typical use: \code
+//   for (MutableArcIterator<StdFst> aiter(&fst, s));
+//        !aiter.Done();
+//         aiter.Next()) {
+//     StdArc arc = aiter.Value();
+//     arc.ilabel = 7;
+//     aiter.SetValue(arc);
+//     ...
+//   } \endcode
+// This version requires function calls.
+template <class F>
+class MutableArcIterator : public MutableArcIteratorBase<typename F::Arc> {
+ public:
+  typedef typename F::Arc Arc;
+  typedef typename Arc::StateId StateId;
+
+  MutableArcIterator(F *fst, StateId s) {
+    fst->InitMutableArcIterator(s, &data_);
+  }
+  ~MutableArcIterator() { delete data_.base; }
+
+  bool Done() const { return data_.base->Done(); }
+  const Arc& Value() const { return data_.base->Value(); }
+  void Next() { data_.base->Next(); }
+  void Reset() { data_.base->Reset(); }
+  void Seek(size_t a) { data_.base->Seek(a); }
+  void SetValue(const Arc &a) { data_.base->SetValue(a); }
+
+ private:
+  MutableArcIteratorData<Arc> data_;
+  DISALLOW_EVIL_CONSTRUCTORS(MutableArcIterator);
+};
+
+// A useful alias when using StdArc.
+typedef MutableFst<StdArc> StdMutableFst;
+
+}  // namespace fst;
+
+#endif  // FST_LIB_MUTABLE_FST_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/partition.h b/tools/thirdparty/OpenFst/fst/lib/partition.h
new file mode 100644
index 0000000..1a3f5cd
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/partition.h
@@ -0,0 +1,285 @@
+// partition.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file Functions and classes to create a partition of states
+//
+
+#ifndef FST_LIB_PARTITION_H__
+#define FST_LIB_PARTITION_H__
+
+#include <algorithm>
+#include <vector>
+
+#include "fst/lib/queue.h"
+
+
+namespace fst {
+
+template <typename T> class PartitionIterator;
+
+// \class Partition
+// \brief Defines a partitioning of states. Typically used to represent
+//        equivalence classes for Fst operations like minimization.
+//
+template <typename T>
+class Partition {
+  friend class PartitionIterator<T>;
+
+  struct Element {
+   Element() : value(0), next(0), prev(0) {}
+   Element(T v) : value(v), next(0), prev(0) {}
+
+   T        value;
+   Element* next;
+   Element* prev;
+  };
+
+ public:
+  Partition() {}
+
+  Partition(T num_states) {
+    Initialize(num_states);
+  }
+
+  ~Partition() {
+    for (size_t i = 0; i < elements_.size(); ++i)
+      delete elements_[i];
+  }
+
+  // Create an empty partition for num_states. At initialization time
+  // all elements are not assigned to a class (i.e class_index = -1).
+  // Initialize just creates num_states of elements. All element
+  // operations are then done by simply disconnecting the element from
+  // it current class and placing it at the head of the next class.
+  void Initialize(size_t num_states) {
+    for (size_t i = 0; i < elements_.size(); ++i)
+      delete elements_[i];
+    elements_.clear();
+    classes_.clear();
+    class_index_.clear();
+
+    elements_.resize(num_states);
+    class_index_.resize(num_states, -1);
+    class_size_.reserve(num_states);
+    for (size_t i = 0; i < num_states; ++i)
+      elements_[i] = new Element(i);
+    num_states_ = num_states;
+  }
+
+  // Add a class, resize classes_ and class_size_ resource by 1.
+  size_t AddClass() {
+    size_t num_classes = classes_.size();
+    classes_.resize(num_classes + 1, 0);
+    class_size_.resize(num_classes + 1, 0);
+    class_split_.resize(num_classes + 1, 0);
+    split_size_.resize(num_classes + 1, 0);
+    return num_classes;
+  }
+
+  void AllocateClasses(T num_classes) {
+    size_t n = classes_.size() + num_classes;
+    classes_.resize(n, 0);
+    class_size_.resize(n, 0);
+    class_split_.resize(n, 0);
+    split_size_.resize(n, 0);
+  }
+
+  // Add element_id to class_id. The Add method is used to initialize
+  // partition. Once elements have been added to a class, you need to
+  // use the Move() method move an element from once class to another.
+  void Add(T element_id, T class_id) {
+    Element* element = elements_[element_id];
+
+    if (classes_[class_id])
+      classes_[class_id]->prev = element;
+    element->next = classes_[class_id];
+    element->prev = 0;
+    classes_[class_id] = element;
+
+    class_index_[element_id] = class_id;
+    class_size_[class_id]++;
+  }
+
+  // Move and element_id to class_id. Disconnects (removes) element
+  // from it current class and
+  void Move(T element_id, T class_id) {
+    T old_class_id = class_index_[element_id];
+
+    Element* element = elements_[element_id];
+    if (element->next) element->next->prev = element->prev;
+    if (element->prev) element->prev->next = element->next;
+    else               classes_[old_class_id] = element->next;
+
+    Add(element_id, class_id);
+    class_size_[old_class_id]--;
+  }
+
+  // split class on the element_id
+  void SplitOn(T element_id) {
+    T class_id = class_index_[element_id];
+    if (class_size_[class_id] == 1) return;
+
+    // first time class is split
+    if (split_size_[class_id] == 0)
+      visited_classes_.push_back(class_id);
+
+    // increment size of split (set of element at head of chain)
+    split_size_[class_id]++;
+
+    // update split point
+    if (class_split_[class_id] == 0)
+      class_split_[class_id] = classes_[class_id];
+    if (class_split_[class_id] == elements_[element_id])
+      class_split_[class_id] = elements_[element_id]->next;
+
+    // move to head of chain in same class
+    Move(element_id, class_id);
+  }
+
+  // Finalize class_id, split if required, and update class_splits,
+  // class indices of the newly created class. Returns the new_class id
+  // or -1 if no new class was created.
+  T SplitRefine(T class_id) {
+    // only split if necessary
+    if (class_size_[class_id] == split_size_[class_id]) {
+      class_split_[class_id] = 0;
+      split_size_[class_id] = 0;
+      return -1;
+    } else {
+
+      T new_class = AddClass();
+      size_t remainder = class_size_[class_id] - split_size_[class_id];
+      if (remainder < (size_t)split_size_[class_id]) {  // add smaller 
+        Element* split_el   = class_split_[class_id];
+        classes_[new_class] = split_el;
+        class_size_[class_id] = split_size_[class_id];
+        class_size_[new_class] = remainder;
+        split_el->prev->next = 0;
+        split_el->prev = 0;
+      } else {
+        Element* split_el   = class_split_[class_id];
+        classes_[new_class] = classes_[class_id];
+        class_size_[class_id] = remainder;
+        class_size_[new_class] = split_size_[class_id];
+        split_el->prev->next = 0;
+        split_el->prev = 0;
+        classes_[class_id] = split_el;
+      }
+
+      // update class index for element in new class
+      for (Element* el = classes_[new_class]; el; el = el->next)
+        class_index_[el->value] = new_class;
+
+      class_split_[class_id] = 0;
+      split_size_[class_id] = 0;
+
+      return new_class;
+    }
+  }
+
+  // Once all states have been processed for a particular class C, we
+  // can finalize the split. FinalizeSplit() will update each block in the
+  // partition, create new once and update the queue of active classes
+  // that require further refinement.
+  template <class Queue>
+  void FinalizeSplit(Queue* L) {
+    for (size_t i = 0; i < visited_classes_.size(); ++i) {
+      T new_class = SplitRefine(visited_classes_[i]);
+      if (new_class != -1 && L)
+        L->Enqueue(new_class);
+    }
+    visited_classes_.clear();
+  }
+
+
+  const T class_id(T element_id) const {
+    return class_index_[element_id];
+  }
+
+  const vector<T>& class_sizes() const {
+    return class_size_;
+  }
+
+  const size_t class_size(T class_id)  const {
+    return class_size_[class_id];
+  }
+
+  const T num_classes() const {
+    return classes_.size();
+  }
+
+
+ private:
+  int num_states_;
+
+  // container of all elements (owner of ptrs)
+  vector<Element*> elements_;
+
+  // linked list of elements belonging to class
+  vector<Element*> classes_;
+
+  // pointer to split point for each class
+  vector<Element*> class_split_;
+
+  // class index of element
+  vector<T> class_index_;
+
+  // class sizes
+  vector<T> class_size_;
+
+  // size of split for each class
+  vector<T> split_size_;
+
+  // set of visited classes to be used in split refine
+  vector<T> visited_classes_;
+};
+
+
+// iterate over members of a class in a partition
+template <typename T>
+class PartitionIterator {
+  typedef typename Partition<T>::Element Element;
+ public:
+  PartitionIterator(const Partition<T>& partition, T class_id)
+      : p_(partition),
+        element_(p_.classes_[class_id]),
+        class_id_(class_id) {}
+
+  bool Done() {
+    return (element_ == 0);
+  }
+
+  const T Value() {
+    return (element_->value);
+  }
+
+  void Next() {
+    element_ = element_->next;
+  }
+
+  void Reset() {
+    element_ = p_.classes_[class_id_];
+  }
+
+ private:
+  const Partition<T>& p_;
+
+  const Element* element_;
+
+  T class_id_;
+};
+}
+
+#endif  // FST_LIB_PARTITION_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/product-weight.h b/tools/thirdparty/OpenFst/fst/lib/product-weight.h
new file mode 100644
index 0000000..9fa3a96
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/product-weight.h
@@ -0,0 +1,194 @@
+// product-weight.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Product weight set and associated semiring operation definitions.
+
+#ifndef FST_LIB_PRODUCT_WEIGHT_H__
+#define FST_LIB_PRODUCT_WEIGHT_H__
+
+#include "fst/lib/weight.h"
+
+DECLARE_string(fst_product_separator);
+
+namespace fst {
+
+// Product semiring: W1 * W2
+template<class W1, class W2>
+class ProductWeight {
+ public:
+  typedef ProductWeight<typename W1::ReverseWeight, typename W2::ReverseWeight>
+  ReverseWeight;
+
+  ProductWeight() {}
+
+  ProductWeight(W1 w1, W2 w2) : value1_(w1), value2_(w2) {}
+
+  static const ProductWeight<W1, W2> &Zero() {
+    static const ProductWeight<W1, W2> zero(W1::Zero(), W2::Zero());
+    return zero;
+  }
+
+  static const ProductWeight<W1, W2> &One() {
+    static const ProductWeight<W1, W2> one(W1::One(), W2::One());
+    return one;
+  }
+
+  static const string &Type() {
+    static const string type = W1::Type() + "_X_" + W2::Type();
+    return type;
+  }
+
+  istream &Read(istream &strm) {
+    value1_.Read(strm);
+    return value2_.Read(strm);
+  }
+
+  ostream &Write(ostream &strm) const {
+    value1_.Write(strm);
+    return value2_.Write(strm);
+  }
+
+  ProductWeight<W1, W2> &operator=(const ProductWeight<W1, W2> &w) {
+    value1_ = w.Value1();
+    value2_ = w.Value2();
+    return *this;
+  }
+
+  bool Member() const { return value1_.Member() && value2_.Member(); }
+
+  ssize_t Hash() const {
+    ssize_t h1 = value1_.Hash();
+    ssize_t h2 = value2_.Hash();
+    int lshift = 5;
+    int rshift = sizeof(ssize_t) - 5;
+    return h1 << lshift ^ h1 >> rshift ^ h2;
+  }
+
+  ProductWeight<W1, W2> Quantize(float delta = kDelta) const {
+    return ProductWeight<W1, W2>(value1_.Quantize(), value2_.Quantize());
+  }
+
+  ReverseWeight Reverse() const {
+    return ReverseWeight(value1_.Reverse(), value2_.Reverse());
+  }
+
+  static uint64 Properties() {
+    uint64 props1 = W1::Properties();
+    uint64 props2 = W2::Properties();
+    return props1 & props2 & (kLeftSemiring | kRightSemiring |
+                              kCommutative | kIdempotent);
+  }
+
+  W1 Value1() const { return value1_; }
+
+  W2 Value2() const { return value2_; }
+
+ private:
+  W1 value1_;
+  W2 value2_;
+};
+
+template <class W1, class W2>
+inline bool operator==(const ProductWeight<W1, W2> &w,
+                       const ProductWeight<W1, W2> &v) {
+  return w.Value1() == v.Value1() && w.Value2() == v.Value2();
+}
+
+template <class W1, class W2>
+inline bool operator!=(const ProductWeight<W1, W2> &w1,
+                       const ProductWeight<W1, W2> &w2) {
+  return w1.Value1() != w2.Value1() || w1.Value2() != w2.Value2();
+}
+
+
+template <class W1, class W2>
+inline bool ApproxEqual(const ProductWeight<W1, W2> &w1,
+                        const ProductWeight<W1, W2> &w2,
+                        float delta = kDelta) {
+  return w1 == w2;
+}
+
+template <class W1, class W2>
+inline ostream &operator<<(ostream &strm, const ProductWeight<W1, W2> &w) {
+  CHECK(FLAGS_fst_product_separator.size() == 1);
+  char separator = FLAGS_fst_product_separator[0];
+  return strm << w.Value1() << separator << w.Value2();
+}
+
+template <class W1, class W2>
+inline istream &operator>>(istream &strm, ProductWeight<W1, W2> &w) {
+  CHECK(FLAGS_fst_product_separator.size() == 1);
+  char separator = FLAGS_fst_product_separator[0];
+  int c;
+
+  // read any initial whitespapce
+  while (true) {
+    c = strm.get();
+    if (c == EOF || c == separator) {
+      strm.clear(std::ios::badbit);
+      return strm;
+    }
+    if (!isspace(c))
+      break;
+  }
+
+  // read first element
+  string s1;
+  do {
+    s1 += c;
+    c = strm.get();
+    if (c == EOF || isspace(c)) {
+      strm.clear(std::ios::badbit);
+      return strm;
+    }
+  } while (c != separator);
+  istringstream strm1(s1);
+  W1 w1 = W1::Zero();
+  strm1 >> w1;
+
+  // read second element
+  W2 w2 = W2::Zero();
+  strm >> w2;
+
+  w = ProductWeight<W1, W2>(w1, w2);
+  return strm;
+}
+
+template <class W1, class W2>
+inline ProductWeight<W1, W2> Plus(const ProductWeight<W1, W2> &w,
+                                  const ProductWeight<W1, W2> &v) {
+  return ProductWeight<W1, W2>(Plus(w.Value1(), v.Value1()),
+                               Plus(w.Value2(), v.Value2()));
+}
+
+template <class W1, class W2>
+inline ProductWeight<W1, W2> Times(const ProductWeight<W1, W2> &w,
+                                   const ProductWeight<W1, W2> &v) {
+  return ProductWeight<W1, W2>(Times(w.Value1(), v.Value1()),
+                               Times(w.Value2(), v.Value2()));
+}
+
+template <class W1, class W2>
+inline ProductWeight<W1, W2> Divide(const ProductWeight<W1, W2> &w,
+                                    const ProductWeight<W1, W2> &v,
+                                    DivideType typ = DIVIDE_ANY) {
+  return ProductWeight<W1, W2>(Divide(w.Value1(), v.Value1(), typ),
+                               Divide(w.Value2(), v.Value2(), typ));
+}
+
+}  // namespace fst;
+
+#endif  // FST_LIB_PRODUCT_WEIGHT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/project.h b/tools/thirdparty/OpenFst/fst/lib/project.h
new file mode 100644
index 0000000..8fbc30b
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/project.h
@@ -0,0 +1,118 @@
+// project.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to project an Fst on to its domain or range.
+
+#ifndef FST_LIB_PROJECT_H__
+#define FST_LIB_PROJECT_H__
+
+#include "fst/lib/map.h"
+#include "fst/lib/mutable-fst.h"
+
+namespace fst {
+
+// This specifies whether to project on input or output.
+enum ProjectType { PROJECT_INPUT = 1, PROJECT_OUTPUT = 2 };
+
+
+// Mapper to implement projection per arc.
+template <class A> class ProjectMapper {
+ public:
+  explicit ProjectMapper(ProjectType project_type)
+      : project_type_(project_type) {}
+
+  A operator()(const A &arc) {
+    typename A::Label label = project_type_ == PROJECT_INPUT
+                              ? arc.ilabel : arc.olabel;
+    return A(label, label, arc.weight, arc.nextstate);
+  }
+
+  uint64 Properties(uint64 props) {
+    return ProjectProperties(props, project_type_ == PROJECT_INPUT);
+  }
+
+  MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; }
+
+ private:
+  ProjectType project_type_;
+};
+
+
+// Projects an FST onto its domain or range by either copying each arcs'
+// input label to the output label or vice versa. This version modifies
+// its input.
+//
+// Complexity:
+// - Time: O(V + E)
+// - Space: O(1)
+// where V = # of states and E = # of arcs.
+template<class Arc> inline
+void Project(MutableFst<Arc> *fst, ProjectType project_type) {
+  Map(fst, ProjectMapper<Arc>(project_type));
+}
+
+
+// Projects an FST onto its domain or range by either copying each arc's
+// input label to the output label or vice versa. This version is a delayed
+// Fst.
+//
+// Complexity:
+// - Time: O(v + e)
+// - Space: O(1)
+// where v = # of states visited, e = # of arcs visited. Constant
+// time and to visit an input state or arc is assumed and exclusive
+// of caching.
+template <class A>
+class ProjectFst : public MapFst<A, A, ProjectMapper<A> > {
+ public:
+  typedef A Arc;
+  typedef ProjectMapper<A> C;
+
+  ProjectFst(const Fst<A> &fst, ProjectType project_type)
+      : MapFst<A, A, C>(fst, C(project_type)) {}
+
+  ProjectFst(const ProjectFst<A> &fst) : MapFst<A, A, C>(fst) {}
+
+  virtual ProjectFst<A> *Copy() const { return new ProjectFst(*this); }
+};
+
+
+// Specialization for ProjectFst.
+template <class A>
+class StateIterator< ProjectFst<A> >
+    : public StateIterator< MapFst<A, A, ProjectMapper<A> > > {
+ public:
+  explicit StateIterator(const ProjectFst<A> &fst)
+      : StateIterator< MapFst<A, A, ProjectMapper<A> > >(fst) {}
+};
+
+
+// Specialization for ProjectFst.
+template <class A>
+class ArcIterator< ProjectFst<A> >
+    : public ArcIterator< MapFst<A, A, ProjectMapper<A> > > {
+ public:
+  ArcIterator(const ProjectFst<A> &fst, typename A::StateId s)
+      : ArcIterator< MapFst<A, A, ProjectMapper<A> > >(fst, s) {}
+};
+
+
+// Useful alias when using StdArc.
+typedef ProjectFst<StdArc> StdProjectFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_PROJECT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/properties.cpp b/tools/thirdparty/OpenFst/fst/lib/properties.cpp
new file mode 100644
index 0000000..2c66172
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/properties.cpp
@@ -0,0 +1,340 @@
+// properties.cc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions for updating property bits for various FST operations and
+// string names of the properties.
+
+#include <vector>
+
+#include "fst/lib/properties.h"
+
+namespace fst {
+
+// These functions determine the properties associated with the FST
+// result of various finite-state operations. The property arguments
+// correspond to the operation's FST arguments. The properties
+// returned assume the operation modifies its first argument.
+// Bitwise-and this result with kCopyProperties for the case when a
+// new (possibly delayed) FST is instead constructed.
+
+// Properties for a concatenatively-closed FST.
+uint64 ClosureProperties(uint64 inprops, bool star, bool delayed) {
+  uint64 outprops = (kAcceptor | kUnweighted | kAccessible) & inprops;
+  if (!delayed)
+       outprops |= (kExpanded | kMutable | kCoAccessible |
+                    kNotTopSorted | kNotString) & inprops;
+  if (!delayed || inprops & kAccessible)
+    outprops |= (kNotAcceptor | kNonIDeterministic | kNonODeterministic |
+                 kNotILabelSorted | kNotOLabelSorted | kWeighted |
+                 kNotAccessible | kNotCoAccessible) & inprops;
+  return outprops;
+}
+
+// Properties for a complemented FST.
+uint64 ComplementProperties(uint64 inprops) {
+  uint64 outprops = kAcceptor | kUnweighted | kNoEpsilons |
+                    kNoIEpsilons | kNoOEpsilons |
+                    kIDeterministic | kODeterministic | kAccessible;
+  outprops |= (kILabelSorted | kOLabelSorted | kInitialCyclic) & inprops;
+  if (inprops & kAccessible)
+    outprops |= kNotILabelSorted | kNotOLabelSorted | kCyclic;
+  return outprops;
+}
+
+// Properties for a composed FST.
+uint64 ComposeProperties(uint64 inprops1, uint64 inprops2) {
+  uint64 outprops = kAccessible;
+  outprops |= (kAcceptor | kNoIEpsilons | kAcyclic | kInitialAcyclic) &
+              inprops1 & inprops2;
+  if ((kNoIEpsilons & inprops1 & inprops2)) {
+    outprops |= kIDeterministic & inprops1 & inprops2;
+  }
+  return outprops;
+}
+
+// Properties for a concatenated FST.
+uint64 ConcatProperties(uint64 inprops1, uint64 inprops2, bool delayed) {
+  uint64 outprops =
+    (kAcceptor | kUnweighted | kAcyclic) & inprops1 & inprops2;
+
+  bool empty1 = delayed;  // Can fst1 be the empty machine?
+  bool empty2 = delayed;  // Can fst2 be the empty machine?
+
+  if (!delayed) {
+    outprops |= (kExpanded | kMutable | kNotTopSorted | kNotString) & inprops1;
+    outprops |= (kNotTopSorted | kNotString) & inprops2;
+  }
+  if (!empty1)
+    outprops |= (kInitialAcyclic | kInitialCyclic) & inprops1;
+  if (!delayed || inprops1 & kAccessible)
+    outprops |= (kNotAcceptor | kNonIDeterministic | kNonODeterministic |
+                 kEpsilons | kIEpsilons | kOEpsilons | kNotILabelSorted |
+                 kNotOLabelSorted | kWeighted | kCyclic |
+                 kNotAccessible | kNotCoAccessible) & inprops1;
+  if ((inprops1 & (kAccessible | kCoAccessible)) ==
+      (kAccessible | kCoAccessible) && !empty1) {
+    outprops |= kAccessible & inprops2;
+    if (!empty2)
+      outprops |= kCoAccessible & inprops2;
+    if (!delayed || inprops2 & kAccessible)
+      outprops |= (kNotAcceptor | kNonIDeterministic | kNonODeterministic |
+                   kEpsilons | kIEpsilons | kOEpsilons | kNotILabelSorted |
+                   kNotOLabelSorted | kWeighted | kCyclic |
+                   kNotAccessible | kNotCoAccessible) & inprops2;
+  }
+  return outprops;
+}
+
+// Properties for a determinized FST.
+uint64 DeterminizeProperties(uint64 inprops) {
+  uint64 outprops = kIDeterministic | kAccessible;
+  outprops |= (kAcceptor | kNoEpsilons | kAcyclic |
+               kInitialAcyclic | kCoAccessible | kString) & inprops;
+  if (inprops & kAccessible)
+     outprops |= (kNotAcceptor | kEpsilons | kIEpsilons | kOEpsilons |
+                  kCyclic) & inprops;
+  if (inprops & kAcceptor)
+    outprops |= (kNoIEpsilons | kNoOEpsilons | kAccessible) & inprops;
+  return outprops;
+}
+
+// Properties for a differenced FST.
+uint64 DifferenceProperties(uint64 inprops1, uint64 inprops2) {
+  return IntersectProperties(inprops1, ComplementProperties(inprops2));
+}
+
+// Properties for factored weight FST.
+uint64 FactorWeightProperties(uint64 inprops) {
+  uint64 outprops = (kExpanded | kMutable | kAcceptor |
+                     kAcyclic | kAccessible | kCoAccessible) & inprops;
+  if (inprops & kAccessible)
+    outprops |= (kNotAcceptor | kNonIDeterministic | kNonODeterministic |
+                 kEpsilons | kIEpsilons | kOEpsilons | kCyclic |
+                 kNotILabelSorted | kNotOLabelSorted)
+        & inprops;
+  return outprops;
+}
+
+// Properties for an intersected FST.
+uint64 IntersectProperties(uint64 inprops1, uint64 inprops2) {
+  uint64 outprops = kAcceptor | kAccessible;
+
+  outprops |= (kNoEpsilons | kNoIEpsilons | kNoOEpsilons | kAcyclic |
+               kInitialAcyclic) & inprops1 & inprops2;
+
+  if ((kNoIEpsilons & inprops1 & inprops2))
+    outprops |= (kIDeterministic | kODeterministic) & inprops1 & inprops2;
+  return outprops;
+}
+
+// Properties for an inverted FST.
+uint64 InvertProperties(uint64 inprops) {
+  uint64 outprops = (kExpanded | kMutable | kAcceptor | kNotAcceptor |
+                     kEpsilons | kNoEpsilons | kWeighted | kUnweighted |
+                     kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic |
+                     kTopSorted | kNotTopSorted |
+                     kAccessible | kNotAccessible |
+                     kCoAccessible | kNotCoAccessible |
+                     kString | kNotString) & inprops;
+  if (kIDeterministic & inprops)
+    outprops |= kODeterministic;
+  if (kNonIDeterministic & inprops)
+    outprops |= kNonODeterministic;
+  if (kODeterministic & inprops)
+    outprops |= kIDeterministic;
+  if (kNonODeterministic & inprops)
+    outprops |= kNonIDeterministic;
+
+  if (kIEpsilons & inprops)
+    outprops |= kOEpsilons;
+  if (kNoIEpsilons & inprops)
+    outprops |= kNoOEpsilons;
+  if (kOEpsilons & inprops)
+    outprops |= kIEpsilons;
+  if (kNoOEpsilons & inprops)
+    outprops |= kNoIEpsilons;
+
+  if (kILabelSorted & inprops)
+    outprops |= kOLabelSorted;
+  if (kNotILabelSorted & inprops)
+    outprops |= kNotOLabelSorted;
+  if (kOLabelSorted & inprops)
+    outprops |= kILabelSorted;
+  if (kNotOLabelSorted & inprops)
+    outprops |= kNotILabelSorted;
+  return outprops;
+}
+
+// Properties for a projected FST.
+uint64 ProjectProperties(uint64 inprops, bool project_input) {
+  uint64 outprops = kAcceptor;
+  outprops |= (kExpanded | kMutable | kWeighted | kUnweighted |
+               kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic |
+               kTopSorted | kNotTopSorted | kAccessible | kNotAccessible |
+               kCoAccessible | kNotCoAccessible |
+               kString | kNotString) & inprops;
+  if (project_input) {
+    outprops |= (kIDeterministic | kNonIDeterministic |
+                 kIEpsilons | kNoIEpsilons |
+                 kILabelSorted | kNotILabelSorted) & inprops;
+
+    if (kIDeterministic & inprops)
+      outprops |= kODeterministic;
+    if (kNonIDeterministic & inprops)
+      outprops |= kNonODeterministic;
+
+    if (kIEpsilons & inprops)
+      outprops |= kOEpsilons | kEpsilons;
+    if (kNoIEpsilons & inprops)
+      outprops |= kNoOEpsilons | kNoEpsilons;
+
+    if (kILabelSorted & inprops)
+      outprops |= kOLabelSorted;
+    if (kNotILabelSorted & inprops)
+      outprops |= kNotOLabelSorted;
+  } else {
+    outprops |= (kODeterministic | kNonODeterministic |
+                 kOEpsilons | kNoOEpsilons |
+                 kOLabelSorted | kNotOLabelSorted) & inprops;
+
+    if (kODeterministic & inprops)
+      outprops |= kIDeterministic;
+    if (kNonODeterministic & inprops)
+      outprops |= kNonIDeterministic;
+
+    if (kOEpsilons & inprops)
+      outprops |= kIEpsilons | kEpsilons;
+    if (kNoOEpsilons & inprops)
+      outprops |= kNoIEpsilons | kNoEpsilons;
+
+    if (kOLabelSorted & inprops)
+      outprops |= kILabelSorted;
+    if (kNotOLabelSorted & inprops)
+      outprops |= kNotILabelSorted;
+  }
+  return outprops;
+}
+
+// Properties for a replace FST.
+uint64 ReplaceProperties(const vector<uint64>& inprops) {
+  return 0;
+}
+
+// Properties for a relabeled FST.
+uint64 RelabelProperties(uint64 inprops) {
+  uint64 outprops = (kExpanded | kMutable |
+                     kWeighted | kUnweighted |
+                     kCyclic | kAcyclic |
+                     kInitialCyclic | kInitialAcyclic |
+                     kTopSorted | kNotTopSorted |
+                     kAccessible | kNotAccessible |
+                     kCoAccessible | kNotCoAccessible |
+                     kString | kNotString) & inprops;
+  return outprops;
+}
+
+// Properties for a reversed FST. (the superinitial state limits this set)
+uint64 ReverseProperties(uint64 inprops) {
+  uint64 outprops =
+    (kExpanded | kMutable | kAcceptor | kNotAcceptor | kEpsilons |
+     kIEpsilons | kOEpsilons | kWeighted | kUnweighted |
+     kCyclic | kAcyclic) & inprops;
+  return outprops;
+}
+
+// Properties for re-weighted FST.
+uint64 ReweightProperties(uint64 inprops) {
+  uint64 outprops = inprops & kWeightInvariantProperties;
+  outprops = outprops & ~kCoAccessible;
+  return outprops;
+}
+
+// Properties for an epsilon-removed FST.
+uint64 RmEpsilonProperties(uint64 inprops, bool delayed) {
+  uint64 outprops = kNoEpsilons;
+  outprops |= (kAcceptor | kAcyclic | kInitialAcyclic) & inprops;
+  if (inprops & kAcceptor)
+    outprops |= kNoIEpsilons | kNoOEpsilons;
+  if (!delayed) {
+    outprops |= kExpanded | kMutable;
+    outprops |= kTopSorted & inprops;
+  }
+  if (!delayed || inprops & kAccessible)
+    outprops |= kNotAcceptor & inprops;
+  return outprops;
+}
+
+// Properties for a synchronized FST.
+uint64 SynchronizeProperties(uint64 inprops) {
+  uint64 outprops = (kAcceptor | kAcyclic | kAccessible | kCoAccessible |
+                     kUnweighted) & inprops;
+  if (inprops & kAccessible)
+    outprops |= (kCyclic | kNotCoAccessible | kWeighted) & inprops;
+  return outprops;
+}
+
+// Properties for a unioned FST.
+uint64 UnionProperties(uint64 inprops1, uint64 inprops2, bool delayed) {
+  uint64 outprops = (kAcceptor | kUnweighted | kAcyclic | kAccessible)
+                    & inprops1 & inprops2;
+  bool empty1 = delayed;  // Can fst1 be the empty machine?
+  bool empty2 = delayed;  // Can fst2 be the empty machine?
+  if (!delayed) {
+    outprops |= (kExpanded | kMutable | kNotTopSorted | kNotString) & inprops1;
+    outprops |= (kNotTopSorted | kNotString) & inprops2;
+  }
+  if (!empty1 && !empty2) {
+    outprops |= kEpsilons | kIEpsilons | kOEpsilons;
+    outprops |= kCoAccessible & inprops1 & inprops2;
+  }
+  // Note kNotCoAccessible does not hold because of kInitialAcyclic opt.
+  if (!delayed || inprops1 & kAccessible)
+    outprops |= (kNotAcceptor | kNonIDeterministic | kNonODeterministic |
+                 kEpsilons | kIEpsilons | kOEpsilons | kNotILabelSorted |
+                 kNotOLabelSorted | kWeighted | kCyclic |
+                 kNotAccessible) & inprops1;
+  if (!delayed || inprops2 & kAccessible)
+    outprops |= (kNotAcceptor | kNonIDeterministic | kNonODeterministic |
+                 kEpsilons | kIEpsilons | kOEpsilons | kNotILabelSorted |
+                 kNotOLabelSorted | kWeighted | kCyclic |
+                 kNotAccessible | kNotCoAccessible) & inprops2;
+  return outprops;
+}
+
+// Property string names (indexed by bit position).
+const char *PropertyNames[] = {
+  // binary
+  "expanded", "mutable", "", "", "", "", "", "",
+  "", "", "", "", "", "", "", "",
+  // trinary
+  "acceptor", "not acceptor",
+  "input deterministic", "non input deterministic",
+  "output deterministic", "non output deterministic",
+  "input/output epsilons", "no input/output epsilons",
+  "input epsilons", "no input epsilons",
+  "output epsilons", "no output epsilons",
+  "input label sorted", "not input label sorted",
+  "output label sorted", "not output label sorted",
+  "weighted", "unweighted",
+  "cyclic", "acyclic",
+  "cyclic at initial state", "acyclic at initial state",
+  "top sorted", "not top sorted",
+  "accessible", "not accessible",
+  "coaccessible", "not coaccessible",
+  "string", "not string",
+};
+
+}
diff --git a/tools/thirdparty/OpenFst/fst/lib/properties.h b/tools/thirdparty/OpenFst/fst/lib/properties.h
new file mode 100644
index 0000000..caa886b
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/properties.h
@@ -0,0 +1,320 @@
+// properties.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// \file
+// FST property bits.
+
+#ifndef FST_LIB_PROPERTIES_H__
+#define FST_LIB_PROPERTIES_H__
+
+#include "fst/lib/compat.h"
+
+namespace fst {
+
+// The property bits here assert facts about an FST. If individual
+// bits are added, then the composite properties below, the property
+// functions and property names in properties.cc, and
+// TestProperties() in test-properties.h should be updated.
+
+//
+// BINARY PROPERTIES
+//
+// For each property below, there is a single bit. If it is set,
+// the property is true. If it is not set, the property is false.
+//
+
+// The Fst is an ExpandedFst
+const uint64 kExpanded =          0x0000000000000001ULL;
+
+// The Fst is a MutableFst
+const uint64 kMutable =           0x0000000000000002ULL;
+
+//
+// TRINARY PROPERTIES
+//
+// For each of these properties below there is a pair of property bits
+// - one positive and one negative. If the positive bit is set, the
+// property is true. If the negative bit is set, the property is
+// false. If neither is set, the property has unknown value. Both
+// should never be simultaneously set. The individual positive and
+// negative bit pairs should be adjacent with the positive bit
+// at an odd and lower position.
+
+// ilabel == olabel for each arc
+const uint64 kAcceptor =          0x0000000000010000ULL;
+// ilabel != olabel for some arc
+const uint64 kNotAcceptor =       0x0000000000020000ULL;
+
+// ilabels unique leaving each state
+const uint64 kIDeterministic =    0x0000000000040000ULL;
+// ilabels not unique leaving some state
+const uint64 kNonIDeterministic = 0x0000000000080000ULL;
+
+// olabels unique leaving each state
+const uint64 kODeterministic =    0x0000000000100000ULL;
+// olabels not unique leaving some state
+const uint64 kNonODeterministic = 0x0000000000200000ULL;
+
+// FST has input/output epsilons
+const uint64 kEpsilons =          0x0000000000400000ULL;
+// FST has no input/output epsilons
+const uint64 kNoEpsilons =        0x0000000000800000ULL;
+
+// FST has input epsilons
+const uint64 kIEpsilons =         0x0000000001000000ULL;
+// FST has no input epsilons
+const uint64 kNoIEpsilons =       0x0000000002000000ULL;
+
+// FST has output epsilons
+const uint64 kOEpsilons =         0x0000000004000000ULL;
+// FST has no output epsilons
+const uint64 kNoOEpsilons =       0x0000000008000000ULL;
+
+// ilabels sorted wrt < for each state
+const uint64 kILabelSorted =      0x0000000010000000ULL;
+// ilabels not sorted wrt < for some state
+const uint64 kNotILabelSorted =   0x0000000020000000ULL;
+
+// olabels sorted wrt < for each state
+const uint64 kOLabelSorted =      0x0000000040000000ULL;
+// olabels not sorted wrt < for some state
+const uint64 kNotOLabelSorted =   0x0000000080000000ULL;
+
+// Non-trivial arc or final weights
+const uint64 kWeighted =          0x0000000100000000ULL;
+// Only trivial arc and final weights
+const uint64 kUnweighted =        0x0000000200000000ULL;
+
+// FST has cycles
+const uint64 kCyclic =            0x0000000400000000ULL;
+// FST has no cycles
+const uint64 kAcyclic =           0x0000000800000000ULL;
+
+// FST has cycles containing the initial state
+const uint64 kInitialCyclic =     0x0000001000000000ULL;
+// FST has no cycles containing the initial state
+const uint64 kInitialAcyclic =    0x0000002000000000ULL;
+
+// FST is topologically sorted
+const uint64 kTopSorted =         0x0000004000000000ULL;
+// FST is not topologically sorted
+const uint64 kNotTopSorted =      0x0000008000000000ULL;
+
+// All states reachable from the initial state
+const uint64 kAccessible =        0x0000010000000000ULL;
+// Not all states reachable from the initial state
+const uint64 kNotAccessible =     0x0000020000000000ULL;
+
+// All states can reach a final state
+const uint64 kCoAccessible =      0x0000040000000000ULL;
+// Not all states can reach a final state
+const uint64 kNotCoAccessible =   0x0000080000000000ULL;
+
+// If NumStates() > 0, then state 0 is initial, state NumStates()-1 is
+// final, there is a transition from each non-final state i to
+// state i+1, and there are no other transitions.
+const uint64 kString =            0x0000100000000000ULL;
+
+// Not a string FST
+const uint64 kNotString =         0x0000200000000000ULL;
+
+//
+// COMPOSITE PROPERTIES
+//
+
+// Properties of an empty machine
+
+const uint64 kNullProperties
+  = kAcceptor | kIDeterministic | kODeterministic | kNoEpsilons |
+    kNoIEpsilons | kNoOEpsilons | kILabelSorted | kOLabelSorted |
+    kUnweighted | kAcyclic | kInitialAcyclic | kTopSorted |
+    kAccessible | kCoAccessible | kString;
+
+// Properties that are preserved when an FST is copied
+const uint64 kCopyProperties
+  = kAcceptor | kNotAcceptor | kIDeterministic | kNonIDeterministic |
+    kODeterministic | kNonODeterministic | kEpsilons | kNoEpsilons |
+    kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
+    kILabelSorted | kNotILabelSorted | kOLabelSorted |
+    kNotOLabelSorted | kWeighted | kUnweighted | kCyclic | kAcyclic |
+    kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted |
+    kAccessible | kNotAccessible | kCoAccessible | kNotCoAccessible |
+    kString | kNotString;
+
+// Properties that are preserved when an FST start state is set
+const uint64 kSetStartProperties
+  = kExpanded | kMutable | kAcceptor | kNotAcceptor | kIDeterministic |
+    kNonIDeterministic | kODeterministic | kNonODeterministic |
+    kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons |
+    kNoOEpsilons | kILabelSorted | kNotILabelSorted | kOLabelSorted |
+    kNotOLabelSorted | kWeighted | kUnweighted | kCyclic | kAcyclic |
+    kTopSorted | kNotTopSorted | kCoAccessible | kNotCoAccessible;
+
+// Properties that are preserved when an FST final weight is set
+const uint64 kSetFinalProperties
+  = kExpanded | kMutable | kAcceptor | kNotAcceptor | kIDeterministic |
+    kNonIDeterministic | kODeterministic | kNonODeterministic |
+    kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons |
+    kNoOEpsilons | kILabelSorted | kNotILabelSorted | kOLabelSorted |
+    kNotOLabelSorted | kCyclic | kAcyclic | kInitialCyclic |
+    kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible |
+    kNotAccessible;
+
+// Properties that are preserved when an FST state is added
+const uint64 kAddStateProperties
+  = kExpanded | kMutable | kAcceptor | kNotAcceptor | kIDeterministic |
+    kNonIDeterministic | kODeterministic | kNonODeterministic |
+    kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons |
+    kNoOEpsilons | kILabelSorted | kNotILabelSorted | kOLabelSorted |
+    kNotOLabelSorted | kWeighted | kUnweighted | kCyclic | kAcyclic |
+    kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted |
+    kNotAccessible | kNotCoAccessible | kNotString;
+
+// Properties that are preserved when an FST arc is added
+const uint64 kAddArcProperties = kExpanded | kMutable | kNotAcceptor |
+    kNonIDeterministic | kNonODeterministic | kEpsilons | kIEpsilons |
+    kOEpsilons | kNotILabelSorted | kNotOLabelSorted | kWeighted |
+    kCyclic | kInitialCyclic | kNotTopSorted | kAccessible | kCoAccessible;
+
+// Properties that are preserved when an FST arc is set
+const uint64 kSetArcProperties = kExpanded | kMutable;
+
+// Properties that are preserved when FST states are deleted
+const uint64 kDeleteStatesProperties
+  = kExpanded | kMutable | kAcceptor | kIDeterministic |
+    kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons |
+    kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic |
+    kInitialAcyclic | kTopSorted;
+
+// Properties that are preserved when FST arcs are deleted
+const uint64 kDeleteArcsProperties
+  = kExpanded | kMutable | kAcceptor | kIDeterministic |
+    kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons |
+    kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic |
+    kInitialAcyclic | kTopSorted |  kNotAccessible | kNotCoAccessible;
+
+// Properties that are preserved when an FST's states are reordered
+const uint64 kStateSortProperties = kExpanded | kMutable | kAcceptor |
+  kNotAcceptor | kIDeterministic | kNonIDeterministic |
+  kODeterministic | kNonODeterministic | kEpsilons | kNoEpsilons |
+  kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
+  kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted
+  | kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
+  kInitialAcyclic | kAccessible | kNotAccessible | kCoAccessible |
+  kNotCoAccessible;
+
+// Properties that are preserved when an FST's arcs are reordered
+const uint64 kArcSortProperties =
+  kExpanded | kMutable | kAcceptor | kNotAcceptor | kIDeterministic |
+  kNonIDeterministic | kODeterministic | kNonODeterministic |
+  kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons |
+  kNoOEpsilons | kWeighted | kUnweighted | kCyclic | kAcyclic |
+  kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted |
+  kAccessible | kNotAccessible | kCoAccessible | kNotCoAccessible |
+  kString | kNotString;
+
+// Properties that are preserved when an FST's input labels are changed.
+const uint64 kILabelInvariantProperties =
+  kExpanded | kMutable | kODeterministic | kNonODeterministic |
+  kOEpsilons | kNoOEpsilons | kOLabelSorted | kNotOLabelSorted |
+  kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
+  kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible |
+  kNotAccessible | kCoAccessible | kNotCoAccessible | kString | kNotString;
+
+// Properties that are preserved when an FST's output labels are changed.
+const uint64 kOLabelInvariantProperties =
+  kExpanded | kMutable | kIDeterministic | kNonIDeterministic |
+  kIEpsilons | kNoIEpsilons | kILabelSorted | kNotILabelSorted |
+  kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
+  kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible |
+  kNotAccessible | kCoAccessible | kNotCoAccessible | kString | kNotString;
+
+// Properties that are preserved when an FST's weights are changed.
+// This assumes that the set of states that are non-final is not changed.
+const uint64 kWeightInvariantProperties =
+  kExpanded | kMutable | kAcceptor | kNotAcceptor | kIDeterministic |
+  kNonIDeterministic | kODeterministic | kNonODeterministic |
+  kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons |
+  kNoOEpsilons | kILabelSorted | kNotILabelSorted | kOLabelSorted |
+  kNotOLabelSorted | kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic |
+  kTopSorted | kNotTopSorted | kAccessible | kNotAccessible | kCoAccessible |
+  kNotCoAccessible | kString | kNotString;
+
+// Properties that are preserved when a superfinal state is added
+// and an FSTs final weights are directed to it via new transitions.
+const uint64 kAddSuperFinalProperties  = kExpanded | kMutable | kAcceptor |
+  kNotAcceptor | kNonIDeterministic | kNonODeterministic | kEpsilons |
+  kIEpsilons | kOEpsilons | kNotILabelSorted | kNotOLabelSorted |
+  kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
+  kInitialAcyclic | kNotTopSorted | kNotAccessible | kCoAccessible |
+  kNotCoAccessible | kNotString;
+
+// Properties that are preserved when a superfinal state is removed
+// and the epsilon transitions directed to it are made final weights.
+const uint64 kRmSuperFinalProperties  = kExpanded | kMutable | kAcceptor |
+  kNotAcceptor | kIDeterministic | kODeterministic | kNoEpsilons |
+  kNoIEpsilons | kNoOEpsilons | kILabelSorted | kOLabelSorted |
+  kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
+  kInitialAcyclic | kTopSorted | kAccessible | kCoAccessible |
+  kNotCoAccessible | kString;
+
+// All binary properties
+const uint64 kBinaryProperties =  0x0000000000000003ULL;
+
+// All trinary properties
+const uint64 kTrinaryProperties = 0x00003fffffff0000ULL;
+
+//
+// COMPUTED PROPERTIES
+//
+
+// 1st bit of trinary properties
+const uint64 kPosTrinaryProperties =
+  kTrinaryProperties & 0x5555555555555555ULL;
+
+// 2nd bit of trinary properties
+const uint64 kNegTrinaryProperties =
+  kTrinaryProperties & 0xaaaaaaaaaaaaaaaaULL;
+
+// All properties
+const uint64 kFstProperties = kBinaryProperties | kTrinaryProperties;
+
+//
+// PROPERTY FUNCTIONS and STRING NAMES (defined in properties.cc)
+//
+
+uint64 ClosureProperties(uint64 inprops, bool star, bool delayed = false);
+uint64 ComplementProperties(uint64 inprops);
+uint64 ComposeProperties(uint64 inprops1, uint64 inprops2);
+uint64 ConcatProperties(uint64 inprops1, uint64 inprops2,
+                        bool delayed = false);
+uint64 DeterminizeProperties(uint64 inprops);
+uint64 DifferenceProperties(uint64 inprops1, uint64 inprops2);
+uint64 FactorWeightProperties(uint64 inprops);
+uint64 IntersectProperties(uint64 inprops1, uint64 inprops2);
+uint64 InvertProperties(uint64 inprops);
+uint64 ProjectProperties(uint64 inprops, bool project_input);
+uint64 RelabelProperties(uint64 inprops);
+uint64 ReplaceProperties(const vector<uint64>& inprops);
+uint64 ReverseProperties(uint64 inprops);
+uint64 ReweightProperties(uint64 inprops);
+uint64 RmEpsilonProperties(uint64 inprops, bool delayed = false);
+uint64 SynchronizeProperties(uint64 inprops);
+uint64 UnionProperties(uint64 inprops1, uint64 inprops2, bool delayed = false);
+
+extern const char *PropertyNames[];
+
+}  // namespace fst
+
+#endif  // FST_LIB_PROPERTIES_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/prune.h b/tools/thirdparty/OpenFst/fst/lib/prune.h
new file mode 100644
index 0000000..42c340e
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/prune.h
@@ -0,0 +1,247 @@
+// prune.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Functions implementing pruning.
+
+#ifndef FST_LIB_PRUNE_H__
+#define FST_LIB_PRUNE_H__
+
+#include "fst/lib/arcfilter.h"
+#include "fst/lib/shortest-distance.h"
+
+namespace fst {
+
+template <class A, class ArcFilter>
+class PruneOptions {
+ public:
+  typedef typename A::Weight Weight;
+
+  // Pruning threshold.
+  Weight threshold;
+  // Arc filter.
+  ArcFilter filter;
+  // If non-zero, passes in pre-computed shortest distance from initial state
+  // (possibly resized).
+  vector<Weight> *idistance;
+  // If non-zero, passes in pre-computed shortest distance to final states
+  // (possibly resized).
+  vector<Weight> *fdistance;
+
+  PruneOptions(const Weight& t, ArcFilter f, vector<Weight> *id = 0,
+               vector<Weight> *fd = 0)
+      : threshold(t), filter(f), idistance(id), fdistance(fd) {}
+};
+
+
+// Pruning algorithm: this version modifies its input and it takes an
+// options class as an argment. Delete states and arcs in 'fst' that
+// do not belong to a successful path whose weight is no more than
+// 'opts.threshold' Times() the weight of the shortest path. Weights
+// need to be commutative and have the path property.
+template <class Arc, class ArcFilter>
+void Prune(MutableFst<Arc> *fst,
+           const PruneOptions<Arc, ArcFilter> &opts) {
+  typedef typename Arc::Weight Weight;
+  typedef typename Arc::StateId StateId;
+
+  if ((Weight::Properties() & (kPath | kCommutative))
+      != (kPath | kCommutative))
+    LOG(FATAL) << "Prune: Weight needs to have the path property and"
+               << " be commutative: "
+               << Weight::Type();
+
+  StateId ns = fst->NumStates();
+  if (ns == 0) return;
+
+  vector<Weight> *idistance = opts.idistance;
+  vector<Weight> *fdistance = opts.fdistance;
+
+  if (!idistance) {
+    idistance = new vector<Weight>(ns, Weight::Zero());
+    ShortestDistance(*fst, idistance, false);
+  } else {
+    idistance->resize(ns, Weight::Zero());
+  }
+
+  if (!fdistance) {
+    fdistance = new vector<Weight>(ns, Weight::Zero());
+    ShortestDistance(*fst, fdistance, true);
+  } else {
+    fdistance->resize(ns, Weight::Zero());
+  }
+
+  vector<StateId> dead;
+  dead.push_back(fst->AddState());
+  NaturalLess<Weight> less;
+  Weight ceiling = Times((*fdistance)[fst->Start()], opts.threshold);
+
+  for (StateId state = 0; state < ns; ++state) {
+    if (less(ceiling, Times((*idistance)[state], (*fdistance)[state]))) {
+      dead.push_back(state);
+      continue;
+    }
+    for (MutableArcIterator< MutableFst<Arc> > it(fst, state);
+         !it.Done();
+         it.Next()) {
+      Arc arc = it.Value();
+      if (!opts.filter(arc)) continue;
+      Weight weight = Times(Times((*idistance)[state], arc.weight),
+                           (*fdistance)[arc.nextstate]);
+      if(less(ceiling, weight)) {
+        arc.nextstate = dead[0];
+        it.SetValue(arc);
+      }
+    }
+    if (less(ceiling, Times((*idistance)[state], fst->Final(state))))
+      fst->SetFinal(state, Weight::Zero());
+  }
+
+  fst->DeleteStates(dead);
+
+  if (!opts.idistance)
+    delete idistance;
+  if (!opts.fdistance)
+    delete fdistance;
+}
+
+
+// Pruning algorithm: this version modifies its input and simply takes
+// the pruning threshold as an argument. Delete states and arcs in
+// 'fst' that do not belong to a successful path whose weight is no
+// more than 'opts.threshold' Times() the weight of the shortest
+// path. Weights need to be commutative and have the path property.
+template <class Arc>
+void Prune(MutableFst<Arc> *fst, typename Arc::Weight threshold) {
+  PruneOptions<Arc, AnyArcFilter<Arc> > opts(threshold, AnyArcFilter<Arc>());
+  Prune(fst, opts);
+}
+
+
+// Pruning algorithm: this version writes the pruned input Fst to an
+// output MutableFst and it takes an options class as an argument.
+// 'ofst' contains states and arcs that belong to a successful path in
+// 'ifst' whose weight is no more than 'opts.threshold' Times() the
+// weight of the shortest path. Weights need to be commutative and
+// have the path property.
+template <class Arc, class ArcFilter>
+void Prune(const Fst<Arc> &ifst,
+           MutableFst<Arc> *ofst,
+           const PruneOptions<Arc, ArcFilter> &opts) {
+  typedef typename Arc::Weight Weight;
+  typedef typename Arc::StateId StateId;
+
+  if ((Weight::Properties() & (kPath | kCommutative))
+      != (kPath | kCommutative))
+    LOG(FATAL) << "Prune: Weight needs to have the path property and"
+               << " be commutative: "
+               << Weight::Type();
+
+  ofst->DeleteStates();
+
+  if (ifst.Start() == kNoStateId)
+    return;
+
+  vector<Weight> *idistance = opts.idistance;
+  vector<Weight> *fdistance = opts.fdistance;
+
+  if (!idistance) {
+    idistance = new vector<Weight>;
+    ShortestDistance(ifst, idistance, false);
+  }
+
+  if (!fdistance) {
+    fdistance = new vector<Weight>;
+    ShortestDistance(ifst, fdistance, true);
+  }
+
+  vector<StateId> copy;
+  NaturalLess<Weight> less;
+  while (fdistance->size() <= ifst.Start())
+    fdistance->push_back(Weight::Zero());
+  Weight ceiling = Times((*fdistance)[ifst.Start()], opts.threshold);
+
+  for (StateIterator< Fst<Arc> > sit(ifst);
+       !sit.Done();
+       sit.Next()) {
+    StateId state = sit.Value();
+    while (idistance->size() <= state)
+      idistance->push_back(Weight::Zero());
+    while (fdistance->size() <= state)
+      fdistance->push_back(Weight::Zero());
+    while (copy.size() <= state)
+      copy.push_back(kNoStateId);
+
+    if (less(ceiling, Times((*idistance)[state], (*fdistance)[state])))
+      continue;
+
+    if (copy[state] == kNoStateId)
+      copy[state] = ofst->AddState();
+    if (!less(ceiling, Times((*idistance)[state], ifst.Final(state))))
+      ofst->SetFinal(copy[state], ifst.Final(state));
+
+    for (ArcIterator< Fst<Arc> > ait(ifst, state);
+         !ait.Done();
+         ait.Next()) {
+      Arc arc = ait.Value();
+
+      if (!opts.filter(arc)) continue;
+
+      while (idistance->size() <= arc.nextstate)
+        idistance->push_back(Weight::Zero());
+      while (fdistance->size() <= arc.nextstate)
+        fdistance->push_back(Weight::Zero());
+      while (copy.size() <= arc.nextstate)
+        copy.push_back(kNoStateId);
+
+      Weight weight = Times(Times((*idistance)[state], arc.weight),
+                           (*fdistance)[arc.nextstate]);
+
+      if (!less(ceiling, weight)) {
+        if (copy[arc.nextstate] == kNoStateId)
+          copy[arc.nextstate] = ofst->AddState();
+        arc.nextstate = copy[arc.nextstate];
+        ofst->AddArc(copy[state], arc);
+      }
+    }
+  }
+
+  ofst->SetStart(copy[ifst.Start()]);
+
+  if (!opts.idistance)
+    delete idistance;
+  if (!opts.fdistance)
+    delete fdistance;
+}
+
+
+// Pruning algorithm: this version writes the pruned input Fst to an
+// output MutableFst and simply takes the pruning threshold as an
+// argument.  'ofst' contains states and arcs that belong to a
+// successful path in 'ifst' whose weight is no more than
+// 'opts.threshold' Times() the weight of the shortest path. Weights
+// need to be commutative and have the path property.
+template <class Arc>
+void Prune(const Fst<Arc> &ifst,
+           MutableFst<Arc> *ofst,
+           typename Arc::Weight threshold) {
+  PruneOptions<Arc, AnyArcFilter<Arc> > opts(threshold, AnyArcFilter<Arc>());
+  Prune(ifst, ofst, opts);
+}
+
+} // namespace fst
+
+#endif // FST_LIB_PRUNE_H_
diff --git a/tools/thirdparty/OpenFst/fst/lib/push.h b/tools/thirdparty/OpenFst/fst/lib/push.h
new file mode 100644
index 0000000..9317308
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/push.h
@@ -0,0 +1,89 @@
+// push.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Class to reweight/push an FST.
+
+#ifndef FST_LIB_PUSH_H__
+#define FST_LIB_PUSH_H__
+
+#include "fst/lib/factor-weight.h"
+#include "fst/lib/fst.h"
+#include "fst/lib/map.h"
+#include "fst/lib/reweight.h"
+#include "fst/lib/shortest-distance.h"
+
+namespace fst {
+
+// Pushes the weights in FST in the direction defined by TYPE.  If
+// pushing towards the initial state, the sum of the weight of the
+// outgoing transitions and final weight at a non-initial state is
+// equal to One() in the resulting machine.  If pushing towards the
+// final state, the same property holds on the reverse machine.
+//
+// Weight needs to be left distributive when pushing towards the
+// initial state and right distributive when pushing towards the final
+// states.
+template <class Arc>
+void Push(MutableFst<Arc> *fst, ReweightType type) {
+  vector<typename Arc::Weight> distance;
+  ShortestDistance(*fst, &distance, type == REWEIGHT_TO_INITIAL);
+  Reweight(fst, distance, type);
+}
+
+
+const uint32 kPushWeights = 0x0001;
+const uint32 kPushLabels =  0x0002;
+
+// OFST obtained from IFST by pushing weights and/or labels according
+// to PTYPE in the direction defined by RTYPE.  Weight needs to be
+// left distributive when pushing weights towards the initial state
+// and right distributive when pushing weights towards the final
+// states.
+template <class Arc, ReweightType rtype>
+void Push(const Fst<Arc> &ifst, MutableFst<Arc> *ofst, uint32 ptype) {
+
+  if (ptype == kPushWeights) {
+    *ofst = ifst;
+    Push(ofst, rtype);
+  } else if (ptype & kPushLabels) {
+    const StringType stype = rtype == REWEIGHT_TO_INITIAL
+                             ? STRING_LEFT
+                             : STRING_RIGHT;
+    vector<typename GallicArc<Arc, stype>::Weight> gdistance;
+    VectorFst< GallicArc<Arc, stype> > gfst;
+    Map(ifst, &gfst, ToGallicMapper<Arc, stype>());
+    if (ptype == (kPushWeights | kPushLabels)) {
+      ShortestDistance(gfst, &gdistance, rtype == REWEIGHT_TO_INITIAL);
+    } else {
+      MapFst<Arc, Arc, RmWeightMapper<Arc> >
+        uwfst(ifst, RmWeightMapper<Arc>());
+      MapFst<Arc, GallicArc<Arc, stype>, ToGallicMapper<Arc, stype> >
+        guwfst(uwfst, ToGallicMapper<Arc, stype>());
+      ShortestDistance(guwfst, &gdistance, rtype == REWEIGHT_TO_INITIAL);
+    }
+    Reweight(&gfst, gdistance, rtype);
+    FactorWeightFst< GallicArc<Arc, stype>, GallicFactor<typename Arc::Label,
+      typename Arc::Weight, stype> > fwfst(gfst);
+    Map(fwfst, ofst, FromGallicMapper<Arc, stype>());
+  } else {
+    *ofst = ifst;
+  }
+}
+
+}  // namespace fst
+
+#endif /* FST_LIB_PUSH_H_ */
diff --git a/tools/thirdparty/OpenFst/fst/lib/queue.h b/tools/thirdparty/OpenFst/fst/lib/queue.h
new file mode 100644
index 0000000..478dfa7
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/queue.h
@@ -0,0 +1,689 @@
+// queue.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Functions and classes for various Fst state queues with
+// a unified interface.
+
+#ifndef FST_LIB_QUEUE_H__
+#define FST_LIB_QUEUE_H__
+
+#include <deque>
+#include <vector>
+
+#include "fst/lib/arcfilter.h"
+#include "fst/lib/connect.h"
+#include "fst/lib/heap.h"
+#include "fst/lib/topsort.h"
+
+namespace fst {
+
+// template <class S>
+// class Queue {
+//  public:
+//   typedef typename S StateId;
+//
+//   // Ctr: may need args (e.g., Fst, comparator) for some queues
+//   Queue(...);
+//   // Returns the head of the queue
+//   StateId Head() const;
+//   // Inserts a state
+//   void Enqueue(StateId s);
+//   // Removes the head of the queue
+//   void Dequeue();
+//   // Updates ordering of state s when weight changes, if necessary
+//   void Update(StateId s);
+//   // Does the queue contain no elements?
+//   bool Empty() const;
+//   // Remove all states from queue
+//   void Clear();
+// };
+
+// State queue types.
+enum QueueType {
+  TRIVIAL_QUEUE = 0,         // Single state queue
+  FIFO_QUEUE = 1,            // First-in, first-out queue
+  LIFO_QUEUE = 2,            // Last-in, first-out queue
+  SHORTEST_FIRST_QUEUE = 3,  // Shortest-first queue
+  TOP_ORDER_QUEUE = 4,       // Topologically-ordered queue
+  STATE_ORDER_QUEUE = 5,     // State-ID ordered queue
+  SCC_QUEUE = 6,             // Component graph top-ordered meta-queue
+  AUTO_QUEUE = 7,            // Auto-selected queue
+  OTHER_QUEUE = 8
+ };
+
+
+// QueueBase, templated on the StateId, is the base class shared by the
+// queues considered by AutoQueue.
+template <class S>
+class QueueBase {
+ public:
+  typedef S StateId;
+
+  QueueBase(QueueType type) : queue_type_(type) {}
+  virtual ~QueueBase() {}
+  StateId Head() const { return Head_(); }
+  void Enqueue(StateId s) { Enqueue_(s); }
+  void Dequeue() { Dequeue_(); }
+  void Update(StateId s) { Update_(s); }
+  bool Empty() const { return Empty_(); }
+  void Clear() { Clear_(); }
+  QueueType Type() { return queue_type_; }
+
+ private:
+  virtual StateId Head_() const = 0;
+  virtual void Enqueue_(StateId s) = 0;
+  virtual void Dequeue_() = 0;
+  virtual void Update_(StateId s) = 0;
+  virtual bool Empty_() const = 0;
+  virtual void Clear_() = 0;
+
+  QueueType queue_type_;
+};
+
+
+// Trivial queue discipline, templated on the StateId. You may enqueue
+// at most one state at a time. It is used for strongly connected components
+// with only one state and no self loops.
+template <class S>
+class TrivialQueue : public QueueBase<S> {
+public:
+  typedef S StateId;
+
+  TrivialQueue() : QueueBase<S>(TRIVIAL_QUEUE), front_(kNoStateId) {}
+  StateId Head() const { return front_; }
+  void Enqueue(StateId s) { front_ = s; }
+  void Dequeue() { front_ = kNoStateId; }
+  void Update(StateId s) {}
+  bool Empty() const { return front_ == kNoStateId; }
+  void Clear() { front_ = kNoStateId; }
+
+
+private:
+  virtual StateId Head_() const { return Head(); }
+  virtual void Enqueue_(StateId s) { Enqueue(s); }
+  virtual void Dequeue_() { Dequeue(); }
+  virtual void Update_(StateId s) { Update(s); }
+  virtual bool Empty_() const { return Empty(); }
+  virtual void Clear_() { return Clear(); }
+
+  StateId front_;
+};
+
+
+// First-in, first-out queue discipline, templated on the StateId.
+template <class S>
+class FifoQueue : public QueueBase<S>, public deque<S> {
+ public:
+  using deque<S>::back;
+  using deque<S>::push_front;
+  using deque<S>::pop_back;
+  using deque<S>::empty;
+  using deque<S>::clear;
+
+  typedef S StateId;
+
+  FifoQueue() : QueueBase<S>(FIFO_QUEUE) {}
+  StateId Head() const { return back(); }
+  void Enqueue(StateId s) { push_front(s); }
+  void Dequeue() { pop_back(); }
+  void Update(StateId s) {}
+  bool Empty() const { return empty(); }
+  void Clear() { clear(); }
+
+ private:
+  virtual StateId Head_() const { return Head(); }
+  virtual void Enqueue_(StateId s) { Enqueue(s); }
+  virtual void Dequeue_() { Dequeue(); }
+  virtual void Update_(StateId s) { Update(s); }
+  virtual bool Empty_() const { return Empty(); }
+  virtual void Clear_() { return Clear(); }
+};
+
+
+// Last-in, first-out queue discipline, templated on the StateId.
+template <class S>
+class LifoQueue : public QueueBase<S>, public deque<S> {
+ public:
+  using deque<S>::front;
+  using deque<S>::push_front;
+  using deque<S>::pop_front;
+  using deque<S>::empty;
+  using deque<S>::clear;
+
+  typedef S StateId;
+
+  LifoQueue() : QueueBase<S>(LIFO_QUEUE) {}
+  StateId Head() const { return front(); }
+  void Enqueue(StateId s) { push_front(s); }
+  void Dequeue() { pop_front(); }
+  void Update(StateId s) {}
+  bool Empty() const { return empty(); }
+  void Clear() { clear(); }
+
+ private:
+  virtual StateId Head_() const { return Head(); }
+  virtual void Enqueue_(StateId s) { Enqueue(s); }
+  virtual void Dequeue_() { Dequeue(); }
+  virtual void Update_(StateId s) { Update(s); }
+  virtual bool Empty_() const { return Empty(); }
+  virtual void Clear_() { return Clear(); }
+};
+
+
+// Shortest-first queue discipline, templated on the StateId and
+// comparison function object.  Comparison function object COMP is
+// used to compare two StateIds. If a (single) state's order changes,
+// it can be reordered in the queue with a call to Update().
+template <typename S, typename C>
+class ShortestFirstQueue : public QueueBase<S> {
+ public:
+  typedef S StateId;
+  typedef C Compare;
+
+  ShortestFirstQueue(C comp)
+      : QueueBase<S>(SHORTEST_FIRST_QUEUE), heap_(comp) {}
+
+  StateId Head() const { return heap_.Top(); }
+
+  void Enqueue(StateId s) {
+    for (StateId i = key_.size(); i <= s; ++i)
+      key_.push_back(kNoKey);
+    key_[s] = heap_.Insert(s);
+  }
+
+  void Dequeue() {
+    key_[heap_.Pop()] = kNoKey;
+  }
+
+  void Update(StateId s) {
+    if (s >= (StateId)key_.size() || key_[s] == kNoKey) {
+      Enqueue(s);
+    } else {
+      heap_.Update(key_[s], s);
+    }
+  }
+
+  bool Empty() const { return heap_.Empty(); }
+
+  void Clear() {
+    heap_.Clear();
+    key_.clear();
+  }
+
+ private:
+  Heap<S, C> heap_;
+  vector<ssize_t> key_;
+
+  virtual StateId Head_() const { return Head(); }
+  virtual void Enqueue_(StateId s) { Enqueue(s); }
+  virtual void Dequeue_() { Dequeue(); }
+  virtual void Update_(StateId s) { Update(s); }
+  virtual bool Empty_() const { return Empty(); }
+  virtual void Clear_() { return Clear(); }
+};
+
+
+// Given a vector that maps from states to weights and a Less
+// comparison function object between weights, this class defines a
+// comparison function object between states.
+template <typename S, typename L>
+class StateWeightCompare {
+ public:
+  typedef L Less;
+  typedef typename L::Weight Weight;
+  typedef S StateId;
+
+  StateWeightCompare(const vector<Weight>* weights, const L &less)
+      : weights_(weights), less_(less) {}
+
+  bool operator()(const S x, const S y) const {
+    return less_((*weights_)[x], (*weights_)[y]);
+  }
+
+ private:
+  const vector<Weight>* weights_;
+  L less_;
+};
+
+
+// Shortest-first queue discipline, templated on the StateId and Weight is
+// specialized to use the weight's natural order for the comparion function.
+template <typename S, typename W>
+class NaturalShortestFirstQueue :
+      public ShortestFirstQueue<S, StateWeightCompare<S, NaturalLess<W> > > {
+ public:
+  typedef StateWeightCompare<S, NaturalLess<W> > C;
+
+  NaturalShortestFirstQueue(vector<W> *distance) :
+      ShortestFirstQueue<S, C>(C(distance, less_)) {}
+
+ private:
+  NaturalLess<W> less_;
+};
+
+
+// Topological-order queue discipline, templated on the StateId.
+// States are ordered in the queue topologically. The FST must be acyclic.
+template <class S>
+class TopOrderQueue : public QueueBase<S> {
+ public:
+  typedef S StateId;
+
+  // This constructor computes the top. order. It accepts an arc filter
+  // to limit the transitions considered in that computation (e.g., only
+  // the epsilon graph).
+  template <class Arc, class ArcFilter>
+
+  TopOrderQueue(const Fst<Arc> &fst, ArcFilter filter)
+      : QueueBase<S>(TOP_ORDER_QUEUE), front_(0), back_(kNoStateId),
+        order_(0), state_(0) {
+    bool acyclic;
+    TopOrderVisitor<Arc> top_order_visitor(&order_, &acyclic);
+    DfsVisit(fst, &top_order_visitor, filter);
+    if (!acyclic)
+      LOG(FATAL) << "TopOrderQueue: fst is not acyclic.";
+    state_.resize(order_.size(), kNoStateId);
+  }
+
+  // This constructor is passed the top. order, useful when we know it
+  // beforehand.
+  TopOrderQueue(const vector<StateId> &order)
+      : QueueBase<S>(TOP_ORDER_QUEUE), front_(0), back_(kNoStateId),
+        order_(order), state_(order.size(), kNoStateId) {}
+
+  StateId Head() const { return state_[front_]; }
+
+  void Enqueue(StateId s) {
+    if (front_ > back_) front_ = back_ = order_[s];
+    else if (order_[s] > back_) back_ = order_[s];
+    else if (order_[s] < front_) front_ = order_[s];
+    state_[order_[s]] = s;
+  }
+
+  void Dequeue() {
+    state_[front_] = kNoStateId;
+    while ((front_ <= back_) && (state_[front_] == kNoStateId)) ++front_;
+  }
+
+  void Update(StateId s) {}
+
+  bool Empty() const { return front_ > back_; }
+
+  void Clear() {
+    for (StateId i = front_; i <= back_; ++i) state_[i] = kNoStateId;
+    back_ = kNoStateId;
+    front_ = 0;
+  }
+
+ private:
+  StateId front_;
+  StateId back_;
+  vector<StateId> order_;
+  vector<StateId> state_;
+
+  virtual StateId Head_() const { return Head(); }
+  virtual void Enqueue_(StateId s) { Enqueue(s); }
+  virtual void Dequeue_() { Dequeue(); }
+  virtual void Update_(StateId s) { Update(s); }
+  virtual bool Empty_() const { return Empty(); }
+  virtual void Clear_() { return Clear(); }
+
+};
+
+
+// State order queue discipline, templated on the StateId.
+// States are ordered in the queue by state Id.
+template <class S>
+class StateOrderQueue : public QueueBase<S> {
+public:
+  typedef S StateId;
+
+  StateOrderQueue()
+      : QueueBase<S>(STATE_ORDER_QUEUE), front_(0), back_(kNoStateId) {}
+
+  StateId Head() const { return front_; }
+
+  void Enqueue(StateId s) {
+    if (front_ > back_) front_ = back_ = s;
+    else if (s > back_) back_ = s;
+    else if (s < front_) front_ = s;
+    while ((StateId)enqueued_.size() <= s) enqueued_.push_back(false); 
+    enqueued_[s] = true;
+  }
+
+  void Dequeue() {
+    enqueued_[front_] = false;
+    while ((front_ <= back_) && (enqueued_[front_] == false)) ++front_;
+  }
+
+  void Update(StateId s) {}
+
+  bool Empty() const { return front_ > back_; }
+
+  void Clear() {
+        for (StateId i = front_; i <= back_; ++i) enqueued_[i] = false;
+        front_ = 0;
+        back_ = kNoStateId;
+  }
+
+private:
+  StateId front_;
+  StateId back_;
+  vector<bool> enqueued_;
+
+  virtual StateId Head_() const { return Head(); }
+  virtual void Enqueue_(StateId s) { Enqueue(s); }
+  virtual void Dequeue_() { Dequeue(); }
+  virtual void Update_(StateId s) { Update(s); }
+  virtual bool Empty_() const { return Empty(); }
+  virtual void Clear_() { return Clear(); }
+
+};
+
+
+// SCC topological-order meta-queue discipline, templated on the StateId S
+// and a queue Q, which is used inside each SCC.  It visits the SCC's
+// of an FST in topological order. Its constructor is passed the queues to
+// to use within an SCC.
+template <class S, class Q>
+class SccQueue : public QueueBase<S> {
+ public:
+  typedef S StateId;
+  typedef Q Queue;
+
+  // Constructor takes a vector specifying the SCC number per state
+  // and a vector giving the queue to use per SCC number.
+  SccQueue(const vector<StateId> &scc, vector<Queue*> *queue)
+    : QueueBase<S>(SCC_QUEUE), queue_(queue), scc_(scc), front_(0),
+      back_(kNoStateId) {}
+
+  StateId Head() const {
+    while ((front_ <= back_) && 
+           (((*queue_)[front_] && (*queue_)[front_]->Empty())
+            || (((*queue_)[front_] == 0) &&
+                ((front_ > (StateId)trivial_queue_.size())
+                 || (trivial_queue_[front_] == kNoStateId)))))
+      ++front_;
+    if (front_ > back_)
+      LOG(FATAL) << "SccQueue: head of empty queue";
+    if ((*queue_)[front_])
+      return (*queue_)[front_]->Head();
+    else
+      return trivial_queue_[front_];
+  }
+
+  void Enqueue(StateId s) {
+    if (front_ > back_) front_ = back_ = scc_[s];
+    else if (scc_[s] > back_) back_ = scc_[s];
+    else if (scc_[s] < front_) front_ = scc_[s];
+    if ((*queue_)[scc_[s]]) {
+      (*queue_)[scc_[s]]->Enqueue(s);
+    } else {
+      while ( (StateId)trivial_queue_.size() <= scc_[s]) 
+        trivial_queue_.push_back(kNoStateId);
+      trivial_queue_[scc_[s]] = s;
+    }
+  }
+
+  void Dequeue() {
+    if (front_ > back_)
+      LOG(FATAL) << "SccQueue: dequeue of empty queue";
+    if ((*queue_)[front_])
+      (*queue_)[front_]->Dequeue();
+    else if (front_ < (StateId)trivial_queue_.size()) 
+      trivial_queue_[front_] = kNoStateId;
+  }
+
+  void Update(StateId s) {
+    if ((*queue_)[scc_[s]])
+      (*queue_)[scc_[s]]->Update(s);
+  }
+
+  bool Empty() const {
+    if (front_ < back_)   // Queue scc # back_ not empty unless back_==front_
+      return false;
+    else if (front_ > back_)
+      return true;
+    else if ((*queue_)[front_])
+      return (*queue_)[front_]->Empty();
+    else
+      return (front_ > (StateId)trivial_queue_.size())
+        || (trivial_queue_[front_] == kNoStateId);
+  }
+
+  void Clear() {
+    for (StateId i = front_; i <= back_; ++i)
+      if ((*queue_)[i])
+        (*queue_)[i]->Clear();
+      else if (i < (StateId)trivial_queue_.size()) 
+        trivial_queue_[i] = kNoStateId;
+    front_ = 0;
+    back_ = kNoStateId;
+  }
+
+private:
+  vector<Queue*> *queue_;
+  const vector<StateId> &scc_;
+  mutable StateId front_;
+  StateId back_;
+  vector<StateId> trivial_queue_;
+
+  virtual StateId Head_() const { return Head(); }
+  virtual void Enqueue_(StateId s) { Enqueue(s); }
+  virtual void Dequeue_() { Dequeue(); }
+  virtual void Update_(StateId s) { Update(s); }
+  virtual bool Empty_() const { return Empty(); }
+  virtual void Clear_() { return Clear(); }
+};
+
+
+// Automatic queue discipline, templated on the StateId. It selects a
+// queue discipline for a given FST based on its properties.
+template <class S>
+class AutoQueue : public QueueBase<S> {
+public:
+  typedef S StateId;
+
+  // This constructor takes a state distance vector that, if non-null and if
+  // the Weight type has the path property, will entertain the
+  // shortest-first queue using the natural order w.r.t to the distance.
+  template <class Arc, class ArcFilter>
+  AutoQueue(const Fst<Arc> &fst, const vector<typename Arc::Weight> *distance,
+            ArcFilter filter) : QueueBase<S>(AUTO_QUEUE) {
+    typedef typename Arc::Weight Weight;
+    typedef StateWeightCompare< StateId, NaturalLess<Weight> > Compare;
+
+    //  First check if the FST is known to have these properties.
+    uint64 props = fst.Properties(kAcyclic | kCyclic |
+                                  kTopSorted | kUnweighted, false);
+    if ((props & kTopSorted) || fst.Start() == kNoStateId) {
+      queue_ = new StateOrderQueue<StateId>();
+      VLOG(2) << "AutoQueue: using state-order discipline";
+    } else if (props & kAcyclic) {
+      queue_ = new TopOrderQueue<StateId>(fst, filter);
+      VLOG(2) << "AutoQueue: using top-order discipline";
+    } else if ((props & kUnweighted) && (Weight::Properties() & kIdempotent)) {
+      queue_ = new LifoQueue<StateId>();
+      VLOG(2) << "AutoQueue: using LIFO discipline";
+    } else {
+      uint64 props;
+      // Decompose into strongly-connected components.
+      SccVisitor<Arc> scc_visitor(&scc_, 0, 0, &props);
+      DfsVisit(fst, &scc_visitor, filter);
+      StateId nscc = *max_element(scc_.begin(), scc_.end()) + 1;
+      vector<QueueType> queue_types(nscc);
+      NaturalLess<Weight> *less = 0;
+      Compare *comp = 0;
+      if (distance && (Weight::Properties() & kPath)) {
+        less = new NaturalLess<Weight>;
+        comp = new Compare(distance, *less);
+      }
+      // Find the queue type to use per SCC.
+      bool unweighted;
+      bool all_trivial;
+      SccQueueType(fst, scc_, &queue_types, filter, less, &all_trivial,
+                                      &unweighted);
+      // If unweighted and semiring is idempotent, use lifo queue.
+      if (unweighted) {
+          queue_ = new LifoQueue<StateId>();
+          VLOG(2) << "AutoQueue: using LIFO discipline";
+          delete comp;
+          delete less;
+          return;
+      }
+      // If all the scc are trivial, FST is acyclic and the scc# gives
+      // the topological order.
+      if (all_trivial) {
+          queue_ = new TopOrderQueue<StateId>(scc_);
+          VLOG(2) << "AutoQueue: using top-order discipline";
+          delete comp;
+          delete less;
+          return;
+      }
+      VLOG(2) << "AutoQueue: using SCC meta-discipline";
+      queues_.resize(nscc);
+      for (StateId i = 0; i < nscc; ++i) {
+        switch(queue_types[i]) {
+          case TRIVIAL_QUEUE:
+            queues_[i] = 0;
+            VLOG(3) << "AutoQueue: SCC #" << i
+                    << ": using trivial discipline";
+            break;
+          case SHORTEST_FIRST_QUEUE:
+            CHECK(comp);
+            queues_[i] = new ShortestFirstQueue<StateId, Compare>(*comp);
+            VLOG(3) << "AutoQueue: SCC #" << i <<
+              ": using shortest-first discipline";
+            break;
+          case LIFO_QUEUE:
+            queues_[i] = new LifoQueue<StateId>();
+            VLOG(3) << "AutoQueue: SCC #" << i
+                    << ": using LIFO disciplle";
+            break;
+          case FIFO_QUEUE:
+          default:
+            queues_[i] = new FifoQueue<StateId>();
+            VLOG(3) << "AutoQueue: SCC #" << i
+                    << ": using FIFO disciplle";
+            break;
+        }
+      }
+      queue_ = new SccQueue< StateId, QueueBase<StateId> >(scc_, &queues_);
+      delete comp;
+      delete less;
+    }
+  }
+
+  ~AutoQueue() {
+    for (StateId i = 0; i < (StateId)queues_.size(); ++i) /*naucen-edit*/
+      delete queues_[i];
+    delete queue_;
+  }
+
+  StateId Head() const { return queue_->Head(); }
+
+  void Enqueue(StateId s) { queue_->Enqueue(s); }
+
+  void Dequeue() { queue_->Dequeue(); }
+
+  void Update(StateId s) { queue_->Update(s); }
+
+  bool Empty() const { return queue_->Empty(); }
+
+  void Clear() { queue_->Clear(); }
+
+
+ private:
+  QueueBase<StateId> *queue_;
+  vector< QueueBase<StateId>* > queues_;
+  vector<StateId> scc_;
+
+  template <class Arc, class ArcFilter, class Less>
+  static void SccQueueType(const Fst<Arc> &fst,
+                           const vector<StateId> &scc,
+                           vector<QueueType> *queue_types,
+                           ArcFilter filter, Less *less,
+                           bool *all_trivial, bool *unweighted);
+
+  virtual StateId Head_() const { return Head(); }
+
+  virtual void Enqueue_(StateId s) { Enqueue(s); }
+
+  virtual void Dequeue_() { Dequeue(); }
+
+  virtual void Update_(StateId s) { Update(s); }
+
+  virtual bool Empty_() const { return Empty(); }
+
+  virtual void Clear_() { return Clear(); }
+};
+
+
+// Examines the states in an Fst's strongly connected components and
+// determines which type of queue to use per SCC. Stores result in
+// vector QUEUE_TYPES, which is assumed to have length equal to the
+// number of SCCs. An arc filter is used to limit the transitions
+// considered (e.g., only the epsilon graph).  ALL_TRIVIAL is set
+// to true if every queue is the trivial queue. UNWEIGHTED is set to
+// true if the semiring is idempotent and all the arc weights are equal to
+// Zero() or One().
+template <class StateId>
+template <class A, class ArcFilter, class Less>
+void AutoQueue<StateId>::SccQueueType(const Fst<A> &fst,
+                                      const vector<StateId> &scc,
+                                      vector<QueueType> *queue_type,
+                                      ArcFilter filter, Less *less,
+                                      bool *all_trivial, bool *unweighted) {
+  typedef A Arc;
+  typedef typename A::StateId StateId;
+  typedef typename A::Weight Weight;
+
+  *all_trivial = true;
+  *unweighted = true;
+
+  for (StateId i = 0; i < (StateId)queue_type->size(); ++i)
+    (*queue_type)[i] = TRIVIAL_QUEUE;
+
+  for (StateIterator< Fst<Arc> > sit(fst); !sit.Done(); sit.Next()) {
+    StateId state = sit.Value();
+    for (ArcIterator< Fst<Arc> > ait(fst, state);
+	 !ait.Done();
+	 ait.Next()) {
+      const Arc &arc = ait.Value();
+      if (!filter(arc)) continue;
+      if (scc[state] == scc[arc.nextstate]) {
+        QueueType &type = (*queue_type)[scc[state]];
+        if (!less || ((*less)(arc.weight, Weight::One())))
+          type = FIFO_QUEUE;
+        else if ((type == TRIVIAL_QUEUE) || (type == LIFO_QUEUE))
+          if (!(Weight::Properties() & kIdempotent) ||
+              (arc.weight != Weight::Zero() && arc.weight != Weight::One()))
+            type = SHORTEST_FIRST_QUEUE;
+          else
+            type = LIFO_QUEUE;
+        if (type != TRIVIAL_QUEUE) *all_trivial = false;
+      }
+      if (!(Weight::Properties() & kIdempotent) ||
+          (arc.weight != Weight::Zero() && arc.weight != Weight::One()))
+        *unweighted = false;
+    }
+  }
+}
+
+}  // namespace fst
+
+#endif
diff --git a/tools/thirdparty/OpenFst/fst/lib/randgen.h b/tools/thirdparty/OpenFst/fst/lib/randgen.h
new file mode 100644
index 0000000..7ccbed8
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/randgen.h
@@ -0,0 +1,169 @@
+// randgen.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Function to generate random paths through an FST.
+
+#ifndef FST_LIB_RANDGEN_H__
+#define FST_LIB_RANDGEN_H__
+
+#include <cmath>
+#include <cstdlib>
+#include <ctime>
+
+#include "fst/lib/mutable-fst.h"
+
+namespace fst {
+
+//
+// ARC SELECTORS - these function objects are used to select a random
+// transition to take from an FST's state. They should return a number
+// N s.t. 0 <= N <= NumArcs(). If N < NumArcs(), then the N-th
+// transition is selected. If N == NumArcs(), then the final weight at
+// that state is selected (i.e., the 'super-final' transition is selected).
+// It can be assumed these will not be called unless either there
+// are transitions leaving the state and/or the state is final.
+//
+
+// Randomly selects a transition using the uniform distribution.
+template <class A>
+struct UniformArcSelector {
+  typedef typename A::StateId StateId;
+  typedef typename A::Weight Weight;
+
+  UniformArcSelector(int seed = time(0)) { srand(seed); }
+
+  size_t operator()(const Fst<A> &fst, StateId s) const {
+    double r = rand()/(RAND_MAX + 1.0);
+    size_t n = fst.NumArcs(s);
+    if (fst.Final(s) != Weight::Zero())
+      ++n;
+    return static_cast<size_t>(r * n);
+  }
+};
+
+// Randomly selects a transition w.r.t. the weights treated as negative
+// log probabilities after normalizing for the total weight leaving
+// the state). Weight::zero transitions are disregarded.
+// Assumes Weight::Value() accesses the floating point
+// representation of the weight.
+template <class A>
+struct LogProbArcSelector {
+  typedef typename A::StateId StateId;
+  typedef typename A::Weight Weight;
+
+  LogProbArcSelector(int seed = time(0)) { srand(seed); }
+
+  size_t operator()(const Fst<A> &fst, StateId s) const {
+    // Find total weight leaving state
+    double sum = 0.0;
+    for (ArcIterator< Fst<A> > aiter(fst, s); !aiter.Done();
+         aiter.Next()) {
+      const A &arc = aiter.Value();
+      sum += exp(-arc.weight.Value());
+    }
+    sum += exp(-fst.Final(s).Value());
+
+    double r = rand()/(RAND_MAX + 1.0);
+    double p = 0.0;
+    int n = 0;
+    for (ArcIterator< Fst<A> > aiter(fst, s); !aiter.Done();
+         aiter.Next(), ++n) {
+      const A &arc = aiter.Value();
+      p += exp(-arc.weight.Value());
+      if (p > r * sum) return n;
+    }
+    return n;
+  }
+};
+
+// Convenience definitions
+typedef LogProbArcSelector<StdArc> StdArcSelector;
+typedef LogProbArcSelector<LogArc> LogArcSelector;
+
+
+// Options for random path generation.
+template <class S>
+struct RandGenOptions {
+  const S &arc_selector;  // How an arc is selected at a state
+  int max_length;         // Maximum path length
+  size_t npath;           // # of paths to generate
+
+  // These are used internally by RandGen
+  int64 source;           // 'ifst' state to expand
+  int64 dest;             // 'ofst' state to append
+
+  RandGenOptions(const S &sel, int len = INT_MAX, size_t n = 1)
+    : arc_selector(sel), max_length(len), npath(n),
+       source(kNoStateId), dest(kNoStateId) {}
+};
+
+
+// Randomly generate paths through an FST; details controlled by
+// RandGenOptions.
+template<class Arc, class ArcSelector>
+void RandGen(const Fst<Arc> &ifst, MutableFst<Arc> *ofst,
+	     const RandGenOptions<ArcSelector> &opts) {
+  typedef typename Arc::Weight Weight;
+
+  if (opts.npath == 0 || opts.max_length == 0 || ifst.Start() == kNoStateId)
+    return;
+
+  if (opts.source == kNoStateId) {   // first call
+    ofst->DeleteStates();
+    ofst->SetInputSymbols(ifst.InputSymbols());
+    ofst->SetOutputSymbols(ifst.OutputSymbols());
+    ofst->SetStart(ofst->AddState());
+    RandGenOptions<ArcSelector> nopts(opts);
+    nopts.source = ifst.Start();
+    nopts.dest = ofst->Start();
+    for (; nopts.npath > 0; --nopts.npath)
+      RandGen(ifst, ofst, nopts);
+  } else {
+    if (ifst.NumArcs(opts.source) == 0 &&
+	ifst.Final(opts.source) == Weight::Zero())  // Non-coaccessible
+      return;
+    // Pick a random transition from the source state
+    size_t n = opts.arc_selector(ifst, opts.source);
+    if (n == ifst.NumArcs(opts.source)) {  // Take 'super-final' transition
+      ofst->SetFinal(opts.dest, Weight::One());
+    } else {
+      ArcIterator< Fst<Arc> > aiter(ifst, opts.source);
+      aiter.Seek(n);
+      const Arc &iarc = aiter.Value();
+      Arc oarc(iarc.ilabel, iarc.olabel, Weight::One(), ofst->AddState());
+      ofst->AddArc(opts.dest, oarc);
+
+      RandGenOptions<ArcSelector> nopts(opts);
+      nopts.source = iarc.nextstate;
+      nopts.dest = oarc.nextstate;
+      --nopts.max_length;
+      RandGen(ifst, ofst, nopts);
+    }
+  }
+}
+
+// Randomly generate a path through an FST with the uniform distribution
+// over the transitions.
+template<class Arc>
+void RandGen(const Fst<Arc> &ifst, MutableFst<Arc> *ofst) {
+  UniformArcSelector<Arc> uniform_selector;
+  RandGenOptions< UniformArcSelector<Arc> > opts(uniform_selector);
+  RandGen(ifst, ofst, opts);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_RANDGEN_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/random-weight.h b/tools/thirdparty/OpenFst/fst/lib/random-weight.h
new file mode 100644
index 0000000..f7834e9
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/random-weight.h
@@ -0,0 +1,164 @@
+// random-weight.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Function objects to generate random weights in various semirings
+// for testing purposes.
+
+#ifndef FST_LIB_RANDOM_WEIGHT_H__
+#define FST_LIB_RANDOM_WEIGHT_H__
+
+#include <cstdlib>
+#include <ctime>
+
+#include "fst/lib/float-weight.h"
+#include "fst/lib/product-weight.h"
+#include "fst/lib/string-weight.h"
+
+namespace fst {
+
+// The boolean 'allow_zero' below determines whether Zero() and zero
+// divisors should be returned in the random weight generation.
+
+// This function object returns TropicalWeights that are random integers
+// chosen from [0, kNumRandomWeights).
+class TropicalWeightGenerator {
+ public:
+  typedef TropicalWeight Weight;
+
+  TropicalWeightGenerator(int seed = time(0), bool allow_zero = true)
+      : allow_zero_(allow_zero) {
+    srand(seed);
+  }
+
+  Weight operator() () const {
+    int n = rand() % (kNumRandomWeights + allow_zero_);
+    if (allow_zero_ && n == kNumRandomWeights)
+      return Weight::Zero();
+
+    return Weight(static_cast<float>(n));
+  }
+
+ private:
+  // The number of alternative random weights.
+  static const int kNumRandomWeights = 5;
+
+  bool allow_zero_;  // permit Zero() and zero divisors
+};
+
+
+// This function object returns LogWeights that are random integers
+// chosen from [0, kNumRandomWeights).
+class LogWeightGenerator {
+ public:
+  typedef LogWeight Weight;
+
+  LogWeightGenerator(int seed = time(0), bool allow_zero = true)
+      : allow_zero_(allow_zero) {
+    srand(seed);
+  }
+
+  Weight operator() () const {
+    int n = rand() % (kNumRandomWeights + allow_zero_);
+    if (allow_zero_ && n == kNumRandomWeights)
+      return Weight::Zero();
+
+    return Weight(static_cast<float>(n));
+  }
+
+ private:
+  // Number of alternative random weights.
+  static const int kNumRandomWeights = 5;
+
+  bool allow_zero_;  // permit Zero() and zero divisors
+};
+
+
+// This function object returns StringWeights that are random integer
+// strings chosen from {1,...,kAlphabetSize}^{0,kMaxStringLength} U { Zero }
+template <typename L, StringType S = STRING_LEFT>
+class StringWeightGenerator {
+ public:
+  typedef StringWeight<L, S> Weight;
+
+  StringWeightGenerator(int seed = time(0), bool allow_zero = true)
+      : allow_zero_(allow_zero) {
+     srand(seed);
+  }
+
+  Weight operator() () const {
+    int n = rand() % (kMaxStringLength + allow_zero_);
+    if (allow_zero_ && n == kMaxStringLength)
+      return Weight::Zero();
+
+    vector<L> v;
+    for (int i = 0; i < n; ++i)
+      v.push_back(rand() % kAlphabetSize + 1);
+    return Weight(v.begin(), v.end());
+  }
+
+ private:
+  // Alphabet size for random weights.
+  static const int kAlphabetSize = 5;
+  // Number of alternative random weights.
+  static const int kMaxStringLength = 5;
+
+  bool allow_zero_;  // permit Zero() and zero divisors
+};
+
+
+// This function object returns a weight generator over the product of the
+// weights for the generators G1 and G2.
+template <class G1, class G2>
+class ProductWeightGenerator {
+ public:
+  typedef typename G1::Weight W1;
+  typedef typename G2::Weight W2;
+  typedef ProductWeight<W1, W2> Weight;
+
+  ProductWeightGenerator(int seed = time(0), bool allow_zero = true)
+      : generator1_(seed, allow_zero), generator2_(seed, allow_zero) {}
+
+  Weight operator() () const {
+    W1 w1 = generator1_();
+    W2 w2 = generator2_();
+    return Weight(w1, w2);
+  }
+
+ private:
+  G1 generator1_;
+  G2 generator2_;
+};
+
+// Product generator of a string weight generator and an
+// arbitrary weight generator.
+template <class L, class G, StringType S = STRING_LEFT>
+class GallicWeightGenerator
+    : public ProductWeightGenerator<StringWeightGenerator<L, S>, G> {
+
+ public:
+  typedef ProductWeightGenerator<StringWeightGenerator<L, S>, G> PG;
+  typedef typename G::Weight W;
+  typedef GallicWeight<L, W, S> Weight;
+
+  GallicWeightGenerator(int seed = time(0), bool allow_zero = true)
+      : PG(seed, allow_zero) {}
+
+  GallicWeightGenerator(const PG &pg) : PG(pg) {}
+};
+
+}  // namespace fst;
+
+#endif  // FST_LIB_RANDOM_WEIGHT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/rational.h b/tools/thirdparty/OpenFst/fst/lib/rational.h
new file mode 100644
index 0000000..7a2f765
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/rational.h
@@ -0,0 +1,286 @@
+// rational.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// An Fst implementation and base interface for delayed unions,
+// concatenations and closures.
+
+#ifndef FST_LIB_RATIONAL_H__
+#define FST_LIB_RATIONAL_H__
+
+#include "fst/lib/map.h"
+#include "fst/lib/mutable-fst.h"
+#include "fst/lib/replace.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+typedef CacheOptions RationalFstOptions;
+
+// This specifies whether to add the empty string.
+enum ClosureType { CLOSURE_STAR = 0,    // T* -> add the empty string
+                   CLOSURE_PLUS = 1 };  // T+ -> don't add the empty string
+
+template <class A> class RationalFst;
+template <class A> void Union(RationalFst<A> *fst1, const Fst<A> &fst2);
+template <class A> void Concat(RationalFst<A> *fst1, const Fst<A> &fst2);
+template <class A> void Closure(RationalFst<A> *fst, ClosureType closure_type);
+
+
+// Implementation class for delayed unions, concatenations and closures.
+template<class A>
+class RationalFstImpl : public ReplaceFstImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+  using ReplaceFstImpl<A>::SetRoot;
+
+  typedef typename A::Weight Weight;
+  typedef typename A::Label Label;
+
+  explicit RationalFstImpl(const RationalFstOptions &opts)
+      : ReplaceFstImpl<A>(ReplaceFstOptions(opts, kNoLabel)),
+        nonterminals_(0) {
+    SetType("rational");
+  }
+
+  // Implementation of UnionFst(fst1,fst2)
+  void InitUnion(const Fst<A> &fst1, const Fst<A> &fst2) {
+    uint64 props1 = fst1.Properties(kFstProperties, false);
+    uint64 props2 = fst2.Properties(kFstProperties, false);
+    SetInputSymbols(fst1.InputSymbols());
+    SetOutputSymbols(fst1.OutputSymbols());
+    rfst_.AddState();
+    rfst_.AddState();
+    rfst_.SetStart(0);
+    rfst_.SetFinal(1, Weight::One());
+    rfst_.SetInputSymbols(fst1.InputSymbols());
+    rfst_.SetOutputSymbols(fst1.OutputSymbols());
+    nonterminals_ = 2;
+    rfst_.AddArc(0, A(0, -1, Weight::One(), 1));
+    rfst_.AddArc(0, A(0, -2, Weight::One(), 1));
+    AddFst(0, &rfst_);
+    AddFst(-1, &fst1);
+    AddFst(-2, &fst2);
+    SetRoot(0);
+    SetProperties(UnionProperties(props1, props2, true), kCopyProperties);
+  }
+
+  // Implementation of ConcatFst(fst1,fst2)
+  void InitConcat(const Fst<A> &fst1, const Fst<A> &fst2) {
+    uint64 props1 = fst1.Properties(kFstProperties, false);
+    uint64 props2 = fst2.Properties(kFstProperties, false);
+    SetInputSymbols(fst1.InputSymbols());
+    SetOutputSymbols(fst1.OutputSymbols());
+    rfst_.AddState();
+    rfst_.AddState();
+    rfst_.AddState();
+    rfst_.SetStart(0);
+    rfst_.SetFinal(2, Weight::One());
+    rfst_.SetInputSymbols(fst1.InputSymbols());
+    rfst_.SetOutputSymbols(fst1.OutputSymbols());
+    nonterminals_ = 2;
+    rfst_.AddArc(0, A(0, -1, Weight::One(), 1));
+    rfst_.AddArc(1, A(0, -2, Weight::One(), 2));
+    AddFst(0, &rfst_);
+    AddFst(-1, &fst1);
+    AddFst(-2, &fst2);
+    SetRoot(0);
+    SetProperties(ConcatProperties(props1, props2, true), kCopyProperties);
+  }
+
+  // Implementation of ClosureFst(fst, closure_type)
+  void InitClosure(const Fst<A> &fst, ClosureType closure_type) {
+    uint64 props = fst.Properties(kFstProperties, false);
+    SetInputSymbols(fst.InputSymbols());
+    SetOutputSymbols(fst.OutputSymbols());
+    if (closure_type == CLOSURE_STAR) {
+      rfst_.AddState();
+      rfst_.SetStart(0);
+      rfst_.SetFinal(0, Weight::One());
+      rfst_.AddArc(0, A(0, -1, Weight::One(), 0));
+    } else {
+      rfst_.AddState();
+      rfst_.AddState();
+      rfst_.SetStart(0);
+      rfst_.SetFinal(1, Weight::One());
+      rfst_.AddArc(0, A(0, -1, Weight::One(), 1));
+      rfst_.AddArc(1, A(0, 0, Weight::One(), 0));
+    }
+    rfst_.SetInputSymbols(fst.InputSymbols());
+    rfst_.SetOutputSymbols(fst.OutputSymbols());
+    AddFst(0, &rfst_);
+    AddFst(-1, &fst);
+    SetRoot(0);
+    nonterminals_ = 1;
+    SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR, true),
+                  kCopyProperties);
+  }
+
+  // Implementation of Union(Fst &, RationalFst *)
+  void AddUnion(const Fst<A> &fst) {
+    uint64 props1 = Properties();
+    uint64 props2 = fst.Properties(kFstProperties, false);
+    VectorFst<A> afst;
+    afst.AddState();
+    afst.AddState();
+    afst.SetStart(0);
+    afst.SetFinal(1, Weight::One());
+    afst.AddArc(0, A(0, -nonterminals_, Weight::One(), 1));
+    Union(&rfst_, afst);
+    SetFst(0, &rfst_);
+    ++nonterminals_;
+    SetProperties(UnionProperties(props1, props2, true), kCopyProperties);
+  }
+
+  // Implementation of Concat(Fst &, RationalFst *)
+  void AddConcat(const Fst<A> &fst) {
+    uint64 props1 = Properties();
+    uint64 props2 = fst.Properties(kFstProperties, false);
+    VectorFst<A> afst;
+    afst.AddState();
+    afst.AddState();
+    afst.SetStart(0);
+    afst.SetFinal(1, Weight::One());
+    afst.AddArc(0, A(0, -nonterminals_, Weight::One(), 1));
+    Concat(&rfst_, afst);
+    SetFst(0, &rfst_);
+    ++nonterminals_;
+    SetProperties(ConcatProperties(props1, props2, true), kCopyProperties);
+  }
+
+  // Implementation of Closure(RationalFst *, closure_type)
+  void AddClosure(ClosureType closure_type) {
+    uint64 props = Properties();
+    Closure(&rfst_, closure_type);
+    SetFst(0, &rfst_);
+    SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR, true),
+                  kCopyProperties);
+  }
+
+ private:
+  VectorFst<A> rfst_;   // rational topology machine; uses neg. nonterminals
+  Label nonterminals_;  // # of nonterminals used
+
+  DISALLOW_EVIL_CONSTRUCTORS(RationalFstImpl);
+};
+
+// Parent class for the delayed rational operations - delayed union,
+// concatenation, and closure.  This class attaches interface to
+// implementation and handles reference counting.
+template <class A>
+class RationalFst : public Fst<A> {
+ public:
+  friend class CacheStateIterator< RationalFst<A> >;
+  friend class ArcIterator< RationalFst<A> >;
+  friend class CacheArcIterator< RationalFst<A> >;
+  friend void Union<>(RationalFst<A> *fst1, const Fst<A> &fst2);
+  friend void Concat<>(RationalFst<A> *fst1, const Fst<A> &fst2);
+  friend void Closure<>(RationalFst<A> *fst, ClosureType closure_type);
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  virtual StateId Start() const { return impl_->Start(); }
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+  virtual const string& Type() const { return impl_->Type(); }
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual inline void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+ protected:
+  RationalFst() : impl_(new RationalFstImpl<A>(RationalFstOptions())) {}
+  explicit RationalFst(const RationalFstOptions &opts)
+      : impl_(new RationalFstImpl<A>(opts)) {}
+
+
+  RationalFst(const RationalFst<A> &fst) : impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~RationalFst() { if (!impl_->DecrRefCount()) delete impl_; }
+
+  RationalFstImpl<A> *Impl() { return impl_; }
+
+ private:
+  RationalFstImpl<A> *impl_;
+
+  void operator=(const RationalFst<A> &fst);  // disallow
+};
+
+// Specialization for RationalFst.
+template <class A>
+class StateIterator< RationalFst<A> >
+    : public CacheStateIterator< RationalFst<A> > {
+ public:
+  explicit StateIterator(const RationalFst<A> &fst)
+      : CacheStateIterator< RationalFst<A> >(fst) {}
+};
+
+// Specialization for RationalFst.
+template <class A>
+class ArcIterator< RationalFst<A> >
+    : public CacheArcIterator< RationalFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const RationalFst<A> &fst, StateId s)
+      : CacheArcIterator< RationalFst<A> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+template <class A> inline
+void RationalFst<A>::InitStateIterator(StateIteratorData<A> *data) const {
+  data->base = new StateIterator< RationalFst<A> >(*this);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_RATIONAL_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/register.h b/tools/thirdparty/OpenFst/fst/lib/register.h
new file mode 100644
index 0000000..d15f28f
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/register.h
@@ -0,0 +1,173 @@
+// fst-register.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Classes for registering derived Fsts for generic reading
+//
+
+#ifndef FST_LIB_REGISTER_H__
+#define FST_LIB_REGISTER_H__
+
+#include <map>
+
+#include <dlfcn.h>
+#include <pthread.h>
+
+#include "fst/lib/compat.h"
+
+extern "C" {
+  typedef void (*FstInitFunc)();
+}
+
+namespace fst {
+
+template <class A> class Fst;
+struct FstReadOptions;
+
+// This class holds the mapping from Fst name string to its reader
+// and converter.
+template <class A>
+class FstRegister {
+ public:
+  typedef Fst<A> *(*Reader)(istream &strm, const FstReadOptions &opts);
+  typedef Fst<A> *(*Converter)(const Fst<A> &fst);
+
+  struct Entry {
+    Reader reader;
+    Converter converter;
+    Entry() : reader(0), converter(0) {}
+  };
+
+  static FstRegister<A> *GetRegister() {
+    pthread_once(&register_init_, &FstRegister<A>::Init);
+    return register_;
+  }
+
+  const Reader GetReader(const string &type) const {
+    return GetEntry(type).reader;
+  }
+
+  const Converter GetConverter(const string &type) const {
+    return GetEntry(type).converter;
+  }
+
+  void SetEntry(const string &type, const Entry &entry) {
+    MutexLock l(register_lock_);
+    fst_table_.insert(make_pair(type, entry));
+  }
+
+ private:
+  static void Init() {
+    register_lock_ = new Mutex;
+    register_ = new FstRegister<A>;
+  }
+
+  Entry LookupEntry(const string &type) const {
+    MutexLock l(register_lock_);
+    typename map<string, Entry>::const_iterator it = fst_table_.find(type);
+    if (it != fst_table_.end())
+      return it->second;
+    else
+      return Entry();
+  }
+
+  Entry GetEntry(const string &type) const {
+#ifdef FST_DL
+    Entry entry = LookupEntry(type);
+    if (entry.reader)
+      return entry;
+    string so_file = type + "-fst.so";
+    void *handle = dlopen(so_file.c_str(), RTLD_LAZY);
+    if (handle == 0) {
+      LOG(ERROR) << "FstRegister::GetEntry: " << dlerror();
+      return entry;
+    }
+    string init_name = type + "_fst_init";
+    FstInitFunc init_func =
+        bit_cast<FstInitFunc>(dlsym(handle, init_name.c_str()));
+    if (init_func == 0) {
+      LOG(ERROR) << "FstRegister::GetEntry: " << dlerror();
+      return entry;
+    }
+    (*init_func)();
+#endif  // FST_DL
+    return LookupEntry(type);
+  }
+
+  static pthread_once_t register_init_;   // ensures only called once
+  static Mutex* register_lock_;           // multithreading lock
+  static FstRegister<A> *register_;
+
+  map<string, Entry> fst_table_;
+};
+
+template <class A>
+pthread_once_t FstRegister<A>::register_init_ = PTHREAD_ONCE_INIT;
+
+template <class A>
+Mutex *FstRegister<A>::register_lock_ = 0;
+
+template <class A>
+FstRegister<A> *FstRegister<A>::register_ = 0;
+
+// This class registers an Fst type for generic reading and creating.
+// The Fst type must have a default constructor and a copy constructor
+// from 'Fst<Arc>' for this to work.
+template <class F>
+class FstRegisterer {
+ public:
+  typedef typename F::Arc Arc;
+  typedef typename FstRegister<Arc>::Entry Entry;
+  typedef typename FstRegister<Arc>::Reader Reader;
+
+  FstRegisterer() {
+    F fst;
+    F *(*reader)(istream &strm,
+                 const FstReadOptions &opts) = &F::Read;
+    Entry entry;
+    entry.reader = reinterpret_cast<Reader>(reader);
+    entry.converter = &FstRegisterer<F>::Convert;
+    FstRegister<Arc> *registr = FstRegister<Arc>::GetRegister();
+    registr->SetEntry(fst.Type(), entry);
+  }
+
+ private:
+  static Fst<Arc> *Convert(const Fst<Arc> &fst) { return new F(fst); }
+};
+
+
+// Convenience macro to generate static FstRegisterer instance.
+#define REGISTER_FST(F, A) \
+static fst::FstRegisterer< F<A> > F ## _ ## A ## _registerer
+
+
+// Converts an fst to type 'type'.
+template <class A>
+Fst<A> *Convert(const Fst<A> &fst, const string &ftype) {
+  FstRegister<A> *registr = FstRegister<A>::GetRegister();
+  const typename FstRegister<A>::Converter
+      converter = registr->GetConverter(ftype);
+  if (!converter) {
+    string atype = A::Type();
+    LOG(ERROR) << "Fst::Convert: Unknown FST type \"" << ftype
+               << "\" (arc type = \"" << atype << "\")";
+    return 0;
+  }
+  return converter(fst);
+}
+
+}  // namespace fst;
+
+#endif  // FST_LIB_REGISTER_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/relabel.h b/tools/thirdparty/OpenFst/fst/lib/relabel.h
new file mode 100644
index 0000000..d7f5185
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/relabel.h
@@ -0,0 +1,469 @@
+// relabel.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to relabel an Fst (either on input or output)
+//
+#ifndef FST_LIB_RELABEL_H__
+#define FST_LIB_RELABEL_H__
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+
+#include "fst/lib/cache.h"
+#include "fst/lib/test-properties.h"
+
+
+namespace fst {
+
+//
+// Relabels either the input labels or output labels. The old to
+// new labels are specified using a vector of pair<Label,Label>.
+// Any label associations not specified are assumed to be identity
+// mapping.
+//
+// \param fst input fst, must be mutable
+// \param relabel_pairs vector of pairs indicating old to new mapping
+// \param relabel_flags whether to relabel input or output
+//
+template <class A>
+void Relabel(
+    MutableFst<A> *fst,
+    const vector<pair<typename A::Label, typename A::Label> >& ipairs,
+    const vector<pair<typename A::Label, typename A::Label> >& opairs) {
+  typedef typename A::StateId StateId;
+  typedef typename A::Label   Label;
+
+  uint64 props = fst->Properties(kFstProperties, false);
+
+  // construct label to label hash. Could
+  hash_map<Label, Label> input_map;
+  for (size_t i = 0; i < ipairs.size(); ++i) {
+    input_map[ipairs[i].first] = ipairs[i].second;
+  }
+
+  hash_map<Label, Label> output_map;
+  for (size_t i = 0; i < opairs.size(); ++i) {
+    output_map[opairs[i].first] = opairs[i].second;
+  }
+
+  for (StateIterator<MutableFst<A> > siter(*fst);
+       !siter.Done(); siter.Next()) {
+    StateId s = siter.Value();
+    for (MutableArcIterator<MutableFst<A> > aiter(fst, s);
+         !aiter.Done(); aiter.Next()) {
+      A arc = aiter.Value();
+
+      // relabel input
+      // only relabel if relabel pair defined
+      typename hash_map<Label, Label>::iterator it =
+        input_map.find(arc.ilabel);
+      if (it != input_map.end()) {arc.ilabel = it->second; }
+
+      // relabel output
+      it = output_map.find(arc.olabel);
+      if (it != output_map.end()) { arc.olabel = it->second; }
+
+      aiter.SetValue(arc);
+    }
+  }
+
+  fst->SetProperties(RelabelProperties(props), kFstProperties);
+}
+
+
+
+//
+// Relabels either the input labels or output labels. The old to
+// new labels mappings are specified using an input Symbol set.
+// Any label associations not specified are assumed to be identity
+// mapping.
+//
+// \param fst input fst, must be mutable
+// \param new_symbols symbol set indicating new mapping
+// \param relabel_flags whether to relabel input or output
+//
+template<class A>
+void Relabel(MutableFst<A> *fst,
+             const SymbolTable* new_isymbols,
+             const SymbolTable* new_osymbols) {
+  typedef typename A::StateId StateId;
+  typedef typename A::Label   Label;
+
+  const SymbolTable* old_isymbols = fst->InputSymbols();
+  const SymbolTable* old_osymbols = fst->OutputSymbols();
+
+  vector<pair<Label, Label> > ipairs;
+  if (old_isymbols && new_isymbols) {
+    for (SymbolTableIterator syms_iter(*old_isymbols); !syms_iter.Done();
+         syms_iter.Next()) {
+      ipairs.push_back(make_pair(syms_iter.Value(),
+                                 new_isymbols->Find(syms_iter.Symbol())));
+    }
+    fst->SetInputSymbols(new_isymbols);
+  }
+
+  vector<pair<Label, Label> > opairs;
+  if (old_osymbols && new_osymbols) {
+    for (SymbolTableIterator syms_iter(*old_osymbols); !syms_iter.Done();
+         syms_iter.Next()) {
+      opairs.push_back(make_pair(syms_iter.Value(),
+                                 new_osymbols->Find(syms_iter.Symbol())));
+    }
+    fst->SetOutputSymbols(new_osymbols);
+  }
+
+  // call relabel using vector of relabel pairs.
+  Relabel(fst, ipairs, opairs);
+}
+
+
+typedef CacheOptions RelabelFstOptions;
+
+template <class A> class RelabelFst;
+
+//
+// \class RelabelFstImpl
+// \brief Implementation for delayed relabeling
+//
+// Relabels an FST from one symbol set to another. Relabeling
+// can either be on input or output space. RelabelFst implements
+// a delayed version of the relabel. Arcs are relabeled on the fly
+// and not cached. I.e each request is recomputed.
+//
+template<class A>
+class RelabelFstImpl : public CacheImpl<A> {
+  friend class StateIterator< RelabelFst<A> >;
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+
+  using CacheImpl<A>::HasStart;
+  using CacheImpl<A>::HasArcs;
+
+  typedef typename A::Label   Label;
+  typedef typename A::Weight  Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  RelabelFstImpl(const Fst<A>& fst,
+                 const vector<pair<Label, Label> >& ipairs,
+                 const vector<pair<Label, Label> >& opairs,
+                 const RelabelFstOptions &opts)
+      : CacheImpl<A>(opts), fst_(fst.Copy()),
+        relabel_input_(false), relabel_output_(false) {
+    uint64 props = fst.Properties(kCopyProperties, false);
+    SetProperties(RelabelProperties(props));
+    SetType("relabel");
+
+    // create input label map
+    if (ipairs.size() > 0) {
+      for (size_t i = 0; i < ipairs.size(); ++i) {
+        input_map_[ipairs[i].first] = ipairs[i].second;
+      }
+      relabel_input_ = true;
+    }
+
+    // create output label map
+    if (opairs.size() > 0) {
+      for (size_t i = 0; i < opairs.size(); ++i) {
+        output_map_[opairs[i].first] = opairs[i].second;
+      }
+      relabel_output_ = true;
+    }
+  }
+
+  RelabelFstImpl(const Fst<A>& fst,
+                 const SymbolTable* new_isymbols,
+                 const SymbolTable* new_osymbols,
+                 const RelabelFstOptions &opts)
+      : CacheImpl<A>(opts), fst_(fst.Copy()),
+        relabel_input_(false), relabel_output_(false) {
+    SetType("relabel");
+
+    uint64 props = fst.Properties(kCopyProperties, false);
+    SetProperties(RelabelProperties(props));
+    SetInputSymbols(fst.InputSymbols());
+    SetOutputSymbols(fst.OutputSymbols());
+
+    const SymbolTable* old_isymbols = fst.InputSymbols();
+    const SymbolTable* old_osymbols = fst.OutputSymbols();
+
+    if (old_isymbols && new_isymbols &&
+        old_isymbols->CheckSum() != new_isymbols->CheckSum()) {
+      for (SymbolTableIterator syms_iter(*old_isymbols); !syms_iter.Done();
+           syms_iter.Next()) {
+        input_map_[syms_iter.Value()] = new_isymbols->Find(syms_iter.Symbol());
+      }
+      SetInputSymbols(new_isymbols);
+      relabel_input_ = true;
+    }
+
+    if (old_osymbols && new_osymbols &&
+        old_osymbols->CheckSum() != new_osymbols->CheckSum()) {
+      for (SymbolTableIterator syms_iter(*old_osymbols); !syms_iter.Done();
+           syms_iter.Next()) {
+        output_map_[syms_iter.Value()] =
+          new_osymbols->Find(syms_iter.Symbol());
+      }
+      SetOutputSymbols(new_osymbols);
+      relabel_output_ = true;
+    }
+  }
+
+  ~RelabelFstImpl() { delete fst_; }
+
+  StateId Start() {
+    if (!HasStart()) {
+      StateId s = fst_->Start();
+      SetStart(s);
+    }
+    return CacheImpl<A>::Start();
+  }
+
+  Weight Final(StateId s) {
+    if (!HasFinal(s)) {
+      SetFinal(s, fst_->Final(s));
+    }
+    return CacheImpl<A>::Final(s);
+  }
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s)) {
+      Expand(s);
+    }
+    return CacheImpl<A>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s)) {
+      Expand(s);
+    }
+    return CacheImpl<A>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s)) {
+      Expand(s);
+    }
+    return CacheImpl<A>::NumOutputEpsilons(s);
+  }
+
+  void InitArcIterator(StateId s, ArcIteratorData<A>* data) {
+    if (!HasArcs(s)) {
+      Expand(s);
+    }
+    CacheImpl<A>::InitArcIterator(s, data);
+  }
+
+  void Expand(StateId s) {
+    for (ArcIterator<Fst<A> > aiter(*fst_, s); !aiter.Done(); aiter.Next()) {
+      A arc = aiter.Value();
+
+      // relabel input
+      if (relabel_input_) {
+        typename hash_map<Label, Label>::iterator it =
+          input_map_.find(arc.ilabel);
+        if (it != input_map_.end()) { arc.ilabel = it->second; }
+      }
+
+      // relabel output
+      if (relabel_output_) {
+        typename hash_map<Label, Label>::iterator it =
+          output_map_.find(arc.olabel);
+        if (it != output_map_.end()) { arc.olabel = it->second; }
+      }
+
+      AddArc(s, arc);
+    }
+    SetArcs(s);
+  }
+
+
+ private:
+  const Fst<A> *fst_;
+
+  hash_map<Label, Label> input_map_;
+  hash_map<Label, Label> output_map_;
+  bool relabel_input_;
+  bool relabel_output_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(RelabelFstImpl);
+};
+
+
+//
+// \class RelabelFst
+// \brief Delayed implementation of arc relabeling
+//
+// This class attaches interface to implementation and handles
+// reference counting.
+template <class A>
+class RelabelFst : public Fst<A> {
+ public:
+  friend class ArcIterator< RelabelFst<A> >;
+  friend class StateIterator< RelabelFst<A> >;
+  friend class CacheArcIterator< RelabelFst<A> >;
+
+  typedef A Arc;
+  typedef typename A::Label   Label;
+  typedef typename A::Weight  Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  RelabelFst(const Fst<A>& fst,
+             const vector<pair<Label, Label> >& ipairs,
+             const vector<pair<Label, Label> >& opairs) :
+      impl_(new RelabelFstImpl<A>(fst, ipairs, opairs, RelabelFstOptions())) {}
+
+  RelabelFst(const Fst<A>& fst,
+             const vector<pair<Label, Label> >& ipairs,
+             const vector<pair<Label, Label> >& opairs,
+             const RelabelFstOptions &opts)
+      : impl_(new RelabelFstImpl<A>(fst, ipairs, opairs, opts)) {}
+
+  RelabelFst(const Fst<A>& fst,
+             const SymbolTable* new_isymbols,
+             const SymbolTable* new_osymbols) :
+      impl_(new RelabelFstImpl<A>(fst, new_isymbols, new_osymbols,
+                                  RelabelFstOptions())) {}
+
+  RelabelFst(const Fst<A>& fst,
+             const SymbolTable* new_isymbols,
+             const SymbolTable* new_osymbols,
+             const RelabelFstOptions &opts)
+    : impl_(new RelabelFstImpl<A>(fst, new_isymbols, new_osymbols, opts)) {}
+
+  RelabelFst(const RelabelFst<A> &fst) : impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~RelabelFst() { if (!impl_->DecrRefCount()) delete impl_;  }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual RelabelFst<A> *Copy() const {
+    return new RelabelFst<A>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    return impl_->InitArcIterator(s, data);
+  }
+
+ private:
+  RelabelFstImpl<A> *impl_;
+
+  void operator=(const RelabelFst<A> &fst);  // disallow
+};
+
+// Specialization for RelabelFst.
+template<class A>
+class StateIterator< RelabelFst<A> > : public StateIteratorBase<A> {
+ public:
+  typedef typename A::StateId StateId;
+
+  explicit StateIterator(const RelabelFst<A> &fst)
+      : impl_(fst.impl_), siter_(*impl_->fst_), s_(0) {}
+
+  bool Done() const { return siter_.Done(); }
+
+  StateId Value() const { return s_; }
+
+  void Next() {
+    if (!siter_.Done()) {
+      ++s_;
+      siter_.Next();
+    }
+  }
+
+  void Reset() {
+    s_ = 0;
+    siter_.Reset();
+  }
+
+ private:
+  const RelabelFstImpl<A> *impl_;
+  StateIterator< Fst<A> > siter_;
+  StateId s_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(StateIterator);
+};
+
+
+// Specialization for RelabelFst.
+template <class A>
+class ArcIterator< RelabelFst<A> >
+    : public CacheArcIterator< RelabelFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const RelabelFst<A> &fst, StateId s)
+      : CacheArcIterator< RelabelFst<A> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+template <class A> inline
+void RelabelFst<A>::InitStateIterator(StateIteratorData<A> *data) const {
+  data->base = new StateIterator< RelabelFst<A> >(*this);
+}
+
+// Useful alias when using StdArc.
+typedef RelabelFst<StdArc> StdRelabelFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_RELABEL_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/replace.h b/tools/thirdparty/OpenFst/fst/lib/replace.h
new file mode 100644
index 0000000..4b8622e
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/replace.h
@@ -0,0 +1,683 @@
+// replace.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes for the recursive replacement of Fsts.
+//
+
+#ifndef FST_LIB_REPLACE_H__
+#define FST_LIB_REPLACE_H__
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+
+#include "fst/lib/fst.h"
+#include "fst/lib/cache.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+// By default ReplaceFst will copy the input label of the 'replace arc'.
+// For acceptors we do not want this behaviour. Instead we need to
+// create an epsilon arc when recursing into the appropriate Fst.
+// The epsilon_on_replace option can be used to toggle this behaviour.
+struct ReplaceFstOptions : CacheOptions {
+  int64 root;    // root rule for expansion
+  bool  epsilon_on_replace;
+
+  ReplaceFstOptions(const CacheOptions &opts, int64 r)
+      : CacheOptions(opts), root(r), epsilon_on_replace(false) {}
+  explicit ReplaceFstOptions(int64 r)
+      : root(r), epsilon_on_replace(false) {}
+  ReplaceFstOptions(int64 r, bool epsilon_replace_arc)
+      : root(r), epsilon_on_replace(epsilon_replace_arc) {}
+  ReplaceFstOptions()
+      : root(kNoLabel), epsilon_on_replace(false) {}
+};
+
+//
+// \class ReplaceFstImpl
+// \brief Implementation class for replace class Fst
+//
+// The replace implementation class supports a dynamic
+// expansion of a recursive transition network represented as Fst
+// with dynamic replacable arcs.
+//
+template <class A>
+class ReplaceFstImpl : public CacheImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+  using FstImpl<A>::InputSymbols;
+  using FstImpl<A>::OutputSymbols;
+
+  using CacheImpl<A>::HasStart;
+  using CacheImpl<A>::HasArcs;
+  using CacheImpl<A>::SetStart;
+
+  typedef typename A::Label   Label;
+  typedef typename A::Weight  Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+  typedef A Arc;
+  typedef hash_map<Label, Label> NonTerminalHash;
+
+
+  // \struct StateTuple
+  // \brief Tuple of information that uniquely defines a state
+  struct StateTuple {
+    typedef int PrefixId;
+
+    StateTuple() {}
+    StateTuple(PrefixId p, StateId f, StateId s) :
+        prefix_id(p), fst_id(f), fst_state(s) {}
+
+    PrefixId prefix_id;  // index in prefix table
+    StateId fst_id;      // current fst being walked
+    StateId fst_state;   // current state in fst being walked, not to be
+                         // confused with the state_id of the combined fst
+  };
+
+  // constructor for replace class implementation.
+  // \param fst_tuples array of label/fst tuples, one for each non-terminal
+  ReplaceFstImpl(const vector< pair<Label, const Fst<A>* > >& fst_tuples,
+                 const ReplaceFstOptions &opts)
+      : CacheImpl<A>(opts), opts_(opts) {
+    SetType("replace");
+    if (fst_tuples.size() > 0) {
+      SetInputSymbols(fst_tuples[0].second->InputSymbols());
+      SetOutputSymbols(fst_tuples[0].second->OutputSymbols());
+    }
+
+    fst_array_.push_back(0);
+    for (size_t i = 0; i < fst_tuples.size(); ++i)
+      AddFst(fst_tuples[i].first, fst_tuples[i].second);
+
+    SetRoot(opts.root);
+  }
+
+  explicit ReplaceFstImpl(const ReplaceFstOptions &opts)
+      : CacheImpl<A>(opts), opts_(opts), root_(kNoLabel) {
+    fst_array_.push_back(0);
+  }
+
+  ReplaceFstImpl(const ReplaceFstImpl& impl)
+      : opts_(impl.opts_), state_tuples_(impl.state_tuples_),
+        state_hash_(impl.state_hash_),
+        prefix_hash_(impl.prefix_hash_),
+        stackprefix_array_(impl.stackprefix_array_),
+        nonterminal_hash_(impl.nonterminal_hash_),
+        root_(impl.root_) {
+    SetType("replace");
+    SetProperties(impl.Properties(), kCopyProperties);
+    SetInputSymbols(InputSymbols());
+    SetOutputSymbols(OutputSymbols());
+    fst_array_.reserve(impl.fst_array_.size());
+    fst_array_.push_back(0);
+    for (size_t i = 1; i < impl.fst_array_.size(); ++i)
+      fst_array_.push_back(impl.fst_array_[i]->Copy());
+  }
+
+  ~ReplaceFstImpl() {
+    for (size_t i = 1; i < fst_array_.size(); ++i) {
+      delete fst_array_[i];
+    }
+  }
+
+  // Add to Fst array
+  void AddFst(Label label, const Fst<A>* fst) {
+    nonterminal_hash_[label] = fst_array_.size();
+    fst_array_.push_back(fst->Copy());
+    if (fst_array_.size() > 1) {
+      vector<uint64> inprops(fst_array_.size());
+
+      for (size_t i = 1; i < fst_array_.size(); ++i) {
+        inprops[i] = fst_array_[i]->Properties(kCopyProperties, false);
+      }
+      SetProperties(ReplaceProperties(inprops));
+
+      const SymbolTable* isymbols = fst_array_[1]->InputSymbols();
+      const SymbolTable* osymbols = fst_array_[1]->OutputSymbols();
+      for (size_t i = 2; i < fst_array_.size(); ++i) {
+        if (!CompatSymbols(isymbols, fst_array_[i]->InputSymbols())) {
+          LOG(FATAL) << "ReplaceFst::AddFst input symbols of Fst " << i-1
+                     << " does not match input symbols of base Fst (0'th fst)";
+        }
+        if (!CompatSymbols(osymbols, fst_array_[i]->OutputSymbols())) {
+          LOG(FATAL) << "ReplaceFst::AddFst output symbols of Fst " << i-1
+                     << " does not match output symbols of base Fst "
+                     << "(0'th fst)";
+        }
+      }
+    }
+  }
+
+  // Computes the dependency graph of the replace class and returns
+  // true if the dependencies are cyclic. Cyclic dependencies will result
+  // in an un-expandable replace fst.
+  bool CyclicDependencies() const {
+    StdVectorFst depfst;
+
+    // one state for each fst
+    for (size_t i = 1; i < fst_array_.size(); ++i)
+      depfst.AddState();
+
+    // an arc from each state (representing the fst) to the
+    // state representing the fst being replaced
+    for (size_t i = 1; i < fst_array_.size(); ++i) {
+      for (StateIterator<Fst<A> > siter(*(fst_array_[i]));
+           !siter.Done(); siter.Next()) {
+        for (ArcIterator<Fst<A> > aiter(*(fst_array_[i]), siter.Value());
+             !aiter.Done(); aiter.Next()) {
+          const A& arc = aiter.Value();
+
+          typename NonTerminalHash::const_iterator it =
+              nonterminal_hash_.find(arc.olabel);
+          if (it != nonterminal_hash_.end()) {
+            Label j = it->second - 1;
+            depfst.AddArc(i - 1, A(arc.olabel, arc.olabel, Weight::One(), j));
+          }
+        }
+      }
+    }
+
+    depfst.SetStart(root_ - 1);
+    depfst.SetFinal(root_ - 1, Weight::One());
+    return depfst.Properties(kCyclic, true);
+  }
+
+  // set root rule for expansion
+  void SetRoot(Label root) {
+    Label nonterminal = nonterminal_hash_[root];
+    root_ = (nonterminal > 0) ? nonterminal : 1;
+  }
+
+  // Change Fst array
+  void SetFst(Label label, const Fst<A>* fst) {
+    Label nonterminal = nonterminal_hash_[label];
+    delete fst_array_[nonterminal];
+    fst_array_[nonterminal] = fst->Copy();
+  }
+
+  // Return or compute start state of replace fst
+  StateId Start() {
+    if (!HasStart()) {
+      if (fst_array_.size() == 1) {      // no fsts defined for replace
+        SetStart(kNoStateId);
+        return kNoStateId;
+      } else {
+        const Fst<A>* fst = fst_array_[root_];
+        StateId fst_start = fst->Start();
+        if (fst_start == kNoStateId)  // root Fst is empty
+          return kNoStateId;
+
+        int prefix = PrefixId(StackPrefix());
+        StateId start = FindState(StateTuple(prefix, root_, fst_start));
+        SetStart(start);
+        return start;
+      }
+    } else {
+      return CacheImpl<A>::Start();
+    }
+  }
+
+  // return final weight of state (kInfWeight means state is not final)
+  Weight Final(StateId s) {
+    if (!HasFinal(s)) {
+      const StateTuple& tuple  = state_tuples_[s];
+      const StackPrefix& stack = stackprefix_array_[tuple.prefix_id];
+      const Fst<A>* fst = fst_array_[tuple.fst_id];
+      StateId fst_state = tuple.fst_state;
+
+      if (fst->Final(fst_state) != Weight::Zero() && stack.Depth() == 0)
+        SetFinal(s, fst->Final(fst_state));
+      else
+        SetFinal(s, Weight::Zero());
+    }
+    return CacheImpl<A>::Final(s);
+  }
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumOutputEpsilons(s);
+  }
+
+  // return the base arc iterator, if arcs have not been computed yet,
+  // extend/recurse for new arcs.
+  void InitArcIterator(StateId s, ArcIteratorData<A> *data) {
+    if (!HasArcs(s))
+      Expand(s);
+    CacheImpl<A>::InitArcIterator(s, data);
+  }
+
+  // Find/create an Fst state given a StateTuple.  Only create a new
+  // state if StateTuple is not found in the state hash.
+  StateId FindState(const StateTuple& tuple) {
+    typename StateTupleHash::iterator it = state_hash_.find(tuple);
+    if (it == state_hash_.end()) {
+      StateId new_state_id = state_tuples_.size();
+      state_tuples_.push_back(tuple);
+      state_hash_[tuple] = new_state_id;
+      return new_state_id;
+    } else {
+      return it->second;
+    }
+  }
+
+  // extend current state (walk arcs one level deep)
+  void Expand(StateId s) {
+    StateTuple tuple  = state_tuples_[s];
+    const Fst<A>* fst = fst_array_[tuple.fst_id];
+    StateId fst_state = tuple.fst_state;
+    if (fst_state == kNoStateId) {
+      SetArcs(s);
+      return;
+    }
+
+    // if state is final, pop up stack
+    const StackPrefix& stack = stackprefix_array_[tuple.prefix_id];
+    if (fst->Final(fst_state) != Weight::Zero() && stack.Depth()) {
+      int prefix_id = PopPrefix(stack);
+      const PrefixTuple& top = stack.Top();
+
+      StateId nextstate =
+        FindState(StateTuple(prefix_id, top.fst_id, top.nextstate));
+      AddArc(s, A(0, 0, fst->Final(fst_state), nextstate));
+    }
+
+    // extend arcs leaving the state
+    for (ArcIterator< Fst<A> > aiter(*fst, fst_state);
+         !aiter.Done(); aiter.Next()) {
+      const Arc& arc = aiter.Value();
+      if (arc.olabel == 0) {  // expand local fst
+        StateId nextstate =
+          FindState(StateTuple(tuple.prefix_id, tuple.fst_id, arc.nextstate));
+        AddArc(s, A(arc.ilabel, arc.olabel, arc.weight, nextstate));
+      } else {
+        // check for non terminal
+        typename NonTerminalHash::const_iterator it =
+            nonterminal_hash_.find(arc.olabel);
+        if (it != nonterminal_hash_.end()) {  // recurse into non terminal
+          Label nonterminal = it->second;
+          const Fst<A>* nt_fst = fst_array_[nonterminal];
+          int nt_prefix = PushPrefix(stackprefix_array_[tuple.prefix_id],
+                                     tuple.fst_id, arc.nextstate);
+
+          // if start state is valid replace, else arc is implicitly
+          // deleted
+          StateId nt_start = nt_fst->Start();
+          if (nt_start != kNoStateId) {
+            StateId nt_nextstate = FindState(
+                StateTuple(nt_prefix, nonterminal, nt_start));
+            Label ilabel = (opts_.epsilon_on_replace) ? 0 : arc.ilabel;
+            AddArc(s, A(ilabel, 0, arc.weight, nt_nextstate));
+          }
+        } else {
+          StateId nextstate =
+            FindState(
+                StateTuple(tuple.prefix_id, tuple.fst_id, arc.nextstate));
+          AddArc(s, A(arc.ilabel, arc.olabel, arc.weight, nextstate));
+        }
+      }
+    }
+
+    SetArcs(s);
+  }
+
+
+  // private helper classes
+ private:
+  static const int kPrime0 = 7853;
+  static const int kPrime1 = 7867;
+
+  // \class StateTupleEqual
+  // \brief Compare two StateTuples for equality
+  class StateTupleEqual {
+   public:
+    bool operator()(const StateTuple& x, const StateTuple& y) const {
+      return ((x.prefix_id == y.prefix_id) && (x.fst_id == y.fst_id) &&
+              (x.fst_state == y.fst_state));
+    }
+  };
+
+  // \class StateTupleKey
+  // \brief Hash function for StateTuple to Fst states
+  class StateTupleKey {
+   public:
+    size_t operator()(const StateTuple& x) const {
+      return static_cast<size_t>(x.prefix_id +
+                                 x.fst_id * kPrime0 +
+                                 x.fst_state * kPrime1);
+    }
+  };
+
+  typedef hash_map<StateTuple, StateId, StateTupleKey, StateTupleEqual>
+  StateTupleHash;
+
+  // \class PrefixTuple
+  // \brief Tuple of fst_id and destination state (entry in stack prefix)
+  struct PrefixTuple {
+    PrefixTuple(Label f, StateId s) : fst_id(f), nextstate(s) {}
+
+    Label   fst_id;
+    StateId nextstate;
+  };
+
+  // \class StackPrefix
+  // \brief Container for stack prefix.
+  class StackPrefix {
+   public:
+    StackPrefix() {}
+
+    // copy constructor
+    StackPrefix(const StackPrefix& x) :
+        prefix_(x.prefix_) {
+    }
+
+    void Push(int fst_id, StateId nextstate) {
+      prefix_.push_back(PrefixTuple(fst_id, nextstate));
+    }
+
+    void Pop() {
+      prefix_.pop_back();
+    }
+
+    const PrefixTuple& Top() const {
+      return prefix_[prefix_.size()-1];
+    }
+
+    size_t Depth() const {
+      return prefix_.size();
+    }
+
+   public:
+    vector<PrefixTuple> prefix_;
+  };
+
+
+  // \class StackPrefixEqual
+  // \brief Compare two stack prefix classes for equality
+  class StackPrefixEqual {
+   public:
+    bool operator()(const StackPrefix& x, const StackPrefix& y) const {
+      if (x.prefix_.size() != y.prefix_.size()) return false;
+      for (size_t i = 0; i < x.prefix_.size(); ++i) {
+        if (x.prefix_[i].fst_id    != y.prefix_[i].fst_id ||
+           x.prefix_[i].nextstate != y.prefix_[i].nextstate) return false;
+      }
+      return true;
+    }
+  };
+
+  //
+  // \class StackPrefixKey
+  // \brief Hash function for stack prefix to prefix id
+  class StackPrefixKey {
+   public:
+    size_t operator()(const StackPrefix& x) const {
+      int sum = 0;
+      for (size_t i = 0; i < x.prefix_.size(); ++i) {
+        sum += x.prefix_[i].fst_id + x.prefix_[i].nextstate*kPrime0;
+      }
+      return (size_t) sum;
+    }
+  };
+
+  typedef hash_map<StackPrefix, int, StackPrefixKey, StackPrefixEqual>
+  StackPrefixHash;
+
+  // private methods
+ private:
+  // hash stack prefix (return unique index into stackprefix array)
+  int PrefixId(const StackPrefix& prefix) {
+    typename StackPrefixHash::iterator it = prefix_hash_.find(prefix);
+    if (it == prefix_hash_.end()) {
+      int prefix_id = stackprefix_array_.size();
+      stackprefix_array_.push_back(prefix);
+      prefix_hash_[prefix] = prefix_id;
+      return prefix_id;
+    } else {
+      return it->second;
+    }
+  }
+
+  // prefix id after a stack pop
+  int PopPrefix(StackPrefix prefix) {
+    prefix.Pop();
+    return PrefixId(prefix);
+  }
+
+  // prefix id after a stack push
+  int PushPrefix(StackPrefix prefix, Label fst_id, StateId nextstate) {
+    prefix.Push(fst_id, nextstate);
+    return PrefixId(prefix);
+  }
+
+
+  // private data
+ private:
+  // runtime options
+  ReplaceFstOptions opts_;
+
+  // maps from StateId to StateTuple
+  vector<StateTuple> state_tuples_;
+
+  // hashes from StateTuple to StateId
+  StateTupleHash state_hash_;
+
+  // cross index of unique stack prefix
+  // could potentially have one copy of prefix array
+  StackPrefixHash prefix_hash_;
+  vector<StackPrefix> stackprefix_array_;
+
+  NonTerminalHash nonterminal_hash_;
+  vector<const Fst<A>*> fst_array_;
+
+  Label root_;
+
+  void operator=(const ReplaceFstImpl<A> &);  // disallow
+};
+
+
+//
+// \class ReplaceFst
+// \brief Recursivively replaces arcs in the root Fst with other Fsts.
+// This version is a delayed Fst.
+//
+// ReplaceFst supports dynamic replacement of arcs in one Fst with
+// another Fst. This replacement is recursive.  ReplaceFst can be used
+// to support a variety of delayed constructions such as recursive
+// transition networks, union, or closure.  It is constructed with an
+// array of Fst(s). One Fst represents the root (or topology)
+// machine. The root Fst refers to other Fsts by recursively replacing
+// arcs labeled as non-terminals with the matching non-terminal
+// Fst. Currently the ReplaceFst uses the output symbols of the arcs
+// to determine whether the arc is a non-terminal arc or not. A
+// non-terminal can be any label that is not a non-zero terminal label
+// in the output alphabet.
+//
+// Note that the constructor uses a vector of pair<>. These correspond
+// to the tuple of non-terminal Label and corresponding Fst. For example
+// to implement the closure operation we need 2 Fsts. The first root
+// Fst is a single Arc on the start State that self loops, it references
+// the particular machine for which we are performing the closure operation.
+//
+template <class A>
+class ReplaceFst : public Fst<A> {
+ public:
+  friend class ArcIterator< ReplaceFst<A> >;
+  friend class CacheStateIterator< ReplaceFst<A> >;
+  friend class CacheArcIterator< ReplaceFst<A> >;
+
+  typedef A Arc;
+  typedef typename A::Label   Label;
+  typedef typename A::Weight  Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  ReplaceFst(const vector<pair<Label, const Fst<A>* > >& fst_array,
+             Label root)
+      : impl_(new ReplaceFstImpl<A>(fst_array, ReplaceFstOptions(root))) {}
+
+  ReplaceFst(const vector<pair<Label, const Fst<A>* > >& fst_array,
+             const ReplaceFstOptions &opts)
+      : impl_(new ReplaceFstImpl<A>(fst_array, opts)) {}
+
+  ReplaceFst(const ReplaceFst<A>& fst) :
+      impl_(new ReplaceFstImpl<A>(*(fst.impl_))) {}
+
+  virtual ~ReplaceFst() {
+    delete impl_;
+  }
+
+  virtual StateId Start() const {
+    return impl_->Start();
+  }
+
+  virtual Weight Final(StateId s) const {
+    return impl_->Final(s);
+  }
+
+  virtual size_t NumArcs(StateId s) const {
+    return impl_->NumArcs(s);
+  }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const {
+    return impl_->Type();
+  }
+
+  virtual ReplaceFst<A>* Copy() const {
+    return new ReplaceFst<A>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual inline void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+  bool CyclicDependencies() const {
+    return impl_->CyclicDependencies();
+  }
+
+ private:
+  ReplaceFstImpl<A>* impl_;
+};
+
+
+// Specialization for ReplaceFst.
+template<class A>
+class StateIterator< ReplaceFst<A> >
+    : public CacheStateIterator< ReplaceFst<A> > {
+ public:
+  explicit StateIterator(const ReplaceFst<A> &fst)
+      : CacheStateIterator< ReplaceFst<A> >(fst) {}
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(StateIterator);
+};
+
+// Specialization for ReplaceFst.
+template <class A>
+class ArcIterator< ReplaceFst<A> >
+    : public CacheArcIterator< ReplaceFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const ReplaceFst<A> &fst, StateId s)
+      : CacheArcIterator< ReplaceFst<A> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+template <class A> inline
+void ReplaceFst<A>::InitStateIterator(StateIteratorData<A> *data) const {
+  data->base = new StateIterator< ReplaceFst<A> >(*this);
+}
+
+typedef ReplaceFst<StdArc> StdReplaceFst;
+
+
+// // Recursivively replaces arcs in the root Fst with other Fsts.
+// This version writes the result of replacement to an output MutableFst.
+//
+// Replace supports replacement of arcs in one Fst with another
+// Fst. This replacement is recursive.  Replace takes an array of
+// Fst(s). One Fst represents the root (or topology) machine. The root
+// Fst refers to other Fsts by recursively replacing arcs labeled as
+// non-terminals with the matching non-terminal Fst. Currently Replace
+// uses the output symbols of the arcs to determine whether the arc is
+// a non-terminal arc or not. A non-terminal can be any label that is
+// not a non-zero terminal label in the output alphabet.  Note that
+// input argument is a vector of pair<>. These correspond to the tuple
+// of non-terminal Label and corresponding Fst.
+template<class Arc>
+void Replace(const vector<pair<typename Arc::Label,
+             const Fst<Arc>* > >& ifst_array,
+             MutableFst<Arc> *ofst, typename Arc::Label root) {
+  ReplaceFstOptions opts(root);
+  opts.gc_limit = 0;  // Cache only the last state for fastest copy.
+  *ofst = ReplaceFst<Arc>(ifst_array, opts);
+}
+
+}
+
+#endif  // FST_LIB_REPLACE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/reverse.h b/tools/thirdparty/OpenFst/fst/lib/reverse.h
new file mode 100644
index 0000000..9819788
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/reverse.h
@@ -0,0 +1,82 @@
+// reverse.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to sort arcs in an FST.
+
+#ifndef FST_LIB_REVERSE_H__
+#define FST_LIB_REVERSE_H__
+
+#include "fst/lib/cache.h"
+
+namespace fst {
+
+// Reverses an FST. The reversed result is written to an output
+// MutableFst.  If A transduces string x to y with weight a, then the
+// reverse of A transduces the reverse of x to the reverse of y with
+// weight a.Reverse().
+//
+// Typically, a = a.Reverse() and Arc = RevArc (e.g. for
+// TropicalWeight or LogWeight).  In general, e.g. when the weights
+// only form a left or right semiring, the output arc type must match
+// the input arc type except having the reversed Weight type.
+template<class Arc, class RevArc>
+void Reverse(const Fst<Arc> &ifst, MutableFst<RevArc> *ofst) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+  typedef typename RevArc::Weight RevWeight;
+
+  ofst->DeleteStates();
+  ofst->SetInputSymbols(ifst.InputSymbols());
+  ofst->SetOutputSymbols(ifst.OutputSymbols());
+  StateId istart = ifst.Start();
+  StateId ostart = ofst->AddState();
+  ofst->SetStart(ostart);
+
+  for (StateIterator< Fst<Arc> > siter(ifst);
+       !siter.Done();
+       siter.Next()) {
+    StateId is = siter.Value();
+    StateId os = is + 1;
+    while (ofst->NumStates() <= os)
+      ofst->AddState();
+    if (is == istart)
+      ofst->SetFinal(os, RevWeight::One());
+
+    Weight final = ifst.Final(is);
+    if (final != Weight::Zero()) {
+      RevArc oarc(0, 0, final.Reverse(), os);
+      ofst->AddArc(0, oarc);
+    }
+
+    for (ArcIterator< Fst<Arc> > aiter(ifst, is);
+         !aiter.Done();
+         aiter.Next()) {
+      const Arc &iarc = aiter.Value();
+      RevArc oarc(iarc.ilabel, iarc.olabel, iarc.weight.Reverse(), os);
+      StateId nos = iarc.nextstate + 1;
+      while (ofst->NumStates() <= nos)
+        ofst->AddState();
+      ofst->AddArc(nos, oarc);
+    }
+  }
+  uint64 iprops = ifst.Properties(kCopyProperties, false);
+  uint64 oprops = ofst->Properties(kFstProperties, false);
+  ofst->SetProperties(ReverseProperties(iprops) | oprops, kFstProperties);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_REVERSE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/reweight.h b/tools/thirdparty/OpenFst/fst/lib/reweight.h
new file mode 100644
index 0000000..194e377
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/reweight.h
@@ -0,0 +1,128 @@
+// reweight.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Function to reweight an FST.
+
+#ifndef FST_LIB_REWEIGHT_H__
+#define FST_LIB_REWEIGHT_H__
+
+#include "fst/lib/mutable-fst.h"
+
+namespace fst {
+
+enum ReweightType { REWEIGHT_TO_INITIAL, REWEIGHT_TO_FINAL };
+
+// Reweight FST according to the potentials defined by the POTENTIAL
+// vector in the direction defined by TYPE. Weight needs to be left
+// distributive when reweighting towards the initial state and right
+// distributive when reweighting towards the final states.
+//
+// An arc of weight w, with an origin state of potential p and
+// destination state of potential q, is reweighted by p\wq when
+// reweighting towards the initial state and by pw/q when reweighting
+// towards the final states.
+template <class Arc>
+void Reweight(MutableFst<Arc> *fst, vector<typename Arc::Weight> potential,
+              ReweightType type) {
+  typedef typename Arc::Weight Weight;
+
+  if (!fst->NumStates())
+    return;
+  while ( (int64)potential.size() < (int64)fst->NumStates()) 
+    potential.push_back(Weight::Zero());
+
+  if (type == REWEIGHT_TO_FINAL && !(Weight::Properties() & kRightSemiring))
+    LOG(FATAL) << "Reweight: Reweighting to the final states requires "
+               << "Weight to be right distributive: "
+               << Weight::Type();
+
+  if (type == REWEIGHT_TO_INITIAL && !(Weight::Properties() & kLeftSemiring))
+    LOG(FATAL) << "Reweight: Reweighting to the initial state requires "
+               << "Weight to be left distributive: "
+               << Weight::Type();
+
+  for (StateIterator< MutableFst<Arc> > sit(*fst);
+       !sit.Done();
+       sit.Next()) {
+    typename Arc::StateId state = sit.Value();
+    for (MutableArcIterator< MutableFst<Arc> > ait(fst, state);
+         !ait.Done();
+         ait.Next()) {
+      Arc arc = ait.Value();
+      if ((potential[state] == Weight::Zero()) ||
+	  (potential[arc.nextstate] == Weight::Zero()))
+	continue; //temp fix: needs to find best solution for zeros
+      if ((type == REWEIGHT_TO_INITIAL)
+	  && (potential[state] != Weight::Zero()))
+        arc.weight = Divide(Times(arc.weight, potential[arc.nextstate]),
+			    potential[state], DIVIDE_LEFT);
+      else if ((type == REWEIGHT_TO_FINAL)
+	       && (potential[arc.nextstate] != Weight::Zero()))
+        arc.weight = Divide(Times(potential[state], arc.weight),
+                            potential[arc.nextstate], DIVIDE_RIGHT);
+      ait.SetValue(arc);
+    }
+    if ((type == REWEIGHT_TO_INITIAL)
+	&& (potential[state] != Weight::Zero()))
+      fst->SetFinal(state,
+                    Divide(fst->Final(state), potential[state], DIVIDE_LEFT));
+    else if (type == REWEIGHT_TO_FINAL)
+      fst->SetFinal(state, Times(potential[state], fst->Final(state)));
+  }
+
+  if ((potential[fst->Start()] != Weight::One()) &&
+      (potential[fst->Start()] != Weight::Zero())) {
+    if (fst->Properties(kInitialAcyclic, true) & kInitialAcyclic) {
+      typename Arc::StateId state = fst->Start();
+      for (MutableArcIterator< MutableFst<Arc> > ait(fst, state);
+           !ait.Done();
+           ait.Next()) {
+        Arc arc = ait.Value();
+        if (type == REWEIGHT_TO_INITIAL)
+          arc.weight = Times(potential[state], arc.weight);
+        else
+          arc.weight = Times(
+              Divide(Weight::One(), potential[state], DIVIDE_RIGHT),
+              arc.weight);
+        ait.SetValue(arc);
+      }
+      if (type == REWEIGHT_TO_INITIAL)
+        fst->SetFinal(state, Times(potential[state], fst->Final(state)));
+      else
+        fst->SetFinal(state, Times(Divide(Weight::One(), potential[state],
+                                          DIVIDE_RIGHT),
+                                   fst->Final(state)));
+    }
+    else {
+      typename Arc::StateId state = fst->AddState();
+      Weight w = type == REWEIGHT_TO_INITIAL ?
+                 potential[fst->Start()] :
+                 Divide(Weight::One(), potential[fst->Start()], DIVIDE_RIGHT);
+      Arc arc (0, 0, w, fst->Start());
+      fst->AddArc(state, arc);
+      fst->SetStart(state);
+    }
+  }
+
+  fst->SetProperties(ReweightProperties(
+                         fst->Properties(kFstProperties, false)),
+                     kFstProperties);
+}
+
+}  // namespace fst
+
+#endif /* FST_LIB_REWEIGHT_H_ */
diff --git a/tools/thirdparty/OpenFst/fst/lib/rmepsilon.h b/tools/thirdparty/OpenFst/fst/lib/rmepsilon.h
new file mode 100644
index 0000000..69a641b
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/rmepsilon.h
@@ -0,0 +1,542 @@
+// rmepsilon.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Functions and classes that implemement epsilon-removal.
+
+#ifndef FST_LIB_RMEPSILON_H__
+#define FST_LIB_RMEPSILON_H__
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+#include <ext/slist>
+using __gnu_cxx::slist;
+
+#include "fst/lib/arcfilter.h"
+#include "fst/lib/cache.h"
+#include "fst/lib/connect.h"
+#include "fst/lib/factor-weight.h"
+#include "fst/lib/invert.h"
+#include "fst/lib/map.h"
+#include "fst/lib/queue.h"
+#include "fst/lib/shortest-distance.h"
+#include "fst/lib/topsort.h"
+
+namespace fst {
+
+template <class Arc, class Queue>
+struct RmEpsilonOptions
+    : public ShortestDistanceOptions<Arc, Queue, EpsilonArcFilter<Arc> > {
+  typedef typename Arc::StateId StateId;
+
+  bool connect;  // Connect output
+
+  RmEpsilonOptions(Queue *q, float d = kDelta, bool c = true)
+      : ShortestDistanceOptions<Arc, Queue, EpsilonArcFilter<Arc> >(
+          q, EpsilonArcFilter<Arc>(), kNoStateId, d), connect(c) {}
+
+};
+
+
+// Computation state of the epsilon-removal algorithm.
+template <class Arc, class Queue>
+class RmEpsilonState {
+ public:
+  typedef typename Arc::Label Label;
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+
+  RmEpsilonState(const Fst<Arc> &fst,
+                 vector<Weight> *distance,
+                 const RmEpsilonOptions<Arc, Queue> &opts)
+      : fst_(fst), distance_(distance), sd_state_(fst_, distance, opts, true) {
+  }
+
+  // Compute arcs and final weight for state 's'
+  void Expand(StateId s);
+
+  // Returns arcs of expanded state.
+  vector<Arc> &Arcs() { return arcs_; }
+
+  // Returns final weight of expanded state.
+  const Weight &Final() const { return final_; }
+
+ private:
+  struct Element {
+    Label ilabel;
+    Label olabel;
+    StateId nextstate;
+
+    Element() {}
+
+    Element(Label i, Label o, StateId s)
+        : ilabel(i), olabel(o), nextstate(s) {}
+  };
+
+  class ElementKey {
+   public:
+    size_t operator()(const Element& e) const {
+      return static_cast<size_t>(e.nextstate);
+      return static_cast<size_t>(e.nextstate +
+                                 e.ilabel * kPrime0 +
+                                 e.olabel * kPrime1);
+    }
+
+   private:
+    static const int kPrime0 = 7853;
+    static const int kPrime1 = 7867;
+  };
+
+  class ElementEqual {
+   public:
+    bool operator()(const Element &e1, const Element &e2) const {
+      return (e1.ilabel == e2.ilabel) &&  (e1.olabel == e2.olabel)
+                         && (e1.nextstate == e2.nextstate);
+    }
+  };
+
+ private:
+  typedef hash_map<Element, pair<StateId, ssize_t>,
+                   ElementKey, ElementEqual> ElementMap;
+
+  const Fst<Arc> &fst_;
+  // Distance from state being expanded in epsilon-closure.
+  vector<Weight> *distance_;
+  // Shortest distance algorithm computation state.
+  ShortestDistanceState<Arc, Queue, EpsilonArcFilter<Arc> > sd_state_;
+  // Maps an element 'e' to a pair 'p' corresponding to a position
+  // in the arcs vector of the state being expanded. 'e' corresponds
+  // to the position 'p.second' in the 'arcs_' vector if 'p.first' is
+  // equal to the state being expanded.
+  ElementMap element_map_;
+  EpsilonArcFilter<Arc> eps_filter_;
+  stack<StateId> eps_queue_;      // Queue used to visit the epsilon-closure
+  vector<bool> visited_;          // '[i] = true' if state 'i' has been visited
+  slist<StateId> visited_states_; // List of visited states
+  vector<Arc> arcs_;              // Arcs of state being expanded
+  Weight final_;                  // Final weight of state being expanded
+
+  void operator=(const RmEpsilonState);  // Disallow
+};
+
+
+template <class Arc, class Queue>
+void RmEpsilonState<Arc,Queue>::Expand(typename Arc::StateId source) {
+   sd_state_.ShortestDistance(source);
+   eps_queue_.push(source);
+   final_ = Weight::Zero();
+   arcs_.clear();
+
+   while (!eps_queue_.empty()) {
+     StateId state = eps_queue_.top();
+     eps_queue_.pop();
+
+     while ((StateId)visited_.size() <= state) visited_.push_back(false); 
+     visited_[state] = true;
+     visited_states_.push_front(state);
+
+     for (ArcIterator< Fst<Arc> > ait(fst_, state);
+          !ait.Done();
+          ait.Next()) {
+       Arc arc = ait.Value();
+       arc.weight = Times((*distance_)[state], arc.weight);
+
+       if (eps_filter_(arc)) {
+         while ((StateId)visited_.size() <= arc.nextstate) 
+           visited_.push_back(false);
+         if (!visited_[arc.nextstate])
+           eps_queue_.push(arc.nextstate);
+       } else {
+          Element element(arc.ilabel, arc.olabel, arc.nextstate);
+          typename ElementMap::iterator it = element_map_.find(element);
+          if (it == element_map_.end()) {
+            element_map_.insert(
+                pair<Element, pair<StateId, ssize_t> >
+                (element, pair<StateId, ssize_t>(source, arcs_.size())));
+            arcs_.push_back(arc);
+          } else {
+            if (((*it).second).first == source) {
+              Weight &w = arcs_[((*it).second).second].weight;
+              w = Plus(w, arc.weight);
+            } else {
+              ((*it).second).first = source;
+              ((*it).second).second = arcs_.size();
+              arcs_.push_back(arc);
+            }
+          }
+        }
+     }
+     final_ = Plus(final_, Times((*distance_)[state], fst_.Final(state)));
+   }
+
+   while (!visited_states_.empty()) {
+     visited_[visited_states_.front()] = false;
+     visited_states_.pop_front();
+   }
+}
+
+
+// Removes epsilon-transitions (when both the input and output label
+// are an epsilon) from a transducer. The result will be an equivalent
+// FST that has no such epsilon transitions.  This version modifies
+// its input. It allows fine control via the options argument; see
+// below for a simpler interface.
+//
+// The vector 'distance' will be used to hold the shortest distances
+// during the epsilon-closure computation. The state queue discipline
+// and convergence delta are taken in the options argument.
+template <class Arc, class Queue>
+void RmEpsilon(MutableFst<Arc> *fst,
+               vector<typename Arc::Weight> *distance,
+               const RmEpsilonOptions<Arc, Queue> &opts) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+  typedef typename Arc::Label Label;
+
+  // States sorted in topological order when (acyclic) or generic
+  // topological order (cyclic).
+  vector<StateId> states;
+
+  if (fst->Properties(kTopSorted, false) & kTopSorted) {
+    for (StateId i = 0; i < (StateId)fst->NumStates(); i++) 
+      states.push_back(i);
+  } else if (fst->Properties(kAcyclic, false) & kAcyclic) {
+    vector<StateId> order;
+    bool acyclic;
+    TopOrderVisitor<Arc> top_order_visitor(&order, &acyclic);
+    DfsVisit(*fst, &top_order_visitor, EpsilonArcFilter<Arc>());
+    if (!acyclic)
+      LOG(FATAL) << "RmEpsilon: not acyclic though property bit is set";
+    states.resize(order.size());
+    for (StateId i = 0; i < (StateId)order.size(); i++) 
+      states[order[i]] = i;
+  } else {
+     uint64 props;
+     vector<StateId> scc;
+     SccVisitor<Arc> scc_visitor(&scc, 0, 0, &props);
+     DfsVisit(*fst, &scc_visitor, EpsilonArcFilter<Arc>());
+     vector<StateId> first(scc.size(), kNoStateId);
+     vector<StateId> next(scc.size(), kNoStateId);
+     for (StateId i = 0; i < (StateId)scc.size(); i++) { 
+       if (first[scc[i]] != kNoStateId)
+         next[i] = first[scc[i]];
+       first[scc[i]] = i;
+     }
+     for (StateId i = 0; i < (StateId)first.size(); i++) 
+       for (StateId j = first[i]; j != kNoStateId; j = next[j])
+         states.push_back(j);
+  }
+
+  RmEpsilonState<Arc, Queue>
+    rmeps_state(*fst, distance, opts);
+
+  while (!states.empty()) {
+    StateId state = states.back();
+    states.pop_back();
+    rmeps_state.Expand(state);
+    fst->SetFinal(state, rmeps_state.Final());
+    fst->DeleteArcs(state);
+    vector<Arc> &arcs = rmeps_state.Arcs();
+    while (!arcs.empty()) {
+      fst->AddArc(state, arcs.back());
+      arcs.pop_back();
+    }
+  }
+
+  fst->SetProperties(RmEpsilonProperties(
+                         fst->Properties(kFstProperties, false)),
+                     kFstProperties);
+
+  if (opts.connect)
+    Connect(fst);
+}
+
+
+// Removes epsilon-transitions (when both the input and output label
+// are an epsilon) from a transducer. The result will be an equivalent
+// FST that has no such epsilon transitions. This version modifies its
+// input. It has a simplified interface; see above for a version that
+// allows finer control.
+//
+// Complexity:
+// - Time:
+//   - Unweighted: O(V2 + V E)
+//   - Acyclic: O(V2 + V E)
+//   - Tropical semiring: O(V2 log V + V E)
+//   - General: exponential
+// - Space: O(V E)
+// where V = # of states visited, E = # of arcs.
+//
+// References:
+// - Mehryar Mohri. Generic Epsilon-Removal and Input
+//   Epsilon-Normalization Algorithms for Weighted Transducers,
+//   "International Journal of Computer Science", 13(1):129-143 (2002).
+template <class Arc>
+void RmEpsilon(MutableFst<Arc> *fst, bool connect = true) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+  typedef typename Arc::Label Label;
+
+  vector<Weight> distance;
+  AutoQueue<StateId> state_queue(*fst, &distance, EpsilonArcFilter<Arc>());
+  RmEpsilonOptions<Arc, AutoQueue<StateId> >
+    opts(&state_queue, kDelta, connect);
+
+  RmEpsilon(fst, &distance, opts);
+}
+
+
+struct RmEpsilonFstOptions : CacheOptions {
+  float delta;
+
+  RmEpsilonFstOptions(const CacheOptions &opts, float delta = kDelta)
+      : CacheOptions(opts), delta(delta) {}
+
+  explicit RmEpsilonFstOptions(float delta = kDelta) : delta(delta) {}
+};
+
+
+// Implementation of delayed RmEpsilonFst.
+template <class A>
+class RmEpsilonFstImpl : public CacheImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+
+  using CacheBaseImpl< CacheState<A> >::HasStart;
+  using CacheBaseImpl< CacheState<A> >::HasFinal;
+  using CacheBaseImpl< CacheState<A> >::HasArcs;
+
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  RmEpsilonFstImpl(const Fst<A>& fst, const RmEpsilonFstOptions &opts)
+      : CacheImpl<A>(opts),
+        fst_(fst.Copy()),
+        rmeps_state_(
+            *fst_,
+            &distance_,
+            RmEpsilonOptions<A, FifoQueue<StateId> >(&queue_, opts.delta,
+                                                     false)
+            ) {
+    SetType("rmepsilon");
+    uint64 props = fst.Properties(kFstProperties, false);
+    SetProperties(RmEpsilonProperties(props, true), kCopyProperties);
+  }
+
+  ~RmEpsilonFstImpl() {
+    delete fst_;
+  }
+
+  StateId Start() {
+    if (!HasStart()) {
+      SetStart(fst_->Start());
+    }
+    return CacheImpl<A>::Start();
+  }
+
+  Weight Final(StateId s) {
+    if (!HasFinal(s)) {
+      Expand(s);
+    }
+    return CacheImpl<A>::Final(s);
+  }
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumOutputEpsilons(s);
+  }
+
+  void InitArcIterator(StateId s, ArcIteratorData<A> *data) {
+    if (!HasArcs(s))
+      Expand(s);
+    CacheImpl<A>::InitArcIterator(s, data);
+  }
+
+  void Expand(StateId s) {
+    rmeps_state_.Expand(s);
+    SetFinal(s, rmeps_state_.Final());
+    vector<A> &arcs = rmeps_state_.Arcs();
+    while (!arcs.empty()) {
+      AddArc(s, arcs.back());
+      arcs.pop_back();
+    }
+    SetArcs(s);
+  }
+
+ private:
+  const Fst<A> *fst_;
+  vector<Weight> distance_;
+  FifoQueue<StateId> queue_;
+  RmEpsilonState<A, FifoQueue<StateId> > rmeps_state_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(RmEpsilonFstImpl);
+};
+
+
+// Removes epsilon-transitions (when both the input and output label
+// are an epsilon) from a transducer. The result will be an equivalent
+// FST that has no such epsilon transitions.  This version is a
+// delayed Fst.
+//
+// Complexity:
+// - Time:
+//   - Unweighted: O(v^2 + v e)
+//   - General: exponential
+// - Space: O(v e)
+// where v = # of states visited, e = # of arcs visited. Constant time
+// to visit an input state or arc is assumed and exclusive of caching.
+//
+// References:
+// - Mehryar Mohri. Generic Epsilon-Removal and Input
+//   Epsilon-Normalization Algorithms for Weighted Transducers,
+//   "International Journal of Computer Science", 13(1):129-143 (2002).
+template <class A>
+class RmEpsilonFst : public Fst<A> {
+ public:
+  friend class ArcIterator< RmEpsilonFst<A> >;
+  friend class CacheStateIterator< RmEpsilonFst<A> >;
+  friend class CacheArcIterator< RmEpsilonFst<A> >;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  RmEpsilonFst(const Fst<A> &fst)
+      : impl_(new RmEpsilonFstImpl<A>(fst, RmEpsilonFstOptions())) {}
+
+  RmEpsilonFst(const Fst<A> &fst, const RmEpsilonFstOptions &opts)
+      : impl_(new RmEpsilonFstImpl<A>(fst, opts)) {}
+
+  explicit RmEpsilonFst(const RmEpsilonFst<A> &fst) : impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~RmEpsilonFst() { if (!impl_->DecrRefCount()) delete impl_;  }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual RmEpsilonFst<A> *Copy() const {
+    return new RmEpsilonFst<A>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual inline void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+ protected:
+  RmEpsilonFstImpl<A> *Impl() { return impl_; }
+
+ private:
+  RmEpsilonFstImpl<A> *impl_;
+
+  void operator=(const RmEpsilonFst<A> &fst);  // disallow
+};
+
+
+// Specialization for RmEpsilonFst.
+template<class A>
+class StateIterator< RmEpsilonFst<A> >
+    : public CacheStateIterator< RmEpsilonFst<A> > {
+ public:
+  explicit StateIterator(const RmEpsilonFst<A> &fst)
+      : CacheStateIterator< RmEpsilonFst<A> >(fst) {}
+};
+
+
+// Specialization for RmEpsilonFst.
+template <class A>
+class ArcIterator< RmEpsilonFst<A> >
+    : public CacheArcIterator< RmEpsilonFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const RmEpsilonFst<A> &fst, StateId s)
+      : CacheArcIterator< RmEpsilonFst<A> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+
+template <class A> inline
+void RmEpsilonFst<A>::InitStateIterator(StateIteratorData<A> *data) const {
+  data->base = new StateIterator< RmEpsilonFst<A> >(*this);
+}
+
+
+// Useful alias when using StdArc.
+typedef RmEpsilonFst<StdArc> StdRmEpsilonFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_RMEPSILON_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/rmfinalepsilon.h b/tools/thirdparty/OpenFst/fst/lib/rmfinalepsilon.h
new file mode 100644
index 0000000..900f0bb
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/rmfinalepsilon.h
@@ -0,0 +1,101 @@
+// rmfinalepsilon.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Function to remove of final states that have epsilon only input arcs.
+
+#ifndef FST_LIB_RMFINALEPSILON_H__
+#define FST_LIB_RMFINALEPSILON_H__
+
+#include <ext/hash_set>
+using __gnu_cxx::hash_set;
+
+#include "fst/lib/connect.h"
+#include "fst/lib/mutable-fst.h"
+
+namespace fst {
+
+template<class A>
+void RmFinalEpsilon(MutableFst<A>* fst) {
+  typedef typename A::StateId StateId;
+  typedef typename A::Weight Weight;
+
+  // Determine the coaccesibility of states.
+  vector<bool> access;
+  vector<bool> coaccess;
+  uint64 props = 0;
+  SccVisitor<A> scc_visitor(0, &access, &coaccess, &props);
+  DfsVisit(*fst, &scc_visitor);
+
+  // Find potential list of removable final states. These are final states
+  // that have no outgoing transitions or final states that have a
+  // non-coaccessible future. Complexity O(S)
+  hash_set<StateId> finals;
+  for (StateIterator<Fst<A> > siter(*fst); !siter.Done(); siter.Next()) {
+    StateId s = siter.Value();
+    if (fst->Final(s) != Weight::Zero()) {
+      bool future_coaccess = false;
+      for (ArcIterator<Fst<A> > aiter(*fst, s); !aiter.Done(); aiter.Next()) {
+        const A& arc = aiter.Value();
+        if (coaccess[arc.nextstate]) {
+          future_coaccess = true;
+          break;
+        }
+      }
+      if (!future_coaccess) {
+        finals.insert(s);
+      }
+    }
+  }
+
+  // Move the final weight. Complexity O(E)
+  vector<A> arcs;
+  for (StateIterator<Fst<A> > siter(*fst); !siter.Done(); siter.Next()) {
+    StateId s = siter.Value();
+    Weight w(fst->Final(s));
+
+    arcs.clear();
+    for (ArcIterator<Fst<A> > aiter(*fst, s); !aiter.Done(); aiter.Next()) {
+      const A& arc = aiter.Value();
+      // is next state in the list of finals
+      if (finals.find(arc.nextstate) != finals.end()) {
+        // sum up all epsilon arcs
+        if (arc.ilabel == 0 && arc.olabel == 0) {
+          w = Plus(Times(fst->Final(arc.nextstate), arc.weight), w);
+        } else {
+          arcs.push_back(arc);
+        }
+      } else {
+        arcs.push_back(arc);
+      }
+    }
+
+    // If some arcs (epsilon arcs) were deleted, delete all
+    // arcs and add back only the non epsilon arcs
+    if (arcs.size() < fst->NumArcs(s)) {
+      fst->DeleteArcs(s);
+      fst->SetFinal(s, w);
+      for (size_t i = 0; i < arcs.size(); ++i) {
+        fst->AddArc(s, arcs[i]);
+      }
+    }
+  }
+
+  Connect(fst);
+}
+
+}
+
+#endif  // FST_LIB_RMFINALEPSILON_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/shortest-distance.h b/tools/thirdparty/OpenFst/fst/lib/shortest-distance.h
new file mode 100644
index 0000000..44c37c9
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/shortest-distance.h
@@ -0,0 +1,262 @@
+// shortest-distance.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Functions and classes to find shortest distance in an FST.
+
+#ifndef FST_LIB_SHORTEST_DISTANCE_H__
+#define FST_LIB_SHORTEST_DISTANCE_H__
+
+#include <deque>
+
+#include "fst/lib/arcfilter.h"
+#include "fst/lib/cache.h"
+#include "fst/lib/queue.h"
+#include "fst/lib/reverse.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+template <class Arc, class Queue, class ArcFilter>
+struct ShortestDistanceOptions {
+  typedef typename Arc::StateId StateId;
+
+  Queue *state_queue;    // Queue discipline used; owned by caller
+  ArcFilter arc_filter;  // Arc filter (e.g., limit to only epsilon graph)
+  StateId source;        // If kNoStateId, use the Fst's initial state
+  float delta;           // Determines the degree of convergence required
+
+  ShortestDistanceOptions(Queue *q, ArcFilter filt, StateId src = kNoStateId,
+                          float d = kDelta)
+      : state_queue(q), arc_filter(filt), source(src), delta(d) {}
+};
+
+
+// Computation state of the shortest-distance algorithm. Reusable
+// information is maintained across calls to member function
+// ShortestDistance(source) when 'retain' is true for improved
+// efficiency when calling multiple times from different source states
+// (e.g., in epsilon removal). Vector 'distance' should not be
+// modified by the user between these calls.
+template<class Arc, class Queue, class ArcFilter>
+class ShortestDistanceState {
+ public:
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+
+  ShortestDistanceState(
+      const Fst<Arc> &fst,
+      vector<Weight> *distance,
+      const ShortestDistanceOptions<Arc, Queue, ArcFilter> &opts,
+      bool retain)
+      : fst_(fst.Copy()), distance_(distance), state_queue_(opts.state_queue),
+        arc_filter_(opts.arc_filter),
+        delta_(opts.delta), retain_(retain) {
+    distance_->clear();
+  }
+
+  ~ShortestDistanceState() {
+    delete fst_;
+  }
+
+  void ShortestDistance(StateId source);
+
+ private:
+  const Fst<Arc> *fst_;
+  vector<Weight> *distance_;
+  Queue *state_queue_;
+  ArcFilter arc_filter_;
+  float delta_;
+  bool retain_;                  // Retain and reuse information across calls
+
+  vector<Weight> rdistance_;    // Relaxation distance.
+  vector<bool> enqueued_;       // Is state enqueued?
+  vector<StateId> sources_;     // Source state for ith state in 'distance_',
+                                //  'rdistance_', and 'enqueued_' if retained.
+};
+
+// Compute the shortest distance. If 'source' is kNoStateId, use
+// the initial state of the Fst.
+template <class Arc, class Queue, class ArcFilter>
+void ShortestDistanceState<Arc, Queue, ArcFilter>::ShortestDistance(
+    StateId source) {
+  if (fst_->Start() == kNoStateId)
+    return;
+
+  if (!(Weight::Properties() & kRightSemiring))
+    LOG(FATAL) << "ShortestDistance: Weight needs to be right distributive: "
+               << Weight::Type();
+
+  state_queue_->Clear();
+
+  if (!retain_) {
+    distance_->clear();
+    rdistance_.clear();
+    enqueued_.clear();
+  }
+
+  if (source == kNoStateId)
+    source = fst_->Start();
+
+  while ((StateId)distance_->size() <= source) {
+    distance_->push_back(Weight::Zero());
+    rdistance_.push_back(Weight::Zero());
+    enqueued_.push_back(false);
+  }
+  if (retain_) {
+    while ((StateId)sources_.size() <= source)
+      sources_.push_back(kNoStateId);
+    sources_[source] = source;
+  }
+  (*distance_)[source] = Weight::One();
+  rdistance_[source] = Weight::One();
+  enqueued_[source] = true;
+
+  state_queue_->Enqueue(source);
+
+  while (!state_queue_->Empty()) {
+    StateId s = state_queue_->Head();
+    state_queue_->Dequeue();
+    while ((StateId)distance_->size() <= s) {
+      distance_->push_back(Weight::Zero());
+      rdistance_.push_back(Weight::Zero());
+      enqueued_.push_back(false);
+    }
+    enqueued_[s] = false;
+    Weight r = rdistance_[s];
+    rdistance_[s] = Weight::Zero();
+    for (ArcIterator< Fst<Arc> > aiter(*fst_, s);
+         !aiter.Done();
+         aiter.Next()) {
+      const Arc &arc = aiter.Value();
+      if (!arc_filter_(arc) || arc.weight == Weight::Zero())
+        continue;
+      while ((StateId)distance_->size() <= arc.nextstate) {
+        distance_->push_back(Weight::Zero());
+        rdistance_.push_back(Weight::Zero());
+        enqueued_.push_back(false);
+      }
+      if (retain_) {
+        while ((StateId)sources_.size() <= arc.nextstate)
+          sources_.push_back(kNoStateId);
+        if (sources_[arc.nextstate] != source) {
+          (*distance_)[arc.nextstate] = Weight::Zero();
+          rdistance_[arc.nextstate] = Weight::Zero();
+          enqueued_[arc.nextstate] = false;
+          sources_[arc.nextstate] = source;
+        }
+      }
+      Weight &nd = (*distance_)[arc.nextstate];
+      Weight &nr = rdistance_[arc.nextstate];
+      Weight w = Times(r, arc.weight);
+      if (!ApproxEqual(nd, Plus(nd, w), delta_)) {
+        nd = Plus(nd, w);
+        nr = Plus(nr, w);
+        if (!enqueued_[arc.nextstate]) {
+          state_queue_->Enqueue(arc.nextstate);
+          enqueued_[arc.nextstate] = true;
+        } else {
+          state_queue_->Update(arc.nextstate);
+        }
+      }
+    }
+  }
+}
+
+
+// Shortest-distance algorithm: this version allows fine control
+// via the options argument. See below for a simpler interface.
+//
+// This computes the shortest distance from the 'opts.source' state to
+// each visited state S and stores the value in the 'distance' vector.
+// An unvisited state S has distance Zero(), which will be stored in
+// the 'distance' vector if S is less than the maximum visited state.
+// The state queue discipline, arc filter, and convergence delta are
+// taken in the options argument.
+
+// The weights must must be right distributive and k-closed (i.e., 1 +
+// x + x^2 + ... + x^(k +1) = 1 + x + x^2 + ... + x^k).
+//
+// The algorithm is from Mohri, "Semiring Framweork and Algorithms for
+// Shortest-Distance Problems", Journal of Automata, Languages and
+// Combinatorics 7(3):321-350, 2002. The complexity of algorithm
+// depends on the properties of the semiring and the queue discipline
+// used. Refer to the paper for more details.
+template<class Arc, class Queue, class ArcFilter>
+void ShortestDistance(
+    const Fst<Arc> &fst,
+    vector<typename Arc::Weight> *distance,
+    const ShortestDistanceOptions<Arc, Queue, ArcFilter> &opts) {
+
+  ShortestDistanceState<Arc, Queue, ArcFilter>
+    sd_state(fst, distance, opts, false);
+  sd_state.ShortestDistance(opts.source);
+}
+
+// Shortest-distance algorithm: simplified interface. See above for a
+// version that allows finer control.
+//
+// If 'reverse' is false, this computes the shortest distance from the
+// initial state to each state S and stores the value in the
+// 'distance' vector. If 'reverse' is true, this computes the shortest
+// distance from each state to the final states.  An unvisited state S
+// has distance Zero(), which will be stored in the 'distance' vector
+// if S is less than the maximum visited state.  The state queue
+// discipline is automatically-selected.
+//
+// The weights must must be right (left) distributive if reverse is
+// false (true) and k-closed (i.e., 1 + x + x^2 + ... + x^(k +1) = 1 +
+// x + x^2 + ... + x^k).
+//
+// The algorithm is from Mohri, "Semiring Framweork and Algorithms for
+// Shortest-Distance Problems", Journal of Automata, Languages and
+// Combinatorics 7(3):321-350, 2002. The complexity of algorithm
+// depends on the properties of the semiring and the queue discipline
+// used. Refer to the paper for more details.
+template<class Arc>
+void ShortestDistance(const Fst<Arc> &fst,
+                      vector<typename Arc::Weight> *distance,
+                      bool reverse = false) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+
+  if (!reverse) {
+    AnyArcFilter<Arc> arc_filter;
+    AutoQueue<StateId> state_queue(fst, distance, arc_filter);
+    ShortestDistanceOptions< Arc, AutoQueue<StateId>, AnyArcFilter<Arc> >
+      opts(&state_queue, arc_filter);
+    ShortestDistance(fst, distance, opts);
+  } else {
+    typedef ReverseArc<Arc> ReverseArc;
+    typedef typename ReverseArc::Weight ReverseWeight;
+    AnyArcFilter<ReverseArc> rarc_filter;
+    VectorFst<ReverseArc> rfst;
+    Reverse(fst, &rfst);
+    vector<ReverseWeight> rdistance;
+    AutoQueue<StateId> state_queue(rfst, &rdistance, rarc_filter);
+    ShortestDistanceOptions< ReverseArc, AutoQueue<StateId>,
+      AnyArcFilter<ReverseArc> >
+      ropts(&state_queue, rarc_filter);
+    ShortestDistance(rfst, &rdistance, ropts);
+    distance->clear();
+    while (distance->size() < rdistance.size() - 1)
+      distance->push_back(rdistance[distance->size() + 1].Reverse());
+  }
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_SHORTEST_DISTANCE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/shortest-path.h b/tools/thirdparty/OpenFst/fst/lib/shortest-path.h
new file mode 100644
index 0000000..412869a
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/shortest-path.h
@@ -0,0 +1,363 @@
+// shortest-path.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Functions to find shortest paths in an FST.
+
+#ifndef FST_LIB_SHORTEST_PATH_H__
+#define FST_LIB_SHORTEST_PATH_H__
+
+#include <functional>
+
+#include "fst/lib/cache.h"
+#include "fst/lib/queue.h"
+#include "fst/lib/shortest-distance.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+template <class Arc, class Queue, class ArcFilter>
+struct ShortestPathOptions
+    : public ShortestDistanceOptions<Arc, Queue, ArcFilter> {
+  typedef typename Arc::StateId StateId;
+
+  size_t nshortest;      // return n-shortest paths
+  bool unique;           // only return paths with distinct input strings
+  bool has_distance;     // distance vector already contains the
+                         // shortest distance from the initial state
+
+  ShortestPathOptions(Queue *q, ArcFilter filt, size_t n = 1, bool u = false,
+                      bool hasdist = false, float d = kDelta)
+      : ShortestDistanceOptions<Arc, Queue, ArcFilter>(q, filt, kNoStateId, d),
+        nshortest(n), unique(u), has_distance(hasdist)  {}
+};
+
+
+// Shortest-path algorithm: normally not called directly; prefer
+// 'ShortestPath' below with n=1. 'ofst' contains the shortest path in
+// 'ifst'. 'distance' returns the shortest distances from the source
+// state to each state in 'ifst'. 'opts' is used to specify options
+// such as the queue discipline, the arc filter and delta.
+//
+// The shortest path is the lowest weight path w.r.t. the natural
+// semiring order.
+//
+// The weights need to be right distributive and have the path (kPath)
+// property.
+template<class Arc, class Queue, class ArcFilter>
+void SingleShortestPath(const Fst<Arc> &ifst,
+                  MutableFst<Arc> *ofst,
+                  vector<typename Arc::Weight> *distance,
+                  ShortestPathOptions<Arc, Queue, ArcFilter> &opts) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+
+  ofst->DeleteStates();
+  ofst->SetInputSymbols(ifst.InputSymbols());
+  ofst->SetOutputSymbols(ifst.OutputSymbols());
+
+  if (ifst.Start() == kNoStateId)
+    return;
+
+  vector<Weight> rdistance;
+  vector<bool> enqueued;
+  vector<StateId> parent;
+  vector<Arc> arc_parent;
+
+  Queue *state_queue = opts.state_queue;
+  StateId source = opts.source == kNoStateId ? ifst.Start() : opts.source;
+  Weight f_distance = Weight::Zero();
+  StateId f_parent = kNoStateId;
+
+  distance->clear();
+  state_queue->Clear();
+  if (opts.nshortest != 1)
+    LOG(FATAL) << "SingleShortestPath: for nshortest > 1, use ShortestPath"
+               << " instead";
+  if ((Weight::Properties() & (kPath | kRightSemiring))
+       != (kPath | kRightSemiring))
+      LOG(FATAL) << "SingleShortestPath: Weight needs to have the path"
+                 << " property and be right distributive: " << Weight::Type();
+
+  while (distance->size() < source) {
+    distance->push_back(Weight::Zero());
+    enqueued.push_back(false);
+    parent.push_back(kNoStateId);
+    arc_parent.push_back(Arc(kNoLabel, kNoLabel, Weight::Zero(), kNoStateId));
+  }
+  distance->push_back(Weight::One());
+  parent.push_back(kNoStateId);
+  arc_parent.push_back(Arc(kNoLabel, kNoLabel, Weight::Zero(), kNoStateId));
+  state_queue->Enqueue(source);
+  enqueued.push_back(true);
+
+  while (!state_queue->Empty()) {
+    StateId s = state_queue->Head();
+    state_queue->Dequeue();
+    enqueued[s] = false;
+    Weight sd = (*distance)[s];
+    for (ArcIterator< Fst<Arc> > aiter(ifst, s);
+         !aiter.Done();
+         aiter.Next()) {
+      const Arc &arc = aiter.Value();
+      while (distance->size() <= arc.nextstate) {
+        distance->push_back(Weight::Zero());
+        enqueued.push_back(false);
+        parent.push_back(kNoStateId);
+        arc_parent.push_back(Arc(kNoLabel, kNoLabel, Weight::Zero(),
+                                 kNoStateId));
+      }
+      Weight &nd = (*distance)[arc.nextstate];
+      Weight w = Times(sd, arc.weight);
+      if (nd != Plus(nd, w)) {
+        nd = Plus(nd, w);
+        parent[arc.nextstate] = s;
+        arc_parent[arc.nextstate] = arc;
+        if (!enqueued[arc.nextstate]) {
+          state_queue->Enqueue(arc.nextstate);
+          enqueued[arc.nextstate] = true;
+        } else {
+          state_queue->Update(arc.nextstate);
+        }
+      }
+    }
+    if (ifst.Final(s) != Weight::Zero()) {
+      Weight w = Times(sd, ifst.Final(s));
+      if (f_distance != Plus(f_distance, w)) {
+        f_distance = Plus(f_distance, w);
+        f_parent = s;
+      }
+    }
+  }
+  (*distance)[source] = Weight::One();
+  parent[source] = kNoStateId;
+
+  StateId s_p = kNoStateId, d_p = kNoStateId;
+  for (StateId s = f_parent, d = kNoStateId;
+       s != kNoStateId;
+       d = s, s = parent[s]) {
+    enqueued[s] = true;
+    d_p = s_p;
+    s_p = ofst->AddState();
+    if (d == kNoStateId) {
+      ofst->SetFinal(s_p, ifst.Final(f_parent));
+    } else {
+      arc_parent[d].nextstate = d_p;
+      ofst->AddArc(s_p, arc_parent[d]);
+    }
+  }
+  ofst->SetStart(s_p);
+}
+
+
+template <class S, class W>
+class ShortestPathCompare {
+ public:
+  typedef S StateId;
+  typedef W Weight;
+  typedef pair<StateId, Weight> Pair;
+
+  ShortestPathCompare(const vector<Pair>& pairs,
+                      const vector<Weight>& distance,
+                      StateId sfinal, float d)
+      : pairs_(pairs), distance_(distance), superfinal_(sfinal), delta_(d)  {}
+
+  bool operator()(const StateId x, const StateId y) const {
+    const Pair &px = pairs_[x];
+    const Pair &py = pairs_[y];
+    Weight wx = Times(distance_[px.first], px.second);
+    Weight wy = Times(distance_[py.first], py.second);
+    // Penalize complete paths to ensure correct results with inexact weights.
+    // This forms a strict weak order so long as ApproxEqual(a, b) =>
+    // ApproxEqual(a, c) for all c s.t. less_(a, c) && less_(c, b).
+    if (px.first == superfinal_ && py.first != superfinal_) {
+      return less_(wy, wx) || ApproxEqual(wx, wy, delta_);
+    } else if (py.first == superfinal_ && px.first != superfinal_) {
+      return less_(wy, wx) && !ApproxEqual(wx, wy, delta_);
+    } else {
+      return less_(wy, wx);
+    }
+  }
+
+ private:
+  const vector<Pair> &pairs_;
+  const vector<Weight> &distance_;
+  StateId superfinal_;
+  float delta_;
+  NaturalLess<Weight> less_;
+};
+
+
+// N-Shortest-path algorithm:  this version allow fine control
+// via the otpions argument. See below for a simpler interface.
+//
+// 'ofst' contains the n-shortest paths in 'ifst'. 'distance' returns
+// the shortest distances from the source state to each state in
+// 'ifst'. 'opts' is used to specify options such as the number of
+// paths to return, whether they need to have distinct input
+// strings, the queue discipline, the arc filter and the convergence
+// delta.
+//
+// The n-shortest paths are the n-lowest weight paths w.r.t. the
+// natural semiring order. The single path that can be
+// read from the ith of at most n transitions leaving the initial
+// state of 'ofst' is the ith shortest path.
+
+// The weights need to be right distributive and have the path (kPath)
+// property. They need to be left distributive as well for nshortest
+// > 1.
+//
+// The algorithm is from Mohri and Riley, "An Efficient Algorithm for
+// the n-best-strings problem", ICSLP 2002. The algorithm relies on
+// the shortest-distance algorithm. There are some issues with the
+// pseudo-code as written in the paper (viz., line 11).
+template<class Arc, class Queue, class ArcFilter>
+void ShortestPath(const Fst<Arc> &ifst, MutableFst<Arc> *ofst,
+                  vector<typename Arc::Weight> *distance,
+                  ShortestPathOptions<Arc, Queue, ArcFilter> &opts) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+  typedef pair<StateId, Weight> Pair;
+  typedef ReverseArc<Arc> ReverseArc;
+  typedef typename ReverseArc::Weight ReverseWeight;
+
+  size_t n = opts.nshortest;
+
+  if (n == 1) {
+    SingleShortestPath(ifst, ofst, distance, opts);
+    return;
+  }
+  ofst->DeleteStates();
+  ofst->SetInputSymbols(ifst.InputSymbols());
+  ofst->SetOutputSymbols(ifst.OutputSymbols());
+  if (n <= 0) return;
+  if ((Weight::Properties() & (kPath | kSemiring)) != (kPath | kSemiring))
+    LOG(FATAL) << "ShortestPath: n-shortest: Weight needs to have the "
+                 << "path property and be distributive: "
+                 << Weight::Type();
+  if (opts.unique)
+    LOG(FATAL) << "ShortestPath: n-shortest-string algorithm not "
+               << "currently implemented";
+
+  // Algorithm works on the reverse of 'fst' : 'rfst' 'distance' is
+  // the distance to the final state in 'rfst' 'ofst' is built as the
+  // reverse of the tree of n-shortest path in 'rfst'.
+
+  if (!opts.has_distance)
+    ShortestDistance(ifst, distance, opts);
+  VectorFst<ReverseArc> rfst;
+  Reverse(ifst, &rfst);
+  distance->insert(distance->begin(), Weight::One());
+  while (distance->size() < rfst.NumStates())
+    distance->push_back(Weight::Zero());
+
+
+  // Each state in 'ofst' corresponds to a path with weight w from the
+  // initial state of 'rfst' to a state s in 'rfst', that can be
+  // characterized by a pair (s,w).  The vector 'pairs' maps each
+  // state in 'ofst' to the corresponding pair maps states in OFST to
+  // the corresponding pair (s,w).
+  vector<Pair> pairs;
+  // 'r[s]', 's' state in 'fst', is the number of states in 'ofst'
+  // which corresponding pair contains 's' ,i.e. , it is number of
+  // paths computed so far to 's'.
+  StateId superfinal = distance->size();  // superfinal must be handled
+  distance->push_back(Weight::One());     // differently when unique=true
+  ShortestPathCompare<StateId, Weight>
+    compare(pairs, *distance, superfinal, opts.delta);
+  vector<StateId> heap;
+  vector<int> r;
+  while (r.size() < distance->size())
+    r.push_back(0);
+  ofst->SetStart(ofst->AddState());
+  StateId final = ofst->AddState();
+  ofst->SetFinal(final, Weight::One());
+  while (pairs.size() <= final)
+    pairs.push_back(Pair(kNoStateId, Weight::Zero()));
+  pairs[final] = Pair(rfst.Start(), Weight::One());
+  heap.push_back(final);
+
+  while (!heap.empty()) {
+    pop_heap(heap.begin(), heap.end(), compare);
+    StateId state = heap.back();
+    Pair p = pairs[state];
+    heap.pop_back();
+
+    ++r[p.first];
+    if (p.first == superfinal)
+      ofst->AddArc(ofst->Start(), Arc(0, 0, Weight::One(), state));
+    if ((p.first == superfinal) &&  (r[p.first] == n)) break;
+    if (r[p.first] > n) continue;
+    if (p.first == superfinal)
+      continue;
+
+    for (ArcIterator< Fst<ReverseArc> > aiter(rfst, p.first);
+         !aiter.Done();
+         aiter.Next()) {
+      const ReverseArc &rarc = aiter.Value();
+      Arc arc(rarc.ilabel, rarc.olabel, rarc.weight.Reverse(), rarc.nextstate);
+      Weight w = Times(p.second, arc.weight);
+      StateId next = ofst->AddState();
+      pairs.push_back(Pair(arc.nextstate, w));
+      arc.nextstate = state;
+      ofst->AddArc(next, arc);
+      heap.push_back(next);
+      push_heap(heap.begin(), heap.end(), compare);
+    }
+
+    Weight finalw = rfst.Final(p.first).Reverse();
+    if (finalw != Weight::Zero()) {
+      Weight w = Times(p.second, finalw);
+      StateId next = ofst->AddState();
+      pairs.push_back(Pair(superfinal, w));
+      ofst->AddArc(next, Arc(0, 0, finalw, state));
+      heap.push_back(next);
+      push_heap(heap.begin(), heap.end(), compare);
+    }
+  }
+  Connect(ofst);
+  distance->erase(distance->begin());
+  distance->pop_back();
+}
+
+// Shortest-path algorithm: simplified interface. See above for a
+// version that allows finer control.
+
+// 'ofst' contains the 'n'-shortest paths in 'ifst'. The queue
+// discipline is automatically selected. When 'unique' == true, only
+// paths with distinct input labels are returned.
+//
+// The n-shortest paths are the n-lowest weight paths w.r.t. the
+// natural semiring order. The single path that can be read from the
+// ith of at most n transitions leaving the initial state of 'ofst' is
+// the ith best path.
+//
+// The weights need to be right distributive and have the path
+// (kPath) property.
+template<class Arc>
+void ShortestPath(const Fst<Arc> &ifst, MutableFst<Arc> *ofst,
+                  size_t n = 1, bool unique = false) {
+  vector<typename Arc::Weight> distance;
+  AnyArcFilter<Arc> arc_filter;
+  AutoQueue<typename Arc::StateId> state_queue(ifst, &distance, arc_filter);
+  ShortestPathOptions< Arc, AutoQueue<typename Arc::StateId>,
+    AnyArcFilter<Arc> > opts(&state_queue, arc_filter, n, unique);
+  ShortestPath(ifst, ofst, &distance, opts);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_SHORTEST_PATH_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/statesort.h b/tools/thirdparty/OpenFst/fst/lib/statesort.h
new file mode 100644
index 0000000..6cf5ed2
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/statesort.h
@@ -0,0 +1,88 @@
+// statesort.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Function to sort states of an Fst.
+
+#ifndef FST_LIB_STATESORT_H__
+#define FST_LIB_STATESORT_H__
+
+#include <algorithm>
+
+#include "fst/lib/mutable-fst.h"
+
+namespace fst {
+
+// Sorts the input states of an FST, modifying it. ORDER[i] gives the
+// the state Id after sorting that corresponds to state Id i before
+// sorting.  ORDER must be a permutation of FST's states ID sequence:
+// (1, 2, ..., fst->NumStates() - 1).
+template <class Arc>
+void StateSort(MutableFst<Arc> *fst,
+               const vector<typename Arc::StateId> &order) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Weight Weight;
+
+  CHECK_EQ(order.size(), fst->NumStates());
+
+  if (fst->Start() == kNoStateId)
+    return;
+
+  uint64 props = fst->Properties(kStateSortProperties, false);
+
+  vector<bool> done(order.size(), false);
+  vector<Arc> arcsa, arcsb;
+  vector<Arc> *arcs1 = &arcsa, *arcs2 = &arcsb;
+
+  fst->SetStart(order[fst->Start()]);
+
+  for (StateIterator< MutableFst<Arc> > siter(*fst);
+       !siter.Done();
+       siter.Next()) {
+    StateId s1 = siter.Value(), s2;
+    if (done[s1])
+      continue;
+    Weight final1 = fst->Final(s1), final2 = Weight::Zero();
+    arcs1->clear();
+    for (ArcIterator< MutableFst<Arc> > aiter(*fst, s1);
+         !aiter.Done();
+         aiter.Next())
+      arcs1->push_back(aiter.Value());
+    for (; !done[s1]; s1 = s2, final1 = final2, swap(arcs1, arcs2)) {
+      s2 = order[s1];
+      if (!done[s2]) {
+        final2 = fst->Final(s2);
+        arcs2->clear();
+        for (ArcIterator< MutableFst<Arc> > aiter(*fst, s2);
+             !aiter.Done();
+             aiter.Next())
+          arcs2->push_back(aiter.Value());
+      }
+      fst->SetFinal(s2, final1);
+      fst->DeleteArcs(s2);
+      for (size_t i = 0; i < arcs1->size(); ++i) {
+        Arc arc = (*arcs1)[i];
+        arc.nextstate = order[arc.nextstate];
+        fst->AddArc(s2, arc);
+      }
+      done[s1] = true;
+    }
+  }
+  fst->SetProperties(props, kFstProperties);
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_STATESORT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/string-weight.h b/tools/thirdparty/OpenFst/fst/lib/string-weight.h
new file mode 100644
index 0000000..b649cdc
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/string-weight.h
@@ -0,0 +1,525 @@
+// string-weight.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// String weight set and associated semiring operation definitions.
+
+#ifndef FST_LIB_STRING_WEIGHT_H__
+#define FST_LIB_STRING_WEIGHT_H__
+
+#include <list>
+
+#include "fst/lib/product-weight.h"
+#include "fst/lib/weight.h"
+
+namespace fst {
+
+const int kStringInfinity = -1;      // Label for the infinite string
+const int kStringBad = -2;           // Label for a non-string
+const char kStringSeparator = '_';   // Label separator in strings
+
+// Determines whether to use left or right string semiring.  Includes
+// restricted versions that signal an error if proper prefixes
+// (suffixes) would otherwise be returned by Plus, useful with various
+// algorithms that require functional transducer input with the
+// string semirings.
+enum StringType { STRING_LEFT = 0, STRING_RIGHT = 1 ,
+                  STRING_LEFT_RESTRICT = 2, STRING_RIGHT_RESTRICT };
+
+#define REVERSE_STRING_TYPE(S)                                  \
+   ((S) == STRING_LEFT ? STRING_RIGHT :                         \
+    ((S) == STRING_RIGHT ? STRING_LEFT :                        \
+     ((S) == STRING_LEFT_RESTRICT ? STRING_RIGHT_RESTRICT :     \
+      STRING_LEFT_RESTRICT)))
+
+template <typename L, StringType S = STRING_LEFT>
+class StringWeight;
+
+template <typename L, StringType S = STRING_LEFT>
+class StringWeightIterator;
+
+template <typename L, StringType S = STRING_LEFT>
+class StringWeightReverseIterator;
+
+template <typename L, StringType S>
+bool operator==(const StringWeight<L, S> &,  const StringWeight<L, S> &);
+
+
+// String semiring: (longest_common_prefix/suffix, ., Infinity, Epsilon)
+template <typename L, StringType S>
+class StringWeight {
+ public:
+  typedef L Label;
+  typedef StringWeight<L, REVERSE_STRING_TYPE(S)> ReverseWeight;
+
+  friend class StringWeightIterator<L, S>;
+  friend class StringWeightReverseIterator<L, S>;
+  friend bool operator==<>(const StringWeight<L, S> &,
+                           const StringWeight<L, S> &);
+
+  StringWeight() { Init(); }
+
+  template <typename Iter>
+  StringWeight(const Iter &begin, const Iter &end) {
+    Init();
+    for (Iter iter = begin; iter != end; ++iter)
+      PushBack(*iter);
+  }
+
+  explicit StringWeight(L l) { Init(); PushBack(l); }
+
+  static const StringWeight<L, S> &Zero() {
+    static const StringWeight<L, S> zero(kStringInfinity);
+    return zero;
+  }
+
+  static const StringWeight<L, S> &One() {
+    static const StringWeight<L, S> one;
+    return one;
+  }
+
+  static const string &Type() {
+    static const string type =
+        S == STRING_LEFT ? "string" :
+        (S == STRING_RIGHT ? "right_string" :
+         (S == STRING_LEFT_RESTRICT ? "restricted_string" :
+          "right_restricted_string"));
+    return type;
+  }
+
+  bool Member() const;
+
+  istream &Read(istream &strm);
+
+  ostream &Write(ostream &strm) const;
+
+  ssize_t Hash() const;
+
+  StringWeight<L, S> Quantize(float delta = kDelta) const {
+    return *this;
+  }
+
+  ReverseWeight Reverse() const;
+
+  static uint64 Properties() {
+    return (S == STRING_LEFT || S == STRING_LEFT_RESTRICT ?
+            kLeftSemiring : kRightSemiring) | kIdempotent;
+  }
+
+  // NB: This needs to be uncommented only if default fails for this impl.
+  // StringWeight<L, S> &operator=(const StringWeight<L, S> &w);
+
+  // These operations combined with the StringWeightIterator and
+  // StringWeightReverseIterator provide the access and mutation of
+  // the string internal elements.
+
+  // Common initializer among constructors.
+  void Init() { first_ = 0; }
+
+  // Clear existing StringWeight.
+  void Clear() { first_ = 0; rest_.clear(); }
+
+  Label Size() const { return first_ ? rest_.size() + 1 : 0; }
+
+  void PushFront(L l) {
+    if (first_)
+      rest_.push_front(first_);
+    first_ = l;
+  }
+
+  void PushBack(L l) {
+    if (!first_)
+      first_ = l;
+    else
+      rest_.push_back(l);
+  }
+
+ private:
+  L first_;         // first label in string (0 if empty)
+  list<L> rest_;    // remaining labels in string
+};
+
+
+// Traverses string in forward direction.
+template <typename L, StringType S>
+class StringWeightIterator {
+ public:
+  explicit StringWeightIterator(const StringWeight<L, S>& w)
+      : first_(w.first_), rest_(w.rest_), init_(true),
+        iter_(rest_.begin()) {}
+
+  bool Done() const {
+    if (init_) return first_ == 0;
+    else return iter_ == rest_.end();
+  }
+
+  const L& Value() const { return init_ ? first_ : *iter_; }
+
+  void Next() {
+    if (init_) init_ = false;
+    else  ++iter_;
+  }
+
+  void Reset() {
+    init_ = true;
+    iter_ = rest_.begin();
+  }
+
+ private:
+  const L &first_;
+  const list<L> &rest_;
+  bool init_;   // in the initialized state?
+  typename list<L>::const_iterator iter_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(StringWeightIterator);
+};
+
+
+// Traverses string in forward direction.
+template <typename L, StringType S>
+class StringWeightReverseIterator {
+ public:
+  explicit StringWeightReverseIterator(const StringWeight<L, S>& w)
+      : first_(w.first_), rest_(w.rest_), fin_(first_ == 0),
+        iter_(rest_.rbegin()) {}
+
+  bool Done() const { return fin_; }
+
+  const L& Value() const { return iter_ == rest_.rend() ? first_ : *iter_; }
+
+  void Next() {
+    if (iter_ == rest_.rend()) fin_ = true;
+    else  ++iter_;
+  }
+
+  void Reset() {
+    fin_ = false;
+    iter_ = rest_.rbegin();
+  }
+
+ private:
+  const L &first_;
+  const list<L> &rest_;
+  bool fin_;   // in the final state?
+  typename list<L>::const_reverse_iterator iter_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(StringWeightReverseIterator);
+};
+
+
+// StringWeight member functions follow that require
+// StringWeightIterator or StringWeightReverseIterator.
+
+template <typename L, StringType S>
+inline istream &StringWeight<L, S>::Read(istream &strm) {
+  Clear();
+  int32 size = 0;
+  ReadType(strm, &size);
+  for (int i = 0; i < size; ++i) {
+    L label;
+    ReadType(strm, &label);
+    PushBack(label);
+  }
+  return strm;
+}
+
+template <typename L, StringType S>
+inline ostream &StringWeight<L, S>::Write(ostream &strm) const {
+  int32 size =  Size();
+  WriteType(strm, size);
+  for (StringWeightIterator<L, S> iter(*this); !iter.Done(); iter.Next()) {
+    L label = iter.Value();
+    WriteType(strm, label);
+  }
+  return strm;
+}
+
+template <typename L, StringType S>
+inline bool StringWeight<L, S>::Member() const {
+  if (Size() != 1)
+    return true;
+  StringWeightIterator<L, S> iter(*this);
+  return iter.Value() != kStringBad;
+}
+
+template <typename L, StringType S>
+inline typename StringWeight<L, S>::ReverseWeight
+StringWeight<L, S>::Reverse() const {
+  ReverseWeight rw;
+  for (StringWeightIterator<L, S> iter(*this); !iter.Done(); iter.Next())
+    rw.PushFront(iter.Value());
+  return rw;
+}
+
+template <typename L, StringType S>
+inline ssize_t StringWeight<L, S>::Hash() const {
+  size_t h = 0;
+  for (StringWeightIterator<L, S> iter(*this); !iter.Done(); iter.Next())
+    h ^= h<<1 ^ iter.Value();
+  return static_cast<ssize_t>(h);
+}
+
+// NB: This needs to be uncommented only if default fails for this the impl.
+//
+// template <typename L, StringType S>
+// inline StringWeight<L, S>
+// &StringWeight<L, S>::operator=(const StringWeight<L, S> &w) {
+//   if (this != &w) {
+//     Clear();
+//     for (StringWeightIterator<L, S> iter(w); !iter.Done(); iter.Next())
+//       PushBack(iter.Value());
+//   }
+//   return *this;
+// }
+
+template <typename L, StringType S>
+inline bool operator==(const StringWeight<L, S> &w1,
+                       const StringWeight<L, S> &w2) {
+  if (w1.Size() != w2.Size())
+    return false;
+
+  StringWeightIterator<L, S> iter1(w1);
+  StringWeightIterator<L, S> iter2(w2);
+
+  for (; !iter1.Done() ; iter1.Next(), iter2.Next())
+    if (iter1.Value() != iter2.Value())
+      return false;
+
+  return true;
+}
+
+template <typename L, StringType S>
+inline bool operator!=(const StringWeight<L, S> &w1,
+                       const StringWeight<L, S> &w2) {
+  return !(w1 == w2);
+}
+
+template <typename L, StringType S>
+inline bool ApproxEqual(const StringWeight<L, S> &w1,
+                        const StringWeight<L, S> &w2,
+                        float delta = kDelta) {
+  return w1 == w2;
+}
+
+template <typename L, StringType S>
+inline ostream &operator<<(ostream &strm, const StringWeight<L, S> &w) {
+  StringWeightIterator<L, S> iter(w);
+  if (iter.Done())
+    return strm << "Epsilon";
+  else if (iter.Value() == kStringInfinity)
+    return strm << "Infinity";
+  else if (iter.Value() == kStringBad)
+    return strm << "BadString";
+  else
+    for (size_t i = 0; !iter.Done(); ++i, iter.Next()) {
+      if (i > 0)
+        strm << kStringSeparator;
+      strm << iter.Value();
+    }
+  return strm;
+}
+
+template <typename L, StringType S>
+inline istream &operator>>(istream &strm, StringWeight<L, S> &w) {
+  string s;
+  strm >> s;
+  if (s == "Infinity") {
+    w = StringWeight<L, S>::Zero();
+  } else if (s == "Epsilon") {
+    w = StringWeight<L, S>::One();
+  } else {
+    w.Clear();
+    char *p = 0;
+    for (const char *cs = s.c_str(); !p || *p != '\0'; cs = p + 1) {
+      int l = strtoll(cs, &p, 10);
+      if (p == cs || *p != 0 && *p != kStringSeparator) {
+        strm.clear(std::ios::badbit);
+        break;
+      }
+      w.PushBack(l);
+    }
+  }
+  return strm;
+}
+
+
+// Default is for the restricted left and right semirings.  String
+// equality is required (for non-Zero() input. This restriction
+// is used in e.g. Determinize to ensure functional input.
+template <typename L, StringType S>  inline StringWeight<L, S>
+Plus(const StringWeight<L, S> &w1,
+     const StringWeight<L, S> &w2) {
+  if (w1 == StringWeight<L, S>::Zero())
+    return w2;
+  if (w2 == StringWeight<L, S>::Zero())
+    return w1;
+
+  if (w1 != w2)
+    LOG(FATAL) << "StringWeight::Plus: unequal arguments "
+               << "(non-functional FST?)";
+
+  return w1;
+}
+
+
+// Longest common prefix for left string semiring.
+template <typename L>  inline StringWeight<L, STRING_LEFT>
+Plus(const StringWeight<L, STRING_LEFT> &w1,
+     const StringWeight<L, STRING_LEFT> &w2) {
+  if (w1 == StringWeight<L, STRING_LEFT>::Zero())
+    return w2;
+  if (w2 == StringWeight<L, STRING_LEFT>::Zero())
+    return w1;
+
+  StringWeight<L, STRING_LEFT> sum;
+  StringWeightIterator<L, STRING_LEFT> iter1(w1);
+  StringWeightIterator<L, STRING_LEFT> iter2(w2);
+  for (; !iter1.Done() && !iter2.Done() && iter1.Value() == iter2.Value();
+       iter1.Next(), iter2.Next())
+    sum.PushBack(iter1.Value());
+  return sum;
+}
+
+
+// Longest common suffix for right string semiring.
+template <typename L>  inline StringWeight<L, STRING_RIGHT>
+Plus(const StringWeight<L, STRING_RIGHT> &w1,
+     const StringWeight<L, STRING_RIGHT> &w2) {
+  if (w1 == StringWeight<L, STRING_RIGHT>::Zero())
+    return w2;
+  if (w2 == StringWeight<L, STRING_RIGHT>::Zero())
+    return w1;
+
+  StringWeight<L, STRING_RIGHT> sum;
+  StringWeightReverseIterator<L, STRING_RIGHT> iter1(w1);
+  StringWeightReverseIterator<L, STRING_RIGHT> iter2(w2);
+  for (; !iter1.Done() && !iter2.Done() && iter1.Value() == iter2.Value();
+       iter1.Next(), iter2.Next())
+    sum.PushFront(iter1.Value());
+  return sum;
+}
+
+
+template <typename L, StringType S>
+inline StringWeight<L, S> Times(const StringWeight<L, S> &w1,
+                             const StringWeight<L, S> &w2) {
+  if (w1 == StringWeight<L, S>::Zero() || w2 == StringWeight<L, S>::Zero())
+    return StringWeight<L, S>::Zero();
+
+  StringWeight<L, S> prod(w1);
+  for (StringWeightIterator<L, S> iter(w2); !iter.Done(); iter.Next())
+    prod.PushBack(iter.Value());
+
+  return prod;
+}
+
+
+// Default is for left division in the left string and the
+// left restricted string semirings.
+template <typename L, StringType S> inline StringWeight<L, S>
+Divide(const StringWeight<L, S> &w1,
+       const StringWeight<L, S> &w2,
+       DivideType typ) {
+
+  if (typ != DIVIDE_LEFT)
+    LOG(FATAL) << "StringWeight::Divide: only left division is defined "
+               << "for the " << StringWeight<L, S>::Type() << " semiring";
+
+  if (w2 == StringWeight<L, S>::Zero())
+    return StringWeight<L, S>(kStringBad);
+  else if (w1 == StringWeight<L, S>::Zero())
+    return StringWeight<L, S>::Zero();
+
+  StringWeight<L, S> div;
+  StringWeightIterator<L, S> iter(w1);
+  for (int i = 0; !iter.Done(); iter.Next(), ++i) {
+    if (i >= w2.Size())
+      div.PushBack(iter.Value());
+  }
+  return div;
+}
+
+
+// Right division in the right string semiring.
+template <typename L> inline StringWeight<L, STRING_RIGHT>
+Divide(const StringWeight<L, STRING_RIGHT> &w1,
+       const StringWeight<L, STRING_RIGHT> &w2,
+       DivideType typ) {
+
+  if (typ != DIVIDE_RIGHT)
+    LOG(FATAL) << "StringWeight::Divide: only right division is defined "
+               << "for the right string semiring";
+
+  if (w2 == StringWeight<L, STRING_RIGHT>::Zero())
+    return StringWeight<L, STRING_RIGHT>(kStringBad);
+  else if (w1 == StringWeight<L, STRING_RIGHT>::Zero())
+    return StringWeight<L, STRING_RIGHT>::Zero();
+
+  StringWeight<L, STRING_RIGHT> div;
+  StringWeightReverseIterator<L, STRING_RIGHT> iter(w1);
+  for (int i = 0; !iter.Done(); iter.Next(), ++i) {
+    if (i >= w2.Size())
+      div.PushFront(iter.Value());
+  }
+  return div;
+}
+
+
+// Right division in the right restricted string semiring.
+template <typename L> inline StringWeight<L, STRING_RIGHT_RESTRICT>
+Divide(const StringWeight<L, STRING_RIGHT_RESTRICT> &w1,
+       const StringWeight<L, STRING_RIGHT_RESTRICT> &w2,
+       DivideType typ) {
+
+  if (typ != DIVIDE_RIGHT)
+    LOG(FATAL) << "StringWeight::Divide: only right division is defined "
+               << "for the right restricted string semiring";
+
+  if (w2 == StringWeight<L, STRING_RIGHT_RESTRICT>::Zero())
+    return StringWeight<L, STRING_RIGHT_RESTRICT>(kStringBad);
+  else if (w1 == StringWeight<L, STRING_RIGHT_RESTRICT>::Zero())
+    return StringWeight<L, STRING_RIGHT_RESTRICT>::Zero();
+
+  StringWeight<L, STRING_RIGHT_RESTRICT> div;
+  StringWeightReverseIterator<L, STRING_RIGHT_RESTRICT> iter(w1);
+  for (int i = 0; !iter.Done(); iter.Next(), ++i) {
+    if (i >= w2.Size())
+      div.PushFront(iter.Value());
+  }
+  return div;
+}
+
+
+// Product of string weight and an arbitray weight.
+template <class L, class W, StringType S = STRING_LEFT>
+struct GallicWeight : public ProductWeight<StringWeight<L, S>, W> {
+  typedef GallicWeight<L, typename W::ReverseWeight, REVERSE_STRING_TYPE(S)>
+  ReverseWeight;
+
+  GallicWeight() {}
+
+  GallicWeight(StringWeight<L, S> w1, W w2)
+      : ProductWeight<StringWeight<L, S>, W>(w1, w2) {}
+
+  explicit GallicWeight(const string &s, int *nread = 0)
+      : ProductWeight<StringWeight<L, S>, W>(s, nread) {}
+
+  GallicWeight(const ProductWeight<StringWeight<L, S>, W> &w)
+      : ProductWeight<StringWeight<L, S>, W>(w) {}
+};
+
+}  // namespace fst;
+
+#endif  // FST_LIB_STRING_WEIGHT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/symbol-table.cpp b/tools/thirdparty/OpenFst/fst/lib/symbol-table.cpp
new file mode 100644
index 0000000..7dd61f2
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/symbol-table.cpp
@@ -0,0 +1,156 @@
+// symbol-table.cc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Classes to provide symbol-to-integer and integer-to-symbol mappings.
+
+#include "fst/lib/symbol-table.h"
+#include "fst/lib/util.h"
+
+DEFINE_bool(fst_compat_symbols, true,
+            "Require symbol tables to match when appropriate");
+
+namespace fst {
+
+// Maximum line length in textual symbols file.
+const int kLineLen = 8096;
+
+// Identifies stream data as a symbol table (and its endianity)
+static const int32 kSymbolTableMagicNumber = 2125658996;
+
+SymbolTableImpl* SymbolTableImpl::ReadText(const string &filename) {
+  ifstream strm(filename.c_str());
+  if (!strm) {
+    LOG(ERROR) << "SymbolTable::ReadText: Can't open symbol file: "
+               << filename;
+    return 0;
+  }
+
+  SymbolTableImpl* impl = new SymbolTableImpl(filename);
+
+  int64 nline = 0;
+  char line[kLineLen];
+  while (strm.getline(line, kLineLen)) {
+    ++nline;
+    vector<char *> col;
+    SplitToVector(line, "\n\t ", &col, true);
+    if (col.size() == 0)  // empty line
+      continue;
+    if (col.size() != 2) {
+      LOG(ERROR) << "SymbolTable::ReadText: Bad number of columns (skipping), "
+                 << "file = " << filename << ", line = " << nline;
+      continue;
+    }
+    const char *symbol = col[0];
+    const char *value = col[1];
+    char *p;
+    int64 key = strtoll(value, &p, 10);
+    if (p < value + strlen(value) || key < 0) {
+      LOG(ERROR) << "SymbolTable::ReadText: Bad non-negative integer \""
+                 << value << "\" (skipping), "
+                 << "file = " << filename << ", line = " << nline;
+      continue;
+    }
+    impl->AddSymbol(symbol, key);
+  }
+
+  return impl;
+}
+
+void SymbolTableImpl::RecomputeCheckSum() const {
+  check_sum_.Reset();
+  for (size_t i = 0; i < symbols_.size(); ++i) {
+    check_sum_.Update(symbols_[i], strlen(symbols_[i])+1);
+  }
+  check_sum_finalized_ = true;
+}
+
+int64 SymbolTableImpl::AddSymbol(const string& symbol, int64 key) {
+  hash_map<string, int64>::const_iterator it =
+    symbol_map_.find(symbol);
+  if (it == symbol_map_.end()) {  // only add if not in table
+    check_sum_finalized_ = false;
+
+    char *csymbol = new char[symbol.size() + 1];
+    strcpy(csymbol, symbol.c_str());
+    symbols_.push_back(csymbol);
+    key_map_[key] = csymbol;
+    symbol_map_[csymbol] = key;
+
+    if (key >= available_key_) {
+      available_key_ = key + 1;
+    }
+  }
+
+  return key;
+}
+
+SymbolTableImpl* SymbolTableImpl::Read(istream &strm,
+                                       const string &source) {
+  int32 magic_number = 0;
+  ReadType(strm, &magic_number);
+  if (magic_number != kSymbolTableMagicNumber) {
+    LOG(ERROR) << "SymbolTable::Read: read failed";
+    return 0;
+  }
+  string name;
+  ReadType(strm, &name);
+  SymbolTableImpl* impl = new SymbolTableImpl(name);
+  ReadType(strm, &impl->available_key_);
+  int64 size;
+  ReadType(strm, &size);
+  string symbol;
+  int64 key = 0;
+  for (size_t i = 0; i < size; ++i) {
+    ReadType(strm, &symbol);
+    ReadType(strm, &key);
+    impl->AddSymbol(symbol, key);
+  }
+  if (!strm)
+    LOG(ERROR) << "SymbolTable::Read: read failed";
+  return impl;
+}
+
+bool SymbolTableImpl::Write(ostream &strm) const {
+  WriteType(strm, kSymbolTableMagicNumber);
+  WriteType(strm, name_);
+  WriteType(strm, available_key_);
+  int64 size = symbols_.size();
+  WriteType(strm, size);
+  for (size_t i = 0; i < symbols_.size(); ++i) {
+    const string symbol = symbols_[i];
+    WriteType(strm, symbol);
+    hash_map<string, int64>::const_iterator it = symbol_map_.find(symbol);
+    WriteType(strm, it->second);
+  }
+  strm.flush();
+  if (!strm)
+    LOG(ERROR) << "SymbolTable::Write: write failed";
+  return strm;
+}
+
+bool SymbolTableImpl::WriteText(ostream &strm) const {
+  for (size_t i = 0; i < symbols_.size(); ++i) {
+    char line[kLineLen];
+    snprintf(line, kLineLen, "%s\t%lld\n", symbols_[i], Find(symbols_[i]));
+    strm.write(line, strlen(line));
+  }
+  strm.flush();
+  if (!strm)
+    LOG(ERROR) << "SymbolTable::WriteText: write failed";
+  return strm;
+}
+
+}  // namespace fst
diff --git a/tools/thirdparty/OpenFst/fst/lib/symbol-table.h b/tools/thirdparty/OpenFst/fst/lib/symbol-table.h
new file mode 100644
index 0000000..0a67f29
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/symbol-table.h
@@ -0,0 +1,387 @@
+// symbol-table.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Classes to provide symbol-to-integer and integer-to-symbol mappings.
+
+#ifndef FST_LIB_SYMBOL_TABLE_H__
+#define FST_LIB_SYMBOL_TABLE_H__
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "fst/lib/compat.h"
+
+
+
+DECLARE_bool(fst_compat_symbols);
+
+namespace fst {
+
+class SymbolTableImpl {
+  friend class SymbolTableIterator;
+ public:
+  SymbolTableImpl(const string &name)
+      : name_(name), available_key_(0), ref_count_(1),
+        check_sum_finalized_(false) {}
+  ~SymbolTableImpl() {
+    for (size_t i = 0; i < symbols_.size(); ++i)
+      delete[] symbols_[i];
+  }
+
+  int64 AddSymbol(const string& symbol, int64 key);
+
+  int64 AddSymbol(const string& symbol) {
+    int64 key = Find(symbol);
+    return (key == -1) ? AddSymbol(symbol, available_key_++) : key;
+  }
+
+  void AddTable(SymbolTableImpl* table) {
+    for (size_t i = 0; i < table->symbols_.size(); ++i) {
+      AddSymbol(table->symbols_[i]);
+    }
+  }
+
+  static SymbolTableImpl* ReadText(const string& filename);
+
+  static SymbolTableImpl* Read(istream &strm, const string& source);
+
+  bool Write(ostream &strm) const;
+
+  bool WriteText(ostream &strm) const;
+
+  //
+  // Return the string associated with the key. If the key is out of
+  // range (<0, >max), return an empty string.
+  string Find(int64 key) const {
+    hash_map<int64, string>::const_iterator it =
+      key_map_.find(key);
+    if (it == key_map_.end()) {
+      return "";
+    }
+    return it->second;
+  }
+
+  //
+  // Return the key associated with the symbol. If the symbol
+  // does not exists, return -1.
+  int64 Find(const string& symbol) const {
+    return Find(symbol.c_str());
+  }
+
+  //
+  // Return the key associated with the symbol. If the symbol
+  // does not exists, return -1.
+  int64 Find(const char* symbol) const {
+    hash_map<string, int64>::const_iterator it =
+      symbol_map_.find(symbol);
+    if (it == symbol_map_.end()) {
+      return -1;
+    }
+    return it->second;
+  }
+
+  const string& Name() const { return name_; }
+
+  int IncrRefCount() const {
+    return ++ref_count_;
+  }
+  int DecrRefCount() const {
+    return --ref_count_;
+  }
+
+  string CheckSum() const {
+    if (!check_sum_finalized_) {
+      RecomputeCheckSum();
+      check_sum_string_ = check_sum_.Digest();
+    }
+    return check_sum_string_;
+  }
+
+  int64 AvailableKey() const {
+    return available_key_;
+  }
+
+  // private support methods
+ private:
+  void RecomputeCheckSum() const;
+  static SymbolTableImpl* Read1(istream &, const string &);
+
+  string name_;
+  int64 available_key_;
+  vector<const char *> symbols_;
+  hash_map<int64, string> key_map_;
+  hash_map<string, int64> symbol_map_;
+
+  mutable int ref_count_;
+  mutable bool check_sum_finalized_;
+  mutable MD5 check_sum_;
+  mutable string check_sum_string_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(SymbolTableImpl);
+};
+
+
+class SymbolTableIterator;
+
+//
+// \class SymbolTable
+// \brief Symbol (string) to int and reverse mapping
+//
+// The SymbolTable implements the mappings of labels to strings and reverse.
+// SymbolTables are used to describe the alphabet of the input and output
+// labels for arcs in a Finite State Transducer.
+//
+// SymbolTables are reference counted and can therefore be shared across
+// multiple machines. For example a language model grammar G, with a
+// SymbolTable for the words in the language model can share this symbol
+// table with the lexical representation L o G.
+//
+class SymbolTable {
+  friend class SymbolTableIterator;
+ public:
+  static const int64 kNoSymbol = -1;
+
+  // Construct symbol table with a unique name.
+  SymbolTable(const string& name) : impl_(new SymbolTableImpl(name)) {}
+
+  // Create a reference counted copy.
+  SymbolTable(const SymbolTable& table) : impl_(table.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  // Derefence implentation object. When reference count hits 0, delete
+  // implementation.
+  ~SymbolTable() {
+    if (!impl_->DecrRefCount()) delete impl_;
+  }
+
+  // create a reference counted copy
+  SymbolTable* Copy() const {
+    return new SymbolTable(*this);
+  }
+
+  // Add a symbol with given key to table. A symbol table also
+  // keeps track of the last available key (highest key value in
+  // the symbol table).
+  //
+  // \param symbol string symbol to add
+  // \param key associated key for string symbol
+  // \return the key created by the symbol table. Symbols allready added to
+  //         the symbol table will not get a different key.
+  int64 AddSymbol(const string& symbol, int64 key) {
+    return impl_->AddSymbol(symbol, key);
+  }
+
+  // Add a symbol to the table. The associated value key is automatically
+  // assigned by the symbol table.
+  //
+  // \param symbol string to add to the table
+  // \return the value key assigned to the associated string symbol
+  int64 AddSymbol(const string& symbol) {
+    return impl_->AddSymbol(symbol);
+  }
+
+  // Add another symbol table to this table. All key values will be offset
+  // by the current available key (highest key value in the symbol table).
+  // Note string symbols with the same key value with still have the same
+  // key value after the symbol table has been merged, but a different
+  // value. Adding symbol tables do not result in changes in the base table.
+  //
+  // Merging N symbol tables is often useful when combining the various
+  // name spaces of transducers to a unified representation.
+  //
+  // \param table the symbol table to add to this table
+  void AddTable(const SymbolTable& table) {
+    return impl_->AddTable(table.impl_);
+  }
+
+  // return the name of the symbol table
+  const string& Name() const {
+    return impl_->Name();
+  }
+
+  // return the MD5 check-sum for this table. All new symbols added to
+  // the table will result in an updated checksum.
+  string CheckSum() const {
+    return impl_->CheckSum();
+  }
+
+  // read an ascii representation of the symbol table
+  static SymbolTable* ReadText(const string& filename) {
+    SymbolTableImpl* impl = SymbolTableImpl::ReadText(filename);
+    if (!impl)
+      return 0;
+    else
+      return new SymbolTable(impl);
+  }
+
+  // read a binary dump of the symbol table
+  static SymbolTable* Read(istream &strm, const string& source) {
+    SymbolTableImpl* impl = SymbolTableImpl::Read(strm, source);
+    if (!impl)
+      return 0;
+    else
+      return new SymbolTable(impl);
+  }
+
+  // read a binary dump of the symbol table
+  static SymbolTable* Read(const string& filename) {
+    ifstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "SymbolTable::Read: Can't open file " << filename;
+      return 0;
+    }
+    return Read(strm, filename);
+  }
+
+  bool Write(ostream  &strm) const {
+    return impl_->Write(strm);
+  }
+
+  bool Write(const string& filename) const {
+    ofstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "SymbolTable::Write: Can't open file " << filename;
+      return false;
+    }
+    return Write(strm);
+  }
+
+  // Dump an ascii text representation of the symbol table
+  bool WriteText(ostream &strm) const {
+    return impl_->WriteText(strm);
+  }
+
+  // Dump an ascii text representation of the symbol table
+  bool WriteText(const string& filename) const {
+    ofstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "SymbolTable::WriteText: Can't open file " << filename;
+      return false;
+    }
+    return WriteText(strm);
+  }
+
+  // Return the string associated with the key. If the key is out of
+  // range (<0, >max), log error and return an empty string.
+  string Find(int64 key) const {
+    return impl_->Find(key);
+  }
+
+  // Return the key associated with the symbol. If the symbol
+  // does not exists, log error and  return -1
+  int64 Find(const string& symbol) const {
+    return impl_->Find(symbol);
+  }
+
+  // Return the key associated with the symbol. If the symbol
+  // does not exists, log error and  return -1
+  int64 Find(const char* symbol) const {
+    return impl_->Find(symbol);
+  }
+
+  // return the current available key (i.e highest key number) in
+  // the symbol table
+  int64 AvailableKey(void) const {
+    return impl_->AvailableKey();
+  }
+
+ protected:
+  explicit SymbolTable(SymbolTableImpl* impl) : impl_(impl) {}
+
+  const SymbolTableImpl* Impl() const {
+    return impl_;
+  }
+
+ private:
+  SymbolTableImpl* impl_;
+
+
+  void operator=(const SymbolTable &table);  // disallow
+};
+
+
+//
+// \class SymbolTableIterator
+// \brief Iterator class for symbols in a symbol table
+class SymbolTableIterator {
+ public:
+  // Constructor creates a refcounted copy of underlying implementation
+  SymbolTableIterator(const SymbolTable& symbol_table) {
+    impl_ = symbol_table.Impl();
+    impl_->IncrRefCount();
+    pos_ = 0;
+    size_ = impl_->symbols_.size();
+  }
+
+  // decrement implementation refcount, and delete if 0
+  ~SymbolTableIterator() {
+    if (!impl_->DecrRefCount()) delete impl_;
+  }
+
+  // is iterator done
+  bool Done(void) {
+    return (pos_ == size_);
+  }
+
+  // return the Value() of the current symbol (in64 key)
+  int64 Value(void) {
+    return impl_->Find(impl_->symbols_[pos_]);
+  }
+
+  // return the string of the current symbol
+  const char* Symbol(void) {
+    return impl_->symbols_[pos_];
+  }
+
+  // advance iterator forward
+  void Next(void) {
+    if (Done()) return;
+    ++pos_;
+  }
+
+  // reset iterator
+  void Reset(void) {
+    pos_ = 0;
+  }
+
+ private:
+  const SymbolTableImpl* impl_;
+  size_t pos_;
+  size_t size_;
+};
+
+
+// Tests compatibilty between two sets of symbol tables
+inline bool CompatSymbols(const SymbolTable *syms1,
+                          const SymbolTable *syms2) {
+  if (!FLAGS_fst_compat_symbols)
+    return true;
+  else if (!syms1 && !syms2)
+    return true;
+  else if (syms1 && !syms2 || !syms1 && syms2)
+    return false;
+  else
+    return syms1->CheckSum() == syms2->CheckSum();
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_SYMBOL_TABLE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/synchronize.h b/tools/thirdparty/OpenFst/fst/lib/synchronize.h
new file mode 100644
index 0000000..cf416d6
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/synchronize.h
@@ -0,0 +1,459 @@
+// synchronize.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: allauzen@cs.nyu.edu (Cyril Allauzen)
+//
+// \file
+// Synchronize an FST with bounded delay.
+
+#ifndef FST_LIB_SYNCHRONIZE_H__
+#define FST_LIB_SYNCHRONIZE_H__
+
+#include <algorithm>
+
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+
+#include "fst/lib/cache.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+typedef CacheOptions SynchronizeFstOptions;
+
+
+// Implementation class for SynchronizeFst
+template <class A>
+class SynchronizeFstImpl
+    : public CacheImpl<A> {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::SetInputSymbols;
+  using FstImpl<A>::SetOutputSymbols;
+
+  using CacheBaseImpl< CacheState<A> >::HasStart;
+  using CacheBaseImpl< CacheState<A> >::HasFinal;
+  using CacheBaseImpl< CacheState<A> >::HasArcs;
+
+  typedef A Arc;
+  typedef typename A::Label Label;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  typedef basic_string<Label> String;
+
+  struct Element {
+    Element() {}
+
+    Element(StateId s, const String *i, const String *o)
+        : state(s), istring(i), ostring(o) {}
+
+    StateId state;     // Input state Id
+    const String *istring;     // Residual input labels
+    const String *ostring;     // Residual output labels
+    // Residual strings are represented by const pointers to
+    // basic_string<Label> and are stored in a hash_set. The pointed
+    // memory is owned by the hash_set string_set_.
+  };
+
+  SynchronizeFstImpl(const Fst<A> &fst, const SynchronizeFstOptions &opts)
+      : CacheImpl<A>(opts), fst_(fst.Copy()) {
+    SetType("synchronize");
+    uint64 props = fst.Properties(kFstProperties, false);
+    SetProperties(SynchronizeProperties(props), kCopyProperties);
+
+    SetInputSymbols(fst.InputSymbols());
+    SetOutputSymbols(fst.OutputSymbols());
+  }
+
+  ~SynchronizeFstImpl() {
+    delete fst_;
+    // Extract pointers from the hash set
+    vector<const String*> strings;
+    typename StringSet::iterator it = string_set_.begin();
+    for (; it != string_set_.end(); ++it)
+      strings.push_back(*it);
+    // Free the extracted pointers
+    for (size_t i = 0; i < strings.size(); ++i)
+      delete strings[i];
+  }
+
+  StateId Start() {
+    if (!HasStart()) {
+      StateId s = fst_->Start();
+      if (s == kNoStateId)
+        return kNoStateId;
+      const String *empty = FindString(new String());
+      StateId start = FindState(Element(fst_->Start(), empty, empty));
+      SetStart(start);
+    }
+    return CacheImpl<A>::Start();
+  }
+
+  Weight Final(StateId s) {
+    if (!HasFinal(s)) {
+      const Element &e = elements_[s];
+      Weight w = e.state == kNoStateId ? Weight::One() : fst_->Final(e.state);
+      if ((w != Weight::Zero()) && (e.istring)->empty() && (e.ostring)->empty())
+        SetFinal(s, w);
+      else
+        SetFinal(s, Weight::Zero());
+    }
+    return CacheImpl<A>::Final(s);
+  }
+
+  size_t NumArcs(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumArcs(s);
+  }
+
+  size_t NumInputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumInputEpsilons(s);
+  }
+
+  size_t NumOutputEpsilons(StateId s) {
+    if (!HasArcs(s))
+      Expand(s);
+    return CacheImpl<A>::NumOutputEpsilons(s);
+  }
+
+  void InitArcIterator(StateId s, ArcIteratorData<A> *data) {
+    if (!HasArcs(s))
+      Expand(s);
+    CacheImpl<A>::InitArcIterator(s, data);
+  }
+
+  // Returns the first character of the string obtained by
+  // concatenating s and l.
+  Label Car(const String *s, Label l = 0) const {
+    if (!s->empty())
+      return (*s)[0];
+    else
+      return l;
+  }
+
+  // Computes the residual string obtained by removing the first
+  // character in the concatenation of s and l.
+  const String *Cdr(const String *s, Label l = 0) {
+    String *r = new String();
+    for (int i = 1; i < s->size(); ++i)
+      r->push_back((*s)[i]);
+    if (l && !(s->empty())) r->push_back(l);
+    return FindString(r);
+  }
+
+  // Computes the concatenation of s and l.
+  const String *Concat(const String *s, Label l = 0) {
+    String *r = new String();
+    for (int i = 0; i < s->size(); ++i)
+      r->push_back((*s)[i]);
+    if (l) r->push_back(l);
+    return FindString(r);
+  }
+
+  // Tests if the concatenation of s and l is empty
+  bool Empty(const String *s, Label l = 0) const {
+    if (s->empty())
+      return l == 0;
+    else
+      return false;
+  }
+
+  // Finds the string pointed by s in the hash set. Transfers the
+  // pointer ownership to the hash set.
+  const String *FindString(const String *s) {
+    typename StringSet::iterator it = string_set_.find(s);
+    if (it != string_set_.end()) {
+      delete s;
+      return (*it);
+    } else {
+      string_set_.insert(s);
+      return s;
+    }
+  }
+
+  // Finds state corresponding to an element. Creates new state
+  // if element not found.
+  StateId FindState(const Element &e) {
+    typename ElementMap::iterator eit = element_map_.find(e);
+    if (eit != element_map_.end()) {
+      return (*eit).second;
+    } else {
+      StateId s = elements_.size();
+      elements_.push_back(e);
+      element_map_.insert(pair<const Element, StateId>(e, s));
+      return s;
+    }
+  }
+
+
+  // Computes the outgoing transitions from a state, creating new destination
+  // states as needed.
+  void Expand(StateId s) {
+    Element e = elements_[s];
+
+    if (e.state != kNoStateId)
+      for (ArcIterator< Fst<A> > ait(*fst_, e.state);
+           !ait.Done();
+           ait.Next()) {
+        const A &arc = ait.Value();
+        if (!Empty(e.istring, arc.ilabel)  && !Empty(e.ostring, arc.olabel)) {
+          const String *istring = Cdr(e.istring, arc.ilabel);
+          const String *ostring = Cdr(e.ostring, arc.olabel);
+          StateId d = FindState(Element(arc.nextstate, istring, ostring));
+          AddArc(s, Arc(Car(e.istring, arc.ilabel),
+                        Car(e.ostring, arc.olabel), arc.weight, d));
+        } else {
+          const String *istring = Concat(e.istring, arc.ilabel);
+          const String *ostring = Concat(e.ostring, arc.olabel);
+          StateId d = FindState(Element(arc.nextstate, istring, ostring));
+          AddArc(s, Arc(0 , 0, arc.weight, d));
+        }
+      }
+
+    Weight w = e.state == kNoStateId ? Weight::One() : fst_->Final(e.state);
+    if ((w != Weight::Zero()) &&
+        ((e.istring)->size() + (e.ostring)->size() > 0)) {
+      const String *istring = Cdr(e.istring);
+      const String *ostring = Cdr(e.ostring);
+      StateId d = FindState(Element(kNoStateId, istring, ostring));
+      AddArc(s, Arc(Car(e.istring), Car(e.ostring), w, d));
+    }
+    SetArcs(s);
+  }
+
+ private:
+  // Equality function for Elements, assume strings have been hashed.
+  class ElementEqual {
+   public:
+    bool operator()(const Element &x, const Element &y) const {
+      return x.state == y.state &&
+              x.istring == y.istring &&
+              x.ostring == y.ostring;
+    }
+  };
+
+  // Hash function for Elements to Fst states.
+  class ElementKey {
+   public:
+    size_t operator()(const Element &x) const {
+      size_t key = x.state;
+      key = (key << 1) ^ (x.istring)->size();
+      for (size_t i = 0; i < (x.istring)->size(); ++i)
+        key = (key << 1) ^ (*x.istring)[i];
+      key = (key << 1) ^ (x.ostring)->size();
+      for (size_t i = 0; i < (x.ostring)->size(); ++i)
+        key = (key << 1) ^ (*x.ostring)[i];
+      return key;
+    }
+  };
+
+  // Equality function for strings
+  class StringEqual {
+   public:
+    bool operator()(const String * const &x, const String * const &y) const {
+      if (x->size() != y->size()) return false;
+      for (size_t i = 0; i < x->size(); ++i)
+        if ((*x)[i] != (*y)[i]) return false;
+      return true;
+    }
+  };
+
+  // Hash function for set of strings
+  class StringKey{
+   public:
+    size_t operator()(const String * const & x) const {
+      size_t key = x->size();
+      for (size_t i = 0; i < x->size(); ++i)
+        key = (key << 1) ^ (*x)[i];
+      return key;
+    }
+  };
+
+
+  typedef hash_map<Element, StateId, ElementKey, ElementEqual> ElementMap;
+  typedef hash_set<const String*, StringKey, StringEqual> StringSet;
+
+  const Fst<A> *fst_;
+  vector<Element> elements_;  // mapping Fst state to Elements
+  ElementMap element_map_;    // mapping Elements to Fst state
+  StringSet string_set_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(SynchronizeFstImpl);
+};
+
+
+// Synchronizes a transducer. This version is a delayed Fst.  The
+// result will be an equivalent FST that has the property that during
+// the traversal of a path, the delay is either zero or strictly
+// increasing, where the delay is the difference between the number of
+// non-epsilon output labels and input labels along the path.
+//
+// For the algorithm to terminate, the input transducer must have
+// bounded delay, i.e., the delay of every cycle must be zero.
+//
+// Complexity:
+// - A has bounded delay: exponential
+// - A does not have bounded delay: does not terminate
+//
+// References:
+// - Mehryar Mohri. Edit-Distance of Weighted Automata: General
+//   Definitions and Algorithms, International Journal of Computer
+//   Science, 14(6): 957-982 (2003).
+template <class A>
+class SynchronizeFst : public Fst<A> {
+ public:
+  friend class ArcIterator< SynchronizeFst<A> >;
+  friend class CacheStateIterator< SynchronizeFst<A> >;
+  friend class CacheArcIterator< SynchronizeFst<A> >;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+  typedef CacheState<A> State;
+
+  SynchronizeFst(const Fst<A> &fst)
+      : impl_(new SynchronizeFstImpl<A>(fst, SynchronizeFstOptions())) {}
+
+  SynchronizeFst(const Fst<A> &fst,  const SynchronizeFstOptions &opts)
+      : impl_(new SynchronizeFstImpl<A>(fst, opts)) {}
+
+  SynchronizeFst(const SynchronizeFst<A> &fst) : impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+
+  virtual ~SynchronizeFst() { if (!impl_->DecrRefCount()) delete impl_; }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  virtual SynchronizeFst<A> *Copy() const {
+    return new SynchronizeFst<A>(*this);
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual inline void InitStateIterator(StateIteratorData<A> *data) const;
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+ private:
+  SynchronizeFstImpl<A> *Impl() { return impl_; }
+
+  SynchronizeFstImpl<A> *impl_;
+
+  void operator=(const SynchronizeFst<A> &fst);  // Disallow
+};
+
+
+// Specialization for SynchronizeFst.
+template<class A>
+class StateIterator< SynchronizeFst<A> >
+    : public CacheStateIterator< SynchronizeFst<A> > {
+ public:
+  explicit StateIterator(const SynchronizeFst<A> &fst)
+      : CacheStateIterator< SynchronizeFst<A> >(fst) {}
+};
+
+
+// Specialization for SynchronizeFst.
+template <class A>
+class ArcIterator< SynchronizeFst<A> >
+    : public CacheArcIterator< SynchronizeFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const SynchronizeFst<A> &fst, StateId s)
+      : CacheArcIterator< SynchronizeFst<A> >(fst, s) {
+    if (!fst.impl_->HasArcs(s))
+      fst.impl_->Expand(s);
+  }
+
+ private:
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+
+template <class A> inline
+void SynchronizeFst<A>::InitStateIterator(StateIteratorData<A> *data) const
+{
+  data->base = new StateIterator< SynchronizeFst<A> >(*this);
+}
+
+
+
+// Synchronizes a transducer. This version writes the synchronized
+// result to a MutableFst.  The result will be an equivalent FST that
+// has the property that during the traversal of a path, the delay is
+// either zero or strictly increasing, where the delay is the
+// difference between the number of non-epsilon output labels and
+// input labels along the path.
+//
+// For the algorithm to terminate, the input transducer must have
+// bounded delay, i.e., the delay of every cycle must be zero.
+//
+// Complexity:
+// - A has bounded delay: exponential
+// - A does not have bounded delay: does not terminate
+//
+// References:
+// - Mehryar Mohri. Edit-Distance of Weighted Automata: General
+//   Definitions and Algorithms, International Journal of Computer
+//   Science, 14(6): 957-982 (2003).
+template<class Arc>
+void Synchronize(const Fst<Arc> &ifst, MutableFst<Arc> *ofst) {
+  SynchronizeFstOptions opts;
+  opts.gc_limit = 0;  // Cache only the last state for fastest copy.
+  *ofst = SynchronizeFst<Arc>(ifst, opts);
+}
+
+}  // namespace fst
+
+#endif // FST_LIB_SYNCHRONIZE_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/test-properties.h b/tools/thirdparty/OpenFst/fst/lib/test-properties.h
new file mode 100644
index 0000000..b167e0a
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/test-properties.h
@@ -0,0 +1,244 @@
+// test-properties.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions to manipulate and test property bits
+
+#ifndef FST_LIB_TEST_PROPERTIES_H__
+#define FST_LIB_TEST_PROPERTIES_H__
+
+#include <ext/hash_set>
+using __gnu_cxx::hash_set;
+
+
+#include "fst/lib/connect.h"
+#include "fst/lib/dfs-visit.h"
+#include "fst/lib/mutable-fst.h"
+
+DECLARE_bool(fst_verify_properties);
+
+namespace fst {
+
+// For a binary property, the bit is always returned set.
+// For a trinary (i.e. two-bit) property, both bits are
+// returned set iff either corresponding input bit is set.
+inline uint64 KnownProperties(uint64 props) {
+  return kBinaryProperties | props & kTrinaryProperties |
+    (props & kPosTrinaryProperties) << 1 |
+    (props & kNegTrinaryProperties) >> 1;
+}
+
+// Tests compatibility between two sets of properties
+inline bool CompatProperties(uint64 props1, uint64 props2) {
+  uint64 known_props1 = KnownProperties(props1);
+  uint64 known_props2 = KnownProperties(props2);
+  uint64 known_props = known_props1 & known_props2;
+  uint64 incompat_props = (props1 & known_props) ^ (props2 & known_props);
+  if (incompat_props) {
+    uint64 prop = 1;
+    for (int i = 0; i < 64; ++i, prop <<= 1)
+      if (prop & incompat_props)
+        LOG(ERROR) << "CompatProperties: mismatch: " << PropertyNames[i]
+                   << ": props1 = " << (props1 & prop ? "true" : "false")
+                   << ", props2 = " << (props2 & prop ? "true" : "false");
+    return false;
+  } else {
+    return true;
+  }
+}
+
+// Computes FST property values defined in properties.h.  The value of
+// each property indicated in the mask will be determined and returned
+// (these will never be unknown here). In the course of determining
+// the properties specifically requested in the mask, certain other
+// properties may be determined (those with little additional expense)
+// and their values will be returned as well. The complete set of
+// known properties (whether true or false) determined by this
+// operation will be assigned to the the value pointed to by KNOWN.
+// If 'use_stored' is true, pre-computed FST properties may be used
+// when possible. This routine is seldom called directly; instead it
+// is used to implement fst.Properties(mask, true).
+template<class Arc>
+uint64 ComputeProperties(const Fst<Arc> &fst, uint64 mask, uint64 *known,
+                         bool use_stored) {
+  typedef typename Arc::Label Label;
+  typedef typename Arc::Weight Weight;
+  typedef typename Arc::StateId StateId;
+
+  uint64 fst_props = fst.Properties(kFstProperties, false);  // Fst-stored
+
+  // Check stored FST properties first if allowed.
+  if (use_stored) {
+    uint64 known_props = KnownProperties(fst_props);
+    // If FST contains required info, return it.
+    if ((known_props & mask) == mask) {
+      *known = known_props;
+      return fst_props;
+    }
+  }
+
+  // Compute (trinary) properties explicitly.
+
+  // Initialize with binary properties (already known).
+  uint64 comp_props = fst_props & kBinaryProperties;
+
+  // Compute these trinary properties with a DFS. We compute only those
+  // that need a DFS here, since we otherwise would like to avoid a DFS
+  // since its stack could grow large.
+  uint64 dfs_props = kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic |
+                     kAccessible | kNotAccessible |
+                     kCoAccessible | kNotCoAccessible;
+  if (mask & dfs_props) {
+    SccVisitor<Arc> scc_visitor(&comp_props);
+    DfsVisit(fst, &scc_visitor);
+  }
+
+  // Compute any remaining trinary properties via a state and arcs iterations
+  if (mask & ~(kBinaryProperties | dfs_props)) {
+    comp_props |= kAcceptor | kNoEpsilons | kNoIEpsilons | kNoOEpsilons |
+        kILabelSorted | kOLabelSorted | kUnweighted | kTopSorted | kString;
+    if (mask & (kIDeterministic | kNonIDeterministic))
+      comp_props |= kIDeterministic;
+    if (mask & (kODeterministic | kNonODeterministic))
+      comp_props |= kODeterministic;
+
+    hash_set<Label> *ilabels = 0;
+    hash_set<Label> *olabels = 0;
+
+    StateId nfinal = 0;
+    for (StateIterator< Fst<Arc> > siter(fst);
+         !siter.Done();
+         siter.Next()) {
+      StateId s = siter.Value();
+
+      Arc prev_arc(kNoLabel, kNoLabel, Weight::One(), 0);
+      // Create these only if we need to
+      if (mask & (kIDeterministic | kNonIDeterministic))
+        ilabels = new hash_set<Label>;
+      if (mask & (kODeterministic | kNonODeterministic))
+        olabels = new hash_set<Label>;
+
+      for (ArcIterator< Fst<Arc> > aiter(fst, s);
+           !aiter.Done();
+           aiter.Next()) {
+        const Arc &arc =aiter.Value();
+
+        if (ilabels && ilabels->find(arc.ilabel) != ilabels->end()) {
+          comp_props |= kNonIDeterministic;
+          comp_props &= ~kIDeterministic;
+        }
+        if (olabels && olabels->find(arc.olabel) != olabels->end()) {
+          comp_props |= kNonODeterministic;
+          comp_props &= ~kODeterministic;
+        }
+        if (arc.ilabel != arc.olabel) {
+          comp_props |= kNotAcceptor;
+          comp_props &= ~kAcceptor;
+        }
+        if (arc.ilabel == 0 && arc.olabel == 0) {
+          comp_props |= kEpsilons;
+          comp_props &= ~kNoEpsilons;
+        }
+        if (arc.ilabel == 0) {
+          comp_props |= kIEpsilons;
+          comp_props &= ~kNoIEpsilons;
+        }
+        if (arc.olabel == 0) {
+          comp_props |= kOEpsilons;
+          comp_props &= ~kNoOEpsilons;
+        }
+        if (prev_arc.ilabel != kNoLabel && arc.ilabel < prev_arc.ilabel) {
+          comp_props |= kNotILabelSorted;
+          comp_props &= ~kILabelSorted;
+        }
+        if (prev_arc.olabel != kNoLabel && arc.olabel < prev_arc.olabel) {
+          comp_props |= kNotOLabelSorted;
+          comp_props &= ~kOLabelSorted;
+        }
+        if (arc.weight != Weight::One() && arc.weight != Weight::Zero()) {
+          comp_props |= kWeighted;
+          comp_props &= ~kUnweighted;
+        }
+        if (arc.nextstate <= s) {
+          comp_props |= kNotTopSorted;
+          comp_props &= ~kTopSorted;
+        }
+        if (arc.nextstate != s + 1) {
+          comp_props |= kNotString;
+          comp_props &= ~kString;
+        }
+        prev_arc = arc;
+        if (ilabels)
+          ilabels->insert(arc.ilabel);
+        if (olabels)
+          olabels->insert(arc.olabel);
+      }
+
+      if (nfinal > 0) {             // final state not last
+        comp_props |= kNotString;
+        comp_props &= ~kString;
+      }
+
+      Weight final = fst.Final(s);
+
+      if (final != Weight::Zero()) {  // final state
+        if (final != Weight::One()) {
+          comp_props |= kWeighted;
+          comp_props &= ~kUnweighted;
+        }
+        ++nfinal;
+      } else {                        // non-final state
+        if (fst.NumArcs(s) != 1) {
+          comp_props |= kNotString;
+          comp_props &= ~kString;
+        }
+      }
+
+      delete ilabels;
+      delete olabels;
+    }
+
+    if (fst.Start() != kNoStateId && fst.Start() != 0) {
+      comp_props |= kNotString;
+      comp_props &= ~kString;
+    }
+  }
+
+  *known = KnownProperties(comp_props);
+  return comp_props;
+}
+
+// This is a wrapper around ComputeProperties that will cause a fatal
+// error if the stored properties and the computed properties are
+// incompatible when 'FLAGS_fst_verify_properties' is true.  This
+// routine is seldom called directly; instead it is used to implement
+// fst.Properties(mask, true).
+template<class Arc>
+uint64 TestProperties(const Fst<Arc> &fst, uint64 mask, uint64 *known) {
+  if (FLAGS_fst_verify_properties) {
+    uint64 stored_props = fst.Properties(kFstProperties, false);
+    uint64 computed_props = ComputeProperties(fst, mask, known, false);
+    if (!CompatProperties(stored_props, computed_props))
+      LOG(FATAL) << "TestProperties: stored Fst properties incorrect"
+                 << " (stored: props1, computed: props2)";
+    return computed_props;
+  } else {
+    return ComputeProperties(fst, mask, known, true);
+  }
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_TEST_PROPERTIES_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/topsort.h b/tools/thirdparty/OpenFst/fst/lib/topsort.h
new file mode 100644
index 0000000..4c5706d
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/topsort.h
@@ -0,0 +1,107 @@
+// topsort.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Topological sort of FSTs
+
+#ifndef FST_LIB_TOPSORT_H__
+#define FST_LIB_TOPSORT_H__
+
+#include <algorithm>
+#include <vector>
+
+#include "fst/lib/dfs-visit.h"
+#include "fst/lib/fst.h"
+#include "fst/lib/statesort.h"
+
+namespace fst {
+
+// DFS visitor class to return topological ordering.
+template <class A>
+class TopOrderVisitor {
+ public:
+  typedef A Arc;
+  typedef typename A::StateId StateId;
+
+  // If acyclic, ORDER[i] gives the topological position of state Id i;
+  // otherwise unchanged. ACYCLIC will be true iff the FST has
+  // no cycles.
+  TopOrderVisitor(vector<StateId> *order, bool *acyclic)
+      : order_(order), acyclic_(acyclic) {}
+
+  void InitVisit(const Fst<A> &fst) {
+    finish_ = new vector<StateId>;
+    *acyclic_ = true;
+  }
+
+  bool InitState(StateId s, StateId r) { return true; }
+
+  bool TreeArc(StateId s, const A &arc) { return true; }
+
+  bool BackArc(StateId s, const A &arc) { return (*acyclic_ = false); }
+
+  bool ForwardOrCrossArc(StateId s, const A &arc) { return true; }
+
+  void FinishState(StateId s, StateId p, const A *) { finish_->push_back(s); }
+
+  void FinishVisit() {
+    if (*acyclic_) {
+      order_->clear();
+      for (StateId s = 0; s < (StateId)finish_->size(); ++s) 
+        order_->push_back(kNoStateId);
+      for (StateId s = 0; s < (StateId)finish_->size(); ++s) 
+        (*order_)[(*finish_)[finish_->size() - s - 1]] = s;
+    }
+    delete finish_;
+  }
+
+ private:
+  vector<StateId> *order_;
+  bool *acyclic_;
+  vector<StateId> *finish_;  // states in finishing-time order
+};
+
+
+// Topologically sorts its input if acyclic, modifying it.  Otherwise,
+// the input is unchanged.  When sorted, all transitions are from
+// lower to higher state IDs.
+//
+// Complexity:
+// - Time:  O(V + E)
+// - Space: O(V + E)
+// where V = # of states and E = # of arcs.
+template <class Arc>
+bool TopSort(MutableFst<Arc> *fst) {
+  typedef typename Arc::StateId StateId;
+
+  vector<StateId> order;
+  bool acyclic;
+
+  TopOrderVisitor<Arc> top_order_visitor(&order, &acyclic);
+  DfsVisit(*fst, &top_order_visitor);
+
+  if (acyclic) {
+    StateSort(fst, order);
+    fst->SetProperties(kAcyclic | kInitialAcyclic | kTopSorted,
+                       kAcyclic | kInitialAcyclic | kTopSorted);
+  } else {
+    fst->SetProperties(kCyclic | kNotTopSorted, kCyclic | kNotTopSorted);
+  }
+  return acyclic;
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_TOPSORT_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/union-find.h b/tools/thirdparty/OpenFst/fst/lib/union-find.h
new file mode 100644
index 0000000..a85edac
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/union-find.h
@@ -0,0 +1,107 @@
+// union-find.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file Union-Find algorithm for dense sets of non-negative
+// integers. Implemented using disjoint tree forests with rank
+// heuristics and path compression.
+
+#ifndef __fst_union_find_inl_h__
+#define __fst_union_find_inl_h__
+
+#include <stack>
+#include <vector>
+
+namespace fst {
+
+// Union-Find algorithm for dense sets of non-negative integers
+// (exact type: T).
+template <class T>
+class UnionFind {
+ public:
+  // Ctor: creates a disjoint set forest for the range [0;max).
+  // 'fail' is a value indicating that an element hasn't been
+  // initialized using MakeSet(...). The upper bound of the range
+  // can be reset (increased) using MakeSet(...).
+  UnionFind(T max, T fail)
+      : parent_(max, fail), rank_(max), fail_(fail) { }
+
+  // Finds the representative of the set 'item' belongs to.
+  // Performs path compression if needed.
+  T FindSet(T item) {
+    if (item >= parent_.size()
+        || item == fail_
+        || parent_[item] == fail_) return fail_;
+
+    CHECK(exec_stack_.empty());
+    T *p = &parent_[item];
+    for (; *p != item; item = *p, p = &parent_[item]) {
+      exec_stack_.push(p);
+    }
+    for (; ! exec_stack_.empty(); exec_stack_.pop()) {
+      *exec_stack_.top() = *p;
+    }
+    return *p;
+  }
+
+  // Creates the (destructive) union of the sets x and y belong to.
+  void Union(T x, T y) {
+    Link(FindSet(x), FindSet(y));
+  }
+
+  // Initialization of an element: creates a singleton set containing
+  // 'item'. The range [0;max) is reset if item >= max.
+  T MakeSet(T item) {
+    if (item >= parent_.size()) {
+      // New value in parent_ should be initialized to fail_
+      parent_.resize(2 * item, fail_);
+      rank_.resize(2 * item);
+    }
+    parent_[item] = item;
+    return item;
+  }
+
+  // Initialization of all elements starting from 0 to max - 1 to distinct sets
+  void MakeAllSet(T max) {
+    parent_.resize(max);
+    for (T item = 0; item < max; ++item) {
+      parent_[item] = item;
+    }
+  }
+
+ private:
+  vector<T> parent_;      // Parent nodes.
+  vector<int> rank_;      // Rank of an element = min. depth in tree.
+  T fail_;                // Value indicating lookup failure.
+  stack<T*> exec_stack_;  // Used for path compression.
+
+  // Links trees rooted in 'x' and 'y'.
+  void Link(T x, T y) {
+    if (x == y) return;
+
+    if (rank_[x] > rank_[y]) {
+      parent_[y] = x;
+    } else {
+      parent_[x] = y;
+      if (rank_[x] == rank_[y]) {
+        ++rank_[y];
+      }
+    }
+  }
+  DISALLOW_EVIL_CONSTRUCTORS(UnionFind);
+};
+
+}
+
+#endif  // __fst_union_find_inl_h__
diff --git a/tools/thirdparty/OpenFst/fst/lib/union.h b/tools/thirdparty/OpenFst/fst/lib/union.h
new file mode 100644
index 0000000..ff95ef0
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/union.h
@@ -0,0 +1,155 @@
+// union.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Functions and classes to compute the union of two FSTs.
+
+#ifndef FST_LIB_UNION_H__
+#define FST_LIB_UNION_H__
+
+#include "fst/lib/mutable-fst.h"
+#include "fst/lib/rational.h"
+
+namespace fst {
+
+// Computes the union (sum) of two FSTs.  This version writes the
+// union to an output MurableFst. If A transduces string x to y with
+// weight a and B transduces string w to v with weight b, then their
+// union transduces x to y with weight a and w to v with weight b.
+//
+// Complexity:
+// - Time: (V2 + E2)
+// - Space: O(V2 + E2)
+// where Vi = # of states and Ei = # of arcs of the ith FST.
+template <class Arc>
+void Union(MutableFst<Arc> *fst1, const Fst<Arc> &fst2) {
+  typedef typename Arc::StateId StateId;
+  typedef typename Arc::Label Label;
+  typedef typename Arc::Weight Weight;
+
+  StateId start2 = fst2.Start();
+  if (start2 == kNoStateId)
+    return;
+
+  StateId numstates1 = fst1->NumStates();
+  bool initial_acyclic1 = fst1->Properties(kInitialAcyclic, true);
+  uint64 props1 = fst1->Properties(kFstProperties, false);
+  uint64 props2 = fst2.Properties(kFstProperties, false);
+
+  for (StateIterator< Fst<Arc> > siter(fst2);
+       !siter.Done();
+       siter.Next()) {
+    StateId s1 = fst1->AddState();
+    StateId s2 = siter.Value();
+    fst1->SetFinal(s1, fst2.Final(s2));
+    for (ArcIterator< Fst<Arc> > aiter(fst2, s2);
+         !aiter.Done();
+         aiter.Next()) {
+      Arc arc = aiter.Value();
+      arc.nextstate += numstates1;
+      fst1->AddArc(s1, arc);
+    }
+  }
+  StateId start1 = fst1->Start();
+  if (start1 == kNoStateId) {
+    fst1->SetStart(start2);
+    fst1->SetProperties(props2, kCopyProperties);
+    return;
+  }
+
+  if (initial_acyclic1) {
+    fst1->AddArc(start1,  Arc(0, 0, Weight::One(), start2 + numstates1));
+  } else {
+    StateId nstart1 = fst1->AddState();
+    fst1->SetStart(nstart1);
+    fst1->AddArc(nstart1,  Arc(0, 0, Weight::One(), start1));
+    fst1->AddArc(nstart1,  Arc(0, 0, Weight::One(), start2 + numstates1));
+  }
+  fst1->SetProperties(UnionProperties(props1, props2), kFstProperties);
+}
+
+
+// Computes the union of two FSTs; this version modifies its
+// RationalFst argument.
+template<class Arc>
+void Union(RationalFst<Arc> *fst1, const Fst<Arc> &fst2) {
+  fst1->Impl()->AddUnion(fst2);
+}
+
+
+typedef RationalFstOptions UnionFstOptions;
+
+
+// Computes the union (sum) of two FSTs. This version is a delayed
+// Fst. If A transduces string x to y with weight a and B transduces
+// string w to v with weight b, then their union transduces x to y
+// with weight a and w to v with weight b.
+//
+// Complexity:
+// - Time: O(v1 + e1 + v2 + e2)
+// - Sapce: O(v1 + v2)
+// where vi = # of states visited and ei = # of arcs visited of the
+// ith FST. Constant time and space to visit an input state or arc
+// is assumed and exclusive of caching.
+template <class A>
+class UnionFst : public RationalFst<A> {
+ public:
+  using RationalFst<A>::Impl;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  UnionFst(const Fst<A> &fst1, const Fst<A> &fst2) {
+    Impl()->InitUnion(fst1, fst2);
+  }
+
+  UnionFst(const Fst<A> &fst1, const Fst<A> &fst2, const UnionFstOptions &opts)
+      : RationalFst<A>(opts) {
+    Impl()->InitUnion(fst1, fst2);
+  }
+
+  UnionFst(const UnionFst<A> &fst) : RationalFst<A>(fst) {}
+
+  virtual UnionFst<A> *Copy() const { return new UnionFst<A>(*this); }
+};
+
+
+// Specialization for UnionFst.
+template <class A>
+class StateIterator< UnionFst<A> > : public StateIterator< RationalFst<A> > {
+ public:
+  explicit StateIterator(const UnionFst<A> &fst)
+      : StateIterator< RationalFst<A> >(fst) {}
+};
+
+
+// Specialization for UnionFst.
+template <class A>
+class ArcIterator< UnionFst<A> > : public ArcIterator< RationalFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const UnionFst<A> &fst, StateId s)
+      : ArcIterator< RationalFst<A> >(fst, s) {}
+};
+
+
+// Useful alias when using StdArc.
+typedef UnionFst<StdArc> StdUnionFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_UNION_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/util.h b/tools/thirdparty/OpenFst/fst/lib/util.h
new file mode 100644
index 0000000..d899929
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/util.h
@@ -0,0 +1,69 @@
+// util.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// FST utility inline definitions.
+
+#ifndef FST_LIB_UTIL_H__
+#define FST_LIB_UTIL_H__
+
+#include <iostream>
+
+namespace fst {
+
+//
+// UTILITIES FOR TYPE I/O
+//
+
+// Read some types from an input stream.
+
+// Generic case.
+template <typename T>
+inline istream &ReadType(istream &strm, T *t) {
+  return strm.read(reinterpret_cast<char *>(t), sizeof(T));
+}
+
+// String case.
+inline istream &ReadType(istream &strm, string *s) {
+  s->clear();
+  int32 ns = 0;
+  strm.read(reinterpret_cast<char *>(&ns), sizeof(ns));
+  for (int i = 0; i < ns; ++i) {
+    char c;
+    strm.read(&c, 1);
+    *s += c;
+  }
+  return strm;
+}
+
+// Write some types to an output stream.
+
+// Generic case.
+template <typename T>
+inline ostream &WriteType(ostream &strm, const T t) {
+  return strm.write(reinterpret_cast<const char *>(&t), sizeof(T));
+}
+
+// String case.
+inline ostream &WriteType(ostream &strm, const string s) {
+  int32 ns = s.size();
+  strm.write(reinterpret_cast<const char *>(&ns), sizeof(ns));
+  return strm.write(s.data(), ns);
+}
+
+
+}  // namespace fst;
+
+#endif  // FST_LIB_UTIL_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/vector-fst.h b/tools/thirdparty/OpenFst/fst/lib/vector-fst.h
new file mode 100644
index 0000000..3d62254
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/vector-fst.h
@@ -0,0 +1,795 @@
+// vector-fst.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Simple concrete, mutable FST whose states and arcs are stored in STL
+// vectors.
+
+#ifndef FST_LIB_VECTOR_FST_H__
+#define FST_LIB_VECTOR_FST_H__
+
+#include "fst/lib/mutable-fst.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+template <class A> class VectorFst;
+
+// States and arcs implemented by STL vectors, templated on the
+// State definition. This does not manage the Fst properties.
+template <class State>
+class VectorFstBaseImpl : public FstImpl<typename State::Arc> {
+ public:
+  typedef typename State::Arc Arc;
+  typedef typename Arc::Weight Weight;
+  typedef typename Arc::StateId StateId;
+
+  VectorFstBaseImpl() : start_(kNoStateId) {}
+
+  ~VectorFstBaseImpl() {
+    for (StateId s = 0; s < (StateId)states_.size(); ++s) 
+      delete states_[s];
+  }
+
+  StateId Start() const { return start_; }
+
+  Weight Final(StateId s) const { return states_[s]->final; }
+
+  StateId NumStates() const { return states_.size(); }
+
+  size_t NumArcs(StateId s) const { return states_[s]->arcs.size(); }
+
+  void SetStart(StateId s) { start_ = s; }
+
+  void SetFinal(StateId s, Weight w) { states_[s]->final = w; }
+
+  StateId AddState() {
+    states_.push_back(new State);
+    return states_.size() - 1;
+  }
+
+  StateId AddState(State *state) {
+    states_.push_back(state);
+    return states_.size() - 1;
+  }
+
+  void AddArc(StateId s, const Arc &arc) {
+    states_[s]->arcs.push_back(arc);
+  }
+
+  void DeleteStates(const vector<StateId>& dstates) {
+    vector<StateId> newid(states_.size(), 0);
+    for (size_t i = 0; i < dstates.size(); ++i)
+      newid[dstates[i]] = kNoStateId;
+    StateId nstates = 0;
+    for (StateId s = 0; s < (StateId)states_.size(); ++s) {
+      if (newid[s] != kNoStateId) {
+        newid[s] = nstates;
+        if (s != nstates)
+          states_[nstates] = states_[s];
+        ++nstates;
+      } else {
+        delete states_[s];
+      }
+    }
+    states_.resize(nstates);
+    for (StateId s = 0; s < (StateId)states_.size(); ++s) {
+      vector<Arc> &arcs = states_[s]->arcs;
+      size_t narcs = 0;
+      for (size_t i = 0; i < arcs.size(); ++i) {
+        StateId t = newid[arcs[i].nextstate];
+        if (t != kNoStateId) {
+          arcs[i].nextstate = t;
+          if (i != narcs)
+            arcs[narcs] = arcs[i];
+          ++narcs;
+        } else {
+          if (arcs[i].ilabel == 0)
+            --states_[s]->niepsilons;
+          if (arcs[i].olabel == 0)
+            --states_[s]->noepsilons;
+        }
+      }
+      arcs.resize(narcs);
+    }
+    if (Start() != kNoStateId)
+      SetStart(newid[Start()]);
+  }
+
+  void DeleteStates() {
+    for (StateId s = 0; s < (StateId)states_.size(); ++s)
+      delete states_[s];
+    states_.clear();
+    SetStart(kNoStateId);
+  }
+
+  void DeleteArcs(StateId s, size_t n) {
+    states_[s]->arcs.resize(states_[s]->arcs.size() - n);
+  }
+
+  void DeleteArcs(StateId s) { states_[s]->arcs.clear(); }
+
+  State *GetState(StateId s) { return states_[s]; }
+
+  const State *GetState(StateId s) const { return states_[s]; }
+
+  void SetState(StateId s, State *state) { states_[s] = state; }
+
+  void ReserveStates(StateId n) { states_.reserve(n); }
+
+  void ReserveArcs(StateId s, size_t n) { states_[s]->arcs.reserve(n); }
+
+  // Provide information needed for generic state iterator
+  void InitStateIterator(StateIteratorData<Arc> *data) const {
+    data->base = 0;
+    data->nstates = states_.size();
+  }
+
+  // Provide information needed for generic arc iterator
+  void InitArcIterator(StateId s, ArcIteratorData<Arc> *data) const {
+    data->base = 0;
+    data->narcs = states_[s]->arcs.size();
+    data->arcs = data->narcs > 0 ? &states_[s]->arcs[0] : 0;
+    data->ref_count = 0;
+  }
+
+ private:
+  vector<State *> states_;      // States represenation.
+  StateId start_;               // initial state
+
+  DISALLOW_EVIL_CONSTRUCTORS(VectorFstBaseImpl);
+};
+
+// Arcs implemented by an STL vector per state.
+template <class A>
+struct VectorState {
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  VectorState() : final(Weight::Zero()), niepsilons(0), noepsilons(0) {}
+
+  Weight final;              // Final weight
+  vector<A> arcs;            // Arcs represenation
+  size_t niepsilons;         // # of input epsilons
+  size_t noepsilons;         // # of output epsilons
+};
+
+// This is a VectorFstBaseImpl container that holds VectorState's.  It
+// manages Fst properties and the # of input and output epsilons.
+template <class A>
+class VectorFstImpl : public VectorFstBaseImpl< VectorState<A> > {
+ public:
+  using FstImpl<A>::SetType;
+  using FstImpl<A>::SetProperties;
+  using FstImpl<A>::Properties;
+  using FstImpl<A>::WriteHeaderAndSymbols;
+
+  using VectorFstBaseImpl<VectorState<A> >::Start;
+  using VectorFstBaseImpl<VectorState<A> >::NumStates;
+
+  friend class MutableArcIterator< VectorFst<A> >;
+
+  typedef VectorFstBaseImpl< VectorState<A> > BaseImpl;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  VectorFstImpl() {
+    SetType("vector");
+    SetProperties(kNullProperties | kStaticProperties);
+  }
+  explicit VectorFstImpl(const Fst<A> &fst);
+
+  static VectorFstImpl<A> *Read(istream &strm, const FstReadOptions &opts);
+
+  size_t NumInputEpsilons(StateId s) const { return GetState(s)->niepsilons; }
+
+  size_t NumOutputEpsilons(StateId s) const { return GetState(s)->noepsilons; }
+
+  bool Write(ostream &strm, const FstWriteOptions &opts) const;
+
+  void SetStart(StateId s) {
+    BaseImpl::SetStart(s);
+    SetProperties(Properties() & kSetStartProperties);
+    if (Properties() & kAcyclic)
+      SetProperties(Properties() | kInitialAcyclic);
+  }
+
+  void SetFinal(StateId s, Weight w) {
+    Weight ow = Final(s);
+    if (ow != Weight::Zero() && ow != Weight::One())
+      SetProperties(Properties() & ~kWeighted);
+    BaseImpl::SetFinal(s, w);
+    if (w != Weight::Zero() && w != Weight::One()) {
+      SetProperties(Properties() | kWeighted);
+      SetProperties(Properties() & ~kUnweighted);
+    }
+    SetProperties(Properties() &
+                  (kSetFinalProperties | kWeighted | kUnweighted));
+  }
+
+  StateId AddState() {
+    StateId s = BaseImpl::AddState();
+    SetProperties(Properties() & kAddStateProperties);
+    return s;
+  }
+
+  void AddArc(StateId s, const A &arc) {
+    VectorState<A> *state = GetState(s);
+    if (arc.ilabel != arc.olabel) {
+      SetProperties(Properties() | kNotAcceptor);
+      SetProperties(Properties() & ~kAcceptor);
+    }
+    if (arc.ilabel == 0) {
+      ++state->niepsilons;
+      SetProperties(Properties() | kIEpsilons);
+      SetProperties(Properties() & ~kNoIEpsilons);
+      if (arc.olabel == 0) {
+        SetProperties(Properties() | kEpsilons);
+        SetProperties(Properties() & ~kNoEpsilons);
+      }
+    }
+    if (arc.olabel == 0) {
+      ++state->noepsilons;
+      SetProperties(Properties() | kOEpsilons);
+      SetProperties(Properties() & ~kNoOEpsilons);
+    }
+    if (!state->arcs.empty()) {
+      A &parc = state->arcs.back();
+      if (parc.ilabel > arc.ilabel) {
+        SetProperties(Properties() | kNotILabelSorted);
+        SetProperties(Properties() & ~kILabelSorted);
+      }
+      if (parc.olabel > arc.olabel) {
+        SetProperties(Properties() | kNotOLabelSorted);
+        SetProperties(Properties() & ~kOLabelSorted);
+      }
+    }
+    if (arc.weight != Weight::Zero() && arc.weight != Weight::One()) {
+      SetProperties(Properties() | kWeighted);
+      SetProperties(Properties() & ~kUnweighted);
+    }
+    if (arc.nextstate <= s) {
+      SetProperties(Properties() | kNotTopSorted);
+      SetProperties(Properties() & ~kTopSorted);
+    }
+    SetProperties(Properties() &
+                  (kAddArcProperties | kAcceptor |
+                   kNoEpsilons | kNoIEpsilons | kNoOEpsilons |
+                   kILabelSorted | kOLabelSorted | kUnweighted | kTopSorted));
+    if (Properties() & kTopSorted)
+      SetProperties(Properties() | kAcyclic | kInitialAcyclic);
+    BaseImpl::AddArc(s, arc);
+  }
+
+  void DeleteStates(const vector<StateId> &dstates) {
+    BaseImpl::DeleteStates(dstates);
+    SetProperties(Properties() & kDeleteStatesProperties);
+  }
+
+  void DeleteStates() {
+    BaseImpl::DeleteStates();
+    SetProperties(kNullProperties | kStaticProperties);
+  }
+
+  void DeleteArcs(StateId s, size_t n) {
+    const vector<A> &arcs = GetState(s)->arcs;
+    for (size_t i = 0; i < n; ++i) {
+      size_t j = arcs.size() - i - 1;
+      if (arcs[j].ilabel == 0)
+        --GetState(s)->niepsilons;
+      if (arcs[j].olabel == 0)
+        --GetState(s)->noepsilons;
+    }
+    BaseImpl::DeleteArcs(s, n);
+    SetProperties(Properties() & kDeleteArcsProperties);
+  }
+
+  void DeleteArcs(StateId s) {
+    GetState(s)->niepsilons = 0;
+    GetState(s)->noepsilons = 0;
+    BaseImpl::DeleteArcs(s);
+    SetProperties(Properties() & kDeleteArcsProperties);
+  }
+
+ private:
+  // Properties always true of this Fst class
+  static const uint64 kStaticProperties = kExpanded | kMutable;
+  // Current file format version
+  static const int kFileVersion = 2;
+  // Minimum file format version supported
+  static const int kMinFileVersion = 2;
+
+  DISALLOW_EVIL_CONSTRUCTORS(VectorFstImpl);
+};
+
+template <class A>
+VectorFstImpl<A>::VectorFstImpl(const Fst<A> &fst) {
+  SetType("vector");
+  SetProperties(fst.Properties(kCopyProperties, false) | kStaticProperties);
+  SetInputSymbols(fst.InputSymbols());
+  SetOutputSymbols(fst.OutputSymbols());
+  BaseImpl::SetStart(fst.Start());
+
+  for (StateIterator< Fst<A> > siter(fst);
+       !siter.Done();
+       siter.Next()) {
+    StateId s = siter.Value();
+    BaseImpl::AddState();
+    BaseImpl::SetFinal(s, fst.Final(s));
+    ReserveArcs(s, fst.NumArcs(s));
+    for (ArcIterator< Fst<A> > aiter(fst, s);
+         !aiter.Done();
+         aiter.Next()) {
+      const A &arc = aiter.Value();
+      BaseImpl::AddArc(s, arc);
+      if (arc.ilabel == 0)
+        ++GetState(s)->niepsilons;
+      if (arc.olabel == 0)
+        ++GetState(s)->noepsilons;
+    }
+  }
+}
+
+template <class A>
+VectorFstImpl<A> *VectorFstImpl<A>::Read(istream &strm,
+                                         const FstReadOptions &opts) {
+  VectorFstImpl<A> *impl = new VectorFstImpl;
+  FstHeader hdr;
+  if (!impl->ReadHeaderAndSymbols(strm, opts, kMinFileVersion, &hdr))
+    return 0;
+  impl->BaseImpl::SetStart(hdr.Start());
+  impl->ReserveStates(hdr.NumStates());
+
+  for (StateId s = 0; s < hdr.NumStates(); ++s) {
+    impl->BaseImpl::AddState();
+    VectorState<A> *state = impl->GetState(s);
+    state->final.Read(strm);
+    int64 narcs;
+    ReadType(strm, &narcs);
+    if (!strm) {
+      LOG(ERROR) << "VectorFst::Read: read failed: " << opts.source;
+      return 0;
+    }
+    impl->ReserveArcs(s, narcs);
+    for (size_t j = 0; j < narcs; ++j) {
+      A arc;
+      ReadType(strm, &arc.ilabel);
+      ReadType(strm, &arc.olabel);
+      arc.weight.Read(strm);
+      ReadType(strm, &arc.nextstate);
+      if (!strm) {
+        LOG(ERROR) << "VectorFst::Read: read failed: " << opts.source;
+        return 0;
+      }
+      impl->BaseImpl::AddArc(s, arc);
+      if (arc.ilabel == 0)
+        ++state->niepsilons;
+      if (arc.olabel == 0)
+        ++state->noepsilons;
+    }
+  }
+  return impl;
+}
+
+// Converts a string into a weight.
+template <class W> class WeightFromString {
+ public:
+  W operator()(const string &s);
+};
+
+// Generic case fails.
+template <class W> inline
+W WeightFromString<W>::operator()(const string &s) {
+  LOG(FATAL) << "VectorFst::Read: Obsolete file format";
+  return W();
+}
+
+// TropicalWeight version.
+template <> inline
+TropicalWeight WeightFromString<TropicalWeight>::operator()(const string &s) {
+  float f;
+  memcpy(&f, s.data(), sizeof(f));
+  return TropicalWeight(f);
+}
+
+// LogWeight version.
+template <> inline
+LogWeight WeightFromString<LogWeight>::operator()(const string &s) {
+  float f;
+  memcpy(&f, s.data(), sizeof(f));
+  return LogWeight(f);
+}
+
+template <class A>
+bool VectorFstImpl<A>::Write(ostream &strm,
+                             const FstWriteOptions &opts) const {
+  FstHeader hdr;
+  hdr.SetStart(Start());
+  hdr.SetNumStates(NumStates());
+  WriteHeaderAndSymbols(strm, opts, kFileVersion, &hdr);
+  if (!strm)
+    return false;
+
+  for (StateId s = 0; s < NumStates(); ++s) {
+    const VectorState<A> *state = GetState(s);
+    state->final.Write(strm);
+    int64 narcs = state->arcs.size();
+    WriteType(strm, narcs);
+    for (size_t a = 0; a < narcs; ++a) {
+      const A &arc = state->arcs[a];
+      WriteType(strm, arc.ilabel);
+      WriteType(strm, arc.olabel);
+      arc.weight.Write(strm);
+      WriteType(strm, arc.nextstate);
+    }
+  }
+  strm.flush();
+  if (!strm)
+    LOG(ERROR) << "VectorFst::Write: write failed: " << opts.source;
+  return strm;
+}
+
+// Simple concrete, mutable FST. Supports additional operations:
+// ReserveStates and ReserveArcs (cf. STL vectors). This class
+// attaches interface to implementation and handles reference
+// counting.
+template <class A>
+class VectorFst : public MutableFst<A> {
+ public:
+  friend class StateIterator< VectorFst<A> >;
+  friend class ArcIterator< VectorFst<A> >;
+  friend class MutableArcIterator< VectorFst<A> >;
+
+  typedef A Arc;
+  typedef typename A::Weight Weight;
+  typedef typename A::StateId StateId;
+
+  VectorFst() : impl_(new VectorFstImpl<A>) {}
+
+  VectorFst(const VectorFst<A> &fst) : MutableFst<A>(fst), impl_(fst.impl_) {
+    impl_->IncrRefCount();
+  }
+  explicit VectorFst(const Fst<A> &fst) : impl_(new VectorFstImpl<A>(fst)) {}
+
+  virtual ~VectorFst() { if (!impl_->DecrRefCount()) delete impl_; }
+
+  VectorFst<A> &operator=(const VectorFst<A> &fst) {
+    if (this != &fst) {
+      if (!impl_->DecrRefCount()) delete impl_;
+      fst.impl_->IncrRefCount();
+      impl_ = fst.impl_;
+    }
+    return *this;
+  }
+
+  virtual VectorFst<A> &operator=(const Fst<A> &fst) {
+    if (this != &fst) {
+      if (!impl_->DecrRefCount()) delete impl_;
+      impl_ = new VectorFstImpl<A>(fst);
+    }
+    return *this;
+  }
+
+  virtual StateId Start() const { return impl_->Start(); }
+
+  virtual Weight Final(StateId s) const { return impl_->Final(s); }
+
+  virtual StateId NumStates() const { return impl_->NumStates(); }
+
+  virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); }
+
+  virtual size_t NumInputEpsilons(StateId s) const {
+    return impl_->NumInputEpsilons(s);
+  }
+
+  virtual size_t NumOutputEpsilons(StateId s) const {
+    return impl_->NumOutputEpsilons(s);
+  }
+
+  virtual uint64 Properties(uint64 mask, bool test) const {
+    if (test) {
+      uint64 known, test = TestProperties(*this, mask, &known);
+      impl_->SetProperties(test, known);
+      return test & mask;
+    } else {
+      return impl_->Properties(mask);
+    }
+  }
+
+  virtual const string& Type() const { return impl_->Type(); }
+
+  // Get a copy of this VectorFst
+  virtual VectorFst<A> *Copy() const {
+    impl_->IncrRefCount();
+    return new VectorFst<A>(impl_);
+  }
+
+  // Read a VectorFst from an input stream; return NULL on error
+  static VectorFst<A> *Read(istream &strm, const FstReadOptions &opts) {
+    VectorFstImpl<A>* impl = VectorFstImpl<A>::Read(strm, opts);
+    return impl ? new VectorFst<A>(impl) : 0;
+  }
+
+  // Read a VectorFst from a file; return NULL on error
+  static VectorFst<A> *Read(const string &filename) {
+    ifstream strm(filename.c_str());
+    if (!strm) {
+      LOG(ERROR) << "VectorFst::Read: Can't open file: " << filename;
+      return 0;
+    }
+    return Read(strm, FstReadOptions(filename));
+  }
+
+  // Write a VectorFst to an output stream; return false on error
+  virtual bool Write(ostream &strm, const FstWriteOptions &opts) const {
+    return impl_->Write(strm, opts);
+  }
+
+  // Write a VectorFst to a file; return false on error
+  virtual bool Write(const string &filename) const {
+    if (!filename.empty()) {
+      ofstream strm(filename.c_str());
+      if (!strm) {
+        LOG(ERROR) << "VectorFst::Write: Can't open file: " << filename;
+        return false;
+      }
+      return Write(strm, FstWriteOptions(filename));
+    } else {
+      return Write(std::cout, FstWriteOptions("standard output"));
+    }
+  }
+
+  virtual SymbolTable* InputSymbols() {
+    return impl_->InputSymbols();
+  }
+
+  virtual SymbolTable* OutputSymbols() {
+    return impl_->OutputSymbols();
+  }
+
+  virtual const SymbolTable* InputSymbols() const {
+    return impl_->InputSymbols();
+  }
+
+  virtual const SymbolTable* OutputSymbols() const {
+    return impl_->OutputSymbols();
+  }
+
+  virtual void SetStart(StateId s) {
+    MutateCheck();
+    impl_->SetStart(s);
+  }
+
+  virtual void SetFinal(StateId s, Weight w) {
+    MutateCheck();
+    impl_->SetFinal(s, w);
+  }
+
+  virtual void SetProperties(uint64 props, uint64 mask) {
+    impl_->SetProperties(props, mask);
+  }
+
+  virtual StateId AddState() {
+    MutateCheck();
+    return impl_->AddState();
+  }
+
+  virtual void AddArc(StateId s, const A &arc) {
+    MutateCheck();
+    impl_->AddArc(s, arc);
+  }
+
+  virtual void DeleteStates(const vector<StateId> &dstates) {
+    MutateCheck();
+    impl_->DeleteStates(dstates);
+  }
+
+  virtual void DeleteStates() {
+    MutateCheck();
+    impl_->DeleteStates();
+  }
+
+  virtual void DeleteArcs(StateId s, size_t n) {
+    MutateCheck();
+    impl_->DeleteArcs(s, n);
+  }
+
+  virtual void DeleteArcs(StateId s) {
+    MutateCheck();
+    impl_->DeleteArcs(s);
+  }
+
+  virtual void SetInputSymbols(const SymbolTable* isyms) {
+    MutateCheck();
+    impl_->SetInputSymbols(isyms);
+  }
+
+  virtual void SetOutputSymbols(const SymbolTable* osyms) {
+    MutateCheck();
+    impl_->SetOutputSymbols(osyms);
+  }
+
+  void ReserveStates(StateId n) {
+    MutateCheck();
+    impl_->ReserveStates(n);
+  }
+
+  void ReserveArcs(StateId s, size_t n) {
+    MutateCheck();
+    impl_->ReserveArcs(s, n);
+  }
+
+  virtual void InitStateIterator(StateIteratorData<A> *data) const {
+    impl_->InitStateIterator(data);
+  }
+
+  virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const {
+    impl_->InitArcIterator(s, data);
+  }
+
+  virtual inline
+  void InitMutableArcIterator(StateId s, MutableArcIteratorData<A> *);
+
+ private:
+  explicit VectorFst(VectorFstImpl<A> *impl) : impl_(impl) {}
+
+  void MutateCheck() {
+    // Copy on write
+    if (impl_->RefCount() > 1) {
+      impl_->DecrRefCount();
+      impl_ = new VectorFstImpl<A>(*this);
+    }
+  }
+
+  VectorFstImpl<A> *impl_;  // FST's impl
+};
+
+// Specialization for VectorFst; see generic version in fst.h
+// for sample usage (but use the VectorFst type!). This version
+// should inline.
+template <class A>
+class StateIterator< VectorFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  explicit StateIterator(const VectorFst<A> &fst)
+    : nstates_(fst.impl_->NumStates()), s_(0) {}
+
+  bool Done() const { return s_ >= nstates_; }
+
+  StateId Value() const { return s_; }
+
+  void Next() { ++s_; }
+
+  void Reset() { s_ = 0; }
+
+ private:
+  StateId nstates_;
+  StateId s_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(StateIterator);
+};
+
+// Specialization for VectorFst; see generic version in fst.h
+// for sample usage (but use the VectorFst type!). This version
+// should inline.
+template <class A>
+class ArcIterator< VectorFst<A> > {
+ public:
+  typedef typename A::StateId StateId;
+
+  ArcIterator(const VectorFst<A> &fst, StateId s)
+    : arcs_(fst.impl_->GetState(s)->arcs), i_(0) {}
+
+  bool Done() const { return i_ >= arcs_.size(); }
+
+  const A& Value() const { return arcs_[i_]; }
+
+  void Next() { ++i_; }
+
+  void Reset() { i_ = 0; }
+
+  void Seek(size_t a) { i_ = a; }
+
+ private:
+  const vector<A>& arcs_;
+  size_t i_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(ArcIterator);
+};
+
+// Specialization for VectorFst; see generic version in fst.h
+// for sample usage (but use the VectorFst type!). This version
+// should inline.
+template <class A>
+class MutableArcIterator< VectorFst<A> >
+  : public MutableArcIteratorBase<A> {
+ public:
+  typedef typename A::StateId StateId;
+  typedef typename A::Weight Weight;
+
+  MutableArcIterator(VectorFst<A> *fst, StateId s) : i_(0) {
+    fst->MutateCheck();
+    state_ = fst->impl_->GetState(s);
+    properties_ = &fst->impl_->properties_;
+  }
+
+  virtual bool Done() const { return i_ >= state_->arcs.size(); }
+
+  virtual const A& Value() const { return state_->arcs[i_]; }
+
+  virtual void Next() { ++i_; }
+
+  virtual void Reset() { i_ = 0; }
+
+  virtual void Seek(size_t a) { i_ = a; }
+
+  virtual void SetValue(const A &arc) {
+    A& oarc = state_->arcs[i_];
+    if (oarc.ilabel != oarc.olabel)
+      *properties_ &= ~kNotAcceptor;
+    if (oarc.ilabel == 0) {
+      --state_->niepsilons;
+      *properties_ &= ~kIEpsilons;
+      if (oarc.olabel == 0)
+        *properties_ &= ~kEpsilons;
+    }
+    if (oarc.olabel == 0) {
+      --state_->noepsilons;
+      *properties_ &= ~kOEpsilons;
+    }
+    if (oarc.weight != Weight::Zero() && oarc.weight != Weight::One())
+      *properties_ &= ~kWeighted;
+    oarc = arc;
+    if (arc.ilabel != arc.olabel)
+      *properties_ |= kNotAcceptor;
+    if (arc.ilabel == 0) {
+      ++state_->niepsilons;
+      *properties_ |= kIEpsilons;
+      if (arc.olabel == 0)
+        *properties_ |= kEpsilons;
+    }
+    if (arc.olabel == 0) {
+      ++state_->noepsilons;
+      *properties_ |= kOEpsilons;
+    }
+    if (arc.weight != Weight::Zero() && arc.weight != Weight::One())
+      *properties_ |= kWeighted;
+    *properties_ &= kSetArcProperties | kNotAcceptor |
+                    kEpsilons | kIEpsilons | kOEpsilons | kWeighted;
+  }
+
+ private:
+  struct VectorState<A> *state_;
+  uint64 *properties_;
+  size_t i_;
+
+  DISALLOW_EVIL_CONSTRUCTORS(MutableArcIterator);
+};
+
+// Provide information needed for the generic mutable arc iterator
+template <class A> inline
+void VectorFst<A>::InitMutableArcIterator(
+    StateId s, MutableArcIteratorData<A> *data) {
+  data->base = new MutableArcIterator< VectorFst<A> >(this, s);
+}
+
+// A useful alias when using StdArc.
+typedef VectorFst<StdArc> StdVectorFst;
+
+}  // namespace fst
+
+#endif  // FST_LIB_VECTOR_FST_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/verify.h b/tools/thirdparty/OpenFst/fst/lib/verify.h
new file mode 100644
index 0000000..4035129
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/verify.h
@@ -0,0 +1,118 @@
+// verify.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// Function to test property bits
+
+#ifndef FST_LIB_VERIFY_H__
+#define FST_LIB_VERIFY_H__
+
+#include "fst/lib/fst.h"
+#include "fst/lib/test-properties.h"
+
+namespace fst {
+
+// Verifies that an Fst's contents are sane.
+template<class Arc>
+bool Verify(const Fst<Arc> &fst) {
+  typedef typename Arc::Label Label;
+  typedef typename Arc::Weight Weight;
+  typedef typename Arc::StateId StateId;
+
+  StateId start = fst.Start();
+  const SymbolTable *isyms = fst.InputSymbols();
+  const SymbolTable *osyms = fst.OutputSymbols();
+
+  // Count states
+  StateId ns = 0;
+  for (StateIterator< Fst<Arc> > siter(fst);
+       !siter.Done();
+       siter.Next())
+    ++ns;
+
+  if (start == kNoStateId && ns > 0) {
+    LOG(ERROR) << "Verify: Fst start state ID unset";
+    return false;
+  } else if (start >= ns) {
+    LOG(ERROR) << "Verify: Fst start state ID exceeds number of states";
+    return false;
+  }
+
+  for (StateIterator< Fst<Arc> > siter(fst);
+       !siter.Done();
+       siter.Next()) {
+    StateId s = siter.Value();
+    size_t na = 0;
+    for (ArcIterator< Fst<Arc> > aiter(fst, s);
+         !aiter.Done();
+         aiter.Next()) {
+      const Arc &arc =aiter.Value();
+      if (arc.ilabel < 0) {
+        LOG(ERROR) << "Verify: Fst input label ID of arc at position "
+                   << na << " of state " << s << " is negative";
+        return false;
+      } else if (isyms && isyms->Find(arc.ilabel) == "") {
+        LOG(ERROR) << "Verify: Fst input label ID " << arc.ilabel
+                   << " of arc at position " << na << " of state " <<  s
+                   << " is missing from input symbol table \""
+                   << isyms->Name() << "\"";
+        return false;
+      } else if (arc.olabel < 0) {
+        LOG(ERROR) << "Verify: Fst output label ID of arc at position "
+                   << na << " of state " << s << " is negative";
+        return false;
+      } else if (osyms && osyms->Find(arc.olabel) == "") {
+        LOG(ERROR) << "Verify: Fst output label ID " << arc.olabel
+                   << " of arc at position " << na << " of state " <<  s
+                   << " is missing from output symbol table \""
+                   << osyms->Name() << "\"";
+        return false;
+      } else if (!arc.weight.Member() || arc.weight == Weight::Zero()) {
+        LOG(ERROR) << "Verify: Fst weight of arc at position "
+                   << na << " of state " << s << " is invalid";
+        return false;
+      } else if (arc.nextstate < 0) {
+        LOG(ERROR) << "Verify: Fst destination state ID of arc at position "
+                   << na << " of state " << s << " is negative";
+        return false;
+      } else if (arc.nextstate >= ns) {
+        LOG(ERROR) << "Verify: Fst destination state ID of arc at position "
+                   << na << " of state " << s
+                   << " exceeds number of states";
+        return false;
+      }
+      ++na;
+    }
+    if (!fst.Final(s).Member()) {
+      LOG(ERROR) << "Verify: Fst final weight of state " << s << " is invalid";
+      return false;
+    }
+  }
+  uint64 fst_props = fst.Properties(kFstProperties, false);
+  uint64 known_props;
+  uint64 test_props = ComputeProperties(fst, kFstProperties, &known_props,
+                                        false);
+  if (!CompatProperties(fst_props, test_props)) {
+    LOG(ERROR) << "Verify: stored Fst properties incorrect "
+               << "(props1 = stored props, props2 = tested)";
+    return false;
+  } else {
+    return true;
+  }
+}
+
+}  // namespace fst
+
+#endif  // FST_LIB_VERIFY_H__
diff --git a/tools/thirdparty/OpenFst/fst/lib/weight.h b/tools/thirdparty/OpenFst/fst/lib/weight.h
new file mode 100644
index 0000000..7050f50
--- /dev/null
+++ b/tools/thirdparty/OpenFst/fst/lib/weight.h
@@ -0,0 +1,139 @@
+// weight.h
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// \file
+// General weight set and associated semiring operation definitions.
+//
+// A semiring is specified by two binary operations Plus and Times and
+// two designated elements Zero and One with the following properties:
+//   Plus: associative, commutative, and has Zero as its identity.
+//   Times: associative and has identity One, distributes w.r.t. Plus, and
+//     has Zero as an annihilator:
+//          Times(Zero(), a) == Times(a, Zero()) = Zero().
+//
+//  A left semiring distributes on the left; a right semiring is
+//  similarly defined.
+//
+// A Weight class is required to be (at least) a left or right semiring.
+//
+// In addition, the following should be defined for a Weight:
+//   Member: predicate on set membership.
+//   >>: reads textual representation of a weight.
+//   <<: prints textual representation of a weight.
+//   Read(istream &): reads binary representation of a weight.
+//   Write(ostrem &): writes binary representation of a weight.
+//   Hash: maps weight to ssize_t.
+//   ApproxEqual: approximate equality (for inexact weights)
+//   Quantize: quantizes wrt delta (for inexact weights)
+//   Divide: for all a,b,c s.t. Times(a, b) == c
+//     --> b = Divide(c, a, DIVIDE_LEFT) if a left semiring and b.Member()
+//     --> a = Divide(c, b, DIVIDE_RIGHT) if a right semiring and a.Member()
+//     --> b = Divide(c, a)
+//           = Divide(c, a, DIVIDE_ANY)
+//           = Divide(c, a, DIVIDE_LEFT)
+//           = Divide(c, a, DIVIDE_RIGHT) if a commutative semiring
+//   ReverseWeight: the type of the corresponding reverse weight.
+//     Typically the same type as Weight for a (both left and right) semiring.
+//     For the left string semiring, it is the right string semiring.
+//   Reverse: a mapping from Weight to ReverseWeight s.t.
+//     --> Reverse(Reverse(a)) = a
+//     --> Reverse(Plus(a, b)) = Plus(Reverse(a), Reverse(b))
+//     --> Reverse(Times(a, b)) = Times(Reverse(b), Reverse(a))
+//     Typically the identity mapping in a (both left and right) semiring.
+//     In the left string semiring, it maps to the reverse string
+//     in the right string semiring.
+//   Properties: specifies additional properties that hold:
+//      LeftSemiring: indicates weights form a left semiring.
+//      RightSemiring: indicates weights form a right semiring.
+//      TimesCommutative: for all a,b: Times(a,b) == Times(b,a)
+//      Idempotent: for all a: Plus(a, a) == a.
+//      Path Property: for all a, b: Plus(a, b) == a or Plus(a, b) == b.
+
+
+#ifndef FST_LIB_WEIGHT_H__
+#define FST_LIB_WEIGHT_H__
+
+#include <cctype>
+#include <cmath>
+#include <iostream>
+#include <sstream>
+
+#include "fst/lib/compat.h"
+
+#include "fst/lib/util.h"
+
+namespace fst {
+
+//
+// CONSTANT DEFINITIONS
+//
+
+// A representable float near .001
+const float kDelta =                   1.0F/1024.0F;
+
+// For all a,b,c: Times(c, Plus(a,b)) = Plus(Times(c,a), Times(c, b))
+const uint64 kLeftSemiring =           0x0000000000000001ULL;
+
+// For all a,b,c: Times(Plus(a,b), c) = Plus(Times(a,c), Times(b, c))
+const uint64 kRightSemiring =          0x0000000000000002ULL;
+
+const uint64 kSemiring = kLeftSemiring | kRightSemiring;
+
+// For all a,b: Times(a,b) = Times(b,a)
+const uint64 kCommutative =       0x0000000000000004ULL;
+
+// For all a: Plus(a, a) = a
+const uint64 kIdempotent =             0x0000000000000008ULL;
+
+// For all a,b: Plus(a,b) = a or Plus(a,b) = b
+const uint64 kPath =                   0x0000000000000010ULL;
+
+
+// Determines direction of division.
+enum DivideType { DIVIDE_LEFT,   // left division
+                  DIVIDE_RIGHT,  // right division
+                  DIVIDE_ANY };  // division in a commutative semiring
+
+// NATURAL ORDER
+//
+// By definition:
+//                 a <= b iff a + b = a
+// The natural order is a monotonic and negative partial order iff the
+// semiring is idempotent and (left and right) distributive. It is a
+// total order iff the semiring has the path property. See Mohri,
+// "Semiring Framework and Algorithms for Shortest-Distance Problems",
+// Journal of Automata, Languages and Combinatorics 7(3):321-350,
+// 2002. We define the strict version of this order below.
+
+template <class W>
+class NaturalLess {
+ public:
+  typedef W Weight;
+
+  NaturalLess() {
+    uint64 props = kIdempotent | kLeftSemiring | kRightSemiring;
+    if (W::Properties() & props != props)
+      LOG(ERROR) << "NaturalLess: Weight type is not idempotent and "
+                 << "(left and right) distributive: " << W::Type();
+  }
+
+  bool operator()(const W &w1, const W &w2) const {
+    return (Plus(w1, w2) == w1) && w1 != w2;
+  }
+};
+
+}  // namespace fst;
+
+#endif  // FST_LIB_WEIGHT_H__
diff --git a/uapi/Android.mk b/uapi/Android.mk
new file mode 100644
index 0000000..85445d5
--- /dev/null
+++ b/uapi/Android.mk
@@ -0,0 +1,12 @@
+###############################################################################
+# FILE: Makefile
+#
+# Top-level Makefile for UAPI
+###############################################################################
+
+# remember root of UAPI source tree
+export UAPI_ROOT_DIR := $(call my-dir)
+export UAPI_MAKE_DIR := $(UAPI_ROOT_DIR)/make/uapi
+
+# perform sub-makes
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/Android.mk b/uapi/cpp/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/api/include/AudioSource.h b/uapi/cpp/api/include/AudioSource.h
new file mode 100644
index 0000000..8002c21
--- /dev/null
+++ b/uapi/cpp/api/include/AudioSource.h
@@ -0,0 +1,90 @@
+/*---------------------------------------------------------------------------*
+ *  AudioSource.h                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__AUDIOSOURCE
+#define __UAPI__AUDIOSOURCE
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class AudioStreamProxy;
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * A collection of audio data.
+       */
+      class AudioSource
+      {
+        public:
+          virtual ~AudioSource()
+          {}
+          /**
+           * Returns an object that contains audio samples.
+           *
+           * @param returnCode the return code
+           * @return a pointer to an Audio object.
+           * @see AudioStream
+           */
+          virtual AudioStreamProxy createAudio(ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Starts collecting audio samples.
+           *
+           * @param returnCode the return code
+           */
+          virtual void start(ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Stops collecting audio samples.
+           *
+           * @param returnCode the return code
+           */
+          virtual void stop(ReturnCode::Type& returnCode) = 0;
+        private:
+          /**
+          * Prevent assignment.
+          */
+          AudioSource& operator=(AudioSource&);
+      };
+   /*
+      * @see android::speech::recognition::SmartProxy
+      */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, AudioSourceProxy, android::speech::recognition::SmartProxy, AudioSource)
+
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/AudioSourceListener.h b/uapi/cpp/api/include/AudioSourceListener.h
new file mode 100644
index 0000000..91168c2
--- /dev/null
+++ b/uapi/cpp/api/include/AudioSourceListener.h
@@ -0,0 +1,79 @@
+/*---------------------------------------------------------------------------*
+ *  AudioSourceListener.h                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__AUDIOSOURCELISTER
+#define __UAPI__AUDIOSOURCELISTER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for AudioSource events.
+       */
+      class AudioSourceListener
+      {
+        public:
+          /**
+           * Invoked when reading begins.
+           */
+          virtual void onStarted() = 0;
+          
+          /**
+           * Invoked when the reading ends (either normally or due to an error).
+           */
+          virtual void onStopped() = 0;
+          
+          /**
+           * Invoked when an unexpected error occurs. This is normally followed by
+           * onStopped() if the component shuts down successfully.
+           *
+           * @param error specific error code.
+           */
+          virtual void onError(ReturnCode::Type error) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT AudioSourceListener();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~AudioSourceListener();
+          
+          friend class AudioSourceListenerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      
+      DECLARE_SMARTPROXY(UAPI_EXPORT, AudioSourceListenerProxy, android::speech::recognition::SmartProxy,
+                         AudioSourceListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/AudioStream.h b/uapi/cpp/api/include/AudioStream.h
new file mode 100644
index 0000000..3316dfd
--- /dev/null
+++ b/uapi/cpp/api/include/AudioStream.h
@@ -0,0 +1,66 @@
+/*---------------------------------------------------------------------------*
+ *  AudioStream.h                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__AUDIO
+#define __UAPI__AUDIO
+
+#include "exports.h"
+#include "SmartProxy.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * A collection of audio data.
+       *
+       * Each stream has an associated position and may only be used by one consumer at a time.
+       * This means that if one wishes to carry out simultaneous recognitions then one must create
+       * two AudioStream objects.
+       */
+      class UAPI_EXPORT AudioStream
+      {
+        public:
+          virtual ~AudioStream();
+        protected:
+          /**
+           * Prevent construction.
+           */
+          AudioStream();
+        private:
+          /**
+           * Prevent assignment.
+           */
+          AudioStream& operator=(AudioStream&);
+          
+          friend class AudioStreamProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, AudioStreamProxy, SmartProxy, AudioStream)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/Codec.h b/uapi/cpp/api/include/Codec.h
new file mode 100644
index 0000000..da9428d
--- /dev/null
+++ b/uapi/cpp/api/include/Codec.h
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*
+ *  Codec.h                                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CODEC_
+#define __UAPI__CODEC_
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "types.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class UAPI_EXPORT Codec
+      {
+        public:
+          typedef enum Type
+          {
+            /**
+             * PCM, 16 bits, 8KHz.
+             */
+            PCM_16BIT_8K,
+            /**
+             * PCM, 16 bits, 11KHz.
+             */
+            PCM_16BIT_11K,
+            /**
+              * PCM, 16 bits, 22KHz.
+              */
+            PCM_16BIT_22K,
+            /**
+             * ULAW, 8 bits, 8KHz
+             */
+            ULAW_8BIT_8K
+          } Type;
+          
+          /**
+           * Returns the sample-rate of the specified codec.
+           *
+           * @param codec the codec to evaluate
+           * @param returnCode the return code
+           */
+          static UINT16 getSampleRate(Type codec,
+                                      ReturnCode::Type& returnCode);
+                                      
+          /**
+           * Returns the bitrate of the specified codec.
+           *
+           * @param codec the codec to evaluate
+           * @param returnCode the return code
+           */
+          static UINT16 getBitsPerSample(Type codec, ReturnCode::Type& returnCode);
+      };
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/DeviceSpeaker.h b/uapi/cpp/api/include/DeviceSpeaker.h
new file mode 100644
index 0000000..27d6ae1
--- /dev/null
+++ b/uapi/cpp/api/include/DeviceSpeaker.h
@@ -0,0 +1,124 @@
+/*---------------------------------------------------------------------------*
+ *  DeviceSpeaker.h                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__DEVICESPEAKER
+#define __UAPI__DEVICESPEAKER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "Codec.h"
+#include "Singleton.h"
+#include "SmartProxy.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class DeviceSpeakerListenerProxy;
+      class System;
+      class AudioStreamProxy;
+    }
+  }
+}
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class DeviceSpeakerProxy;
+      /**
+       * DeviceSpeaker used to playback audio samples.
+       */
+      class DeviceSpeaker : public Singleton
+      {
+        public:
+          /**
+           * Returns the device speaker instance.
+           *
+           * @param returnCode the return code.
+           * @return an instance of a DeviceSpeaker class.
+           */
+          UAPI_EXPORT static DeviceSpeakerProxy getInstance(ReturnCode::Type& returnCode);
+          
+          /**
+           * Start audio playback.
+           *
+           * @param audio the audio to play
+           * @param returnCode INVALID_STATE if the component is already stated.
+           * ILLEGAL_ARGUMENT if the audio object is invalid.
+           * AUDIO_ALREADY_IN_USE if the audio is already in use by another component.
+           * END_OF_STREAM if the end of the audio stream has been reached.
+           */
+          virtual void start(AudioStreamProxy& audio, ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Stops audio playback.
+           *
+           * @return SUCCESS if stop in progress
+           * @param returnCode the return code
+           */
+          virtual void stop(ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Sets the playback codec. This must be called before start is called.
+           *
+           * @param playbackCodec the codec to use for the playback operation.
+           * @param returnCode the return code.
+           */
+          virtual void setCodec(Codec::Type playbackCodec, ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Sets the microphone listener.
+           *
+           * @param listener the device speaker listener.
+           * @param returnCode the return code.
+           */
+          virtual void setListener(DeviceSpeakerListenerProxy& listener, ReturnCode::Type& returnCode) = 0;
+          
+        protected:
+          /**
+           * Prevent construction.
+           */
+          DeviceSpeaker();
+          /**
+           * Prevent destruction.
+           */
+          virtual ~DeviceSpeaker();
+          
+          /**
+           * Singleton instance.
+           */
+          static DeviceSpeaker* instance;
+          
+          friend class DeviceSpeakerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, DeviceSpeakerProxy, SmartProxy, DeviceSpeaker)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/DeviceSpeakerListener.h b/uapi/cpp/api/include/DeviceSpeakerListener.h
new file mode 100644
index 0000000..81894fc
--- /dev/null
+++ b/uapi/cpp/api/include/DeviceSpeakerListener.h
@@ -0,0 +1,79 @@
+/*---------------------------------------------------------------------------*
+ *  DeviceSpeakerListener.h                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__DEVICESPEAKERLISTENER
+#define __UAPI__DEVICESPEAKERLISTENER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for DeviceSpeaker events.
+       */
+      class DeviceSpeakerListener
+      {
+        public:
+          /**
+           * Invoked when the device speaker starts playback.
+           */
+          virtual void onStarted() = 0;
+          
+          /**
+           * Invoked when the playback ends (either normally or due to an error).
+           */
+          virtual void onStopped() = 0;
+          
+          /**
+           * Invoked when an unexpected error occurs. This is normally followed by
+           * onStopped() if the component shuts down successfully.
+           *
+           * @param error specific error code.
+           */
+          virtual void onError(ReturnCode::Type error) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT DeviceSpeakerListener();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~DeviceSpeakerListener();
+          
+          friend class DeviceSpeakerListenerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, DeviceSpeakerListenerProxy, SmartProxy,
+                         DeviceSpeakerListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/EmbeddedGrammar.h b/uapi/cpp/api/include/EmbeddedGrammar.h
new file mode 100644
index 0000000..e90f6c9
--- /dev/null
+++ b/uapi/cpp/api/include/EmbeddedGrammar.h
@@ -0,0 +1,83 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedGrammar.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__EMBEDDEDGRAMMAR
+#define __UAPI__EMBEDDEDGRAMMAR
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "Grammar.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class EmbeddedGrammarProxy;
+      /**
+       * Grammar on an embedded recognizer.
+       */
+      class EmbeddedGrammar: public Grammar
+      {
+        public:
+          /**
+           * Compiles items that were added to any of the grammar slots.
+           *
+           * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+           */
+          virtual void compileAllSlots(ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Removes all words added to all slots.
+           *
+           * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+           */
+          virtual void resetAllSlots(ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Saves the compiled grammar.
+           *
+           * @param path the path to save the grammar to
+           * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+           */
+          virtual void save(const char* path, ReturnCode::Type& returnCode) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT EmbeddedGrammar();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~EmbeddedGrammar();
+          
+          friend class EmbeddedGrammarProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, EmbeddedGrammarProxy, GrammarProxy, EmbeddedGrammar)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/EmbeddedGrammarListener.h b/uapi/cpp/api/include/EmbeddedGrammarListener.h
new file mode 100644
index 0000000..1fc725f
--- /dev/null
+++ b/uapi/cpp/api/include/EmbeddedGrammarListener.h
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedGrammarListener.h                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__EMBEDDEDGRAMMARLISTENER
+#define __UAPI__EMBEDDEDGRAMMARLISTENER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "GrammarListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for EmbeddedGrammar events.
+       */
+      class EmbeddedGrammarListener: public GrammarListener
+      {
+        public:
+          UAPI_EXPORT virtual ~EmbeddedGrammarListener();
+          
+          /**
+           * Invoked after the grammar is saved.
+           *
+           * @param path the path the grammar was saved to
+           */
+          virtual void onSaved(const char* path) = 0;
+          
+          /**
+           * Invokes after all grammar slots have been compiled.
+           */
+          virtual void onCompileAllSlots() = 0;
+          
+          /**
+           * Invokes after all grammar slots have been reset.
+           */
+          virtual void onResetAllSlots() = 0;
+          
+          /**
+           * Invoked when an unexpected error occurs. This is normally followed by
+           * onStopped() if the component shuts down successfully.
+           *
+           * @param returnCode GRAMMAR_SLOT_FULL if an item cannot be added into a grammar slot
+           * because it is full.<br/>
+           * NOT_SUPPORTED if different words with the same pronunciation are added.<br/>
+           * INVALID_STATE if reseting or compiling the slots fails.<br/>
+           * READ_ERROR if the grammar could not be loaded.<br/>
+           * WRITE_ERROR if the grammar could not be saved.
+           */
+          virtual void onError(ReturnCode::Type returnCode) = 0;
+      };
+      /**
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, EmbeddedGrammarListenerProxy, GrammarListenerProxy, EmbeddedGrammarListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/EmbeddedRecognizer.h b/uapi/cpp/api/include/EmbeddedRecognizer.h
new file mode 100644
index 0000000..0700e08
--- /dev/null
+++ b/uapi/cpp/api/include/EmbeddedRecognizer.h
@@ -0,0 +1,115 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedRecognizer.h                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__EMBEDDEDRECOGNIZER
+#define __UAPI__EMBEDDEDRECOGNIZER
+
+#include <assert.h>
+#include "exports.h"
+#include "ReturnCode.h"
+#include "Recognizer.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class RecognizerListenerProxy;
+      namespace utilities
+      {
+        class LibraryLoader;
+      }
+      namespace impl
+      {
+        class RedirectToLibrary;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class EmbeddedRecognizerProxy;
+      /**
+       * Embedded recognizer.
+       */
+      class EmbeddedRecognizer: public Recognizer
+      {
+        public:
+          /**
+           * Creates a new embedded recognizer.
+           *
+           * @param returnCode the return code
+           * @return returns a new embedded recognizer instance
+           */
+          UAPI_EXPORT static EmbeddedRecognizerProxy getInstance(ReturnCode::Type& returnCode);
+          
+          /**
+           * Configures the embedded recognizer.
+           *
+           * @param config recognizer configuration file
+           * @param returnCode ILLEGAL_ARGUMENT if config is null.<br/>
+           * OPEN_ERROR, or READ_ERROR if the recognizer configuration, acoustic model, or
+           * vocabulary files could not be opened or read.
+           */
+          virtual void configure(const char* config, ReturnCode::Type& returnCode) = 0;
+                                             
+          /**
+           * The recognition accuracy improves over time as the recognizer adapts to the surrounding
+           * environment. This method enables developers to reset the adaptation when the environment
+           * is known to have changed.
+           *
+           * @param returnCode the return code
+           */
+          virtual void resetAcousticState(ReturnCode::Type& returnCode) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT EmbeddedRecognizer();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~EmbeddedRecognizer();
+          
+          friend class impl::RedirectToLibrary;
+          friend class EmbeddedRecognizerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, EmbeddedRecognizerProxy, RecognizerProxy, EmbeddedRecognizer)
+      
+      /**
+       * Invokes EmbeddedRecognizer::configure() on the remote instance.
+       */
+      typedef EmbeddedRecognizerProxy*(*ConfigureEmbeddedRecognizer)(const char* config,
+          ReturnCode::Type& returnCode);
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/Grammar.h b/uapi/cpp/api/include/Grammar.h
new file mode 100644
index 0000000..6529c6a
--- /dev/null
+++ b/uapi/cpp/api/include/Grammar.h
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*
+ *  Grammar.h                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__GRAMMAR
+#define __UAPI__GRAMMAR
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class GrammarProxy;
+      /**
+       * Speech recognition grammar.
+       */
+      class Grammar
+      {
+        public:
+          
+
+          /**
+           * Indicates that the grammar will be used in the near future.
+           *
+           * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+           */
+          virtual void load(ReturnCode::Type& returnCode) = 0;
+          /**
+           * Indicates that the grammar won't be used in the near future.
+           *
+           * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+           */
+          virtual void unload(ReturnCode::Type& returnCode) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT Grammar();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~Grammar();
+          
+          friend class GrammarProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, GrammarProxy, android::speech::recognition::SmartProxy, Grammar)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/GrammarListener.h b/uapi/cpp/api/include/GrammarListener.h
new file mode 100644
index 0000000..da156b3
--- /dev/null
+++ b/uapi/cpp/api/include/GrammarListener.h
@@ -0,0 +1,81 @@
+/*---------------------------------------------------------------------------*
+ *  GrammarListener.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__GRAMMARLISTENER
+#define __UAPI__GRAMMARLISTENER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for Grammar events.
+       */
+      class GrammarListener
+      {
+        public:
+          UAPI_EXPORT virtual ~GrammarListener();
+          
+          /**
+           * Invoked after the grammar is loaded.
+           */
+          virtual void onLoaded() = 0;
+          
+          /**
+           * Invoked after the grammar is unloaded.
+           */
+          virtual void onUnloaded() = 0;
+          
+          /**
+           * Invoked when a grammar operation fails.
+           *
+           * @param returnCode READ_ERROR if the grammar could not be loaded.<br/>
+           * WRITE_ERROR if the grammar could not be saved.
+           */
+          virtual void onError(ReturnCode::Type returnCode) = 0;
+          
+          /**
+           * Returns true if the listener is an EmbeddedGrammarListener.
+           *
+           * @return true if the listener is an EmbeddedGrammarListener
+           */
+          virtual bool isEmbeddedGrammarListener() = 0;
+
+           /**
+           * Returns true if the listener is an SrecGrammarListener.
+           *
+           * @return true if the listener is an SrecGrammarListener
+           */
+          virtual bool isSrecGrammarListener() = 0;
+      };
+      /**
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, GrammarListenerProxy, SmartProxy, GrammarListener)
+    }
+  }
+}
+#endif
diff --git a/uapi/cpp/api/include/Logger.h b/uapi/cpp/api/include/Logger.h
new file mode 100644
index 0000000..d469b78
--- /dev/null
+++ b/uapi/cpp/api/include/Logger.h
@@ -0,0 +1,284 @@
+/*---------------------------------------------------------------------------*
+ *  Logger.h                                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__LOGGER
+#define __UAPI__LOGGER
+
+#if defined (ANDROID)
+#define LOG_TAG "Uapi"  
+#include <utils/Log.h>
+#endif
+#include "ReturnCode.h"
+#include "exports.h"
+#include "SmartProxy.h"
+
+#define UAPI_LOG_FUNCTION_SCOPE
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+#ifdef UAPI_LOGGING_ENABLED
+
+      class LoggerProxy;
+      /**
+       * Debug logging.
+       *
+       * <b>WARNING</b>: Loggers are hierarchical in nature. The parent logger
+       * must not be deallocated before its children or a crash may result.
+       * <b>Be extremely careful if you choose to allocate Logger instances on
+       * the heap!</b>.
+       */
+      class Logger
+      {
+        public:
+          enum UAPI_EXPORT LogLevel
+          {
+            /**
+             * Does not log.
+             */
+            LEVEL_NONE,
+            /**
+             * Logs fatal issues. This level only logs ERROR.
+             */
+            LEVEL_ERROR,
+            /**
+             * Logs non-fatal issues. This level also logs ERROR.
+             */
+            LEVEL_WARN,
+            /**
+             * Logs debugging information, such as the values of variables.
+             * This level also logs ERROR, WARN.
+             */
+            LEVEL_INFO,
+            /**
+             * Logs when loggers are created or destroyed. This level also logs
+             * INFO, WARN, ERROR.
+             */
+            LEVEL_TRACE
+          };
+
+          /**
+           * Returns the logger instance, creating one if necessary.
+           *
+           * @param returnCode returns SUCCESS unless a fatal error occurs returns SUCCESS
+           * @return the singleton instance
+           */
+          UAPI_EXPORT static LoggerProxy getInstance(ReturnCode::Type& returnCode);
+
+          /**
+           * Returns the logger instance, if one already exists.
+           *
+           * @return the singleton instance. Can return 0 if the logger could not be created.
+           */
+          UAPI_EXPORT static Logger* getExistingInstance();
+
+          /**
+           * Sets the logging level.
+           *
+           * @param level the logging level
+           * @param returnCode the return code
+           * @see Logger#LogLevel
+           */
+          virtual void setLoggingLevel(LogLevel level, ReturnCode::Type& returnCode) = 0;
+
+          /**
+           * returns the current logging level
+           *
+           * @return the logging level of the logger.
+           */
+          virtual LogLevel getLoggingLevel() const = 0;
+
+          /**
+           * Sets the path that will contain the logs.
+           *
+           * @param path the path of the log file
+           * @param returnCode SUCCESS unless a fatal error occurs.
+           * ILLEGAL_ARGUMENT if path is null or empty.
+           * INVALID_STATE if file handle is null.
+           * FILE_NOT_FOUND if could not open the path.
+           */
+          virtual void setPath(const char* path, ReturnCode::Type& returnCode) = 0;
+
+          /**
+           * Logs a message using the LEVEL_ERROR logging level.
+           *
+           * @param format format of variable arguments that follow
+           */
+          virtual void error(const char* fn, const char* lpszFormat, ...) = 0;
+
+          /**
+           * Logs a message using the LEVEL_WARN logging level.
+           *
+           * @param format format of variable arguments that follow
+           */
+          virtual void warn(const char* fn, const char* lpszFormat, ...) = 0;
+
+          /**
+           * Logs a message using the LEVEL_INFO logging level.
+           *
+           * @param format format of variable arguments that follow
+           */
+          virtual void info(const char* fn, const char* lpszFormat, ...) = 0;
+
+          /**
+           * Logs a message using the LEVEL_TRACE logging level.
+           *
+           * @param format format of variable arguments that follow
+           */
+          virtual void trace(const char* fn, const char* lpszFormat, ...) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          Logger();
+          /**
+           * Prevent destruction.
+           */
+          virtual ~Logger();
+        private:
+
+
+          friend class SmartProxy;
+          friend class LoggerProxy;
+      };
+
+
+
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, LoggerProxy, SmartProxy, Logger)
+#else
+        inline void UAPILog(const char *, const char* , ...)
+        {
+        }
+				class Logger
+				{
+        public:
+						enum UAPI_EXPORT LogLevel
+						{
+							LEVEL_NONE,
+							LEVEL_ERROR,
+							LEVEL_WARN,
+							LEVEL_INFO,
+							LEVEL_TRACE
+						};
+				};
+#endif
+    }
+  }
+}
+      /**
+       * call this macro if something should be logger as an error. It is usually not
+       * fatal but in most cases the current operation has to be aborted because
+       * there are no easy way to recover.
+       */
+#ifdef UAPI_LOGGING_ENABLED
+#define UAPI_ERROR(...) { \
+  if(android::speech::recognition::Logger::getExistingInstance()) \
+    android::speech::recognition::Logger::getExistingInstance()->error(__VA_ARGS__); \
+}
+#else
+//# define UAPI_ERROR(...) { if (false) UAPILog(__VA_ARGS__); }
+#define UAPI_ERROR(fn, ...) { LOGE(__VA_ARGS__); }
+#endif
+
+      /**
+       * call this macro if something should be logger as a warning. You have a
+       * warning when something unexpected occurs but the overall execution of the
+       * program should not be affected.
+       */
+#ifdef UAPI_LOGGING_ENABLED
+#define UAPI_WARN(...) { \
+  if(android::speech::recognition::Logger::getExistingInstance()) \
+    android::speech::recognition::Logger::getExistingInstance()->warn(__VA_ARGS__); \
+}
+#else
+//# define UAPI_WARN(...) { if (false) UAPILog(__VA_ARGS__); }
+#define UAPI_WARN(fn, ...) { LOGW(__VA_ARGS__); }
+#endif
+
+      /**
+       * call this macro if something should be logger as an information to the user.
+       * Anything that is relevant can be logger as INFO.
+       */
+#ifdef UAPI_LOGGING_ENABLED
+#define UAPI_INFO(...) { \
+  if(android::speech::recognition::Logger::getExistingInstance()) \
+    android::speech::recognition::Logger::getExistingInstance()->info(__VA_ARGS__); \
+}
+#else
+//# define UAPI_INFO(...) { if (false) UAPILog(__VA_ARGS__); }
+#define UAPI_INFO(fn, ...) { LOGV(__VA_ARGS__); }
+#endif
+
+      /**
+       * call this macro if you want to be able to trace the code path.
+       */
+#ifdef UAPI_LOGGING_ENABLED
+#define UAPI_TRACE(...) { \
+  if(android::speech::recognition::Logger::getExistingInstance()) \
+    android::speech::recognition::Logger::getExistingInstance()->trace(__VA_ARGS__); \
+}
+#else
+//# define UAPI_TRACE(...) { if (false) UAPILog(__VA_ARGS__); }
+#define UAPI_TRACE(fn, ...) { LOGV(__VA_ARGS__); }
+#endif
+
+
+# define UAPI_FN_NAME(name) const char* const fn = name;
+
+#if defined(UAPI_LOGGING_ENABLED) && defined(UAPI_LOG_FUNCTION_SCOPE)
+/** 
+ * Create UAPI_TRACE objects on the stack to log when a scope is entered and
+ * exited.
+ */
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class TraceScope
+      {
+        public:
+          TraceScope(const char* fn)
+          : functionName(fn)
+          { UAPI_TRACE(functionName, "ENTER\n"); }
+          ~TraceScope()
+          { UAPI_TRACE(functionName, "EXIT\n"); }
+
+        private:
+          const char * functionName;
+      };
+    }
+  }
+}
+# define UAPI_FN_SCOPE(name) const char* const fn = name; \
+												android::speech::recognition::TraceScope traceScope(fn);
+#else
+inline void RemoveCompilerWarning(const char *) {}
+# define UAPI_FN_SCOPE(name) const char* const fn = name;  RemoveCompilerWarning(fn);
+#endif
+
+
+#endif
diff --git a/uapi/cpp/api/include/MediaFileReader.h b/uapi/cpp/api/include/MediaFileReader.h
new file mode 100644
index 0000000..42280e5
--- /dev/null
+++ b/uapi/cpp/api/include/MediaFileReader.h
@@ -0,0 +1,109 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileReader.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MEDIAFILEREADER_
+#define __UAPI__MEDIAFILEREADER_
+
+#include "exports.h"
+#include "AudioSource.h"
+#include "types.h"
+#include "Codec.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class AudioSourceListenerProxy;
+      class MediaFileReaderProxy;
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+      * Reads audio from a file.
+      */
+      class MediaFileReader: public AudioSource
+      {
+        public:
+          enum ReadingMode
+          {
+            /**
+            * Reads the file at the rate real-time audio would be spoken.
+            */
+            REAL_TIME,
+            
+            /**
+            * Reads the entire file at once.
+            */
+            ALL_AT_ONCE
+          };
+          
+          /**
+          * Creates an instance of this class.
+          *
+          * @param pszFileName the name of the file in which we will read the
+          * audio samples. Note: The file MUST be of type Microsoft WAVE RIFF
+          * format (PCM 16 bits 8000 Hz or PCM 16 bits 11025 Hz).
+          * @param listener listens for MediaFileReader events
+          * @param logger the logger
+          * @param returnCode the return code
+          */
+          UAPI_EXPORT static MediaFileReaderProxy create(const char* pszFileName,
+              AudioSourceListenerProxy& listener,
+              ReturnCode::Type& returnCode);
+              
+          /**
+          * Set the reading mode
+          *
+          * @param mode the reading mode
+          * @param returnCode the return code
+          */
+          virtual void setReadingMode(ReadingMode mode, ReturnCode::Type& returnCode) = 0;
+        protected:
+          /**
+          * Prevent destruction.
+          */
+          MediaFileReader();
+          /**
+          * Prevent destruction.
+          */
+          virtual ~MediaFileReader();
+          
+          friend class MediaFileReaderProxy;
+      };
+      
+      /*
+      * @see android::speech::recognition::SmartProxy
+      */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, MediaFileReaderProxy, AudioSourceProxy, MediaFileReader)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/MediaFileReaderListener.h b/uapi/cpp/api/include/MediaFileReaderListener.h
new file mode 100644
index 0000000..54f89c4
--- /dev/null
+++ b/uapi/cpp/api/include/MediaFileReaderListener.h
@@ -0,0 +1,62 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileReaderListener.h                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MEDIAFILEREADERLISTER
+#define __UAPI__MEDIAFILEREADERLISTER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+#include "AudioSourceListener.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for MediaFileReader events.
+       */
+      class MediaFileReaderListener : public AudioSourceListener
+      {
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT MediaFileReaderListener();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~MediaFileReaderListener();
+          
+          friend class MediaFileReaderListenerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      
+      DECLARE_SMARTPROXY(UAPI_EXPORT, MediaFileReaderListenerProxy, AudioSourceListenerProxy,
+                         MediaFileReaderListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/MediaFileWriter.h b/uapi/cpp/api/include/MediaFileWriter.h
new file mode 100644
index 0000000..58243e7
--- /dev/null
+++ b/uapi/cpp/api/include/MediaFileWriter.h
@@ -0,0 +1,94 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileWriter.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MEDIAFILEWRITER_
+#define __UAPI__MEDIAFILEWRITER_
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class MediaFileWriterListenerProxy;
+      class AudioStreamProxy;
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class MediaFileWriterProxy;
+      /**
+       * Writes audio to a file.
+       */
+      class MediaFileWriter
+      {
+        public:
+          /**
+           * Creates an instace of this class.
+           *
+           * @param listener listens for MediaFileWriter events
+           * @param logger the logger
+           * @param returnCode the return code
+           */
+          UAPI_EXPORT static MediaFileWriterProxy create(MediaFileWriterListenerProxy& listener,
+              ReturnCode::Type& returnCode);
+              
+          /**
+           * Saves audio to a file.
+           *
+           * @param audio the audio to save
+           * @param filename the path to
+           * @param returnCode ILLEGAL_ARGUMENT if audio object is invalid.
+           * AUDIO_ALREADY_IN_USE if the audio is already in use by another component.
+           * END_OF_STREAM if the end of the audio stream has been reached.
+           */
+          virtual void save(AudioStreamProxy& audio, const char* path, ReturnCode::Type& returnCode) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          MediaFileWriter();
+          /**
+           * Prevent destruction.
+           */
+          virtual ~MediaFileWriter();
+          
+          friend class MediaFileWriterProxy;
+      };
+      
+      /**
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, MediaFileWriterProxy, SmartProxy, MediaFileWriter)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/MediaFileWriterListener.h b/uapi/cpp/api/include/MediaFileWriterListener.h
new file mode 100644
index 0000000..ece5b94
--- /dev/null
+++ b/uapi/cpp/api/include/MediaFileWriterListener.h
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileWriterListener.h                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MEDIAFILEWRITERLISTENER
+#define __UAPI__MEDIAFILEWRITERLISTENER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for MediaFileWriter events.
+       */
+      class MediaFileWriterListener
+      {
+        public:
+          /**
+           * Invoked when the save() operation terminates
+           */
+          virtual void onStopped() = 0;
+          
+          /**
+           * Invoked when an unexpected error occurs. This is normally followed by
+           * onStopped() if the component shuts down successfully.
+           *
+           * @param error specific error code.
+           */
+          virtual void onError(ReturnCode::Type error) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT MediaFileWriterListener();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~MediaFileWriterListener();
+          
+          friend class MediaFileWriterListenerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, MediaFileWriterListenerProxy, SmartProxy,
+                         MediaFileWriterListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/Microphone.h b/uapi/cpp/api/include/Microphone.h
new file mode 100644
index 0000000..78b721d
--- /dev/null
+++ b/uapi/cpp/api/include/Microphone.h
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*
+ *  Microphone.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MICROPHONE
+#define __UAPI__MICROPHONE
+
+#include "exports.h"
+#include "AudioSource.h"
+#include "Codec.h"
+#include "Singleton.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class AudioSourceListenerProxy;
+      class System;
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class MicrophoneProxy;
+      /**
+       * Records audio.
+       */
+      class Microphone: public AudioSource, public Singleton
+      {
+        public:
+          /**
+           * Returns the microphone.
+           *
+           * @param returnCode the return code.
+           * @return the microphone
+           */
+          UAPI_EXPORT static MicrophoneProxy getInstance(ReturnCode::Type& returnCode);
+          
+          /**
+           * Sets the recording codec. This must be called before start() is invoked.
+           *
+           * @param recordingCodec the codec in which the samples will be recorded
+           * @param returnCode the return code
+           */
+          virtual void setCodec(Codec::Type recordingCodec, ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Set the microphone listener.
+           *
+           * @param listener the microphone listener
+           * @param returnCode the return code
+           */
+          virtual void setListener(AudioSourceListenerProxy& listener, ReturnCode::Type& returnCode) = 0;
+          
+        protected:
+          /**
+           * Prevent construction.
+           */
+          Microphone();
+          /**
+           * Prevent destruction.
+           */
+          virtual ~Microphone();
+          
+          /**
+           * singleton instance
+           */
+          static Microphone* instance;
+        private:
+          /**
+           * Prevent assignment.
+           */
+          Microphone& operator=(Microphone&);
+          
+          friend class MicrophoneProxy;
+      };
+      
+      /**
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, MicrophoneProxy, AudioSourceProxy, Microphone)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/MicrophoneListener.h b/uapi/cpp/api/include/MicrophoneListener.h
new file mode 100644
index 0000000..fbe33ed
--- /dev/null
+++ b/uapi/cpp/api/include/MicrophoneListener.h
@@ -0,0 +1,62 @@
+/*---------------------------------------------------------------------------*
+ *  MicrophoneListener.h                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MICROPHONELISTENER
+#define __UAPI__MICROPHONELISTENER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+#include "AudioSourceListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for Microphone events.
+       */
+      class MicrophoneListener : public AudioSourceListener
+      {
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT MicrophoneListener();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~MicrophoneListener();
+          
+          friend class MicrophoneListenerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, MicrophoneListenerProxy, AudioSourceListenerProxy,
+                         MicrophoneListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/NBestRecognitionResult.h b/uapi/cpp/api/include/NBestRecognitionResult.h
new file mode 100644
index 0000000..73dbba8
--- /dev/null
+++ b/uapi/cpp/api/include/NBestRecognitionResult.h
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*
+ *  NBestRecognitionResult.h                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__NBESTRECOGNITIONRESULT
+#define __UAPI__NBESTRECOGNITIONRESULT
+
+#include "exports.h"
+#include "RecognitionResult.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class VoicetagItemProxy;
+      class VoicetagItemListenerProxy;
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class NBestRecognitionResultProxy;
+      
+      /**
+       * N-Best Recognition results. Entries are sorted in decreasing order according to their probability,
+       * from the most probable result to the least probable result.
+       */
+      class NBestRecognitionResult: public RecognitionResult
+      {
+        public:
+          class EntryProxy;
+          
+          /**
+           * NBestList entry.
+           *
+           * @see NBestRecognitionResult
+           */
+          class UAPI_EXPORT Entry
+          {
+            public:
+              /**
+               * Returns the number of semantic key-value pairs.
+               */
+              virtual ARRAY_LIMIT getKeyCount() const = 0;
+              /**
+               * Returns the keys associated with the nbest entry.
+               */
+              virtual const char* const* getKeys() = 0;
+              /**
+               * Returns the values associated with the nbest entry.
+               *
+               * @param key the semantic key to look up
+               * @param returnCode the return code
+               */
+              virtual const char* getValue(const char* key,
+                  ReturnCode::Type& returnCode) const = 0;
+              /**
+               * The literal meaning of a recognition result (i.e. literally what the user said).
+               * In an example where a person's name is mapped to a phone-number, the person's name
+               * is the literal meaning.
+               *
+               * @param returnCode the return code
+               */
+              virtual const char* getLiteralMeaning(ReturnCode::Type& returnCode)
+              const = 0;
+              /**
+               * The semantic meaning of a recognition result (i.e. the application-specific value
+               * associated with what the user said). In an example where a person's name is mapped
+               * to a phone-number, the phone-number is the semantic meaning.
+               *
+               * @param returnCode the return code
+               */
+              virtual const char* getSemanticMeaning(ReturnCode::Type& returnCode)
+              const = 0;
+              /**
+               * The confidence score of a recognition result. Values range from 0 to 100 (inclusive).
+               *
+               * @param returnCode NOT_SUPPORTED if the engine does not generate a confidence score
+               *        for this n-best entry.
+               */
+              virtual UINT8 getConfidenceScore(ReturnCode::Type& returnCode) const = 0;
+            protected:
+              /**
+               * Prevent construction.
+               */
+              Entry();
+              /**
+               * Prevent destruction.
+               */
+              virtual ~Entry();
+              
+              friend class EntryProxy;
+          };
+          
+          /*
+           * @see android::speech::recognition::SmartProxy
+           */
+          DECLARE_SMARTPROXY(UAPI_EXPORT, EntryProxy, android::speech::recognition::SmartProxy, Entry)
+          
+          /**
+           * Returns the number of entries in the n-best list.
+           */
+          virtual ARRAY_LIMIT getSize() const = 0;
+          /**
+           * Returns an NBest entry.
+           *
+           * @param index the entry index number
+           * @param returnCode the return code
+           */
+          virtual EntryProxy getEntry(ARRAY_LIMIT index, ReturnCode::Type& returnCode) const = 0;
+          /**
+           * Creates a new VoicetagItem if the last recognition was an enrollment operation.
+           *
+           * @param returnCode INVALID_STATE if the last recognition was not an enrollment operation
+           */
+          virtual VoicetagItemProxy createVoicetagItem(const char* VoicetagId, VoicetagItemListenerProxy listener, ReturnCode::Type& returnCode)
+          const = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT NBestRecognitionResult();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~NBestRecognitionResult();
+          
+          friend class NBestRecognitionResultProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, NBestRecognitionResultProxy, RecognitionResultProxy,
+                         NBestRecognitionResult)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/ParametersListener.h b/uapi/cpp/api/include/ParametersListener.h
new file mode 100644
index 0000000..31d81e7
--- /dev/null
+++ b/uapi/cpp/api/include/ParametersListener.h
@@ -0,0 +1,93 @@
+/*---------------------------------------------------------------------------*
+ *  ParametersListener.h                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __PARAMETERS_LISTNER_H_
+#define __PARAMETERS_LISTNER_H_
+
+
+#include "exports.h"
+#include "types.h"
+#include "ReturnCode.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for Parameters events.
+       */
+      class ParametersListener
+      {
+        public:
+          /**
+           * Destructor
+           */
+          UAPI_EXPORT virtual ~ParametersListener();
+          
+          /**
+           * Invoked if setting parameters has failed.
+           *
+           * @param keys the parameter keys that could not be set
+           * @param values the parameter values associated with the keys
+           * @param count the number of parameters
+           * @param returnCode the return code
+           */
+          virtual void onParametersSetError(const char** keys, const char** values, ARRAY_LIMIT count,
+                                            ReturnCode::Type returnCode) = 0;
+                                            
+          /**
+           * Invoked if retrieving parameters has failed.
+           *
+           * @param keys the parameter keys that could not be set
+           * @param count the number of parameters
+           * @param returnCode the return code
+           */
+          virtual void onParametersGetError(const char** keys, ARRAY_LIMIT count,
+                                            ReturnCode::Type returnCode) = 0;
+                                            
+          /**
+           * This method is called when the parameters specified in setParameters have
+           * successfully been set. This method is guaranteed to be invoked after onParametersSetError,
+           * even if count==0.
+           *
+           * @param keys the list of parameter keys that were set
+           * @param values the list of parameter values that were set
+           * @param count the number of parameters
+           */
+          virtual void onParametersSet(const char** keys, const char** values, ARRAY_LIMIT count) = 0;
+          
+          /**
+           * This method is called when the parameters specified in getParameters have
+           * successfully been retrieved. This method is guaranteed to be invoked after onParametersGetError,
+           * even if count==0.
+           *
+           * @param keys the list of parameter keys that were retrieved
+           * @param values the list of parameter values that retrieved
+           * @param count the number of parameters
+           */
+          virtual void onParametersGet(const char** keys, const char** values, ARRAY_LIMIT count) = 0;
+      };
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/RecognitionResult.h b/uapi/cpp/api/include/RecognitionResult.h
new file mode 100644
index 0000000..5619ccc
--- /dev/null
+++ b/uapi/cpp/api/include/RecognitionResult.h
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*
+ *  RecognitionResult.h                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__RECOGNITIONRESULT
+#define __UAPI__RECOGNITIONRESULT
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "types.h"
+#include "SmartProxy.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Recognition results.
+       */
+      class RecognitionResult
+      {
+        public:
+          /**
+           * Returns true if the recognition result is an n-best list.
+           */
+          virtual bool isNBestList() const = 0;
+
+          /**
+           * Returns true if the recognition result are coming from an
+           * application server.
+           */
+          virtual bool isAppServerResult() const = 0;
+          
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT RecognitionResult();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~RecognitionResult();
+          
+          friend class RecognitionResultProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, RecognitionResultProxy, android::speech::recognition::SmartProxy,
+                         RecognitionResult)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/Recognizer.h b/uapi/cpp/api/include/Recognizer.h
new file mode 100644
index 0000000..7fdc5ba
--- /dev/null
+++ b/uapi/cpp/api/include/Recognizer.h
@@ -0,0 +1,156 @@
+/*---------------------------------------------------------------------------*
+ *  Recognizer.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__RECOGNIZER
+#define __UAPI__RECOGNIZER
+
+#include "exports.h"
+#include "types.h"
+#include "SmartProxy.h"
+#include "Grammar.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class GrammarProxy;
+      class GrammarListenerProxy;
+      class AudioStreamProxy;
+      class ParametersProxy;
+      class RecognizerListenerProxy;
+    }
+  }
+}
+
+
+//
+// DESIGN NOTES:
+//
+// @see http://ciaranm.org/show_post/146 for a discussion of shared_ptr and covariant return-types
+//
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class RecognizerProxy;
+      /**
+       * Speech recognizer.
+       */
+      class Recognizer
+      {
+        public:
+          /**
+           * Sets the recognizer listener.
+           *
+           * @param listener recognizer listener
+           * @param returnCode returns SUCCESS unless a fatal error occurs
+           */
+          virtual void setListener(RecognizerListenerProxy& listener,
+                                   ReturnCode::Type& returnCode) = 0;
+
+          /**
+           * Creates a grammar.
+           *
+           * @param value the contents of the grammar
+           * @param listener the grammar listener
+           * @param returnCode ILLEGAL_ARGUMENT if value is null
+           */
+          virtual GrammarProxy createGrammar(const char* value, GrammarListenerProxy& listener, ReturnCode::Type& returnCode) = 0;
+
+          /**
+           * Begins speech recognition.
+           *
+           * @param audio the audio to recognizer
+           * @param grammars a collection of grammar sets to recognize against
+           * @param grammarCount the number of grammar sets
+           * @param returnCode ILLEGAL_ARGUMENT if audio is null or is being used by another component,
+           * or if grammars is null or if grammarCount < 1.<br/>
+           * NOT_SUPPORTED if the recognizer does not support the number of grammars specified.
+           */
+          virtual void recognize(AudioStreamProxy& audio, GrammarProxy* grammars,
+                                 ARRAY_LIMIT grammarCount,
+                                 ReturnCode::Type& returnCode) = 0;
+                                 
+          /**
+           * This convenience method is equivilent to invoking
+           * recognize(audio, grammars, grammarCount, returnCode) with a single grammar.
+           *
+           * @param audio the audio to recognizer
+           * @param grammar a grammar to recognize against
+           * @param returnCode ILLEGAL_ARGUMENT if audio is null or is being used by another component,
+           * or if grammar is null.
+           * @see recognize(audio, grammars, grammarCount, returnCode)
+           */
+          virtual void recognize(AudioStreamProxy& audio, GrammarProxy& grammar,
+                                 ReturnCode::Type& returnCode) = 0;
+                                 
+          /**
+           * Terminates a recognition if one is in-progress.
+           *
+           * @param returnCode the return code
+           */
+          virtual void stop(ReturnCode::Type& returnCode) = 0;
+          
+          /**
+           * Set parameter(s).
+           *
+           * @param keys parameter keys
+           * @param values parameter values
+           * @param count the number of parameters
+           * @param returnCode the return code
+           */
+          virtual void setParameters(const char** keys, const char** values,
+                                     ARRAY_LIMIT count, ReturnCode::Type& returnCode) = 0;
+                                     
+          /**
+           * Get one or more parameter(s).
+           *
+           * @param keys parameter keys
+           * @param count the number of parameters
+           * @param returnCode the return code
+           */
+          virtual void getParameters(const char** keys, ARRAY_LIMIT count,
+                                     ReturnCode::Type& returnCode) = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          Recognizer();
+          /**
+           * Prevent destruction.
+           */
+          virtual ~Recognizer();
+          
+          friend class RecognizerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, RecognizerProxy, android::speech::recognition::SmartProxy, Recognizer)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/RecognizerListener.h b/uapi/cpp/api/include/RecognizerListener.h
new file mode 100644
index 0000000..46216a6
--- /dev/null
+++ b/uapi/cpp/api/include/RecognizerListener.h
@@ -0,0 +1,173 @@
+/*---------------------------------------------------------------------------*
+ *  RecognizerListener.h                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__RECOGNIZERLISTENER
+#define __UAPI__RECOGNIZERLISTENER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "ParametersListener.h"
+#include "SmartProxy.h"
+#include "RecognitionResult.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class Recognizer;
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for recognizer events.
+       */
+      class RecognizerListener : public ParametersListener
+      {
+        public:
+          enum FailureReason
+          {
+            /**
+             * The audio did not generate any results.
+             */
+            NO_MATCH,
+            /**
+             * Beginning of speech occured too soon.
+             */
+            SPOKE_TOO_SOON,
+            /**
+             * A timeout occured before the beginning of speech.
+             */
+            BEGINNING_OF_SPEECH_TIMEOUT,
+            /**
+             * A timeout occured before the recognition could complete.
+             */
+            RECOGNITION_TIMEOUT,
+            /**
+             * The recognizer encountered more audio than was acceptable according to its configuration.
+             */
+            TOO_MUCH_SPEECH,
+            /**
+             * Posting the recognition results to the 3rd party app server failed.
+             */
+            RECOGNITION_3RD_PARTY_ERROR,
+            /**
+             * The speech server is unavailable.
+             */
+            SPEECH_SERVER_UNAVAILABLE,
+            /**
+             * Unknown failure code.
+             */
+            UNKNOWN
+          };
+          
+          /**
+           * Returns the textual message associated with the error type.
+           *
+           * @param reason the failure reason
+           */
+          UAPI_EXPORT const char* toString(FailureReason reason);
+          
+          /**
+            * Invoked after recognition begins.
+           */
+          virtual void onStarted() = 0;
+          
+          /**
+           * Invoked when the recognizer detects the beginning of speech.
+           */
+          virtual void onBeginningOfSpeech() = 0;
+          
+          /**
+           * Invoked when the recognizer detects the end of speech.
+           */
+          virtual void onEndOfSpeech() = 0;
+          
+          /**
+           * Invoked when the recognizer acoustic state is reset.
+           *
+           * @see EmbeddedRecognizer::resetAcousticState()
+           */
+          virtual void onAcousticStateReset() = 0;
+          
+          /**
+           * Invoked when a recognition success occurs.
+           *
+           * @param result the recognition result. The result object can not be
+           * used outside of the scope of the onRecognitionSuccess() callback method.
+           * To be able to do so, copy it's contents to an user-defined object.
+           * An example of this object could be a vector of string arrays; where the
+           * vector represents a list of recognition result entries and each entry
+           * is an array of strings to hold the entry's values (the semantic
+           * meaning, confidence score and literal meaning).
+           */
+          virtual void onRecognitionSuccess(RecognitionResultProxy& result) = 0;
+          
+          /**
+           * Invoked when a recognition failure occurs.
+           *
+           * @param reason the failure reason
+           * @see toString(FailureReason)
+           */
+          virtual void onRecognitionFailure(FailureReason reason) = 0;
+          
+          /**
+           * Invoked when an unexpected error occurs. This is normally followed by
+           * onStopped() if the component shuts down successfully.
+           *
+           * @param returnCode the return code
+           */
+          virtual void onError(ReturnCode::Type returnCode) = 0;
+          
+          /**
+           * Invoked when the recognizer shuts down (either normally or due to an error).
+           */
+          virtual void onStopped() = 0;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT RecognizerListener();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~RecognizerListener();
+          
+          friend class RecognizerListenerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, RecognizerListenerProxy, android::speech::recognition::SmartProxy,
+                         RecognizerListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/RefCounter.h b/uapi/cpp/api/include/RefCounter.h
new file mode 100644
index 0000000..4a29065
--- /dev/null
+++ b/uapi/cpp/api/include/RefCounter.h
@@ -0,0 +1,104 @@
+/*---------------------------------------------------------------------------*
+ *  RefCounter.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__REFCOUNTER
+#define __UAPI__REFCOUNTER
+
+#include "exports.h"
+#include "types.h"
+#include "ReturnCode.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * A class that monitors the references to a particular object. This
+         * class is not thread safe.
+         */
+        class UAPI_EXPORT RefCounter
+        {
+          public:
+            /**
+             * Creates a new RefCounter with an initial value of one.
+             *
+             * @param object the underlying object to wrap
+             * @param loggingAllowed true if the object and its dependencies are allowed to log
+             * @param returnCode SUCCESS unless a fatal error has occured
+             */
+            RefCounter(void* object, bool loggingAllowed, ReturnCode::Type& returnCode);
+            virtual ~RefCounter();
+            
+            /**
+             * This function increases the reference count by one.
+             *
+             * @param returnCode SUCCESS unless a fatal error has occured
+             * @return the resulting reference count
+             */
+            virtual ARRAY_LIMIT increment(ReturnCode::Type& returnCode);
+            
+            /**
+             * This function decreases the reference count by 1.
+             *
+             * @param returnCode SUCCESS unless a fatal error has occured
+             * @return the resulting reference count
+             */
+            virtual ARRAY_LIMIT decrement(ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns the number of references to the object.
+             *
+             * @return the number of references to the object
+             */
+            ARRAY_LIMIT getCount() const;
+            
+            /**
+             * Returns the object whose references are being monitored.
+             */
+            void* getObject() const;
+            
+            /**
+             * Returns true if the object and its dependencies are allowed to log.
+             *
+             * @return true if the object and its dependencies are allowed to log
+             */
+            bool isLoggingAllowed() const;
+          protected:
+            /**
+             * The number of references to the underlying object.
+             */
+            ARRAY_LIMIT count;
+            /**
+             * The underlying object.
+             */
+            void* object;
+            
+            bool loggingAllowed;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/ReturnCode.h b/uapi/cpp/api/include/ReturnCode.h
new file mode 100644
index 0000000..b612d35
--- /dev/null
+++ b/uapi/cpp/api/include/ReturnCode.h
@@ -0,0 +1,217 @@
+/*---------------------------------------------------------------------------*
+ *  ReturnCode.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__RETURNCODE
+#define __UAPI__RETURNCODE
+
+#include "exports.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * All possible return codes.
+       */
+      class ReturnCode
+      {
+        public:
+          enum Type
+          {
+            /**
+             * Indicates that the operation completed successfully.
+             *
+             * DESIGN NOTE: This value must be equal to zero to ensure that: <code>if (returnCode)</code>
+             * returns true in case of an error, false otherwise.
+             */
+            SUCCESS = 0,
+            /**
+             * An unknown error has occured.
+             */
+            UNKNOWN,
+            /**
+             * Indicates that a method has been passed an illegal or inappropriate argument.
+             */
+            ILLEGAL_ARGUMENT,
+            /**
+             * The optional operation is not supported by the implementation.
+             */
+            NOT_SUPPORTED,
+            /**
+             * Could not allocate memory to perform the operation.
+             */
+            OUT_OF_MEMORY,
+            /**
+             * Indicates that we cannot call this method at this point in time.
+             */
+            INVALID_STATE,
+            /**
+             * Indicates that the specified file could not be found.
+             */
+            FILE_NOT_FOUND,
+            /**
+             * Indicates that no data is currently available but more is expected to arrive in the future.
+             */
+            PENDING_DATA,
+            /**
+             * Indicates that the end of stream has been reached.
+             */
+            END_OF_STREAM,
+            /**
+             * Indicates that a socket error happened.
+             */
+            SOCKET_IO_ERROR,
+            /**
+             * Indicates that the socket was closed
+             */
+            SOCKET_CLOSED,
+            /**
+             * Indicates that a library could not be loaded
+             */
+            UNKNOWN_MODULE,
+            /**
+             * Indicates that a library does not contain a specific symbol
+             */
+            UNKNOWN_SYMBOL,
+            /**
+             * Indicates that the specified search criteria did not yield any results.
+             */
+            NO_MATCH,
+            /**
+             * Indicates an error occurs while opening a file or socket.
+             */
+            OPEN_ERROR,
+            /**
+             * Indicates an error occured while reading a file or socket.
+             */
+            READ_ERROR,
+            /**
+             * Indicates an error occured while writing to a file or socket.
+             */
+            WRITE_ERROR,
+            /**
+             * Indicates that an array index was either negative or greater than or equal to the size
+             * of the array.
+             */
+            ARRAY_INDEX_OUT_OF_BOUNDS,
+            /**
+             * Indicates that the grammar slot is full and no further items may be added to it.
+             */
+            GRAMMAR_SLOT_FULL,
+            /**
+             * Indicates that an item cannot be added into a grammar slot because another item with
+             * the same pronunciation already resides in the slot.
+             */
+            HOMONYM_COLLISION,
+            /**
+             * Indicates that the mutex or condition variable is already locked by someone else.
+             */
+            ALREADY_LOCKED,
+            /**
+             * Indicates that the thread-related operation has failed.
+             */
+            THREAD_ERROR,
+            /**
+             * Indicates that the previous operation has timed out.
+             */
+            TIMEOUT,
+            /**
+             * Indicates that an error occured when invoking an audio driver function.
+             */
+            AUDIO_DRIVER_ERROR,
+            /**
+             * The audio passed in as an argument is already in use by another module.
+             */
+            AUDIO_ALREADY_IN_USE,
+            /**
+             * Indicates that the operation failed because it would have caused a variable or buffer to
+             * overflow its maximum value or capacity.
+             */
+            OVERFLOW_ERROR,
+            /**
+             * Indicates that the operation failed because it would have caused a variable or buffer to
+             * underflow its minimum value or capacity.
+             */
+            UNDERFLOW_ERROR,
+            /**
+             * Could not parse a request coming from the server.
+             */
+            PARSE_ERROR,
+            /**
+             * The network speech server is not available.
+             */
+            SPEECH_SERVER_UNAVAILABLE,
+            /**
+             * The network server is busy.
+             */
+            SERVER_BUSY,
+            /**
+             * The network server is shutting down
+             */
+            SERVER_SHUTTING_DOWN,
+            /**
+             * Unable to load the grammar.
+             */
+            GRAMMAR_LOAD_FAILURE,
+            /**
+             * The specified URL is invalid.
+             */
+            INVALID_URL,
+            /**
+             * No grammar defined.
+             */
+            GRAMMAR_NOT_DEFINED,
+            /**
+             * the parameter you are tyring to set/get is invalid.
+             */
+            INVALID_PARAMETER_NAME,
+            /**
+             * the value for the parameter you are tyring to set is invalid.
+             */
+            INVALID_PARAMETER_VALUE,
+            /**
+             * This codec is not supported
+             */
+            UNSUPPORTED_CODEC,
+            /**
+             * We did not receive the ping request from the server. The server
+             * or the network connection must be down.
+             */
+            SERVER_PING_MISSED,
+            /**
+             * Return codes having this value or greater are invalid.
+             */
+            MAXIMUM_BOUND
+          };
+          
+          /**
+           * Returns the textual representation of the specified return-code.
+           *
+           * @param code the return code
+           */
+          UAPI_EXPORT static const char* toString(Type code);
+      };
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/Singleton.h b/uapi/cpp/api/include/Singleton.h
new file mode 100644
index 0000000..96f9454
--- /dev/null
+++ b/uapi/cpp/api/include/Singleton.h
@@ -0,0 +1,61 @@
+/*---------------------------------------------------------------------------*
+ *  Singleton.h                                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SINGLETON_H__
+#define __SINGLETON_H__
+
+#include "SmartProxy.h"
+
+
+/**
+ * Base class used to register Singleton classes with the System class.
+ */
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class Singleton
+      {
+        protected:
+          virtual ~Singleton()
+          {}
+          
+          /**
+           * Returns the SmartProxy root associated with the singleton.
+           *
+           * @return the SmartProxy root associated with the singleton
+           */
+          virtual android::speech::recognition::SmartProxy::Root* getRoot() = 0;
+          
+          /**
+           * Invoked when the singleton has to shutdown.
+           *
+           * @param returnCode the return code.
+           */
+          virtual void shutdown(ReturnCode::Type& returnCode) = 0;
+          
+          friend class System;
+      };
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/SlotItem.h b/uapi/cpp/api/include/SlotItem.h
new file mode 100644
index 0000000..644c3e6
--- /dev/null
+++ b/uapi/cpp/api/include/SlotItem.h
@@ -0,0 +1,87 @@
+/*---------------------------------------------------------------------------*
+ *  SlotItem.h                                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SLOTITEM
+#define __UAPI__SLOTITEM
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        class SrecGrammarImpl;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class SlotItemProxy;
+      /**
+       * Item that may be inserted into an embedded grammar slot.
+       */
+      class UAPI_EXPORT SlotItem
+      {
+        public:
+          /**
+           * Returns true if the item is a word.
+           */
+          virtual bool isWord() const = 0;
+          
+          /**
+           * Returns true if the item is a voicetag.
+           */
+          virtual bool isVoicetag() const = 0;
+          
+        protected:
+          /**
+           * Prevent construction.
+           */
+          SlotItem();
+          /**
+           * Prevent destruction.
+           */
+          virtual ~SlotItem();
+          
+          friend class android::speech::recognition::srec::SrecGrammarImpl; // used by SrecGrammarImpl::addItem()
+          friend class SlotItemProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, SlotItemProxy, android::speech::recognition::SmartProxy, SlotItem)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/SmartProxy.h b/uapi/cpp/api/include/SmartProxy.h
new file mode 100644
index 0000000..1b59423
--- /dev/null
+++ b/uapi/cpp/api/include/SmartProxy.h
@@ -0,0 +1,315 @@
+/*---------------------------------------------------------------------------*
+ *  SmartProxy.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SMART_PROXY
+#define __UAPI__SMART_PROXY
+
+#include "exports.h"
+#include "types.h"
+#include "RefCounter.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class Mutex;
+      }
+    }
+  }
+}
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class System;
+      
+      /**
+       * Users should treat a SmartProxy as if it is a pointer to the underlying object it wraps.
+       * Smart proxies are modeled after the boost <code>shared_ptr</code> design, discussed one of the the
+       * URLs listed below.
+       *
+       * There are a few guidelines for using proxies:
+       *
+       * <ol>
+       * <li>Retain a copy of (as opposed to a reference to) a proxy to ensure that the underlying
+       *    object does not get destroyed until the proxy gets destroyed.</li>
+       * <li>Pass a proxy around by reference (as opposed to pass-by-value) for efficiency.</li>
+       * <li>There are two kinds of proxy objects: stack-based or heap-based. The most common type of
+       *    proxy is a stack-based local variable declared inside a function body. This proxy is ideal because
+       *    it is thread-safe (no other thread can access function local variables) and gets deallocated
+       *    automatically at the end of the method, along with all other local variables. Heap-based proxies,
+       *    on the other hand, must be explicitly deleted.</li>
+       * <li>Individual proxy objects are not thread-safe so if you absolutely must access the same proxy from
+       *    multiple threads (as opposed to giving each thread its own proxy) then you must synchronize access
+       *    to it manually.</li>
+       * <li>Factory methods should return proxies by value.</li>
+       * <li>Methods should accept proxies by reference.</li>
+       * <li>Never construct more than one root proxy per object.
+       *    The first SmartProxy ever constructed around an object is called the "root proxy".
+       *    Root proxies are constructed using
+       *    <code>SmartProxy(void* object, ReturnCode::Type& returnCode)</code>.
+       *    A root proxy contains the reference count of the underlying object. This means that
+       *    if you construct multiple root proxies per underlying object, each root will see a difference
+       *    reference count and one root will destroy the object before the other roots are done using
+       *    it.</li>
+       * </ol>
+       *    If you absolutely must wrap the same pointer multiple times and you do not have access to
+       *    existing proxies that wrap it, simply store <code>SmartProxy.getCounter()</code>
+       *    alongside the pointer and construct all future proxies using
+       *    <code>SmartProxy(RefCounter*)</code> instead.
+       *
+       * @see http://www.boost.org/libs/smart_ptr/shared_ptr.htm
+       * @see http://en.wikipedia.org/wiki/Proxy_pattern
+       * @see http://blogs.sun.com/nsolter/entry/reference_counting_smart_pointers_made
+       */
+      class SmartProxy
+      {
+        public:
+          /**
+           * The root proxy is the sole owner of the user object. It ensures that the object is
+           * kept alive while normal proxies reference it and that is the object is killed when no
+           * references remain.
+           */
+        class Root: private utilities::RefCounter
+          {
+              /**
+               * Creates a Root for the specified object.
+               *
+               * @param loggingAllowed true if the object and its dependencies are allowed logging
+               * @param object the underlying object to wrap
+               * @param returnCode SUCCESS unless a fatal error has occured
+               */
+              Root(void* object, bool loggingAllowed, const char* name, ReturnCode::Type& returnCode);
+              virtual ~Root();
+#ifdef UAPI_MT //multi threaded
+              /**
+               * Returns the mutex used to synchronize access to the underlying object.
+               */
+              UAPI_EXPORT utilities::Mutex* getMutex() const;
+              
+              /**
+               * protect from being called from different threads.
+               */
+              utilities::Mutex* mutex;
+#endif
+              
+              /**
+               * tells us if this Root was registered with the System class. With
+               * this flag, we will know if the Root is a candidate for System
+               * cleanup.
+               */
+              bool registeredWithSystem;
+              char* name;
+              
+              friend class SmartProxy;
+              friend class System;
+          };
+          
+          /**
+           * Returns the root proxy.
+           *
+           * @return the root proxy.
+           */
+          UAPI_EXPORT virtual Root* getRoot() const;
+          
+          /**
+           * Causes the current SmartProxy to point to the same object as another SmartProxy.
+           * If the operation fails then <code>!proxy</code> will return true.
+           *
+           * @param other the SmartProxy whose object to point to
+           * @return the resulting SmartProxy
+           */
+          UAPI_EXPORT virtual SmartProxy& operator=(const SmartProxy& other);
+          
+          /**
+           * Enables boolean conversion.
+           *
+           * @see http://www.artima.com/cppsource/safebool2.html
+           */
+          typedef void (*BoolConversion)();
+          UAPI_EXPORT operator BoolConversion() const;
+          
+          /**
+           * Returns true if the SmartProxy is null.
+           *
+           * @return true if the SmartProxy is null
+           */
+          UAPI_EXPORT virtual bool operator!() const;
+        protected:
+          /**
+           * Creates a root SmartProxy for the specified pointer. If construction
+           * fails then <code>!proxy</code> will return true.
+           *
+           * @param object a pointer to a shared object
+           */
+          UAPI_EXPORT explicit SmartProxy(void* object, const char* name);
+          
+          /**
+           * Creates a root SmartProxy for the specified pointer. If construction
+           * fails then <code>!proxy</code> will return true.
+           *
+           * @param object a pointer to a shared object
+           * @param loggingAllowed true if the object and its dependencies are allowed logging
+           */
+          UAPI_EXPORT explicit SmartProxy(void* object, bool loggingAllowed, const char* name);
+          
+          /**
+           * Constructs a new SmartProxy from an existing root proxy. If construction
+           * fails then <code>!proxy</code> will return true.
+           *
+           * @param root the root proxy
+           */
+          UAPI_EXPORT explicit SmartProxy(Root* root);
+          
+          /**
+           * Constructs a copy of an existing SmartProxy. If construction
+           * failed then <code>!proxy</code> will return true.
+           */
+          UAPI_EXPORT SmartProxy(const SmartProxy& other);
+          
+          /**
+           * Enables the construction of arrays of proxies. The proxy is initialized to null.
+           */
+          UAPI_EXPORT SmartProxy();
+          
+          /**
+           * Destroys the SmartProxy.
+           */
+          UAPI_EXPORT virtual ~SmartProxy();
+          
+          /**
+           * Deletes the underlying object. Subclasses must override this method as only they know the actual
+           * type of the underlying object.
+           *
+           * @param object the underlying object
+           */
+          UAPI_EXPORT virtual void deleteObject(void* object);
+          
+          /**
+           * Returns the underlying object.
+           *
+           * @return the underlying object
+           */
+          UAPI_EXPORT void* getObject() const;
+          
+          /**
+           * Invoked by the SmartProxy destructor.
+           */
+          UAPI_EXPORT virtual void onDestruction();
+        private:
+          /**
+           * Prevent dereferencing.
+           */
+          utilities::RefCounter& operator*();
+          
+          
+          /**
+           * The underlying object.
+           */
+          Root* root;
+
+          friend class System;
+      };
+    }
+  }
+}
+
+#define DECLARE_SMARTPROXY(ExportSymbol, Proxy, SuperProxy, Interface) \
+  class Proxy: public SuperProxy \
+  { \
+    public: \
+      /* Creates a root SmartProxy for the specified pointer */ \
+      ExportSymbol explicit Proxy(Interface* object); \
+      /* Creates a root SmartProxy for the specified pointer */ \
+      ExportSymbol explicit Proxy(Interface* object, bool loggingAllowed); \
+      /* Constructs a new SmartProxy from an existing root proxy */ \
+      ExportSymbol explicit Proxy(Root* root); \
+      /* Constructs a copy of an existing SmartProxy */ \
+      ExportSymbol Proxy(const Proxy& other); \
+      /* Enables the construction of arrays of proxies */ \
+      ExportSymbol Proxy(); \
+      /* Unsafe cast to a subclass type */ \
+      ExportSymbol explicit Proxy(const SmartProxy& other); \
+      /* Delegate method invocation to underlying object */ \
+      ExportSymbol Interface* operator->() const; \
+      /* Destroys the proxy */ \
+      ExportSymbol virtual ~Proxy(); \
+    protected: \
+      /* deletes the underlying object */ \
+      virtual void deleteObject(void* object); \
+      /* Creates a root SmartProxy for the specified pointer */ \
+      ExportSymbol explicit Proxy(Interface* object, const char* name); \
+      /* Creates a root SmartProxy for the specified pointer */ \
+      ExportSymbol explicit Proxy(Interface* object, bool loggingAllowed, const char* name); \
+  };
+
+#define DEFINE_SMARTPROXY(Namespace, Proxy, SuperProxy, Interface) \
+  Namespace::Proxy::Proxy(Interface* object): \
+      SuperProxy(object, #Proxy) \
+  {} \
+  \
+  Namespace::Proxy::Proxy(Interface* object, const char* name): \
+      SuperProxy(object, name) \
+  {} \
+  \
+  Namespace::Proxy::Proxy(Interface* object, bool loggingAllowed): \
+      SuperProxy(object, loggingAllowed, #Proxy) \
+  {} \
+  \
+  Namespace::Proxy::Proxy(Interface* object, bool loggingAllowed, const char* name): \
+      SuperProxy(object, loggingAllowed, name) \
+  {} \
+  \
+  Namespace::Proxy::Proxy(Root* root): \
+      SuperProxy(root) \
+  {} \
+  \
+  Namespace::Proxy::Proxy(const Namespace::Proxy& other): \
+      SuperProxy(other) \
+  {} \
+  \
+  Namespace::Proxy::Proxy(const SmartProxy& other): \
+      SuperProxy(other) \
+  {} \
+  \
+  Namespace::Proxy::Proxy() \
+  {} \
+  \
+  Interface* Namespace::Proxy::operator->() const \
+  { \
+    return (Interface*) getObject(); \
+  } \
+  \
+  void Namespace::Proxy::deleteObject(void* object) \
+  { \
+    delete (Interface*) object; \
+  } \
+  Namespace::Proxy::~Proxy() \
+  { \
+    onDestruction(); \
+  }
+
+#endif
diff --git a/uapi/cpp/api/include/SpeechSynthesizer.h b/uapi/cpp/api/include/SpeechSynthesizer.h
new file mode 100644
index 0000000..ee281a6
--- /dev/null
+++ b/uapi/cpp/api/include/SpeechSynthesizer.h
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------------*
+ *  SpeechSynthesizer.h                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SPEECH_SYNTHESIZER__
+#define __UAPI__SPEECH_SYNTHESIZER__
+
+#include "exports.h"
+#include "AudioSource.h"
+#include "types.h"
+#include "Codec.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class AudioSourceListenerProxy;
+      class SpeechSynthesizerProxy;
+      class SpeechSynthesizerDataProxy;
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * This resource processes text markup provided by the client and
+       * generates a stream of synthesized speech in real-time
+       */
+      class SpeechSynthesizer: public AudioSource
+      {
+        public:
+
+          enum SpeechType
+          {
+            /**
+             * The speech to synthesize is plain text
+             */
+            TEXT,
+            /**
+             * The speech to synthesize is located at this URI.
+             */
+            URI,
+            /**
+             * The speech to synthesize is SSML (markup language).
+             * @see http://www.w3.org/TR/speech-synthesis/ 
+             */
+            SSML
+          };
+         
+          /**
+           * Sets the synthesizer listener.
+           *
+           * @param listener synthesizer listener
+           * @param returnCode returns SUCCESS unless a fatal error occurs
+           */
+          virtual void setListener(AudioSourceListenerProxy& listener,
+                                   ReturnCode::Type& returnCode) = 0;
+
+         /**
+           * Sets the synthesized codec. This must be called before start() is invoked.
+           *
+           * @param synthesizeCodec the codec in which the samples will be synthesized
+           * @param returnCode the return code
+           */
+          virtual void setCodec(Codec::Type synthesizeCodec, ReturnCode::Type& returnCode) = 0;
+
+          /**
+           * Add speech to systhesize on the queue. All the items in the queue
+           * will be systhesized once "start()" is called.
+           *
+           * @param speechType the speech input type
+           * @param value the content of the speechType
+           * @param language language contained in the "value" argument. Note
+           * that this only applies to TEXT type. If the type is TEXT is this
+           * parameter is set to NULL, the default value of "en-US" will be
+           * used. For other types, simply set this to NULL.
+           * @param returnCode ILLEGAL_ARGUMENT if value is null
+           */
+          virtual void queue( SpeechSynthesizer::SpeechType speechType, 
+                              const char* value, const char * language, 
+                              ReturnCode::Type& returnCode ) = 0;
+
+        protected:
+          /**
+          * Prevent destruction.
+          */
+          UAPI_EXPORT SpeechSynthesizer();
+          /**
+          * Prevent destruction.
+          */
+          UAPI_EXPORT virtual ~SpeechSynthesizer();
+          
+          friend class SpeechSynthesizerProxy;
+      };
+      
+      /*
+      * @see android::speech::recognition::SmartProxy
+      */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, SpeechSynthesizerProxy, AudioSourceProxy, SpeechSynthesizer)
+
+
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/SpeechSynthesizerListener.h b/uapi/cpp/api/include/SpeechSynthesizerListener.h
new file mode 100644
index 0000000..b36b1b1
--- /dev/null
+++ b/uapi/cpp/api/include/SpeechSynthesizerListener.h
@@ -0,0 +1,62 @@
+/*---------------------------------------------------------------------------*
+ *  SpeechSynthesizerListener.h                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SPEECHSYNTHESIZER_LISTENER
+#define __UAPI__SPEECHSYNTHESIZER_LISTENER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+#include "AudioSourceListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for Microphone events.
+       */
+      class SpeechSynthesizerListener : public AudioSourceListener
+      {
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT SpeechSynthesizerListener();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~SpeechSynthesizerListener();
+          
+          friend class SpeechSynthesizerListenerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, SpeechSynthesizerListenerProxy, AudioSourceListenerProxy,
+                         SpeechSynthesizerListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/SrecGrammar.h b/uapi/cpp/api/include/SrecGrammar.h
new file mode 100644
index 0000000..16cc6d7
--- /dev/null
+++ b/uapi/cpp/api/include/SrecGrammar.h
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*
+ *  SrecGrammar.h                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SRECGRAMMAR
+#define __UAPI__SRECGRAMMAR
+
+#include "exports.h"
+#include "EmbeddedGrammar.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class SlotItemProxy;
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class SrecGrammarProxy;
+      
+      /**
+       * Grammar on an SREC recognizer.
+       */
+      class SrecGrammar: public EmbeddedGrammar
+      {
+        public:
+          /**
+           * Adds an item to a slot.
+           *
+           * @param slotName the name of the slot
+           * @param item the item to add to the slot.
+           * @param weight the weight of the item. Smaller values are more likely to get recognized. This should be >= 0.
+           * @param semanticMeaning the value that will be returned if this item is recognized. This should
+           * be of the form "V='Jen_Parker'"
+           * @param returnCode ILLEGAL_ARGUMENT if slotName, item or semanticMeaning are null or if
+           * semanticMeaning is not in the form "key=value". ILLEGAL_STATE if the associated
+           * recognizer has been deleted. HOMONYM_COLLISION if another item with the same
+           * pronunciation already exists in the slot.
+           */
+          UAPI_EXPORT virtual void addItem(const char* slotName, const SlotItemProxy& item,
+                                           int weight, const char* semanticMeaning,
+                                           ReturnCode::Type& returnCode) = 0;
+
+           /**
+           * Add a list of item to a slot.
+           *
+           * @param slotName the name of the slot
+           * @param items the array of SlotItems to add to the slot.
+           * @param weights the array of weights for each item in the list. Smaller values are more likely to get recognized.  This should be >= 0.
+           * @param semanticMeanings the array of strings that will be returned for each item during recognition.
+           * @param itemsCount number of items in the list
+           * @throws IllegalArgumentException if slotName, items, weights or semanticMeanings are null;if any semanticMeaning of the list is not of the format "V=&#039;Jen_Parker&#039; if the size of list parameters is not equal."
+           */
+           UAPI_EXPORT virtual void addItemList(const char* slotName, 
+                                            SlotItemProxy** items,
+                                            int* weights,
+                                            const char** semanticMeanings,
+                                            ARRAY_LIMIT itemsCount,
+                                            ReturnCode::Type& returnCode) = 0;
+
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT SrecGrammar();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~SrecGrammar();
+          
+          friend class SrecGrammarProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, SrecGrammarProxy, EmbeddedGrammarProxy, SrecGrammar)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/SrecGrammarListener.h b/uapi/cpp/api/include/SrecGrammarListener.h
new file mode 100644
index 0000000..63c7dfb
--- /dev/null
+++ b/uapi/cpp/api/include/SrecGrammarListener.h
@@ -0,0 +1,73 @@
+/*---------------------------------------------------------------------------*
+ *  SrecGrammarListener.h                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SRECGRAMMARLISTENER
+#define __UAPI__SRECGRAMMARLISTENER
+
+#include "EmbeddedGrammarListener.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for SrecGrammar events.
+       */
+      class SrecGrammarListener: public EmbeddedGrammarListener
+      {
+        public:
+          UAPI_EXPORT virtual ~SrecGrammarListener();
+          
+            /**
+            * Invokes after all items of the list have been added.
+            */
+            virtual void onAddItemList() = 0;
+               
+            /**
+            * Invoked when adding a SlotItem from a list fails. 
+            * This callback will be trigger for each element in the list that fails to be
+            * add in the slot, unless there is a grammar fail operation, which will be
+            * reported in the onError callback.
+            * 
+            * @param index the item index that cause the failure.
+            * @param e the cause of the failure.
+            */
+            virtual void onAddItemListFailure(int index, ReturnCode::Type returnCode)=0;
+
+            /**
+            * Invoked after a Voicetag has been loaded.
+            */
+            virtual void onLoadedVoicetag()=0;
+   
+            /**
+            * Invoked after a Voicetag has been saved.
+            */
+            virtual void onSavedVoicetag()=0;
+      };
+      /**
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, SrecGrammarListenerProxy,EmbeddedGrammarListenerProxy, SrecGrammarListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/System.h b/uapi/cpp/api/include/System.h
new file mode 100644
index 0000000..e8e2f49
--- /dev/null
+++ b/uapi/cpp/api/include/System.h
@@ -0,0 +1,200 @@
+/*---------------------------------------------------------------------------*
+ *  System.h                                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _SYSTEM_H_
+#define _SYSTEM_H_
+
+#include "exports.h"
+#include "types.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class Singleton;
+      namespace impl
+      {
+        class RedirectToLibrary;
+      }
+      namespace utilities
+      {
+        class Queue;
+        class Mutex;
+        class LockScope;
+        class ConditionVariable;
+        class LibraryLoader;
+        class WorkerQueue;
+        class WorkerQueueFactory;
+        class WorkerQueueFactoryImpl;
+      };
+      namespace jni
+      {
+        class JVMKeepAlive;
+      };
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Utility class used to destroy the system singleton instance(s) once the
+       * program exits. The application can explicitly dispose the memory
+       * allocated for the singletons by calling "dispose" or it can let the
+       * System class take care of de-allocating the memory once the program
+       * exits.
+       */
+      class System
+      {
+        public:
+          /**
+           * returns the singleton instance of this class.
+           *
+           * @param returnCode THREAD_ERROR on failure
+          
+           * @return the singleton instance
+           */
+          UAPI_EXPORT static System* getInstance(ReturnCode::Type& returnCode);
+          
+          /**
+           * Disposes the singleton(s) and the System instance. Shutdown is not complete until
+           * the System object is deleted.
+           *
+           * Invoking this method is optional; it is sufficient to simply delete the System object
+           * but the latter mechanism cannot return errors back to the caller.
+           *
+           * @param returnCode TIMEOUT Waiting for singleton timeout.
+           * THREAD_ERROR on failure.
+           */
+          UAPI_EXPORT void dispose(ReturnCode::Type& returnCode);
+          
+          UAPI_EXPORT ~System();
+        private:
+          /**
+           * Initializes the component when the library is loaded.
+           */
+          class ComponentInitializer
+          {
+            public:
+              ComponentInitializer();
+              ~ComponentInitializer();
+              
+              ReturnCode::Type returnCode;
+          };
+          
+          /**
+           * Method used to catch the process signals, e.g. SIGINT.
+           */
+          static void signalHandler(int sig);
+          /**
+           * Flag used to indicate if a ^C SIGINT was raised
+           */
+          static bool signalRaised;
+       
+          /**
+           * structure that contains the things needed to shutdown the singletons
+           */
+          struct SingletonInfo
+          {
+            Singleton* singleton;
+            utilities::ConditionVariable* condVar;
+            bool isWaiting;
+          };
+          
+          
+          /**
+           * Constructor
+           */
+          System(utilities::Queue* singletons, utilities::Mutex* singletonListMutex);
+          
+          /**
+           * add a singleton instance to this class. Only friend can add themselves
+           * to this class. Singleton add themselves such that they can be cleanup
+           * by the system class at exit time.
+           *
+           * @param singleton a Singleton instance.
+           * @param returnCode THREAD_ERROR on failure
+           *
+           * @see remove
+           */
+          UAPI_EXPORT void add(Singleton* singleton, ReturnCode::Type& returnCode);
+          
+          /**
+           * Called when the singleton object is deleted.
+          *
+          * @param root the "real object" is contained in the Root. Used to map
+          * back with the singleton that was passed in the add method.
+          * @see add
+           */
+          UAPI_EXPORT void remove(SmartProxy::Root* root);
+          
+          /**
+           * Helper function used to unload the loaded shared libraries.
+           * @param returnCode the returnCode.
+           */
+          void unloadSharedLibraries(ReturnCode::Type& returnCode);
+          
+          /**
+           * Array of pointer to the Singleton.
+           */
+          utilities::Queue* singletons; //Queue<SingletonInfo*>
+          
+          /**
+           * Synchronizes access to System's state.
+           */
+          static utilities::Mutex* stateMutex;
+          
+          /**
+           * Synchronizes access to "singletons" variable.
+           */
+          utilities::Mutex* singletonsMutex;
+          
+          /**
+           * True if dispose() has been invoked on this instance.
+           */
+          bool disposed;
+          
+          static ComponentInitializer componentInitializer;
+          
+          /**
+           * The singleton instance.
+           */
+          static System* instance;
+          bool shutdownRequested;
+          
+          friend class Microphone;
+          friend class DeviceSpeaker;
+          friend class EmbeddedRecognizer;
+          friend class SmartProxy;
+          friend class jni::JVMKeepAlive;
+      };
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/VoicetagItem.h b/uapi/cpp/api/include/VoicetagItem.h
new file mode 100644
index 0000000..a425a88
--- /dev/null
+++ b/uapi/cpp/api/include/VoicetagItem.h
@@ -0,0 +1,101 @@
+/*---------------------------------------------------------------------------*
+ *  VoicetagItem.h                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__VOICETAGITEM
+#define __UAPI__VOICETAGITEM
+
+#include "exports.h"
+#include "types.h"
+#include "SlotItem.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class VoicetagItemProxy;
+     
+      /**
+       * Voicetag that may be inserted into an embedded grammar slot.
+       */
+      class UAPI_EXPORT VoicetagItem: public SlotItem
+      {
+        public:
+          /**
+           * (Optional operation) Returns the audio used to construct the Voicetag. The
+           * audio is in PCM format and is start-pointed and end-pointed. The audio is
+           * only generated if the enableGetWaveform recognition parameter is set
+           * prior to recognition.
+           *
+           * @param waveform the read-only endpointed waveform
+           * @param size the size of the waveform in bytes
+           * @param returnCode the return code
+           * @see RecognizerParameters.enableGetWaveform
+           */
+          virtual void getAudio(const INT16** waveform, ARRAY_LIMIT* size,
+                                ReturnCode::Type& returnCode) const = 0;
+                                
+          /**
+           * (Optional operation) Sets the audio used to construct the Voicetag. The
+           * audio is in PCM format and is start-pointed and end-pointed. The audio is
+           * only generated if the enableGetWaveform recognition parameter is set
+           * prior to recognition.
+           *
+           * @param waveform the endpointed waveform
+           * @param size the size of the waveform in bytes
+           * @param returnCode the return code
+           * @see RecognizerParameters.enableGetWaveform
+           */
+          virtual void setAudio(const INT16* waveform, ARRAY_LIMIT size,
+                                ReturnCode::Type& returnCode) = 0;
+
+          /**
+           * Returns true if the item is a word.
+           */
+          virtual bool isWord() const; //is text tag
+          
+          /**
+           * Returns true if the item is a voicetag.
+           */
+          virtual bool isVoicetag() const;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          VoicetagItem();
+          /**
+           * Prevent destruction.
+           */
+          virtual ~VoicetagItem()
+          {}
+          
+          friend class VoicetagItemProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, VoicetagItemProxy, SlotItemProxy, VoicetagItem)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/VoicetagItemListener.h b/uapi/cpp/api/include/VoicetagItemListener.h
new file mode 100644
index 0000000..e1d4227
--- /dev/null
+++ b/uapi/cpp/api/include/VoicetagItemListener.h
@@ -0,0 +1,83 @@
+/*---------------------------------------------------------------------------*
+ *  VoicetagItemListener.h                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__VOICETAGITEMLISTENER
+#define __UAPI__VOICETAGITEMLISTENER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * Listens for Voicetag events.
+       */
+      class VoicetagItemListener
+      {
+        public:
+
+         /**
+           * Invoked after the Voicetag is saved.
+           *
+           * @param path the path the voicetag was saved to
+           */
+          virtual void onSaved(const char* path) = 0;
+          
+           /**
+            * Invoked after the Voicetag is loaded.
+            */
+          virtual void onLoaded() = 0;
+          
+          /**
+           * Invoked when an unexpected error occurs.
+           *
+           * @param returnCode READ_ERROR if the Voicetag could not be loaded.<br/>
+           * WRITE_ERROR if the Voicetag could not be saved.
+           */
+          virtual void onError(ReturnCode::Type error) = 0;
+
+        protected:
+          /**
+           * Prevent construction.
+           */
+          UAPI_EXPORT VoicetagItemListener();
+          /**
+           * Prevent destruction.
+           */
+          UAPI_EXPORT virtual ~VoicetagItemListener();
+          
+          friend class VoicetagItemListenerProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, VoicetagItemListenerProxy, SmartProxy,
+                         VoicetagItemListener)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/WordItem.h b/uapi/cpp/api/include/WordItem.h
new file mode 100644
index 0000000..6ce53ec
--- /dev/null
+++ b/uapi/cpp/api/include/WordItem.h
@@ -0,0 +1,97 @@
+/*---------------------------------------------------------------------------*
+ *  WordItem.h                                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__WORDITEM
+#define __UAPI__WORDITEM
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "types.h"
+#include "SlotItem.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class WordItemProxy;
+      /**
+       * Word that may be inserted into an embedded grammar slot.
+       */
+      class UAPI_EXPORT WordItem: public SlotItem
+      {
+        public:
+          /**
+           * Creates a new WordItem.
+           *
+           * @param word the word to insert
+           * @param pronunciations the pronunciations to associated with the item. If the list is
+           * is empty the recognizer will attempt to guess the pronunciations.
+           * @param pronunciationCount the number of pronunciations
+           * @param returnCode the return code
+           */
+          static WordItemProxy create(const char* word, const char** pronunciations,
+                                      ARRAY_LIMIT pronunciationCount,
+                                      ReturnCode::Type& returnCode);
+          /**
+           * Creates a new WordItem. This convenience method is equivilent to invoking
+           * <code>create(word, pronunciations, pronunciationCount, returnCode)</code> with a single
+           * proununciation.
+           *
+           * @param word the word to insert
+           * @param pronunciation the pronunciation to associated with the item. If the value is
+           * null the recognizer will attempt to guess the pronunciation.
+           * @param returnCode the return code
+           */
+          static WordItemProxy create(const char* word, const char* pronunciation,
+                                      ReturnCode::Type& returnCode);
+                                      
+          /**
+           * Returns true if the item is a word.
+           */
+          virtual bool isWord() const;
+          
+          /**
+           * Returns true if the item is a voicetag.
+           */
+          virtual bool isVoicetag() const;
+        protected:
+          /**
+           * Prevent construction.
+           */
+          WordItem();
+          /**
+           * Prevent destruction.
+           */
+          virtual ~WordItem();
+          
+          friend class WordItemProxy;
+      };
+      
+      /*
+       * @see android::speech::recognition::SmartProxy
+       */
+      DECLARE_SMARTPROXY(UAPI_EXPORT, WordItemProxy, SlotItemProxy, WordItem)
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/api/include/exports.h b/uapi/cpp/api/include/exports.h
new file mode 100644
index 0000000..4e7568a
--- /dev/null
+++ b/uapi/cpp/api/include/exports.h
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*
+ *  exports.h                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI_EXPORTS
+#define __UAPI_EXPORTS
+#if defined(UAPI_WIN32)
+# ifdef UAPI_EXPORTS
+#   define UAPI_EXPORT __declspec(dllexport)
+# else
+#   define UAPI_EXPORT __declspec(dllimport)
+# endif
+# ifdef JNI_EXPORTS
+#   define JNI_EXPORT __declspec(dllexport)
+# else
+#   define JNI_EXPORT __declspec(dllimport)
+# endif
+#elif defined(UAPI_LINUX)
+# ifdef UAPI_EXPORTS
+#  define UAPI_EXPORT
+# else
+#  define UAPI_EXPORT
+# endif
+# ifdef JNI_EXPORTS
+#  define JNI_EXPORT
+# else
+#  define JNI_EXPORT
+# endif
+#else
+# error not defined
+#endif
+
+#endif
diff --git a/uapi/cpp/api/include/types.h b/uapi/cpp/api/include/types.h
new file mode 100644
index 0000000..3faa92a
--- /dev/null
+++ b/uapi/cpp/api/include/types.h
@@ -0,0 +1,146 @@
+/*---------------------------------------------------------------------------*
+ *  types.h                                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__TYPES
+#define __UAPI__TYPES
+
+#include <math.h>
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      /**
+       * signed long.
+       */
+      typedef long LONG;
+      
+      /**
+       * unsigned long.
+       */
+      typedef unsigned long ULONG;
+      
+      /**
+       * 32-bit signed integer.
+       */
+      typedef int INT32;
+      
+      /**
+       * The minimum value that a INT32 variable is guaranteed to support.
+       */
+      const INT32 INT32_MIN = -2147483647 - 1;
+      // VS2003 gives a compiler warning unless we use -1
+      
+      /**
+       * The maximum value that a INT32 variable is guaranteed to support.
+       */
+      const INT32 INT32_MAX = 2147483647;
+      
+      /**
+       * The maximum number of digits needed to represent a INT32_DIGITS. +1 for the negative sign.
+       */
+      const int INT32_DIGITS = (int) ceil(32*log10(2.0) + 1);
+      
+      /**
+       * 32-bit unsigned integer.
+       */
+      typedef unsigned int UINT32;
+      
+      /**
+       * The minimum value that a UINT32 variable is guaranteed to support.
+       */
+      const UINT32 UINT32_MIN = 0;
+      
+      /**
+       * The maximum value that a UINT32 variable is guaranteed to support.
+       */
+      const UINT32 UINT32_MAX = 4294967295ul;
+      
+      /**
+       * The maximum number of digits needed to represent a UINT32_DIGITS. +1 for the positive sign.
+       */
+      const int UINT32_DIGITS = (int) ceil(32*log10(2.0) + 1);
+      
+      /**
+       * 16-bit signed integer.
+       */
+      typedef short INT16;
+      
+      /**
+       * The maximum number of digits needed to represent a INT16_DIGITS. +1 for the negative sign.
+       */
+      const int INT16_DIGITS = (int) ceil(16*log10(2.0) + 1);
+      
+      /**
+       * 16-bit unsigned integer.
+       */
+      typedef unsigned short UINT16;
+      
+      /**
+       * The minimum value that a UINT16 variable is guaranteed to support.
+       */
+      const UINT16 UINT16_MIN = 0;
+      
+      /**
+       * The maximum value that a UINT16 variable is guaranteed to support.
+       */
+      const UINT16 UINT16_MAX = 65535;
+      
+      /**
+       * 8-bit signed integer.
+       */
+      typedef char INT8;
+      
+      /**
+       * 8-bit unsigned integer.
+       */
+      typedef unsigned char UINT8;
+      
+      /**
+       * The minimum value that a UINT8 variable is guaranteed to support.
+       */
+      const UINT8 UINT8_MIN = 0;
+      
+      /**
+       * The maximum value that a UINT8 variable is guaranteed to support.
+       */
+      const UINT8 UINT8_MAX = 255;
+      
+      /**
+       * The maximum size of an array.
+       */
+      typedef int ARRAY_LIMIT;
+      
+      /**
+       * The minimum value that a ARRAY_LIMIT variable is guaranteed to support.
+       */
+      const ARRAY_LIMIT ARRAY_LIMIT_MIN = 0;
+      
+      /**
+       * The maximum value that a ARRAY_LIMIT variable is guaranteed to support.
+       */
+      const ARRAY_LIMIT ARRAY_LIMIT_MAX = 2147483647;
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/Android.mk b/uapi/cpp/audio/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/audio/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/audio/include/AudioBuffer.h b/uapi/cpp/audio/include/AudioBuffer.h
new file mode 100644
index 0000000..55602ce
--- /dev/null
+++ b/uapi/cpp/audio/include/AudioBuffer.h
@@ -0,0 +1,92 @@
+/*---------------------------------------------------------------------------*
+ *  AudioBuffer.h                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__AUDIOBUFFER
+#define __UAPI__AUDIOBUFFER
+
+#include "exports.h"
+#include "RefCounted.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * class that holds the actual audio samples.
+         *
+         * Note: AudioBuffer are RefCounted. This means that every time someone
+         * acquires an AudioBuffer, it must call Release on it when this someone is
+         * done with it.
+         */
+        class AudioBuffer: public RefCounted
+        {
+          public:
+            /**
+             * Creates an instance of this class
+             *
+             * @param initial_count The initial reference count on the AudioBuffer,
+             * i.e. the number of AudioStreamImpl attached to the AudioQueue.
+             * @param bufSize the size of bytes to allocate in the internal buffer, i.e.
+             * bytes allocated for pBuffer
+             * @param returnCode the return code.
+             */
+            static AudioBuffer* create(UINT8 initial_count, UINT32 bufSize, ReturnCode::Type& returnCode);
+            
+            /**
+             * destructor
+             */
+            ~AudioBuffer();
+            
+            
+            // These are made public to make this class easy to use. View this class as
+            // a C strut.
+            
+            /**
+             * Pointer to the buffer that contains the audio data
+             */
+            UINT8* buffer;
+            /**
+             * number of UINT8 samples in the pBuffer variable.
+             */
+            ARRAY_LIMIT size;
+            /**
+             * Specifies if this buffer is the last one in this sequence of
+             * AudioBuffer.
+             */
+            bool isLastBuffer;
+            
+          private:
+            /**
+              * constructor
+              * @param initial_count The initial reference count on the AudioBuffer,
+              * i.e. the number of AudioStreamImpl attached to the AudioQueue.
+              * @param returnCode the return code.
+              */
+            AudioBuffer(UINT8 initial_count, ReturnCode::Type& returnCode);
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/include/AudioQueue.h b/uapi/cpp/audio/include/AudioQueue.h
new file mode 100644
index 0000000..62d221f
--- /dev/null
+++ b/uapi/cpp/audio/include/AudioQueue.h
@@ -0,0 +1,192 @@
+/*---------------------------------------------------------------------------*
+ *  AudioQueue.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__AUDIOQUEUE
+#define __UAPI__AUDIOQUEUE
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "Queue.h"
+#include "Codec.h"
+#include "RefCounted.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class AudioBuffer;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * A collection of AudioBuffers shared amongst all AudioStreamImpl.
+         */
+        class AudioQueue: public RefCounted,
+              protected Queue
+        {
+          public:
+          
+            /**
+             * Creates an instance of this class
+             *
+             * @param codec the audio format of the samples that will be added
+             * (AddBuffer) into this queue.
+             * @param returnCode SUCCESS unless a fatal error has occured
+             * @return a valid AudioQueue pointer if returnCode is SUCCESS, 0 if it failed.
+             */
+            UAPI_EXPORT static AudioQueue* create(Codec::Type codec, ReturnCode::Type& returnCode);
+            
+            /**
+             * destructor
+             */
+            virtual ~AudioQueue();
+            
+            /**
+             * Add audio samples to this audio container.
+             *
+             * @param samples pointer to audio sample memory.
+             * @param length number of samples in pSamples.
+             * @param isLastSample true no more samples are going to be added.
+             * @param returnCode ILLEGAL_ARGUMENT if one of the arguement is invalid,
+             *                   SUCCESS unless a fatal error occured.
+             */
+            UAPI_EXPORT void addBuffer(unsigned char* samples, ARRAY_LIMIT length,
+                           bool isLastBuffer, ReturnCode::Type& returnCode);
+                           
+            /**
+             * Call this function to know the audio format of the buffers returned by
+             * read().
+             */
+            Codec::Type getCodec();
+            
+            
+            /**
+             * Call this function to attach an AudioStreamImpl to this AudioQueue.
+             * @param pInitialReadPosition Will return to the initial read position
+             * inside the audio queue.
+             * @param SUCCESS unless a fatal error has occured.
+             */
+            void attachAudio(SinglyLinkedNode*& out_pInitialReadPosition, ReturnCode::Type& returnCode);
+            
+            /**
+             * Call this function when an AudioStreamImpl is no longer using the queue.
+             * @param SUCCESS unless a fatal error has occured.
+             */
+            void detachAudio(SinglyLinkedNode* pLastReadBuffer, ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns the AudioBuffers at the specified position in the queue.
+             *
+             * @param position Pointer to the node to read from. Will be updated if the
+             * read is successful.
+             * @param returnCode END_OF_STREAM if no more samples can be read, PENDING_DATA if no data
+             * is available now, SUCCESS if a buffer is available.
+             * @return the audio buffer at the specified position, or 0 if no data is
+             * available. In the latter case, the return code indicates whether more
+             * data will be forthcoming.
+             */
+            AudioBuffer* read(utilities::SinglyLinkedNode*& position,
+                              ReturnCode::Type& returnCode);
+                              
+            using RefCounted::removeRef;
+            
+            /**
+             * Releases the buffer that was acquired by calling read.
+             * @see read.
+             * @param audioBuffer the audio buffer to release.
+             * @param SUCCESS unless a fatal error has occured.
+             */
+            void release(AudioBuffer* audioBuffer, ReturnCode::Type& returnCode);
+            
+            /**
+             * Check if the attached audio object is pointing at the end of the stream.
+             * If it does, this means that this Audio object is no longer usable.
+             *
+             * @param position Pointer to the node to read from. Will be updated if the
+             * read is successful.
+             * @return true if position points to the end of the stream.
+             */
+            bool isAtEndOfStream(utilities::SinglyLinkedNode* position) const;
+            
+          private:
+            /**
+             * constructor
+             * @param codec the audio format of the samples that will be added
+             * (AddBuffer) into this queue.
+             * @param returnCode SUCCESS unless a fatal error has occured
+             */
+            AudioQueue(Codec::Type codec, ReturnCode::Type& returnCode);
+            
+            /**
+             * internal function used to allocate AudioBuffer. It allocates them with
+             * the right reference count, which correspond to the number of attached
+             * AudioStreamImpl.
+             * @param returnCode the returnCode
+             * @return a new AudioBuffer or 0 if it failed.
+             */
+            AudioBuffer* allocateAudioBuffer(ReturnCode::Type& returnCode);
+            
+            /**
+             * inserting a buffer into the queue.
+             *
+             * @param pBuf the audio buffer to insert.
+             * @param returnCode the return code
+             */
+            void insertBufferInQueue(AudioBuffer* pBuf, ReturnCode::Type& returnCode);
+            
+            /**
+             * Buffer that is currently being filled.
+             */
+            AudioBuffer* currentBuffer;
+            /**
+             * audio format of the queued audio buffers.
+             */
+            Codec::Type codec;
+            /**
+             * Protect the class from calls from different threads.
+             */
+            Mutex* mutex;
+            
+            /**
+             * Tells if we have an audio buffer that was released and that is marked as
+             * ready for garbage collection.
+             */
+            AudioBuffer* readyForGarbageCollection;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/include/AudioStreamImpl.h b/uapi/cpp/audio/include/AudioStreamImpl.h
new file mode 100644
index 0000000..8a1b729
--- /dev/null
+++ b/uapi/cpp/audio/include/AudioStreamImpl.h
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*
+ *  AudioStreamImpl.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__AUDIOIMPL
+#define __UAPI__AUDIOIMPL
+
+#include "exports.h"
+#include "AudioStream.h"
+#include "Codec.h"
+#include "SmartProxy.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class SinglyLinkedNode;
+        class AudioQueue;
+        class AudioBuffer;
+      }
+      namespace impl
+      {
+        class AudioStreamImplProxy;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        /**
+         * Implementation of the collection of audio samples.
+         */
+        class UAPI_EXPORT AudioStreamImpl: public AudioStream
+        {
+          public:
+            /**
+             * Creates an instance of this class.
+             *
+             * @param queue the shared audio queue used by this stream.
+             * @param returnCode the returnCode
+             */
+            static AudioStreamImplProxy create(utilities::AudioQueue* queue, ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns the next audio buffer. If read returns 0 and returnCode is set
+             * to PENDING_DATA it means that read() should be called later.
+             *
+             * @param returnCode END_OF_STREAM if done. PENDING_DATA if more data will
+             * get added later.
+             * @return the next audio buffer, or 0 if no data is available. In the
+             * latter case, the return code indicates whether more data will be
+             * forthcoming.
+             */
+            utilities::AudioBuffer* read(ReturnCode::Type& returnCode);
+            
+            /**
+             * Releases the buffer that was acquired by calling read.
+             * @see read.
+             * @param audioBuffer the audio buffer to release.
+             * @param returnCode the return code.
+             */
+            void release(utilities::AudioBuffer* audioBuffer, ReturnCode::Type& returnCode);
+            
+            /**
+             * Call this function to know the audio format of the buffers returned by
+             * read().
+             */
+            Codec::Type getCodec();
+            
+            /**
+             * An AudioStreamImpl can only be used by one consumer at a time. When the
+             * Recongizer, the FileWritter or the DeviceSpeaker are asked to start with
+             * an audio, they must check if this audio already Locked. If it's not
+             * locked, they must call this function to lock it.
+             *
+             * @param returnCode AUDIO_ALREADY_IN_USE if the audio is already in use by another component.
+             * END_OF_STREAM if the end of the audio stream has been reached.
+             */
+            void lock(ReturnCode::Type& returnCode);
+            
+            /**
+             * @see lock
+             * call this function to unlock this audio object.
+             */
+            void unlock();
+            
+            
+            
+          private:
+          
+            /**
+             * consturctor
+             *
+             * @param queue the shared audio queue used by this stream.
+             * @param returnCode the returnCode
+             */
+            AudioStreamImpl(utilities::AudioQueue* queue, ReturnCode::Type& returnCode);
+            
+            /**
+             * destructor
+             */
+            virtual ~AudioStreamImpl();
+            
+            /**
+             * The underlying audio data shared amongst all sinks.
+             */
+            utilities::AudioQueue* audioQueue;
+            /**
+             * Current read position from the AudioQueue.
+             */
+            utilities::SinglyLinkedNode* readPosition;
+            /**
+             * Flag that specifies if the AudioStreamImpl was locked by a Recognizer,
+             * DeviceSpeaker or a FileWritter.
+             */
+            bool isLocked;
+            
+            friend class AudioStreamImplProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, AudioStreamImplProxy, AudioStreamProxy, AudioStreamImpl)
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/include/CodecHelper.h b/uapi/cpp/audio/include/CodecHelper.h
new file mode 100644
index 0000000..64b27e6
--- /dev/null
+++ b/uapi/cpp/audio/include/CodecHelper.h
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*
+ *  CodecHelper.h                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CODECHELPER_
+#define __UAPI__CODECHELPER_
+
+#include "types.h"
+#include "Codec.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class UAPI_EXPORT CodecHelper
+        {
+          public:
+            /**
+             * Function used to know the size of AudioBuffer(s) for a certain codec
+             */
+            static UINT16 GetPreferredBufferSize(Codec::Type codec);
+            
+            /**
+             * Function used to know the number of bytes we should read when
+             * using a media file reader.
+             */
+            static UINT16 GetPreferredFileReaderBufferSize(Codec::Type codec);
+
+            /**
+             * Function used to know the buffer duration (in ms) for a certain codec
+             */
+            static UINT32 GetPreferredRealTimeDelay(Codec::Type codec);
+
+            /**
+             * Get the number of miliseconds that a number of bytes represent
+             * for a certain codec.
+             */
+            static UINT32 GetNumMsecForNumBytes(Codec::Type codec, UINT32 fileLength);
+
+            /**
+             * returns the codec that corresponds to the sample rate and the number
+             * of bytes per sample
+             */
+            static Codec::Type GetCodecFromRateNumBytesPerSample(INT32 sampleRate, INT16 numBytesPerSample, ReturnCode::Type & returnCode);
+
+          private:
+            /**
+             * Prevent construction.
+             */
+            CodecHelper();
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/include/MediaFileReaderImpl.h b/uapi/cpp/audio/include/MediaFileReaderImpl.h
new file mode 100644
index 0000000..aed6737
--- /dev/null
+++ b/uapi/cpp/audio/include/MediaFileReaderImpl.h
@@ -0,0 +1,282 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileReaderImpl.h                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MEDIAFILEREADERIMPL_
+#define __UAPI__MEDIAFILEREADERIMPL_
+
+#include "exports.h"
+#include "types.h"
+#include "MediaFileReader.h"
+#include "MediaFileReaderListener.h"
+#include "Task.h"
+#include "Codec.h"
+#include "TimeInstant.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class AudioStreamProxy;
+      namespace utilities
+      {
+        class File;
+        class WorkerQueue;
+        class AudioQueue;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        class MediaFileReaderImplProxy;
+        /**
+         * Class responsible for reading a file from disk, read its content and store
+         * that into and AudioQueue as AudioBuffer(s).
+         */
+        class MediaFileReaderImpl: public MediaFileReader
+        {
+          public:
+            //----------------------------------------------------------------
+            //          MediaFileReader implementation
+            //----------------------------------------------------------------
+            
+            /**
+             * Set the reading mode
+             *
+             * @param mode the reading mode
+             * @param returnCode the return code
+             */
+            virtual void setReadingMode(ReadingMode mode, ReturnCode::Type& returnCode);
+            
+            /**
+             * Tells the audio source to start collecting audio samples.
+             *
+             * @param returnCode the return code
+             */
+            virtual void start(ReturnCode::Type& returnCode);
+            
+            /**
+             * Stops this source from collecting audio samples.
+             *
+             * @param returnCode the return code
+             */
+            virtual void stop(ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns an object that contains the audio samples. It can be passed to
+             * a Recognizer or a DeviceSpeaker. Internally a position is associated
+             * with Audio object. This means that if someone wants to do two
+             * simultaneous recognitions on the same audio stream, then two Audio
+             * objects should be created. After crateAudio was called, the application
+             * is now responsible for releasing the memory. It should do so only once
+             * no other resource are using it. For example, if we do a createAudio on a
+             * Microphone, and we pass that audio to a recognizer, then the audio
+             * should be deleted only once the Microphone was stopped and once the
+             * recognition is completed.
+             *
+             * @param returnCode the return code.
+             * @return a pointer to an Audio object.
+             */
+            virtual AudioStreamProxy createAudio(ReturnCode::Type& returnCode);
+            
+          private:
+           /**
+            * Creates an instance of this class.
+            *
+            * @param pszFileName the name of the file in which we will read the
+            * audio samples. Note: The file MUST be of type Microsoft WAVE RIFF
+            * format (PCM 16 bits 8000 Hz or PCM 16 bits 11025 Hz).
+            * @param listener listens for MediaFileReader events
+            * @param logger the logger
+            * @param returnCode the return code
+            */
+            MediaFileReaderImpl(const char* pszFileName,
+                                AudioSourceListenerProxy& listener,
+                                ReturnCode::Type& returnCode);
+            /**
+             * Prevent destruction.
+             */
+            virtual ~MediaFileReaderImpl();
+            
+            /**
+             * Called when done reading the file or after Stop is done
+             */
+            void onReadFileDone();
+            
+            /**
+             * Called when the ReadFileTask is dequeued and executed
+             */
+            void runReadFileTask();
+            
+            /**
+             * Called when the StartReadingFileTask is dequeued and executed
+             */
+            void runStartReadingFileTask();
+            
+            /**
+             * Called when the StopReadingFileTask is dequeued and executed
+             */
+            void runStopReadingFileTask();
+            
+          private:
+            enum State
+            {
+              IDLE,
+              READING,
+              STOPPING
+            };
+            
+            /**
+             * Prevent assignment.
+             */
+            MediaFileReaderImpl& operator=(MediaFileReaderImpl&);
+            
+            /**
+             * returns the length of the file
+             * @param returnCode the return code.
+             * @return the lenght of the file.
+             */
+            UINT32 getFileLength(ReturnCode::Type& returnCode);
+            
+            /**
+             * File that contains the data to read
+             */
+            utilities::File* file;
+            /**
+             * The mode, REAL_TIME or ALL_AT_ONCE
+             */
+            ReadingMode mode;
+            /**
+             * Header size of the file. Ex: 44 K for RIFF, 1024 for SPHERE
+             */
+            UINT16 headerOffset;
+            /**
+             * The listener of MediaFileReader events
+             */
+            AudioSourceListenerProxy listener;
+            /**
+             * codec contained in the file to read
+             */
+            Codec::Type codec;
+            /**
+             * Worker queue used run Tasks
+             */
+            utilities::WorkerQueue* workerQueue;
+            /**
+             * The queue in which we insert the read audio samples.
+             */
+            utilities::AudioQueue* audioQueue;
+            /**
+             * Number of "full" buffers we have to read
+             */
+            UINT32 numFullBuffers;
+            /**
+             * Number of bytes in the last buffer to read
+             */
+            UINT16 lastBuffNumBytes;
+            /**
+             * The current buffer we have to read
+             */
+            UINT32 bufferReadIndex;
+            /**
+             * current state
+             */
+            State state;
+            /**
+             * If Recognizer.stop() is invoked we need to cancel any pending tasks related to the
+             * current recognition.
+             */
+            android::speech::recognition::utilities::Task* pendingTask;
+           
+            /**
+             * time at which we should be done playing this file
+             */
+            android::speech::recognition::utilities::TimeInstant expireTime;
+           
+            /**
+             * Number of buffers we will read if we are late reading the audio in real time mode.
+             */
+            UINT32 _numBufferNeededToCatchUp;
+            
+            SmartProxy::Root* rootProxy;
+            
+            friend class ReadFileTask;
+            friend class StartReadingFileTask;
+            friend class StopReadingFileTask;
+            friend class MediaFileReader;
+            friend class MediaFileReaderImplProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, MediaFileReaderImplProxy, MediaFileReaderProxy, MediaFileReaderImpl)
+        
+        /**
+         * Task responsible for reading the file and adding the file content into the
+         * AudioQueue.
+         */
+        class ReadFileTask: public utilities::ScheduledTask
+        {
+          public:
+            ReadFileTask(MediaFileReaderImplProxy& mediaFileReader, UINT32 timeout);
+            virtual void run();
+          private:
+            MediaFileReaderImplProxy mediaFileReader;
+        };
+        
+        /**
+         * Task responsible for starting reading process.
+         */
+        class StartReadingFileTask: public utilities::Task
+        {
+          public:
+            StartReadingFileTask(MediaFileReaderImplProxy& mediaFileReader);
+            virtual void run();
+          private:
+            MediaFileReaderImplProxy mediaFileReader;
+        };
+        
+        /**
+         * Task responsible for stopping the reading process.
+         */
+        class StopReadingFileTask: public utilities::Task
+        {
+          public:
+            StopReadingFileTask(MediaFileReaderImplProxy& mediaFileReader);
+            virtual void run();
+          private:
+            MediaFileReaderImplProxy mediaFileReader;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/include/MediaFileWriterImpl.h b/uapi/cpp/audio/include/MediaFileWriterImpl.h
new file mode 100644
index 0000000..a48ffb8
--- /dev/null
+++ b/uapi/cpp/audio/include/MediaFileWriterImpl.h
@@ -0,0 +1,201 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileWriterImpl.h                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MEDIAFILEWRITERIMPL_
+#define __UAPI__MEDIAFILEWRITERIMPL_
+
+#include "exports.h"
+#include "MediaFileWriter.h"
+#include "Task.h"
+#include "AudioStreamImpl.h"
+#include "MediaFileWriterListener.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class File;
+        class WorkerQueue;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        class MediaFileWriterImplProxy;
+        /**
+         * Class responsible for saving a collection of AudioBuffer(s) into an audio
+         * file on disk. AudioBuffer are read from an Audio class.
+         */
+        class MediaFileWriterImpl: public MediaFileWriter
+        {
+          public:
+            /**
+             * Call this function to save the data contained into an audio source.
+             * MediaFileWriterListener::onStopped() will be called once the operation
+             * completes.
+             * @param source the audio source that contains the samples.
+             * @param fileName the filename to save the audio to.
+             * @param returnCode the return code
+             */
+            virtual void save(AudioStreamProxy& source, const char* filename, ReturnCode::Type& returnCode);
+            
+          private:
+            enum State
+            {
+              IDLE,
+              SAVING
+            };
+            
+            /**
+             * Prevent assignment.
+             */
+            MediaFileWriterImpl& operator=(MediaFileWriterImpl&);
+            /**
+             * Prevent destruction.
+             */
+            virtual ~MediaFileWriterImpl();
+            
+            /**
+             * constructor
+             * @param listener the listener that will receive the event when the save
+             * completes.
+             */
+            MediaFileWriterImpl(MediaFileWriterListenerProxy& listener);
+            
+            /**
+             * internally called by createMediaFileWriterImpl. Initialize some components.
+             * @param pszFileName the name of the file in which the audio samples
+             * will get saved.
+             * @param returnCode the return code
+             */
+            void init(const char* pszFileName, ReturnCode::Type& returnCode);
+            
+            /**
+             * Called when the StartWriteFileTask is dequeued and executed.
+             */
+            void runStartWriteFileTask(impl::AudioStreamImplProxy& audioStream);
+            
+            /**
+             * Called when the WriteFileTask is dequeued and executed.
+             */
+            void runWriteFileTask(impl::AudioStreamImplProxy& audioStream);
+            
+            /**
+             * Utility method to do cleanup and send the OnError callback to the
+             * application.
+             */
+            void sendOnErrorToListener(impl::AudioStreamImplProxy& audioStream, ReturnCode::Type error);
+            
+            /**
+             * Utility method to do cleanup and send the OnStopped callback to the
+             * application.
+             */
+            void sendOnStoppedToListener(impl::AudioStreamImplProxy& audioStream);
+            
+            /**
+             * Utility function responsible for cleanup up the AudioStreamImplProxy code.
+             */
+            void cleanupAudioStreamProxy(impl::AudioStreamImplProxy& audioStream, ReturnCode::Type& returnCode);
+            
+            /**
+            * Close the file
+            */
+            void closeFile(ReturnCode::Type& returnCode);
+
+            /**
+             * File in which we will save the data
+             */
+            utilities::File* file;
+            /**
+             * Worker queue used to run Tasks
+             */
+            utilities::WorkerQueue* workerQueue;
+            /**
+             * The listener for MediaFileWriter events
+             */
+            MediaFileWriterListenerProxy listener;
+            
+            /**
+             * state of the resource
+             */
+            State state;
+            
+            SmartProxy::Root* rootProxy;
+            /**
+             * true if the RIFF header was saved in the file.
+             */
+            bool bHeaderSaved;
+            
+            friend class StartWriteFileTask;
+            friend class WriteFileTask;
+            friend class MediaFileWriter;
+            friend class MediaFileWriterImplProxy;
+        };
+        
+        /**
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, MediaFileWriterImplProxy, MediaFileWriterProxy, MediaFileWriterImpl)
+        
+        /**
+         * Task that takes care of executing the "save" operation
+         */
+        class StartWriteFileTask: public utilities::Task
+        {
+          public:
+            StartWriteFileTask(MediaFileWriterImplProxy& mediaFileWriter,
+                               AudioStreamImplProxy& audioStream);
+            virtual void run();
+          private:
+            MediaFileWriterImplProxy mediaFileWriter;
+            AudioStreamImplProxy audioStream;
+        };
+        
+        /**
+         * Task that takes care of writing the audio samples into a file.
+         */
+        class WriteFileTask: public utilities::ScheduledTask
+        {
+          public:
+            WriteFileTask(MediaFileWriterImplProxy& mediaFileWriter, AudioStreamImplProxy& audioStream,
+                          UINT32 timeout);
+            virtual void run();
+          private:
+            MediaFileWriterImplProxy mediaFileWriter;
+            AudioStreamImplProxy audioStream;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/include/WavePCMHelper.h b/uapi/cpp/audio/include/WavePCMHelper.h
new file mode 100644
index 0000000..34754a4
--- /dev/null
+++ b/uapi/cpp/audio/include/WavePCMHelper.h
@@ -0,0 +1,108 @@
+/*---------------------------------------------------------------------------*
+ *  WavePCMHelper.h                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI_WAVE_PCM_HELPER__H_
+#define __UAPI_WAVE_PCM_HELPER__H_
+#include "types.h"
+#include "ReturnCode.h"
+#include "Codec.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class File;
+      }
+    }
+  }
+}
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class WavePCMHelper
+        {
+        public:
+          /**
+          * Add a RIFF wave header to a file.
+          *
+          * @param file pointer to in which we want to add the RIFF header.
+          * @param sampleRate sample rate at which the audio samples were
+          * collected, e.g. 11025, 8000.
+          * @param numChannels 1 for mono, 2 for stereo.
+          * @param bitsPerSample Number of bits per sample, could be 16 or 8.
+          * @param numBytes Number of bytes in the audio payload.
+          *
+          */
+          static void writeWavHeader(File * file, INT32 sampleRate, INT16 numChannels, 
+              INT16 bitsPerSample, INT32 numBytes, ReturnCode::Type & returnCode);
+
+          /**
+          * Update the file length of an existing RIFF wave file.
+          *
+          * @param file pointer to in which we want to add the RIFF header.
+          * @param numBytes Number of bytes in the audio payload.
+          */
+          static void updateFileLength(File * file, INT32 numBytes, ReturnCode::Type & returnCode);
+
+
+          /**
+           * get the codec from a wave file.
+           *
+           * @param file pointer to a file that contains NIST Sphere or RIFF data.
+           * @param out_codec the codec contained in that file
+           * @param out_headerOffset the header size of that file.
+           */
+          static void getWavFileInfo( File * file, Codec::Type & out_codec, 
+                                      UINT16 & out_headerOffset, ReturnCode::Type & returnCode );
+
+        private:
+          /**
+           * get the information when the file is RIFF
+           *
+           * @param file pointer to a file that contains RIFF data.
+           * @param out_codec the codec contained in that file
+           */
+          static void getRIFFfileInfo( File * file, Codec::Type & out_codec, 
+                                              ReturnCode::Type & returnCode );
+          /**
+           * get the information when the file is Sphere NIST
+           *
+           * @param file pointer to a file that contains NIST Sphere.
+           * @param out_codec the codec contained in that file
+           */
+          static void getNISTfileInfo( File * file, Codec::Type & out_codec, 
+                                    ReturnCode::Type & returnCode );
+        };
+      }
+    }
+  }
+}
+#endif
+
diff --git a/uapi/cpp/audio/linux/Android.mk b/uapi/cpp/audio/linux/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/audio/linux/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/audio/linux/include/DeviceSpeakerLINUX.h b/uapi/cpp/audio/linux/include/DeviceSpeakerLINUX.h
new file mode 100644
index 0000000..91b2c76
--- /dev/null
+++ b/uapi/cpp/audio/linux/include/DeviceSpeakerLINUX.h
@@ -0,0 +1,533 @@
+/*---------------------------------------------------------------------------*
+ *  DeviceSpeakerLINUX.h                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__DEVICESPEAKER_LINUX
+#define __UAPI__DEVICESPEAKER_LINUX
+
+#include "DeviceSpeaker.h"
+#include "Task.h"
+#include "Codec.h"
+#include "AudioStreamImpl.h"
+#include "DeviceSpeakerListener.h"
+
+#define ENABLE_DUMMY_SPEAKER
+
+#ifdef ENABLE_DUMMY_SPEAKER
+
+/* Dummy code just to have speaker object that goes through the motions of playing audio. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  typedef void VOID;
+  typedef void* PVOID;
+  typedef unsigned int UINT;
+  typedef unsigned int WORD;
+  typedef unsigned long DWORD;
+  typedef DWORD DWORD_PTR;
+  typedef char *LPSTR;
+  
+  typedef WORD HANDLE;
+  
+  typedef UINT  MMRESULT;   /* error return code, 0 means no error */
+  
+  
+#define DECLARE_HANDLE(x) typedef WORD x
+  
+#define CALLBACK_FUNCTION   0x00030000l    /* dwCallback is a FARPROC */
+  
+#define WAVE_FORMAT_PCM 1
+  
+#define MMSYSERR_BASE          0
+  
+#define MMSYSERR_NOERROR 0
+#define MMSYSERR_ERROR        (MMSYSERR_BASE + 1)  /* unspecified error */
+#define MMSYSERR_BADDEVICEID  (MMSYSERR_BASE + 2)  /* device ID out of range */
+#define MMSYSERR_NOTENABLED   (MMSYSERR_BASE + 3)  /* driver failed enable */
+#define MMSYSERR_ALLOCATED    (MMSYSERR_BASE + 4)  /* device already allocated */
+#define MMSYSERR_INVALHANDLE  (MMSYSERR_BASE + 5)  /* device handle is invalid */
+#define MMSYSERR_NODRIVER     (MMSYSERR_BASE + 6)  /* no device driver present */
+#define MMSYSERR_NOMEM        (MMSYSERR_BASE + 7)  /* memory allocation error */
+#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE + 8)  /* function isn't supported */
+#define MMSYSERR_BADERRNUM    (MMSYSERR_BASE + 9)  /* error value out of range */
+#define MMSYSERR_INVALFLAG    (MMSYSERR_BASE + 10) /* invalid flag passed */
+#define MMSYSERR_INVALPARAM   (MMSYSERR_BASE + 11) /* invalid parameter passed */
+#define MMSYSERR_HANDLEBUSY   (MMSYSERR_BASE + 12) /* handle being used */
+  /* simultaneously on another */
+  /* thread (eg callback) */
+#define MMSYSERR_INVALIDALIAS (MMSYSERR_BASE + 13) /* specified alias not found */
+#define MMSYSERR_BADDB        (MMSYSERR_BASE + 14) /* bad registry database */
+#define MMSYSERR_KEYNOTFOUND  (MMSYSERR_BASE + 15) /* registry key not found */
+#define MMSYSERR_READERROR    (MMSYSERR_BASE + 16) /* registry read error */
+#define MMSYSERR_WRITEERROR   (MMSYSERR_BASE + 17) /* registry write error */
+#define MMSYSERR_DELETEERROR  (MMSYSERR_BASE + 18) /* registry delete error */
+#define MMSYSERR_VALNOTFOUND  (MMSYSERR_BASE + 19) /* registry value not found */
+#define MMSYSERR_NODRIVERCB   (MMSYSERR_BASE + 20) /* driver does not call DriverCallback */
+#define MMSYSERR_LASTERROR    (MMSYSERR_BASE + 20) /* last error in range */
+  
+#define MM_WOM_OPEN         0x3BB           /* waveform output */
+#define MM_WOM_CLOSE        0x3BC
+#define MM_WOM_DONE         0x3BD
+  
+#define MM_WIM_OPEN         0x3BE           /* waveform input */
+#define MM_WIM_CLOSE        0x3BF
+#define MM_WIM_DATA         0x3C0
+  
+  /* wave callback messages */
+#define WOM_OPEN        MM_WOM_OPEN
+#define WOM_CLOSE       MM_WOM_CLOSE
+#define WOM_DONE        MM_WOM_DONE
+#define WIM_OPEN        MM_WIM_OPEN
+#define WIM_CLOSE       MM_WIM_CLOSE
+#define WIM_DATA        MM_WIM_DATA
+  
+  /* flags for dwFlags field of WAVEHDR */
+#define WHDR_DONE       0x00000001  /* done bit */
+#define WHDR_PREPARED   0x00000002  /* set if this header has been prepared */
+#define WHDR_BEGINLOOP  0x00000004  /* loop start block */
+#define WHDR_ENDLOOP    0x00000008  /* loop end block */
+#define WHDR_INQUEUE    0x00000010  /* reserved for driver */
+  
+  /* device ID for wave device mapper */
+#ifndef WAVE_MAPPER
+#define WAVE_MAPPER     ((UINT)-1)
+#endif
+  
+#define INFINITE            0xFFFFFFFF  // Infinite timeout
+  
+  /* DUMMY */
+#define CALLBACK
+#define NEAR
+#define FAR
+  
+  typedef struct
+  {
+    WORD  wFormatTag;
+    WORD  nChannels;
+    DWORD nSamplesPerSec;
+    DWORD nAvgBytesPerSec;
+    WORD  nBlockAlign;
+    WORD  wBitsPerSample;
+    WORD  cbSize;
+  }
+  WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
+  
+  /* wave data block header */
+  typedef struct wavehdr_tag
+  {
+    LPSTR       lpData;                 /* pointer to locked data buffer */
+    DWORD       dwBufferLength;         /* length of data buffer */
+    DWORD       dwBytesRecorded;        /* used for input only */
+    DWORD       dwUser;                 /* for client's use */
+    DWORD       dwFlags;                /* assorted flags (see defines) */
+    DWORD       dwLoops;                /* loop control counter */
+    struct wavehdr_tag FAR *lpNext;     /* reserved for driver */
+    DWORD       reserved;               /* reserved for driver */
+  }
+  WAVEHDR, *PWAVEHDR, NEAR *NPWAVEHDR, FAR *LPWAVEHDR;
+  
+  DECLARE_HANDLE(HWAVEOUT);
+  
+  typedef HWAVEOUT FAR *LPHWAVEOUT;
+  
+#ifdef __cplusplus
+}
+#endif
+#endif  // #ifdef ENABLE_DUMMY_SPEAKER
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class Mutex;
+        class WorkerQueue;
+        class AudioBuffer;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        void CALLBACK __waveOutProc(HWAVEOUT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
+        /**
+         * DeviceSpeaker used to playback audio samples on LINUX
+         */
+        class DeviceSpeakerLINUX: public DeviceSpeaker
+        {
+          public:
+            /**
+             * Start audio playback.
+             *
+             * @param source the audio source that contains the samples to play.
+             * @param returnCode the return code
+             */
+            virtual void start(AudioStreamProxy& source, ReturnCode::Type& returnCode);
+            /**
+             * Stops audio playback.
+             *
+             * @return SUCCESS if stop in progress
+             * @param returnCode the return code
+             */
+            virtual void stop(ReturnCode::Type& returnCode);
+            
+            /**
+             * set the playback codec. This must be called before start is called.
+             * @param playbackCodec the codec to use for the playback operation.
+             * @param returnCode the return code.
+             */
+            virtual void setCodec(Codec::Type playbackCodec, ReturnCode::Type& returnCode);
+            
+            /**
+             * set the microphone listener.
+             * @param listener the device speaker listener.
+             * @param returnCode INVALID_STATE if the microphone state isn't IDLE
+             */
+            virtual void setListener(DeviceSpeakerListenerProxy& listener, ReturnCode::Type& returnCode);
+            
+          private:
+            /**
+             * Initializes the component when the library is loaded.
+             */
+            class ComponentInitializer
+            {
+              public:
+                ComponentInitializer();
+                ~ComponentInitializer();
+                
+                ReturnCode::Type returnCode;
+            };
+            
+            //Singleton implementation
+            /**
+             * Returns the root of this proxy, i.e. the "real object".
+             *
+             * @return Root of the proxy, the "real object".
+             */
+            virtual SmartProxy::Root* getRoot();
+            
+            /**
+             * Invoked when the singleton has to shutdown.
+             *
+             * @param returnCode the return code.
+             */
+            virtual void shutdown(ReturnCode::Type& returnCode);
+            
+            /**
+             * Prevent assignment.
+             */
+            DeviceSpeakerLINUX& operator=(DeviceSpeakerLINUX&);
+            
+            /**
+             * Prevent construction.
+             */
+            DeviceSpeakerLINUX(ReturnCode::Type& returnCode);
+            
+            /**
+             * Prevent destruction.
+             */
+            virtual ~DeviceSpeakerLINUX();
+            
+            enum State
+            {
+              IDLE,
+              STARTING,
+              PLAYING,
+              STOPPING,
+              DRAINING
+            };
+            
+            /**
+             * Task executed when setListener() is called.
+             * @param _listener the proxy to the a device speaker listener.
+             */
+            void runSetDeviceSpeakerListenerTask(DeviceSpeakerListenerProxy& _listener);
+            
+            /**
+             * Task executed when Start() is called. It will start the playback of
+             * audio.
+             */
+            void runStartPlaybackTask();
+            
+            /**
+             * Task executed when the waveOut is started. After we receive the WOM_OPEN
+             * event.
+             */
+            void runDeviceSpeakerStartedTask();
+            
+            /**
+             * Task executed when the device speaker needs new data to play and none is
+             * available for now.
+             */
+            void runReadAudioBufferTask();
+            
+            /**
+             * Task executed when a buffer has been played. At this point we must
+             * realese the buffer and try to submit another one.
+             * @param pwhdr a pointer to the WAVEHDR object that contains the played
+             * samples.
+             */
+            void runBufferPlayedTask(WAVEHDR* pwhdr);
+            
+            /**
+             * Task excuted when Stop() is called. It will stop the playback of audio.
+             */
+            void runStopPlaybackTask();
+            
+            /**
+             * Task excuted the playback is done. After we receive the WOM_CLOSE event.
+             */
+            void runDeviceSpeakerStoppedTask();
+            
+            /**
+             * internal function that calls waveOutClose.
+             * @param returnCode the return code.
+             */
+            void closeWaveOut(ReturnCode::Type& returnCode);
+            
+            /**
+             * internal function that tries to read AudioBuffer from the AudioStreamImpl
+             * stream.
+             */
+            void readBuffersFromStream();
+            
+            /**
+             * Function that converts AudioBuffer into WAVEHDR buffers. If needed it
+             * will also do the encoding.
+             * @param pBuf the audio buffer that contains the data to play.
+             * @param iBuf the index of the buffer to fill with pBuf within the m_whs
+             * array.
+             * @param returnCode the returnCode.
+             */
+            void prepareBuffer(utilities::AudioBuffer* pBuf, int iBuf, ReturnCode::Type& returnCode);
+            
+            
+            /**
+             * calls waveOutWrite and check for errors
+             * @param uiIndex buffer to add.
+             * @param returnCode the returnCode.
+             */
+            void writeWaveOutBuffer(unsigned int uiIndex, ReturnCode::Type& returnCode);
+            
+            /**
+             * Utility method to do cleanup and send the OnError callback to the
+             * application.
+             * @param returnCode the returnCode.
+             * @param stopPlayback call stop playback if state == PLAYING || state == STARTING
+             */
+            void sendOnErrorToListener(ReturnCode::Type error, bool stopPlayback);
+            
+            /**
+             * Utility method to do cleanup and send the OnStopped callback to the
+             * application.
+             */
+            void sendOnStoppedToListener();
+            
+            /**
+             * Utility function responsible for cleanup up the AudioStreamImplProxy code.
+             */
+            void cleanupAudioStreamProxy(ReturnCode::Type& returnCode);
+            
+            
+            static ComponentInitializer componentInitializer;
+            /**
+             * maximum number of buffers that are queued at any time. You can view this as
+             * a circular queue that contains NUM_BUFFERS_QUEUED buffers.
+             */
+            const static int NUM_BUFFERS_QUEUED = 8;
+            /**
+             * Collect BUFFERS_TO_COLLECT before we start playing.
+             */
+            const static int BUFFERS_TO_COLLECT = 4;
+            /**
+             * audio format in which we have to play.
+             */
+            Codec::Type codec;
+            /**
+             * the listener of Device Speaker events.
+             */
+            DeviceSpeakerListenerProxy listener;
+            /**
+             * worker queue used to run tasks.
+             */
+            utilities::WorkerQueue* workerQueue;
+            /**
+             * The AudioStream being played.
+             */
+            AudioStreamImplProxy audioStream;
+            
+            /**
+             * Handle to the waveOut api
+             */
+            HWAVEOUT m_hwo;
+            /**
+             * Contains the audio format: encoding, bit rate, etc for the waveOut api.
+             */
+            WAVEFORMATEX m_wfx;
+            /**
+             * Index of the last buffer that was added to m_whs.
+             */
+            int firstSent;
+            /**
+             * Number of buffers that are currently queued into the waveOut api.
+             */
+            int numBuffers;
+            /**
+             * The circular queue of WAVEHDR buffers.
+             */
+            WAVEHDR m_whs[NUM_BUFFERS_QUEUED];
+            /**
+             * Flag that indicates if we have to collect buffers. Before the playback
+             * starts, we have to collect a minimum of BUFFERS_TO_COLLECT buffers.
+             */
+            bool collectingBuffers;
+            /**
+             * current state
+             */
+            State state;
+            static utilities::Mutex* mutex;
+            
+            SmartProxy::Root* rootProxy;
+            
+            
+            
+            friend void CALLBACK __waveOutProc(HWAVEOUT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
+            friend class SetDeviceSpeakerListenerTask;
+            friend class StartPlaybackTask;
+            friend class StopPlaybackTask;
+            friend class BufferPlayedTask;
+            friend class DeviceSpeakerStartedTask;
+            friend class DeviceSpeakerStoppedTask;
+            friend class ReadAudioBufferTask;
+            friend class DeviceSpeaker;
+            friend class DeviceSpeakerLINUXProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, DeviceSpeakerLINUXProxy, DeviceSpeakerProxy, DeviceSpeakerLINUX)
+        
+        /**
+         * Task executed when setListener() is called.
+         */
+        class SetDeviceSpeakerListenerTask: public utilities::Task
+        {
+          public:
+            SetDeviceSpeakerListenerTask(DeviceSpeakerLINUXProxy& _deviceSpeaker,
+                                         DeviceSpeakerListenerProxy & _listener);
+            virtual void run();
+          private:
+            DeviceSpeakerLINUXProxy deviceSpeaker;
+            DeviceSpeakerListenerProxy listener;
+        };
+        
+        /**
+         * Task executed when Start() is called. It will start the playback of audio.
+         */
+        class StartPlaybackTask: public utilities::Task
+        {
+          public:
+            StartPlaybackTask(DeviceSpeakerLINUXProxy& deviceSpeaker);
+            virtual void run();
+          private:
+            DeviceSpeakerLINUXProxy deviceSpeaker;
+        };
+        
+        /**
+         * Task excuted when Stop() is called. It will stop the playback of audio.
+         */
+        class StopPlaybackTask: public utilities::Task
+        {
+          public:
+            StopPlaybackTask(DeviceSpeakerLINUXProxy& deviceSpeaker);
+            virtual void run();
+          private:
+            DeviceSpeakerLINUXProxy deviceSpeaker;
+        };
+        
+        /**
+         * Task executed when a buffer has been played. At this point we must realese
+         * the buffer and try to submit another one.
+         */
+        class BufferPlayedTask: public utilities::Task
+        {
+          public:
+            BufferPlayedTask(DeviceSpeakerLINUXProxy& deviceSpeaker, WAVEHDR* waveHdr);
+            virtual void run();
+          private:
+            DeviceSpeakerLINUXProxy deviceSpeaker;
+            WAVEHDR* waveHdr;
+        };
+        
+        /**
+         * Task executed when the waveOut is started. After we receive the WOM_OPEN
+         * event.
+         */
+        class DeviceSpeakerStartedTask: public utilities::Task
+        {
+          public:
+            DeviceSpeakerStartedTask(DeviceSpeakerLINUXProxy& deviceSpeaker);
+            virtual void run();
+          private:
+            DeviceSpeakerLINUXProxy deviceSpeaker;
+        };
+        
+        /**
+         * Task excuted the playback is done. After we receive the WOM_CLOSE event.
+         */
+        class DeviceSpeakerStoppedTask: public utilities::Task
+        {
+          public:
+            DeviceSpeakerStoppedTask(DeviceSpeakerLINUXProxy& deviceSpeaker);
+            virtual void run();
+          private:
+            DeviceSpeakerLINUXProxy deviceSpeaker;
+        };
+        
+        /**
+         * Task executed when the device speaker needs new data to play and none is
+         * available for now.
+         */
+        class ReadAudioBufferTask: public utilities::ScheduledTask
+        {
+          public:
+            ReadAudioBufferTask(DeviceSpeakerLINUXProxy& deviceSpeaker,  UINT32 timeout);
+            virtual void run();
+          private:
+            DeviceSpeakerLINUXProxy deviceSpeaker;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/linux/include/MicrophoneLINUX.h b/uapi/cpp/audio/linux/include/MicrophoneLINUX.h
new file mode 100644
index 0000000..4dc85ab
--- /dev/null
+++ b/uapi/cpp/audio/linux/include/MicrophoneLINUX.h
@@ -0,0 +1,356 @@
+/*---------------------------------------------------------------------------*
+ *  MicrophoneLINUX.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MICROPHONELINUX_H
+#define __UAPI__MICROPHONELINUX_H
+
+#include "exports.h"
+#include "Microphone.h"
+#include "MicrophoneListener.h"
+#include "Task.h"
+#include "Codec.h"
+#include "audioin.h"
+
+/* define these so code can look more like Windows version (for ease of support) */
+#define CALLBACK
+typedef AUDIOIN_WAVEHDR WAVEHDR;
+typedef AUDIOIN_H       HWAVEIN;
+typedef void*           DWORD_PTR;
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class AudioStream;
+      namespace utilities
+      {
+        class WorkerQueue;
+        class AudioQueue;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        void CALLBACK __waveInProc(HWAVEIN, AUDIOIN_MSG, DWORD_PTR, DWORD_PTR, DWORD_PTR);
+        /**
+         * Microphone (audio acquisition)
+         */
+        class MicrophoneLINUX: public Microphone
+        {
+          public:
+            //-------------------------------------------------------------
+            //  Microphone IMPLEMENTATION
+            //-------------------------------------------------------------
+            
+            /**
+             * Tells the microphone to start collecting audio samples.
+             *
+             * @param returnCode the return code
+             */
+            virtual void start(ReturnCode::Type& returnCode);
+            
+            /**
+             * Stops the microphone from collecting audio samples.
+             *
+             * @param returnCode the return code
+             */
+            virtual void stop(ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns an object that contains the audio samples. It can be passed to
+             * a Recognizer a DeviceSpeaker or a MediaFileWriter. Internally a position
+             * is associated with Audio object. This means that if someone wants to do
+             * two simultaneous recognitions on the same audio stream, then two Audio
+             * objects should be created. After createAudio is called, the application
+             * is now responsible for releasing the memory. It should do so only once
+             * no other resources are using it. For example, if we do a createAudio on a
+             * Microphone, and we pass that audio to a Recognizer, then the audio
+             * should be deleted only once the Microphone was stopped and once the
+             * recognition is completed.
+             *
+             * @param returnCode the return code.
+             * @return a pointer to an Audio object.
+             */
+            virtual AudioStreamProxy createAudio(ReturnCode::Type& returnCode);
+            
+            /**
+             * set the recording codec. This must be called before Start is called.
+             * @param recordingCodec the codec in which the samples will be recorded.
+             * @param returnCode the return code.
+             */
+            virtual void setCodec(Codec::Type recordingCodec, ReturnCode::Type& returnCode);
+            
+            /**
+             * Sets the microphone listener.
+             * @param listener the microphone listener.
+             * @param returnCode the return code.
+             */
+            virtual void setListener(AudioSourceListenerProxy& listener, ReturnCode::Type& returnCode);
+          private:
+            /**
+             * Initializes the component when the library is loaded.
+             */
+            class ComponentInitializer
+            {
+              public:
+                ComponentInitializer();
+                ~ComponentInitializer();
+                
+                ReturnCode::Type returnCode;
+            };
+            
+            //Singleton implementation
+            /**
+             * Returns the root of this proxy, i.e. the "real object".
+             *
+             * @return Root of the proxy, the "real object".
+             */
+            virtual SmartProxy::Root* getRoot();
+            
+            /**
+             * Invoked when the singleton has to shutdown.
+             *
+             * @param returnCode the return code.
+             */
+            virtual void shutdown(ReturnCode::Type& returnCode);
+            
+            /**
+             * Creates a new Microphone.
+             *
+             * @param returnCode the return code
+             */
+            MicrophoneLINUX(ReturnCode::Type& returnCode);
+            /**
+             * Prevent destruction.
+             */
+            virtual ~MicrophoneLINUX();
+            
+            enum State
+            {
+              IDLE,
+              STARTING,
+              RECORDING,
+              STOPPING,
+              ERROR,
+              ERROR_STOPPING,
+              ERROR_STOPPED
+            };
+            
+            /**
+             * Initialize this object. Internally called by createMicrophoneLINUX.
+             * @param returnCode the return code
+             */
+            void init(ReturnCode::Type& returnCode);
+            
+            /**
+             * Task executed when setListener() is called.
+             * @param _listener the proxy to the a microphone listener.
+             */
+            void runSetMicrophoneListenerTask(AudioSourceListenerProxy& _listener);
+            
+            /**
+             * Task that is executed when start() is called. It will start the
+             * recorder.
+             */
+            void runStartMicrophoneTask();
+            
+            /**
+             * Task that handles the things to do when the recording is successfully
+             * started.
+             */
+            void runMicrophoneStartedTask();
+            
+            /**
+             * Task invoked every time a buffer is recorded
+             * @param pwhdr a pointer to the WAVEHDR object that contains the recorded
+             * samples.
+             */
+            void runBufferRecordedTask(WAVEHDR* pwhdr);
+            
+            /**
+             * Task that is executed when stop() is called. It will stop the
+             * recorder.
+             */
+            void runStopMicrophoneTask();
+            
+            /**
+             * Task that handles the things to do when the recording is successfully
+             * stopped.
+             */
+            void runMicrophoneStoppedTask();
+            
+            /**
+             * Utility method to do cleanup and send the OnError callback to the
+             * application.
+             */
+            void sendOnErrorToListener(ReturnCode::Type error, bool stopRecording);
+            
+            /**
+             * stop() has not completed. This function is used to reset the AudioQueue
+             * and send the onStopped() callback to the listener.
+             */
+            void onStopDone();
+            
+            static ComponentInitializer componentInitializer;
+            
+            /**
+             * Worker queue used to run tasks.
+             */
+            utilities::WorkerQueue* m_pWorkerQueue;
+            /**
+             * The listener of Microphone events.
+             */
+            AudioSourceListenerProxy listener;
+            /**
+             * The audio format in which we have to record.
+             */
+            Codec::Type m_codec;
+            /**
+             * AudioQueue in which we will store (AddBuffer) the audio samples.
+             */
+            utilities::AudioQueue* m_pAudioQueue;
+            /**
+             * a WAVEIN handle. Needed to call any waveIn functions.
+             */
+            HWAVEIN m_hwi;
+            /**
+             * sampling rate
+             */
+            unsigned int m_nSamplesPerSec;
+            
+            /**
+             * current state
+             */
+            State m_state;
+            static utilities::Mutex* mutex;
+            
+            
+            SmartProxy::Root* rootProxy;
+            
+            friend void CALLBACK __waveInProc(HWAVEIN, AUDIOIN_MSG, DWORD_PTR, DWORD_PTR, DWORD_PTR);
+            friend class SetMicrophoneListenerTask;
+            friend class StartMicrophoneTask;
+            friend class MicrophoneStartedTask;
+            friend class BufferRecordedTask;
+            friend class StopMicrophoneTask;
+            friend class MicrophoneStoppedTask;
+            friend class Microphone;
+            friend class MicrophoneLINUXProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, MicrophoneLINUXProxy, MicrophoneProxy, MicrophoneLINUX)
+        
+        /**
+         * Task executed when setListener() is called.
+         */
+        class SetMicrophoneListenerTask: public utilities::Task
+        {
+          public:
+            SetMicrophoneListenerTask(MicrophoneLINUXProxy& _microphone,
+                                      AudioSourceListenerProxy & _listener);
+            virtual void run();
+          private:
+            MicrophoneLINUXProxy     microphone;
+            AudioSourceListenerProxy  listener;
+        };
+        
+        /**
+         * Task that is executed when start() is called. It will start the recorder.
+         */
+        class StartMicrophoneTask: public utilities::Task
+        {
+          public:
+            StartMicrophoneTask(MicrophoneLINUXProxy& microphone);
+            virtual void run();
+          private:
+            MicrophoneLINUXProxy microphone;
+        };
+        
+        
+        /**
+         * Task that handles the things to do when the recording is successfully
+         * started.
+         */
+        class MicrophoneStartedTask: public utilities::Task
+        {
+          public:
+            MicrophoneStartedTask(MicrophoneLINUXProxy& microphone);
+            virtual void run();
+          private:
+            MicrophoneLINUXProxy microphone;
+        };
+        
+        /**
+         * Task invoked every time a buffer is recorded
+         */
+        class BufferRecordedTask: public utilities::Task
+        {
+          public:
+            BufferRecordedTask(MicrophoneLINUXProxy& microphone, WAVEHDR* pwhdr);
+            virtual ~BufferRecordedTask();
+            virtual void run();
+          private:
+            MicrophoneLINUXProxy microphone;
+            WAVEHDR* pwhdr;
+        };
+        
+        /**
+         * Task that is executed when stop() is called. It will start the recorder.
+         */
+        class StopMicrophoneTask: public utilities::Task
+        {
+          public:
+            StopMicrophoneTask(MicrophoneLINUXProxy& microphone);
+            virtual void run();
+          private:
+            MicrophoneLINUXProxy microphone;
+        };
+        
+        /**
+         * Task that handles the things to do when the recording is successfully
+         * stopped.
+         */
+        class MicrophoneStoppedTask: public utilities::Task
+        {
+          public:
+            MicrophoneStoppedTask(MicrophoneLINUXProxy& _microphone);
+            virtual void run();
+          private:
+            MicrophoneLINUXProxy microphone;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/audio/linux/source/Android.mk b/uapi/cpp/audio/linux/source/Android.mk
new file mode 100644
index 0000000..d9f0108
--- /dev/null
+++ b/uapi/cpp/audio/linux/source/Android.mk
@@ -0,0 +1,39 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	DeviceSpeakerLINUX.cpp \
+	MicrophoneLINUX.cpp \
+	
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../../api/include \
+	$(LOCAL_PATH)/../../../audio/include \
+	$(LOCAL_PATH)/../../../audio/linux/include \
+	$(LOCAL_PATH)/../../../grammar/include \
+	$(LOCAL_PATH)/../../../uapi/include \
+	$(LOCAL_PATH)/../../../utilities/include \
+	$(LOCAL_PATH)/../../../utilities/linux/include \
+	$(LOCAL_PATH)/../../../../java/jniapi/jniapi \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+
+LOCAL_CFLAGS := \
+	-DUAPI_EXPORTS \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_LDLIBS += \
+	-lpthread \
+	-ldl \
+
+LOCAL_MODULE:= libUAPI_audiolinux
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/uapi/cpp/audio/linux/source/DeviceSpeakerLINUX.cpp b/uapi/cpp/audio/linux/source/DeviceSpeakerLINUX.cpp
new file mode 100644
index 0000000..9b007c1
--- /dev/null
+++ b/uapi/cpp/audio/linux/source/DeviceSpeakerLINUX.cpp
@@ -0,0 +1,1245 @@
+/*---------------------------------------------------------------------------*
+ *  DeviceSpeakerLINUX.cpp                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+#include "DeviceSpeakerLINUX.h"
+#include "WorkerQueue.h"
+#include "WorkerQueueFactory.h"
+#include "AudioBuffer.h"
+#include "Codec.h"
+#include "AudioStreamImpl.h"
+#include "DeviceSpeakerListener.h"
+#include "LoggerImpl.h"
+#include "System.h"
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      DeviceSpeaker* DeviceSpeaker::instance = 0;
+      
+      DeviceSpeakerProxy DeviceSpeaker::getInstance(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("DeviceSpeakerLINUX::getInstance");
+          
+        if (impl::DeviceSpeakerLINUX::componentInitializer.returnCode)
+        {
+          returnCode = impl::DeviceSpeakerLINUX::componentInitializer.returnCode;
+          return DeviceSpeakerProxy();
+        }
+        
+        //we have to protect the construction of "instance". Make sure we don't have
+        //multiple threads calling getInstance() while "instance" is equal to 0.
+        LockScope lock(impl::DeviceSpeakerLINUX::mutex, returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to create LockScope of DeviceSpeakerLINUX::mutex\n");
+          return DeviceSpeakerProxy();
+        }
+        
+        //it's now safe to check if instance == 0
+        if (instance == 0)
+        {
+          instance = new impl::DeviceSpeakerLINUX(returnCode);
+          if (returnCode || instance == 0)
+          {
+            delete instance;
+            instance = 0;
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return DeviceSpeakerProxy();
+          }
+          
+          // register for auto cleanup.
+          impl::DeviceSpeakerLINUX* instanceImpl = (impl::DeviceSpeakerLINUX*) instance;
+          DeviceSpeakerProxy result(instanceImpl);
+          if (!result)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return DeviceSpeakerProxy();
+          }
+          instanceImpl->rootProxy = result.getRoot();
+          
+          System* system = System::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            delete instance;
+            return DeviceSpeakerProxy();
+          }
+          
+          // has to be called after rootProxy is assigned.
+          system->add(instance, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            delete instance;
+            return DeviceSpeakerProxy();
+          }
+          return result;
+        }
+        returnCode = ReturnCode::SUCCESS;
+        impl::DeviceSpeakerLINUX* instanceImpl = (impl::DeviceSpeakerLINUX*) instance;
+        return DeviceSpeakerProxy(instanceImpl->rootProxy);
+      }
+      
+      namespace impl
+      {
+        /* if ENABLE_DUMMY_SPEAKER_CALLBACK_THREAD is defined, invoke callback function from another thread */
+        
+#ifdef ENABLE_DUMMY_SPEAKER
+        
+        /* Dummy code just to have speaker object that goes through the motions of playing audio. */
+        
+        typedef void CALLBACK(*pCallback)(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
+        
+        static pCallback g_OutCallback = NULL;
+        static DWORD g_dwCallbackInstance = 0;
+        
+#ifdef ENABLE_DUMMY_SPEAKER_CALLBACK_THREAD
+        typedef struct
+        {
+          /* parameters for callback function */
+          HWAVEOUT  hwo;
+          UINT      uMsg;
+          DWORD_PTR dwInstance;
+          DWORD_PTR dwParam1;
+          DWORD_PTR dwParam2;
+        } CallbackOptions;
+        
+        static void* CallbackThread(void *pParam)
+        {
+          CallbackOptions *pOptions = (CallbackOptions *) pParam;
+          
+          g_OutCallback(pOptions->hwo, pOptions->uMsg, pOptions->dwInstance, (DWORD_PTR)pOptions->dwParam1, (DWORD_PTR)pOptions->dwParam2);
+          
+          delete pOptions;
+          
+          return NULL;
+        }
+#endif
+        
+        static MMRESULT waveOutOpen(LPHWAVEOUT phwo, UINT uDeviceID, LPWAVEFORMATEX pwfx, DWORD dwCallback, DWORD dwCallbackInstance, DWORD fdwOpen)
+        {
+          g_OutCallback = (pCallback) dwCallback;
+          g_dwCallbackInstance = dwCallbackInstance;
+          
+          *phwo = (WORD)10;
+          
+#ifdef ENABLE_DUMMY_SPEAKER_CALLBACK_THREAD
+          int              rc;
+          pthread_t        threadId;
+          CallbackOptions *pOptions = new CallbackOptions;
+          
+          if (pOptions == 0)
+            return MMSYSERR_NOMEM;
+            
+          pOptions->hwo        = *phwo;
+          pOptions->uMsg       = WOM_OPEN;
+          pOptions->dwInstance = g_dwCallbackInstance;
+          pOptions->dwParam1   = (DWORD_PTR)NULL;
+          pOptions->dwParam2   = (DWORD_PTR)NULL;
+          
+          rc = pthread_create(&threadId, NULL, &CallbackThread, pOptions);
+          if (rc != 0)
+          {
+            UAPI_ERROR(fn,"error creating thread in DeviceSpeakerLINUX dummy callback.  pthread_create() returns %d\n", rc);
+            return MMSYSERR_ERROR;
+          }
+#else
+          g_OutCallback(*phwo, WOM_OPEN, g_dwCallbackInstance, (DWORD_PTR)NULL, (DWORD_PTR)NULL);
+#endif
+          
+          return MMSYSERR_NOERROR;
+        }
+        
+        static MMRESULT waveOutClose(HWAVEOUT hwo)
+        {
+#ifdef ENABLE_DUMMY_SPEAKER_CALLBACK_THREAD
+          int              rc;
+          pthread_t        threadId;
+          CallbackOptions *pOptions = new CallbackOptions;
+          
+          if (pOptions == 0)
+            return MMSYSERR_NOMEM;
+            
+          pOptions->hwo        = hwo;
+          pOptions->uMsg       = WOM_CLOSE;
+          pOptions->dwInstance = g_dwCallbackInstance;
+          pOptions->dwParam1   = (DWORD_PTR)NULL;
+          pOptions->dwParam2   = (DWORD_PTR)NULL;
+          
+          rc = pthread_create(&threadId, NULL, &CallbackThread, pOptions);
+          if (rc != 0)
+          {
+            UAPI_ERROR(fn,"error creating thread in DeviceSpeakerLINUX dummy callback.  pthread_create() returns %d\n", rc);
+            return MMSYSERR_ERROR;
+          }
+#else
+          g_OutCallback(hwo, WOM_CLOSE, g_dwCallbackInstance, (DWORD_PTR)NULL, (DWORD_PTR)NULL);
+#endif
+          
+          return MMSYSERR_NOERROR;
+        }
+        
+        static MMRESULT waveOutWrite(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
+        {
+#ifdef ENABLE_DUMMY_SPEAKER_CALLBACK_THREAD
+          int              rc;
+          pthread_t        threadId;
+          CallbackOptions *pOptions = new CallbackOptions;
+          
+          if (pOptions == 0)
+            return MMSYSERR_NOMEM;
+            
+          pOptions->hwo        = hwo;
+          pOptions->uMsg       = WOM_DONE;
+          pOptions->dwInstance = g_dwCallbackInstance;
+          pOptions->dwParam1   = (DWORD_PTR)pwh;
+          pOptions->dwParam2   = (DWORD_PTR)NULL;
+          
+          rc = pthread_create(&threadId, NULL, &CallbackThread, pOptions);
+          if (rc != 0)
+          {
+            UAPI_ERROR(fn,"error creating thread in DeviceSpeakerLINUX dummy callback.  pthread_create() returns %d\n", rc);
+            return MMSYSERR_ERROR;
+          }
+#else
+          g_OutCallback(hwo, WOM_DONE, g_dwCallbackInstance, (DWORD_PTR)pwh, (DWORD_PTR)NULL);
+#endif
+          
+          return MMSYSERR_NOERROR;
+        }
+        
+        static MMRESULT waveOutReset(HWAVEOUT hwo)
+        {
+          return MMSYSERR_NOERROR;
+        }
+        
+        MMRESULT waveOutPrepareHeader(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
+        {
+          return MMSYSERR_NOERROR;
+        }
+        
+        MMRESULT waveOutUnprepareHeader(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
+        {
+          return MMSYSERR_NOERROR;
+        }
+        
+        DWORD WaitForSingleObject(HANDLE hHandle, WORD dwMilliseconds)
+        {
+          return 0;
+        }
+        
+        VOID ZeroMemory(PVOID Destination, DWORD Length)
+        {
+          memset(Destination, 0, Length);
+        }
+        
+#endif  /* #ifdef ENABLE_DUMMY_SPEAKER */
+        
+        
+        
+        DEFINE_SMARTPROXY(impl, DeviceSpeakerLINUXProxy, DeviceSpeakerProxy, DeviceSpeakerLINUX);
+        
+        Mutex* DeviceSpeakerLINUX::mutex = 0;
+        DeviceSpeakerLINUX::ComponentInitializer DeviceSpeakerLINUX::componentInitializer;
+        
+        DeviceSpeakerLINUX::ComponentInitializer::ComponentInitializer()
+        {
+          mutex = Mutex::create(false, returnCode);
+          if (returnCode)
+          {
+            fprintf(stderr, "Could not create DeviceSpeakerLINUX::mutex\n");
+            return;
+          }
+        }
+        
+        DeviceSpeakerLINUX::ComponentInitializer::~ComponentInitializer()
+        {
+          delete mutex;
+          returnCode = ReturnCode::UNKNOWN;
+        }
+        
+        struct WaveOutHelperStruct
+        {
+          WorkerQueue* workerQueue;
+          DeviceSpeakerLINUXProxy deviceSpeaker;
+        };
+        
+        void CALLBACK __waveOutProc(HWAVEOUT, UINT uMsg,
+                                    DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR)
+        {
+          //NOTE: we are not allowed to lock any mutex in this functions. This is
+          //part of the contract when using the waveIn api.
+          ReturnCode::Type returnCode;
+          
+          WaveOutHelperStruct* helper = ((WaveOutHelperStruct*) dwInstance);
+          DeviceSpeakerLINUXProxy& deviceSpeaker = helper->deviceSpeaker;
+          
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::__waveOutProc");
+          
+          WorkerQueue* workerQueue     = helper->workerQueue;
+          switch (uMsg)
+          {
+            case WOM_OPEN:
+            {
+              UAPI_INFO(fn,"WOM_OPEN\n");
+              DeviceSpeakerStartedTask* task = new DeviceSpeakerStartedTask(deviceSpeaker);
+              if (!task)
+              {
+                UAPI_ERROR(fn,"Could not create DeviceSpeakerStartedTask\n");
+                deviceSpeaker->sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+                delete helper;
+                return;
+              }
+              workerQueue->enqueue(task, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"could not enqueue DeviceSpeakerStartedTask %s\n",
+                           ReturnCode::toString(returnCode));
+                deviceSpeaker->sendOnErrorToListener(returnCode,true);
+                delete task;
+                delete helper;
+                return;
+              }
+              UAPI_INFO(fn,"enqueue(new DeviceSpeakerStartedTask)\n");
+              break;
+            }
+            case WOM_DONE:
+            {
+              UAPI_INFO(fn,"WOM_DONE\n");
+              BufferPlayedTask* task = new BufferPlayedTask(deviceSpeaker, (WAVEHDR*) dwParam1);
+              if (!task)
+              {
+                UAPI_ERROR(fn,"Could not create BufferPlayedTask\n");
+                deviceSpeaker->sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+                delete helper;
+                return;
+              }
+              workerQueue->enqueue(task, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"could not enqueue BufferPlayedTask %s\n",
+                           ReturnCode::toString(returnCode));
+                deviceSpeaker->sendOnErrorToListener(returnCode,true);
+                delete task;
+                delete helper;
+                return;
+              }
+              UAPI_INFO(fn,"enqueue(new BufferPlayedTask)\n");
+              break;
+            }
+            case WOM_CLOSE:
+            {
+              UAPI_INFO(fn,"WOM_CLOSE\n");
+              DeviceSpeakerStoppedTask* task = new DeviceSpeakerStoppedTask(deviceSpeaker);
+              if (!task)
+              {
+                UAPI_ERROR(fn,"Could not create DeviceSpeakerStoppedTask\n");
+                deviceSpeaker->sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+                delete helper;
+                return;
+              }
+              workerQueue->enqueue(task, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"could not enqueue DeviceSpeakerStoppedTask %s\n",
+                           ReturnCode::toString(returnCode));
+                deviceSpeaker->sendOnErrorToListener(returnCode,true);
+                delete task;
+                delete helper;
+                return;
+              }
+              UAPI_INFO(fn,"enqueue(new DeviceSpeakerStoppedTask)\n");
+              
+              delete helper;
+              break;
+            }
+          }
+        }
+        
+        DeviceSpeakerLINUX::DeviceSpeakerLINUX(ReturnCode::Type& returnCode):
+            codec(Codec::PCM_16BIT_8K),
+            workerQueue(0),
+            m_hwo(0),
+            collectingBuffers(true),
+            state(IDLE),
+            rootProxy(0)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::DeviceSpeakerLINUX");
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+          m_wfx.cbSize             = 0;
+          m_wfx.nBlockAlign        = 2;
+          m_wfx.nChannels          = 1;
+          m_wfx.wBitsPerSample     = 16;
+          
+          ReturnCode::Type rc;
+          m_wfx.nSamplesPerSec = Codec::getSampleRate(codec, rc);
+          if (rc)
+            return;
+          m_wfx.nAvgBytesPerSec    = m_wfx.nSamplesPerSec * m_wfx.wBitsPerSample / 8;
+          m_wfx.wFormatTag         = WAVE_FORMAT_PCM;
+          
+          WorkerQueueFactory* workerFactory = WorkerQueueFactory::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue factory\n");
+            return;
+          }
+          workerQueue = workerFactory->getWorkerQueue(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue\n");
+            return;
+          }
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void DeviceSpeakerLINUX::setCodec(Codec::Type playbackCodec, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::setCodec");
+            
+          //need to protect when we are assigning state (done in WorkerQueue
+          //thread) and when we are calling SetCodec (done in the app
+          //thread).
+          LockScope ls(mutex, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_WARN(fn,"Failed to create LockScope\n");
+            return;
+          }
+          
+          if (state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call SetCodec\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          codec = playbackCodec;
+          
+          m_wfx.nSamplesPerSec = Codec::getSampleRate(codec, returnCode);
+          if (returnCode)
+            return;
+            
+          m_wfx.nAvgBytesPerSec = m_wfx.nSamplesPerSec * m_wfx.wBitsPerSample / 8;
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void DeviceSpeakerLINUX::setListener(DeviceSpeakerListenerProxy& _listener,
+                                             ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::setListener");
+            
+          if (!_listener)
+          {
+            //not accepting NULL listener
+            UAPI_WARN(fn,"Listener cannot be NULL\n");
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          
+          DeviceSpeakerLINUXProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          SetDeviceSpeakerListenerTask* task = new SetDeviceSpeakerListenerTask(proxy, _listener);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create SetDeviceSpeakerListenerTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            delete task;
+            UAPI_ERROR(fn,"Failed to enqueue SetDeviceSpeakerListenerTask\n");
+            return;
+          }
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void DeviceSpeakerLINUX::runSetDeviceSpeakerListenerTask(DeviceSpeakerListenerProxy& _listener)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::runSetDeviceSpeakerListenerTask");
+          
+          listener = _listener;
+        }
+        
+        void DeviceSpeakerLINUX::shutdown(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::shutdown");
+            
+          stop(returnCode);
+        }
+        
+        DeviceSpeakerLINUX::~DeviceSpeakerLINUX()
+        {
+          UAPI_FN_NAME("DeviceSpeakerLINUX::~DeviceSpeakerLINUX");
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+          if (m_hwo != 0)
+          {
+            //Stop was not called, do our best to cleanup.
+            waveOutReset(m_hwo);
+            waveOutClose(m_hwo);
+          }
+          
+          instance = 0;
+        }
+        
+        void DeviceSpeakerLINUX::start(AudioStreamProxy& audio, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::start");
+            
+          ReturnCode::Type dummy;
+          
+          if (workerQueue == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          if (!audio)
+          {
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          
+          audioStream = (AudioStreamImplProxy&) audio;
+          
+          //Flag this AudioStreamImpl as being locked. This means that this audio cannot be
+          //passed to other modules.
+          audioStream->lock(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Cannot lock the audio stream: %s\n", ReturnCode::toString(returnCode));
+            return;
+          }
+          
+          DeviceSpeakerLINUXProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            cleanupAudioStreamProxy(dummy);
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          StartPlaybackTask* task = new StartPlaybackTask(proxy);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create StartPlaybackTask\n");
+            cleanupAudioStreamProxy(dummy);
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            delete task;
+            cleanupAudioStreamProxy(dummy);
+            UAPI_ERROR(fn,"Failed to enqueue StartPlaybackTask\n");
+            return;
+          }
+          UAPI_INFO(fn,"enqueue(new StartPlaybackTask)\n");
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void DeviceSpeakerLINUX::runStartPlaybackTask()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::runStartPlaybackTask");
+          
+          if (state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call start\n");
+            sendOnErrorToListener(ReturnCode::INVALID_STATE,true);
+            return;
+          }
+          
+          {
+            //need to protect when we are assigning state (done in WorkerQueue
+            //thread) and when we are calling SetCodec (done in the app
+            //thread).
+            LockScope ls(mutex, returnCode);
+            if (returnCode)
+            {
+              UAPI_WARN(fn,"Failed to create LockScope\n");
+              sendOnErrorToListener(returnCode,false);
+              return;
+            }
+            state = STARTING;
+          }
+          
+          
+          WaveOutHelperStruct* helper = new WaveOutHelperStruct();
+          if (helper == 0)
+          {
+            UAPI_ERROR(fn,"Could not allocated memory for WaveOutHelperStruct\n");
+            sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+            return;
+          }
+          helper->workerQueue = workerQueue;
+          
+          DeviceSpeakerLINUXProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+            delete helper;
+            return;
+          }
+          helper->deviceSpeaker = proxy;
+          
+          MMRESULT mmr;
+          mmr = waveOutOpen(&m_hwo, WAVE_MAPPER, &m_wfx, (DWORD_PTR)__waveOutProc,
+                            (DWORD_PTR) helper, CALLBACK_FUNCTION);
+          if (mmr != MMSYSERR_NOERROR)
+          {
+            UAPI_ERROR(fn,"waveOutOpen failed %d\n", mmr);
+            sendOnErrorToListener(ReturnCode::AUDIO_DRIVER_ERROR,true);
+            delete helper;
+            return;
+          }
+          
+          collectingBuffers = true;
+          firstSent = -1;
+          numBuffers = 0;
+          
+          //initialize the memory of the WAVEHDR.
+          ZeroMemory(m_whs, NUM_BUFFERS_QUEUED*sizeof(WAVEHDR));
+          
+          //work will continue in RunDeviceSpeakerStartedTask which is triggered
+          //after we have received the WOM_OPEN event.
+        }
+        
+        void DeviceSpeakerLINUX::runDeviceSpeakerStartedTask()
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::runDeviceSpeakerStartedTask");
+          
+          if (state != STARTING)
+          {
+            //someone called stop.
+            UAPI_INFO(fn,"Start recording was aborted, current state is %d\n", state);
+            return;
+          }
+          
+          state = PLAYING;
+          
+          //send callback to the application
+          if (listener)
+            listener->onStarted();
+            
+          //time to read data from the audio stream.
+          readBuffersFromStream();
+        }
+        
+        void DeviceSpeakerLINUX::runBufferPlayedTask(WAVEHDR* pWaveHdr)
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::runBufferPlayedTask");
+          
+          //FROM MSDN WEB SITE: The WOM_DONE message is sent to a waveform-audio output
+          //callback function when the given output buffer is being returned to the
+          //application. Buffers are returned to the application when they have been
+          //played, or as the result of a call to the waveOutReset function.
+          
+          //buffer index
+          size_t bufferIndex = pWaveHdr - m_whs;
+          
+          firstSent++;
+          firstSent %= NUM_BUFFERS_QUEUED;
+          numBuffers--;
+          
+          //now that the audio has been played, we can Release the AudioBuffer.
+          AudioBuffer* pAudioBuff = (AudioBuffer*) m_whs[bufferIndex].dwUser;
+          
+          //the play can end in two different ways. When ended, we have to close the
+          //waveOut.
+          // 1) all the samples were played
+          //  or
+          // 2) Stop() was called and all the samples were returned.
+          // or
+          // 3) all the samples were read and all the samples were returned.
+          if (/* 1) */ (m_whs[bufferIndex].dwFlags& WHDR_ENDLOOP) ||
+                       /* 2) */ (state == STOPPING && numBuffers == 0) ||
+                       /* 3) */ (state == DRAINING && numBuffers == 0))
+          {
+            // last buffer was played (WHDR_ENDLOOP)
+            // now close the audio player.
+            MMRESULT mmr = waveOutUnprepareHeader(m_hwo, &(m_whs[bufferIndex]), sizeof(WAVEHDR));
+            if (mmr != MMSYSERR_NOERROR)
+            {
+              //for now, not considered as a fatal error.
+              UAPI_WARN(fn,"waveOutUnprepareHeader failed %d\n", mmr);
+            }
+            
+            closeWaveOut(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"closeWaveOut returned an error\n");
+              sendOnErrorToListener(returnCode,true);
+              return;
+            }
+          }
+          else
+          {
+            //we are not stopping, we need to read more data.
+            MMRESULT mmr = waveOutUnprepareHeader(m_hwo, &(m_whs[bufferIndex]), sizeof(WAVEHDR));
+            if (mmr != MMSYSERR_NOERROR)
+            {
+              UAPI_WARN(fn,"waveOutUnprepareHeader failed %d\n", mmr);
+            }
+            readBuffersFromStream();
+          }
+          
+          //release the buffer
+          if (audioStream)
+          {
+            audioStream->release(pAudioBuff, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"Failed to release audio buffer %p\n", pAudioBuff);
+              sendOnErrorToListener(returnCode,true);
+              return;
+            }
+          }
+        }
+        
+        void DeviceSpeakerLINUX::runReadAudioBufferTask()
+        {
+          readBuffersFromStream();
+        }
+        
+        void DeviceSpeakerLINUX::readBuffersFromStream()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::readBuffersFromStream");
+          
+          //stop reading buffers if the stop is in progress.
+          if (state != PLAYING)
+          {
+            UAPI_INFO(fn,"Not reading a new buffer, state is %d\n", state);
+            return;
+          }
+          
+          //we try to fill up to NUM_BUFFERS_QUEUED at a time.
+          while (numBuffers < NUM_BUFFERS_QUEUED && returnCode != ReturnCode::END_OF_STREAM)
+          {
+            //read from the stream. If 0 is returned, it means that no buffers are
+            //ready.
+            AudioBuffer* buffer = audioStream->read(returnCode);
+            if (buffer)
+            {
+              if (buffer->size == 0)
+              {
+                audioStream->release(buffer, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to release audio buffer %p\n", buffer);
+                  sendOnErrorToListener(returnCode,true);
+                  return;
+                }
+                continue;
+              }
+              
+              int iBuf;
+              if (!numBuffers)
+              {
+                iBuf = 0;
+                firstSent = 0;
+              }
+              else
+              {
+                iBuf = firstSent + numBuffers;
+                iBuf %= NUM_BUFFERS_QUEUED;
+              }
+              ++numBuffers;
+              
+              //
+              //NOTE: buffer will get Released once the buffer has been played.
+              //By doing this, we will avoid having to copy all the samples.
+              //
+              prepareBuffer(buffer, iBuf, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"Failed to prepare buffer index %d\n", iBuf);
+                sendOnErrorToListener(returnCode,true);
+                return;
+              }
+              
+              if (!collectingBuffers)
+              {
+                writeWaveOutBuffer(iBuf, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to write buffer index %d\n", iBuf);
+                  sendOnErrorToListener(returnCode,true);
+                  return;
+                }
+              }
+              else if ((numBuffers >= BUFFERS_TO_COLLECT))
+              {
+                collectingBuffers = false;
+                for (int i = 0; i < numBuffers; i++)
+                {
+                  writeWaveOutBuffer(i, returnCode);
+                  if (returnCode != ReturnCode::SUCCESS)
+                  {
+                    UAPI_ERROR(fn,"Failed to write buffer index %d\n", i);
+                    sendOnErrorToListener(returnCode,true);
+                    return;
+                  }
+                }
+              }
+            }
+            else
+            {
+              if (returnCode == ReturnCode::END_OF_STREAM)
+              {
+                //nothing else to read.
+                if (collectingBuffers && numBuffers < BUFFERS_TO_COLLECT)
+                {
+                  //we were collecting buffer, make sure we submit them.
+                  collectingBuffers = false;
+                  for (int i = 0; i < numBuffers; i++)
+                  {
+                    writeWaveOutBuffer(i, returnCode);
+                    if (returnCode != ReturnCode::SUCCESS)
+                    {
+                      UAPI_ERROR(fn,"Failed to write buffer index %d\n", i);
+                      sendOnErrorToListener(returnCode,true);
+                      return;
+                    }
+                  }
+                }
+                //all the samples were read, waiting for them to be played.
+                state = DRAINING;
+                
+                if (numBuffers == 0)
+                {
+                  //nothing is queued for playback, we must stop now.
+                  closeWaveOut(returnCode);
+                  if (returnCode != ReturnCode::SUCCESS)
+                  {
+                    UAPI_ERROR(fn,"closeWaveOut returned an error\n");
+                    sendOnErrorToListener(returnCode,true);
+                    return;
+                  }
+                }
+              }
+              else if (returnCode == ReturnCode::PENDING_DATA)
+              {
+                //the last read failed, this means that no data is ready. If we
+                //were able to read at least one buffer then we are ok. If nothing
+                //could be read, or that we are collecting buffer, then we have to
+                //register a callback to read later.
+                if (numBuffers == 0 || collectingBuffers)
+                {
+                  //we were not able to read a single buffer. We will have to try
+                  //again a little later (20 ms).
+                  
+                  ReturnCode::Type returnCode;
+                  DeviceSpeakerLINUXProxy proxy(rootProxy);
+                  if (!proxy)
+                  {
+                    UAPI_ERROR(fn,"Could not create proxy\n");
+                    sendOnErrorToListener(ReturnCode::INVALID_STATE,true);
+                    return;
+                  }
+                  ReadAudioBufferTask* task = new ReadAudioBufferTask(proxy, 20);
+                  if (!task)
+                  {
+                    UAPI_ERROR(fn,"Could not create ReadAudioBufferTask\n");
+                    sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+                    return;
+                  }
+                  workerQueue->enqueue(task, returnCode);
+                  if (returnCode != ReturnCode::SUCCESS)
+                  {
+                    UAPI_ERROR(fn,"could not enqueue ReadAudioBufferTask %s\n", ReturnCode::toString(returnCode));
+                    sendOnErrorToListener(returnCode,true);
+                    delete task;
+                    return;
+                  }
+                  UAPI_INFO(fn,"enqueue(new ReadAudioBufferTask)\n");
+                }
+              }
+              else
+              {
+                UAPI_ERROR(fn,"AudioStream::read returned an unexpected error %s\n", ReturnCode::toString(returnCode));
+                sendOnErrorToListener(returnCode,true);
+                return;
+              }
+              break; //get out of the loop
+            }
+          }//while
+        }
+        
+        void DeviceSpeakerLINUX::stop(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::stop");
+            
+          DeviceSpeakerLINUXProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          StopPlaybackTask* task = new StopPlaybackTask(proxy);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create StopPlaybackTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to enqueue StopPlaybackTask\n");
+            delete task;
+            return;
+          }
+          UAPI_INFO(fn,"enqueue(new StopPlaybackTask)\n");
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void DeviceSpeakerLINUX::runStopPlaybackTask()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::runStopPlaybackTask");
+          
+          //check the state.
+          if (state == IDLE)
+          {
+            //already stopped. Do nothing.
+            UAPI_INFO(fn,"DeviceSpeaker is already stopped.\n");
+            return;
+          }
+          else if (state == STOPPING)
+          {
+            //stop called multiple times, do nothing
+            UAPI_WARN(fn,"stop was already called.\n");
+            return;
+          }
+          
+          state = STOPPING;
+          
+          if (m_hwo == 0)
+          {
+            //already stopped, all the buffers were played and callbacks were called.
+            UAPI_INFO(fn,"m_hwo is null, stop was already called for DeviceSpeakerLINUX\n");
+            return;
+          }
+          
+          //we now call waveOutReset which will cause the audio driver to return all
+          //the queued buffers. Only do so if we have queue buffers.
+          if (numBuffers != 0 && collectingBuffers == false)
+          {
+            MMRESULT mmr = waveOutReset(m_hwo);
+            if (mmr != MMSYSERR_NOERROR)
+            {
+              UAPI_ERROR(fn,"waveOutReset failed %d\n", mmr);
+              //don't report the error, try to close anyway and hope of the best.
+              closeWaveOut(returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"closeWaveOut returned an error\n");
+                sendOnErrorToListener(returnCode,false);
+                return;
+              }
+            }
+          }
+          else
+          {
+            //now close the audio player.
+            closeWaveOut(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"closeWaveOut returned an error\n");
+              sendOnErrorToListener(returnCode,false);
+              return;
+            }
+          }
+        }
+        
+        
+        void DeviceSpeakerLINUX::runDeviceSpeakerStoppedTask()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::runDeviceSpeakerStoppedTask");
+          
+          //need to protect when we are assigning state (done in WorkerQueue
+          //thread) and when we are calling SetCodec (done in the app
+          //thread).
+          {
+            LockScope ls(mutex, returnCode);
+            if (returnCode)
+            {
+              UAPI_WARN(fn,"Failed to create LockScope\n");
+              sendOnErrorToListener(returnCode,true);
+              return;
+            }
+            state = IDLE;
+          }
+          
+          sendOnStoppedToListener();
+        }
+        
+        void DeviceSpeakerLINUX::prepareBuffer(AudioBuffer* pBuf, int iBuf, ReturnCode::Type & returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::prepareBuffer");
+            
+          if (codec == Codec::PCM_16BIT_8K ||
+              codec == Codec::PCM_16BIT_11K ||
+              codec == Codec::PCM_16BIT_22K)
+          {
+            m_whs[iBuf].lpData = (LPSTR) pBuf->buffer;
+            m_whs[iBuf].dwBufferLength = pBuf->size;
+            
+            //to avoid copying memory, we save the address of pBuf. We will call
+            //Release on it once it's been played.
+            m_whs[iBuf].dwUser = (DWORD_PTR)pBuf;
+          }
+          else
+          {
+            //TODO check all the codecs
+            assert(false);
+          }
+          
+          //first buffer
+          if (collectingBuffers && numBuffers == 0)
+            m_whs[iBuf].dwFlags = WHDR_BEGINLOOP;
+            
+          //last buffer
+          if (pBuf->isLastBuffer)
+            m_whs[iBuf].dwFlags = WHDR_ENDLOOP;
+            
+          MMRESULT  mmr = waveOutPrepareHeader(m_hwo, &(m_whs[iBuf]), sizeof(WAVEHDR));
+          if (mmr != MMSYSERR_NOERROR)
+          {
+            UAPI_ERROR(fn,"waveOutPrepareHeader failed %d\n", mmr);
+            returnCode = ReturnCode::AUDIO_DRIVER_ERROR;
+            return;
+          }
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void DeviceSpeakerLINUX::closeWaveOut(ReturnCode::Type & returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::closeWaveOut");
+            
+          if (m_hwo == 0)
+          {
+            returnCode = ReturnCode::SUCCESS;
+            return;
+          }
+          
+          MMRESULT mmr = waveOutClose(m_hwo);
+          if (mmr != MMSYSERR_NOERROR)
+          {
+            UAPI_ERROR(fn,"waveOutClose failed %d\n", mmr);
+            m_hwo = 0;
+            returnCode = ReturnCode::AUDIO_DRIVER_ERROR;
+            return;
+          }
+          WaitForSingleObject(m_hwo, INFINITE);
+          m_hwo = 0;
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void DeviceSpeakerLINUX::writeWaveOutBuffer(unsigned int uiIndex, ReturnCode::Type & returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::writeWaveOutBuffer");
+            
+          MMRESULT mmr = waveOutWrite(m_hwo, &(m_whs[uiIndex]), sizeof(WAVEHDR));
+          if (mmr != MMSYSERR_NOERROR)
+          {
+            UAPI_ERROR(fn,"waveOutWrite failed %d\n", mmr);
+            returnCode = ReturnCode::AUDIO_DRIVER_ERROR;
+            return;
+          }
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        SetDeviceSpeakerListenerTask::SetDeviceSpeakerListenerTask(DeviceSpeakerLINUXProxy& _deviceSpeaker,
+            DeviceSpeakerListenerProxy& _listener):
+            Task("SetDeviceSpeakerListenerTask"),
+            deviceSpeaker(_deviceSpeaker),
+            listener(_listener)
+        {}
+        
+        void SetDeviceSpeakerListenerTask::run()
+        {
+          deviceSpeaker->runSetDeviceSpeakerListenerTask(listener);
+        }
+        
+        StartPlaybackTask::StartPlaybackTask(DeviceSpeakerLINUXProxy& _deviceSpeaker):
+            Task("StartPlaybackTask"),
+            deviceSpeaker(_deviceSpeaker)
+        {}
+        
+        void StartPlaybackTask::run()
+        {
+          deviceSpeaker->runStartPlaybackTask();
+        }
+        
+        DeviceSpeakerStartedTask::DeviceSpeakerStartedTask(DeviceSpeakerLINUXProxy& _deviceSpeaker):
+            Task("DeviceSpeakerStartedTask"),
+            deviceSpeaker(_deviceSpeaker)
+        {}
+        
+        void DeviceSpeakerStartedTask::run()
+        {
+          deviceSpeaker->runDeviceSpeakerStartedTask();
+        }
+        
+        ReadAudioBufferTask::ReadAudioBufferTask(DeviceSpeakerLINUXProxy& _deviceSpeaker, UINT32 timeout):
+            ScheduledTask(timeout, "ReadAudioBufferTask"),
+            deviceSpeaker(_deviceSpeaker)
+        {}
+        
+        void ReadAudioBufferTask::run()
+        {
+          deviceSpeaker->runReadAudioBufferTask();
+        }
+        
+        BufferPlayedTask::BufferPlayedTask(DeviceSpeakerLINUXProxy& _deviceSpeaker, WAVEHDR* _waveHdr):
+            Task("BufferPlayedTask"),
+            deviceSpeaker(_deviceSpeaker),
+            waveHdr(_waveHdr)
+        {}
+        
+        void BufferPlayedTask::run()
+        {
+          deviceSpeaker->runBufferPlayedTask(waveHdr);
+        }
+        
+        StopPlaybackTask::StopPlaybackTask(DeviceSpeakerLINUXProxy& _deviceSpeaker):
+            Task("StopPlaybackTask"),
+            deviceSpeaker(_deviceSpeaker)
+        {}
+        
+        void StopPlaybackTask::run()
+        {
+          deviceSpeaker->runStopPlaybackTask();
+        }
+        
+        
+        DeviceSpeakerStoppedTask::DeviceSpeakerStoppedTask(DeviceSpeakerLINUXProxy& _deviceSpeaker):
+            Task("DeviceSpeakerStoppedTask"),
+            deviceSpeaker(_deviceSpeaker)
+        {}
+        
+        void DeviceSpeakerStoppedTask::run()
+        {
+          deviceSpeaker->runDeviceSpeakerStoppedTask();
+        }
+        
+        void DeviceSpeakerLINUX::sendOnErrorToListener(ReturnCode::Type error, bool stopPlayback)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::sendOnErrorToListener");
+            
+          ReturnCode::Type rc;
+          cleanupAudioStreamProxy(rc);
+          //don't care about rc, we are already sending an error.
+          
+          //try our best to perform cleanup.
+          if ((state == PLAYING || state == STARTING)&& stopPlayback)
+          {
+            runStopPlaybackTask();
+          }
+          
+          if (listener)
+            listener->onError(error);
+        }
+        
+        void DeviceSpeakerLINUX::sendOnStoppedToListener()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::sendOnStoppedToListener");
+          
+          cleanupAudioStreamProxy(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            if (listener)
+              listener->onError(returnCode);
+          }
+          else
+          {
+            //normal case
+            if (listener)
+              listener->onStopped();
+          }
+        }
+        
+        void DeviceSpeakerLINUX::cleanupAudioStreamProxy(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("DeviceSpeakerLINUX::cleanupAudioStreamProxy");
+            
+          if (audioStream)
+          {
+            audioStream->unlock();
+            
+            //if we are collecting buffer, it means that they were not yet submitted to
+            //waveOutWrite. In this case we have to make sure we release the memory.
+            if (collectingBuffers)
+            {
+              for (int i = 0; i < numBuffers; i++)
+              {
+                AudioBuffer* pAudioBuff = (AudioBuffer*) m_whs[i].dwUser;
+                audioStream->release(pAudioBuff, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                  UAPI_ERROR(fn,"Failed to release audio buffer %p\n", pAudioBuff);
+              }
+            }
+            
+            audioStream = AudioStreamImplProxy();
+          }
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        SmartProxy::Root* DeviceSpeakerLINUX::getRoot()
+        {
+          return rootProxy;
+        }
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/audio/linux/source/MicrophoneLINUX.cpp b/uapi/cpp/audio/linux/source/MicrophoneLINUX.cpp
new file mode 100644
index 0000000..741316f
--- /dev/null
+++ b/uapi/cpp/audio/linux/source/MicrophoneLINUX.cpp
@@ -0,0 +1,966 @@
+/*---------------------------------------------------------------------------*
+ *  MicrophoneLINUX.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/select.h>
+
+#include "MicrophoneLINUX.h"
+#include "MicrophoneListener.h"
+#include "WorkerQueueFactory.h"
+#include "WorkerQueue.h"
+#include "CodecHelper.h"
+#include "AudioStreamImpl.h"
+#include "AudioQueue.h"
+#include "LoggerImpl.h"
+#include "Codec.h"
+#include "System.h"
+#include "Runnable.h"
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      Microphone* Microphone::instance = 0;
+      
+      MicrophoneProxy Microphone::getInstance(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("Microphone::getInstance");
+          
+        if (impl::MicrophoneLINUX::componentInitializer.returnCode)
+        {
+          returnCode = impl::MicrophoneLINUX::componentInitializer.returnCode;
+          return MicrophoneProxy();
+        }
+        //we have to protect the construction of "instance". Make sure we don't have
+        //multiple threads calling getInstance() while "instance" is equal to 0.
+        LockScope lock(impl::MicrophoneLINUX::mutex, returnCode);
+
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to create LockScope of MicrophoneLINUX::mutex\n");
+          return MicrophoneProxy();
+        }
+        //it's now safe to check if instance == 0
+        if (instance == 0)
+        {
+          instance = new impl::MicrophoneLINUX(returnCode);
+          if (returnCode)
+          {
+            delete instance;
+            instance = 0;
+            return MicrophoneProxy();
+          }
+          if (instance == 0)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return MicrophoneProxy();
+          }
+          impl::MicrophoneLINUX* instanceImpl = (impl::MicrophoneLINUX*) instance;
+          MicrophoneProxy result(instanceImpl);
+          if (!result)
+          {
+            delete instance;
+            instance = 0;
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return MicrophoneProxy();
+          }
+          instanceImpl->rootProxy = result.getRoot();
+          
+          //register for auto cleanup.
+          System* system = System::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            delete instance;
+            instance = 0;
+            return MicrophoneProxy();
+          }
+          
+          //has to be called after rootProxy is assigned.
+          system->add(instance, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            delete instance;
+            instance = 0;
+            return MicrophoneProxy();
+          }
+          return result;
+        }
+        impl::MicrophoneLINUX* instanceImpl = (impl::MicrophoneLINUX*) instance;
+        return MicrophoneProxy(instanceImpl->rootProxy);
+      }
+
+
+
+      namespace impl
+      {
+        DEFINE_SMARTPROXY(impl, MicrophoneLINUXProxy, MicrophoneProxy, MicrophoneLINUX);
+        
+        Mutex* MicrophoneLINUX::mutex = 0;
+        MicrophoneLINUX::ComponentInitializer MicrophoneLINUX::componentInitializer;
+        
+        MicrophoneLINUX::ComponentInitializer::ComponentInitializer()
+        {
+          mutex = Mutex::create(false, returnCode);
+          if (returnCode)
+          {
+            fprintf(stderr, "Could not create MicrophoneLINUX::mutex\n");
+            return;
+          }
+        }
+
+        struct WaveInHelperStruct
+        {
+          WorkerQueue* workerQueue;
+          MicrophoneLINUXProxy microphone;
+        };
+
+        MicrophoneLINUX::ComponentInitializer::~ComponentInitializer()
+        {
+          delete mutex;
+          returnCode = ReturnCode::UNKNOWN;
+        }
+
+
+        
+        void CALLBACK __waveInProc(HWAVEIN, AUDIOIN_MSG uMsg, DWORD_PTR dwInstance,
+                                   DWORD_PTR dwParam1, DWORD_PTR)
+        {
+          ReturnCode::Type returnCode;
+          
+          WaveInHelperStruct* helper = ((WaveInHelperStruct*) dwInstance);
+          MicrophoneLINUXProxy& microphone  = helper->microphone;
+
+          UAPI_FN_SCOPE("Microphone::__waveInProc");
+
+          //NOTE: we are not allowed to lock any mutex in this functions. This is
+          //part of the contract when using the waveIn api.
+
+          WorkerQueue* workerQueue = helper->workerQueue;
+
+          switch (uMsg)
+          {
+            case AUDIOIN_MSG_OPEN:
+              UAPI_INFO(fn,"AUDIOIN_MSG_OPEN\n");
+              break;
+
+            case AUDIOIN_MSG_START:
+            {
+              UAPI_INFO(fn,"AUDIOIN_MSG_START\n");
+              MicrophoneStartedTask* task = new MicrophoneStartedTask(microphone);
+              if (!task)
+              {
+                microphone->m_state = MicrophoneLINUX::ERROR;
+                UAPI_ERROR(fn,"Could not create MicrophoneStartedTask\n");
+                microphone->sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+                delete helper;
+                return;
+              }
+              workerQueue->enqueue(task, returnCode);
+              if (returnCode)
+              {
+                microphone->m_state = MicrophoneLINUX::ERROR;
+                UAPI_ERROR(fn,"Failed to enqueue MicrophoneStartedTask: %d\n",
+                           ReturnCode::Type(returnCode));
+                microphone->sendOnErrorToListener(returnCode,true);
+                delete helper;
+                delete task;
+                return;
+              }
+              UAPI_INFO(fn,"enqueue(new MicrophoneStartedTask)\n");
+              break;
+            }
+
+            case AUDIOIN_MSG_DATA:
+              UAPI_INFO(fn,"AUDIOIN_MSG_DATA\n");
+// Rather than put the data in to a task and then into a worker queue, it seems better
+// to just put it into the audio queue directly. The only danger will be doing more in
+// the callback, but I don't believe that will be an issue. SteveR
+// I have left the old code in so that it can be easily restored if needed.
+// It should be deleted once this is in production. SteveR
+              microphone->runBufferRecordedTask ( (WAVEHDR*) dwParam1);
+              break;
+
+            case AUDIOIN_MSG_STOP:
+              UAPI_INFO(fn,"AUDIOIN_MSG_STOP\n");
+              break;
+
+            case AUDIOIN_MSG_CLOSE:
+            {
+              UAPI_INFO(fn,"AUDIOIN_MSG_CLOSE\n");
+              MicrophoneStoppedTask* task = new MicrophoneStoppedTask(microphone);
+              if (!task)
+              {
+                microphone->m_state = MicrophoneLINUX::ERROR;
+                UAPI_ERROR(fn,"Could not create MicrophoneStoppedTask\n");
+                microphone->sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+                delete helper;
+                return;
+              }
+              workerQueue->enqueue(task, returnCode);
+              if (returnCode)
+              {
+                UAPI_ERROR(fn,"Failed to enqueue MicrophoneStoppedTask: %d\n", ReturnCode::Type(returnCode));
+                microphone->m_state = MicrophoneLINUX::ERROR;
+                microphone->sendOnErrorToListener(returnCode,true);
+                delete helper;
+                delete task;
+                return;
+              }
+              UAPI_INFO(fn,"enqueue(new MicrophoneStoppedTask)\n");
+              delete helper;
+              break;
+            }
+
+            default:
+              UAPI_ERROR(fn,"Invalid audioin message %d\n", uMsg);
+              break;
+          }
+        }
+
+
+
+        MicrophoneLINUX::MicrophoneLINUX(ReturnCode::Type& returnCode):
+            m_pWorkerQueue(0),
+            m_codec(Codec::PCM_16BIT_11K),
+            m_pAudioQueue(0),
+            m_hwi(0),
+            m_nSamplesPerSec(0),
+            m_state(IDLE),
+            rootProxy(0)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::MicrophoneLINUX");
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+          m_nSamplesPerSec = Codec::getSampleRate(m_codec, returnCode);
+          if (returnCode)
+            return;
+          init(returnCode);
+        }
+
+
+
+        void MicrophoneLINUX::setCodec(Codec::Type recordingCodec, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::setCodec");
+   
+          //need to protect when we are assigning m_state (done in WorkerQueue
+          //thread) and when we are calling SetCodec (done in the app
+          //thread).
+          LockScope ls(mutex, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to create LockScope\n");
+            return;
+          }
+
+          if (m_state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call setCodec\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          m_codec = recordingCodec;
+          {
+            ReturnCode::Type rc;
+            m_nSamplesPerSec = Codec::getSampleRate(m_codec, rc);
+            if (rc)
+            {
+              returnCode = rc;
+              return;
+            }
+          }
+          //NOTE: we don't call delete m_pAudioQueue. This class is ref counted.
+          //Instead, we call Release on it and once no one is using the object, it
+          //will get released.
+          m_pAudioQueue->removeRef(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not release ref count on AudioQueue\n");
+            return;
+          }
+          m_pAudioQueue = 0;
+          m_pAudioQueue = AudioQueue::create(m_codec, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            m_pAudioQueue = 0;
+            UAPI_ERROR(fn,"Could not create AudioQueue\n");
+            return;
+          }
+          returnCode = ReturnCode::SUCCESS;
+        }
+
+
+
+        void MicrophoneLINUX::setListener(AudioSourceListenerProxy& _listener,
+                                          ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::setListener");
+
+          if (!_listener)
+          {
+            //not accepting NULL listener
+            UAPI_WARN(fn,"Listener cannot be NULL\n");
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          MicrophoneLINUXProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          SetMicrophoneListenerTask* task = new SetMicrophoneListenerTask(proxy, _listener);
+
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create SetMicrophoneListenerTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          m_pWorkerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            delete task;
+            UAPI_ERROR(fn,"Failed to enqueue SetMicrophoneListenerTask\n");
+            return;
+          }
+          returnCode = ReturnCode::SUCCESS;
+        }
+
+
+
+        void MicrophoneLINUX::runSetMicrophoneListenerTask(AudioSourceListenerProxy& _listener)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::runSetMicrophoneListenerTask");
+
+          listener = _listener;
+        }
+
+
+
+        void MicrophoneLINUX::shutdown(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::shutdown");
+
+          stop(returnCode);
+        }
+
+
+
+        void MicrophoneLINUX::init(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::init");
+            
+          m_pAudioQueue = AudioQueue::create(m_codec, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create AudioQueue\n");
+            return;
+          }
+          WorkerQueueFactory* workerFactory = WorkerQueueFactory::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue factory\n");
+            return;
+          }
+          m_pWorkerQueue = workerFactory->getWorkerQueue(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue\n");
+            return;
+          }
+          returnCode = ReturnCode::SUCCESS;
+        }
+
+
+
+        MicrophoneLINUX::~MicrophoneLINUX()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MicrophoneLINUX::~MicrophoneLINUX");
+          UAPI_TRACE(fn,"this=%p\n", this);
+
+          {
+            LockScope ls(mutex, returnCode);
+
+            if (returnCode)
+            {
+              UAPI_ERROR(fn,"Failed to create LockScope\n");
+            }
+            if ( ( m_state != IDLE ) && ( m_state != ERROR_STOPPED ) )
+              UAPI_WARN(fn,"Microphone Did Not Shut Down Cleanly\n");
+          }
+          if (m_pAudioQueue != 0)
+          {
+            //NOTE: we don't call delete m_pAudioQueue. This class is ref counted.
+            //Instead, we call Release on it and once no one is using the object, it
+            //will get released. The object is created by the MicrophoneLINUX class, but
+            //it is shared with the AudioStreamImpl class.
+            ReturnCode::Type rc;
+            m_pAudioQueue->removeRef(rc);
+            if (rc != ReturnCode::SUCCESS)
+              UAPI_ERROR(fn,"Could not release ref count on AudioQueue\n");
+          }
+          if (m_hwi != 0)
+          {
+            //Stop was not called or playback did not complete normally, do our best to
+            //cleanup.
+            LHS_AUDIOIN_ERROR lhsErr;
+
+            lhsErr = lhs_audioinStop(m_hwi);
+            if (lhsErr != LHS_AUDIOIN_OK)
+            {
+              UAPI_ERROR(fn,"lhs_audioinStop failed %ld\n", lhsErr);
+            }
+            lhsErr = lhs_audioinClose(&m_hwi);
+            if (lhsErr != LHS_AUDIOIN_OK)
+            {
+              UAPI_ERROR(fn,"lhs_audioinClose failed %ld\n", lhsErr);
+            }
+            m_hwi = 0;
+          }
+          instance = 0;
+        }
+
+
+
+        void MicrophoneLINUX::start(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::start");
+            
+          if (m_pAudioQueue == 0 || m_pWorkerQueue == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          MicrophoneLINUXProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          StartMicrophoneTask* task = new StartMicrophoneTask(proxy);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create StartMicrophoneTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          m_pWorkerQueue->enqueue(task, returnCode);
+          if (returnCode)
+          {
+            UAPI_ERROR(fn,"Could not enqueue StartMicrophoneTask\n");
+            delete task;
+            return;
+          }
+          UAPI_INFO(fn,"enqueue(new StartMicrophoneTask)\n");
+          returnCode = ReturnCode::SUCCESS;
+        }
+
+
+
+        void MicrophoneLINUX::runStartMicrophoneTask()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MicrophoneLINUX::runStartMicrophoneTask");
+
+          LockScope ls(mutex, returnCode);
+          if (returnCode)
+          {
+            m_state = ERROR;
+            UAPI_ERROR(fn,"Failed to create LockScope\n");
+            sendOnErrorToListener(returnCode,true);
+            return;
+          }
+          if (m_state != IDLE)
+          {
+            UAPI_WARN(fn,"Must be in IDLE state to call start\n");
+            sendOnErrorToListener(ReturnCode::INVALID_STATE,true);
+            return;
+          }
+          m_state = STARTING;
+          LHS_AUDIOIN_ERROR lhsErr;
+          //if everything is as expected, helper gets deleted when we get the WIM_CLOSE
+          //message back.
+          MicrophoneProxy microphone = Microphone::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            m_state = ERROR;
+            UAPI_ERROR(fn,"Could not get an instance of the microphone\n");
+            sendOnErrorToListener(ReturnCode::INVALID_STATE,true);
+            return;
+          }
+          WaveInHelperStruct* helper = new WaveInHelperStruct();
+          if (helper == 0)
+          {
+            m_state = ERROR;
+            UAPI_ERROR(fn,"Could not allocated memory for WaveInHelperStruct\n");
+            sendOnErrorToListener(ReturnCode::OUT_OF_MEMORY,true);
+            return;
+          }
+          helper->workerQueue = m_pWorkerQueue;
+          MicrophoneLINUXProxy proxy(microphone);
+          helper->microphone = proxy;
+          lhsErr = lhs_audioinOpenCallback(WAVE_MAPPER, m_nSamplesPerSec, CodecHelper::GetPreferredBufferSize(m_codec) / sizeof(audioinSample), __waveInProc, helper, &m_hwi);
+          if (lhsErr != LHS_AUDIOIN_OK)
+          {
+            m_state = ERROR;
+            UAPI_ERROR(fn,"lhs_audioinOpenCallback failed %ld\n", lhsErr);
+            sendOnErrorToListener(ReturnCode::AUDIO_DRIVER_ERROR,true);
+            delete helper;
+            return;
+          }
+          lhsErr = lhs_audioinStart(m_hwi);
+          if (lhsErr != LHS_AUDIOIN_OK)
+          {
+            m_state = ERROR;
+            UAPI_ERROR(fn,"lhs_audioinStart failed %ld\n", lhsErr);
+            sendOnErrorToListener(ReturnCode::AUDIO_DRIVER_ERROR,true);
+            delete helper;
+            return;
+          }
+        }
+
+
+
+        void MicrophoneLINUX::runMicrophoneStartedTask()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MicrophoneLINUX::runMicrophoneStartedTask");
+
+          {
+            LockScope ls(mutex, returnCode);
+            if (returnCode)
+            {
+              m_state = ERROR;
+              UAPI_ERROR(fn,"Failed to create LockScope\n");
+              sendOnErrorToListener(returnCode,true);
+              return;
+            }
+            if (m_state != STARTING)
+            {
+// No error state here, this seems recoverable
+              UAPI_WARN(fn,"MicrophoneLINUX::Start was already called, state is %d.\n", m_state);
+              return;
+            }
+            m_state = RECORDING;
+          }
+          //recording was successfully started! Send callback to the application
+          if (listener)
+            listener->onStarted();
+        }
+
+
+
+        void MicrophoneLINUX::runBufferRecordedTask(WAVEHDR* pwhdr)
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MicrophoneLINUX::runBufferRecordedTask");
+
+          //a buffer was filled.
+          ARRAY_LIMIT nBytesRecorded = (ARRAY_LIMIT) pwhdr->nBytesRecorded;
+          unsigned char* pbData = (unsigned char*)(pwhdr->pData);
+
+          if (nBytesRecorded <= 0)
+            pbData = 0;
+          if (pbData)
+          {
+            m_pAudioQueue->addBuffer(pbData, nBytesRecorded, false, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"Failed to call AddBuffer buffer %p, size %d ret: %s\n", pbData,
+                         nBytesRecorded, ReturnCode::toString(returnCode));
+              m_state = ERROR;
+              sendOnErrorToListener(returnCode,true);
+              return;
+            }
+          }
+#ifdef ANDROID
+// For the ANDROID platform we are no longer allocating these buffers. The correct
+// solution would have the audio in module having a dispose function so that this
+// "knowledge" is not exposed across modules. SteveR
+#else	  
+          free(pwhdr->pData);
+          free(pwhdr);
+#endif
+        }
+
+
+
+        void MicrophoneLINUX::stop(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::stop");
+
+          MicrophoneLINUXProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            m_state = ERROR;
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            sendOnErrorToListener(returnCode,true);
+            return;
+          }
+          StopMicrophoneTask* task = new StopMicrophoneTask(proxy);
+          if (!task)
+          {
+            m_state = ERROR;
+            UAPI_ERROR(fn,"Could not create StartMicrophoneTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            sendOnErrorToListener(returnCode,true);
+            return;
+          }
+          m_pWorkerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            m_state = ERROR;
+            UAPI_ERROR(fn,"Failed to enqueue StopMicrophoneTask\n");
+            delete task;
+            returnCode = ReturnCode::INVALID_STATE;
+            sendOnErrorToListener(returnCode,true);
+            return;
+          }
+          UAPI_INFO(fn,"enqueue(new StopMicrophoneTask)\n");
+
+          returnCode = ReturnCode::SUCCESS;
+        }
+
+
+
+        void MicrophoneLINUX::runStopMicrophoneTask()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MicrophoneLINUX::runStopMicrophoneTask");
+
+          {
+            LockScope ls(mutex, returnCode);
+            if (returnCode)
+            {
+              m_state = ERROR;
+              UAPI_ERROR(fn,"Failed to create LockScope\n");
+              sendOnErrorToListener(returnCode,true);
+              return;
+            }
+            if ( ( m_state == IDLE ) || ( m_state == ERROR_STOPPED ) )
+            {
+              UAPI_WARN(fn,"Microphone is already stopped, state is %d.\n", m_state );
+              return;
+            }
+            else if ( ( m_state == STOPPING )  && ( m_state == ERROR_STOPPING ) )
+            {
+              UAPI_WARN(fn,"Microphone is already being stopped, state is %d.\n", m_state);
+              return;
+            }
+            else if ( ( m_state == STARTING )  || ( m_state == RECORDING ) )
+            {
+              m_state = STOPPING;
+            }
+            else if ( m_state == ERROR )
+            {
+              m_state = ERROR_STOPPING;
+            }
+            else 	// Unknown State
+            {
+              UAPI_ERROR(fn,"Microphone Cannot Stop in Unknown State %d.\n", m_state);
+              return;
+            }
+          }
+          // Submit a buffer with the last buffer flag set to true to mark the end of the audio
+          // stream.  The Windows version does not need to do this since it keeps track of the number
+          // of queued buffers (m_nNumQueuedBuf == 0) so runBufferRecordedTask()
+          // knows when to set the last buffer flag.
+          m_pAudioQueue->addBuffer(0, 0, true, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+// I'm not going into the error state here, since I'm not sure if this is fatal.
+            UAPI_ERROR(fn,"Failed to call AddBuffer buffer on last buffer ret: %s\n", ReturnCode::toString(returnCode));
+            onStopDone();
+            return;
+          }
+          if (m_hwi == NULL)
+          {
+            //already stopped.
+            onStopDone();
+            return;
+          }
+          // The Windows version calls waveInReset() which stops audio, then all
+          // remaining buffers are still returned to application via WIM_DATA messages
+          // and will be processed in runBufferRecordedTask().  For LINUX version,
+          // we simply stop here.
+          LHS_AUDIOIN_ERROR lhsErr = lhs_audioinStop(m_hwi);
+          if (lhsErr != LHS_AUDIOIN_OK)
+          {
+            UAPI_ERROR(fn,"lhs_audioinStop failed %ld\n", lhsErr);
+            //notify the error to the application.
+            if (listener)
+              listener->onError(ReturnCode::AUDIO_DRIVER_ERROR);
+          }
+          // The Windows version closes the audio device via waveInClose() once
+          // the last buffer is processed by runBufferRecordedTask().
+          // For LINUX version, close here after stopping audio.
+          lhsErr = lhs_audioinClose(&m_hwi);
+          if (lhsErr != LHS_AUDIOIN_OK)
+          {
+            UAPI_ERROR(fn,"lhs_audioinClose failed %ld\n", lhsErr);
+            //notify the error to the application.
+             if (listener)
+              listener->onError(ReturnCode::AUDIO_DRIVER_ERROR);
+          }
+          m_hwi = 0;
+        }
+
+
+
+        void MicrophoneLINUX::runMicrophoneStoppedTask()
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::runMicrophoneStoppedTask");
+
+          if ( ( m_state == STOPPING ) || ( m_state == ERROR_STOPPING ) )
+            onStopDone();
+          else
+            UAPI_ERROR(fn,"Cannot Complete Stop In State %d\n", m_state);
+        }
+
+
+
+        void MicrophoneLINUX::sendOnErrorToListener(ReturnCode::Type error, bool stopRecording)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::sendOnErrorToListener");
+          
+          //try our best to perform cleanup.
+          if ( ( m_state == ERROR ) && ( stopRecording == true ) )
+          {
+            runStopMicrophoneTask();
+          }
+          if (listener)
+            listener->onError(error);
+        }
+
+
+
+        AudioStreamProxy MicrophoneLINUX::createAudio(ReturnCode::Type & returnCode)
+        {
+          UAPI_FN_SCOPE("MicrophoneLINUX::createAudio");
+           
+          //need to protect when we are assigning m_state (done in WorkerQueue
+          //thread) and when we are calling SetCodec (done in the app
+          //thread).
+          LockScope ls(mutex, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to create LockScope\n");
+             return AudioStreamProxy();
+          }
+          if ( ( m_state == STOPPING ) || ( m_state == ERROR ) ||
+          ( m_state == ERROR_STOPPING ) || ( m_state == ERROR_STOPPED ) )
+          {
+            UAPI_WARN(fn,"Must not be in state %d to call createAudio\n", m_state);
+            returnCode = ReturnCode::INVALID_STATE;
+            return AudioStreamProxy();
+          }
+          return AudioStreamImpl::create(m_pAudioQueue, returnCode);
+        }
+
+
+
+        void MicrophoneLINUX::onStopDone()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MicrophoneLINUX::onStopDone");
+           
+          {
+            //need to protect when we are assigning m_state (done in WorkerQueue
+            //thread) and when we are calling SetCodec (done in the app
+            //thread).
+            LockScope ls(mutex, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_WARN(fn,"Failed to create LockScope\n");
+              sendOnErrorToListener(returnCode,false);
+              return;
+            }
+            if ( ( m_state != STOPPING ) && ( m_state != ERROR_STOPPING ) )
+            {
+              UAPI_ERROR(fn,"Cannot Complete Stop In State %d\n", m_state);
+              sendOnErrorToListener(returnCode,false);
+              return;
+            }
+            //we want to allow a user to re-use the MicrophoneLINUX object. To do so,
+            //we must create a new AudioQueue for each start() operation. To make sure
+            //we are ready for the next operation, we get rid of the old one here and
+            //we create a new one. NOTE that we do this before we send the callback.
+            if (m_pAudioQueue != 0)
+            {
+              //NOTE: we don't call delete m_pAudioQueue. This class is ref counted.
+              //Instead, we call Release on it and once no one is using the object, it
+              //will get released.
+              m_pAudioQueue->removeRef(returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"Could not release ref count on AudioQueue\n");
+                m_state = ERROR_STOPPED;
+                sendOnErrorToListener(returnCode,false);
+                return;
+              }
+              m_pAudioQueue = AudioQueue::create(m_codec, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"Could not create AudioQueue\n");
+                m_state = ERROR_STOPPED;
+                sendOnErrorToListener(returnCode,false);
+                return;
+              }
+            }
+            if ( m_state == STOPPING )
+              m_state = IDLE;
+            else 
+              m_state = ERROR_STOPPED;
+          }
+#ifdef ANDROID_AUDIODRIVER_WORKAROUND
+          // Wait after we stop the microphone to work around a Q audio device driver bug.
+          // If we put this in the apps instead, there's no risk of forgetting to disable this
+          // workaround once the audio driver works the way it should.
+          const unsigned short delay_ms = 1800;  // 340 for 44.1 kHz, about 1400 for 11.025 kHz, and 1800 for 8 kHz
+          struct timeval sleep_time_struct;
+          sleep_time_struct.tv_sec = 0;
+          sleep_time_struct.tv_usec = delay_ms*1000; // microseconds
+          select(0, NULL, NULL, NULL, &sleep_time_struct);
+#endif
+          if (listener)
+            listener->onStopped();
+        }
+
+
+
+        SmartProxy::Root* MicrophoneLINUX::getRoot()
+        {
+          return rootProxy;
+        }
+
+
+
+        SetMicrophoneListenerTask::SetMicrophoneListenerTask(MicrophoneLINUXProxy& _microphone,
+            AudioSourceListenerProxy& _listener):
+            Task("SetMicrophoneListenerTask"),
+            microphone(_microphone),
+            listener(_listener)
+        {}
+
+
+
+        void SetMicrophoneListenerTask::run()
+        {
+          microphone->runSetMicrophoneListenerTask(listener);
+        }
+
+
+
+        StartMicrophoneTask::StartMicrophoneTask(MicrophoneLINUXProxy& _microphone):
+            Task("StartMicrophoneTask"),
+            microphone(_microphone)
+        {}
+
+
+
+        void StartMicrophoneTask::run()
+        {
+          microphone->runStartMicrophoneTask();
+        }
+
+
+
+        MicrophoneStartedTask::MicrophoneStartedTask(MicrophoneLINUXProxy& _microphone):
+            Task("MicrophoneStartedTask"),
+            microphone(_microphone)
+        {}
+
+
+
+        void MicrophoneStartedTask::run()
+        {
+          microphone->runMicrophoneStartedTask();
+        }
+
+
+
+        BufferRecordedTask::BufferRecordedTask(MicrophoneLINUXProxy& _microphone, WAVEHDR* _pwhdr):
+            Task("BufferRecordedTask"),
+            microphone(_microphone),
+            pwhdr(_pwhdr)
+        {}
+
+
+
+        void BufferRecordedTask::run()
+        {
+          microphone->runBufferRecordedTask(pwhdr);
+          pwhdr = 0;
+        }
+
+
+
+        BufferRecordedTask::~BufferRecordedTask()
+        {
+          if (pwhdr)
+          {
+            //buffer was not consumed, i.e. run was not called.
+            free(pwhdr->pData);
+            free(pwhdr);
+          }
+        }
+
+
+
+        StopMicrophoneTask::StopMicrophoneTask(MicrophoneLINUXProxy& _microphone):
+            Task("StopMicrophoneTask"),
+            microphone(_microphone)
+        {}
+
+
+
+        void StopMicrophoneTask::run()
+        {
+          microphone->runStopMicrophoneTask();
+        }
+
+
+
+        MicrophoneStoppedTask::MicrophoneStoppedTask(MicrophoneLINUXProxy& _microphone):
+            Task("MicrophoneStoppedTask"),
+            microphone(_microphone)
+        {}
+
+
+
+        void MicrophoneStoppedTask::run()
+        {
+          microphone->runMicrophoneStoppedTask();
+        }
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/audio/source/Android.mk b/uapi/cpp/audio/source/Android.mk
new file mode 100644
index 0000000..180a6e2
--- /dev/null
+++ b/uapi/cpp/audio/source/Android.mk
@@ -0,0 +1,55 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	AudioBuffer.cpp \
+	AudioQueue.cpp \
+	AudioSource.cpp \
+	AudioSourceListener.cpp \
+	AudioStream.cpp \
+	AudioStreamImpl.cpp \
+	CodecHelper.cpp \
+	DeviceSpeaker.cpp \
+	DeviceSpeakerListener.cpp \
+	MediaFileReader.cpp \
+	MediaFileReaderImpl.cpp \
+	MediaFileReaderListener.cpp \
+	MediaFileWriter.cpp \
+	MediaFileWriterImpl.cpp \
+	MediaFileWriterListener.cpp \
+	Microphone.cpp \
+	MicrophoneListener.cpp \
+	WavePCMHelper.cpp \
+	
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../api/include \
+	$(LOCAL_PATH)/../../audio/include \
+	$(LOCAL_PATH)/../../audio/linux/include \
+	$(LOCAL_PATH)/../../grammar/include \
+	$(LOCAL_PATH)/../../uapi/include \
+	$(LOCAL_PATH)/../../utilities/include \
+	$(LOCAL_PATH)/../../utilities/linux/include \
+	$(LOCAL_PATH)/../../../java/jniapi/jniapi \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+
+LOCAL_CFLAGS := \
+	-DUAPI_EXPORTS \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_LDLIBS += \
+	-lpthread \
+	-ldl \
+
+LOCAL_MODULE:= libUAPI_audio
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/uapi/cpp/audio/source/AudioBuffer.cpp b/uapi/cpp/audio/source/AudioBuffer.cpp
new file mode 100644
index 0000000..b961451
--- /dev/null
+++ b/uapi/cpp/audio/source/AudioBuffer.cpp
@@ -0,0 +1,75 @@
+/*---------------------------------------------------------------------------*
+ *  AudioBuffer.cpp                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "AudioBuffer.h"
+#include "Logger.h"
+#include <stdlib.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+AudioBuffer* AudioBuffer::create(UINT8 initial_count, UINT32 bufSize, ReturnCode::Type& returnCode)
+{
+  AudioBuffer* result = new AudioBuffer(initial_count, returnCode);
+  if (result == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    delete result;
+    return 0;
+  }
+  
+  result->buffer = (unsigned char*) malloc(sizeof(char) * bufSize);
+  if (result->buffer == 0)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  
+  returnCode = ReturnCode::SUCCESS;
+  return result;
+}
+
+
+AudioBuffer::AudioBuffer(UINT8 initial_count, ReturnCode::Type& returnCode):
+    RefCounted(initial_count, returnCode), buffer(0), size(0), isLastBuffer(false)
+{
+  UAPI_FN_NAME("AudioBuffer::AudioBuffer");
+    
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Failed to create an AudioBuffer\n");
+    return;
+  }
+}
+
+AudioBuffer::~AudioBuffer()
+{
+  free(buffer);
+}
diff --git a/uapi/cpp/audio/source/AudioQueue.cpp b/uapi/cpp/audio/source/AudioQueue.cpp
new file mode 100644
index 0000000..66d054c
--- /dev/null
+++ b/uapi/cpp/audio/source/AudioQueue.cpp
@@ -0,0 +1,537 @@
+/*---------------------------------------------------------------------------*
+ *  AudioQueue.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "AudioQueue.h"
+#include "AudioBuffer.h"
+#include "CodecHelper.h"
+#include "LoggerImpl.h"
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+AudioQueue* AudioQueue::create(Codec::Type codec, ReturnCode::Type& returnCode)
+{
+  AudioQueue* result = new AudioQueue(codec, returnCode);
+  if (result == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    delete result;
+    return 0;
+  }
+  
+  returnCode = ReturnCode::SUCCESS;
+  return result;
+}
+
+AudioQueue::AudioQueue(Codec::Type _codec, ReturnCode::Type& returnCode):
+    RefCounted(returnCode),
+    currentBuffer(0),
+    codec(_codec),
+    readyForGarbageCollection(0)
+{
+  UAPI_FN_SCOPE("AudioQueue::AudioQueue");
+    
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Failed to construct RefCount for AudioQueue\n");
+    return;
+  }
+  
+  mutex = Mutex::create(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Could not create mutex\n");
+    return;
+  }
+}
+
+AudioQueue::~AudioQueue()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("AudioQueue::~AudioQueue");
+    
+  {
+    LockScope ls(mutex, returnCode);
+    if (returnCode)
+      UAPI_WARN(fn,"Failed to create LockScope\n");
+      
+    if (currentBuffer != 0)
+    {
+      currentBuffer->removeRef(returnCode);
+      if (returnCode != ReturnCode::SUCCESS)
+      {
+        UAPI_WARN(fn,"Failed to release ref count on AudioBuffer\n");
+      }
+    }
+      
+    // this will cleanup the queue of audio buffers.
+    clear();
+  }
+  delete mutex;
+}
+
+void AudioQueue::addBuffer(unsigned char* samples, ARRAY_LIMIT length,
+                           bool isLastBuffer, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("AudioQueue::addBuffer");
+    
+  if (isLastBuffer && samples == 0 && length == 0)
+  {
+    LockScope ls(mutex, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to create LockScope\n");
+      return;
+    }
+    // nothing to do, nobody is waiting for audio. The AudioQueue is shared by
+    // the AudioStreamImpl objects. It is created by the Microphone or the
+    // MediaFileReader. To avoid the object being deleted while used by other
+    // modules, we use Ref Counting (AudioQueue : public RefCounted). If the
+    // RefCount is 1, it means that no AudioStreamImpl are using this audio yet. In
+    // those cases, we do not have to save the audio. Simply discard it.
+    if (RefCounted::getCount() <= 1)
+    {
+      returnCode = ReturnCode::SUCCESS;
+      return;
+    }
+    
+    //special case.
+    //On some platform, it's not possible to know when the last buffer is
+    //recorded. We only know after the fact that record is now stopped and at
+    //this point we have no more data to submit. The code that uses the
+    //AudioQueue::read() expect to receive a buffer that contains isLastBuffer
+    //flag set to true. To solve this issue, we enqueue an empty buffer with
+    //the flag set to true.
+    AudioBuffer* lastBuffer;
+    if (currentBuffer != 0)
+    {
+      //currentBuffer was not pushed into the queue. Set its flag to true.
+      lastBuffer = currentBuffer;
+      currentBuffer = 0;
+    }
+    else
+    {
+      lastBuffer = allocateAudioBuffer(returnCode);
+      if (returnCode != ReturnCode::SUCCESS)
+      {
+        UAPI_ERROR(fn,"Could not allocate an AudioBuffer\n");
+        return;
+      }
+    }
+    lastBuffer->isLastBuffer = true;
+    returnCode = ReturnCode::SUCCESS;
+    
+    insertBufferInQueue(lastBuffer, returnCode);
+    return;
+  }
+  
+  if (!samples || length == 0)
+  {
+    //nothing to add
+    returnCode = ReturnCode::SUCCESS;
+    return;
+  }
+  
+  UINT16 bufSize = CodecHelper::GetPreferredBufferSize(codec);
+  if (bufSize <= 0)
+  {
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return;
+  }
+  
+  
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create LockScope\n");
+    return;
+  }
+  // nothing to do, nobody is waiting for audio. The AudioQueue is shared by
+  // the AudioStreamImpl objects. It is created by the Microphone or the
+  // MediaFileReader. To avoid the object being deleted while used by other
+  // modules, we use Ref Counting (AudioQueue : public RefCounted). If the
+  // RefCount is 1, it means that no AudioStreamImpl are using this audio yet. In
+  // those cases, we do not have to save the audio. Simply discard it.
+  if (RefCounted::getCount() <= 1)
+  {
+    returnCode = ReturnCode::SUCCESS;
+    return;
+  }
+  
+  if (currentBuffer == 0)
+  {
+    //allocate memory forcurrentBuffer
+    currentBuffer = allocateAudioBuffer(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Could not allocate an AudioBuffer\n");
+      return;
+    }
+  }
+  
+  unsigned char* pBufToAdd = samples;
+  ARRAY_LIMIT nSampleSaved = 0;
+  //
+  // check if new data fits in current buffer
+  //
+  
+  // if it does not fit
+  if (currentBuffer->size + length > bufSize)
+  {
+    //fill up the current buffer
+    ARRAY_LIMIT nSpaceLeft = (bufSize - currentBuffer->size);
+    
+    // copy from buffer the data that fit
+    memcpy(currentBuffer->buffer + currentBuffer->size, samples,
+           nSpaceLeft);
+    currentBuffer->size += nSpaceLeft;
+    nSampleSaved = nSpaceLeft;
+    
+    // save new buffer to the list.
+    currentBuffer->isLastBuffer = isLastBuffer;
+    insertBufferInQueue(currentBuffer, returnCode);
+    currentBuffer = 0;
+    if (returnCode != ReturnCode::SUCCESS)
+      return;
+    
+    AudioBuffer *pNewBuff;
+    // compute how many new buffers we will need
+    UINT16 bufSize = CodecHelper::GetPreferredBufferSize(codec);
+    if (bufSize <= 0)
+    {
+      returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+      return;
+    }
+    ARRAY_LIMIT numOfBuffersToAdd = (length - nSpaceLeft) / bufSize;
+    
+    // fill each one of the buffer except for the last one
+    for (ARRAY_LIMIT i = 0; i < numOfBuffersToAdd; ++i)
+    {
+      pNewBuff = allocateAudioBuffer(returnCode);
+      if (returnCode != ReturnCode::SUCCESS)
+      {
+        UAPI_ERROR(fn,"Could not allocate an AudioBuffer\n");
+        return;
+      }
+      
+      // copy next chunk
+      memcpy(pNewBuff->buffer, samples + nSampleSaved, bufSize);
+      pNewBuff->size  = bufSize;
+      nSampleSaved += bufSize;
+      
+      // save new buffer to the list.
+      pNewBuff->isLastBuffer = isLastBuffer;
+      insertBufferInQueue(pNewBuff, returnCode);
+      if (returnCode != ReturnCode::SUCCESS)
+        return;
+    }
+    
+    length -= nSampleSaved;
+    if (length > 0)
+    {
+      // remaining data to be added, prepare it
+      pBufToAdd       = (samples + nSampleSaved);
+      
+      //allocate memory forcurrentBuffer
+      currentBuffer = allocateAudioBuffer(returnCode);
+      if (returnCode != ReturnCode::SUCCESS)
+      {
+        UAPI_ERROR(fn,"Could not allocate an AudioBuffer\n");
+        return;
+      }
+      //data will get copied when we go inside BLOCK A
+    }
+  }
+  
+  //
+  //  BLOCK A
+  //
+  if (length > 0)
+  {
+    memcpy(currentBuffer->buffer + currentBuffer->size,
+           pBufToAdd, length);
+    currentBuffer->size += length;
+    
+    if (currentBuffer->size == bufSize) //buffer full?
+    {
+      currentBuffer->isLastBuffer = isLastBuffer;
+      insertBufferInQueue(currentBuffer, returnCode);
+      currentBuffer = 0;
+      if (returnCode != ReturnCode::SUCCESS)
+        return;
+    }
+  }
+  
+  //make sure we add current buffer to the list even if it's not full. Only
+  //do this when the isLastBuffer flag is set.
+  if (isLastBuffer && currentBuffer)
+  {
+    //last buffer and current buffer was not copied.
+    currentBuffer->isLastBuffer = true;
+    insertBufferInQueue(currentBuffer, returnCode);
+    currentBuffer = 0;
+    if (returnCode != ReturnCode::SUCCESS)
+      return;
+  }
+  
+  returnCode = ReturnCode::SUCCESS;
+}
+
+AudioBuffer* AudioQueue::allocateAudioBuffer(ReturnCode::Type& returnCode)
+{
+  // the AudioBuffer are RefCounted. If we have 2 attached AudioStreamImpl
+  // (getCount is 3), the count for each buffer has to be initialized to 2.
+  // One for each attached AudioStreamImpl When the buffer are passed to the
+  // consumers through the AudioStreamImpl::read function, the caller of the read
+  // function will call Release to decrease the count. If the buffer are not
+  // read, the count will be decremented when DetachAudio is called.
+  UINT8 nInitialCount = RefCounted::getCount() - 1;
+  return AudioBuffer::create(nInitialCount, CodecHelper::GetPreferredBufferSize(codec), returnCode);
+}
+
+void AudioQueue::attachAudio(SinglyLinkedNode*& out_pInitialReadPosition,
+                             ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("AudioQueue::attachAudio");
+    
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create LockScope\n");
+    return;
+  }
+  
+  //someone new is using us. Increment the count.
+  RefCounted::addRef(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to increase the ref count\n");
+    return;
+  }
+  
+  //It will start reading at the oldest buffer we have in the queue. To avoid
+  //issues, we must increment the count of all the buffers in the queue.
+  out_pInitialReadPosition = begin();
+  FwdIterator it(begin(), end());
+  while (it.hasNext())
+  {
+    AudioBuffer* audioBuffer = (AudioBuffer*) it.next();
+    audioBuffer->addRef(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to increase ref count on AudioBuffer\n");
+      return;
+    }
+  }
+  
+  if (currentBuffer != 0)
+  {
+    //a buffer is currently being filled. We have to increase the count on
+    //this one as well.
+    currentBuffer->addRef(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to increase ref count on AudioBuffer\n");
+      return;
+    }
+  }
+  
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void AudioQueue::detachAudio(SinglyLinkedNode* lastReadBuffer, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("AudioQueue::detachAudio");
+    
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create LockScope\n");
+    return;
+  }
+  
+  //Decrement the count on each buffer, we have to do this because those
+  //buffer will not get read and their count was intialized to the number of
+  //Audio attached. We start at the next entry after the last read buffer.
+  FwdIterator it(lastReadBuffer, end());
+  while (it.hasNext())
+  {
+    AudioBuffer* audioBuffer = (AudioBuffer*) it.next();
+    audioBuffer->removeRef(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to release ref count on AudioBuffer\n");
+      return;
+    }
+  }
+  
+  if (currentBuffer != 0)
+  {
+    //a buffer is currently being filled. We have to decrease the count on
+    //this one as well.
+    UINT8 count = currentBuffer->removeRef(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to release ref count on AudioBuffer\n");
+      return;
+    }
+    if(count == 0 )
+      currentBuffer = 0;
+  }
+  
+  //we now need to decrement the count.
+  if (RefCounted::getCount() == 1)
+  {
+    //about to kill ourselves, make sure we unlock the mutex. The next line
+    //RefCounted::Release() will call "delete this;"
+    ls.cancel(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to cancel LockScope\n");
+      return;
+    }
+  }
+  RefCounted::removeRef(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to release ref count on AudioQueue\n");
+    return;
+  }
+  
+  returnCode = ReturnCode::SUCCESS;
+}
+
+AudioBuffer* AudioQueue::read(SinglyLinkedNode*& lastReadBuffer, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("AudioQueue::read");
+    
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create LockScope\n");
+    return 0;
+  }
+  
+  //check if a new buffer is ready.
+  FwdIterator it(lastReadBuffer, end());
+  if (it.hasNext())
+  {
+    //a new buffer was added since read was called the last time.
+    AudioBuffer* audioBuffer = (AudioBuffer*) it.next();
+    lastReadBuffer = lastReadBuffer->next;
+    
+    if (audioBuffer->isLastBuffer)
+    {
+      //to know an AudioStreamImpl has reached the END_OF_STREAM, we simply
+      //point lastReadBuffer to the last element.
+      lastReadBuffer = end();
+    }
+    
+    UAPI_INFO(fn,"AudioQueue reading buffer %p\n", audioBuffer);
+    returnCode = ReturnCode::SUCCESS;
+    return audioBuffer;
+  }
+  else
+  {
+    if (lastReadBuffer == end())
+      returnCode = ReturnCode::END_OF_STREAM;
+    else
+      returnCode = ReturnCode::PENDING_DATA;
+    return 0;
+  }
+}
+
+void AudioQueue::release(AudioBuffer* audioBuffer, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("AudioQueue::release");
+    
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create LockScope\n");
+    return;
+  }
+  
+  if (readyForGarbageCollection != 0 && audioBuffer->getCount() == 1)
+  {
+    //we have an audio buffer that must be remove from the queue, i.e. we have
+    //to remove it's SinglyLinkedNode.
+    
+    UAPI_INFO(fn,"Removing buffer %p\n", readyForGarbageCollection);
+    
+    //we remove the item from the queue. readyForGarbageCollection should
+    //always be the first item on the queue (it's not always the case, but it
+    //is 99.9% of the time). This means that a call to remove will be very
+    //fast.
+    remove(readyForGarbageCollection);
+    
+    readyForGarbageCollection = 0;
+  }
+  
+  if (audioBuffer->getCount() == 1)
+  {
+    //we cannot get rid of the SinglyLinkedNode that holds this AudioBuffer now. We have
+    //to wait because lastReadBuffer is pointing to this node. We mark this
+    //buffer as ready for garbage collection. It will be cleaned up the next
+    //time release is called if the buffer that is deleted at that time also
+    //has a count of one.
+    readyForGarbageCollection = audioBuffer;
+  }
+  UAPI_INFO(fn,"Releasing buffer %p\n", audioBuffer);
+  audioBuffer->removeRef(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to release ref count on AudioBuffer\n");
+    return;
+  }
+  
+  returnCode = ReturnCode::SUCCESS;
+}
+
+bool AudioQueue::isAtEndOfStream(SinglyLinkedNode* position) const
+{
+  return position == end();
+}
+
+Codec::Type AudioQueue::getCodec()
+{
+  return codec;
+}
+
+void AudioQueue::insertBufferInQueue(AudioBuffer* pBuf, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("AudioQueue::insertBufferInQueue");
+  UAPI_INFO(fn,"Adding buffer %p size %d is last %d\n", pBuf, pBuf->size, pBuf->isLastBuffer);
+  
+  push(pBuf, returnCode);
+}
diff --git a/uapi/cpp/audio/source/AudioSource.cpp b/uapi/cpp/audio/source/AudioSource.cpp
new file mode 100644
index 0000000..985e8d7
--- /dev/null
+++ b/uapi/cpp/audio/source/AudioSource.cpp
@@ -0,0 +1,27 @@
+/*---------------------------------------------------------------------------*
+ *  AudioSource.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "AudioSource.h"
+#include "SmartProxy.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, AudioSourceProxy, SmartProxy, AudioSource)
diff --git a/uapi/cpp/audio/source/AudioSourceListener.cpp b/uapi/cpp/audio/source/AudioSourceListener.cpp
new file mode 100644
index 0000000..dd3eaa2
--- /dev/null
+++ b/uapi/cpp/audio/source/AudioSourceListener.cpp
@@ -0,0 +1,34 @@
+/*---------------------------------------------------------------------------*
+ *  AudioSourceListener.cpp                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "AudioSourceListener.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, AudioSourceListenerProxy, SmartProxy, AudioSourceListener)
+
+AudioSourceListener::AudioSourceListener()
+{
+}
+
+AudioSourceListener::~AudioSourceListener()
+{
+}
diff --git a/uapi/cpp/audio/source/AudioStream.cpp b/uapi/cpp/audio/source/AudioStream.cpp
new file mode 100644
index 0000000..76d2a2d
--- /dev/null
+++ b/uapi/cpp/audio/source/AudioStream.cpp
@@ -0,0 +1,31 @@
+/*---------------------------------------------------------------------------*
+ *  AudioStream.cpp                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "AudioStream.h"
+
+using namespace android::speech::recognition;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, AudioStreamProxy, SmartProxy, AudioStream)
+
+AudioStream::AudioStream()
+{}
+
+AudioStream::~AudioStream()
+{}
diff --git a/uapi/cpp/audio/source/AudioStreamImpl.cpp b/uapi/cpp/audio/source/AudioStreamImpl.cpp
new file mode 100644
index 0000000..4885301
--- /dev/null
+++ b/uapi/cpp/audio/source/AudioStreamImpl.cpp
@@ -0,0 +1,150 @@
+/*---------------------------------------------------------------------------*
+ *  AudioStreamImpl.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include "ReturnCode.h"
+#include "AudioStreamImpl.h"
+#include "AudioQueue.h"
+#include "AudioBuffer.h"
+#include "Logger.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(impl, AudioStreamImplProxy, AudioStreamProxy, AudioStreamImpl)
+
+AudioStreamImplProxy AudioStreamImpl::create(AudioQueue* queue, ReturnCode::Type & returnCode)
+{
+  UAPI_FN_SCOPE("AudioStreamImpl::create");
+    
+  AudioStreamImpl* object = new AudioStreamImpl(queue, returnCode);
+  if (!object)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return AudioStreamImplProxy();
+  }
+  else if (returnCode)
+  {
+    delete object;
+    return AudioStreamImplProxy();
+  }
+  AudioStreamImplProxy result(object);
+  if (!result)
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+  return result;
+}
+
+AudioStreamImpl::AudioStreamImpl(AudioQueue* queue, ReturnCode::Type& returnCode):
+    audioQueue(queue),
+    readPosition(0),
+    isLocked(false)
+{
+  UAPI_FN_NAME("AudioStreamImpl::AudioStreamImpl");
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  //Attach to the audio queue. By doing so, we tell it that it need to save
+  //audio buffers for us. It will also initialize the read position.
+  audioQueue->attachAudio(readPosition, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to attach AudioStream to AudioQueue\n");
+    return;
+  }
+}
+
+AudioStreamImpl::~AudioStreamImpl()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_NAME("AudioStreamImpl::~AudioStreamImpl");
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  //detach the audio from the queue.
+  audioQueue->detachAudio(readPosition, returnCode);
+  if (returnCode)
+    UAPI_WARN(fn,"Failed to detatch audio stream from audio queue.\n");
+    
+}
+
+AudioBuffer* AudioStreamImpl::read(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("AudioStreamImpl::read");
+    
+  AudioBuffer* result = audioQueue->read(readPosition, returnCode);
+  if( result )
+  {
+    UAPI_INFO(fn,"AudioStream %p read AudioBuffer %p, next=%p size %d\n", this, result, readPosition, result->size);
+  }
+  else
+  {
+    UAPI_INFO(fn,"AudioStream %p read AudioBuffer %p, next=%p\n", this, result, readPosition);
+  }
+  return result;
+}
+
+void AudioStreamImpl::release(AudioBuffer* audioBuffer, ReturnCode::Type & returnCode)
+{
+  UAPI_FN_SCOPE("AudioStreamImpl::release");
+    
+  audioQueue->release(audioBuffer, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to release audio %p buffer from audio queue %p\n", audioBuffer, audioQueue);
+    return;
+  }
+}
+
+Codec::Type AudioStreamImpl::getCodec()
+{
+  return audioQueue->getCodec();
+}
+
+void AudioStreamImpl::lock(ReturnCode::Type& returnCode)
+{
+  if (isLocked)
+  {
+    returnCode = ReturnCode::AUDIO_ALREADY_IN_USE;
+    return;
+  }
+  else if (audioQueue->isAtEndOfStream(readPosition))
+  {
+    returnCode = ReturnCode::END_OF_STREAM;
+    return;
+  }
+  isLocked = true;
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void AudioStreamImpl::unlock()
+{
+  // Our code shouldn't unlock twice
+  assert(isLocked);
+  isLocked = false;
+}
diff --git a/uapi/cpp/audio/source/CodecHelper.cpp b/uapi/cpp/audio/source/CodecHelper.cpp
new file mode 100644
index 0000000..8570cbe
--- /dev/null
+++ b/uapi/cpp/audio/source/CodecHelper.cpp
@@ -0,0 +1,215 @@
+/*---------------------------------------------------------------------------*
+ *  CodecHelper.cpp                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <assert.h>
+#include "CodecHelper.h"
+#include "assert.h"
+#include "Codec.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+/**
+ * 120 ms of PCM_16_8K is
+ *
+ * 8000 samples/sec * 16 bits/samples * 0.120 sec * 1/8 bytes/bits = 1920
+ * bytes.
+ */
+#ifdef ANDROID
+  static const UINT16 REC_BUFFER_SIZE_PCM_16_8K = 1536;
+#else
+  static const UINT16 REC_BUFFER_SIZE_PCM_16_8K = 1920;
+#endif
+
+/**
+ * 120 ms of ULAW_8_8K is
+ *
+ * 8000 samples/sec * 8 bits/samples * 0.120 sec * 1/8 bytes/bits = 960
+ * bytes.
+ */
+static const UINT16 REC_BUFFER_SIZE_ULAW_8_8K = 960;
+
+/**
+ * 120 ms of PCM_16_11K is
+ *
+ * 11025 samples/sec * 16 bits/samples * 0.120 sec * 1/8 bytes/bits = 2646
+ * bytes.
+ */
+#ifdef ANDROID
+  static const UINT16 REC_BUFFER_SIZE_PCM_16_11K = 2048;
+#else
+  static const UINT16 REC_BUFFER_SIZE_PCM_16_11K = 2646;
+#endif
+
+/**
+ * 120 ms of PCM_16_22K is
+ *
+ * 22050 samples/sec * 16 bits/samples * 0.120 sec * 1/8 bytes/bits = 5292
+ * bytes.
+ */
+static const UINT16 REC_BUFFER_SIZE_PCM_16_22K = 5292;
+/**
+ * 120 ms of ULAW is
+ *
+ * 8000 samples/sec * 8 bits/samples * 0.120 sec * 1/8 bytes/bits = 960
+ * bytes.
+ */
+static const UINT16 REC_BUFFER_SIZE_ULAW = 960;
+
+/** 
+ * Those correspond to 120 ms of audio.
+ */
+static const UINT16 FILE_READER_BUFFER_SIZE_PCM_16_8K = 1920;
+static const UINT16 FILE_READER_BUFFER_SIZE_ULAW_8_8K = 960;
+static const UINT16 FILE_READER_BUFFER_SIZE_PCM_16_11K = 2646;
+static const UINT16 FILE_READER_BUFFER_SIZE_PCM_16_22K = 5292;
+static const UINT16 FILE_READER_BUFFER_SIZE_ULAW       = 960;
+
+
+
+
+
+
+
+
+
+
+
+
+CodecHelper::CodecHelper()
+{}
+
+UINT16 CodecHelper::GetPreferredBufferSize(Codec::Type codec)
+{
+// For 8K and 11K I have changed the buffer size to 256 samples ( 512 bytes ) for 11K
+// and 192 samples ( 384 bytes ) for 8K to match
+// what is currently delivered by the Google audio driver. This code is tied to the
+// changed audio polling time in the RecognizerImpl code that is meant to handle
+// the smaller sample size and improve latency.  SteveR
+// Because of performance issues and because Google starts collecting audio during the
+// startup, I am making the audio buffers larger. They will now be for 11K 1024 samples
+// ( 2048 bytes ) and for 8K 768 samples ( 1536 bytes ) Polling is no longer an issue
+// since Google collects audio long before recognition starts. SteveR
+
+  switch (codec)
+  {
+    case Codec::PCM_16BIT_8K:
+      return REC_BUFFER_SIZE_PCM_16_8K;
+    case Codec::PCM_16BIT_11K:
+      return REC_BUFFER_SIZE_PCM_16_11K;
+    case Codec::PCM_16BIT_22K:
+      return REC_BUFFER_SIZE_PCM_16_22K;
+    case Codec::ULAW_8BIT_8K:
+      return REC_BUFFER_SIZE_ULAW_8_8K;
+    default:
+      assert(false);
+      return 1;
+  }
+}
+
+UINT16 CodecHelper::GetPreferredFileReaderBufferSize(Codec::Type codec)
+{
+  switch (codec)
+  {
+    case Codec::PCM_16BIT_8K:
+      return FILE_READER_BUFFER_SIZE_PCM_16_8K;
+    case Codec::PCM_16BIT_11K:
+      return FILE_READER_BUFFER_SIZE_PCM_16_11K;
+    case Codec::PCM_16BIT_22K:
+      return FILE_READER_BUFFER_SIZE_PCM_16_22K;
+    case Codec::ULAW_8BIT_8K:
+      return FILE_READER_BUFFER_SIZE_ULAW_8_8K;
+    default:
+      assert(false);
+      return 1;
+  }
+}
+
+UINT32 CodecHelper::GetPreferredRealTimeDelay(Codec::Type codec)
+{
+  switch (codec)
+  {
+    case Codec::PCM_16BIT_8K:
+      //120 ms if REC_BUFFER_SIZE_PCM_16_8K is 1920
+      return (REC_BUFFER_SIZE_PCM_16_8K / (2*8));
+    case Codec::PCM_16BIT_11K:
+      //120 ms if REC_BUFFER_SIZE_PCM_16_11K is 2646
+      return ((REC_BUFFER_SIZE_PCM_16_11K * 1000) / (2*11025));
+    case Codec::PCM_16BIT_22K:
+      //120 ms if REC_BUFFER_SIZE_PCM_16_22K is 5292
+      return ((REC_BUFFER_SIZE_PCM_16_22K * 1000) / (2*22050));
+    case Codec::ULAW_8BIT_8K:
+      //120 ms if REC_BUFFER_SIZE_ULAW_8_8K is 960
+      return (REC_BUFFER_SIZE_ULAW_8_8K / (8));
+    default:
+      assert(false);
+      return 1;
+  }
+}
+
+UINT32 CodecHelper::GetNumMsecForNumBytes(Codec::Type codec, UINT32 fileLength)
+{
+  switch (codec)
+  {
+    case Codec::PCM_16BIT_8K:
+      return (fileLength/ (2*8));
+    case Codec::PCM_16BIT_11K:
+      return ((fileLength * 1000)/ (2*11025));
+    case Codec::PCM_16BIT_22K:
+      return ( (fileLength * 1000) / (2*22050));
+    case Codec::ULAW_8BIT_8K:
+      return (fileLength / (8));
+    default:
+      assert(false);
+      return 1;
+  }
+}
+
+Codec::Type CodecHelper::GetCodecFromRateNumBytesPerSample(INT32 sampleRate, INT16 numBytesPerSample, ReturnCode::Type & returnCode)
+{
+  returnCode = ReturnCode::SUCCESS;
+  if( sampleRate == 11025 && numBytesPerSample == 2 )
+  {
+    return Codec::PCM_16BIT_11K;
+  }
+  else if( sampleRate == 8000 && numBytesPerSample == 2 )
+  {
+    return Codec::PCM_16BIT_8K;
+  }
+  else if( sampleRate == 8000 && numBytesPerSample == 1 )
+  {
+    return Codec::ULAW_8BIT_8K;
+  }
+  else if( sampleRate == 22050 && numBytesPerSample == 2 )
+  {
+    return Codec::PCM_16BIT_22K;
+  }
+  else
+  {
+    returnCode = ReturnCode::NOT_SUPPORTED;
+    return Codec::PCM_16BIT_11K;
+  }
+}
diff --git a/uapi/cpp/audio/source/DeviceSpeaker.cpp b/uapi/cpp/audio/source/DeviceSpeaker.cpp
new file mode 100644
index 0000000..0405a1a
--- /dev/null
+++ b/uapi/cpp/audio/source/DeviceSpeaker.cpp
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------------*
+ *  DeviceSpeaker.cpp                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "DeviceSpeaker.h"
+#include "SmartProxy.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, DeviceSpeakerProxy, SmartProxy, DeviceSpeaker)
+
+DeviceSpeaker::DeviceSpeaker()
+{}
+
+DeviceSpeaker::~DeviceSpeaker()
+{
+  instance = 0;
+}
diff --git a/uapi/cpp/audio/source/DeviceSpeakerListener.cpp b/uapi/cpp/audio/source/DeviceSpeakerListener.cpp
new file mode 100644
index 0000000..ab58138
--- /dev/null
+++ b/uapi/cpp/audio/source/DeviceSpeakerListener.cpp
@@ -0,0 +1,34 @@
+/*---------------------------------------------------------------------------*
+ *  DeviceSpeakerListener.cpp                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "DeviceSpeakerListener.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, DeviceSpeakerListenerProxy, SmartProxy, DeviceSpeakerListener)
+
+DeviceSpeakerListener::DeviceSpeakerListener()
+{
+}
+
+DeviceSpeakerListener::~DeviceSpeakerListener()
+{
+}
diff --git a/uapi/cpp/audio/source/MediaFileReader.cpp b/uapi/cpp/audio/source/MediaFileReader.cpp
new file mode 100644
index 0000000..fe8d15a
--- /dev/null
+++ b/uapi/cpp/audio/source/MediaFileReader.cpp
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileReader.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "MediaFileReader.h"
+#include "SmartProxy.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, MediaFileReaderProxy, AudioSourceProxy, MediaFileReader)
+
+MediaFileReader::MediaFileReader()
+{}
+
+MediaFileReader::~MediaFileReader()
+{}
diff --git a/uapi/cpp/audio/source/MediaFileReaderImpl.cpp b/uapi/cpp/audio/source/MediaFileReaderImpl.cpp
new file mode 100644
index 0000000..e13060a
--- /dev/null
+++ b/uapi/cpp/audio/source/MediaFileReaderImpl.cpp
@@ -0,0 +1,680 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileReaderImpl.cpp                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <string.h>
+#include "MediaFileReaderImpl.h"
+#include "MediaFileReaderListener.h"
+#include "File.h"
+#include "WorkerQueue.h"
+#include "WorkerQueueFactory.h"
+#include "CodecHelper.h"
+#include "AudioStreamImpl.h"
+#include "AudioQueue.h"
+#include "LoggerImpl.h"
+#include "System.h"
+#include "WavePCMHelper.h"
+
+#include <stdlib.h>
+
+#if defined(UAPI_WIN32) || defined(UAPI_LINUX)
+# include "FileASCII.h"
+#endif
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      MediaFileReaderProxy MediaFileReader::create(const char* pszFileName,
+          AudioSourceListenerProxy& listener,
+          ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("MediaFileReader::create");
+          
+        MediaFileReaderImpl* object =
+          new MediaFileReaderImpl(pszFileName, listener, returnCode);
+        if (object == 0)
+        {
+          returnCode = ReturnCode::OUT_OF_MEMORY;
+          return MediaFileReaderProxy();
+        }
+        else if (returnCode)
+        {
+          delete object;
+          return MediaFileReaderProxy();
+        }
+        MediaFileReaderProxy result(object);
+        if (!result)
+        {
+          returnCode = ReturnCode::OUT_OF_MEMORY;
+          return result;
+        }
+        object->rootProxy = result.getRoot();
+        returnCode = ReturnCode::SUCCESS;
+        return result;
+      }
+      
+      namespace impl
+      {
+        DEFINE_SMARTPROXY(impl, MediaFileReaderImplProxy, MediaFileReaderProxy, MediaFileReaderImpl)
+        
+        MediaFileReaderImpl::MediaFileReaderImpl(const char* pszFileName,
+            AudioSourceListenerProxy& _listener,
+            ReturnCode::Type& returnCode):
+            file(0),
+            mode(ALL_AT_ONCE),
+            headerOffset(0),
+            listener(_listener),
+            codec(Codec::PCM_16BIT_11K),
+            workerQueue(0),
+            audioQueue(0),
+            state(IDLE),
+            pendingTask(0),
+            _numBufferNeededToCatchUp(2)
+        {
+          UAPI_FN_SCOPE("MediaFileReader::MediaFileReaderImpl");
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+        
+          
+#if defined(UAPI_WIN32) || defined(UAPI_LINUX)
+          file = new FileASCII;
+#endif
+          if (file == 0)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          
+          file->open(pszFileName, "rb", returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not open file %s reason %s\n", pszFileName, ReturnCode::toString(returnCode));
+            return;
+          }
+          
+          WavePCMHelper::getWavFileInfo( file, codec, headerOffset, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"file %s is not a supported wav file\n", pszFileName);
+            return;
+          }
+
+          audioQueue = AudioQueue::create(codec, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create AudioQueue\n");
+            return;
+          }
+          
+          UINT32 fileLength = getFileLength(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"cannot get the file length reason %s\n", ReturnCode::toString(returnCode));
+            ReturnCode::Type temp;
+            file->close(temp);
+            return;
+          }
+          
+          if (headerOffset >= fileLength)
+          {
+            UAPI_ERROR(fn,"Header offset (%u) cannot be greater or equal to the file length (%u)\n", headerOffset, fileLength);
+            file->close(returnCode);
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          
+          WorkerQueueFactory* workerFactory = WorkerQueueFactory::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue factory\n");
+            ReturnCode::Type temp;
+            file->close(temp);
+            return;
+          }
+          workerQueue = workerFactory->getWorkerQueue(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue\n");
+            ReturnCode::Type temp;
+            file->close(temp);
+            return;
+          }
+        }
+             
+        MediaFileReaderImpl::~MediaFileReaderImpl()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MediaFileReader::~MediaFileReaderImpl");
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+          if (file)
+          {
+            file->close(returnCode);
+            if (returnCode)
+              UAPI_WARN(fn,"Failed to close file\n");
+              
+            delete file;
+          }
+          
+          if (audioQueue != 0)
+          {
+            //NOTE: we don't call delete audioQueue. This class is ref counted.
+            //Instead, we call Release on it and once no one is using the object, it
+            //will get released.
+            
+            audioQueue->removeRef(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+              UAPI_WARN(fn,"Failed to stop worker queue\n");
+          }
+        }
+        
+        
+        void MediaFileReaderImpl::setReadingMode(ReadingMode _mode, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MediaFileReader::setReadingMode");
+            
+          mode = _mode;
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        
+        void MediaFileReaderImpl::start(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MediaFileReaderImpl::start");
+            
+          if (file == 0)
+          {
+            UAPI_ERROR(fn,"file is null");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          else if (workerQueue == 0)
+          {
+            UAPI_ERROR(fn,"workerQueue is null");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          else if (audioQueue == 0)
+          {
+            UAPI_ERROR(fn,"audioQueue is null");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          MediaFileReaderImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create MediaFileReaderImplProxy: %s\n", ReturnCode::toString(returnCode));
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          pendingTask = new StartReadingFileTask(proxy);
+          if (!pendingTask)
+          {
+            UAPI_ERROR(fn,"Could not create StartReadingFileTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          workerQueue->enqueue(pendingTask, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to enqueue StartReadingFileTask\n");
+            delete pendingTask;
+            pendingTask = 0;
+            return;
+          }
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void MediaFileReaderImpl::runStartReadingFileTask()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MediaFileReader::runStartReadingFileTask");
+            
+          if (state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call start\n");
+            if (listener)
+              listener->onError(ReturnCode::INVALID_STATE);
+            return;
+          }
+          
+          state = READING;
+          
+          UINT32 fileLength = getFileLength(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"cannot get the file length reason %s\n", ReturnCode::toString(returnCode));
+            if (listener)
+              listener->onError(returnCode);
+            return;
+          }
+          
+          fileLength -= headerOffset; //substract header
+          
+          file->seek(headerOffset, File::UAPI_SEEK_SET, returnCode);   //skip the header
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not seek after the file header reason %s\n", ReturnCode::toString(returnCode));
+            if (listener)
+              listener->onError(returnCode);
+            return;
+          }
+          
+          UINT16 bufferSize = CodecHelper::GetPreferredFileReaderBufferSize(codec);
+          numFullBuffers = fileLength / bufferSize;
+          lastBuffNumBytes = (UINT16)(fileLength % bufferSize);
+          
+          if (lastBuffNumBytes > 0)
+            ++numFullBuffers;
+          
+          if (mode == REAL_TIME)
+          {
+            //we are trying to read real time. To do this, we will compute the
+            //time at which we should be done reading the file.
+            expireTime = TimeInstant::now();
+            UINT32 fileDurationMs = CodecHelper::GetNumMsecForNumBytes(codec, fileLength);
+            UAPI_INFO(fn,"Audio file contains %u msec of audio\n", fileDurationMs);
+            expireTime = expireTime.plus(fileDurationMs);
+          }
+
+
+          bufferReadIndex = 0;
+          if (listener)
+            listener->onStarted();
+            
+          runReadFileTask();
+        }
+        
+        void MediaFileReaderImpl::runReadFileTask()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MediaFileReader::runReadFileTask");
+
+          //we are in the worker queue thread.
+
+          UINT32 numBufferToRead = 1;
+
+          //compute the time we have to left to play the whole file.
+          if (mode == REAL_TIME)
+          {
+            TimeInstant now = TimeInstant::now(); 
+            INT32 timeLeftToPlay = expireTime.minus(now, returnCode);
+            if (returnCode)
+            {
+              UAPI_INFO(fn,"TimeInstant.minus() error: %s\n", ReturnCode::toString(returnCode));
+              //unexpected error, send an error to the application.
+              if (listener)
+                listener->onError(returnCode);
+              return;
+            }
+
+            UINT32 timeLeftPerBuffer = 0;
+
+            //here we will check how much time we have left per buffer
+            if( timeLeftToPlay > 0 )
+              timeLeftPerBuffer = timeLeftToPlay / (numFullBuffers - 1 - bufferReadIndex);
+
+
+            UINT32 numMsPerBufferToRead = CodecHelper::GetNumMsecForNumBytes(codec, CodecHelper::GetPreferredFileReaderBufferSize(codec));
+            // experiments has shown that 4/5 is a good number.
+            if( timeLeftPerBuffer < (numMsPerBufferToRead *4/5) )
+            {
+              //we are late, try to catch up by submitting multiple buffers at
+              //once. The more we are late reading the buffers, the more
+              //buffers we will read during a ReadFileTask. This should help us
+              //catch up.
+              numBufferToRead = _numBufferNeededToCatchUp++;
+            }
+            else
+            {
+              //set back to default.
+              _numBufferNeededToCatchUp = 2;
+            }
+
+            UAPI_INFO(fn,"Time left per buffer is %u, submitting %u buffers numFullBuffers %u "
+                "bufferReadIndex %u\n", timeLeftPerBuffer, numBufferToRead, numFullBuffers, 
+                bufferReadIndex);
+          }
+
+          while( numBufferToRead > 0 )
+          {
+            
+            if (state == STOPPING)
+            {
+              //notify the listener that we are done with the stop
+              onReadFileDone();
+              return;
+            }
+            
+            UINT32 nextReadDelay = 0;
+            
+            UINT16 bufferSize = CodecHelper::GetPreferredFileReaderBufferSize(codec);
+            
+            UINT32 bytesToRead = bufferSize;
+            bool isLastBuffer = false;
+            if (bufferReadIndex == (numFullBuffers - 1))
+            {
+              if (lastBuffNumBytes > 0)
+                bytesToRead = lastBuffNumBytes;
+              isLastBuffer = true;
+            }
+            
+            unsigned char* buffer = (unsigned char*) malloc(bytesToRead);
+            
+            // read data as a block:
+            file->read(buffer, sizeof(char), bytesToRead, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"read from file returned %s. buffer 0x%p bytesToRead %u \n",
+                         ReturnCode::toString(returnCode), buffer, bytesToRead);
+              if (buffer)
+                free(buffer);
+              //unexpected error, send an error to the application.
+              if (listener)
+                listener->onError(returnCode);
+              return;
+            }
+            
+            audioQueue->addBuffer(buffer, bytesToRead, isLastBuffer, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"Failed to AddBuffer pBuf %p size %d reason%s\n", buffer, 
+                  bytesToRead, ReturnCode::toString(returnCode));
+              free(buffer);
+              //unexpected error, send an error to the application.
+              if (listener)
+                listener->onError(returnCode);
+              return;
+            }
+            
+            free(buffer);
+            
+            ++bufferReadIndex;
+            
+            if (isLastBuffer)
+            {
+              //notify the listener that we are done
+              onReadFileDone();
+              return;
+            }
+            else
+            {
+              --numBufferToRead;
+              if( numBufferToRead > 0 )
+                continue;
+
+              //compute the next read delay
+              if (mode == REAL_TIME)
+              {
+                TimeInstant now = TimeInstant::now(); 
+                INT32 timeLeftToPlay = expireTime.minus(now, returnCode);
+                if (returnCode)
+                {
+                  UAPI_INFO(fn,"TimeInstant.minus() error: %s\n", ReturnCode::toString(returnCode));
+                  //unexpected error, send an error to the application.
+                  if (listener)
+                    listener->onError(returnCode);
+                  return;
+                }
+                //here we will check how much time we have left per buffer
+                UINT32 denom = (numFullBuffers - 1 - bufferReadIndex);
+
+                if ( timeLeftToPlay <= 0 )
+                {
+                  nextReadDelay = 0;
+                }
+                else
+                {
+                  nextReadDelay = denom != 0 ? 
+                    timeLeftToPlay / (numFullBuffers - 1 - bufferReadIndex) : 
+                    timeLeftToPlay;
+                }
+              }
+
+              //need to read some more... later
+              MediaFileReaderImplProxy proxy(rootProxy);
+              if (!proxy)
+              {
+                UAPI_ERROR(fn,"Could not create MediaFileReaderImplProxy: %s\n", ReturnCode::toString(returnCode));
+                if (listener)
+                  listener->onError(ReturnCode::INVALID_STATE);
+                return;
+              }
+              pendingTask = new ReadFileTask(proxy, nextReadDelay);
+              if (!pendingTask)
+              {
+                UAPI_ERROR(fn,"Could not create ReadFileTask\n");
+                if (listener)
+                  listener->onError(ReturnCode::OUT_OF_MEMORY);
+                return;
+              }
+              workerQueue->enqueue(pendingTask, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"Failed to enqueue ReadFileTask\n");
+                if (listener)
+                  listener->onError(returnCode);
+                delete pendingTask;
+                pendingTask = 0;
+                return;
+              }
+            }
+          }//while
+        }
+        
+        void MediaFileReaderImpl::stop(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MediaFileReader::stop");
+            
+          MediaFileReaderImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create MediaFileReaderImplProxy: %s\n", ReturnCode::toString(returnCode));
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          StopReadingFileTask* task = new StopReadingFileTask(proxy);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create ReadFileTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to enqueue StopReadingFileTask\n");
+            delete task;
+            return;
+          }
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void MediaFileReaderImpl::runStopReadingFileTask()
+        {
+          UAPI_FN_SCOPE("MediaFileReader::runStopReadingFileTask");
+            
+          //check the state.
+          if (state == IDLE)
+          {
+            //already stopped. Do nothing.
+            UAPI_INFO(fn,"MediaFileReader is already stopped.\n");
+            return;
+          }
+          else if (state != READING)
+          {
+            //stop called multiple times, do nothing
+            UAPI_WARN(fn,"MediaFileReaderImpl::stop was already called.\n");
+            return;
+          }
+          
+          //it will get stopped the next time runReadFileTask is called.
+          state = STOPPING;
+          ReturnCode::Type returnCode;
+
+          if (pendingTask)
+          {
+            // If there any pending task then remove them
+            workerQueue->remove(pendingTask, returnCode);
+            if (returnCode != ReturnCode::SUCCESS && listener)
+              listener->onError(returnCode);
+            pendingTask = 0;
+          }
+
+          //we need to submit a buffer with the last buffer flag set to true.
+          audioQueue->addBuffer(0, 0, true, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to call AddBuffer buffer on last buffer ret: %s\n", ReturnCode::toString(returnCode));
+            listener->onError(returnCode);
+            onReadFileDone();
+            return;
+          }
+
+          // Add to fix bug 4700 MediaFileReader lockup
+          //notify the listener that we are done with the stop
+          onReadFileDone();
+        }
+        
+        
+        AudioStreamProxy MediaFileReaderImpl::createAudio(ReturnCode::Type& returnCode)
+        {
+          return AudioStreamImpl::create(audioQueue, returnCode);
+        }
+        
+        void MediaFileReaderImpl::onReadFileDone()
+        {
+          UAPI_FN_SCOPE("MediaFileReaderImpl::onReadFileDone");
+            
+          //we want to allow a user to re-use the MediaFileReader object. To do so,
+          //we must create a new AudioQueue for each start() operation. To make sure
+          //we are ready for the next operation, we get rid of the old one here and
+          //we create a new one. NOTE that we do this before we send the callback.
+          if (audioQueue != 0)
+          {
+            ReturnCode::Type returnCode;
+            
+            //NOTE: we don't call delete audioQueue. This class is ref counted.
+            //Instead, we call Release on it and once no one is using the object, it
+            //will get released.
+            audioQueue->removeRef(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"Failed to release audio buffer\n");
+              if (listener)
+                listener->onError(returnCode);
+              return;
+            }
+            
+            audioQueue = AudioQueue::create(codec, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"Failed to create AudioQueue\n");
+              if (listener)
+                listener->onError(returnCode);
+              return;
+            }
+          }
+          
+          state = IDLE;
+          
+          // Adding this to fix fopen error
+          // now we are sure to close the file
+          if (file)
+          {
+            ReturnCode::Type temp;
+            file->close(temp);
+            if (temp)
+                UAPI_WARN(fn,"onReadFileDone::Failed to close file\n");
+          }
+
+          if (listener)
+            listener->onStopped();
+        }
+        
+        UINT32 MediaFileReaderImpl::getFileLength(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MediaFileReaderImpl::getFileLength");
+            
+          // get length of file:
+          UINT32 fileLength = 0;
+          file->seek(0, File::UAPI_SEEK_END, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could seek to the end of the file reason %s\n", ReturnCode::toString(returnCode));
+            return 0;
+          }
+          
+          file->getPosition(fileLength, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not get the file length reason %s\n", ReturnCode::toString(returnCode));
+            return 0;
+          }
+          return fileLength;
+        }
+        
+        ReadFileTask::ReadFileTask(MediaFileReaderImplProxy& _mediaFileReader, UINT32 timeout):
+            ScheduledTask(timeout, "ReadFileTask"),
+            mediaFileReader(_mediaFileReader)
+        {}
+        
+        void ReadFileTask::run()
+        {
+          mediaFileReader->runReadFileTask();
+        }
+        
+        StartReadingFileTask::StartReadingFileTask(MediaFileReaderImplProxy& _mediaFileReader):
+            Task("StartReadingFileTask"),
+            mediaFileReader(_mediaFileReader)
+        {}
+        
+        void StartReadingFileTask::run()
+        {
+          mediaFileReader->runStartReadingFileTask();
+        }
+        
+        StopReadingFileTask::StopReadingFileTask(MediaFileReaderImplProxy& _mediaFileReader):
+            Task("StopReadingFileTask"),
+            mediaFileReader(_mediaFileReader)
+        {}
+        
+        void StopReadingFileTask::run()
+        {
+          mediaFileReader->runStopReadingFileTask();
+        }
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/audio/source/MediaFileReaderListener.cpp b/uapi/cpp/audio/source/MediaFileReaderListener.cpp
new file mode 100644
index 0000000..419e898
--- /dev/null
+++ b/uapi/cpp/audio/source/MediaFileReaderListener.cpp
@@ -0,0 +1,34 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileReaderListener.cpp                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "MediaFileReaderListener.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, MediaFileReaderListenerProxy, AudioSourceListenerProxy, MediaFileReaderListener)
+
+MediaFileReaderListener::MediaFileReaderListener()
+{
+}
+
+MediaFileReaderListener::~MediaFileReaderListener()
+{
+}
diff --git a/uapi/cpp/audio/source/MediaFileWriter.cpp b/uapi/cpp/audio/source/MediaFileWriter.cpp
new file mode 100644
index 0000000..53ac835
--- /dev/null
+++ b/uapi/cpp/audio/source/MediaFileWriter.cpp
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileWriter.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "MediaFileWriter.h"
+#include "SmartProxy.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, MediaFileWriterProxy, SmartProxy, MediaFileWriter)
+
+MediaFileWriter::MediaFileWriter()
+{}
+
+MediaFileWriter::~MediaFileWriter()
+{}
diff --git a/uapi/cpp/audio/source/MediaFileWriterImpl.cpp b/uapi/cpp/audio/source/MediaFileWriterImpl.cpp
new file mode 100644
index 0000000..1efc55b
--- /dev/null
+++ b/uapi/cpp/audio/source/MediaFileWriterImpl.cpp
@@ -0,0 +1,433 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileWriterImpl.cpp                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <string.h>
+#include "MediaFileWriterImpl.h"
+#include "MediaFileWriterListener.h"
+#include "File.h"
+#include "WorkerQueue.h"
+#include "WorkerQueueFactory.h"
+#include "AudioStreamImpl.h"
+#include "AudioBuffer.h"
+#include "LoggerImpl.h"
+#include "LoggerImpl.h"
+#include "System.h"
+#include "WavePCMHelper.h"
+#include "Codec.h"
+
+#if defined(UAPI_WIN32) || defined(UAPI_LINUX)
+# include "FileASCII.h"
+#endif
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      MediaFileWriterProxy MediaFileWriter::create(MediaFileWriterListenerProxy& listener,
+          ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("DeviceSpeakerWIN::create");
+          
+        impl::MediaFileWriterImpl* mediaFileWriter = new impl::MediaFileWriterImpl(listener);
+        if (!mediaFileWriter)
+        {
+          returnCode = ReturnCode::OUT_OF_MEMORY;
+          return MediaFileWriterProxy();
+        }
+        impl::MediaFileWriterImplProxy result(mediaFileWriter);
+        if (!result)
+        {
+          returnCode = ReturnCode::OUT_OF_MEMORY;
+          return result;
+        }
+        mediaFileWriter->rootProxy = result.getRoot();
+        returnCode = ReturnCode::SUCCESS;
+        return result;
+      }
+      
+      namespace impl
+      {
+        DEFINE_SMARTPROXY(impl, MediaFileWriterImplProxy, MediaFileWriterProxy, MediaFileWriterImpl)
+        
+        MediaFileWriterImpl::MediaFileWriterImpl(MediaFileWriterListenerProxy& _listener):
+            file(0),
+            workerQueue(0),
+            listener(_listener),
+            state(IDLE),
+            rootProxy(0),
+            bHeaderSaved(false)
+        {
+          UAPI_FN_NAME("MediaFileWriterImpl::MediaFileWriter");
+            
+          UAPI_TRACE(fn,"this=%p\n", this);
+        }
+        
+        void MediaFileWriterImpl::closeFile(ReturnCode::Type& returnCode)
+        {
+            UAPI_FN_NAME("MediaFileWriterImpl::closeFile");
+            if (file)
+            {
+                file->close(returnCode);
+                if (returnCode)
+                    UAPI_WARN(fn,"MediaFileWriterImpl::closeFile::Failed to close file\n");
+            }
+        }
+
+        void MediaFileWriterImpl::init(const char* fileName, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MediaFileWriterImpl::init");
+            
+#if defined(UAPI_WIN32) || defined(UAPI_LINUX)
+          file = new FileASCII;
+#endif
+          if (file == 0)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+
+          
+          file->open(fileName, "wb+", returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to create file %s reason %s\n", fileName,
+                       ReturnCode::toString(returnCode));
+            delete file;
+            file = 0;
+            return;
+          }
+          
+          WorkerQueueFactory* workerFactory = WorkerQueueFactory::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue factory\n");
+            return;
+          }
+          workerQueue = workerFactory->getWorkerQueue(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue\n");
+            return;
+          }
+        }
+        
+        MediaFileWriterImpl::~MediaFileWriterImpl()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_NAME("MediaFileWriterImpl::~MediaFileWriter");
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+          if (file)
+          {
+            file->close(returnCode);
+            delete file;
+          }
+        }
+        
+        void MediaFileWriterImpl::save(AudioStreamProxy& audio, const char* path, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("MediaFileWriterImpl::save");
+          ReturnCode::Type rc;  
+          if (!audio)
+          {
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          
+          init(path, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+            return;
+            
+          if (file == 0 || workerQueue == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          AudioStreamImplProxy& audioStreamImpl = (AudioStreamImplProxy&) audio;
+          
+          //Flag this AudioStreamImpl as being locked. This means that this audio cannot be
+          //passed to other modules.
+          audioStreamImpl->lock(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Cannot lock the audio stream\n");
+            closeFile(rc);
+            return;
+          }
+          
+          ReturnCode::Type dummy;
+          MediaFileWriterImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            cleanupAudioStreamProxy(audioStreamImpl, dummy);
+            returnCode = ReturnCode::INVALID_STATE;
+            closeFile(rc);
+            return;
+          }
+          StartWriteFileTask* task = new StartWriteFileTask(proxy, audioStreamImpl);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create StartWriteFileTask\n");
+            cleanupAudioStreamProxy(audioStreamImpl, dummy);
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            closeFile(rc);
+            return;
+          }
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to enqueue StartWriteFileTask reason %s\n",
+                       ReturnCode::toString(returnCode));
+            cleanupAudioStreamProxy(audioStreamImpl, dummy);
+            delete task;
+            closeFile(rc);
+            return;
+          }
+          returnCode = ReturnCode::SUCCESS;
+          return;
+        }
+        
+        void MediaFileWriterImpl::runStartWriteFileTask(AudioStreamImplProxy& audioStream)
+        {
+          UAPI_FN_SCOPE("MediaFileWriterImpl::runStartWriteFileTask");
+            
+          if (state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call save\n");
+            if (listener)
+              listener->onError(ReturnCode::INVALID_STATE);
+            return;
+          }
+          
+          state = SAVING;
+          bHeaderSaved = false;
+          
+          runWriteFileTask(audioStream);
+        }
+        
+        void MediaFileWriterImpl::runWriteFileTask(AudioStreamImplProxy& audioStream)
+        {
+          ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+          UAPI_FN_SCOPE("MediaFileWriterImpl::runWriteFileTask");
+            
+          while (state == SAVING && returnCode != ReturnCode::END_OF_STREAM)
+          {
+            AudioBuffer* buffer = audioStream->read(returnCode);
+            if (buffer)
+            {
+              UINT32 size = buffer->size;
+              if (size > 0)
+              {
+
+                if( bHeaderSaved == false )
+                {
+                  bHeaderSaved = true;
+
+                  UINT16 sampleRate = Codec::getSampleRate( audioStream->getCodec(), returnCode);
+
+                  UINT16 bitRate = Codec::getBitsPerSample(audioStream->getCodec(), returnCode);
+
+                  //add the RIFF header to be beginning of the file. Set the
+                  //size to 0 for now. It will get update once we are done
+                  //saving the file.
+                  WavePCMHelper::writeWavHeader(file, sampleRate, 1, bitRate, 0, returnCode);
+                  if (returnCode != ReturnCode::SUCCESS)
+                  {
+                    UAPI_ERROR(fn,"Failed to write wave header %s\n",
+                        ReturnCode::toString(returnCode));
+                    sendOnErrorToListener(audioStream, returnCode);
+                    return;
+                  }
+                }
+
+                file->write(buffer->buffer, sizeof(char), size, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to write buffer of size %d reason %s\n", size, ReturnCode::toString(returnCode));
+                  sendOnErrorToListener(audioStream, returnCode);
+                  return;
+                }
+              }
+              
+              //make sure we release the buffer, it is ref counted.
+              audioStream->release(buffer, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"Failed to release audio buffer %p\n", buffer);
+                sendOnErrorToListener(audioStream, returnCode);
+                return;
+              }
+            }
+            else
+            {
+              if (returnCode == ReturnCode::END_OF_STREAM)
+              {
+
+								//update the file length of the RIFF header.
+								UINT32 total_size;
+								file->getPosition(total_size, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to getPosition during END_OF_STREAM\n");
+                  sendOnErrorToListener(audioStream, returnCode);
+									return;
+                }
+
+								//substract 44, which is the size of the header. Remember that
+								//the header was added at the beginning.
+								WavePCMHelper::updateFileLength(file, total_size - 44, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to update the file length\n");
+                  sendOnErrorToListener(audioStream, returnCode);
+									return;
+                }
+
+                //nothing else to read, close the file.
+                file->close(returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to close file during END_OF_STREAM\n");
+                  sendOnErrorToListener(audioStream, returnCode);
+                }
+                else
+                  sendOnStoppedToListener(audioStream);   //NORMAL CASE
+                return;
+              }
+              else if (returnCode == ReturnCode::PENDING_DATA)
+              {
+                //we were not able to read a buffer. We will have to try again
+                //a little later (50 ms).
+                ReturnCode::Type returnCode;
+                MediaFileWriterImplProxy proxy(rootProxy);
+                if (!proxy)
+                {
+                  UAPI_ERROR(fn,"Could not create proxy\n");
+                  sendOnErrorToListener(audioStream, ReturnCode::OUT_OF_MEMORY);
+                  return;
+                }
+                WriteFileTask* task = new WriteFileTask(proxy, audioStream, 50);
+                if (!task)
+                {
+                  UAPI_ERROR(fn,"Could not create WriteFileTask\n");
+                  sendOnErrorToListener(audioStream, ReturnCode::OUT_OF_MEMORY);
+                  return;
+                }
+                workerQueue->enqueue(task, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to enqueue WriteFileTask reason %s\n", ReturnCode::toString(returnCode));
+                  sendOnErrorToListener(audioStream, returnCode);
+                  delete task;
+                  return;
+                }
+              }
+              break;
+            }
+          }
+        }
+        
+        StartWriteFileTask::StartWriteFileTask(MediaFileWriterImplProxy& _mediaFileWriter,
+                                               AudioStreamImplProxy& _audioStream):
+            Task("StartWriteFileTask"),
+            mediaFileWriter(_mediaFileWriter),
+            audioStream(_audioStream)
+        {}
+        
+        void StartWriteFileTask::run()
+        {
+          mediaFileWriter->runStartWriteFileTask(audioStream);
+        }
+        
+        WriteFileTask::WriteFileTask(MediaFileWriterImplProxy& _mediaFileWriter,
+                                     AudioStreamImplProxy& _audioStream,
+                                     UINT32 timeout):
+            ScheduledTask(timeout, "WriteFileTask"),
+            mediaFileWriter(_mediaFileWriter),
+            audioStream(_audioStream)
+        {}
+        
+        void WriteFileTask::run()
+        {
+          mediaFileWriter->runWriteFileTask(audioStream);
+        }
+        
+        void MediaFileWriterImpl::sendOnErrorToListener(AudioStreamImplProxy& audioStream,
+            ReturnCode::Type error)
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MediaFileWriterImpl::sendOnErrorToListener");
+            
+          cleanupAudioStreamProxy(audioStream, returnCode);
+          //don't care about rc, we are already sending an error.
+          
+          // Adding this to fix error. Close file now!
+          closeFile(returnCode);
+            
+          state = IDLE;
+
+          if (listener)
+            listener->onError(error);
+        }
+        
+        void MediaFileWriterImpl::sendOnStoppedToListener(AudioStreamImplProxy& audioStream)
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("MediaFileWriterImpl::sendOnStoppedToListener");
+
+          cleanupAudioStreamProxy(audioStream, returnCode);
+
+          state = IDLE;
+
+          if (returnCode) 
+          {
+            if (listener)
+              listener->onError(returnCode);
+          }
+          else
+          {
+            //normal case
+            if (listener)
+              listener->onStopped();
+          }
+        }
+        
+        void MediaFileWriterImpl::cleanupAudioStreamProxy(AudioStreamImplProxy& audioStream, ReturnCode::Type& returnCode)
+        {
+          audioStream->unlock();
+          audioStream = AudioStreamImplProxy();
+          returnCode = ReturnCode::SUCCESS;
+        }
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/audio/source/MediaFileWriterListener.cpp b/uapi/cpp/audio/source/MediaFileWriterListener.cpp
new file mode 100644
index 0000000..a3d9f91
--- /dev/null
+++ b/uapi/cpp/audio/source/MediaFileWriterListener.cpp
@@ -0,0 +1,34 @@
+/*---------------------------------------------------------------------------*
+ *  MediaFileWriterListener.cpp                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "MediaFileWriterListener.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, MediaFileWriterListenerProxy, SmartProxy, MediaFileWriterListener)
+
+MediaFileWriterListener::MediaFileWriterListener()
+{
+}
+
+MediaFileWriterListener::~MediaFileWriterListener()
+{
+}
diff --git a/uapi/cpp/audio/source/Microphone.cpp b/uapi/cpp/audio/source/Microphone.cpp
new file mode 100644
index 0000000..7f62014
--- /dev/null
+++ b/uapi/cpp/audio/source/Microphone.cpp
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------------*
+ *  Microphone.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "Microphone.h"
+#include "SmartProxy.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, MicrophoneProxy, AudioSourceProxy, Microphone)
+
+Microphone::Microphone()
+{}
+
+Microphone::~Microphone()
+{
+  instance = 0;
+}
diff --git a/uapi/cpp/audio/source/MicrophoneListener.cpp b/uapi/cpp/audio/source/MicrophoneListener.cpp
new file mode 100644
index 0000000..c7ee06f
--- /dev/null
+++ b/uapi/cpp/audio/source/MicrophoneListener.cpp
@@ -0,0 +1,34 @@
+/*---------------------------------------------------------------------------*
+ *  MicrophoneListener.cpp                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "MicrophoneListener.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, MicrophoneListenerProxy, AudioSourceListenerProxy, MicrophoneListener)
+
+MicrophoneListener::MicrophoneListener()
+{
+}
+
+MicrophoneListener::~MicrophoneListener()
+{
+}
diff --git a/uapi/cpp/audio/source/WavePCMHelper.cpp b/uapi/cpp/audio/source/WavePCMHelper.cpp
new file mode 100644
index 0000000..68ecccf
--- /dev/null
+++ b/uapi/cpp/audio/source/WavePCMHelper.cpp
@@ -0,0 +1,341 @@
+/*---------------------------------------------------------------------------*
+ *  AudioBuffer.cpp                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "WavePCMHelper.h"
+#include "File.h"
+#include "Logger.h"
+#include "CodecHelper.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+
+static void fwriteId(const char* id, File* file, ReturnCode::Type & returnCode) 
+{
+	UINT32 numItems = 1;
+	file->write((void*)id, sizeof(long), numItems, returnCode);
+}
+
+static void fwriteLong(long data, File* file, ReturnCode::Type & returnCode)
+{
+	UINT32 numItems = 1;
+	file->write(&data, sizeof(data), numItems, returnCode);
+}
+
+static void fwriteShort(INT16 data, File* file, ReturnCode::Type & returnCode)
+{
+	UINT32 numItems = 1;
+	file->write(&data, sizeof(data), numItems, returnCode);
+}
+
+/* definition from http://ccrma.stanford.edu/courses/422/projects/WaveFormat */
+void WavePCMHelper::writeWavHeader(File * file,
+		INT32 sampleRate, 
+		INT16 numChannels, 
+		INT16 bitsPerSample, 
+		INT32 numBytes, 
+		ReturnCode::Type & returnCode)
+{
+	UAPI_FN_SCOPE("WavePCMHelper::writeWavHeader");
+	/* RIFF header */
+	fwriteId("RIFF", file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteLong(36 + numBytes, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteId("WAVE", file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+
+	/* fmt chunk */
+	fwriteId("fmt ", file, returnCode); 
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteLong(16, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteShort(1, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteShort(numChannels, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteLong(sampleRate, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteLong(numChannels * sampleRate * bitsPerSample / 8, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteShort(numChannels * bitsPerSample / 8, file, returnCode); 
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteShort(bitsPerSample, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+
+	/* data chunk */
+	fwriteId("data", file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+	fwriteLong(numBytes, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+		return;
+}
+
+
+void WavePCMHelper::updateFileLength(File * file, INT32 numBytes, ReturnCode::Type & returnCode)
+{
+	UAPI_FN_SCOPE("WavePCMHelper::updateFileLength");
+
+  file->seek(4, File::UAPI_SEEK_SET, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not seek to position 4\n");
+		return;
+	}
+
+	fwriteLong(36 + numBytes, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Failed to update the ChunkSize\n");
+		return;
+	}
+  
+  file->seek(40, File::UAPI_SEEK_SET, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not seek to position 40\n");
+		return;
+	}
+
+	fwriteLong(numBytes, file, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Failed to update the subChunk2Size\n");
+		return;
+	}
+}
+
+void WavePCMHelper::getWavFileInfo( File * file, 
+                                    Codec::Type & out_codec, 
+                                    UINT16 & out_headerOffset,
+                                    ReturnCode::Type & returnCode )
+{
+  UAPI_FN_SCOPE("WavePCMHelper::getWavFileInfo");
+
+  //we only support two formats
+  //1) Sphere NIST
+  //2) RIFF wave
+
+
+  //go at the beginning of the file. 
+  file->seek(0, File::UAPI_SEEK_SET, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not seek to position 0\n");
+		return;
+	}
+
+  UINT32 numToRead = 4;
+  char szHeader[5];
+  file->read( szHeader, sizeof(char), numToRead, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not read file header\n");
+		return;
+	}
+  szHeader[4] = '\0';
+
+  if( strcmp(szHeader, "RIFF") == 0 )
+  {
+    out_headerOffset = 44;
+    getRIFFfileInfo(file, out_codec, returnCode);
+    return;
+  }
+  else if( strcmp(szHeader, "NIST") == 0 )
+  {
+    out_headerOffset = 1024;
+    getNISTfileInfo(file, out_codec, returnCode);
+    return;
+  }
+  else
+  {
+    UAPI_ERROR(fn,"Unsupported wave file format. Supported formats are NIST"
+        " Sphere and Wave RIFF.\n");
+    returnCode = ReturnCode::NOT_SUPPORTED;
+    return;
+  }
+}
+
+void WavePCMHelper::getRIFFfileInfo( File * file, 
+                                    Codec::Type & out_codec, 
+                                    ReturnCode::Type & returnCode )
+{
+  UAPI_FN_SCOPE("WavePCMHelper::getRIFFfileInfo");
+
+  //the sample rate is located at position 24
+  file->seek(24, File::UAPI_SEEK_SET, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not seek to position 0\n");
+		return;
+	}
+
+  //read the SampleRate @ index 24
+  long sample_rate;
+  UINT32 numToRead = 1;
+  file->read( &sample_rate, sizeof(long), numToRead, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not read sample_rate\n");
+		return;
+	}
+
+
+	//read BitsPerSample @index 34
+  file->seek(34, File::UAPI_SEEK_SET, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not seek to position 0\n");
+		return;
+	}
+	
+	INT16 sample_num_bits;
+  numToRead = 1;
+  file->read( &sample_num_bits, sizeof(INT16), numToRead, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not read sample_num_bytes\n");
+		return;
+	}
+  INT16 sample_num_bytes = sample_num_bits / 8;
+
+	out_codec = CodecHelper::GetCodecFromRateNumBytesPerSample(sample_rate, sample_num_bytes, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not find a supported codec that matches sample rate %ld, "
+				"num samples per byte %d\n", sample_rate, sample_num_bytes);
+		return;
+	}
+
+
+}
+
+void WavePCMHelper::getNISTfileInfo( File * file, 
+                                    Codec::Type & out_codec, 
+                                    ReturnCode::Type & returnCode )
+{
+  UAPI_FN_SCOPE("WavePCMHelper::getNISTfileInfo");
+
+  //TODO this is a very basic implementation and it is only used for our
+  //internal testing. If we want to fully support this format, more code should
+  //be added.
+
+  /*
+     NIST_1A
+     1024
+     sample_count -i 24707
+     sample_n_bytes -i 2
+     channel_count -i 1
+     sample_byte_format -s2 01
+     sample_rate -i 11025
+     sample_coding -s3 pcm
+     end_head
+  */
+
+  //go at the beginning of the file. 
+  file->seek(0, File::UAPI_SEEK_SET, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not seek to position 0\n");
+		return;
+	}
+
+  //read the full header
+  UINT32 numToRead = 1024;
+  char szHeader[1025];
+  file->read( szHeader, sizeof(char), numToRead, returnCode);
+	if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not read file header\n");
+		return;
+	}
+  szHeader[1024] = '\0';
+
+  //find the "sample_rate -i "
+  static const char * const NIST_SAMPLE_RATE = "sample_rate -i ";
+  char * sample_rate_start = strstr(szHeader, NIST_SAMPLE_RATE );
+  if( sample_rate_start == 0 )
+  {
+    UAPI_WARN(fn,"NIST files does not contain %s\n", NIST_SAMPLE_RATE);
+    returnCode = ReturnCode::NOT_SUPPORTED;
+    return;
+  }
+  //find the end
+  char * end = strstr(sample_rate_start + strlen(NIST_SAMPLE_RATE), "\n");
+  if( end == 0 )
+  {
+    UAPI_WARN(fn,"NIST files does not contain end of %s\n", NIST_SAMPLE_RATE);
+    returnCode = ReturnCode::NOT_SUPPORTED;
+    return;
+  }
+  *end = '\0';
+
+  INT32 sample_rate = atoi(sample_rate_start + strlen(NIST_SAMPLE_RATE));
+
+  //find the "sample_n_bytes -i" 
+  static const char * const NIST_SAMPLE_NUM_BYES = "sample_n_bytes -i ";
+  char * sample_num_bytes_start = strstr(szHeader, NIST_SAMPLE_NUM_BYES );
+  if( sample_num_bytes_start == 0 )
+  {
+    UAPI_WARN(fn,"NIST files does not contain %s\n", NIST_SAMPLE_NUM_BYES);
+    returnCode = ReturnCode::NOT_SUPPORTED;
+    return;
+  }
+  //find the end
+  end = strstr(sample_num_bytes_start + strlen(NIST_SAMPLE_NUM_BYES), "\n");
+  if( end == 0 )
+  {
+    UAPI_WARN(fn,"NIST files does not contain end of %s\n", NIST_SAMPLE_NUM_BYES);
+    returnCode = ReturnCode::NOT_SUPPORTED;
+    return;
+  }
+  *end = '\0';
+
+  INT16 sample_num_bytes = (INT16)atoi(sample_num_bytes_start + strlen(NIST_SAMPLE_NUM_BYES));
+
+  out_codec = CodecHelper::GetCodecFromRateNumBytesPerSample(sample_rate, sample_num_bytes, returnCode);
+  if( returnCode != ReturnCode::SUCCESS )
+	{
+		UAPI_WARN(fn,"Could not find a supported codec that matches sample rate %d, "
+      "num samples per byte %d\n", sample_rate, sample_num_bytes);
+		return;
+	}
+}
+
+
diff --git a/uapi/cpp/grammar/Android.mk b/uapi/cpp/grammar/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/grammar/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/grammar/include/VoicetagItemImpl.h b/uapi/cpp/grammar/include/VoicetagItemImpl.h
new file mode 100644
index 0000000..39bce08
--- /dev/null
+++ b/uapi/cpp/grammar/include/VoicetagItemImpl.h
@@ -0,0 +1,106 @@
+/*---------------------------------------------------------------------------*
+ *  VoicetagItemImpl.h                                                       *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__VOICETAGITEMIMPL
+#define __UAPI__VOICETAGITEMIMPL
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "VoicetagItem.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        class VoicetagItemImplProxy;
+        /**
+         * Voicetag that may be inserted into an embedded grammar slot.
+         */
+        class VoicetagItemImpl: public VoicetagItem
+        {
+          public:
+
+            /**
+             * (Optional operation) Returns the audio used to construct the Voicetag. The
+             * audio is in PCM format and is start-pointed and end-pointed. The audio is
+             * only generated if the enableGetWaveform recognition parameter is set
+             * prior to recognition.
+             *
+             * @param waveform the read-only endpointed waveform
+             * @param size the size of the waveform in bytes
+             * @param returnCode the return code
+             * @see RecognizerParameters.enableGetWaveform
+             */
+            UAPI_EXPORT virtual void getAudio(const INT16** waveform,
+                                  ARRAY_LIMIT* size,
+                                  ReturnCode::Type& returnCode) const = 0;
+                                  
+            /**
+             * (Optional operation) Sets the audio used to construct the Voicetag. The
+             * audio is in PCM format and is start-pointed and end-pointed. The audio is
+             * only generated if the enableGetWaveform recognition parameter is set
+             * prior to recognition.
+             *
+             * @param waveform the endpointed waveform
+             * @param size the size of the waveform in bytes
+             * @param returnCode the return code
+             * @see RecognizerParameters.enableGetWaveform
+             */
+            UAPI_EXPORT virtual void setAudio(const android::speech::recognition::INT16* waveform,
+                                  ARRAY_LIMIT size,
+                                  ReturnCode::Type& returnCode) = 0;
+          protected:
+            /**
+             * Creates a new VoicetagItemImpl.
+             *
+             * @param waveform the audio used to generate the voicetag
+             * @param size the size of the waveform in bytes
+             */
+            UAPI_EXPORT VoicetagItemImpl(const INT16* waveform,
+                             ARRAY_LIMIT size);
+            /**
+             * Prevent destruction.
+             */
+            UAPI_EXPORT virtual ~VoicetagItemImpl();
+            
+            const android::speech::recognition::INT16* waveform;
+            android::speech::recognition::ARRAY_LIMIT waveformSize;
+          private:
+            /**
+             * Prevent assignment.
+             */
+            VoicetagItemImpl& operator=(VoicetagItemImpl& other);
+            
+            friend class VoicetagItemImplProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, VoicetagItemImplProxy, VoicetagItemProxy, VoicetagItemImpl)
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/grammar/include/WordItemImpl.h b/uapi/cpp/grammar/include/WordItemImpl.h
new file mode 100644
index 0000000..f863d77
--- /dev/null
+++ b/uapi/cpp/grammar/include/WordItemImpl.h
@@ -0,0 +1,92 @@
+/*---------------------------------------------------------------------------*
+ *  WordItemImpl.h                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__WORDITEMIMPL
+#define __UAPI__WORDITEMIMPL
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "WordItem.h"
+#include <string.h>
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        class WordItemImplProxy;
+        /**
+         * Word that may be inserted into an embedded grammar slot.
+         */
+        class UAPI_EXPORT WordItemImpl: public WordItem
+        {
+          public:
+            /**
+             * Creates a new WordItemImpl.
+             *
+             * @param word the word to be added
+             * @param pronunciations the pronunciations to associated with the item. If the list is
+             * is empty the recognizer will attempt to guess the pronunciations.
+             * @param pronunciationCount the number of pronunciations
+             * @param returnCode ILLEGAL_ARGUMENT if pronunciations is null or pronunciationCount < 1
+             */
+            static WordItemImplProxy create(const char* word, const char** pronunciations,
+                                            ARRAY_LIMIT pronunciationCount,
+                                            ReturnCode::Type& returnCode);
+                                            
+            /**
+             * Returns the word to add.
+             */
+            const char* getWord() const;
+            
+            /**
+             * Returns a pronunciation that is associated with the WordItem.
+             */
+            const char* getPronunciation() const;
+            
+          protected:
+            /**
+             * Prevent construction.
+             */
+            WordItemImpl(const char* word, const char* pronunciations);
+            /**
+             * Prevent destruction.
+             */
+            virtual ~WordItemImpl();
+
+        private:
+            const char* _word;
+            const char* _pronunciations;
+            friend class WordItemImplProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, WordItemImplProxy, WordItemProxy, WordItemImpl)
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/grammar/source/Android.mk b/uapi/cpp/grammar/source/Android.mk
new file mode 100644
index 0000000..ab85406
--- /dev/null
+++ b/uapi/cpp/grammar/source/Android.mk
@@ -0,0 +1,49 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	EmbeddedGrammar.cpp \
+	EmbeddedGrammarListener.cpp \
+	Grammar.cpp \
+	GrammarListener.cpp \
+	SlotItem.cpp \
+	SrecGrammar.cpp \
+	SrecGrammarListener.cpp \
+	VoicetagItem.cpp \
+	VoicetagItemImpl.cpp \
+	VoicetagItemListener.cpp \
+	WordItem.cpp \
+	WordItemImpl.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../api/include \
+	$(LOCAL_PATH)/../../audio/include \
+	$(LOCAL_PATH)/../../audio/linux/include \
+	$(LOCAL_PATH)/../../grammar/include \
+	$(LOCAL_PATH)/../../uapi/include \
+	$(LOCAL_PATH)/../../utilities/include \
+	$(LOCAL_PATH)/../../utilities/linux/include \
+	$(LOCAL_PATH)/../../../java/jniapi/jniapi \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+
+LOCAL_CFLAGS := \
+	-DUAPI_EXPORTS \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_LDLIBS += \
+	-lpthread \
+	-ldl \
+
+LOCAL_MODULE:= libUAPI_grammar
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/uapi/cpp/grammar/source/EmbeddedGrammar.cpp b/uapi/cpp/grammar/source/EmbeddedGrammar.cpp
new file mode 100644
index 0000000..1734cfd
--- /dev/null
+++ b/uapi/cpp/grammar/source/EmbeddedGrammar.cpp
@@ -0,0 +1,32 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedGrammar.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "EmbeddedGrammar.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, EmbeddedGrammarProxy, GrammarProxy, EmbeddedGrammar)
+
+EmbeddedGrammar::EmbeddedGrammar()
+{}
+
+EmbeddedGrammar::~EmbeddedGrammar()
+{}
diff --git a/uapi/cpp/grammar/source/EmbeddedGrammarListener.cpp b/uapi/cpp/grammar/source/EmbeddedGrammarListener.cpp
new file mode 100644
index 0000000..2944591
--- /dev/null
+++ b/uapi/cpp/grammar/source/EmbeddedGrammarListener.cpp
@@ -0,0 +1,29 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedGrammarListener.cpp                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "EmbeddedGrammarListener.h"
+
+using namespace android::speech::recognition;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, EmbeddedGrammarListenerProxy, GrammarListenerProxy, EmbeddedGrammarListener)
+
+EmbeddedGrammarListener::~EmbeddedGrammarListener()
+{}
diff --git a/uapi/cpp/grammar/source/Grammar.cpp b/uapi/cpp/grammar/source/Grammar.cpp
new file mode 100644
index 0000000..bac4058
--- /dev/null
+++ b/uapi/cpp/grammar/source/Grammar.cpp
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  Grammar.cpp                                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "Grammar.h"
+#include "SmartProxy.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, GrammarProxy, SmartProxy, Grammar)
+
+Grammar::Grammar()
+{}
+
+Grammar::~Grammar()
+{}
diff --git a/uapi/cpp/grammar/source/GrammarListener.cpp b/uapi/cpp/grammar/source/GrammarListener.cpp
new file mode 100644
index 0000000..fb83cdf
--- /dev/null
+++ b/uapi/cpp/grammar/source/GrammarListener.cpp
@@ -0,0 +1,29 @@
+/*---------------------------------------------------------------------------*
+ *  GrammarListener.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "GrammarListener.h"
+
+using namespace android::speech::recognition;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, GrammarListenerProxy, SmartProxy, GrammarListener)
+
+GrammarListener::~GrammarListener()
+{}
diff --git a/uapi/cpp/grammar/source/SlotItem.cpp b/uapi/cpp/grammar/source/SlotItem.cpp
new file mode 100644
index 0000000..c78d558
--- /dev/null
+++ b/uapi/cpp/grammar/source/SlotItem.cpp
@@ -0,0 +1,32 @@
+/*---------------------------------------------------------------------------*
+ *  SlotItem.cpp                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SlotItem.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, SlotItemProxy, SmartProxy, SlotItem)
+
+SlotItem::SlotItem()
+{}
+
+SlotItem::~SlotItem()
+{}
diff --git a/uapi/cpp/grammar/source/SrecGrammar.cpp b/uapi/cpp/grammar/source/SrecGrammar.cpp
new file mode 100644
index 0000000..1a95518
--- /dev/null
+++ b/uapi/cpp/grammar/source/SrecGrammar.cpp
@@ -0,0 +1,32 @@
+/*---------------------------------------------------------------------------*
+ *  SrecGrammar.cpp                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "SrecGrammar.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, SrecGrammarProxy, EmbeddedGrammarProxy, SrecGrammar)
+
+SrecGrammar::SrecGrammar()
+{}
+
+SrecGrammar::~SrecGrammar()
+{}
diff --git a/uapi/cpp/grammar/source/SrecGrammarListener.cpp b/uapi/cpp/grammar/source/SrecGrammarListener.cpp
new file mode 100644
index 0000000..1857558
--- /dev/null
+++ b/uapi/cpp/grammar/source/SrecGrammarListener.cpp
@@ -0,0 +1,29 @@
+/*---------------------------------------------------------------------------*
+ *  SrecGrammarListener.cpp                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "SrecGrammarListener.h"
+
+using namespace android::speech::recognition;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, SrecGrammarListenerProxy,EmbeddedGrammarListenerProxy, SrecGrammarListener)
+
+SrecGrammarListener::~SrecGrammarListener()
+{}
diff --git a/uapi/cpp/grammar/source/VoicetagItem.cpp b/uapi/cpp/grammar/source/VoicetagItem.cpp
new file mode 100644
index 0000000..76c56ba
--- /dev/null
+++ b/uapi/cpp/grammar/source/VoicetagItem.cpp
@@ -0,0 +1,45 @@
+/*---------------------------------------------------------------------------*
+ *  VoicetagItem.cpp                                                         *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "VoicetagItem.h"
+#include "VoicetagItemImpl.h"
+
+using namespace android::speech::recognition;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, VoicetagItemProxy, SlotItemProxy, VoicetagItem)
+
+VoicetagItem::VoicetagItem()
+{}
+
+bool VoicetagItem::isWord() const
+{
+  return false;
+}
+
+bool VoicetagItem::isVoicetag() const
+{
+  return true;
+}
diff --git a/uapi/cpp/grammar/source/VoicetagItemImpl.cpp b/uapi/cpp/grammar/source/VoicetagItemImpl.cpp
new file mode 100644
index 0000000..04799e1
--- /dev/null
+++ b/uapi/cpp/grammar/source/VoicetagItemImpl.cpp
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*
+ *  VoicetagItemImpl.cpp                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <string.h>
+#include "VoicetagItem.h"
+#include "VoicetagItemImpl.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+
+
+DEFINE_SMARTPROXY(impl, VoicetagItemImplProxy, VoicetagItemProxy, VoicetagItemImpl)
+
+VoicetagItemImpl::VoicetagItemImpl(const INT16* _waveform, ARRAY_LIMIT _size):
+    waveform(_waveform),
+    waveformSize(_size)
+{}
+
+VoicetagItemImpl::~VoicetagItemImpl()
+{
+    // Delete the waveform
+    if (waveform)
+    {
+        delete[] waveform;
+        waveform = NULL;
+    }
+    waveformSize = 0;
+}
diff --git a/uapi/cpp/grammar/source/VoicetagItemListener.cpp b/uapi/cpp/grammar/source/VoicetagItemListener.cpp
new file mode 100644
index 0000000..e4e4a1f
--- /dev/null
+++ b/uapi/cpp/grammar/source/VoicetagItemListener.cpp
@@ -0,0 +1,34 @@
+/*---------------------------------------------------------------------------*
+ *  VoicetagItemListener.cpp                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "VoicetagItemListener.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, VoicetagItemListenerProxy, SmartProxy, VoicetagItemListener)
+
+VoicetagItemListener::VoicetagItemListener()
+{
+}
+
+VoicetagItemListener::~VoicetagItemListener()
+{
+}
diff --git a/uapi/cpp/grammar/source/WordItem.cpp b/uapi/cpp/grammar/source/WordItem.cpp
new file mode 100644
index 0000000..17e0f73
--- /dev/null
+++ b/uapi/cpp/grammar/source/WordItem.cpp
@@ -0,0 +1,63 @@
+/*---------------------------------------------------------------------------*
+ *  WordItem.cpp                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "WordItem.h"
+#include "WordItemImpl.h"
+
+using namespace android::speech::recognition;
+
+DEFINE_SMARTPROXY(android::speech::recognition, WordItemProxy, SlotItemProxy, WordItem)
+
+WordItemProxy WordItem::create(const char* word, const char** pronunciations,
+                               ARRAY_LIMIT pronunciationCount, ReturnCode::Type& returnCode)
+{
+  return impl::WordItemImpl::create(word, pronunciations, pronunciationCount, returnCode);
+}
+
+WordItemProxy WordItem::create(const char* word, const char* pronunciation,
+                               ReturnCode::Type& returnCode)
+{
+  const char** pronunciations = new const char*[1];
+  pronunciations[0] = pronunciation;
+  WordItemProxy result = impl::WordItemImpl::create(word, pronunciations, 1, returnCode);
+  delete [] pronunciations;
+  return result;
+}
+
+WordItem::WordItem()
+{}
+
+WordItem::~WordItem()
+{}
+
+bool WordItem::isWord() const
+{
+  return true;
+}
+
+bool WordItem::isVoicetag() const
+{
+  return false;
+}
diff --git a/uapi/cpp/grammar/source/WordItemImpl.cpp b/uapi/cpp/grammar/source/WordItemImpl.cpp
new file mode 100644
index 0000000..fde0740
--- /dev/null
+++ b/uapi/cpp/grammar/source/WordItemImpl.cpp
@@ -0,0 +1,118 @@
+/*---------------------------------------------------------------------------*
+ *  WordItemImpl.cpp                                                         *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "WordItemImpl.h"
+#include "ReturnCode.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+
+
+DEFINE_SMARTPROXY(impl, WordItemImplProxy, WordItemProxy, WordItemImpl)
+
+WordItemImpl::WordItemImpl(const char* word, const char* pronunciations):
+    _word(word),
+    _pronunciations(pronunciations)
+{
+}
+
+WordItemImplProxy WordItemImpl::create(const char* word, const char** pronunciations,
+                                       ARRAY_LIMIT pronunciationCount,
+                                       ReturnCode::Type& returnCode)
+{
+  if (pronunciationCount > 0 && pronunciations == 0)
+  {
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return WordItemImplProxy();
+  }
+  char* wordCopy = new char[strlen(word)+1];
+  if (wordCopy == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return WordItemImplProxy();
+  }
+  strcpy(wordCopy, word);
+  
+  
+  /* when making a copy of the prons, let's make one big allocation
+     beacuse this is how SREC wants it anyways:
+     SREC needs a char* pronunciations like (double null at the end):
+     [data1\0data2\0\data3\0\0]
+  */
+  size_t szBuff = 0;
+  for (ARRAY_LIMIT i = 0; i < pronunciationCount; ++i)
+      szBuff+=strlen(pronunciations[i]);
+  szBuff+=pronunciationCount; //add for null character for each pronunciation
+  szBuff+=1;                  //add for termination null 
+    
+  char* pronunciationsCopy = new char[szBuff];
+  if (pronunciationCount>0)
+  {
+        char* p = pronunciationsCopy;
+        size_t count = 0;
+        for (ARRAY_LIMIT i = 0; i < pronunciationCount; ++i)
+        {
+            strcpy(p,pronunciations[i]);    
+            count+=strlen(pronunciations[i]);
+            count++;
+            p = &pronunciationsCopy[count];
+            p[0]='\0';
+        }
+        p = NULL;
+  }
+  else 
+      pronunciationsCopy[0] = '\0';
+  WordItemImpl* object = new WordItemImpl(wordCopy,pronunciationsCopy);
+
+  if (object == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    delete[] wordCopy;
+    delete[] pronunciationsCopy;
+    return WordItemImplProxy();
+  }
+  WordItemImplProxy result(object);
+  if (!result)
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+  else
+    returnCode = ReturnCode::SUCCESS;
+  return result;
+}
+
+WordItemImpl::~WordItemImpl()
+{
+  delete[] _word;
+  delete[] _pronunciations;
+}
+
+const char* WordItemImpl::getWord() const
+{
+  return _word;
+}
+
+const char* WordItemImpl::getPronunciation() const
+{
+  return _pronunciations;
+}
diff --git a/uapi/cpp/recognizer/Android.mk b/uapi/cpp/recognizer/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/recognizer/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/recognizer/srec/Android.mk b/uapi/cpp/recognizer/srec/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/recognizer/srec/include/SrecGrammarImpl.h b/uapi/cpp/recognizer/srec/include/SrecGrammarImpl.h
new file mode 100644
index 0000000..e6b582c
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/include/SrecGrammarImpl.h
@@ -0,0 +1,346 @@
+/*---------------------------------------------------------------------------*
+ *  SrecGrammarImpl.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SRECGRAMMARIMPL
+#define __UAPI__SRECGRAMMARIMPL
+
+#include "exports.h"
+#include "SrecGrammar.h"
+#include "Task.h"
+#include "SlotItem.h"
+#include "SrecRecognizerImpl.h"
+#include "GrammarListener.h"
+
+typedef struct SR_Grammar_t SR_Grammar;
+typedef struct SR_Vocabulary_t SR_Vocabulary;
+typedef struct SR_AcousticModels_t SR_AcousticModels;
+typedef struct SR_Recognizer_t SR_Recognizer;
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class GrammarListener;
+      namespace utilities
+      {
+        class WorkerQueue;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        class SrecGrammarImplProxy;
+        /**
+         * SREC grammar.
+         */
+        class SrecGrammarImpl: public SrecGrammar
+        {
+          public:
+            /**
+             * Creates a new SREC grammar.
+             *
+             * @param path the path to load the grammar from
+             * @param listener the grammar listener
+             * @param recognizer an instance of SrecRecognizerImpl::Proxy
+             * @param workerQueue the worker queue to uswell
+             * @param returnCode returns SUCCESS unless a fatal error occurs
+             */
+            SREC_EXPORT static SrecGrammarImplProxy create(const char* path,
+                android::speech::recognition::GrammarListenerProxy& listener,
+                SrecRecognizerImplProxy& recognizer,
+                android::speech::recognition::utilities::WorkerQueue* workerQueue,
+                ReturnCode::Type& returnCode);
+                
+            /**
+             * Adds an item to a slot.
+             *
+             * @param slotName the name of the slot
+             * @param item the item to add to the slot.
+             * @param weight the weight of the item. Smaller values are more likely to get recognized. This should be >= 0.
+             * @param semanticMeaning the value that will be returned if this item is recognized. This should
+             * be of the form "V='Jen_Parker'"
+             * @param returnCode ILLEGAL_ARGUMENT if slotName, item or semanticMeaning are null or if
+             * semanticMeaning is not in the form "key=value". ILLEGAL_STATE if the associated
+             * recognizer has been deleted. HOMONYM_COLLISION if another item with the same
+             * pronunciation already exists in the slot.
+             */
+            SREC_EXPORT virtual void addItem(const char* slotName, const SlotItemProxy& item,
+                                             int weight, const char* semanticMeaning,
+                                             ReturnCode::Type& returnCode);
+            /**
+             * Add a list of item to a slot.
+             *
+             * @param slotName the name of the slot
+             * @param items the array of SlotItems to add to the slot.
+             * @param weights the array of weights for each item in the list. Smaller values are more likely to get recognized.  This should be >= 0.
+             * @param semanticMeanings the array of strings that will be returned for each item during recognition.
+             * @param itemsCount number of items in the list
+             * @throws IllegalArgumentException if slotName, items, weights or semanticMeanings are null;if any semanticMeaning of the list is not of the format "V=&#039;Jen_Parker&#039; if the size of list parameters is not equal."
+             */
+             SREC_EXPORT virtual void addItemList(const char* slotName, 
+                                             SlotItemProxy** items,
+                                             int* weights,
+                                             const char** semanticMeanings,
+                                             ARRAY_LIMIT itemsCount,
+                                             ReturnCode::Type& returnCode);
+            /**
+             * Compiles items that were added to any of the grammar slots.
+             *
+             * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+             */
+            SREC_EXPORT virtual void compileAllSlots(ReturnCode::Type& returnCode);
+            
+            /**
+             * Removes all words added to all slots.
+             *
+             * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+             */
+            SREC_EXPORT virtual void resetAllSlots(ReturnCode::Type& returnCode);
+            
+            /**
+             * Indicates that the grammar will be used in the near future.
+             *
+             * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+             */
+            SREC_EXPORT virtual void load(ReturnCode::Type& returnCode);
+            
+            /**
+             * Indicates that the grammar will be used in the near future.
+             *
+             * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+             */
+            SREC_EXPORT virtual void unload(ReturnCode::Type& returnCode);
+            
+            /**
+             * Saves the compiled grammar.
+             *
+             * @param path the path to save the grammar to
+             * @param returnCode ILLEGAL_ARGUMENT if the associated recognizer has been deleted
+             */
+            SREC_EXPORT virtual void save(const char* path, ReturnCode::Type& returnCode);
+            
+            
+            /**
+             * Check if recognizer is idle, if not all grammar actions should be avoided.
+             * @return true if recognizer is idle, false otherwise
+             */
+            SREC_EXPORT static bool isSrecRecognizing();
+            friend class SrecRecognizerImpl;
+            friend class AddItemTask;
+            friend class AddItemListTask;
+            friend class CompileAllSlotsTask;
+            friend class ResetAllSlotsTask;
+            friend class SaveTask;
+            friend class LoadTask;
+            friend class UnloadTask;
+            friend class SrecGrammarImplProxy;
+          private:
+            /**
+             * Creates a new SREC grammar.
+             *
+             * @param path the path to load the grammar from
+             * @param listener the grammar listener
+             * @param recognizer an instance of SrecRecognizerImpl::Proxy
+             * @param workerQueue the worker queue to uswell
+             * @param returnCode returns SUCCESS unless a fatal error occurs
+             */
+            SrecGrammarImpl(const char* path, android::speech::recognition::GrammarListenerProxy& listener,
+                            SrecRecognizerImplProxy& recognizer,
+                            android::speech::recognition::utilities::WorkerQueue* workerQueue,
+                            ReturnCode::Type& returnCode);
+            /**
+             * Prevent assignment.
+             */
+            SrecGrammarImpl& operator=(SrecGrammarImpl&);
+            /**
+             * Prevent destruction.
+             */
+            virtual ~SrecGrammarImpl();
+            
+            /**
+             * Indicates if the grammar is loaded.
+             *
+             * @return true if the grammar is loaded
+             */
+            SREC_EXPORT virtual bool isLoaded();
+            /**
+             * Invoked by onAddItem and onAddItemList.
+             */
+            void onHelperAddItem(char* slotName, const SlotItemProxy& item, int weight, char* semanticMeaning,ReturnCode::Type& returnCode);
+            /**
+             * Invoked by AddItemTask.
+             */
+            void onAddItem(char* slotName, const SlotItemProxy& item, int weight, char* semanticMeaning);
+            /**
+             * Invoked by AddItemListTask.
+             */
+            void onAddItemList(char* slotName, SlotItemProxy* items, int* weights, char** semanticMeanings, ARRAY_LIMIT itemsCount);
+            /**
+             * Invoked by CompileAllSlotsTask.
+             */
+            void onCompileAllSlots();
+            /**
+             * Invoked by ResetAllSlotsTask.
+             */
+            void onResetAllSlots();
+            /**
+             * Invoked by LoadTask.
+             */
+            void onLoad();
+            /**
+             * Invoked by UnloadTask.
+             */
+            void onUnload();
+            /**
+             * Invoked by SaveTask.
+             */
+            void onSave(const char* path);
+            
+            
+            /**
+             * The path to load the grammar from.
+             */
+            char* path;
+            /**
+             * Indicates if the grammar has been loaded.
+             */
+            bool _loaded;
+            /**
+             * The underlying grammar.
+             */
+            SR_Grammar* grammar;
+            /**
+             * The associated recognizer.
+             */
+            SrecRecognizerImplProxy recognizer;
+            /**
+             * The grammar listener.
+             */
+            GrammarListenerProxy _listener;
+            /**
+             * The thread and the queue used to process aysnc tasks.
+             */
+            utilities::WorkerQueue* _workerQueue;
+            SmartProxy::Root* rootProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(SREC_EXPORT, SrecGrammarImplProxy, SrecGrammarProxy, SrecGrammarImpl)
+        
+        class AddItemTask: public utilities::Task
+        {
+          public:
+            AddItemTask(SrecGrammarImplProxy& grammar, char* slotName, const SlotItemProxy& item,
+                        int weight, char* semanticMeaning);
+            virtual void run();
+            virtual ~AddItemTask();
+            
+          private:
+            SrecGrammarImplProxy grammar;
+            char* _slotName;
+            const SlotItemProxy item;
+            int _weight;
+            char* _semanticMeaning;
+        };
+        
+        class AddItemListTask: public utilities::Task
+        {
+          public:
+            AddItemListTask(SrecGrammarImplProxy& grammar,
+                        char* slotName,
+                        SlotItemProxy* items,
+                        int* weights,
+                        char** semanticMeanings,
+                        ARRAY_LIMIT itemsCount);
+            virtual void run();
+            virtual ~AddItemListTask();
+            
+          private:
+            SrecGrammarImplProxy grammar;
+            char* _slotName;
+            SlotItemProxy* _items;
+            int* _weights;
+            char** _semanticMeanings;
+            ARRAY_LIMIT _itemsCount;
+        };
+        class CompileAllSlotsTask: public utilities::Task
+        {
+          public:
+            CompileAllSlotsTask(SrecGrammarImplProxy& grammar);
+            virtual void run();
+          private:
+            SrecGrammarImplProxy grammar;
+        };
+        
+        class ResetAllSlotsTask: public utilities::Task
+        {
+          public:
+            ResetAllSlotsTask(SrecGrammarImplProxy& grammar);
+            virtual void run();
+          private:
+            SrecGrammarImplProxy grammar;
+        };
+        
+        class LoadTask: public utilities::Task
+        {
+          public:
+            LoadTask(SrecGrammarImplProxy& grammar);
+            virtual void run();
+          private:
+            SrecGrammarImplProxy grammar;
+        };
+        
+        class UnloadTask: public utilities::Task
+        {
+          public:
+            UnloadTask(SrecGrammarImplProxy& grammar);
+            virtual void run();
+          private:
+            SrecGrammarImplProxy grammar;
+        };
+        
+        class SaveTask: public utilities::Task
+        {
+          public:
+            SaveTask(SrecGrammarImplProxy& grammar, const char* path);
+            virtual ~SaveTask();
+            virtual void run();
+          private:
+            const char* path;
+            SrecGrammarImplProxy grammar;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/recognizer/srec/include/SrecHelper.h b/uapi/cpp/recognizer/srec/include/SrecHelper.h
new file mode 100644
index 0000000..de0c89b
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/include/SrecHelper.h
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*
+ *  SrecHelper.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SRECHELPER
+#define __UAPI__SRECHELPER
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "ESR_ReturnCode.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        /**
+         * SREC helper functions.
+         */
+        class SREC_EXPORT SrecHelper
+        {
+          public:
+            /**
+             * Returns the UAPI return-code associated with the specified SREC return-code.
+             *
+             * @param code the SREC return-code
+             */
+            static ReturnCode::Type toUAPI(ESR_ReturnCode code);
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/recognizer/srec/include/SrecRecognitionResultImpl.h b/uapi/cpp/recognizer/srec/include/SrecRecognitionResultImpl.h
new file mode 100644
index 0000000..2056ecf
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/include/SrecRecognitionResultImpl.h
@@ -0,0 +1,213 @@
+/*---------------------------------------------------------------------------*
+ *  SrecRecognitionResultImpl.h                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SRECRECOGNITIONRESULTIMPL
+#define __UAPI__SRECRECOGNITIONRESULTIMPL
+
+#include "exports.h"
+#include "types.h"
+#include "NBestRecognitionResult.h"
+
+
+typedef struct SR_RecognizerResult_t SR_RecognizerResult;
+#include "LCHAR.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        class SrecRecognitionResultImplProxy;
+        /**
+         * SREC recognition result.
+         */
+        class SrecRecognitionResultImpl: public NBestRecognitionResult
+        {
+          public:
+            class EntryImplProxy; // This is the only legal way to forward-declare a nested class
+            
+            /**
+             * NBestList entry.
+             *
+             * @see NBestRecognitionResult
+             */
+          class EntryImpl: public Entry
+            {
+              public:
+                /**
+                 * Returns the number of semantic key-value pairs.
+                 */
+                SREC_EXPORT virtual ARRAY_LIMIT getKeyCount() const;
+                /**
+                 * Returns the keys associated with the nbest entry.
+                 */
+                SREC_EXPORT virtual const char* const* getKeys();
+                /**
+                 * Returns the values associated with the nbest entry.
+                 *
+                 * @param key the semantic key to look up
+                 * @param returnCode the return code
+                 */
+                SREC_EXPORT virtual const char* getValue(const char* key,
+                    ReturnCode::Type& returnCode) const;
+
+                /**
+                 * The literal meaning of a recognition result (i.e. literally what the user said).
+                 * In an example where a person's name is mapped to a phone-number, the person's name
+                 * is the literal meaning.
+                 *
+                 * @param returnCode returns SUCCESS unless a fatal error occurs
+                 */
+                SREC_EXPORT virtual const char* getLiteralMeaning(ReturnCode::Type& returnCode)
+                const;
+                /**
+                 * The semantic meaning of a recognition result (i.e. the application-specific value
+                 * associated with what the user said). In an example where a person's name is mapped
+                 * to a phone-number, the phone-number is the semantic meaning.
+                 *
+                 * @param returnCode returns SUCCESS unless a fatal error occurs
+                 */
+                SREC_EXPORT virtual const char* getSemanticMeaning(ReturnCode::Type& returnCode)
+                const;
+                /**
+                 * The confidence score of a recognition result. Values range from 0 to 100 (inclusive).
+                 *
+                 * @param returnCode NOT_SUPPORTED if the engine does not generate a confidence score
+                 *        for this n-best entry.
+                 */
+                SREC_EXPORT virtual UINT8 getConfidenceScore(ReturnCode::Type& returnCode) const;
+                
+                friend class SrecRecognitionResultImpl;
+              private:
+                /**
+                 * Prevent destruction.
+                 */
+                virtual ~EntryImpl();
+                /**
+                 * Prevent construction.
+                 */
+                EntryImpl(LCHAR* semanticMeaning, LCHAR* literalMeaning, UINT8 confidenceScore,
+                          LCHAR ** keys, LCHAR ** values, ARRAY_LIMIT keyCount);
+                /**
+                 * Prevent copying.
+                 */
+                EntryImpl& operator=(EntryImpl& other);
+                
+                /**
+                 * Creates a new nbest entry.
+                 *
+                 * @param index the n-best list index associated with this entry
+                 * @param result the underlying recognition result
+                 * @param grammarConfigs the grammar configurations
+                 * @param configCount the number of configurations
+                 * @param returnCode NO_MATCH if no GrammarConfiguration::grammarToMeaning() matched
+                 * the recognition result
+                 */
+                static SrecRecognitionResultImpl::EntryImplProxy createEntry(
+                  ARRAY_LIMIT index, const SR_RecognizerResult* result,
+                  ReturnCode::Type& returnCode);
+                  
+                  
+                const LCHAR*    semanticMeaning;
+                const LCHAR*    literalMeaning;
+                const UINT8     confidenceScore;
+                LCHAR**   keys;
+                LCHAR**   values;
+                ARRAY_LIMIT     keyCount;
+                
+                friend class EntryImplProxy;
+            };
+            
+            /*
+             * @see android::speech::recognition::SmartProxy
+             */
+            DECLARE_SMARTPROXY(SREC_EXPORT, EntryImplProxy, EntryProxy, EntryImpl)
+            
+            
+            /**
+             * Creates a new SrecRecognitionResultImpl.
+             *
+             * @param recognitionResult the underlying recognition result
+             * @param grammarConfigs the grammar configurations
+             * @param configCount the number of configurations
+             * @param returnCode SUCCESS unless a fatal error has occurred.
+             */
+            static SrecRecognitionResultImplProxy create(SR_RecognizerResult* recognitionResult,
+                ReturnCode::Type& returnCode);
+            /**
+             * Returns true if the recognition result is an n-best list.
+             */
+            virtual bool isNBestList() const;
+            /**
+             * Returns true if the recognition is from an app server.
+             */
+            virtual bool isAppServerResult() const;
+            /**
+             * Returns the number of entries in the n-best list.
+             */
+            virtual ARRAY_LIMIT getSize() const;
+            /**
+             * Returns an NBest entry.
+             *
+             * @param index the entry index number
+             * @param returnCode ARRAY_INDEX_OUT_OF_BOUNDS if index is out of bounds
+             * @return null if all active GrammarConfiguration.grammarToMeaning() return null
+             */
+            virtual EntryProxy getEntry(ARRAY_LIMIT index,
+                                        ReturnCode::Type& returnCode) const;
+            /**
+            * Creates a new VoicetagItem if the last recognition was an enrollment operation.
+            *
+            * @param VoicetagId unique string voicetag id, to be used as the NameTagId
+            * @param returnCode INVALID_STATE if the last recognition was not an enrollment operation
+            */
+            virtual VoicetagItemProxy createVoicetagItem(const char* VoicetagId, VoicetagItemListenerProxy listener, ReturnCode::Type& returnCode) const;
+          private:
+            /**
+             * Prevent construction.
+             */
+            SrecRecognitionResultImpl(SR_RecognizerResult* recognitionResult);
+            /**
+             * Prevent destruction.
+             */
+            virtual ~SrecRecognitionResultImpl();
+            /**
+             * Prevent copying.
+             */
+            SrecRecognitionResultImpl& operator=(SrecRecognitionResultImpl& other);
+            const SR_RecognizerResult* result;
+            
+            friend class SrecRecognitionResultImplProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(SREC_EXPORT, SrecRecognitionResultImplProxy, NBestRecognitionResultProxy,
+                           SrecRecognitionResultImpl)
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/recognizer/srec/include/SrecRecognizerImpl.h b/uapi/cpp/recognizer/srec/include/SrecRecognizerImpl.h
new file mode 100644
index 0000000..f3fd1cc
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/include/SrecRecognizerImpl.h
@@ -0,0 +1,458 @@
+/*---------------------------------------------------------------------------*
+ *  SrecRecognizerImpl.h                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SRECRECOGNIZERIMPL
+#define __UAPI__SRECRECOGNIZERIMPL
+
+#include "exports.h"
+#include "EmbeddedRecognizer.h"
+#include "Task.h"
+#include "AudioStreamImpl.h"
+#include "RecognizerListener.h"
+
+#include "SR_Recognizer.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class AudioSource;
+      class GrammarListener;
+      class GrammarListenerProxy;
+      namespace utilities
+      {
+        class WorkerQueue;
+        class Queue;
+        class AudioBuffer;
+      }
+      namespace impl
+      {
+        class VoicetagItemImpl;
+      }
+      namespace srec
+      {
+        class SrecGrammarImpl;
+        class SrecGrammarImplProxy;
+      }
+    }
+  }
+}
+
+//typedef struct PFile_t PFile;
+typedef struct SR_Recognizer_t SR_Recognizer;
+typedef struct SR_AcousticModels_t SR_AcousticModels;
+typedef struct SR_Vocabulary_t SR_Vocabulary;
+typedef struct SR_Grammar_t SR_Grammar;
+typedef struct SR_RecognizerResult_t SR_RecognizerResult;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        class SrecRecognizerImplProxy;
+        /**
+         * SREC speech recognizer.
+         */
+        class SrecRecognizerImpl: public EmbeddedRecognizer
+        {
+          public:
+            /**
+             * Creates a new SREC recognizer.
+             *
+             * @param returnCode the return code
+             */
+            static SrecRecognizerImplProxy create(ReturnCode::Type& returnCode);
+            /**
+             * Configures the embedded recognizer.
+             *
+             * @param config recognizer configuration file
+             * @param params optional parameters
+             * @param returnCode ILLEGAL_ARGUMENT if config is null. OPEN_ERROR, or
+             * READ_ERROR if the recognizer configuration, acoustic model, or vocabulary files could not
+             * be opened or read.
+             */
+            virtual void configure(const char* config, ReturnCode::Type& returnCode);
+            
+            /**
+             * Sets the recognizer listener.
+             *
+             * @param listener recognizer listener
+             * @param returnCode returns SUCCESS unless a fatal error occurs
+             */
+            virtual void setListener(RecognizerListenerProxy& listener,
+                                     ReturnCode::Type& returnCode);
+                                     
+          /**
+           * Creates a grammar.
+           *
+           * @param value the contents of the grammar
+           * @param listener the grammar listener
+           * @param returnCode ILLEGAL_ARGUMENT if value is null
+           */
+          virtual GrammarProxy createGrammar(
+              const char* value, GrammarListenerProxy& listener, ReturnCode::Type& returnCode);
+
+
+                                               
+            /**
+             * Begins speech recognition.
+             *
+             * @param audio the audio to recognizer
+             * @param grammars a collection of grammar sets to recognize against
+             * @param grammarCount the number of grammar sets
+             * @param returnCode ILLEGAL_ARGUMENT if audio is null or is being used by another component,
+             * or if grammars is null or if grammarCount < 1. NOT_SUPPORTED if grammarCount > 1
+             */
+            virtual void recognize(AudioStreamProxy& audio, GrammarProxy* grammars,
+                                   ARRAY_LIMIT grammarCount,
+                                   ReturnCode::Type& returnCode);
+                                   
+            /**
+             * This convenience method is equivilent to invoking
+             * recognize(audio, grammars, grammarCount, returnCode) with a single grammar.
+             *
+             * @param audio the audio to recognizer
+             * @param grammar a grammar to recognize against
+             * @param returnCode ILLEGAL_ARGUMENT if audio is null or is being used by another component,
+             * or if grammar is null.
+             * @see recognize(audio, grammars, grammarCount, returnCode)
+             */
+            virtual void recognize(AudioStreamProxy& audio, GrammarProxy& grammar,
+                                   ReturnCode::Type& returnCode);
+                                   
+            /**
+             * Terminates a recognition if one is in-progress.
+             *
+             * @param returnCode the return code
+             */
+            virtual void stop(ReturnCode::Type& returnCode);
+            
+            /**
+             * Set parameter(s).
+             *
+             * @param keys parameter keys
+             * @param values parameter values
+             * @param count the number of parameters
+             * @param returnCode the return code
+             */
+            virtual void setParameters(const char** keys, const char** values,
+                                       ARRAY_LIMIT count, ReturnCode::Type& returnCode);
+                                       
+            /**
+             * Get one or more parameter(s).
+             *
+             * @param keys parameter keys
+             * @param count the number of parameters
+             * @param returnCode the return code
+             */
+            virtual void getParameters(const char** keys, ARRAY_LIMIT count,
+                                       ReturnCode::Type& returnCode);
+                                       
+            /**
+             * The recognition accuracy improves over time as the recognizer adapts to the surrounding
+             * environment. This method enables developers to reset the adaptation when the environment
+             * is known to have changed.
+             *
+             * @param returnCode the return code
+             */
+            virtual void resetAcousticState(ReturnCode::Type& returnCode);
+            /**
+            * isSRBoolParameter() 
+            * @param id of the parameter
+            * @return bool true if the parameter is set and false otherwise
+            */
+            bool isSRBoolParameter(const char *id);
+
+            /**
+            * isRecognizing() 
+            * @return bool true if State == RECOGNIZING, false otherwise
+            */
+            bool isRecognizing();
+          private:
+            enum State
+            {
+              IDLE,
+              RECOGNIZING
+            };
+            
+            
+            /**
+             * Prevent destruction.
+             */
+            virtual ~SrecRecognizerImpl();
+            /**
+             * Prevent construction.
+             */
+            SrecRecognizerImpl(ReturnCode::Type& returnCode);
+            /**
+             * Prevent assignment.
+             */
+            SrecRecognizerImpl& operator=(SrecRecognizerImpl&);
+            /**
+             * Binds a grammar to the recognizer.
+             *
+             * @param grammar the grammar
+             * @param returnCode returns SUCCESS unless a fatal error occurs
+             */
+            void bind(SrecGrammarImplProxy& grammar, ReturnCode::Type& returnCode);
+            
+            /**
+             * Unbinds the grammar from the associated recognizer.
+             *
+             * @param grammar the grammar
+             * @param returnCode NO_MATCH if the specified grammar is not bound to the recognizer
+             */
+            void unbind(SrecGrammarImplProxy& grammar, ReturnCode::Type& returnCode);
+            
+            /**
+             * Invoked by SetListenerTask
+             */
+            void onSetListener(RecognizerListenerProxy& listener);
+            
+            /**
+             * Invoked by RecognizeTask.
+             */
+            void onRecognize(impl::AudioStreamImplProxy& _audioStream,
+                             SrecGrammarImplProxy* grammarsProxy, ARRAY_LIMIT grammarCount);
+                             
+            /**
+             * Invoked by StopTask.
+             */
+            void onStop();
+            
+            /**
+             * Invoked by ReadAudioTask.
+             */
+            void onReadAudio(GrammarListenerProxy* grammarListeners,
+                             ARRAY_LIMIT listenerCount);
+                             
+            /**
+             * Invoked by ResetAcousticStateTask.
+             */
+            void onResetAcousticState();
+            
+            /**
+             * Invoked by SetParametersTask.
+             */
+            void onSetParameters(const char** keys, const char** values, ARRAY_LIMIT count);
+            
+            /**
+             * Invoked by GetParametersTask.
+             */
+            void onGetParameters(const char** keys, ARRAY_LIMIT count);
+            
+            /**
+             * proxy call to SR_RecognizerIsActiveRule
+             */
+            void RecognizerIsActiveRule(SR_Grammar* grammar, ESR_BOOL* wasActive,
+                                        ReturnCode::Type& returnCode);
+                                        
+            /**
+             * Shuts down srec.
+             */
+            void stopSREC();
+            /**
+             * Fires the necessary events whenever recogStatus changes values.
+             */
+            void handleRecogStatus(GrammarListenerProxy* grammarListeners, ARRAY_LIMIT listenerCount);
+            
+            /**
+             * Invoked after the recognizer shuts down. Contains
+             * RecognizerStopAndCleanup + onStopped callback.
+             */
+            void onStopped(ReturnCode::Type& returnCode);
+            
+            /**
+             * Invoked when the recognition is done and we want to cleanup
+             * resources and Stop the recognizer. No callback.
+             */
+            void RecognizerStopAndCleanup(ReturnCode::Type& returnCode);
+            
+            /**
+             * The event listener.
+             */
+            RecognizerListenerProxy listener;
+            /**
+             * The underlying recognizer.
+             */
+            SR_Recognizer* recognizer;
+            /**
+             * The vocabulary.
+             */
+            SR_Vocabulary* vocabulary;
+            /**
+             * The thread and the queue used to process aysnc tasks.
+             */
+            utilities::WorkerQueue* workerQueue;
+            /**
+             * All grammars associated with the recognizer.
+             */
+            utilities::Queue* grammars;
+            /**
+             * The result type returned by the last recognition step.
+             */
+            SR_RecognizerResultType resultType;
+            /**
+             * The recognizer status returned by the last recognition step.
+             */
+            SR_RecognizerStatus recogStatus;
+            /**
+             * The recognition result returned by the last recognition step.
+             */
+            SR_RecognizerResult* result;
+            /**
+             * State of the recognizer
+             */
+            State state;
+            /**
+             * protect the state variable
+             */
+            utilities::Mutex* mutex;
+            
+            android::speech::recognition::impl::AudioStreamImplProxy audioStream;
+            SmartProxy::Root* rootProxy;
+            
+            /**
+             * If Recognizer.stop() is invoked we need to cancel any pending tasks related to the
+             * current recognition.
+             */
+            android::speech::recognition::utilities::Task* pendingTask;
+            
+            friend class android::speech::recognition::impl::VoicetagItemImpl;
+            friend class android::speech::recognition::srec::SrecGrammarImpl;
+            friend class SetListenerTask;
+            friend class RecognizeTask;
+            friend class AudioReadyTask;
+            friend class ReadAudioTask;
+            friend class StopTask;
+            friend class ResetAcousticStateTask;
+            friend class SetParametersTask;
+            friend class GetParametersTask;
+            friend class SrecRecognizerImplProxy;
+        };
+        
+        /**
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(SREC_EXPORT, SrecRecognizerImplProxy, EmbeddedRecognizerProxy, SrecRecognizerImpl)
+        
+        class SetListenerTask: public utilities::Task
+        {
+          public:
+            SetListenerTask(SrecRecognizerImplProxy& _recognizer, RecognizerListenerProxy & _listener);
+            virtual void run();
+          private:
+            SrecRecognizerImplProxy recognizer;
+            RecognizerListenerProxy listener;
+        };
+        
+        class RecognizeTask: public utilities::Task
+        {
+          public:
+            RecognizeTask(SrecRecognizerImplProxy& recognizer,
+                          impl::AudioStreamImplProxy& audioStream,
+                          SrecGrammarImplProxy* grammars,
+                          ARRAY_LIMIT grammarCount);
+                          
+            virtual ~RecognizeTask();
+            virtual void run();
+          private:
+            SrecRecognizerImplProxy recognizer;
+            impl::AudioStreamImplProxy audioStream;
+            SrecGrammarImplProxy* grammars;
+            ARRAY_LIMIT grammarCount;
+        };
+        
+        class ReadAudioTask: public utilities::ScheduledTask
+        {
+          public:
+            ReadAudioTask(SrecRecognizerImplProxy& recognizer,
+                          UINT32 timeout, GrammarListenerProxy* grammarListeners,
+                          ARRAY_LIMIT listenerCount);
+                          
+            virtual ~ReadAudioTask();
+            virtual void run();
+          private:
+            SrecRecognizerImplProxy recognizer;
+            GrammarListenerProxy* grammarListeners;
+            ARRAY_LIMIT listenerCount;
+        };
+        
+        class StopTask: public utilities::Task
+        {
+          public:
+            StopTask(SrecRecognizerImplProxy& recognizer);
+            virtual void run();
+          private:
+            SrecRecognizerImplProxy recognizer;
+        };
+        
+        class ResetAcousticStateTask: public utilities::Task
+        {
+          public:
+            ResetAcousticStateTask(SrecRecognizerImplProxy& recognizer);
+            virtual void run();
+          private:
+            SrecRecognizerImplProxy recognizer;
+        };
+        
+        class SetParametersTask: public utilities::Task
+        {
+          public:
+            SetParametersTask(SrecRecognizerImplProxy& recognizer, char** keys, char** values,
+                              ARRAY_LIMIT count);
+            ~SetParametersTask();
+            virtual void run();
+          private:
+            SrecRecognizerImplProxy recognizer;
+            char** keys;
+            char** values;
+            ARRAY_LIMIT count;
+        };
+        
+        class GetParametersTask: public utilities::Task
+        {
+          public:
+            GetParametersTask(SrecRecognizerImplProxy& recognizer, char** keys, ARRAY_LIMIT count);
+            ~GetParametersTask();
+            virtual void run();
+          private:
+            SrecRecognizerImplProxy recognizer;
+            char** keys;
+            ARRAY_LIMIT count;
+        };
+      }
+    }
+  }
+}
+
+/**
+ * Creates an EmbeddedRecognizer across library-space.
+ */
+extern "C" SREC_EXPORT android::speech::recognition::EmbeddedRecognizerProxy* ConfigureEmbeddedRecognizer(
+    const char* config, android::speech::recognition::ReturnCode::Type& returnCode);
+    
+#endif
diff --git a/uapi/cpp/recognizer/srec/include/SrecVoicetagItemImpl.h b/uapi/cpp/recognizer/srec/include/SrecVoicetagItemImpl.h
new file mode 100644
index 0000000..3a3a4a6
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/include/SrecVoicetagItemImpl.h
@@ -0,0 +1,228 @@
+/*---------------------------------------------------------------------------*
+ *  SrecVoicetagItemImpl.h                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__SRECVOICETAGITEMIMPL
+#define __UAPI__SRECVOICETAGITEMIMPL
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "VoicetagItemImpl.h"
+#include "Task.h"
+#include "VoicetagItemListener.h"
+
+typedef struct SR_Nametag_t SR_Nametag;
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class File;
+        class WorkerQueue;
+      }
+    }
+  }
+}
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        class SrecVoicetagItemImplProxy;
+        /**
+         * Voicetag that may be inserted into an embedded grammar slot.
+         */
+        class SrecVoicetagItemImpl: public android::speech::recognition::impl::VoicetagItemImpl
+        {
+          public:
+            /**
+             * Returns the underlying nametag.
+             *
+             * @return the underlying nametag
+             */
+           SREC_EXPORT SR_Nametag* getNametag();
+           
+           /**
+           * (Optional operation) Returns the audio used to construct the Voicetag. The
+           * audio is in PCM format and is start-pointed and end-pointed. The audio is
+           * only generated if the enableGetWaveform recognition parameter is set
+           * prior to recognition.
+           *
+           * @param waveform the read-only endpointed waveform
+           * @param size the size of the waveform in bytes
+           * @param returnCode the return code
+           * @see RecognizerParameters.enableGetWaveform
+           */
+          SREC_EXPORT void getAudio(const INT16** waveform, ARRAY_LIMIT* size,
+                                ReturnCode::Type& returnCode) const;
+                                
+          /**
+           * (Optional operation) Sets the audio used to construct the Voicetag. The
+           * audio is in PCM format and is start-pointed and end-pointed. The audio is
+           * only generated if the enableGetWaveform recognition parameter is set
+           * prior to recognition.
+           *
+           * @param waveform the endpointed waveform
+           * @param size the size of the waveform in bytes
+           * @param returnCode the return code
+           * @see RecognizerParameters.enableGetWaveform
+           */
+          SREC_EXPORT void setAudio(const INT16* waveform, ARRAY_LIMIT size,
+                                ReturnCode::Type& returnCode);
+          /**
+           * Save the Voicetag Item.
+           *
+           * @param the path where the Voicetag will be saved. We strongly recommend to set the filename with the same value of the VoicetagId. If the filename is ommited, then the VoicetagId (assigned upon creation) will be used as default. 
+           * @param returnCode the return code
+           */
+           SREC_EXPORT void save(const char* path, ReturnCode::Type& returnCode);
+
+          /**
+           * Load a Voicetag Item.
+           *
+           * @param returnCode the return code
+           */
+          SREC_EXPORT void load(ReturnCode::Type& returnCode);
+        
+          /**
+             * Creates a new VoicetagItemImpl from a file.
+             *
+             * @param filename the path of the voicetag file 
+             * @param listener the listener object for the voicetag events
+             * @param returnCode returns SUCCESS unless a fatal error occurs
+             * @return a new voicetag item
+             */
+          SREC_EXPORT static SrecVoicetagItemImplProxy create(const char* filename,
+                                                    VoicetagItemListenerProxy &listener,
+                                                    ReturnCode::Type& returnCode);
+
+           /**
+             * Check if the getWaveform parameter is on
+             * @return true if enabled; false otherwise
+             */
+          SREC_EXPORT static bool isEnableGetWaveformOn();
+
+          private:
+            /**
+             * Prevent destruction.
+             */
+            virtual ~SrecVoicetagItemImpl();
+            /**
+             * Creates a new VoicetagItemImpl.
+             *
+             * @param result the recognition result used to construct the voicetag
+             * @param waveform the audio used to generate the voicetag
+             * @param size the length of the waveform in bytes
+             * @param listener the listener object for the voicetag events
+             * @param returnCode returns SUCCESS unless a fatal error occurs
+             * @return a new voicetag item
+             */
+            static SrecVoicetagItemImplProxy create(SR_Nametag* nametag,
+                                                    const INT16* waveform,
+                                                    ARRAY_LIMIT size,
+                                                    VoicetagItemListenerProxy &listener,
+                                                    ReturnCode::Type& returnCode);
+            /**
+             * Prevent construction.
+             */
+            SrecVoicetagItemImpl(SR_Nametag* nametag, const INT16* _waveform,
+                                 ARRAY_LIMIT size, VoicetagItemListenerProxy &listener);
+
+            SrecVoicetagItemImpl(const char* filename, VoicetagItemListenerProxy &listener, ReturnCode::Type& returnCode);
+      
+            /**
+             * Invoked by LoadVoicetagTask.
+             */
+            void onLoad();
+            /**
+             * Invoked by SaveVoicetagTask.
+             */
+            void onSave(const char* path);
+
+             /**
+             * The path to load the grammar from.
+             */
+            char* _filename;
+
+            /**
+             * The name tag
+             */                     
+            SR_Nametag* _nametag;
+            
+            /**
+             * The listener for Voicetag events
+             */
+            VoicetagItemListenerProxy _listener;
+
+            /**
+             * File in which we will save the data
+             */
+            utilities::File* _file;
+            /**
+             * The thread and the queue used to process aysnc tasks.
+             */
+            utilities::WorkerQueue* _workerQueue;
+            SmartProxy::Root* rootProxy;
+
+            friend class SaveVoicetagTask;
+            friend class LoadVoicetagTask;
+            friend class SrecRecognitionResultImpl;
+            friend class SrecVoicetagItemImplProxy;
+        };
+        
+        /*
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, SrecVoicetagItemImplProxy,
+                           impl::VoicetagItemImplProxy,
+                           SrecVoicetagItemImpl)
+
+        class LoadVoicetagTask: public utilities::Task
+        {
+          public:
+            LoadVoicetagTask(SrecVoicetagItemImplProxy& voicetag);
+            virtual void run();
+          private:
+            SrecVoicetagItemImplProxy voicetag;
+        };
+        
+        class SaveVoicetagTask: public utilities::Task
+        {
+          public:
+            SaveVoicetagTask(SrecVoicetagItemImplProxy& voicetag, const char* path);
+            virtual ~SaveVoicetagTask();
+            virtual void run();
+          private:
+            const char* path;
+            SrecVoicetagItemImplProxy voicetag;
+        };
+
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/recognizer/srec/include/exports.h b/uapi/cpp/recognizer/srec/include/exports.h
new file mode 100644
index 0000000..9890135
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/include/exports.h
@@ -0,0 +1,39 @@
+/*---------------------------------------------------------------------------*
+ *  exports.h                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SREC_EXPORTS
+#define __SREC_EXPORTS
+
+#if defined(UAPI_WIN32)
+#ifdef SREC_EXPORTS
+#define SREC_EXPORT __declspec(dllexport)
+#else
+#define SREC_EXPORT __declspec(dllimport)
+#endif
+#elif defined(UAPI_LINUX)
+#ifdef SREC_EXPORTS
+#define SREC_EXPORT
+#else
+#define SREC_EXPORT
+#endif
+#else
+#error not defined
+#endif
+
+#endif
diff --git a/uapi/cpp/recognizer/srec/source/Android.mk b/uapi/cpp/recognizer/srec/source/Android.mk
new file mode 100644
index 0000000..1f8a4b0
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/source/Android.mk
@@ -0,0 +1,53 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	SrecGrammarImpl.cpp \
+	SrecHelper.cpp \
+	SrecRecognitionResultImpl.cpp \
+	SrecRecognizerImpl.cpp \
+	SrecVoicetagItem.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../../api/include \
+	$(LOCAL_PATH)/../../../audio/include \
+	$(LOCAL_PATH)/../../../grammar/include \
+	$(LOCAL_PATH)/../../../uapi/include \
+	$(LOCAL_PATH)/../../../utilities/include \
+	$(ASR_ROOT_DIR)/shared/include \
+	$(ASR_ROOT_DIR)/portable/include \
+	$(ASR_ROOT_DIR)/srec/include \
+	$(ASR_ROOT_DIR)/srec/cr \
+	$(ASR_ROOT_DIR)/srec/EventLog/include \
+	$(ASR_ROOT_DIR)/srec/Session/include \
+	$(ASR_ROOT_DIR)/srec/Semproc/include \
+	$(ASR_ROOT_DIR)/srec/Recognizer/include \
+	$(ASR_ROOT_DIR)/srec/Grammar/include \
+	$(ASR_ROOT_DIR)/srec/Nametag/include \
+	$(ASR_ROOT_DIR)/srec/Vocabulary/include \
+	$(ASR_ROOT_DIR)/srec/AcousticModels/include \
+	$(ASR_ROOT_DIR)/srec/AcousticState/include \
+
+LOCAL_CFLAGS := \
+	-DSREC_EXPORTS \
+	-DUAPI_EXPORTS \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_LDLIBS += \
+	-lpthread \
+	-ldl \
+
+LOCAL_MODULE:= libUAPI_srec
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/uapi/cpp/recognizer/srec/source/SrecGrammarImpl.cpp b/uapi/cpp/recognizer/srec/source/SrecGrammarImpl.cpp
new file mode 100644
index 0000000..bb424a0
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/source/SrecGrammarImpl.cpp
@@ -0,0 +1,915 @@
+/*---------------------------------------------------------------------------*
+ *  SrecGrammarImpl.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include "ReturnCode.h"
+#include "SrecGrammarImpl.h"
+#include "SrecRecognizerImpl.h"
+#include "SrecHelper.h"
+#include "SlotItem.h"
+#include "WordItemImpl.h"
+#include "SrecVoicetagItemImpl.h"
+#include "WorkerQueueImpl.h"
+#include "EmbeddedGrammarListener.h"
+#include "Logger.h"
+#include "SrecGrammarListener.h"
+
+#include "plog.h"
+#include "SR_Recognizer.h"
+#include "SR_Nametag.h"
+
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+using namespace android::speech::recognition::utilities;
+using namespace android::speech::recognition::srec;
+
+DEFINE_SMARTPROXY(srec, SrecGrammarImplProxy, SrecGrammarProxy, SrecGrammarImpl)
+
+static   const char * FILE_URL_PREFIX = "file://";
+
+SrecGrammarImplProxy SrecGrammarImpl::create(const char* path, GrammarListenerProxy& listener,
+    SrecRecognizerImplProxy& recognizer,
+    WorkerQueue* workerQueue,
+    ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::create");
+    
+  SrecGrammarImpl* object = new SrecGrammarImpl(path, listener, recognizer, workerQueue, returnCode);
+  if (!object)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return SrecGrammarImplProxy();
+  }
+  else if (returnCode)
+  {
+    delete object;
+    return SrecGrammarImplProxy();
+  }
+  SrecGrammarImplProxy result(object);
+  if (!result)
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+  object->rootProxy = result.getRoot();
+  return result;
+}
+
+SrecGrammarImpl::SrecGrammarImpl(const char* _path, GrammarListenerProxy& listener,
+                                 SrecRecognizerImplProxy& _recognizer,
+                                 WorkerQueue* workerQueue,
+                                 ReturnCode::Type& returnCode):
+    path(0),
+    _loaded(false),
+    grammar(0),
+    recognizer(_recognizer),
+    _listener(listener),
+    _workerQueue(workerQueue),
+    rootProxy(0)
+{
+  UAPI_FN_NAME("SrecGrammarImpl::SrecGrammarImpl");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+
+  const char * startPath = _path;
+  if( strstr(_path, FILE_URL_PREFIX) != 0)
+  {
+    startPath += strlen(FILE_URL_PREFIX);
+  }
+
+  path = new char[strlen(startPath)+1];
+  if (path == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  
+  strcpy(path, startPath);
+  returnCode = ReturnCode::SUCCESS;
+}
+
+SrecGrammarImpl::~SrecGrammarImpl()
+{
+  UAPI_FN_NAME("SrecGrammarImpl::~SrecGrammarImpl");
+    
+  UAPI_TRACE(fn, "this=%p\n", this);
+  
+  if (grammar != 0)
+    SR_GrammarDestroy(grammar);
+  delete[] path;
+}
+
+bool SrecGrammarImpl::isSrecRecognizing()
+{
+    ReturnCode::Type returnCode;
+    srec::SrecRecognizerImplProxy nativeRecognizer = (srec::SrecRecognizerImplProxy) EmbeddedRecognizer::getInstance(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+        return false;
+    return nativeRecognizer->isRecognizing();
+}
+
+void SrecGrammarImpl::addItem(const char* slotName, const SlotItemProxy& item, int weight,
+                              const char* semanticMeaning,
+                              ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::addItem");
+    
+  if (slotName == 0 || item == 0 || semanticMeaning == 0)
+  {
+    UAPI_WARN(fn,"slotName, item or semanticMeaning is null\n");
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return;
+  }
+  else if (strchr(semanticMeaning, '=') == 0)
+  {
+    UAPI_WARN(fn,"semanticMeaning must contain a = sign\n");
+    // Semantic meaning must be of the form V='Jen_Parker'
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return;
+  }
+  
+  // Declare variables in case of goto CLEANUP
+  char* slotNameCopy = 0;
+  char* semanticMeaningCopy = 0;
+  AddItemTask* task = 0;
+  
+  slotNameCopy = new char[strlen(slotName)+1];
+  if (slotNameCopy == 0)
+  {
+    UAPI_WARN(fn,"Could not allocate memory for slotNameCopy\n");
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  strcpy(slotNameCopy, slotName);
+  
+  semanticMeaningCopy = new char[strlen(semanticMeaning)+1];
+  if (semanticMeaningCopy == 0)
+  {
+    UAPI_WARN(fn,"Could not allocate memory for semanticMeaningCopy\n");
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  strcpy(semanticMeaningCopy, semanticMeaning);
+  
+  {
+    SrecGrammarImplProxy proxy(rootProxy);
+    if (!proxy)
+    {
+      UAPI_ERROR(fn,"Could not create proxy\n");
+      returnCode = ReturnCode::INVALID_STATE;
+      goto CLEANUP;
+    }
+    task = new AddItemTask(proxy, slotNameCopy, item, weight, semanticMeaningCopy);
+    if (!task)
+    {
+      UAPI_ERROR(fn,"Could not create AddItemTask\n");
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      goto CLEANUP;
+    }
+    _workerQueue->enqueue(task, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Could not enqueue AddItemTask\n");
+      delete task;
+      goto CLEANUP;
+    }
+    
+  }
+  return;
+CLEANUP:
+  delete[] slotNameCopy;
+  delete[] semanticMeaningCopy;
+  return;
+}
+void SrecGrammarImpl::addItemList(const char* slotName,
+                              SlotItemProxy** items,
+                              int* weights,
+                              const char** semanticMeanings,
+                              ARRAY_LIMIT itemCount,
+                              ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::addItemList");
+
+  if (slotName == 0 || items == 0 || weights == 0 ||semanticMeanings == 0)
+  {
+    UAPI_WARN(fn,"slotName, item, weights or semanticMeaning is null\n");
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return;
+  }
+  // Semantic meaning must be of the form V='Jen_Parker'
+  ARRAY_LIMIT i=0;
+  for(;i<itemCount;i++)
+  {
+      if (strchr(semanticMeanings[i], '=') == 0)
+      {
+         UAPI_WARN(fn,"semanticMeaning[%d] must contain a = sign\n", i);
+         returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+         return;
+      }
+  }
+  
+  // Declare variables in case of goto CLEANUP
+  char* slotNameCopy = 0;
+  SlotItemProxy * itemsCopy = 0;
+  char** semanticMeaningsCopy = 0;
+  int* weightsCopy = 0;
+  AddItemListTask* task = 0;
+  
+  // Copy arguments before passing into task
+  slotNameCopy = new char[strlen(slotName)+1];
+  if (slotNameCopy == 0)
+  {
+    UAPI_WARN(fn,"Could not allocate memory for slotNameCopy\n");
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    goto CLEANUP;
+  }
+  strcpy(slotNameCopy, slotName);
+
+  itemsCopy = new SlotItemProxy[itemCount];
+  semanticMeaningsCopy = new char*[itemCount];
+  weightsCopy = new int[itemCount];
+
+  for (i=0;i<itemCount;++i)
+  {
+    // copy slots
+    itemsCopy[i] = *items[i];
+
+    // copy semantic meanings
+    semanticMeaningsCopy[i] = new char[strlen(semanticMeanings[i]) + 1];
+    if (semanticMeaningsCopy[i] == 0)
+    {
+        UAPI_WARN(fn,"Could not allocate memory for slotNameCopy\n");
+        returnCode = ReturnCode::OUT_OF_MEMORY;
+        goto CLEANUP;
+    }
+    strcpy(semanticMeaningsCopy[i], semanticMeanings[i]);
+    // copy weights
+    weightsCopy[i] = weights[i];
+  }
+  
+  {
+    SrecGrammarImplProxy proxy(rootProxy);
+    if (!proxy)
+    {
+      UAPI_ERROR(fn,"Could not create proxy\n");
+      returnCode = ReturnCode::INVALID_STATE;
+      goto CLEANUP;
+    }
+    task = new AddItemListTask(proxy, slotNameCopy, itemsCopy, weightsCopy, semanticMeaningsCopy,itemCount);
+    if (!task)
+    {
+      UAPI_ERROR(fn,"Could not create AddItemListTask\n");
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      goto CLEANUP;
+    }
+    _workerQueue->enqueue(task, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Could not enqueue AddItemListTask\n");
+      delete task;
+      goto CLEANUP;
+    }
+    
+  }
+  return;
+CLEANUP:
+  delete[] slotNameCopy;
+  for (i =0;i<itemCount;++i)
+    delete[] semanticMeaningsCopy[i];
+  delete[] itemsCopy;
+  delete[] semanticMeaningsCopy;
+  delete[] weightsCopy;
+  return;
+}
+
+void SrecGrammarImpl::compileAllSlots(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::compileAllSlots");
+    
+  SrecGrammarImplProxy proxy(rootProxy);
+  if (!proxy)
+  {
+    UAPI_ERROR(fn,"Could not create proxy\n");
+    returnCode = ReturnCode::INVALID_STATE;
+    return;
+  }
+  CompileAllSlotsTask* task = new CompileAllSlotsTask(proxy);
+  if (!task)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    UAPI_ERROR(fn,"Could not create CompileAllSlotsTask\n");
+    return;
+  }
+  _workerQueue->enqueue(task, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Could not enqueue CompileAllSlotsTask\n");
+    delete task;
+    return;
+  }
+}
+
+void SrecGrammarImpl::resetAllSlots(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::resetAllSlots");
+    
+  SrecGrammarImplProxy proxy(rootProxy);
+  if (!proxy)
+  {
+    UAPI_ERROR(fn,"Could not create proxy\n");
+    returnCode = ReturnCode::INVALID_STATE;
+    return;
+  }
+  ResetAllSlotsTask* task = new ResetAllSlotsTask(proxy);
+  if (task == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    UAPI_ERROR(fn,"Could not create ResetAllSlotsTask\n");
+    return;
+  }
+  _workerQueue->enqueue(task, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Could not enqueue ResetAllSlotsTask\n");
+    delete task;
+    return;
+  }
+}
+
+void SrecGrammarImpl::load(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::load");
+    
+  SrecGrammarImplProxy proxy(rootProxy);
+  if (!proxy)
+  {
+    UAPI_ERROR(fn,"Could not create proxy\n");
+    return;
+  }
+  LoadTask* task = new LoadTask(proxy);
+  if (task == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    UAPI_ERROR(fn,"Could not create LoadTask\n");
+    return;
+  }
+  _workerQueue->enqueue(task, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Could not enqueue LoadTask\n");
+    delete task;
+    return;
+  }
+}
+
+void SrecGrammarImpl::unload(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::unload");
+    
+  SrecGrammarImplProxy proxy(rootProxy);
+  if (!proxy)
+  {
+    UAPI_ERROR(fn,"Could not create proxy\n");
+    returnCode = ReturnCode::INVALID_STATE;
+    return;
+  }
+  UnloadTask* task = new UnloadTask(proxy);
+  if (task == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    UAPI_ERROR(fn,"Could not create UnloadTask\n");
+    return;
+  }
+  _workerQueue->enqueue(task, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Could not enqueue UnloadTask\n");
+    delete task;
+    return;
+  }
+}
+
+void SrecGrammarImpl::save(const char* path, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::save");
+    
+  char* pathCopy = new char[strlen(path)+1];
+  if (pathCopy == 0)
+  {
+    UAPI_ERROR(fn,"Failed to allocate memory for pathCopy\n");
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  strcpy(pathCopy, path);
+  
+  SrecGrammarImplProxy proxy(rootProxy);
+  if (!proxy)
+  {
+    UAPI_ERROR(fn,"Could not create proxy\n");
+    returnCode = ReturnCode::INVALID_STATE;
+    delete[] pathCopy;
+    return;
+  }
+  SaveTask* task = new SaveTask(proxy, pathCopy);
+  if (task == 0)
+  {
+    UAPI_ERROR(fn,"Could not create SaveTask\n");
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    delete[] pathCopy;
+    return;
+  }
+  _workerQueue->enqueue(task, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Could not enqueue UnloadTask\n");
+    delete task; //will delete pathCopy
+    return;
+  }
+}
+
+bool SrecGrammarImpl::isLoaded()
+{
+  return _loaded;
+}
+
+void SrecGrammarImpl::onHelperAddItem(char* slotName, const SlotItemProxy& item, 
+                                      int weight, char* semanticMeaning,
+                                      ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::onHelperAddItem");
+  ESR_ReturnCode rc;  
+  if (item->isWord())
+  {
+    WordItemImplProxy& word = (WordItemImplProxy&) item;
+    const char* pronunciation = word->getPronunciation();
+   
+    rc = SR_GrammarAddWordToSlot(grammar, slotName, word->getWord(),
+                                 pronunciation, weight, semanticMeaning);
+    if (rc == ESR_NOT_SUPPORTED)
+    {
+      UAPI_WARN(fn,"SR_GrammarAddWordToSlot returned ESR_NOT_SUPPORTED\n");
+      returnCode = ReturnCode::HOMONYM_COLLISION;
+      return;
+    }
+    else if (rc == ESR_OUT_OF_MEMORY)
+    {
+      UAPI_WARN(fn,"SR_GrammarAddWordToSlot returned ESR_OUT_OF_MEMORY\n");
+      returnCode = ReturnCode::GRAMMAR_SLOT_FULL;
+      return;
+    }
+    else if (rc != ESR_SUCCESS)
+    {
+      UAPI_WARN(fn,"SR_GrammarAddWordToSlot returned %d\n", rc);
+      returnCode = SrecHelper::toUAPI(rc);
+      return;
+    }
+  }
+  else
+  {
+    SrecVoicetagItemImplProxy& voicetag = (SrecVoicetagItemImplProxy&) item;
+    SR_Nametag* nametag = voicetag->getNametag();
+    rc = SR_GrammarAddNametagToSlot(grammar, slotName, nametag,
+                                    weight, semanticMeaning);
+    // Don't destroy nametag here
+    // the Voicetag implementation will take care of it.
+    // SR_NametagDestroy(nametag);
+    nametag = NULL;
+
+    if (rc == ESR_NOT_SUPPORTED)
+    {
+      UAPI_WARN(fn,"SR_GrammarAddNametagToSlot returned ESR_NOT_SUPPORTED\n");
+      returnCode = ReturnCode::HOMONYM_COLLISION;
+      return;
+    }
+    else if (rc != ESR_SUCCESS)
+    {
+      UAPI_WARN(fn,"SR_GrammarAddNametagToSlot returned %d\n", rc);
+      returnCode = SrecHelper::toUAPI(rc);
+      return;
+    }
+  }
+  returnCode = ReturnCode::SUCCESS;
+  return;
+}
+void SrecGrammarImpl::onAddItem(char* slotName, const SlotItemProxy& item, int weight,
+                                char* semanticMeaning)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("SrecGrammarImpl::onAddItem");
+    
+  if (recognizer->isRecognizing())
+  {
+    UAPI_WARN(fn, "Recognizer is recognizing\n");
+    // Recognizer is working in a recognition; no grammar operations allowed
+    returnCode = ReturnCode::INVALID_STATE;
+    goto CLEANUP;
+  }
+  ESR_BOOL wasActive;
+  recognizer->RecognizerIsActiveRule(grammar, &wasActive, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to call RecognizerIsActiveRule\n");
+    goto CLEANUP;
+  }
+  
+  if (!wasActive)
+  {
+    SrecGrammarImplProxy proxy(rootProxy);
+    if (!proxy)
+    {
+      UAPI_ERROR(fn,"Could not create proxy\n");
+      goto CLEANUP;
+    }
+    recognizer->bind(proxy, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_WARN(fn, "Recognizer bind failed %d\n", returnCode);
+      goto CLEANUP;
+    }
+  }
+
+  onHelperAddItem(slotName,item, weight, semanticMeaning,returnCode);
+
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+      UAPI_WARN(fn, "onHelperAddItem failed %d\n", returnCode);
+      goto CLEANUP;
+  }
+
+  if (!wasActive)
+  {
+    SrecGrammarImplProxy proxy(rootProxy);
+    if (!proxy)
+    {
+      UAPI_ERROR(fn,"Could not create proxy\n");
+      goto CLEANUP;
+    }
+    recognizer->unbind(proxy, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_WARN(fn, "Recognizer unbind failed %d\n", returnCode);
+      goto CLEANUP;
+    }
+  }
+  else
+    returnCode = ReturnCode::SUCCESS;
+  return;
+CLEANUP:
+  if (_listener)
+    _listener->onError(returnCode);
+}
+
+void SrecGrammarImpl::onAddItemList(char* slotName, SlotItemProxy* items, int* weights, char** semanticMeanings, ARRAY_LIMIT itemsCount)
+{
+  ReturnCode::Type returnCode;
+  ARRAY_LIMIT index=0;
+  UAPI_FN_SCOPE("SrecGrammarImpl::onAddItemList");
+  
+  ESR_BOOL wasActive;
+  
+  if (recognizer->isRecognizing())
+  {
+    UAPI_WARN(fn, "Recognizer is recognizing\n");
+    // Recognizer is working in a recognition; no grammar operations allowed
+    returnCode = ReturnCode::INVALID_STATE;
+    goto CLEANUP;
+  }
+  recognizer->RecognizerIsActiveRule(grammar, &wasActive, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to call RecognizerIsActiveRule\n");
+    goto CLEANUP;
+  }
+  
+  if (!wasActive)
+  {
+    SrecGrammarImplProxy proxy(rootProxy);
+    if (!proxy)
+    {
+      UAPI_ERROR(fn,"Could not create proxy\n");
+      goto CLEANUP;
+    }
+    recognizer->bind(proxy, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_WARN(fn, "Recognizer bind failed %d\n", returnCode);
+      goto CLEANUP;
+    }
+  }
+
+  for(index=0;index<itemsCount;index++)
+  {
+      onHelperAddItem(slotName,items[index], weights[index], semanticMeanings[index],returnCode);
+      if(0) ;
+      // skip this check, so as to (1) notify the caller through the callback (2) continue looping
+      //if (returnCode == ReturnCode::HOMONYM_COLLISION)
+      //  goto CLEANUP;
+      else if (returnCode == ReturnCode::GRAMMAR_SLOT_FULL)
+        goto CLEANUP;
+      else if (returnCode != ReturnCode::SUCCESS)
+      {
+         if (_listener)
+         {
+            if (_listener->isSrecGrammarListener())
+			        ((SrecGrammarListenerProxy&) _listener)->onAddItemListFailure(index,returnCode);
+			      else if(_listener->isEmbeddedGrammarListener())
+			        ((EmbeddedGrammarListenerProxy&) _listener)->onError(returnCode);
+			      else goto CLEANUP;
+		      }
+          else goto CLEANUP;
+      }
+  }
+
+  if (!wasActive)
+  {
+    SrecGrammarImplProxy proxy(rootProxy);
+    if (!proxy)
+    {
+      UAPI_ERROR(fn,"Could not create proxy\n");
+      goto CLEANUP;
+    }
+    recognizer->unbind(proxy, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_WARN(fn, "Recognizer unbind failed %d\n", returnCode);
+      goto CLEANUP;
+    }
+  }
+   
+  returnCode = ReturnCode::SUCCESS;
+  if (_listener)
+  {
+     if (_listener->isSrecGrammarListener())
+        ((SrecGrammarListenerProxy&) _listener)->onAddItemList();
+  }
+  return;
+CLEANUP:
+  if (_listener)
+  {
+    _listener->onError(returnCode);
+    if (_listener->isSrecGrammarListener())
+                ((SrecGrammarListenerProxy&) _listener)->onAddItemListFailure(index, returnCode);
+    else if(_listener->isEmbeddedGrammarListener())
+			    ((EmbeddedGrammarListenerProxy&) _listener)->onError(returnCode);
+  }
+}
+void SrecGrammarImpl::onCompileAllSlots()
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::onCompileAllSlots");
+    
+  ESR_ReturnCode rc;
+  if (recognizer->isRecognizing()) // Recognizer is working in a recognition; no grammar operations allowed
+  {
+      UAPI_WARN(fn, "Recognizer is recognizing\n");
+      rc = ESR_INVALID_STATE;
+  }
+  else
+  {
+    rc = SR_GrammarCompile(grammar);
+    if (rc != ESR_SUCCESS)
+    {
+      UAPI_WARN(fn,"SR_GrammarCompile returned %d\n", rc);
+    }
+  }
+  if (_listener)
+  {
+    if (rc == ESR_FATAL_ERROR || rc == ESR_INVALID_STATE)
+      _listener->onError(ReturnCode::INVALID_STATE);
+    else if (_listener->isEmbeddedGrammarListener())
+      ((EmbeddedGrammarListenerProxy&) _listener)->onCompileAllSlots();
+  }
+}
+
+void SrecGrammarImpl::onResetAllSlots()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("SrecGrammarImpl::onResetAllSlots");
+    
+  ESR_ReturnCode rc;
+  
+  if (recognizer->isRecognizing()) // Recognizer is working in a recognition; no grammar operations allowed
+  {
+      UAPI_WARN(fn, "Recognizer is recognizing\n");
+      rc = ESR_INVALID_STATE;
+      goto CLEANUP;
+  }
+  CHKLOG(rc, SR_GrammarResetAllSlots(grammar));
+  if (_listener && _listener->isEmbeddedGrammarListener())
+    ((EmbeddedGrammarListenerProxy&) _listener)->onResetAllSlots();
+  return;
+CLEANUP:
+  UAPI_WARN(fn,"SR_GrammarResetAllSlots failed %d\n", rc);
+  returnCode = SrecHelper::toUAPI(rc);
+  if (_listener != 0)
+    _listener->onError(returnCode);
+}
+
+void SrecGrammarImpl::onLoad()
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::onLoad");
+    
+  ESR_ReturnCode rc;
+  
+  if (recognizer->isRecognizing()) // Recognizer is working in a recognition; no grammar operations allowed
+  {
+      UAPI_WARN(fn, "Recognizer is recognizing\n");
+      rc = ESR_INVALID_STATE;
+  }
+  else
+  {
+    rc = SR_GrammarLoad(path, &grammar);
+    if (rc != ESR_SUCCESS)
+    {
+      UAPI_WARN(fn,"SR_GrammarLoad returned %d\n", rc);
+    }
+    _loaded = true;
+  }
+  if (_listener)
+  {
+    if (rc == ESR_READ_ERROR)
+      _listener->onError(ReturnCode::READ_ERROR);
+    else if (rc == ESR_INVALID_STATE)
+        _listener->onError(ReturnCode::INVALID_STATE);
+    else
+      _listener->onLoaded();
+  }
+}
+
+void SrecGrammarImpl::onUnload()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("SrecGrammarImpl::onUnload");
+    
+  ESR_ReturnCode rc;
+  
+  if (recognizer->isRecognizing()) // Recognizer is working in a recognition; no grammar operations allowed
+  {
+      UAPI_WARN(fn, "Recognizer is recognizing\n");
+      rc = ESR_INVALID_STATE;
+      goto CLEANUP;
+  }
+  CHKLOG(rc, SR_GrammarDestroy(grammar));
+  grammar = 0;
+  _loaded = false;
+  if (_listener)
+    _listener->onUnloaded();
+  return;
+CLEANUP:
+  UAPI_WARN(fn,"SR_GrammarDestroy failed %d\n", rc);
+  returnCode = SrecHelper::toUAPI(rc);
+  if (_listener != 0)
+    _listener->onError(returnCode);
+}
+
+void SrecGrammarImpl::onSave(const char* path)
+{
+  UAPI_FN_SCOPE("SrecGrammarImpl::onSave");
+    
+  ESR_ReturnCode rc;
+  if (recognizer->isRecognizing()) // Recognizer is working in a recognition; no grammar operations allowed
+  {
+    UAPI_WARN(fn, "Recognizer is recognizing\n");
+    rc = ESR_INVALID_STATE;
+  }
+  else
+  {
+    rc = SR_GrammarSave(grammar, path);
+    if (rc != ESR_SUCCESS)
+    {
+      UAPI_WARN(fn,"SR_GrammarSave returned %d\n", rc);
+    }
+  }
+
+  if (_listener)
+  {
+    if (rc == ESR_WRITE_ERROR)
+      _listener->onError(ReturnCode::WRITE_ERROR);
+    else if (rc == ESR_INVALID_STATE)
+      _listener->onError(ReturnCode::INVALID_STATE);
+    else if (_listener->isEmbeddedGrammarListener())
+      ((EmbeddedGrammarListenerProxy&) _listener)->onSaved(path);
+  }
+}
+
+AddItemTask::AddItemTask(SrecGrammarImplProxy& _grammar, char* slotName,
+                         const SlotItemProxy& _item, int weight, char* semanticMeaning):
+    Task("AddItemTask"),
+    grammar(_grammar),
+    _slotName(slotName),
+    item(_item),
+    _weight(weight),
+    _semanticMeaning(semanticMeaning)
+{}
+
+void AddItemTask::run()
+{
+  grammar->onAddItem(_slotName, item, _weight, _semanticMeaning);
+}
+
+AddItemTask::~AddItemTask()
+{
+  delete[] _slotName;
+  delete[] _semanticMeaning;
+}
+
+AddItemListTask::AddItemListTask(SrecGrammarImplProxy& _grammar, char* slotName,
+                         SlotItemProxy* items, int* weights, char** semanticMeanings, ARRAY_LIMIT itemsCount):
+    Task("AddItemListTask"),
+    grammar(_grammar),
+    _slotName(slotName),
+    _items(items),
+    _weights(weights),
+    _semanticMeanings(semanticMeanings),
+    _itemsCount(itemsCount)
+{}
+
+void AddItemListTask::run()
+{
+  grammar->onAddItemList(_slotName, _items, _weights, _semanticMeanings,_itemsCount);
+}
+
+AddItemListTask::~AddItemListTask()
+{
+  delete[] _slotName;
+  for (ARRAY_LIMIT i=0;i<_itemsCount;++i)
+    delete[] _semanticMeanings[i];
+  delete[] _semanticMeanings;
+  delete[] _items;
+  delete[] _weights;
+}
+
+CompileAllSlotsTask::CompileAllSlotsTask(SrecGrammarImplProxy& _grammar):
+    Task("CompileAllSlotsTask"),
+    grammar(_grammar)
+{}
+
+void CompileAllSlotsTask::run()
+{
+  grammar->onCompileAllSlots();
+}
+
+
+ResetAllSlotsTask::ResetAllSlotsTask(SrecGrammarImplProxy& _grammar):
+    Task("ResetAllSlotsTask"),
+    grammar(_grammar)
+{}
+
+void ResetAllSlotsTask::run()
+{
+  grammar->onResetAllSlots();
+}
+
+UnloadTask::UnloadTask(SrecGrammarImplProxy& _grammar):
+    Task("UnloadTask"),
+    grammar(_grammar)
+{}
+
+void UnloadTask::run()
+{
+  grammar->onUnload();
+}
+
+SaveTask::~SaveTask()
+{
+  delete[] path;
+}
+
+SaveTask::SaveTask(SrecGrammarImplProxy& _grammar, const char* _path):
+    Task("SaveTask"),
+    path(_path),
+    grammar(_grammar)
+{}
+
+void SaveTask::run()
+{
+  grammar->onSave(path);
+}
+
+LoadTask::LoadTask(SrecGrammarImplProxy& _grammar):
+    Task("LoadTask"),
+    grammar(_grammar)
+{}
+
+void LoadTask::run()
+{
+  grammar->onLoad();
+}
diff --git a/uapi/cpp/recognizer/srec/source/SrecHelper.cpp b/uapi/cpp/recognizer/srec/source/SrecHelper.cpp
new file mode 100644
index 0000000..c264e21
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/source/SrecHelper.cpp
@@ -0,0 +1,55 @@
+/*---------------------------------------------------------------------------*
+ *  SrecHelper.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "SrecHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::srec;
+
+
+ReturnCode::Type SrecHelper::toUAPI(ESR_ReturnCode returnCode)
+{
+  switch (returnCode)
+  {
+    case ESR_SUCCESS:
+      return ReturnCode::SUCCESS;
+    case ESR_INVALID_STATE:
+      return ReturnCode::INVALID_STATE;
+    case ESR_OUT_OF_MEMORY:
+      return ReturnCode::OUT_OF_MEMORY;
+    case ESR_NOT_SUPPORTED:
+      return ReturnCode::NOT_SUPPORTED;
+    case ESR_OPEN_ERROR:
+      return ReturnCode::OPEN_ERROR;
+    case ESR_READ_ERROR:
+      return ReturnCode::READ_ERROR;
+    case ESR_INVALID_ARGUMENT:
+      return ReturnCode::ILLEGAL_ARGUMENT;
+    case ESR_NO_MATCH_ERROR:
+      return ReturnCode::NO_MATCH;
+    default:
+      return ReturnCode::UNKNOWN;
+  }
+}
diff --git a/uapi/cpp/recognizer/srec/source/SrecRecognitionResultImpl.cpp b/uapi/cpp/recognizer/srec/source/SrecRecognitionResultImpl.cpp
new file mode 100644
index 0000000..61d4722
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/source/SrecRecognitionResultImpl.cpp
@@ -0,0 +1,466 @@
+/*---------------------------------------------------------------------------*
+ *  SrecRecognitionResultImpl.cpp                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <stdlib.h>
+
+#include "SrecRecognitionResultImpl.h"
+#include "types.h"
+#include "SrecHelper.h"
+#include "SrecVoicetagItemImpl.h"
+#include "Logger.h"
+
+#include "plog.h"
+#include "SR_RecognizerResult.h"
+#include "SR_Nametag.h"
+
+
+/*#define SREC_MEASURE_LATENCY    1*/
+ 
+#ifdef SREC_MEASURE_LATENCY
+#include <sys/time.h>
+ 
+struct timeval latency_result;
+#endif
+
+
+using namespace android::speech::recognition::utilities;
+using namespace android::speech::recognition::srec;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        DEFINE_SMARTPROXY(srec, SrecRecognitionResultImplProxy, NBestRecognitionResultProxy,
+                          SrecRecognitionResultImpl)
+                          
+        DEFINE_SMARTPROXY(srec::SrecRecognitionResultImpl, EntryImplProxy, EntryProxy,
+                          SrecRecognitionResultImpl::EntryImpl)
+                          
+        SrecRecognitionResultImplProxy SrecRecognitionResultImpl::create(
+          SR_RecognizerResult* recognitionResult, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognitionResultImpl::create");
+            
+          SrecRecognitionResultImpl* result = new SrecRecognitionResultImpl(recognitionResult);
+          if (!result)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return SrecRecognitionResultImplProxy();
+          }
+          else
+            returnCode = ReturnCode::SUCCESS;
+          return SrecRecognitionResultImplProxy(result);
+        }
+        
+        SrecRecognitionResultImpl::SrecRecognitionResultImpl(SR_RecognizerResult* _result):
+            result(_result)
+        {
+          UAPI_FN_NAME("SrecRecognitionResultImpl::SrecRecognitionResultImpl");
+            
+          UAPI_TRACE(fn,"this=%p\n", this);
+        }
+        
+        SrecRecognitionResultImpl::~SrecRecognitionResultImpl()
+        {
+          UAPI_FN_NAME("SrecRecognitionResultImpl::~SrecRecognitionResultImpl");
+            
+          UAPI_TRACE(fn,"this=%p\n", this);
+        }
+        
+        bool SrecRecognitionResultImpl::isNBestList() const
+        {
+          return true;
+        }
+       
+        bool SrecRecognitionResultImpl::isAppServerResult() const
+        {
+          return false;
+        }
+
+        VoicetagItemProxy SrecRecognitionResultImpl::createVoicetagItem(const char* VoicetagId, VoicetagItemListenerProxy listener, ReturnCode::Type& returnCode) const
+        {
+          UAPI_FN_SCOPE("SrecRecognitionResultImpl::createVoicetagItem");
+            
+          char* voicetagCopy = 0;
+          voicetagCopy = new char[strlen(VoicetagId)+1];
+          if (voicetagCopy == 0)
+          {
+             returnCode = ReturnCode::OUT_OF_MEMORY;
+             return VoicetagItemProxy();
+          }
+          strcpy(voicetagCopy, VoicetagId);
+          SR_Nametag* nametag;
+          ESR_ReturnCode rc = SR_NametagCreate(result, voicetagCopy, &nametag);
+          delete []voicetagCopy;
+          if (rc != ESR_SUCCESS)
+          {
+            returnCode = SrecHelper::toUAPI(rc);
+            return VoicetagItemProxy();
+          }
+          
+          const INT16* data;
+          size_t len;
+          
+          // TODO: What happens if the "enableGetWaveform" parameter is not set?
+          rc = SR_RecognizerResultGetWaveform(result, &data, &len);
+          if (rc != ESR_SUCCESS)
+          {
+            returnCode = SrecHelper::toUAPI(rc);
+            SR_NametagDestroy(nametag);
+            return VoicetagItemProxy();
+          }
+          
+          assert(len < (size_t)ARRAY_LIMIT_MAX);
+          return SrecVoicetagItemImpl::create(nametag, data, (ARRAY_LIMIT) len, listener, returnCode);
+        }
+        
+        ARRAY_LIMIT SrecRecognitionResultImpl::getSize() const
+        {
+          size_t size;
+          ESR_ReturnCode rc;
+          CHKLOG(rc, SR_RecognizerResultGetSize(result, &size));
+          return (ARRAY_LIMIT) size;
+CLEANUP:
+          return 0;
+        }
+        
+        SrecRecognitionResultImpl::EntryProxy SrecRecognitionResultImpl::getEntry(
+          ARRAY_LIMIT index, ReturnCode::Type& returnCode) const
+        {
+          if (index >= getSize())
+          {
+            returnCode = ReturnCode::ARRAY_INDEX_OUT_OF_BOUNDS;
+            return EntryProxy();
+          }
+          returnCode = ReturnCode::SUCCESS;
+          return EntryImpl::createEntry(index, result, returnCode);
+        }
+        
+        SrecRecognitionResultImpl::EntryImplProxy SrecRecognitionResultImpl::EntryImpl::createEntry(
+          ARRAY_LIMIT index, const SR_RecognizerResult* recognitionResult, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognitionResultImpl::EntryImpl::createEntry");
+            
+          SrecRecognitionResultImpl::EntryImpl* result = 0;
+          size_t len;
+          ARRAY_LIMIT keyCount = 0;
+          LCHAR** rawKeys = 0;
+          LCHAR** keys = 0;
+          LCHAR** values = 0;
+          LCHAR* rawMeaning = 0;
+          LCHAR* literalMeaning = 0;
+          bool confidenceScoreFound = false;
+          UINT8 confidenceScore = 0;
+          SrecRecognitionResultImpl::EntryImplProxy resultProxy;
+          
+          // Get the number of keys
+          ARRAY_LIMIT rawKeyCount;
+          {
+            size_t len = 0;
+            ESR_ReturnCode rc = SR_RecognizerResultGetKeyList(recognitionResult, index, 0, &len);
+            if (rc != ESR_BUFFER_OVERFLOW)
+            {
+              returnCode = SrecHelper::toUAPI(rc);
+              goto CLEANUP;
+            }
+            rawKeyCount = (ARRAY_LIMIT) len;
+          }
+          
+          rawKeys = new LCHAR*[rawKeyCount];
+          
+          if (rawKeys == 0)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          ESR_ReturnCode rc;
+          len = rawKeyCount;
+          rc = SR_RecognizerResultGetKeyList(recognitionResult, index, rawKeys, &len);
+          if (rc != ESR_SUCCESS)
+          {
+            returnCode = SrecHelper::toUAPI(rc);
+            goto CLEANUP;
+          }
+          
+            // 3 reserved keys: "literal", "raws", "conf"
+            keyCount = rawKeyCount - 3;
+          
+          keys = new LCHAR*[keyCount];
+          if (!keys)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          
+          values = new LCHAR*[keyCount];
+          if (!values)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          
+          for (ARRAY_LIMIT i = 0; i < keyCount; ++i)
+          {
+            keys[i] = 0;
+            values[i] = 0;
+          }
+          literalMeaning = 0;
+          confidenceScore = 0;
+          
+          // Generate a list of keys and values excluding semanticMeaning, literal and confidenceScore
+          for (ARRAY_LIMIT i = 0, j = 0; i < rawKeyCount; ++i)
+          {
+            const LCHAR* key = rawKeys[i];
+            size_t valueLength = 0;
+            rc = SR_RecognizerResultGetValue(recognitionResult, index, key, 0, &valueLength);
+            if (rc != ESR_BUFFER_OVERFLOW)
+            {
+              returnCode = SrecHelper::toUAPI(rc);
+              goto CLEANUP;
+            }
+            
+            if (strcmp(key, "meaning") == 0)
+            {
+              assert(rawMeaning == 0);
+              rawMeaning = new LCHAR[valueLength];
+              if (!rawMeaning)
+              {
+                returnCode = ReturnCode::OUT_OF_MEMORY;
+                goto CLEANUP;
+              }
+              rc = SR_RecognizerResultGetValue(recognitionResult, index, key, rawMeaning, &valueLength);
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                goto CLEANUP;
+              }
+            }
+            else if (strcmp(key, "literal") == 0)
+            {
+              assert(literalMeaning == 0);
+              literalMeaning = new LCHAR[valueLength];
+              if (!literalMeaning)
+              {
+                returnCode = ReturnCode::OUT_OF_MEMORY;
+                goto CLEANUP;
+              }
+              rc = SR_RecognizerResultGetValue(recognitionResult, index, key, literalMeaning, &valueLength);
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                goto CLEANUP;
+              }
+            }
+            else if (strcmp(key, "conf") == 0)
+            {
+              LCHAR* temp = new LCHAR[valueLength];
+              if (!temp)
+              {
+                returnCode = ReturnCode::OUT_OF_MEMORY;
+                goto CLEANUP;
+              }
+              rc = SR_RecognizerResultGetValue(recognitionResult, index, key, temp, &valueLength);
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                goto CLEANUP;
+              }
+              confidenceScoreFound = true;
+              // SREC returns value 0-1000, UAPI returns 0-100
+              char* endptr;
+              long srecConfidenceScore = strtol(temp, &endptr, 10);
+              if (strlen(temp) == 0 || endptr != temp + strlen(temp) ||
+                  srecConfidenceScore == LONG_MAX || srecConfidenceScore == LONG_MIN)
+              {
+                // If the string was empty or contained a non-numeric character, or an overflow or underflow
+                // occured
+                delete[] temp;
+                returnCode = ReturnCode::INVALID_STATE;
+                goto CLEANUP;
+              }
+              else if ((srecConfidenceScore < 0) || (srecConfidenceScore > 1000))
+              {
+                delete[] temp;
+                returnCode = ReturnCode::INVALID_STATE;
+                goto CLEANUP;
+              }
+              confidenceScore = (UINT8)(srecConfidenceScore / 10);
+              delete[] temp;
+            }
+            else
+            {
+              if (j >= keyCount)
+              {
+                // There are more "normal" keys than we expected, this means that "literal", "meaning" or "conf"
+                // is missing and a normal key took its place.
+                returnCode = ReturnCode::INVALID_STATE;
+                UAPI_ERROR(fn,"More normal keys than expected");
+                goto CLEANUP;
+              }
+              keys[j] = new LCHAR[strlen(key)+1];
+              if (!keys[j])
+              {
+                returnCode = ReturnCode::OUT_OF_MEMORY;
+                goto CLEANUP;
+              }
+              strcpy(keys[j], key);
+              
+              values[j] = new LCHAR[valueLength];
+              if (!values[j])
+              {
+                returnCode = ReturnCode::OUT_OF_MEMORY;
+                goto CLEANUP;
+              }
+              rc = SR_RecognizerResultGetValue(recognitionResult, index, key, values[j], &valueLength);
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                goto CLEANUP;
+              }
+              ++j;
+            }
+          }
+          
+          if (rawMeaning == 0 || literalMeaning == 0 || !confidenceScoreFound)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            goto CLEANUP;
+          }
+          
+          result = new SrecRecognitionResultImpl::EntryImpl(rawMeaning, literalMeaning,
+              confidenceScore, keys, values, keyCount);
+          if (!result)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          resultProxy = SrecRecognitionResultImpl::EntryImplProxy(result);
+          if (!resultProxy)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          delete[] rawKeys;
+          return resultProxy;
+CLEANUP:
+          delete[] rawKeys;
+          for (ARRAY_LIMIT i = 0; i < keyCount; ++i)
+          {
+            delete[] keys[i];
+            delete[] values[i];
+          }
+          delete[] keys;
+          delete[] values;
+          delete[] rawMeaning;
+          delete[] literalMeaning;
+#ifdef SREC_MEASURE_LATENCY
+          gettimeofday ( &latency_result, NULL );
+          printf ( "Result Time :  %ld Seconds  %ld Microseconds\n", latency_result.tv_sec, latency_result.tv_usec );
+#endif
+
+          return SrecRecognitionResultImpl::EntryImplProxy();
+        }
+        
+        SrecRecognitionResultImpl::EntryImpl::EntryImpl(LCHAR* _semanticMeaning,
+            LCHAR* _literalMeaning, UINT8 _confidenceScore, LCHAR ** _keys, LCHAR ** _values, 
+            ARRAY_LIMIT _keyCount):
+            semanticMeaning(_semanticMeaning),
+            literalMeaning(_literalMeaning),
+            confidenceScore(_confidenceScore),
+            keys(_keys),
+            values(_values),
+            keyCount(_keyCount)
+        {
+        }
+        
+        SrecRecognitionResultImpl::EntryImpl::~EntryImpl()
+        {
+          delete[] literalMeaning;
+          delete[] semanticMeaning;
+          for (ARRAY_LIMIT i = 0; i < keyCount; ++i)
+          {
+            delete[] keys[i];
+            delete[] values[i];
+          }
+          delete[] keys;
+          delete[] values;
+        }
+        
+        const char* SrecRecognitionResultImpl::EntryImpl::getLiteralMeaning(
+          ReturnCode::Type& returnCode) const
+        {
+          returnCode = ReturnCode::SUCCESS;
+          return literalMeaning;
+        }
+        
+        const char* SrecRecognitionResultImpl::EntryImpl::getSemanticMeaning(
+          ReturnCode::Type& returnCode) const
+        {
+          returnCode = ReturnCode::SUCCESS;
+          return semanticMeaning;
+        }
+        
+        UINT8 SrecRecognitionResultImpl::EntryImpl::getConfidenceScore(ReturnCode::Type& returnCode) const
+        {
+          returnCode = ReturnCode::SUCCESS;
+          return confidenceScore;
+        }
+
+        ARRAY_LIMIT SrecRecognitionResultImpl::EntryImpl::getKeyCount() const
+        {
+          return keyCount;
+        }
+
+        const char* const* SrecRecognitionResultImpl::EntryImpl::getKeys()
+        {
+          return keys;
+        }
+
+        const char* SrecRecognitionResultImpl::EntryImpl::getValue(const char* key,
+            ReturnCode::Type& returnCode) const
+        {
+          returnCode = ReturnCode::SUCCESS;
+          for (ARRAY_LIMIT i = 0; i < keyCount; ++i)
+          {
+            if (strcmp(key, keys[i]) == 0)
+              return values[i];
+          }
+
+          returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+          return 0;
+        }
+
+
+
+
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/recognizer/srec/source/SrecRecognizerImpl.cpp b/uapi/cpp/recognizer/srec/source/SrecRecognizerImpl.cpp
new file mode 100644
index 0000000..803f03d
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/source/SrecRecognizerImpl.cpp
@@ -0,0 +1,1621 @@
+/*---------------------------------------------------------------------------*
+ *  SrecRecognizerImpl.cpp                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include "SrecRecognizerImpl.h"
+#include "EmbeddedGrammar.h"
+#include "AudioStream.h"
+#include "AudioStreamImpl.h"
+#include "SrecGrammarImpl.h"
+#include "SrecGrammar.h"
+#include "RecognizerListener.h"
+#include "SrecHelper.h"
+#include "SrecRecognitionResultImpl.h"
+#include "RecognitionResult.h"
+#include "AudioSource.h"
+#include "AudioBuffer.h"
+#include "GrammarListener.h"
+#include "WorkerQueue.h"
+#include "Logger.h"
+#include "ConditionVariable.h"
+#include "WorkerQueueFactory.h"
+#include "Queue.h"
+#include "System.h"
+
+
+#include "ESR_ReturnCode.h"
+#include "PFileSystem.h"
+#include "plog.h"
+#include "pmemory.h"
+#include "PANSIFileSystem.h"
+#include "SR_Session.h"
+#include "SR_Recognizer.h"
+#include "ESR_Session.h"
+#include "SR_AcousticState.h"
+#include "ptypes.h"
+
+// Adding a counter to report failed consecutive requests for audio to prevent the recognizer from hanging.
+// s also errors out if we hit the max. SteveR
+#define NO_AUDIO_BUFFERS_WARNING_COUNT	90
+#define NO_AUDIO_BUFFERS_ERROR_MARGIN	10
+#define NO_AUDIO_BUFFERS_ERROR_COUNT	( NO_AUDIO_BUFFERS_WARNING_COUNT + NO_AUDIO_BUFFERS_ERROR_MARGIN )
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+using namespace android::speech::recognition::utilities;
+
+
+EmbeddedRecognizerProxy* ConfigureEmbeddedRecognizer(const char* config, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("ConfigureEmbeddedRecognizer");
+    
+  // Ensure that the function signature matches its associated typedef
+  ::android::speech::recognition::ConfigureEmbeddedRecognizer test = ::ConfigureEmbeddedRecognizer;
+  
+  // Nonsense instruction to suppress warning C4189: "local variable is
+  // initialized but not referenced"
+  if (test)
+    test = 0;
+    
+  if (config == 0)
+  {
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return 0;
+  }
+  returnCode = ReturnCode::SUCCESS;
+  srec::SrecRecognizerImplProxy recognizer = srec::SrecRecognizerImpl::create(returnCode);
+  if (returnCode)
+    return 0;
+  srec::SrecRecognizerImplProxy* result = new srec::SrecRecognizerImplProxy(recognizer);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  recognizer->configure(config, returnCode);
+  if (returnCode)
+  {
+    delete result;
+    return 0;
+  }
+  return result;
+}
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        DEFINE_SMARTPROXY(srec, SrecRecognizerImplProxy, EmbeddedRecognizerProxy, SrecRecognizerImpl)
+        
+        SrecRecognizerImpl::SrecRecognizerImpl(ReturnCode::Type& returnCode):
+            recognizer(0),
+            vocabulary(0),
+            workerQueue(0),
+            grammars(0),
+            state(IDLE),
+            rootProxy(0),
+            pendingTask(0)
+        {
+          UAPI_FN_NAME("SrecRecognizerImpl::SrecRecognizerImpl");
+            
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+          grammars = new Queue();
+          if (grammars == 0)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          mutex = Mutex::create(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to create mutex\n");
+            return;
+          }
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        SrecRecognizerImplProxy SrecRecognizerImpl::create(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::create");
+            
+          SrecRecognizerImpl* object = new SrecRecognizerImpl(returnCode);
+          if (!object)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return SrecRecognizerImplProxy();
+          }
+          else if (returnCode)
+          {
+            delete object;
+            return SrecRecognizerImplProxy();
+          }
+          SrecRecognizerImplProxy result(object);
+          if (!result)
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+          object->rootProxy = result.getRoot();
+          return result;
+        }
+        
+        SrecRecognizerImpl::~SrecRecognizerImpl()
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::~SrecRecognizerImpl");
+            
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+          stopSREC();
+          delete grammars;
+          delete mutex;
+        }
+        
+        void SrecRecognizerImpl::configure(const char* config, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::configure");
+            
+          WorkerQueueFactory* workerFactory = 0;
+          if (config == 0)
+          {
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          
+          //need to protect when we are assigning _state (done in WorkerQueue
+          //thread) and when we are calling configure (done in the app
+          //thread).
+          LockScope ls(mutex, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Failed to create LockScope\n");
+            return;
+          }
+          
+          if (state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call configure\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          // Shut down the engine in case it is already loaded
+          stopSREC();
+          
+          //
+          // Initialize portable library.
+          // Can't use CHKLOG() before plogInit, so use non-portable methods instead.
+          //
+          ESR_ReturnCode rc;
+          size_t len;
+          ESR_BOOL bValue;
+          
+          ESR_SessionExists(&bValue);
+          if (!bValue)
+          {
+            // Initialize the portable library
+            PFile* outputLog;
+            PFile* memFile;
+            
+            CHKLOG(rc, PMemInit());
+            PLogger* logger;
+            outputLog = PSTDOUT;
+            CHKLOG(rc, PLogCreateFileLogger(outputLog, &logger));
+            CHKLOG(rc, PLogInit(logger, 0));
+            memFile = PSTDOUT;
+            CHKLOG(rc, PMemSetLogFile(memFile));
+            CHKLOG(rc, PLogSetFormat(LOG_OUTPUT_FORMAT_DATE_TIME | LOG_OUTPUT_FORMAT_THREAD_ID | LOG_OUTPUT_FORMAT_MODULE_NAME));
+            
+            CHKLOG(rc, SR_SessionCreate(config));
+          }
+          CHKLOG(rc, SR_RecognizerCreate(&recognizer));
+          
+          // Load acoustic models
+          LCHAR filenames[P_PATH_MAX];
+          len = P_PATH_MAX;
+          CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.modelfiles"), filenames, &len));
+          CHKLOG(rc, SR_RecognizerSetup(recognizer));
+          
+          // Create vocabulary object and associate with grammar
+          len = P_PATH_MAX;
+          LCHAR filename[P_PATH_MAX];
+          CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.vocabulary"), filename, &len));
+          CHKLOG(rc, SR_VocabularyLoad(filename, &vocabulary));
+          
+          // Load acoustic state
+          //len = P_PATH_MAX;
+          //CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.state"), filename, &len));
+          //CHKLOG(rc, SR_AcousticStateLoad(recognizer, filename));
+          
+          // start a new log session
+          CHKLOG(rc, SR_RecognizerLogSessionStart(recognizer, L("SRecTest.session1")));
+          
+          workerFactory = WorkerQueueFactory::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not get a WorkerQueueFactory instance\n");
+            goto CLEANUP;
+          }
+          
+          workerQueue = workerFactory->getWorkerQueue(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not create the worker queue\n");
+            goto CLEANUP;
+          }
+          return;
+CLEANUP:
+          returnCode = SrecHelper::toUAPI(rc);
+          return;
+        }
+        
+        void SrecRecognizerImpl::stopSREC()
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::stopSREC");
+            
+          if (recognizer)
+          {
+            SR_RecognizerStop(recognizer);
+            SR_RecognizerLogSessionEnd(recognizer);
+            SR_RecognizerUnsetup(recognizer);
+            SR_RecognizerDestroy(recognizer);
+            recognizer = 0;
+          }
+          if (vocabulary)
+          {
+            SR_VocabularyDestroy(vocabulary);
+            vocabulary = 0;
+          }
+          
+          // Save acoustic state
+          //LCHAR filename[P_PATH_MAX];
+          //len = P_PATH_MAX;
+          //CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.state"), filename, &len));
+          //CHKLOG(rc, SR_AcousticStateSave(recognizer, filename));
+          
+          ESR_BOOL bValue;
+          ESR_SessionExists(&bValue);
+          if (bValue)
+            SR_SessionDestroy();
+            
+          // Shutdown portable library
+          PLogShutdown();
+          PMemShutdown();
+        }
+        
+        GrammarProxy SrecRecognizerImpl::createGrammar(
+              const char* value, GrammarListenerProxy& listener, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::createGrammar");
+            
+          if ( value == 0 || 
+               (strstr(value, "http://") != 0) )
+          {
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return GrammarProxy();
+          }
+          SrecRecognizerImplProxy proxy(rootProxy);
+          if (!proxy)
+            return GrammarProxy();
+            
+          return SrecGrammarImpl::create(value, listener, proxy,
+                                         workerQueue, returnCode);
+        }
+        
+        void SrecRecognizerImpl::handleRecogStatus(GrammarListenerProxy* grammarListeners, ARRAY_LIMIT listenerCount)
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("SrecRecognizerImpl::handleRecogStatus");
+            
+          UAPI_INFO(fn,"recogStatus %d\n", recogStatus);
+          
+          switch (recogStatus)
+          {
+            case SR_RECOGNIZER_EVENT_INVALID:
+            {
+              // this should never happen
+              assert(false);
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_INCOMPLETE:
+            {
+              // do nothing
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_NEED_MORE_AUDIO:
+            {
+              // do nothing
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_STARTED:
+            {
+              if (listener)
+                listener->onStarted();
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_STOPPED:
+            {
+              onStopped(returnCode);
+              if (returnCode != ReturnCode::SUCCESS && listener)
+                listener->onError(returnCode);
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_START_OF_VOICING:
+            {
+              if (listener)
+                listener->onBeginningOfSpeech();
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_END_OF_VOICING:
+            {
+              if (listener)
+                listener->onEndOfSpeech();
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_RECOGNITION_RESULT:
+            {
+              SrecRecognitionResultImplProxy uapiResult = SrecRecognitionResultImpl::create(result, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                if (listener)
+                  listener->onError(returnCode);
+                break;
+              }
+              if (listener)
+                listener->onRecognitionSuccess(uapiResult);
+              onStopped(returnCode);
+              if (returnCode != ReturnCode::SUCCESS && listener)
+                listener->onError(returnCode);
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_NO_MATCH:
+            {
+              if (listener)
+                listener->onRecognitionFailure(RecognizerListener::NO_MATCH);
+              onStopped(returnCode);
+              if (returnCode != ReturnCode::SUCCESS && listener)
+                listener->onError(returnCode);
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_SPOKE_TOO_SOON:
+            {
+              if (listener)
+                listener->onRecognitionFailure(RecognizerListener::SPOKE_TOO_SOON);
+              onStopped(returnCode);
+              if (returnCode != ReturnCode::SUCCESS && listener)
+                listener->onError(returnCode);
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_START_OF_UTTERANCE_TIMEOUT:
+            {
+              if (listener)
+                listener->onRecognitionFailure(RecognizerListener::BEGINNING_OF_SPEECH_TIMEOUT);
+              onStopped(returnCode);
+              if (returnCode != ReturnCode::SUCCESS && listener)
+                listener->onError(returnCode);
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_RECOGNITION_TIMEOUT:
+            {
+              if (listener)
+                listener->onRecognitionFailure(RecognizerListener::RECOGNITION_TIMEOUT);
+              onStopped(returnCode);
+              if (returnCode != ReturnCode::SUCCESS && listener)
+                listener->onError(returnCode);
+              break;
+            }
+            case SR_RECOGNIZER_EVENT_MAX_SPEECH:
+            {
+              if (listener)
+                listener->onRecognitionFailure(RecognizerListener::TOO_MUCH_SPEECH);
+              onStopped(returnCode);
+              if (returnCode != ReturnCode::SUCCESS && listener)
+                listener->onError(returnCode);
+              break;
+            }
+            default:
+            {
+              // this should never happen
+              assert(false);
+              break;
+            }
+          }
+        }
+        
+        void SrecRecognizerImpl::onStopped(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::onStopped");
+            
+          RecognizerStopAndCleanup(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+            return;
+            
+          if (listener != 0)
+            listener->onStopped();
+            
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void SrecRecognizerImpl::RecognizerStopAndCleanup(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::RecognizerStopAndCleanup");
+            
+
+          
+          audioStream->unlock();
+          audioStream = AudioStreamImplProxy();
+          
+          {
+            LockScope ls(mutex, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_WARN(fn,"Failed to create LockScope\n");
+              return;
+            }
+            state = IDLE;
+          }
+          
+          ESR_ReturnCode rc = SR_RecognizerStop(recognizer);
+          if (rc != ESR_SUCCESS)
+          {
+            returnCode = SrecHelper::toUAPI(rc);
+            return;
+          }
+          
+          FwdIterator iter(grammars->begin(), grammars->end());
+          while (iter.hasNext())
+          {
+            SrecGrammarImplProxy* grammar = (SrecGrammarImplProxy*) iter.next();
+            
+            unbind(*grammar, returnCode);
+            delete grammar;
+            if (returnCode != ReturnCode::SUCCESS)
+              return;
+          }
+
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void SrecRecognizerImpl::onReadAudio(GrammarListenerProxy* grammarListeners,
+                                             ARRAY_LIMIT listenerCount)
+        {
+          ReturnCode::Type returnCode;
+	  static int num_consecutive_no_audio_msgs = 0;	// Count to prevent hang on no audio.
+          UAPI_FN_SCOPE("SrecRecognizerImpl::onReadAudio");
+            
+          ESR_ReturnCode rc;
+          AudioBuffer* buffer;
+          
+          pendingTask = 0;
+          buffer = audioStream->read(returnCode);
+          if (buffer)
+          {
+	    num_consecutive_no_audio_msgs = 0;	// Reset counter, we only care about consecutive failures.
+            UAPI_INFO(fn,"Srec got buffer %p\n", buffer);
+            assert(buffer->size % 2 == 0);
+            size_t samplesLeft = buffer->size / 2;
+            do
+            {
+              if (samplesLeft > 0)
+              {
+                size_t samplesRead = samplesLeft;
+                rc = SR_RecognizerPutAudio(recognizer, (asr_int16_t*) buffer->buffer, &samplesRead,
+                                           ESR_FALSE);
+                if (rc != ESR_BUFFER_OVERFLOW && rc != ESR_SUCCESS)
+                {
+                  audioStream->release(buffer, returnCode);
+                  if (returnCode != ReturnCode::SUCCESS)
+                    UAPI_ERROR(fn,"Failed to release audio buffer\n");
+                  returnCode = SrecHelper::toUAPI(rc);
+                  goto CLEANUP;
+                }
+                else
+                  samplesLeft -= samplesRead;
+              }
+              
+              rc = SR_RecognizerAdvance(recognizer, &recogStatus, &resultType, &result);
+              if (rc != ESR_SUCCESS)
+              {
+                PLogError(ESR_rc2str(rc));
+                recogStatus = SR_RECOGNIZER_EVENT_STOPPED;
+                resultType = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+                returnCode = SrecHelper::toUAPI(rc);
+                goto CLEANUP;
+              }
+              
+              if (recogStatus != SR_RECOGNIZER_EVENT_INCOMPLETE)
+              {
+                // We are done with the audio buffer, Release it.
+                audioStream->release(buffer, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to release audio buffer\n");
+                  goto CLEANUP;
+                }
+              }
+              handleRecogStatus(grammarListeners, listenerCount);
+            }
+            while (recogStatus == SR_RECOGNIZER_EVENT_INCOMPLETE);
+            
+            // Try reading again as soon as possible
+            if (resultType != SR_RECOGNIZER_RESULT_TYPE_COMPLETE)
+            {
+              GrammarListenerProxy* grammarListenersCopy = new GrammarListenerProxy[listenerCount];
+              for (ARRAY_LIMIT i = 0; i < listenerCount; ++i)
+                grammarListenersCopy[i] = grammarListeners[i];
+                
+              SrecRecognizerImplProxy proxy(rootProxy);
+              if (!proxy)
+              {
+                UAPI_ERROR(fn,"Failed to create proxy\n");
+                returnCode = ReturnCode::INVALID_STATE;
+                delete[] grammarListenersCopy;
+                goto CLEANUP;
+              }
+              pendingTask = new ReadAudioTask(proxy, 0, grammarListenersCopy, listenerCount);
+              if (!pendingTask)
+              {
+                UAPI_ERROR(fn,"Could not create ReadAudioTask\n");
+                returnCode = ReturnCode::OUT_OF_MEMORY;
+                delete[] grammarListenersCopy;
+                goto CLEANUP;
+              }
+              workerQueue->enqueue(pendingTask, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"Could not enqueue ReadAudioTask\n");
+                delete pendingTask; //grammarListenersCopy is deleted here as well.
+                pendingTask = 0;
+                goto CLEANUP;
+              }
+              
+            }
+          }
+          else
+          {
+            if (returnCode == ReturnCode::PENDING_DATA)
+            {
+	    num_consecutive_no_audio_msgs++;
+
+            if ( num_consecutive_no_audio_msgs == NO_AUDIO_BUFFERS_ERROR_COUNT )
+              {
+                returnCode = ReturnCode::INVALID_STATE;
+                UAPI_ERROR(fn,"Did Not Receive Audio For %d Requests\n", num_consecutive_no_audio_msgs );
+                if ( listener )
+                  listener->onRecognitionFailure ( RecognizerListener::BEGINNING_OF_SPEECH_TIMEOUT );
+                onStopped(returnCode);
+                if (returnCode != ReturnCode::SUCCESS && listener)
+                   listener->onError(returnCode);
+                goto CLEANUP_2;
+              }
+            else if ( num_consecutive_no_audio_msgs >= NO_AUDIO_BUFFERS_WARNING_COUNT )
+              {
+                UAPI_WARN(fn,"Did Not Receive Audio For %d Requests\n", num_consecutive_no_audio_msgs );
+              }
+              // Try reading a bit later
+              GrammarListenerProxy* grammarListenersCopy = new GrammarListenerProxy[listenerCount];
+              for (ARRAY_LIMIT i = 0; i < listenerCount; ++i)
+                grammarListenersCopy[i] = grammarListeners[i];
+                
+              SrecRecognizerImplProxy proxy(rootProxy);
+              if (!proxy)
+              {
+                returnCode = ReturnCode::INVALID_STATE;
+                delete[] grammarListenersCopy;
+                goto CLEANUP;
+              }
+// The time value has been changed from 100 milliseconds down to 10 milliseconds to
+// improve latency. The slight increase in work is negligible compared to the huge
+// gain in reducing latency. This change is tied to the modified size of the audio
+// buffers to 256 samples in the Google audio in code.  SteveR
+// Changed value to 25 because buffers are larger and we're getting time outs. SteveR
+              pendingTask = new ReadAudioTask(proxy, 25, grammarListenersCopy, listenerCount);
+              if (!pendingTask)
+              {
+                UAPI_ERROR(fn,"Could not create ReadAudioTask\n");
+                returnCode = ReturnCode::OUT_OF_MEMORY;
+                delete[] grammarListenersCopy;
+                goto CLEANUP;
+              }
+              workerQueue->enqueue(pendingTask, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"Could not enqueue ReadAudioTask\n");
+                delete pendingTask; //grammarListenersCopy is deleted here as well.
+                pendingTask = 0;
+                goto CLEANUP;
+              }
+            }
+            else if (returnCode == ReturnCode::END_OF_STREAM)
+            {
+              size_t samplesRead = 0;
+              rc = SR_RecognizerPutAudio(recognizer, 0, &samplesRead, ESR_TRUE);
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                goto CLEANUP;
+              }
+              do
+              {
+                rc = SR_RecognizerAdvance(recognizer, &recogStatus, &resultType, &result);
+                if (rc != ESR_SUCCESS)
+                {
+                  PLogError(ESR_rc2str(rc));
+                  returnCode = SrecHelper::toUAPI(rc);
+                  goto CLEANUP;
+                }
+                handleRecogStatus(grammarListeners, listenerCount);
+              }
+              while (resultType != SR_RECOGNIZER_RESULT_TYPE_COMPLETE);
+            }
+          }
+          return;
+CLEANUP:
+          ReturnCode::Type dummy;
+          RecognizerStopAndCleanup(dummy);
+          //don't care about rc, we already failed. Only report returnCode
+          
+          if (listener)
+          {
+            listener->onError(returnCode);
+          }
+CLEANUP_2:
+// Just a place holder, because all work will be done above. SteveR
+          recogStatus = SR_RECOGNIZER_EVENT_STOPPED;
+          resultType = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
+        }
+        
+        void SrecRecognizerImpl::RecognizerIsActiveRule(SR_Grammar* grammar, ESR_BOOL* wasActive,
+            ReturnCode::Type& returnCode)
+        {
+          ESR_ReturnCode rc;
+          rc = SR_RecognizerIsActiveRule(recognizer, grammar, 0, wasActive);
+          if (rc != ESR_SUCCESS)
+          {
+            returnCode = SrecHelper::toUAPI(rc);
+            return;
+          }
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        bool SrecRecognizerImpl::isSRBoolParameter(const char *id)
+        {
+            ESR_ReturnCode  rc = ESR_SUCCESS;
+            ESR_BOOL val= ESR_FALSE;
+            rc = SR_RecognizerGetBoolParameter(recognizer, id, &val );
+            if (rc != ESR_SUCCESS)
+                return false;
+            return (val==ESR_TRUE)?true:false;
+        }
+
+        bool SrecRecognizerImpl::isRecognizing()
+        {
+            return (state == RECOGNIZING);
+        }
+        void SrecRecognizerImpl::recognize(AudioStreamProxy& audio, GrammarProxy* grammars,
+                                           ARRAY_LIMIT grammarCount,
+                                           ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::recognize");
+            
+          AudioStreamImplProxy& audioStreamImpl = (AudioStreamImplProxy&) audio;
+          
+          if (!audioStreamImpl || grammars == 0 || grammarCount < 1)
+          {
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          else if (grammarCount > 1)
+          {
+            returnCode = ReturnCode::NOT_SUPPORTED;
+            return;
+          }
+          size_t recognizerSampleRate;
+          ESR_ReturnCode rc;
+          rc = ESR_SessionGetSize_t(L("CREC.Frontend.samplerate"), &recognizerSampleRate);
+          if (rc != ESR_SUCCESS)
+          {
+            returnCode = SrecHelper::toUAPI(rc);
+            return;
+          }
+          UINT16 audioSampleRate = Codec::getSampleRate(audioStreamImpl->getCodec(), returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+            return;
+            
+          if (recognizerSampleRate != audioSampleRate)
+          {
+            UAPI_ERROR(fn, "Invalid sample rate! Recognizer: %d, Audio: %d\n", recognizerSampleRate, audioSampleRate);
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          
+          //Flag this AudioStreamImpl as being locked. This means that this audio cannot be
+          //passed to other modules.
+          audioStreamImpl->lock(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not lock audio stream\n");
+            return;
+          }
+          
+          // Copy the grammars argument, we want to use SrecGrammarImplProxy to
+          // make sure we don't use a grammar that was deleted.
+          SrecGrammarImplProxy* grammarsCopy = new SrecGrammarImplProxy[grammarCount];
+          for (ARRAY_LIMIT i = 0; i < grammarCount; ++i)
+            grammarsCopy[i] = (SrecGrammarImplProxy) grammars[i];
+            
+          SrecRecognizerImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            delete[] grammarsCopy;
+            audioStreamImpl->unlock();
+            return;
+          }
+          RecognizeTask* task = new RecognizeTask(proxy, audioStreamImpl, grammarsCopy, grammarCount);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create RecognizeTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            delete[] grammarsCopy;
+            audioStreamImpl->unlock();
+            return;
+          }
+          
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not enqueue RecognizeTask\n");
+            delete task; // will delete grammarsCopy too
+            audioStreamImpl->unlock();
+            return;
+          }
+          
+          return;
+        }
+        
+        void SrecRecognizerImpl::recognize(AudioStreamProxy& audio, GrammarProxy& grammar,
+                                           ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::recognize2");
+            
+          GrammarProxy* grammars = new GrammarProxy[1];
+          if (grammars == 0)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          grammars[0] = grammar;
+          recognize(audio, grammars, 1, returnCode);
+          delete[] grammars;
+        }
+        
+        void SrecRecognizerImpl::onRecognize(AudioStreamImplProxy& _audioStream,
+                                             SrecGrammarImplProxy* _grammars,
+                                             ARRAY_LIMIT grammarCount)
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("SrecRecognizerImpl::onRecognize");
+            
+          ESR_ReturnCode rc;
+          
+          GrammarListenerProxy* grammarListeners = new GrammarListenerProxy[grammarCount];
+          grammars->clear();
+          
+          if (state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call recognize\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            goto CLEANUP;
+          }
+          
+          state = RECOGNIZING;
+          audioStream = _audioStream;
+          
+          for (ARRAY_LIMIT i = 0; i < grammarCount; ++i)
+          {
+            SrecGrammarImplProxy& grammar = _grammars[i];
+            grammarListeners[i] = grammar->_listener;
+            if (!grammar->isLoaded())
+            {
+              returnCode = ReturnCode::INVALID_STATE;
+              goto CLEANUP;
+            }
+            bind(grammar, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+              goto CLEANUP;
+            SrecGrammarImplProxy* temp = new SrecGrammarImplProxy(grammar);
+            if (returnCode)
+            {
+              delete temp;
+              goto CLEANUP;
+            }
+            grammars->push(temp, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+              goto CLEANUP;
+          }
+          CHKLOG(rc, SR_RecognizerStart(recognizer));
+          
+          // Try reading as soon as possible
+          {
+            SrecRecognizerImplProxy proxy(rootProxy);
+            if (!proxy)
+            {
+              UAPI_ERROR(fn,"Could not create proxy\n");
+              returnCode = ReturnCode::INVALID_STATE;
+              goto CLEANUP;
+            }
+            pendingTask = new ReadAudioTask(proxy, 0, grammarListeners, grammarCount);
+            if (!pendingTask)
+            {
+              UAPI_ERROR(fn,"Could not create ReadAudioTask\n");
+              returnCode = ReturnCode::OUT_OF_MEMORY;
+              goto CLEANUP;
+            }
+            workerQueue->enqueue(pendingTask, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"Could not enqueue RecognizeTask\n");
+              delete pendingTask;
+              pendingTask = 0;
+              goto CLEANUP;
+            }
+          }
+          return;
+CLEANUP:
+          ReturnCode::Type temp;
+          RecognizerStopAndCleanup(temp);
+          
+          delete[] grammarListeners;
+          if (listener)
+          {
+            listener->onError(returnCode);
+          }
+          return;
+        }
+        
+        void SrecRecognizerImpl::onStop()
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("SrecRecognizerImpl::onStop");
+            
+          //check the state.
+          if (state == IDLE)
+          {
+            //already stopped. Do nothing.
+            UAPI_WARN(fn,"Recognizer is already stopped, nothing to do.\n");
+            return;
+          }
+          
+          onStopped(returnCode);
+          if (returnCode != ReturnCode::SUCCESS && listener)
+            listener->onError(returnCode);
+          if (pendingTask)
+          {
+            workerQueue->remove(pendingTask, returnCode);
+            if (returnCode != ReturnCode::SUCCESS && listener)
+              listener->onError(returnCode);
+            pendingTask = 0;
+          }
+        }
+        
+        void SrecRecognizerImpl::stop(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::stop");
+            
+          SrecRecognizerImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          StopTask* task = new StopTask(proxy);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create StopTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not enqueue StopTask\n");
+            delete task;
+            return;
+          }
+        }
+        
+        void SrecRecognizerImpl::setParameters(const char** keys, const char** values,
+                                               ARRAY_LIMIT count, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::setParameters");
+            
+          SetParametersTask* task = 0;
+          
+          SrecRecognizerImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          char** keysCopy = new char*[count];
+          if (!keysCopy)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          char** valuesCopy = new char*[count];
+          if (!valuesCopy)
+          {
+            delete[] keysCopy;
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+          {
+            keysCopy[i] = 0;
+            valuesCopy[i] = 0;
+          }
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+          {
+            keysCopy[i] = new char[strlen(keys[i]) + 1];
+            if (!keysCopy[i])
+            {
+              returnCode = ReturnCode::OUT_OF_MEMORY;
+              goto CLEANUP;
+            }
+            strcpy(keysCopy[i], keys[i]);
+            
+            valuesCopy[i] = new char[strlen(values[i]) + 1];
+            if (!valuesCopy[i])
+            {
+              returnCode = ReturnCode::OUT_OF_MEMORY;
+              goto CLEANUP;
+            }
+            strcpy(valuesCopy[i], values[i]);
+          }
+          
+          task = new SetParametersTask(proxy, keysCopy, valuesCopy, count);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create SetParametersTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not enqueue SetParametersTask\n");
+            delete task;
+            goto CLEANUP;
+          }
+          return;
+CLEANUP:
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+          {
+            delete[] keysCopy[i];
+            delete[] valuesCopy[i];
+          }
+          delete[] keysCopy;
+          delete[] valuesCopy;
+        }
+        
+        void SrecRecognizerImpl::onSetParameters(const char** keys, const char** values, ARRAY_LIMIT count)
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("SrecRecognizerImpl::onSetParameters");
+            
+          ARRAY_LIMIT invalidIndex = 0;
+          ARRAY_LIMIT validIndex = 0;
+          
+          // NOTE: validKeys, validValues, invalidKeys, invalidValues point to elements of keys and values
+          // variables, no copies are made.
+          const char** validKeys = 0;
+          const char** validValues = 0;
+          const char** invalidKeys = 0;
+          const char** invalidValues = 0;
+          
+          if (state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call SetParameters\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            goto CLEANUP;
+          }
+          validKeys = new const char*[count];
+          if (!validKeys)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          validValues = new const char*[count];
+          if (!validValues)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          invalidKeys = new const char*[count];
+          if (!invalidKeys)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          invalidValues = new const char*[count];
+          if (!invalidValues)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+          {
+            ESR_ReturnCode rc;
+            if (strcmp(keys[i], "SREC.Recognizer.utterance_timeout") == 0 ||
+                strcmp(keys[i], "CREC.Frontend.samplerate") == 0 ||
+                strcmp(keys[i], "CREC.Recognizer.terminal_timeout") == 0 ||
+                strcmp(keys[i], "CREC.Recognizer.optional_terminal_timeout") == 0 ||
+                strcmp(keys[i], "CREC.Recognizer.non_terminal_timeout") == 0 ||
+                strcmp(keys[i], "CREC.Recognizer.eou_threshold") == 0 ||
+                strcmp(keys[i], "enableGetWaveform") == 0)
+            {
+              char* endptr;
+              long convertedValue = strtol(values[i], &endptr, 10);
+              if (strlen(values[i]) == 0 || endptr != values[i] + strlen(values[i]) ||
+                  convertedValue == LONG_MAX || convertedValue == LONG_MIN)
+              {
+                returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+                UAPI_ERROR(fn,"Value must be an integer. Key=%s, value=%s\n", keys[i], values[i]);
+                invalidKeys[invalidIndex] = keys[i];
+                invalidValues[invalidIndex] = values[i];
+                ++invalidIndex;
+                continue;
+              }
+              if (strcmp(keys[i], "enableGetWaveform") == 0)
+              {
+                  ESR_BOOL val= (ESR_BOOL) convertedValue;
+                  rc = SR_RecognizerSetBoolParameter(recognizer, keys[i], val);
+              }
+              else
+              {
+                 rc = SR_RecognizerSetSize_tParameter(recognizer, keys[i], convertedValue);
+              }
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                invalidKeys[invalidIndex] = keys[i];
+                invalidValues[invalidIndex] = values[i];
+                ++invalidIndex;
+              }
+              else
+              {
+                validKeys[validIndex] = keys[i];
+                validValues[validIndex] = values[i];
+                ++validIndex;
+              }
+            }
+	    else if ( strcmp(keys[i], "CREC.Frontend.swicms.cmn") == 0 )
+            {
+              rc = SR_AcousticStateSet ( recognizer, values [i] );
+
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                invalidKeys[invalidIndex] = keys[i];
+                invalidValues[invalidIndex] = values[i];
+                ++invalidIndex;
+              }
+              else
+              {
+                validKeys[validIndex] = keys[i];
+                validValues[validIndex] = values[i];
+                ++validIndex;
+              }
+            }
+            else
+            {
+              UAPI_ERROR(fn,"Unsupported key: %s\n", keys[i]);
+              invalidKeys[invalidIndex] = keys[i];
+              invalidValues[invalidIndex] = values[i];
+              ++invalidIndex;
+            }
+          }
+          if (listener)
+          {
+            if (invalidIndex > 0)
+              listener->onParametersSetError(invalidKeys, invalidValues, invalidIndex, ReturnCode::NOT_SUPPORTED);
+            if (invalidIndex > 0 || validIndex > 0)
+              listener->onParametersSet(validKeys, validValues, validIndex);
+          }
+          returnCode = ReturnCode::SUCCESS;
+CLEANUP:
+          if (validKeys)
+            delete[] validKeys;
+          if (validValues)
+            delete[] validValues;
+          if (invalidKeys)
+            delete[] invalidKeys;
+          if (invalidValues)
+            delete[] invalidValues;
+          if (returnCode && listener)
+            listener->onParametersSetError(keys, values, count, returnCode);
+        }
+        
+        void SrecRecognizerImpl::getParameters(const char** keys, ARRAY_LIMIT count,
+                                               ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::getParameters");
+            
+          GetParametersTask* task = 0;
+          
+          SrecRecognizerImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          char** keysCopy = new char*[count];
+          if (!keysCopy)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+            keysCopy[i] = 0;
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+          {
+            keysCopy[i] = new char[strlen(keys[i]) + 1];
+            if (!keysCopy[i])
+            {
+              returnCode = ReturnCode::OUT_OF_MEMORY;
+              goto CLEANUP;
+            }
+            strcpy(keysCopy[i], keys[i]);
+          }
+          
+          task = new GetParametersTask(proxy, keysCopy, count);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create GetParametersTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not enqueue GetParametersTask\n");
+            delete task;
+            return;
+          }
+          return;
+CLEANUP:
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+            delete[] keysCopy[i];
+          delete[] keysCopy;
+        }
+        
+        void SrecRecognizerImpl::onGetParameters(const char** keys, ARRAY_LIMIT count)
+        {
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("SrecRecognizerImpl::onGetParameters");
+            
+          ARRAY_LIMIT invalidIndex = 0;
+          ARRAY_LIMIT validIndex = 0;
+          
+          // NOTE: validKeys, invalidKeys point to elements of 'keys' variable, no copies are made
+          const char** validKeys = 0;
+          const char** invalidKeys = 0;
+          
+          char** validValues = 0;
+          
+          validKeys = new const char*[count];
+          if (!validKeys)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          invalidKeys = new const char*[count];
+          if (!invalidKeys)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          validValues = new char*[count];
+          if (!validValues)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            goto CLEANUP;
+          }
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+            validValues[i] = 0;
+            
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+          {
+            ESR_ReturnCode rc;
+
+            if (strcmp(keys[i], "SREC.Recognizer.utterance_timeout") == 0 ||
+                strcmp(keys[i], "CREC.Frontend.samplerate") == 0 ||
+                strcmp(keys[i], "CREC.Recognizer.terminal_timeout") == 0 ||
+                strcmp(keys[i], "CREC.Recognizer.optional_terminal_timeout") == 0 ||
+                strcmp(keys[i], "CREC.Recognizer.non_terminal_timeout") == 0 ||
+                strcmp(keys[i], "CREC.Recognizer.eou_threshold") == 0 ||
+                strcmp(keys[i], "enableGetWaveform") == 0)
+            {
+              size_t value;
+              if (strcmp(keys[i], "enableGetWaveform") == 0)
+              {
+                  ESR_BOOL val = ESR_FALSE;
+                  rc = SR_RecognizerGetBoolParameter(recognizer, keys[i], &val);
+                  value = (size_t) val;
+              }
+              else
+                  rc = SR_RecognizerGetSize_tParameter(recognizer, keys[i], &value);
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                invalidKeys[invalidIndex] = keys[i];
+                ++invalidIndex;
+              }
+              else
+              {
+                validKeys[validIndex] = keys[i];
+                validValues[validIndex] = new char[UINT32_DIGITS];
+                if (!validValues[validIndex])
+                {
+                  returnCode = ReturnCode::OUT_OF_MEMORY;
+                  goto CLEANUP;
+                }
+#ifdef UAPI_WIN32
+                _snprintf(validValues[validIndex], UINT32_DIGITS, "%lu", value);
+#else
+                snprintf(validValues[validIndex], UINT32_DIGITS, "%lu", (unsigned long)value);
+#endif
+                ++validIndex;
+              }
+            }
+	    else if ( strcmp(keys[i], "CREC.Frontend.swicms.cmn") == 0 )
+            {
+              char *returned_value;
+	      int  value_len;
+
+              rc = SR_AcousticStateGet ( recognizer, (const LCHAR **)&returned_value );
+
+              if (rc != ESR_SUCCESS)
+              {
+                returnCode = SrecHelper::toUAPI(rc);
+                invalidKeys[invalidIndex] = keys[i];
+                ++invalidIndex;
+              }
+              else
+              {
+                value_len = strlen ( returned_value ) + 1;
+                validKeys[validIndex] = keys[i];
+                validValues[validIndex] = new char[value_len];
+
+                if (!validValues[validIndex])
+                {
+                  returnCode = ReturnCode::OUT_OF_MEMORY;
+                  goto CLEANUP;
+                }
+                memcpy ( validValues[validIndex], returned_value, value_len );
+                ++validIndex;
+              }
+            }
+            else
+            {
+              UAPI_ERROR(fn,"Unsupported key: %s\n", keys[i]);
+              invalidKeys[invalidIndex] = keys[i];
+              ++invalidIndex;
+            }
+          }
+          if (listener)
+          {
+            if (invalidIndex > 0)
+              listener->onParametersGetError(invalidKeys, invalidIndex, ReturnCode::NOT_SUPPORTED);
+            if (invalidIndex > 0 || validIndex > 0)
+              listener->onParametersGet(validKeys, (const char**) validValues, validIndex);
+          }
+          returnCode = ReturnCode::SUCCESS;
+CLEANUP:
+          if (validKeys)
+            delete[] validKeys;
+          if (invalidKeys)
+            delete[] invalidKeys;
+          if (validValues)
+          {
+            for (ARRAY_LIMIT i = 0; i < count; ++i)
+              delete[] validValues[i];
+            delete[] validValues;
+          }
+          if (returnCode && listener)
+            listener->onParametersGetError(invalidKeys, count, returnCode);
+        }
+        
+        void SrecRecognizerImpl::bind(SrecGrammarImplProxy& grammar, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::bind");
+            
+          ESR_ReturnCode rc = ESR_SUCCESS;
+          SR_Grammar* srecGrammar;
+          
+          // TODO: We happens if we invoke this multiple times per grammar?
+          srecGrammar = grammar->grammar;
+          CHKLOG(rc, SR_GrammarSetupVocabulary(srecGrammar, vocabulary));
+          
+          CHKLOG(rc, SR_GrammarSetupRecognizer(srecGrammar, recognizer));
+          // -------------------------------
+          
+          CHKLOG(rc, SR_RecognizerActivateRule(recognizer, srecGrammar, 0, 0));
+          returnCode = ReturnCode::SUCCESS;
+          return;
+CLEANUP:
+          returnCode = SrecHelper::toUAPI(rc);
+        }
+        
+        void SrecRecognizerImpl::unbind(SrecGrammarImplProxy& grammar, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::unbind");
+            
+          ESR_ReturnCode rc;
+          
+          SR_Grammar* srecGrammar = grammar->grammar;
+          CHKLOG(rc, SR_RecognizerDeactivateRule(recognizer, srecGrammar, 0));
+          returnCode = ReturnCode::SUCCESS;
+          return;
+CLEANUP:
+          returnCode = SrecHelper::toUAPI(rc);
+        }
+        
+        void SrecRecognizerImpl::setListener(RecognizerListenerProxy& listener,
+                                             ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::setListener");
+            
+          if (!listener)
+          {
+            //not accepting NULL listener
+            UAPI_WARN(fn,"Listener cannot be NULL\n");
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          
+          SrecRecognizerImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          SetListenerTask* task = new SetListenerTask(proxy, listener);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create SetListenerTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not enqueue SetListenerTask\n");
+            delete task;
+            return;
+          }
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void SrecRecognizerImpl::resetAcousticState(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::resetAcousticState");
+            
+          SrecRecognizerImplProxy proxy(rootProxy);
+          if (!proxy)
+          {
+            UAPI_ERROR(fn,"Could not create proxy\n");
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          
+          ResetAcousticStateTask* task = new ResetAcousticStateTask(proxy);
+          if (!task)
+          {
+            UAPI_ERROR(fn,"Could not create ResetAcousticStateTask\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          
+          workerQueue->enqueue(task, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not enqueue ResetAcousticStateTask\n");
+            delete task;
+            return;
+          }
+          
+          returnCode = ReturnCode::SUCCESS;
+        }
+        
+        void SrecRecognizerImpl::onResetAcousticState()
+        {
+          ESR_ReturnCode rc;
+          ReturnCode::Type returnCode;
+          UAPI_FN_SCOPE("SrecRecognizerImpl::onResetAcousticState");
+
+	  if (state != IDLE)
+          {
+            UAPI_ERROR(fn,"Must be in IDLE state to call ResetAcousticState\n");
+            returnCode = ReturnCode::INVALID_STATE;
+          }
+	  else
+          {
+            rc = SR_AcousticStateReset(recognizer);
+            returnCode = SrecHelper::toUAPI(rc);
+          }
+          if (listener)
+          {
+            if (returnCode)
+              listener->onError(returnCode);
+            else
+              listener->onAcousticStateReset();
+          }
+        }
+        
+        void SrecRecognizerImpl::onSetListener(RecognizerListenerProxy& _listener)
+        {
+          UAPI_FN_SCOPE("SrecRecognizerImpl::onSetListener");
+            
+	  if (state != IDLE)
+            UAPI_WARN(fn,"Should be in IDLE state to call SetListener\n");
+          listener = _listener;
+        }
+        
+        SetListenerTask::SetListenerTask(SrecRecognizerImplProxy& _recognizer,
+                                         RecognizerListenerProxy & _listener):
+            Task("SetListenerTask"),
+            recognizer(_recognizer),
+            listener(_listener)
+        {}
+        
+        void SetListenerTask::run()
+        {
+          recognizer->onSetListener(listener);
+        }
+        
+        RecognizeTask::RecognizeTask(SrecRecognizerImplProxy& _recognizer,
+                                     AudioStreamImplProxy & _audioStream,
+                                     SrecGrammarImplProxy* _grammars,
+                                     ARRAY_LIMIT _grammarCount):
+            Task("RecognizeTask"),
+            recognizer(_recognizer),
+            audioStream(_audioStream),
+            grammars(_grammars),
+            grammarCount(_grammarCount)
+        {}
+        
+        RecognizeTask::~RecognizeTask()
+        {
+          delete[] grammars;
+        }
+        
+        void RecognizeTask::run()
+        {
+          recognizer->onRecognize(audioStream, grammars, grammarCount);
+        }
+        
+        ReadAudioTask::ReadAudioTask(SrecRecognizerImplProxy& _recognizer,
+                                     UINT32 timeout, GrammarListenerProxy* _grammarListeners,
+                                     ARRAY_LIMIT _listenerCount):
+            ScheduledTask(timeout, "ReadAudioTask"),
+            recognizer(_recognizer),
+            grammarListeners(_grammarListeners),
+            listenerCount(_listenerCount)
+        {}
+        
+        ReadAudioTask::~ReadAudioTask()
+        {
+          delete[] grammarListeners;
+        }
+        
+        void ReadAudioTask::run()
+        {
+          recognizer->onReadAudio(grammarListeners, listenerCount);
+        }
+        
+        StopTask::StopTask(SrecRecognizerImplProxy& _recognizer):
+            Task("StopTask"),
+            recognizer(_recognizer)
+        {}
+        
+        void StopTask::run()
+        {
+          recognizer->onStop();
+        }
+        
+        ResetAcousticStateTask::ResetAcousticStateTask(SrecRecognizerImplProxy& _recognizer):
+            Task("ResetAcousticStateTask"),
+            recognizer(_recognizer)
+        {}
+        
+        void ResetAcousticStateTask::run()
+        {
+          recognizer->onResetAcousticState();
+        }
+        
+        SetParametersTask::SetParametersTask(SrecRecognizerImplProxy& _recognizer, char** _keys,
+                                             char** _values, ARRAY_LIMIT _count):
+            Task("SetParametersTask"),
+            recognizer(_recognizer),
+            keys(_keys),
+            values(_values),
+            count(_count)
+        {}
+        
+        void SetParametersTask::run()
+        {
+          // Reasoning for (const char**) cast: http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-10/1514.html
+          recognizer->onSetParameters((const char**) keys, (const char**) values, count);
+        }
+        
+        SetParametersTask::~SetParametersTask()
+        {
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+            delete [] keys[i];
+          delete [] keys;
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+            delete [] values[i];
+          delete [] values;
+        }
+        
+        GetParametersTask::GetParametersTask(SrecRecognizerImplProxy& _recognizer, char** _keys,
+                                             ARRAY_LIMIT _count):
+            Task("GetParametersTask"),
+            recognizer(_recognizer),
+            keys(_keys),
+            count(_count)
+        {}
+        
+        void GetParametersTask::run()
+        {
+          // Reasoning for (const char**) cast: http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-10/1514.html
+          recognizer->onGetParameters((const char**) keys, count);
+        }
+        
+        GetParametersTask::~GetParametersTask()
+        {
+          for (ARRAY_LIMIT i = 0; i < count; ++i)
+            delete [] keys[i];
+          delete [] keys;
+        }
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/recognizer/srec/source/SrecVoicetagItem.cpp b/uapi/cpp/recognizer/srec/source/SrecVoicetagItem.cpp
new file mode 100644
index 0000000..2f55e0d
--- /dev/null
+++ b/uapi/cpp/recognizer/srec/source/SrecVoicetagItem.cpp
@@ -0,0 +1,765 @@
+/*---------------------------------------------------------------------------*
+ *  SrecVoicetagItem.cpp                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include "SrecVoicetagItemImpl.h"
+#include "SrecHelper.h"
+#include "File.h"
+#include "WorkerQueue.h"
+#include "WorkerQueueFactory.h"
+#include "LoggerImpl.h"
+#include "System.h"
+#include "SR_Nametag.h"
+#include "SrecRecognizerImpl.h"
+
+#if defined(UAPI_WIN32) || defined(UAPI_LINUX)
+# include "FileASCII.h"
+#endif
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+using namespace android::speech::recognition::utilities;
+using namespace android::speech::recognition::srec;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace srec
+      {
+        DEFINE_SMARTPROXY(srec, SrecVoicetagItemImplProxy, VoicetagItemImplProxy, SrecVoicetagItemImpl)
+        
+        SrecVoicetagItemImplProxy SrecVoicetagItemImpl::create(SR_Nametag* nametag, const INT16* waveform,
+        ARRAY_LIMIT size, VoicetagItemListenerProxy& listener, ReturnCode::Type& returnCode)
+        {
+          SrecVoicetagItemImpl* object = new SrecVoicetagItemImpl(nametag, waveform, size, listener);
+          if (object == 0)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return SrecVoicetagItemImplProxy();
+          }
+          SrecVoicetagItemImplProxy result(object);
+          if (!result)
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+          object->rootProxy = result.getRoot();
+          return result;
+        }
+        
+        SrecVoicetagItemImplProxy SrecVoicetagItemImpl::create(const char* filename,
+                                                      VoicetagItemListenerProxy &listener,
+                                                      ReturnCode::Type& returnCode)
+        {
+           UAPI_FN_SCOPE("SrecVoicetagItemImpl::create");
+
+           SrecVoicetagItemImpl* object = new SrecVoicetagItemImpl(filename,listener,returnCode);
+           if (object == 0)
+           {
+               returnCode = ReturnCode::OUT_OF_MEMORY;
+               return SrecVoicetagItemImplProxy();
+           }
+           else if (returnCode)
+           {
+                delete object;
+                return SrecVoicetagItemImplProxy();
+           }
+           SrecVoicetagItemImplProxy result(object);
+           if (!result)
+               returnCode = ReturnCode::OUT_OF_MEMORY;
+           object->rootProxy = result.getRoot();
+           returnCode = ReturnCode::SUCCESS;
+           return result;
+        }
+
+        SrecVoicetagItemImpl::SrecVoicetagItemImpl(SR_Nametag* nametag, const INT16* _waveform,
+            ARRAY_LIMIT size, VoicetagItemListenerProxy &listener):
+            VoicetagItemImpl(0,0),
+            _filename(0), 
+            _nametag(nametag),
+            _listener(listener),
+            _file(0),
+            _workerQueue(0),
+            rootProxy(0)
+        {
+            UAPI_FN_SCOPE("SrecVoicetagItemImpl::SrecVoicetagItemImpl");
+
+            // We need to make a copy of the waveform, because 
+            // SR_RecognizerResultGetWaveform will return pointer to buffer holding
+            // audio data in it. This buffer is NOT under the application's control
+            // and MUST only be read from.
+            waveformSize = size;
+            waveform = new INT16[size];
+            if (waveform == 0)
+            {
+                UAPI_ERROR(fn,"Could not create _waveform, out of memory\n");
+                waveformSize = 0;
+            }
+            memcpy((void*)waveform,_waveform,size*sizeof(INT16));
+        }
+
+        SrecVoicetagItemImpl::SrecVoicetagItemImpl(const char* filename, VoicetagItemListenerProxy &listener,
+            ReturnCode::Type& returnCode):
+             VoicetagItemImpl(0,0),
+            _nametag(0),
+            _listener(listener),
+            _workerQueue(0),
+            rootProxy(0)
+        {
+
+           ReturnCode::Type temp;
+            UAPI_FN_SCOPE("SrecVoicetagItemImpl::SrecVoicetagItemImpl");
+            UAPI_TRACE(fn,"this=%p\n", this);
+           if (!filename)
+           {
+               returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+               return ;
+           }
+             // Create file object
+            #if defined(UAPI_WIN32) || defined(UAPI_LINUX)
+                _file = new FileASCII;
+            #endif
+            if (_file == 0)
+            {
+                returnCode=ReturnCode::OUT_OF_MEMORY;
+                return;
+            }
+            _file->open(filename, "rb", returnCode);
+           if (returnCode != ReturnCode::SUCCESS)
+           {
+                UAPI_ERROR(fn,"Could not open file %s reason %s\n", filename, ReturnCode::toString(returnCode));
+                 return;
+           }
+           _file->close(temp);
+            delete _file;
+
+            // Store filename
+            _filename = new char[strlen(filename)+1];
+            if (_filename == 0)
+            {
+                returnCode=ReturnCode::OUT_OF_MEMORY;
+                UAPI_ERROR(fn,"Could not create _filename, reason %s\n", ReturnCode::toString(returnCode));
+                return;
+            }
+            strcpy(_filename, filename);         
+        }
+
+        
+        SrecVoicetagItemImpl::~SrecVoicetagItemImpl()
+        {
+            UAPI_FN_SCOPE("SrecVoicetagItemImpl::~SrecVoicetagItemImpl");
+            UAPI_TRACE(fn,"this=%p\n", this);
+            if (_filename)
+            {
+                delete[] _filename;
+
+            }
+            _filename = 0;
+            if (_file)
+            {
+                delete _file;
+                _file = 0;
+            }
+            // Very important to destroy the nametag
+            if (_nametag)
+            {
+               SR_NametagDestroy(_nametag);
+              _nametag= NULL;
+            }
+
+        }
+       
+        bool SrecVoicetagItemImpl::isEnableGetWaveformOn()
+        {
+            ReturnCode::Type returnCode;
+            srec::SrecRecognizerImplProxy nativeRecognizer = (srec::SrecRecognizerImplProxy) EmbeddedRecognizer::getInstance(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+                return false;
+            return nativeRecognizer->isSRBoolParameter(L("enableGetWaveform"));
+        }
+
+        void SrecVoicetagItemImpl::getAudio(const INT16** _waveform, ARRAY_LIMIT* _size,
+                                ReturnCode::Type& returnCode) const
+        {
+
+            if (_waveform == 0 || _size == 0 || !isEnableGetWaveformOn())
+            {
+                returnCode = ReturnCode::INVALID_STATE;
+                return;
+            }
+            *_waveform = waveform;
+            *_size = waveformSize;
+            returnCode = ReturnCode::SUCCESS;
+        }
+
+        void SrecVoicetagItemImpl::setAudio(const INT16* _waveform, ARRAY_LIMIT _size,
+                                        ReturnCode::Type& returnCode)
+        {
+            if (_waveform == 0 || _size <= 0)
+            {
+                returnCode = ReturnCode::INVALID_STATE;
+                return;
+            }
+            waveform = _waveform;
+            waveformSize = _size;
+            returnCode = ReturnCode::SUCCESS;
+        }
+
+        /**
+        * Save the Voicetag Item.
+        *
+        * @param the path where the Voicetag will be saved. We strongly recommend to set the filename with the same value of the VoicetagId. If the filename is ommited, then the VoicetagId (assigned upon creation) will be used as default. 
+        * @param returnCode the return code
+        */
+        void SrecVoicetagItemImpl::save(const char* path, ReturnCode::Type& returnCode)
+        {
+            UAPI_FN_SCOPE("SrecVoicetagItemImpl::save");
+            if (!path)
+            {
+                returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+                return;
+            }
+            
+            WorkerQueueFactory* workerFactory = WorkerQueueFactory::getInstance(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {   
+                UAPI_ERROR(fn,"Could not create the worker queue factory\n");
+                return;
+            }
+            _workerQueue = workerFactory->getWorkerQueue(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+                UAPI_ERROR(fn,"Could not create the worker queue\n");
+                return;
+            }
+            // Copy path 
+            char* pathCopy = 0;
+            SaveVoicetagTask* task = 0;
+            pathCopy = new char[strlen(path)+1];
+            if (pathCopy == 0)
+            {
+                returnCode = ReturnCode::OUT_OF_MEMORY;
+                goto CLEANUP;
+            }
+            strcpy(pathCopy, path);
+            // Create Save Task
+            {
+                SrecVoicetagItemImplProxy proxy(rootProxy);
+                if (!proxy)
+                {
+                    UAPI_ERROR(fn,"Could not create proxy\n");
+                    returnCode = ReturnCode::INVALID_STATE;
+                    delete[] pathCopy;
+                    goto CLEANUP;
+                }
+                task = new SaveVoicetagTask(proxy, pathCopy);
+                if (!task)
+                {
+                    UAPI_ERROR(fn,"Could not create SaveVoicetagTask\n");
+                    returnCode = ReturnCode::OUT_OF_MEMORY;
+                    delete[] pathCopy;
+                    goto CLEANUP;
+                }
+                _workerQueue->enqueue(task, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                    UAPI_ERROR(fn,"Could not enqueue SaveVoicetagTask\n");
+                    delete task;
+                    goto CLEANUP;
+                }
+            }
+CLEANUP:
+            return;
+         }
+
+        /**
+        * Load a Voicetag Item.
+        *
+        * @param returnCode the return code
+        */
+        void SrecVoicetagItemImpl::load(ReturnCode::Type& returnCode)
+        {
+           UAPI_FN_SCOPE("SrecVoicetagItemImpl::load");
+           if (!_filename)
+           {
+               UAPI_ERROR(fn,"Could not load this voicetag, because was not created from file\n");
+               returnCode = ReturnCode::INVALID_STATE;
+               return;
+           }
+           WorkerQueueFactory* workerFactory = WorkerQueueFactory::getInstance(returnCode);
+           if (returnCode != ReturnCode::SUCCESS)
+           {   
+               UAPI_ERROR(fn,"Could not create the worker queue factory\n");
+               return;
+           }
+           _workerQueue = workerFactory->getWorkerQueue(returnCode);
+           if (returnCode != ReturnCode::SUCCESS)
+           {
+               UAPI_ERROR(fn,"Could not create the worker queue\n");
+               return;
+           }
+           // Create load Task
+            LoadVoicetagTask* task = 0;
+           {
+               SrecVoicetagItemImplProxy proxy(rootProxy);
+               if (!proxy)
+               {
+                   UAPI_ERROR(fn,"Could not create proxy\n");
+                   returnCode = ReturnCode::INVALID_STATE;
+                   return;
+               }
+               task = new LoadVoicetagTask(proxy);
+               if (!task)
+               {
+                   UAPI_ERROR(fn,"Could not create LoadVoicetagTask;\n");
+                   returnCode = ReturnCode::OUT_OF_MEMORY;
+                   return;
+               }
+               _workerQueue->enqueue(task, returnCode);
+               if (returnCode != ReturnCode::SUCCESS)
+               {
+                   UAPI_ERROR(fn,"Could not enqueue LoadVoicetagTask\n");
+                   delete task;
+                   return;
+               }
+           }
+        }
+
+        SR_Nametag* SrecVoicetagItemImpl::getNametag()
+        {
+          return _nametag;
+        }
+
+        void SrecVoicetagItemImpl::onSave(const char* path)
+        {
+            UAPI_FN_SCOPE("SrecVoicetagItemImpl::onSave");
+                
+            ReturnCode::Type returnCode;
+            char VoiceTagFilename[255];
+            char SoundFilename[255];
+            const char* value = NULL;
+            UINT32 count;
+
+            // If path not equal to null.
+            if (!path)
+            {
+                returnCode=ReturnCode::ILLEGAL_ARGUMENT;
+                goto CLEAN_UP;
+            }
+          
+            strcpy((char*)&VoiceTagFilename,path);
+            strcpy((char*)&SoundFilename,path);
+            strcat((char*)&SoundFilename,"_raw");
+
+            // Create file object
+            #if defined(UAPI_WIN32) || defined(UAPI_LINUX)
+                _file = new FileASCII;
+            #endif
+            if (_file == 0)
+            {
+                returnCode=ReturnCode::OUT_OF_MEMORY;
+                goto CLEAN_UP;
+            }
+
+            /**
+            * Save VoiceTag
+            */
+            _file->open(VoiceTagFilename, "wb+", returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+                UAPI_ERROR(fn,"Failed to create file %s reason %s\n", VoiceTagFilename,
+                       ReturnCode::toString(returnCode));
+                delete _file;
+                _file = 0;
+                goto CLEAN_UP;
+            }
+
+            ESR_ReturnCode  rc;
+            size_t len,lenId;
+            LCHAR* id;
+            count = 1;
+            rc = SR_NametagGetID(_nametag, &id);
+            if (rc != ESR_SUCCESS)
+            {
+                 returnCode = SrecHelper::toUAPI(rc);
+                 UAPI_ERROR(fn,"Failed to retrieve the nametag id reason:%s\n",
+                       ReturnCode::toString(returnCode));
+                 goto CLOSE_FILE;
+            }
+            lenId = strlen((const char*)id);
+            
+            rc = SR_NametagGetValue( _nametag, &value, &len);
+            if (rc != ESR_SUCCESS)
+            {
+                 returnCode = SrecHelper::toUAPI(rc);
+                 UAPI_ERROR(fn,"Failed to retrieve the nametag value reason:%s\n",
+                       ReturnCode::toString(returnCode));
+                 goto CLOSE_FILE;
+            }
+
+            if (lenId > 0)
+            { 
+               _file->write(&lenId,sizeof(size_t),count,returnCode);
+               if (returnCode != ReturnCode::SUCCESS)
+               {
+                  UAPI_ERROR(fn,"Failed to write id size reason %s\n", ReturnCode::toString(returnCode));
+                  goto CLOSE_FILE;
+                }
+               count = (UINT32)lenId;
+               _file->write(id, sizeof(LCHAR), count, returnCode);
+               if (returnCode != ReturnCode::SUCCESS)
+               {
+                  UAPI_ERROR(fn,"Failed to write ID %s reason %s\n", id, ReturnCode::toString(returnCode));
+                  goto CLOSE_FILE;
+                }
+               count = 1;
+               _file->write(&len,sizeof(size_t),count,returnCode);
+               if (returnCode != ReturnCode::SUCCESS)
+               {
+                  UAPI_ERROR(fn,"Failed to write value size reason %s\n", ReturnCode::toString(returnCode));
+                  goto CLOSE_FILE;
+                }
+               count = (UINT32)len;
+               if (count>0)
+               {
+                    _file->write((void*)value, sizeof(char), count, returnCode);
+                    if (returnCode != ReturnCode::SUCCESS)
+                    {
+                        UAPI_ERROR(fn,"Failed to write value %s reason %s\n", value, ReturnCode::toString(returnCode));
+                        goto CLOSE_FILE;
+                    }
+               }
+            }
+            _file->close(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+                goto CLEAN_UP;
+
+            /**
+            * Save Raw Sound
+            */
+            _file->open((const char*) &SoundFilename, "wb+", returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+                UAPI_ERROR(fn,"Failed to create file %s reason %s\n", SoundFilename,
+                       ReturnCode::toString(returnCode));
+                delete _file;
+                _file = 0;
+                goto CLEAN_UP;
+            }
+            
+            if (waveformSize>0)
+            {
+                int szWave = waveformSize/2;
+                count = szWave;
+                if (count>0)
+                {
+                    _file->write((void*)waveform, sizeof(INT16), count, returnCode);
+                    if (returnCode != ReturnCode::SUCCESS)
+                    {
+                        UAPI_ERROR(fn,"Failed to write waveform reason %s\n", ReturnCode::toString(returnCode));
+                        goto CLOSE_FILE;
+                    }
+                }    
+            }
+CLOSE_FILE:
+            // Close the file
+            if (_file)
+            {
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                    // Already an error so don't care about it
+                    ReturnCode::Type dummy;
+                    _file->close(dummy);
+                }
+                else
+                {  // So far so good let's close the file 
+                   _file->close(returnCode);
+                }
+                delete _file;
+                _file = NULL;
+            }
+CLEAN_UP:                  
+            // Report status to listener
+            if (_listener)
+            {
+                if (returnCode != ReturnCode::SUCCESS)
+                    _listener->onError(returnCode);
+                else 
+                    _listener->onSaved(path);
+            }
+        }
+
+        SaveVoicetagTask::~SaveVoicetagTask()
+        {
+            delete[] path;
+        }
+
+        SaveVoicetagTask::SaveVoicetagTask(SrecVoicetagItemImplProxy& _voicetag, const char* _path):
+            Task("SaveVoicetagTask"),
+            path(_path),
+            voicetag(_voicetag)
+        {}
+
+        void SaveVoicetagTask::run()
+        {
+            voicetag->onSave(path);
+        }
+
+        void SrecVoicetagItemImpl::onLoad()
+        {
+            UAPI_FN_SCOPE("SrecVoicetagItemImpl::onLoad");
+       
+            ReturnCode::Type returnCode;
+            char VoiceTagFilename[255];
+            char SoundFilename[255];
+            char* value = NULL;
+            const INT16* _waveform = NULL;
+            ARRAY_LIMIT _waveformSize = 0;   
+            UINT32 fileLength = 0;
+
+            // If path not equel to null.
+            if (!_filename)
+            {
+                returnCode=ReturnCode::ILLEGAL_ARGUMENT;
+                goto CLEAN_UP;
+            }
+        
+            strcpy((char*)&VoiceTagFilename,_filename);
+            strcpy((char*)&SoundFilename,_filename);
+            strcat((char*)&SoundFilename,"_raw");
+
+            // Create file object
+            #if defined(UAPI_WIN32) || defined(UAPI_LINUX)
+                _file = new FileASCII;
+            #endif
+            if (_file == 0)
+            {
+                returnCode=ReturnCode::OUT_OF_MEMORY;
+                goto CLEAN_UP;
+            }
+
+            ESR_ReturnCode  rc;
+            LCHAR* id;
+            UINT32 szValue, szId, szWaveform;
+            UINT32 count;
+
+            /**
+            * Load VoiceTag
+            */
+            _file->open((const char*)&VoiceTagFilename, "rb", returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+                UAPI_ERROR(fn,"Could not open file %s reason %s\n", VoiceTagFilename, ReturnCode::toString(returnCode));
+                delete _file;
+                _file = 0;
+                goto CLEAN_UP;
+            }
+	                
+            // read data as a block:
+            count = 1;
+            _file->read(&szId, sizeof(UINT32), count, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+               UAPI_ERROR(fn,"Failed to read id size, reason %s\n", ReturnCode::toString(returnCode));
+               goto CLOSE_FILE;
+            }
+            count = szId;
+            if (count == 0)
+            {
+               UAPI_ERROR(fn,"Id size is Zero!\n");
+               returnCode = ReturnCode::END_OF_STREAM;
+               goto CLOSE_FILE;
+            }
+            id = new LCHAR[szId+1];
+            if (id == 0)
+            {
+                returnCode=ReturnCode::OUT_OF_MEMORY;
+                UAPI_ERROR(fn,"Could not create id, reason %s\n", ReturnCode::toString(returnCode));
+                goto CLOSE_FILE;
+            }
+            _file->read((void*)id, sizeof(LCHAR), count, returnCode);
+            id[szId]='\0';
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+               UAPI_ERROR(fn,"Failed to read id string, reason %s\n", ReturnCode::toString(returnCode));
+               delete[] id;
+               goto CLOSE_FILE;
+            }
+            count = 1;
+            _file->read(&szValue, sizeof(UINT32), count, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+               UAPI_ERROR(fn,"Failed to read phoneme value size, reason %s\n", ReturnCode::toString(returnCode));
+               delete[] id;
+               goto CLOSE_FILE;
+            }
+            count = szValue;
+            if (count == 0)
+            {
+               UAPI_ERROR(fn,"Phoneme value size is Zero!\n");
+               returnCode = ReturnCode::END_OF_STREAM;
+               goto CLOSE_FILE;
+            }
+            value = new char[szValue+1];
+            if (value == 0)
+            {
+                returnCode=ReturnCode::OUT_OF_MEMORY;
+                UAPI_ERROR(fn,"Could not create phoneme value, reason %s\n", ReturnCode::toString(returnCode));
+                delete[] id;
+                goto CLOSE_FILE;
+            }
+            _file->read((void*)value, sizeof(char), count, returnCode);
+            value[szValue]='\0';
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+               UAPI_ERROR(fn,"Failed to read phone value, reason %s\n", ReturnCode::toString(returnCode));
+               delete[] id;
+               delete[] value;
+               goto CLOSE_FILE;
+            }
+            _file->close(returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+               goto CLEAN_UP;
+
+            if (_nametag)
+            {
+                rc = SR_NametagDestroy(_nametag);
+	            _nametag = NULL; 
+            }
+
+            // Create new name tag
+            rc = SR_NametagCreateFromValue(id,  value, szValue, &_nametag);
+            if (rc != ESR_SUCCESS)
+            {
+                returnCode = SrecHelper::toUAPI(rc);
+                UAPI_ERROR(fn,"Failed to create nametag from value:%s\n",
+                      ReturnCode::toString(returnCode));
+               delete[] id;
+               delete[] value;
+               goto CLEAN_UP;
+            }
+            delete[] id;
+            delete[] value;
+	        value = NULL;
+
+            /**
+            * Load Raw Sound
+            */
+            _file->open((const char*)&SoundFilename, "rb", returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+                UAPI_ERROR(fn,"Could not open file %s reason %s\n", SoundFilename, ReturnCode::toString(returnCode));
+                delete _file;
+                _file = 0;
+                goto CLEAN_UP;
+            }
+            // get length of file:
+           
+            _file->seek(0, File::UAPI_SEEK_END, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+                UAPI_ERROR(fn,"Could seek to the end of the file reason %s\n", ReturnCode::toString(returnCode));
+                goto CLOSE_FILE;
+            }
+            _file->getPosition(fileLength, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+                UAPI_ERROR(fn,"Could not get the file length reason %s\n", ReturnCode::toString(returnCode));
+                goto CLOSE_FILE;
+            }
+            _file->seek(0, File::UAPI_SEEK_SET, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+                UAPI_ERROR(fn,"Could seek to the begin of the file reason %s\n", ReturnCode::toString(returnCode));
+                goto CLOSE_FILE;
+            }
+            szWaveform = (int)fileLength/2;
+            count = szWaveform;
+            if (count > 0)
+            {
+                _waveformSize = (int)fileLength;
+                _waveform = new INT16[szWaveform];
+                if (_waveform == 0)
+                {
+                    returnCode=ReturnCode::OUT_OF_MEMORY;
+                    UAPI_ERROR(fn,"Could not create _waveform, reason %s\n", ReturnCode::toString(returnCode));
+                    goto CLOSE_FILE;
+                }
+                _file->read((void*)_waveform, sizeof(INT16), count, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                    UAPI_ERROR(fn,"Failed to read _waveform, reason %s\n", ReturnCode::toString(returnCode));
+                    delete[] _waveform;
+                    goto CLOSE_FILE;
+                }
+            }
+            if (_waveform) 
+            {
+                // Set audio
+                waveform = _waveform;
+                waveformSize = _waveformSize;
+            }
+CLOSE_FILE:
+            // Close the file
+            if (_file)
+            {
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                    // Already an error so don't care about it
+                    ReturnCode::Type dummy;
+                    _file->close(dummy);
+                }
+                else
+                {  // So far so good let's close the file 
+                   _file->close(returnCode);
+                }
+                delete _file;
+                _file = NULL;
+            }
+CLEAN_UP:         
+            // Report status to listener
+            if (_listener)
+            {
+                if (returnCode != ReturnCode::SUCCESS)
+                    _listener->onError(returnCode);
+                else 
+                    _listener->onLoaded();
+            }
+        }
+
+        LoadVoicetagTask::LoadVoicetagTask(SrecVoicetagItemImplProxy& _voicetag):
+            Task("LoadVoicetagTask"),
+            voicetag(_voicetag)
+        {}
+
+        void LoadVoicetagTask::run()
+        {
+            voicetag->onLoad();
+        }
+        
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/test/Android.mk b/uapi/cpp/test/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/test/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/test/include/PortabilityTest.h b/uapi/cpp/test/include/PortabilityTest.h
new file mode 100644
index 0000000..6e07d26
--- /dev/null
+++ b/uapi/cpp/test/include/PortabilityTest.h
@@ -0,0 +1,146 @@
+/*---------------------------------------------------------------------------*
+ *  PortabilityTest.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__PORTABILITYTEST
+#define __UAPI__PORTABILITYTEST
+
+#ifdef _WIN32
+#  pragma warning (disable: 4290)
+#endif
+
+#ifndef SKIP_TEST1
+// Throw an exception with a declaration
+class ThrowIntWithDeclaration
+{
+  public:
+    ThrowIntWithDeclaration() throw(int);
+};
+#endif
+
+#ifndef SKIP_TEST2
+// Throw an exception without a declaration
+class ThrowIntWithoutDeclaration
+{
+  public:
+    ThrowIntWithoutDeclaration();
+};
+#endif
+
+#ifndef SKIP_TEST3
+// Covariant return types
+class CovariantParent
+{
+  public:
+    virtual CovariantParent& getInstance();
+    virtual ~CovariantParent() {};
+};
+
+class CovariantChild: public CovariantParent
+{
+  public:
+    virtual CovariantChild& getInstance();
+    virtual ~CovariantChild() {};
+};
+#endif
+
+#ifndef SKIP_TEST4
+// Namespaces
+namespace MyNamespace
+{
+  class NamespacedClass
+  {
+    public:
+      NamespacedClass();
+  };
+}
+#endif
+
+#ifndef SKIP_TEST5
+// Polymorphism
+class PolymorphismParent
+{
+  public:
+    virtual const char* getResult();
+    virtual ~PolymorphismParent() {};
+};
+
+class PolymorphismChild: public PolymorphismParent
+{
+  public:
+    virtual const char* getResult();
+    virtual ~PolymorphismChild() {};
+};
+#endif
+
+#ifndef SKIP_TEST6
+// Multiple inheritance of two pure-virtual classes
+class PureParent1
+{
+  public:
+    virtual ~PureParent1() {}
+    virtual void increment() = 0;
+};
+
+class PureParent2
+{
+  public:
+    virtual ~PureParent2() {}
+    virtual bool testPassed() = 0;
+};
+
+class PureChild: public PureParent1, public PureParent2
+{
+  public:
+    PureChild();
+    virtual ~PureChild(){}
+    virtual void increment();
+    virtual bool testPassed();
+  protected:
+    int value;
+};
+#endif
+
+#ifndef SKIP_TEST7
+// Multiple inheritance of concrete classes
+class ImpureParent1
+{
+  public:
+    virtual ~ImpureParent1(){}
+    ImpureParent1();
+    virtual void increment();
+  protected:
+    int value;
+};
+
+class ImpureParent2
+{
+  public:
+    virtual ~ImpureParent2(){}
+    virtual bool testPassed();
+};
+
+class ImpureChild: public ImpureParent1, public ImpureParent2
+{
+  public:
+    virtual ~ImpureChild(){}
+    virtual bool testPassed();
+};
+#endif
+
+#endif
diff --git a/uapi/cpp/test/source/Android.mk b/uapi/cpp/test/source/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/test/source/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/test/source/RecursiveMutexTest/Android.mk b/uapi/cpp/test/source/RecursiveMutexTest/Android.mk
new file mode 100644
index 0000000..0e0dc67
--- /dev/null
+++ b/uapi/cpp/test/source/RecursiveMutexTest/Android.mk
@@ -0,0 +1,32 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all ASR builds, exports some variables for sub-makes
+include $(ASR_MAKE_DIR)/Makefile.defs
+
+LOCAL_SRC_FILES:= \
+	RecursiveMutexTest.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../include \
+	$(LOCAL_PATH)/../../../api/include \
+	$(LOCAL_PATH)/../../../uapi/include \
+	$(LOCAL_PATH)/../../../utilities/include \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libUAPI_jni \
+
+LOCAL_MODULE:= RecursiveMutexTest
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_EXECUTABLE)
diff --git a/uapi/cpp/test/source/RecursiveMutexTest/RecursiveMutexTest.cpp b/uapi/cpp/test/source/RecursiveMutexTest/RecursiveMutexTest.cpp
new file mode 100644
index 0000000..29f208d
--- /dev/null
+++ b/uapi/cpp/test/source/RecursiveMutexTest/RecursiveMutexTest.cpp
@@ -0,0 +1,223 @@
+/*---------------------------------------------------------------------------*
+ *  RecursiveMutexTest.cpp                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <pthread.h>
+#include "Runnable.h"
+#include "ReturnCode.h"
+#include "Mutex.h"
+
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+int  Q_RecursiveMutexTest()
+{
+  pthread_mutex_t     my_mutex;
+  pthread_mutexattr_t my_mutex_attr;
+  int                 ret;
+  
+  printf("\n--------------- Q_RecursiveMutexTest Running ---------------\n\n");
+  
+  printf("Initializing mutex attribute to default value.\n");
+  ret = pthread_mutexattr_init(&my_mutex_attr);
+  if (ret)
+  {
+    fprintf(stderr, "ERROR: Failure in pthread_mutexattr_init(&my_mutex_attr), returns %d\n", ret);
+    return 1;
+  }
+  
+  printf("Setting mutex attribute to type PTHREAD_MUTEX_RECURSIVE.\n");
+  ret = pthread_mutexattr_settype(&my_mutex_attr, PTHREAD_MUTEX_RECURSIVE);
+  if (ret)
+  {
+    fprintf(stderr, "ERROR: Failure in pthread_mutexattr_settype(&my_mutex_attr, PTHREAD_MUTEX_RECURSIVE), returns %d\n", ret);
+    return 1;
+  }
+  
+  printf("Initializing mutex with the above attributes.\n");
+  ret = pthread_mutex_init(&my_mutex, &my_mutex_attr);
+  if (ret)
+  {
+    fprintf(stderr, "ERROR: Failure in pthread_mutex_init(&my_mutex, &my_mutex_attr), returns %d\n", ret);
+    return 1;
+  }
+  
+  printf("Locking mutex the first time from application thread\n");
+  ret = pthread_mutex_lock(&my_mutex);
+  if (ret)
+  {
+    fprintf(stderr, "ERROR: Failure in pthread_mutex_lock(&my_mutex), returns %d\n", ret);
+    return 1;
+  }
+  printf("\n***** MUTEX LOCKED *****\n\n");
+  
+  printf("Locking the already locked mutex from the same thread.\n");
+  printf("This should not block since the mutex is recursive.\n");
+  ret = pthread_mutex_lock(&my_mutex);
+  if (ret)
+  {
+    fprintf(stderr, "ERROR: Failure in pthread_mutex_lock(&my_mutex), returns %d\n", ret);
+    return 1;
+  }
+  
+  printf("\n***** Recursive mutex did not block (as expected) *****\n\n");
+  
+  printf("Unlocking mutex\n");
+  ret = pthread_mutex_unlock(&my_mutex);
+  if (ret)
+  {
+    fprintf(stderr, "ERROR: Failure in pthread_mutex_unlock(&my_mutex), returns %d\n", ret);
+    return 1;
+  }
+  printf("\n***** MUTEX UNLOCKED *****\n");
+  
+  printf("\n--------------- Q_RecursiveMutexTest Finished ---------------\n\n");
+  
+  return 0;
+  
+}
+
+#ifdef ENABLE_CUSTOM_MUTEX_TEST
+
+class MyThread : public Runnable
+{
+  public:
+    MyThread(Mutex* mutex) : _mutex(mutex), count(0) {}
+    
+    virtual ReturnCode::Type runThread()
+    {
+      ReturnCode::Type rc;
+      //lock twice
+      _mutex->lock(rc);
+      if (rc != ReturnCode::SUCCESS)
+        return ReturnCode::THREAD_ERROR;
+        
+      _mutex->lock(rc);
+      if (rc != ReturnCode::SUCCESS)
+        return ReturnCode::THREAD_ERROR;
+        
+      count = 1;
+      
+      Runnable::sleep(5000);
+      
+      count = 2;
+      
+      _mutex->unlock(rc);
+      if (rc != ReturnCode::SUCCESS)
+        return ReturnCode::THREAD_ERROR;
+        
+      _mutex->unlock(rc);
+      if (rc != ReturnCode::SUCCESS)
+        return ReturnCode::THREAD_ERROR;
+        
+        
+      return ReturnCode::SUCCESS;
+    }
+    
+    Mutex * _mutex;
+    int count;
+};
+
+int CustomMutexTest()
+{
+  printf("\n--------------- CustomMutexTest Running ---------------\n\n");
+  
+  ReturnCode::Type rc;
+  
+  Mutex * mutex = Mutex::create(rc);
+  if (rc != ReturnCode::SUCCESS)
+    return 1;
+    
+    
+  MyThread thread(mutex);
+  thread.start(rc);
+  if (rc != ReturnCode::SUCCESS)
+    return 1;
+    
+  //make sure thread starts
+  Runnable::sleep(2000);
+  
+  
+  //lock twice
+  mutex->lock(rc);
+  if (rc != ReturnCode::SUCCESS)
+    return 1;
+    
+  mutex->lock(rc);
+  if (rc != ReturnCode::SUCCESS)
+    return 1;
+    
+  if (thread.count != 2)
+  {
+    printf("Thread count is not ok\n");
+    return 1;
+  }
+  
+  
+  mutex->unlock(rc);
+  if (rc != ReturnCode::SUCCESS)
+    return 1;
+    
+  mutex->unlock(rc);
+  if (rc != ReturnCode::SUCCESS)
+    return 1;
+    
+  thread.join(rc);
+  if (rc != ReturnCode::SUCCESS)
+    return 1;
+    
+  delete mutex;
+  
+  printf("\n--------------- CustomMutexTest Finished ---------------\n\n");
+  return 0;
+}
+
+#endif /* ENABLE_CUSTOM_MUTEX_TEST */
+
+
+int main(int argc, char *argv[])
+{
+
+  /* disable stdout buffering to make sure printf() output always appear even on crash */
+  int ret = setvbuf(stdout, NULL, _IONBF, 0);
+  if (ret)
+  {
+    printf("Unable to disable buffering of stdout.\n");
+  }
+  
+  if (Q_RecursiveMutexTest() != 0)
+  {
+    printf("Q_RecursiveMutexTest failed\n");
+    return 1;
+  }
+  
+#ifdef ENABLE_CUSTOM_MUTEX_TEST
+  if (CustomMutexTest() != 0)
+  {
+    printf("Custom mutex failed\n");
+    return 1;
+  }
+#endif
+  
+  printf("SUCCESS\n");
+  return 0;
+}
diff --git a/uapi/cpp/test/source/portability_test/Android.mk b/uapi/cpp/test/source/portability_test/Android.mk
new file mode 100644
index 0000000..79ca199
--- /dev/null
+++ b/uapi/cpp/test/source/portability_test/Android.mk
@@ -0,0 +1,36 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	PortabilityTest.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../include \
+	$(LOCAL_PATH)/../../../api/include \
+	$(LOCAL_PATH)/../../../uapi/include \
+	$(LOCAL_PATH)/../../../utilities/include \
+
+LOCAL_CFLAGS := \
+	-DSKIP_TEST1 \
+	-DSKIP_TEST2 \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libUAPI_jni \
+
+LOCAL_MODULE:= UAPI_PortabilityTest
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_EXECUTABLE)
diff --git a/uapi/cpp/test/source/portability_test/PortabilityTest.cpp b/uapi/cpp/test/source/portability_test/PortabilityTest.cpp
new file mode 100644
index 0000000..cd996a2
--- /dev/null
+++ b/uapi/cpp/test/source/portability_test/PortabilityTest.cpp
@@ -0,0 +1,186 @@
+/*---------------------------------------------------------------------------*
+ *  PortabilityTest.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "PortabilityTest.h"
+#include <stdio.h>
+
+
+#ifndef SKIP_TEST1
+ThrowIntWithDeclaration::ThrowIntWithDeclaration() throw(int)
+{
+  throw 5;
+}
+#endif
+
+#ifndef SKIP_TEST2
+ThrowIntWithoutDeclaration::ThrowIntWithoutDeclaration()
+{
+  throw 5;
+}
+#endif
+
+#ifndef SKIP_TEST3
+CovariantParent& CovariantParent::getInstance()
+{
+  return *this;
+}
+
+CovariantChild& CovariantChild::getInstance()
+{
+  return *this;
+}
+#endif
+
+#ifndef SKIP_TEST4
+namespace MyNamespace
+{
+  NamespacedClass::NamespacedClass()
+  {}
+}
+#endif
+
+#ifndef SKIP_TEST5
+const char* PolymorphismParent::getResult()
+{
+  return "- Test5 failed";
+}
+
+const char* PolymorphismChild::getResult()
+{
+  return "+ Test5 passed";
+}
+#endif
+
+#ifndef SKIP_TEST6
+PureChild::PureChild():
+    value(0)
+{}
+
+void PureChild::increment()
+{
+  ++value;
+}
+
+bool PureChild::testPassed()
+{
+  return value == 1;
+}
+#endif
+
+#ifndef SKIP_TEST7
+ImpureParent1::ImpureParent1():
+    value(0)
+{}
+
+void ImpureParent1::increment()
+{
+  ++value;
+}
+
+bool ImpureParent2::testPassed()
+{
+  return false;
+}
+
+bool ImpureChild::testPassed()
+{
+  return value == 1;
+}
+#endif
+
+
+int main(int argc, char* argv[])
+{
+#ifndef SKIP_TEST1
+  try
+  {
+    ThrowIntWithDeclaration temp;
+    printf("- Test1 failed\n");
+  }
+  catch (int)
+  {
+    printf("+ Test1 passed\n");
+  }
+  catch (...)
+  {
+    printf("- Test1 failed\n");
+  }
+#endif
+  
+#ifndef SKIP_TEST2
+  try
+  {
+    ThrowIntWithoutDeclaration temp;
+    printf("- Test2 failed\n");
+  }
+  catch (int)
+  {
+    printf("+ Test2 passed\n");
+  }
+  catch (...)
+  {
+    printf("- Test2 failed\n");
+  }
+#endif
+  
+#ifndef SKIP_TEST3
+  {
+    CovariantChild child;
+    child = child.getInstance();
+    printf("+ Test3 passed\n");
+  }
+#endif
+  
+#ifndef SKIP_TEST4
+  {
+    MyNamespace::NamespacedClass temp;
+    printf("+ Test4 passed\n");
+  }
+#endif
+  
+#ifndef SKIP_TEST5
+  {
+    PolymorphismChild child;
+    PolymorphismParent* parent = &child;
+    printf("%s\n", parent->getResult());
+  }
+#endif
+  
+#ifndef SKIP_TEST6
+  {
+    PureChild pureChild;
+    pureChild.increment();
+    if (pureChild.testPassed())
+      printf("+ Test6 passed\n");
+    else
+      printf("- Test6 failed\n");
+  }
+#endif
+  
+#ifndef SKIP_TEST7
+  {
+    ImpureChild impureChild;
+    impureChild.increment();
+    if (impureChild.testPassed())
+      printf("+ Test7 passed\n");
+    else
+      printf("- Test7 failed\n");
+  }
+#endif
+}
diff --git a/uapi/cpp/test/source/srec_test/Android.mk b/uapi/cpp/test/source/srec_test/Android.mk
new file mode 100644
index 0000000..a735e82
--- /dev/null
+++ b/uapi/cpp/test/source/srec_test/Android.mk
@@ -0,0 +1,34 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	SrecTest.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../include \
+	$(LOCAL_PATH)/../../../api/include \
+	$(LOCAL_PATH)/../../../uapi/include \
+	$(LOCAL_PATH)/../../../utilities/include \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libUAPI_jni \
+
+LOCAL_MODULE:= UAPI_SrecTest
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+
+include $(BUILD_EXECUTABLE)
diff --git a/uapi/cpp/test/source/srec_test/SrecTest.cpp b/uapi/cpp/test/source/srec_test/SrecTest.cpp
new file mode 100644
index 0000000..ea35061
--- /dev/null
+++ b/uapi/cpp/test/source/srec_test/SrecTest.cpp
@@ -0,0 +1,391 @@
+/*---------------------------------------------------------------------------*
+ *  SrecTest.cpp                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _WIN32
+#include <conio.h>
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#endif
+
+#include "ReturnCode.h"
+#include "EmbeddedRecognizer.h"
+#include "Recognizer.h"
+#include "SrecGrammar.h"
+#include "RecognizerListener.h"
+#include "Recognizer.h"
+#include "WordItem.h"
+#include "AudioStream.h"
+#include "MediaFileReader.h"
+#include "MediaFileReaderListener.h"
+#include "Codec.h"
+#include "Runnable.h"
+#include "NBestRecognitionResult.h"
+#include "EmbeddedGrammarListener.h"
+#include "Logger.h"
+#include "System.h"
+
+#define CHKLOG(returnCode) \
+  if (returnCode != ReturnCode::SUCCESS) \
+  { \
+    printf("ERROR: %s in file %s on line %d. Press ENTER...\n", ReturnCode::toString(returnCode), \
+           __FILE__, __LINE__); \
+    fflush(NULL); \
+    getchar(); \
+    exit(-1); \
+  }
+
+using namespace android::speech::recognition;
+// TODO: we should not be exporting android::speech::recognition::utilities
+using namespace android::speech::recognition::utilities;
+
+
+// ---- GLOBAL STATE ----
+bool recognitionComplete;
+// ---- GLOBAL STATE ----
+
+
+class MyRecognizerListener: public RecognizerListener
+{
+  public:
+    MyRecognizerListener()
+    {}
+    virtual void onBeginningOfSpeech()
+    {
+      printf("beginning of speech\n");
+    }
+    
+    virtual void onEndOfSpeech()
+    {
+      printf("end of speech\n");
+    }
+    
+    virtual void onRecognitionSuccess(RecognitionResultProxy& result)
+    {
+      NBestRecognitionResultProxy& nbest = (NBestRecognitionResultProxy&) result;
+      ReturnCode::Type returnCode;
+      for (ARRAY_LIMIT nbestIndex = 0, size = nbest->getSize(); nbestIndex < size; ++nbestIndex)
+      {
+        printf("NBestList[%u] results:\n", nbestIndex);
+        NBestRecognitionResult::EntryProxy entry = nbest->getEntry(nbestIndex, returnCode);
+        
+        CHKLOG(returnCode);
+        printf("----------------------\n");
+
+        const char* semanticMeaning = entry->getSemanticMeaning(returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+          return;
+        printf("semanticMeaning = %s\n", semanticMeaning);
+        const char * const * keys = entry->getKeys();
+        for( ARRAY_LIMIT i = 0; i < entry->getKeyCount(); i++ )
+        {
+          printf("\t%s=%s\n", keys[i], entry->getValue(keys[i], returnCode));
+          CHKLOG(returnCode);
+        }
+        const char* literalMeaning = entry->getLiteralMeaning(returnCode);
+        CHKLOG(returnCode);
+        printf("literalMeaning = %s\n", literalMeaning);
+        printf("confidencScore = %d\n", entry->getConfidenceScore(returnCode));
+        CHKLOG(returnCode);
+
+
+        printf("----------------------\n\n");
+        CHKLOG(returnCode);
+
+      }
+      printf("recognition result\n");
+    }
+    
+    virtual void onStarted()
+    {
+      printf("recognizer started\n");
+    }
+    
+    virtual void onRecognitionFailure(RecognizerListener::FailureReason reason)
+    {
+      printf("Recognition failure: %s\n", toString(reason));
+    }
+    
+    virtual void onError(ReturnCode::Type returnCode)
+    {
+      printf("Recognizer error: %s\n", ReturnCode::toString(returnCode));
+    }
+    
+    virtual void onStopped()
+    {
+      printf("recognizer stopped\n");
+      recognitionComplete = true;
+    }
+    
+    virtual void onParametersGetError(const char** keys, android::speech::recognition::ARRAY_LIMIT count,
+                                      ReturnCode::Type)
+    {
+      printf("onParametersGetError:\n");
+      for (ARRAY_LIMIT i = 0; i < count; ++i)
+        printf("%s\n", keys[i]);
+    }
+    
+    virtual void onParametersSetError(const char** keys, const char** values,
+                                      ARRAY_LIMIT count,
+                                      ReturnCode::Type)
+    {
+      printf("onParametersSetError:\n");
+      for (ARRAY_LIMIT i = 0; i < count; ++i)
+        printf("%s=%s\n", keys[i], values[i]);
+    }
+    
+    virtual void onParametersSet(const char** keys, const char** values, ARRAY_LIMIT count)
+    {
+      printf("onParametersSet:\n");
+      for (ARRAY_LIMIT i = 0; i < count; ++i)
+        printf("%s=%s\n", keys[i], values[i]);
+    }
+    
+    virtual void onParametersGet(const char** keys, const char** values, ARRAY_LIMIT count)
+    {
+      printf("onParametersGet:\n");
+      for (ARRAY_LIMIT i = 0; i < count; ++i)
+        printf("%s=%s\n", keys[i], values[i]);
+    }
+    
+    virtual void onAcousticStateReset()
+    {
+      printf("onAcousticStateReset\n");
+    }
+};
+
+class MyGrammarListener: public EmbeddedGrammarListener
+{
+  public:
+    virtual void onError(ReturnCode::Type returnCode)
+    {
+      printf(">>>>> Grammar operation failed: %s\n", ReturnCode::toString(returnCode));
+    }
+    
+    virtual void onCompileAllSlots()
+    {
+      printf(">>>>> Grammar.compileAllSlots() complete\n");
+    }
+    
+    virtual void onResetAllSlots()
+    {
+      printf(">>>>> Grammar.resetAllSlots() complete\n");
+    }
+    
+    virtual void onLoaded()
+    {
+      printf(">>>>> Grammar loaded\n");
+    }
+    
+    virtual void onUnloaded()
+    {
+      printf(">>>>> Grammar unloaded\n");
+    }
+    
+    virtual void onSaved(const char* path)
+    {
+      printf(">>>>> Grammar saved to %s\n", path);
+    }
+    
+    virtual bool isEmbeddedGrammarListener()
+    {
+      return true;
+    }
+    virtual bool isSrecGrammarListener()
+    {
+      return false;
+    }
+};
+
+
+
+// -----------------------------------------------
+void embeddedTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("embeddedTest");
+#ifdef UAPI_LOGGING_ENABLED
+  LoggerProxy logger = Logger::getInstance(returnCode);
+  CHKLOG(returnCode);
+
+  logger->info("SrecTest.exe", "RUNNING TEST embeddedTest()\n");
+#endif
+
+  char path[256];
+  const char* ESRSDK = getenv("ESRSDK") ? getenv("ESRSDK") : "/system/usr/srec";
+  strcpy(path, ESRSDK);
+  strcat(path, "/config/en.us/baseline11k.par");
+  
+  EmbeddedRecognizerProxy recognizer = EmbeddedRecognizer::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  recognizer->configure(path, returnCode);
+  CHKLOG(returnCode);
+
+  //BUG 4544
+  //Call configure again just to make sure it will not crash.
+  recognizer->configure(path, returnCode);
+  CHKLOG(returnCode);
+  
+  RecognizerListenerProxy recognizerListener(new MyRecognizerListener());
+  recognizer->setListener(recognizerListener, returnCode);
+  CHKLOG(returnCode);
+  
+  const char* keys[] =
+  {
+    "SREC.Recognizer.utterance_timeout",
+    "CREC.Recognizer.terminal_timeout",
+    "CREC.Recognizer.optional_terminal_timeout",
+    "CREC.Recognizer.non_terminal_timeout",
+    "CREC.Recognizer.eou_threshold",
+    "InvalidParameter"
+  };
+  
+  const char* values[] =
+  {
+    "1000",
+    "1250",
+    "1500",
+    "1250",
+    "1000",
+    "50"
+  };
+  
+  recognizer->getParameters(keys, 6, returnCode);
+  CHKLOG(returnCode);
+  
+  recognizer->setParameters(keys, values, 6, returnCode);
+  CHKLOG(returnCode);
+  
+  strcpy(path, "file://");
+  strcat(path, ESRSDK);
+  strcat(path, "/config/en.us/grammars/bothtags5.g2g");
+  GrammarListenerProxy grammarListener(new MyGrammarListener());
+  SrecGrammarProxy grammar(recognizer->createGrammar(path, grammarListener, returnCode));
+  CHKLOG(returnCode);
+  grammar->load(returnCode);
+  CHKLOG(returnCode);
+  
+  const char* pronunciation = "jen&p)rkP";
+  WordItemProxy word = WordItem::create("Jen_Parker", pronunciation, returnCode);
+  int weight = 0;
+  grammar->addItem("@Names", word, weight, "V='Jen_Parker'", returnCode);
+  CHKLOG(returnCode);
+  grammar->compileAllSlots(returnCode);
+  CHKLOG(returnCode);
+  grammar->save("grammar.g2g", returnCode);
+  CHKLOG(returnCode);
+  
+  
+  strcpy(path, ESRSDK);
+  strcat(path, "/config/en.us/audio/v139/v139_113.nwv");
+  MediaFileReaderListenerProxy listener;
+  MediaFileReaderProxy mediaFileReader = MediaFileReader::create(path, listener, returnCode);
+  CHKLOG(returnCode);
+  AudioStreamProxy audio = mediaFileReader->createAudio(returnCode);
+  CHKLOG(returnCode);
+  mediaFileReader->start(returnCode);
+  CHKLOG(returnCode);
+  
+  recognitionComplete = false;
+
+  recognizer->recognize(audio, grammar, returnCode);
+  CHKLOG(returnCode);
+  
+  
+  // Wait for recognition to finish
+  while (!recognitionComplete)
+    Runnable::sleep(100);
+  recognitionComplete = false;
+
+  
+  grammar->unload(returnCode);
+  CHKLOG(returnCode);
+  
+
+
+#ifdef UAPI_LOGGING_ENABLED
+  logger->info("SrecTest.exe", "RUNNING TEST embeddedTest() DONE\n");
+#endif
+}
+
+// -----------------------------------------------
+int main(int, char*[])
+{
+#if defined(_DEBUG) && defined(_WIN32)
+  _CrtMemState start_state;
+  _CrtMemCheckpoint(&start_state);
+  
+  //_CrtSetBreakAlloc(188);
+#endif
+  {
+    ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+    
+    UAPI_FN_SCOPE("main");
+#ifdef UAPI_LOGGING_ENABLED
+    LoggerProxy logger = Logger::getInstance(returnCode);
+    CHKLOG(returnCode);
+
+    logger->setLoggingLevel(Logger::LEVEL_WARN, returnCode);
+    CHKLOG(returnCode);
+#endif
+
+    //delete the singleton(s), optional step
+    System* system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    embeddedTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    embeddedTest();
+    
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    embeddedTest();
+    
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+  }
+#if defined(_DEBUG) && defined(_WIN32)
+  _CrtMemDumpAllObjectsSince(&start_state);
+  
+  //_CrtDumpMemoryLeaks();
+#endif
+  return 0;
+}
diff --git a/uapi/cpp/test/source/uapi_test/Android.mk b/uapi/cpp/test/source/uapi_test/Android.mk
new file mode 100644
index 0000000..852004b
--- /dev/null
+++ b/uapi/cpp/test/source/uapi_test/Android.mk
@@ -0,0 +1,32 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	main.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../include \
+	$(LOCAL_PATH)/../../../api/include \
+	$(LOCAL_PATH)/../../../uapi/include \
+	$(LOCAL_PATH)/../../../utilities/include \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libUAPI_jni \
+
+LOCAL_MODULE:= UAPI_test
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_EXECUTABLE)
diff --git a/uapi/cpp/test/source/uapi_test/main.cpp b/uapi/cpp/test/source/uapi_test/main.cpp
new file mode 100644
index 0000000..a6a16bd
--- /dev/null
+++ b/uapi/cpp/test/source/uapi_test/main.cpp
@@ -0,0 +1,1092 @@
+/*---------------------------------------------------------------------------*
+ *  main.cpp                                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _WIN32
+#include <conio.h>
+#ifdef _DEBUG
+#define _CRTDBG_MAP_ALLOC
+#include "crtdbg.h"
+#endif
+#endif
+
+#include "ReturnCode.h"
+#include "AudioStream.h"
+#include "MediaFileReader.h"
+#include "MediaFileReaderListener.h"
+#include "MediaFileWriter.h"
+#include "MediaFileWriterListener.h"
+#include "DeviceSpeaker.h"
+#include "DeviceSpeakerListener.h"
+#include "Microphone.h"
+#include "MicrophoneListener.h"
+#include "Codec.h"
+#include "Runnable.h"
+#include "WorkerQueue.h"
+#include "WorkerQueueFactory.h"
+#include "Task.h"
+#include "Logger.h"
+#include "System.h"
+
+using namespace android::speech::recognition;
+// TODO: remove dependency on android::speech::recognition::utilities
+using namespace android::speech::recognition::utilities;
+
+/*
+const char*       FILENAME_SOURCE = "pcm/yes_08k.pcm";
+const char*       FILENAME_SAVED  = "saved_08k.pcm";
+const char*       FILENAME_RECORD = "record_08k.pcm";
+const Codec::Type CODEC_FREQ      = Codec::PCM_16BIT_8K;
+*/
+const char*       FILENAME_SOURCE = "pcm/yes_11k.pcm";
+const char*       FILENAME_SAVED  = "saved_11k.pcm";
+const char*       FILENAME_RECORD = "record_11k.pcm";
+const Codec::Type CODEC_FREQ      = Codec::PCM_16BIT_11K;
+/*
+const char*       FILENAME_SOURCE = "pcm/yes_22k.pcm";
+const char*       FILENAME_SAVED  = "saved_22k.pcm";
+const char*       FILENAME_RECORD = "record_22k.pcm";
+const Codec::Type CODEC_FREQ      = Codec::PCM_16BIT_22K;
+*/
+
+#define CHKLOG(rc) \
+  if (rc != ReturnCode::SUCCESS) \
+  { \
+    printf("ERROR: %s in file %s on line %d. Press ENTER...\n", ReturnCode::toString(rc), __FILE__, __LINE__); \
+    fflush(NULL); \
+    getchar(); \
+    exit(-1); \
+  }
+
+void printBanner(const char* pMessage)
+{
+  printf("----------------------------------------------------------------------\n");
+  printf(pMessage);
+  printf("----------------------------------------------------------------------\n\n");
+  fflush(stdout);
+}
+
+class Listener
+{
+  public:
+    Listener() : m_bIsDone(false)
+    {}
+    
+    void waitUntilDone()
+    {
+      while (!m_bIsDone)
+        Runnable::sleep(20);
+        
+      m_bIsDone = false; //prepare for next wait.
+    }
+    
+  protected:
+    bool m_bIsDone;
+    
+};
+
+class MyMediaFileReaderListener : public MediaFileReaderListener, public Listener
+{
+  public:
+    virtual void onStarted()
+    {
+      fprintf(stderr, "MyMediaFileReaderListener::onStarted\n");
+    }
+    virtual void onStopped()
+    {
+      fprintf(stderr, "MyMediaFileReaderListener::onStopped\n");
+      m_bIsDone = true;
+    }
+    virtual void onError(ReturnCode::Type returnCode)
+    {
+      fprintf(stderr, "MyMediaFileReaderListener::onError -> %s\n", ReturnCode::toString(returnCode));
+    }
+};
+DECLARE_SMARTPROXY(, MyMediaFileReaderListenerProxy, MediaFileReaderListenerProxy, MyMediaFileReaderListener)
+DEFINE_SMARTPROXY(, MyMediaFileReaderListenerProxy, MediaFileReaderListenerProxy, MyMediaFileReaderListener)
+
+
+class MyDeviceSpeakerListener : public DeviceSpeakerListener, public Listener
+{
+  public:
+    MyDeviceSpeakerListener() : m_bGotError(false){}
+    virtual void onStarted()
+    {
+      fprintf(stderr, "MyDeviceSpeakerListener::onStarted\n");
+    }
+    
+    virtual void onStopped()
+    {
+      fprintf(stderr, "MyDeviceSpeakerListener::onStopped\n");
+      m_bIsDone = true;
+    }
+    
+    virtual void onError(ReturnCode::Type returnCode)
+    {
+      fprintf(stderr, "MyDeviceSpeakerListener::onError -> %s\n", ReturnCode::toString(returnCode));
+      m_bGotError = true;
+    }
+    bool m_bGotError;
+};
+DECLARE_SMARTPROXY(, MyDeviceSpeakerListenerProxy, DeviceSpeakerListenerProxy, MyDeviceSpeakerListener)
+DEFINE_SMARTPROXY(, MyDeviceSpeakerListenerProxy, DeviceSpeakerListenerProxy, MyDeviceSpeakerListener)
+
+
+class MyMediaFileWriterListener : public MediaFileWriterListener, public Listener
+{
+  public:
+    virtual void onStopped()
+    {
+      fprintf(stderr, "MyMediaFileWriterListener::onStopped\n");
+      m_bIsDone = true;
+    }
+    virtual void onError(ReturnCode::Type returnCode)
+    {
+      fprintf(stderr, "MyMediaFileWriterListener::onError -> %s\n", ReturnCode::toString(returnCode));
+    }
+};
+DECLARE_SMARTPROXY(, MyMediaFileWriterListenerProxy, MediaFileWriterListenerProxy, MyMediaFileWriterListener)
+DEFINE_SMARTPROXY(, MyMediaFileWriterListenerProxy, MediaFileWriterListenerProxy, MyMediaFileWriterListener)
+
+
+void simpleMediaTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("simpleMediaTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST simpleMediaTest()\n");
+  printBanner("RUNNING TEST simpleMediaTest()\n");
+  
+  char filename[256];
+  const char* QSDK = getenv("QSDK") ? getenv("QSDK") : "/system/usr/srec";
+  strcpy(filename, QSDK);
+  strcat(filename, "/");
+  strcat(filename, FILENAME_SOURCE);
+  
+  
+  MediaFileReaderListenerProxy listener(new MyMediaFileReaderListener());
+  MediaFileReaderProxy mediaFileReader = MediaFileReader::create(filename, listener, returnCode);
+  CHKLOG(returnCode);
+  
+  AudioStreamProxy audio1 = mediaFileReader->createAudio(returnCode);
+  CHKLOG(returnCode);
+  AudioStreamProxy audio2 = mediaFileReader->createAudio(returnCode);
+  CHKLOG(returnCode);
+  
+  //  AudioStream* audioToSave = mediaFileReader->createAudio();
+  
+  //set properties
+  mediaFileReader->setReadingMode(MediaFileReader::REAL_TIME, returnCode);
+  //mediaFileReader->SetReadingMode(MediaFileReader::ALL_AT_ONCE, returnCode);
+  CHKLOG(returnCode);
+  mediaFileReader->start(returnCode);
+  CHKLOG(returnCode);
+  
+  DeviceSpeakerProxy pDevSpeaker = DeviceSpeaker::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  pDevSpeaker->setCodec(CODEC_FREQ, returnCode);
+  CHKLOG(returnCode);
+  
+  MyDeviceSpeakerListenerProxy deviceListener(new MyDeviceSpeakerListener());
+  if (!deviceListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  pDevSpeaker->setListener(deviceListener, returnCode);
+  CHKLOG(returnCode);
+  
+  
+  pDevSpeaker->start(audio1, returnCode);
+  CHKLOG(returnCode);
+  
+//abort it in the middle
+  Runnable::sleep(1250);
+  pDevSpeaker->stop(returnCode);
+  CHKLOG(returnCode);
+  
+  //wait for the stop to complete.
+  deviceListener->waitUntilDone();
+  
+  //pDevSpeaker->Start(audio2, returnCode);
+  //CHKLOG(returnCode);
+  
+  //wait for the play to complete
+  //devListener.WaitUntilDone();
+  
+  
+  //MyMediaFileWriterListener writerListener;
+  //MediaFileWriter* mediaFileWriter = uapi.createMediaFileWriter(&writerListener, returnCode);
+  //CHKLOG(returnCode);
+  
+  //mediaFileWriter->Save(audioToSave, FILENAME_SAVED, returnCode);
+  //CHKLOG(returnCode);
+  
+  //wait for the save to be done.
+  //writerListener.WaitUntilDone();
+  
+  
+  //delete audioToSave;
+  //delete mediaFileWriter;
+  
+  UAPI_INFO(fn,"test.exe : RUNNING TEST simpleMediaTest() DONE\n");
+  printBanner("RUNNING TEST simpleMediaTest() DONE\n");
+}
+
+class MyMediaFileReaderListener2 : public MediaFileReaderListener, public Listener
+{
+  public:
+    virtual void onStarted()
+    {
+      fprintf(stderr, "MyMediaFileReaderListener2::onStarted\n");
+    }
+    
+    virtual void onStopped()
+    {
+      fprintf(stderr, "MyMediaFileReaderListener2::onStopped\n");
+      m_bIsDone = true;
+      
+    }
+    virtual void onError(ReturnCode::Type returnCode)
+    {
+      fprintf(stderr, "MyMediaFileReaderListener2::onError -> %s\n", ReturnCode::toString(returnCode));
+    }
+};
+DECLARE_SMARTPROXY(, MyMediaFileReaderListener2Proxy, MediaFileReaderListenerProxy, MyMediaFileReaderListener2)
+DEFINE_SMARTPROXY(, MyMediaFileReaderListener2Proxy, MediaFileReaderListenerProxy, MyMediaFileReaderListener2)
+
+
+void deleteFromCallbackTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("deleteFromCallbackTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST deleteFromCallbackTest()\n");
+  printBanner("RUNNING TEST deleteFromCallbackTest()\n");
+  
+  char filename[256];
+  const char* QSDK = getenv("QSDK") ? getenv("QSDK") : "/system/usr/srec";
+  strcpy(filename, QSDK);
+  strcat(filename, "/");
+  strcat(filename, FILENAME_SOURCE);
+  
+  
+  MyMediaFileReaderListener2Proxy listener(new MyMediaFileReaderListener2());
+  if (!listener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  MediaFileReaderProxy mfr = MediaFileReader::create(filename, listener, returnCode);
+  CHKLOG(returnCode);
+  
+  AudioStreamProxy audio1 = mfr->createAudio(returnCode);
+  
+  //set properties
+  mfr->setReadingMode(MediaFileReader::REAL_TIME, returnCode);
+  //mediaFileReader->setReadingMode(MediaFileReader::ALL_AT_ONCE, returnCode);
+  CHKLOG(returnCode);
+  mfr->start(returnCode);
+  CHKLOG(returnCode);
+  
+  listener->waitUntilDone();
+  
+  UAPI_INFO(fn,"test.exe : RUNNING TEST deleteFromCallbackTest() DONE\n");
+  printBanner("RUNNING TEST deleteFromCallbackTest() DONE\n");
+}
+
+void mediaTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("mediaTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST mediaTest()\n");
+  printBanner("RUNNING TEST mediaTest()\n");
+  
+  char filename[256];
+  const char* QSDK = getenv("QSDK") ? getenv("QSDK") : "/system/usr/srec";
+  strcpy(filename, QSDK);
+  strcat(filename, "/");
+  strcat(filename, FILENAME_SOURCE);
+  
+  
+  MediaFileReaderListenerProxy listener(new MyMediaFileReaderListener());
+  MediaFileReaderProxy mediaFileReader = MediaFileReader::create(filename, listener, returnCode);
+  CHKLOG(returnCode);
+  
+  AudioStreamProxy audio1 = mediaFileReader->createAudio(returnCode);
+  CHKLOG(returnCode);
+  AudioStreamProxy audio2 = mediaFileReader->createAudio(returnCode);
+  CHKLOG(returnCode);
+  AudioStreamProxy audio3 = mediaFileReader->createAudio(returnCode);
+  CHKLOG(returnCode);
+  AudioStreamProxy audioToSave = mediaFileReader->createAudio(returnCode);
+  CHKLOG(returnCode);
+  
+  //set properties
+  mediaFileReader->setReadingMode(MediaFileReader::REAL_TIME, returnCode);
+  //mediaFileReader->setReadingMode(MediaFileReader::ALL_AT_ONCE, returnCode);
+  CHKLOG(returnCode);
+  mediaFileReader->start(returnCode);
+  CHKLOG(returnCode);
+  
+  DeviceSpeakerProxy pDevSpeaker = DeviceSpeaker::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  pDevSpeaker->setCodec(CODEC_FREQ, returnCode);
+  CHKLOG(returnCode);
+  
+  MyDeviceSpeakerListenerProxy deviceListener(new MyDeviceSpeakerListener());
+  if (!deviceListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  pDevSpeaker->setListener(deviceListener, returnCode);
+  CHKLOG(returnCode);
+  
+  pDevSpeaker->start(audio1, returnCode);
+  CHKLOG(returnCode);
+  
+  //wait for the play to complete
+  deviceListener->waitUntilDone();
+  
+  //play again, this time it should fail because that audio object was already
+  //used.
+  pDevSpeaker->start(audio1, returnCode);
+  if (returnCode != ReturnCode::END_OF_STREAM)
+    exit(-1);
+    
+    
+  //play again, this time do it on a second audio stream.
+  pDevSpeaker->start(audio2, returnCode);
+  CHKLOG(returnCode);
+  
+  //wait for the play to complete
+  deviceListener->waitUntilDone();
+  
+  
+  //play again, this time do it on a 3rd audio stream.
+  pDevSpeaker->start(audio3, returnCode);
+  CHKLOG(returnCode);
+  
+  //abort it in the middle
+  Runnable::sleep(1250);
+  pDevSpeaker->stop(returnCode);
+  CHKLOG(returnCode);
+  
+  //wait for the stop to complete.
+  deviceListener->waitUntilDone();
+  
+  
+  MyMediaFileWriterListenerProxy writerListener(new MyMediaFileWriterListener());
+  if (!writerListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  MediaFileWriterProxy mediaFileWriter = MediaFileWriter::create(writerListener, returnCode);
+  CHKLOG(returnCode);
+  
+  mediaFileWriter->save(audioToSave, FILENAME_SAVED, returnCode);
+  CHKLOG(returnCode);
+  
+  //wait for the save to be done.
+  writerListener->waitUntilDone();
+  
+  UAPI_INFO(fn,"test.exe : RUNNING TEST mediaTest() DONE\n");
+  printBanner("RUNNING TEST mediaTest() DONE\n");
+}
+
+class MyMicrophoneListener : public MicrophoneListener, public Listener
+{
+  public:
+	 MyMicrophoneListener() : started(false){}
+    virtual void onStarted()
+    {
+      fprintf(stderr, "MyMicrophoneListener::onStarted\n");
+      fprintf(stderr, "\n\n\tSPEAK NOW\n\n");
+      started = true;
+    }
+    
+    virtual void onStopped()
+    {
+      fprintf(stderr, "\n\n\tSTOP SPEAKING NOW\n\n");
+      fprintf(stderr, "MyMicrophoneListener::onStopped\n");
+      m_bIsDone = true;
+    }
+    
+    virtual void onError(ReturnCode::Type returnCode)
+    {
+      fprintf(stderr, "MyMicrophoneListener::onError -> %s\n", ReturnCode::toString(returnCode));
+    }
+
+    void waitUntilStarted()
+    {
+      while (!started)
+        Runnable::sleep(5);
+        
+      started = false;
+    }
+
+    bool started;
+};
+DECLARE_SMARTPROXY(, MyMicrophoneListenerProxy, MicrophoneListenerProxy, MyMicrophoneListener)
+DEFINE_SMARTPROXY(, MyMicrophoneListenerProxy, MicrophoneListenerProxy, MyMicrophoneListener)
+
+
+void recorderTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("recorderTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST recorderTest()\n");
+  printBanner("RUNNING TEST recorderTest()\n");
+  
+  
+  //create a microphone
+  MicrophoneProxy pMicrophone = Microphone::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  MyMicrophoneListenerProxy micListener(new MyMicrophoneListener());
+  if (!micListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  pMicrophone->setListener(micListener, returnCode);
+  CHKLOG(returnCode);
+  pMicrophone->setCodec(CODEC_FREQ, returnCode);
+  CHKLOG(returnCode);
+  
+  AudioStreamProxy audioToPlay = pMicrophone->createAudio(returnCode);
+  CHKLOG(returnCode);
+  AudioStreamProxy audioToSave = pMicrophone->createAudio(returnCode);
+  CHKLOG(returnCode);
+  
+  //create a device speaker
+  DeviceSpeakerProxy pDevSpeaker = DeviceSpeaker::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  pDevSpeaker->setCodec(CODEC_FREQ, returnCode);
+  CHKLOG(returnCode);
+  
+  MyDeviceSpeakerListenerProxy deviceListener(new MyDeviceSpeakerListener());
+  if (!deviceListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  pDevSpeaker->setListener(deviceListener, returnCode);
+  CHKLOG(returnCode);
+  
+  //create a file writer
+  MyMediaFileWriterListenerProxy writerListener(new MyMediaFileWriterListener());
+  if (!writerListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  MediaFileWriterProxy mediaFileWriter = MediaFileWriter::create(writerListener, returnCode);
+  CHKLOG(returnCode);
+  
+  
+  //START RECORDING
+  pMicrophone->start(returnCode);
+  CHKLOG(returnCode);
+  
+  //save the recording into a file
+  mediaFileWriter->save(audioToSave, FILENAME_RECORD, returnCode);
+  CHKLOG(returnCode);
+
+  // wait until started
+  micListener->waitUntilStarted();
+  
+  // record for 4 seconds
+  Runnable::sleep(4000);
+  
+  // STOP RECORDING
+  pMicrophone->stop(returnCode);
+  CHKLOG(returnCode);
+  
+  // wait for the stop to be completed
+  micListener->waitUntilDone();
+  
+  // play it back
+  pDevSpeaker->start(audioToPlay, returnCode);
+  CHKLOG(returnCode);
+  
+  // wait for the play to complete
+  deviceListener->waitUntilDone();
+  
+  // make sure the save is done
+  writerListener->waitUntilDone();
+  
+//make sure the file contains all the samples.
+  FILE * fp = fopen(FILENAME_RECORD, "rb");
+  fseek(fp, 0, SEEK_END);
+  int size = ftell(fp);
+  fclose(fp);
+  
+  if (size < 80000)
+  {
+    fprintf(stderr, "We did not record enough data - size %d!!!\n", size);
+    UAPI_ERROR(fn,"test.exe : recorderTest() -- we did not record enough data, size of file %d\n", size);
+  }
+  
+  UAPI_INFO(fn,"test.exe : RUNNING TEST recorderTest() DONE\n");
+  printBanner("RUNNING TEST recorderTest() DONE\n");
+}
+
+void deviceSpeakerDeleteTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("deviceSpeakerDeleteTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST deviceSpeakerDeleteTest()\n");
+  printBanner("RUNNING TEST deviceSpeakerDeleteTest()\n");
+  
+  char filename[256];
+  const char* QSDK = getenv("QSDK") ? getenv("QSDK") : "/system/usr/srec";
+  strcpy(filename, QSDK);
+  strcat(filename, "/");
+  strcat(filename, FILENAME_SOURCE);
+  
+  
+  MediaFileReaderListenerProxy listener(new MyMediaFileReaderListener());
+  MediaFileReaderProxy mediaFileReader = MediaFileReader::create(filename, listener, returnCode);
+  CHKLOG(returnCode);
+  
+  AudioStreamProxy audio1 = mediaFileReader->createAudio(returnCode);
+  
+  //set properties
+  mediaFileReader->setReadingMode(MediaFileReader::REAL_TIME, returnCode);
+  CHKLOG(returnCode);
+  mediaFileReader->start(returnCode);
+  CHKLOG(returnCode);
+  
+  DeviceSpeakerProxy pDevSpeaker = DeviceSpeaker::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  pDevSpeaker->setCodec(CODEC_FREQ, returnCode);
+  CHKLOG(returnCode);
+  
+  MyDeviceSpeakerListenerProxy deviceListener(new MyDeviceSpeakerListener());
+  if (!deviceListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  pDevSpeaker->setListener(deviceListener, returnCode);
+  CHKLOG(returnCode);
+  
+  
+  pDevSpeaker->start(audio1, returnCode);
+  CHKLOG(returnCode);
+  
+  Runnable::sleep(200);
+  
+  UAPI_INFO(fn,"test.exe : RUNNING TEST deviceSpeakerDeleteTest() DONE\n");
+  printBanner("RUNNING TEST deviceSpeakerDeleteTest() DONE\n");
+}
+
+void microphoneDeleteTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("microphoneDeleteTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST microphoneDeleteTest()\n");
+  printBanner("RUNNING TEST microphoneDeleteTest()\n");
+  
+  
+  //create a microphone
+  MicrophoneProxy pMicrophone = Microphone::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  MyMicrophoneListenerProxy micListener(new MyMicrophoneListener());
+  if (!micListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  pMicrophone->setListener(micListener, returnCode);
+  CHKLOG(returnCode);
+  pMicrophone->setCodec(CODEC_FREQ, returnCode);
+  CHKLOG(returnCode);
+  
+  AudioStreamProxy audioToPlay = pMicrophone->createAudio(returnCode);
+  CHKLOG(returnCode);
+  AudioStreamProxy audioToSave = pMicrophone->createAudio(returnCode);
+  CHKLOG(returnCode);
+  
+  //START RECORDING
+  pMicrophone->start(returnCode);
+  CHKLOG(returnCode);
+  
+  // record for 1 seconds
+  Runnable::sleep(1000);
+  
+  // STOP RECORDING
+  pMicrophone->stop(returnCode);
+  CHKLOG(returnCode);
+  
+  // wait for the stop to be completed
+  micListener->waitUntilDone();
+  UAPI_INFO(fn,"test.exe : RUNNING TEST microphoneDeleteTest() DONE\n");
+  printBanner("RUNNING TEST microphoneDeleteTest() DONE\n");
+}
+
+void microphoneAudioDeleteTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("microphoneAudioDeleteTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST microphoneAudioDeleteTest()\n");
+  
+  //create a microphone
+  MicrophoneProxy pMicrophone = Microphone::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  MyMicrophoneListenerProxy micListener(new MyMicrophoneListener());
+  if (!micListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  pMicrophone->setListener(micListener, returnCode);
+  CHKLOG(returnCode);
+  pMicrophone->setCodec(CODEC_FREQ, returnCode);
+  CHKLOG(returnCode);
+  
+  AudioStreamProxy audioToPlay = pMicrophone->createAudio(returnCode);
+  CHKLOG(returnCode);
+  AudioStreamProxy audioToSave = pMicrophone->createAudio(returnCode);
+  CHKLOG(returnCode);
+  
+  
+  //START RECORDING
+  pMicrophone->start(returnCode);
+  CHKLOG(returnCode);
+  
+  // record for 3 seconds
+  Runnable::sleep(3000);
+  
+  //de-reference the audio
+  audioToPlay = AudioStreamProxy();
+  audioToSave = AudioStreamProxy();
+  
+  
+  //should not change anything. it should keep recording.
+  
+  UAPI_INFO(fn,"test.exe : RUNNING TEST microphoneAudioDeleteTest() DONE\n");
+  printBanner("RUNNING TEST microphoneAudioDeleteTest() DONE\n");
+}
+
+void deviceSpeakerAudioDeleteTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("deviceSpeakerAudioDeleteTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST deviceSpeakerAudioDeleteTest()\n");
+  printBanner("RUNNING TEST deviceSpeakerAudioDeleteTest()\n");
+  
+  char filename[256];
+  const char* QSDK = getenv("QSDK") ? getenv("QSDK") : "/system/usr/srec";
+  strcpy(filename, QSDK);
+  strcat(filename, "/");
+  strcat(filename, FILENAME_SOURCE);
+  
+  
+  MediaFileReaderListenerProxy listener(new MyMediaFileReaderListener());
+  MediaFileReaderProxy mediaFileReader = MediaFileReader::create(filename, listener, returnCode);
+  CHKLOG(returnCode);
+  
+  AudioStreamProxy audio1 = mediaFileReader->createAudio(returnCode);
+  
+  //set properties
+  mediaFileReader->setReadingMode(MediaFileReader::REAL_TIME, returnCode);
+  CHKLOG(returnCode);
+  mediaFileReader->start(returnCode);
+  CHKLOG(returnCode);
+  
+  DeviceSpeakerProxy pDevSpeaker = DeviceSpeaker::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  pDevSpeaker->setCodec(CODEC_FREQ, returnCode);
+  CHKLOG(returnCode);
+  
+  MyDeviceSpeakerListenerProxy deviceListener(new MyDeviceSpeakerListener());
+  if (!deviceListener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    CHKLOG(returnCode);
+  }
+  pDevSpeaker->setListener(deviceListener, returnCode);
+  CHKLOG(returnCode);
+  
+  
+  pDevSpeaker->start(audio1, returnCode);
+  CHKLOG(returnCode);
+  
+  //invalidate audio1
+  audio1 = AudioStreamProxy();
+  
+  // invoke System.dispose() without waiting for the device-speaker to shut down
+  
+  UAPI_INFO(fn,"test.exe : RUNNING TEST deviceSpeakerAudioDeleteTest() DONE\n");
+  printBanner("RUNNING TEST deviceSpeakerAudioDeleteTest() DONE\n");
+}
+
+#if 0
+void selectablePipeTest()
+{
+  ReturnCode::Type returnCode;
+  SelectablePipe* pPipe = SelectablePipe::create(returnCode);
+  CHKLOG(returnCode);
+  
+  
+  
+  fd_set fds[3];
+  FD_ZERO(&fds[0]);
+  FD_ZERO(&fds[1]);
+  FD_ZERO(&fds[2]);
+  
+  FD_SET(pPipe->GetReadFD(), &fds[0]);
+  
+  int time_ms = 2000;
+  
+  struct timeval timeout;
+  timeout.tv_sec = time_ms / 1000;
+  timeout.tv_usec = (time_ms - timeout.tv_sec * 1000) * 1000;
+  
+  int num_fd = 1;
+  int retval = select(num_fd, &fds[0], &fds[1], &fds[2], &timeout);
+  if (retval != 0)
+  {
+    fprintf(stderr, "select did not timeout\n");
+    exit(-1);
+  }
+  
+  // write something on the pipe.
+  char message = 'S';
+  pPipe->WriteTo(&message, sizeof(message));
+  
+  retval = select(num_fd, &fds[0], &fds[1], &fds[2], &timeout);
+  if (retval == 0)
+  {
+    fprintf(stderr, "select should not timeout\n");
+    exit(-1);
+  }
+  
+  char toRead;
+  pPipe->ReadFrom(&toRead, sizeof(toRead));
+  
+  if (toRead != 'S')
+  {
+    fprintf(stderr, "could not read \'S\' on the pipe\n");
+    exit(-1);
+  }
+  
+  delete pPipe;
+}
+#endif
+
+class TaskOne : public Task
+{
+  public:
+    TaskOne(): Task("TaskOne")
+    {}
+    virtual void run()
+    {
+      printf("TaskOne\n");
+    };
+};
+
+class TaskTwo : public Task
+{
+  public:
+    TaskTwo(): Task("TaskTwo")
+    {}
+    virtual void run()
+    {
+      printf("TaskTwo\n");
+    };
+};
+
+class TaskThree : public Task
+{
+  public:
+    TaskThree(): Task("TaskThree")
+    {}
+    virtual void run()
+    {
+      printf("TaskThree\n");
+    };
+};
+
+class TaskFour : public Task
+{
+  public:
+    TaskFour(): Task("TaskFour")
+    {}
+    virtual void run()
+    {
+      printf("TaskFour\n");
+    };
+};
+
+class ST30Ms_A : public ScheduledTask
+{
+  public:
+    ST30Ms_A(): ScheduledTask(30, "ST30Ms_A")
+    {}
+    virtual void run()
+    {
+      printf("ST30Ms_A\n");
+    };
+};
+
+class ST30Ms_B : public ScheduledTask
+{
+  public:
+    ST30Ms_B(): ScheduledTask(30, "ST30Ms_B")
+    {}
+    virtual void run()
+    {
+      printf("ST30Ms_B\n");
+    };
+};
+
+class ST10Ms_A : public ScheduledTask
+{
+  public:
+    ST10Ms_A(): ScheduledTask(10, "ST10Ms_A")
+    {}
+    virtual void run()
+    {
+      printf("ST10Ms_A\n");
+    };
+};
+
+class ST10Ms_B : public ScheduledTask
+{
+  public:
+    ST10Ms_B(): ScheduledTask(10, "ST10Ms_B")
+    {}
+    virtual void run()
+    {
+      printf("ST10Ms_B\n");
+    };
+};
+
+class ST1000Ms : public ScheduledTask
+{
+  public:
+    ST1000Ms(): ScheduledTask(1000, "ST1000Ms")
+    {}
+    virtual void run()
+    {
+      printf("ST1000Ms\n");
+    };
+};
+
+
+
+void WorkerQueueTest()
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_FN_SCOPE("WorkerQueueTest");
+  UAPI_INFO(fn,"test.exe : RUNNING TEST WorkerQueueTest()\n");
+  printBanner("RUNNING TEST WorkerQueueTest()\n");
+  
+  WorkerQueueFactory* factory = WorkerQueueFactory::getInstance(returnCode);
+  CHKLOG(returnCode);
+  
+  WorkerQueue* workerQueue = factory->getWorkerQueue(returnCode);
+  CHKLOG(returnCode);
+  
+  
+  if (!workerQueue)
+  {
+    printf("could not create worker queue\n");
+    exit(-1);
+  }
+  
+  workerQueue->enqueue(new TaskOne(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new TaskOne(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new ST1000Ms(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new TaskTwo(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new ST30Ms_A(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new TaskThree(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new ST10Ms_A(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new ST30Ms_B(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new ST10Ms_B(), returnCode);
+  CHKLOG(returnCode);
+  
+  workerQueue->enqueue(new TaskFour(), returnCode);
+  CHKLOG(returnCode);
+  
+  Runnable::sleep(3000);
+  UAPI_INFO(fn,"test.exe : RUNNING TEST WorkerQueueTest() DONE\n");
+  printBanner("RUNNING TEST WorkerQueueTest() DONE\n");
+}
+
+/****************************************/
+int main(int, char*[])
+{
+#if defined(_WIN32) && defined(_DEBUG)
+  _CrtMemState start_state;
+  _CrtMemCheckpoint(&start_state);
+  
+  //_CrtSetBreakAlloc(102);
+#endif
+
+  {
+    ReturnCode::Type returnCode;
+    System* system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+  
+
+    UAPI_FN_SCOPE("main");
+#ifdef UAPI_LOGGING_ENABLED
+    LoggerProxy log = Logger::getInstance(returnCode);
+    CHKLOG(returnCode);
+    log->setLoggingLevel(Logger::LEVEL_WARN, returnCode);
+    CHKLOG(returnCode);
+#endif
+    UAPI_INFO(fn,"test.exe : ********** START OF MAIN() **********\n");
+    
+    UAPI_INFO(fn,"main", "This is a test\n");
+    UAPI_INFO(fn,"main", "This is a test %d\n", 40);
+    UAPI_INFO(fn,"main", "This is a test %d %s\n", 40, "hi");
+    
+    printBanner("********** START OF MAIN() **********\n");
+    
+    WorkerQueueTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    WorkerQueueTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    mediaTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    mediaTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    simpleMediaTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    recorderTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    deleteFromCallbackTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    deviceSpeakerDeleteTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    microphoneDeleteTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    microphoneAudioDeleteTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    system = System::getInstance(returnCode);
+    CHKLOG(returnCode);
+    deviceSpeakerAudioDeleteTest();
+    system->dispose(returnCode);
+    CHKLOG(returnCode);
+    delete system;
+    
+    UAPI_INFO(fn,"test.exe : ********** END OF MAIN() **********\n");
+    printBanner("********** END OF MAIN() **********\n");
+  }
+#if defined(_WIN32) && defined(_DEBUG)
+  _CrtMemDumpAllObjectsSince(&start_state);
+#endif
+  
+  return 0;
+}
+
diff --git a/uapi/cpp/uapi.doxygen b/uapi/cpp/uapi.doxygen
new file mode 100644
index 0000000..891a231
--- /dev/null
+++ b/uapi/cpp/uapi.doxygen
@@ -0,0 +1,245 @@
+# Doxyfile 1.5.3
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = UAPI
+PROJECT_NUMBER         = "(C) Copyright 2007, 2008 Nuance"
+OUTPUT_DIRECTORY       = doc/uapi_cpp
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class    " \
+                         "The $name widget    " \
+                         "The $name file    " \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = YES
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = YES
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 5
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+DISTRIBUTE_GROUP_DOC   = YES
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= NO
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = NO
+SHOW_DIRECTORIES       = NO
+FILE_VERSION_FILTER    = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text    "
+WARN_LOGFILE           = doxygen.log
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = api/include
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.h
+RECURSIVE              = YES
+EXCLUDE                = api/include/System.h
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = YES
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = NO
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = .\
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = YES
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = YES
+BINARY_TOC             = NO
+TOC_EXPAND             = YES
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 1
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 245
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = _WIN32 \
+                         UAPI_WIN32 \
+                         _WIN32_WINNT=0x0400 \
+                         UAPI_MT \
+                         UAPI_LOGGING_ENABLED
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = "c:/Program Files/ATT/GraphViz/bin    "
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/uapi/cpp/uapi/Android.mk b/uapi/cpp/uapi/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/uapi/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/uapi/include/EmbeddedRecognizerImpl.h b/uapi/cpp/uapi/include/EmbeddedRecognizerImpl.h
new file mode 100644
index 0000000..d5ccfe2
--- /dev/null
+++ b/uapi/cpp/uapi/include/EmbeddedRecognizerImpl.h
@@ -0,0 +1,203 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedRecognizerImpl.h                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _UAPI_EMBEDDEDRECOGNIZER_H
+#define _UAPI_EMBEDDEDRECOGNIZER_H
+
+#include "EmbeddedRecognizer.h"
+#include "Singleton.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class System;
+      namespace utilities
+      {
+        class Mutex;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        class EmbeddedRecognizerImpl: public EmbeddedRecognizer, public Singleton
+        {
+          public:
+            /**
+             * Configures the embedded recognizer.
+             *
+             * @param config recognizer configuration file
+             * @param returnCode ILLEGAL_ARGUMENT if config is null.<br/>
+             * OPEN_ERROR, or READ_ERROR if the recognizer configuration, acoustic model, or
+             * vocabulary files could not be opened or read.
+             */
+            virtual void configure(const char* config, ReturnCode::Type& returnCode);
+            
+            /**
+             * Sets the recognizer listener.
+             *
+             * @param listener recognizer listener
+             * @param returnCode returns SUCCESS unless a fatal error occurs
+             */
+            virtual void setListener(RecognizerListenerProxy& listener, ReturnCode::Type& returnCode);
+            
+                    /**
+           * Creates a grammar.
+           *
+           * @param value the contents of the grammar
+           * @param listener the grammar listener
+           * @param returnCode ILLEGAL_ARGUMENT if value is null
+           */
+          virtual GrammarProxy createGrammar(
+              const char* value, GrammarListenerProxy& listener, ReturnCode::Type& returnCode);
+
+
+                                               
+            /**
+             * Begins speech recognition.
+             *
+             * @param audio the audio to recognizer
+             * @param grammars a collection of grammar sets to recognize against
+             * @param grammarCount the number of grammar sets
+             * @param returnCode ILLEGAL_ARGUMENT if audio is null or is being used by another component,
+             * or if grammars is null or if grammarCount < 1.<br/>
+             * NOT_SUPPORTED if the recognizer does not support the number of grammars specified.
+             */
+            virtual void recognize(AudioStreamProxy& audio, GrammarProxy* grammars,
+                                   ARRAY_LIMIT grammarCount,
+                                   ReturnCode::Type& returnCode);
+                                   
+            /**
+             * This convenience method is equivilent to invoking
+             * recognize(audio, grammars, grammarCount, returnCode) with a single grammar.
+             *
+             * @param audio the audio to recognizer
+             * @param grammar a grammar to recognize against
+             * @param returnCode ILLEGAL_ARGUMENT if audio is null or is being used by another component,
+             * or if grammar is null.
+             * @see recognize(audio, grammars, grammarCount, returnCode)
+             */
+            virtual void recognize(AudioStreamProxy& audio, GrammarProxy& grammar,
+                                   ReturnCode::Type& returnCode);
+                                   
+            /**
+             * Terminates a recognition if one is in-progress.
+             *
+             * @param returnCode the return code
+             */
+            virtual void stop(ReturnCode::Type& returnCode);
+            
+            /**
+             * Set parameter(s).
+             *
+             * @param keys parameter keys
+             * @param values parameter values
+             * @param count the number of parameters
+             * @param returnCode the return code
+             */
+            virtual void setParameters(const char** keys, const char** values,
+                                       ARRAY_LIMIT count, ReturnCode::Type& returnCode);
+                                       
+            /**
+             * Get one or more parameter(s).
+             *
+             * @param keys parameter keys
+             * @param count the number of parameters
+             * @param returnCode the return code
+             */
+            virtual void getParameters(const char** keys, ARRAY_LIMIT count,
+                                       ReturnCode::Type& returnCode);
+            /**
+             * The recognition accuracy improves over time as the recognizer adapts to the surrounding
+             * environment. This method enables developers to reset the adaptation when the environment
+             * is known to have changed.
+             *
+             * @param returnCode the return code
+             */
+            virtual void resetAcousticState(ReturnCode::Type& returnCode);
+          private:
+            /**
+             * Initializes the component when the library is loaded.
+             */
+            class ComponentInitializer
+            {
+              public:
+                ComponentInitializer();
+                ~ComponentInitializer();
+                
+                ReturnCode::Type returnCode;
+            };
+            
+            /**
+             * Returns the SmartProxy root associated with the singleton.
+             *
+             * @return the SmartProxy root associated with the singleton
+             */
+            virtual SmartProxy::Root* getRoot();
+            
+            /**
+             * Invoked when the singleton has to shutdown.
+             *
+             * @param returnCode the return code.
+             */
+            virtual void shutdown(ReturnCode::Type& returnCode);
+            
+            /**
+             * Prevent construction.
+             */
+            EmbeddedRecognizerImpl();
+            
+            /**
+             * Prevent destruction.
+             */
+            virtual ~EmbeddedRecognizerImpl();
+            
+            static ComponentInitializer componentInitializer;
+            static EmbeddedRecognizerImpl* instance;
+            SmartProxy::Root* rootProxy;
+            EmbeddedRecognizerProxy delegate;
+            static utilities::Mutex* mutex;
+            
+            /**
+             * Library loader of the SRecRecognizer. UAPI_srec.dll or UAPI_srec.so.
+             * It is put here such that the library is unloaded only after all the
+             * objects have been deleted.
+             */
+            static utilities::LibraryLoader* srecLoader;
+            
+            friend class EmbeddedRecognizer;
+            friend class android::speech::recognition::System;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/uapi/include/LoggerImpl.h b/uapi/cpp/uapi/include/LoggerImpl.h
new file mode 100644
index 0000000..220bd35
--- /dev/null
+++ b/uapi/cpp/uapi/include/LoggerImpl.h
@@ -0,0 +1,208 @@
+/*---------------------------------------------------------------------------*
+ *  LoggerImpl.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _UAPI_LOGGERIMPL_H_
+#define _UAPI_LOGGERIMPL_H_
+
+#include "Logger.h"
+#include "ReturnCode.h"
+#include "SmartProxy.h"
+#include "FileASCII.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class ThreadLocal;
+        class FileASCII;
+        class Mutex;
+        class RefCounter;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+#ifdef UAPI_LOGGING_ENABLED
+        class LoggerImplProxy;
+
+        /**
+         * Debug logging.
+         */
+        class LoggerImpl: public Logger
+        {
+          public:
+            /**
+             * destructor
+             */
+            virtual ~LoggerImpl();
+
+            /**
+             * Sets the logging level.
+             *
+             * @param level logging level. If it's set to LEVEL_INFO, it will log,
+             * ERRORs WARNs and INFO.
+             */
+            virtual void setLoggingLevel(Logger::LogLevel level, ReturnCode::Type & returnCode);
+
+						/**
+						 * returns the current logging level
+						 *
+						 * @return the logging level of the logger.
+						 */
+            virtual LogLevel getLoggingLevel() const;
+
+            /**
+             * Sets the path that will contain the logs.
+             *
+             * @param path the path of the log file
+             * @param returnCode the return code.
+             */
+            virtual void setPath(const char* path, ReturnCode::Type& returnCode);
+
+            /**
+             * Method called by the UAPI_ERROR macro used to do logging. It takes
+             * variable argument list as a parameter.
+             *
+             * @param fn the function name
+             * @param lpszFormat variable argument list of things to log.
+             */
+            virtual void error(const char* fn, const char* lpszFormat, ...);
+
+            /**
+             * Method called by the UAPI_WARN macro used to do logging. It takes
+             * variable argument list as a parameter.
+             *
+             * @param fn the function name
+             * @param lpszFormat variable argument list of things to log.
+             */
+            virtual void warn(const char* fn, const char* lpszFormat, ...);
+
+            /**
+             * Method called by the UAPI_INFO macro used to do logging. It takes
+             * variable argument list as a parameter.
+             *
+             * @param fn the function name
+             * @param lpszFormat variable argument list of things to log.
+             */
+            virtual void info(const char* fn, const char* lpszFormat, ...);
+
+            /**
+             * Method called by the UAPI_TRACE macro used to do logging. It takes
+             * variable argument list as a parameter.
+             *
+             * @param fn the function name
+             * @param lpszFormat variable argument list of things to log.
+             */
+            virtual void trace(const char* fn, const char* lpszFormat, ...);
+
+
+          private:
+            /**
+             * Contructor
+             *
+             * @param path path of the log file
+             * @param level logging level. If it's set to LEVEL_INFO, it will log,
+             * ERRORs WARNs and INFO.
+             * @param returnCode the return code.
+             */
+            LoggerImpl(const char* path, Logger::LogLevel level, ReturnCode::Type& returnCode);
+
+            /**
+             * helper function used to create an instance of this class
+             */
+            static LoggerImpl * create(ReturnCode::Type & returnCode );
+
+	    /**
+	     * Internal fuction used to set the path without locking the mutex
+	     */
+            void internal_setPath(const char* path, ReturnCode::Type& returnCode);
+
+            /**
+             * Initializes the component when the library is loaded.
+             */
+            class ComponentInitializer
+            {
+              public:
+                ComponentInitializer();
+                ~ComponentInitializer();
+                
+                ReturnCode::Type returnCode;
+                LoggerProxy      makeSureLoggerIsNeverDestroyedLoggerProxy;
+            };
+
+            /**
+             * Method that actually writes into the file
+             *
+             * @param toLog actual string that we want to save into a file.
+             */
+            void log(const char* toLog);
+
+            /**
+             * Variable that contains the current logging level
+             */
+            Logger::LogLevel loggingLevel;
+
+            /**
+             * file in which the logs will be saved.
+             */
+            utilities::FileASCII file;
+            SmartProxy::Root* refCounter;
+
+            static ComponentInitializer componentInitializer;
+
+            static utilities::Mutex * mutex;
+
+            static LoggerImpl * instance;
+
+            friend class Logger;
+            friend class LoggerImplProxy;
+            friend class ComponentInitializer;
+        };
+
+        /**
+         * @see android::speech::recognition::SmartProxy
+         */
+        DECLARE_SMARTPROXY(UAPI_EXPORT, LoggerImplProxy, LoggerProxy, LoggerImpl)
+
+#else
+        class LoggerImpl : public Logger
+        {
+          public:
+            LoggerImpl();
+        };
+#endif
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/uapi/source/Android.mk b/uapi/cpp/uapi/source/Android.mk
new file mode 100644
index 0000000..ac75a6a
--- /dev/null
+++ b/uapi/cpp/uapi/source/Android.mk
@@ -0,0 +1,46 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	Codec.cpp \
+	EmbeddedRecognizer.cpp \
+	EmbeddedRecognizerImpl.cpp \
+	NBestRecognitionResult.cpp \
+	ParametersListener.cpp \
+	RecognitionResult.cpp \
+	Recognizer.cpp \
+	RecognizerListener.cpp \
+	ReturnCode.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../api/include \
+	$(LOCAL_PATH)/../../audio/include \
+	$(LOCAL_PATH)/../../audio/linux/include \
+	$(LOCAL_PATH)/../../grammar/include \
+	$(LOCAL_PATH)/../../uapi/include \
+	$(LOCAL_PATH)/../../utilities/include \
+	$(LOCAL_PATH)/../../utilities/linux/include \
+	$(LOCAL_PATH)/../../../java/jniapi/jniapi \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+
+LOCAL_CFLAGS := \
+	-DUAPI_EXPORTS \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_LDLIBS += \
+	-lpthread \
+	-ldl \
+
+LOCAL_MODULE:= libUAPI_uapi
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/uapi/cpp/uapi/source/Codec.cpp b/uapi/cpp/uapi/source/Codec.cpp
new file mode 100644
index 0000000..3c34841
--- /dev/null
+++ b/uapi/cpp/uapi/source/Codec.cpp
@@ -0,0 +1,82 @@
+/*---------------------------------------------------------------------------*
+ *  Codec.cpp                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "Codec.h"
+#include "ReturnCode.h"
+
+using namespace android::speech::recognition;
+
+
+UINT16 Codec::getSampleRate(Type codec, ReturnCode::Type& returnCode)
+{
+  switch (codec)
+  {
+    case ULAW_8BIT_8K:
+    case PCM_16BIT_8K:
+    {
+      returnCode = ReturnCode::SUCCESS;
+      return 8000;
+    }
+    case PCM_16BIT_11K:
+    {
+      returnCode = ReturnCode::SUCCESS;
+      return 11025;
+    }
+    case PCM_16BIT_22K:
+    {
+      returnCode = ReturnCode::SUCCESS;
+      return 22050;
+    }
+    default:
+    {
+      returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+      return 0;
+    }
+  }
+}
+
+UINT16 Codec::getBitsPerSample(Type codec, ReturnCode::Type& returnCode)
+{
+  switch (codec)
+  {
+    case PCM_16BIT_8K:
+    case PCM_16BIT_11K:
+    case PCM_16BIT_22K:
+    {
+      returnCode = ReturnCode::SUCCESS;
+      return 16;
+    }
+    case ULAW_8BIT_8K:
+    {    
+      returnCode = ReturnCode::SUCCESS;
+      return 8;
+    }
+    default:
+    {
+      returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+      return 0;
+    }
+  }
+}
diff --git a/uapi/cpp/uapi/source/EmbeddedRecognizer.cpp b/uapi/cpp/uapi/source/EmbeddedRecognizer.cpp
new file mode 100644
index 0000000..2b66ee1
--- /dev/null
+++ b/uapi/cpp/uapi/source/EmbeddedRecognizer.cpp
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedRecognizer.cpp                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <string.h>
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "EmbeddedRecognizer.h"
+#include "LoggerImpl.h"
+#include "LibraryLoader.h"
+#include "System.h"
+#include "Grammar.h"
+#include "Singleton.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+using namespace android::speech::recognition::utilities;
+
+DEFINE_SMARTPROXY(android::speech::recognition, EmbeddedRecognizerProxy, RecognizerProxy, EmbeddedRecognizer)
+
+EmbeddedRecognizer::EmbeddedRecognizer()
+{
+  UAPI_FN_NAME("EmbeddedRecognizer::EmbeddedRecognizer");
+  UAPI_TRACE(fn,"this=%p\n", this);
+}
+
+EmbeddedRecognizer::~EmbeddedRecognizer()
+{
+  UAPI_FN_NAME("EmbeddedRecognizer::~EmbeddedRecognizer");
+  UAPI_TRACE(fn,"this=%p\n", this);
+}
diff --git a/uapi/cpp/uapi/source/EmbeddedRecognizerImpl.cpp b/uapi/cpp/uapi/source/EmbeddedRecognizerImpl.cpp
new file mode 100644
index 0000000..4e8da82
--- /dev/null
+++ b/uapi/cpp/uapi/source/EmbeddedRecognizerImpl.cpp
@@ -0,0 +1,364 @@
+/*---------------------------------------------------------------------------*
+ *  EmbeddedRecognizerImpl.cpp                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <string.h>
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include "EmbeddedRecognizerImpl.h"
+#include "Logger.h"
+#include "Mutex.h"
+#include <stdio.h>
+#include "LibraryLoader.h"
+#include "Grammar.h"
+#include "System.h"
+
+using namespace android::speech::recognition::utilities;
+
+#ifndef RECOGNIZER_DYNAMICALLY_LOADED
+// shouldn't re-declare here, but is defined in a different compile domain, intended to be dynamically linked
+extern "C" android::speech::recognition::EmbeddedRecognizerProxy* ConfigureEmbeddedRecognizer(
+    const char* config, android::speech::recognition::ReturnCode::Type& returnCode);
+#endif
+    
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      EmbeddedRecognizerProxy EmbeddedRecognizer::getInstance(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("EmbeddedRecognizer::getInstance");
+        if (impl::EmbeddedRecognizerImpl::componentInitializer.returnCode)
+        {
+          returnCode = impl::EmbeddedRecognizerImpl::componentInitializer.returnCode;
+          return EmbeddedRecognizerProxy();
+        }
+        
+        //we have to protect the construction of "instance". Make sure we don't have
+        //multiple threads calling getInstance() while "instance" is equal to 0.
+        LockScope lock(impl::EmbeddedRecognizerImpl::mutex, returnCode);
+        if (returnCode)
+        {
+          UAPI_ERROR(fn,"Failed to create LockScope of EmbeddedRecognizerImpl::mutex\n");
+          return EmbeddedRecognizerProxy();
+        }
+        
+        //it's now safe to check if instance == 0
+        if (impl::EmbeddedRecognizerImpl::instance == 0)
+        {
+          impl::EmbeddedRecognizerImpl* temp = new impl::EmbeddedRecognizerImpl();
+          if (temp == 0)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return EmbeddedRecognizerProxy();
+          }
+          else if (returnCode)
+          {
+            delete temp;
+            return EmbeddedRecognizerProxy();
+          }
+          impl::EmbeddedRecognizerImpl::instance = temp;
+          
+          EmbeddedRecognizerProxy result(impl::EmbeddedRecognizerImpl::instance);
+          if (!result)
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+          impl::EmbeddedRecognizerImpl::instance->rootProxy = result.getRoot();
+          
+          System* system = System::getInstance(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"Could not get the System instance.\n");
+            return EmbeddedRecognizerProxy();
+          }
+          
+          // has to be called after rootProxy is assigned.
+          system->add(impl::EmbeddedRecognizerImpl::instance, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            delete impl::EmbeddedRecognizerImpl::instance;
+            impl::EmbeddedRecognizerImpl::instance = 0;
+            return EmbeddedRecognizerProxy();
+          }
+          return result;
+        }
+        else
+          returnCode = ReturnCode::SUCCESS;
+        EmbeddedRecognizerProxy result(impl::EmbeddedRecognizerImpl::instance->rootProxy);
+        if (!result)
+          returnCode = ReturnCode::OUT_OF_MEMORY;
+        return result;
+      }
+      
+      namespace impl
+      {
+        EmbeddedRecognizerImpl* EmbeddedRecognizerImpl::instance = 0;
+        LibraryLoader* EmbeddedRecognizerImpl::srecLoader = 0;
+        Mutex* EmbeddedRecognizerImpl::mutex = 0;
+        EmbeddedRecognizerImpl::ComponentInitializer EmbeddedRecognizerImpl::componentInitializer;
+        
+        EmbeddedRecognizerImpl::ComponentInitializer::ComponentInitializer()
+        {
+          mutex = Mutex::create(false, returnCode);
+          if (returnCode)
+          {
+            fprintf(stderr, "Could not create EmbeddedRecognizerImpl::mutex\n");
+            return;
+          }
+        }
+        
+        EmbeddedRecognizerImpl::ComponentInitializer::~ComponentInitializer()
+        {
+          delete mutex;
+          returnCode = ReturnCode::UNKNOWN;
+        }
+        
+        
+        EmbeddedRecognizerImpl::EmbeddedRecognizerImpl():
+            rootProxy(0)
+        {
+          UAPI_FN_NAME("EmbeddedRecognizerImpl::EmbeddedRecognizerImpl");
+          UAPI_TRACE(fn,"this=%p\n", this);
+        }
+        
+#ifdef RECOGNIZER_DYNAMICALLY_LOADED
+        
+        void EmbeddedRecognizerImpl::configure(const char* config, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("EmbeddedRecognizerImpl::configure");
+            
+          const char* libname = "UAPI_srec";
+          
+          if (strcmp(libname, "UAPI_srec") == 0)
+          {
+            ConfigureEmbeddedRecognizer configureFunction;
+            {
+              LockScope ls(mutex, returnCode);
+              if (returnCode)
+              {
+                UAPI_ERROR(fn,"Could not lock mutex: %s\n", ReturnCode::toString(returnCode));
+                return;
+              }
+              if (srecLoader == 0)
+              {
+                srecLoader = LibraryLoader::create(returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Failed to allocate a LibraryLoader: %s\n", ReturnCode::toString(returnCode));
+                  return;
+                }
+                
+                // try to load the library.
+                srecLoader->load(libname, returnCode);
+                if (returnCode != ReturnCode::SUCCESS)
+                {
+                  UAPI_ERROR(fn,"Unable to load %s EmbeddedRecognizer implementation: %s\n",
+                             libname, ReturnCode::toString(returnCode));
+                  return;
+                }
+              }
+              // get the address of the symbol
+              static const char* const symbol = "ConfigureEmbeddedRecognizer";
+              configureFunction =
+                (ConfigureEmbeddedRecognizer) srecLoader->symbolToAddress(symbol, returnCode);
+              if (returnCode != ReturnCode::SUCCESS)
+              {
+                UAPI_ERROR(fn,"Could not find symbol %s of library %s\n", symbol, libname);
+                return;
+              }
+            }
+            
+					  //BUG 4544
+						//We must make sure the object wrapped by "delegate" gets deleted
+						//before we call configureFunction again. By doing this,
+						//SrecRecognizerImpl::~SrecRecognizerImpl() will get called before
+						//configureFunction invokes
+						//SrecRecognizerImpl::SrecRecognizerImpl() 
+            delegate = EmbeddedRecognizerProxy();
+
+            // create a new instance of an embedded recognizer.
+            EmbeddedRecognizerProxy* object = configureFunction(config, returnCode);
+            if (returnCode)
+              return;
+              
+            EmbeddedRecognizerProxy result(*object);
+            delete object;
+            delegate = result;
+            if (!result)
+            {
+              returnCode = ReturnCode::OUT_OF_MEMORY;
+              return;
+            }
+            return;
+          }
+          else
+          {
+            UAPI_ERROR(fn,"Unsupported embedded recognizer of name %s\n", libname);
+            returnCode = ReturnCode::NOT_SUPPORTED;
+            return;
+          }
+        }
+        
+#else
+        
+        void EmbeddedRecognizerImpl::configure(const char* config, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("EmbeddedRecognizerImpl::configure");
+
+          //BUG 4544
+          //We must make sure the object wrapped by "delegate" gets deleted
+          //before we call configureFunction again. By doing this,
+          //SrecRecognizerImpl::~SrecRecognizerImpl() will get called before
+          //configureFunction invokes
+          //SrecRecognizerImpl::SrecRecognizerImpl() 
+          delegate = EmbeddedRecognizerProxy();
+        
+          // just call the method directly, instead of loading the .so and doing a symbol lookup
+          EmbeddedRecognizerProxy* object = ::ConfigureEmbeddedRecognizer(config, returnCode);
+          if (returnCode)
+            return;
+        
+          EmbeddedRecognizerProxy result(*object);
+          delete object;
+          delegate = result;
+          if (!result)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          }
+          return;
+        }
+        
+#endif
+        
+        EmbeddedRecognizerImpl::~EmbeddedRecognizerImpl()
+        {
+          UAPI_FN_NAME("EmbeddedRecognizerImpl::~EmbeddedRecognizerImpl");
+          UAPI_TRACE(fn,"this=%p\n", this);
+          
+          // Must destroy the delegate before unloading the library we got it from, otherwise
+          // the destructor call will crash
+          delegate = EmbeddedRecognizerProxy();
+          instance = 0;
+        }
+        
+        void EmbeddedRecognizerImpl::setListener(RecognizerListenerProxy& listener, ReturnCode::Type& returnCode)
+        {
+          if (delegate == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          delegate->setListener(listener, returnCode);
+        }
+        
+        GrammarProxy EmbeddedRecognizerImpl::createGrammar(const char* value, GrammarListenerProxy& listener, ReturnCode::Type& returnCode)
+        {
+          if (delegate == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return GrammarProxy();
+          }
+          return delegate->createGrammar(value, listener, returnCode);
+        }
+        
+        void EmbeddedRecognizerImpl::recognize(AudioStreamProxy& audio, GrammarProxy* grammars,
+                                               ARRAY_LIMIT grammarCount, ReturnCode::Type& returnCode)
+        {
+          if (delegate == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          delegate->recognize(audio, grammars, grammarCount, returnCode);
+        }
+        
+        void EmbeddedRecognizerImpl::recognize(AudioStreamProxy& audio, GrammarProxy& grammar,
+                                               ReturnCode::Type& returnCode)
+        {
+          if (delegate == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          delegate->recognize(audio, grammar, returnCode);
+        }
+        
+        void EmbeddedRecognizerImpl::stop(ReturnCode::Type& returnCode)
+        {
+          if (delegate == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          delegate->stop(returnCode);
+        }
+        
+        void EmbeddedRecognizerImpl::setParameters(const char** keys, const char** values,
+            ARRAY_LIMIT count, ReturnCode::Type& returnCode)
+        {
+          if (delegate == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          delegate->setParameters(keys, values, count, returnCode);
+        }
+        
+        void EmbeddedRecognizerImpl::getParameters(const char** keys, ARRAY_LIMIT count,
+            ReturnCode::Type& returnCode)
+        {
+          if (delegate == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          delegate->getParameters(keys, count, returnCode);
+        }
+        
+        void EmbeddedRecognizerImpl::resetAcousticState(ReturnCode::Type& returnCode)
+        {
+          if (delegate == 0)
+          {
+            returnCode = ReturnCode::INVALID_STATE;
+            return;
+          }
+          delegate->resetAcousticState(returnCode);
+        }
+        
+        SmartProxy::Root* EmbeddedRecognizerImpl::getRoot()
+        {
+          return rootProxy;
+        }
+        
+        void EmbeddedRecognizerImpl::shutdown(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_SCOPE("EmbeddedRecognizerImpl::shutdown");
+            
+          returnCode = ReturnCode::SUCCESS;
+        }
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/uapi/source/NBestRecognitionResult.cpp b/uapi/cpp/uapi/source/NBestRecognitionResult.cpp
new file mode 100644
index 0000000..d5f68f3
--- /dev/null
+++ b/uapi/cpp/uapi/source/NBestRecognitionResult.cpp
@@ -0,0 +1,42 @@
+/*---------------------------------------------------------------------------*
+ *  NBestRecognitionResult.cpp                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "NBestRecognitionResult.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, NBestRecognitionResultProxy, RecognitionResultProxy, NBestRecognitionResult)
+DEFINE_SMARTPROXY(NBestRecognitionResult, EntryProxy, SmartProxy, NBestRecognitionResult::Entry)
+
+NBestRecognitionResult::NBestRecognitionResult()
+{
+}
+
+NBestRecognitionResult::~NBestRecognitionResult()
+{
+}
+
+NBestRecognitionResult::Entry::Entry()
+{}
+
+NBestRecognitionResult::Entry::~Entry()
+{
+}
diff --git a/uapi/cpp/uapi/source/ParametersListener.cpp b/uapi/cpp/uapi/source/ParametersListener.cpp
new file mode 100644
index 0000000..51604e5
--- /dev/null
+++ b/uapi/cpp/uapi/source/ParametersListener.cpp
@@ -0,0 +1,28 @@
+/*---------------------------------------------------------------------------*
+ *  ParametersListener.cpp                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+#include "ParametersListener.h"
+
+
+using namespace android::speech::recognition;
+
+
+ParametersListener::~ParametersListener()
+{}
diff --git a/uapi/cpp/uapi/source/RecognitionResult.cpp b/uapi/cpp/uapi/source/RecognitionResult.cpp
new file mode 100644
index 0000000..8758500
--- /dev/null
+++ b/uapi/cpp/uapi/source/RecognitionResult.cpp
@@ -0,0 +1,31 @@
+/*---------------------------------------------------------------------------*
+ *  RecognitionResult.cpp                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "RecognitionResult.h"
+
+using namespace android::speech::recognition;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, RecognitionResultProxy, SmartProxy, RecognitionResult)
+
+RecognitionResult::RecognitionResult()
+{}
+
+RecognitionResult::~RecognitionResult()
+{}
diff --git a/uapi/cpp/uapi/source/Recognizer.cpp b/uapi/cpp/uapi/source/Recognizer.cpp
new file mode 100644
index 0000000..499e68f
--- /dev/null
+++ b/uapi/cpp/uapi/source/Recognizer.cpp
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------*
+ *  Recognizer.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "Recognizer.h"
+#include "SmartProxy.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, RecognizerProxy, SmartProxy, Recognizer)
+
+Recognizer::Recognizer()
+{}
+
+Recognizer::~Recognizer()
+{}
diff --git a/uapi/cpp/uapi/source/RecognizerListener.cpp b/uapi/cpp/uapi/source/RecognizerListener.cpp
new file mode 100644
index 0000000..68ace30
--- /dev/null
+++ b/uapi/cpp/uapi/source/RecognizerListener.cpp
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------------*
+ *  RecognizerListener.cpp                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "RecognizerListener.h"
+
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, RecognizerListenerProxy, SmartProxy, RecognizerListener)
+
+RecognizerListener::RecognizerListener()
+{
+}
+
+RecognizerListener::~RecognizerListener()
+{
+}
+
+const char* RecognizerListener::toString(RecognizerListener::FailureReason reason)
+{
+  switch (reason)
+  {
+    case NO_MATCH:
+      return "NO_MATCH";
+    case SPOKE_TOO_SOON:
+      return "SPOKE_TOO_SOON";
+    case BEGINNING_OF_SPEECH_TIMEOUT:
+      return "BEGINNING_OF_SPEECH_TIMEOUT";
+    case RECOGNITION_TIMEOUT:
+      return "RECOGNITION_TIMEOUT";
+    case TOO_MUCH_SPEECH:
+      return "TOO_MUCH_SPEECH";
+    default:
+      return "UNKNOWN_ERROR_TYPE";
+  }
+}
diff --git a/uapi/cpp/uapi/source/ReturnCode.cpp b/uapi/cpp/uapi/source/ReturnCode.cpp
new file mode 100644
index 0000000..31f9021
--- /dev/null
+++ b/uapi/cpp/uapi/source/ReturnCode.cpp
@@ -0,0 +1,118 @@
+/*---------------------------------------------------------------------------*
+ *  ReturnCode.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "ReturnCode.h"
+
+using namespace android::speech::recognition;
+
+
+const char* ReturnCode::toString(Type code)
+{
+  // *** Please also update JNIHelper::getJavaException() ***
+  switch (code)
+  {
+    case SUCCESS:
+      return "SUCCESS";
+    case ILLEGAL_ARGUMENT:
+      return "Illegal or inappropriate argument (ILLEGAL_ARGUMENT)";
+    case NOT_SUPPORTED:
+      return "Operation is not supported by the implementation (NOT_SUPPORTED)";
+    case OUT_OF_MEMORY:
+      return "Could not allocate memory to perform the operation (OUT_OF_MEMORY)";
+    case INVALID_STATE:
+      return "Invalid State. We cannot call this method at this point in time (INVALID_STATE)";
+    case FILE_NOT_FOUND:
+      return "Specified file could not be found (FILE_NOT_FOUND)";
+    case PENDING_DATA:
+      return "No data is currently available but more is expected to arrive in the "
+             "future (PENDING_DATA)";
+    case END_OF_STREAM:
+      return "End of stream has been reached. (END_OF_STREAM)";
+    case SOCKET_IO_ERROR:
+      return "Socket I/O error (SOCKET_IO_ERROR)";
+    case SOCKET_CLOSED:
+      return "Socket was closed (SOCKET_CLOSED)";
+    case UNKNOWN_MODULE:
+      return "Library could not be loaded (UNKNOWN_MODULE)";
+    case UNKNOWN_SYMBOL:
+      return "Library does not contain a specific symbol. (UNKNOWN_SYMBOL)";
+    case NO_MATCH:
+      return "The specified search criteria did not yield any results (NO_MATCH)";
+    case OPEN_ERROR:
+      return "An error occured while opening a file or socket (OPEN_ERROR)";
+    case READ_ERROR:
+      return "An error occured while reading a file or socket (READ_ERROR)";
+    case WRITE_ERROR:
+      return "An error occured while writing to a file or socket (WRITE_ERROR)";
+    case ARRAY_INDEX_OUT_OF_BOUNDS:
+      return "The array index was either negative or greater than or equal to the size of "
+             "the array. (ARRAY_INDEX_OUT_OF_BOUNDS)";
+    case GRAMMAR_SLOT_FULL:
+      return "The grammar slot is full and no further items may be added to it (GRAMMAR_SLOT_FULL)";
+    case HOMONYM_COLLISION:
+      return "Item cannot be added into a grammar slot because another item with the same "
+             "pronunciation already resides in the slot. (HOMONYM_COLLISION)";
+    case ALREADY_LOCKED:
+      return "Mutex or condition variable is already locked by someone else. (ALREADY_LOCKED)";
+    case THREAD_ERROR:
+      return "The thread-related operation has failed (THREAD_ERROR)";
+    case TIMEOUT:
+      return "The previous operation has timed out (TIMEOUT)";
+    case AUDIO_DRIVER_ERROR:
+      return "An error has occured in the audio module (AUDIO_DRIVER_ERROR)";
+    case AUDIO_ALREADY_IN_USE:
+      return "The AudioStream passed in as an argument is already used by another resource (AUDIO_ALREADY_IN_USE)";
+    case OVERFLOW_ERROR:
+      return "Variable or buffer overflow (OVERFLOW_ERROR)";
+    case PARSE_ERROR:
+      return "Could not parse network request. (PARSE_ERROR)";
+    case SPEECH_SERVER_UNAVAILABLE:
+      return "Could not connect to speech server. Speech server is unavailable. (SPEECH_SERVER_UNAVAILABLE)";
+    case SERVER_BUSY:
+      return "Could not connect to server. Server is busy (SERVER_BUSY)";
+    case SERVER_SHUTTING_DOWN:
+      return "Server is shutting down, connection was lost. (SERVER_SHUTTING_DOWN)";
+    case UNDERFLOW_ERROR:
+      return "Variable or buffer underflow (UNDERFLOW_ERROR)";
+    case UNKNOWN:
+      return "An unknown error has occured (UNKNOWN)";
+    case GRAMMAR_LOAD_FAILURE:
+      return "Unable to load the grammar (GRAMMAR_LOAD_FAILURE)";
+    case INVALID_URL:
+      return "The specified URL is invalid (INVALID_URL)";
+    case GRAMMAR_NOT_DEFINED:
+      return "The specified grammar was not defined (GRAMMAR_NOT_DEFINED)";
+    case INVALID_PARAMETER_NAME:
+      return "The parameter you are tyring to set/get is invalid (INVALID_PARAMETER_NAME)";
+    case INVALID_PARAMETER_VALUE:
+      return "The value for the parameter you are tyring to set is invalid (INVALID_PARAMETER_VALUE)";
+    case UNSUPPORTED_CODEC:
+      return "The specified codec is not supported (UNSUPPORTED_CODEC)";
+    case SERVER_PING_MISSED:
+      return "Missed ping request from server. Server or network must be down (SERVER_PING_MISSED)";
+    default:
+      return "UNKNOWN_RETURN_CODE";
+  }
+}
diff --git a/uapi/cpp/uapi/source/SpeechSynthesizer.cpp b/uapi/cpp/uapi/source/SpeechSynthesizer.cpp
new file mode 100644
index 0000000..065ded5
--- /dev/null
+++ b/uapi/cpp/uapi/source/SpeechSynthesizer.cpp
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*
+ *  SpeechSynthesizer.cpp                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <string.h>
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include "SpeechSynthesizer.h"
+#include "AudioSource.h"
+#include "Logger.h"
+#include "ReturnCode.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+DEFINE_SMARTPROXY(android::speech::recognition, SpeechSynthesizerProxy, AudioSourceProxy, SpeechSynthesizer)
+
+SpeechSynthesizer::SpeechSynthesizer()
+{
+  UAPI_FN_NAME("SpeechSynthesizer::SpeechSynthesizer");
+  UAPI_TRACE(fn,"this=%p\n", this);
+}
+
+SpeechSynthesizer::~SpeechSynthesizer()
+{
+  UAPI_FN_NAME("SpeechSynthesizer::~SpeechSynthesizer");
+  UAPI_TRACE(fn,"this=%p\n", this);
+}
diff --git a/uapi/cpp/uapi/source/SpeechSynthesizerListener.cpp b/uapi/cpp/uapi/source/SpeechSynthesizerListener.cpp
new file mode 100644
index 0000000..ad5f13b
--- /dev/null
+++ b/uapi/cpp/uapi/source/SpeechSynthesizerListener.cpp
@@ -0,0 +1,41 @@
+/*---------------------------------------------------------------------------*
+ *  SpeechSynthesizerListener.cpp                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "SpeechSynthesizerListener.h"
+
+
+using namespace android::speech::recognition;
+
+
+DEFINE_SMARTPROXY(android::speech::recognition, SpeechSynthesizerListenerProxy, AudioSourceListenerProxy, SpeechSynthesizerListener)
+
+SpeechSynthesizerListener::SpeechSynthesizerListener()
+{
+}
+
+SpeechSynthesizerListener::~SpeechSynthesizerListener()
+{
+}
+
diff --git a/uapi/cpp/uapi_doxygen.bat b/uapi/cpp/uapi_doxygen.bat
new file mode 100644
index 0000000..a52668d
--- /dev/null
+++ b/uapi/cpp/uapi_doxygen.bat
@@ -0,0 +1,7 @@
+rmdir /S /Q doc\uapi_cpp
+del doxygen.log
+
+mkdir doc
+mkdir doc\uapi_cpp
+
+doxygen uapi.doxygen
diff --git a/uapi/cpp/utilities/Android.mk b/uapi/cpp/utilities/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/cpp/utilities/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/cpp/utilities/include/ConditionVariable.h b/uapi/cpp/utilities/include/ConditionVariable.h
new file mode 100644
index 0000000..b85ffac
--- /dev/null
+++ b/uapi/cpp/utilities/include/ConditionVariable.h
@@ -0,0 +1,134 @@
+/*---------------------------------------------------------------------------*
+ *  ConditionVariable.h                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CONDITIONVARIABLE
+#define __UAPI__CONDITIONVARIABLE
+
+#include "exports.h"
+#include "types.h"
+#include "TimeInstant.h"
+#include "ReturnCode.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class Mutex;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * To avoid entering a busy waiting state, processes must be able to signal each other about
+         * events of interest. Monitors provide this capability through condition variables.
+         * When a monitor function requires a particular condition to be true before it can proceed,
+         * it waits on an associated condition variable. By waiting, it gives up the lock and is removed
+         * from the set of runnable processes. Any process that subsequently causes the condition to be
+         * true may then use the condition variable to notify a process waiting for the condition.
+         * A process that has been notified regains the lock and can proceed.
+         *
+         * Source: http://en.wikipedia.org/wiki/Monitor_(synchronization)#Condition_variables
+         */
+        class UAPI_EXPORT ConditionVariable
+        {
+          public:
+            /**
+             * Creates a new ConditionVariable.
+             *
+             * @param mutex the mutex that must be locked when signaling and waiting on the
+             * condition variable
+             * @param returnCode ILLEGAL_ARGUMENT if mutex is null
+             */
+            static ConditionVariable* create(Mutex* mutex, ReturnCode::Type& returnCode);
+            
+            /**
+             * Destructor destroy a condition variable.  It can fail if the condition
+             * variable is busy.
+             */
+            virtual ~ConditionVariable();
+            
+            /**
+             * Wakes one thread waiting on a condition variable.  The thread to wake is
+             * determined by its scheduling policy.
+             *
+             * @param returnCode THREAD_ERROR on failure
+             */
+            virtual void signal(ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Wait forever until the condition variable is Signal(ed). Note the the
+             * mutex must be Locked before tihs funciton is called. Once Signal(ed),
+             * the mutex will be relocked and the Wait function will return.
+             *
+             * <b>WARNING</b>: Invoking this method while holding more than one lock over a
+             * recursive mutex will result in a deadlock.
+             *
+             * @param returnCode THREAD_ERROR on failure
+             */
+            virtual void wait(ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Wait until the condition variable is Signal(ed) or until the timeout has
+             * elapsed. Note the the mutex must be Locked before tihs funciton is
+             * called. Once Signal(ed), the mutex will be relocked and the TimedWaitMs
+             * function will return.
+             *
+             * <b>WARNING</b>: Invoking this method while holding more than one lock over a
+             * recursive mutex will result in a deadlock.
+             *
+             * @param milliseconds the amount of time, in milliseconds, to wait for the condition
+             * @param returnCode TIMEOUT if the operation timed out before the condition variable
+             * was signaled. THREAD_ERROR if an error occured.
+             */
+            virtual void wait(UINT32 milliseconds, ReturnCode::Type& returnCode) = 0;
+          protected:
+            /**
+             * Prevent construction.
+             */
+            ConditionVariable();
+          private:
+            /**
+             * Prevent copying.
+             */
+            ConditionVariable(const ConditionVariable&);
+            /**
+             * Prevent copying.
+             */
+            ConditionVariable& operator=(ConditionVariable&);
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/ConditionVariableImpl.h b/uapi/cpp/utilities/include/ConditionVariableImpl.h
new file mode 100644
index 0000000..66d9489
--- /dev/null
+++ b/uapi/cpp/utilities/include/ConditionVariableImpl.h
@@ -0,0 +1,123 @@
+/*---------------------------------------------------------------------------*
+ *  ConditionVariableImpl.h                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CONDITIONVARIABLEIMPL
+#define __UAPI__CONDITIONVARIABLEIMPL
+
+#include "exports.h"
+#include "types.h"
+#include "TimeInstant.h"
+#include "ReturnCode.h"
+#include "ConditionVariable.h"
+#include <pthread.h>
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class MutexImpl;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class UAPI_EXPORT ConditionVariableImpl: public ConditionVariable
+        {
+          public:
+            virtual ~ConditionVariableImpl();
+            
+            /**
+             * Wakes one thread waiting on a condition variable.  The thread to wake is
+             * determined by its scheduling policy.
+             *
+             * @param returnCode THREAD_ERROR on failure
+             */
+            virtual void signal(ReturnCode::Type& returnCode);
+            
+            /**
+             * Wait forever until the condition variable is Signal(ed). Note the the
+             * mutex must be Locked before tihs funciton is called. Once Signal(ed),
+             * the mutex will be relocked and the wait function will return.
+             *
+             * @param returnCode THREAD_ERROR on failure
+             */
+            virtual void wait(ReturnCode::Type& returnCode);
+            
+            /**
+             * Wait until the condition variable is Signal(ed) or until the timeout has
+             * elapsed. Note the the mutex must be Locked before tihs funciton is
+             * called. Once Signal(ed), the mutex will be relocked and the TimedWaitMs
+             * function will return.
+             *
+             * @param milliseconds the amount of time, in milliseconds, to wait for the condition
+             * @param returnCode TIMEOUT if the operation timed out before the condition vairable
+             * was signaled. THREAD_ERROR if an error occured.
+             */
+            virtual void wait(UINT32 milliseconds, ReturnCode::Type& returnCode);
+            
+          private:
+            /**
+             * Prevent construction.
+             */
+            ConditionVariableImpl(MutexImpl* mutex, pthread_cond_t* condition);
+            /**
+             * Prevent copying.
+             */
+            ConditionVariableImpl(const ConditionVariable&);
+            /**
+             * Prevent copying.
+             */
+            ConditionVariableImpl& operator=(ConditionVariable&);
+            
+            friend class ConditionVariable;
+            
+            
+            /**
+             * Handle to the mutex.
+             */
+            MutexImpl* mutex;
+            /**
+             * Handle to the condition to signal.
+             */
+            pthread_cond_t* condition;
+            /**
+             * keep track of signals before EINTR so the signal won't be lost due to
+             * interrupts.
+             */
+            bool signaled;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/DoublyLinkedList.h b/uapi/cpp/utilities/include/DoublyLinkedList.h
new file mode 100644
index 0000000..007458c
--- /dev/null
+++ b/uapi/cpp/utilities/include/DoublyLinkedList.h
@@ -0,0 +1,190 @@
+/*---------------------------------------------------------------------------*
+ *  DoublyLinkedList.h                                                       *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef UAPI_DLINKED_LIST_H
+#define UAPI_DLINKED_LIST_H
+
+#include "exports.h"
+#include "Queue.h"
+#include "types.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class DoublyLinkedList;
+        class UAPIFwdIterator;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Double-linked node.
+         */
+        class DoublyLinkedNode: public SinglyLinkedNode
+        {
+          public:
+            DoublyLinkedNode(void* data);
+            
+            DoublyLinkedNode* previous;
+            
+            friend class DoublyLinkedList;
+        };
+        
+        
+        /**
+         * A double linked list that does not use template (portable). It only supports
+         * pointers.
+         */
+        class UAPI_EXPORT DoublyLinkedList
+        {
+          public:
+            /**
+             * constructor
+             */
+            DoublyLinkedList();
+            
+            /**
+             * destructor
+             */
+            ~DoublyLinkedList();
+            
+            /**
+             * copy constructor
+             *
+             * @param toCopy object to copy.
+             */
+            DoublyLinkedList(const DoublyLinkedList& toCopy);
+            
+            /**
+             * tells if the list contains items or not
+             * @return true if the list is empty, false otherwise.
+             */
+            bool empty() const;
+            
+            /**
+             * return the number of items contained in the list.
+             * @return the number of items in the list.
+             */
+            UINT32 size() const;
+            
+            /**
+             * Returns a pointer to the first element of the list.
+             *
+             * @return a pointer to the first element in the list
+             */
+            void* front();
+            
+            /**
+             * Returns a pointer to last element of the list.
+             *
+             * @return a pointer to the last element in the list
+             */
+            void* back();
+            
+            /**
+             * Add an element to the start of the list.
+             * @param data element to add to the list (must be a pointer)
+             */
+            void push_front(void* data);
+            
+            /**
+             * Add an element to the end of the list.
+             * @param data element to add to the list (must be a pointer)
+             */
+            void push_back(void* data);
+            
+            /**
+             * remove the first element in the list
+             */
+            void pop_front();
+            
+            /**
+             * Access any element in the list using the array operator. Ex: m_list[0].
+             * @param index the index of the element to return.
+             */
+            void* operator[](UINT32 index) const;
+            
+            /**
+             * remove an element in the list.
+             * @param pElement element to remove.
+             */
+            void remove(void* element);
+            
+            /**
+             * remove all the elements in the list.
+             */
+            void clear();
+            
+            /**
+             * Insert an new node in the list.
+             *
+             * @param index the index at which to insert the node
+             * @param data the node data
+             */
+            void insert(DoublyLinkedNode* index, void* data);
+            
+            /**
+             * Returns the first node in the list.
+             *
+             * @return the first node in the list
+             */
+            DoublyLinkedNode* begin() const;
+            
+            /**
+             * Returns the last node in the last
+             *
+             * @return the last node in the list
+             */
+            DoublyLinkedNode* end() const;
+            
+          private:
+            /**
+             * head of the list
+             */
+            DoublyLinkedNode* head;
+            /**
+             * tail of the list
+             */
+            DoublyLinkedNode* tail;
+            /**
+             * number of elements in the list
+             */
+            UINT32 listSize;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/File.h b/uapi/cpp/utilities/include/File.h
new file mode 100644
index 0000000..fbc7628
--- /dev/null
+++ b/uapi/cpp/utilities/include/File.h
@@ -0,0 +1,150 @@
+/*---------------------------------------------------------------------------*
+ *  File.h                                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI_FILE__
+#define __UAPI_FILE__
+
+/*
+ * @file
+ * Portable file API.
+ */
+#include "exports.h"
+#include "types.h"
+#include "ReturnCode.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Portable file.
+         */
+        class UAPI_EXPORT File
+        {
+          public:
+            enum SeekType
+            {
+              /**
+               * seek from the start of the file
+               */
+              UAPI_SEEK_SET,
+              /**
+               * seek from the end of the file
+               */
+              UAPI_SEEK_END,
+              /**
+               * seek from the current position
+               */
+              UAPI_SEEK_CUR
+            };
+            
+            
+            /**
+             * destructor
+             */
+            virtual ~File()
+            {}
+            
+            /**
+             * Closes the File.
+             *
+             * @param returnCode the return code
+             */
+            virtual void close(ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Opens a File.
+             * @param path path of the file to open
+             * @param mode the mode in which we have to open the file. Refer to fopen
+             * documentation to know which values are supporeted.
+             * @param returnCode the return code
+             */
+            virtual void open(const char* path , const char* mode, ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Reads from a File.
+             * @param buffer Pointer to data to be written
+             * @param size Item size in bytes
+             * @param in_out_nNumItems [in/out] Maximum number of items to be read.
+             *                         On output, contains the number of full items
+             *                         actually written, which may be less than
+             *                         count if an error occurs.
+             * @param returnCode the return code
+             */
+            virtual void read(void* buffer,
+                              UINT32 size,
+                              UINT32& in_out_nNumItems,
+                              ReturnCode::Type& returnCode) = 0;
+                              
+            /**
+             * Writes data to a File.
+             * @param buffer Pointer to data to be written
+             * @param size Item size in bytes
+             * @param in_out_nNumItems [in/out] Maximum number of items to be read.
+             *                         On output, contains the number of full items
+             *                         actually written, which may be less than
+             *                         count if an error occurs.
+             * @param returnCode the return code
+             */
+            virtual void write(void* buffer,
+                               UINT32 size,
+                               UINT32& in_out_nNumItems,
+                               ReturnCode::Type& returnCode) = 0;
+                               
+            /**
+             * Seek into a File.
+             *
+             * @param offset Number of bytes from <code>origin</code>
+             * @param origin Initial position
+             * @param returnCode the return code
+             */
+            virtual void seek(LONG offset, SeekType origin, ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Gets the current position of a File.
+             *
+             * @param position [out] The position
+             * @param returnCode the return code
+             */
+            virtual void getPosition(UINT32& out_position, ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Used to know if the file is opened or closed.
+             *
+             * @return true if the file is opened.
+             */
+            virtual bool isOpened() const = 0;
+            
+            /**
+             * Used to flush the content of the internal buffer into the file
+             */
+            virtual void flush() = 0;
+        };
+      }
+    }
+  }
+}
+
+#endif
+
diff --git a/uapi/cpp/utilities/include/FileASCII.h b/uapi/cpp/utilities/include/FileASCII.h
new file mode 100644
index 0000000..db5b4c6
--- /dev/null
+++ b/uapi/cpp/utilities/include/FileASCII.h
@@ -0,0 +1,149 @@
+/*---------------------------------------------------------------------------*
+ *  FileASCII.h                                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI_FILEASCII_H_
+#define __UAPI_FILEASCII_H_
+
+#include <stdio.h>
+#include "ReturnCode.h"
+#include "File.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Portable file ASCII implementation. Should be supported on Linux, windows,
+         * WinCE.
+         */
+        class UAPI_EXPORT FileASCII: public File
+        {
+          public:
+            /**
+             * constructor
+             */
+            FileASCII() : m_fp(0)
+            {}
+            
+            /**
+             * destructor
+             */
+            virtual ~FileASCII();
+            
+            /**
+             * Closes the File.
+             *
+             * @param returnCode SUCCESS unless a fatal error occurs
+             */
+            virtual void close(ReturnCode::Type& returnCode);
+            
+            /**
+             * Opens a File.
+             * @param path path of the file to open
+             * @param mode the mode in which we have to open the file. Refer to fopen
+             * documentation to know which values are supporeted.
+             * @param returnCode SUCCESS on open completed.
+             * ILLEGAL_ARGUMENT if parameters path or mode are null, or path is empty string.
+             * INVALID_STATE if file handle is not valid. FILE_NOT_FOUND if file open failed.
+             */
+            virtual void open(const char* path , const char* mode, ReturnCode::Type& returnCode);
+            
+            /**
+             * Reads from a File.
+             * @param buffer Pointer to data to be written
+             * @param size Item size in bytes
+             * @param in_out_nNumItems [in/out] Maximum number of items to be read.
+             *                         On output, contains the number of full items
+             *                         actually written, which may be less than
+             *                         count if an error occurs.
+             * @param returnCode SUCCESS if read completed.
+             * ILLEGAL_ARGUMENT if buffer is null or in_out_nNumItems is less equal to zero.
+             * INVALID_STATE if file handle is not valid.
+             * READ_ERROR if bytes read is different from in_out_nNumItems.
+             */
+            virtual void read(void* buffer, UINT32 size, UINT32& in_out_nNumItems,
+                              ReturnCode::Type& returnCode);
+                              
+            /**
+             * Writes data to a File.
+             * @param buffer Pointer to data to be written
+             * @param size Item size in bytes
+             * @param in_out_nNumItems [in/out] Maximum number of items to be read.
+             *                         On output, contains the number of full items
+             *                         actually written, which may be less than
+             *                         count if an error occurs.
+             * @param returnCode SUCCESS if write completed.
+             * ILLEGAL_ARGUMENT if buffer is null or in_out_nNumItems is less equal to zero.
+             * INVALID_STATE if file handle is not valid.
+             * WRITE_ERROR if bytes written is different from in_out_nNumItems.
+             */
+            virtual void write(void* buffer, UINT32 size, UINT32& in_out_nNumItems,
+                               ReturnCode::Type& returnCode);
+                               
+            /**
+             * Seek into a File.
+             *
+             * @param offset Number of bytes from <code>origin</code>
+             * @param origin Initial position
+             * @param returnCode SUCCESS if seek completed.
+             * INVALID_STATE if file handle is not valid.
+             * ILLEGAL_ARGUMENT if origin type is not valid (has to be one of these values UAPI_SEEK_SET,
+             * UAPI_SEEK_END, UAPI_SEEK_CUR). Or on seek failure.
+             */
+            virtual void seek(LONG offset, SeekType origin, ReturnCode::Type& returnCode);
+            
+            /**
+             * Gets the current position of a File.
+             *
+             * @param position [out] The position
+             * @param returnCode SUCCESS if seek completed.
+             * INVALID_STATE if file handle is not valid.
+             * UNKNOWN on a fatal error.
+             */
+            virtual void getPosition(UINT32& out_position, ReturnCode::Type& returnCode);
+            
+            /**
+             * Used to know if the file is opened or closed.
+             *
+             * @return true if the file is opened.
+             */
+            virtual bool isOpened() const
+            {
+              return m_fp != 0;
+            };
+            
+            /**
+             * Used to flush the content of the internal buffer into the file
+             */
+            virtual void flush();
+            
+          private:
+            FILE* m_fp;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/JNIThreadListener.h b/uapi/cpp/utilities/include/JNIThreadListener.h
new file mode 100644
index 0000000..67722c4
--- /dev/null
+++ b/uapi/cpp/utilities/include/JNIThreadListener.h
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*
+ *  JNIThreadListener.h                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__JNI_THREAD_LISTENER_
+#define __UAPI__JNI_THREAD_LISTENER_
+
+#include "exports.h"
+#include "ReturnCode.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * class used to listen for specific WorkerQueue events.
+         */
+        class JNIThreadListener
+        {
+          public:
+            /**
+             * destructor
+             */
+            virtual ~JNIThreadListener()
+            {}
+            
+            /**
+             * Called when a native thread is started.
+             */
+            virtual void onThreadStarted() = 0;
+            
+            /**
+             * Called when a native thread is stopped.
+             */
+            virtual void onThreadStopped() = 0;
+            
+            /**
+             * Called when a native thread is waken up from its waiting state, i.e.
+             * it was told to start executing some work.
+             */
+            virtual void onThreadActive() = 0;
+            
+            /**
+             * Called when a native thread is not processing anything, i.e. it is
+             * in a waiting state.
+             */
+            virtual void onThreadInactive() = 0;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/LibraryLoader.h b/uapi/cpp/utilities/include/LibraryLoader.h
new file mode 100644
index 0000000..d80a4fa
--- /dev/null
+++ b/uapi/cpp/utilities/include/LibraryLoader.h
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------*
+ *  LibraryLoader.h                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef LIBRARY_LOADER_H__
+#define LIBRARY_LOADER_H__
+
+#include "exports.h"
+#include "RefCounted.h"
+#include "ReturnCode.h"
+
+#if defined(UAPI_WIN32)
+# ifndef WIN32_LEAN_AND_MEAN
+#   define WIN32_LEAN_AND_MEAN
+# endif
+# include <windows.h>
+#elif defined(UAPI_LINUX)
+# include <dlfcn.h>
+# include <stddef.h> // size_t
+#else
+# error unsupported platform
+#endif
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+#if defined(UAPI_WIN32)
+        typedef HINSTANCE dl_handle_t;
+#elif defined(UAPI_LINUX)
+        typedef void* dl_handle_t;
+#else
+# error unsupported platform
+#endif
+#define NULL_HANDLE (dl_handle_t)(NULL)
+        
+        class UAPI_EXPORT LibraryLoader : private RefCounted
+        {
+          public:
+          
+            /**
+             * Creates an instance of this class.
+             *
+             * @param returnCode SUCCESS unless a fatal error has occured.
+             */
+            static LibraryLoader * create(ReturnCode::Type & returnCode);
+            
+            /**
+             * Destructor
+             */
+            ~LibraryLoader();
+            
+            /**
+             * call this method to load the library from the standard PATH or from
+             * LD_LIBRARY_PATH.
+             * @param libname name of the library to load. DO NOT include the .dll or
+             * .so in the name.
+             * @param returnCode ILLEGAL_ARGUMENT on failure when adding reference on the libraryLoader.
+             * UNKNOWN_MODULE on failure when loading the library.
+             *
+             */
+            void load(char const* libname, ReturnCode::Type& returnCode);
+            
+            /**
+             * This functions returns the address of a specified symbol. It is a
+             * wrapper on top of dlsym on linux and GetProcAddress on Windows.
+             * @param symbol name of the symbol to load.
+             * @param returnCode UNKNOWN_SYMBOL if symbol could not be found
+             * @return address of the loaded symbol. Returns null if symbol could not
+             * be found.
+             */
+            void* symbolToAddress(const char* symbol, ReturnCode::Type& returnCode);
+            
+            /**
+             * call this method to close the opened library. The library will be closed
+             * only if no one is using the library. For this reason, this class has a
+             * RefCount (private RefCounted).
+             *
+             * @param returnCode SUCCESS unless a fatal error has occured.
+             * THREAD_ERROR on failure.  ILLEGAL_ARGUMENT on failure when removing reference
+             */
+            void close(ReturnCode::Type& returnCode);
+            
+          private:
+            /**
+             * Constructor
+             */
+            LibraryLoader(ReturnCode::Type & returnCode): RefCounted(0, returnCode), m_handle(NULL_HANDLE)
+            {}
+            
+            /**
+             * Suppress copy-constructor.
+             */
+            LibraryLoader(LibraryLoader& other);
+            /**
+             * Prevent copying.
+             */
+            LibraryLoader& operator=(LibraryLoader& other);
+            /**
+             * This function decreases the reference count by 1. If the count goes down
+             * to 0, then then the library is really closed. This changes the default
+             * behavior of RefCounted which deletes the class when the count is down to
+             * 0.
+             *
+             * @param returnCode THREAD_ERROR on failure.
+             * ILLEGAL_ARGUMENT on failure when removing reference
+             * @return the new reference count after the Release.
+             */
+            virtual UINT8 release(ReturnCode::Type & returnCode);
+            
+            /**
+             * handle to the opened library.
+             */
+            dl_handle_t     m_handle;
+        };
+      }
+    }
+  }
+}
+
+#endif
+
diff --git a/uapi/cpp/utilities/include/Mutex.h b/uapi/cpp/utilities/include/Mutex.h
new file mode 100644
index 0000000..2bbd9d2
--- /dev/null
+++ b/uapi/cpp/utilities/include/Mutex.h
@@ -0,0 +1,169 @@
+/*---------------------------------------------------------------------------*
+ *  Mutex.h                                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MUTEX_
+#define __UAPI__MUTEX_
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "Logger.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Class used to create, destroy, lock and unlock a mutex.
+         */
+        class UAPI_EXPORT Mutex
+        {
+          public:
+          
+            /**
+             * Creates a new Mutex that is allowed to log.
+             *
+             * @param returnCode THREAD_ERROR on failure.
+             * @return a valid mutex handle if SUCCESS, 0 on failure.
+             */
+            static Mutex* create(ReturnCode::Type& returnCode);
+            
+            /**
+             * Creates a new Mutex.
+             *
+             * @param loggingAllowed true if the object and its dependencies are allowed logging
+             * @param returnCode THREAD_ERROR on failure.
+             * @return a valid mutex handle if SUCCESS, 0 on failure.
+             */
+            static Mutex* create(bool loggingAllowed, ReturnCode::Type& returnCode);
+            
+            /**
+             * Destructor. Releases the mutex handle.
+             */
+            virtual ~Mutex();
+            
+            /**
+             * Locks the mutex
+             *
+             * @param returnCode THREAD_ERROR on failure.
+             */
+            virtual void lock(ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Releases the lock on the mutex.
+             *
+             * @param returnCode THREAD_ERROR on failure.
+             */
+            virtual void unlock(ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Attempts to enter the protected section without blocking. If the call is
+             * successful, the calling thread takes ownership of the mutex.
+             *
+             * @param returnCode ALREADY_LOCKED if the mutex is already in locked by another thread
+             * locked, THREAD_ERROR if another error occurs.
+             */
+            virtual void tryLock(ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Returns true if the object and its dependencies are allowed to log.
+             *
+             * @return true if the object and its dependencies are allowed to log
+             */
+            virtual bool isLoggingAllowed() const = 0;
+          protected:
+            /**
+             * Prevent construction.
+             */
+            Mutex();
+        };
+        
+        /**
+         * Class used to automatically lock and unlock a mutex. The mutex scope will
+         * have the same scope as the variable of type LockScope.
+         * Ex:
+         *
+         *  ... safe code
+         *  {
+         *    LockScope ls(mutex);
+         *    ... //unsafe code
+         *  }
+         *  ... safe code
+         *
+         *  is the same as:
+         *
+         *  ... safe code
+         *  m_mutex.Lock();
+         *  ... //unsafe code
+         *  m_mutex.UnLock();
+         *  ... safe code
+         *
+         */
+        class UAPI_EXPORT LockScope
+        {
+          public:
+            /**
+             * Contructor. Will lock the mutex.
+             *
+             * @param mutex The Mutex to lock and unlock within the variable scope.
+             * @param returnCode THREAD_ERROR on failure.
+             */
+            LockScope(Mutex* mutex, ReturnCode::Type& returnCode);
+            
+            /**
+             * Cancel the LockScope before the scope is over, this is useful if the
+             * scope covers cases where the owner of the mutex could be destructed, and
+             * potentially causing unlock on invalid mutex when the scope is over.   By
+             * cancelling it before the desstructor of the owner of mutex is called,
+             * the unlock will not be attempted at the end of the scope.  Cancel() can
+             * be called more than once before the end of the scope.  Only the first
+             * call will actually do the UnLock, the subsequent calls are no-op. Cancel
+             * also causes the subseqeuent call to IsValid() returns false.
+             *
+             * @param returnCode THREAD_ERROR on failure.
+             */
+            void cancel(ReturnCode::Type& returnCode);
+            
+            /**
+             * Destructor. Will unlock the mutex.
+             */
+            ~LockScope();
+            
+          private:
+            /**
+             * Prevent copying.
+             */
+            LockScope& operator=(LockScope& other);
+            
+            /**
+             * A reference to the mutex handle.
+             */
+            Mutex* lockable;
+            bool   loggingAllowed;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/MutexImpl.h b/uapi/cpp/utilities/include/MutexImpl.h
new file mode 100644
index 0000000..a30a736
--- /dev/null
+++ b/uapi/cpp/utilities/include/MutexImpl.h
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*
+ *  MutexImpl.h                                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__MUTEX_IMPL
+#define __UAPI__MUTEX_IMPL
+
+#include "Mutex.h"
+#include "types.h"
+
+#include <errno.h>
+#include <pthread.h>
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace impl
+      {
+        class LoggerImpl;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Class used to create, destroy, lock and unlock a mutex.
+         */
+        class UAPI_EXPORT MutexImpl: public Mutex
+        {
+          public:
+            /**
+             * Creates a new Mutex.
+             *
+             * @param loggingAllowed true if the object and its dependencies are allowed logging
+             * @param returnCode THREAD_ERROR on failure.
+             * @return a valid mutex handle if SUCCESS, 0 on failure.
+             */
+            static MutexImpl* create(bool loggingAllowed, ReturnCode::Type& returnCode);
+            /**
+             * Destructor. Releases the mutex handle.
+             */
+            virtual ~MutexImpl();
+            
+            /**
+             * Locks the mutex
+             *
+             * @param returnCode THREAD_ERROR on failure.
+             */
+            virtual void lock(recognition::ReturnCode::Type& returnCode);
+            
+            /**
+             * Releases the lock on the mutex.
+             *
+             * @param returnCode THREAD_ERROR on failure.
+             */
+            virtual void unlock(recognition::ReturnCode::Type& returnCode);
+            
+            /**
+             * Attempts to enter the protected section without blocking. If the call is
+             * successful, the calling thread takes ownership of the mutex.
+             *
+             * @param returnCode ALREADY_LOCKED if the mutex is already in locked by another thread
+             * locked, THREAD_ERROR if another error occurs.
+             */
+            virtual void tryLock(recognition::ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns true if the object and its dependencies are allowed to log.
+             *
+             * @return true if the object and its dependencies are allowed to log
+             */
+            virtual bool isLoggingAllowed() const;
+          protected:
+            /**
+             * Creates a new logger if possible.
+             *
+             * @return null proxy if a logger could not be created
+             */
+            //virtual LoggerProxy createLogger(char* function) = 0;
+            /**
+             * Logs a message using the LEVEL_ERROR logging level.
+             *
+             * @param format format of variable arguments that follow
+             */
+            //virtual void logError(LoggerProxy& log, const char* format, ...) = 0;
+          private:
+            /**
+             * Prevent construction.
+             */
+            MutexImpl(pthread_mutex_t* mutex, bool loggingAllowed);
+            
+            /**
+             * Shared implementation for locking the mutex.
+             */
+            void lockImpl(ReturnCode::Type& returnCode);
+            
+            /**
+             * Shared implementation for unlocking the mutex.
+             */
+            void unlockImpl(ReturnCode::Type& returnCode);
+            
+#if defined(USE_CUSTOM_RECURSIVE_MUTEX)
+            /**
+             * Invoked before unlocking a mutex (from a locked-state).
+             */
+            void preUnlock(ReturnCode::Type& returnCode);
+            /**
+             * Invoked after locking a mutex (from a non-locked state).
+             */
+            void postLock(ReturnCode::Type& returnCode);
+#endif
+            
+            /**
+             * the handle to the mutex.
+             */
+            pthread_mutex_t* mutex;
+            
+            bool loggingAllowed;
+            
+#if defined(USE_CUSTOM_RECURSIVE_MUTEX)
+            /**
+             * Thread that currently hold the lock. The value is only valid if lockCount > 0.
+             */
+            pthread_t threadId;
+            /**
+             * Number of that the current thread locked the mutex.
+             */
+            UINT8 lockCount;
+#endif
+            friend class Mutex;
+            friend class ConditionVariableImpl; // access to mutex
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/Queue.h b/uapi/cpp/utilities/include/Queue.h
new file mode 100644
index 0000000..c1181f8
--- /dev/null
+++ b/uapi/cpp/utilities/include/Queue.h
@@ -0,0 +1,239 @@
+/*---------------------------------------------------------------------------*
+ *  Queue.h                                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI_QUEUE_
+#define __UAPI_QUEUE_
+
+#include "exports.h"
+#include "types.h"
+#include "ReturnCode.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class Queue;
+        class DoublyLinkedList;
+        class FwdIterator;
+      }
+      namespace nmsp
+      {
+        class SocketListeningThread;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Singly linked node.
+         */
+        class SinglyLinkedNode
+        {
+          public:
+            UAPI_EXPORT SinglyLinkedNode(void* data);
+            
+            SinglyLinkedNode* next;
+          private:
+            void* data;
+            
+            friend class DoublyLinkedList;
+            friend class FwdIterator;
+            friend class Queue;
+            friend class android::speech::recognition::nmsp::SocketListeningThread;
+        };
+        
+        /**
+         * A forward iterator that can be used on UAPIDLinkedList and Queue.
+         * In can be used like this:
+         *<code>
+         *    Queue m_queue;
+         *
+         *    FwdIterator it( m_queue.begin(), m_queue.end());
+         *    while( it.hasNext() )
+         *    {
+         *      MyClass * p = (MyClass*) it.next();
+         *      p->fct();
+         *    }
+         *</code>
+         */
+        class FwdIterator
+        {
+          public:
+            /**
+             * Creates a new FwdIterator.
+             *
+             * @param first The first node
+             * @param last The last node
+             */
+            UAPI_EXPORT FwdIterator(SinglyLinkedNode* first, SinglyLinkedNode* last);
+            
+            /**
+             * destructor.
+             */
+            UAPI_EXPORT ~FwdIterator();
+            
+            /**
+             * checks if there is a next element in the iterator.
+             *
+             * @return true if there is another element in the iterator.
+             */
+            UAPI_EXPORT bool hasNext();
+            
+            /**
+             * returns the next element in the iterator.
+             *
+             * @return the next element.
+             */
+            UAPI_EXPORT void* next();
+            
+            /**
+             * Reset the positions of the iterator.
+             * @param first where to start from.
+             * @param last where we need to stop iterating.
+             */
+            UAPI_EXPORT void reset(SinglyLinkedNode* first, SinglyLinkedNode* last);
+            
+            /**
+             * Returns the current iterator.
+             *
+             * @return a pointer to the current SinglyLinkedNode.
+             */
+            UAPI_EXPORT SinglyLinkedNode* current();
+          private:
+            /**
+             * the current node that the iterator is pointing to.
+             */
+            SinglyLinkedNode* currentNode;
+            /**
+             * where to stop iterating.
+             */
+            SinglyLinkedNode* lastNode;
+        };
+        
+        /**
+         * A queue that does not use template (portable). It only supports
+         * pointers.
+         */
+        class Queue
+        {
+          public:
+            /**
+             * default constructor
+             */
+            UAPI_EXPORT Queue();
+            
+            /**
+             * destructor
+             */
+            UAPI_EXPORT ~Queue();
+            
+            /**
+             * remove all the elements in the queue.
+             */
+            UAPI_EXPORT void clear();
+            
+            /**
+             * Indicates if the queue contains items or not
+             *
+             * @return true if the queue is empty, false otherwise.
+             */
+            UAPI_EXPORT bool empty() const;
+            
+            /**
+             * Return the number of items contained in the queue.
+             *
+             * @return the number of items in the queue.
+             */
+            UAPI_EXPORT UINT32 size() const;
+            
+            /**
+             * Get the first element in the queue.
+             *
+             * @return a pointer to the first element in the queue.
+             */
+            UAPI_EXPORT void* front() const;
+            
+            /**
+             * Add an element to the end of the queue.
+             *
+             * @param newData to add to the queue (must be a pointer).
+             * @param returnCode SUCCESS unless a fatal error occurs
+             */
+            UAPI_EXPORT void push(void* newData, ReturnCode::Type& returnCode);
+            
+            
+            /**
+             * remove the first element from the queue.
+             */
+            UAPI_EXPORT void pop();
+            
+            /**
+             * Removes an element from the queue
+             *
+             * @param data the element to remove
+             */
+            UAPI_EXPORT void remove(void* data);
+            
+            /**
+             * Returns the first node in the queue.
+             *
+             * @return the first node in the queue
+             */
+            UAPI_EXPORT SinglyLinkedNode* begin() const;
+            
+            /**
+             * Returns the last node in the queue.
+             *
+             * @return the last node in the queue
+             */
+            UAPI_EXPORT SinglyLinkedNode* end() const;
+            
+          private:
+            /**
+             * head of the queue.
+             */
+            SinglyLinkedNode* head;
+            /**
+             * tail of the queue.
+             */
+            SinglyLinkedNode* tail;
+            /**
+             * number of elements in the queue.
+             */
+            UINT32 queueSize;
+        };
+      }
+    }
+  }
+}
+
+#endif /* __UAPI_QUEUE_ */
diff --git a/uapi/cpp/utilities/include/RefCounted.h b/uapi/cpp/utilities/include/RefCounted.h
new file mode 100644
index 0000000..5151a48
--- /dev/null
+++ b/uapi/cpp/utilities/include/RefCounted.h
@@ -0,0 +1,116 @@
+/*---------------------------------------------------------------------------*
+ *  RefCounted.h                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__REFCOUNTED_
+#define __UAPI__REFCOUNTED_
+
+#include "exports.h"
+#include "types.h"
+#include "ReturnCode.h"
+#include "Mutex.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Class that need to have a ref count can derive from this class. Once the
+         * count goes down to zero (when Release() is called), the implementation of
+         * RefCounted::Relase will call delete this.
+         *
+         * NOTE: In order to save memory, this class can have a maximum of 256 users,
+         * it uses an UAPI_UINT8.
+         */
+        class UAPI_EXPORT RefCounted
+        {
+          public:
+            /**
+             * Default constructor. It initialize the count of the object to 1.
+             *
+             * @param returnCode SUCCESS unless a fatal error has occured.
+             */
+            RefCounted(ReturnCode::Type& returnCode);
+            
+            /**
+             * Use this constructor if you want to object to be initialize with an
+             * initial count greater than 1.
+             *
+             * @param initial_count The initial reference count of the object.
+             * @param returnCode SUCCESS unless a fatal error has occured
+             */
+            RefCounted(UINT8 initial_count, ReturnCode::Type& returnCode);
+            
+            /**
+             * destructor
+             */
+            virtual ~RefCounted();
+            
+            /**
+             * This function increases the reference count by 1.
+             *
+             * @param returnCode ILLEGAL_ARGUMENT if mutex handle is null
+             * @return the new reference count after the AddRef.
+             */
+            virtual UINT8 addRef(ReturnCode::Type& returnCode);
+            
+            /**
+             * This function decreases the reference count by 1. If the count goes down
+             * to 0, the object is deleted ("delete this;").
+             * NOTE: make sure you don't use the object after ->Release is invoked. If
+             * this Release makes the count go down to zero, the memory will be deleted
+             * and referencing it could cause a core dump.
+             *
+             * @param returnCode SUCCESS unless a fatal error has occured.
+             * @return the new reference count after the Release.
+             */
+            virtual UINT8 removeRef(ReturnCode::Type& returnCode);
+            
+            /**
+             * Use this to get the current reference count of the object.
+             */
+            UINT8 getCount() const;
+            
+          protected:
+          
+            /**
+             * variable that hold the count
+             */
+            UINT8 m_nRefCount;
+            
+            /**
+             * protect from being called from different threads.
+             */
+            Mutex* m_mutex;
+          private:
+            /**
+             * Implementation shared by constuctors.
+             */
+            void init(ReturnCode::Type& returnCode);
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/Runnable.h b/uapi/cpp/utilities/include/Runnable.h
new file mode 100644
index 0000000..ee64836
--- /dev/null
+++ b/uapi/cpp/utilities/include/Runnable.h
@@ -0,0 +1,233 @@
+/*---------------------------------------------------------------------------*
+ *  Runnable.h                                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef _THREAD_PACKAGE_H_
+#define _THREAD_PACKAGE_H_
+
+#include "exports.h"
+#include "types.h"
+#include <pthread.h>
+#include "ReturnCode.h"
+
+#if defined(UAPI_WIN32)
+#ifndef WIN32_LEAN_AND_MEAN
+#  define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#endif
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class Mutex;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+#define UAPI_INVALID_THREAD_ID ((unsigned long)-1)
+      
+        enum ThreadPriority
+        {
+          MIN_THR_PRIORITY,
+          NORM_THR_PRIORITY,
+          HIGH_THR_PRIORITY,
+          HIGHER_THR_PRIORITY,
+          MAX_THR_PRIORITY
+        };
+        
+        
+        /**
+         * Derive from this class if you want to execute code from a new thread.
+         */
+        class UAPI_EXPORT Runnable
+        {
+          public:
+            /**
+             * Constructor using default thread scheduling (Round-robin) and priority
+             * (medium).
+             *
+             * @param mutex used to synchronize access to internal state
+             */
+            Runnable(Mutex* mutex);
+            
+            /**
+             * Destructor, frees resources allocated for the thread.
+             */
+            virtual ~Runnable();
+            
+            /**
+             * Method that is called when the thread is started.
+             *
+             * @return SUCCESS if the thread terminated normally
+             */
+            virtual ReturnCode::Type runThread() = 0;
+            
+            /**
+             * Indicates whether the object should be deleted when the thread shuts down.
+             *
+             * @param value true if the object should be deleted when the thread shuts down
+             * @returnCode SUCCESS unless a fatal error occurs
+             */
+            void setDeleteOnShutdown(bool value, ReturnCode::Type& returnCode);
+            
+            /**
+             * Creates the thread.
+             *
+             * WARNING: a Runnable may not be reused. Once the thread terminates it may not be
+             * restarted.
+             *
+             * PRECONDITION: The thread must be locked over the Runnable mutex.
+             *
+             * @param returnCode THREAD_ERROR in case of failure.
+             * INVALID_STATE if the thread was already used.
+             */
+            void start(ReturnCode::Type& returnCode);
+            
+            /**
+             * Blocks until the thread shuts down. The return values of multiple threads joining on the
+             * same thread is undefined.
+             *
+             * @param returnCode THREAD_ERROR in case of failure
+             */
+            void join(ReturnCode::Type& returnCode);
+            
+            /**
+             * Call this method to change the priority of the thread.
+             *
+             * @param priority the new priority of the thread.
+             * @param returnCode SUCCESS unless a fatal error occurs
+             */
+            void setPriority(const ThreadPriority priority, ReturnCode::Type& returnCode);
+            
+            /**
+             * Change the stack size of the thread.
+             *
+             * @param size New stack size of the thread
+             * @param returnCode SUCCESS unless a fatal error occurs
+             */
+            void setStackSize(UINT32 size, ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns the thread stack size.
+             *
+             * @param returnCode SUCCESS unless a fatal error occurs
+             * @return the thread stack size.
+             */
+            UINT32 getStackSize(ReturnCode::Type& returnCode) const;
+            
+            /**
+             * Suspends the current thread for a minimum of the specified number of
+             * milliseconds.
+             *
+             * @param milliseconds the number of milliseconds to sleep
+             */
+            static void sleep(UINT32 milliseconds);
+            
+            
+            /**
+             * Returns the current thread id.
+             *
+             * @param threadId the string to copy the id into
+             * @param size the size of threadId in bytes
+             * @param returnCode SUCCESS unless a fatal error occurs
+             */
+            static void getCurrentThreadId(char* threadId, ARRAY_LIMIT size, ReturnCode::Type& returnCode);
+            
+            /**
+             * Indicates if the thread is running.
+             *
+             * @param returnCode SUCCESS unless a fatal error occurs
+             */
+            bool isRunning(ReturnCode::Type& returnCode);
+          private:
+            /**
+             * This static function is passed into pthread_create.  It is the start of
+             * the thread routine.  In turn, it calls the virtual function runThread()
+             * which is written by the user of this class.
+             * @param obj pointer to the Runnable object (the thread class).
+             */
+            static void* start_routine(void* obj);
+            
+            /**
+             * Thread cleanup, called in the destructor
+             *
+             * @param returnCode SUCCESS unless a fatal error occurs
+             */
+            void terminate(ReturnCode::Type& returnCode);
+            
+            /**
+             * initial stack size
+             */
+            UINT32 stackSize;
+            
+            /**
+             * Indicates if the object should be deleted when the thread shuts down.
+             */
+            bool deleteOnShutdown;
+          protected:
+            /**
+             * handle to the thread.
+             */
+            pthread_t thread;
+            
+            /**
+             * Used to synchronize access to internal state
+             */
+            Mutex* mutex;
+            
+            /**
+             * Prevent copying.
+             */
+            Runnable(const Runnable &);
+            /**
+             * Prevent assignment.
+             */
+            Runnable& operator=(const Runnable&);
+            
+            /**
+             * Flag that indicates if the thread was started.
+             */
+            bool running;
+            
+            /**
+             * True if the Runnable has been started before.
+             */
+            bool used;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/Task.h b/uapi/cpp/utilities/include/Task.h
new file mode 100644
index 0000000..90ee48b
--- /dev/null
+++ b/uapi/cpp/utilities/include/Task.h
@@ -0,0 +1,159 @@
+/*---------------------------------------------------------------------------*
+ *  Task.h                                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__TASK__
+#define __UAPI__TASK__
+
+#include "exports.h"
+#include "types.h"
+#include "TimeInstant.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class Mutex;
+        class WorkerQueueImpl;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Represents an executable unit of work.
+         */
+        class Task
+        {
+          public:
+            /**
+             * Creates a new Task.
+             *
+             * @param taskName name of the task.
+             */
+            UAPI_EXPORT Task(const char* taskName);
+            
+            /**
+             * destructor.
+             */
+            UAPI_EXPORT virtual ~Task();
+            
+            
+            /**
+             * Executes the unit of work.
+             *
+             * If this method is ever invoked, it is guaranteed to get invoked at most once.
+             * Because this method is not guaranteed to get invoked, all cleanup code should
+             * be placed in the destructor.
+             */
+            UAPI_EXPORT virtual void run() = 0;
+            
+            /**
+             * Only ScheduledTask can have a timeout. Simple Tasks will always have a
+             * timeout of 0. This method returns the value of the timeout when this
+             * object was constructed. It is there mainly to be called by the internal
+             * worker queue implementation.
+             * @return the value of the timeout in msec
+             */
+            UAPI_EXPORT UINT32 getTimeout() const;
+           
+            /**
+             * Get the name of this Task. 
+             */
+            const char * getName() const { return m_name; }
+          protected:
+            /**
+             * Creates a new Task. It can be called only by the ScheduledTask.
+             *
+             * @param timeout_msec when should this task be run in mili-seconds.
+             * @param taskName name of the task.
+             */
+            UAPI_EXPORT Task(UINT32 timeout_msec, const char* taskName);
+            
+            /**
+             * the timeout in mili-seconds
+             */
+            UINT32 m_timeout;
+            
+          private:
+            /**
+             * Prevent copying.
+             */
+            UAPI_EXPORT Task& operator=(Task& other);
+            /**
+             * Internal use only. This is needed by the WorkerQueueImpl to know
+             * when this task will expire. When a Task expires, it is ready to be
+             * "Run". By adding this member variable, we avoid having to wrap the Task
+             * object into another class that contains m_expire. In that case we would
+             * have to allocate memory twice, for the Task and for the wrapper.
+             */
+            TimeInstant m_expire;
+            /**
+             * name of this task. Mainly used for debugging.
+             */
+            const char* m_name;
+
+            friend class WorkerQueueImpl;
+        };
+        
+        /**
+         * Same thing as a Task, except that this Task is scheduled. This means that
+         * the run() method will get called only once the timeout has expired.
+         */
+        class ScheduledTask: public Task
+        {
+          public:
+            /**
+             * Creates a new ScheduledTask.
+             *
+             * @param timeout_msec When should this task execute in mili-seconds.
+             * @param taskName name of the task.
+             */
+            UAPI_EXPORT ScheduledTask(UINT32 timeout_msec, const char * taskName): Task(timeout_msec, taskName) {}
+            
+            /**
+             * destructor
+             */
+            UAPI_EXPORT virtual ~ScheduledTask();
+          private:
+            /**
+             * Prevent copying.
+             */
+            ScheduledTask& operator=(ScheduledTask& other);
+        };
+        
+        
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/ThreadLocal.h b/uapi/cpp/utilities/include/ThreadLocal.h
new file mode 100644
index 0000000..2501071
--- /dev/null
+++ b/uapi/cpp/utilities/include/ThreadLocal.h
@@ -0,0 +1,93 @@
+/*---------------------------------------------------------------------------*
+ *  ThreadLocal.h                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__THREADLOCAL
+#define __UAPI__THREADLOCAL
+
+#include "exports.h"
+#include "types.h"
+#include "ReturnCode.h"
+#include <errno.h>
+#include <pthread.h>
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * This class provides thread-local variables. These variables differ from their normal
+         * counterparts in that each thread that accesses one (via its get or set method) has its own,
+         * independently initialized copy of the variable. ThreadLocal instances are typically private
+         * static fields in classes that wish to associate state with a thread (e.g., a user ID or
+         * Transaction ID).
+         */
+        class UAPI_EXPORT ThreadLocal
+        {
+          public:
+            /**
+             * Creates a new ThreadLocal.
+             *
+             * @param onThreadShutdown used to destroy the thread-local value at thread shutdown
+             * @param returnCode the return code
+             */
+            static ThreadLocal* create(void (*onThreadShutdown)(void*), ReturnCode::Type& returnCode);
+            virtual ~ThreadLocal();
+            
+            /**
+             * Sets the current thread's copy of this thread-local variable to the specified value.
+             * The user is responsible for deallocating the old value.
+             *
+             * @param returnCode the return code
+             */
+            virtual void set(void* value, ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns the value in the current thread's copy of this thread-local variable.
+             *
+             * @param returnCode the return code
+             * @return the current thread's value of this thread-local
+             */
+            virtual void* get(ReturnCode::Type& returnCode);
+          private:
+            /**
+             * Prevent construction.
+             */
+            ThreadLocal(pthread_key_t key, void (*onThreadShutdown)(void*));
+            
+            
+            /**
+             * Thread-local key.
+             */
+            pthread_key_t key;
+            /**
+             * Used to destroy the thread-local value at thread shutdown.
+             */
+            void (*onThreadShutdown)(void* value);
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/TimeInstant.h b/uapi/cpp/utilities/include/TimeInstant.h
new file mode 100644
index 0000000..7702a65
--- /dev/null
+++ b/uapi/cpp/utilities/include/TimeInstant.h
@@ -0,0 +1,86 @@
+/*---------------------------------------------------------------------------*
+ *  TimeInstant.h                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__TIMEINSTANT
+#define __UAPI__TIMEINSTANT
+
+#ifdef WIN32
+#include <winsock2.h>          /* timeval */
+#else
+#include <sys/time.h>
+#endif
+
+#include "types.h"
+#include "ReturnCode.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * An instant in time.
+         */
+        class TimeInstant
+        {
+          public:
+            TimeInstant();
+            /**
+             * Returns the current time.
+             *
+             * @return the resulting time instant
+             */
+            static TimeInstant now();
+            
+            /**
+             * Returns the time instant that results from adding a duration to the current time instance.
+             *
+             * @param milliseconds the duration in milliseconds
+             * @return the resulting time instant
+             */
+            TimeInstant plus(UINT32 milliseconds);
+            
+            /**
+             * Returns the number of milliseconds elapsed between the current time-instant minus the second
+             * time-instant.
+             *
+             * @param second the time instant to compare to
+             * @param returnCode the return code
+             * @return the second time-instant in milliseconds minus the current time in milliseconds
+             */
+            INT32 minus(TimeInstant second, ReturnCode::Type& returnCode);
+            /**
+             * Returns the timeval representation of this object.
+             *
+             * @return timeval representation
+             */
+            timeval toTimeval();
+          private:
+            timeval value;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/WorkerQueue.h b/uapi/cpp/utilities/include/WorkerQueue.h
new file mode 100644
index 0000000..f10d1e3
--- /dev/null
+++ b/uapi/cpp/utilities/include/WorkerQueue.h
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*
+ *  WorkerQueue.h                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__WORKERQUEUE_
+#define __UAPI__WORKERQUEUE_
+
+#include "exports.h"
+#include "ReturnCode.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class Task;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * This class is a queue of Task(s) that are invoked later. When dequeued the
+         * worker queue calls run() on the Task. The worker queue supports plain Tasks
+         * and ScheduledTasks. On some platforms the dequeue will happen in a dedicated
+         * thread. This is not guaranteed on all the platforms.
+         */
+        class UAPI_EXPORT WorkerQueue
+        {
+          public:
+            /**
+             * destructor
+             */
+            virtual ~WorkerQueue()
+            {}
+            
+            /**
+             * Queues a task for later execution.
+             *
+             * Note: Enqueuing a task transfers its ownership to the worker queue.
+             *
+             * @param task the task to execute
+             * @param returnCode ILLEGAL_ARGUMENT if the task is null
+             */
+            virtual void enqueue(Task* task, ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Removes a task that was queued for later execution if the task was
+             * not already dequeued and processed.
+             *
+             * @param task the task to execute
+             * @param returnCode ILLEGAL_ARGUMENT if the task is null
+             */
+            virtual void remove(Task* task, ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Indicates if the worker queue is running.
+             *
+             * @param returnCode SUCCESS unless a fatal error occurs
+             * @return true if the worker queue is running
+             */
+            virtual bool isRunning(ReturnCode::Type& returnCode) = 0;
+          protected:
+            WorkerQueue()
+            {}
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/WorkerQueueFactory.h b/uapi/cpp/utilities/include/WorkerQueueFactory.h
new file mode 100644
index 0000000..950b89c
--- /dev/null
+++ b/uapi/cpp/utilities/include/WorkerQueueFactory.h
@@ -0,0 +1,124 @@
+/*---------------------------------------------------------------------------*
+ *  WorkerQueueFactory.h                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__WORKERQUEUE_FACTORY
+#define __UAPI__WORKERQUEUE_FACTORY
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "Singleton.h"
+#include "types.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      class android::speech::recognition::System;
+      namespace utilities
+      {
+        class JNIThreadListener;
+        class Task;
+        class WorkerQueue;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Class responsible giving access to WorkerQueue. It acts as a pool of
+         * WorkerQueue(s). One can get an instance of a WorkerQueue by accessing
+         * the getWorkerQueue method. There is no guarantee that the returned
+         * WorkerQueue will not be shared. For this reason, Tasks executed on a
+         * WorkerQueue should never block for a long period of time.
+         */
+        class WorkerQueueFactory
+        {
+          public:
+            /**
+             * Get the singleton instance of the WorkerQueueFactory
+             *
+             * @param returnCode the return code.
+             * @return the unique instance of the WorkerQueueFactory.
+             */
+            UAPI_EXPORT static WorkerQueueFactory* getInstance(ReturnCode::Type& returnCode);
+            
+            /**
+             * Returns a WorkerQueue implementation.
+             *
+             * @param returnCode the return code.
+             * @return a instance of a WorkerQueue. The object returned is owned by
+             * the WorkerQueueFactory. This means that the application MUST NOT
+             * called delete on the returned object.
+             */
+            virtual WorkerQueue* getWorkerQueue(ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Set the number of worker queues that will be part of the pool. This
+             * parameter will decide if a new WorkerQueue instance is created or
+             * "re-used" when getWorkerQueue is called.
+             *
+             * @paran numWorkerQueue the maximum number of WorkerQueue that the
+             * pool should contain.
+             * @param returnCode the return code.
+             */
+            virtual void setPoolSize(UINT8 numWorkerQueue, ReturnCode::Type& returnCode) = 0;
+            
+            /**
+             * Called by the JNI layer (optionally used) when the JNI layer is used
+             * for the first time. The JNI layer may use these callbacks to change
+             * the property of the native threads, e.g. attachThreadAsDeamon when
+             * onThreadStarted() is called.
+             */
+            virtual void setJNIThreadListener(utilities::JNIThreadListener* jniThreadListener) = 0;
+            
+            /**
+             * Called by the WorkerQueue when they are ready to send the callback
+             * to the JNIThreadListener.
+             *
+             * @return the JNI thread listener.
+             */
+            virtual JNIThreadListener* getJNIThreadListener() = 0;
+            
+          protected:
+            /**
+             * Prevent construction.
+             */
+            WorkerQueueFactory();
+            virtual ~WorkerQueueFactory();
+            
+          private:
+            friend class android::speech::recognition::System;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/WorkerQueueFactoryImpl.h b/uapi/cpp/utilities/include/WorkerQueueFactoryImpl.h
new file mode 100644
index 0000000..c1d6034
--- /dev/null
+++ b/uapi/cpp/utilities/include/WorkerQueueFactoryImpl.h
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*
+ *  WorkerQueueFactoryImpl.h                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__WORKERQUEUE_FACTORY_IMPL
+#define __UAPI__WORKERQUEUE_FACTORY_IMPL
+
+#include "WorkerQueueFactory.h"
+#include "DoublyLinkedList.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class Task;
+        class Mutex;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Implementation of a lass responsible giving access to WorkerQueue. It
+         * acts as a pool of WorkerQueue(s). One can get an instance of a
+         * WorkerQueue by accessing the getWorkerQueue method. There is no
+         * guarantee that the returned WorkerQueue will not be shared. For this
+         * reason, Tasks executed on a WorkerQueue should never block for a long
+         * period of time.
+         */
+        class WorkerQueueFactoryImpl: public WorkerQueueFactory
+        {
+          public:
+            /**
+             * destructor
+             */
+            virtual ~WorkerQueueFactoryImpl();
+            
+            
+            /**
+             * Returns a WorkerQueue implementation.
+             *
+             * @param returnCode the return code. SUCCESS unless a fatal error has occured.
+             * THREAD_ERROR on failure.
+             * @return a instance of a WorkerQueue. The object returned is owned by
+             * the WorkerQueueFactory. This means that the application MUST NOT
+             * called delete on the returned object.
+             */
+            virtual WorkerQueue* getWorkerQueue(ReturnCode::Type& returnCode);
+            
+            /**
+             * Set the number of worker queues that will be part of the pool. This
+             * parameter will decide if a new WorkerQueue instance is created or
+             * "re-used" when getWorkerQueue is called.
+             *
+             * @param numWorkerQueue the maximum number of WorkerQueue that the
+             * pool should contain.
+             * @param returnCode the return code. SUCCESS unless a fatal error has occured.
+             */
+            virtual void setPoolSize(UINT8 numWorkerQueue, ReturnCode::Type& returnCode);
+            
+            /**
+             * Called by the JNI layer (optionally used) when the JNI layer is used
+             * for the first time. The JNI layer may use these callbacks to change
+             * the property of the native threads, e.g. attachThreadAsDeamon when
+             * onThreadStarted() is called.
+             */
+            virtual void setJNIThreadListener(utilities::JNIThreadListener* jniThreadListener);
+            
+            /**
+             * Called by the WorkerQueue when they are ready to send the callback
+             * to the JNIThreadListener.
+             *
+             * @return the JNI thread listener.
+             */
+            virtual JNIThreadListener* getJNIThreadListener();
+            
+          protected:
+            /**
+             * Prevent construction.
+             */
+            WorkerQueueFactoryImpl();
+            
+          private:
+            /**
+             * Initializes the component when the library is loaded.
+             */
+            class ComponentInitializer
+            {
+              public:
+                ComponentInitializer();
+                ~ComponentInitializer();
+                
+                ReturnCode::Type returnCode;
+            };
+            
+            static ComponentInitializer componentInitializer;
+            
+            /**
+             * Synchronizes access to the singleton.
+             */
+            static Mutex* mutex;
+            
+            DoublyLinkedList workerQueueList;
+            
+            /**
+             * maximum number of worker queues that this class will construct, i.e.
+             * add to _workerQueueList and return in getWorkerQueue.
+             */
+            UINT8 maxNumWorkerQueues;
+            UINT8 indexToReturn;
+            /**
+             * JNI Thread listener. This is only used when the cpp code is used
+             * by the JNI adaptor.
+             */
+            JNIThreadListener* jniThreadListener;
+            /**
+             * singleton instance
+             */
+            static WorkerQueueFactoryImpl* instance;
+            
+            
+            friend class WorkerQueueFactory;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/include/WorkerQueueImpl.h b/uapi/cpp/utilities/include/WorkerQueueImpl.h
new file mode 100644
index 0000000..8da18eb
--- /dev/null
+++ b/uapi/cpp/utilities/include/WorkerQueueImpl.h
@@ -0,0 +1,222 @@
+/*---------------------------------------------------------------------------*
+ *  WorkerQueueImpl.h                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__WORKERQUEUEIMPL_
+#define __UAPI__WORKERQUEUEIMPL_
+
+#if !defined (UAPI_LINUX) && !defined(UAPI_WIN32)
+# error unsupported platform
+#endif
+
+
+#include "WorkerQueue.h"
+#include "Runnable.h"
+#include "DoublyLinkedList.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        class ConditionVariable;
+        class JNIThreadListener;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        /**
+         * Windows, linux implementation of the WorkerQueue.
+         */
+        class WorkerQueueImpl: public WorkerQueue, public Runnable
+        {
+          public:
+            /**
+             * destructor.
+             */
+            virtual ~WorkerQueueImpl();
+            
+            /**
+             * Use this method to create an instance of this class.
+             *
+             * @param jniThreadListener the JNI thread listener, set to 0 if not
+             * integrated with the JNI wrapper.
+             * @param returnCode the return code.
+             */
+            static WorkerQueueImpl* create(utilities::JNIThreadListener* jniThreadListener,
+                                           ReturnCode::Type& returnCode);
+                                           
+            /**
+             * Add Task entries to the queue that will be invoked later in the Run
+             * method.
+             *
+             * Note: the WorkerQueue becomes owner of the Task, i.e. task will
+             * be deleted "delete" once the Task is dequeued and run() has been called.
+             *
+             * @param task a pointer to a Task object to enqueue
+             * @param returnCode the return code
+             */
+            virtual void enqueue(Task* task, ReturnCode::Type& returnCode);
+            
+            /**
+             * Removes a task that was queued for later execution if the task was
+             * not already dequeued and processed.
+             *
+             * @param task the task to execute
+             * @param returnCode ILLEGAL_ARGUMENT if the task is null
+             */
+            virtual void remove(Task* task, ReturnCode::Type& returnCode);
+            
+            /**
+             * Stops the worker queue. It will stop execution of the thread
+             * dequeuing tasks. It will not execute all the pending tasks before
+             * returning. It will execute the current task (if any) and return
+             * right after. The pending tasks will simply be deleted.
+             *
+             * @param returnCode the return code
+             */
+            virtual void shutdownNow(ReturnCode::Type& returnCode);
+            
+            /**
+             * Called by the JNI layer (optionally used) when the JNI layer is used
+             * for the first time. The JNI layer may use these callbacks to change
+             * the property of the native threads, e.g. attachThreadAsDeamon when
+             * onThreadStarted() is called.
+             */
+            virtual void setJNIThreadListener(utilities::JNIThreadListener* jniThreadListener);
+            
+            /**
+             * Indicates if the worker queue is running.
+             *
+             * @param returnCode SUCCESS unless a fatal error occurs
+             * @return true if the worker queue is running
+             */
+            virtual bool isRunning(ReturnCode::Type& returnCode);
+          protected:
+            /**
+             * function called when the Runnable (thread) is started.
+             */
+            virtual ReturnCode::Type runThread();
+          private:
+            /**
+             * Starts the worker queue. It will start the thread responsible to
+             * dequeuing tasks. Upon return, the thread is running.
+             *
+             * PRECONDITION: The current thread must be locked over the Runnable mutex.
+             *
+             * @param returnCode the return code
+             */
+            virtual void start(ReturnCode::Type& returnCode);
+            
+            /**
+             * constructor. Use WorkerQueueImpl::create to create an instance of this
+             * class.
+             *
+             * @param jniThreadListener the JNI thread listener, set to 0 if not
+             * integrated with the JNI wrapper.
+             * @param mutex the mutex used to synchronize access to the thread state
+             * @param returnCode the returnCode
+             */
+            WorkerQueueImpl(utilities::JNIThreadListener* jniThreadListener, Mutex* mutex,
+                            ReturnCode::Type& returnCode);
+                            
+            /**
+            * Prevent copying.
+            */
+            WorkerQueueImpl& operator=(WorkerQueueImpl& other);
+            
+            /**
+             * Utility function used to clean the content of the queues.
+             */
+            void cleanupTaskQueue();
+            /**
+             * debug utility function. it prints the content of the scheduled list.
+             */
+            void printScheduledListContent();
+            
+            /**
+             * Invoked when the worker queue starts up.
+             */
+            void onStartup();
+            
+            /**
+             * Invoked when the worker queue shuts down.
+             */
+            void onShutdown();
+            
+            /**
+             * Invoked when the worker queue transitions from being active to being idle.
+             */
+            void onIdle();
+            
+            /**
+             * Invoked when the worker queue transitions from being idle to being active.
+             */
+            void onActive();
+            
+            /**
+             * Flag that indicates if the thread has been requested to shut down.
+             */
+            bool shutdownRequested;
+            /**
+             * Indicates when the queue is idle.
+             */
+            bool idle;
+            /**
+             * The list of ScheduledTask(s) (that have to execute later), view this as
+             * "std::list<ScheduledTask*>"
+             */
+            DoublyLinkedList scheduledTaskList;
+            /**
+             * Signaled when there is a task on the queue ready to be processed.
+             */
+            ConditionVariable* taskReady;
+            /**
+             * Indicates that the thread is running.
+             */
+            ConditionVariable* threadStarted;
+            /**
+             * JNI Thread listener. This is only used when the cpp code is used
+             * by the JNI adaptor.
+             */
+            JNIThreadListener* jniThreadListener;
+            
+            char threadId[20];
+            char szPreviousTaskName[128];
+            
+            friend class WorkerQueue;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/cpp/utilities/source/Android.mk b/uapi/cpp/utilities/source/Android.mk
new file mode 100644
index 0000000..73af84f
--- /dev/null
+++ b/uapi/cpp/utilities/source/Android.mk
@@ -0,0 +1,58 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	ConditionVariable.cpp \
+	ConditionVariableImpl.cpp \
+	DoublyLinkedList.cpp \
+	FileASCII.cpp \
+	LibraryLoader.cpp \
+	Logger.cpp \
+	LoggerImpl.cpp \
+	Mutex.cpp \
+	MutexImpl.cpp \
+	Queue.cpp \
+	RefCounted.cpp \
+	RefCounter.cpp \
+	Runnable.cpp \
+	SmartProxy.cpp \
+	System.cpp \
+	Task.cpp \
+	ThreadLocal.cpp \
+	TimeInstant.cpp \
+	WorkerQueueImpl.cpp \
+	WorkerQueueFactory.cpp \
+	WorkerQueueFactoryImpl.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../../api/include \
+	$(LOCAL_PATH)/../../audio/include \
+	$(LOCAL_PATH)/../../audio/linux/include \
+	$(LOCAL_PATH)/../../grammar/include \
+	$(LOCAL_PATH)/../../uapi/include \
+	$(LOCAL_PATH)/../../utilities/include \
+	$(LOCAL_PATH)/../../utilities/linux/include \
+	$(LOCAL_PATH)/../../../java/jniapi/jniapi \
+	$(ASR_ROOT_DIR)/audio/AudioIn/UNIX/include \
+
+LOCAL_CFLAGS := \
+	-DUAPI_EXPORTS \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_LDLIBS += \
+	-lpthread \
+	-ldl \
+
+LOCAL_MODULE:= libUAPI_utilities
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/uapi/cpp/utilities/source/ConditionVariable.cpp b/uapi/cpp/utilities/source/ConditionVariable.cpp
new file mode 100644
index 0000000..9e05090
--- /dev/null
+++ b/uapi/cpp/utilities/source/ConditionVariable.cpp
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*
+ *  ConditionVariable.cpp                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "ConditionVariable.h"
+#include "LoggerImpl.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+ConditionVariable::ConditionVariable()
+{}
+
+ConditionVariable::~ConditionVariable()
+{}
diff --git a/uapi/cpp/utilities/source/ConditionVariableImpl.cpp b/uapi/cpp/utilities/source/ConditionVariableImpl.cpp
new file mode 100644
index 0000000..de324eb
--- /dev/null
+++ b/uapi/cpp/utilities/source/ConditionVariableImpl.cpp
@@ -0,0 +1,285 @@
+/*---------------------------------------------------------------------------*
+ *  ConditionVariableImpl.cpp                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#ifdef UAPI_WIN32
+// Do not warn on "while(true)"
+#  pragma warning (disable: 4127)
+#endif
+
+#include "ConditionVariableImpl.h"
+#include "ConditionVariable.h"
+#include "LoggerImpl.h"
+#include "MutexImpl.h"
+
+#include <time.h>
+#include <string.h>
+#include <limits.h>
+#include <errno.h>
+#include <pthread.h>
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      ConditionVariable* ConditionVariable::create(Mutex* mutex, ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_NAME("ConditionVariable::create");
+          
+        if (!mutex)
+        {
+          UAPI_ERROR(fn,"Tried to create a ConditionVariable with a null mutex");
+          returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+          return 0;
+        }
+        
+        pthread_cond_t* condition = new pthread_cond_t;
+        if (!condition)
+        {
+          returnCode = ReturnCode::OUT_OF_MEMORY;
+          return 0;
+        }
+        int rc = pthread_cond_init(condition, 0);
+        if (rc)
+          delete condition;
+        switch (rc)
+        {
+          case 0:
+            break;
+          case EAGAIN:
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            UAPI_ERROR(fn,"pthread_cond_init(): The system lacked the necessary "
+                       "resources (other than memory) to initialize another condition variable\n");
+            return 0;
+          case ENOMEM:
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            UAPI_ERROR(fn,"pthread_cond_init(): Insufficient memory exists to "
+                       "initialize the condition variable\n");
+            return 0;
+          case EBUSY:
+            returnCode = ReturnCode::INVALID_STATE;
+            UAPI_ERROR(fn,"pthread_cond_init(): The implementation has detected an "
+                       "attempt to re-initialize the object referenced by cond, a previously "
+                       "initialized, but not yet destroyed, condition variable\n");
+            return 0;
+          case EINVAL:
+            returnCode = ReturnCode::INVALID_STATE;
+            UAPI_ERROR(fn,"pthread_cond_init(): The value specified by attr is invalid\n");
+            return 0;
+          default:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_cond_init(): unknown error (%d)\n", rc);
+            return 0;
+        }
+        
+        MutexImpl* mutexImpl = (MutexImpl*) mutex;
+        ConditionVariable* result = new ConditionVariableImpl(mutexImpl, condition);
+        if (result == 0)
+        {
+          pthread_cond_destroy(condition);
+          delete condition;
+          returnCode = ReturnCode::OUT_OF_MEMORY;
+          return 0;
+        }
+        returnCode = ReturnCode::SUCCESS;
+        return result;
+      }
+      
+      ConditionVariableImpl::ConditionVariableImpl(MutexImpl* _mutex, pthread_cond_t* _condition):
+          mutex(_mutex),
+          condition(_condition),
+          signaled(false)
+      {}
+      
+      ConditionVariableImpl::~ConditionVariableImpl()
+      {
+        UAPI_FN_NAME("ConditionVariable::ConditionVariable");
+          
+        int rc = pthread_cond_destroy(condition);
+        switch (rc)
+        {
+          case 0:
+            break;
+          case EBUSY:
+            UAPI_ERROR(fn,"pthread_cond_destroy(): The implementation has detected an "
+                       "attempt to destroy the object referenced by cond while it is referenced "
+                       "(for example, while being used in a pthread_cond_wait() or "
+                       "pthread_cond_timedwait()) by another thread\n");
+            break;
+          case EINVAL:
+            UAPI_ERROR(fn,"pthread_cond_destroy(): The value specified by cond is invalid\n");
+            break;
+          default:
+            UAPI_ERROR(fn,"pthread_cond_destroy(): unknown error (%d)\n", rc);
+        }
+        delete condition;
+      }
+      
+      void ConditionVariableImpl::signal(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_NAME("ConditionVariable::signal");
+          
+        int rc = pthread_cond_signal(condition);
+        switch (rc)
+        {
+          case 0:
+            signaled = true;
+            returnCode = ReturnCode::SUCCESS;
+            break;
+          case EINVAL:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_cond_signal(): The value cond does not refer "
+                       "to an initialized condition variable\n");
+            break;
+          default:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_cond_signal(): unknown error (%d)\n", rc);
+            break;
+        }
+      }
+      
+      void ConditionVariableImpl::wait(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_NAME("ConditionVariable::wait");
+          
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+        mutex->preUnlock(returnCode);
+        if (returnCode)
+          return;
+#endif
+        while (true)
+        {
+          int rc = pthread_cond_wait(condition, mutex->mutex);
+          switch (rc)
+          {
+            case 0:
+              if (!signaled)
+              {
+                // Avoid spurious wakeups
+                continue;
+              }
+              else
+                signaled = false;
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+              mutex->postLock(returnCode);
+              if (returnCode)
+                return;
+#endif
+              returnCode = ReturnCode::SUCCESS;
+              return;
+            case EINVAL:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_cond_wait(): The value specified by cond, "
+                         "mutex, or abstime is invalid\n");
+              return;
+            case EPERM:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_cond_wait(): The mutex was not owned by "
+                         "the current thread at the time of the call\n");
+              return;
+            default:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_cond_wait(): unknown error (%d)\n", rc);
+              return;
+          }
+        }
+      }
+      
+      void ConditionVariableImpl::wait(UINT32 milliseconds, ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_NAME("ConditionVariable::wait(timeout)");
+          
+        timespec abstime;
+        if (milliseconds == UINT32_MAX)
+        {
+          //UAPI_INFO(fn,"ConditionVariable::TimedWaitMs will wait forever\n");
+          //special case, wait INFINITE!!!
+          abstime.tv_sec = LONG_MAX;
+          abstime.tv_nsec = 0;
+        }
+        else
+        {
+          TimeInstant timeout = TimeInstant::now();
+          timeout = timeout.plus(milliseconds);
+          timeval timeoutVal = timeout.toTimeval();
+          abstime.tv_sec = timeoutVal.tv_sec;
+          abstime.tv_nsec = timeoutVal.tv_usec * 1000;
+        }
+        
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+        mutex->preUnlock(returnCode);
+        if (returnCode)
+          return;
+#endif
+        while (true)
+        {
+          int rc = pthread_cond_timedwait(condition, mutex->mutex, &abstime);
+          switch (rc)
+          {
+            case 0:
+              if (!signaled)
+              {
+                // Avoid spurious wakeups
+                continue;
+              }
+              else
+                signaled = false;
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+              mutex->postLock(returnCode);
+              if (returnCode)
+                return;
+#endif
+              returnCode = ReturnCode::SUCCESS;
+              return;
+            case ETIMEDOUT:
+              returnCode = ReturnCode::TIMEOUT;
+              UAPI_INFO(fn,"pthread_cond_timedwait(): The time specified by "
+                        "abstime to pthread_cond_timedwait() has passed\n");
+              return;
+            case EINVAL:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_cond_timedwait(): The value specified by "
+                         "cond, mutex, or abstime is invalid\n");
+              return;
+            case EPERM:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_cond_wait(): The mutex was not owned by "
+                         "the current thread at the time of the call\n");
+              return;
+            default:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_cond_timedwait(): unknown error (%d)\n", rc);
+              return;
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/DoublyLinkedList.cpp b/uapi/cpp/utilities/source/DoublyLinkedList.cpp
new file mode 100644
index 0000000..d2e343c
--- /dev/null
+++ b/uapi/cpp/utilities/source/DoublyLinkedList.cpp
@@ -0,0 +1,228 @@
+/*---------------------------------------------------------------------------*
+ *  DoublyLinkedList.cpp                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <stdlib.h>
+
+#include "DoublyLinkedList.h"
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      DoublyLinkedNode::DoublyLinkedNode(void* _data):
+          SinglyLinkedNode(_data),
+          previous(0)
+      {}
+      
+      DoublyLinkedList::DoublyLinkedList():
+          listSize(0)
+      {
+        head = new DoublyLinkedNode(0);
+	
+        if ( head != NULL )
+        {	
+          tail = new DoublyLinkedNode(0);
+
+          if ( tail != NULL )
+          {
+            head->next = tail;
+            head->previous = tail;
+        
+            tail->next = head;
+            tail->previous = head;
+          }
+          else
+          {
+            delete head;
+            head = NULL;
+          }
+        }
+        else
+        {
+          tail = NULL;
+        }
+      }
+
+
+      DoublyLinkedList::~DoublyLinkedList()
+      {
+        clear();
+        delete tail;
+        delete head;
+      }
+
+
+      DoublyLinkedList::DoublyLinkedList(const DoublyLinkedList & toCopy)
+      {
+        head = new DoublyLinkedNode(0);
+	
+        if ( head != NULL )
+        {	
+          tail = new DoublyLinkedNode(0);
+        
+          if ( tail != NULL )
+          {
+            head->next = tail;
+            head->previous = tail;
+        
+            tail->next = head;
+            tail->previous = head;
+        
+            FwdIterator it(toCopy.begin(), toCopy.end());
+        
+            while (it.hasNext())
+            {
+              void* item = it.next();
+              this->push_back(item);
+            }
+          }
+          else
+          {
+            delete head;
+            head = NULL;
+          }
+        }
+        else
+        {
+          tail = NULL;
+        }
+      }
+ 
+
+      void DoublyLinkedList::push_front(void* data)
+      {
+        insert((DoublyLinkedNode*)(head->next), data);
+      }
+      
+      void DoublyLinkedList::push_back(void* data)
+      {
+        insert(tail, data);
+      }
+      
+      void DoublyLinkedList::pop_front()
+      {
+        remove(head->next->data);
+      }
+      
+      void* DoublyLinkedList::operator[](unsigned n) const
+      {
+        if (n >= size())
+          return head->data; //NULL
+          
+        DoublyLinkedNode* pTemp = (DoublyLinkedNode*)(head->next);
+        for (unsigned i = 0; i < n ; ++i)
+          pTemp = (DoublyLinkedNode*)(pTemp->next);
+        return pTemp->data;
+      }
+      
+      void DoublyLinkedList::remove(void* pElement)
+      {
+        DoublyLinkedNode* pTemp = (DoublyLinkedNode*)(head->next);
+        //search from head
+        while (pTemp != tail)
+        {
+          if (pTemp->data == pElement)
+          {
+            //found it
+            DoublyLinkedNode* prevNode = pTemp->previous;
+            DoublyLinkedNode* nextNode = (DoublyLinkedNode*)(pTemp->next);
+            
+            prevNode->next = nextNode;
+            nextNode->previous = prevNode;
+            delete pTemp;
+            --listSize;
+            break;
+          }
+          pTemp = (DoublyLinkedNode*)(pTemp->next);
+        }
+      }
+      
+      void DoublyLinkedList::clear()
+      {
+        DoublyLinkedNode* pTemp = (DoublyLinkedNode*)(head->next);
+        //search from head
+        while (pTemp != tail)
+        {
+          DoublyLinkedNode* pToDelete = pTemp;
+          pTemp = (DoublyLinkedNode*)(pTemp->next);
+          delete pToDelete;
+        }
+        head->next = tail;
+        head->previous = tail;
+        
+        tail->next = head;
+        tail->previous = head;
+        listSize = 0;
+      }
+      
+      void DoublyLinkedList::insert(DoublyLinkedNode* index, void* data)
+      {
+        DoublyLinkedNode* newNode = new DoublyLinkedNode(data);
+        DoublyLinkedNode* previous = index->previous;
+        
+        newNode->next = index;
+        newNode->previous = previous;
+        previous->next = newNode;
+        index->previous = newNode;
+        ++listSize;
+      }
+      
+      bool DoublyLinkedList::empty() const
+      {
+        return head->next == tail;
+      }
+      
+      UINT32 DoublyLinkedList::size() const
+      {
+        return listSize;
+      }
+      
+      void* DoublyLinkedList::front()
+      {
+        return head->next->data;
+      }
+      
+      void* DoublyLinkedList::back()
+      {
+        return tail->previous->data;
+      }
+      
+      DoublyLinkedNode* DoublyLinkedList::begin() const
+      {
+        return head;
+      }
+      
+      DoublyLinkedNode* DoublyLinkedList::end() const
+      {
+        return tail;
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/FileASCII.cpp b/uapi/cpp/utilities/source/FileASCII.cpp
new file mode 100644
index 0000000..2e4d4a3
--- /dev/null
+++ b/uapi/cpp/utilities/source/FileASCII.cpp
@@ -0,0 +1,190 @@
+/*---------------------------------------------------------------------------*
+ *  FileASCII.cpp                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <string.h>
+#include "ReturnCode.h"
+#include "FileASCII.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+FileASCII::~FileASCII()
+{
+  ReturnCode::Type returnCode;
+  close(returnCode);
+}
+
+void FileASCII::close(ReturnCode::Type& returnCode)
+{
+  if (m_fp != 0)
+  {
+    int ret = fclose(m_fp);
+    if (ret != 0)
+    {
+      returnCode = ReturnCode::UNKNOWN;
+      return;
+    }
+    m_fp = 0;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void FileASCII::open(const char* path , const char* mode, ReturnCode::Type& returnCode)
+{
+  if (path == 0 || mode == 0 || strlen(path) == 0)
+  {
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return;
+  }
+  
+  if (m_fp != 0)
+  {
+    returnCode = ReturnCode::INVALID_STATE;
+    return;
+  }
+  
+  m_fp = fopen(path, mode);
+  if (m_fp == 0)
+  {
+    returnCode = ReturnCode::FILE_NOT_FOUND;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void FileASCII::read(void* buffer, UINT32 size, UINT32& in_out_nNumItems,
+                     ReturnCode::Type& returnCode)
+{
+  if (buffer == 0 || in_out_nNumItems <= 0)
+  {
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return;
+  }
+  
+  if (m_fp == 0)
+  {
+    returnCode = ReturnCode::INVALID_STATE;
+    return;
+  }
+  
+  UINT32 numRead = (UINT32)fread(buffer, size, in_out_nNumItems, m_fp);
+  if (numRead != in_out_nNumItems)
+  {
+    in_out_nNumItems = numRead;
+    returnCode = ReturnCode::READ_ERROR;
+    return;
+  }
+  
+  in_out_nNumItems = numRead;
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void FileASCII::write(void* buffer, UINT32 size, UINT32& in_out_nNumItems,
+                      ReturnCode::Type& returnCode)
+{
+  if (buffer == 0 || in_out_nNumItems <= 0)
+  {
+    returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+    return;
+  }
+  
+  if (m_fp == 0)
+  {
+    returnCode = ReturnCode::INVALID_STATE;
+    return;
+  }
+  
+  UINT32 numWritten = (UINT32) fwrite(buffer, size, in_out_nNumItems, m_fp);
+  if (numWritten != in_out_nNumItems)
+  {
+    in_out_nNumItems = numWritten;
+    returnCode = ReturnCode::WRITE_ERROR;
+    return;
+  }
+  
+  in_out_nNumItems = numWritten;
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void FileASCII::seek(LONG offset, SeekType origin, ReturnCode::Type& returnCode)
+{
+  if (m_fp == 0)
+  {
+    returnCode = ReturnCode::INVALID_STATE;
+    return;
+  }
+  
+  int whence;
+  switch (origin)
+  {
+    case UAPI_SEEK_SET:
+      whence = SEEK_SET;
+      break;
+    case UAPI_SEEK_END:
+      whence = SEEK_END;
+      break;
+    case UAPI_SEEK_CUR:
+      whence = SEEK_CUR;
+      break;
+    default:
+      returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+      return;
+  }
+  
+  int ret = fseek(m_fp, offset, whence);
+  if (ret == -1)
+  {
+    returnCode = ReturnCode::UNKNOWN;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void FileASCII::getPosition(UINT32& out_position, ReturnCode::Type& returnCode)
+{
+  if (m_fp == 0)
+  {
+    returnCode = ReturnCode::INVALID_STATE;
+    return;
+  }
+  
+  long pos = ftell(m_fp);
+  if (pos == -1)
+  {
+    out_position = 0;
+    returnCode = ReturnCode::UNKNOWN;
+    return;
+  }
+  
+  out_position = (UINT32) pos;
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void FileASCII::flush()
+{
+  if (m_fp != 0)
+    fflush(m_fp);
+}
diff --git a/uapi/cpp/utilities/source/LibraryLoader.cpp b/uapi/cpp/utilities/source/LibraryLoader.cpp
new file mode 100644
index 0000000..dc3db62
--- /dev/null
+++ b/uapi/cpp/utilities/source/LibraryLoader.cpp
@@ -0,0 +1,193 @@
+/*---------------------------------------------------------------------------*
+ *  LibraryLoader.cpp                                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+
+
+#include "LibraryLoader.h"
+#include "LoggerImpl.h"
+#include "ReturnCode.h"
+
+#if defined(UAPI_WIN32)
+#  include <direct.h>
+#elif defined(UAPI_LINUX)
+#  include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      LibraryLoader* LibraryLoader::create(ReturnCode::Type& returnCode)
+      {
+        LibraryLoader* result = new LibraryLoader(returnCode);
+        if (result == 0)
+        {
+          returnCode = ReturnCode::OUT_OF_MEMORY;
+          return 0;
+        }
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          delete result;
+          return 0;
+        }
+        returnCode = ReturnCode::SUCCESS;
+        return result;
+      }
+      
+      
+      LibraryLoader::~LibraryLoader()
+      {}
+      
+      void LibraryLoader::load(char const* libname, ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("LibraryLoader::load");
+        UAPI_INFO(fn,"libname %s\n", libname);
+        
+        //increase the count of  this library. If the count is greater than 1, this
+        //means that the library was already loaded and we have nothing to do.
+        UINT8 newCount = addRef(returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to addRef on libraryLoader %s\n", libname);
+          return;
+        }
+        
+        if (newCount > 1)
+        {
+          //nothing to do, already opened.
+          returnCode = ReturnCode::SUCCESS;
+          return;
+        }
+        
+        char dl_name[256];
+#if defined(UAPI_WIN32)
+        _snprintf(dl_name, 256, "%s.dll", libname);
+        
+        m_handle = LoadLibrary((LPCSTR) & dl_name);
+        if (m_handle == NULL_HANDLE)
+        {
+          char workingDirectory[_MAX_PATH];
+          if (_getcwd(workingDirectory, _MAX_PATH) == 0)
+            strcpy(workingDirectory, "");
+          UAPI_WARN(fn,"Could not load library %s, code=%d, workingDirectory=%s\n", dl_name, GetLastError(), workingDirectory);
+          returnCode = ReturnCode::UNKNOWN_MODULE;
+          ReturnCode::Type rc;
+          LibraryLoader::release(rc);
+          return;
+        }
+#elif defined(UAPI_LINUX)
+        snprintf(dl_name, 256, "lib%s.so", libname);
+        
+        m_handle = dlopen(dl_name, RTLD_NOW | RTLD_GLOBAL);
+        if (m_handle == NULL_HANDLE)
+        {
+          char const* dl_error_msg;
+          dl_error_msg = dlerror();
+          UAPI_WARN(fn,"Could not load library %s, error=%s\n", dl_name, dl_error_msg);
+          returnCode = ReturnCode::UNKNOWN_MODULE;
+          ReturnCode::Type rc;
+          LibraryLoader::release(rc);
+          return;
+        }
+#endif
+        returnCode = ReturnCode::SUCCESS;
+      }
+      
+      void* LibraryLoader::symbolToAddress(const char* symbol, ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("LibraryLoader::symbolToAddress");
+        UAPI_INFO(fn,"symbol %s\n", symbol);
+        
+        void* address = 0;
+        returnCode = ReturnCode::SUCCESS;
+#if defined(UAPI_WIN32)
+        address = GetProcAddress(m_handle, symbol);
+        if (address == 0)
+        {
+          UAPI_WARN(fn,"Could not find symbol %s, code=%d\n", symbol, GetLastError());
+          returnCode = ReturnCode::UNKNOWN_SYMBOL;
+          return 0;
+        }
+#elif defined(UAPI_LINUX)
+        address = dlsym(m_handle, symbol);
+        if (address == 0)
+        {
+          char const* dl_error_msg;
+          dl_error_msg = dlerror();
+          UAPI_WARN(fn,"Could not find symbol %s, error=%s\n", symbol, dl_error_msg);
+          returnCode = ReturnCode::UNKNOWN_SYMBOL;
+          return 0;
+        }
+#endif
+        return address;
+      }
+      
+      void LibraryLoader::close(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("LibraryLoader::close");
+          
+        UINT8 newCount = LibraryLoader::release(returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to Release the count on library\n");
+          return;
+        }
+        
+        if (newCount == 0)
+        {
+#if defined(UAPI_WIN32)
+          FreeLibrary(m_handle);
+#elif defined(UAPI_LINUX)
+          dlclose(m_handle);
+#endif
+        }
+      }
+      
+      UINT8 LibraryLoader::release(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("LibraryLoader::release");
+          
+        LockScope ls(m_mutex, returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to create lockscope\n");
+          return m_nRefCount;
+        }
+        returnCode = ReturnCode::SUCCESS;
+        m_nRefCount--;
+        return m_nRefCount;
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/Logger.cpp b/uapi/cpp/utilities/source/Logger.cpp
new file mode 100644
index 0000000..c4ba0c1
--- /dev/null
+++ b/uapi/cpp/utilities/source/Logger.cpp
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*
+ *  Logger.cpp                                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "Logger.h"
+
+using namespace android::speech::recognition;
+
+#ifdef UAPI_LOGGING_ENABLED
+
+DEFINE_SMARTPROXY(android::speech::recognition, LoggerProxy, SmartProxy, Logger)
+
+
+Logger::Logger()
+{
+}
+
+Logger::~Logger()
+{
+}
+#endif
+
diff --git a/uapi/cpp/utilities/source/LoggerImpl.cpp b/uapi/cpp/utilities/source/LoggerImpl.cpp
new file mode 100644
index 0000000..026c596
--- /dev/null
+++ b/uapi/cpp/utilities/source/LoggerImpl.cpp
@@ -0,0 +1,540 @@
+/*---------------------------------------------------------------------------*
+ *  LoggerImpl.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "LoggerImpl.h"
+#include "System.h"
+
+#include <string.h>
+#include <time.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#if defined(UAPI_WIN32)
+#include <sys/timeb.h>
+#elif defined(UAPI_LINUX)
+#include <inttypes.h>
+#include <sys/time.h>
+#endif
+#include "Runnable.h"
+#include "Mutex.h"
+#include "ThreadLocal.h"
+#include "FileASCII.h"
+
+
+#if defined(ANDROID)
+extern "C"
+{
+void add_common_log_info ( char *log_buffer );
+}
+#endif
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+using namespace android::speech::recognition::utilities;
+
+
+static const size_t BUFSIZE = 1024;
+static const size_t BUFHDRSIZE = 8;
+
+#ifdef UAPI_LOGGING_ENABLED
+
+
+DEFINE_SMARTPROXY(impl, LoggerImplProxy, LoggerProxy, LoggerImpl)
+Mutex* LoggerImpl::mutex = 0;
+LoggerImpl::ComponentInitializer LoggerImpl::componentInitializer;
+LoggerImpl * LoggerImpl::instance = 0;
+
+LoggerImpl::ComponentInitializer::ComponentInitializer()
+{
+  mutex = Mutex::create(false, returnCode);
+  if (returnCode)
+  {
+    fprintf(stderr, "LoggerImpl::ComponentInitializer::ComponentInitializer() - Could not create LoggerImpl::mutex\n");
+    return;
+  }
+
+  LoggerImpl::instance = LoggerImpl::create( returnCode );
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    fprintf(stderr, "LoggerImpl::ComponentInitializer::ComponentInitializer() - Could not create Logger, error %d\n", returnCode);
+    delete mutex;
+    mutex = 0;
+    LoggerImpl::instance = 0;
+    return;
+  }
+    
+  LoggerProxy result(LoggerImpl::instance,false);
+  if (!result)
+  {
+    fprintf(stderr, "LoggerImpl::ComponentInitializer::ComponentInitializer() - Could not create LoggerProxy\n");
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    delete mutex;
+    mutex = 0;
+    delete LoggerImpl::instance;
+    LoggerImpl::instance = 0;
+    return; 
+  }
+  LoggerImpl::instance->refCounter = result.getRoot();
+
+  impl::LoggerImpl::componentInitializer.makeSureLoggerIsNeverDestroyedLoggerProxy = result;
+}
+
+LoggerImpl::ComponentInitializer::~ComponentInitializer()
+{
+  //get rid of the logger.
+  impl::LoggerImpl::componentInitializer.makeSureLoggerIsNeverDestroyedLoggerProxy = LoggerProxy();
+
+  if (mutex) 
+      delete mutex;
+  mutex = 0;
+  returnCode = ReturnCode::UNKNOWN;
+}
+
+LoggerProxy Logger::getInstance(ReturnCode::Type& returnCode)
+{
+  if (impl::LoggerImpl::componentInitializer.returnCode)
+  {
+    returnCode = impl::LoggerImpl::componentInitializer.returnCode;
+    return LoggerProxy();
+  }
+
+  //we have to protect the construction of "instance". Make sure we don't have
+  //multiple threads calling getInstance() while "instance" is equal to 0.
+  LockScope ls(LoggerImpl::mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    fprintf(stderr, "Logger::getInstance - Failed to create LockScope of static mutex.\n");
+    return LoggerProxy();
+  }
+  
+  //it's now safe to check if instance == 0
+  if (LoggerImpl::instance == 0)
+  {
+    LoggerImpl::instance = LoggerImpl::create( returnCode );
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      fprintf(stderr, "Logger::getInstance - Could not create Logger, error %d\n", returnCode);
+      return LoggerProxy();
+    }
+    
+    LoggerProxy result(LoggerImpl::instance,false);
+    if (!result)
+    {
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      delete LoggerImpl::instance;
+      LoggerImpl::instance = 0;
+      return LoggerProxy();
+    }
+    LoggerImpl::instance->refCounter = result.getRoot();
+
+    impl::LoggerImpl::componentInitializer.makeSureLoggerIsNeverDestroyedLoggerProxy = result;
+    return result;
+  }
+  returnCode = ReturnCode::SUCCESS;
+  LoggerProxy result(LoggerImpl::instance->refCounter);
+  if (!result)
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+  return result;
+}
+
+Logger* Logger::getExistingInstance()
+{
+  return LoggerImpl::instance;
+}
+
+LoggerImpl::~LoggerImpl()
+{
+  ReturnCode::Type rc;
+  file.close(rc);
+  LoggerImpl::instance = 0;
+}
+
+LoggerImpl * LoggerImpl::create(ReturnCode::Type & returnCode)
+{
+  LoggerImpl * result = 0;
+
+#if defined(ANDROID)//Q device
+    //result = new LoggerImpl("/tmp/uapi.log", Logger::LEVEL_WARN, returnCode);
+    result = new LoggerImpl(NULL, Logger::LEVEL_WARN, returnCode);
+#elif defined(UAPI_WIN32) || defined(UAPI_LINUX)
+    result = new LoggerImpl("uapi.log", Logger::LEVEL_WARN, returnCode);
+#endif
+    if (result == 0)
+    {
+      fprintf(stderr, "Logger::getInstance - Could not create Logger, out of memory!!!\n");
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      return 0;
+    }
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      fprintf(stderr, "Logger::getInstance - Could not create Logger, error %d\n", returnCode);
+      delete result;
+      return 0;
+    }
+
+    return result;
+}
+
+
+LoggerImpl::LoggerImpl(const char* path, Logger::LogLevel level,
+                       ReturnCode::Type& returnCode):
+    loggingLevel(level),
+    refCounter(0)
+{
+  internal_setPath(path, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    fprintf(stderr, "LoggerImpl::LoggerImpl - unable to create log file.\n");
+    return;
+  }
+}
+
+void LoggerImpl::internal_setPath(const char* path, ReturnCode::Type& returnCode)
+{
+  if (file.isOpened())
+    file.close(returnCode);
+    
+  if (path) {
+    file.open(path, "a+", returnCode);
+    if (returnCode)
+    {
+      fprintf(stderr, "LoggerImpl::setPath - Failed to create file %s reason %d\n", path, returnCode);
+      return;
+    }
+  }
+  returnCode = ReturnCode::SUCCESS;
+
+}
+
+void LoggerImpl::setPath(const char* path, ReturnCode::Type& returnCode)
+{
+  LockScope ls(LoggerImpl::mutex, returnCode);
+  if (returnCode)
+    return;
+  internal_setPath(path, returnCode);
+}
+
+void LoggerImpl::setLoggingLevel(Logger::LogLevel level, ReturnCode::Type & returnCode)
+{
+  LockScope ls(LoggerImpl::mutex, returnCode);
+  if (returnCode)
+    return;
+  loggingLevel = level;
+  returnCode = ReturnCode::SUCCESS;
+}
+
+Logger::LogLevel LoggerImpl::getLoggingLevel() const
+{
+  return loggingLevel;
+}
+
+void LoggerImpl::error(const char * fn, const char* format, ...)
+{
+  if (loggingLevel >= LEVEL_ERROR)
+  {
+    size_t length;
+    va_list args;
+    va_start(args, format);
+    char* buf = (char*) malloc(BUFSIZE);
+    if (!buf)
+    {
+      fprintf(stderr, "LoggerImpl::error() could not allocate buf\n");
+      return;
+    }
+    
+    //start with ERROR
+#if defined(UAPI_WIN32)
+    _snprintf(buf, BUFSIZE, "ERROR - %s : ", fn);
+#elif defined (ANDROID)
+    add_common_log_info ( buf );
+    length = strlen(buf);
+    snprintf(buf + length, BUFSIZE - length, "%s : ", fn);
+#else
+    snprintf(buf, BUFSIZE, "ERROR - %s : ", fn);
+#endif
+    length = strlen(buf);
+    
+#if defined(UAPI_WIN32)
+    _vsnprintf(buf + length, BUFSIZE - length, format, args);
+#else
+    vsnprintf(buf + length, BUFSIZE - length, format, args);
+#endif
+#if defined (ANDROID)
+    LOGE ( buf );
+#else
+    log(buf);
+#endif
+    free(buf);
+    va_end(args);
+  }
+}
+
+void LoggerImpl::warn(const char * fn, const char* format, ...)
+{
+  if (loggingLevel >= LEVEL_WARN)
+  {
+    size_t length;
+    va_list args;
+    va_start(args, format);
+    char* buf = (char*) malloc(sizeof(char) * BUFSIZE);
+    if (!buf)
+    {
+      fprintf(stderr, "LoggerImpl::warn() could not allocate buf\n");
+      return;
+    }
+    
+    //start with WARN
+#if defined(UAPI_WIN32)
+    _snprintf(buf, BUFSIZE, "WARN  - %s : ", fn);
+#elif defined (ANDROID)
+    add_common_log_info ( buf );
+    length = strlen(buf);
+    snprintf(buf + length, BUFSIZE - length, "%s : ", fn);
+#else
+    snprintf(buf, BUFSIZE, "WARN  - %s : ", fn);
+#endif
+    length = strlen(buf);
+    
+#if defined(UAPI_WIN32)
+    _vsnprintf(buf + length, BUFSIZE - length, format, args);
+#else
+    vsnprintf(buf + length, BUFSIZE - length, format, args);
+#endif
+#if defined (ANDROID)
+    LOGW ( buf );
+#else
+    log(buf);
+#endif
+    free(buf);
+    va_end(args);
+  }
+}
+
+void LoggerImpl::info(const char * fn, const char* format, ...)
+{
+  if (loggingLevel >= LEVEL_INFO)
+  {
+    size_t length;
+    va_list args;
+    va_start(args, format);
+    char* buf = (char*) malloc(sizeof(char) * BUFSIZE);
+    if (!buf)
+    {
+      fprintf(stderr, "LoggerImpl::info() could not allocate buf\n");
+      return;
+    }
+    
+    //start with INFO
+#if defined(UAPI_WIN32)
+    _snprintf(buf, BUFSIZE, "INFO  - %s : ", fn);
+#elif defined (ANDROID)
+    add_common_log_info ( buf );
+    length = strlen(buf);
+    snprintf(buf + length, BUFSIZE - length, "%s : ", fn);
+#else
+    snprintf(buf, BUFSIZE, "INFO  - %s : ", fn);
+#endif
+    length = strlen(buf);
+    
+#if defined(UAPI_WIN32)
+    _vsnprintf(buf + length, BUFSIZE - length, format, args);
+#else
+    vsnprintf(buf + length, BUFSIZE - length, format, args);
+#endif
+#if defined (ANDROID)
+    LOGI ( buf );
+#else
+    log(buf);
+#endif
+    free(buf);
+    va_end(args);
+  }
+}
+
+void LoggerImpl::trace(const char * fn, const char* format, ...)
+{
+  if (loggingLevel >= LEVEL_TRACE)
+  {
+    size_t length;
+    va_list args;
+    va_start(args, format);
+    char* buf = (char*) malloc(sizeof(char) * BUFSIZE);
+    if (!buf)
+    {
+      fprintf(stderr, "LoggerImpl::trace() could not allocate buf\n");
+      return;
+    }
+    
+    //start with TRACE
+#if defined(UAPI_WIN32)
+    _snprintf(buf, BUFSIZE, "TRACE - %s : ", fn);
+#elif defined (ANDROID)
+    add_common_log_info ( buf );
+    length = strlen(buf);
+    snprintf(buf + length, BUFSIZE - length, "%s : ", fn);
+#else
+    snprintf(buf, BUFSIZE, "TRACE - %s : ", fn);
+#endif
+    length = strlen(buf);
+    
+#if defined(UAPI_WIN32)
+    _vsnprintf(buf + length, BUFSIZE - length, format, args);
+#else
+    vsnprintf(buf + length, BUFSIZE - length, format, args);
+#endif
+#if defined (ANDROID)
+    LOGD ( buf );
+#else
+    log(buf);
+#endif
+    free(buf);
+    va_end(args);
+  }
+}
+
+
+void LoggerImpl::log(const char* toLog)
+{
+#ifdef UAPI_WIN32
+  // get current time
+  struct timeb timebuf;
+  ftime(&timebuf);
+#elif defined(ANDROID)
+return;
+#elif defined(UAPI_LINUX)
+  // struct timeb isn't available on some Linux systems, so there is no milliseconds field
+  struct timeval time_now;
+  gettimeofday ( &time_now, NULL );
+#endif
+  
+  struct tm *ptm;
+
+#ifdef UAPI_WIN32
+  ptm = localtime(&timebuf.time);
+#elif defined(ANDROID)
+  ;
+#elif defined(UAPI_LINUX)
+  ptm = localtime ( (const time_t *)&time_now.tv_sec );	// This conversion is safe for a few decades. SteveR
+#endif
+  
+  // now you have the year, month, day etc.
+  char date[30];
+  
+  ::strftime(date, 30, "%Y/%m/%d %H:%M:%S", ptm);
+  
+  char pszMsec[10];
+#ifdef UAPI_WIN32
+  _snprintf(pszMsec, 6, ".%03u ", timebuf.millitm);
+#elif defined(ANDROID)
+  ;
+#elif defined(UAPI_LINUX)
+  snprintf ( pszMsec, 8, ".%06ld ", time_now.tv_usec );
+#endif
+  
+  char threadId[20];
+  ReturnCode::Type returnCode;
+  Runnable::getCurrentThreadId(threadId, 20, returnCode);
+  if (returnCode)
+  {
+    fprintf(stderr, "LoggerImpl::log - Runnable::getcurrentThreadId() failed: %s\n",
+            ReturnCode::toString(returnCode));
+    return;
+  }
+  
+  char* finalString = new char[strlen(date) + strlen(pszMsec) + strlen(threadId) + strlen(" ") + strlen(toLog) + 1];
+  
+  strcpy(finalString, "");
+  strcat(finalString, date);
+  strcat(finalString, pszMsec);
+  strcat(finalString, threadId);
+  strcat(finalString, " ");
+  strcat(finalString, toLog);
+ 
+  {
+    LockScope ls(LoggerImpl::mutex, returnCode);
+    if (returnCode)
+    {
+      fprintf(stderr, "LoggerImpl::log - Failed to lock mutex\n");
+      delete[] finalString;
+      return;
+    }
+
+    if (!file.isOpened())
+    {
+      if (returnCode)
+        fprintf(stderr, "LoggerImpl::log - unlock() failed: %s\n", ReturnCode::toString(returnCode));
+      delete[] finalString;
+      return;
+    }
+    
+    UINT32 length = (UINT32) strlen(finalString);
+    file.write(finalString, sizeof(char), length, returnCode);
+    if (returnCode)
+    {
+      fprintf(stderr, "LoggerImpl::log - Could not write log into a file: %s\n",
+              ReturnCode::toString(returnCode));
+    }
+    file.flush();
+  }
+  delete[] finalString;
+}
+#endif
+
+
+#if defined(ANDROID)
+extern "C"
+{
+void add_common_log_info ( char *log_buffer )
+{
+  ReturnCode::Type returnCode;
+  struct timeval time_now;
+  struct tm *ptm;
+  char date[30];
+  char pszMsec[10];
+  char threadId[20];
+
+// Google has its own time stamp mechanism. Just commented out in case its
+// useful in the future. SteveR
+//  gettimeofday ( &time_now, NULL );
+//  ptm = localtime ( (const time_t *)&time_now.tv_sec );	// This conversion is safe for a few decades. SteveR
+  
+  // now you have the year, month, day etc.
+//  ::strftime(date, 30, "%Y/%m/%d %H:%M:%S", ptm);
+//  snprintf ( pszMsec, 8, ".%06ld ", time_now.tv_usec );
+  
+  Runnable::getCurrentThreadId(threadId, 20, returnCode);
+  if (returnCode)
+  {
+    fprintf(stderr, "LoggerImpl::log - Runnable::getcurrentThreadId() failed: %s\n",
+            ReturnCode::toString(returnCode));
+    return;
+  }
+//  strcpy ( log_buffer, date );
+//  strcat ( log_buffer, pszMsec );
+  strcpy ( log_buffer, threadId );
+  strcat ( log_buffer, " " );
+}
+}
+#endif
diff --git a/uapi/cpp/utilities/source/Mutex.cpp b/uapi/cpp/utilities/source/Mutex.cpp
new file mode 100644
index 0000000..160d177
--- /dev/null
+++ b/uapi/cpp/utilities/source/Mutex.cpp
@@ -0,0 +1,196 @@
+/*---------------------------------------------------------------------------*
+ *  Mutex.cpp                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "Mutex.h"
+#include "MutexImpl.h"
+#include "Logger.h"
+#include <stdio.h>
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        Mutex* Mutex::create(ReturnCode::Type& returnCode)
+        {
+          return create(true, returnCode);
+        }
+        
+        Mutex* Mutex::create(bool loggingAllowed, ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_NAME("Mutex::create");
+
+          MutexImpl* mutex = MutexImpl::create(loggingAllowed, returnCode);
+          if (returnCode)
+          {
+            const char* message = "Failed to create MutexImpl\n";
+            if (loggingAllowed)
+            {
+              UAPI_ERROR(fn,message);
+            }
+            else
+            {
+              fprintf(stderr, message);
+            }
+            delete mutex;
+            return 0;
+          }
+          return mutex;
+        }
+        
+        Mutex::Mutex()
+        {}
+        
+        Mutex::~Mutex()
+        {}
+        
+        
+        LockScope::LockScope(Mutex* mutex, ReturnCode::Type& returnCode):
+            lockable(mutex),
+            loggingAllowed( mutex == 0 ? false : mutex->isLoggingAllowed())
+        {
+          UAPI_FN_NAME("LockScope::LockScope");
+          
+          if (!lockable)
+          {
+            const char* message = "mutex handle is null\n";
+            if (loggingAllowed)
+            {
+              UAPI_ERROR(fn,message);
+            }
+            else
+            {
+              fprintf(stderr, message);
+            }
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+          }
+          lockable->lock(returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            lockable = 0;
+            const char* message = "Unable to lock mutex\n";
+            if (loggingAllowed)
+            {
+              UAPI_ERROR(fn,message);
+            }
+            else
+            {
+              fprintf(stderr, message);
+            }
+            return;
+          }
+        }
+        
+        
+        void LockScope::cancel(ReturnCode::Type& returnCode)
+        {
+          UAPI_FN_NAME("LockScope::cancel");
+          
+          if (lockable)
+          {
+            lockable->unlock(returnCode);
+            lockable = 0;
+            if (returnCode == ReturnCode::INVALID_STATE)
+            {
+              const char* message = "LockScope.cancel(): mutex was already unlocked\n";
+              if (loggingAllowed)
+              {
+                UAPI_ERROR(fn,message);
+              }
+              else
+              {
+                fprintf(stderr, message);
+              }
+              return;
+            }
+            else if (returnCode)
+            {
+              const char* message = "Unable to unlock mutex\n";
+              if (loggingAllowed)
+              {
+                UAPI_ERROR(fn,message);
+              }
+              else
+              {
+                fprintf(stderr, message);
+              }
+              return;
+            }
+            lockable = 0;
+          }
+          else
+          {
+            const char* message = "LockScope.cancel(): LockScope does not own the mutex\n";
+            if (loggingAllowed)
+            {
+              UAPI_ERROR(fn,message);
+            }
+            else
+            {
+              fprintf(stderr, message);
+            }
+            returnCode = ReturnCode::SUCCESS;
+          }
+        }
+        
+        /**
+         * Destructor. Will unlock the mutex.
+         */
+        LockScope::~LockScope()
+        {
+          UAPI_FN_NAME("LockScope::~LockScope");
+
+          ReturnCode::Type returnCode;
+          
+          if (lockable)
+          {
+            cancel(returnCode);
+            if (returnCode)
+            {
+              const char* message = "Unable to cancel lock on mutex\n";
+              if (loggingAllowed)
+              {
+                UAPI_ERROR(fn,message);
+              }
+              else
+              {
+                fprintf(stderr, message);
+              }
+            }
+          }
+        }
+
+
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/MutexImpl.cpp b/uapi/cpp/utilities/source/MutexImpl.cpp
new file mode 100644
index 0000000..65e3a0b
--- /dev/null
+++ b/uapi/cpp/utilities/source/MutexImpl.cpp
@@ -0,0 +1,665 @@
+/*---------------------------------------------------------------------------*
+ *  MutexImpl.cpp                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include <stdlib.h>
+#include <pthread.h>
+#include <time.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "exports.h"
+#include "ReturnCode.h"
+#include "Logger.h"
+#include "MutexImpl.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+MutexImpl::MutexImpl(pthread_mutex_t* _mutex, bool _loggingAllowed):
+    mutex(_mutex),
+    loggingAllowed(_loggingAllowed)
+{
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+  // Simulate a recursive mutex by keeping track of # lock attempts within the same thread
+  lockCount = 0;
+#endif
+}
+
+MutexImpl* MutexImpl::create(bool loggingAllowed, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_NAME("MutexImpl::create");
+  
+  pthread_mutex_t* mutex = new pthread_mutex_t;
+  if (!mutex)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  int rc;
+  pthread_mutexattr_t attr;
+  rc = pthread_mutexattr_init(&attr);
+  if (rc)
+    delete mutex;
+  switch (rc)
+  {
+    case 0:
+      break;
+    case ENOMEM:
+    {
+      const char* message = "pthread_mutexattr_init(): Insufficient memory exists to initialize "
+                      "the mutex attributes object\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+    default:
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"pthread_mutexattr_init(): unknown error (%d)\n", rc);
+      }
+      else
+      {
+        fprintf(stderr, "pthread_mutexattr_init(): unknown error (%d)\n", rc);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+  }
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+#ifdef ANDROID
+  rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
+#else
+  rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
+#endif
+#else
+  rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+#endif
+  if (rc)
+  {
+    pthread_mutexattr_destroy(&attr);
+    delete mutex;
+  }
+  switch (rc)
+  {
+    case 0:
+      break;
+    case EINVAL:
+    {
+      const char* message = "pthread_mutexattr_settype(): The value type is invalid or the "
+                      "value specified by attr is invalid\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+    default:
+    {
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"pthread_mutexattr_settype(): unknown error (%d)\n", rc);
+      }
+      else
+      {
+        fprintf(stderr, "pthread_mutexattr_settype(): unknown error (%d)\n", rc);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+  }
+  rc = pthread_mutex_init(mutex, &attr);
+  if (rc)
+  {
+    pthread_mutexattr_destroy(&attr);
+    delete mutex;
+  }
+  switch (rc)
+  {
+    case 0:
+      break;
+    case EAGAIN:
+    {
+      const char* message = "pthread_mutex_init(): The system lacked the necessary resources "
+                      "(other than memory) to initialize another mutex\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      return 0;
+    }
+    case ENOMEM:
+    {
+      const char* message = "pthread_mutex_init(): Insufficient memory exists to initialize the "
+                      "mutex\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      return 0;
+    }
+    case EPERM:
+    {
+      const char* message = "pthread_mutex_init(): The caller does not have the privilege to "
+                      "perform the operation\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+    case EBUSY:
+    {
+      const char* message = "pthread_mutex_init(): The implementation has detected an attempt to "
+                      "re-initialize the object referenced by mutex, a previously initialized, but not "
+                      "yet destroyed, mutex\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+    case EINVAL:
+    {
+      const char* message = "pthread_mutex_init(): The value specified by attr is invalid\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+    default:
+    {
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"pthread_mutex_init(): unknown error (%d)\n", rc);
+      }
+      else
+      {
+        fprintf(stderr, "pthread_mutex_init(): unknown error (%d)\n", rc);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+  }
+  
+  rc = pthread_mutexattr_destroy(&attr);
+  if (rc)
+    delete mutex;
+  switch (rc)
+  {
+    case 0:
+      break;
+    case EINVAL:
+    {
+      const char* message = "pthread_attr_destroy(): attr had an invalid value\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+    default:
+    {
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"pthread_attr_destroy(): unknown error (%d)\n", rc);
+      }
+      else
+      {
+        fprintf(stderr, "pthread_attr_destroy(): unknown error (%d)\n", rc);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return 0;
+    }
+  }
+  MutexImpl* result = new MutexImpl(mutex, loggingAllowed);
+  if (!result)
+  {
+    pthread_mutex_destroy(mutex);
+    delete mutex;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  returnCode = ReturnCode::SUCCESS;
+  return result;
+}
+
+MutexImpl::~MutexImpl()
+{
+  UAPI_FN_NAME("MutexImpl::~MutexImpl");
+  
+  int rc = pthread_mutex_destroy(mutex);
+  switch (rc)
+  {
+    case 0:
+      break;
+    case EBUSY:
+    {
+      const char* message = "The implementation has detected an attempt to destroy the object "
+                      "referenced by mutex while it is locked or referenced (for example, while being "
+                      "used in a pthread_cond_wait() or pthread_cond_timedwait()) by another thread\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      break;
+    }
+    case EINVAL:
+    {
+      const char* message = "pthread_mutex_destroy(): The value specified by mutex is invalid\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      break;
+    }
+    default:
+    {
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"pthread_mutex_destroy(): unknown error (%d)\n", rc);
+      }
+      else
+      {
+        fprintf(stderr, "pthread_mutex_destroy(): unknown error (%d)\n", rc);
+      }
+      break;
+    }
+  }
+  delete mutex;
+}
+
+void MutexImpl::lockImpl(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_NAME("MutexImpl::lockImpl");
+  
+  int rc = pthread_mutex_lock(mutex);
+  switch (rc)
+  {
+    case 0:
+      returnCode = ReturnCode::SUCCESS;
+      return;
+    case EINVAL:
+    {
+      const char* message = "pthread_mutex_lock(): The mutex was created with the protocol "
+                      "attribute having the value PTHREAD_PRIO_PROTECT and the calling thread's "
+                      "priority is higher than the mutex's current priority ceiling.\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::INVALID_STATE;
+      return;
+    }
+    case EAGAIN:
+    {
+      const char* message = "pthread_mutex_lock(): The mutex could not be acquired because the "
+                      "maximum number of recursive locks for mutex has been exceeded\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::INVALID_STATE;
+      return;
+    }
+    case EDEADLK:
+    {
+      const char* message = "pthread_mutex_lock(): The current thread already owns the mutex\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::INVALID_STATE;
+      return;
+    }
+    default:
+    {
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"pthread_mutex_lock(): unknown error (%d)\n", rc);
+      }
+      else
+      {
+        fprintf(stderr, "pthread_mutex_lock(): unknown error (%d)\n", rc);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return;
+    }
+  }
+}
+
+void MutexImpl::lock(ReturnCode::Type& returnCode)
+{
+  
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+  UAPI_FN_NAME("MutexImpl::lock");
+
+  // Determine if lock will succeed, but don't block if it won't.
+  tryLock(returnCode);
+  switch (returnCode)
+  {
+    case ReturnCode::SUCCESS:
+      postLock(returnCode);
+      if (returnCode)
+        return;
+      break;
+    case ReturnCode::ALREADY_LOCKED:
+      // The mutex is already locked
+      if (lockCount > 0 && pthread_equal(threadId, pthread_self()))
+      {
+        // The current thread owns the mutex so increment the number
+        // of times it locked over it.
+        if (lockCount == UINT8_MAX)
+        {
+          returnCode = ReturnCode::OVERFLOW_ERROR;
+          const char* message = "MutexImpl::lockCount overflowed";
+          if (loggingAllowed)
+          {
+            UAPI_ERROR(fn,message);
+          }
+          else
+          {
+            fprintf(stderr, message);
+          }
+          return;
+        }
+        ++lockCount;
+      }
+      else
+      {
+        // The current thread does not own the mutex, so we lock over it
+        // knowing that it will block.
+        lockImpl(returnCode);
+        if (returnCode)
+          return;
+        postLock(returnCode);
+        if (returnCode)
+          return;
+      }
+      break;
+    default:
+      return;
+  }
+#else
+  lockImpl(returnCode);
+  if (returnCode)
+    return;
+#endif
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void MutexImpl::unlockImpl(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_NAME("MutexImpl::unlockImpl");
+  
+  int rc = pthread_mutex_unlock(mutex);
+  switch (rc)
+  {
+    case 0:
+      returnCode = ReturnCode::SUCCESS;
+      return;
+    case EINVAL:
+    {
+      const char* message = "pthread_mutex_unlock(): The value specified "
+                      "by mutex does not refer to an initialized mutex object\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return;
+    }
+    case EAGAIN:
+    {
+      const char* message = "pthread_mutex_unlock(): The mutex could not "
+                      "be acquired because the maximum number of recursive locks "
+                      "for mutex has been exceeded\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return;
+    }
+    case EPERM:
+    {
+      const char* message = "pthread_mutex_unlock(): The current thread does "
+                      "not own the mutex\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::INVALID_STATE;
+      return;
+    }
+    default:
+    {
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"pthread_mutex_unlock(): unknown error (%d)\n", rc);
+      }
+      else
+      {
+        fprintf(stderr, "pthread_mutex_unlock(): unknown error (%d)\n", rc);
+      }
+      returnCode = ReturnCode::THREAD_ERROR;
+      return;
+    }
+  }
+}
+
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+void MutexImpl::postLock(ReturnCode::Type& returnCode)
+{
+  // Take ownership of the mutex
+  threadId = pthread_self();
+  lockCount = 1;
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void MutexImpl::preUnlock(ReturnCode::Type& returnCode)
+{
+  if (lockCount > 0 && pthread_equal(threadId, pthread_self()))
+  {
+    // Unlocking the mutex from the same thread that locked it.
+    if (lockCount > 0)
+      --lockCount;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+#endif
+
+void MutexImpl::unlock(ReturnCode::Type& returnCode)
+{
+  
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+  preUnlock(returnCode);
+  if (returnCode)
+    return;
+  if (lockCount == 0)
+  {
+    // No more nested locks, so the mutex can finally be unlocked.
+    unlockImpl(returnCode);
+    if (returnCode)
+      return;
+  }
+#else
+  unlockImpl(returnCode);
+  if (returnCode)
+    return;
+#endif
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void MutexImpl::tryLock(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_NAME("MutexImpl::tryLock");
+  
+  int rc = pthread_mutex_trylock(mutex);
+  switch (rc)
+  {
+    case 0:
+    {
+#ifdef USE_CUSTOM_RECURSIVE_MUTEX
+      postLock(returnCode);
+      if (returnCode)
+        return;
+#endif
+      returnCode = ReturnCode::SUCCESS;
+      return;
+    }
+    case EINVAL:
+    {
+      const char* message = "pthread_mutex_trylock(): The mutex was created with the protocol "
+                      "attribute having the value PTHREAD_PRIO_PROTECT and the calling thread's "
+                      "priority is higher than the mutex's current priority ceiling.\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::INVALID_STATE;
+      return;
+    }
+    case EBUSY:
+    {
+      const char* message = "pthread_mutex_trylock(): The mutex could not be acquired because "
+                      "it was already locked\n";
+      if (loggingAllowed)
+      {
+        UAPI_INFO(fn,message);
+      }
+      returnCode = ReturnCode::ALREADY_LOCKED;
+      return;
+    }
+    case EAGAIN:
+    {
+      const char* message = "pthread_mutex_trylock(): The mutex could not be acquired because the "
+                      "maximum number of recursive locks for mutex has been exceeded\n";
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,message);
+      }
+      else
+      {
+        fprintf(stderr, message);
+      }
+      returnCode = ReturnCode::INVALID_STATE;
+      return;
+    }
+    default:
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"pthread_mutex_trylock(): unknown error (%d)\n", rc);
+      }
+      else
+      {
+        fprintf(stderr, "pthread_mutex_trylock(): unknown error (%d)\n", rc);
+      }
+      return;
+  }
+}
+
+bool MutexImpl::isLoggingAllowed() const
+{
+  return loggingAllowed;
+}
diff --git a/uapi/cpp/utilities/source/Queue.cpp b/uapi/cpp/utilities/source/Queue.cpp
new file mode 100644
index 0000000..d495ca2
--- /dev/null
+++ b/uapi/cpp/utilities/source/Queue.cpp
@@ -0,0 +1,168 @@
+/*---------------------------------------------------------------------------*
+ *  Queue.cpp                                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "Queue.h"
+#include <stdio.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+SinglyLinkedNode::SinglyLinkedNode(void* _data):
+    next(0), data(_data)
+{}
+
+bool Queue::empty() const
+{
+  return head->next == 0;
+}
+
+UINT32 Queue::size() const
+{
+  return queueSize;
+}
+
+SinglyLinkedNode* Queue::begin() const
+{
+  return head;
+}
+
+SinglyLinkedNode* Queue::end() const
+{
+  return 0;
+}
+
+FwdIterator::FwdIterator(SinglyLinkedNode* _first, SinglyLinkedNode* _last):
+    currentNode(_first), lastNode(_last)
+{}
+
+SinglyLinkedNode* FwdIterator::current()
+{
+  return currentNode;
+}
+
+
+FwdIterator::~FwdIterator()
+{}
+
+bool FwdIterator::hasNext()
+{
+  return currentNode == 0 ? false : (currentNode->next != lastNode);
+}
+
+void* FwdIterator::next()
+{
+  void* result = currentNode->next->data;
+  currentNode = currentNode->next;
+  return result;
+}
+
+void FwdIterator::reset(SinglyLinkedNode* first, SinglyLinkedNode* last)
+{
+  currentNode = first;
+  lastNode = last;
+}
+
+/////////////////////////////////////////////////////
+Queue::Queue():
+    queueSize(0)
+{
+  head = new SinglyLinkedNode(0);
+  tail = 0;
+  head->next = tail;
+}
+
+Queue::~Queue()
+{
+  clear();
+  delete head;
+}
+
+void Queue::clear()
+{
+  while (!empty())
+    pop();
+}
+
+void* Queue::front() const
+{
+  if (empty())
+    return 0;
+  return head->next->data;
+}
+
+void Queue::push(void* data, ReturnCode::Type& returnCode)
+{
+  SinglyLinkedNode* newNode = new SinglyLinkedNode(data);
+  if (newNode == 0)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  if (empty())
+  {
+    head->next = newNode;
+    tail = head->next;
+  }
+  else
+  {
+    tail->next = newNode;
+    tail = tail->next;
+  }
+  ++queueSize;
+  
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void Queue::pop()
+{
+  SinglyLinkedNode* pOld = head->next;
+  head->next = head->next->next;
+  delete pOld;
+  --queueSize;
+}
+
+
+void Queue::remove(void* dataToRemove)
+{
+  SinglyLinkedNode* current = begin();
+  
+  while (current->next != end())
+  {
+    void* item = current->next->data;
+    if (item == dataToRemove)
+    {
+      // found it
+      SinglyLinkedNode* nodeToRemove = current->next;
+      current->next = current->next->next;
+      if (nodeToRemove == tail)
+        tail = current;
+      delete nodeToRemove;
+      --queueSize;
+      break;
+    }
+    current = current->next;
+  }
+}
diff --git a/uapi/cpp/utilities/source/RefCounted.cpp b/uapi/cpp/utilities/source/RefCounted.cpp
new file mode 100644
index 0000000..0a6a007
--- /dev/null
+++ b/uapi/cpp/utilities/source/RefCounted.cpp
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*
+ *  RefCounted.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "RefCounted.h"
+#include "Logger.h"
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      RefCounted::RefCounted(ReturnCode::Type& returnCode):
+          m_nRefCount(1)
+      {
+        init(returnCode);
+      }
+      
+      RefCounted::RefCounted(UINT8 initial_count, ReturnCode::Type& returnCode):
+          m_nRefCount(initial_count)
+      {
+        init(returnCode);
+      }
+      
+      void RefCounted::init(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_NAME("RefCounted::init");
+          
+        m_mutex = Mutex::create(returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Could not create mutex\n");
+          return;
+        }
+        returnCode = ReturnCode::SUCCESS;
+      }
+      
+      RefCounted::~RefCounted()
+      {
+        if (m_mutex)
+          delete m_mutex;
+      }
+      
+      
+      UINT8 RefCounted::addRef(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_NAME("RefCounted::addRef");
+          
+        LockScope ls(m_mutex, returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"failed to create LockScope\n");
+          return m_nRefCount;
+        }
+        returnCode = ReturnCode::SUCCESS;
+        m_nRefCount++;
+        return m_nRefCount;
+      }
+      
+      UINT8 RefCounted::removeRef(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_NAME("RefCounted::removeRef");
+          
+        {
+          LockScope ls(m_mutex, returnCode);
+          if (returnCode != ReturnCode::SUCCESS)
+          {
+            UAPI_ERROR(fn,"failed to create LockScope\n");
+            return m_nRefCount;
+          }
+          returnCode = ReturnCode::SUCCESS;
+          m_nRefCount--;
+          if (m_nRefCount)
+            return m_nRefCount;
+        }
+        delete this;
+        return 0;
+      }
+      
+      UINT8 RefCounted::getCount() const
+      {
+        return m_nRefCount;
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/RefCounter.cpp b/uapi/cpp/utilities/source/RefCounter.cpp
new file mode 100644
index 0000000..e9f4d91
--- /dev/null
+++ b/uapi/cpp/utilities/source/RefCounter.cpp
@@ -0,0 +1,86 @@
+/*---------------------------------------------------------------------------*
+ *  RefCounter.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "RefCounter.h"
+#include "Logger.h"
+#include "Mutex.h"
+#include <stdio.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+RefCounter::RefCounter(void* _object, bool _loggingAllowed, ReturnCode::Type& returnCode):
+    count(1),
+    object(_object),
+    loggingAllowed(_loggingAllowed)
+{
+  returnCode = ReturnCode::SUCCESS;
+}
+
+RefCounter::~RefCounter()
+{
+}
+
+ARRAY_LIMIT RefCounter::increment(ReturnCode::Type& returnCode)
+{
+  if (count < ARRAY_LIMIT_MAX)
+  {
+    returnCode = ReturnCode::SUCCESS;
+    ++count;
+  }
+  else
+    returnCode = ReturnCode::OVERFLOW_ERROR;
+  return count;
+}
+
+ARRAY_LIMIT RefCounter::decrement(ReturnCode::Type& returnCode)
+{
+  returnCode = ReturnCode::SUCCESS;
+  if (count > ARRAY_LIMIT_MIN)
+  {
+    returnCode = ReturnCode::SUCCESS;
+    --count;
+  }
+  else
+    returnCode = ReturnCode::UNDERFLOW_ERROR;
+  return count;
+}
+
+ARRAY_LIMIT RefCounter::getCount() const
+{
+  return count;
+}
+
+void* RefCounter::getObject() const
+{
+  return object;
+}
+
+
+bool RefCounter::isLoggingAllowed() const
+{
+  return loggingAllowed;
+}
diff --git a/uapi/cpp/utilities/source/Runnable.cpp b/uapi/cpp/utilities/source/Runnable.cpp
new file mode 100644
index 0000000..77f80fe
--- /dev/null
+++ b/uapi/cpp/utilities/source/Runnable.cpp
@@ -0,0 +1,509 @@
+/*---------------------------------------------------------------------------*
+ *  Runnable.cpp                                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include <time.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+#if defined(UAPI_LINUX)
+# include <pthread.h>
+# include <sys/errno.h>
+# include <sys/select.h>
+# define THREAD_STACK_SIZE 0x80000
+#elif defined(UAPI_WIN32)
+# include <errno.h>
+# include <process.h>
+# define THREAD_STACK_SIZE 0
+#endif
+
+#include "Runnable.h"
+#include "LoggerImpl.h"
+#include "Mutex.h"
+#include "ConditionVariable.h"
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      void Runnable::getCurrentThreadId(char* threadId, ARRAY_LIMIT size, ReturnCode::Type& returnCode)
+      {
+#if defined(UAPI_WIN32)
+        if (_snprintf(threadId, size, "%08lx", GetCurrentThreadId()) < 0)
+          returnCode = ReturnCode::OVERFLOW_ERROR;
+        else
+          returnCode = ReturnCode::SUCCESS;
+#elif defined(UAPI_LINUX)
+        if (snprintf(threadId, size, "%10lu", pthread_self()) >= size)
+          returnCode = ReturnCode::OVERFLOW_ERROR;
+        else
+          returnCode = ReturnCode::SUCCESS;
+#endif
+      }
+      
+      Runnable::Runnable(Mutex* _mutex):
+          stackSize(THREAD_STACK_SIZE),
+          deleteOnShutdown(false),
+          mutex(_mutex),
+          running(false),
+          used(false)
+      {
+        assert(mutex);
+      }
+      
+      Runnable::~Runnable()
+      {
+        ReturnCode::Type dummy;
+        terminate(dummy);
+        delete mutex;
+      }
+      
+      void Runnable::setStackSize(UINT32 size, ReturnCode::Type& returnCode)
+      {
+        LockScope ls(mutex, returnCode);
+        if (returnCode)
+          return;
+        stackSize = size;
+        returnCode = ReturnCode::SUCCESS;
+      }
+      
+      UINT32 Runnable::getStackSize(ReturnCode::Type& returnCode) const
+      {
+        LockScope ls(mutex, returnCode);
+        if (returnCode)
+          return 0;
+        returnCode = ReturnCode::SUCCESS;
+        return stackSize;
+      }
+      
+      void Runnable::start(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("Runnable::start");
+          
+        // WARNING: Invoke ConditionVariable.wait() while holding more than one lock over
+        // a recursive mutex will result in a deadlock.
+        if (used)
+        {
+          UAPI_ERROR(fn,"INVALID_STATE\n");
+          returnCode = ReturnCode::INVALID_STATE;
+          return;
+        }
+        else if (running)
+        {
+          UAPI_ERROR(fn,"This thread is already running or not joined\n");
+          returnCode = ReturnCode::THREAD_ERROR;
+          return;
+        }
+        
+        pthread_attr_t attr;
+        int rc = pthread_attr_init(&attr);
+        switch (rc)
+        {
+          case 0:
+            break;
+          case ENOMEM:
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            UAPI_WARN(fn,"pthread_attr_init(): Insufficient memory exists to "
+                      "initialize the thread attributes object\n");
+            return;
+          default:
+            UAPI_WARN(fn,"pthread_attr_init(): unknown error (%d)\n", rc);
+            returnCode = ReturnCode::THREAD_ERROR;
+            return;
+        }
+        
+        rc = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+        if (rc)
+          pthread_attr_destroy(&attr);
+        switch (rc)
+        {
+          case 0:
+            break;
+          case EINVAL:
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            UAPI_WARN(fn,"pthread_attr_setdetachstate(): The value of detachstate was not valid\n");
+            return;
+          default:
+            UAPI_WARN(fn,"pthread_attr_setdetachstate(): unknown error (%d)\n", rc);
+            returnCode = ReturnCode::THREAD_ERROR;
+            return;
+        }
+        
+        rc = pthread_attr_setstacksize(&attr, stackSize);
+        if (rc)
+          pthread_attr_destroy(&attr);
+        switch (rc)
+        {
+          case 0:
+            break;
+          case EINTR:
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            UAPI_WARN(fn,"pthread_attr_setstacksize(): The value of stacksize is less "
+                      "than PTHREAD_STACK_MIN or exceeds a system-imposed limit\n");
+            return;
+          default:
+            UAPI_WARN(fn,"pthread_attr_setstacksize(): unknown error (%d)\n", rc);
+            returnCode = ReturnCode::THREAD_ERROR;
+            return;
+        }
+        
+        rc = pthread_create(&thread, &attr, &Runnable::start_routine, (void*) this);
+        switch (rc)
+        {
+          case 0:
+            break;
+          case EAGAIN:
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            UAPI_ERROR(fn,"pthread_create(): The system lacked the necessary resources to "
+                       "create another thread, or the system-imposed limit on the total number of "
+                       "threads in a process PTHREAD_THREADS_MAX would be exceeded\n");
+            return;
+          case EINVAL:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_create(): The value specified by attr is invalid\n");
+            return;
+          case EPERM:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_create(): The caller does not have appropriate permission to "
+                       "set the required scheduling parameters or scheduling policy\n");
+            return;
+          default:
+            UAPI_WARN(fn,"pthread_attr_destroy(): unknown error (%d)\n", rc);
+            returnCode = ReturnCode::THREAD_ERROR;
+            return;
+        }
+        rc = pthread_attr_destroy(&attr);
+        switch (rc)
+        {
+          case 0:
+            break;
+          case ENOMEM:
+            UAPI_WARN(fn,"pthread_attr_destroy(): Insufficient memory exists to initialize "
+                      "the thread attributes object\n");
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return;
+          default:
+            UAPI_WARN(fn,"pthread_attr_destroy(): unknown error (%d)\n", rc);
+            returnCode = ReturnCode::THREAD_ERROR;
+            return;
+        }
+      }
+      
+      
+      void Runnable::join(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("Runnable::join");
+          
+        if (pthread_equal(pthread_self(), thread))
+        {
+          UAPI_ERROR(fn,"Thread tried to join() on itself\n");
+          returnCode = ReturnCode::THREAD_ERROR;
+          return;
+        }
+        
+        void* exitStatus;
+        LockScope ls(mutex, returnCode);
+        if (returnCode)
+        {
+          UAPI_ERROR(fn,"Failed to lock mutex in Runnable::join()\n");
+          return;
+        }
+        if (!running && !used)
+        {
+          // Joining on a Runnable that was never started
+          returnCode = ReturnCode::SUCCESS;
+          return;
+        }
+        ls.cancel(returnCode);
+        if (returnCode)
+        {
+          UAPI_ERROR(fn,"Failed to unlock mutex in Runnable::join()\n");
+          return;
+        }
+        int rc = pthread_join(thread, &exitStatus);
+        switch (rc)
+        {
+          case 0:
+            returnCode = ReturnCode::SUCCESS;
+            return;
+          case EINVAL:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_join(): The implementation has detected that the "
+                       "value specified by thread does not refer to a joinable thread\n");
+            return;
+          case ESRCH:
+            // Thread was already detached
+            UAPI_INFO(fn,"pthread_join(): No thread could be found corresponding to that "
+                      "specified by the given thread ID\n");
+            returnCode = ReturnCode::SUCCESS;
+            return;
+          case EDEADLK:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_join(): A deadlock was detected or the value of thread "
+                       "specifies the calling thread\n");
+            return;
+          default:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_WARN(fn,"pthread_attr_destroy(): unknown error (%d)\n", rc);
+            return;
+        }
+      }
+      
+      void Runnable::setDeleteOnShutdown(bool value, ReturnCode::Type& returnCode)
+      {
+        LockScope ls(mutex, returnCode);
+        if (returnCode)
+          return;
+        returnCode = ReturnCode::SUCCESS;
+        deleteOnShutdown = value;
+      }
+      
+      void* Runnable::start_routine(void* objInstance)
+      {
+        ReturnCode::Type returnCode;
+        UAPI_FN_SCOPE("Runnable::start_routine");
+        Runnable* threadObj = (Runnable*) objInstance;
+        
+        // call the pure virtual method.
+        {
+          LockScope ls(threadObj->mutex, returnCode);
+          if (returnCode)
+          {
+            UAPI_ERROR(fn,"Failed to lock the thread mutex\n");
+            return 0;
+          }
+          threadObj->running = true;
+          threadObj->used = true;
+        }
+        ReturnCode::Type status = threadObj->runThread();
+        {
+          LockScope ls(threadObj->mutex, returnCode);
+          if (returnCode)
+          {
+            UAPI_ERROR(fn,"Failed to lock the thread mutex\n");
+            return 0;
+          }
+          threadObj->running = false;
+          if (returnCode)
+          {
+            UAPI_ERROR(fn,"Failed to lock the thread mutex\n");
+            return 0;
+          }
+          
+          if (threadObj->deleteOnShutdown)
+          {
+            ls.cancel(returnCode);
+            if (returnCode)
+            {
+              UAPI_ERROR(fn,"Failed to unlock the thread mutex\n");
+              return 0;
+            }
+            delete threadObj;
+          }
+        }
+        return (void*) status;
+      }
+      
+      bool Runnable::isRunning(ReturnCode::Type& returnCode)
+      {
+        LockScope ls(mutex, returnCode);
+        if (returnCode)
+          return false;
+        return running;
+      }
+      
+      void Runnable::terminate(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("Runnable::terminate");
+          
+        bool running = isRunning(returnCode);
+        if (returnCode)
+          return;
+        if (running)
+        {
+#if defined(ANDROID)
+          // do this since as of 10/1/2007 pthread_cancel() and pthread_detach() are not supported
+          join(returnCode);
+          return;
+#else
+          // issue a cancel message to thread
+          int rc = pthread_cancel(thread);
+          switch (rc)
+          {
+            case 0:
+              break;
+            case ESRCH:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_cancel(): No thread could be found corresponding to that specified by the given thread ID\n");
+              return;
+            default:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_cancel(): Unknown error (%d)\n", rc);
+              return;
+          }
+          rc = pthread_detach(thread);
+          switch (rc)
+          {
+            case EINVAL:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_detach(): The implementation has detected that the value specified by thread does not refer to a joinable thread\n");
+              return;
+            case ESRCH:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_detach(): No thread could be found corresponding to that specified by the given thread ID\n");
+              return;
+            default:
+              returnCode = ReturnCode::THREAD_ERROR;
+              UAPI_ERROR(fn,"pthread_detach(): Unknown error (%d)\n", rc);
+              return;
+          }
+#endif
+        }
+        else
+          returnCode = ReturnCode::SUCCESS;
+      }
+      
+      static const int UAPI_THREAD_PRIORITY_MIN = 127 / 4;
+      static const int UAPI_THREAD_PRIORITY_NORM = 127 / 2;
+      static const int UAPI_THREAD_PRIORITY_HIGH = (127 * 9) / 16;
+      static const int UAPI_THREAD_PRIORITY_HIGHER = (127 * 10) / 16;
+      static const int UAPI_THREAD_PRIORITY_MAX = (127 * 3) / 4;
+      
+      void Runnable::setPriority(const ThreadPriority _priority, ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("Runnable::setPriority");
+          
+        LockScope ls(mutex, returnCode);
+        if (returnCode)
+          return;
+        int priority;
+        switch (_priority)
+        {
+          case MIN_THR_PRIORITY:
+            priority =  UAPI_THREAD_PRIORITY_MIN;
+            break;
+          case HIGH_THR_PRIORITY:
+            priority = UAPI_THREAD_PRIORITY_HIGH;
+            break;
+          case HIGHER_THR_PRIORITY:
+            priority = UAPI_THREAD_PRIORITY_HIGHER;
+            break;
+          case MAX_THR_PRIORITY:
+            priority = UAPI_THREAD_PRIORITY_MAX;
+            break;
+          default:
+            returnCode = ReturnCode::ILLEGAL_ARGUMENT;
+            return;
+        }
+        
+        sched_param param;
+        int policy;
+        
+        int rc = pthread_getschedparam(thread, &policy, &param);
+        switch (rc)
+        {
+          case 0:
+            break;
+          case ENOSYS:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_getschedparam(): The option _POSIX_THREAD_PRIORITY_SCHEDULING "
+                       "is not defined and the implementation does not support the function\n");
+            return;
+          case ESRCH:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_getschedparam(): The value specified by thread does "
+                       "not refer to a existing thread.\n");
+            return;
+          default:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_getschedparam(): unknown error (%d)\n", rc);
+            return;
+        }
+        param.sched_priority = priority;
+        rc = pthread_setschedparam(thread, policy, &param);
+        switch (rc)
+        {
+          case 0:
+            break;
+          case ENOSYS:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_setschedparam(): The option _POSIX_THREAD_PRIORITY_SCHEDULING "
+                       "is not defined and the implementation does not support the function\n");
+            return;
+          case EINVAL:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_setschedparam(): The value specified by policy or one of "
+                       "the scheduling parameters associated with the scheduling policy policy is invalid\n");
+            return;
+#if defined(ENOTSUP)
+          case ENOTSUP:
+            returnCode = ReturnCode::NOT_SUPPORTED;
+            UAPI_ERROR(fn,"pthread_setschedparam(): An attempt was made to set the policy or "
+                       "scheduling parameters to an unsupported value\n");
+            return;
+#endif
+          case EPERM:
+            returnCode = ReturnCode::INVALID_STATE;
+            UAPI_ERROR(fn,"pthread_setschedparam(): The caller does not have the appropriate "
+                       "permission to set either the scheduling parameters or the scheduling policy "
+                       "of the specified thread. Or, the implementation does not allow the "
+                       "application to modify one of the parameters to the value specified\n");
+            return;
+          case ESRCH:
+            returnCode = ReturnCode::INVALID_STATE;
+            UAPI_ERROR(fn,"pthread_setschedparam(): The value specified by thread does not "
+                       "refer to a existing thread\n");
+            return;
+          default:
+            returnCode = ReturnCode::THREAD_ERROR;
+            UAPI_ERROR(fn,"pthread_setschedparam(): unknown error (%d)\n", rc);
+            return;
+        }
+        returnCode = ReturnCode::SUCCESS;
+      }
+      
+      void Runnable::sleep(UINT32 milliseconds)
+      {
+        if (milliseconds <= 0)
+          return;
+#if defined(UAPI_LINUX)
+        timeval sleep_tv;
+        
+        sleep_tv.tv_sec = milliseconds / 1000;                 // seconds
+        sleep_tv.tv_usec = 1000 * (milliseconds % 1000);       // microseconds
+        select(0, 0, 0, 0, &sleep_tv);
+#else
+        ::Sleep(milliseconds);
+#endif
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/SmartProxy.cpp b/uapi/cpp/utilities/source/SmartProxy.cpp
new file mode 100644
index 0000000..b4fde05
--- /dev/null
+++ b/uapi/cpp/utilities/source/SmartProxy.cpp
@@ -0,0 +1,355 @@
+/*---------------------------------------------------------------------------*
+ *  SmartProxy.cpp                                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include "SmartProxy.h"
+#include "RefCounter.h"
+#include "ReturnCode.h"
+#include "Logger.h"
+#include "System.h"
+#include "Mutex.h"
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+SmartProxy::Root::Root(void* object, bool _loggingAllowed, const char* _name, ReturnCode::Type& returnCode):
+    RefCounter(object, _loggingAllowed, returnCode),
+    registeredWithSystem(false)
+{
+  UAPI_FN_NAME("SmartProxy::Root::Root");
+  
+  name = new char[strlen(_name)+1];
+  strcpy(name, _name);
+  
+  mutex = Mutex::create(loggingAllowed, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    const char* message = "Could not create mutex\n";
+    if (loggingAllowed)
+    {
+      UAPI_ERROR(fn,message);
+    }
+    else
+    {
+      fprintf(stderr, message);
+    }
+    return;
+  }
+}
+
+SmartProxy::Root::~Root()
+{
+  delete[] name;
+  if (mutex)
+    delete mutex;
+}
+
+#ifdef UAPI_MT
+
+Mutex* SmartProxy::Root::getMutex() const
+{
+  return mutex;
+}
+
+#endif
+
+SmartProxy::SmartProxy(void* object, const char* name)
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  root = new Root(object, true, name, returnCode);
+  if (!root)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  else if (returnCode)
+  {
+    delete root;
+    root = 0;
+  }
+}
+
+SmartProxy::SmartProxy(void* object, bool loggingAllowed, const char* name)
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  if (!object)
+  {
+    root = 0;
+    return;
+  }
+  root = new Root(object, loggingAllowed, name, returnCode);
+  if (!root)
+    return;
+  else if (returnCode)
+  {
+    delete root;
+    root = 0;
+  }
+}
+
+SmartProxy::SmartProxy():
+    root(0)
+{}
+
+SmartProxy::SmartProxy(Root* _root):
+    root(_root)
+{
+  if (root)
+  {
+    // The following assert ensures we aren't increasing the reference count to an object from
+    // inside its destructor.
+    assert(root->getCount() > 0);
+    
+    ReturnCode::Type returnCode;
+    
+    //we want to protect the call to increment
+    LockScope ls(root->getMutex(), returnCode);
+    if (returnCode)
+    {
+      fprintf(stderr, "SmartProxy::SmartProxy - failed to create LockScope\n");
+      root = 0;
+      return;
+    }
+    
+    root->increment(returnCode);
+    if (returnCode)
+      root = 0;
+  }
+}
+
+SmartProxy::~SmartProxy()
+{
+}
+
+SmartProxy::operator SmartProxy::BoolConversion() const
+{
+  if (root)
+    return reinterpret_cast<BoolConversion>(1);
+  else
+    return 0;
+}
+
+SmartProxy& SmartProxy::operator=(const SmartProxy & other)
+{
+  if (&other == this)
+    return *this;
+    
+  Root* oldRoot = root;
+  ReturnCode::Type returnCode;
+  if (oldRoot)
+  {
+  
+    LockScope ls(oldRoot->getMutex(), returnCode);
+    assert(!returnCode);
+    if (returnCode)
+    {
+      fprintf(stderr, "SmartProxy::operator= - failed to create LockScope oldRoot\n");
+      root = 0;
+      return *this;
+    }
+    
+    ARRAY_LIMIT oldCount = oldRoot->decrement(returnCode);
+    assert(!returnCode);
+    if (returnCode)
+    {
+      root = 0;
+      return *this;
+    }
+    if (oldCount == 0)
+    {
+      deleteObject(oldRoot->getObject());
+      ls.cancel(returnCode); //must unlock before we delete the object that contains the lock.
+      assert(!returnCode);
+      if (returnCode)
+      {
+        root = 0;
+        return *this;
+      }
+      delete oldRoot;
+    }
+  }
+  this->root = other.root;
+  Root* newRoot = root;
+  if (newRoot)
+  {
+  
+    //we want to protect the call to increment
+    LockScope ls(newRoot->getMutex(), returnCode);
+    assert(!returnCode);
+    if (returnCode)
+    {
+      fprintf(stderr, "SmartProxy::operator= - failed to create LockScope newRoot\n");
+      root = 0;
+      return *this;
+    }
+    
+    newRoot->increment(returnCode);
+    assert(!returnCode);
+    if (returnCode)
+    {
+      root = 0;
+      return *this;
+    }
+  }
+  return *this;
+}
+
+SmartProxy::SmartProxy(const SmartProxy& other)
+{
+  root = other.getRoot();
+  if (!root)
+    return;
+  ReturnCode::Type returnCode;
+  
+  //we want to protect the call to increment
+  LockScope ls(root->getMutex(), returnCode);
+  if (returnCode)
+  {
+    fprintf(stderr, "SmartProxy::SmartProxy2 - failed to create LockScope\n");
+    root = 0;
+    return;
+  }
+  
+  root->increment(returnCode);
+  if (returnCode)
+    root = 0;
+}
+
+bool SmartProxy::operator!() const
+{
+  return !root;
+}
+
+SmartProxy::Root* SmartProxy::getRoot() const
+{
+  return root;
+}
+
+void* SmartProxy::getObject() const
+{
+  UAPI_FN_NAME("SmartProxy::getObject");
+
+  if ( root == 0 )
+    UAPI_ERROR( fn, "NULL Object Crash Iminent");
+  return root->getObject();
+}
+
+void SmartProxy::onDestruction()
+{
+  ReturnCode::Type returnCode;
+
+  UAPI_FN_NAME("SmartProxy::onDestruction");
+
+  if (!root)
+  {
+    return;
+  }
+  bool loggingAllowed = root->isLoggingAllowed();
+
+  if (loggingAllowed)
+  {
+    UAPI_TRACE(fn,"Root %s (%p), Count %d\n", root->name, root, root->getCount());
+  }
+  else
+  {
+    // Omit trace logging
+    // fprintf(stderr, "Root %p, Count %d\n", root, root->getCount());
+  }
+  
+  //protect the call to root->decrement
+  LockScope ls(root->getMutex(), returnCode);
+  if (returnCode)
+  {
+    if (loggingAllowed)
+    {
+      UAPI_ERROR(fn,"SmartProxy::onDestruction(): cannot lock root->getMutex\n");
+    }
+    else
+    {
+      fprintf(stderr, "SmartProxy::onDestruction(): cannot lock root->getMutex\n");
+    }
+    return;
+  }
+  
+  ARRAY_LIMIT count = root->decrement(returnCode);
+  if (returnCode)
+  {
+    return;
+  }
+  if (count == 0)
+  {
+    ls.cancel(returnCode);
+    if (returnCode)
+    {
+      if (loggingAllowed)
+      {
+        UAPI_ERROR(fn,"SmartProxy::onDestruction(): failed to cancel ls\n");
+      }
+      else
+      {
+        fprintf(stderr, "SmartProxy::onDestruction(): failed to cancel ls\n");
+      }
+      return;
+    }
+    if (root->registeredWithSystem)
+    {
+      //This Root was added with the System class. Now that we are about the
+      //delete the object, it is time to remove it from System.
+      if (loggingAllowed)
+        UAPI_INFO(fn,"Remove object from System before deleting it\n");
+        
+      System* system = System::getInstance(returnCode);
+      if (returnCode)
+      {
+        if (loggingAllowed)
+        {
+          UAPI_ERROR(fn,"SmartProxy::onDestruction(): System::getInstance() "
+                     "failed: %s\n", ReturnCode::toString(returnCode));
+        }
+        else
+        {
+          fprintf(stderr, "SmartProxy::onDestruction(): System::getInstance() "
+                  "failed: %s\n", ReturnCode::toString(returnCode));
+        }
+        return;
+      }
+      system->remove(root);
+    }
+    deleteObject(root->getObject());
+    delete root;
+  }
+  // Prevent superclass destructors from invoking this again
+  root = 0;
+}
+
+// SmartProxy shouldn't be instantiable but this enables us to define Proxy::Proxy(SuperProxy)
+// in the macro
+void SmartProxy::deleteObject(void*)
+{
+  assert(false);
+}
diff --git a/uapi/cpp/utilities/source/System.cpp b/uapi/cpp/utilities/source/System.cpp
new file mode 100644
index 0000000..655a6e5
--- /dev/null
+++ b/uapi/cpp/utilities/source/System.cpp
@@ -0,0 +1,450 @@
+/*---------------------------------------------------------------------------*
+ *  System.cpp                                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#include "System.h"
+#include "Singleton.h"
+#include "Logger.h"
+#include "Queue.h"
+#include "Mutex.h"
+#include "ConditionVariable.h"
+#include "LibraryLoader.h"
+#include "JNIThreadListener.h"
+#include "WorkerQueueFactory.h"
+#include "EmbeddedRecognizerImpl.h"
+#include "LoggerImpl.h"
+#include "WorkerQueueFactoryImpl.h"
+
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <signal.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::impl;
+using namespace android::speech::recognition::utilities;
+
+
+Mutex* System::stateMutex = 0;
+System* System::instance = 0;
+System::ComponentInitializer System::componentInitializer;
+bool System::signalRaised = false;
+
+/**
+ * This code is needed to make sure System::dispose doesn't do anything when ^C
+ * is pressed. We were seeing this problem:
+ *  1) User would run a java application, e.g. robustness2.java
+ *  2) User would press ^C
+ *  3) The process would exit. 
+ *  4) The Runtime.getRuntime().addShutdownHook in System.java would invoke
+ *  System::dispose()
+ *  5) System::dispose would hang while trying to join the threads.
+ *
+ *  This was observed on Windows. It looks like we are not allowed to join a
+ *  thread after ^C was pressed. 
+ */
+void System::signalHandler(int sig)
+{
+  UAPI_FN_NAME("signalHandler");
+
+  UAPI_WARN(fn, "Signal %d was received\n", sig);
+
+
+  //set the flag that System::dispose will check to know if a signal was
+  //raised. 
+  signalRaised = true;
+
+  //propagate the signal.
+  signal(SIGINT ,NULL);
+  raise(SIGINT);
+}
+
+
+System::ComponentInitializer::ComponentInitializer()
+{
+  signal(SIGINT ,System::signalHandler);
+
+  stateMutex = Mutex::create(false, returnCode);
+  if (returnCode)
+  {
+    fprintf(stderr, "Could not create System::stateMutex\n");
+    return;
+  }
+}
+
+System::ComponentInitializer::~ComponentInitializer()
+{
+  delete stateMutex;
+  returnCode = ReturnCode::UNKNOWN;
+}
+
+
+System* System::getInstance(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("System.getInstance");
+  if (componentInitializer.returnCode)
+  {
+    returnCode = componentInitializer.returnCode;
+    return 0;
+  }
+  
+  LockScope ls(stateMutex, returnCode);
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Could not lock stateMutex\n");
+    return 0;
+  }
+  if (instance == 0)
+  {
+    Queue* singletons = new Queue();
+    if (singletons == 0)
+    {
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      return 0;
+    }
+    
+    Mutex* singletonsMutex = Mutex::create(returnCode);
+    if (returnCode)
+    {
+      UAPI_ERROR(fn,"Could not create the mutex\n");
+      delete singletons;
+      returnCode = returnCode;
+      return 0;
+    }
+    
+    instance = new System(singletons, singletonsMutex);
+    if (instance == 0)
+    {
+      UAPI_ERROR(fn,"Could not create the System instance\n");
+      delete singletons;
+      delete singletonsMutex;
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      return 0;
+    }
+  }
+  returnCode = ReturnCode::SUCCESS;
+  return (System*) instance;
+}
+
+System::System(Queue* _singletons, Mutex* _singletonsMutex):
+    singletons(_singletons),
+    singletonsMutex(_singletonsMutex),
+    disposed(false),
+    shutdownRequested(false)
+{}
+
+System::~System()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("System::~System");
+    
+  if (!disposed)
+    dispose(returnCode);
+    
+  delete singletonsMutex;
+  instance = 0;
+}
+
+void System::unloadSharedLibraries(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("System::unloadSharedLibraries");
+    
+  if (EmbeddedRecognizerImpl::srecLoader)
+  {
+    ReturnCode::Type rc;
+    EmbeddedRecognizerImpl::srecLoader->close(rc);
+    if (rc != ReturnCode::SUCCESS)
+    {
+      UAPI_WARN(fn,"Failed to close library for EmbeddedRecognizerImpl\n");
+      return;
+    }
+    delete EmbeddedRecognizerImpl::srecLoader;
+    EmbeddedRecognizerImpl::srecLoader = 0;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void System::add(Singleton* singleton, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("System::add");
+    
+  {
+    LockScope ls(stateMutex, returnCode);
+    if (returnCode)
+    {
+      UAPI_ERROR(fn,"Could not lock stateMutex\n");
+      return;
+    }
+    if (shutdownRequested)
+    {
+      returnCode = ReturnCode::INVALID_STATE;
+      UAPI_ERROR(fn,"Cannot create singletons while System is shutting down\n");
+      return;
+    }
+  }
+  
+  LockScope ls(singletonsMutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to lock singletonsMutex\n");
+    return;
+  }
+  UAPI_TRACE(fn,"adding singleton %p SmartProxy::Root %p\n", singleton, singleton->getRoot());
+  
+  SingletonInfo* singletonInfo = new SingletonInfo;
+  if (singletonInfo == 0)
+  {
+    UAPI_ERROR(fn,"Failed to lock mutex\n");
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  
+  singletonInfo->isWaiting = false;
+  singletonInfo->singleton = singleton;
+  
+  singletonInfo->condVar = ConditionVariable::create(singletonsMutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create condition variable\n");
+    delete singletonInfo;
+    return;
+  }
+  
+  //UAPI_TRACE(fn,"adding SmartProxy::Root=%p (before): begin: %p, end: %p, queueSize: %lu\n", singletonInfo->singleton->getRoot(), _singletons->begin(), _singletons->end(), _singletons->size());
+  singletons->push(singletonInfo, returnCode);
+  //UAPI_TRACE(fn,"adding SmartProxy::Root=%p (after) : begin: %p, end: %p, queueSize: %lu\n", singletonInfo->singleton->getRoot(), _singletons->begin(), _singletons->end(), _singletons->size());
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Failed to add singleton info to the queue.\n");
+    delete singletonInfo->condVar;
+    delete singletonInfo;
+    return;
+  }
+  
+  //tell the Root of this singleton that it is now registered with System.
+  singleton->getRoot()->registeredWithSystem = true;
+  
+  returnCode = ReturnCode::SUCCESS;
+  
+  UAPI_TRACE(fn,"adding singleton %p SmartProxy::Root %p: success\n", singleton, singleton->getRoot());
+}
+
+void System::remove(SmartProxy::Root* root)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("System::remove");
+    
+  //Lock the System mutex to protect the queue of singleton(s)
+  LockScope ls(singletonsMutex, returnCode);
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Failed to lock singletonsMutex\n");
+    return;
+  }
+  
+  UAPI_TRACE(fn,"removing SmartProxy::Root %p\n", root);
+  
+  //find which entry in the queue contains the root.
+  FwdIterator it(singletons->begin(), singletons->end());
+  //UAPI_TRACE(fn,"_singletons: begin=%p, end=%p, queueSize=%lu\n", _singletons->begin(), _singletons->end(), _singletons->size());
+  while (it.hasNext())
+  {
+    SingletonInfo* singletonInfo = (SingletonInfo*) it.next();
+    
+    //UAPI_TRACE(fn,"checking singleton->getRoot() %p\n", singletonInfo->singleton->getRoot());
+    if (singletonInfo->singleton->getRoot() == root)
+    {
+      //we have a match.
+      
+      //Acquire the condition variable mutex. We want to check if
+      //System::dispose was called and if it is waiting on the condition
+      //variable.
+      
+      //check if condVar->wait() was called.
+      if (singletonInfo->isWaiting)
+      {
+        UAPI_INFO(fn,"signaling SmartProxy::Root %p\n", root);
+        
+        //System::Dispose is waiting on us. Signal it, System::dispose() will
+        //take care of the cleanup.
+        singletonInfo->condVar->signal(returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Cannot signal ConditionVariableLockScope\n");
+          return;
+        }
+        return;
+      }
+      else
+      {
+        UAPI_INFO(fn,"inactive SmartProxy::Root %p\n", root);
+        
+        //System::dispose is not waiting. We can simply remove that entry from
+        //the queue.
+        //UAPI_TRACE(fn,"removing SmartProxy::Root=%p (before): begin=%p, end=%p, queueSize=%lu\n", singletonInfo->singleton->getRoot(), _singletons->begin(), _singletons->end(), _singletons->size());
+        singletons->remove(singletonInfo);
+        //UAPI_TRACE(fn,"removing SmartProxy::Root=%p (after) : begin=%p, end=%p, queueSize=%lu\n", singletonInfo->singleton->getRoot(), _singletons->begin(), _singletons->end(), _singletons->size());
+        delete singletonInfo->condVar;
+        delete singletonInfo;
+        return;
+      }
+    }
+  }//while
+  
+  //we should never be here!
+  UAPI_ERROR(fn,"Root %p was not found in the queue\n", root);
+  assert(false);
+}
+
+void System::dispose(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("System::dispose");
+ 
+  //check if ^C was pressed.
+  if( signalRaised )
+  {
+    disposed = true;
+    UAPI_INFO(fn,"A signal was raised, not joining the threads\n");
+    return;
+  }
+
+  {
+    LockScope ls(stateMutex, returnCode);
+    if (returnCode)
+    {
+      UAPI_ERROR(fn,"Could not lock stateMutex\n");
+      return;
+    }
+    if (shutdownRequested)
+    {
+      UAPI_ERROR(fn,"System is already being disposed\n");
+      return;
+    }
+    shutdownRequested = true;
+  }
+  
+  LockScope ls(singletonsMutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to lock mutex\n");
+    return;
+  }
+  
+  while (!singletons->empty())
+  {
+    SingletonInfo* singletonInfo = (SingletonInfo*) singletons->front();
+    
+    //lock the condition variable lock scope.
+    UAPI_INFO(fn,"before shutting down SmartProxy::Root %p\n",
+              singletonInfo->singleton->getRoot());
+              
+    // Signal the singleton to shutdown and wait for remove() to get invoked
+    SmartProxy::Root* root = singletonInfo->singleton->getRoot();
+    
+    {
+      // protect the call to getCount()
+      LockScope rootls(root->getMutex(), returnCode);
+      if (returnCode)
+      {
+        UAPI_ERROR(fn,"Failed to increment singleton root\n");
+        return;
+      }
+      
+      if (root->getCount() == 0)
+      {
+        // We're too late, the proxy is already being destroyed by another thread.
+        // SmartProxy::onDestruction() will block on system->remove() until we release singletonsMutex.
+        // in such a case, we don't want to call shutdown.
+      }
+      else
+      {
+        singletonInfo->singleton->shutdown(returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to Shutdown singleton\n");
+          return;
+        }
+      }
+      
+      singletonInfo->isWaiting = true;
+    }
+    
+#ifdef _DEBUG
+    UINT32 delta = UINT32_MAX;
+#else
+    UINT32 delta = 5 * 1000;
+#endif
+    
+    UAPI_INFO(fn,"System::dispose waiting for SmartProxy::Root %p to be removed\n",
+              singletonInfo->singleton->getRoot());
+    singletonInfo->condVar->wait(delta, returnCode);
+    if (returnCode == ReturnCode::TIMEOUT)
+    {
+      UAPI_WARN(fn,"Wait for singleton timed out after %u milliseconds\n", delta);
+      //continue and hope for the best.
+      singletonInfo->isWaiting = false;
+    }
+    else if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed waiting for singleton to get deleted\n");
+      return;
+    }
+    
+    //Because the system mutex was unlock, the content of the queue could have
+    //changed. Here we want to remove from the queue singletonInfo. We have to
+    //find it back because it may no longer be the first item in the queue.
+    
+    singletons->remove(singletonInfo);
+    delete singletonInfo->condVar;
+    delete singletonInfo;
+    
+  }
+  delete singletons;
+
+  // shut down the WorkerQueues
+  WorkerQueueFactory* workerQueueFactory = WorkerQueueFactory::getInstance(returnCode);
+  delete workerQueueFactory;
+  
+  //To make sure everything is clean, we unload the SRec library.
+  
+  
+  /**
+   * NOTE: This cannot be called or it could make the program crash. The
+   * java garbage collector could do the cleanup of the objects after we have
+   * unloaded the Srec shared library. If this happens, we will try to delete
+   * unreferenced memory and we will crash. For now, we have a memory leak when
+   * the program exits.
+   * TODO: fix the exit time memory leak caused by not calling unloadSharedLibraries.
+   */
+  //unloadSharedLibraries(returnCode);
+  //if (returnCode != ReturnCode::SUCCESS)
+  //{
+  //  UAPI_ERROR(fn,"Failed to unloadSharedLibraries\n");
+  //  return;
+  //}
+  
+  disposed = true;
+}
diff --git a/uapi/cpp/utilities/source/Task.cpp b/uapi/cpp/utilities/source/Task.cpp
new file mode 100644
index 0000000..4f55c40
--- /dev/null
+++ b/uapi/cpp/utilities/source/Task.cpp
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------------*
+ *  Task.cpp                                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include "Task.h"
+#include "Logger.h"
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      Task::Task(const char* taskName): m_timeout(0), m_name(taskName)
+      {}
+      
+      Task::Task(UINT32 timeout_msec, const char* taskName):
+          m_timeout(timeout_msec), m_name(taskName)
+      {
+      }
+      
+      Task::~Task()
+      {}
+      
+      UINT32 Task::getTimeout() const
+      {
+        return m_timeout;
+      }
+      
+      ScheduledTask::~ScheduledTask()
+      {}
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/ThreadLocal.cpp b/uapi/cpp/utilities/source/ThreadLocal.cpp
new file mode 100644
index 0000000..54bd364
--- /dev/null
+++ b/uapi/cpp/utilities/source/ThreadLocal.cpp
@@ -0,0 +1,137 @@
+/*---------------------------------------------------------------------------*
+ *  ThreadLocal.cpp                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include "ThreadLocal.h"
+#include <stdio.h>
+#include <assert.h>
+
+
+//
+// NOTE: The Logger API depends on ThreadLocal so it must use printf instead
+//
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        ThreadLocal::ThreadLocal(pthread_key_t _key, void (*_onThreadShutdown)(void*)):
+            key(_key),
+            onThreadShutdown(_onThreadShutdown)
+        {}
+        
+        ThreadLocal::~ThreadLocal()
+        {
+          int rc = pthread_key_delete(key);
+          switch (rc)
+          {
+            case 0:
+              return;
+            case EINVAL:
+              fprintf(stderr, "pthread_key_delete(): The key value is invalid\n");
+              assert(false);
+            default:
+              fprintf(stderr, "pthread_key_delete(): unknown error (%d)\n", rc);
+              assert(false);
+              return;
+          }
+        }
+        
+        ThreadLocal* ThreadLocal::create(void (*onThreadShutdown)(void*), ReturnCode::Type& returnCode)
+        {
+          pthread_key_t key;
+          int rc = pthread_key_create(&key, onThreadShutdown);
+          switch (rc)
+          {
+            case 0:
+              break;
+            case EAGAIN:
+              returnCode = ReturnCode::OUT_OF_MEMORY;
+              fprintf(stderr, "pthread_key_create(): The system lacked the "
+                      "necessary resources to create another thread-specific data key, "
+                      "or the system-imposed limit on the total number of keys per "
+                      "process {PTHREAD_KEYS_MAX} has been exceeded\n");
+              assert(false);
+              return 0;
+            case ENOMEM:
+              returnCode = ReturnCode::OUT_OF_MEMORY;
+              fprintf(stderr, "pthread_key_create(): Insufficient memory exists "
+                      "to create the key\n");
+              assert(false);
+              return 0;
+            default:
+              returnCode = ReturnCode::THREAD_ERROR;
+              fprintf(stderr, "pthread_key_create(): unknown error (%d)\n", rc);
+              assert(false);
+              return 0;
+          }
+          ThreadLocal* result = new ThreadLocal(key, onThreadShutdown);
+          if (!result)
+          {
+            returnCode = ReturnCode::OUT_OF_MEMORY;
+            return 0;
+          }
+          returnCode = ReturnCode::SUCCESS;
+          return result;
+        }
+        
+        void ThreadLocal::set(void* value, ReturnCode::Type& returnCode)
+        {
+          int rc = pthread_setspecific(key, value);
+          switch (rc)
+          {
+            case 0:
+              returnCode = ReturnCode::SUCCESS;
+              return;
+            case ENOMEM:
+              returnCode = ReturnCode::OUT_OF_MEMORY;
+              fprintf(stderr, "pthread_setspecific(): Insufficient memory exists "
+                      "to associate the non-NULL value with the key\n");
+              assert(false);
+              return;
+            case EINVAL:
+              returnCode = ReturnCode::THREAD_ERROR;
+              fprintf(stderr, "pthread_setspecific(): The key value is invalid\n");
+              assert(false);
+              return;
+            default:
+              returnCode = ReturnCode::THREAD_ERROR;
+              fprintf(stderr, "pthread_setspecific(): unknown error (%d)\n", rc);
+              assert(false);
+              return;
+          }
+        }
+        
+        void* ThreadLocal::get(ReturnCode::Type& returnCode)
+        {
+          returnCode = ReturnCode::SUCCESS;
+          return pthread_getspecific(key);
+        }
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/TimeInstant.cpp b/uapi/cpp/utilities/source/TimeInstant.cpp
new file mode 100644
index 0000000..b9b6a85
--- /dev/null
+++ b/uapi/cpp/utilities/source/TimeInstant.cpp
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*
+ *  TimeInstant.cpp                                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <time.h>
+#ifdef UAPI_WIN32
+# include <sys/timeb.h>          /* ftime() */
+#else
+# include <sys/time.h>
+#endif
+
+#include "TimeInstant.h"
+#include "Logger.h"
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      TimeInstant::TimeInstant()
+      {}
+      
+      TimeInstant TimeInstant::now()
+      {
+        TimeInstant result;
+#ifdef UAPI_WIN32
+        struct timeb timebuf;
+        
+        ftime(&timebuf);
+        // timeval.tv_sec uses long whereas timeb.time uses unsigned long
+        result.value.tv_sec = (long) timebuf.time;
+        result.value.tv_usec = timebuf.millitm * 1000;
+#else
+        gettimeofday(&result.value, 0);
+#endif
+        return result;
+      }
+      
+      TimeInstant TimeInstant::plus(UINT32 milliseconds)
+      {
+        timeval result;
+        
+        result.tv_sec = milliseconds / 1000 + value.tv_sec;
+        result.tv_usec = 1000 * (milliseconds % 1000) + value.tv_usec;
+        if (result.tv_usec >= 1000000)
+        {
+          result.tv_usec -= 1000000;
+          result.tv_sec += 1;
+        }
+        TimeInstant instant;
+        instant.value = result;
+        return instant;
+      }
+      
+      INT32 TimeInstant::minus(TimeInstant instant, ReturnCode::Type& returnCode)
+      {
+        // timeval.usec is guaranteed to be less than one million
+        // so timeval.usec / 1000 is guaranteed to be less than one thousand
+        INT32 seconds = value.tv_sec - instant.value.tv_sec;
+        INT32 milliseconds = (value.tv_usec - instant.value.tv_usec) / 1000;
+        INT32 millisecondsInSeconds = milliseconds / 1000;
+        if (seconds + millisecondsInSeconds < (INT32_MIN / 1000))
+        {
+          returnCode = ReturnCode::UNDERFLOW_ERROR;
+          return INT32_MIN;
+        }
+        else if (seconds + millisecondsInSeconds > (INT32_MAX / 1000))
+        {
+          returnCode = ReturnCode::OVERFLOW_ERROR;
+          return INT32_MAX;
+        }
+        
+        returnCode = ReturnCode::SUCCESS;
+        return seconds * 1000 + milliseconds;
+      }
+      
+      timeval TimeInstant::toTimeval()
+      {
+        return value;
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/WorkerQueueFactory.cpp b/uapi/cpp/utilities/source/WorkerQueueFactory.cpp
new file mode 100644
index 0000000..b859398
--- /dev/null
+++ b/uapi/cpp/utilities/source/WorkerQueueFactory.cpp
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*
+ *  WorkerQueueFactory.cpp                                                   *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#ifdef UAPI_WIN32
+// Do not warn on "while(true)"
+#  pragma warning (disable: 4127)
+#endif
+
+#include "WorkerQueueFactory.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace utilities
+      {
+        WorkerQueueFactory::WorkerQueueFactory()
+        {}
+        
+        WorkerQueueFactory::~WorkerQueueFactory()
+        {}
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/WorkerQueueFactoryImpl.cpp b/uapi/cpp/utilities/source/WorkerQueueFactoryImpl.cpp
new file mode 100644
index 0000000..d3c1d3c
--- /dev/null
+++ b/uapi/cpp/utilities/source/WorkerQueueFactoryImpl.cpp
@@ -0,0 +1,210 @@
+/*---------------------------------------------------------------------------*
+ *  WorkerQueueFactoryImpl.cpp                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#ifdef UAPI_WIN32
+// Do not warn on "while(true)"
+#  pragma warning (disable: 4127)
+#endif
+
+#include "WorkerQueueFactoryImpl.h"
+#include "LoggerImpl.h"
+#include "System.h"
+#include "WorkerQueueImpl.h"
+#include "Mutex.h"
+
+#include <stdio.h>
+
+using namespace android::speech::recognition::utilities;
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      WorkerQueueFactoryImpl* WorkerQueueFactoryImpl::instance = 0;
+      Mutex* WorkerQueueFactoryImpl::mutex = 0;
+      WorkerQueueFactoryImpl::ComponentInitializer WorkerQueueFactoryImpl::componentInitializer;
+      
+      WorkerQueueFactoryImpl::ComponentInitializer::ComponentInitializer()
+      {
+        mutex = Mutex::create(false, returnCode);
+        if (returnCode)
+        {
+          fprintf(stderr, "Could not create WorkerQueueFactoryImpl::mutex\n");
+          return;
+        }
+      }
+      
+      WorkerQueueFactoryImpl::ComponentInitializer::~ComponentInitializer()
+      {
+        delete mutex;
+        returnCode = ReturnCode::UNKNOWN;
+      }
+      
+      WorkerQueueFactory* WorkerQueueFactory::getInstance(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("WorkerQueueFactory::getInstance");
+        
+        if (WorkerQueueFactoryImpl::componentInitializer.returnCode)
+        {
+          returnCode = WorkerQueueFactoryImpl::componentInitializer.returnCode;
+          return 0;
+        }
+        
+        //we have to protect the construction of "instance". Make sure we don't have
+        //multiple threads calling getInstance() while "instance" is equal to 0.
+        LockScope lock(WorkerQueueFactoryImpl::mutex, returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to create LockScope of mutex\n");
+          return 0;
+        }
+        
+        //it's now safe to check if instance == 0
+        if (WorkerQueueFactoryImpl::instance == 0)
+        {
+          WorkerQueueFactoryImpl* result = new WorkerQueueFactoryImpl();
+          if (!result)
+            return 0;
+          WorkerQueueFactoryImpl::instance = result;
+        }
+        returnCode = ReturnCode::SUCCESS;
+        return WorkerQueueFactoryImpl::instance;
+      }
+      
+      WorkerQueueFactoryImpl::WorkerQueueFactoryImpl():
+          workerQueueList(),
+          maxNumWorkerQueues(5),
+          indexToReturn(0),
+          jniThreadListener(0)
+      {
+        UAPI_FN_NAME("WorkerQueueFactory::WorkerQueueFactoryImpl");
+        
+        UAPI_TRACE(fn,"this=%p\n", this);
+      }
+      
+      WorkerQueueFactoryImpl::~WorkerQueueFactoryImpl()
+      {
+        ReturnCode::Type returnCode;
+        UAPI_FN_SCOPE("WorkerQueueFactory::~WorkerQueueFactoryImpl");
+
+        UAPI_TRACE(fn,"this=%p\n", this);
+        
+        if (workerQueueList.empty() == false)
+        {
+          //cleanup the worker queues
+          FwdIterator it(workerQueueList.begin(), workerQueueList.end());
+          while (it.hasNext())
+          {
+            //we have to terminate the thread of this WorkerQueueImpl before we
+            //can destroy it.
+            WorkerQueueImpl* workerQ = (WorkerQueueImpl*) it.next();
+            
+            //shut down the workerQueue (thread).
+            UAPI_INFO(fn,"Shutting down worker queue\n");
+            workerQ->shutdownNow(returnCode);
+            if (returnCode)
+              UAPI_WARN(fn,"Failed to shutdown worker queue impl\n");
+            UAPI_INFO(fn,"Shutting down worker queue SUCCESS\n");
+            delete workerQ;
+          }
+          workerQueueList.clear();
+        }
+        instance = 0;
+      }
+      
+      WorkerQueue* WorkerQueueFactoryImpl::getWorkerQueue(ReturnCode::Type& returnCode)
+      {
+        UAPI_FN_SCOPE("WorkerQueueFactoryImpl::getWorkerQueue");
+
+          
+        //we have to protect the construction of "instance". Make sure we don't have
+        //multiple threads calling getInstance() while "instance" is equal to 0.
+        LockScope lock(mutex, returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to create LockScope of static mutex.\n");
+          return 0;
+        }
+        
+        while (true)
+        {
+          if (workerQueueList.size() < maxNumWorkerQueues)
+          {
+            WorkerQueueImpl* newQ = WorkerQueueImpl::create(jniThreadListener, returnCode);
+            if (returnCode != ReturnCode::SUCCESS)
+            {
+              UAPI_ERROR(fn,"Could not construct a WorkerQueueImpl\n");
+              return 0;
+            }
+            workerQueueList.push_back(newQ);
+            
+            returnCode = ReturnCode::SUCCESS;
+            UAPI_INFO(fn,"Returned WorkerQueueImpl %p\n", newQ);
+            return newQ;
+          }
+          else
+          {
+            //the maximum allowed number of worker queues was created.
+            ++indexToReturn;
+            indexToReturn %= workerQueueList.size();
+            
+            returnCode = ReturnCode::SUCCESS;
+            UAPI_INFO(fn,"Returned WorkerQueueImpl %p\n",
+                      (WorkerQueue*)workerQueueList[indexToReturn]);
+            WorkerQueue* result = (WorkerQueue*) workerQueueList[indexToReturn];
+            bool running = result->isRunning(returnCode);
+            if (returnCode || !running)
+            {
+              workerQueueList.remove(result);
+              continue;
+            }
+            return result;
+          }
+        }
+      }
+      
+      void WorkerQueueFactoryImpl::setPoolSize(UINT8 numWorkerQueue, ReturnCode::Type& returnCode)
+      {
+        //TODO make this configurable through a parameter.
+        maxNumWorkerQueues = numWorkerQueue;
+        returnCode = ReturnCode::SUCCESS;
+      }
+      
+      void WorkerQueueFactoryImpl::setJNIThreadListener(JNIThreadListener* _jniThreadListener)
+      {
+        jniThreadListener = _jniThreadListener;
+      }
+      
+      JNIThreadListener* WorkerQueueFactoryImpl::getJNIThreadListener()
+      {
+        return jniThreadListener;
+      }
+    }
+  }
+}
diff --git a/uapi/cpp/utilities/source/WorkerQueueImpl.cpp b/uapi/cpp/utilities/source/WorkerQueueImpl.cpp
new file mode 100644
index 0000000..0a91d96
--- /dev/null
+++ b/uapi/cpp/utilities/source/WorkerQueueImpl.cpp
@@ -0,0 +1,563 @@
+/*---------------------------------------------------------------------------*
+ *  WorkerQueueImpl.cpp                                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+
+//Memory leak detection
+#if defined(_DEBUG) && defined(_WIN32)
+#include "crtdbg.h"
+#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
+#endif
+
+#ifdef UAPI_WIN32
+// Do not warn on "while(true)"
+#  pragma warning (disable: 4127)
+#endif
+
+#include "ReturnCode.h"
+#include "WorkerQueueImpl.h"
+#include "Task.h"
+#include "LoggerImpl.h"
+#include "TimeInstant.h"
+#include "WorkerQueueFactory.h"
+#include "JNIThreadListener.h"
+#include "Mutex.h"
+#include "ConditionVariable.h"
+
+#include <assert.h>
+#include <limits.h>
+#include <string.h>
+
+
+/**
+ * If a task is executed cstMaxTimeoutDelay after it was supposed to, a log will
+ * get generated. I have lowered the time out so we can see if this is occuring
+ * at all. SteveR
+ */
+static const int cstMaxTimeoutDelay = 1000;
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+
+
+WorkerQueueImpl* WorkerQueueImpl::create(utilities::JNIThreadListener *jniThreadListener,
+    ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("WorkerQueueImpl::create");
+    
+  Mutex* mutex = Mutex::create(returnCode);
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Failed to create mutex\n");
+    return 0;
+  }
+  WorkerQueueImpl* result = new WorkerQueueImpl(jniThreadListener, mutex, returnCode);
+  if (!result || returnCode)
+  {
+    delete mutex;
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  returnCode = ReturnCode::SUCCESS;
+  return result;
+}
+
+WorkerQueueImpl::WorkerQueueImpl(utilities::JNIThreadListener* jniThreadListener, Mutex* mutex,
+                                 ReturnCode::Type& returnCode):
+    WorkerQueue(),
+    Runnable(mutex),
+    shutdownRequested(false),
+    idle(true),
+    taskReady(0),
+    threadStarted(0),
+    jniThreadListener(jniThreadListener)
+{
+  strcpy(threadId, "");
+  strcpy(szPreviousTaskName,"");
+  UAPI_FN_SCOPE("WorkerQueueImpl::WorkerQueueImpl");
+    
+  taskReady = ConditionVariable::create(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+    UAPI_ERROR(fn,"Failed to create taskReady\n");
+  threadStarted = ConditionVariable::create(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+    UAPI_ERROR(fn,"Failed to create threadStarted\n");
+}
+
+WorkerQueueImpl::~WorkerQueueImpl()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("WorkerQueueImpl::~WorkerQueueImpl");
+  
+  LockScope ls(mutex, returnCode);
+  shutdownNow(returnCode);
+  
+  delete taskReady;
+  delete threadStarted;
+}
+
+void WorkerQueueImpl::cleanupTaskQueue()
+{
+  UAPI_FN_SCOPE("WorkerQueueImpl::cleanupTaskQueue");
+    
+  FwdIterator it2(scheduledTaskList.begin(), scheduledTaskList.end());
+  while (it2.hasNext())
+  {
+    ScheduledTask* task = (ScheduledTask*) it2.next();
+    delete task;
+  }
+  scheduledTaskList.clear();
+}
+
+void WorkerQueueImpl::setJNIThreadListener(utilities::JNIThreadListener* jniThreadListener)
+{
+  jniThreadListener = jniThreadListener;
+}
+
+void WorkerQueueImpl::enqueue(Task* task, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("WorkerQueueImpl::enqueue");
+    
+  if (task == 0)
+  {
+    UAPI_ERROR(fn,"A Task object could not be created\n");
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create condition variable lock scope\n");
+    return;
+  }
+  if (shutdownRequested)
+  {
+    UAPI_INFO(fn,"Not queuing Task %p:\"%s\", we are shutting down\n",
+              task, task->m_name);
+    returnCode = ReturnCode::SUCCESS;
+    return;
+  }
+  if (!running)
+  {
+    // Start WorkerQueue thread the first time a task is queued because that thread
+    // locks on the System mutex and WorkerQueueFactoryImpl::getWorkerQueue() might
+    // get invoked from a second thread which already holds the mutex, leading to a deadlock.
+    start(returnCode);
+    if (returnCode)
+      return;
+  }
+  
+  {
+    //This is a ScheduledTask... to be executed later.
+    task->m_expire = TimeInstant::now();
+    task->m_expire = task->m_expire.plus(task->getTimeout());
+    
+    //we now need to find out where we can insert this new ScheduledTask inside
+    //the list of ScheduledTask.
+    DoublyLinkedNode* insertPosition = (DoublyLinkedNode*) scheduledTaskList.end();
+    FwdIterator it(scheduledTaskList.begin(), scheduledTaskList.end());
+    while (it.hasNext())
+    {
+      ScheduledTask* pCurrentTask = (ScheduledTask*) it.next();
+      
+      // find the insertion point
+      // delta needs to be an int to handle wrapping
+      INT32 delta = task->m_expire.minus(pCurrentTask->m_expire, returnCode);
+      if (returnCode)
+      {
+        UAPI_INFO(fn,"TimeInstant.minus() error: %s\n", ReturnCode::toString(returnCode));
+        continue;
+      }
+      if (delta < 0)
+      {
+        insertPosition = (DoublyLinkedNode*) it.current(); //current position
+        break;
+      }
+      else if (delta >= 0)
+        insertPosition = (DoublyLinkedNode*) it.current()->next;  //after current position
+    }
+    UAPI_INFO(fn,"Queuing ScheduledTask %p:\"%s\" timeout %ld\n",
+              task, task->m_name, task->getTimeout());
+    //insert before pCurrentTask
+    scheduledTaskList.insert(insertPosition, task);
+  }
+  
+  if (idle)
+  {
+    // runThread() sets idle=true. enqueue() sets idle=false
+    idle = false;
+    onActive();
+  }
+  
+  // Wake up the thread if it's waiting for new tasks
+  UAPI_INFO(fn,"Signaling the thread\n");
+  taskReady->signal(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to signal taskReady\n");
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to signal waiting thread\n");
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void WorkerQueueImpl::remove(Task* task, ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("WorkerQueueImpl::remove");
+    
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create condition variable lock scope\n");
+    return;
+  }
+  
+  //check in which queue the Task is stored.
+  {
+    FwdIterator it(scheduledTaskList.begin(), scheduledTaskList.end());
+    while (it.hasNext())
+    {
+      Task* entry = (Task*) it.next();
+      if (entry == task)
+      {
+        scheduledTaskList.remove(entry);
+        delete entry;
+        break;
+      }
+    }
+  }
+  
+  returnCode = ReturnCode::SUCCESS;
+}
+
+void WorkerQueueImpl::start(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("WorkerQueueImpl::start");
+    
+  Runnable::start(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to start worker queue: %s\n", ReturnCode::toString(returnCode));
+    return;
+  }
+  
+  //wait until the thread is completely started. We want to make sure
+  //taskReady->wait() was called before we exit the return function. This
+  //is to prevent enqueue to be called before the thread is in a waiting
+  //state.
+  threadStarted->wait(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed on threadStarted->wait(): %s\n", ReturnCode::toString(returnCode));
+    return;
+  }
+}
+
+void WorkerQueueImpl::shutdownNow(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("WorkerQueueImpl::shutdown");
+  UAPI_INFO(fn,"about to shutdown thread %s\n", threadId);
+  
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to create mutex lock scope\n");
+    return;
+  }
+  if (shutdownRequested)
+  {
+    returnCode = ReturnCode::SUCCESS;
+    return;
+  }
+  shutdownRequested = true;
+  
+  // Wake up the thread if it's waiting for new tasks
+  UAPI_INFO(fn,"Signaling the thread\n");
+  taskReady->signal(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to signal taskReady\n");
+    return;
+  }
+  
+  // All thread to wake up
+  ls.cancel(returnCode);
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Failed to cancel the mutex lock scope\n");
+    return;
+  }
+  
+  join(returnCode);
+}
+
+ReturnCode::Type WorkerQueueImpl::runThread()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("WorkerQueueImpl::runThread");
+    
+  Runnable::getCurrentThreadId(threadId, 20, returnCode);
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Runnable::getcurrentThreadId() failed: %s\n", ReturnCode::toString(returnCode));
+    return returnCode;
+  }
+  assert(!shutdownRequested);
+  assert(scheduledTaskList.empty());
+  onStartup();
+  
+  {
+    LockScope ls(mutex, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to create condition variable lock scope\n");
+      onShutdown();
+      return returnCode;
+    }
+    
+    assert(idle); // Set by the constructor
+    idle = false;
+    onActive();
+    
+    threadStarted->signal(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to signal threadStarted\n");
+      onShutdown();
+      return returnCode;
+    }
+  }
+  
+  while (true)
+  {
+    TimeInstant now = TimeInstant::now();
+    
+    //protect the queue and the list.
+    LockScope ls(mutex, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"Failed to create condition variable lock scope\n");
+      onShutdown();
+      return returnCode;
+    }
+    
+    if (shutdownRequested)
+    {
+      onShutdown();
+      return ReturnCode::SUCCESS;
+    }
+    
+    //printScheduledListContent();
+    
+    ReturnCode::Type waitReturnCode;
+    Task* scheduledTask = (Task*) scheduledTaskList.front();
+    if (scheduledTask)
+    {
+      INT32 delta = now.minus(scheduledTask->m_expire, returnCode);
+      if (returnCode)
+      {
+        UAPI_INFO(fn,"TimeInstant.minus() error: %s\n", ReturnCode::toString(returnCode));
+        onShutdown();
+        return returnCode;
+      }
+
+      if (delta >= 0)
+      {
+        // timer already expired!!!
+        const bool timeoutExceeded = (delta > cstMaxTimeoutDelay);
+        if (timeoutExceeded)
+        {
+          UAPI_WARN(fn,"calling %d ms ScheduledTask %s %d milliseconds too late. "
+                       "Previous task was %s\n", scheduledTask->getTimeout(), 
+                       scheduledTask->m_name, delta, szPreviousTaskName);
+        }
+        
+        // remove from scheduled task list, it is the first item.
+        scheduledTaskList.pop_front();
+        
+        //unlock the mutex
+        ls.cancel(returnCode);
+        if (returnCode != ReturnCode::SUCCESS)
+        {
+          UAPI_ERROR(fn,"Failed to cancel condition variable lock scope\n");
+          onShutdown();
+          return returnCode;
+        }
+        
+        //call the Run function of the Task object
+        UAPI_INFO(fn,"Running ScheduledTask %p:\"%s\"\n", scheduledTask, scheduledTask->m_name);
+
+        //for debugging
+        strncpy(szPreviousTaskName, scheduledTask->m_name, sizeof(szPreviousTaskName));
+
+        //call the Run function of the Task object
+        scheduledTask->run();
+        delete scheduledTask;
+        
+        //go back and try to dequeue either an immediate task or the next
+        //scheduled task.
+        continue;
+      }
+      else
+      {
+        UINT32 delay = scheduledTask->m_expire.minus(now, returnCode);
+        if (returnCode)
+        {
+          UAPI_INFO(fn,"TimeInstant.minus() error: %s\n", ReturnCode::toString(returnCode));
+          onShutdown();
+          return returnCode;
+        }
+        UAPI_TRACE(fn,"thread waiting for %ld msec\n", delay);
+        
+        // NOTE: we check for waitReturnCode below
+        taskReady->wait(delay, waitReturnCode);
+        if (waitReturnCode == ReturnCode::TIMEOUT)
+        {
+          //TimedWaitMs expired because the timeout expired. A ScheduledTask must
+          //be ready to be run()
+          
+          //the real wait time
+          UINT32 realWait = TimeInstant::now().minus(now, returnCode);
+          if (returnCode)
+          {
+            UAPI_INFO(fn,"TimeInstant.minus() error: %s\n", ReturnCode::toString(returnCode));
+            onShutdown();
+            return returnCode;
+          }
+          if (realWait > delay + cstMaxTimeoutDelay)
+          {
+            UAPI_WARN(fn,"TimedWaitMs timeout in %u ms, too slow by %u ms\n", realWait,
+                      (realWait - delay));
+          }
+        }
+      }
+    }
+    else
+    {
+      // runThread() sets idle=true. enqueue() sets idle=false
+      idle = true;
+      onIdle();
+      // NOTE: we check for waitReturnCode below
+      taskReady->wait(waitReturnCode);
+    }
+    
+    // If we've been told to stop, do it
+    if (shutdownRequested)
+    {
+      onShutdown();
+      return ReturnCode::SUCCESS;
+    }
+    
+    //unlock the mutex we don't need to protect anything beyond this point.
+    ls.cancel(returnCode);
+    if (returnCode)
+    {
+      UAPI_ERROR(fn,"Failed to cancel condition variable lock scope\n");
+      onShutdown();
+      return returnCode;
+    }
+    
+    if (waitReturnCode == ReturnCode::TIMEOUT)
+    {
+      // we will run() the ScheduledTask when we go back at the beginning of the
+      // loop.
+      continue;
+    }
+    else if (waitReturnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"TimedWaitMs failed!!! Getting out of the thread.\n");
+      onShutdown();
+      return ReturnCode::THREAD_ERROR;
+    }
+  } // while (true) loop
+  
+  onShutdown();
+  return ReturnCode::SUCCESS;
+}
+
+
+void WorkerQueueImpl::printScheduledListContent()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("WorkerQueueImpl::printScheduledListContent");
+    
+  UAPI_INFO(fn,"Scheduled task list has %ld items\n", scheduledTaskList.size());
+  FwdIterator it(scheduledTaskList.begin(), scheduledTaskList.end());
+  while (it.hasNext())
+  {
+    Task* pTask = (Task*) it.next();
+    
+    UINT32 delta = pTask->m_expire.minus(TimeInstant::now(), returnCode);
+    if (returnCode)
+    {
+      UAPI_INFO(fn,"TimeInstant.minus() error: %s\n", ReturnCode::toString(returnCode));
+      continue;
+    }
+    UAPI_INFO(fn,"Task %p name %s expires %ld milliseconds\n", pTask, pTask->m_name,
+              delta);
+  }
+}
+
+void WorkerQueueImpl::onStartup()
+{
+  UAPI_FN_SCOPE("WorkerQueueImpl::onStartup");
+    
+  if (jniThreadListener)
+    jniThreadListener->onThreadStarted();
+}
+
+void WorkerQueueImpl::onShutdown()
+{
+  UAPI_FN_SCOPE("WorkerQueueImpl::onShutdown");
+    
+  cleanupTaskQueue();
+  if (jniThreadListener)
+    jniThreadListener->onThreadStopped();
+    
+  // Detach JNIKeepAlive if necessary
+  if (!idle)
+  {
+    idle = true;
+    onIdle();
+  }
+}
+
+void WorkerQueueImpl::onActive()
+{
+  if (jniThreadListener)
+    jniThreadListener->onThreadActive();
+}
+
+void WorkerQueueImpl::onIdle()
+{
+  assert(scheduledTaskList.empty());
+  if (jniThreadListener)
+    jniThreadListener->onThreadInactive();
+}
+
+bool WorkerQueueImpl::isRunning(ReturnCode::Type& returnCode)
+{
+  return Runnable::isRunning(returnCode);
+}
diff --git a/uapi/doc/changelog.txt b/uapi/doc/changelog.txt
new file mode 100644
index 0000000..73ae43c
--- /dev/null
+++ b/uapi/doc/changelog.txt
@@ -0,0 +1,418 @@
+Beta1: revision 298
+
+*********************************************************************************************************
+Beta2: revision 650
+*********************************************************************************************************
+
+
+Bugfixes
+--------
+
+- Maintaining classpath in C++ JNI code
+- Recognizer was leaking memory on successful recognition
+- Recursive mutexes are broken on the Q platform. We've implemented a workaround.
+- Singleton creation was not thread-safe
+- Q platform does not support native methods on Java nested classes. We've implemented a workaround.
+- NBestRecognitionResult.getEntry() crashes if index == NBestRecognitionResult.getSize()
+- Deleting components from inside callbacks caused a crash
+- Recognizer was leaking memory if a recognition result was returned before end-of-speech
+- Grammar::UnloadTask was invoking onLoad() instead of onUnload()
+- We no longer attach() and detach() native threads to the JVM every time an event is fired
+
+
+
+Legend
+------
+
++ Feature added to the API
+* Feature changed in the API
+- Feature removed from the API
+
+
+
+C++ New Features
+----------------
+
+* API methods now return shared_ptr instances, see SmartProxy.h for more information.
++ Documented some of the C++ return codes
++ Added AbstractGrammarListener, AbstractRecognizerListener: convenience classes for building event-listeners
+
+
+
+Java New Features
+-----------------
+
++ Documented some of the Java exceptions
++ Added EmbeddedRecognizerTest test application
++ JVMKeepAlive feature: we attach a non-daemon Java thread when the C++ layer is busy to prevent the JVM from shutting down
++ WordItem.valueOf() now rejects empty-string pronunciations
++ Added AbstractGrammarListener, AbstractRecognizerListener: convenience classes for building event-listeners
+
+
+
+C++ API changes
+---------------
+
++ Added AbstractGrammarListener
++ Added AbstractRecognizerListener
++ Added Codec::PCM_16BIT_22K
++ Added DeviceSpeaker::getInstance()
++ Added DeviceSpeaker::setCodec()
++ Added DeviceSpeaker::setListener()
+* Renamed DeviceSpeakerListener::onCompleted() to onStopped()
+* DeviceSpeakerListener::onError() now takes a return-code as argument
++ Added EmbeddedRecognizer::getInstance()
++ Added EmbeddedRecognizer::configure()
++ Added EmbeddedRecognizer::setListener()
++ Added EmbeddedRecognizer::resetAcousticState()
+* G2GConfiguration::grammarToMeaning() now takes in key-value pairs instead of a char*
++ Added GrammarConfiguration::disposeMeaning()
+* Moved events specific to EmbeddedGrammar out of GrammarListener into EmbeddedGrammarListener
++ Added Logger
++ Added MediaFileReader::create()
++ Added MediaFileReaderListener::onStarted()
+* Renamed MediaFileReaderListener::onCompleted() to onStopped()
+* MediaFileReaderListener::onError() now takes in a return-code as argument
++ Added MediaFileWriter::create()
+* Renamed MediaFileWriterListener::onCompleted() to onStopped()
+* MediaFileWriterListener::onError() now takes in a return-code as argument
++ Added Microphone::getInstance()
++ Added Microphone::setCodec()
++ Added Microphone::setListener()
+* Renamed MicrophoneListener::onCompleted() to onStopped()
+* MicrophoneListener::onError() now takes in a return-code as argument
+- NBestRecognitionResult::Entry::get() has been removed. Instead, key-value pairs are passed into G2GConfiguration::grammarToMeaning().
+* NBestRecognitionResult::getSemanticMeaning() now returns a user-defined value which is retured by G2GConfiguration::grammarToMeaning()
+* NBestRecognitionResult::getConfidenceScore() now returns values from 0 to 100
+* NBestRecognitionResult::getEntry() returns NO_MATCH if all active GrammarConfiguration.grammarToMeaning() return null
+* RecognitionResult::getEndpointedWaveform() moved to VoicetagItem::getAudio()
++ Added NBestRecognitionResult::createVoicetagItem()
+- Removed Network
+- Removed NetworkListener
+* Renamed Parameters::createParameters() to Parameters::create()
++ Added convenience method for recognizing against a single grammar: Recognizer::recognize()
+* Recognizer::stop() now has a return-code
++ Added RecognizerListener::resetAcousticState()
+* Renamed RecognizerListener::FailureType to FailureReason
+* Renamed RecognizerListener::onFailure to onRecognitionFailure
+* Renamed RecognizerListener::onRecognitionResult to onRecognitionSuccess
+* Renamed UAPI_LONG to uapi::LONG
+* Renamed UAPI_ULONG to uapi::ULONG
+* Renamed UAPI_INT32 to uapi::INT32
+* Renamed UAPI_UINT32 to uapi::UINT32
+* Renamed UAPI_INT16 to uapi::INT16
+* Renamed UAPI_UINT16 to uapi::UINT16
+* Renamed UAPI_INT8 to uapi::INT8
+* Renamed UAPI_UINT8 to uapi::UINT8
+* Renamed UAPI_ARRAY_LIMIT to uapi::ARRAY_LIMIT
++ Added uapi::UINT16_MAX
++ Added uapi::ARRAY_LIMIT_MAX
+- Removed VoconGrammar
++ Added VoicetagItem::getAudio()
++ Added VoicetagItem::setAudio()
++ Added WordItem::create()
+
+
+
+Java API changes
+----------------
+
++ Added AbstractGrammarListener
++ Added AbstractRecognizerListener
++ Added AudioAlreadyInUseException
++ Added AudioDriverErrorException
+- Removed AudioSource.dispose()
+* Deprecated AudioStream.dispose()
++ Added Codec.PCM_16BIT_22K
++ Added DeviceSpeaker.getInstance()
++ Added DeviceSpeaker.setCodec()
++ Added DeviceSpeaker.setListener()
+- Removed DeviceSpeaker.dispose()
+* Renamed DeviceSpeakerListener.onCompleted() to onStopped()
+* DeviceSpeakerListener.onError() now takes an Exception argument
++ Added EmbeddedRecognizer.getInstance()
++ Added EmbeddedRecognizer.configure()
++ Added EmbeddedRecognizer.setListener()
++ Added EmbeddedRecognizer.resetAdaptation()
+* G2GConfiguration.grammarToMeaning() now takes in key-value pairs instead of a String
++ Added GrammarOverflowException
+* Moved events specific to EmbeddedGrammar out of GrammarListener into EmbeddedGrammarListener
++ Added Logger
++ Added MediaFileReader.create()
++ Added MediaFileReaderListener.onStarted()
+* Renamed MediaFileReaderListener.onCompleted() to onStopped()
+* MediaFileReaderListener.onError() now takes an Exception argument
++ Added MediaFileWriter.create()
+- Removed MediaFileWriter.dispose()
+* Renamed MediaFileWriterListener.onCompleted() to onStopped()
+* MediaFileWriterListener.onError() now takes an Exception argument
++ Added Microphone.getInstance()
++ Added Microphone.setCodec()
++ Added Microphone.setListener()
+* Renamed MicrophoneListener.onCompleted() to onStopped()
+* MicrophoneListener.onError() now takes an Exception argument
+* NBestRecognitionResult.Entry.getSemanticResult() now returns Object instead of String
+- NBestRecognitionResult.Entry.get() has been removed. Instead, key-value pairs are passed into G2GConfiguration.grammarToMeaning().
+- NBestRecognitionResult.Entry.keys() has been removed. Instead, key-value pairs are passed into G2GConfiguration.grammarToMeaning().
+* NBestRecognitionResult.getSemanticMeaning() now returns a user-defined value which is retured by G2GConfiguration.grammarToMeaning()
+* NBestRecognitionResult.getConfidenceScore() now returns values from 0 to 100
+* RecognitionResult.getEndpointedWaveform() moved to VoicetagItem.getAudio()
++ Added NBestRecognitionResult.createVoicetagItem()
+- Removed Network
+- Removed NetworkListener
+- Removed Parameters.dispose()
+- Removed Recognizer.createGrammar() for inline grammars
++ Added convenience method for recognizing against a single grammar: Recognizer.recognize()
+- Removed Recognizer.dispose()
++ Added RecognizerListener.onAdaptationReset()
+* Renamed RecognizerListener.FailureType to FailureReason
+* Renamed RecognizerListener.onFailure to onRecognitionFailure
+* Renamed RecognizerListener.onRecognitionResult to onRecognitionSuccess
+- Removed SlotItem.dispose()
+- Removed UAPI (replaced by singletons and static factory methods)
+- Removed VoconGrammar
+* Replaced VoicetagItem.valueOf() by NBestRecognitionResult.createVoicetagItem()
+- Removed VoicetagItem.dispose()
++ Added VoicetagItem.getAudio()
++ Added convenience method for creating a WordItem from with a single pronunciation
+- Removed WordItem.dispose()
+
+
+Beta 2 Logging
+--------------
+
+	Disabling UAPI logging
+	----------------------
+
+	Logger logger = Logger.getInstance();
+	logger.setLoggingLevel(LoggingLevel.LEVEL_NONE);
+
+
+	Enabling UAPI logging
+	---------------------
+
+	Logger logger = Logger.getInstance();
+	logger.setLoggingLevel(LoggingLevel.LEVEL_TRACE);
+
+
+	SREC Logging
+	------------
+
+	One can define SREC_ENGINE_VERBOSE_LOGGING so SREC prints out a lot of information to stdout. This is normally not defined to avoid clutter. These can be added by editing the following files under the SREC source tree:
+
+	make\asr\Makefile.common for Q Device
+
+
+*********************************************************************************************************
+Beta3: revision 758
+*********************************************************************************************************
+
+
+Bugfixes
+--------
+
+- Hang due to increment of jvmReferences even if there was a scheduled task pending
+- Hang during process shutdown (threads killed in an unpredictable order)
+- JVMKeepAlive would sometimes create a new thread before the old thread died.  This caused the new thread to never start.
+- Possible crash on non-numeric or 0 confidence score
+- Javadoc corrections
+
+
+Legend
+------
+
++ Feature added to the API
+* Feature changed in the API
+- Feature removed from the API
+
+
+
+C++ New Features
+----------------
+
+
+Java New Features
+-----------------
+
+
+C++ API changes
+---------------
+
+* Reorganized C++ layer code (moved cpp/common to cpp/utilities, etc).
+
+
+Java API changes
+----------------
+
+* AudioStream was reporting AUDIO_ALREADY_IN_USE if the stream was empty. It now reports END_OF_STREAM.
+* Replaced Parameters class with Vector and Hashtable
+* Changed package name from com.nuance.uapi to android.speech.recognition
+
+
+
+
+*********************************************************************************************************
+Beta3.1: revision 761
+*********************************************************************************************************
+
+
+Same as Beta 3 but with consolidated shared libraries for Q platform (everything in libUAPI_jni.so).
+This primarily involved SREC and UAPI makefile changes (what used to be .so is now .a, except for
+final libUAPI_jni.so).  There was a change in EmbeddedRecognizer.cpp so libUAPI_api.so is no longer
+dynamically loaded, and relevant functions are just called directly.  For Windows and Ubuntu builds
+the symbol RECOGNIZER_DYNAMICALLY_LOADED had to be defined.
+
+
+*********************************************************************************************************
+Beta3.2: revision 819
+*********************************************************************************************************
+
+
+General stability improvements
+Still has local reference table overflow issue
+Java test program reorganization
+Java, C++ and C test programs need to explicitly built
+renamed /system/usr/srec.config/ to /system/usr/srec/config/
+
+
+*********************************************************************************************************
+Beta4.0: revision 882
+*********************************************************************************************************
+
+- Speed and stability improvements
+- Fixed local reference table overflow
+- Fixed crash on 2nd Recognizer.configure() call
+- Fixed crash on calling Recognizer.stop()
+- Fixed Microphone race condition
+- Replaced inefficient logger introduced in Beta 3.2
+- Disabled JNIKeepAlive for improved efficiency.  Console apps must now keep main thread alive to prevent the JVM from shutting down
+- SpeechRecorder no longer crashes
+- Implemented Recognizer getParam()/setParam() and provided sample Java app Parameters.java
+- Robustness1 ran for over 2 days (250,000+ iterations) before it was stopped.
+- New Robustness2 application for microphone + recognizer testing
+- Reduced compiler warnings
+- Updated SpeakContact example to compile with 11/08 Android SDK snapshot
+
+
+*********************************************************************************************************
+Beta5.0: revision 939
+*********************************************************************************************************
+
+- Speed and stability improvements
+- Includes open-source grammar compiler (extlibs/srec/tools/grxmlcompile) for Ubuntu 6.06 Linux.  The SpeechWorks grammar compiler is no longer supported.
+- New Robustness3 application for more thorough exercise of API
+- Includes Voicetags support
+- New Voicetags1 application to exercise voicetags
+- New API function to add a list of items to a slot (see addItemList method)
+- Added a work around for audio driver bug: unable to set input format immediately after closing the driver since DMA is still active, according to HTC.  See ANDROID_AUDIODRIVER_WORKAROUND in device/extlibs/srec/uapi/cpp/audio/linux/source/MicrophoneLINUX.cpp and device/extlibs/srec/uapi/make/uapi/Makefile.common
+
+
+*********************************************************************************************************
+RC-1: revision 1040
+*********************************************************************************************************
+
+- Speed and stability improvements
+- Includes open-source grammar compiler (extlibs/srec/tools/grxmlcompile) for Ubuntu 6.06 Linux.  The SpeechWorks grammar compiler is no longer supported.  This grammar compiler no longer needs cppdom binaries.  Instead, tinyxml is used.
+- Faster grammar compilation
+- New models (cross-word triphones)
+ -Voicetags end of speed detection fix
+- Added getAPIversion() to hidden System class (see limitations below)
+- Faster audio input processing
+- Test programs bug fixes
+
+
+*********************************************************************************************************
+Beta7.0: revision 1071
+*********************************************************************************************************
+
+- SREC and UAPI now use Android logger on device
+- Delay loading of SREC user dictionary until it is needed
+- Merged Mike GloverÂ’s optimized dictionary load code
+- Added # prefix to *.ok language header (#LANG=EN-US)
+- Reduced compiler warnings for third-party library OpenFst
+- Reduced /system/usr/srec footprint from 12 MB to 1.9 MB. Now one must “make srec_test_files” to install optional test files.
+- More complete checking of dictionary for non-lower-case words
+- Speed improvement: compute log tables offline (log_tabl.c, log_add.c)
+- Fix: Crash when null string: SrecGrammar.Item(WordItem, 1, (String)null)
+- Fix: Crash when null AudioStream passed to EmbeddedRecognizer.recognize
+- Fix: Crash on long list passed to addItemList(). Local references were previously leaked.
+- Fix: Mispronunciation when there are special characters or two embedded blanks in a name passed to WordItem
+- Fix: Pronunciation involving unprintable characters
+- Fix: Pronunciation for “oh”, now should get fewer insertions
+- Fix: Homonym collision problem. No longer abort processing.
+
+
+
+
+*********************************************************************************************************
+Beta8.0:
+    CVS tag  for SREC: Q-BETA-8
+    SVN tag  for UAPI: beta8
+*********************************************************************************************************
+
+- Speed improvement: compute log tables offline (log_tabl.c, log_add.c)
+- Speed improvement: G2P lookup
+- Speed improvement: strcmp for dictionary lookup
+- Defer G2P creation until it is needed
+- Use run-time (dynamic) allocations for slot memory when needed (so that ,addWords=N is now optional)
+- Removed G2P fsm_dictionary (large.ok enlarged as necessary)
+- Expanded large.ok SREC dictionary
+- Grammar compiler grxmlcompile now has –outpath command-line option to specify the output directory.
+- Grammars are compiled during build time (make srec_test_files).  The release no longer includes pre-compiled grammars *.g2g
+- Grammar compiler builds under Mac
+- Removed G2GConfiguration
+- Updated some Android applications to new Java API (due to G2GConfiguration removal)
+- MediaFileReader and MediaFileWriter now operate on WAV files
+- Improved audio efficiency
+- Defined LOG_TAG “Srec” and “Uapi” for Android logger
+- Support for Nuance Mobile Speech Platform (NMSP) network recognizer.  libUAPI_nmsp.so should be added to device/config/prelink-linux-arm.map.
+- Fix: “pau” and other problems in pronunciations related to periods and quotes
+- Fix: SRecTest now uses proper API SR_Grammar and SR_Semantic for checkparse
+- Fix: OpenFst compiler warnings
+
+
+
+
+*********************************************************************************************************
+Beta9.0:
+    CVS tag  for SREC: Q-BETA-9
+    SVN tag  for UAPI: beta9
+*********************************************************************************************************
+
+- Modified grammar makefile so .g2g depends on .grxml (no separate rule for .map)
+- Removed network recognizer
+- Updated some Android applications (due to removal of network recognizer)
+- Fix: SIGSEGV on shutdown
+- Fix: unhandled exceptions in callback
+
+
+
+
+*********************************************************************************************************
+RC2:
+    CVS tag  for SREC: Q-RC-2
+    SVN tag  for UAPI: rc2
+*********************************************************************************************************
+
+- Fix: Meaning string max length (349 chars). The engine now reports an error if the string will be truncated.
+- Support for changing the enrollment grammar (i.e., enrolling a name in a carrier phrase).
+- Code clean-up (including removal of useless files latlib.h lat_desc.h syntax.h acc_sub.c)
+- SREC_User_Guide.pdf was updated to reflect min and max values for parameters.
+
+
+
+
+*********************************************************************************************************
+RC3:
+    CVS tag  for SREC: Q-RC-3
+    SVN tag  for UAPI: rc3
+*********************************************************************************************************
+
+- Fix: slot nomenclature changes, fixes to more gracefully handle larger number or too many slots
+- Fix: change associated with homonym bug
+- Fix: throw exception on NULL configuration
+- Fix: Renamed getBitRate to getBitsPerSample
+- Fix: Corrected UALW to ULAW in Codec.java
+- Remove obsolete comment about problem with dlopen() when UAPI_LINUX is defined (LibraryLoader.cpp:172)
+- Changes associated with logging CMN vector
+- The CMN vector can be retrieved by getting the parameter “CREC.Frontend.swicms.cmn”. The value is in the form of an opaque
diff --git a/uapi/doc/uapi.doxygen b/uapi/doc/uapi.doxygen
new file mode 100644
index 0000000..891a231
--- /dev/null
+++ b/uapi/doc/uapi.doxygen
@@ -0,0 +1,245 @@
+# Doxyfile 1.5.3
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = UAPI
+PROJECT_NUMBER         = "(C) Copyright 2007, 2008 Nuance"
+OUTPUT_DIRECTORY       = doc/uapi_cpp
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class    " \
+                         "The $name widget    " \
+                         "The $name file    " \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = YES
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = YES
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 5
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+DISTRIBUTE_GROUP_DOC   = YES
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= NO
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = NO
+SHOW_DIRECTORIES       = NO
+FILE_VERSION_FILTER    = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text    "
+WARN_LOGFILE           = doxygen.log
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = api/include
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.h
+RECURSIVE              = YES
+EXCLUDE                = api/include/System.h
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = YES
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = NO
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = .\
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = YES
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = YES
+BINARY_TOC             = NO
+TOC_EXPAND             = YES
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 1
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 245
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = _WIN32 \
+                         UAPI_WIN32 \
+                         _WIN32_WINNT=0x0400 \
+                         UAPI_MT \
+                         UAPI_LOGGING_ENABLED
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = "c:/Program Files/ATT/GraphViz/bin    "
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/uapi/java/Android.mk b/uapi/java/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/java/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/java/jniapi/Android.mk b/uapi/java/jniapi/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/uapi/java/jniapi/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/uapi/java/jniapi/jniapi/Android.mk b/uapi/java/jniapi/jniapi/Android.mk
new file mode 100644
index 0000000..bc81843
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/Android.mk
@@ -0,0 +1,96 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# common settings for all UAPI builds, exports some variables for sub-makes
+include $(UAPI_MAKE_DIR)/Makefile.defs
+
+PUBLIC_HEADERS =
+
+LOCAL_SRC_FILES:= \
+	CWrapperDeviceSpeakerListener.cpp \
+	CWrapperEmbeddedGrammarListener.cpp \
+	CWrapperGrammarListener.cpp \
+	CWrapperMediaFileReaderListener.cpp \
+	CWrapperMediaFileWriterListener.cpp \
+	CWrapperMicrophoneListener.cpp \
+	CWrapperRecognizerListener.cpp \
+	CWrapperSrecGrammarListener.cpp \
+	CWrapperVoicetagListener.cpp \
+	jniapi.cpp \
+	JNIHelper.cpp \
+	android_speech_recognition_impl_AudioStreamImpl.cpp \
+	android_speech_recognition_impl_DeviceSpeakerImpl.cpp \
+	android_speech_recognition_impl_EmbeddedGrammarImpl.cpp \
+	android_speech_recognition_impl_EmbeddedRecognizerImpl.cpp \
+	android_speech_recognition_impl_EntryImpl.cpp \
+	android_speech_recognition_impl_GrammarImpl.cpp \
+	android_speech_recognition_impl_LoggerImpl.cpp \
+	android_speech_recognition_impl_MediaFileReaderImpl.cpp \
+	android_speech_recognition_impl_MediaFileWriterImpl.cpp \
+	android_speech_recognition_impl_MicrophoneImpl.cpp \
+	android_speech_recognition_impl_NBestRecognitionResultImpl.cpp \
+	android_speech_recognition_impl_SrecGrammarImpl.cpp \
+	android_speech_recognition_impl_System.cpp \
+	android_speech_recognition_impl_VoicetagItemImpl.cpp \
+	android_speech_recognition_impl_WordItemImpl.cpp \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH) \
+	$(LOCAL_PATH)/../../../cpp/api/include \
+	$(LOCAL_PATH)/../../../cpp/grammar/include \
+	$(LOCAL_PATH)/../../../cpp/recognizer/srec/include \
+	$(LOCAL_PATH)/../../../cpp/utilities/include \
+	$(JNI_H_INCLUDE)
+
+LOCAL_CFLAGS := \
+	-DJNI_EXPORTS \
+
+LOCAL_CFLAGS += \
+	$(UAPI_GLOBAL_DEFINES) \
+	$(UAPI_GLOBAL_CPPFLAGS) \
+
+LOCAL_WHOLE_STATIC_LIBRARIES := \
+	libESR_Shared \
+	libESR_Portable \
+	libSR_AcousticModels \
+	libSR_AcousticState \
+	libSR_AudioIn \
+	libSR_Core \
+	libSR_EventLog \
+	libSR_Grammar \
+	libSR_G2P \
+	libSR_Nametag \
+	libSR_Recognizer \
+	libSR_Semproc \
+	libSR_Session \
+	libSR_Vocabulary \
+	libUAPI_audio \
+	libUAPI_audiolinux \
+	libUAPI_grammar \
+	libUAPI_uapi \
+	libUAPI_utilities \
+	libUAPI_srec \
+
+LOCAL_STATIC_LIBRARIES := \
+	libzipfile \
+	libunz \
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libhardware \
+	libcutils \
+	libmedia
+
+ifneq ($(TARGET_SIMULATOR),true)
+	LOCAL_SHARED_LIBRARIES += libdl
+endif
+
+LOCAL_MODULE:= libUAPI_jni
+
+LOCAL_LDLIBS += \
+	-lpthread \
+	-ldl
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/uapi/java/jniapi/jniapi/CWrapperDeviceSpeakerListener.cpp b/uapi/java/jniapi/jniapi/CWrapperDeviceSpeakerListener.cpp
new file mode 100644
index 0000000..4b3e4d2
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperDeviceSpeakerListener.cpp
@@ -0,0 +1,127 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperDeviceSpeakerListener.cpp                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "jniapi.h"
+#include "CWrapperDeviceSpeakerListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperDeviceSpeakerListener::CWrapperDeviceSpeakerListener(JavaVM* _jvm, jobject _listener,
+    ReturnCode::Type& returnCode):
+    jvm(_jvm),
+    listener(0)
+{
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  listener = env->NewGlobalRef(_listener);
+  if (!listener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+CWrapperDeviceSpeakerListener::~CWrapperDeviceSpeakerListener()
+{
+  UAPI_FN_NAME("CWrapperDeviceSpeakerListener::~CWrapperDeviceSpeakerListener");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  // Delete global reference to the Java listener
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  env->DeleteGlobalRef(listener);
+}
+
+void CWrapperDeviceSpeakerListener::invokeMethod(const char* methodName)
+{
+  UAPI_FN_SCOPE("CWrapperDeviceSpeakerListener::invokeMethod");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, methodName, "()V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  env->CallVoidMethod(listener, mid, 0);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+}
+
+void CWrapperDeviceSpeakerListener::onStarted()
+{
+  UAPI_FN_SCOPE("CWrapperDeviceSpeakerListener::onStarted");
+    
+  invokeMethod("onStarted");
+}
+
+
+void CWrapperDeviceSpeakerListener::onStopped()
+{
+  UAPI_FN_SCOPE("CWrapperDeviceSpeakerListener::onStopped");
+    
+  invokeMethod("onStopped");
+}
+
+void CWrapperDeviceSpeakerListener::onError(ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("CWrapperDeviceSpeakerListener::onError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  jobject exception = JNIHelper::getJavaException(env, listener, returnCode);
+  env->CallVoidMethod(listener, mid, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+}
+
+void CWrapperDeviceSpeakerListener::onError(jthrowable exception)
+{
+  UAPI_FN_SCOPE("CWrapperDeviceSpeakerListener::onError thru exception");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID onError = env->GetMethodID(listenerClass, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onError != 0);
+  env->CallVoidMethod(listener, onError, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperDeviceSpeakerListener.h b/uapi/java/jniapi/jniapi/CWrapperDeviceSpeakerListener.h
new file mode 100644
index 0000000..422c701
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperDeviceSpeakerListener.h
@@ -0,0 +1,59 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperDeviceSpeakerListener.h                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPERDEVICESPEAKERLISTENER
+#define __UAPI__CWRAPPERDEVICESPEAKERLISTENER
+
+#include <jni.h>
+#include "DeviceSpeakerListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperDeviceSpeakerListener: public DeviceSpeakerListener
+        {
+          public:
+            CWrapperDeviceSpeakerListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperDeviceSpeakerListener();
+            
+            void onStarted();
+            void onStopped();
+            void onError(jthrowable exception);
+            void onError(ReturnCode::Type returnCode);
+          protected:
+            /**
+            * Invokes the method with the specified name.
+            */
+            void invokeMethod(const char* methodName);
+          private:
+            JavaVM* jvm;
+            jobject listener;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CWrapperEmbeddedGrammarListener.cpp b/uapi/java/jniapi/jniapi/CWrapperEmbeddedGrammarListener.cpp
new file mode 100644
index 0000000..4750b98
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperEmbeddedGrammarListener.cpp
@@ -0,0 +1,117 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperEmbeddedGrammarListener.cpp                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "jniapi.h"
+#include "CWrapperEmbeddedGrammarListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperEmbeddedGrammarListener::CWrapperEmbeddedGrammarListener(JavaVM* jvm, jobject listener,
+    ReturnCode::Type& returnCode):
+    delegate(jvm, listener, returnCode)
+{
+}
+
+CWrapperEmbeddedGrammarListener::~CWrapperEmbeddedGrammarListener()
+{}
+
+JavaVM* CWrapperEmbeddedGrammarListener::getJVM()
+{
+  return  delegate.getJVM();
+}
+
+jobject CWrapperEmbeddedGrammarListener::getListener()
+{
+  return  delegate.getListener();
+}
+
+void CWrapperEmbeddedGrammarListener::invokeMethod(const char* methodName)
+{
+    return  delegate.invokeMethod(methodName);
+}
+
+void CWrapperEmbeddedGrammarListener::onLoaded()
+{
+  delegate.onLoaded();
+}
+
+void CWrapperEmbeddedGrammarListener::onUnloaded()
+{
+  delegate.onUnloaded();
+}
+
+void CWrapperEmbeddedGrammarListener::onError(ReturnCode::Type returnCode)
+{
+  delegate.onError(returnCode);
+}
+
+void CWrapperEmbeddedGrammarListener::onError(jthrowable exception)
+{
+   delegate.onError(exception);
+}
+
+void CWrapperEmbeddedGrammarListener::onSaved(const char* path)
+{
+  UAPI_FN_SCOPE("CWrapperEmbeddedGrammarListener::onSaved");
+    
+  // Get enviromnent pointer for the current thread
+  JNIEnv* env = JNIHelper::getEnv(delegate.getJVM());
+  
+  jclass cls = env->GetObjectClass(delegate.getListener());
+  jmethodID mid = env->GetMethodID(cls, "onSaved", "(Ljava/lang/String;)V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  jstring jPath = env->NewStringUTF(path);
+  env->CallVoidMethod(delegate.getListener(), mid, jPath);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(jPath);
+}
+
+void CWrapperEmbeddedGrammarListener::onCompileAllSlots()
+{
+  UAPI_FN_SCOPE("CWrapperEmbeddedGrammarListener::onCompileAllSlots");
+    
+  delegate.invokeMethod("onCompileAllSlots");
+}
+
+void CWrapperEmbeddedGrammarListener::onResetAllSlots()
+{
+  UAPI_FN_SCOPE("CWrapperEmbeddedGrammarListener::onResetAllSlots");
+    
+  delegate.invokeMethod("onResetAllSlots");
+}
+
+bool CWrapperEmbeddedGrammarListener::isEmbeddedGrammarListener()
+{
+  return true;
+}
+bool CWrapperEmbeddedGrammarListener::isSrecGrammarListener()
+{
+  return false;
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperEmbeddedGrammarListener.h b/uapi/java/jniapi/jniapi/CWrapperEmbeddedGrammarListener.h
new file mode 100644
index 0000000..c68ed16
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperEmbeddedGrammarListener.h
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperEmbeddedGrammarListener.h                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPEREMBEDDEDGRAMMARLISTENER
+#define __UAPI__CWRAPPEREMBEDDEDGRAMMARLISTENER
+
+#include <jni.h>
+#include "EmbeddedGrammarListener.h"
+#include "CWrapperGrammarListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperEmbeddedGrammarListener: public EmbeddedGrammarListener
+        {
+          public:
+            CWrapperEmbeddedGrammarListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperEmbeddedGrammarListener();
+            JavaVM* getJVM();
+            jobject getListener();
+            void invokeMethod(const char* methodName);
+
+            virtual void onLoaded();
+            virtual void onUnloaded();
+            virtual void onSaved(const char* path);
+            virtual void onError(jthrowable exception);
+            virtual void onError(ReturnCode::Type returnCode);
+            virtual void onCompileAllSlots();
+            virtual void onResetAllSlots();
+            virtual bool isEmbeddedGrammarListener();
+            virtual bool isSrecGrammarListener();
+          protected:
+            /**
+             * The underlying listener.
+             */
+            CWrapperGrammarListener delegate;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CWrapperGrammarListener.cpp b/uapi/java/jniapi/jniapi/CWrapperGrammarListener.cpp
new file mode 100644
index 0000000..70c293c
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperGrammarListener.cpp
@@ -0,0 +1,145 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperGrammarListener.cpp                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "jniapi.h"
+#include "CWrapperGrammarListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperGrammarListener::CWrapperGrammarListener(JavaVM* _jvm, jobject _listener,
+    ReturnCode::Type& returnCode):
+    jvm(_jvm),
+    listener(0)
+{
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  listener = env->NewGlobalRef(_listener);
+  if (!listener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+CWrapperGrammarListener::~CWrapperGrammarListener()
+{
+  UAPI_FN_NAME("CWrapperGrammarListener::~CWrapperGrammarListener");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  // Delete global reference to the Java listener
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  env->DeleteGlobalRef(listener);
+}
+
+void CWrapperGrammarListener::invokeMethod(const char* methodName)
+{
+  UAPI_FN_SCOPE("CWrapperGrammarListener::invokeMethod");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, methodName, "()V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  env->CallVoidMethod(listener, mid, 0);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+}
+
+JavaVM* CWrapperGrammarListener::getJVM()
+{
+  return jvm;
+}
+
+jobject CWrapperGrammarListener::getListener()
+{
+  return listener;
+}
+
+void CWrapperGrammarListener::onLoaded()
+{
+  UAPI_FN_SCOPE("CWrapperGrammarListener::onLoaded");
+    
+  invokeMethod("onLoaded");
+}
+
+void CWrapperGrammarListener::onUnloaded()
+{
+  UAPI_FN_SCOPE("CWrapperGrammarListener::onUnloaded");
+    
+  invokeMethod("onUnloaded");
+}
+
+bool CWrapperGrammarListener::isEmbeddedGrammarListener()
+{
+  return false;
+}
+
+bool CWrapperGrammarListener::isSrecGrammarListener()
+{
+  return false;
+}
+
+void CWrapperGrammarListener::onError(ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("CWrapperGrammarListener::onError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  jobject exception = JNIHelper::getJavaException(env, listener, returnCode);
+  env->CallVoidMethod(listener, mid, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+}
+
+void CWrapperGrammarListener::onError(jthrowable exception)
+{
+  UAPI_FN_SCOPE("CWrapperGrammarListener::onError thru exception");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID onError = env->GetMethodID(listenerClass, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onError != 0);
+  env->CallVoidMethod(listener, onError, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperGrammarListener.h b/uapi/java/jniapi/jniapi/CWrapperGrammarListener.h
new file mode 100644
index 0000000..e6ad402
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperGrammarListener.h
@@ -0,0 +1,62 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperGrammarListener.h                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPERGRAMMARLISTENER
+#define __UAPI__CWRAPPERGRAMMARLISTENER
+
+#include <jni.h>
+#include "GrammarListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperGrammarListener: public GrammarListener
+        {
+          public:
+            CWrapperGrammarListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperGrammarListener();
+            JavaVM* getJVM();
+            jobject getListener();
+            /**
+             * Invokes the method with the specified name.
+             */
+            void invokeMethod(const char* methodName);
+            
+            virtual void onLoaded();
+            virtual void onUnloaded();
+            virtual void onError(jthrowable exception);
+            virtual void onError(ReturnCode::Type returnCode);
+            virtual bool isEmbeddedGrammarListener();
+            virtual bool isSrecGrammarListener();
+          private:
+            JavaVM* jvm;
+            jobject listener;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CWrapperMediaFileReaderListener.cpp b/uapi/java/jniapi/jniapi/CWrapperMediaFileReaderListener.cpp
new file mode 100644
index 0000000..7bd7359
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperMediaFileReaderListener.cpp
@@ -0,0 +1,127 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperMediaFileReaderListener.cpp                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "jniapi.h"
+#include "CWrapperMediaFileReaderListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperMediaFileReaderListener::CWrapperMediaFileReaderListener(JavaVM* _jvm, jobject _listener,
+    ReturnCode::Type& returnCode):
+    jvm(_jvm),
+    listener(0)
+{
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  listener = env->NewGlobalRef(_listener);
+  if (!listener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+CWrapperMediaFileReaderListener::~CWrapperMediaFileReaderListener()
+{
+  UAPI_FN_NAME("CWrapperMediaFileReaderListener::~CWrapperMediaFileReaderListener");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  // Delete global reference to the Java listener
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  env->DeleteGlobalRef(listener);
+}
+
+void CWrapperMediaFileReaderListener::invokeMethod(const char* methodName)
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileReaderListener::invokeMethod");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, methodName, "()V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  env->CallVoidMethod(listener, mid, 0);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+}
+
+void CWrapperMediaFileReaderListener::onStarted()
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileReaderListener::onStarted");
+    
+  invokeMethod("onStarted");
+}
+
+void CWrapperMediaFileReaderListener::onStopped()
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileReaderListener::onStopped");
+    
+  UAPI_INFO(fn,"CWrapperMediaFileReaderListener::onStopped()\n");
+  invokeMethod("onStopped");
+}
+
+void CWrapperMediaFileReaderListener::onError(ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileReaderListener::onError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  jobject exception = JNIHelper::getJavaException(env, listener, returnCode);
+  env->CallVoidMethod(listener, mid, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+}
+
+void CWrapperMediaFileReaderListener::onError(jthrowable exception)
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileReaderListener::onError thru exception");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID onError = env->GetMethodID(listenerClass, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onError != 0);
+  env->CallVoidMethod(listener, onError, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperMediaFileReaderListener.h b/uapi/java/jniapi/jniapi/CWrapperMediaFileReaderListener.h
new file mode 100644
index 0000000..427113d
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperMediaFileReaderListener.h
@@ -0,0 +1,59 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperMediaFileReaderListener.h                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPERMEDIAFILEREADERLISTENER
+#define __UAPI__CWRAPPERMEDIAFILEREADERLISTENER
+
+#include <jni.h>
+#include "MediaFileReaderListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperMediaFileReaderListener: public MediaFileReaderListener
+        {
+          public:
+            CWrapperMediaFileReaderListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperMediaFileReaderListener();
+            
+            void onStarted();
+            void onStopped();
+            void onError(jthrowable exception);
+            void onError(ReturnCode::Type returnCode);
+          protected:
+            /**
+            * Invokes the method with the specified name.
+            */
+            void invokeMethod(const char* methodName);
+          private:
+            JavaVM* jvm;
+            jobject listener;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CWrapperMediaFileWriterListener.cpp b/uapi/java/jniapi/jniapi/CWrapperMediaFileWriterListener.cpp
new file mode 100644
index 0000000..4bcceac
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperMediaFileWriterListener.cpp
@@ -0,0 +1,118 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperMediaFileWriterListener.cpp                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "jniapi.h"
+#include "CWrapperMediaFileWriterListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperMediaFileWriterListener::CWrapperMediaFileWriterListener(JavaVM* _jvm, jobject _listener,
+    ReturnCode::Type& returnCode):
+    jvm(_jvm),
+    listener(0)
+{
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  listener = env->NewGlobalRef(_listener);
+  if (!listener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+CWrapperMediaFileWriterListener::~CWrapperMediaFileWriterListener()
+{
+  UAPI_FN_NAME("CWrapperMediaFileWriterListener::~CWrapperMediaFileWriterListener");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  // Delete global reference to the Java listener
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  env->DeleteGlobalRef(listener);
+}
+
+void CWrapperMediaFileWriterListener::invokeMethod(const char* methodName)
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileWriterListener::invokeMethod");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, methodName, "()V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  env->CallVoidMethod(listener, mid, 0);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+}
+
+void CWrapperMediaFileWriterListener::onStopped()
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileWriterListener::onStopped");
+    
+  invokeMethod("onStopped");
+  
+}
+
+void CWrapperMediaFileWriterListener::onError(ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileWriterListener::onError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  jobject exception = JNIHelper::getJavaException(env, listener, returnCode);
+  env->CallVoidMethod(listener, mid, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+}
+
+void CWrapperMediaFileWriterListener::onError(jthrowable exception)
+{
+  UAPI_FN_SCOPE("CWrapperMediaFileWriterListener::onError thru exception");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID onError = env->GetMethodID(listenerClass, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onError != 0);
+  env->CallVoidMethod(listener, onError, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperMediaFileWriterListener.h b/uapi/java/jniapi/jniapi/CWrapperMediaFileWriterListener.h
new file mode 100644
index 0000000..ca5854d
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperMediaFileWriterListener.h
@@ -0,0 +1,58 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperMediaFileWriterListener.h                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPERMEDIAFILEWRITERLISTENER
+#define __UAPI__CWRAPPERMEDIAFILEWRITERLISTENER
+
+#include <jni.h>
+#include "MediaFileWriterListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperMediaFileWriterListener: public MediaFileWriterListener
+        {
+          public:
+            CWrapperMediaFileWriterListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperMediaFileWriterListener();
+            
+            void onStopped();
+            void onError(jthrowable exception);
+            void onError(ReturnCode::Type error);
+          protected:
+            /**
+            * Invokes the method with the specified name.
+            */
+            void invokeMethod(const char* methodName);
+          private:
+            JavaVM* jvm;
+            jobject listener;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CWrapperMicrophoneListener.cpp b/uapi/java/jniapi/jniapi/CWrapperMicrophoneListener.cpp
new file mode 100644
index 0000000..b29ebba
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperMicrophoneListener.cpp
@@ -0,0 +1,126 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperMicrophoneListener.cpp                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "jniapi.h"
+#include "CWrapperMicrophoneListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperMicrophoneListener::CWrapperMicrophoneListener(JavaVM* _jvm, jobject _listener,
+    ReturnCode::Type& returnCode):
+    jvm(_jvm),
+    listener(0)
+{
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  listener = env->NewGlobalRef(_listener);
+  if (!listener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+CWrapperMicrophoneListener::~CWrapperMicrophoneListener()
+{
+  UAPI_FN_NAME("CWrapperMicrophoneListener::~CWrapperMicrophoneListener");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  // Delete global reference to the Java listener
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  env->DeleteGlobalRef(listener);
+}
+
+void CWrapperMicrophoneListener::invokeMethod(const char* methodName)
+{
+  UAPI_FN_SCOPE("CWrapperMicrophoneListener::invokeMethod");
+  
+  UAPI_INFO(fn,"invokeMethod name: %s \n",methodName);
+
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, methodName, "()V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  env->CallVoidMethod(listener, mid, 0);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+}
+
+void CWrapperMicrophoneListener::onStarted()
+{
+  UAPI_FN_SCOPE("CWrapperMicrophoneListener::onStarted");
+    
+  invokeMethod("onStarted");
+}
+
+
+void CWrapperMicrophoneListener::onStopped()
+{
+  UAPI_FN_SCOPE("CWrapperMicrophoneListener::onStopped");
+    
+  invokeMethod("onStopped");
+}
+
+void CWrapperMicrophoneListener::onError(ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("CWrapperMicrophoneListener::onError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  jobject exception = JNIHelper::getJavaException(env, listener, returnCode);
+  env->CallVoidMethod(listener, mid, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+}
+void CWrapperMicrophoneListener::onError(jthrowable exception)
+{
+  UAPI_FN_SCOPE("CWrapperMicrophoneListener::onError thru exception");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID onError = env->GetMethodID(listenerClass, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onError != 0);
+  env->CallVoidMethod(listener, onError, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperMicrophoneListener.h b/uapi/java/jniapi/jniapi/CWrapperMicrophoneListener.h
new file mode 100644
index 0000000..793d5c1
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperMicrophoneListener.h
@@ -0,0 +1,59 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperMicrophoneListener.h                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPERMICROPHONELISTENER
+#define __UAPI__CWRAPPERMICROPHONELISTENER
+
+#include <jni.h>
+#include "MicrophoneListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperMicrophoneListener: public MicrophoneListener
+        {
+          public:
+            CWrapperMicrophoneListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperMicrophoneListener();
+            
+            void onStarted();
+            void onStopped();
+            void onError(jthrowable exception);
+            void onError(ReturnCode::Type returnCode);
+          protected:
+            /**
+             * Invokes the method with the specified name.
+             */
+            void invokeMethod(const char* methodName);
+          private:
+            JavaVM *jvm;
+            jobject listener;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CWrapperRecognizerListener.cpp b/uapi/java/jniapi/jniapi/CWrapperRecognizerListener.cpp
new file mode 100644
index 0000000..cafc1a6
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperRecognizerListener.cpp
@@ -0,0 +1,478 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperRecognizerListener.cpp                                           *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "CWrapperRecognizerListener.h"
+#include "jniapi.h"
+#include "JNIHelper.h"
+#include "Logger.h"
+
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperRecognizerListener::CWrapperRecognizerListener(JavaVM* _jvm, jobject _listener,
+    ReturnCode::Type& returnCode):
+    jvm(_jvm),
+    listener(0)
+{
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  listener = env->NewGlobalRef(_listener);
+  if (!listener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+CWrapperRecognizerListener::~CWrapperRecognizerListener()
+{
+  UAPI_FN_NAME("CWrapperRecognizerListener::~CWrapperRecognizerListener");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  // Delete global reference to the Java listener
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  env->DeleteGlobalRef(listener);
+}
+
+void CWrapperRecognizerListener::invokeMethod(const char* methodName)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::invokeMethod");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(listenerClass, methodName, "()V");
+  env->DeleteLocalRef(listenerClass);
+  assert(mid != 0);
+  if (mid != 0)
+    env->CallVoidMethod(listener, mid, 0);
+  
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+}
+
+void CWrapperRecognizerListener::onStarted()
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onStarted");
+    
+  invokeMethod("onStarted");
+}
+
+void CWrapperRecognizerListener::onBeginningOfSpeech()
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onBeginningOfSpeech");
+    
+  invokeMethod("onBeginningOfSpeech");
+}
+
+void CWrapperRecognizerListener::onEndOfSpeech()
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onEndOfSpeech");
+    
+  invokeMethod("onEndOfSpeech");
+}
+
+
+void CWrapperRecognizerListener::onAcousticStateReset()
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onAcousticStateReset");
+    
+  invokeMethod("onAcousticStateReset");
+}
+
+
+void CWrapperRecognizerListener::onStopped()
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onStopped");
+    
+  invokeMethod("onStopped");
+}
+
+void CWrapperRecognizerListener::onRecognitionFailure(FailureReason reason)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onRecognitionFailure");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  // Get object class
+  assert(listener != 0);
+  jclass cls = env->GetObjectClass(listener);
+  
+  // Get method id of the Java Callback member function
+  jmethodID mid = env->GetMethodID(cls, "onRecognitionFailure",
+                                   "(Landroid/speech/recognition/RecognizerListener$FailureReason;)V");
+  env->DeleteLocalRef(cls);
+    
+  assert(mid != 0);
+  
+  // We create now a Java ExpectedErrorType
+  jclass clsJavaFailureReason = JNIHelper::loadClass(env, listener,
+                                "android.speech.recognition.RecognizerListener$FailureReason");
+  assert(clsJavaFailureReason != 0);
+  
+  jfieldID failureReasonMethodId;
+  // If we found the class proceed
+  switch (reason)
+  {
+    case NO_MATCH:
+      failureReasonMethodId = env->GetStaticFieldID(clsJavaFailureReason, "NO_MATCH",
+                              "Landroid/speech/recognition/RecognizerListener$FailureReason;");
+      break;
+    case SPOKE_TOO_SOON:
+      failureReasonMethodId = env->GetStaticFieldID(clsJavaFailureReason, "SPOKE_TOO_SOON",
+                              "Landroid/speech/recognition/RecognizerListener$FailureReason;");
+      break;
+    case BEGINNING_OF_SPEECH_TIMEOUT:
+      failureReasonMethodId = env->GetStaticFieldID(clsJavaFailureReason, "BEGINNING_OF_SPEECH_TIMEOUT",
+                              "Landroid/speech/recognition/RecognizerListener$FailureReason;");
+      break;
+    case RECOGNITION_TIMEOUT:
+      failureReasonMethodId = env->GetStaticFieldID(clsJavaFailureReason, "RECOGNITION_TIMEOUT",
+                              "Landroid/speech/recognition/RecognizerListener$FailureReason;");
+      break;
+    case TOO_MUCH_SPEECH:
+      failureReasonMethodId = env->GetStaticFieldID(clsJavaFailureReason, "TOO_MUCH_SPEECH",
+                              "Landroid/speech/recognition/RecognizerListener$FailureReason;");
+      break;
+    case RECOGNITION_3RD_PARTY_ERROR:
+      failureReasonMethodId = env->GetStaticFieldID(clsJavaFailureReason, "RECOGNITION_3RD_PARTY_ERROR",
+                              "Landroid/speech/recognition/RecognizerListener$FailureReason;");
+      break;
+    case SPEECH_SERVER_UNAVAILABLE:
+      failureReasonMethodId = env->GetStaticFieldID(clsJavaFailureReason, "SPEECH_SERVER_UNAVAILABLE",
+                              "Landroid/speech/recognition/RecognizerListener$FailureReason;");
+      break;
+    case UNKNOWN:
+      failureReasonMethodId = env->GetStaticFieldID(clsJavaFailureReason, "UNKNOWN",
+                              "Landroid/speech/recognition/RecognizerListener$FailureReason;");
+      break;
+    default:
+      assert(false);
+      return;
+  }
+  
+  // Create the object
+  jobject jobjFailureReason = env->GetStaticObjectField(clsJavaFailureReason,
+                              failureReasonMethodId);
+                              
+  // Call JAVA member function of method object
+  env->CallVoidMethod(listener, mid, jobjFailureReason);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(jobjFailureReason);        
+  env->DeleteLocalRef(clsJavaFailureReason);
+}
+
+void CWrapperRecognizerListener::onError(jthrowable exception)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onError thru exception");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID onError = env->GetMethodID(listenerClass, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onError != 0);
+  env->CallVoidMethod(listener, onError, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+}
+
+void CWrapperRecognizerListener::onError(ReturnCode::Type error)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID onError = env->GetMethodID(listenerClass, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onError != 0);
+  jobject exception = JNIHelper::getJavaException(env, listener, error);
+  env->CallVoidMethod(listener, onError, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+}
+
+void CWrapperRecognizerListener::onRecognitionSuccess(RecognitionResultProxy& result)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onRecognitionSuccess");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  assert(listener != 0);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jobject recognitionResult = 0;
+
+  // Cast to a valid object (because RecognitionResult is an interface)
+    NBestRecognitionResultProxy& nbest = (NBestRecognitionResultProxy&) result;
+
+    // We create now a Java NBestRecognitionResultImpl
+    jclass recognitionResultClass = JNIHelper::loadClass(env, listener,
+                                    "android.speech.recognition.impl.NBestRecognitionResultImpl");
+                                    
+    jmethodID recognitionResultConstructor = env->GetMethodID(recognitionResultClass, "<init>", "(J)V");
+    assert(recognitionResultConstructor != 0);
+
+    // Create the object
+    recognitionResult = env->NewObject(recognitionResultClass,
+                    recognitionResultConstructor, (jlong)((void*)&nbest));
+    env->DeleteLocalRef(recognitionResultClass);
+    assert(recognitionResult != 0);
+  
+  jmethodID onRecognitionSuccess = env->GetMethodID(listenerClass, "onRecognitionSuccess",
+                                   "(Landroid/speech/recognition/RecognitionResult;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onRecognitionSuccess != 0);
+  
+  env->CallVoidMethod(listener, onRecognitionSuccess, recognitionResult);
+ 
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(recognitionResult);
+}
+
+jobject CWrapperRecognizerListener::pairsToHashtable(const char** keys, const char** values,
+    ARRAY_LIMIT count)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::pairsToHashtable");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass hashtableClass = JNIHelper::loadClass(env, listener, "java.util.Hashtable");
+  assert(hashtableClass != 0);
+  
+  jmethodID hashtableConstructor = env->GetMethodID(hashtableClass, "<init>", "()V");
+  assert(hashtableConstructor != 0);
+  
+  jobject result = env->NewObject(hashtableClass, hashtableConstructor);
+  assert(result != 0);
+  
+  jmethodID hashtablePut = env->GetMethodID(hashtableClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+  env->DeleteLocalRef(hashtableClass);
+  assert(hashtablePut != 0);
+  
+  for (ARRAY_LIMIT i = 0; i < count; ++i)
+  {
+    jstring key = env->NewStringUTF(keys[i]);
+    if (!key)
+    {
+      env->DeleteLocalRef(result);
+      JNIHelper::throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+    jstring value = env->NewStringUTF((values[i] != 0 ? values[i]:""));
+    if (!value)
+    {
+      env->DeleteLocalRef(result);
+      env->DeleteLocalRef(key);
+      JNIHelper::throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+    
+    jobject previousObject = env->CallObjectMethod(result, hashtablePut, key, value);
+    if (env->ExceptionCheck())
+    {
+        jthrowable exc = env->ExceptionOccurred();
+        env->ExceptionClear();
+        env->DeleteLocalRef(exc);
+        env->DeleteLocalRef(previousObject);
+        env->DeleteLocalRef(value);
+        env->DeleteLocalRef(key);
+        return 0;
+    }
+    env->DeleteLocalRef(previousObject);
+    env->DeleteLocalRef(value);
+    env->DeleteLocalRef(key);
+  }
+  return result;
+}
+
+jobject CWrapperRecognizerListener::keysToVector(const char** keys, ARRAY_LIMIT count)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onParametersGetError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass vectorClass = JNIHelper::loadClass(env, listener, "java.util.Vector");
+  assert(vectorClass != 0);
+  
+  jmethodID vectorConstructor = env->GetMethodID(vectorClass, "<init>", "()V");
+  assert(vectorConstructor != 0);
+  
+  jobject result = env->NewObject(vectorClass, vectorConstructor);
+  assert(result != 0);
+  
+  jmethodID vectorAdd = env->GetMethodID(vectorClass, "add", "(Ljava/lang/Object;)Z");
+  env->DeleteLocalRef(vectorClass);
+  assert(vectorAdd != 0);
+  
+  for (ARRAY_LIMIT i = 0; i < count; ++i)
+  {
+    jstring key = env->NewStringUTF(keys[i]);
+    if (!key)
+    {
+      env->DeleteLocalRef(result);
+      JNIHelper::throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+    
+    env->CallBooleanMethod(result, vectorAdd, key);
+    if (env->ExceptionCheck())
+    {
+        jthrowable exc = env->ExceptionOccurred();
+        env->ExceptionClear();
+        env->DeleteLocalRef(exc);
+        env->DeleteLocalRef(key);
+        return 0;
+    }
+    env->DeleteLocalRef(key);
+  }
+  return result;
+}
+
+void CWrapperRecognizerListener::onParametersGetError(const char** keys, ARRAY_LIMIT count,
+    ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onParametersGetError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass clazz = env->GetObjectClass(listener);
+  
+  jmethodID onParametersGetError = env->GetMethodID(clazz, "onParametersGetError",
+                                   "(Ljava/util/Vector;Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(clazz);
+  assert(onParametersGetError != 0);
+  
+  jobject parameters = keysToVector(keys, count);
+  assert(parameters != 0);
+  
+  jobject exception = JNIHelper::getJavaException(env, listener, returnCode);
+  assert(exception != 0);
+  
+  env->CallVoidMethod(listener, onParametersGetError, parameters, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+  env->DeleteLocalRef(parameters);
+}
+
+void CWrapperRecognizerListener::onParametersSetError(const char** keys, const char** values,
+    ARRAY_LIMIT count, ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onParametersSetError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass clazz = env->GetObjectClass(listener);
+  
+  jmethodID onParametersSetError = env->GetMethodID(clazz, "onParametersSetError",
+                                   "(Ljava/util/Hashtable;Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(clazz);
+  assert(onParametersSetError != 0);
+  
+  jobject parameters = pairsToHashtable(keys, values, count);
+  assert(parameters != 0);
+  
+  jobject exception = JNIHelper::getJavaException(env, listener, returnCode);
+  assert(exception != 0);
+  
+  env->CallVoidMethod(listener, onParametersSetError, parameters, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+  env->DeleteLocalRef(parameters);
+}
+
+void CWrapperRecognizerListener::onParametersSet(const char** keys, const char** values,
+    ARRAY_LIMIT count)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onParametersSet");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  jobject parameters = pairsToHashtable(keys, values, count);
+  assert(parameters != 0);
+  
+  jclass clazz = env->GetObjectClass(listener);
+  jmethodID methodID = env->GetMethodID(clazz, "onParametersSet", "(Ljava/util/Hashtable;)V");
+  env->DeleteLocalRef(clazz);
+  env->CallVoidMethod(listener, methodID, parameters);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(parameters);
+}
+
+void CWrapperRecognizerListener::onParametersGet(const char** keys, const char** values,
+    ARRAY_LIMIT count)
+{
+  UAPI_FN_SCOPE("CWrapperRecognizerListener::onParametersGet");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  
+  jobject parameters = pairsToHashtable(keys, values, count);
+  assert(parameters != 0);
+  
+  jclass clazz = env->GetObjectClass(listener);
+  jmethodID methodID = env->GetMethodID(clazz, "onParametersGet", "(Ljava/util/Hashtable;)V");
+  env->DeleteLocalRef(clazz);
+  env->CallVoidMethod(listener, methodID, parameters);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(parameters);
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperRecognizerListener.h b/uapi/java/jniapi/jniapi/CWrapperRecognizerListener.h
new file mode 100644
index 0000000..aea9002
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperRecognizerListener.h
@@ -0,0 +1,81 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperRecognizerListener.h                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPERRECOGNIZERLISTENER
+#define __UAPI__CWRAPPERRECOGNIZERLISTENER
+
+#include <jni.h>
+#include "ReturnCode.h"
+#include "RecognizerListener.h"
+#include "NBestRecognitionResult.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperRecognizerListener: public RecognizerListener
+        {
+          public:
+            CWrapperRecognizerListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperRecognizerListener();
+            
+            const char* toString(FailureReason reason);
+            void onStarted();
+            void onBeginningOfSpeech();
+            void onEndOfSpeech();
+            void onRecognitionSuccess(RecognitionResultProxy& result);
+            void onRecognitionFailure(FailureReason reason);
+            void onError(jthrowable exception);
+            void onError(ReturnCode::Type returnCode);
+            void onStopped();
+            void onParametersSetError(const char** keys, const char** values, ARRAY_LIMIT count,
+                                      ReturnCode::Type returnCode);
+            void onParametersGetError(const char** keys, ARRAY_LIMIT count,
+                                      ReturnCode::Type returnCode);
+            void onParametersSet(const char** keys, const char** values, ARRAY_LIMIT count);
+            void onParametersGet(const char** keys, const char** values, ARRAY_LIMIT count);
+            void onAcousticStateReset();
+          protected:
+            /**
+            * Invokes the method with the specified name.
+            */
+            void invokeMethod(const char* methodName);
+          private:
+            /**
+            * Converts key-value pairs to a hashtable.
+            */
+            jobject pairsToHashtable(const char** keys, const char** values, ARRAY_LIMIT count);
+            /**
+            * Converts a list of keys to a vector.
+            */
+            jobject keysToVector(const char** keys, ARRAY_LIMIT count);
+            JavaVM* jvm;
+            jobject listener;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CWrapperSrecGrammarListener.cpp b/uapi/java/jniapi/jniapi/CWrapperSrecGrammarListener.cpp
new file mode 100644
index 0000000..149cd21
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperSrecGrammarListener.cpp
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperSrecGrammarListener.cpp                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "jniapi.h"
+#include "CWrapperSrecGrammarListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperSrecGrammarListener::CWrapperSrecGrammarListener(JavaVM* jvm, jobject listener,
+    ReturnCode::Type& returnCode):
+    delegate(jvm, listener, returnCode)
+{
+}
+
+CWrapperSrecGrammarListener::~CWrapperSrecGrammarListener()
+{}
+
+void CWrapperSrecGrammarListener::onLoaded()
+{
+    delegate.onLoaded();
+}
+
+void CWrapperSrecGrammarListener::onUnloaded()
+{
+    delegate.onUnloaded();
+}
+
+void CWrapperSrecGrammarListener::onError(ReturnCode::Type returnCode)
+{
+    delegate.onError(returnCode);
+}
+
+void CWrapperSrecGrammarListener::onError(jthrowable exception)
+{
+  delegate.onError(exception);
+}
+
+void CWrapperSrecGrammarListener::onSaved(const char* path)
+{
+  delegate.onSaved(path);
+}
+
+void CWrapperSrecGrammarListener::onCompileAllSlots()
+{
+    delegate.invokeMethod("onCompileAllSlots");
+}
+
+void CWrapperSrecGrammarListener::onResetAllSlots()
+{
+    delegate.invokeMethod("onResetAllSlots");
+}
+
+bool CWrapperSrecGrammarListener::isEmbeddedGrammarListener()
+{
+  return true;
+}
+
+bool CWrapperSrecGrammarListener::isSrecGrammarListener()
+{
+  return true;
+}
+
+void CWrapperSrecGrammarListener::onAddItemList()
+{
+    delegate.invokeMethod("onAddItemList");
+}
+
+void CWrapperSrecGrammarListener::onAddItemListFailure(int index, ReturnCode::Type returnCode)
+{
+    UAPI_FN_SCOPE("CWrapperSrecGrammarListener::onAddItemListFailure");
+    // Get enviromnent pointer for the current thread
+    JNIEnv* env = JNIHelper::getEnv(delegate.getJVM());
+  
+    jclass cls = env->GetObjectClass(delegate.getListener());
+    jmethodID mid = env->GetMethodID(cls, "onAddItemListFailure", "(ILjava/lang/Exception;)V");
+    env->DeleteLocalRef(cls);
+    assert(mid != 0);
+
+    jclass clazz = JNIHelper::loadClass(env, delegate.getListener(), "java.lang.RuntimeException");
+    jmethodID constructor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;)V");
+    assert(constructor != 0);
+    jstring jrc = env->NewStringUTF(ReturnCode::toString(returnCode));
+    jobject exception = env->NewObject(clazz, constructor, jrc);
+    env->DeleteLocalRef(jrc);
+    env->DeleteLocalRef(clazz);
+
+    env->CallVoidMethod(delegate.getListener(), mid,(jint) index, exception);
+    if (env->ExceptionCheck())
+    {
+        jthrowable exc = env->ExceptionOccurred();
+        env->ExceptionClear();
+        env->DeleteLocalRef(exc);
+    }
+    env->DeleteLocalRef(exception);
+}
+
+void CWrapperSrecGrammarListener::onLoadedVoicetag()
+{
+    delegate.invokeMethod("onLoadedVoicetag");
+}
+
+void CWrapperSrecGrammarListener::onSavedVoicetag()
+{
+    delegate.invokeMethod("onSavedVoicetag");
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperSrecGrammarListener.h b/uapi/java/jniapi/jniapi/CWrapperSrecGrammarListener.h
new file mode 100644
index 0000000..0e28091
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperSrecGrammarListener.h
@@ -0,0 +1,66 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperSrecGrammarListener.h                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPERSRECGRAMMARLISTENER
+#define __UAPI__CWRAPPERSRECGRAMMARLISTENER
+
+#include <jni.h>
+#include "SrecGrammarListener.h"
+#include "CWrapperEmbeddedGrammarListener.h"
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperSrecGrammarListener: public SrecGrammarListener
+        {
+          public:
+            CWrapperSrecGrammarListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperSrecGrammarListener();
+            
+            virtual void onLoaded();
+            virtual void onUnloaded();
+            virtual void onSaved(const char* path);
+            virtual void onError(jthrowable exception);
+            virtual void onError(ReturnCode::Type returnCode);
+            virtual void onCompileAllSlots();
+            virtual void onResetAllSlots();
+            virtual bool isEmbeddedGrammarListener();
+            virtual bool isSrecGrammarListener();
+            virtual void onAddItemList();
+            virtual void onAddItemListFailure(int index, ReturnCode::Type returnCode);
+            virtual void onLoadedVoicetag();
+            virtual void onSavedVoicetag();
+
+          private:
+            /**
+             * The underlying listener.
+             */
+            CWrapperEmbeddedGrammarListener delegate;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CWrapperVoicetagListener.cpp b/uapi/java/jniapi/jniapi/CWrapperVoicetagListener.cpp
new file mode 100644
index 0000000..d2e143e
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperVoicetagListener.cpp
@@ -0,0 +1,137 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperVoicetagListener.cpp                                      *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <assert.h>
+#include "jniapi.h"
+#include "CWrapperVoicetagListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+CWrapperVoicetagListener::CWrapperVoicetagListener(JavaVM* _jvm, jobject _listener,
+    ReturnCode::Type& returnCode):
+    jvm(_jvm),
+    listener(0)
+{
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  listener = env->NewGlobalRef(_listener);
+  if (!listener)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return;
+  }
+  returnCode = ReturnCode::SUCCESS;
+}
+
+CWrapperVoicetagListener::~CWrapperVoicetagListener()
+{
+  UAPI_FN_NAME("CWrapperVoicetagListener::~CWrapperVoicetagListener");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  // Delete global reference to the Java listener
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  env->DeleteGlobalRef(listener);
+}
+
+void CWrapperVoicetagListener::invokeMethod(const char* methodName)
+{
+  UAPI_FN_SCOPE("CWrapperVoicetagListener::invokeMethod");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, methodName, "()V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  env->CallVoidMethod(listener, mid, 0);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    onError(exc);
+    env->DeleteLocalRef(exc);
+  }
+}
+
+void CWrapperVoicetagListener::onSaved(const char* path)
+{
+    UAPI_FN_SCOPE("CWrapperVoicetagListener::onSaved");
+
+    JNIEnv* env = JNIHelper::getEnv(jvm);
+    jclass cls = env->GetObjectClass(listener);
+    jmethodID mid = env->GetMethodID(cls, "onSaved", "(Ljava/lang/String;)V");
+    env->DeleteLocalRef(cls);
+    assert(mid != 0);
+    jstring jPath = env->NewStringUTF(path);
+    env->CallVoidMethod(listener, mid, jPath);
+    if (env->ExceptionCheck())
+    {
+        jthrowable exc = env->ExceptionOccurred();
+        env->ExceptionClear();
+        onError(exc);
+        env->DeleteLocalRef(exc);
+    }
+    env->DeleteLocalRef(jPath);
+}
+
+void CWrapperVoicetagListener::onLoaded()
+{
+    UAPI_FN_SCOPE("CWrapperVoicetagListener::onLoaded");
+    invokeMethod("onLoaded");
+}
+
+void CWrapperVoicetagListener::onError(ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("CWrapperVoicetagListener::onError");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass cls = env->GetObjectClass(listener);
+  jmethodID mid = env->GetMethodID(cls, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(cls);
+  assert(mid != 0);
+  jobject exception = JNIHelper::getJavaException(env, listener, returnCode);
+  env->CallVoidMethod(listener, mid, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+  env->DeleteLocalRef(exception);
+}
+
+void CWrapperVoicetagListener::onError(jthrowable exception)
+{
+  UAPI_FN_SCOPE("CWrapperVoicetagListener::onError thru exception");
+    
+  JNIEnv* env = JNIHelper::getEnv(jvm);
+  jclass listenerClass = env->GetObjectClass(listener);
+  jmethodID onError = env->GetMethodID(listenerClass, "onError", "(Ljava/lang/Exception;)V");
+  env->DeleteLocalRef(listenerClass);
+  assert(onError != 0);
+  env->CallVoidMethod(listener, onError, exception);
+  if (env->ExceptionCheck())
+  {
+    jthrowable exc = env->ExceptionOccurred();
+    env->ExceptionClear();
+    env->DeleteLocalRef(exc);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/CWrapperVoicetagListener.h b/uapi/java/jniapi/jniapi/CWrapperVoicetagListener.h
new file mode 100644
index 0000000..0ab4b88
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CWrapperVoicetagListener.h
@@ -0,0 +1,59 @@
+/*---------------------------------------------------------------------------*
+ *  CWrapperVoicetagListener.h                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __UAPI__CWRAPPERVOICETAGLISTENER
+#define __UAPI__CWRAPPERVOICETAGLISTENER
+
+#include <jni.h>
+#include "VoicetagItemListener.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class CWrapperVoicetagListener: public VoicetagItemListener
+        {
+          public:
+            CWrapperVoicetagListener(JavaVM* jvm, jobject listener, ReturnCode::Type& returnCode);
+            ~CWrapperVoicetagListener();
+
+            void onSaved(const char* path);
+            void onLoaded();
+            void onError(jthrowable exception);
+            void onError(ReturnCode::Type error);
+          protected:
+            /**
+            * Invokes the method with the specified name.
+            */
+            void invokeMethod(const char* methodName);
+          private:
+            JavaVM* jvm;
+            jobject listener;
+        };
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/CreatingJniFiles.txt b/uapi/java/jniapi/jniapi/CreatingJniFiles.txt
new file mode 100644
index 0000000..e84ed97
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/CreatingJniFiles.txt
@@ -0,0 +1,12 @@
+---------------------------------------------------------
+	 UAPI JNI Header Creation process
+---------------------------------------------------------
+
+- Edit file create_jni_h.bat and change the classpath where the
+uapi classes are located (Ex. /XSA/Q/UnifiedSpeechAPI/build/classes)
+
+- Execute the create_jni_h.bat and all the JNI header files will be created.
+
+- Remeber that every time you regenerate the header files you should also
+verify that all the .CPP files are updated as well (this is a manual process).
+
diff --git a/uapi/java/jniapi/jniapi/JNIHelper.cpp b/uapi/java/jniapi/jniapi/JNIHelper.cpp
new file mode 100644
index 0000000..5dd3794
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/JNIHelper.cpp
@@ -0,0 +1,1020 @@
+/*---------------------------------------------------------------------------*
+ *  JNIHelper.cpp                                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include "JNIHelper.h"
+#include "System.h"
+#include "jniapi.h"
+#include "Mutex.h"
+#include "CWrapperEmbeddedGrammarListener.h"
+#include "CWrapperSrecGrammarListener.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::utilities;
+using namespace android::speech::recognition::jni;
+
+#ifdef ENABLE_JNI_KEEP_ALIVE
+JVMKeepAlive::ComponentInitializer::ComponentInitializer()
+{
+  mutex = Mutex::create(false, returnCode);
+  if (returnCode)
+  {
+    fprintf(stderr, "Could not create JNIKeepAlive::mutex\n");
+    return;
+  }
+}
+
+JVMKeepAlive::ComponentInitializer::~ComponentInitializer()
+{
+  delete mutex;
+  returnCode = ReturnCode::UNKNOWN;
+}
+#endif
+
+Codec::Type JNIHelper::toNativeCodec(JNIEnv* env, jobject codec)
+{
+  UAPI_FN_SCOPE("JNIHelper::toNativeCodec");
+  
+  const char codecClassName[] = "Landroid/speech/recognition/Codec;";
+  jclass codecClass = loadClass(env, codec, "android.speech.recognition.Codec");
+  
+  jfieldID PCM_16BIT_8K_field = env->GetStaticFieldID(codecClass, "PCM_16BIT_8K", codecClassName);
+  jobject PCM_16BIT_8K = env->GetStaticObjectField(codecClass, PCM_16BIT_8K_field);
+  
+  jfieldID PCM_16BIT_11K_field = env->GetStaticFieldID(codecClass, "PCM_16BIT_11K", codecClassName);
+  jobject PCM_16BIT_11K = env->GetStaticObjectField(codecClass, PCM_16BIT_11K_field);
+  
+  jfieldID PCM_16BIT_22K_field = env->GetStaticFieldID(codecClass, "PCM_16BIT_22K", codecClassName);
+  jobject PCM_16BIT_22K = env->GetStaticObjectField(codecClass, PCM_16BIT_22K_field);
+
+  jfieldID ULAW_8BIT_8K_field = env->GetStaticFieldID(codecClass, "ULAW_8BIT_8K", codecClassName);
+  jobject ULAW_8BIT_8K = env->GetStaticObjectField(codecClass, ULAW_8BIT_8K_field);
+  
+  Codec::Type nativeCodec;
+  if (env->IsSameObject(codec, PCM_16BIT_8K))
+    nativeCodec = Codec::PCM_16BIT_8K;
+  else if (env->IsSameObject(codec, PCM_16BIT_11K))
+    nativeCodec = Codec::PCM_16BIT_11K;
+  else if (env->IsSameObject(codec, PCM_16BIT_22K))
+    nativeCodec = Codec::PCM_16BIT_22K;
+  else if (env->IsSameObject(codec, ULAW_8BIT_8K))
+    nativeCodec = Codec::ULAW_8BIT_8K;
+  else
+  {
+    env->DeleteLocalRef(PCM_16BIT_8K);
+    env->DeleteLocalRef(PCM_16BIT_11K);
+    env->DeleteLocalRef(PCM_16BIT_22K);
+    env->DeleteLocalRef(ULAW_8BIT_8K);
+    char message[256] = "Unknown codec: ";
+    jmethodID toStringMethod = env->GetMethodID(codecClass, "toString", "()Ljava/lang/String;");
+    env->DeleteLocalRef(codecClass);
+    assert(toStringMethod != 0);
+    jstring toStringValue = (jstring) env->CallObjectMethod(codec, toStringMethod);
+    if (env->ExceptionCheck())
+    {
+        env->ExceptionClear();
+      // Return value is undefined because we're throwing an exception
+      return Codec::PCM_16BIT_8K;
+    }
+    const char* codecString = env->GetStringUTFChars(toStringValue, 0);
+    strcat(message, codecString);
+    env->ReleaseStringUTFChars(toStringValue, codecString);
+    env->DeleteLocalRef(toStringValue);
+    
+    throwRuntimeJavaException(env, codec, message);
+    // Return value is undefined because we're throwing an exception
+    return Codec::PCM_16BIT_8K;
+  }
+  env->DeleteLocalRef(codecClass);
+  env->DeleteLocalRef(PCM_16BIT_8K);
+  env->DeleteLocalRef(PCM_16BIT_11K);
+  env->DeleteLocalRef(PCM_16BIT_22K);
+  env->DeleteLocalRef(ULAW_8BIT_8K);
+  return nativeCodec;
+}
+
+
+MediaFileReader::ReadingMode JNIHelper::toNativeMediaFileReaderMode(JNIEnv* env, jobject mode)
+{
+  UAPI_FN_SCOPE("JNIHelper::toNativeMediaFileReaderMode");
+  
+  const char modeClassName[] = "Landroid/speech/recognition/MediaFileReader$Mode;";
+  jclass modeClass = loadClass(env, mode, "android.speech.recognition.MediaFileReader$Mode");
+  assert(modeClass != 0);
+  
+  jfieldID REAL_TIME_field = env->GetStaticFieldID(modeClass, "REAL_TIME", modeClassName);
+  assert(REAL_TIME_field != 0);
+  jobject REAL_TIME = env->GetStaticObjectField(modeClass, REAL_TIME_field);
+  
+  jfieldID ALL_AT_ONCE_field = env->GetStaticFieldID(modeClass, "ALL_AT_ONCE", modeClassName);
+  assert(ALL_AT_ONCE_field != 0);
+  jobject ALL_AT_ONCE = env->GetStaticObjectField(modeClass, ALL_AT_ONCE_field);
+  
+  MediaFileReader::ReadingMode nativeMode;
+  if (env->IsSameObject(mode, REAL_TIME))
+    nativeMode = MediaFileReader::REAL_TIME;
+  else if (env->IsSameObject(mode, ALL_AT_ONCE))
+    nativeMode = MediaFileReader::ALL_AT_ONCE;
+  else
+  {
+    env->DeleteLocalRef(REAL_TIME);
+    env->DeleteLocalRef(ALL_AT_ONCE);
+    char message[256] = "Unknown reading mode: ";
+    jmethodID toStringMethod = env->GetMethodID(modeClass, "toString", "()Ljava/lang/String;");
+    env->DeleteLocalRef(modeClass);
+    assert(toStringMethod != 0);
+    jstring toStringValue = (jstring) env->CallObjectMethod(mode, toStringMethod);
+    if (env->ExceptionCheck())
+    {
+      env->ExceptionClear();
+      // Return value is undefined because we're throwing an exception
+      return MediaFileReader::REAL_TIME;
+    }
+    const char* modeString = env->GetStringUTFChars(toStringValue, 0);
+    strcat(message, modeString);
+    env->ReleaseStringUTFChars(toStringValue, modeString);
+    env->DeleteLocalRef(toStringValue);
+    
+    throwRuntimeJavaException(env, mode, message);
+    
+    // Return value is undefined because we're throwing an exception
+    return MediaFileReader::REAL_TIME;
+  }
+  env->DeleteLocalRef(modeClass);
+  env->DeleteLocalRef(REAL_TIME);
+  env->DeleteLocalRef(ALL_AT_ONCE);
+  return nativeMode;
+}
+
+Logger::LogLevel JNIHelper::toNativeLogLevel(JNIEnv* env, jobject loglevel)
+{
+  UAPI_FN_SCOPE("JNIHelper::toNativeLogLevel");
+  
+  const char loggerClassName[] = "Landroid/speech/recognition/Logger$LogLevel;";
+  jclass loglevelClass = loadClass(env, loglevel, "android.speech.recognition.Logger$LogLevel");
+  assert(loglevelClass != 0);
+  
+  jfieldID LEVEL_NONE_field = env->GetStaticFieldID(loglevelClass, "LEVEL_NONE", loggerClassName);
+  assert(LEVEL_NONE_field != 0);
+  jobject LEVEL_NONE = env->GetStaticObjectField(loglevelClass, LEVEL_NONE_field);
+  
+  jfieldID LEVEL_ERROR_field = env->GetStaticFieldID(loglevelClass, "LEVEL_ERROR", loggerClassName);
+  assert(LEVEL_ERROR_field != 0);
+  jobject LEVEL_ERROR = env->GetStaticObjectField(loglevelClass, LEVEL_ERROR_field);
+  
+  jfieldID LEVEL_WARN_field = env->GetStaticFieldID(loglevelClass, "LEVEL_WARN", loggerClassName);
+  assert(LEVEL_WARN_field != 0);
+  jobject LEVEL_WARN = env->GetStaticObjectField(loglevelClass, LEVEL_WARN_field);
+  
+  jfieldID LEVEL_INFO_field = env->GetStaticFieldID(loglevelClass, "LEVEL_INFO", loggerClassName);
+  assert(LEVEL_INFO_field != 0);
+  jobject LEVEL_INFO = env->GetStaticObjectField(loglevelClass, LEVEL_INFO_field);
+  
+  jfieldID LEVEL_TRACE_field = env->GetStaticFieldID(loglevelClass, "LEVEL_TRACE", loggerClassName);
+  assert(LEVEL_TRACE_field != 0);
+  jobject LEVEL_TRACE = env->GetStaticObjectField(loglevelClass, LEVEL_TRACE_field);
+  
+  
+  Logger::LogLevel nativeLogLevel;
+  if (env->IsSameObject(loglevel, LEVEL_NONE))
+    nativeLogLevel = Logger::LEVEL_NONE;
+  else if (env->IsSameObject(loglevel, LEVEL_ERROR))
+    nativeLogLevel = Logger::LEVEL_ERROR;
+  else if (env->IsSameObject(loglevel, LEVEL_WARN))
+    nativeLogLevel = Logger::LEVEL_WARN;
+  else if (env->IsSameObject(loglevel, LEVEL_INFO))
+    nativeLogLevel = Logger::LEVEL_INFO;
+  else if (env->IsSameObject(loglevel, LEVEL_TRACE))
+    nativeLogLevel = Logger::LEVEL_TRACE;
+  else
+  {
+    env->DeleteLocalRef(LEVEL_NONE);
+    env->DeleteLocalRef(LEVEL_ERROR);
+    env->DeleteLocalRef(LEVEL_WARN);
+    env->DeleteLocalRef(LEVEL_INFO);
+    env->DeleteLocalRef(LEVEL_TRACE);
+    char message[256] = "Unknown log level: ";
+    jmethodID toStringMethod = env->GetMethodID(loglevelClass, "toString", "()Ljava/lang/String;");
+    env->DeleteLocalRef(loglevelClass);
+    assert(toStringMethod != 0);
+    jstring toStringValue = (jstring) env->CallObjectMethod(loglevel, toStringMethod);
+    if (env->ExceptionCheck())
+    {
+      env->ExceptionClear();
+      // Return value is undefined because we're throwing an exception
+      return Logger::LEVEL_NONE;
+    }
+    const char* modeString = env->GetStringUTFChars(toStringValue, 0);
+    strcat(message, modeString);
+    env->ReleaseStringUTFChars(toStringValue, modeString);
+    env->DeleteLocalRef(toStringValue);
+    
+    throwRuntimeJavaException(env, loglevel, message);
+    
+    // Return value is undefined because we're throwing an exception
+    return Logger::LEVEL_NONE;
+  }
+  env->DeleteLocalRef(loglevelClass);
+  env->DeleteLocalRef(LEVEL_NONE);
+  env->DeleteLocalRef(LEVEL_ERROR);
+  env->DeleteLocalRef(LEVEL_WARN);
+  env->DeleteLocalRef(LEVEL_INFO);
+  env->DeleteLocalRef(LEVEL_TRACE);
+  return nativeLogLevel;
+}
+
+JavaVM* JNIHelper::getJVM(JNIEnv* env, jobject reference)
+{
+  JavaVM* result;
+  if (env->GetJavaVM(&result) < 0)
+  {
+    throwRuntimeJavaException(env, reference, "GetJavaVM() failed");
+    return 0;
+  }
+  return result;
+}
+
+GrammarListenerProxy JNIHelper::getNativeGrammarListener(JNIEnv* env, jobject listener)
+{
+  ReturnCode::Type returnCode = ReturnCode::UNKNOWN;
+  UAPI_FN_SCOPE("getNativeGrammarListener");
+    
+  JavaVM* jvm = getJVM(env, listener);
+  if (env->ExceptionCheck())
+  {
+      env->ExceptionClear();
+      return GrammarListenerProxy();
+  } 
+  jclass EmbeddedGrammarListenerClass = loadClass(env, listener,
+                                        "android.speech.recognition.EmbeddedGrammarListener");
+  assert(EmbeddedGrammarListenerClass != 0);
+  jclass SrecGrammarListenerClass = loadClass(env, listener,
+                                        "android.speech.recognition.SrecGrammarListener");
+  assert(SrecGrammarListenerClass != 0);
+
+  if (env->IsInstanceOf(listener, SrecGrammarListenerClass))
+  { 
+    env->DeleteLocalRef(SrecGrammarListenerClass);
+    CWrapperSrecGrammarListener* temp = new CWrapperSrecGrammarListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return GrammarListenerProxy();
+    }
+    else if (returnCode)
+    {
+      throwJavaException(env, listener, returnCode);
+      return GrammarListenerProxy();
+    }
+    else if (env->ExceptionCheck())
+    {
+      env->ExceptionClear();
+      delete temp;
+      return GrammarListenerProxy();
+    }
+    SrecGrammarListenerProxy result = SrecGrammarListenerProxy(temp);
+    if (!result)
+    {
+      throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return GrammarListenerProxy();
+    }
+    return result;
+  }
+  else if (env->IsInstanceOf(listener, EmbeddedGrammarListenerClass))
+  {
+    env->DeleteLocalRef(EmbeddedGrammarListenerClass);
+    CWrapperEmbeddedGrammarListener* temp = new CWrapperEmbeddedGrammarListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return GrammarListenerProxy();
+    }
+    else if (returnCode)
+    {
+      throwJavaException(env, listener, returnCode);
+      return GrammarListenerProxy();
+    }
+    else if (env->ExceptionCheck())
+    {
+      env->ExceptionClear();
+      delete temp;
+      return GrammarListenerProxy();
+    }
+    EmbeddedGrammarListenerProxy result = EmbeddedGrammarListenerProxy(temp);
+    if (!result)
+    {
+      throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return GrammarListenerProxy();
+    }
+    return result;
+  }
+  else
+  {
+    env->DeleteLocalRef(EmbeddedGrammarListenerClass);
+    CWrapperGrammarListener* temp = new CWrapperGrammarListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return GrammarListenerProxy();
+    }
+    else if (returnCode)
+    {
+      throwJavaException(env, listener, returnCode);
+      return GrammarListenerProxy();
+    }
+    else if (env->ExceptionCheck())
+    {
+      env->ExceptionClear();
+      delete temp;
+      return GrammarListenerProxy();
+    }
+    GrammarListenerProxy result = GrammarListenerProxy(temp);
+    if (!result)
+    {
+      throwJavaException(env, listener, ReturnCode::OUT_OF_MEMORY);
+      return GrammarListenerProxy();
+    }
+    return result;
+  }
+}
+
+jthrowable JNIHelper::getJavaException(JNIEnv* env, jobject obj, ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("getJavaException");
+    
+  jclass clazz;
+  switch (returnCode)
+  {
+    case ReturnCode::END_OF_STREAM:
+      clazz = loadClass(env, obj, "java.io.EOFException");
+      break;
+    case ReturnCode::UNSUPPORTED_CODEC:
+    case ReturnCode::ILLEGAL_ARGUMENT:
+      clazz = loadClass(env, obj, "java.lang.IllegalArgumentException");
+      break;
+    case ReturnCode::INVALID_STATE:
+      clazz = loadClass(env, obj, "java.lang.IllegalStateException");
+      break;
+    case ReturnCode::NOT_SUPPORTED:
+      clazz = loadClass(env, obj, "java.lang.UnsupportedOperationException");
+      break;
+    case ReturnCode::OUT_OF_MEMORY:
+      clazz = loadClass(env, obj, "java.lang.OutOfMemoryError");
+      break;
+    case ReturnCode::FILE_NOT_FOUND:
+    case ReturnCode::PENDING_DATA:
+    case ReturnCode::SOCKET_IO_ERROR:
+    case ReturnCode::OPEN_ERROR:
+      clazz = loadClass(env, obj, "java.io.FileNotFoundException");
+      break;
+    case ReturnCode::READ_ERROR:
+    case ReturnCode::WRITE_ERROR:
+    case ReturnCode::SOCKET_CLOSED:
+      clazz = loadClass(env, obj, "java.io.IOException");
+      break;
+    case ReturnCode::MAXIMUM_BOUND:
+    case ReturnCode::UNKNOWN:
+    case ReturnCode::HOMONYM_COLLISION:
+      clazz = loadClass(env, obj, "java.lang.Exception");
+      break;
+    case ReturnCode::TIMEOUT:
+      clazz = loadClass(env, obj, "java.util.concurrent.TimeoutException");
+      break;
+    case ReturnCode::UNKNOWN_MODULE:
+    case ReturnCode::UNKNOWN_SYMBOL:
+      clazz = loadClass(env, obj, "java.lang.UnsatisfiedLinkError");
+      break;
+    case ReturnCode::ARRAY_INDEX_OUT_OF_BOUNDS:
+      clazz = loadClass(env, obj, "java.lang.ArrayIndexOutOfBoundsException");
+      break;
+    case ReturnCode::THREAD_ERROR:
+    case ReturnCode::ALREADY_LOCKED:
+      clazz = loadClass(env, obj, "java.lang.IllegalThreadStateException");
+      break;
+      // User-defined exceptions
+    case ReturnCode::AUDIO_ALREADY_IN_USE:
+      clazz = loadClass(env, obj, "android.speech.recognition.AudioAlreadyInUseException");
+      break;
+    case ReturnCode::AUDIO_DRIVER_ERROR:
+      clazz = loadClass(env, obj, "android.speech.recognition.AudioDriverErrorException");
+      break;
+    case ReturnCode::GRAMMAR_SLOT_FULL:
+      clazz = loadClass(env, obj, "android.speech.recognition.GrammarOverflowException");
+      break;
+    case ReturnCode::OVERFLOW_ERROR:
+      clazz = loadClass(env, obj, "java.nio.BufferOverflowException");
+      break;
+    case ReturnCode::UNDERFLOW_ERROR:
+      clazz = loadClass(env, obj, "java.nio.BufferUnderflowException");
+      break;
+    case ReturnCode::PARSE_ERROR:
+      clazz = loadClass(env, obj, "android.speech.recognition.ParseErrorException");
+      break;
+   
+    case ReturnCode::INVALID_URL:
+      clazz = loadClass(env, obj, "android.speech.recognition.InvalidURLException");
+      break;
+    case ReturnCode::GRAMMAR_LOAD_FAILURE:
+    case ReturnCode::GRAMMAR_NOT_DEFINED:
+      clazz = loadClass(env, obj, "android.speech.recognition.GrammarErrorException");
+      break;
+    case ReturnCode::INVALID_PARAMETER_NAME:
+    case ReturnCode::INVALID_PARAMETER_VALUE:
+      clazz = loadClass(env, obj, "android.speech.recognition.ParameterErrorException");
+      break;
+    default:
+      clazz = loadClass(env, obj, "java.lang.Exception");
+  }
+  jmethodID constructor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;)V");
+  if (constructor != 0)
+  {
+    jstring jrc = env->NewStringUTF(ReturnCode::toString(returnCode));
+    jobject result = env->NewObject(clazz, constructor, jrc);
+    env->DeleteLocalRef(jrc);
+    env->DeleteLocalRef(clazz);
+    return (jthrowable) result;
+  }
+  else
+  {
+    // Try the default constructor instead
+    constructor = env->GetMethodID(clazz, "<init>", "()V");
+    assert(constructor != 0);
+    jobject result = env->NewObject(clazz, constructor);
+    env->DeleteLocalRef(clazz);
+    return (jthrowable) result;
+  }
+}
+
+void JNIHelper::throwRuntimeJavaException(JNIEnv* env, jobject obj, const char* msg)
+{
+  jclass clazz = loadClass(env, obj, "java.lang.RuntimeException");
+  if (clazz != 0)
+    env->ThrowNew(clazz, msg);
+
+  env->DeleteLocalRef(clazz);
+}
+
+void JNIHelper::throwJavaException(JNIEnv* env, jobject obj, ReturnCode::Type returnCode)
+{
+  UAPI_FN_SCOPE("JNIHelper::throwJavaException");
+  jobject result = getJavaException(env, obj, returnCode);
+  if (result == 0)
+  {
+    jclass clazz = loadClass(env, obj, "java.lang.Exception");
+    if (clazz == 0)
+    {
+      // Give up
+      env->DeleteLocalRef(result);
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      return;
+    }
+    jmethodID constructor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;)V");
+    assert(constructor != 0);
+    jstring jrc = env->NewStringUTF(ReturnCode::toString(returnCode));
+    result = (jobject) env->NewObject(clazz, constructor,  jrc);
+    env->DeleteLocalRef(jrc);
+    env->DeleteLocalRef(clazz);
+  }
+  env->Throw((jthrowable)result);
+  env->DeleteLocalRef(result);
+}
+
+JNIEnv* JNIHelper::getEnv(JavaVM* jvm)
+{
+  JNIEnv* result;
+  JavaVMAttachArgs args = {0, 0, 0};
+  args.version = JNI_VERSION_1_4;
+  args.name = "JNI Thread";
+#if defined(NO_ATTACHCURRENTTHREAD_CAST_VOIDPP)
+  if (jvm->AttachCurrentThreadAsDaemon(&result, &args))
+    return 0;
+#else
+  if (jvm->AttachCurrentThreadAsDaemon((void**) &result, &args))
+    return 0;
+#endif
+  return result;
+}
+
+void JNIHelper::attachJVM(ReturnCode::Type& returnCode)
+{
+#ifdef ENABLE_JNI_KEEP_ALIVE
+  UAPI_FN_NAME("JNIHelper::attachJVM");
+    
+  JVMKeepAlive* jvm = JVMKeepAlive::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"JVMKeepAlive::getInstance() failed\n");
+    return;
+  }
+  jvm->attach(returnCode);
+#else
+  returnCode = ReturnCode::SUCCESS;
+#endif
+}
+
+void JNIHelper::detachJVM(ReturnCode::Type& returnCode)
+{
+#ifdef ENABLE_JNI_KEEP_ALIVE
+  UAPI_FN_NAME("JNIHelper::detachJVM");
+    
+    
+  JVMKeepAlive* jvm = JVMKeepAlive::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"JVMKeepAlive::getInstance() failed\n");
+    return;
+  }
+  jvm->detach(returnCode);
+#else
+  returnCode = ReturnCode::SUCCESS;
+#endif
+}
+
+jclass JNIHelper::loadClass(JNIEnv* env, jobject object, const char* name)
+{
+  UAPI_FN_NAME("JNIHelper::loadClass");
+    
+  jobject classLoader = 0;
+  if (object != 0)
+  {
+    // object.getClass()
+    UAPI_INFO(fn,"GetObjectClass(object == %p)\n", object);
+    jclass objectClass = env->GetObjectClass(object);
+    jmethodID method = env->GetMethodID(objectClass, "getClass", "()Ljava/lang/Class;");
+    env->DeleteLocalRef(objectClass);
+    UAPI_INFO(fn,"method == %p\n", method);
+    assert(method != 0);
+    
+    // Object of type Class
+    jobject classObject = env->CallObjectMethod(object, method);
+    assert(!env->ExceptionCheck() && classObject != 0);
+    
+    // Class.class
+    UAPI_INFO(fn,"GetObjectClass(classObject == %p)\n", classObject);
+    jclass classClass = env->GetObjectClass(classObject);
+    UAPI_INFO(fn,"classClass == %p)\n", classClass);
+    // Get the ClassLoader
+    jmethodID getClassLoader = env->GetMethodID(classClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
+    env->DeleteLocalRef(classClass);
+    UAPI_INFO(fn,"getClassLoader == %p)\n", getClassLoader);
+    assert(getClassLoader != 0);
+    
+    // object.getClass().getClassLoader()
+    classLoader = env->CallObjectMethod(classObject, getClassLoader);
+    if (env->ExceptionCheck())
+    {
+      env->ExceptionDescribe();
+      env->ExceptionClear();
+      env->DeleteLocalRef(classObject);
+      return 0;
+    }
+    env->DeleteLocalRef(classObject);
+  }
+  if (classLoader == 0)
+  {
+    jclass classLoaderClass = env->FindClass("java/lang/ClassLoader");
+    jmethodID getSystemClassLoader = env->GetStaticMethodID(classLoaderClass, "getSystemClassLoader",
+                                     "()Ljava/lang/ClassLoader;");
+    assert(getSystemClassLoader != 0);
+    //env->DeleteLocalRef(classLoader); // delete local ref before replacing with another classLoader
+    classLoader = env->CallStaticObjectMethod(classLoaderClass, getSystemClassLoader);
+    assert(!env->ExceptionCheck() && classLoader != 0);
+    env->DeleteLocalRef(classLoaderClass);
+  }
+  UAPI_INFO(fn,"GetObjectClass(classLoader == %p)\n", classLoader);
+  jclass classLoaderClass = env->GetObjectClass(classLoader);
+  UAPI_INFO(fn,"classLoaderClass == %p)\n", classLoaderClass);
+  
+  // Load the class
+  jmethodID loadClass = env->GetMethodID(classLoaderClass, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
+  env->DeleteLocalRef(classLoaderClass);
+  UAPI_INFO(fn,"loadClass == %p)\n", loadClass);
+  assert(loadClass != 0);
+  
+  jstring jname = env->NewStringUTF(name);
+  jobject result = env->CallObjectMethod(classLoader, loadClass, jname);
+  env->DeleteLocalRef(jname);
+  env->DeleteLocalRef(classLoader);
+  
+  return (jclass) result;
+}
+
+
+NativeThreadWatcher* NativeThreadWatcher::instance;
+
+NativeThreadWatcher* NativeThreadWatcher::getInstance(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_SCOPE("NativeThreadWatcher::getInstance");
+    
+  //don't have to protect instance, NativeThreadWatcher::getInstance() will
+  //be called only once when System_init is called.
+  if (instance == 0)
+  {
+    instance = new NativeThreadWatcher();
+    if (instance == 0)
+    {
+      UAPI_ERROR(fn,"Could not create JVMKeepAlive, OUT_OF_MEMORY\n");
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      return 0;
+    }
+  }
+  returnCode = ReturnCode::SUCCESS;
+  return instance;
+}
+
+NativeThreadWatcher::NativeThreadWatcher():
+    jvm(0)
+{}
+
+void NativeThreadWatcher::onThreadStarted()
+{
+  UAPI_FN_NAME("NativeThreadWatcher::onThreadStarted");
+    
+  if (jvm == 0)
+  {
+    UAPI_ERROR(fn,"jvm is null\n");
+    return;
+  }
+  
+  //Attach JVM to current thread
+  JNIEnv* env;
+  JavaVMAttachArgs args = {0, 0, 0};
+  args.version = JNI_VERSION_1_4;
+  args.name = "WorkerQueue";
+#if defined(NO_ATTACHCURRENTTHREAD_CAST_VOIDPP)
+  if (jvm->AttachCurrentThreadAsDaemon(&env, &args))
+  {
+    UAPI_ERROR(fn,"AttachCurrentThreadAsDaemon failed.\n");
+    return;
+  }
+#else
+  if (jvm->AttachCurrentThreadAsDaemon((void**) &env, &args))
+  {
+    UAPI_ERROR(fn,"AttachCurrentThreadAsDaemon failed.\n");
+    return;
+  }
+#endif
+}
+
+void NativeThreadWatcher::onThreadStopped()
+{
+  UAPI_FN_NAME("NativeThreadWatcher::onThreadStopped");
+    
+  if (jvm == 0)
+  {
+    UAPI_ERROR(fn,"jvm is null\n");
+    return;
+  }
+  UAPI_INFO(fn,"jvm->DetachCurrentThread(), jvm is %p\n", jvm);
+  jint rc = jvm->DetachCurrentThread();
+  if (rc != 0)
+    UAPI_ERROR(fn,"DetachCurrentThread failed: %d\n", rc);
+  UAPI_INFO(fn,"jvm->DetachCurrentThread() returns %d\n", rc);
+}
+
+void NativeThreadWatcher::onThreadActive()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_NAME("NativeThreadWatcher::onThreadActive");
+    
+  JNIHelper::attachJVM(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to attach to JVM\n");
+    return;
+  }
+}
+
+void NativeThreadWatcher::onThreadInactive()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_NAME("NativeThreadWatcher::onThreadInactive");
+    
+  JNIHelper::detachJVM(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to detach from JVM\n");
+    return;
+  }
+}
+
+void NativeThreadWatcher::setJVM(JavaVM* _jvm)
+{
+  jvm = _jvm;
+}
+
+#ifdef ENABLE_JNI_KEEP_ALIVE
+JVMKeepAlive* JVMKeepAlive::instance = 0;
+Mutex* JVMKeepAlive::mutex = 0;
+JVMKeepAlive::ComponentInitializer JVMKeepAlive::componentInitializer;
+
+JVMKeepAlive::JVMKeepAlive(ConditionVariable* _threadStarted,
+                           ConditionVariable* _shutdownRequested,
+                           ConditionVariable* _onShutdown):
+    threadStarted(_threadStarted),
+    shutdownRequested(_shutdownRequested),
+    onShutdown(_onShutdown),
+    worker(0),
+    jvm(0),
+    jvmReferences(0)
+{
+  UAPI_FN_NAME("JVMKeepAlive::JVMKeepAlive");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+}
+
+JVMKeepAlive* JVMKeepAlive::getInstance(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_NAME("JNIKeepAlive::getInstance");
+  if (componentInitializer.returnCode)
+  {
+    returnCode = componentInitializer.returnCode;
+    return 0;
+  }
+  
+  //we have to protect the construction of "instance". Make sure we don't have
+  //multiple threads calling getInstance() while "instance" is equal to 0.
+  LockScope lock(mutex, returnCode);
+  if (returnCode)
+  {
+    UAPI_ERROR(fn,"Failed to create LockScope of mutex\n");
+    return 0;
+  }
+  
+  //it's now safe to check if instance == 0
+  if (instance == 0)
+  {
+    ConditionVariable* threadStarted = ConditionVariable::create(JVMKeepAlive::mutex,
+                                       returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"ConditionVariable::create() failed\n");
+      return 0;
+    }
+    ConditionVariable* shutdownRequested = ConditionVariable::create(JVMKeepAlive::mutex,
+                                           returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"ConditionVariable::create() failed\n");
+      delete threadStarted;
+      return 0;
+    }
+    ConditionVariable* onShutdown = ConditionVariable::create(JVMKeepAlive::mutex,
+                                    returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"ConditionVariable::create() failed\n");
+      delete threadStarted;
+      delete shutdownRequested;
+      return 0;
+    }
+    instance = new JVMKeepAlive(threadStarted, shutdownRequested, onShutdown);
+    if (instance == 0)
+    {
+      UAPI_ERROR(fn,"Could not create JVMKeepAlive, OUT_OF_MEMORY\n");
+      returnCode = ReturnCode::OUT_OF_MEMORY;
+      delete threadStarted;
+      delete shutdownRequested;
+      delete onShutdown;
+      return 0;
+    }
+  }
+  returnCode = ReturnCode::SUCCESS;
+  return instance;
+}
+
+JVMKeepAlive::~JVMKeepAlive()
+{
+  UAPI_FN_NAME("JVMKeepAlive::~JVMKeepAlive");
+    
+  UAPI_TRACE(fn,"this=%p\n", this);
+  
+  delete threadStarted;
+  delete shutdownRequested;
+  instance = 0;
+}
+
+void JVMKeepAlive::setJVM(JavaVM* _jvm)
+{
+  jvm = _jvm;
+}
+
+void JVMKeepAlive::attach(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_NAME("JVMKeepAlive::attach");
+    
+    
+  //make sure attach and detach are not called at the same time.
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"failed to lock attachDetachLock mutex\n");
+    return;
+  }
+  UAPI_INFO(fn,"jvmReferences [%d -> %d]\n", jvmReferences, jvmReferences + 1);
+  if (jvmReferences >= UINT8_MAX)
+  {
+    UAPI_ERROR(fn,"jvmReferences overflow\n");
+    returnCode = ReturnCode::OVERFLOW_ERROR;
+    return;
+  }
+  ++jvmReferences;
+  if (jvmReferences == 1)
+  {
+    if (jvm == 0)
+    {
+      UAPI_ERROR(fn,"jvm is null\n");
+      returnCode = ReturnCode::INVALID_STATE;
+      return;
+    }
+    
+    if (worker)
+    {
+      // JVMKeepAlive in the middle of shutting down
+      onShutdown->wait(returnCode);
+      if (returnCode)
+      {
+        UAPI_ERROR(fn,"onShutdown->wait() failed\n");
+        return;
+      }
+    }
+    worker = new JVMKeepAlive::Worker(this, mutex);
+    if (returnCode)
+    {
+      UAPI_ERROR(fn,"JVMKeepAlive: Failed to create a new Runnable\n");
+      return;
+    }
+    worker->start(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"worker->start() failed\n");
+      return;
+    }
+    
+    //wait for the thread to tell us that it is running (it will call
+    //signal).
+    //wait, will unlock the threadStarted mutex.
+    threadStarted->wait(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"threadStarted->wait() failed\n");
+      return;
+    }
+    
+    //we we are here, the thread is running we have have re-acquired the
+    //lock. The ConditionVariableLockScope will unlock the mutex for us.
+    returnCode = ReturnCode::SUCCESS;
+  }
+  else
+    returnCode = ReturnCode::SUCCESS;
+  UAPI_INFO(fn,"jvmReferences on ++exit=%d\n", jvmReferences);
+}
+
+void JVMKeepAlive::detach(ReturnCode::Type& returnCode)
+{
+  UAPI_FN_NAME("JVMKeepAlive::detach");
+    
+    
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"failed to lock attachDetachLock mutex\n");
+    return;
+  }
+  
+  if (jvmReferences == 0)
+  {
+    returnCode = ReturnCode::UNDERFLOW_ERROR;
+    UAPI_ERROR(fn,"Tried decrementing jvmReferences below 0\n");
+    return;
+  }
+  UAPI_INFO(fn,"jvmReferences [%d -> %d]\n", jvmReferences, jvmReferences - 1);
+  if (jvmReferences <= UINT8_MIN)
+  {
+    UAPI_ERROR(fn,"jvmReferences underflow\n");
+    returnCode = ReturnCode::UNDERFLOW_ERROR;
+    return;
+  }
+  --jvmReferences;
+  if (jvmReferences == 0)
+  {
+    //signal the thread. It will shutdown.
+    shutdownRequested->signal(returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"shutdownRequested->signal() failed\n");
+      return;
+    }
+    
+    ls.cancel(returnCode);
+    if (returnCode)
+    {
+      UAPI_ERROR(fn,"LockScope->cancel() failed\n");
+      return;
+    }
+    
+    worker->join(returnCode);
+    if (returnCode)
+    {
+      UAPI_ERROR(fn,"worker->join() failed\n");
+      return;
+    }
+    
+    LockScope ls2(mutex, returnCode);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+      UAPI_ERROR(fn,"failed to lock attachDetachLock mutex\n");
+      return;
+    }
+    onShutdown->signal(returnCode);
+    if (returnCode)
+    {
+      UAPI_ERROR(fn,"onShutdown->signal() failed\n");
+      return;
+    }
+    worker = 0;
+    
+    UAPI_INFO(fn,"jvmReferences on --exit=%d\n", jvmReferences);
+  }
+  else
+    UAPI_INFO(fn,"jvmReferences on --exit=%d\n", jvmReferences);
+  returnCode = ReturnCode::SUCCESS;
+}
+
+
+JVMKeepAlive::Worker::Worker(JVMKeepAlive* _parent, Mutex* mutex):
+    Runnable(mutex),
+    parent(_parent)
+{}
+
+ReturnCode::Type JVMKeepAlive::Worker::runThread()
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_NAME("JVMKeepAlive::Worker::runThread");
+    
+  UAPI_INFO(fn,"started\n");
+  
+  // Attach JVM to current thread
+  JNIEnv* env;
+  JavaVMAttachArgs args = {0, 0, 0};
+  args.version = JNI_VERSION_1_4;
+  args.name = "JNI KeepAlive";
+#if defined(NO_ATTACHCURRENTTHREAD_CAST_VOIDPP)
+  if (parent->jvm->AttachCurrentThread(&env, &args))
+    return ReturnCode::UNKNOWN;
+#else
+  if (parent->jvm->AttachCurrentThread((void**) &env, &args))
+    return ReturnCode::UNKNOWN;
+#endif
+    
+  LockScope ls(mutex, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"failed to lock threadStarted mutex\n");
+    return returnCode;
+  }
+  parent->threadStarted->signal(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"threadStarted->signal() failed\n");
+    return returnCode;
+  }
+  
+  //we will lock back to wait for detach to be called. By calling wait, the
+  //mutex will be unlocked.
+  parent->shutdownRequested->wait(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"threadStarted->wait() failed\n");
+    return returnCode;
+  }
+  //when we come back from wait, mutex is locked.
+  
+  // detach JVM from current thread
+  UAPI_INFO(fn,"jvm->DetachCurrentThread(), jvm is %p\n", parent->jvm);
+  jint rc = parent->jvm->DetachCurrentThread();
+  if (rc != 0)
+    UAPI_ERROR(fn,"DetachCurrentThread failed: %d.\n", rc);
+  UAPI_INFO(fn,"jvm->DetachCurrentThread() returns %d\n", rc);
+  return ReturnCode::SUCCESS;
+}
+#endif //ENABLE_JNI_KEEP_ALIVE
diff --git a/uapi/java/jniapi/jniapi/JNIHelper.h b/uapi/java/jniapi/jniapi/JNIHelper.h
new file mode 100644
index 0000000..f4539cf
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/JNIHelper.h
@@ -0,0 +1,375 @@
+/*---------------------------------------------------------------------------*
+ *  JNIHelper.h                                                              *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __JNI_HELPER
+#define __JNI_HELPER
+
+#include "jni.h"
+#include "jniapi.h"
+#include "exports.h"
+#include "Codec.h"
+#include "MediaFileReader.h"
+#include "CWrapperGrammarListener.h"
+#include "Logger.h"
+#include "Runnable.h"
+#include "ConditionVariable.h"
+#include "JNIThreadListener.h"
+#include "Grammar.h"
+#include "SpeechSynthesizer.h"
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        class JVMKeepAlive;
+      }
+      namespace utilities
+      {
+        class Mutex;
+      }
+    }
+  }
+}
+
+
+namespace android
+{
+  namespace speech
+  {
+    namespace recognition
+    {
+      namespace jni
+      {
+        /**
+         * JNI helper functions.
+         */
+        class JNI_EXPORT JNIHelper
+        {
+          public:
+            
+            /**
+             * Returns the native codec associated with the java codec.
+             *
+             * @param env the JNI environment
+             * @param codec java codec
+             * @return native codec; undefined if env->ExceptionCheck() returns true
+             */
+            static Codec::Type toNativeCodec(JNIEnv* env, jobject codec);
+            
+            /**
+             * Returns the native MediaFileReader::Mode associated with the java mode.
+             *
+             * @param env the JNI environment
+             * @param readingMode java MediaFileReader.Mode
+             * @return native MediaFileReader::Mode; undefined if env->ExceptionCheck() returns true
+             */
+            static MediaFileReader::ReadingMode toNativeMediaFileReaderMode(JNIEnv* env,
+                jobject readingMode);
+            
+            /**
+             * Returns the native GrammarListener object
+             *
+             * @param env the JNI environment
+             * @param listener java GrammarListener instance
+             * @throws RuntimeException if an error occurs
+             */
+            static GrammarListenerProxy getNativeGrammarListener(JNIEnv* env, jobject listener);
+            /**
+             * Returns the Java exception class that corresponds to the specified ReturnCode.
+             *
+             * @param env the JNI environment
+             * @param obj the current java object used to retrieve the correct class
+             * @param returnCode the return code
+             * @return the java exception class or 0 if no match could be found
+             */
+            static jthrowable getJavaException(JNIEnv* env, jobject obj, ReturnCode::Type returnCode);
+            
+            /**
+             * Throws the Java exception that corresponds to the specified ReturnCode.
+             *
+             * @param env the JNI environment
+             * @param reference the object from which to retrieve the classloader
+             * @param returnCode the return code
+             */
+            static void throwJavaException(JNIEnv* env, jobject reference, ReturnCode::Type returnCode);
+            
+            /**
+             * Throws the Java Run Time Exception
+             *
+             * @param env the JNI environment
+             * @param reference the object from which to retrieve the classloader
+             * @param message to report exception
+             */
+            static void throwRuntimeJavaException(JNIEnv* env, jobject reference, const char *msg);
+            
+            /**
+             * Returns the JNI environment.
+             *
+             * @param jvm a reference to the Java Virtual Machine
+             * @return 0 in case of failure
+             */
+            static JNIEnv* getEnv(JavaVM* jvm);
+            
+            /**
+             * Returns the JVM associated with a JNI environment.
+             *
+             * @param env the JNI environment
+             * @param reference the object from which to retrieve the classloader
+             * @throws RuntimeException if an error occurs
+             */
+            static JavaVM* getJVM(JNIEnv* env, jobject reference);
+            
+            /**
+             * Attaches a thread to the JVM, preventing it from shutting down until detachJVM() is invoked
+             * an equal number of times.
+             *
+             * @param returnCode the return code
+             */
+            static void attachJVM(ReturnCode::Type& returnCode);
+            
+            /**
+             * Detaches a thread from the JVM, allowing it to shut down.
+             *
+             * @param returnCode the return code
+             */
+            static void detachJVM(ReturnCode::Type& returnCode);
+            
+            /**
+             * Looks up a class using the classloader of an existing object.
+             *
+             * @param env the JNI environment
+             * @param object the java object whose ClassLoader to use
+             * @param name the class name to be loaded
+             * @return 0 on failure
+             */
+            static jclass loadClass(JNIEnv* env, jobject object, const char* name);
+            
+            /**
+             * Returns the native LogLevel associated with the java LogLevel.
+             *
+             * @param env the JNI environment
+             * @param loglevel java LogLevel
+             * @return native LogLevel; undefined if env->ExceptionCheck() returns true
+             */
+            static Logger::LogLevel toNativeLogLevel(JNIEnv* env, jobject loglevel);
+        };
+        
+        /**
+         * Class used to intercept when the native threads are started, stopped and
+         * when all the threads are inactive.
+         *
+         * Because we are notified, it is possible to do things like
+         * "AttachThreadAsDeamon" when the thread starts.
+         *
+         */
+        class NativeThreadWatcher: public utilities::JNIThreadListener
+        {
+          public:
+          
+            /**
+             * Creates a new NativeThreadListener.
+             *
+             * @param returnCode the return code
+             * @return the new NativeThreadListener
+             */
+            static NativeThreadWatcher* getInstance(ReturnCode::Type& returnCode);
+            
+            /**
+             * Called when a native thread is started.
+             */
+            virtual void onThreadStarted();
+            
+            /**
+            * Called when a native thread is stopped.
+            */
+            virtual void onThreadStopped();
+            
+            /**
+             * Called when a native thread is waken up from its waiting state, i.e.
+             * it was told to start executing some work.
+             */
+            virtual void onThreadActive();
+            
+            /**
+             * Called when a native thread is not processing anything, i.e. it is
+             * in a waiting state.
+             */
+            virtual void onThreadInactive();
+            
+            /**
+             * Sets the reference to the Java Virtual Machine.
+             *
+             * @param jvm a reference to the Java Virtual Machine
+             */
+            void setJVM(JavaVM* jvm);
+            
+          private:
+            /**
+             * Constructor
+             */
+            NativeThreadWatcher();
+            
+            JavaVM* jvm;
+            
+            static NativeThreadWatcher* instance;
+        };
+        
+#ifdef ENABLE_JNI_KEEP_ALIVE
+        /**
+         * Class used to make sure the JVM will not shutdown while we are running
+         * native code.
+         */
+        class JVMKeepAlive
+        {
+          public:
+          class Worker: public utilities::Runnable
+            {
+              public:
+                /**
+                * Method that is called when the thread is started.
+                *
+                * @return SUCCESS if the thread terminated normally
+                */
+                virtual ReturnCode::Type runThread();
+                
+                Worker(JVMKeepAlive* parent, utilities::Mutex* mutex);
+              private:
+                JVMKeepAlive* parent;
+            };
+            
+            /**
+             * Creates a new JVMKeepAlive thread.
+             *
+             * @param returnCode the return code
+             * @return the new JVMKeepAlive
+             */
+            static JVMKeepAlive* getInstance(ReturnCode::Type& returnCode);
+            
+            /**
+             * Sets the reference to the Java Virtual Machine.
+             *
+             * @param jvm a reference to the Java Virtual Machine
+             */
+            void setJVM(JavaVM* jvm);
+            
+            /**
+             * Attaches a thread to the JVM, preventing it from shutting down until
+             * detachJVM() is invoked an equal number of times.
+             *
+             * @param returnCode the return code
+             */
+            void attach(ReturnCode::Type& returnCode);
+            
+            /**
+             * Detaches a thread from the JVM, allowing it to shut down.
+             *
+             * @param returnCode the return code
+             */
+            void detach(ReturnCode::Type& returnCode);
+            
+            /**
+             * Called when the thread starts running
+             */
+            ReturnCode::Type runThread();
+            
+            /**
+             * Creates a new JVMKeepAlive thread.
+             *
+             * @param threadStarted signaled when the thread starts running
+             * @param shutdownRequested indicates the thread should shut down
+             * @param onShutdown signaled when the thread shuts down
+             */
+            JVMKeepAlive(utilities::ConditionVariable* threadStarted,
+                         utilities::ConditionVariable* shutdownRequested,
+                         utilities::ConditionVariable* onShutdown);
+                         
+            /**
+             * Prevent destruction.
+             */
+            ~JVMKeepAlive();
+            
+          private:
+            /**
+             * Initializes the component when the library is loaded.
+             */
+            class ComponentInitializer
+            {
+              public:
+                ComponentInitializer();
+                ~ComponentInitializer();
+                
+                ReturnCode::Type returnCode;
+            };
+            
+            static ComponentInitializer componentInitializer;
+            /**
+             * Synchronizes access to thread state.
+             */
+            static utilities::Mutex* mutex;
+            
+            /**
+             * Signaled when the thread starts running
+             */
+            utilities::ConditionVariable* threadStarted;
+            
+            /**
+             * Indicates the thread should shut down.
+             */
+            utilities::ConditionVariable* shutdownRequested;
+            
+            /**
+             * Indicates when the worker thread shuts down. This is necessary because
+             * the behavior of multiple threads joining on the same thread is undefined.
+             */
+            utilities::ConditionVariable* onShutdown;
+            
+            /**
+             * The thread that is attached to the JVM.
+             */
+            utilities::Runnable* worker;
+            
+            /**
+             * pointer to the JVM
+             */
+            JavaVM* jvm;
+            
+            /**
+             * Count used to know if we have to start or stop the thread.
+             */
+            UINT8 jvmReferences;
+            
+            /**
+             * Singleton instance.
+             */
+            static JVMKeepAlive* instance;
+            
+            friend class NativeThreadWatcher;
+        };
+#endif //ENABLE_JNI_KEEP_ALIVE
+      }
+    }
+  }
+}
+
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_AudioStreamImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_AudioStreamImpl.cpp
new file mode 100644
index 0000000..f9378b7
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_AudioStreamImpl.cpp
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_AudioStreamImpl.cpp                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+
+#include <jni.h>
+#include "android_speech_recognition_impl_AudioStreamImpl.h"
+#include "AudioStream.h"
+
+using namespace android::speech::recognition;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_AudioStreamImpl_deleteNativeObject
+(JNIEnv*, jobject,
+ jlong nativeObj)
+{
+  delete(AudioStreamProxy*) nativeObj;
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_AudioStreamImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_AudioStreamImpl.h
new file mode 100644
index 0000000..45f7d20
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_AudioStreamImpl.h
@@ -0,0 +1,21 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_AudioStreamImpl */
+
+#ifndef _Included_android_speech_recognition_impl_AudioStreamImpl
+#define _Included_android_speech_recognition_impl_AudioStreamImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_AudioStreamImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_AudioStreamImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_DeviceSpeakerImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_DeviceSpeakerImpl.cpp
new file mode 100644
index 0000000..5778d8e
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_DeviceSpeakerImpl.cpp
@@ -0,0 +1,224 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_DeviceSpeakerImpl.cpp                                          *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+
+#include <assert.h>
+#include "jniapi.h"
+#include "android_speech_recognition_impl_DeviceSpeakerImpl.h"
+#include "JNIHelper.h"
+#include "CWrapperDeviceSpeakerListener.h"
+#include "DeviceSpeaker.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_deleteNativeObject
+(JNIEnv* ,
+ jobject ,
+ jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_DeviceSpeakerImpl_deleteNativeObject");
+  delete(DeviceSpeakerProxy*) nativeObj;
+}
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_initNativeObject(JNIEnv* env,
+    jobject deviceSpeaker)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_DeviceSpeakerImpl_initNativeObject");
+  
+  // Create the native DeviceSpeaker
+  DeviceSpeakerProxy nativeDeviceSpeaker = DeviceSpeaker::getInstance(returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, deviceSpeaker, returnCode);
+    return 0;
+  }
+  
+  DeviceSpeakerProxy* result = new DeviceSpeakerProxy(nativeDeviceSpeaker);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, deviceSpeaker, returnCode);
+    return 0;
+  }
+  return (jlong) result;
+}
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_startProxy(JNIEnv* env,
+    jobject deviceSpeaker,
+    jlong nativeObj,
+    jlong audioObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_DeviceSpeakerImpl_startProxy");
+  
+  DeviceSpeakerProxy* nativeSpeakerPointer = (DeviceSpeakerProxy*) nativeObj;
+ 
+  if (!nativeSpeakerPointer)
+  {
+    JNIHelper::throwJavaException(env, deviceSpeaker, ReturnCode::INVALID_STATE);
+    return;
+  }
+  DeviceSpeakerProxy& nativeDeviceSpeaker = *nativeSpeakerPointer;
+  
+  AudioStreamProxy* nativeAudioPointer = (AudioStreamProxy*) audioObj;
+
+  if (!nativeAudioPointer)
+  {
+    JNIHelper::throwJavaException(env, deviceSpeaker, ReturnCode::INVALID_STATE);
+    return;
+  }
+  AudioStreamProxy& nativeAudio = *nativeAudioPointer;
+  nativeDeviceSpeaker->start(nativeAudio, returnCode);
+  
+  switch (returnCode)
+  {
+    case ReturnCode::SUCCESS:
+      return;
+    case ReturnCode::ILLEGAL_ARGUMENT:
+    case ReturnCode::AUDIO_ALREADY_IN_USE:
+    case ReturnCode::END_OF_STREAM:
+    {
+      jclass clazz = JNIHelper::loadClass(env, deviceSpeaker, "java.lang.IllegalStateException");
+      jmethodID constructor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;)V");
+      jthrowable exception;
+      if (constructor != 0)
+        exception = (jthrowable) env->NewObject(clazz, constructor, env->NewStringUTF(ReturnCode::toString(returnCode)));
+      else
+      {
+        // Try the default constructor instead
+        constructor = env->GetMethodID(clazz, "<init>", "()V");
+        assert(constructor != 0);
+        exception = (jthrowable) env->NewObject(clazz, constructor);
+      }
+      env->DeleteLocalRef(clazz);
+      env->Throw(exception);
+      env->DeleteLocalRef(exception);
+      break;
+    }
+    default:
+      JNIHelper::throwJavaException(env, deviceSpeaker, returnCode);
+  }
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_stopProxy
+(JNIEnv* env,
+ jobject deviceSpeaker,
+ jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_DeviceSpeakerImpl_stopProxy");
+                                   
+  
+  DeviceSpeakerProxy* nativeSpeakerPointer = (DeviceSpeakerProxy*) nativeObj;
+    
+  if (!nativeSpeakerPointer)
+  {
+    JNIHelper::throwJavaException(env, deviceSpeaker, ReturnCode::INVALID_STATE);
+    return;
+  }
+  DeviceSpeakerProxy& nativeDeviceSpeaker = *nativeSpeakerPointer;
+  nativeDeviceSpeaker->stop(returnCode);
+  if (returnCode)
+    JNIHelper::throwJavaException(env, deviceSpeaker, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_setCodecProxy
+(JNIEnv* env,
+ jobject deviceSpeaker,
+ jlong nativeObj,
+ jobject codec)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_DeviceSpeakerImpl_setCodecProxy");
+  
+  DeviceSpeakerProxy* nativeSpeakerPointer = (DeviceSpeakerProxy*) nativeObj;
+  
+  if (!nativeSpeakerPointer)
+  {
+    JNIHelper::throwJavaException(env, deviceSpeaker, ReturnCode::INVALID_STATE);
+    return;
+  }
+  DeviceSpeakerProxy& nativeDeviceSpeaker = *nativeSpeakerPointer;
+  
+  Codec::Type nativeCodec = JNIHelper::toNativeCodec(env, codec);
+  if (env->ExceptionCheck())
+    return;
+    
+  nativeDeviceSpeaker->setCodec(nativeCodec, returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, deviceSpeaker, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_setListenerProxy
+(JNIEnv* env,
+ jobject deviceSpeaker,
+ jlong nativeObj,
+ jobject listener)
+{
+  ReturnCode::Type returnCode = ReturnCode::UNKNOWN;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_DeviceSpeakerImpl_setListenerProxy");
+  
+  DeviceSpeakerProxy* nativeSpeakerPointer = (DeviceSpeakerProxy*) nativeObj;
+     
+  if (!nativeSpeakerPointer)
+  {
+    JNIHelper::throwJavaException(env, deviceSpeaker, ReturnCode::INVALID_STATE);
+    return;
+  }
+  DeviceSpeakerProxy& nativeDeviceSpeaker = *nativeSpeakerPointer;
+  
+  // Create the native listener
+  DeviceSpeakerListenerProxy nativeListener;
+  if (listener != 0)
+  {
+    JavaVM* jvm = JNIHelper::getJVM(env, deviceSpeaker);
+    if (env->ExceptionCheck())
+      return;
+    CWrapperDeviceSpeakerListener* temp = new CWrapperDeviceSpeakerListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      JNIHelper::throwJavaException(env, deviceSpeaker, ReturnCode::OUT_OF_MEMORY);
+      return;
+    }
+    else if (returnCode)
+    {
+      JNIHelper::throwJavaException(env, deviceSpeaker, returnCode);
+      return;
+    }
+    nativeListener = DeviceSpeakerListenerProxy(temp);
+    if (!nativeListener)
+    {
+      delete temp;
+      JNIHelper::throwJavaException(env, deviceSpeaker, ReturnCode::OUT_OF_MEMORY);
+      return;
+    }
+  }
+  
+  nativeDeviceSpeaker->setListener(nativeListener, returnCode);
+  if (returnCode)
+    JNIHelper::throwJavaException(env, deviceSpeaker, returnCode);
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_DeviceSpeakerImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_DeviceSpeakerImpl.h
new file mode 100644
index 0000000..4d385c4
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_DeviceSpeakerImpl.h
@@ -0,0 +1,61 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_DeviceSpeakerImpl */
+
+#ifndef _Included_android_speech_recognition_impl_DeviceSpeakerImpl
+#define _Included_android_speech_recognition_impl_DeviceSpeakerImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_DeviceSpeakerImpl
+ * Method:    initNativeObject
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_initNativeObject
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_DeviceSpeakerImpl
+ * Method:    startProxy
+ * Signature: (JJ)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_startProxy
+  (JNIEnv *, jobject, jlong, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_DeviceSpeakerImpl
+ * Method:    stopProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_stopProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_DeviceSpeakerImpl
+ * Method:    setCodecProxy
+ * Signature: (JLandroid/speech/recognition/Codec;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_setCodecProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_DeviceSpeakerImpl
+ * Method:    setListenerProxy
+ * Signature: (JLandroid/speech/recognition/DeviceSpeakerListener;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_setListenerProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_DeviceSpeakerImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_DeviceSpeakerImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedGrammarImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedGrammarImpl.cpp
new file mode 100644
index 0000000..f40aba9
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedGrammarImpl.cpp
@@ -0,0 +1,97 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_EmbeddedGrammarImpl.cpp                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+
+#include "jniapi.h"
+#include "android_speech_recognition_impl_EmbeddedGrammarImpl.h"
+#include "JNIHelper.h"
+#include "EmbeddedGrammar.h"
+
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedGrammarImpl_compileAllSlotsProxy(JNIEnv* env,
+    jobject grammar, jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedGrammarImpl_compileAllSlotsProxy");
+  
+  EmbeddedGrammarProxy* nativeGrammarPointer = (EmbeddedGrammarProxy*) nativeObj;
+
+  if (!nativeGrammarPointer)
+  {
+    JNIHelper::throwJavaException(env, grammar, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedGrammarProxy& nativeGrammar = *nativeGrammarPointer;
+  nativeGrammar->compileAllSlots(returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, grammar, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedGrammarImpl_resetAllSlotsProxy(JNIEnv* env,
+    jobject grammar, jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedGrammarImpl_resetAllSlotsProxy");
+  
+  EmbeddedGrammarProxy* nativeGrammarPointer = (EmbeddedGrammarProxy*) nativeObj;
+
+  if (!nativeGrammarPointer)
+  {
+    JNIHelper::throwJavaException(env, grammar, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedGrammarProxy& nativeGrammar = *nativeGrammarPointer;
+  nativeGrammar->resetAllSlots(returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, grammar, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedGrammarImpl_saveProxy(JNIEnv* env,
+    jobject grammar,
+    jlong nativeObj,
+    jstring url)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedGrammarImpl_saveProxy");
+  
+  EmbeddedGrammarProxy* nativeGrammarPointer = (EmbeddedGrammarProxy*) nativeObj;
+
+  if (!nativeGrammarPointer)
+  {
+    JNIHelper::throwJavaException(env, grammar, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedGrammarProxy& nativeGrammar = *nativeGrammarPointer;
+  
+  const char* nativeURL = env->GetStringUTFChars(url, 0);
+  nativeGrammar->save(nativeURL, returnCode);
+  env->ReleaseStringUTFChars(url, nativeURL);
+  
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, grammar, returnCode);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedGrammarImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedGrammarImpl.h
new file mode 100644
index 0000000..12b10cf
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedGrammarImpl.h
@@ -0,0 +1,37 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_EmbeddedGrammarImpl */
+
+#ifndef _Included_android_speech_recognition_impl_EmbeddedGrammarImpl
+#define _Included_android_speech_recognition_impl_EmbeddedGrammarImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedGrammarImpl
+ * Method:    compileAllSlotsProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedGrammarImpl_compileAllSlotsProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedGrammarImpl
+ * Method:    resetAllSlotsProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedGrammarImpl_resetAllSlotsProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedGrammarImpl
+ * Method:    saveProxy
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedGrammarImpl_saveProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedRecognizerImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedRecognizerImpl.cpp
new file mode 100644
index 0000000..9f39dc9
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedRecognizerImpl.cpp
@@ -0,0 +1,566 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_EmbeddedRecognizerImpl.cpp                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+
+#include <string.h>
+#include <assert.h>
+#include "jniapi.h"
+#include "android_speech_recognition_impl_EmbeddedRecognizerImpl.h"
+#include "CWrapperRecognizerListener.h"
+#include "CWrapperSrecGrammarListener.h"
+#include "CWrapperEmbeddedGrammarListener.h"
+#include "JNIHelper.h"
+#include "EmbeddedRecognizer.h"
+#include "Grammar.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_deleteNativeObject
+(JNIEnv* ,
+ jobject ,
+ jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_deleteNativeObject");
+  delete(EmbeddedRecognizerProxy*) nativeObj;
+}
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_getInstanceProxy(JNIEnv* env,
+    jobject recognizer)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_getInstanceProxy");
+  
+  EmbeddedRecognizerProxy nativeRecognizer = EmbeddedRecognizer::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+    return 0;
+  }
+  EmbeddedRecognizerProxy* result = new EmbeddedRecognizerProxy(nativeRecognizer);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+    return 0;
+  }
+  else if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+    return 0;
+  }
+  return (jlong) result;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_configureProxy(JNIEnv* env,
+    jobject recognizer,
+    jlong nativeObj,
+    jstring config)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_configureProxy");
+  
+  EmbeddedRecognizerProxy* nativeRecognizerPointer = (EmbeddedRecognizerProxy*) nativeObj;
+  if (!nativeRecognizerPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedRecognizerProxy& nativeRecognizer = *nativeRecognizerPointer;
+  
+  const char* nativeConfig = env->GetStringUTFChars(config, 0);
+  nativeRecognizer->configure(nativeConfig, returnCode);
+  env->ReleaseStringUTFChars(config, nativeConfig);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+    return;
+  }
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_setListenerProxy(JNIEnv* env,
+    jobject recognizer,
+    jlong nativeObj,
+    jobject listener)
+{
+  ReturnCode::Type returnCode = ReturnCode::UNKNOWN;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_setListenerProxy");
+  
+  EmbeddedRecognizerProxy* nativeRecognizerPointer = (EmbeddedRecognizerProxy*) nativeObj;
+  if (!nativeRecognizerPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedRecognizerProxy& nativeRecognizer = *nativeRecognizerPointer;
+  
+  RecognizerListenerProxy nativeListener;
+  if (listener != 0)
+  {
+    JavaVM* jvm = JNIHelper::getJVM(env, recognizer);
+    if (env->ExceptionCheck())
+      return;
+    CWrapperRecognizerListener* temp = new CWrapperRecognizerListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+      return;
+    }
+    else if (returnCode)
+    {
+      JNIHelper::throwJavaException(env, recognizer, returnCode);
+      return;
+    }
+    nativeListener = RecognizerListenerProxy(temp);
+    if (!nativeListener)
+    {
+      delete temp;
+      JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+      return;
+    }
+  }
+  
+  nativeRecognizer->setListener(nativeListener, returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+    return;
+  }
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_recognizeProxy(JNIEnv* env,
+    jobject recognizer,
+    jlong nativeObj,
+    jlong audioObj,
+    jlongArray grammars)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_recognizeProxy");
+    
+  EmbeddedRecognizerProxy* nativeRecognizerPointer = (EmbeddedRecognizerProxy*) nativeObj;
+  if (!nativeRecognizerPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedRecognizerProxy& nativeRecognizer = *nativeRecognizerPointer;
+  
+  AudioStreamProxy* nativeAudioPointer = (AudioStreamProxy*) audioObj;
+
+  if (!nativeAudioPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return;
+  }
+  AudioStreamProxy& nativeAudio = *nativeAudioPointer;
+  
+  jsize count = env->GetArrayLength(grammars);
+  assert(count > 0);
+
+  // copy grammars
+  jlong *_Grammars = env->GetLongArrayElements(grammars,0);
+  GrammarProxy* nativeGrammars = new GrammarProxy[count];
+  for (jsize i = 0; i < count; ++i)
+    nativeGrammars[i] = *((GrammarProxy*)_Grammars[i]);
+  nativeRecognizer->recognize(nativeAudio, nativeGrammars, count, returnCode);
+  env->ReleaseLongArrayElements(grammars,(jlong*)_Grammars,0);
+  delete[] nativeGrammars;
+  nativeGrammars =NULL;
+ 
+  if (returnCode)
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+}
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_createEmbeddedGrammarProxy
+(JNIEnv* env,
+ jobject recognizer,
+ jlong nativeObj,
+ jstring url,
+ jobject listener)
+{
+  ReturnCode::Type returnCode = ReturnCode::UNKNOWN;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_createEmbeddedGrammarProxy");
+  
+  EmbeddedRecognizerProxy* nativeRecognizerPointer = (EmbeddedRecognizerProxy*) nativeObj;
+  if (!nativeRecognizerPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  EmbeddedRecognizerProxy& nativeRecognizer = *nativeRecognizerPointer;
+ 
+
+  EmbeddedGrammarListenerProxy nativeListener;
+  if (listener != 0)
+  {
+    JavaVM* jvm = JNIHelper::getJVM(env, recognizer);
+    if (env->ExceptionCheck())
+      return 0;
+
+    jclass EmbeddedGrammarListenerClass = JNIHelper::loadClass(env, listener, "android.speech.recognition.EmbeddedGrammarListener");
+    assert(EmbeddedGrammarListenerClass != 0);
+    jclass SrecGrammarListenerClass = JNIHelper::loadClass(env, listener, "android.speech.recognition.SrecGrammarListener");
+    assert(SrecGrammarListenerClass != 0);
+
+    if (env->IsInstanceOf(listener, SrecGrammarListenerClass))
+    { 
+      env->DeleteLocalRef(SrecGrammarListenerClass);
+      env->DeleteLocalRef(EmbeddedGrammarListenerClass);
+      CWrapperSrecGrammarListener* temp = new CWrapperSrecGrammarListener(jvm, listener, returnCode);
+      if (!temp)
+      {
+        JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+        return 0;
+      }
+      else if (returnCode)
+      {
+        JNIHelper::throwJavaException(env, recognizer, returnCode);
+        return 0;
+      }
+      nativeListener = SrecGrammarListenerProxy(temp);
+      if (!nativeListener)
+      {
+        delete temp;
+        JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+        return 0;
+      }
+    }
+    else if (env->IsInstanceOf(listener, EmbeddedGrammarListenerClass))
+    {
+      env->DeleteLocalRef(SrecGrammarListenerClass);
+      env->DeleteLocalRef(EmbeddedGrammarListenerClass);
+      CWrapperEmbeddedGrammarListener* temp = new CWrapperEmbeddedGrammarListener(jvm, listener, returnCode);
+      if (!temp)
+      {
+        JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+        return 0;
+      }
+      else if (returnCode)
+      {
+        JNIHelper::throwJavaException(env, recognizer, returnCode);
+        return 0;
+      }
+      nativeListener = EmbeddedGrammarListenerProxy(temp);
+      if (!nativeListener)
+      {
+        delete temp;
+        JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+        return 0;
+      }
+    }
+  }
+   
+  const char* nativeURL = env->GetStringUTFChars(url, 0);
+  
+  GrammarProxy nativeGrammar = nativeRecognizer->createGrammar(nativeURL, nativeListener, returnCode);
+  env->ReleaseStringUTFChars(url, nativeURL);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+    return 0;
+  }
+  
+  GrammarProxy* result = new GrammarProxy(nativeGrammar);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+    return 0;
+  }
+  
+  return (jlong) result;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_stopProxy(JNIEnv* env,
+    jobject recognizer,
+    jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_stopProxy");
+    
+  EmbeddedRecognizerProxy* nativeRecognizerPointer = (EmbeddedRecognizerProxy*) nativeObj;
+
+  if (!nativeRecognizerPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedRecognizerProxy& nativeRecognizer = *nativeRecognizerPointer;
+  
+  nativeRecognizer->stop(returnCode);
+  if (returnCode)
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_setParametersProxy
+(JNIEnv* env,
+ jobject recognizer,
+ jlong nativeObj,
+ jobject parameters)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_setParametersProxy");
+  
+  EmbeddedRecognizerProxy* nativeRecognizerPointer = (EmbeddedRecognizerProxy*) nativeObj;
+  if (!nativeRecognizerPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedRecognizerProxy& nativeRecognizer = *nativeRecognizerPointer;
+  
+  jclass hashtableClass = JNIHelper::loadClass(env, parameters, "java.util.Hashtable");
+  assert(hashtableClass != 0);
+  jclass EnumerationClass = JNIHelper::loadClass(env, parameters, "java.util.Enumeration");
+  assert(EnumerationClass != 0);
+
+  jmethodID hashtableSize = env->GetMethodID(hashtableClass, "size", "()I");
+  assert(hashtableSize != 0);
+  jint size = env->CallIntMethod(parameters, hashtableSize);
+        
+  if (env->ExceptionCheck())
+  {
+    env->DeleteLocalRef(hashtableClass);
+    env->DeleteLocalRef(EnumerationClass);
+    return;
+  }
+  const char** keys = new const char*[size];
+  if (!keys)
+  {
+    env->DeleteLocalRef(hashtableClass);
+    env->DeleteLocalRef(EnumerationClass);
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+    return;
+  }
+  for (jint i = 0; i < size; ++i)
+    keys[i] = 0;
+  const char** values = new const char*[size];
+  if (!values)
+  {
+    delete[] keys;
+    env->DeleteLocalRef(hashtableClass);
+    env->DeleteLocalRef(EnumerationClass);
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+    return;
+  }
+  for (jint i = 0; i < size; ++i)
+    values[i] = 0;
+    
+  jmethodID hashtableHasMoreElements = env->GetMethodID(EnumerationClass, "hasMoreElements",
+                                       "()Z");
+  assert(hashtableHasMoreElements != 0);
+  jmethodID hashtableNextElement = env->GetMethodID(EnumerationClass, "nextElement",
+                                   "()Ljava/lang/Object;");
+  assert(hashtableNextElement != 0);
+  
+  jmethodID hashtableKeys = env->GetMethodID(hashtableClass, "keys", "()Ljava/util/Enumeration;");
+  assert(hashtableKeys != 0);
+  jobject keysEnumeration = env->CallObjectMethod(parameters, hashtableKeys);
+  jmethodID hashtableElements;
+  jobject valuesEnumeration;
+  if (env->ExceptionCheck())
+    goto CLEANUP;
+  assert(keysEnumeration != 0);
+  
+  for (jsize i = 0; env->CallBooleanMethod(keysEnumeration, hashtableHasMoreElements); ++i)
+  {
+    if (env->ExceptionCheck())
+      goto CLEANUP;
+    jstring key = (jstring) env->CallObjectMethod(keysEnumeration, hashtableNextElement);
+    if (env->ExceptionCheck())
+      goto CLEANUP;
+    keys[i] = new char[env->GetStringLength(key)+1];
+    if (!keys[i])
+    {
+      env->DeleteLocalRef(key);
+      JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+      goto CLEANUP;
+    }
+    const char* keyString = env->GetStringUTFChars(key, 0);
+    strcpy((char*)keys[i], keyString);
+    env->ReleaseStringUTFChars(key, keyString);
+    env->DeleteLocalRef(key);
+  }
+  
+  hashtableElements = env->GetMethodID(hashtableClass, "elements", "()Ljava/util/Enumeration;");
+  assert(hashtableElements != 0);
+  valuesEnumeration = env->CallObjectMethod(parameters, hashtableElements);
+  if (env->ExceptionCheck())
+    goto CLEANUP;
+  assert(valuesEnumeration != 0);
+  
+  for (jsize i = 0; env->CallBooleanMethod(valuesEnumeration, hashtableHasMoreElements); ++i)
+  {
+    if (env->ExceptionCheck())
+    {
+      env->DeleteLocalRef(valuesEnumeration);
+      goto CLEANUP;
+    }
+    jstring value = (jstring) env->CallObjectMethod(valuesEnumeration, hashtableNextElement);
+    if (env->ExceptionCheck())
+    {
+      env->DeleteLocalRef(valuesEnumeration);
+      goto CLEANUP;
+    }
+    values[i] = new char[env->GetStringLength(value)+1];
+    if (!values[i])
+    {
+      env->DeleteLocalRef(value);
+      env->DeleteLocalRef(valuesEnumeration);
+      JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+      goto CLEANUP;
+    }
+    const char* valueString = env->GetStringUTFChars(value, 0);
+    strcpy((char*)values[i], valueString);
+    env->ReleaseStringUTFChars(value, valueString);
+    env->DeleteLocalRef(value);
+  }
+  
+  nativeRecognizer->setParameters(keys, values, size, returnCode);
+  env->DeleteLocalRef(hashtableClass);
+  env->DeleteLocalRef(EnumerationClass);
+  env->DeleteLocalRef(keysEnumeration);
+  env->DeleteLocalRef(valuesEnumeration);
+  for (jint i = 0; i < size; ++i)
+  {
+    delete[] keys[i];
+    delete[] values[i];
+  }
+  delete[] keys;
+  delete[] values;
+  
+  if (returnCode != ReturnCode::SUCCESS)
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+  return;
+CLEANUP:
+  env->DeleteLocalRef(hashtableClass);
+  env->DeleteLocalRef(EnumerationClass);
+  env->DeleteLocalRef(keysEnumeration);
+  for (jint i = 0; i < size; ++i)
+  {
+    delete[] keys[i];
+    delete[] values[i];
+  }
+  delete[] keys;
+  delete[] values;
+}
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_getParametersProxy
+(JNIEnv *env,
+ jobject recognizer,
+ jlong nativeObj,
+ jobject parameters)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_getParametersProxy");
+    
+  EmbeddedRecognizerProxy* nativeRecognizerPointer = (EmbeddedRecognizerProxy*) nativeObj;
+  if (!nativeRecognizerPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedRecognizerProxy& nativeRecognizer = *nativeRecognizerPointer;
+  
+  jclass vectorClass = JNIHelper::loadClass(env, parameters, "java.util.Vector");
+  assert(vectorClass != 0);
+  jmethodID vectorSize = env->GetMethodID(vectorClass, "size", "()I");
+  assert(vectorSize != 0);
+  jint size = env->CallIntMethod(parameters, vectorSize);
+  if (env->ExceptionCheck())
+  {
+    env->DeleteLocalRef(vectorClass);
+    return;
+  }
+  const char** keys = new const char*[size];
+  if (!keys)
+  {
+    env->DeleteLocalRef(vectorClass);
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+    return;
+  }
+  for (jint i = 0; i < size; ++i)
+    keys[i] = 0;
+    
+  jmethodID vectorGet = env->GetMethodID(vectorClass, "get", "(I)Ljava/lang/Object;");
+  assert(vectorGet != 0);
+  env->DeleteLocalRef(vectorClass);
+
+  for (jint i = 0; i < size; ++i)
+  {
+    jstring key = (jstring) env->CallObjectMethod(parameters, vectorGet, i);
+    if (env->ExceptionCheck())
+    {
+      for (jint i = 0; i < size; ++i)
+        delete[] keys[i];
+      delete[] keys;
+      return;
+    }
+    keys[i] = new char[env->GetStringLength(key)+1];
+    if (!keys[i])
+    {
+      env->DeleteLocalRef(key);
+      for (jint i = 0; i < size; ++i)
+        delete[] keys[i];
+      delete[] keys;
+      JNIHelper::throwJavaException(env, recognizer, ReturnCode::OUT_OF_MEMORY);
+      return;
+    }
+    const char* keyString = env->GetStringUTFChars(key, 0);
+    strcpy((char*)keys[i], keyString);
+    env->ReleaseStringUTFChars(key, keyString);
+    env->DeleteLocalRef(key);
+  }
+  
+  nativeRecognizer->getParameters(keys, size, returnCode);
+  for (jint i = 0; i < size; ++i)
+    delete[] keys[i];
+  delete[] keys;
+  
+  if (returnCode != ReturnCode::SUCCESS)
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_resetAcousticStateProxy
+(JNIEnv* env,
+ jobject recognizer,
+ jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_resetAcousticStateProxy");
+    
+  EmbeddedRecognizerProxy* nativeRecognizerPointer = (EmbeddedRecognizerProxy*) nativeObj;
+  if (!nativeRecognizerPointer)
+  {
+    JNIHelper::throwJavaException(env, recognizer, ReturnCode::INVALID_STATE);
+    return;
+  }
+  EmbeddedRecognizerProxy& nativeRecognizer = *nativeRecognizerPointer;
+  
+  nativeRecognizer->resetAcousticState(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, recognizer, returnCode);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedRecognizerImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedRecognizerImpl.h
new file mode 100644
index 0000000..1fffd6a
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EmbeddedRecognizerImpl.h
@@ -0,0 +1,93 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_EmbeddedRecognizerImpl */
+
+#ifndef _Included_android_speech_recognition_impl_EmbeddedRecognizerImpl
+#define _Included_android_speech_recognition_impl_EmbeddedRecognizerImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    getInstanceProxy
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_getInstanceProxy
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    configureProxy
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_configureProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    setListenerProxy
+ * Signature: (JLandroid/speech/recognition/RecognizerListener;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_setListenerProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    recognizeProxy
+ * Signature: (JJ[J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_recognizeProxy
+  (JNIEnv *, jobject, jlong, jlong, jlongArray);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    createEmbeddedGrammarProxy
+ * Signature: (JLjava/lang/String;Landroid/speech/recognition/GrammarListener;)J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_createEmbeddedGrammarProxy
+  (JNIEnv *, jobject, jlong, jstring, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    stopProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_stopProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    setParametersProxy
+ * Signature: (JLjava/util/Hashtable;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_setParametersProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    getParametersProxy
+ * Signature: (JLjava/util/Vector;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_getParametersProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_EmbeddedRecognizerImpl
+ * Method:    resetAcousticStateProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EmbeddedRecognizerImpl_resetAcousticStateProxy
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EntryImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EntryImpl.cpp
new file mode 100644
index 0000000..4f4cae9
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EntryImpl.cpp
@@ -0,0 +1,188 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_EntryImpl.cpp                                                  *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ * android_speech_recognition_impl_EntryImpl.cpp
+ */
+#include "jniapi.h"
+#include <jni.h>
+#include "android_speech_recognition_impl_EntryImpl.h"
+#include "NBestRecognitionResult.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EntryImpl_deleteNativeObject
+(JNIEnv* ,
+ jobject ,
+ jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EntryImpl_deleteNativeObject");
+  delete (NBestRecognitionResult::EntryProxy*) nativeObj;
+}
+
+JNIEXPORT jstring JNICALL Java_android_speech_recognition_impl_EntryImpl_getLiteralMeaningProxy
+(JNIEnv* env,
+ jobject entry,
+ jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EntryImpl_getLiteralMeaningProxy");
+  
+  NBestRecognitionResult::EntryProxy* nativeEntryPointer = (NBestRecognitionResult::EntryProxy*) nativeObj;
+  if (!nativeEntryPointer)
+  {
+    JNIHelper::throwJavaException(env, entry, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  NBestRecognitionResult::EntryProxy& nativeEntry = *nativeEntryPointer;
+  
+  const char* nativeLiteralMeaning = nativeEntry->getLiteralMeaning(returnCode);
+  
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, entry, returnCode);
+    return 0;
+  }
+  return env->NewStringUTF(nativeLiteralMeaning);
+}
+
+
+JNIEXPORT jstring JNICALL Java_android_speech_recognition_impl_EntryImpl_getSemanticMeaningProxy
+(JNIEnv* env,
+ jobject entry,
+ jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EntryImpl_getSemanticMeaningProxy");
+  
+  NBestRecognitionResult::EntryProxy* nativeEntryPointer = (NBestRecognitionResult::EntryProxy*) nativeObj;
+      
+  if (!nativeEntryPointer)
+  {
+    JNIHelper::throwJavaException(env, entry, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  NBestRecognitionResult::EntryProxy& nativeEntry = *nativeEntryPointer;
+  
+  const char * nativeSemanticMeaning = nativeEntry->getSemanticMeaning(returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, entry, returnCode);
+    return 0;
+  }
+  return env->NewStringUTF(nativeSemanticMeaning);
+}
+
+
+
+JNIEXPORT jbyte JNICALL Java_android_speech_recognition_impl_EntryImpl_getConfidenceScoreProxy
+(JNIEnv* env,
+ jobject entry,
+ jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EntryImpl_getConfidenceScoreProxy");
+  
+  NBestRecognitionResult::EntryProxy* nativeEntryPointer = (NBestRecognitionResult::EntryProxy*)nativeObj;
+      
+  if (!nativeEntryPointer)
+  {
+    JNIHelper::throwJavaException(env, entry, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  NBestRecognitionResult::EntryProxy& nativeEntry = *nativeEntryPointer;
+  
+  android::speech::recognition::UINT8 nativeConfidenceScore = nativeEntry->getConfidenceScore(returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, entry, returnCode);
+    return 0;
+  }
+  return nativeConfidenceScore;
+}
+
+JNIEXPORT jstring JNICALL Java_android_speech_recognition_impl_EntryImpl_getProxy
+  (JNIEnv * env, jobject entry, jlong nativeObj, jstring key)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EntryImpl_getProxy");
+
+  NBestRecognitionResult::EntryProxy* nativeEntryPointer = (NBestRecognitionResult::EntryProxy*)nativeObj;
+      
+  if (!nativeEntryPointer)
+  {
+    JNIHelper::throwJavaException(env, entry, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  NBestRecognitionResult::EntryProxy& nativeEntry = *nativeEntryPointer;
+  
+  const char* nativeKey = env->GetStringUTFChars(key, 0);
+  const char* nativeValue = nativeEntry->getValue(nativeKey, returnCode);
+  env->ReleaseStringUTFChars(key, nativeKey);
+  
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, entry, returnCode);
+    return 0;
+  }
+  return env->NewStringUTF(nativeValue);
+}
+
+JNIEXPORT jobjectArray JNICALL Java_android_speech_recognition_impl_EntryImpl_keysProxy
+  (JNIEnv * env, jobject entry, jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_EntryImpl_keysProxy");
+
+  NBestRecognitionResult::EntryProxy* nativeEntryPointer = (NBestRecognitionResult::EntryProxy*)nativeObj;
+      
+  if (!nativeEntryPointer)
+  {
+    JNIHelper::throwJavaException(env, entry, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  NBestRecognitionResult::EntryProxy& nativeEntry = *nativeEntryPointer;
+
+  const char* const* nativeKeys = nativeEntry->getKeys();
+  ARRAY_LIMIT length = nativeEntry->getKeyCount();
+  if( nativeKeys == 0 || length == 0 )
+  {
+    UAPI_INFO(fn, "No entries available\n");
+    return 0;
+  }
+
+  jclass stringClass = env->FindClass("java/lang/String");
+  jobjectArray result = env->NewObjectArray(length, stringClass, 0);
+  env->DeleteLocalRef(stringClass);
+  if( result == 0 )
+  {
+    UAPI_ERROR(fn, "Failed to create NewObjectArray\n");
+    return 0;
+  }
+  
+  for (ARRAY_LIMIT i = 0; i < length; ++i)
+  {
+    jstring value = env->NewStringUTF(nativeKeys[i]);
+    env->SetObjectArrayElement(result, i, value);
+    env->DeleteLocalRef(value);
+  }
+  return result;
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EntryImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EntryImpl.h
new file mode 100644
index 0000000..fe85dca
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_EntryImpl.h
@@ -0,0 +1,61 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_EntryImpl */
+
+#ifndef _Included_android_speech_recognition_impl_EntryImpl
+#define _Included_android_speech_recognition_impl_EntryImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_EntryImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_EntryImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_EntryImpl
+ * Method:    getLiteralMeaningProxy
+ * Signature: (J)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_android_speech_recognition_impl_EntryImpl_getLiteralMeaningProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_EntryImpl
+ * Method:    getSemanticMeaningProxy
+ * Signature: (J)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_android_speech_recognition_impl_EntryImpl_getSemanticMeaningProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_EntryImpl
+ * Method:    getConfidenceScoreProxy
+ * Signature: (J)B
+ */
+JNIEXPORT jbyte JNICALL Java_android_speech_recognition_impl_EntryImpl_getConfidenceScoreProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_EntryImpl
+ * Method:    getProxy
+ * Signature: (JLjava/lang/String;)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_android_speech_recognition_impl_EntryImpl_getProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_EntryImpl
+ * Method:    keysProxy
+ * Signature: (J)[Ljava/lang/String;
+ */
+JNIEXPORT jobjectArray JNICALL Java_android_speech_recognition_impl_EntryImpl_keysProxy
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_GrammarImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_GrammarImpl.cpp
new file mode 100644
index 0000000..1db97a0
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_GrammarImpl.cpp
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_GrammarImpl.cpp                                                *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+
+#include "jniapi.h"
+#include "android_speech_recognition_impl_GrammarImpl.h"
+#include "JNIHelper.h"
+#include "Grammar.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_GrammarImpl_deleteNativeObject(JNIEnv*,
+    jobject,
+    jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_GrammarImpl_deleteNativeObject");
+  delete(GrammarProxy*) nativeObj;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_GrammarImpl_loadProxy
+(JNIEnv* env,
+ jobject grammar,
+ jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_GrammarImpl_loadProxy");
+  
+  GrammarProxy* nativeGrammarPointer = (GrammarProxy*) nativeObj;
+  if (!nativeGrammarPointer)
+  {
+    JNIHelper::throwJavaException(env, grammar, ReturnCode::INVALID_STATE);
+    return;
+  }
+  GrammarProxy& nativeGrammar = *nativeGrammarPointer;
+  nativeGrammar->load(returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, grammar, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_GrammarImpl_unloadProxy(JNIEnv* env,
+    jobject grammar,jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_GrammarImpl_unloadProxy");
+  
+  GrammarProxy* nativeGrammarPointer = (GrammarProxy*) nativeObj;
+  if (!nativeGrammarPointer)
+  {
+    JNIHelper::throwJavaException(env, grammar, ReturnCode::INVALID_STATE);
+    return;
+  }
+  GrammarProxy& nativeGrammar = *nativeGrammarPointer;
+  nativeGrammar->unload(returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, grammar, returnCode);
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_GrammarImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_GrammarImpl.h
new file mode 100644
index 0000000..01c73ff
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_GrammarImpl.h
@@ -0,0 +1,37 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_GrammarImpl */
+
+#ifndef _Included_android_speech_recognition_impl_GrammarImpl
+#define _Included_android_speech_recognition_impl_GrammarImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_GrammarImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_GrammarImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_GrammarImpl
+ * Method:    loadProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_GrammarImpl_loadProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_GrammarImpl
+ * Method:    unloadProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_GrammarImpl_unloadProxy
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_LoggerImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_LoggerImpl.cpp
new file mode 100644
index 0000000..90385a3
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_LoggerImpl.cpp
@@ -0,0 +1,212 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_LoggerImpl.cpp                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ * android_speech_recognition_impl_LoggerImpl.cpp
+ */
+#include "jniapi.h"
+#include "android_speech_recognition_impl_LoggerImpl.h"
+#include "Logger.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_deleteNativeObject
+(JNIEnv* ,
+ jobject ,
+ jlong nativeObj)
+{
+#ifdef UAPI_LOGGING_ENABLED
+
+  // Allocating a LoggerProxy at this point will result in the parent logger getting destroyed
+  // before its children. As such, we don't create a parent logger.
+  delete(LoggerProxy*) nativeObj;
+#endif
+}
+
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_LoggerImpl_initNativeObject(JNIEnv* env,
+    jobject logger)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_LoggerImpl_initNativeObject");
+  
+#ifdef UAPI_LOGGING_ENABLED
+  ReturnCode::Type returnCode;
+  LoggerProxy nativeLogger = Logger::getInstance(returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, logger, returnCode);
+    return 0;
+  }
+  LoggerProxy* result = new LoggerProxy(nativeLogger);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, logger, returnCode);
+    return 0;
+  }
+  return (jlong) result;
+#else
+  return 0;
+#endif
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_setLoggingLevelProxy
+(JNIEnv* env,
+ jobject logger,
+ jlong nativeObj,
+ jobject loglevel)
+{
+#ifdef UAPI_LOGGING_ENABLED
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_LoggerImpl_SetLoggingLevelProxy");
+  
+  LoggerProxy* nativeLoggerPointer = (LoggerProxy*) nativeObj;
+  if (!nativeLoggerPointer)
+  {
+    JNIHelper::throwJavaException(env, logger, ReturnCode::INVALID_STATE);
+    return;
+  }
+  LoggerProxy& nativeLogger = *nativeLoggerPointer;
+  
+  Logger::LogLevel nativeLogLevel = JNIHelper::toNativeLogLevel(env, loglevel);
+  if (env->ExceptionCheck())
+    return;
+  nativeLogger->setLoggingLevel(nativeLogLevel, returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, logger, returnCode);
+    return;
+  }
+#endif
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_setPathProxy
+(JNIEnv *env,
+ jobject logger,
+ jlong nativeObj,
+ jstring path)
+{
+#ifdef UAPI_LOGGING_ENABLED
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_LoggerImpl_setPathProxy");
+  
+  LoggerProxy* nativeLoggerPointer = (LoggerProxy*) nativeObj;
+  if (!nativeLoggerPointer)
+  {
+    JNIHelper::throwJavaException(env, logger, ReturnCode::INVALID_STATE);
+    return;
+  }
+  LoggerProxy& nativeLogger = *nativeLoggerPointer;
+  
+  const char* nativePath = env->GetStringUTFChars(path, 0);
+  nativeLogger->setPath(nativePath, returnCode);
+  env->ReleaseStringUTFChars(path, nativePath);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, logger, returnCode);
+#endif
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_errorProxy
+(JNIEnv* env,
+ jobject logger,
+ jlong nativeObj,
+ jstring message)
+{
+#ifdef UAPI_LOGGING_ENABLED
+  LoggerProxy* nativeLoggerPointer = (LoggerProxy*) nativeObj;
+  if (!nativeLoggerPointer)
+  {
+    JNIHelper::throwJavaException(env, logger, ReturnCode::INVALID_STATE);
+    return;
+  }
+  LoggerProxy& nativeLogger = *nativeLoggerPointer;
+  
+  const char* nativeMessage = env->GetStringUTFChars(message, 0);
+  nativeLogger->error("Java", "%s\n", nativeMessage);
+  env->ReleaseStringUTFChars(message, nativeMessage);
+#endif
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_warnProxy
+(JNIEnv *env,
+ jobject logger,
+ jlong nativeObj,
+ jstring message)
+{
+#ifdef UAPI_LOGGING_ENABLED
+  LoggerProxy* nativeLoggerPointer = (LoggerProxy*) nativeObj;
+  if (!nativeLoggerPointer)
+  {
+    JNIHelper::throwJavaException(env, logger, ReturnCode::INVALID_STATE);
+    return;
+  }
+  LoggerProxy& nativeLogger = *nativeLoggerPointer;
+  
+  const char* nativeMessage = env->GetStringUTFChars(message, 0);
+  nativeLogger->warn("Java", "%s\n", nativeMessage);
+  env->ReleaseStringUTFChars(message, nativeMessage);
+#endif
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_infoProxy
+(JNIEnv *env,
+ jobject logger,
+ jlong nativeObj,
+ jstring message)
+{
+#ifdef UAPI_LOGGING_ENABLED
+  LoggerProxy* nativeLoggerPointer = (LoggerProxy*) nativeObj;
+  if (!nativeLoggerPointer)
+  {
+    JNIHelper::throwJavaException(env, logger, ReturnCode::INVALID_STATE);
+    return;
+  }
+  LoggerProxy& nativeLogger = *nativeLoggerPointer;
+  
+  const char* nativeMessage = env->GetStringUTFChars(message, 0);
+  nativeLogger->info("Java", "%s\n", nativeMessage);
+  env->ReleaseStringUTFChars(message, nativeMessage);
+#endif
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_traceProxy
+(JNIEnv *env,
+ jobject logger,
+ jlong nativeObj,
+ jstring message)
+{
+#ifdef UAPI_LOGGING_ENABLED
+  LoggerProxy* nativeLoggerPointer = (LoggerProxy*) nativeObj;
+  if (!nativeLoggerPointer)
+  {
+    JNIHelper::throwJavaException(env, logger, ReturnCode::INVALID_STATE);
+    return;
+  }
+  LoggerProxy& nativeLogger = *nativeLoggerPointer;
+  
+  const char* nativeMessage = env->GetStringUTFChars(message, 0);
+  nativeLogger->trace("Java", "%s\n", nativeMessage);
+  env->ReleaseStringUTFChars(message, nativeMessage);
+#endif
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_LoggerImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_LoggerImpl.h
new file mode 100644
index 0000000..0d1fe02
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_LoggerImpl.h
@@ -0,0 +1,77 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_LoggerImpl */
+
+#ifndef _Included_android_speech_recognition_impl_LoggerImpl
+#define _Included_android_speech_recognition_impl_LoggerImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_LoggerImpl
+ * Method:    initNativeObject
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_LoggerImpl_initNativeObject
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_LoggerImpl
+ * Method:    setLoggingLevelProxy
+ * Signature: (JLandroid/speech/recognition/Logger/LogLevel;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_setLoggingLevelProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_LoggerImpl
+ * Method:    setPathProxy
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_setPathProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_LoggerImpl
+ * Method:    errorProxy
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_errorProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_LoggerImpl
+ * Method:    warnProxy
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_warnProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_LoggerImpl
+ * Method:    infoProxy
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_infoProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_LoggerImpl
+ * Method:    traceProxy
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_traceProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_LoggerImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_LoggerImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileReaderImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileReaderImpl.cpp
new file mode 100644
index 0000000..c87410f
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileReaderImpl.cpp
@@ -0,0 +1,186 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_MediaFileReaderImpl.cpp                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+#include <assert.h>
+#include "jniapi.h"
+#include "android_speech_recognition_impl_MediaFileReaderImpl.h"
+#include "CWrapperMediaFileReaderListener.h"
+#include "JNIHelper.h"
+#include "AudioStream.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_deleteNativeObject(JNIEnv*,
+    jobject , jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileReaderImpl_deleteNativeObject");
+  delete(MediaFileReaderProxy*) nativeObj;
+}
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_createMediaFileReaderProxy
+(JNIEnv* env,
+ jobject mediaFileReader,
+ jstring filename,
+ jobject listener)
+{
+  ReturnCode::Type returnCode = ReturnCode::UNKNOWN;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileReaderImpl_createMediaFileReaderProxy");
+  
+  // Create the native listener
+  MediaFileReaderListenerProxy nativeListener;
+  if (listener != 0)
+  {
+    JavaVM* jvm = JNIHelper::getJVM(env, mediaFileReader);
+    if (env->ExceptionCheck())
+      return 0;
+    CWrapperMediaFileReaderListener* temp = new CWrapperMediaFileReaderListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      JNIHelper::throwJavaException(env, mediaFileReader, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+    else if (returnCode)
+    {
+      JNIHelper::throwJavaException(env, mediaFileReader, returnCode);
+      return 0;
+    }
+    nativeListener = MediaFileReaderListenerProxy(temp);
+    if (!nativeListener)
+    {
+      delete temp;
+      JNIHelper::throwJavaException(env, mediaFileReader, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+  }
+    
+  const char* nativeFilename = env->GetStringUTFChars(filename, 0);
+  MediaFileReaderProxy nativeMediaFileReader = MediaFileReader::create(nativeFilename, nativeListener, returnCode);
+  env->ReleaseStringUTFChars(filename, nativeFilename);
+  
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, mediaFileReader, returnCode);
+    return 0;
+  }
+  MediaFileReaderProxy* result = new MediaFileReaderProxy(nativeMediaFileReader);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, mediaFileReader, returnCode);
+    return 0;
+  }
+  return (jlong) result;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_setModeProxy(JNIEnv* env,
+    jobject mediaFileReader,
+    jlong nativeObj,
+    jobject mode)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileReaderImpl_setModeProxy");
+  
+  MediaFileReaderProxy* nativeReaderPointer = (MediaFileReaderProxy*) nativeObj;
+  if (!nativeReaderPointer)
+  {
+    JNIHelper::throwJavaException(env, mediaFileReader, ReturnCode::INVALID_STATE);
+    return;
+  }
+  MediaFileReaderProxy& nativeMediaFileReader = *nativeReaderPointer;
+  
+  MediaFileReader::ReadingMode nativeMode = JNIHelper::toNativeMediaFileReaderMode(env, mode);
+  if (env->ExceptionCheck())
+    return;
+  nativeMediaFileReader->setReadingMode(nativeMode, returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, mediaFileReader, returnCode);
+}
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_createAudioProxy(JNIEnv* env,
+    jobject mediaFileReader,jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileReaderImpl_createAudioProxy");
+  
+  MediaFileReaderProxy* nativeReaderPointer = (MediaFileReaderProxy*) nativeObj;
+  if (!nativeReaderPointer)
+  {
+    JNIHelper::throwJavaException(env, mediaFileReader, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  MediaFileReaderProxy& nativeMediaFileReader = *nativeReaderPointer;
+  
+  AudioStreamProxy temp = nativeMediaFileReader->createAudio(returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, mediaFileReader, returnCode);
+    return 0;
+  }
+  AudioStreamProxy* audio = new AudioStreamProxy(temp);
+  if (!audio)
+  {
+    JNIHelper::throwJavaException(env, mediaFileReader, returnCode);
+    return 0;
+  }
+  return (jlong) audio;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_startProxy(JNIEnv* env,
+    jobject mediaFileReader,jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileReaderImpl_startProxy");
+  
+  MediaFileReaderProxy* nativeReaderPointer = (MediaFileReaderProxy*) nativeObj;
+  if (!nativeReaderPointer)
+  {
+    JNIHelper::throwJavaException(env, mediaFileReader, ReturnCode::INVALID_STATE);
+    return;
+  }
+  MediaFileReaderProxy& nativeMediaFileReader = *nativeReaderPointer;
+  nativeMediaFileReader->start(returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, mediaFileReader, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_stopProxy(JNIEnv* env,
+    jobject mediaFileReader,jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileReaderImpl_stopProxy");
+  
+  MediaFileReaderProxy* nativeReaderPointer = (MediaFileReaderProxy*) nativeObj;
+  if (!nativeReaderPointer)
+  {
+    JNIHelper::throwJavaException(env, mediaFileReader, ReturnCode::INVALID_STATE);
+    return;
+  }
+  MediaFileReaderProxy& nativeMediaFileReader = *nativeReaderPointer;
+  nativeMediaFileReader->stop(returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, mediaFileReader, returnCode);
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileReaderImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileReaderImpl.h
new file mode 100644
index 0000000..a9a0f87
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileReaderImpl.h
@@ -0,0 +1,61 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_MediaFileReaderImpl */
+
+#ifndef _Included_android_speech_recognition_impl_MediaFileReaderImpl
+#define _Included_android_speech_recognition_impl_MediaFileReaderImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_MediaFileReaderImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_MediaFileReaderImpl
+ * Method:    createMediaFileReaderProxy
+ * Signature: (Ljava/lang/String;Landroid/speech/recognition/AudioSourceListener;)J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_createMediaFileReaderProxy
+  (JNIEnv *, jobject, jstring, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_MediaFileReaderImpl
+ * Method:    setModeProxy
+ * Signature: (JLandroid/speech/recognition/MediaFileReader/Mode;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_setModeProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_MediaFileReaderImpl
+ * Method:    createAudioProxy
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_createAudioProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_MediaFileReaderImpl
+ * Method:    startProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_startProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_MediaFileReaderImpl
+ * Method:    stopProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileReaderImpl_stopProxy
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileWriterImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileWriterImpl.cpp
new file mode 100644
index 0000000..82ac20e
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileWriterImpl.cpp
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_MediaFileWriterImpl.cpp                                        *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+#include "jniapi.h"
+#include "android_speech_recognition_impl_MediaFileWriterImpl.h"
+#include "JNIHelper.h"
+#include "CWrapperMediaFileWriterListener.h"
+#include "MediaFileWriter.h"
+
+#include <assert.h>
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileWriterImpl_deleteNativeObject(JNIEnv*,
+    jobject,
+    jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileWriterImpl_deleteNativeObject");
+  delete(MediaFileWriterProxy*) nativeObj;
+}
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MediaFileWriterImpl_createMediaFileWriterProxy(JNIEnv* env,
+    jobject mediaFileWriter,
+    jobject listener)
+{
+  ReturnCode::Type returnCode = ReturnCode::UNKNOWN;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileWriterImpl_createMediaFileWriterProxy");
+  
+  // Create the native listener
+  MediaFileWriterListenerProxy nativeListener;
+  if (listener != 0)
+  {
+    JavaVM* jvm = JNIHelper::getJVM(env, mediaFileWriter);
+    if (env->ExceptionCheck())
+      return 0;
+    CWrapperMediaFileWriterListener* temp = new CWrapperMediaFileWriterListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      JNIHelper::throwJavaException(env, mediaFileWriter, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+    else if (returnCode)
+    {
+      JNIHelper::throwJavaException(env, mediaFileWriter, returnCode);
+      return 0;
+    }
+    nativeListener = MediaFileWriterListenerProxy(temp);
+    if (!nativeListener)
+    {
+      delete temp;
+      JNIHelper::throwJavaException(env, mediaFileWriter, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+  }
+  
+  // Create the native microphone
+  MediaFileWriterProxy nativeMediaFileWriter = MediaFileWriter::create(nativeListener, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, mediaFileWriter, returnCode);
+    return 0;
+  }
+  MediaFileWriterProxy* result = new MediaFileWriterProxy(nativeMediaFileWriter);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, mediaFileWriter, returnCode);
+    return 0;
+  }
+  
+  return (jlong) result;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileWriterImpl_saveProxy(JNIEnv *env,
+    jobject mediaFileWriter,
+    jlong nativeObj,
+    jlong audioObj,
+    jstring filename)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MediaFileWriterImpl_saveProxy");
+  
+  MediaFileWriterProxy* nativeWriterPointer = (MediaFileWriterProxy*) nativeObj;
+  if (!nativeWriterPointer)
+  {
+    JNIHelper::throwJavaException(env, mediaFileWriter, ReturnCode::INVALID_STATE);
+    return;
+  }
+  MediaFileWriterProxy& nativeMediaFileWriter = *nativeWriterPointer;
+  
+  AudioStreamProxy* nativeAudioPointer = (AudioStreamProxy*) audioObj;
+  if (!nativeAudioPointer)
+  {
+    JNIHelper::throwJavaException(env, mediaFileWriter, ReturnCode::INVALID_STATE);
+    return;
+  }
+  AudioStreamProxy& nativeAudio = *nativeAudioPointer;
+  
+  const char* nativeFilename = env->GetStringUTFChars(filename, 0);
+  nativeMediaFileWriter->save(nativeAudio, nativeFilename, returnCode);
+  env->ReleaseStringUTFChars(filename, nativeFilename);
+  
+  switch (returnCode)
+  {
+    case ReturnCode::SUCCESS:
+      return;
+    case ReturnCode::ILLEGAL_ARGUMENT:
+    case ReturnCode::AUDIO_ALREADY_IN_USE:
+    case ReturnCode::END_OF_STREAM:
+    {
+      jclass clazz = JNIHelper::loadClass(env, mediaFileWriter, "java.lang.IllegalStateException");
+      jmethodID constructor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;)V");
+      jthrowable exception;
+      if (constructor != 0)
+        exception = (jthrowable) env->NewObject(clazz, constructor, env->NewStringUTF(ReturnCode::toString(returnCode)));
+      else
+      {
+        // Try the default constructor instead
+        constructor = env->GetMethodID(clazz, "<init>", "()V");
+        assert(constructor != 0);
+        exception = (jthrowable) env->NewObject(clazz, constructor);
+      }
+      env->DeleteLocalRef(clazz);
+      env->Throw(exception);
+      env->DeleteLocalRef(exception);
+      break;
+    }
+    default:
+      JNIHelper::throwJavaException(env, mediaFileWriter, returnCode);
+  }
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileWriterImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileWriterImpl.h
new file mode 100644
index 0000000..31dd9a6
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MediaFileWriterImpl.h
@@ -0,0 +1,37 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_MediaFileWriterImpl */
+
+#ifndef _Included_android_speech_recognition_impl_MediaFileWriterImpl
+#define _Included_android_speech_recognition_impl_MediaFileWriterImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_MediaFileWriterImpl
+ * Method:    createMediaFileWriterProxy
+ * Signature: (Landroid/speech/recognition/MediaFileWriterListener;)J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MediaFileWriterImpl_createMediaFileWriterProxy
+  (JNIEnv *, jobject, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_MediaFileWriterImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileWriterImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_MediaFileWriterImpl
+ * Method:    saveProxy
+ * Signature: (JJLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MediaFileWriterImpl_saveProxy
+  (JNIEnv *, jobject, jlong, jlong, jstring);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MicrophoneImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MicrophoneImpl.cpp
new file mode 100644
index 0000000..925b0ca
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MicrophoneImpl.cpp
@@ -0,0 +1,212 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_MicrophoneImpl.cpp                                             *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+#include "jniapi.h"
+#include "android_speech_recognition_impl_MicrophoneImpl.h"
+#include "CWrapperMicrophoneListener.h"
+#include "JNIHelper.h"
+#include "Codec.h"
+#include "Microphone.h"
+#include "AudioStream.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_deleteNativeObject
+(JNIEnv* ,
+ jobject ,
+ jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MicrophoneImpl_deleteNativeObject");
+  delete(MicrophoneProxy*) nativeObj;
+}
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_initNativeObject(JNIEnv* env,
+    jobject microphone)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MicrophoneImpl_initNativeObject");
+    
+  MicrophoneProxy nativeMicrophone = Microphone::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, microphone, returnCode);
+    
+    return 0;
+  }
+  MicrophoneProxy* result = new MicrophoneProxy(nativeMicrophone);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  
+  return (jlong) result;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_setCodecProxy
+(JNIEnv *env,
+ jobject microphone,
+ jlong nativeObj,
+ jobject codec)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MicrophoneImpl_setCodecProxy");
+  
+  MicrophoneProxy* nativeMicrophonePointer = (MicrophoneProxy*) nativeObj;
+  if (!nativeMicrophonePointer)
+  {
+    JNIHelper::throwJavaException(env, microphone, ReturnCode::INVALID_STATE);
+    return;
+  }
+  MicrophoneProxy& nativeMicrophone = *nativeMicrophonePointer;
+  
+  Codec::Type nativeCodec = JNIHelper::toNativeCodec(env, codec);
+  if (env->ExceptionCheck())
+    return;
+  nativeMicrophone->setCodec(nativeCodec, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+    JNIHelper::throwJavaException(env, microphone, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_setListenerProxy
+(JNIEnv *env,
+ jobject microphone,
+ jlong nativeObj,
+ jobject listener)
+{
+  ReturnCode::Type returnCode = ReturnCode::UNKNOWN;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MicrophoneImpl_setListenerProxy");
+  
+  MicrophoneProxy* nativeMicrophonePointer = (MicrophoneProxy*) nativeObj;
+  if (!nativeMicrophonePointer)
+  {
+    JNIHelper::throwJavaException(env, microphone, ReturnCode::INVALID_STATE);
+    return;
+  }
+  MicrophoneProxy& nativeMicrophone = *nativeMicrophonePointer;
+  
+  // Create the native listener
+  MicrophoneListenerProxy nativeListener;
+  if (listener != 0)
+  {
+    JavaVM* jvm = JNIHelper::getJVM(env, microphone);
+    if (env->ExceptionCheck())
+      return;
+    CWrapperMicrophoneListener* temp = new CWrapperMicrophoneListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      JNIHelper::throwJavaException(env, microphone, ReturnCode::OUT_OF_MEMORY);
+      return;
+    }
+    else if (returnCode)
+    {
+      JNIHelper::throwJavaException(env, microphone, returnCode);
+      return;
+    }
+    nativeListener = MicrophoneListenerProxy(temp);
+    if (!nativeListener)
+    {
+      delete temp;
+      JNIHelper::throwJavaException(env, microphone, ReturnCode::OUT_OF_MEMORY);
+      return;
+    }
+  }
+  
+  nativeMicrophone->setListener(nativeListener, returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+    JNIHelper::throwJavaException(env, microphone, returnCode);
+}
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_createAudioProxy(JNIEnv *env,
+    jobject microphone,
+    jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MicrophoneImpl_createAudioProxy");
+    
+  MicrophoneProxy* nativeMicrophonePointer = (MicrophoneProxy*)nativeObj;
+  if (!nativeMicrophonePointer)
+  {
+    JNIHelper::throwJavaException(env, microphone, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  MicrophoneProxy& nativeMicrophone = *nativeMicrophonePointer;
+  
+  AudioStreamProxy nativeAudio = nativeMicrophone->createAudio(returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, microphone, returnCode);
+    return 0;
+  }
+  
+  AudioStreamProxy* result = new AudioStreamProxy(nativeAudio);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    return 0;
+  }
+  return (jlong) result;
+}
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_startProxy(JNIEnv* env,
+    jobject microphone,
+    jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MicrophoneImpl_startProxy");
+  
+  MicrophoneProxy* nativeMicrophonePointer = (MicrophoneProxy*) nativeObj;
+  if (!nativeMicrophonePointer)
+  {
+    JNIHelper::throwJavaException(env, microphone, ReturnCode::INVALID_STATE);
+    return;
+  }
+  MicrophoneProxy& nativeMicrophone = *nativeMicrophonePointer;
+  nativeMicrophone->start(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+    JNIHelper::throwJavaException(env, microphone, returnCode);
+}
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_stopProxy(JNIEnv *env,
+    jobject microphone,
+    jlong nativeObj)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_MicrophoneImpl_stopProxy");
+  
+  MicrophoneProxy* nativeMicrophonePointer = (MicrophoneProxy*) nativeObj;
+  if (!nativeMicrophonePointer)
+  {
+    JNIHelper::throwJavaException(env, microphone, ReturnCode::INVALID_STATE);
+    return;
+  }
+  MicrophoneProxy& nativeMicrophone = *nativeMicrophonePointer;
+  nativeMicrophone->stop(returnCode);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, microphone, returnCode);
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MicrophoneImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MicrophoneImpl.h
new file mode 100644
index 0000000..6f78aba
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_MicrophoneImpl.h
@@ -0,0 +1,69 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_MicrophoneImpl */
+
+#ifndef _Included_android_speech_recognition_impl_MicrophoneImpl
+#define _Included_android_speech_recognition_impl_MicrophoneImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_MicrophoneImpl
+ * Method:    initNativeObject
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_initNativeObject
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_MicrophoneImpl
+ * Method:    setCodecProxy
+ * Signature: (JLandroid/speech/recognition/Codec;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_setCodecProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_MicrophoneImpl
+ * Method:    setListenerProxy
+ * Signature: (JLandroid/speech/recognition/AudioSourceListener;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_setListenerProxy
+  (JNIEnv *, jobject, jlong, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_MicrophoneImpl
+ * Method:    createAudioProxy
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_createAudioProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_MicrophoneImpl
+ * Method:    startProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_startProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_MicrophoneImpl
+ * Method:    stopProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_stopProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_MicrophoneImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_MicrophoneImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_NBestRecognitionResultImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_NBestRecognitionResultImpl.cpp
new file mode 100644
index 0000000..8da2215
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_NBestRecognitionResultImpl.cpp
@@ -0,0 +1,151 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_NBestRecognitionResultImpl.cpp                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+#include "jniapi.h"
+#include "android_speech_recognition_impl_NBestRecognitionResultImpl.h"
+#include "NBestRecognitionResult.h"
+#include "VoicetagItem.h"
+#include "CWrapperVoicetagListener.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+ JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_NBestRecognitionResultImpl_createVoicetagItemProxy
+ (JNIEnv *env, jobject result, jlong nativeObj, jstring VoicetagId, jobject listener)
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_NBestRecognitionResultImpl_createVoicetagItemProxy");
+    
+  NBestRecognitionResultProxy* nativeResultPointer = (NBestRecognitionResultProxy*) nativeObj;
+      
+  if (!nativeResultPointer)
+  {
+    JNIHelper::throwJavaException(env, result, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  NBestRecognitionResultProxy& nativeResult = *nativeResultPointer;
+
+  const char* nativeVoicetagId = env->GetStringUTFChars(VoicetagId, 0);
+  
+  // Create the native listener
+  VoicetagItemListenerProxy nativeListener;
+  if (listener != 0)
+  {
+    JavaVM* jvm = JNIHelper::getJVM(env, result);
+    if (env->ExceptionCheck())
+      return 0;
+    CWrapperVoicetagListener* temp = new CWrapperVoicetagListener(jvm, listener, returnCode);
+    if (!temp)
+    {
+      JNIHelper::throwJavaException(env, result, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+    else if (returnCode)
+    {
+      JNIHelper::throwJavaException(env, result, returnCode);
+      return 0;
+    }
+    nativeListener = VoicetagItemListenerProxy(temp);
+    if (!nativeListener)
+    {
+      delete temp;
+      JNIHelper::throwJavaException(env, result, ReturnCode::OUT_OF_MEMORY);
+      return 0;
+    }
+  }
+
+  VoicetagItemProxy nativeVoicetag = nativeResult->createVoicetagItem(nativeVoicetagId,nativeListener,returnCode);
+
+  env->ReleaseStringUTFChars(VoicetagId, nativeVoicetagId);
+
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, result, returnCode);
+    return 0;
+  }
+  VoicetagItemProxy* resultVoicetag = new VoicetagItemProxy(nativeVoicetag);
+
+  if (!resultVoicetag || !*resultVoicetag)
+  {
+    delete resultVoicetag;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, result, returnCode);
+    return 0;
+  }
+  return (jlong) resultVoicetag;
+}
+
+JNIEXPORT jint JNICALL Java_android_speech_recognition_impl_NBestRecognitionResultImpl_getSizeProxy(JNIEnv* env,
+    jobject result, jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_NBestRecognitionResultImpl_getSizeProxy");
+    
+  NBestRecognitionResultProxy* nativeResultPointer = (NBestRecognitionResultProxy*) nativeObj;
+      
+  if (!nativeResultPointer)
+  {
+    JNIHelper::throwJavaException(env, result, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  NBestRecognitionResultProxy& nativeResult = *nativeResultPointer;
+  return (jint) nativeResult->getSize();
+}
+
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_NBestRecognitionResultImpl_getEntryProxy(JNIEnv* env,
+    jobject recognitionResult,
+    jlong nativeObj,
+    jint index)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_NBestRecognitionResultImpl_getEntryProxy");
+    
+  NBestRecognitionResultProxy* nativeResultPointer = (NBestRecognitionResultProxy*) nativeObj;
+      
+  if (!nativeResultPointer)
+  {
+    JNIHelper::throwJavaException(env, recognitionResult, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  NBestRecognitionResultProxy& nativeResult = *nativeResultPointer;
+  
+  NBestRecognitionResult::EntryProxy nativeEntry = nativeResult->getEntry(index, returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, recognitionResult, returnCode);
+    return 0;
+  }
+  if (!nativeEntry)
+  {
+    // getEntry() returns null if all GrammarConfiguration.grammarToMeaning() returns null
+    return 0;
+  }
+  NBestRecognitionResult::EntryProxy* result = new NBestRecognitionResult::EntryProxy(nativeEntry);
+  if (!result || !*result)
+  {
+    delete result;
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, recognitionResult, returnCode);
+    return 0;
+  }
+  return (jlong) result;
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_NBestRecognitionResultImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_NBestRecognitionResultImpl.h
new file mode 100644
index 0000000..e6dd40f
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_NBestRecognitionResultImpl.h
@@ -0,0 +1,37 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_NBestRecognitionResultImpl */
+
+#ifndef _Included_android_speech_recognition_impl_NBestRecognitionResultImpl
+#define _Included_android_speech_recognition_impl_NBestRecognitionResultImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_NBestRecognitionResultImpl
+ * Method:    createVoicetagItemProxy
+ * Signature: (JLjava/lang/String;Landroid/speech/recognition/VoicetagItemListener;)J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_NBestRecognitionResultImpl_createVoicetagItemProxy
+  (JNIEnv *, jobject, jlong, jstring, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_NBestRecognitionResultImpl
+ * Method:    getEntryProxy
+ * Signature: (JI)J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_NBestRecognitionResultImpl_getEntryProxy
+  (JNIEnv *, jobject, jlong, jint);
+
+/*
+ * Class:     android_speech_recognition_impl_NBestRecognitionResultImpl
+ * Method:    getSizeProxy
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL Java_android_speech_recognition_impl_NBestRecognitionResultImpl_getSizeProxy
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_SrecGrammarImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_SrecGrammarImpl.cpp
new file mode 100644
index 0000000..6200bc7
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_SrecGrammarImpl.cpp
@@ -0,0 +1,145 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_SrecGrammarImpl.cpp                                            *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ */
+#include <string.h>
+#include "jniapi.h"
+#include "android_speech_recognition_impl_SrecGrammarImpl.h"
+#include "JNIHelper.h"
+#include "SrecGrammar.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_SrecGrammarImpl_addItemProxy(JNIEnv* env,
+    jobject grammar,
+    jlong nativeObj,
+    jstring slotName,
+    jlong slotItemObj,
+    jint weight,
+    jstring semanticMeaning)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_SrecGrammarImpl_addItemProxy");
+  
+ SrecGrammarProxy* nativeGrammarPointer = (SrecGrammarProxy*) nativeObj;
+  if (!nativeGrammarPointer)
+  {
+    JNIHelper::throwJavaException(env, grammar, ReturnCode::INVALID_STATE);
+    return;
+  }
+  SrecGrammarProxy& nativeGrammar = *nativeGrammarPointer;
+  
+  SlotItemProxy* nativeItemPointer = (SlotItemProxy*) slotItemObj;
+  if (!nativeItemPointer)
+  {
+    JNIHelper::throwJavaException(env, grammar, ReturnCode::INVALID_STATE);
+    return;
+  }
+  SlotItemProxy& nativeItem = *nativeItemPointer;
+  
+  const char* nativeSlotName = env->GetStringUTFChars(slotName, 0);
+  const char* nativeSemanticMeaning = env->GetStringUTFChars(semanticMeaning, 0);
+  nativeGrammar->addItem(nativeSlotName, nativeItem, weight, nativeSemanticMeaning, returnCode);
+  env->ReleaseStringUTFChars(semanticMeaning, nativeSemanticMeaning);
+  env->ReleaseStringUTFChars(slotName, nativeSlotName);
+  
+  if (returnCode)
+    JNIHelper::throwJavaException(env, grammar, returnCode);
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_SrecGrammarImpl_addItemListProxy
+  (JNIEnv *env, 
+   jobject grammar, 
+   jlong nativeObj,
+   jstring slotName, 
+   jlongArray Items, 
+   jintArray weights,
+   jobjectArray meanings)
+{
+  ReturnCode::Type returnCode = ReturnCode::SUCCESS;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_SrecGrammarImpl_addItemListProxy");
+
+  SrecGrammarProxy* nativeGrammarPointer = (SrecGrammarProxy*) nativeObj;
+  if (!nativeGrammarPointer)
+  {
+    JNIHelper::throwJavaException(env, grammar, ReturnCode::INVALID_STATE);
+    return;
+  }
+  SrecGrammarProxy& nativeGrammar = *nativeGrammarPointer;
+
+  jsize itemCount = env->GetArrayLength(Items);
+  jlong *itemsCopy = 0;
+
+  const char** semanticMeaningsCopy = 0;
+  int* weightsCopy = 0;
+  jsize i = 0;
+
+  if (itemCount>0)
+  {
+    // Copy java arguments 
+    const char* slotNameCopy = env->GetStringUTFChars(slotName, 0); 
+    // copy items
+    itemsCopy = env->GetLongArrayElements(Items,0);
+    SlotItemProxy **nativeSlotItems = new SlotItemProxy*[itemCount];
+    // create array for semantic meaning
+    semanticMeaningsCopy = new const char*[itemCount];
+    // copy weights
+    weightsCopy = (int*) env->GetIntArrayElements(weights,0);
+   
+    const char* text = NULL;
+    int size = 0;
+    for (i=0;i<itemCount;++i)
+    {
+        // copy items
+        nativeSlotItems[i] = (SlotItemProxy *)itemsCopy[i];
+        // copy semantic meanings
+        jstring semantic = (jstring) env->GetObjectArrayElement(meanings,i);
+        text = env->GetStringUTFChars(semantic,0);
+        size = (int)strlen(text);
+        semanticMeaningsCopy[i] = new char[size+1];
+        strcpy((char*)semanticMeaningsCopy[i],text);
+        env->ReleaseStringUTFChars(semantic,text);
+        env->DeleteLocalRef(semantic);
+    }
+
+    nativeGrammar->addItemList(slotNameCopy,
+                             nativeSlotItems,
+                             weightsCopy,
+                             semanticMeaningsCopy,
+                             itemCount,
+                             returnCode);
+    // Release memory
+    env->ReleaseIntArrayElements(weights,(jint*)weightsCopy,0);
+    env->ReleaseStringUTFChars(slotName, slotNameCopy);
+    env->ReleaseLongArrayElements(Items,(jlong*)itemsCopy,0);
+    delete[] nativeSlotItems;
+    nativeSlotItems =NULL;
+    for (i=0;i<itemCount;++i)
+        if ( semanticMeaningsCopy[i] !=NULL) delete  semanticMeaningsCopy[i];
+    delete[] semanticMeaningsCopy; 
+  }
+  else
+   returnCode = ReturnCode::INVALID_STATE;
+   
+  if (returnCode)
+    JNIHelper::throwJavaException(env, grammar, returnCode);
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_SrecGrammarImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_SrecGrammarImpl.h
new file mode 100644
index 0000000..35d0d0b
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_SrecGrammarImpl.h
@@ -0,0 +1,29 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_SrecGrammarImpl */
+
+#ifndef _Included_android_speech_recognition_impl_SrecGrammarImpl
+#define _Included_android_speech_recognition_impl_SrecGrammarImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_SrecGrammarImpl
+ * Method:    addItemProxy
+ * Signature: (JLjava/lang/String;JILjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_SrecGrammarImpl_addItemProxy
+  (JNIEnv *, jobject, jlong, jstring, jlong, jint, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_SrecGrammarImpl
+ * Method:    addItemListProxy
+ * Signature: (JLjava/lang/String;[J[I[Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_SrecGrammarImpl_addItemListProxy
+  (JNIEnv *, jobject, jlong, jstring, jlongArray, jintArray, jobjectArray);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_System.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_System.cpp
new file mode 100644
index 0000000..24a7827
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_System.cpp
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_System.cpp                                                     *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ * android_speech_recognition_impl_System.cpp
+ */
+#include <assert.h>
+#include "jniapi.h"
+#include "android_speech_recognition_impl_System.h"
+#include "System.h"
+#include "JNIHelper.h"
+#include "WorkerQueueFactory.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+using namespace android::speech::recognition::utilities;
+
+
+JNIEXPORT jstring JNICALL Java_android_speech_recognition_impl_System_getAPIVersion
+  (JNIEnv *env, jclass)
+{
+    return env->NewStringUTF("1.0");
+}
+
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_System_initNativeObject(JNIEnv* env,
+    jclass system)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_System_initNativeObject");
+  
+#ifdef ENABLE_JNI_KEEP_ALIVE
+  //make sure we create the KeepAlive singleton here.
+  JVMKeepAlive* keepalive = JVMKeepAlive::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Failed to get the instance of the JVMKeepAlive\n");
+    JNIHelper::throwJavaException(env, 0, returnCode);
+    return 0;
+  }
+#endif
+  
+  JavaVM* jvm = JNIHelper::getJVM(env, system);
+  if (env->ExceptionCheck())
+    return 0;
+#ifdef ENABLE_JNI_KEEP_ALIVE
+  keepalive->setJVM(jvm);
+#endif
+  
+  //make sure we create the NativeThreadWatcher singleton here.
+  NativeThreadWatcher* threadWatcher = NativeThreadWatcher::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    UAPI_ERROR(fn,"Could not get singleton instance of the native thread watcher\n");
+    JNIHelper::throwJavaException(env, 0, returnCode);
+    return 0;
+  }
+  threadWatcher->setJVM(jvm);
+  
+  // Create the native System
+  System* nativeSystem = System::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, 0, returnCode);
+    return 0;
+  }
+  
+  // The WorkerQueueFactory must know about the JNIThreadListener. Pass it the
+  // pointer.
+  WorkerQueueFactory* workerFactory = WorkerQueueFactory::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, 0, returnCode);
+    return 0;
+  }
+  workerFactory->setJNIThreadListener(threadWatcher);
+  
+  return (jlong) nativeSystem;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_System_disposeProxy(JNIEnv*,
+    jclass)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_System_disposeProxy");
+    
+  System* nativeSystem = System::getInstance(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+    return;
+  nativeSystem->dispose(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+    return;
+  delete nativeSystem;
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_System.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_System.h
new file mode 100644
index 0000000..1ec1d9a
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_System.h
@@ -0,0 +1,37 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_System */
+
+#ifndef _Included_android_speech_recognition_impl_System
+#define _Included_android_speech_recognition_impl_System
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_System
+ * Method:    getAPIVersion
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_android_speech_recognition_impl_System_getAPIVersion
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     android_speech_recognition_impl_System
+ * Method:    initNativeObject
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_System_initNativeObject
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     android_speech_recognition_impl_System
+ * Method:    disposeProxy
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_System_disposeProxy
+  (JNIEnv *, jclass);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_VoicetagItemImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_VoicetagItemImpl.cpp
new file mode 100644
index 0000000..f9775ca
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_VoicetagItemImpl.cpp
@@ -0,0 +1,217 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_VoicetagItem.cpp                                                    *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ * android_speech_recognition_VoicetagItem.cpp
+ */
+#include <assert.h>
+#include "jniapi.h"
+#include "android_speech_recognition_impl_VoicetagItemImpl.h"
+#include "JNIHelper.h"
+#include "VoicetagItem.h"
+#include "SrecVoicetagItemImpl.h"
+#include "CWrapperVoicetagListener.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+using namespace android::speech::recognition::srec;
+
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_createVoicetagProxy
+  (JNIEnv *env, jclass , jstring filename, jobject listener)
+{
+    ReturnCode::Type returnCode = ReturnCode::UNKNOWN; 
+    UAPI_FN_SCOPE("Java_android_speech_recognition_impl_VoicetagItemImpl_createVoicetagProxy");
+    const char* nativeFilename = env->GetStringUTFChars(filename, 0);
+    // Create the native listener
+    VoicetagItemListenerProxy nativeListener;
+    if (listener != 0)
+    {
+        JavaVM* jvm = 0;
+        if (env->GetJavaVM(&jvm) < 0)
+        {
+            JNIHelper::throwRuntimeJavaException(env,0,"GetJavaVM() failed");
+            return 0;
+        }
+        if (env->ExceptionCheck())
+            return 0;
+        CWrapperVoicetagListener* temp = new CWrapperVoicetagListener(jvm, listener, returnCode);
+        if (!temp)
+        {
+            JNIHelper::throwJavaException(env,0,ReturnCode::OUT_OF_MEMORY);
+            return 0;
+        }
+        else if (returnCode)
+        {
+            JNIHelper::throwJavaException(env,0,returnCode);
+            return 0;
+        }
+        nativeListener = VoicetagItemListenerProxy(temp);
+        if (!nativeListener)
+        {
+            delete temp;
+            JNIHelper::throwJavaException(env,0,ReturnCode::OUT_OF_MEMORY);
+            return 0;
+        }
+    }
+    VoicetagItemProxy nativeVoicetag = SrecVoicetagItemImpl::create(nativeFilename,nativeListener,returnCode);
+    env->ReleaseStringUTFChars(filename, nativeFilename);
+    if (returnCode != ReturnCode::SUCCESS)
+    {
+        JNIHelper::throwJavaException(env,0,returnCode);
+        return 0;
+    }
+    VoicetagItemProxy* resultVoicetag = new VoicetagItemProxy(nativeVoicetag);
+    if (!resultVoicetag || !*resultVoicetag)
+    {
+        delete resultVoicetag;
+        returnCode = ReturnCode::OUT_OF_MEMORY;
+        JNIHelper::throwJavaException(env,0,returnCode);
+        return 0;
+    }
+    return (jlong) resultVoicetag;
+}
+
+JNIEXPORT jbyteArray JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_getAudioProxy
+  (JNIEnv *env, jobject voicetag, jlong nativeObj)
+{
+  ReturnCode::Type returnCode; 
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_VoicetagItemImpl_getAudioProxy");
+    
+  VoicetagItemProxy* proxyVoicetag = (VoicetagItemProxy*)nativeObj;
+  if (!proxyVoicetag)
+  {
+    JNIHelper::throwJavaException(env, voicetag, ReturnCode::INVALID_STATE);
+    return 0;
+  }
+  VoicetagItemProxy& nativeVoicetag = *proxyVoicetag;
+
+  const android::speech::recognition::INT16** _waveform = 0;
+  ARRAY_LIMIT   _size = 0;
+
+  nativeVoicetag->getAudio(_waveform,&_size,returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, voicetag, returnCode);
+    return 0;
+  }
+  jbyteArray result = env->NewByteArray((jsize)_size);
+  env->SetByteArrayRegion(result,0,(jsize)_size,(const jbyte*)_waveform);
+  if (env->ExceptionCheck())
+  {
+      env->DeleteLocalRef(result);
+      return 0;
+  }
+  jobject returnedObj = env->NewGlobalRef(result);
+  env->DeleteLocalRef(result);
+  return (jbyteArray)returnedObj;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_setAudioProxy
+  (JNIEnv* env, jobject voicetag, jlong nativeObj, jbyteArray data)
+{
+  ReturnCode::Type returnCode; 
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_VoicetagItemImpl_setAudioProxy");
+    
+  VoicetagItemProxy* proxyVoicetag = (VoicetagItemProxy*)nativeObj;
+  if (!proxyVoicetag)
+  {
+    JNIHelper::throwJavaException(env, voicetag, ReturnCode::INVALID_STATE);
+    return;
+  }
+  VoicetagItemProxy& nativeVoicetag = *proxyVoicetag;
+
+  jbyte* arrBytes = env->GetByteArrayElements(data,0);
+   
+  android::speech::recognition::INT16* _waveform = 0;
+  ARRAY_LIMIT   _size =  env->GetArrayLength(data)/2; // By 2 because INT16
+  _waveform = new android::speech::recognition::INT16[_size];
+  if (!_waveform)
+  {
+     env->ReleaseByteArrayElements(data,arrBytes,0);
+     JNIHelper::throwJavaException(env, voicetag, ReturnCode::OUT_OF_MEMORY);
+     return;
+  }
+  jint j = 0;
+  ARRAY_LIMIT i;
+  android::speech::recognition::INT16 word;
+  for(i=0;i<_size;i++)
+  {
+    j =i*2;
+    word = arrBytes[j];
+    _waveform[i] = (word<<8)+arrBytes[j+1];
+  }
+  env->ReleaseByteArrayElements(data,arrBytes,0);
+
+  nativeVoicetag->setAudio(_waveform,_size,returnCode);
+
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    delete[] _waveform;
+    JNIHelper::throwJavaException(env, voicetag, returnCode);
+  }
+}
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_saveVoicetagProxy
+  (JNIEnv *env, jobject voicetag, jlong nativeObj, jstring path)
+{
+  ReturnCode::Type returnCode; 
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_VoicetagItemImpl_saveVoicetagproxy");
+    
+  SrecVoicetagItemImplProxy* proxyVoicetag = (SrecVoicetagItemImplProxy*)nativeObj;
+  if (!proxyVoicetag)
+  {
+    JNIHelper::throwJavaException(env, voicetag, ReturnCode::INVALID_STATE);
+    return;
+  }
+  SrecVoicetagItemImplProxy& nativeVoicetag = *proxyVoicetag;
+  const char* nativePath = env->GetStringUTFChars(path, 0);
+  nativeVoicetag->save(nativePath,returnCode);
+  env->ReleaseStringUTFChars(path, nativePath);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, voicetag, returnCode);
+  }
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_loadVoicetagProxy
+  (JNIEnv *env, jobject voicetag,jlong nativeObj)
+{
+  ReturnCode::Type returnCode; 
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_VoicetagItemImpl_loadVoicetagProxy");
+    
+  SrecVoicetagItemImplProxy* proxyVoicetag = (SrecVoicetagItemImplProxy*)nativeObj;
+  if (!proxyVoicetag)
+  {
+    JNIHelper::throwJavaException(env, voicetag, ReturnCode::INVALID_STATE);
+    return;
+  }
+  SrecVoicetagItemImplProxy& nativeVoicetag = *proxyVoicetag;
+
+  nativeVoicetag->load(returnCode);
+  if (returnCode != ReturnCode::SUCCESS)
+  {
+    JNIHelper::throwJavaException(env, voicetag, returnCode);
+  }
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong nativeObj)
+{
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_VoicetagItemImpl_deleteNativeObject");
+  delete(SrecVoicetagItemImplProxy*) nativeObj;
+}
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_VoicetagItemImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_VoicetagItemImpl.h
new file mode 100644
index 0000000..a1c3fd5
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_VoicetagItemImpl.h
@@ -0,0 +1,61 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_VoicetagItemImpl */
+
+#ifndef _Included_android_speech_recognition_impl_VoicetagItemImpl
+#define _Included_android_speech_recognition_impl_VoicetagItemImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_VoicetagItemImpl
+ * Method:    createVoicetagProxy
+ * Signature: (Ljava/lang/String;Landroid/speech/recognition/VoicetagItemListener;)J
+ */
+JNIEXPORT jlong JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_createVoicetagProxy
+  (JNIEnv *, jclass, jstring, jobject);
+
+/*
+ * Class:     android_speech_recognition_impl_VoicetagItemImpl
+ * Method:    getAudioProxy
+ * Signature: (J)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_getAudioProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_VoicetagItemImpl
+ * Method:    setAudioProxy
+ * Signature: (J[B)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_setAudioProxy
+  (JNIEnv *, jobject, jlong, jbyteArray);
+
+/*
+ * Class:     android_speech_recognition_impl_VoicetagItemImpl
+ * Method:    saveVoicetagProxy
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_saveVoicetagProxy
+  (JNIEnv *, jobject, jlong, jstring);
+
+/*
+ * Class:     android_speech_recognition_impl_VoicetagItemImpl
+ * Method:    loadVoicetagProxy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_loadVoicetagProxy
+  (JNIEnv *, jobject, jlong);
+
+/*
+ * Class:     android_speech_recognition_impl_VoicetagItemImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_VoicetagItemImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_WordItemImpl.cpp b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_WordItemImpl.cpp
new file mode 100644
index 0000000..c2ada06
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_WordItemImpl.cpp
@@ -0,0 +1,102 @@
+/*---------------------------------------------------------------------------*
+ *  android_speech_recognition_impl_WordItemImpl.cpp                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+/*
+ * android_speech_recognition_WordItemImpl.cpp
+ */
+#include <assert.h>
+#include "jniapi.h"
+#include "android_speech_recognition_impl_WordItemImpl.h"
+#include "WordItem.h"
+#include "JNIHelper.h"
+
+using namespace android::speech::recognition;
+using namespace android::speech::recognition::jni;
+
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_WordItemImpl_deleteNativeObject(JNIEnv*, jobject,
+    jlong nativeObj)
+{
+  delete(WordItemProxy*) nativeObj;
+}
+
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_WordItemImpl_initNativeObject(JNIEnv* env,
+    jobject wordItem,
+    jstring word,
+    jobjectArray pronunciations)
+{
+  ReturnCode::Type returnCode;
+  UAPI_FN_SCOPE("Java_android_speech_recognition_impl_WordItemImpl_initNativeObject");
+  
+  const char* nativeWord = env->GetStringUTFChars(word, 0);
+  
+  jsize nativePronunciationCount = env->GetArrayLength(pronunciations);
+  
+  WordItemProxy temp;
+  const char** nativePronunciations = 0;
+  if (nativePronunciationCount > 0)
+  {
+    nativePronunciations = new const char*[nativePronunciationCount];
+    for (jsize i = 0; i < nativePronunciationCount; ++i)
+    {
+      jstring pronunciation = (jstring) env->GetObjectArrayElement(pronunciations, i);
+      nativePronunciations[i] = env->GetStringUTFChars(pronunciation, 0);
+    }
+    temp = WordItem::create(nativeWord, nativePronunciations, nativePronunciationCount, returnCode);
+  }
+  else
+    temp = WordItem::create(nativeWord, NULL, 0, returnCode);
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, wordItem, returnCode);
+    return;
+  }
+  WordItemProxy* nativeWordItem = new WordItemProxy(temp);
+  if (!nativeWordItem)
+  {
+    returnCode = ReturnCode::OUT_OF_MEMORY;
+    JNIHelper::throwJavaException(env, wordItem, returnCode);
+    return;
+  }
+  
+  env->ReleaseStringUTFChars(word, nativeWord);
+  if (nativePronunciationCount > 0)
+  {
+    for (jsize i = 0; i < nativePronunciationCount; ++i)
+    {
+      jstring pronunciation = (jstring) env->GetObjectArrayElement(pronunciations, i);
+      env->ReleaseStringUTFChars(pronunciation, nativePronunciations[i]);
+    }
+    delete[] nativePronunciations;
+  }
+  
+  if (returnCode)
+  {
+    JNIHelper::throwJavaException(env, wordItem, returnCode);
+    return;
+  }
+  
+  // Store a reference to nativeWordItem in WordItem.nativeObject
+  jclass wordItemClass = env->GetObjectClass(wordItem);
+  jfieldID nativeObjectField = env->GetFieldID(wordItemClass, "nativeObject", "J");
+  assert(nativeObjectField != 0);
+  env->DeleteLocalRef(wordItemClass);
+  env->SetLongField(wordItem, nativeObjectField, (jlong) nativeWordItem);
+}
+
diff --git a/uapi/java/jniapi/jniapi/android_speech_recognition_impl_WordItemImpl.h b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_WordItemImpl.h
new file mode 100644
index 0000000..e157f30
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/android_speech_recognition_impl_WordItemImpl.h
@@ -0,0 +1,29 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_speech_recognition_impl_WordItemImpl */
+
+#ifndef _Included_android_speech_recognition_impl_WordItemImpl
+#define _Included_android_speech_recognition_impl_WordItemImpl
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     android_speech_recognition_impl_WordItemImpl
+ * Method:    initNativeObject
+ * Signature: (Ljava/lang/String;[Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_WordItemImpl_initNativeObject
+  (JNIEnv *, jobject, jstring, jobjectArray);
+
+/*
+ * Class:     android_speech_recognition_impl_WordItemImpl
+ * Method:    deleteNativeObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_android_speech_recognition_impl_WordItemImpl_deleteNativeObject
+  (JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/uapi/java/jniapi/jniapi/create_jni_h.bat b/uapi/java/jniapi/jniapi/create_jni_h.bat
new file mode 100644
index 0000000..0cfef32
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/create_jni_h.bat
@@ -0,0 +1,18 @@
+set CLASSPATH="%QSDK%\java\api\dist\api.jar"
+
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.AudioStreamImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.DeviceSpeakerImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.EmbeddedGrammarImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.EmbeddedRecognizerImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.MediaFileReaderImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.MediaFileWriterImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.MicrophoneImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.NBestRecognitionResultImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.EntryImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.SrecGrammarImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.GrammarImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.WordItemImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.VoicetagItemImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.LoggerImpl
+"%JAVA_HOME%\bin\javah" -jni -classpath %CLASSPATH% android.speech.recognition.impl.System
+
diff --git a/uapi/java/jniapi/jniapi/jniapi.cpp b/uapi/java/jniapi/jniapi/jniapi.cpp
new file mode 100644
index 0000000..cfe83b0
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/jniapi.cpp
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*
+ *  jniapi.cpp                                                               *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+// Jniapi.cpp : Defines the entry point for the DLL application.
+//
+#include <jni.h>
+
+#ifdef UAPI_WIN32
+#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
+#include <windows.h>
+
+BOOL APIENTRY DllMain(HANDLE, DWORD, LPVOID)
+{
+  return TRUE;
+}
+#endif
+
+jint JNICALL JNI_OnLoad(JavaVM*, void*)
+{
+  return JNI_VERSION_1_4;
+}
diff --git a/uapi/java/jniapi/jniapi/jniapi.h b/uapi/java/jniapi/jniapi/jniapi.h
new file mode 100644
index 0000000..4e42559
--- /dev/null
+++ b/uapi/java/jniapi/jniapi/jniapi.h
@@ -0,0 +1,28 @@
+/*---------------------------------------------------------------------------*
+ *  jniapi.h                                                                 *
+ *                                                                           *
+ *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
+ *                                                                           *
+ *  Licensed under the Apache License, Version 2.0 (the 'License');          *
+ *  you may not use this file except in compliance with the License.         *
+ *                                                                           *
+ *  You may obtain a copy of the License at                                  *
+ *      http://www.apache.org/licenses/LICENSE-2.0                           *
+ *                                                                           *
+ *  Unless required by applicable law or agreed to in writing, software      *
+ *  distributed under the License is distributed on an 'AS IS' BASIS,        *
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ *  See the License for the specific language governing permissions and      *
+ *  limitations under the License.                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*/
+
+#ifndef __JNI_UAPI__
+#define __JNI_UAPI__
+
+
+//#define UAPI_LINUX
+//#define ENABLE_JNI_KEEP_ALIVE
+
+
+#endif
diff --git a/uapi/make/uapi/Makefile.common b/uapi/make/uapi/Makefile.common
new file mode 100644
index 0000000..2770376
--- /dev/null
+++ b/uapi/make/uapi/Makefile.common
@@ -0,0 +1,19 @@
+###############################################################################
+# FILE: Makefile.common
+#
+# Common settings, independent of configuration (independent of Makefile.config).
+# This is included by Makefile.defs
+###############################################################################
+
+UAPI_COMMON_DEFINES = \
+	-DUAPI_LINUX \
+	-DUAPI_MT \
+	-DAUDIOIN_SUPPORT_CALLBACK \
+	-DUSE_CUSTOM_RECURSIVE_MUTEX \
+#	-DANDROID_AUDIODRIVER_WORKAROUND\
+
+# Temporary workarounds for library limitations
+UAPI_WORKAROUND_DEFINES = \
+	-DNO_ATTACHCURRENTTHREAD_CAST_VOIDPP \
+
+JAVA_HOME = /usr/local/jdk1.5.0_11
diff --git a/uapi/make/uapi/Makefile.config b/uapi/make/uapi/Makefile.config
new file mode 100644
index 0000000..a52957f
--- /dev/null
+++ b/uapi/make/uapi/Makefile.config
@@ -0,0 +1,36 @@
+###############################################################################
+# FILE: Makefile.config
+#
+# Configure the UAPI build.  Works in conjunction with Makefile.defs and
+# system-wide makefiles
+###############################################################################
+
+UAPI_HOST_OS	   = UNIX
+UAPI_OS            = UNIX
+UAPI_TARGET_OS     = UNIX
+
+UAPI_HOST_CPU      = I86
+
+ifeq ($(TARGET_ARCH),arm)
+  UAPI_CPU         = ARM
+  UAPI_TARGET_CPU  = ARM
+else
+ifeq ($(TARGET_ARCH),x86)
+  UAPI_CPU         = I86
+  UAPI_TARGET_CPU  = I86
+else
+  $(error Unsupported TARGET_ARCH for ASR)
+endif
+endif
+
+UAPI_COMPILER      = GNU
+
+ifeq ($(TARGET_BUILD_TYPE),debug)
+  UAPI_BUILD       = DEBUG
+else
+ifeq ($(TARGET_BUILD_TYPE),release)
+  UAPI_BUILD       = SHIP
+else
+  $(error Unsupported TARGET_BUILD_TYPE for ASR)
+endif
+endif
diff --git a/uapi/make/uapi/Makefile.defs b/uapi/make/uapi/Makefile.defs
new file mode 100644
index 0000000..7f39534
--- /dev/null
+++ b/uapi/make/uapi/Makefile.defs
@@ -0,0 +1,918 @@
+###############################################################################
+# Defines $(UAPI_GLOBAL_DEFINES) (among other things) that specify a build.
+#
+# !!! NOTE:	This file must be kept synchronized with builddef.h
+# !!!		Also the values of $(UAPI_OPTIMIZE), $(UAPI_PROFILE), & $(UAPI_TRACE) must
+# !!!		be compatible with the corresponding values in buildddef.h
+#
+# Required macros set in macros.mak:
+#	$(UAPI_OS)			The name of the operating system.
+#	$(UAPI_CPU)			The name of the CPU architecture.
+#	$(UAPI_COMPILER)		The name of the compiler.
+#	$(UAPI_BUILD)		A string that defines what type of build to perform.
+#	$(UAPI_UI)			The name of the type of user interface.
+#
+# The important macros defined herein are:
+# *	$(UAPI_GLOBAL_DEFINES)The compiler defines based on the values of:
+#					$(UAPI_OS), $(UAPI_CPU), $(UAPI_COMPILER), $(UAPI_BUILD), & $(UAPI_UI).
+# *	$(UAPI_SUB_DIR)		The object, library, & binary sub-directory name.
+# *	$(UAPI_OPTIMIZE)		Used by $(UAPI_COMPILER_CHAR)flags.mak to enable optimization.
+# *	$(UAPI_PROFILE)		Used by $(UAPI_COMPILER_CHAR)flags.mak to enable profiling.
+# *	$(UAPI_TRACE)		Used by $(UAPI_COMPILER_CHAR)flags.mak to enable tracing.
+#
+# Other macros incidentally valid on exit:
+# *	$(UAPI_OS_TYPE)		Value corresponding to the type of operating system.
+#	$(UAPI_CPU_TYPE)		Value corresponding to the type of CPU architecture.
+#	$(UAPI_COMPILER_TYPE)Value corresponding to the type of compiler.
+# *	$(UAPI_BUILD_TYPE)	Value corresponding to the type of build to perform.
+#	$(UAPI_UI_TYPE)		Value corresponding to the type of user interface.
+#	$(UAPI_OS_CHAR)		Character corresponding to the type of operating system.
+#	$(UAPI_CPU_CHARS)	Characters corresponding to the type of CPU architecture.
+# *	$(UAPI_COMPILER_CHAR)Character corresponding to the type of compiler.
+#	$(UAPI_BUILD_CHAR)	Character corresponding to the type of build to perform.
+#	$(UAPI_OS_MSDOS)		Value associated with $(UAPI_OS_CHAR) = D.
+#	$(UAPI_OS_WIN32)		Value associated with $(UAPI_OS_CHAR) = W.
+#	$(UAPI_OS_MAC)		Value associated with $(UAPI_OS_CHAR) = M.
+#	$(UAPI_OS_UNIX)		Value associated with $(UAPI_OS_CHAR) = U.
+#	$(UAPI_OS_EMBEDDED)	Value associated with $(UAPI_OS_CHAR) = E.
+#	$(UAPI_OS_VXWORKS)	Value associated with $(UAPI_OS_CHAR) = V.
+#	$(UAPI_OS_QNX)		Value associated with $(UAPI_OS_CHAR) = Q.
+#	$(UAPI_OS_PSOS)		Value associated with $(UAPI_OS_CHAR) = S.
+#	$(UAPI_OS_WINCE)		Value associated with $(UAPI_OS_CHAR) = C.
+#	$(UAPI_OS_PALM)		Value associated with $(UAPI_OS_CHAR) = P.
+#	$(UAPI_OS_JAVA)		Value associated with $(UAPI_OS_CHAR) = J.
+#	$(UAPI_CPU_I86)		Value associated with $(UAPI_CPU_CHARS) = IN.
+#	$(UAPI_CPU_68K)		Value associated with $(UAPI_CPU_CHARS) = MO.
+#	$(UAPI_CPU_MIPS)		Value associated with $(UAPI_CPU_CHARS) = MI.
+#	$(UAPI_CPU_ALPHA)	Value associated with $(UAPI_CPU_CHARS) = AL.
+#	$(UAPI_CPU_PPC)		Value associated with $(UAPI_CPU_CHARS) = PP.
+#	$(UAPI_CPU_SPARC)	Value associated with $(UAPI_CPU_CHARS) = SP.
+#	$(UAPI_CPU_ARM)		Value associated with $(UAPI_CPU_CHARS) = AR.
+#	$(UAPI_CPU_STRONGARM)Value associated with $(UAPI_CPU_CHARS) = SA.
+#	$(UAPI_CPU_TMS320X)	Value associated with $(UAPI_CPU_CHARS) = TI.
+#	$(UAPI_CPU_SH3)		Value associated with $(UAPI_CPU_CHARS) = HI.
+#	$(UAPI_CPU_SH4)		Value associated with $(UAPI_CPU_CHARS) = HI.
+#	$(UAPI_CPU_FAMILY_TMS320C30)Value associated with $(UAPI_CPU_FAMILY) = 3.
+#	$(UAPI_CPU_FAMILY_TMS320C40)Value associated with $(UAPI_CPU_FAMILY) = 4.
+#	$(UAPI_CPU_FAMILY_TMS320C2XX)Value associated with $(UAPI_CPU_FAMILY) = 2.
+#	$(UAPI_CPU_FAMILY_TMS320C54X)Value associated with $(UAPI_CPU_FAMILY) = 5.
+#	$(UAPI_C_BORLAND)	Value associated with $(UAPI_COMPILER_CHAR) = B.
+#	$(UAPI_C_MICROSOFT)	Value associated with $(UAPI_COMPILER_CHAR) = M.
+#	$(UAPI_C_HIGH)		Value associated with $(UAPI_COMPILER_CHAR) = H.
+#	$(UAPI_C_INTEL)		Value associated with $(UAPI_COMPILER_CHAR) = I.
+#	$(UAPI_C_ZORTECH)	Value associated with $(UAPI_COMPILER_CHAR) = Z.
+#	$(UAPI_C_WATCOM)		Value associated with $(UAPI_COMPILER_CHAR) = W.
+#	$(UAPI_C_GNU)		Value associated with $(UAPI_COMPILER_CHAR) = G.
+#	$(UAPI_C_SUNPRO)		Value associated with $(UAPI_COMPILER_CHAR) = S.
+#	$(UAPI_C_DECCXX)		Value associated with $(UAPI_COMPILER_CHAR) = D.
+#	$(UAPI_C_METROWERKS)	Value associated with $(UAPI_COMPILER_CHAR) = C.
+#	$(UAPI_C_GHS)		Value associated with $(UAPI_COMPILER_CHAR) = X.
+#	$(UAPI_C_TICXC)		Value associated with $(UAPI_COMPILER_CHAR) = T.
+#	$(UAPI_C_ARM)		Value associated with $(UAPI_COMPILER_CHAR) = A.
+#	$(UAPI_BUILD_SHIP)	Value associated with $(UAPI_BUILD_CHAR) = S.
+#	$(UAPI_BUILD_INHOUSE)Value associated with $(UAPI_BUILD_CHAR) = I.
+#	$(UAPI_BUILD_DEBUGO)	Value associated with $(UAPI_BUILD_CHAR) = G.
+#	$(UAPI_BUILD_DEBUG)	Value associated with $(UAPI_BUILD_CHAR) = X.
+#	$(UAPI_BUILD_PROFILE)Value associated with $(UAPI_BUILD_CHAR) = P.
+#	$(UAPI_BUILD_TRACE)	Value associated with $(UAPI_BUILD_CHAR) = L.
+#
+# !!! NOTE:	Should these UI macros be used?
+#
+#	$(UAPI_UI_NONE)
+#	$(UAPI_UI_TTY)
+#	$(UAPI_UI_GUI)
+#
+# Optional (for certain values of $(UAPI_CPU)) macros used herein:
+#	$(UAPI_CPU_FAMILY)	OPTIONAL single-character name of the $(UAPI_CPU) family.
+#
+# Optional (for certain values of $(UAPI_CPU)) macros defined herein:
+# *	$(UAPI_CPU_FAMILY_TYPE)For OPTIONAL CPU-specifics in $(UAPI_COMPILER_CHAR)flags.mak.
+#
+# *	Used outside of this makefile. All macros with the suffix ``_TYPE''
+#	used outside of this makefile can be &ed with macros with the
+#	corresponding prefix. Threfore it is implied that those macros are
+#	also available outside of this makefile.
+###############################################################################
+
+# Makefile.config configures the ASR build.  Include this first!
+include $(UAPI_MAKE_DIR)/Makefile.config
+
+# Makefile.common contains settings available to all ASR modules
+include $(UAPI_MAKE_DIR)/Makefile.common
+
+# Define $(UAPI_OS_*), $(UAPI_CPU_*), $(UAPI_COMPILER_*), $(UAPI_BUILD_*) & $(UAPI_UI_*) values.
+
+# OS
+
+UAPI_OS_MSDOS = 1
+UAPI_OS_WIN32 = 2
+UAPI_OS_MAC = 4
+UAPI_OS_UNIX = 8
+UAPI_OS_EMBEDDED = 16
+UAPI_OS_VXWORKS = 32
+UAPI_OS_PSOS = 64
+UAPI_OS_WINCE = 128
+UAPI_OS_PALM = 256
+UAPI_OS_JAVA = 512
+UAPI_OS_QNX = 1024
+
+# CPU
+
+UAPI_CPU_I86 = 1
+UAPI_CPU_68K = 2
+UAPI_CPU_MIPS = 4
+UAPI_CPU_ALPHA = 8
+UAPI_CPU_PPC = 16
+UAPI_CPU_SPARC = 32
+UAPI_CPU_ARM = 64
+UAPI_CPU_STRONGARM = 128
+UAPI_CPU_TMS320X = 256
+UAPI_CPU_SH3 = 512
+UAPI_CPU_SH4 = 1024
+
+# Used only by TFLAGS.MAK.
+
+UAPI_CPU_FAMILY_TMS320C30 = 1
+UAPI_CPU_FAMILY_TMS320C40 = 2
+UAPI_CPU_FAMILY_TMS320C2XX = 4
+UAPI_CPU_FAMILY_TMS320C54X = 8
+
+# COMPILER
+
+UAPI_C_BORLAND = 1
+UAPI_C_MICROSOFT = 2
+UAPI_C_INTEL = 4
+UAPI_C_HIGH = 8
+UAPI_C_ZORTECH = 16
+UAPI_C_WATCOM = 32
+UAPI_C_GNU = 64
+UAPI_C_SUNPRO = 128
+UAPI_C_DECCXX = 256
+UAPI_C_METROWERKS = 512
+UAPI_C_GHS = 1024
+UAPI_C_TICXC = 2048
+UAPI_C_ARM = 4096
+UAPI_C_DIABDATA = 8192
+
+# BUILD (must be synchronized with vcc_helper.h included by buildopt.h)
+
+UAPI_BUILD_SHIP = 1
+UAPI_BUILD_INHOUSE = 2
+UAPI_BUILD_DEBUGO = 4
+UAPI_BUILD_DEBUG = 8
+UAPI_BUILD_PROFILE = 16
+UAPI_BUILD_TRACE = 32
+
+UAPI_OFF = 0
+
+# UI
+
+UAPI_UI_NONE = 1
+UAPI_UI_TTY = 2
+UAPI_UI_GUI = 4
+
+########################################################################
+#
+# Define $(UAPI_*_TYPE) and $(UAPI_*_CHAR[S]) to be used to define $(UAPI_GLOBAL_DEFINES)
+# and $(UAPI_SUB_DIR).
+
+################################## OS ##################################
+
+ifeq ("$(UAPI_OS)","MSDOS")
+UAPI_OS_TYPE = $(UAPI_OS_MSDOS)
+
+else								# same as OS = "Windows_NT"
+ifeq ("$(UAPI_OS)","WIN32")
+UAPI_OS_TYPE = $(UAPI_OS_WIN32)
+
+else								# same as OS = "WIN32"
+ifeq ("$(UAPI_OS)","Windows_NT")
+UAPI_OS_TYPE = $(UAPI_OS_WIN32)
+
+else
+ifeq ("$(UAPI_OS)","MAC")
+UAPI_OS_TYPE = $(UAPI_OS_MAC)
+
+else
+ifeq ("$(UAPI_OS)","UNIX")
+UAPI_OS_TYPE = $(UAPI_OS_UNIX)
+
+else
+ifeq ("$(UAPI_OS)","EMBEDDED")
+UAPI_OS_TYPE = $(UAPI_OS_EMBEDDED)
+
+else
+ifeq ("$(UAPI_OS)","VXWORKS")
+UAPI_OS_TYPE = $(UAPI_OS_VXWORKS)
+
+else
+ifeq ("$(UAPI_OS)","PSOS")
+UAPI_OS_TYPE = $(UAPI_OS_PSOS)
+
+else
+ifeq ("$(UAPI_OS)","Wince")
+UAPI_OS_TYPE = $(UAPI_OS_WINCE)
+
+else
+ifeq ("$(UAPI_OS)","PALM")
+UAPI_OS_TYPE = $(UAPI_OS_PALM)
+
+else
+ifeq ("$(UAPI_OS)","JAVA")
+UAPI_OS_TYPE = $(UAPI_OS_JAVA)
+
+else
+ifeq ("$(UAPI_OS)","QNX")
+UAPI_OS_TYPE = $(UAPI_OS_QNX)
+
+else
+ERROR += \
+$(subst $(space),|,'Failed to select operating system with $$(UAPI_OS) == "$(UAPI_$(UAPI_OS))"')
+UAPI_OS_TYPE = UAPI_BAD_OS
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+
+################################## HOST_OS ##################################
+
+ifeq ("$(UAPI_HOST_OS)","MSDOS")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_MSDOS)
+
+else								# same as OS = "Windows_NT"
+ifeq ("$(UAPI_HOST_OS)","WIN32")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_WIN32)
+
+else								# same as OS = "WIN32"
+ifeq ("$(UAPI_HOST_OS)","Windows_NT")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_WIN32)
+
+else
+ifeq ("$(UAPI_HOST_OS)","MAC")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_MAC)
+
+else
+ifeq ("$(UAPI_HOST_OS)","UNIX")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_UNIX)
+
+else
+ifeq ("$(UAPI_HOST_OS)","EMBEDDED")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_EMBEDDED)
+
+else
+ifeq ("$(UAPI_HOST_OS)","VXWORKS")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_VXWORKS)
+
+else
+ifeq ("$(UAPI_HOST_OS)","PSOS")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_PSOS)
+
+else
+ifeq ("$(UAPI_HOST_OS)","Wince")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_WINCE)
+
+else
+ifeq ("$(UAPI_HOST_OS)","PALM")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_PALM)
+
+else
+ifeq ("$(UAPI_HOST_OS)","JAVA")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_JAVA)
+
+else
+ifeq ("$(UAPI_HOST_OS)","QNX")
+UAPI_HOST_OS_TYPE = $(UAPI_OS_QNX)
+
+else
+ERROR += \
+$(subst $(space),|,'Failed to select operating system with $$(UAPI_HOST_OS) == "$(UAPI_HOST_OS)"')
+UAPI_HOST_OS_TYPE = UAPI_BAD_OS
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################## TARGET_OS ##################################
+
+ifeq ("$(UAPI_TARGET_OS)","MSDOS")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_MSDOS)
+
+else								# same as OS = "Windows_NT"
+ifeq ("$(UAPI_TARGET_OS)","WIN32")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_WIN32)
+
+else								# same as OS = "WIN32"
+ifeq ("$(UAPI_TARGET_OS)","Windows_NT")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_WIN32)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","MAC")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_MAC)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","UNIX")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_UNIX)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","EMBEDDED")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_EMBEDDED)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","VXWORKS")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_VXWORKS)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","PSOS")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_PSOS)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","Wince")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_WINCE)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","PALM")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_PALM)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","JAVA")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_JAVA)
+
+else
+ifeq ("$(UAPI_TARGET_OS)","QNX")
+UAPI_TARGET_OS_TYPE = $(UAPI_OS_QNX)
+
+else
+ERROR += \
+$(subst $(space),|,'Failed to select operating system with $$(UAPI_TARGET_OS) == "$(UAPI_TARGET_OS)"')
+UAPI_TARGET_OS_TYPE = UAPI_BAD_OS
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################## CPU #################################
+
+ifeq ("$(UAPI_CPU)","I86")
+UAPI_CPU_TYPE = $(UAPI_CPU_I86)
+UAPI_CPU_CHARS = in
+
+else
+ifeq ("$(UAPI_CPU)", "SIMNT")
+UAPI_CPU_TYPE = $(UAPI_CPU_I86)
+UAPI_CPU_CHARS = in
+
+else
+ifeq ("$(UAPI_CPU)","68K")
+UAPI_CPU_TYPE = $(UAPI_CPU_68K)
+UAPI_CPU_CHARS = mo
+
+else
+ifeq ("$(UAPI_CPU)","MIPS")
+UAPI_CPU_TYPE = $(UAPI_CPU_MIPS)
+UAPI_CPU_CHARS = mi
+
+else
+ifeq ("$(UAPI_CPU)","ALPHA")
+UAPI_CPU_TYPE = $(UAPI_CPU_ALPHA)
+UAPI_CPU_CHARS = al
+
+else
+ifeq ("$(UAPI_CPU)","PPC")
+UAPI_CPU_TYPE = $(UAPI_CPU_PPC)
+UAPI_CPU_CHARS = pp
+
+else
+ifeq ("$(UAPI_CPU)","SPARC")
+UAPI_CPU_TYPE = $(UAPI_CPU_SPARC)
+UAPI_CPU_CHARS = pp
+
+else
+ifeq ("$(UAPI_CPU)","ARM")
+UAPI_CPU_TYPE = $(UAPI_CPU_ARM)
+UAPI_CPU_CHARS = ar
+
+else
+ifeq ("$(UAPI_CPU)","STRONGARM")
+UAPI_CPU_TYPE = $(UAPI_CPU_STRONGARM)
+UAPI_CPU_CHARS = sa
+
+else
+ifeq ("$(UAPI_CPU)","TMS320X")
+UAPI_CPU_TYPE = $(UAPI_CPU_TMS320X)
+UAPI_CPU_CHARS = ti
+
+ifndef CPU_FAMILY
+CPU_FAMILY_TYPE = 0
+MESSAGE += \
+$(subst $(space),|,'$$(UAPI_CPU_FAMILY_TYPE) defaulted to "$(UAPI_CPU_FAMILY_TYPE)"')
+
+else
+UAPI_CPU_CHARS = T$(UAPI_CPU_FAMILY)
+
+ifeq ("$(UAPI_CPU_FAMILY)","3")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C30)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","4")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C40)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","2")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C2XX)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","5")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C54X)
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU family with $$(UAPI_CPU_FAMILY) == "$(UAPI_CPU_FAMILY)"')
+UAPI_CPU_FAMILY_TYPE=UAPI_BAD_CPU_FAMILY
+endif
+endif
+endif
+endif
+endif
+
+else
+ifeq ("$(UAPI_CPU)","SH3")
+UAPI_CPU_TYPE = $(UAPI_CPU_SH3)
+UAPI_CPU_CHARS = hi
+
+else
+ifeq ("$(UAPI_CPU)","SH4")
+UAPI_CPU_TYPE = $(UAPI_CPU_SH4)
+UAPI_CPU_CHARS = hi
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU architecture with $$(UAPI_CPU) == "$(UAPI_$(UAPI_CPU))"')
+UAPI_CPU_TYPE = UAPI_BAD_CPU
+UAPI_CPU_CHARS = UAPI_BAD_CPU
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################## HOST_CPU #################################
+
+ifeq ("$(UAPI_HOST_CPU)","I86")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_I86)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","68K")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_68K)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","MIPS")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_MIPS)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","ALPHA")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_ALPHA)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","PPC")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_PPC)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","SPARC")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_SPARC)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","ARM")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_ARM)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","STRONGARM")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_STRONGARM)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","TMS320X")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_TMS320X)
+
+ifndef CPU_FAMILY
+UAPI_CPU_FAMILY_TYPE = 0
+MESSAGE += \
+$(subst $(space),|,'$$(UAPI_CPU_FAMILY_TYPE) defaulted to "$(UAPI_CPU_FAMILY_TYPE)"')
+
+else
+
+ifeq ("$(UAPI_CPU_FAMILY)","3")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C30)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","4")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C40)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","2")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C2XX)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","5")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C54X)
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU family with $$(UAPI_CPU_FAMILY) == "$(UAPI_CPU_FAMILY)"')
+UAPI_CPU_FAMILY_TYPE=UAPI_BAD_CPU_FAMILY
+endif
+endif
+endif
+endif
+endif
+
+else
+ifeq ("$(UAPI_HOST_CPU)","SH3")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_SH3)
+
+else
+ifeq ("$(UAPI_HOST_CPU)","SH4")
+UAPI_HOST_CPU_TYPE = $(UAPI_CPU_SH4)
+
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU architecture with $$(UAPI_HOST_CPU) == "$(UAPI_HOST_CPU)"')
+UAPI_HOST_CPU_TYPE = UAPI_BAD_CPU
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################## TARGET_CPU #################################
+
+ifeq ("$(UAPI_TARGET_CPU)","I86")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_I86)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","68K")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_68K)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","MIPS")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_MIPS)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","ALPHA")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_ALPHA)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","PPC")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_PPC)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","SPARC")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_SPARC)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","ARM")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_ARM)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","STRONGARM")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_STRONGARM)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","TMS320X")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_TMS320X)
+
+ifndef CPU_FAMILY
+UAPI_CPU_FAMILY_TYPE = 0
+MESSAGE += \
+$(subst $(space),|,'$$(UAPI_CPU_FAMILY_TYPE) defaulted to "$(UAPI_CPU_FAMILY_TYPE)"')
+
+else
+
+ifeq ("$(UAPI_CPU_FAMILY)","3")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C30)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","4")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C40)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","2")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C2XX)
+
+else
+ifeq ("$(UAPI_CPU_FAMILY)","5")
+UAPI_CPU_FAMILY_TYPE = $(UAPI_CPU_FAMILY_TMS320C54X)
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU family with $$(UAPI_CPU_FAMILY) == "$(UAPI_CPU_FAMILY)"')
+UAPI_CPU_FAMILY_TYPE=UAPI_BAD_CPU_FAMILY
+endif
+endif
+endif
+endif
+endif
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","SH3")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_SH3)
+
+else
+ifeq ("$(UAPI_TARGET_CPU)","SH4")
+UAPI_TARGET_CPU_TYPE = $(UAPI_CPU_SH4)
+
+else
+
+ERROR += \
+$(subst $(space),|,\
+'Failed to select CPU architecture with $$(UAPI_TARGET_CPU) == "$(UAPI_TARGET_CPU)"')
+UAPI_TARGET_CPU_TYPE = UAPI_BAD_CPU
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+
+############################### COMPILER ###############################
+#
+# $(UAPI_COMPILER_CHAR) is also used to select which flags makefile to include.
+
+ifeq ("$(UAPI_COMPILER)","BORLAND")		# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_BORLAND)
+
+else								# same as COMPILER = "M$$"
+ifeq ("$(UAPI_COMPILER)","MS")
+UAPI_COMPILER_TYPE = $(UAPI_C_MICROSOFT)
+
+else
+ifeq ("$(UAPI_COMPILER)","INTEL")		# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_INTEL)
+
+else
+ifeq ("$(UAPI_COMPILER)","HIGH")			# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_HIGH)
+
+else
+ifeq ("$(UAPI_COMPILER)","ZORTECH")		# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_ZORTECH)
+
+else
+ifeq ("$(UAPI_COMPILER)","WATCOM")		# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_WATCOM)
+
+else
+ifeq ("$(UAPI_COMPILER)","GNU")			# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_GNU)
+
+else
+ifeq ("$(UAPI_COMPILER)","SUNPRO")		# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_SUNPRO)
+
+else
+ifeq ("$(UAPI_COMPILER)","DECCXX")		# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_DECCXX)
+
+else
+ifeq ("$(UAPI_COMPILER)","METROWERKS")	# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_METROWERKS)
+
+else
+ifeq ("$(UAPI_COMPILER)","GHS")			# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_GHS)
+
+else
+ifeq ("$(UAPI_COMPILER)","TICXC")		# !!! NOT SURE WHAT STRING TO USE !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_TICXC)
+
+else
+ifeq ("$(UAPI_COMPILER)","ARM")			# !!! NOT ANY PARTICULAR COMPILER !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_ARM)
+
+else
+ifeq ("$(UAPI_COMPILER)","DIABDATA")			# !!! NOT ANY PARTICULAR COMPILER !!!
+UAPI_COMPILER_TYPE = $(UAPI_C_DIABDATA)
+
+else
+ERROR += \
+$(subst $(space),|,\
+'Failed to select compiler with $$(UAPI_COMPILER) == "$(UAPI_COMPILER)"')
+UAPI_COMPILER_TYPE = UAPI_BAD_COMPILER
+UAPI_COMPILER_CHAR = UAPI_BAD_COMPILER
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################# BUILD ################################
+#
+# Define OPTIMIZE, PROFILE, and TRACE for use in $(UAPI_COMPILER_CHAR)flags.mak.
+# These values must be compatible with the corresponding ones in builddef.h.
+
+UAPI_OPTIMIZE = $(UAPI_OFF)
+UAPI_PROFILE = $(UAPI_OFF)
+UAPI_TRACE = $(UAPI_OFF)
+
+#									# BUILD  CHAR  OPTIMIZE  PROFILE  TRACE
+#									  ----   ----  --------  -------  -----
+ifeq ("$(UAPI_BUILD)","SHIP")			# SHIP    `S'  OPTIMIZE
+UAPI_BUILD_TYPE = $(UAPI_BUILD_SHIP)
+UAPI_BUILD_CHAR = s
+UAPI_OPTIMIZE = $(UAPI_BUILD_TYPE)
+
+else
+ifeq ("$(UAPI_BUILD)","NDEBUG")			# SHIP    `S'  OPTIMIZE
+UAPI_BUILD_TYPE = $(UAPI_BUILD_SHIP)
+UAPI_BUILD_CHAR = s
+UAPI_OPTIMIZE = $(UAPI_BUILD_TYPE)
+
+else
+ifeq ("$(UAPI_BUILD)","INHOUSE")			# INHOUSE `I'  OPTIMIZE
+UAPI_BUILD_TYPE = $(UAPI_BUILD_INHOUSE)
+UAPI_BUILD_CHAR = i
+UAPI_OPTIMIZE = $(UAPI_BUILD_TYPE)
+
+else
+ifeq ("$(UAPI_BUILD)","DEBUGO")			# DEBUG   `G'  OPTIMIZE
+UAPI_BUILD_TYPE = $(UAPI_BUILD_DEBUGO)
+UAPI_BUILD_CHAR = g
+UAPI_OPTIMIZE = $(UAPI_BUILD_TYPE)
+
+else
+ifeq ("$(UAPI_BUILD)","DEBUG")			# DEBUG   `X'
+UAPI_BUILD_TYPE = $(UAPI_BUILD_DEBUG)
+UAPI_BUILD_CHAR = x
+
+else
+ifeq ("$(UAPI_BUILD)","PROFILE")			# INHOUSE `P'  OPTIMIZE  PROFILE
+UAPI_BUILD_TYPE = $(UAPI_BUILD_PROFILE)
+UAPI_BUILD_CHAR = p
+UAPI_OPTIMIZE = $(UAPI_BUILD_TYPE)
+UAPI_PROFILE = $(UAPI_BUILD_TYPE)
+
+else
+ifeq ("$(UAPI_BUILD)","TRACE")			# INHOUSE `L'  OPTIMIZE           TRACE
+UAPI_BUILD_TYPE = $(UAPI_BUILD_TRACE)
+UAPI_BUILD_CHAR = l
+UAPI_OPTIMIZE = $(UAPI_BUILD_TYPE)
+UAPI_TRACE = $(UAPI_BUILD_TYPE)
+
+else
+ERROR += \
+$(subst $(space),|,'Failed to select build type with $$(UAPI_BUILD) == "$(UAPI_BUILD)"')
+UAPI_BUILD_TYPE = UAPI_BAD_BUILD
+UAPI_BUILD_CHAR = UAPI_BAD_BUILD
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+################################# UI #################################
+#
+# !!! NOT USED !!!
+
+######################################################################
+#
+# Finally define the macros of interest.
+
+UAPI_GLOBAL_DEFINES = \
+	-DOS_UNIX=$(UAPI_OS_UNIX) \
+	-DOS_EMBEDDED=$(UAPI_OS_EMBEDDED) \
+	-DOS_VXWORKS=$(UAPI_OS_VXWORKS) \
+	-DOS_PSOS=$(UAPI_OS_PSOS) \
+	-DOS_QNX=$(UAPI_OS_QNX) \
+	-DOS=$(UAPI_OS_TYPE) \
+	-DHOST_OS=$(UAPI_HOST_OS_TYPE) \
+	-DTARGET_OS=$(UAPI_TARGET_OS_TYPE) \
+	-DCPU_PPC=$(UAPI_CPU_PPC) \
+	-DCPU_SPARC=$(UAPI_CPU_SPARC) \
+	-DCPU_ARM=$(UAPI_CPU_ARM) \
+	-DCPU_STRONGARM=$(UAPI_CPU_STRONGARM) \
+	-DCPU_TMS320X=$(UAPI_CPU_TMS320X) \
+	-DCPU_SH3=$(UAPI_CPU_SH3) \
+	-DCPU_SH4=$(UAPI_CPU_SH4) \
+	-DCPU=$(UAPI_CPU_TYPE) \
+	-DHOST_CPU=$(UAPI_HOST_CPU_TYPE) \
+	-DTARGET_CPU=$(UAPI_TARGET_CPU_TYPE) \
+	-DC_GNU=$(UAPI_C_GNU) \
+	-DC_SUNPRO=$(UAPI_C_SUNPRO) \
+	-DC_METROWERKS=$(UAPI_C_METROWERKS) \
+	-DC_TICXC=$(UAPI_C_TICXC) \
+	-DC_ARM=$(UAPI_C_ARM) \
+	-DCOMPILER=$(UAPI_COMPILER_TYPE) \
+	-DBUILD_SHIP=$(UAPI_BUILD_SHIP) \
+	-DBUILD_DEBUG=$(UAPI_BUILD_DEBUG) \
+	-DBUILD=$(UAPI_BUILD_TYPE) \
+
+# Include these from Makefile.common
+UAPI_GLOBAL_DEFINES += $(UAPI_COMMON_DEFINES) $(UAPI_WORKAROUND_DEFINES)
+
+# OS specific defines
+ifeq ($(UAPI_TARGET_OS),UNIX)
+UAPI_GLOBAL_DEFINES += -DPOSIX -D__linux
+endif
+
+
+# BUILD specific defines and flags
+UAPI_GLOBAL_CPPFLAGS =
+
+ifeq ($(UAPI_BUILD),SHIP)
+UAPI_GLOBAL_DEFINES += -DNDEBUG -D_SHIP -DFINAL_RELEASE
+#UAPI_GLOBAL_CPPFLAGS += -O3 -fno-strict-aliasing
+endif
+
+ifeq ($(UAPI_BUILD),NDEBUG)
+UAPI_GLOBAL_DEFINES += -DNDEBUG
+#UAPI_GLOBAL_CPPFLAGS +=
+endif
+
+ifeq ($(UAPI_BUILD),INHOUSE)
+UAPI_GLOBAL_DEFINES += -D_INHOUSE
+#UAPI_GLOBAL_CPPFLAGS += -g3
+endif
+
+ifeq ($(UAPI_BUILD),DEBUGO)
+UAPI_GLOBAL_DEFINES += -D_DEBUG
+#UAPI_GLOBAL_CPPFLAGS += -g
+endif
+
+ifeq ($(UAPI_BUILD),DEBUG)
+UAPI_GLOBAL_DEFINES += -D_DEBUG
+#UAPI_GLOBAL_CPPFLAGS += -g
+endif
+
+ifneq ($(UAPI_OPTIMIZE),$(UAPI_OFF))
+UAPI_GLOBAL_DEFINES += -D_OPTIMIZE
+#UAPI_GLOBAL_CPPFLAGS += -O3
+endif
+
+ifneq ($(UAPI_PROFILE),$(UAPI_OFF))
+UAPI_GLOBAL_DEFINES += -D_PROFILE
+#UAPI_GLOBAL_CPPFLAGS += -g3
+endif
+
+ifneq ($(UAPI_TRACE),$(UAPI_OFF))
+UAPI_GLOBAL_DEFINES += -D_TRACE
+#UAPI_GLOBAL_CPPFLAGS +=
+endif